1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-09 08:20:17 +00:00

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 106cb1021b, 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>
This commit is contained in:
Leonid Kapitonov 2025-06-17 15:54:52 +02:00 committed by GitHub
parent bc5839a32c
commit b11fdab792
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 287 additions and 233 deletions

View file

@ -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)