summaryrefslogtreecommitdiff
path: root/soh/src/code
diff options
context:
space:
mode:
authorJosh Bodner <30329717+jbodner09@users.noreply.github.com>2022-11-18 15:42:58 -0800
committerGitHub <noreply@github.com>2022-11-18 18:42:58 -0500
commit2c0ec96eff77ff62e17d4fae7ed8fcfdcd5a85e0 (patch)
treec34a6922629ec30913598d39e468d0fb01d1d0cd /soh/src/code
parentd141876af4c8677350958716c845a16ec4b18c5a (diff)
Fix credits timing (#1254)
* Fix credits timing * Add documentation * Fix typo
Diffstat (limited to 'soh/src/code')
-rw-r--r--soh/src/code/z_demo.c49
1 files changed, 48 insertions, 1 deletions
diff --git a/soh/src/code/z_demo.c b/soh/src/code/z_demo.c
index 4133d4dab..9eeb3bfa8 100644
--- a/soh/src/code/z_demo.c
+++ b/soh/src/code/z_demo.c
@@ -511,7 +511,54 @@ void Cutscene_Command_Terminator(PlayState* play, CutsceneContext* csCtx, CsCmdB
temp = 1;
}
- if ((csCtx->frames == cmd->startFrame) || (temp != 0) || ((csCtx->frames > 20) && (randoCsSkip || debugCsSkip))) {
+ bool playCutscene = false;
+ if (!CVar_GetS32("gCreditsFix", 1) && (cmd->startFrame == csCtx->frames)) {
+ playCutscene = true;
+ } else if (CVar_GetS32("gCreditsFix", 1)) {
+ u16 delay = 0;
+
+ // HACK: Align visual timing with audio during credits sequence
+ switch (cmd->base) {
+ case 55: // Gerudo fortress (second scene of credits roll)
+ delay = 20;
+ break;
+ case 56: // Kakariko village
+ delay = 40;
+ break;
+ case 57: // Death mountain trail
+ delay = 20;
+ break;
+ case 58: // Goron city
+ delay = 20;
+ break;
+ case 59: // Lake hylia
+ delay = 20;
+ break;
+ case 62: // Kokiri forest (houses)
+ delay = 40;
+ break;
+ case 63: // Kokiri forest (deku tree)
+ delay = 40;
+ break;
+ case 74: // First gorons dancing
+ delay = 100;
+ break;
+ case 75: // Magic carpet guy and old shop keepers
+ delay = 180;
+ break;
+ case 77: // Sad mido and king zora (plays after scene 78)
+ delay = 100;
+ break;
+ case 78: // Second gorons dancing
+ delay = 160;
+ break;
+ }
+ if (cmd->startFrame + delay == csCtx->frames) {
+ playCutscene = true;
+ }
+ }
+
+ if (playCutscene || (temp != 0) || ((csCtx->frames > 20) && (randoCsSkip || debugCsSkip))) {
csCtx->state = CS_STATE_UNSKIPPABLE_EXEC;
Audio_SetCutsceneFlag(0);