From f9567436af93e7aa2f93ed563e25b40f8988f2fc Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Mon, 1 Dec 2025 03:57:22 -0600 Subject: [PATCH 01/10] update flag icons to gray/green for accessibility --- res/fp/flag_icons.png | Bin 442 -> 498 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/fp/flag_icons.png b/res/fp/flag_icons.png index f845ee77f841f9d12b15e8c41e1f10ce7d73788f..f0108b85ea914116f034a828238b51d0d30176da 100644 GIT binary patch delta 473 zcmV;~0Ve*s1M&lqBYyx1a7bBm001r{001r{0eGc9b^rhYq)9|UR47wzkTGu)K@f%C z>~1ark~k(7LXqOePK?Vm*C5h`hF@?JqNkvsrMh2`E|rmxsHiC@+&Gkx8e`+RqMx67;}AtCXkr=8Jgz8yWX)}D4cofpk!(wv z^>n}ASH>93=W|r6Rn+VCd@vYfzV9nBnM_m^MUYY=&vT4MBQVJ$qAivZWm$qzaIdq| zbUH;G$H=k_D>Ng~Xf(=pyRC=A;f5nAr5usy^r>ere@mQwSW*~(wJzo0C1_zsV_4$89N0yEkuW!Fo&0=O2q)jAe z8^Pk)r)^yDY@OQYUZnf$doX~R5yV|C_Oq|%%sJ#G_G6o%pV+O( zJw!rT2c=g)M+FPW3MkS*mo`vAEXRsq5Ya>kWXAT)+&PEB{0NCpdfTsf#9;8E)jHmc zaXJ&JK6yVq%=4q$FfwS!>m*4}8;!04KSa2rO0Ou+&zjB4-G8!dyDO1y>OCGPMVN%Z z%(=e6{#spkTn!jd{|ew+2xQ(I!7?0Gz%enAbeEg>A30) z!96q^ExccCi>R7S!gU8`-SIVMD_`L)8%rXFE$7GPdym=fp z<5Y90H1*RPhkyCeyIYKQOd7KNCP}N)Mi&L03hu7LdU39Ao0luQW!uFo>DH+S2UJ3R z5wMx-1N*Gi9Y+LonZ-X4Xy&m6&Z#QeE1|#0!eDkL>lIQuWW~_Rf;@YY*!ZjG`K!6y zAL3e%!bs+R)e2GWRTtrU^4H Date: Wed, 3 Dec 2025 00:34:15 -0600 Subject: [PATCH 02/10] store/load peach enabled flag in save file --- src/commands.c | 2 ++ src/fp/file/fp_file.c | 1 + src/pm64.h | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/commands.c b/src/commands.c index 4b4419a6..5d4d688e 100644 --- a/src/commands.c +++ b/src/commands.c @@ -227,6 +227,7 @@ void commandImportSaveProc(void) { } void commandSaveGameProc(void) { + pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH] = pm_gGameStatus.peachFlags & 1; pm_entity_SaveBlock_save_data(); pm_sfx_play_sound(0x10); fpLog("saved to slot %d", pm_gGameStatus.saveSlot); @@ -245,6 +246,7 @@ void commandLoadGameProc(void) { if (pm_fio_validate_globals_checksums(file)) { pm_gCurrentSaveFile = *file; pm_fio_deserialize_state(); + pm_gGameStatus.peachFlags = (pm_gGameStatus.peachFlags & ~1) | pm_gCurrentSaveFile.globalBytes[0x1B4]; fpWarp(file->areaID, file->mapID, file->entryID); fpLog("loaded from slot %d", pm_gGameStatus.saveSlot); } else { diff --git a/src/fp/file/fp_file.c b/src/fp/file/fp_file.c index 94197cfa..ee65b0e5 100644 --- a/src/fp/file/fp_file.c +++ b/src/fp/file/fp_file.c @@ -120,6 +120,7 @@ s32 fpImportFile(const char *path, void *data) { if (pm_fio_validate_globals_checksums(file)) { pm_gCurrentSaveFile = *file; pm_fio_deserialize_state(); + pm_gGameStatus.peachFlags |= pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH]; fpWarp(file->areaID, file->mapID, file->entryID); } else { fpLog("save file corrupt"); diff --git a/src/pm64.h b/src/pm64.h index d5908200..207f42b7 100644 --- a/src/pm64.h +++ b/src/pm64.h @@ -13,6 +13,8 @@ #define ICON_PALETTE_SIZE 32 +#define GB_MARIO_PEACH 0x1B4 // GB_Unused_1B4 + #if PM64_VERSION == US #define SCRIPTS_GLOBAL_START 0x801049B0 #define ICONS_STAR_SPIRITS_ROM_START 0x963B0 From 0daacbb28ade32d8ec612cfcea9d41fd4367bce6 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Wed, 3 Dec 2025 00:54:26 -0600 Subject: [PATCH 03/10] store/load partnerActionState in save file --- src/commands.c | 10 +++++++++- src/fp/file/fp_file.c | 4 ++++ src/pm64.h | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/commands.c b/src/commands.c index 5d4d688e..e020e85c 100644 --- a/src/commands.c +++ b/src/commands.c @@ -228,6 +228,10 @@ void commandImportSaveProc(void) { void commandSaveGameProc(void) { pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH] = pm_gGameStatus.peachFlags & 1; + pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER] = + pm_gPartnerStatus.partnerActionState && + (pm_gPlayerData.currentPartner == PARTNER_WATT || pm_gPlayerData.currentPartner == PARTNER_SUSHIE || + pm_gPlayerData.currentPartner == PARTNER_LAKILESTER); pm_entity_SaveBlock_save_data(); pm_sfx_play_sound(0x10); fpLog("saved to slot %d", pm_gGameStatus.saveSlot); @@ -246,7 +250,11 @@ void commandLoadGameProc(void) { if (pm_fio_validate_globals_checksums(file)) { pm_gCurrentSaveFile = *file; pm_fio_deserialize_state(); - pm_gGameStatus.peachFlags = (pm_gGameStatus.peachFlags & ~1) | pm_gCurrentSaveFile.globalBytes[0x1B4]; + pm_gGameStatus.peachFlags = (pm_gGameStatus.peachFlags & ~1) | pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH]; + if (pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER]) { + pm_gPartnerStatus.partnerActionState = 1; + pm_gGameStatus.keepUsingPartnerOnMapChange = 1; + } fpWarp(file->areaID, file->mapID, file->entryID); fpLog("loaded from slot %d", pm_gGameStatus.saveSlot); } else { diff --git a/src/fp/file/fp_file.c b/src/fp/file/fp_file.c index ee65b0e5..92c86a2c 100644 --- a/src/fp/file/fp_file.c +++ b/src/fp/file/fp_file.c @@ -121,6 +121,10 @@ s32 fpImportFile(const char *path, void *data) { pm_gCurrentSaveFile = *file; pm_fio_deserialize_state(); pm_gGameStatus.peachFlags |= pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH]; + if (pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER]) { + pm_gPartnerStatus.partnerActionState = 1; + pm_gGameStatus.keepUsingPartnerOnMapChange = 1; + } fpWarp(file->areaID, file->mapID, file->entryID); } else { fpLog("save file corrupt"); diff --git a/src/pm64.h b/src/pm64.h index 207f42b7..88b65973 100644 --- a/src/pm64.h +++ b/src/pm64.h @@ -13,7 +13,8 @@ #define ICON_PALETTE_SIZE 32 -#define GB_MARIO_PEACH 0x1B4 // GB_Unused_1B4 +#define GB_MARIO_PEACH 0x1B4 // GB_Unused_1B4 +#define GB_USING_PARTNER 0x1B5 // GB_Unused_1B5 #if PM64_VERSION == US #define SCRIPTS_GLOBAL_START 0x801049B0 From bf62411252c51f37025c434006ead08a2ef39c40 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Wed, 3 Dec 2025 01:02:43 -0600 Subject: [PATCH 04/10] fix completed quizmo quiz questions count --- src/fp/file/fp_file.c | 4 ++-- src/pm64.h | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/fp/file/fp_file.c b/src/fp/file/fp_file.c index 92c86a2c..bc4f6d52 100644 --- a/src/fp/file/fp_file.c +++ b/src/fp/file/fp_file.c @@ -241,8 +241,8 @@ struct Menu *createFileMenu(void) { y++; menuAddStatic(&menu, 0, y, "quizmo", 0xC0C0C0); - struct MenuItem *quizmoInput = - menuAddIntinput(&menu, menuX, y++, 10, 2, menuByteModProc, &pm_gCurrentSaveFile.globalBytes[0x161]); + struct MenuItem *quizmoInput = menuAddIntinput(&menu, menuX, y++, 10, 2, menuByteModProc, + &pm_gCurrentSaveFile.globalBytes[GB_CompletedQuizzes]); menuItemAddChainLink(quizmoInput, progressInput, MENU_NAVIGATE_UP); menuAddStatic(&menu, 0, y, "toy box 1", 0xC0C0C0); menuAddOption(&menu, menuX, y++, diff --git a/src/pm64.h b/src/pm64.h index 88b65973..8a6ba411 100644 --- a/src/pm64.h +++ b/src/pm64.h @@ -5,16 +5,17 @@ #include #include -#define JP 0x00 -#define US 0x01 +#define JP 0x00 +#define US 0x01 -#define SCREEN_WIDTH 320 -#define SCREEN_HEIGHT 240 +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 240 -#define ICON_PALETTE_SIZE 32 +#define ICON_PALETTE_SIZE 32 -#define GB_MARIO_PEACH 0x1B4 // GB_Unused_1B4 -#define GB_USING_PARTNER 0x1B5 // GB_Unused_1B5 +#define GB_COMPLETED_QUIZZES 0x160 +#define GB_MARIO_PEACH 0x1B4 // GB_Unused_1B4 +#define GB_USING_PARTNER 0x1B5 // GB_Unused_1B5 #if PM64_VERSION == US #define SCRIPTS_GLOBAL_START 0x801049B0 From 2ee01b3d7b57ff9848fbc49e8aaaafc1a3502a46 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Wed, 3 Dec 2025 02:51:35 -0600 Subject: [PATCH 05/10] make draw background functions, add to trainers --- src/fp/file/fp_file.c | 2 +- src/fp/practice/trainer.c | 64 ++++++++++++++++++--------------------- src/sys/gfx.c | 12 ++++++++ src/sys/gfx.h | 3 ++ 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/fp/file/fp_file.c b/src/fp/file/fp_file.c index bc4f6d52..458386df 100644 --- a/src/fp/file/fp_file.c +++ b/src/fp/file/fp_file.c @@ -242,7 +242,7 @@ struct Menu *createFileMenu(void) { menuAddStatic(&menu, 0, y, "quizmo", 0xC0C0C0); struct MenuItem *quizmoInput = menuAddIntinput(&menu, menuX, y++, 10, 2, menuByteModProc, - &pm_gCurrentSaveFile.globalBytes[GB_CompletedQuizzes]); + &pm_gCurrentSaveFile.globalBytes[GB_COMPLETED_QUIZZES]); menuItemAddChainLink(quizmoInput, progressInput, MENU_NAVIGATE_UP); menuAddStatic(&menu, 0, y, "toy box 1", 0xC0C0C0); menuAddOption(&menu, menuX, y++, diff --git a/src/fp/practice/trainer.c b/src/fp/practice/trainer.c index c6f2fd84..205813e2 100644 --- a/src/fp/practice/trainer.c +++ b/src/fp/practice/trainer.c @@ -181,10 +181,15 @@ static s32 trainerPositionProc(struct MenuItem *item, enum MenuCallbackReason re } static void lzsDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeight, u32 color, u8 alpha) { + if (!fp.menuActive) { + u32 colorBlackT = GPACK_RGB24A8(0x000000, 0x60); + gfxTextBackgroundDraw(x, y, 12, 2, chWidth, chHeight, colorBlackT); + } + gfxModeSet(GFX_MODE_COLOR, GPACK_RGB24A8(color, alpha)); s32 menuY = 0; - gfxPrintf(font, x, y + chHeight * menuY++, "current lzs jumps: %d", lzsCurrentJumps); - gfxPrintf(font, x, y + chHeight * menuY++, "record lzs jumps: %d", lzsRecordJumps); + gfxPrintf(font, x, y + chHeight * menuY++, "current: %d", lzsCurrentJumps); + gfxPrintf(font, x, y + chHeight * menuY++, "record: %d", lzsRecordJumps); } static s32 lzsDrawProc(struct MenuItem *item, struct MenuDrawParams *drawParams) { @@ -217,6 +222,7 @@ static void spinDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeig // black background s32 bgY = y - 11; s32 bgHeight = 0; + s32 bgWidth = 88; u8 count = 0; if (settings->trainerSpinJumpTiming) { count++; @@ -240,10 +246,7 @@ static void spinDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeig if (bgHeight > 0) { bgHeight += 3; } - gfxModeSet(GFX_MODE_COLOR, colorBlackT); - gfxModeReplace(GFX_MODE_COMBINE, G_CC_MODE(G_CC_PRIMITIVE, G_CC_PRIMITIVE)); - gfxDisp(gsSPScisTextureRectangle(qs102(x - 2), qs102(bgY), qs102(x + 86), qs102(bgY + bgHeight), 0, 0, 0, 0, 0)); - gfxModePop(GFX_MODE_COMBINE); + gfxRectangleDraw(x - 2, bgY, bgWidth, bgHeight, colorBlackT); s32 textX = x + 17; s32 textY = y; @@ -345,8 +348,6 @@ static void spinDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeig } static void issDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeight, u32 color, u8 alpha) { - gfxModeSet(GFX_MODE_COLOR, GPACK_RGB24A8(color, alpha)); - s32 xPos = ceil(pm_gPlayerStatus.position.x); s32 zPos = ceil(pm_gPlayerStatus.position.z); bool goodPos = FALSE; @@ -371,8 +372,12 @@ static void issDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeigh u32 colorYellow = GPACK_RGB24A8(0xFFFF00, 0xFF); u32 colorRed = GPACK_RGB24A8(0xFF0000, 0xFF); u32 colorWhite = GPACK_RGB24A8(0xFFFFFF, 0xFF); - s32 menuY = 0; + u32 colorBlackT = GPACK_RGB24A8(0x000000, 0x60); + + gfxTextBackgroundDraw(x, y, 19, 4, chWidth, chHeight, colorBlackT); + s32 menuY = 0; + gfxModeSet(GFX_MODE_COLOR, GPACK_RGB24A8(color, alpha)); gfxPrintf(font, x, y + chHeight * menuY++, "x: %.4f", pm_gPlayerStatus.position.x); gfxPrintf(font, x, y + chHeight * menuY++, "z: %.4f", pm_gPlayerStatus.position.z); gfxPrintf(font, x, y + chHeight * menuY, "angle:"); @@ -403,7 +408,6 @@ static s32 issDrawProc(struct MenuItem *item, struct MenuDrawParams *drawParams) } static void aceDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeight, u32 color, u8 alpha) { - gfxModeSet(GFX_MODE_COLOR, GPACK_RGB24A8(color, alpha)); s32 effectCount = 0; s32 i; for (i = 0; i < 96; i++) { @@ -415,7 +419,14 @@ static void aceDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeigh u32 colorGreen = GPACK_RGB24A8(0x00FF00, 0xFF); u32 colorRed = GPACK_RGB24A8(0xFF0000, 0xFF); u32 colorWhite = GPACK_RGB24A8(0xFFFFFF, 0xFF); + u32 colorBlackT = GPACK_RGB24A8(0x000000, 0x60); + + if (!fp.menuActive) { + gfxTextBackgroundDraw(x, y, 17, 3, chWidth, chHeight, colorBlackT); + } + + gfxModeSet(GFX_MODE_COLOR, GPACK_RGB24A8(color, alpha)); gfxPrintf(font, x + chWidth * 0, y + chHeight * 0, "effects:"); gfxPrintf(font, x + chWidth * 0, y + chHeight * 1, "flags:"); gfxPrintf(font, x + chWidth * 0, y + chHeight * 2, "frame window:"); @@ -930,10 +941,12 @@ void trainerDrawSpinBar(s32 x, s32 y, struct GfxFont *font, u32 color, u8 alpha) } barWidth *= barMult; barGoal *= barMult; + u16 bgHeight = 34; + u16 markerWidth = 2; u16 barX = x - barWidth / 2; u16 barGoalX = barX + barGoal; - u16 barFullX = barX + spinFrame * barMult; - u16 barYBottom = y + 10; + u16 barFullWidth = spinFrame * barMult; + u16 barHeight = 10; s32 iconY = y + 12; s32 textY = iconY + 11; @@ -942,28 +955,11 @@ void trainerDrawSpinBar(s32 x, s32 y, struct GfxFont *font, u32 color, u8 alpha) s32 delayIconX = x + 2; s32 delayTextX = delayIconX + 17; - // draw background - gfxModeSet(GFX_MODE_COLOR, colorBlackT); - gfxModeReplace(GFX_MODE_COMBINE, G_CC_MODE(G_CC_PRIMITIVE, G_CC_PRIMITIVE)); - gfxDisp(gsSPScisTextureRectangle(qs102(barX - 4), qs102(y - 4), qs102(barX + barWidth + 4), qs102(y + 30), 0, 0, 0, - 0, 0)); - - // draw bar - // background - gfxModeSet(GFX_MODE_COLOR, colorBackground); - gfxDisp(gsSPScisTextureRectangle(qs102(barX - 1), qs102(y - 1), qs102(barX + barWidth + 1), qs102(barYBottom + 1), - 0, 0, 0, 0, 0)); - // empty bar - gfxModeSet(GFX_MODE_COLOR, colorEmpty); - gfxDisp(gsSPScisTextureRectangle(qs102(barX), qs102(y), qs102(barX + barWidth), qs102(barYBottom), 0, 0, 0, 0, 0)); - // full bar - gfxModeSet(GFX_MODE_COLOR, colorFull); - gfxDisp(gsSPScisTextureRectangle(qs102(barX), qs102(y), qs102(barFullX), qs102(barYBottom), 0, 0, 0, 0, 0)); - // goal marker - gfxModeSet(GFX_MODE_COLOR, colorYellow); - gfxDisp( - gsSPScisTextureRectangle(qs102(barGoalX - 1), qs102(y), qs102(barGoalX + 1), qs102(barYBottom), 0, 0, 0, 0, 0)); - gfxModePop(GFX_MODE_COMBINE); + gfxRectangleDraw(barX - 4, y - 4, barWidth + 8, bgHeight, colorBlackT); // background + gfxRectangleDraw(barX - 1, y - 1, barWidth + 2, barHeight + 2, colorBackground); // bar + gfxRectangleDraw(barX, y, barWidth, barHeight, colorEmpty); // empty bar + gfxRectangleDraw(barX, y, barFullWidth, barHeight, colorFull); // full bar + gfxRectangleDraw(barGoalX - 1, y, markerWidth, barHeight, colorYellow); // goal marker gfxModeSet(GFX_MODE_COLOR, colorWhite); gfxModeReplace(GFX_MODE_DROPSHADOW, 0); diff --git a/src/sys/gfx.c b/src/sys/gfx.c index f3ec9431..5e702589 100644 --- a/src/sys/gfx.c +++ b/src/sys/gfx.c @@ -596,6 +596,18 @@ void gfxSpriteDraw(const struct GfxSprite *sprite) { gfxSynced = FALSE; } +void gfxRectangleDraw(s16 x, s16 y, s16 width, s16 height, u32 color) { + gfxModeReplace(GFX_MODE_COLOR, color); + gfxModeReplace(GFX_MODE_COMBINE, G_CC_MODE(G_CC_PRIMITIVE, G_CC_PRIMITIVE)); + gfxDisp(gsSPScisTextureRectangle(qs102(x), qs102(y), qs102(x + width), qs102(y + height), 0, 0, 0, 0, 0)); + gfxModePop(GFX_MODE_COLOR); + gfxModePop(GFX_MODE_COMBINE); +} + +void gfxTextBackgroundDraw(s16 x, s16 y, u8 chCountW, u8 chCountH, s32 chWidth, s32 chHeight, u32 color) { + gfxRectangleDraw(x - 3, y - chHeight - 2, chWidth * chCountW + 6, chHeight * (chCountH + 1) - 1, color); +} + s32 gfxFontXheight(const struct GfxFont *font) { return font->baseline - font->median; } diff --git a/src/sys/gfx.h b/src/sys/gfx.h index 1657eefb..489056c2 100644 --- a/src/sys/gfx.h +++ b/src/sys/gfx.h @@ -115,6 +115,9 @@ void gfxRdpLoadTile(const struct GfxTexture *texture, s16 textureTile, s8 palett void gfxSpriteDraw(const struct GfxSprite *sprite); +void gfxRectangleDraw(s16 x, s16 y, s16 width, s16 height, u32 color); +void gfxTextBackgroundDraw(s16 x, s16 y, u8 chCountW, u8 chCountH, s32 chWidth, s32 chHeight, u32 color); + s32 gfxFontXheight(const struct GfxFont *font); void gfxPrintf(const struct GfxFont *font, s32 x, s32 y, const char *format, ...); void gfxPrintfN(const struct GfxFont *font, s32 x, s32 y, const char *format, ...); From 7c9a2e031e9b3491867cea8c8fe1753458742a98 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Wed, 3 Dec 2025 03:42:15 -0600 Subject: [PATCH 06/10] set new default command bindings --- src/sys/settings.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sys/settings.c b/src/sys/settings.c index 653e6af3..8f615d70 100644 --- a/src/sys/settings.c +++ b/src/sys/settings.c @@ -83,12 +83,12 @@ 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(3, BUTTON_R, BUTTON_L, BUTTON_D_DOWN); d->binds[COMMAND_TOGGLE_INPUT_DISPLAY] = bindMake(0); - d->binds[COMMAND_CLIPPY] = bindMake(0); - d->binds[COMMAND_STORE_ABILITY] = bindMake(0); - d->binds[COMMAND_IGNORE_WALLS] = bindMake(0); - d->binds[COMMAND_FLOOR_CLIP] = bindMake(0); + d->binds[COMMAND_CLIPPY] = bindMake(2, BUTTON_L, BUTTON_D_UP); + d->binds[COMMAND_STORE_ABILITY] = bindMake(2, BUTTON_B, BUTTON_D_LEFT); + d->binds[COMMAND_IGNORE_WALLS] = bindMake(2, BUTTON_B, BUTTON_D_UP); + d->binds[COMMAND_FLOOR_CLIP] = bindMake(2, BUTTON_L, BUTTON_D_DOWN); d->cheatEnemyContact = 0; d->controlStickRange = 90; d->controlStick = 2; From 01af3056d59167dcbe9f5a0f9dde2a0de9a38df3 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Wed, 3 Dec 2025 04:14:21 -0600 Subject: [PATCH 07/10] add about menu --- src/fp.c | 1 + src/fp.h | 3 ++- src/fp/fp_about.c | 25 +++++++++++++++++++++++++ src/fp/practice/trainer.c | 1 - 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/fp/fp_about.c diff --git a/src/fp.c b/src/fp.c index cf63fed9..4497e57e 100644 --- a/src/fp.c +++ b/src/fp.c @@ -74,6 +74,7 @@ void fpInit(void) { menuAddSubmenu(fp.mainMenu, 0, menuIndex++, &watches, "watches"); menuAddSubmenu(fp.mainMenu, 0, menuIndex++, createDebugMenu(), "debug"); menuAddSubmenu(fp.mainMenu, 0, menuIndex++, createSettingsMenu(), "settings"); + menuAddSubmenu(fp.mainMenu, 0, menuIndex++, createAboutMenu(), "about"); // populate watches menu watches.selector = menuAddSubmenu(&watches, 0, 0, NULL, "return"); diff --git a/src/fp.h b/src/fp.h index c168fc6a..dd6fe204 100644 --- a/src/fp.h +++ b/src/fp.h @@ -91,9 +91,10 @@ struct Menu *createCheatsMenu(void); struct Menu *createPlayerMenu(void); struct Menu *createFileMenu(void); struct Menu *createPracticeMenu(void); +struct Menu *createCameraMenu(void); struct Menu *createDebugMenu(void); struct Menu *createSettingsMenu(void); -struct Menu *createCameraMenu(void); +struct Menu *createAboutMenu(void); #define CHEAT_ACTIVE(cheat) (settings->cheats & (1 << cheat)) diff --git a/src/fp/fp_about.c b/src/fp/fp_about.c new file mode 100644 index 00000000..f92933cf --- /dev/null +++ b/src/fp/fp_about.c @@ -0,0 +1,25 @@ +#include "fp.h" +#include "menu/menu.h" + +struct Menu *createAboutMenu(void) { + static struct Menu menu; + menuInit(&menu, MENU_NOVALUE, MENU_NOVALUE, MENU_NOVALUE); + + s32 y = 0; + menu.selector = menuAddSubmenu(&menu, 0, y++, NULL, "return"); + y++; + menuAddStatic(&menu, 0, y++, "manual:", 0xC0C0C0); + menuAddStatic(&menu, 0, y++, "https://fp-docs.starhaven.dev/", 0x99C3FF); + y++; + menuAddStatic(&menu, 0, y++, "github:", 0xC0C0C0); + menuAddStatic(&menu, 0, y++, "https://github.com/JCog/fp", 0x99C3FF); + y++; + menuAddStatic(&menu, 0, y++, "contributors:", 0xC0C0C0); + menuAddStatic(&menu, 0, y++, "JCog", 0xFFFFFF); + menuAddStatic(&menu, 0, y++, "imaandrew", 0xFFFFFF); + menuAddStatic(&menu, 0, y++, "fig02", 0xFFFFFF); + menuAddStatic(&menu, 0, y++, "Rainchus", 0xFFFFFF); + menuAddStatic(&menu, 0, y++, "rnadrich", 0xFFFFFF); + + return &menu; +} diff --git a/src/fp/practice/trainer.c b/src/fp/practice/trainer.c index 205813e2..b2793cef 100644 --- a/src/fp/practice/trainer.c +++ b/src/fp/practice/trainer.c @@ -421,7 +421,6 @@ static void aceDraw(s32 x, s32 y, struct GfxFont *font, s32 chWidth, s32 chHeigh u32 colorWhite = GPACK_RGB24A8(0xFFFFFF, 0xFF); u32 colorBlackT = GPACK_RGB24A8(0x000000, 0x60); - if (!fp.menuActive) { gfxTextBackgroundDraw(x, y, 17, 3, chWidth, chHeight, colorBlackT); } From 7d05cd567278ce2aacd381f2f8442970dd21e342 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Wed, 3 Dec 2025 23:09:17 -0600 Subject: [PATCH 08/10] ignore GB_USING_PARTNER when loading as Peach --- src/commands.c | 2 +- src/fp/file/fp_file.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/commands.c b/src/commands.c index e020e85c..14862ded 100644 --- a/src/commands.c +++ b/src/commands.c @@ -251,7 +251,7 @@ void commandLoadGameProc(void) { pm_gCurrentSaveFile = *file; pm_fio_deserialize_state(); pm_gGameStatus.peachFlags = (pm_gGameStatus.peachFlags & ~1) | pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH]; - if (pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER]) { + if (pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER] && !(pm_gGameStatus.peachFlags & 1)) { pm_gPartnerStatus.partnerActionState = 1; pm_gGameStatus.keepUsingPartnerOnMapChange = 1; } diff --git a/src/fp/file/fp_file.c b/src/fp/file/fp_file.c index 458386df..2ee732f3 100644 --- a/src/fp/file/fp_file.c +++ b/src/fp/file/fp_file.c @@ -121,7 +121,7 @@ s32 fpImportFile(const char *path, void *data) { pm_gCurrentSaveFile = *file; pm_fio_deserialize_state(); pm_gGameStatus.peachFlags |= pm_gCurrentSaveFile.globalBytes[GB_MARIO_PEACH]; - if (pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER]) { + if (pm_gCurrentSaveFile.globalBytes[GB_USING_PARTNER] && !(pm_gGameStatus.peachFlags & 1)) { pm_gPartnerStatus.partnerActionState = 1; pm_gGameStatus.keepUsingPartnerOnMapChange = 1; } From 90f2a1e792f0c370c950999263a1db63de6e3267 Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Thu, 4 Dec 2025 00:11:47 -0600 Subject: [PATCH 09/10] add fp version and special thanks to about menu --- src/fp.c | 2 -- src/fp/fp_about.c | 9 ++++++++- src/macros.h | 3 +++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/fp.c b/src/fp.c index 4497e57e..48c09448 100644 --- a/src/fp.c +++ b/src/fp.c @@ -173,8 +173,6 @@ void fpEmergencySettingsReset(u16 padPressed) { } } -#define STRINGIFY(S) STRINGIFY_(S) -#define STRINGIFY_(S) #S void fpDrawVersion(struct GfxFont *font, s32 cellWidth, s32 cellHeight, u8 menuAlpha) { static struct GfxTexture *fpIconTex; if (pm_gGameStatus.introState == 5) { diff --git a/src/fp/fp_about.c b/src/fp/fp_about.c index f92933cf..f413cea1 100644 --- a/src/fp/fp_about.c +++ b/src/fp/fp_about.c @@ -7,19 +7,26 @@ struct Menu *createAboutMenu(void) { s32 y = 0; menu.selector = menuAddSubmenu(&menu, 0, y++, NULL, "return"); + menuAddStatic(&menu, 0, y++, "fp version:", 0xC0C0C0); + menuAddStatic(&menu, 0, y++, STRINGIFY(FP_VERSION), 0xFF0000); y++; menuAddStatic(&menu, 0, y++, "manual:", 0xC0C0C0); menuAddStatic(&menu, 0, y++, "https://fp-docs.starhaven.dev/", 0x99C3FF); y++; menuAddStatic(&menu, 0, y++, "github:", 0xC0C0C0); menuAddStatic(&menu, 0, y++, "https://github.com/JCog/fp", 0x99C3FF); - y++; + s32 creditY = ++y; menuAddStatic(&menu, 0, y++, "contributors:", 0xC0C0C0); menuAddStatic(&menu, 0, y++, "JCog", 0xFFFFFF); menuAddStatic(&menu, 0, y++, "imaandrew", 0xFFFFFF); menuAddStatic(&menu, 0, y++, "fig02", 0xFFFFFF); menuAddStatic(&menu, 0, y++, "Rainchus", 0xFFFFFF); menuAddStatic(&menu, 0, y++, "rnadrich", 0xFFFFFF); + y = creditY; + s32 xOffset = 15; + menuAddStatic(&menu, xOffset, y++, "special thanks:", 0xC0C0C0); + menuAddStatic(&menu, xOffset, y++, "glankk", 0xFFFFFF); + menuAddStatic(&menu, xOffset, y++, "krimtonz", 0xFFFFFF); return &menu; } diff --git a/src/macros.h b/src/macros.h index 7a817ffb..f8398586 100644 --- a/src/macros.h +++ b/src/macros.h @@ -16,4 +16,7 @@ #define SQ(x) ((x) * (x)) +#define STRINGIFY(S) STRINGIFY_H(S) +#define STRINGIFY_H(S) #S + #endif // MACROS_H From 3ad98484a9a75795ad0697f67190d214d018738b Mon Sep 17 00:00:00 2001 From: JCog <42006114+JCog@users.noreply.github.com> Date: Sat, 6 Dec 2025 03:35:32 -0600 Subject: [PATCH 10/10] rename attack cheat to power --- src/fp.c | 2 +- src/fp/fp_cheats.c | 2 +- src/sys/settings.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fp.c b/src/fp.c index 48c09448..ee13ccb6 100644 --- a/src/fp.c +++ b/src/fp.c @@ -303,7 +303,7 @@ void fpUpdateCheats(void) { if (CHEAT_ACTIVE(CHEAT_FP)) { pm_gPlayerData.curFP = pm_gPlayerData.curMaxFP; } - if (CHEAT_ACTIVE(CHEAT_ATTACK)) { + if (CHEAT_ACTIVE(CHEAT_POWER)) { pm_gBattleStatus.merleeAttackBoost = 127; } if (CHEAT_ACTIVE(CHEAT_COINS)) { diff --git a/src/fp/fp_cheats.c b/src/fp/fp_cheats.c index 3b5aa62b..e4f9449a 100644 --- a/src/fp/fp_cheats.c +++ b/src/fp/fp_cheats.c @@ -3,7 +3,7 @@ #include "sys/settings.h" static const char *labels[] = { - "hp", "fp", "attack", "coins", "star power", "star pieces", + "hp", "fp", "power", "coins", "star power", "star pieces", "peril", "auto mash", "action commands", "power bounce", "peekaboo", "brighten room", "hide hud", "mute music", "quizmo spawns", }; diff --git a/src/sys/settings.h b/src/sys/settings.h index 347e1429..b23dcb42 100644 --- a/src/sys/settings.h +++ b/src/sys/settings.h @@ -17,7 +17,7 @@ enum Cheats { CHEAT_HP, CHEAT_FP, - CHEAT_ATTACK, + CHEAT_POWER, CHEAT_COINS, CHEAT_STAR_POWER, CHEAT_STAR_PIECES,