summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLeonid Kapitonov <Feacur@gmail.com>2025-06-17 15:54:52 +0200
committerGitHub <noreply@github.com>2025-06-17 15:54:52 +0200
commitb11fdab792f1e7c4b71cfa7568963fad1c7d742d (patch)
treee5d7b2b8628f8508ac417bb7049522985a35fca5 /include
parentbc5839a32cce3fd3b6100d56e1d8965b2b365ee2 (diff)
Document `Save.cutsceneIndex` and adjacent data / code (#2286)
* introduce `enum CutsceneIndex` as a first step * crudely rename `enum CutsceneIndex` entries * run `check_format.py ...` separetely so that it doesn't clutter previous commit. still, allowing `clangd LSP` to run format-on-save yields inconsistent results for me with the project's tooling, especially for header files * apply a draft PR suggestion Co-authored-by: mzxrules <mzxrules@gmail.com> * rename `CS_INDEX_*` with PR suggestions and some additional observations reverified with > `check_format.py ...` > `make ...` additionally: - current clang-format lacks a rule for trailing commas - compiler says about them `cfe: Warning 624` * improve `CS_INDEX_*` naming, rem `ENTRANCE` suffix https://github.com/zeldaret/oot/pull/2286#discussion_r1829165205 reverified with > `check_format.py ...` > `make ...` * apply Jenkins fixes https://jenkins.deco.mp/job/OOT/job/PR-2286/4/console hmm, i do need this automation locally to * apply a PR suggestion https://github.com/zeldaret/oot/pull/2286#discussion_r1829219841 * remove redundant comments, fix the header comment and add a comment chunk from https://github.com/zeldaret/oot/pull/2286#discussion_r1829108940 * rename the flag for freeing `nextCutsceneIndex` * rename the flag for automatic `sceneLayer` calc it gets assigned to the `nextCutsceneIndex`, so `CS_INDEX_NONE` name was misleading * use explicit scene layer names instead of numbers * ok, now the last two `CS_INDEX_*` are less unknown the purpose of `CS_INDEX_BARRIER` is not quite clear still * apply Jenkins fixes https://jenkins.deco.mp/job/OOT/job/PR-2286/14/console * run `fix_bss` locally `ntsc-1.2` refused to comply though * revert all local to the branch bss shifts * ugh, use defines instead of an enum probably size of enum entries doesn't match well? originally these were just numbers. besides, not like it's a real enumeration from zero to a value or some bit flags * still, add a BSS pragma for `z_demo.c` * apply review changes * factor out a cutscene layer formula * give scene layers names throughout code * apply Jenkins fixes https://jenkins.deco.mp/job/OOT/job/PR-2286/32/console * tweak `CS_INDEX` descriptions * apply PR review suggestions * rename "auto" -> "default" * apply PR review suggestions https://github.com/zeldaret/oot/pull/2286#discussion_r1868693980 essentially reverts 106cb1021be88f745ee303838c11c7d7cbf9c79d, except for 2 generic `z_scene.c` lines * apply Jenkins fixes https://jenkins.deco.mp/job/OOT/job/PR-2286/77/console * Apply suggestions from code review Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com> Co-authored-by: mzxrules <mzxrules@gmail.com> * apply Jenkins fixes https://jenkins.deco.mp/job/OOT/job/PR-2286/175/console * Move CS_INDEX_* macros to z64save.h, with the definition of gSaveContext.save.cutsceneIndex * `#define CS_INDEX_D 0xFFFD` and co. Co-authored-by: cadmic <cadmic24@gmail.com> * add comment on CS_INDEX_D * review * CS_INDEX_NONE is back * bss * expand comment about 0xFFFD * fix comment about 0xFFFF usage * review --------- Co-authored-by: mzxrules <mzxrules@gmail.com> Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com> Co-authored-by: cadmic <cadmic24@gmail.com>
Diffstat (limited to 'include')
-rw-r--r--include/cutscene.h1
-rw-r--r--include/save.h48
2 files changed, 48 insertions, 1 deletions
diff --git a/include/cutscene.h b/include/cutscene.h
index e3bf4a1c8..fb96ccbbf 100644
--- a/include/cutscene.h
+++ b/include/cutscene.h
@@ -353,7 +353,6 @@ typedef union CsCmdCam {
s32 _words[2];
} CsCmdCam; // size = 0x8
-
typedef union CsCmdMisc {
struct {
/* 0x00 */ u16 type;
diff --git a/include/save.h b/include/save.h
index f3d3397dc..9687db287 100644
--- a/include/save.h
+++ b/include/save.h
@@ -401,6 +401,7 @@ typedef enum SceneLayer {
} SceneLayer;
#define IS_CUTSCENE_LAYER (gSaveContext.sceneLayer >= SCENE_LAYER_CUTSCENE_FIRST)
+#define GET_CUTSCENE_LAYER(index) (SCENE_LAYER_CUTSCENE_FIRST + (index & 0xF))
typedef enum LinkAge {
/* 0 */ LINK_AGE_ADULT,
@@ -408,6 +409,53 @@ typedef enum LinkAge {
} LinkAge;
+// Usage in Map Select suggests that `gSaveContext.save.cutsceneIndex` was,
+// at one point in development, a variable related to the time.
+// This is further supported by debug strings showing that its original name was "day_time".
+// These macros exist for the rare cases in the codebase where `cutsceneIndex` is treated as a time value.
+// In practice, both values do not lead to a cutscene being played.
+// See `CS_INDEX_NONE` below for the more common usage of value 0x0000.
+#define CS_INDEX_NIGHT 0x0000
+#define CS_INDEX_DAY 0x8000
+
+// Indicates that no scripted cutscene is playing (or should be played).
+// While this value overlaps with `CS_INDEX_NIGHT` defined above, it is not related to the time.
+// This is the more common interpretation of this value, as much of the codebase uses 0x0000 to mean "no cutscene"
+// except for Map Select.
+#define CS_INDEX_NONE 0x0000
+
+// Values 0xFFF0-0xFFFF indicate that a cutscene script should be played.
+// If the value of `nextCutsceneIndex` is 0xFFF0-0xFFFF on scene load,
+// `Play_Init` will copy the value to `gSaveContext.cutsceneIndex`, load a
+// corresponding scene layer and start the scripted cutscene in the scene layer
+// (except for the value 0xFFFD, which is special-cased to do nothing in `Play_Init`).
+// It loads layer 4 for 0xFFF0, layer 5 for 0xFFF1, and so on.
+//
+// 0xFFFD is used by the cutscene system to indicate a scripted cutscene has been triggered.
+// This is why `Play_Init` ignores that value, so that if the cutscene is interrupted
+// by a new play state load (e.g. if the player falls out of bounds), it does not then
+// try to wrongly load a cutscene layer.
+#define CS_INDEX_0 0xFFF0
+#define CS_INDEX_1 0xFFF1
+#define CS_INDEX_2 0xFFF2
+#define CS_INDEX_3 0xFFF3
+#define CS_INDEX_4 0xFFF4
+#define CS_INDEX_5 0xFFF5
+#define CS_INDEX_6 0xFFF6
+#define CS_INDEX_7 0xFFF7
+#define CS_INDEX_8 0xFFF8
+#define CS_INDEX_9 0xFFF9
+#define CS_INDEX_A 0xFFFA
+#define CS_INDEX_B 0xFFFB
+#define CS_INDEX_C 0xFFFC
+#define CS_INDEX_D 0xFFFD // does not load a cutscene scene layer (see above)
+#define CS_INDEX_E 0xFFFE
+#define CS_INDEX_F 0xFFFF
+
+// Sentinel value for `nextCutsceneIndex` to indicate that no cutscene should be played next.
+#define NEXT_CS_INDEX_NONE 0xFFEF
+
+
#define LINK_IS_ADULT (gSaveContext.save.linkAge == LINK_AGE_ADULT)
#define LINK_IS_CHILD (gSaveContext.save.linkAge == LINK_AGE_CHILD)