From 96a722722c8cc5002569bae7c2c2832686901831 Mon Sep 17 00:00:00 2001 From: imaandrew <14946103+imaandrew@users.noreply.github.com> Date: Sun, 17 Mar 2024 20:16:09 -0400 Subject: [PATCH 1/5] Update fp input separate from game logic --- lib/libpm-jp.a | 2 ++ lib/libpm-us.a | 2 ++ src/pm64.h | 9 +++++++++ src/sys/input.c | 34 +++++++++++++++++++++++++++++++--- 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/lib/libpm-jp.a b/lib/libpm-jp.a index 27b48e53..a34a6abf 100644 --- a/lib/libpm-jp.a +++ b/lib/libpm-jp.a @@ -5,6 +5,7 @@ pm_gItemTable = 0x800878B0; pm_gItemHudScripts = 0x8008A650; pm_gAreas = 0x800934C0; pm_viFrames = 0x80093B64; +pm_D_8009A5B8 = 0x8009A598; pm_timeFreezeMode = 0x8009A5B8; pm_gameState = 0x8009A5E0; nuGfxCfb_ptr = 0x8009A62C; @@ -49,6 +50,7 @@ pm_get_npc_safe = 0x8003A808; pm_func_800554A4 = 0x80055154; pm_removeEffect = 0x8005A100; nuPiReadRom = 0x8005F140; +nuContDataGet = 0x8005F300; __osPiGetAccess = 0x80061474; __osPiRelAccess = 0x800614E0; osWritebackDCacheAll = 0x800618A0; diff --git a/lib/libpm-us.a b/lib/libpm-us.a index 4de2bcd6..6ceda16b 100644 --- a/lib/libpm-us.a +++ b/lib/libpm-us.a @@ -5,6 +5,7 @@ pm_gItemTable = 0x800878E0; pm_gItemHudScripts = 0x8008A680; pm_gAreas = 0x800934F0; pm_viFrames = 0x80093B94; +pm_D_8009A5B8 = 0x8009A5B8; pm_timeFreezeMode = 0x8009A5D8; pm_gameState = 0x8009A600; nuGfxCfb_ptr = 0x8009A64C; @@ -49,6 +50,7 @@ pm_get_npc_safe = 0x8003AB48; pm_func_800554A4 = 0x800554A4; pm_removeEffect = 0x8005A450; nuPiReadRom = 0x8005F490; +nuContDataGet = 0x8005F650; __osPiGetAccess = 0x800614A4; __osPiRelAccess = 0x80061510; osWritebackDCacheAll = 0x800618D0; diff --git a/src/pm64.h b/src/pm64.h index 486d4ab0..8e23ac8e 100644 --- a/src/pm64.h +++ b/src/pm64.h @@ -1202,6 +1202,13 @@ typedef struct Action { /* 0x0C */ s8 flag; } pm_Action; // size = 0x10 +typedef struct { + /* 0x00 */ u16 button; + /* 0x02 */ s8 stick_x; + /* 0x03 */ s8 stick_y; + /* 0z04 */ u8 errno; +} OSContPad; // size = 0x06 + typedef void *(*PrintCallback)(void *, const char *, u32); typedef pm_Evt *pm_ScriptList[128]; @@ -1214,6 +1221,7 @@ extern_data pm_ItemData pm_gItemTable[0x16C]; extern_data pm_IconHudScriptPair pm_gItemHudScripts[337]; extern_data pm_Area pm_gAreas[29]; extern_data u32 pm_viFrames; +extern_data OSContPad pm_D_8009A5B8; extern_data s32 pm_timeFreezeMode; extern_data s32 pm_gameState; extern_data u16 *nuGfxCfb_ptr; @@ -1258,6 +1266,7 @@ pm_Npc *pm_get_npc_safe(s32 npcID); s32 pm_func_800554A4(s32); void pm_removeEffect(pm_EffectInstance *effect); void nuPiReadRom(u32 rom_addr, void *buf_ptr, u32 size); +void nuContDataGet(OSContPad *contdata, u32 padno); void osWritebackDCacheAll(void); s32 _Printf(PrintCallback pfn, void *arg, const char *fmt, va_list ap); u64 osGetTime(void); diff --git a/src/sys/input.c b/src/sys/input.c index ae9e4f56..1efb06f6 100644 --- a/src/sys/input.c +++ b/src/sys/input.c @@ -67,9 +67,37 @@ const u32 inputButtonColor[] = { }; void inputUpdate(void) { - joyX = pm_gGameStatus.stickX[0]; - joyY = pm_gGameStatus.stickY[0]; - u16 pmPad = pm_gGameStatus.currentButtons[0].buttons; + OSContPad *cont = &pm_D_8009A5B8; + nuContDataGet(cont, 0); + + joyX = cont->stick_x; + joyY = cont->stick_y; + if (joyX > 0) { + joyX -= 4; + if (joyX < 0) { + joyX = 0; + } + } + if (joyX < 0) { + joyX += 4; + if (joyX > 0) { + joyX = 0; + } + } + if (joyY > 0) { + joyY -= 4; + if (joyY < 0) { + joyY = 0; + } + } + if (joyY < 0) { + joyY += 4; + if (joyY > 0) { + joyY = 0; + } + } + + u16 pmPad = cont->button; padPressedRaw = (pad ^ pmPad) & pmPad; padReleased = (pad ^ pmPad) & ~pmPad; pad = pmPad; From 15b846f8ca99153bc10a1c481f75300cc64e4c62 Mon Sep 17 00:00:00 2001 From: imaandrew <14946103+imaandrew@users.noreply.github.com> Date: Sun, 17 Mar 2024 20:16:38 -0400 Subject: [PATCH 2/5] Frame advance kinda working --- src/commands.c | 20 ++++++++++++++++++++ src/commands.h | 4 ++++ src/fp.c | 11 +++++++++-- src/fp.h | 1 + src/sys/settings.c | 6 ++++-- 5 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/commands.c b/src/commands.c index 4c09714b..70318d21 100644 --- a/src/commands.c +++ b/src/commands.c @@ -28,6 +28,8 @@ struct Command fpCommands[COMMAND_MAX] = { {"break free", COMMAND_PRESS_ONCE, 0, commandBreakFreeProc }, {"toggle in. disp.", COMMAND_PRESS_ONCE, 0, commandToggleInpDispProc }, {"clippy", COMMAND_PRESS_ONCE, 0, commandClippyProc }, + {"pause", COMMAND_PRESS_ONCE, 0, commandPauseProc }, + {"advance", COMMAND_PRESS_ONCE, 0, commandAdvanceProc }, }; void showMenu(void) { @@ -285,3 +287,21 @@ void commandClippyProc(void) { fpLog("clippy enabled"); } } + +void commandPauseProc() { + if (fp.pendingFrames == 0) { + fp.pendingFrames = -1; + fpLog("unpaused"); + } else { + fp.pendingFrames = 0; + fpLog("paused"); + } +} + +void commandAdvanceProc(void) { + if (fp.pendingFrames == 0) { + fp.pendingFrames++; + } else { + commandPauseProc(); + } +} diff --git a/src/commands.h b/src/commands.h index 2eb34977..52fc992c 100644 --- a/src/commands.h +++ b/src/commands.h @@ -22,6 +22,8 @@ enum Commands { COMMAND_BREAK_FREE, COMMAND_TOGGLE_INPUT_DISPLAY, COMMAND_CLIPPY, + COMMAND_PAUSE, + COMMAND_ADVANCE, COMMAND_MAX }; @@ -57,6 +59,8 @@ void commandShowHideTimerProc(void); void commandBreakFreeProc(void); void commandToggleInpDispProc(void); void commandClippyProc(void); +void commandPauseProc(void); +void commandAdvanceProc(void); extern struct Command fpCommands[COMMAND_MAX]; diff --git a/src/fp.c b/src/fp.c index 9f456d33..aa0a2719 100644 --- a/src/fp.c +++ b/src/fp.c @@ -15,7 +15,7 @@ #include #include -FpCtxt fp = {.savedArea = 0x1c, .camDistMin = 100, .camDistMax = 1000}; +FpCtxt fp = {.savedArea = 0x1c, .camDistMin = 100, .camDistMax = 1000, .pendingFrames = -1}; // Initializes and uses new stack instead of using games main thread stack. static void initStack(void (*func)(void)) { @@ -538,7 +538,14 @@ ENTRY void fpUpdateEntry(void) { PRINTF("\n**** fp initialized ****\n\n"); } - pm_step_game_loop(); + if (fp.pendingFrames) { + pm_step_game_loop(); + if (fp.pendingFrames > 0) { + fp.pendingFrames--; + } + } else { + pm_gPlayerStatus.flags |= 0x40000000; + } initStack(fpUpdate); } diff --git a/src/fp.h b/src/fp.h index a4f9a533..cac4e244 100644 --- a/src/fp.h +++ b/src/fp.h @@ -63,6 +63,7 @@ typedef struct { pm_Camera savedCam; s8 freeCamMoveSpeed; s8 freeCamPanSpeed; + s32 pendingFrames; } FpCtxt; extern FpCtxt fp; diff --git a/src/sys/settings.c b/src/sys/settings.c index 02fdce0c..ef4ea703 100644 --- a/src/sys/settings.c +++ b/src/sys/settings.c @@ -56,8 +56,8 @@ void settingsLoadDefault(void) { d->timerY = 68; d->binds[COMMAND_MENU] = bindMake(2, BUTTON_R, BUTTON_D_UP); d->binds[COMMAND_RETURN] = bindMake(2, BUTTON_R, BUTTON_D_LEFT); - d->binds[COMMAND_LEVITATE] = bindMake(1, BUTTON_D_UP); - d->binds[COMMAND_TURBO] = bindMake(1, BUTTON_D_DOWN); + d->binds[COMMAND_LEVITATE] = bindMake(2, BUTTON_R, BUTTON_A); + d->binds[COMMAND_TURBO] = bindMake(2, BUTTON_L, BUTTON_D_DOWN); d->binds[COMMAND_SAVEPOS] = bindMake(1, BUTTON_D_LEFT); d->binds[COMMAND_LOADPOS] = bindMake(1, BUTTON_D_RIGHT); d->binds[COMMAND_LZS] = bindMake(2, BUTTON_R, BUTTON_D_LEFT); @@ -73,6 +73,8 @@ void settingsLoadDefault(void) { d->binds[COMMAND_BREAK_FREE] = bindMake(2, BUTTON_L, BUTTON_D_DOWN); d->binds[COMMAND_TOGGLE_INPUT_DISPLAY] = bindMake(0); d->binds[COMMAND_CLIPPY] = bindMake(0); + d->binds[COMMAND_PAUSE] = bindMake(1, BUTTON_D_DOWN); + d->binds[COMMAND_ADVANCE] = bindMake(1, BUTTON_D_UP); d->cheatEnemyContact = 0; d->controlStickRange = 90; d->controlStick = 0; From 1d7f9c42adeabb2063f0e7ddf509a566d05e9f80 Mon Sep 17 00:00:00 2001 From: imaandrew <14946103+imaandrew@users.noreply.github.com> Date: Mon, 18 Mar 2024 01:19:08 -0400 Subject: [PATCH 3/5] Working???? --- genhooks | 2 ++ lib/libpm-jp.a | 8 ++++++++ lib/libpm-us.a | 8 ++++++++ src/fp.c | 31 ++++++++++++++++++++++++++++--- src/fp.h | 2 ++ src/pm64.h | 18 ++++++++++++++++++ src/sys/gfx.c | 10 ++++++++-- src/sys/gfx.h | 2 +- 8 files changed, 75 insertions(+), 6 deletions(-) diff --git a/genhooks b/genhooks index 51ec7bac..87740f2d 100755 --- a/genhooks +++ b/genhooks @@ -36,6 +36,8 @@ genhook() } genhook "$sym_update_hook" "jal $sym_fpUpdateEntry;" +genhook "$sym_background_hook" "jal $sym_fpBackgroundEntry;" +genhook "$sym_draw_frame_hook" "jal $sym_fpFrameEntry;" genhook "$sym_draw_hook" "jal $sym_fpDrawEntry;" genhook "$sym_after_draw_hook" "jal $sym_fpAfterDrawEntry;" genhook "$sym_update_camera_mode_6_hook" "jal $sym_fpUpdateCameraMode6;" diff --git a/lib/libpm-jp.a b/lib/libpm-jp.a index a34a6abf..30454476 100644 --- a/lib/libpm-jp.a +++ b/lib/libpm-jp.a @@ -10,6 +10,7 @@ pm_timeFreezeMode = 0x8009A5B8; pm_gameState = 0x8009A5E0; nuGfxCfb_ptr = 0x8009A62C; pm_masterGfxPos = 0x8009A64C; +pm_gDisplayContext = 0x8009A654; pm_logicalSaveInfo = 0x8009BA10; pm_gameMode = 0x8009E700; pm_gMapTransitionAlpha = 0x8009E750; @@ -28,6 +29,7 @@ pm_gPartnerActionStatus = 0x8010ED70; pm_gUiStatus = 0x8010F118; pm_gPlayerStatus = 0x8010F188; pm_gHudElementSizes = 0x8015406C; +pm_screen_overlay_frontZoom = 0x8015B884; pm_musicCurrentVolume = 0x8015EA66; pm_gActionCommandStatus = 0x8029FED0; pm_gNumScripts = 0x802DA488; @@ -45,6 +47,7 @@ pm_update_cameras = 0x8002D090; pm_update_camera_zone_interp = 0x80031124; pm_setCurtainDrawCallback = 0x8002BEC4; pm_setCurtainFadeGoal = 0x8002BED4; +nuGfxTaskStart = 0x8002CF24; pm_setGameMode = 0x80033180; pm_get_npc_safe = 0x8003A808; pm_func_800554A4 = 0x80055154; @@ -86,6 +89,11 @@ pm_saveGame = 0x802DC150; update_hook = 0x80026100; pm_step_game_loop = 0x80026710; +background_hook = 0x80026124; +draw_frame_hook = 0x8002612C; +pm_gfx_task_background = 0x800269C0; +pm_gfx_draw_frame = 0x80026AD4; + draw_hook = 0x80026C88; pm_state_render_frontUI = 0x801181D4; diff --git a/lib/libpm-us.a b/lib/libpm-us.a index 6ceda16b..d184118f 100644 --- a/lib/libpm-us.a +++ b/lib/libpm-us.a @@ -10,6 +10,7 @@ pm_timeFreezeMode = 0x8009A5D8; pm_gameState = 0x8009A600; nuGfxCfb_ptr = 0x8009A64C; pm_masterGfxPos = 0x8009A66C; +pm_gDisplayContext = 0x8009A674; pm_logicalSaveInfo = 0x8009BA30; pm_gameMode = 0x800A08F0; pm_gMapTransitionAlpha = 0x800A0940; @@ -28,6 +29,7 @@ pm_gPartnerActionStatus = 0x8010EBB0; pm_gUiStatus = 0x8010EF58; pm_gPlayerStatus = 0x8010EFC8; pm_gHudElementSizes = 0x8014EFCC; +pm_screen_overlay_frontZoom = 0x80156904; pm_musicCurrentVolume = 0x80159AE6; pm_gActionCommandStatus = 0x8029FBE0; pm_gNumScripts = 0x802DA488; @@ -43,6 +45,7 @@ pm_fioWriteFlash = 0x8002B948; pm_setCurtainScaleGoal = 0x8002BEDC; pm_setCurtainDrawCallback = 0x8002BF04; pm_setCurtainFadeGoal = 0x8002BF14; +nuGfxTaskStart = 0x8002CCC4; pm_update_cameras = 0x8002D400; pm_update_camera_zone_interp = 0x80031494; pm_setGameMode = 0x800334F0; @@ -86,6 +89,11 @@ pm_saveGame = 0x802E11A0; update_hook = 0x8002611C; pm_step_game_loop = 0x80026740; +background_hook = 0x80026140; +draw_frame_hook = 0x80026148; +pm_gfx_task_background = 0x800269EC; +pm_gfx_draw_frame = 0x80026B08; + draw_hook = 0x80026CBC; pm_state_render_frontUI = 0x80112FC4; diff --git a/src/fp.c b/src/fp.c index aa0a2719..c4a1f30d 100644 --- a/src/fp.c +++ b/src/fp.c @@ -525,7 +525,7 @@ void fpDraw(void) { menuDraw(fp.global); fpDrawLog(font, cellWidth, cellHeight, menuAlpha); - gfxFlush(); + gfxFlush(fp.prevPendingFrames); } /* ========================== HOOK ENTRY POINTS ========================== */ @@ -538,17 +538,42 @@ ENTRY void fpUpdateEntry(void) { PRINTF("\n**** fp initialized ****\n\n"); } + fp.prevPendingFrames = fp.pendingFrames; if (fp.pendingFrames) { pm_step_game_loop(); if (fp.pendingFrames > 0) { fp.pendingFrames--; } - } else { - pm_gPlayerStatus.flags |= 0x40000000; } initStack(fpUpdate); } +ENTRY void fpBackgroundEntry(void) { + init_gp(); + if (fp.prevPendingFrames) { + pm_gfx_task_background(); + fp.savedBackgroundGfx = pm_masterGfxPos; + } else { + if (pm_screen_overlay_frontZoom != 255.f) { + nuGfxTaskStart(&pm_gDisplayContext->backgroundGfx[0], + (u32)(fp.savedBackgroundGfx - pm_gDisplayContext->backgroundGfx) * 8, 0, 0); + } + } +} + +ENTRY void fpFrameEntry(void) { + init_gp(); + if (fp.prevPendingFrames) { + pm_gfx_draw_frame(); + } else { + initStack(fpDraw); + if (pm_screen_overlay_frontZoom != 255.f) { + nuGfxTaskStart(pm_gDisplayContext->mainGfx, (u32)(pm_masterGfxPos - pm_gDisplayContext->mainGfx) * 8, 0, + 0x40000); + } + } +} + ENTRY void fpDrawEntry(void) { init_gp(); pm_state_render_frontUI(); diff --git a/src/fp.h b/src/fp.h index cac4e244..c0445621 100644 --- a/src/fp.h +++ b/src/fp.h @@ -64,6 +64,8 @@ typedef struct { s8 freeCamMoveSpeed; s8 freeCamPanSpeed; s32 pendingFrames; + s32 prevPendingFrames; + Gfx *savedBackgroundGfx; } FpCtxt; extern FpCtxt fp; diff --git a/src/pm64.h b/src/pm64.h index 8e23ac8e..c702d5d8 100644 --- a/src/pm64.h +++ b/src/pm64.h @@ -1209,6 +1209,19 @@ typedef struct { /* 0z04 */ u8 errno; } OSContPad; // size = 0x06 +typedef struct { + /* 0x00000 */ LookAt lookAt; + /* 0x00020 */ Hilite hilite; + /* 0x00030 */ Mtx camPerspMatrix[8]; // could only be length 4, unsure +#if PM64_VERSION == US + /* 0x00230 */ Gfx mainGfx[0x2080]; +#else + /* 0x00230 */ Gfx mainGfx[0x2000]; +#endif + /* 0x10630 */ Gfx backgroundGfx[0x200]; // used by gfx_task_background + /* 0x11630 */ Mtx matrixStack[0x200]; +} DisplayContext; // size = 0x19630 + typedef void *(*PrintCallback)(void *, const char *, u32); typedef pm_Evt *pm_ScriptList[128]; @@ -1226,6 +1239,7 @@ extern_data s32 pm_timeFreezeMode; extern_data s32 pm_gameState; extern_data u16 *nuGfxCfb_ptr; extern_data Gfx *pm_masterGfxPos; +extern_data DisplayContext *pm_gDisplayContext; extern_data s32 pm_logicalSaveInfo[4][2]; extern_data s16 pm_gameMode; extern_data s16 pm_gMapTransitionAlpha; @@ -1243,6 +1257,7 @@ extern_data pm_PartnerActionStatus pm_gPartnerActionStatus; extern_data pm_UiStatus pm_gUiStatus; extern_data pm_PlayerStatus pm_gPlayerStatus; extern_data pm_HudElementSize pm_gHudElementSizes[26]; +extern_data f32 pm_screen_overlay_frontZoom; extern_data s16 pm_musicCurrentVolume; extern_data pm_ActionCommandStatus pm_gActionCommandStatus; extern_data s32 pm_gNumScripts; @@ -1259,6 +1274,7 @@ void pm_fioWriteFlash(s32 slot, void *buffer, u32 size); void pm_setCurtainScaleGoal(f32 goal); void pm_setCurtainDrawCallback(void *callback); void pm_setCurtainFadeGoal(f32 goal); +void nuGfxTaskStart(Gfx *gfxList_ptr, u32 gfxListSize, u32 ucode, u32 flag); void pm_update_cameras(void); void pm_update_camera_zone_interp(pm_Camera *camera); void pm_setGameMode(s32 mode); @@ -1290,6 +1306,8 @@ pm_ApiStatus pm_useIdleAnimation(pm_Evt *script, s32 isInitialCall); pm_ApiStatus pm_gotoMap(pm_Evt *script, s32 isInitialCall); void pm_saveGame(void); +void pm_gfx_task_background(void); +void pm_gfx_draw_frame(void); void pm_state_render_frontUI(void); void pm_step_game_loop(void); void pm_update_camera_mode_6(pm_Camera *camera); diff --git a/src/sys/gfx.c b/src/sys/gfx.c index 311042b7..219af363 100644 --- a/src/sys/gfx.c +++ b/src/sys/gfx.c @@ -14,6 +14,7 @@ static Gfx *gfxDisp; static Gfx *gfxDispW; static Gfx *gfxDispP; static Gfx *gfxDispD; +static u32 *fpDispPos; #define GFX_STACK_LENGTH 8 static u64 gfxModes[GFX_MODE_ALL]; @@ -167,10 +168,15 @@ void *gfxDataAppend(void *data, size_t size) { return gfxDispD; } -void gfxFlush(void) { +void gfxFlush(s32 pendingFrames) { flushChars(); gSPEndDisplayList(gfxDispP++); - gSPDisplayList(pm_masterGfxPos++, gfxDisp); + if (pendingFrames) { + fpDispPos = ((u32 *)pm_masterGfxPos + 1); + gSPDisplayList(pm_masterGfxPos++, gfxDisp); + } else { + *fpDispPos = (u32)gfxDisp; + } Gfx *disp_w = gfxDispW; gfxDispW = gfxDisp; gfxDisp = disp_w; diff --git a/src/sys/gfx.h b/src/sys/gfx.h index 1657eefb..134e977c 100644 --- a/src/sys/gfx.h +++ b/src/sys/gfx.h @@ -90,7 +90,7 @@ void gfxModeReplace(enum GfxMode mode, u64 value); /* all sizes are specified in number of bytes */ Gfx *gfxDispAppend(Gfx *disp, size_t size); void *gfxDataAppend(void *data, size_t size); -void gfxFlush(void); +void gfxFlush(s32 pendingFrames); void gfxTexldrInit(struct GfxTexldr *texldr); struct GfxTexture *gfxTexldrLoad(struct GfxTexldr *texldr, const struct GfxTexdesc *texdesc, From 7ca0822e3c82897df70b96f7ff0717ccfcc0a486 Mon Sep 17 00:00:00 2001 From: imaandrew <14946103+imaandrew@users.noreply.github.com> Date: Mon, 18 Mar 2024 01:23:39 -0400 Subject: [PATCH 4/5] switch break free to L+D-Up --- src/sys/settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sys/settings.c b/src/sys/settings.c index ef4ea703..c50593d0 100644 --- a/src/sys/settings.c +++ b/src/sys/settings.c @@ -70,7 +70,7 @@ void settingsLoadDefault(void) { d->binds[COMMAND_START_TIMER] = bindMake(0); d->binds[COMMAND_RESET_TIMER] = bindMake(0); d->binds[COMMAND_SHOW_HIDE_TIMER] = bindMake(0); - d->binds[COMMAND_BREAK_FREE] = bindMake(2, BUTTON_L, BUTTON_D_DOWN); + d->binds[COMMAND_BREAK_FREE] = bindMake(2, BUTTON_L, BUTTON_D_UP); d->binds[COMMAND_TOGGLE_INPUT_DISPLAY] = bindMake(0); d->binds[COMMAND_CLIPPY] = bindMake(0); d->binds[COMMAND_PAUSE] = bindMake(1, BUTTON_D_DOWN); From c10511f899fe2d62e7bf58e13b9dd2cc31564606 Mon Sep 17 00:00:00 2001 From: imaandrew <14946103+imaandrew@users.noreply.github.com> Date: Mon, 18 Mar 2024 01:36:38 -0400 Subject: [PATCH 5/5] Unpause when warping --- src/commands.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/commands.c b/src/commands.c index 70318d21..5d214f76 100644 --- a/src/commands.c +++ b/src/commands.c @@ -110,6 +110,8 @@ bool fpWarp(enum Areas area, u16 map, u16 entrance) { pm_setCurtainFadeGoal(0.0f); fp.warp = TRUE; + // disable frame advance when warping + fp.pendingFrames = -1; return TRUE; }