diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_tower.c | 4 | ||||
-rw-r--r-- | src/data/text/gift_ribbon_descriptions.h | 2 | ||||
-rw-r--r-- | src/data/text/ribbon_descriptions.h | 50 | ||||
-rw-r--r-- | src/evolution_scene.c | 20 | ||||
-rw-r--r-- | src/field_specials.c | 2 | ||||
-rw-r--r-- | src/graphics.c | 8 | ||||
-rw-r--r-- | src/pokemon.c | 8 | ||||
-rw-r--r-- | src/pokemon_icon.c | 16 | ||||
-rw-r--r-- | src/pokemon_size_record.c | 7 | ||||
-rw-r--r-- | src/pokenav_ribbons_1.c | 20 | ||||
-rw-r--r-- | src/pokenav_ribbons_2.c | 821 | ||||
-rw-r--r-- | src/trade.c | 2 | ||||
-rw-r--r-- | src/tv.c | 226 |
13 files changed, 645 insertions, 541 deletions
diff --git a/src/battle_tower.c b/src/battle_tower.c index 51d695f9b..1bf4b737c 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2765,7 +2765,11 @@ static void AwardBattleTowerRibbons(void) { s32 i; u32 partyIndex; +#ifdef BUGFIX + struct RibbonCounter ribbons[MAX_FRONTIER_PARTY_SIZE]; +#else struct RibbonCounter ribbons[3]; // BUG: 4 Pokemon can receive ribbons in a double battle mode. +#endif u8 ribbonType = 0; u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); diff --git a/src/data/text/gift_ribbon_descriptions.h b/src/data/text/gift_ribbon_descriptions.h index ea108be18..a95f9729d 100644 --- a/src/data/text/gift_ribbon_descriptions.h +++ b/src/data/text/gift_ribbon_descriptions.h @@ -46,7 +46,7 @@ const u8 gGiftRibbonDescriptionPart2_LovedPokemon[] = _("for a loved POKéMON.") const u8 gGiftRibbonDescriptionPart1_LoveForPokemon[] = _("RIBBON that shows"); const u8 gGiftRibbonDescriptionPart2_LoveForPokemon[] = _("love for POKéMON."); -const u8 *const gGiftRibbonDescriptionPointers[][2] = +const u8 *const gGiftRibbonDescriptionPointers[MAX_GIFT_RIBBON][2] = { {gGiftRibbonDescriptionPart1_2003RegionalTourney, gGiftRibbonDescriptionPart2_Champion}, {gGiftRibbonDescriptionPart1_2003NationalTourney, gGiftRibbonDescriptionPart2_Champion}, diff --git a/src/data/text/ribbon_descriptions.h b/src/data/text/ribbon_descriptions.h index f455a7771..5db52dced 100644 --- a/src/data/text/ribbon_descriptions.h +++ b/src/data/text/ribbon_descriptions.h @@ -20,29 +20,29 @@ const u8 gRibbonDescriptionPart2_Effort[] = _("being a hard worker."); const u8 *const gRibbonDescriptionPointers[][2] = { - {gRibbonDescriptionPart1_Champion, gRibbonDescriptionPart2_Champion}, - {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_NormalRank}, - {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_SuperRank}, - {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_HyperRank}, - {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_MasterRank}, - {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_NormalRank}, - {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_SuperRank}, - {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_HyperRank}, - {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_MasterRank}, - {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_NormalRank}, - {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_SuperRank}, - {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_HyperRank}, - {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_MasterRank}, - {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_NormalRank}, - {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_SuperRank}, - {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_HyperRank}, - {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_MasterRank}, - {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_NormalRank}, - {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_SuperRank}, - {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_HyperRank}, - {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_MasterRank}, - {gRibbonDescriptionPart1_Winning, gRibbonDescriptionPart2_Winning}, - {gRibbonDescriptionPart1_Victory, gRibbonDescriptionPart2_Victory}, - {gRibbonDescriptionPart1_Artist, gRibbonDescriptionPart2_Artist}, - {gRibbonDescriptionPart1_Effort, gRibbonDescriptionPart2_Effort}, + [CHAMPION_RIBBON] = {gRibbonDescriptionPart1_Champion, gRibbonDescriptionPart2_Champion}, + [COOL_RIBBON_NORMAL] = {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_NormalRank}, + [COOL_RIBBON_SUPER] = {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_SuperRank}, + [COOL_RIBBON_HYPER] = {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_HyperRank}, + [COOL_RIBBON_MASTER] = {gRibbonDescriptionPart1_CoolContest, gRibbonDescriptionPart2_MasterRank}, + [BEAUTY_RIBBON_NORMAL] = {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_NormalRank}, + [BEAUTY_RIBBON_SUPER] = {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_SuperRank}, + [BEAUTY_RIBBON_HYPER] = {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_HyperRank}, + [BEAUTY_RIBBON_MASTER] = {gRibbonDescriptionPart1_BeautyContest, gRibbonDescriptionPart2_MasterRank}, + [CUTE_RIBBON_NORMAL] = {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_NormalRank}, + [CUTE_RIBBON_SUPER] = {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_SuperRank}, + [CUTE_RIBBON_HYPER] = {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_HyperRank}, + [CUTE_RIBBON_MASTER] = {gRibbonDescriptionPart1_CuteContest, gRibbonDescriptionPart2_MasterRank}, + [SMART_RIBBON_NORMAL] = {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_NormalRank}, + [SMART_RIBBON_SUPER] = {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_SuperRank}, + [SMART_RIBBON_HYPER] = {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_HyperRank}, + [SMART_RIBBON_MASTER] = {gRibbonDescriptionPart1_SmartContest, gRibbonDescriptionPart2_MasterRank}, + [TOUGH_RIBBON_NORMAL] = {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_NormalRank}, + [TOUGH_RIBBON_SUPER] = {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_SuperRank}, + [TOUGH_RIBBON_HYPER] = {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_HyperRank}, + [TOUGH_RIBBON_MASTER] = {gRibbonDescriptionPart1_ToughContest, gRibbonDescriptionPart2_MasterRank}, + [WINNING_RIBBON] = {gRibbonDescriptionPart1_Winning, gRibbonDescriptionPart2_Winning}, + [VICTORY_RIBBON] = {gRibbonDescriptionPart1_Victory, gRibbonDescriptionPart2_Victory}, + [ARTIST_RIBBON] = {gRibbonDescriptionPart1_Artist, gRibbonDescriptionPart2_Artist}, + [EFFORT_RIBBON] = {gRibbonDescriptionPart1_Effort, gRibbonDescriptionPart2_Effort}, }; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 6f5a4dce7..7b25754db 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -553,20 +553,20 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) const struct Evolution *evos2; CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies][1].targetSpecies)); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies])); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, (&data)); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, (&data)); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_ENCRYPT_SEPARATOR, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &gEvolutionTable[preEvoSpecies][1].targetSpecies); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_ENCRYPT_SEPARATOR, &data); for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) - SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data)); - for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FILLER; i++) - SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); + for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_UNUSED_RIBBONS; i++) + SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); data = 0xFF; - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); CalculatePlayerPartyCount(); diff --git a/src/field_specials.c b/src/field_specials.c index a6831ec5b..b40889773 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1408,7 +1408,7 @@ void GiveLeadMonEffortRibbon(void) SetMonData(leadMon, MON_DATA_EFFORT_RIBBON, &ribbonSet); if (GetRibbonCount(leadMon) > NUM_CUTIES_RIBBONS) { - TryPutSpotTheCutiesOnAir(leadMon, 0x47); + TryPutSpotTheCutiesOnAir(leadMon, MON_DATA_EFFORT_RIBBON); } } diff --git a/src/graphics.c b/src/graphics.c index aa8d5c249..3f49cd2e7 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1506,11 +1506,9 @@ const u16 gWallpaperPalettes_Ribbon[][16] = const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon.4bpp.lz"); const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon.bin.lz"); -// pokenav - -const u16 gUnknown_08DDE010[] = INCBIN_U16("graphics/pokenav/ribbons.gbapal"); -const u32 gUnknown_08DDE030[] = INCBIN_U32("graphics/pokenav/ribbons.4bpp.lz"); -const u32 gUnknown_08DDE12C[] = INCBIN_U32("graphics/pokenav/ribbons.bin.lz"); +const u16 gPokenavRibbonsSummaryBg_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/summary_bg.gbapal"); +const u32 gPokenavRibbonsSummaryBg_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.4bpp.lz"); +const u32 gPokenavRibbonsSummaryBg_Tilemap[] = INCBIN_U32("graphics/pokenav/ribbons/summary_bg.bin.lz"); const u16 gMonIconPalettes[][16] = { diff --git a/src/pokemon.c b/src/pokemon.c index 29ac4547f..f0d50ba0e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3928,8 +3928,8 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_WORLD_RIBBON: retVal = substruct3->worldRibbon; break; - case MON_DATA_FILLER: - retVal = substruct3->filler; + case MON_DATA_UNUSED_RIBBONS: + retVal = substruct3->unusedRibbons; break; case MON_DATA_EVENT_LEGAL: retVal = substruct3->eventLegal; @@ -4307,8 +4307,8 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_WORLD_RIBBON: SET8(substruct3->worldRibbon); break; - case MON_DATA_FILLER: - SET8(substruct3->filler); + case MON_DATA_UNUSED_RIBBONS: + SET8(substruct3->unusedRibbons); break; case MON_DATA_EVENT_LEGAL: SET8(substruct3->eventLegal); diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 065b8e22e..2a606f6fb 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -7,6 +7,8 @@ #define POKE_ICON_BASE_PAL_TAG 56000 +#define INVALID_ICON_SPECIES SPECIES_OLD_UNOWN_J // Oddly specific, used when an icon should be a ?. Any of the 'old unown' would work + struct MonIconSpriteTemplate { const struct OamData *oam; @@ -1086,7 +1088,7 @@ u16 GetIconSpecies(u16 species, u32 personality) else { if (species > NUM_SPECIES) - result = 260; + result = INVALID_ICON_SPECIES; else result = species; } @@ -1117,7 +1119,7 @@ u16 sub_80D2E84(u16 species) else { if (species > (SPECIES_UNOWN_B - 1)) - species = SPECIES_OLD_UNOWN_J; // That's an oddly specific species. + species = INVALID_ICON_SPECIES; return GetIconSpecies(species, 0); } } @@ -1144,7 +1146,7 @@ void SafeLoadMonIconPalette(u16 species) { u8 palIndex; if (species > NUM_SPECIES) - species = 260; + species = INVALID_ICON_SPECIES; palIndex = gMonIconPaletteIndices[species]; if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) LoadSpritePalette(&gMonIconPaletteTable[palIndex]); @@ -1160,7 +1162,7 @@ void LoadMonIconPalette(u16 species) void FreeMonIconPalettes(void) { u8 i; - for (i = 0; i < 6; i++) + for (i = 0; i < ARRAY_COUNT(gMonIconPaletteTable); i++) FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); } @@ -1169,7 +1171,7 @@ void SafeFreeMonIconPalette(u16 species) { u8 palIndex; if (species > NUM_SPECIES) - species = 260; + species = INVALID_ICON_SPECIES; palIndex = gMonIconPaletteIndices[species]; FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); } @@ -1216,7 +1218,7 @@ void sub_80D304C(u16 offset) u8 GetValidMonIconPalIndex(u16 species) { if (species > NUM_SPECIES) - species = 260; + species = INVALID_ICON_SPECIES; return gMonIconPaletteIndices[species]; } @@ -1228,7 +1230,7 @@ u8 GetMonIconPaletteIndexFromSpecies(u16 species) const u16* GetValidMonIconPalettePtr(u16 species) { if (species > NUM_SPECIES) - species = 260; + species = INVALID_ICON_SPECIES; return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data; } diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index 5b80fd428..4beb9c83f 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -36,7 +36,8 @@ static const struct UnknownStruct sBigMonSizeTable[] = { 1700, 1, -26 }, }; -static const u8 sGiftRibbonsMonDataIds[] = +// - 4 for unused gift ribbon bits in MON_DATA_UNUSED_RIBBONS +static const u8 sGiftRibbonsMonDataIds[GIFT_RIBBONS_COUNT - 4] = { MON_DATA_MARINE_RIBBON, MON_DATA_LAND_RIBBON, MON_DATA_SKY_RIBBON, MON_DATA_COUNTRY_RIBBON, MON_DATA_NATIONAL_RIBBON, MON_DATA_EARTH_RIBBON, @@ -197,10 +198,10 @@ void GiveGiftRibbonToParty(u8 index, u8 ribbonId) s32 i; bool32 gotRibbon = FALSE; u8 data = 1; - u8 array[8]; + u8 array[ARRAY_COUNT(sGiftRibbonsMonDataIds)]; memcpy(array, sGiftRibbonsMonDataIds, sizeof(sGiftRibbonsMonDataIds)); - if (index < 11 && ribbonId < 65) + if (index < GIFT_RIBBONS_COUNT && ribbonId <= MAX_GIFT_RIBBON) { gSaveBlock1Ptr->giftRibbons[index] = ribbonId; for (i = 0; i < PARTY_SIZE; i++) diff --git a/src/pokenav_ribbons_1.c b/src/pokenav_ribbons_1.c index 397e1e749..f80f95998 100644 --- a/src/pokenav_ribbons_1.c +++ b/src/pokenav_ribbons_1.c @@ -44,7 +44,7 @@ struct PokenavSub10 static u32 HandleRibbonsMonListInput_WaitListInit(struct PokenavSub9 *structPtr); static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr); static u32 RibbonsMonMenu_ReturnToMainMenu(struct PokenavSub9 *structPtr); -static u32 sub_81CFB10(struct PokenavSub9 *structPtr); +static u32 RibbonsMonMenu_ToSummaryScreen(struct PokenavSub9 *structPtr); static u32 BuildPartyMonRibbonList(s32 state); static u32 InitBoxMonRibbonList(s32 state); static u32 BuildBoxMonRibbonList(s32 state); @@ -71,10 +71,10 @@ static const LoopedTask sMonRibbonListLoopTaskFuncs[] = BuildBoxMonRibbonList }; -static const u16 sMonRibbonListFramePal[] = INCBIN_U16("graphics/pokenav/ui_ribbons.gbapal"); -static const u32 sMonRibbonListFrameTiles[] = INCBIN_U32("graphics/pokenav/ui_ribbons.4bpp.lz"); -static const u32 sMonRibbonListFrameTilemap[] = INCBIN_U32("graphics/pokenav/ui_ribbons.bin.lz"); -static const u16 gUnknown_08623790[] = INCBIN_U16("graphics/pokenav/8623790.gbapal"); +static const u16 sMonRibbonListFramePal[] = INCBIN_U16("graphics/pokenav/ribbons/list_bg.gbapal"); +static const u32 sMonRibbonListFrameTiles[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.4bpp.lz"); +static const u32 sMonRibbonListFrameTilemap[] = INCBIN_U32("graphics/pokenav/ribbons/list_bg.bin.lz"); +static const u16 sMonRibbonListUi_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/list_ui.gbapal"); static const struct BgTemplate sMonRibbonListBgTemplates[] = { @@ -192,7 +192,7 @@ static u32 HandleRibbonsMonListInput(struct PokenavSub9 *structPtr) { structPtr->monList->currIndex = GetSelectedPokenavListIndex(); structPtr->saveMonList = 1; - structPtr->callback = sub_81CFB10; + structPtr->callback = RibbonsMonMenu_ToSummaryScreen; return RIBBONS_MON_LIST_FUNC_OPEN_RIBBONS_SUMMARY; } return RIBBONS_MON_LIST_FUNC_NONE; @@ -203,7 +203,7 @@ static u32 RibbonsMonMenu_ReturnToMainMenu(struct PokenavSub9 *structPtr) return POKENAV_MAIN_MENU_CURSOR_ON_RIBBONS; } -static u32 sub_81CFB10(struct PokenavSub9 *structPtr) +static u32 RibbonsMonMenu_ToSummaryScreen(struct PokenavSub9 *structPtr) { return POKENAV_RIBBONS_SUMMARY_SCREEN; } @@ -342,8 +342,8 @@ static void sub_81CFCEC(struct PokenavSub9 *structPtr, struct PokenavMonList *it structPtr->monList->listCount++; } -//unused -static bool32 Unused_PlayerHasRibbonsMon(void) +// Unused +static bool32 PlayerHasRibbonsMon(void) { s32 i, j; @@ -446,7 +446,7 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state) case 2: if (FreeTempTileDataBuffersIfPossible()) return LT_PAUSE; - CopyPaletteIntoBufferUnfaded(gUnknown_08623790, 0x20, 0x20); + CopyPaletteIntoBufferUnfaded(sMonRibbonListUi_Pal, 0x20, 0x20); InitMonRibbonPokenavListMenuTemplate(); return LT_INC_AND_PAUSE; case 3: diff --git a/src/pokenav_ribbons_2.c b/src/pokenav_ribbons_2.c index 203aa19e5..cbcd29776 100644 --- a/src/pokenav_ribbons_2.c +++ b/src/pokenav_ribbons_2.c @@ -16,24 +16,41 @@ enum { RIBBONS_SUMMARY_FUNC_NONE, - RIBBONS_SUMMARY_FUNC_MOVED_CURSOR, + RIBBONS_SUMMARY_FUNC_SWITCH_MONS, RIBBONS_SUMMARY_FUNC_SELECT_RIBBON, RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE, RIBBONS_SUMMARY_FUNC_EXPANDED_CANCEL, RIBBONS_SUMMARY_FUNC_EXIT, }; +#define GFXTAG_RIBBON_ICONS_BIG 9 + +#define PALTAG_RIBBON_ICONS_1 15 +#define PALTAG_RIBBON_ICONS_2 16 +#define PALTAG_RIBBON_ICONS_3 17 +#define PALTAG_RIBBON_ICONS_4 18 +#define PALTAG_RIBBON_ICONS_5 19 + +#define RIBBONS_PER_ROW 9 +#define GIFT_RIBBON_ROW (1 + (FIRST_GIFT_RIBBON / RIBBONS_PER_ROW)) // Gift ribbons start on a new row after the normal ribbons. +#define GIFT_RIBBON_START_POS (RIBBONS_PER_ROW * GIFT_RIBBON_ROW) + +#define MON_SPRITE_X_ON 40 +#define MON_SPRITE_X_OFF -32 +#define MON_SPRITE_Y 104 + struct PokenavSub13 { - u8 filler0[0x8]; + u8 unused1[8]; struct PokenavSub18 *monList; - u16 field_C; - u16 field_E; - u16 field_10; - u16 field_12; - u32 field_14[25]; - u32 field_78[8]; - u32 (*callback)(struct PokenavSub13 *structPtr); + u16 selectedPos; + u16 normalRibbonLastRowStart; + u16 numNormalRibbons; + u16 numGiftRibbons; + u32 ribbonIds[FIRST_GIFT_RIBBON]; + u32 giftRibbonIds[NUM_GIFT_RIBBONS]; + u32 unused2; + u32 (*callback)(struct PokenavSub13 *); }; struct PokenavSub14 @@ -43,99 +60,99 @@ struct PokenavSub14 u16 nameWindowId; u16 ribbonCountWindowId; u16 listIdxWindowId; - u16 field_E; + u16 unusedWindowId; u16 monSpriteId; - struct Sprite *field_14; - u32 filler; + struct Sprite *bigRibbonSprite; + u32 unused; u8 tilemapBuffers[2][BG_SCREEN_SIZE]; }; -static u32 gUnknown_030012C0; -static u32 gUnknown_030012C4; - -void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr); -void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *structPtr); -void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr); -void sub_81D1500(struct PokenavSub14 *structPtr); -void sub_81D0EFC(struct PokenavSub14 *structPtr); -void ResetSpritesAndDrawRibbonsMonFrontPic(struct PokenavSub14 *structPtr); -void AddRibbonListIndexWindow(struct PokenavSub14 *structPtr); -void DestroyRibbonsMonFrontPic(struct PokenavSub14 *structPtr); -void sub_81D11D8(struct PokenavSub14 *structPtr); -void sub_81D11FC(struct PokenavSub14 *structPtr); -void AddRibbonCountWindow(struct PokenavSub14 *structPtr); -void sub_81D1448(struct PokenavSub14 *structPtr); -void sub_81D13FC(struct PokenavSub14 *structPtr); -void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *structPtr); -void sub_81D12D8(struct PokenavSub14 *structPtr); -bool32 sub_81D1524(struct PokenavSub14 *structPtr); -bool32 sub_81D1234(struct PokenavSub14 *structPtr); -void sub_81D0814(struct PokenavSub13 *structPtr); -u32 HandleExpandedRibbonInput(struct PokenavSub13 *structPtr); -u32 RibbonsSummaryHandleInput(struct PokenavSub13 *structPtr); -u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *structPtr); -bool32 sub_81D05DC(struct PokenavSub13 *structPtr); -bool32 sub_81D0688(struct PokenavSub13 *structPtr); -bool32 sub_81D0664(struct PokenavSub13 *structPtr); -bool32 sub_81D061C(struct PokenavSub13 *structPtr); -bool32 sub_81D0688(struct PokenavSub13 *structPtr); -bool32 GetCurrentLoopedTaskActive(void); -u32 GetRibbonsSummaryCurrentIndex(void); -u32 GetRibbonsSummaryMonListCount(void); -u16 DrawRibbonsMonFrontPic(s32 unused0, s32 unused1); -void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3); -void sub_81D1284(struct Sprite *sprite); -void sub_81D1350(void); -void sub_81D13BC(u16 *dst, u32 id); -void sub_81D1370(u32 arg0, u32 id); -void sub_81D1538(struct Sprite *sprite); -u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state); -u32 LoopedTask_UpdateRibbonsSummaryInfo(s32 state); -u32 LoopedTask_ExpandSelectedRibbon(s32 state); -u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state); -u32 LoopedTask_ShrinkExpandedRibbon(s32 state); -u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state); +// Used for the initial drawing of the ribbons +static u32 sRibbonDraw_Total; +static u32 sRibbonDraw_Current; + +static void PrintCurrentMonRibbonCount(struct PokenavSub14 *); +static void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *); +static void PrintRibbonsMonListIndex(struct PokenavSub14 *); +static void ZoomOutSelectedRibbon(struct PokenavSub14 *); +static void UpdateAndZoomInSelectedRibbon(struct PokenavSub14 *); +static void PrintRibbonNameAndDescription(struct PokenavSub14 *); +static void ResetSpritesAndDrawMonFrontPic(struct PokenavSub14 *); +static void AddRibbonListIndexWindow(struct PokenavSub14 *); +static void DestroyRibbonsMonFrontPic(struct PokenavSub14 *); +static void SlideMonSpriteOff(struct PokenavSub14 *); +static void SlideMonSpriteOn(struct PokenavSub14 *); +static void AddRibbonCountWindow(struct PokenavSub14 *); +static void CreateBigRibbonSprite(struct PokenavSub14 *); +static void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *); +static void DrawAllRibbonsSmall(struct PokenavSub14 *); +static bool32 IsRibbonAnimating(struct PokenavSub14 *); +static bool32 IsMonSpriteAnimating(struct PokenavSub14 *); +static void GetMonRibbons(struct PokenavSub13 *); +static u32 HandleExpandedRibbonInput(struct PokenavSub13 *); +static u32 RibbonsSummaryHandleInput(struct PokenavSub13 *); +static u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *); +static bool32 TrySelectRibbonUp(struct PokenavSub13 *); +static bool32 TrySelectRibbonRight(struct PokenavSub13 *); +static bool32 TrySelectRibbonLeft(struct PokenavSub13 *); +static bool32 TrySelectRibbonDown(struct PokenavSub13 *); +static bool32 GetCurrentLoopedTaskActive(void); +static u32 GetRibbonsSummaryCurrentIndex(void); +static u32 GetRibbonsSummaryMonListCount(void); +static u16 DrawRibbonsMonFrontPic(s32, s32); +static void StartMonSpriteSlide(struct Sprite *, s32, s32, s32); +static void SpriteCB_MonSpriteSlide(struct Sprite *); +static void ClearRibbonsSummaryBg(void); +static void BufferSmallRibbonGfxData(u16 *, u32); +static void DrawRibbonSmall(u32, u32); +static void SpriteCB_WaitForRibbonAnimation(struct Sprite *); +static u32 LoopedTask_OpenRibbonsSummaryMenu(s32); +static u32 LoopedTask_SwitchRibbonsSummaryMon(s32); +static u32 LoopedTask_ExpandSelectedRibbon(s32); +static u32 LoopedTask_MoveRibbonsCursorExpanded(s32); +static u32 LoopedTask_ShrinkExpandedRibbon(s32); +static u32 LoopedTask_ExitRibbonsSummaryMenu(s32); struct { - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; -} static const gUnknown_086237F8[] = -{ - {1, 1, 0, 0}, - {3, 4, 1, 0}, - {3, 4, 5, 0}, - {3, 4, 9, 0}, - {3, 4, 13, 0}, - {3, 4, 17, 0}, - {1, 1, 21, 0}, - {1, 1, 22, 0}, - {1, 1, 23, 0}, - {1, 1, 24, 0}, - {1, 1, 25, 1}, - {1, 1, 26, 1}, - {1, 1, 27, 1}, - {1, 1, 28, 1}, - {1, 1, 29, 1}, - {1, 1, 30, 1}, - {1, 1, 31, 1} + u8 numBits; // The number of bits needed to represent numRibbons + u8 numRibbons; // Never read. The contest ribbons have 4 (1 for each rank), the rest are just 1 ribbon + u8 ribbonId; + bool8 isGiftRibbon; +} static const sRibbonData[] = +{ + {1, 1, CHAMPION_RIBBON, FALSE}, + {3, 4, COOL_RIBBON_NORMAL, FALSE}, + {3, 4, BEAUTY_RIBBON_NORMAL, FALSE}, + {3, 4, CUTE_RIBBON_NORMAL, FALSE}, + {3, 4, SMART_RIBBON_NORMAL, FALSE}, + {3, 4, TOUGH_RIBBON_NORMAL, FALSE}, + {1, 1, WINNING_RIBBON, FALSE}, + {1, 1, VICTORY_RIBBON, FALSE}, + {1, 1, ARTIST_RIBBON, FALSE}, + {1, 1, EFFORT_RIBBON, FALSE}, + {1, 1, MARINE_RIBBON, TRUE}, + {1, 1, LAND_RIBBON, TRUE}, + {1, 1, SKY_RIBBON, TRUE}, + {1, 1, COUNTRY_RIBBON, TRUE}, + {1, 1, NATIONAL_RIBBON, TRUE}, + {1, 1, EARTH_RIBBON, TRUE}, + {1, 1, WORLD_RIBBON, TRUE} }; #include "data/text/ribbon_descriptions.h" #include "data/text/gift_ribbon_descriptions.h" -static const u16 gUnknown_08623FF8[] = INCBIN_U16("graphics/pokenav/ribbons_icon1.gbapal"); -static const u16 gUnknown_08624018[] = INCBIN_U16("graphics/pokenav/ribbons_icon2.gbapal"); -static const u16 gUnknown_08624038[] = INCBIN_U16("graphics/pokenav/ribbons_icon3.gbapal"); -static const u16 gUnknown_08624058[] = INCBIN_U16("graphics/pokenav/ribbons_icon4.gbapal"); -static const u16 gUnknown_08624078[] = INCBIN_U16("graphics/pokenav/ribbons_icon5.gbapal"); -static const u16 gUnknown_08624098[] = INCBIN_U16("graphics/pokenav/8624098.gbapal"); -static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon.4bpp.lz"); -static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons_icon_big.4bpp.lz"); +static const u16 sRibbonIcons1_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons1.gbapal"); +static const u16 sRibbonIcons2_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons2.gbapal"); +static const u16 sRibbonIcons3_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons3.gbapal"); +static const u16 sRibbonIcons4_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons4.gbapal"); +static const u16 sRibbonIcons5_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/icons5.gbapal"); +static const u16 sMonInfo_Pal[] = INCBIN_U16("graphics/pokenav/ribbons/mon_info.gbapal"); // palette for Pokémon's name/gender/level text +static const u32 sRibbonIconsSmall_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons.4bpp.lz"); +static const u32 sRibbonIconsBig_Gfx[] = INCBIN_U32("graphics/pokenav/ribbons/icons_big.4bpp.lz"); -static const struct BgTemplate gUnknown_08624B98[] = +static const struct BgTemplate sBgTemplates[] = { { .bg = 1, @@ -160,14 +177,13 @@ static const struct BgTemplate gUnknown_08624B98[] = static const LoopedTask sRibbonsSummaryMenuLoopTaskFuncs[] = { [RIBBONS_SUMMARY_FUNC_NONE] = NULL, - [RIBBONS_SUMMARY_FUNC_MOVED_CURSOR] = LoopedTask_UpdateRibbonsSummaryInfo, + [RIBBONS_SUMMARY_FUNC_SWITCH_MONS] = LoopedTask_SwitchRibbonsSummaryMon, [RIBBONS_SUMMARY_FUNC_SELECT_RIBBON] = LoopedTask_ExpandSelectedRibbon, [RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE] = LoopedTask_MoveRibbonsCursorExpanded, [RIBBONS_SUMMARY_FUNC_EXPANDED_CANCEL] = LoopedTask_ShrinkExpandedRibbon, [RIBBONS_SUMMARY_FUNC_EXIT] = LoopedTask_ExitRibbonsSummaryMenu }; -// code bool32 PokenavCallback_Init_RibbonsSummaryMenu(void) { struct PokenavSub13 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST, sizeof(struct PokenavSub13)); @@ -178,7 +194,7 @@ bool32 PokenavCallback_Init_RibbonsSummaryMenu(void) if (structPtr->monList == NULL) return FALSE; - sub_81D0814(structPtr); + GetMonRibbons(structPtr); structPtr->callback = RibbonsSummaryHandleInput; gKeyRepeatContinueDelay = 3; gKeyRepeatStartDelay = 10; @@ -196,153 +212,170 @@ void FreeRibbonsSummaryScreen1(void) FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); } -u32 RibbonsSummaryHandleInput(struct PokenavSub13 *structPtr) +// Handles input when a specific ribbon is not currently selected +static u32 RibbonsSummaryHandleInput(struct PokenavSub13 *structPtr) { + // Handle Up/Down movement to select a new Pokémon to show ribbons for if (JOY_REPEAT(DPAD_UP) && structPtr->monList->currIndex != 0) { structPtr->monList->currIndex--; - structPtr->field_C = 0; - sub_81D0814(structPtr); - return RIBBONS_SUMMARY_FUNC_MOVED_CURSOR; + structPtr->selectedPos = 0; + GetMonRibbons(structPtr); + return RIBBONS_SUMMARY_FUNC_SWITCH_MONS; } if (JOY_REPEAT(DPAD_DOWN) && structPtr->monList->currIndex < structPtr->monList->listCount - 1) { structPtr->monList->currIndex++; - structPtr->field_C = 0; - sub_81D0814(structPtr); - return RIBBONS_SUMMARY_FUNC_MOVED_CURSOR; + structPtr->selectedPos = 0; + GetMonRibbons(structPtr); + return RIBBONS_SUMMARY_FUNC_SWITCH_MONS; } + if (JOY_NEW(A_BUTTON)) { + // Enter ribbon selection structPtr->callback = HandleExpandedRibbonInput; return RIBBONS_SUMMARY_FUNC_SELECT_RIBBON; } if (JOY_NEW(B_BUTTON)) { + // Exit ribbon summary menu structPtr->callback = ReturnToRibbonsListFromSummary; return RIBBONS_SUMMARY_FUNC_EXIT; } return RIBBONS_SUMMARY_FUNC_NONE; } -u32 HandleExpandedRibbonInput(struct PokenavSub13 *structPtr) +// Handles input when a ribbon is selected +static u32 HandleExpandedRibbonInput(struct PokenavSub13 *structPtr) { - if (JOY_REPEAT(DPAD_UP) && sub_81D05DC(structPtr)) + // Handle movement while a ribbon is selected + if (JOY_REPEAT(DPAD_UP) && TrySelectRibbonUp(structPtr)) return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; - if (JOY_REPEAT(DPAD_DOWN) && sub_81D061C(structPtr)) + if (JOY_REPEAT(DPAD_DOWN) && TrySelectRibbonDown(structPtr)) return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; - if (JOY_REPEAT(DPAD_LEFT) && sub_81D0664(structPtr)) + if (JOY_REPEAT(DPAD_LEFT) && TrySelectRibbonLeft(structPtr)) return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; - if (JOY_REPEAT(DPAD_RIGHT) && sub_81D0688(structPtr)) + if (JOY_REPEAT(DPAD_RIGHT) && TrySelectRibbonRight(structPtr)) return RIBBONS_SUMMARY_FUNC_EXPANDED_CURSOR_MOVE; + if (JOY_NEW(B_BUTTON)) { + // Exit ribbon selection structPtr->callback = RibbonsSummaryHandleInput; return RIBBONS_SUMMARY_FUNC_EXPANDED_CANCEL; } return RIBBONS_SUMMARY_FUNC_NONE; } -u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *structPtr) +static u32 ReturnToRibbonsListFromSummary(struct PokenavSub13 *structPtr) { return POKENAV_RIBBONS_RETURN_TO_MON_LIST; } -bool32 sub_81D05DC(struct PokenavSub13 *structPtr) +static bool32 TrySelectRibbonUp(struct PokenavSub13 *structPtr) { - if (structPtr->field_C < 25) + if (structPtr->selectedPos < FIRST_GIFT_RIBBON) { - if (structPtr->field_C <= 8) + // In normal ribbons, try to move up a row + if (structPtr->selectedPos < RIBBONS_PER_ROW) return FALSE; - structPtr->field_C -= 9; + structPtr->selectedPos -= RIBBONS_PER_ROW; return TRUE; } - if (structPtr->field_10 != 0) + if (structPtr->numNormalRibbons != 0) { - u32 var = structPtr->field_C - 27; - structPtr->field_C = var + structPtr->field_E; - if (structPtr->field_C >= structPtr->field_10) - structPtr->field_C = structPtr->field_10 - 1; + // In gift ribbons, try to move up into normal ribbons + // If there's > 1 row of gift ribbons (not normally possible) + // it's impossible to move up between them + u32 ribbonPos = structPtr->selectedPos - GIFT_RIBBON_START_POS; + structPtr->selectedPos = ribbonPos + structPtr->normalRibbonLastRowStart; + if (structPtr->selectedPos >= structPtr->numNormalRibbons) + structPtr->selectedPos = structPtr->numNormalRibbons - 1; return TRUE; } return FALSE; } -bool32 sub_81D061C(struct PokenavSub13 *structPtr) +static bool32 TrySelectRibbonDown(struct PokenavSub13 *structPtr) { - if (structPtr->field_C >= 25) + if (structPtr->selectedPos >= FIRST_GIFT_RIBBON) return FALSE; - if (structPtr->field_C < structPtr->field_E) + if (structPtr->selectedPos < structPtr->normalRibbonLastRowStart) { - structPtr->field_C += 9; - if (structPtr->field_C >= structPtr->field_10) - structPtr->field_C = structPtr->field_10 - 1; + // Not in last row of normal ribbons, advance to next row + structPtr->selectedPos += RIBBONS_PER_ROW; + if (structPtr->selectedPos >= structPtr->numNormalRibbons) + structPtr->selectedPos = structPtr->numNormalRibbons - 1; return TRUE; } - if (structPtr->field_12 != 0) + if (structPtr->numGiftRibbons != 0) { - int var = structPtr->field_C - structPtr->field_E; - if (var >= structPtr->field_12) - var = structPtr->field_12 - 1; + // In/beyond last of row of normal ribbons and gift ribbons present, move down to gift ribbon row + int ribbonPos = structPtr->selectedPos - structPtr->normalRibbonLastRowStart; + if (ribbonPos >= structPtr->numGiftRibbons) + ribbonPos = structPtr->numGiftRibbons - 1; - structPtr->field_C = var + 27; + structPtr->selectedPos = ribbonPos + GIFT_RIBBON_START_POS; return TRUE; } return FALSE; } -bool32 sub_81D0664(struct PokenavSub13 *structPtr) +static bool32 TrySelectRibbonLeft(struct PokenavSub13 *structPtr) { - u16 var = structPtr->field_C % 9; - if (var != 0) + u16 column = structPtr->selectedPos % RIBBONS_PER_ROW; + if (column != 0) { - structPtr->field_C--; + structPtr->selectedPos--; return TRUE; } return FALSE; } -bool32 sub_81D0688(struct PokenavSub13 *structPtr) +static bool32 TrySelectRibbonRight(struct PokenavSub13 *structPtr) { - int r1 = structPtr->field_C % 9; + int column = structPtr->selectedPos % RIBBONS_PER_ROW; - if (r1 >= 8) + if (column >= RIBBONS_PER_ROW - 1) return FALSE; - if (structPtr->field_C <= 26) + if (structPtr->selectedPos < GIFT_RIBBON_START_POS) { - if (structPtr->field_C < structPtr->field_10 - 1) + // Move right in normal ribbon row + if (structPtr->selectedPos < structPtr->numNormalRibbons - 1) { - structPtr->field_C++; + structPtr->selectedPos++; return TRUE; } } else { - if (r1 < structPtr->field_12 - 1) + // Move right in gift ribbon row + if (column < structPtr->numGiftRibbons - 1) { - structPtr->field_C++; + structPtr->selectedPos++; return TRUE; } } return FALSE; } -u32 GetRibbonsSummaryCurrentIndex(void) +static u32 GetRibbonsSummaryCurrentIndex(void) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); return structPtr->monList->currIndex; } -u32 GetRibbonsSummaryMonListCount(void) +static u32 GetRibbonsSummaryMonListCount(void) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); return structPtr->monList->listCount; } -static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender) +static void GetMonNicknameLevelGender(u8 *nick, u8 *level, u8 *gender) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct PokenavSub18 *mons = structPtr->monList; @@ -350,6 +383,7 @@ static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender) if (monInfo->boxId == TOTAL_BOXES_COUNT) { + // Get info for party mon struct Pokemon *mon = &gPlayerParty[monInfo->monId]; GetMonData(mon, MON_DATA_NICKNAME, nick); *level = GetLevelFromMonExp(mon); @@ -357,6 +391,7 @@ static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender) } else { + // Get info for PC box mon struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId); *gender = GetBoxMonGender(boxMon); *level = GetLevelFromBoxMonExp(boxMon); @@ -365,7 +400,7 @@ static void GetCurrMonInfo1(u8 *nick, u8 *level, u8 *gender) StringGetEnd10(nick); } -static void GetCurrMonInfo2(u16 *species, u32 *personality, u32 *otId) +static void GetMonSpeciesPersonalityOtId(u16 *species, u32 *personality, u32 *otId) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); struct PokenavSub18 *mons = structPtr->monList; @@ -373,6 +408,7 @@ static void GetCurrMonInfo2(u16 *species, u32 *personality, u32 *otId) if (monInfo->boxId == TOTAL_BOXES_COUNT) { + // Get info for party mon struct Pokemon *mon = &gPlayerParty[monInfo->monId]; *species = GetMonData(mon, MON_DATA_SPECIES); *personality = GetMonData(mon, MON_DATA_PERSONALITY); @@ -380,6 +416,7 @@ static void GetCurrMonInfo2(u16 *species, u32 *personality, u32 *otId) } else { + // Get info for PC box mon struct BoxPokemon *boxMon = GetBoxedMonPtr(monInfo->boxId, monInfo->monId); *species = GetBoxMonData(boxMon, MON_DATA_SPECIES); *personality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); @@ -399,76 +436,79 @@ static u32 GetCurrMonRibbonCount(void) return GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBON_COUNT); } -void sub_81D0814(struct PokenavSub13 *structPtr) +static void GetMonRibbons(struct PokenavSub13 *structPtr) { - u32 ribbons; + u32 ribbonFlags; s32 i, j; struct PokenavSub18 *mons = structPtr->monList; struct PokenavMonList *monInfo = &mons->monData[mons->currIndex]; if (monInfo->boxId == TOTAL_BOXES_COUNT) - ribbons = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS); + ribbonFlags = GetMonData(&gPlayerParty[monInfo->monId], MON_DATA_RIBBONS); else - ribbons = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS); + ribbonFlags = GetBoxMonDataAt(monInfo->boxId, monInfo->monId, MON_DATA_RIBBONS); - structPtr->field_10 = 0; - structPtr->field_12 = 0; - for (i = 0; i < ARRAY_COUNT(gUnknown_086237F8); i++) + structPtr->numNormalRibbons = 0; + structPtr->numGiftRibbons = 0; + for (i = 0; i < ARRAY_COUNT(sRibbonData); i++) { - s32 r4 = ((1 << gUnknown_086237F8[i].unk0) - 1) & ribbons; - if (gUnknown_086237F8[i].unk3 == 0) + // For all non-contest ribbons, numRibbons will be 1 if they have it, 0 if they don't + // For contest ribbons, numRibbons will be 0-4 + s32 numRibbons = ((1 << sRibbonData[i].numBits) - 1) & ribbonFlags; + if (!sRibbonData[i].isGiftRibbon) { - for (j = 0; j < r4; j++) - structPtr->field_14[structPtr->field_10++] = gUnknown_086237F8[i].unk2 + j; + for (j = 0; j < numRibbons; j++) + structPtr->ribbonIds[structPtr->numNormalRibbons++] = sRibbonData[i].ribbonId + j; } else { - for (j = 0; j < r4; j++) - structPtr->field_78[structPtr->field_12++] = gUnknown_086237F8[i].unk2 + j; + for (j = 0; j < numRibbons; j++) + structPtr->giftRibbonIds[structPtr->numGiftRibbons++] = sRibbonData[i].ribbonId + j; } - ribbons >>= gUnknown_086237F8[i].unk0; + ribbonFlags >>= sRibbonData[i].numBits; } - if (structPtr->field_10 != 0) + if (structPtr->numNormalRibbons != 0) { - structPtr->field_E = ((structPtr->field_10 - 1) / 9) * 9; - structPtr->field_C = 0; + structPtr->normalRibbonLastRowStart = ((structPtr->numNormalRibbons - 1) / RIBBONS_PER_ROW) * RIBBONS_PER_ROW; + structPtr->selectedPos = 0; } else { - structPtr->field_E = 0; - structPtr->field_C = 27; + // There are no normal ribbons, move cursor to first gift ribbon + structPtr->normalRibbonLastRowStart = 0; + structPtr->selectedPos = GIFT_RIBBON_START_POS; } } -u32 *sub_81D0914(u32 *arg0) +static u32 *GetNormalRibbonIds(u32 *size) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); - *arg0 = structPtr->field_10; - return structPtr->field_14; + *size = structPtr->numNormalRibbons; + return structPtr->ribbonIds; } -u32 *sub_81D092C(u32 *arg0) +static u32 *GetGiftRibbonIds(u32 *size) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); - *arg0 = structPtr->field_12; - return structPtr->field_78; + *size = structPtr->numGiftRibbons; + return structPtr->giftRibbonIds; } -u16 sub_81D0944(void) +static u16 GetSelectedPosition(void) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); - return structPtr->field_C; + return structPtr->selectedPos; } -u32 sub_81D0954(void) +static u32 GetRibbonId(void) { struct PokenavSub13 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_LIST); - int var = structPtr->field_C; - if (var <= 24) - return structPtr->field_14[var]; + int ribbonPos = structPtr->selectedPos; + if (ribbonPos < FIRST_GIFT_RIBBON) + return structPtr->ribbonIds[ribbonPos]; else - return structPtr->field_78[var - 27]; + return structPtr->giftRibbonIds[ribbonPos - GIFT_RIBBON_START_POS]; } bool32 OpenRibbonsSummaryMenu(void) @@ -501,36 +541,38 @@ void FreeRibbonsSummaryScreen2(void) RemoveWindow(structPtr->ribbonCountWindowId); RemoveWindow(structPtr->nameWindowId); RemoveWindow(structPtr->listIdxWindowId); - RemoveWindow(structPtr->field_E); +#ifndef BUGFIX + RemoveWindow(structPtr->unusedWindowId); // Removing window, but window id is never set +#endif DestroyRibbonsMonFrontPic(structPtr); - FreeSpriteTilesByTag(9); - FreeSpritePaletteByTag(0xF); - FreeSpritePaletteByTag(0x10); - FreeSpritePaletteByTag(0x11); - FreeSpritePaletteByTag(0x12); - FreeSpritePaletteByTag(0x13); - FreeSpriteOamMatrix(structPtr->field_14); - DestroySprite(structPtr->field_14); + FreeSpriteTilesByTag(GFXTAG_RIBBON_ICONS_BIG); + FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_1); + FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_2); + FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_3); + FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_4); + FreeSpritePaletteByTag(PALTAG_RIBBON_ICONS_5); + FreeSpriteOamMatrix(structPtr->bigRibbonSprite); + DestroySprite(structPtr->bigRibbonSprite); FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); } -bool32 GetCurrentLoopedTaskActive(void) +static bool32 GetCurrentLoopedTaskActive(void) { struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); return IsLoopedTaskActive(structPtr->loopedTaskId); } -u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) +static u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) { struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); switch (state) { case 0: - InitBgTemplates(gUnknown_08624B98, ARRAY_COUNT(gUnknown_08624B98)); - DecompressAndCopyTileDataToVram(2, gUnknown_08DDE030, 0, 0, 0); + InitBgTemplates(sBgTemplates, ARRAY_COUNT(sBgTemplates)); + DecompressAndCopyTileDataToVram(2, gPokenavRibbonsSummaryBg_Gfx, 0, 0, 0); SetBgTilemapBuffer(2, structPtr->tilemapBuffers[0]); - CopyToBgTilemapBuffer(2, gUnknown_08DDE12C, 0, 0); - CopyPaletteIntoBufferUnfaded(gUnknown_08DDE010, 0x10, 0x20); + CopyToBgTilemapBuffer(2, gPokenavRibbonsSummaryBg_Tilemap, 0, 0); + CopyPaletteIntoBufferUnfaded(gPokenavRibbonsSummaryBg_Pal, 0x10, 0x20); CopyBgTilemapBufferToVram(2); return LT_INC_AND_PAUSE; case 1: @@ -540,8 +582,8 @@ u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) DecompressAndCopyTileDataToVram(1, sRibbonIconsSmall_Gfx, 0, 1, 0); SetBgTilemapBuffer(1, structPtr->tilemapBuffers[1]); FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); - CopyPaletteIntoBufferUnfaded(gUnknown_08623FF8, 0x20, 0xA0); - CopyPaletteIntoBufferUnfaded(gUnknown_08624098, 0xA0, 0x20); + CopyPaletteIntoBufferUnfaded(sRibbonIcons1_Pal, 0x20, 0xA0); + CopyPaletteIntoBufferUnfaded(sMonInfo_Pal, 0xA0, 0x20); CopyBgTilemapBufferToVram(1); return LT_INC_AND_PAUSE; } @@ -577,18 +619,18 @@ u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) case 6: if (!IsDma3ManagerBusyWithBgCopy()) { - ResetSpritesAndDrawRibbonsMonFrontPic(structPtr); + ResetSpritesAndDrawMonFrontPic(structPtr); return LT_INC_AND_CONTINUE; } return LT_PAUSE; case 7: - sub_81D12D8(structPtr); + DrawAllRibbonsSmall(structPtr); PrintHelpBarText(HELPBAR_RIBBONS_LIST); return LT_INC_AND_PAUSE; case 8: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_81D13FC(structPtr); + CreateBigRibbonSprite(structPtr); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); ChangeBgX(2, 0, 0); @@ -603,12 +645,11 @@ u32 LoopedTask_OpenRibbonsSummaryMenu(s32 state) case 9: if (IsPaletteFadeActive()) return LT_PAUSE; - return LT_FINISH; } return LT_FINISH; } -u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state) +static u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state) { switch (state) { @@ -624,24 +665,24 @@ u32 LoopedTask_ExitRibbonsSummaryMenu(s32 state) return LT_FINISH; } -u32 LoopedTask_UpdateRibbonsSummaryInfo(s32 state) +static u32 LoopedTask_SwitchRibbonsSummaryMon(s32 state) { struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); switch (state) { case 0: PlaySE(SE_SELECT); - sub_81D11D8(structPtr); + SlideMonSpriteOff(structPtr); return LT_INC_AND_PAUSE; case 1: - if (!sub_81D1234(structPtr)) + if (!IsMonSpriteAnimating(structPtr)) { PrintRibbbonsSummaryMonInfo(structPtr); return LT_INC_AND_CONTINUE; } return LT_PAUSE; case 2: - sub_81D12D8(structPtr); + DrawAllRibbonsSmall(structPtr); return LT_INC_AND_CONTINUE; case 3: PrintRibbonsMonListIndex(structPtr); @@ -652,31 +693,30 @@ u32 LoopedTask_UpdateRibbonsSummaryInfo(s32 state) case 5: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_81D11FC(structPtr); + SlideMonSpriteOn(structPtr); return LT_INC_AND_PAUSE; } return LT_PAUSE; case 6: - if (sub_81D1234(structPtr)) + if (IsMonSpriteAnimating(structPtr)) return LT_PAUSE; - return LT_FINISH; } return LT_FINISH; } -u32 LoopedTask_ExpandSelectedRibbon(s32 state) +static u32 LoopedTask_ExpandSelectedRibbon(s32 state) { struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); switch (state) { case 0: PlaySE(SE_SELECT); - sub_81D1448(structPtr); + UpdateAndZoomInSelectedRibbon(structPtr); return LT_INC_AND_PAUSE; case 1: - if (!sub_81D1524(structPtr)) + if (!IsRibbonAnimating(structPtr)) { - sub_81D0EFC(structPtr); + PrintRibbonNameAndDescription(structPtr); PrintHelpBarText(HELPBAR_RIBBONS_CHECK); return LT_INC_AND_PAUSE; } @@ -688,26 +728,26 @@ u32 LoopedTask_ExpandSelectedRibbon(s32 state) return LT_FINISH; } -u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state) +static u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state) { struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); switch (state) { case 0: PlaySE(SE_SELECT); - sub_81D1500(structPtr); + ZoomOutSelectedRibbon(structPtr); return LT_INC_AND_PAUSE; case 1: - if (!sub_81D1524(structPtr)) + if (!IsRibbonAnimating(structPtr)) { - sub_81D1448(structPtr); + UpdateAndZoomInSelectedRibbon(structPtr); return LT_INC_AND_PAUSE; } return LT_PAUSE; case 2: - if (!sub_81D1524(structPtr)) + if (!IsRibbonAnimating(structPtr)) { - sub_81D0EFC(structPtr); + PrintRibbonNameAndDescription(structPtr); return LT_INC_AND_PAUSE; } return LT_PAUSE; @@ -718,17 +758,17 @@ u32 LoopedTask_MoveRibbonsCursorExpanded(s32 state) return LT_FINISH; } -u32 LoopedTask_ShrinkExpandedRibbon(s32 state) +static u32 LoopedTask_ShrinkExpandedRibbon(s32 state) { struct PokenavSub14 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_SUMMARY_MENU); switch (state) { case 0: PlaySE(SE_SELECT); - sub_81D1500(structPtr); + ZoomOutSelectedRibbon(structPtr); return LT_INC_AND_PAUSE; case 1: - if (!sub_81D1524(structPtr)) + if (!IsRibbonAnimating(structPtr)) { PrintCurrentMonRibbonCount(structPtr); PrintHelpBarText(HELPBAR_RIBBONS_LIST); @@ -753,14 +793,14 @@ static const struct WindowTemplate sRibbonCountWindowTemplate = .baseBlock = 0x14, }; -void AddRibbonCountWindow(struct PokenavSub14 *structPtr) +static void AddRibbonCountWindow(struct PokenavSub14 *structPtr) { structPtr->ribbonCountWindowId = AddWindow(&sRibbonCountWindowTemplate); PutWindowTilemap(structPtr->ribbonCountWindowId); PrintCurrentMonRibbonCount(structPtr); } -void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr) +static void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr) { u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; @@ -773,24 +813,31 @@ void PrintCurrentMonRibbonCount(struct PokenavSub14 *structPtr) CopyWindowToVram(structPtr->ribbonCountWindowId, 2); } -void sub_81D0EFC(struct PokenavSub14 *structPtr) +static void PrintRibbonNameAndDescription(struct PokenavSub14 *structPtr) { s32 i; - u32 ribbonId = sub_81D0954(); + u32 ribbonId = GetRibbonId(); u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; FillWindowPixelBuffer(structPtr->ribbonCountWindowId, PIXEL_FILL(4)); - if (ribbonId < 25) + if (ribbonId < FIRST_GIFT_RIBBON) { + // Print normal ribbon name/description for (i = 0; i < 2; i++) AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, 1, 0, (i * 16) + 1, color, -1, gRibbonDescriptionPointers[ribbonId][i]); } else { - ribbonId = gSaveBlock1Ptr->giftRibbons[ribbonId - 25]; + // ribbonId here is one of the 'gift' ribbon slots, used to read + // its actual value from giftRibbons to determine which specific + // gift ribbon it is + ribbonId = gSaveBlock1Ptr->giftRibbons[ribbonId - FIRST_GIFT_RIBBON]; + + // If 0, this gift ribbon slot is unoccupied if (ribbonId == 0) return; + // Print gift ribbon name/description ribbonId--; for (i = 0; i < 2; i++) AddTextPrinterParameterized3(structPtr->ribbonCountWindowId, 1, 0, (i * 16) + 1, color, -1, gGiftRibbonDescriptionPointers[ribbonId][i]); @@ -810,7 +857,7 @@ static const struct WindowTemplate sRibbonSummaryMonNameWindowTemplate = .baseBlock = 0x54, }; -void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *structPtr) +static void AddRibbonSummaryMonNameWindow(struct PokenavSub14 *structPtr) { structPtr->nameWindowId = AddWindow(&sRibbonSummaryMonNameWindowTemplate); PutWindowTilemap(structPtr->nameWindowId); @@ -821,7 +868,7 @@ static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); static const u8 sGenderlessIconString[] = _("{UNK_SPACER}"); -void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *structPtr) +static void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *structPtr) { const u8 *genderTxt; u8 *txtPtr; @@ -829,7 +876,7 @@ void PrintRibbbonsSummaryMonInfo(struct PokenavSub14 *structPtr) u16 windowId = structPtr->nameWindowId; FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - GetCurrMonInfo1(gStringVar3, &level, &gender); + GetMonNicknameLevelGender(gStringVar3, &level, &gender); AddTextPrinterParameterized(windowId, 1, gStringVar3, 0, 1, TEXT_SPEED_FF, NULL); switch (gender) { @@ -867,7 +914,7 @@ static const struct WindowTemplate sRibbonMonListIndexWindowTemplate[] = {}, }; -void AddRibbonListIndexWindow(struct PokenavSub14 *structPtr) +static void AddRibbonListIndexWindow(struct PokenavSub14 *structPtr) { structPtr->listIdxWindowId = AddWindow(sRibbonMonListIndexWindowTemplate); FillWindowPixelBuffer(structPtr->listIdxWindowId, PIXEL_FILL(1)); @@ -875,7 +922,7 @@ void AddRibbonListIndexWindow(struct PokenavSub14 *structPtr) PrintRibbonsMonListIndex(structPtr); } -void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr) +static void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr) { s32 x; u8 *txtPtr; @@ -890,181 +937,219 @@ void PrintRibbonsMonListIndex(struct PokenavSub14 *structPtr) CopyWindowToVram(structPtr->listIdxWindowId, 2); } -void ResetSpritesAndDrawRibbonsMonFrontPic(struct PokenavSub14 *structPtr) +static void ResetSpritesAndDrawMonFrontPic(struct PokenavSub14 *structPtr) { u16 species; u32 personality, otId; - GetCurrMonInfo2(&species, &personality, &otId); + GetMonSpeciesPersonalityOtId(&species, &personality, &otId); ResetAllPicSprites(); - structPtr->monSpriteId = DrawRibbonsMonFrontPic(40, 104); + structPtr->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_ON, MON_SPRITE_Y); PokenavFillPalette(15, 0); } -void DestroyRibbonsMonFrontPic(struct PokenavSub14 *structPtr) +static void DestroyRibbonsMonFrontPic(struct PokenavSub14 *structPtr) { FreeAndDestroyMonPicSprite(structPtr->monSpriteId); } -u16 DrawRibbonsMonFrontPic(s32 unused0, s32 unused1) +// x and y arguments are ignored +// y is always given as MON_SPRITE_Y +// x is given as either MON_SPRITE_X_ON or MON_SPRITE_X_OFF (but ignored and MON_SPRITE_X_ON is used) +static u16 DrawRibbonsMonFrontPic(s32 x, s32 y) { u16 species, spriteId; u32 personality, otId; - GetCurrMonInfo2(&species, &personality, &otId); - spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 40, 104, 15, 0xFFFF); + GetMonSpeciesPersonalityOtId(&species, &personality, &otId); + spriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, MON_SPRITE_X_ON, MON_SPRITE_Y, 15, 0xFFFF); gSprites[spriteId].oam.priority = 0; return spriteId; } -void sub_81D11D8(struct PokenavSub14 *structPtr) +static void SlideMonSpriteOff(struct PokenavSub14 *structPtr) { - sub_81D1258(&gSprites[structPtr->monSpriteId], 40, -32, 6); + StartMonSpriteSlide(&gSprites[structPtr->monSpriteId], MON_SPRITE_X_ON, MON_SPRITE_X_OFF, 6); } -void sub_81D11FC(struct PokenavSub14 *structPtr) +static void SlideMonSpriteOn(struct PokenavSub14 *structPtr) { + // Switch to new mon sprite FreeAndDestroyMonPicSprite(structPtr->monSpriteId); - structPtr->monSpriteId = DrawRibbonsMonFrontPic(-32, 104); - sub_81D1258(&gSprites[structPtr->monSpriteId], -32, 40, 6); + structPtr->monSpriteId = DrawRibbonsMonFrontPic(MON_SPRITE_X_OFF, MON_SPRITE_Y); + + // Slide on + StartMonSpriteSlide(&gSprites[structPtr->monSpriteId], MON_SPRITE_X_OFF, MON_SPRITE_X_ON, 6); } -bool32 sub_81D1234(struct PokenavSub14 *structPtr) +// Is Pokémon summary sprite still sliding off/on +static bool32 IsMonSpriteAnimating(struct PokenavSub14 *structPtr) { return (gSprites[structPtr->monSpriteId].callback != SpriteCallbackDummy); } -void sub_81D1258(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3) +#define sCurrX data[0] +#define sMoveIncr data[1] +#define sTime data[2] +#define sDestX data[3] + +static void StartMonSpriteSlide(struct Sprite *sprite, s32 startX, s32 destX, s32 time) { - u32 var = arg2 - arg1; + u32 delta = destX - startX; - sprite->pos1.x = arg1; - sprite->data[0] = arg1 << 4; - sprite->data[1] = (var << 4) / arg3; - sprite->data[2] = arg3; - sprite->data[3] = arg2; + sprite->pos1.x = startX; + sprite->sCurrX = startX << 4; + sprite->sMoveIncr = (delta << 4) / time; + sprite->sTime = time; + sprite->sDestX = destX; - sprite->callback = sub_81D1284; + sprite->callback = SpriteCB_MonSpriteSlide; } -void sub_81D1284(struct Sprite *sprite) +static void SpriteCB_MonSpriteSlide(struct Sprite *sprite) { - if (sprite->data[2] != 0) + if (sprite->sTime != 0) { - sprite->data[2]--; - sprite->data[0] += sprite->data[1]; - sprite->pos1.x = sprite->data[0] >> 4; - if (sprite->pos1.x <= -32) + sprite->sTime--; + sprite->sCurrX += sprite->sMoveIncr; + sprite->pos1.x = sprite->sCurrX >> 4; + if (sprite->pos1.x <= MON_SPRITE_X_OFF) sprite->invisible = TRUE; else sprite->invisible = FALSE; } else { - sprite->pos1.x = sprite->data[3]; + sprite->pos1.x = sprite->sDestX; sprite->callback = SpriteCallbackDummy; } } -void sub_81D12D8(struct PokenavSub14 *structPtr) +#undef sCurrX +#undef sMoveIncr +#undef sTime +#undef sDestX + +static void DrawAllRibbonsSmall(struct PokenavSub14 *structPtr) { - u32 *ptr; + u32 *ribbonIds; - sub_81D1350(); + ClearRibbonsSummaryBg(); - ptr = sub_81D0914(&gUnknown_030012C0); - for (gUnknown_030012C4 = 0; gUnknown_030012C4 < gUnknown_030012C0; gUnknown_030012C4++) - sub_81D1370(gUnknown_030012C4, *(ptr++)); + ribbonIds = GetNormalRibbonIds(&sRibbonDraw_Total); + for (sRibbonDraw_Current = 0; sRibbonDraw_Current < sRibbonDraw_Total; sRibbonDraw_Current++) + DrawRibbonSmall(sRibbonDraw_Current, *(ribbonIds++)); - ptr = sub_81D092C(&gUnknown_030012C0); - for (gUnknown_030012C4 = 0; gUnknown_030012C4 < gUnknown_030012C0; gUnknown_030012C4++) - sub_81D1370(gUnknown_030012C4 + 27, *(ptr++)); + ribbonIds = GetGiftRibbonIds(&sRibbonDraw_Total); + for (sRibbonDraw_Current = 0; sRibbonDraw_Current < sRibbonDraw_Total; sRibbonDraw_Current++) + DrawRibbonSmall(sRibbonDraw_Current + GIFT_RIBBON_START_POS, *(ribbonIds++)); CopyBgTilemapBufferToVram(1); } -void sub_81D1350(void) +// Redundant, the same FillBg is called in LoopedTask_OpenRibbonsSummaryMenu +static void ClearRibbonsSummaryBg(void) { FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 20); } -void sub_81D1370(u32 arg0, u32 id) +static void DrawRibbonSmall(u32 i, u32 ribbonId) { u16 bgData[4]; - u32 destX = (arg0 % 9) * 2 + 11; - u32 destY = (arg0 / 9) * 2 + 4; + u32 destX = (i % RIBBONS_PER_ROW) * 2 + 11; + u32 destY = (i / RIBBONS_PER_ROW) * 2 + 4; - sub_81D13BC(bgData, id); + BufferSmallRibbonGfxData(bgData, ribbonId); CopyToBgTilemapBufferRect(1, bgData, destX, destY, 2, 2); } +// Below correspond to a ribbon icon in ribbons/icons.png and ribbons/icons_big.png; 0 at top, 11 at bottom +enum { + RIBBONGFX_CHAMPION, + RIBBONGFX_CONTEST_NORMAL, + RIBBONGFX_CONTEST_SUPER, + RIBBONGFX_CONTEST_HYPER, + RIBBONGFX_CONTEST_MASTER, + RIBBONGFX_WINNING, + RIBBONGFX_VICTORY, + RIBBONGFX_ARTIST, + RIBBONGFX_EFFORT, + RIBBONGFX_GIFT_1, + RIBBONGFX_GIFT_2, + RIBBONGFX_GIFT_3, +}; + +#define TO_PAL_OFFSET(palNum)((palNum) - PALTAG_RIBBON_ICONS_1) + struct { - u16 var0; - u16 var2; -} static const gUnknown_08624BF8[] = -{ - {0, 0}, - {1, 0}, - {2, 0}, - {3, 0}, - {4, 0}, - {1, 1}, - {2, 1}, - {3, 1}, - {4, 1}, - {1, 2}, - {2, 2}, - {3, 2}, - {4, 2}, - {1, 3}, - {2, 3}, - {3, 3}, - {4, 3}, - {1, 4}, - {2, 4}, - {3, 4}, - {4, 4}, - {5, 0}, - {6, 0}, - {7, 1}, - {8, 2}, - {9, 1}, - {9, 3}, - {9, 4}, - {10, 3}, - {10, 4}, - {11, 0}, - {11, 1}, + u16 tileNumOffset; + u16 palNumOffset; +} static const sRibbonGfxData[] = +{ + [CHAMPION_RIBBON] = { RIBBONGFX_CHAMPION, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [COOL_RIBBON_NORMAL] = { RIBBONGFX_CONTEST_NORMAL, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [COOL_RIBBON_SUPER] = { RIBBONGFX_CONTEST_SUPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [COOL_RIBBON_HYPER] = { RIBBONGFX_CONTEST_HYPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [COOL_RIBBON_MASTER] = { RIBBONGFX_CONTEST_MASTER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [BEAUTY_RIBBON_NORMAL] = { RIBBONGFX_CONTEST_NORMAL, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, + [BEAUTY_RIBBON_SUPER] = { RIBBONGFX_CONTEST_SUPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, + [BEAUTY_RIBBON_HYPER] = { RIBBONGFX_CONTEST_HYPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, + [BEAUTY_RIBBON_MASTER] = { RIBBONGFX_CONTEST_MASTER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, + [CUTE_RIBBON_NORMAL] = { RIBBONGFX_CONTEST_NORMAL, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_3)}, + [CUTE_RIBBON_SUPER] = { RIBBONGFX_CONTEST_SUPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_3)}, + [CUTE_RIBBON_HYPER] = { RIBBONGFX_CONTEST_HYPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_3)}, + [CUTE_RIBBON_MASTER] = { RIBBONGFX_CONTEST_MASTER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_3)}, + [SMART_RIBBON_NORMAL] = { RIBBONGFX_CONTEST_NORMAL, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_4)}, + [SMART_RIBBON_SUPER] = { RIBBONGFX_CONTEST_SUPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_4)}, + [SMART_RIBBON_HYPER] = { RIBBONGFX_CONTEST_HYPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_4)}, + [SMART_RIBBON_MASTER] = { RIBBONGFX_CONTEST_MASTER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_4)}, + [TOUGH_RIBBON_NORMAL] = { RIBBONGFX_CONTEST_NORMAL, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_5)}, + [TOUGH_RIBBON_SUPER] = { RIBBONGFX_CONTEST_SUPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_5)}, + [TOUGH_RIBBON_HYPER] = { RIBBONGFX_CONTEST_HYPER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_5)}, + [TOUGH_RIBBON_MASTER] = { RIBBONGFX_CONTEST_MASTER, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_5)}, + [WINNING_RIBBON] = { RIBBONGFX_WINNING, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [VICTORY_RIBBON] = { RIBBONGFX_VICTORY, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [ARTIST_RIBBON] = { RIBBONGFX_ARTIST, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, + [EFFORT_RIBBON] = { RIBBONGFX_EFFORT, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_3)}, + [MARINE_RIBBON] = { RIBBONGFX_GIFT_1, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, + [LAND_RIBBON] = { RIBBONGFX_GIFT_1, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_4)}, + [SKY_RIBBON] = { RIBBONGFX_GIFT_1, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_5)}, + [COUNTRY_RIBBON] = { RIBBONGFX_GIFT_2, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_4)}, + [NATIONAL_RIBBON] = { RIBBONGFX_GIFT_2, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_5)}, + [EARTH_RIBBON] = { RIBBONGFX_GIFT_3, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_1)}, + [WORLD_RIBBON] = { RIBBONGFX_GIFT_3, TO_PAL_OFFSET(PALTAG_RIBBON_ICONS_2)}, }; -void sub_81D13BC(u16 *dst, u32 id) +#undef TO_PAL_OFFSET + +static void BufferSmallRibbonGfxData(u16 *dst, u32 ribbonId) { - u16 r3 = gUnknown_08624BF8[id].var2 + 2; - u16 r1 = (gUnknown_08624BF8[id].var0 * 2) + 1; + u16 palNum = sRibbonGfxData[ribbonId].palNumOffset + 2; + u16 tileNum = (sRibbonGfxData[ribbonId].tileNumOffset * 2) + 1; - dst[0] = r1 | (r3 << 12); - dst[1] = r1 | (r3 << 12) |0x400; - dst[2] = (r1 + 1) | (r3 << 12); - dst[3] = (r1 + 1) | (r3 << 12) | 0x400; + dst[0] = tileNum | (palNum << 12); + dst[1] = tileNum | (palNum << 12) | 0x400; + dst[2] = (tileNum + 1) | (palNum << 12); + dst[3] = (tileNum + 1) | (palNum << 12) | 0x400; } -static const struct CompressedSpriteSheet gUnknown_08624C78 = +static const struct CompressedSpriteSheet sSpriteSheet_RibbonIconsBig = { - sRibbonIconsBig_Gfx, 0x1800, 9 + sRibbonIconsBig_Gfx, 0x1800, GFXTAG_RIBBON_ICONS_BIG }; -static const struct SpritePalette gUnknown_08624C80[] = +static const struct SpritePalette sSpritePalettes_RibbonIcons[] = { - {gUnknown_08623FF8, 15}, - {gUnknown_08624018, 16}, - {gUnknown_08624038, 17}, - {gUnknown_08624058, 18}, - {gUnknown_08624078, 19}, + {sRibbonIcons1_Pal, PALTAG_RIBBON_ICONS_1}, + {sRibbonIcons2_Pal, PALTAG_RIBBON_ICONS_2}, + {sRibbonIcons3_Pal, PALTAG_RIBBON_ICONS_3}, + {sRibbonIcons4_Pal, PALTAG_RIBBON_ICONS_4}, + {sRibbonIcons5_Pal, PALTAG_RIBBON_ICONS_5}, {}, }; -static const struct OamData sOamData_8624CB0 = +static const struct OamData sOamData_RibbonIconBig = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, @@ -1081,93 +1166,105 @@ static const struct OamData sOamData_8624CB0 = .affineParam = 0 }; -static const union AffineAnimCmd sSpriteAffineAnim_8624CB8[] = +static const union AffineAnimCmd sAffineAnim_RibbonIconBig_Normal[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8624CC8[] = +static const union AffineAnimCmd sAffineAnim_RibbonIconBig_ZoomIn[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(32, 32, 0, 4), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8624CE0[] = +static const union AffineAnimCmd sAffineAnim_RibbonIconBig_ZoomOut[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(-32, -32, 0, 4), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_8624CF8[] = +enum { + RIBBONANIM_NORMAL, + RIBBONANIM_ZOOM_IN, + RIBBONANIM_ZOOM_OUT, +}; + +static const union AffineAnimCmd *const sAffineAnims_RibbonIconBig[] = { - sSpriteAffineAnim_8624CB8, - sSpriteAffineAnim_8624CC8, - sSpriteAffineAnim_8624CE0 + [RIBBONANIM_NORMAL] = sAffineAnim_RibbonIconBig_Normal, + [RIBBONANIM_ZOOM_IN] = sAffineAnim_RibbonIconBig_ZoomIn, + [RIBBONANIM_ZOOM_OUT] = sAffineAnim_RibbonIconBig_ZoomOut }; -static const struct SpriteTemplate gUnknown_08624D04 = +static const struct SpriteTemplate sSpriteTemplate_RibbonIconBig = { - .tileTag = 9, - .paletteTag = 15, - .oam = &sOamData_8624CB0, + .tileTag = GFXTAG_RIBBON_ICONS_BIG, + .paletteTag = PALTAG_RIBBON_ICONS_1, + .oam = &sOamData_RibbonIconBig, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sSpriteAffineAnimTable_8624CF8, + .affineAnims = sAffineAnims_RibbonIconBig, .callback = SpriteCallbackDummy, }; -void sub_81D13FC(struct PokenavSub14 *structPtr) +// Create dummy sprite to be used for the zoomed in version of the selected ribbon +static void CreateBigRibbonSprite(struct PokenavSub14 *structPtr) { u8 spriteId; - LoadCompressedSpriteSheet(&gUnknown_08624C78); - Pokenav_AllocAndLoadPalettes(gUnknown_08624C80); + LoadCompressedSpriteSheet(&sSpriteSheet_RibbonIconsBig); + Pokenav_AllocAndLoadPalettes(sSpritePalettes_RibbonIcons); - spriteId = CreateSprite(&gUnknown_08624D04, 0, 0, 0); - structPtr->field_14 = &gSprites[spriteId]; - structPtr->field_14->invisible = TRUE; + spriteId = CreateSprite(&sSpriteTemplate_RibbonIconBig, 0, 0, 0); + structPtr->bigRibbonSprite = &gSprites[spriteId]; + structPtr->bigRibbonSprite->invisible = TRUE; } -void sub_81D1448(struct PokenavSub14 *structPtr) +#define sInvisibleWhenDone data[0] + +static void UpdateAndZoomInSelectedRibbon(struct PokenavSub14 *structPtr) { u32 ribbonId; - s32 r4 = sub_81D0944(); - s32 r5 = (r4 % 9) * 16 + 96; - s32 r0 = (r4 / 9) * 16 + 40; - - structPtr->field_14->pos1.x = r5; - structPtr->field_14->pos1.y = r0; - - ribbonId = sub_81D0954(); - structPtr->field_14->oam.tileNum = (gUnknown_08624BF8[ribbonId].var0 * 16) + GetSpriteTileStartByTag(9); - structPtr->field_14->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_08624BF8[ribbonId].var2 + 15); - - StartSpriteAffineAnim(structPtr->field_14, 1); - structPtr->field_14->invisible = FALSE; - structPtr->field_14->data[0] = 0; - structPtr->field_14->callback = sub_81D1538; + s32 position = GetSelectedPosition(); + s32 x = (position % RIBBONS_PER_ROW) * 16 + 96; + s32 y = (position / RIBBONS_PER_ROW) * 16 + 40; + + structPtr->bigRibbonSprite->pos1.x = x; + structPtr->bigRibbonSprite->pos1.y = y; + + // Set new selected ribbon's gfx data + ribbonId = GetRibbonId(); + structPtr->bigRibbonSprite->oam.tileNum = (sRibbonGfxData[ribbonId].tileNumOffset * 16) + GetSpriteTileStartByTag(GFXTAG_RIBBON_ICONS_BIG); + structPtr->bigRibbonSprite->oam.paletteNum = IndexOfSpritePaletteTag(sRibbonGfxData[ribbonId].palNumOffset + PALTAG_RIBBON_ICONS_1); + + // Start zoom in animation + StartSpriteAffineAnim(structPtr->bigRibbonSprite, RIBBONANIM_ZOOM_IN); + structPtr->bigRibbonSprite->invisible = FALSE; + structPtr->bigRibbonSprite->sInvisibleWhenDone = FALSE; + structPtr->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation; } -void sub_81D1500(struct PokenavSub14 *structPtr) +// Start animation to zoom out of selected ribbon +static void ZoomOutSelectedRibbon(struct PokenavSub14 *structPtr) { - structPtr->field_14->data[0] = 1; - StartSpriteAffineAnim(structPtr->field_14, 2); - structPtr->field_14->callback = sub_81D1538; + structPtr->bigRibbonSprite->sInvisibleWhenDone = TRUE; + StartSpriteAffineAnim(structPtr->bigRibbonSprite, RIBBONANIM_ZOOM_OUT); + structPtr->bigRibbonSprite->callback = SpriteCB_WaitForRibbonAnimation; } -bool32 sub_81D1524(struct PokenavSub14 *structPtr) +static bool32 IsRibbonAnimating(struct PokenavSub14 *structPtr) { - return (structPtr->field_14->callback != SpriteCallbackDummy); + return (structPtr->bigRibbonSprite->callback != SpriteCallbackDummy); } -void sub_81D1538(struct Sprite *sprite) +static void SpriteCB_WaitForRibbonAnimation(struct Sprite *sprite) { if (sprite->affineAnimEnded) { - sprite->invisible = sprite->data[0]; + sprite->invisible = sprite->sInvisibleWhenDone; sprite->callback = SpriteCallbackDummy; } } diff --git a/src/trade.c b/src/trade.c index efc499209..b8551845b 100644 --- a/src/trade.c +++ b/src/trade.c @@ -110,7 +110,7 @@ static EWRAM_DATA struct { /*0x007F*/ u8 unused_7F; /*0x0080*/ u16 linkData[20]; /*0x00A8*/ u8 timer; - /*0x00A9*/ u8 giftRibbons[11]; + /*0x00A9*/ u8 giftRibbons[GIFT_RIBBONS_COUNT]; /*0x00B4*/ u8 filler_B4[0x8D0-0xB4]; /*0x08D0*/ struct { bool8 queued; @@ -139,7 +139,7 @@ static void sub_80EF120(u16 days); static void sub_80EDA48(u16 days); static void sub_80EEB98(u16 days); void PutFishingAdviceShowOnTheAir(void); -u8 TV_MonDataIdxToRibbon(u8 monDataIdx); +static u8 MonDataIdxToRibbon(u8 monDataIdx); static void sub_80EEBF4(u8 actionIdx); bool8 IsPriceDiscounted(u8 newsKind); static void InterviewBefore_FanClubLetter(void); @@ -592,22 +592,22 @@ static const u8 *const sTVTrainerFanClubTextGroup[] = { }; static const u8 *const sTVCutiesTextGroup[] = { - gTVCutiesText00, - gTVCutiesText01, - gTVCutiesText02, - gTVCutiesText03, - gTVCutiesText04, - gTVCutiesText05, - gTVCutiesText06, - gTVCutiesText07, - gTVCutiesText08, - gTVCutiesText09, - gTVCutiesText10, - gTVCutiesText11, - gTVCutiesText12, - gTVCutiesText13, - gTVCutiesText14, - gTVCutiesText15 + [SPOTCUTIES_STATE_INTRO] = TVSpotTheCuties_Text_Intro, + [SPOTCUTIES_STATE_RIBBONS_LOW] = TVSpotTheCuties_Text_RibbonsLow, + [SPOTCUTIES_STATE_RIBBONS_MID] = TVSpotTheCuties_Text_RibbonsMid, + [SPOTCUTIES_STATE_RIBBONS_HIGH] = TVSpotTheCuties_Text_RibbonsHigh, + [SPOTCUTIES_STATE_RIBBON_INTRO] = TVSpotTheCuties_Text_RibbonIntro, + [SPOTCUTIES_STATE_RIBBON_CHAMPION] = TVSpotTheCuties_Text_RibbonChampion, + [SPOTCUTIES_STATE_RIBBON_COOL] = TVSpotTheCuties_Text_RibbonCool, + [SPOTCUTIES_STATE_RIBBON_BEAUTY] = TVSpotTheCuties_Text_RibbonBeauty, + [SPOTCUTIES_STATE_RIBBON_CUTE] = TVSpotTheCuties_Text_RibbonCute, + [SPOTCUTIES_STATE_RIBBON_SMART] = TVSpotTheCuties_Text_RibbonSmart, + [SPOTCUTIES_STATE_RIBBON_TOUGH] = TVSpotTheCuties_Text_RibbonTough, + [SPOTCUTIES_STATE_RIBBON_WINNING] = TVSpotTheCuties_Text_RibbonWinning, + [SPOTCUTIES_STATE_RIBBON_VICTORY] = TVSpotTheCuties_Text_RibbonVictory, + [SPOTCUTIES_STATE_RIBBON_ARTIST] = TVSpotTheCuties_Text_RibbonArtist, + [SPOTCUTIES_STATE_RIBBON_EFFORT] = TVSpotTheCuties_Text_RibbonEffort, + [SPOTCUTIES_STATE_OUTRO] = TVSpotTheCuties_Text_Outro }; static const u8 *const sTVPokemonNewsBattleFrontierTextGroup[] = { @@ -2369,7 +2369,7 @@ void TryPutSpotTheCutiesOnAir(struct Pokemon *pokemon, u8 ribbonMonDataIdx) GetMonData(pokemon, MON_DATA_NICKNAME, show->cuties.nickname); StripExtCtrlCodes(show->cuties.nickname); show->cuties.nRibbons = GetRibbonCount(pokemon); - show->cuties.selectedRibbon = TV_MonDataIdxToRibbon(ribbonMonDataIdx); + show->cuties.selectedRibbon = MonDataIdxToRibbon(ribbonMonDataIdx); tv_store_id_3x(show); show->cuties.language = gGameLanguage; if (show->cuties.language == LANGUAGE_JAPANESE || GetMonData(pokemon, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE) @@ -2408,26 +2408,26 @@ u8 GetRibbonCount(struct Pokemon *pokemon) return nRibbons; } -u8 TV_MonDataIdxToRibbon(u8 monDataIdx) -{ - if (monDataIdx == MON_DATA_CHAMPION_RIBBON) return 0; - if (monDataIdx == MON_DATA_COOL_RIBBON) return 1; - if (monDataIdx == MON_DATA_BEAUTY_RIBBON) return 5; - if (monDataIdx == MON_DATA_CUTE_RIBBON) return 9; - if (monDataIdx == MON_DATA_SMART_RIBBON) return 13; - if (monDataIdx == MON_DATA_TOUGH_RIBBON) return 17; - if (monDataIdx == MON_DATA_WINNING_RIBBON) return 21; - if (monDataIdx == MON_DATA_VICTORY_RIBBON) return 22; - if (monDataIdx == MON_DATA_ARTIST_RIBBON) return 23; - if (monDataIdx == MON_DATA_EFFORT_RIBBON) return 24; - if (monDataIdx == MON_DATA_MARINE_RIBBON) return 25; - if (monDataIdx == MON_DATA_LAND_RIBBON) return 26; - if (monDataIdx == MON_DATA_SKY_RIBBON) return 27; - if (monDataIdx == MON_DATA_COUNTRY_RIBBON) return 28; - if (monDataIdx == MON_DATA_NATIONAL_RIBBON) return 29; - if (monDataIdx == MON_DATA_EARTH_RIBBON) return 30; - if (monDataIdx == MON_DATA_WORLD_RIBBON) return 31; - return 0; +static u8 MonDataIdxToRibbon(u8 monDataIdx) +{ + if (monDataIdx == MON_DATA_CHAMPION_RIBBON) return CHAMPION_RIBBON; + if (monDataIdx == MON_DATA_COOL_RIBBON) return COOL_RIBBON_NORMAL; + if (monDataIdx == MON_DATA_BEAUTY_RIBBON) return BEAUTY_RIBBON_NORMAL; + if (monDataIdx == MON_DATA_CUTE_RIBBON) return CUTE_RIBBON_NORMAL; + if (monDataIdx == MON_DATA_SMART_RIBBON) return SMART_RIBBON_NORMAL; + if (monDataIdx == MON_DATA_TOUGH_RIBBON) return TOUGH_RIBBON_NORMAL; + if (monDataIdx == MON_DATA_WINNING_RIBBON) return WINNING_RIBBON; + if (monDataIdx == MON_DATA_VICTORY_RIBBON) return VICTORY_RIBBON; + if (monDataIdx == MON_DATA_ARTIST_RIBBON) return ARTIST_RIBBON; + if (monDataIdx == MON_DATA_EFFORT_RIBBON) return EFFORT_RIBBON; + if (monDataIdx == MON_DATA_MARINE_RIBBON) return MARINE_RIBBON; + if (monDataIdx == MON_DATA_LAND_RIBBON) return LAND_RIBBON; + if (monDataIdx == MON_DATA_SKY_RIBBON) return SKY_RIBBON; + if (monDataIdx == MON_DATA_COUNTRY_RIBBON) return COUNTRY_RIBBON; + if (monDataIdx == MON_DATA_NATIONAL_RIBBON) return NATIONAL_RIBBON; + if (monDataIdx == MON_DATA_EARTH_RIBBON) return EARTH_RIBBON; + if (monDataIdx == MON_DATA_WORLD_RIBBON) return WORLD_RIBBON; + return CHAMPION_RIBBON; } void TrySetUpTrainerFanClubSpecial(void) @@ -6603,98 +6603,100 @@ static void DoTVShowSpotTheCuties(void) show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; gSpecialVar_Result = FALSE; + + // For each state, in addition to the switch a message + // is printed from the table at the bottom state = sTVShowState; switch (state) { - case 0: + case SPOTCUTIES_STATE_INTRO: TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language); TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); + + // Comments following the intro depend on how many ribbons the pokemon has if (show->cuties.nRibbons < 10) - { - sTVShowState = 1; - } + sTVShowState = SPOTCUTIES_STATE_RIBBONS_LOW; else if (show->cuties.nRibbons < 20) - { - sTVShowState = 2; - } + sTVShowState = SPOTCUTIES_STATE_RIBBONS_MID; else - { - sTVShowState = 3; - } + sTVShowState = SPOTCUTIES_STATE_RIBBONS_HIGH; break; - case 1: - case 2: - case 3: + case SPOTCUTIES_STATE_RIBBONS_LOW: + case SPOTCUTIES_STATE_RIBBONS_MID: + case SPOTCUTIES_STATE_RIBBONS_HIGH: TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language); TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); TV_PrintIntToStringVar(2, show->cuties.nRibbons); - sTVShowState = 4; + sTVShowState = SPOTCUTIES_STATE_RIBBON_INTRO; break; - case 4: + case SPOTCUTIES_STATE_RIBBON_INTRO: TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); switch (show->cuties.selectedRibbon) { - case 0: - sTVShowState = 5; - break; - case 1: - case 2: - case 3: - case 4: - sTVShowState = 6; - break; - case 5: - case 6: - case 7: - case 8: - sTVShowState = 7; - break; - case 9: - case 10: - case 11: - case 12: - sTVShowState = 8; - break; - case 13: - case 14: - case 15: - case 16: - sTVShowState = 9; - break; - case 17: - case 18: - case 19: - case 20: - sTVShowState = 10; - break; - case 21: - sTVShowState = 11; - break; - case 22: - sTVShowState = 12; - break; - case 23: - sTVShowState = 13; - break; - case 24: - sTVShowState = 14; - break; - } - break; - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: + case CHAMPION_RIBBON: + sTVShowState = SPOTCUTIES_STATE_RIBBON_CHAMPION; + break; + case COOL_RIBBON_NORMAL: + case COOL_RIBBON_SUPER: + case COOL_RIBBON_HYPER: + case COOL_RIBBON_MASTER: + sTVShowState = SPOTCUTIES_STATE_RIBBON_COOL; + break; + case BEAUTY_RIBBON_NORMAL: + case BEAUTY_RIBBON_SUPER: + case BEAUTY_RIBBON_HYPER: + case BEAUTY_RIBBON_MASTER: + sTVShowState = SPOTCUTIES_STATE_RIBBON_BEAUTY; + break; + case CUTE_RIBBON_NORMAL: + case CUTE_RIBBON_SUPER: + case CUTE_RIBBON_HYPER: + case CUTE_RIBBON_MASTER: + sTVShowState = SPOTCUTIES_STATE_RIBBON_CUTE; + break; + case SMART_RIBBON_NORMAL: + case SMART_RIBBON_SUPER: + case SMART_RIBBON_HYPER: + case SMART_RIBBON_MASTER: + sTVShowState = SPOTCUTIES_STATE_RIBBON_SMART; + break; + case TOUGH_RIBBON_NORMAL: + case TOUGH_RIBBON_SUPER: + case TOUGH_RIBBON_HYPER: + case TOUGH_RIBBON_MASTER: + sTVShowState = SPOTCUTIES_STATE_RIBBON_TOUGH; + break; + case WINNING_RIBBON: + sTVShowState = SPOTCUTIES_STATE_RIBBON_WINNING; + break; + case VICTORY_RIBBON: + sTVShowState = SPOTCUTIES_STATE_RIBBON_VICTORY; + break; + case ARTIST_RIBBON: + sTVShowState = SPOTCUTIES_STATE_RIBBON_ARTIST; + break; + case EFFORT_RIBBON: + sTVShowState = SPOTCUTIES_STATE_RIBBON_EFFORT; + break; + // No comment is made for any of the gift ribbons. + // If the show is created for a gift ribbon + // then this state will repeat indefinitely + } + break; + case SPOTCUTIES_STATE_RIBBON_CHAMPION: + case SPOTCUTIES_STATE_RIBBON_COOL: + case SPOTCUTIES_STATE_RIBBON_BEAUTY: + case SPOTCUTIES_STATE_RIBBON_CUTE: + case SPOTCUTIES_STATE_RIBBON_SMART: + case SPOTCUTIES_STATE_RIBBON_TOUGH: + case SPOTCUTIES_STATE_RIBBON_WINNING: + case SPOTCUTIES_STATE_RIBBON_VICTORY: + case SPOTCUTIES_STATE_RIBBON_ARTIST: + case SPOTCUTIES_STATE_RIBBON_EFFORT: TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); - sTVShowState = 15; + sTVShowState = SPOTCUTIES_STATE_OUTRO; break; - case 15: + case SPOTCUTIES_STATE_OUTRO: TVShowDone(); } ShowFieldMessage(sTVCutiesTextGroup[state]); |