From 33f3a7c11a1b4bfc6eb973c3345c1504b4675d7a Mon Sep 17 00:00:00 2001 From: tustin2121 Date: Mon, 7 Nov 2022 06:09:21 -0500 Subject: [PATCH 1/2] Adding FindObjectEventPaletteIndexByTag bugfix The code in event_object_movement.c indicates that OBJ_EVENT_PAL_TAG_NONE was meant to be a sentinel for the bottom of each of the tables involving palettes in there. sObjectEventSpritePalettes is the exception, but the functions that access it look for OBJ_EVENT_PAL_TAG_NONE even though it's not in the table. If the palette tag isn't in the table, the functions which scan it fall off the bottom of the table into an infinite loop of scanning 256 "entries" of the table (because it uses a u8 index), and the game locks up. In vanilla, the search simply never falls off the bottom of the table. It seems the developers intended for that last entry to be {NULL, OBJ_EVENT_PAL_TAG_NONE}. --- src/event_object_movement.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 3429b2049d..e277e2a48a 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -497,7 +497,12 @@ static const struct SpritePalette sObjectEventSpritePalettes[] = { {gObjectEventPal_Lugia, OBJ_EVENT_PAL_TAG_LUGIA}, {gObjectEventPal_RubySapphireBrendan, OBJ_EVENT_PAL_TAG_RS_BRENDAN}, {gObjectEventPal_RubySapphireMay, OBJ_EVENT_PAL_TAG_RS_MAY}, - {}, +#ifdef BUGFIX + {NULL, OBJ_EVENT_PAL_TAG_NONE}, +#else + {}, // BUG: FindObjectEventPaletteIndexByTag looks for OBJ_EVENT_PAL_TAG_NONE and not 0x0. + // If it's looking for a tag that isn't in this table, the game locks in an infinite loop. +#endif }; static const u16 sReflectionPaletteTags_Brendan[] = { From a203c03eacb138e9bf9155a4e16503c09dd57c7f Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 18 Jan 2023 10:33:39 -0500 Subject: [PATCH 2/2] Add bugfix to LoadObjectEventPalette --- src/event_object_movement.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index e277e2a48a..af78b4f7ca 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1998,7 +1998,12 @@ static void LoadObjectEventPalette(u16 paletteTag) { u16 i = FindObjectEventPaletteIndexByTag(paletteTag); - if (i != OBJ_EVENT_PAL_TAG_NONE) // always true +// FindObjectEventPaletteIndexByTag returns 0xFF on failure, not OBJ_EVENT_PAL_TAG_NONE. +#ifdef BUGFIX + if (i != 0xFF) +#else + if (i != OBJ_EVENT_PAL_TAG_NONE) +#endif LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); } @@ -2021,6 +2026,7 @@ static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette void PatchObjectPalette(u16 paletteTag, u8 paletteSlot) { + // paletteTag is assumed to exist in sObjectEventSpritePalettes u8 paletteIndex = FindObjectEventPaletteIndexByTag(paletteTag); LoadPalette(sObjectEventSpritePalettes[paletteIndex].data, 16 * paletteSlot + 0x100, 0x20);