diff options
author | luckytyphlosion <10688458+luckytyphlosion@users.noreply.github.com> | 2021-05-23 10:51:26 -0400 |
---|---|---|
committer | luckytyphlosion <10688458+luckytyphlosion@users.noreply.github.com> | 2021-05-23 10:51:26 -0400 |
commit | c723d980e772f7e7ab82dbcb7ad07132c09ab5b4 (patch) | |
tree | 0bed002b2990b9e837220618a321f3b6517a1099 /src | |
parent | c50a21fba07db80ac44c6f09fd202ba4b2e2c7d3 (diff) | |
parent | ffbbc88801de3fc56d0bf5f0af1418ca7cfcfa4f (diff) |
Merge branch 'master' of https://github.com/pret/pokeemerald
Diffstat (limited to 'src')
265 files changed, 50178 insertions, 42516 deletions
diff --git a/src/apprentice.c b/src/apprentice.c index ad157f301..00157dc1a 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -30,7 +30,7 @@ #include "constants/trainers.h" #include "constants/moves.h" -/* Summary of Apprentice, because (as of writing at least) its not very well documented online +/* Summary of Apprentice, because (as of writing at least) it's not very well documented online * * ## Basic info * In the Battle Tower lobby there is an NPC which asks to be taught by the player @@ -144,7 +144,7 @@ void ResetApprenticeStruct(struct Apprentice *apprentice) u8 i; for (i = 0; i < ARRAY_COUNT(apprentice->speechWon); i++) - apprentice->speechWon[i] = 0xFFFF; + apprentice->speechWon[i] = EC_EMPTY_WORD; apprentice->playerName[0] = EOS; apprentice->id = NUM_APPRENTICES; @@ -158,7 +158,7 @@ void ResetAllApprenticeData(void) for (i = 0; i < APPRENTICE_COUNT; i++) { for (j = 0; j < ARRAY_COUNT(gSaveBlock2Ptr->apprentices[i].speechWon); j++) - gSaveBlock2Ptr->apprentices[i].speechWon[j] = 0xFFFF; + gSaveBlock2Ptr->apprentices[i].speechWon[j] = EC_EMPTY_WORD; gSaveBlock2Ptr->apprentices[i].id = NUM_APPRENTICES; gSaveBlock2Ptr->apprentices[i].playerName[0] = EOS; gSaveBlock2Ptr->apprentices[i].lvlMode = 0; @@ -322,17 +322,12 @@ static void SetRandomQuestionData(void) FREE_AND_SET_NULL(gApprenticePartyMovesData); } -// No idea why a do-while loop is needed, but it will not match without it. +#define APPRENTICE_SPECIES_ID(monId) \ + ((monId < MULTI_PARTY_SIZE) ? (PLAYER_APPRENTICE.speciesIds[monId] >> (((PLAYER_APPRENTICE.party >> monId) & 1) << 2) & 0xF) : 0) -#define APPRENTICE_SPECIES_ID(speciesArrId, monId) speciesArrId = (PLAYER_APPRENTICE.speciesIds[monId] >> \ - (((PLAYER_APPRENTICE.party >> monId) & 1) << 2)) & 0xF; \ - do {} while (0) - -// Why the need to have two macros do the exact thing differently? -#define APPRENTICE_SPECIES_ID_2(speciesArrId, monId) { u8 a0 = ((PLAYER_APPRENTICE.party >> monId) & 1);\ - speciesArrId = PLAYER_APPRENTICE.speciesIds[monId]; \ - speciesArrId = ((speciesArrId) >> (a0 << 2)) & 0xF; \ - } +#define APPRENTICE_SPECIES_ID_NO_COND(monId, count) \ + monId = ((PLAYER_APPRENTICE.party >> count) & 1); \ + monId = ((PLAYER_APPRENTICE.speciesIds[count]) >> (monId << 2)) & 0xF; \ // Get the second move choice for the "Which move" question // Unlike the first move choice, this can be either a level up move or a TM/HM move @@ -348,15 +343,7 @@ static u16 GetRandomAlternateMove(u8 monId) bool32 shouldUseMove; u8 level; - if (monId < MULTI_PARTY_SIZE) - { - APPRENTICE_SPECIES_ID(id, monId); - } - else - { - id = 0; - } - + id = APPRENTICE_SPECIES_ID(monId); species = gApprentices[PLAYER_APPRENTICE.id].species[id]; learnset = gLevelUpLearnsets[species]; j = 0; @@ -551,7 +538,7 @@ static void SaveApprenticeParty(u8 numQuestions) // Save party species for (i = 0; i < MULTI_PARTY_SIZE; i++) { - APPRENTICE_SPECIES_ID(speciesTableId, i); + speciesTableId = APPRENTICE_SPECIES_ID(i); apprenticeMons[i]->species = gApprentices[PLAYER_APPRENTICE.id].species[speciesTableId]; GetLatestLearnedMoves(apprenticeMons[i]->species, apprenticeMons[i]->moves); } @@ -605,7 +592,7 @@ static void CreateApprenticeMenu(u8 menu) u16 species; u32 speciesTableId; - APPRENTICE_SPECIES_ID(speciesTableId, i); + speciesTableId = APPRENTICE_SPECIES_ID(i); species = gApprentices[PLAYER_APPRENTICE.id].species[speciesTableId]; strings[i] = gSpeciesNames[species]; } @@ -923,7 +910,7 @@ static void Script_PrintApprenticeMessage(void) { ScriptContext2_Enable(); FreezeObjectEvents(); - sub_808B864(); + PlayerFreeze(); sub_808BCF4(); DrawDialogueFrame(0, 1); PrintApprenticeMessage(); @@ -1016,7 +1003,7 @@ static void InitQuestionData(void) { // count re-used as monId count = PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].monId; - APPRENTICE_SPECIES_ID_2(id1, count); + APPRENTICE_SPECIES_ID_NO_COND(id1, count); gApprenticeQuestionData->speciesId = gApprentices[PLAYER_APPRENTICE.id].species[id1]; gApprenticeQuestionData->moveId1 = GetDefaultMove(count, id1, PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].moveSlot); gApprenticeQuestionData->moveId2 = PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data; @@ -1030,7 +1017,7 @@ static void InitQuestionData(void) { // count re-used as monId count = PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].monId; - APPRENTICE_SPECIES_ID_2(id2, count); + APPRENTICE_SPECIES_ID_NO_COND(id2, count); gApprenticeQuestionData->speciesId = gApprentices[PLAYER_APPRENTICE.id].species[id2]; } } @@ -1083,7 +1070,7 @@ static void ApprenticeBufferString(void) StringCopy(stringDst, ItemId_GetName(PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data)); break; case APPRENTICE_BUFF_NAME: - TVShowConvertInternationalString(text, GetApprenticeNameInLanguage(PLAYER_APPRENTICE.id, LANGUAGE_ENGLISH), LANGUAGE_ENGLISH); + TVShowConvertInternationalString(text, GetApprenticeNameInLanguage(PLAYER_APPRENTICE.id, GAME_LANGUAGE), GAME_LANGUAGE); StringCopy(stringDst, text); break; case APPRENTICE_BUFF_LEVEL: @@ -1097,14 +1084,7 @@ static void ApprenticeBufferString(void) StringCopy(stringDst, gStringVar4); break; case APPRENTICE_BUFF_LEAD_MON_SPECIES: - if (PLAYER_APPRENTICE.leadMonId < MULTI_PARTY_SIZE) - { - APPRENTICE_SPECIES_ID(speciesArrayId, PLAYER_APPRENTICE.leadMonId); - } - else - { - speciesArrayId = 0; - } + speciesArrayId = APPRENTICE_SPECIES_ID(PLAYER_APPRENTICE.leadMonId); StringCopy(stringDst, gSpeciesNames[gApprentices[PLAYER_APPRENTICE.id].species[speciesArrayId]]); break; } @@ -1127,17 +1107,24 @@ static void TrySetApprenticeHeldItem(void) if (PLAYER_APPRENTICE.questionsAnswered < NUM_WHICH_MON_QUESTIONS) return; + + count = 0; + for (j = 0; j < APPRENTICE_MAX_QUESTIONS; j++) + { + if (PLAYER_APPRENTICE.questions[j].questionId == QUESTION_ID_WIN_SPEECH) + break; + count++; + } - for (count = 0, j = 0; j < APPRENTICE_MAX_QUESTIONS && PLAYER_APPRENTICE.questions[j].questionId != QUESTION_ID_WIN_SPEECH; count++, j++) - ; - - // Make sure the item hasnt already been suggested in previous questions - for (i = 0; i < count && i < CURRENT_QUESTION_NUM; i++) + // Make sure the item hasn't already been suggested in previous questions + for (i = 0; i < count; i++) { - do {} while(0); - if (PLAYER_APPRENTICE.questions[i].questionId == QUESTION_ID_WHAT_ITEM - && PLAYER_APPRENTICE.questions[i].suggestedChange - && PLAYER_APPRENTICE.questions[i].data == gSpecialVar_0x8005) + if (i >= CURRENT_QUESTION_NUM) + break; + if (PLAYER_APPRENTICE.questions[i].questionId != QUESTION_ID_WHAT_ITEM || + PLAYER_APPRENTICE.questions[i].suggestedChange == 0) + continue; + if (PLAYER_APPRENTICE.questions[i].data == gSpecialVar_0x8005) { PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].suggestedChange = FALSE; PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data = gSpecialVar_0x8005; diff --git a/src/bard_music.c b/src/bard_music.c index 6c2578071..114f1cf42 100644 --- a/src/bard_music.c +++ b/src/bard_music.c @@ -1,5 +1,3 @@ - -// Includes #include "global.h" #include "bard_music.h" #include "constants/easy_chat.h" @@ -10,9 +8,9 @@ #include "data/bard_music/default_sound.h" #include "data/bard_music/length_table.h" -s16 CalcWordPitch(int arg0, int songPos) +static s16 CalcWordPitch(int arg0, int songPos) { - return gBardSoundPitchTables[arg0][songPos]; + return sBardSoundPitchTables[arg0][songPos]; } const struct BardSound *GetWordSounds(u16 word) @@ -21,16 +19,16 @@ const struct BardSound *GetWordSounds(u16 word) u32 subword; const struct BardSound (*ptr)[6]; - if (ECWord_CheckIfOutsideOfValidRange(word)) + if (IsBardWordInvalid(word)) { return gBardSound_InvalidWord; } - category = word >> 9; - subword = word & 0x1ff; + category = EC_GROUP(word); + subword = EC_INDEX(word); switch (category) { case EC_GROUP_POKEMON: - case EC_GROUP_POKEMON_2: + case EC_GROUP_POKEMON_NATIONAL: ptr = gBardSounds_Pokemon; break; case EC_GROUP_MOVE_1: diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index b7679429c..b72875036 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -95,16 +95,16 @@ static void Cmd_if_equal_(void); static void Cmd_if_not_equal_(void); static void Cmd_if_user_goes(void); static void Cmd_if_user_doesnt_go(void); -static void Cmd_nullsub_2A(void); -static void Cmd_nullsub_2B(void); +static void Cmd_nop_2A(void); +static void Cmd_nop_2B(void); static void Cmd_count_usable_party_mons(void); static void Cmd_get_considered_move(void); static void Cmd_get_considered_move_effect(void); static void Cmd_get_ability(void); static void Cmd_get_highest_type_effectiveness(void); static void Cmd_if_type_effectiveness(void); -static void Cmd_nullsub_32(void); -static void Cmd_nullsub_33(void); +static void Cmd_nop_32(void); +static void Cmd_nop_33(void); static void Cmd_if_status_in_party(void); static void Cmd_if_status_not_in_party(void); static void Cmd_get_weather(void); @@ -135,12 +135,12 @@ static void Cmd_get_move_type_from_result(void); static void Cmd_get_move_power_from_result(void); static void Cmd_get_move_effect_from_result(void); static void Cmd_get_protect_count(void); -static void Cmd_nullsub_52(void); -static void Cmd_nullsub_53(void); -static void Cmd_nullsub_54(void); -static void Cmd_nullsub_55(void); -static void Cmd_nullsub_56(void); -static void Cmd_nullsub_57(void); +static void Cmd_nop_52(void); +static void Cmd_nop_53(void); +static void Cmd_nop_54(void); +static void Cmd_nop_55(void); +static void Cmd_nop_56(void); +static void Cmd_nop_57(void); static void Cmd_call(void); static void Cmd_goto(void); static void Cmd_end(void); @@ -204,16 +204,16 @@ static const BattleAICmdFunc sBattleAICmdTable[] = Cmd_if_not_equal_, // 0x27 Cmd_if_user_goes, // 0x28 Cmd_if_user_doesnt_go, // 0x29 - Cmd_nullsub_2A, // 0x2A - Cmd_nullsub_2B, // 0x2B + Cmd_nop_2A, // 0x2A + Cmd_nop_2B, // 0x2B Cmd_count_usable_party_mons, // 0x2C Cmd_get_considered_move, // 0x2D Cmd_get_considered_move_effect, // 0x2E Cmd_get_ability, // 0x2F Cmd_get_highest_type_effectiveness, // 0x30 Cmd_if_type_effectiveness, // 0x31 - Cmd_nullsub_32, // 0x32 - Cmd_nullsub_33, // 0x33 + Cmd_nop_32, // 0x32 + Cmd_nop_33, // 0x33 Cmd_if_status_in_party, // 0x34 Cmd_if_status_not_in_party, // 0x35 Cmd_get_weather, // 0x36 @@ -244,12 +244,12 @@ static const BattleAICmdFunc sBattleAICmdTable[] = Cmd_get_move_power_from_result, // 0x4F Cmd_get_move_effect_from_result, // 0x50 Cmd_get_protect_count, // 0x51 - Cmd_nullsub_52, // 0x52 - Cmd_nullsub_53, // 0x53 - Cmd_nullsub_54, // 0x54 - Cmd_nullsub_55, // 0x55 - Cmd_nullsub_56, // 0x56 - Cmd_nullsub_57, // 0x57 + Cmd_nop_52, // 0x52 + Cmd_nop_53, // 0x53 + Cmd_nop_54, // 0x54 + Cmd_nop_55, // 0x55 + Cmd_nop_56, // 0x56 + Cmd_nop_57, // 0x57 Cmd_call, // 0x58 Cmd_goto, // 0x59 Cmd_end, // 0x5A @@ -293,7 +293,7 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) if ((gBattleTypeFlags & BATTLE_TYPE_TRAINER) && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_SECRET_BASE | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_x2000000) + | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_RECORDED_LINK) ) ) { @@ -1278,11 +1278,11 @@ static void Cmd_if_user_doesnt_go(void) gAIScriptPtr += 6; } -static void Cmd_nullsub_2A(void) +static void Cmd_nop_2A(void) { } -static void Cmd_nullsub_2B(void) +static void Cmd_nop_2B(void) { } @@ -1539,11 +1539,11 @@ static void Cmd_if_type_effectiveness(void) gAIScriptPtr += 6; } -static void Cmd_nullsub_32(void) +static void Cmd_nop_32(void) { } -static void Cmd_nullsub_33(void) +static void Cmd_nop_33(void) { } @@ -1761,7 +1761,11 @@ static void Cmd_if_cant_faint(void) gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - // This macro is missing the damage 0 = 1 assumption. +#ifdef BUGFIX + // Moves always do at least 1 damage. + if (gBattleMoveDamage == 0) + gBattleMoveDamage = 1; +#endif if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); @@ -1877,9 +1881,14 @@ static void Cmd_if_has_move_with_effect(void) case AI_TARGET_PARTNER: for (i = 0; i < MAX_MON_MOVES; i++) { - // UB: checks sBattler_AI instead of gBattlerTarget. + // BUG: checks sBattler_AI instead of gBattlerTarget. + #ifndef BUGFIX if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) break; + #else + if (gBattleMons[gBattlerTarget].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) + break; + #endif } if (i == MAX_MON_MOVES) gAIScriptPtr += 7; @@ -2014,18 +2023,24 @@ static void Cmd_if_holds_item(void) { u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u16 item; - u8 var1, var2; + u8 itemLo, itemHi; if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE)) item = gBattleMons[battlerId].item; else item = BATTLE_HISTORY->itemEffects[battlerId]; - // UB: doesn't properly read an unaligned u16 - var2 = gAIScriptPtr[2]; - var1 = gAIScriptPtr[3]; + itemHi = gAIScriptPtr[2]; + itemLo = gAIScriptPtr[3]; - if ((var1 | var2) == item) +#ifdef BUGFIX + // This bug doesn't affect the vanilla game because this script command + // is only used to check ITEM_PERSIM_BERRY, whose high byte happens to + // be 0. + if (((itemHi << 8) | itemLo) == item) +#else + if ((itemLo | itemHi) == item) +#endif gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; @@ -2089,12 +2104,7 @@ static void Cmd_get_used_held_item(void) else battlerId = gBattlerTarget; - // This is likely a leftover from Ruby's code and its ugly ewram access. - #ifdef NONMATCHING - AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId]; - #else - AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2)); - #endif // NONMATCHING + AI_THINKING_STRUCT->funcResult = *(u8 *)&gBattleStruct->usedHeldItems[battlerId]; gAIScriptPtr += 2; } @@ -2134,27 +2144,27 @@ static void Cmd_get_protect_count(void) gAIScriptPtr += 2; } -static void Cmd_nullsub_52(void) +static void Cmd_nop_52(void) { } -static void Cmd_nullsub_53(void) +static void Cmd_nop_53(void) { } -static void Cmd_nullsub_54(void) +static void Cmd_nop_54(void) { } -static void Cmd_nullsub_55(void) +static void Cmd_nop_55(void) { } -static void Cmd_nullsub_56(void) +static void Cmd_nop_56(void) { } -static void Cmd_nullsub_57(void) +static void Cmd_nop_57(void) { } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 1663c2561..04122b17d 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -62,7 +62,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) } // Get party information. - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; @@ -158,7 +158,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility) return FALSE; - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; @@ -353,7 +353,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) battlerIn2 = gActiveBattler; } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if ((gActiveBattler & BIT_FLANK) == 0) firstId = 0, lastId = 3; @@ -464,7 +464,7 @@ static bool8 ShouldSwitch(void) battlerIn2 = *activeBattlerPtr; } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; @@ -555,7 +555,7 @@ void AI_TrySwitchOrUseItem(void) battlerIn2 = GetBattlerAtPosition(battlerIdentity ^ BIT_FLANK); } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; @@ -661,7 +661,7 @@ u8 GetMostSuitableMonToSwitchInto(void) battlerIn2 = gActiveBattler; } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; @@ -789,7 +789,7 @@ static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u else if (itemEffect[0] & (ITEM0_DIRE_HIT | ITEM0_X_ATTACK) || itemEffect[1] != 0 || itemEffect[2] != 0) return AI_ITEM_X_STAT; else if (itemEffect[3] & ITEM3_GUARD_SPEC) - return AI_ITEM_GUARD_SPECS; + return AI_ITEM_GUARD_SPEC; else return AI_ITEM_NOT_RECOGNIZABLE; } @@ -863,32 +863,33 @@ static bool8 ShouldUseItem(void) *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0; if (itemEffects[3] & ITEM3_SLEEP && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) { - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_HEAL_SLEEP); shouldUse = TRUE; } - if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON)) + if (itemEffects[3] & ITEM3_POISON && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON + || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON)) { - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_HEAL_POISON); shouldUse = TRUE; } if (itemEffects[3] & ITEM3_BURN && gBattleMons[gActiveBattler].status1 & STATUS1_BURN) { - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_HEAL_BURN); shouldUse = TRUE; } if (itemEffects[3] & ITEM3_FREEZE && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE) { - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_HEAL_FREEZE); shouldUse = TRUE; } if (itemEffects[3] & ITEM3_PARALYSIS && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS) { - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_HEAL_PARALYSIS); shouldUse = TRUE; } if (itemEffects[3] & ITEM3_CONFUSION && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION) { - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_HEAL_CONFUSION); shouldUse = TRUE; } break; @@ -897,20 +898,20 @@ static bool8 ShouldUseItem(void) if (gDisableStructs[gActiveBattler].isFirstTurn == 0) break; if (itemEffects[0] & ITEM0_X_ATTACK) - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_X_ATTACK); if (itemEffects[1] & ITEM1_X_DEFEND) - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_X_DEFEND); if (itemEffects[1] & ITEM1_X_SPEED) - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_X_SPEED); if (itemEffects[2] & ITEM2_X_SPATK) - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_X_SPATK); if (itemEffects[2] & ITEM2_X_ACCURACY) - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_X_ACCURACY); if (itemEffects[0] & ITEM0_DIRE_HIT) - *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80; + *(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= (1 << AI_DIRE_HIT); shouldUse = TRUE; break; - case AI_ITEM_GUARD_SPECS: + case AI_ITEM_GUARD_SPEC: battlerSide = GetBattlerSide(gActiveBattler); if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[battlerSide].mistTimer == 0) shouldUse = TRUE; diff --git a/src/battle_anim.c b/src/battle_anim.c index 874ac935b..a10b20b55 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1814,8 +1814,8 @@ void ClearBattleAnimationVars(void) for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; - sMonAnimTaskIdArray[0] = 0xFF; - sMonAnimTaskIdArray[1] = 0xFF; + sMonAnimTaskIdArray[0] = TASK_NONE; + sMonAnimTaskIdArray[1] = TASK_NONE; gAnimMoveTurn = 0; sAnimBackgroundFadeState = 0; sAnimMoveIndex = 0; @@ -1861,8 +1861,8 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; - sMonAnimTaskIdArray[0] = 0xFF; - sMonAnimTaskIdArray[1] = 0xFF; + sMonAnimTaskIdArray[0] = TASK_NONE; + sMonAnimTaskIdArray[1] = TASK_NONE; sBattleAnimScriptPtr = animsTable[tableId]; gAnimScriptActive = TRUE; gAnimFramesToWait = 0; @@ -2106,7 +2106,7 @@ static void ScriptCmd_end(void) // Keep waiting as long as there are animations to be done. if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 - || sMonAnimTaskIdArray[0] != 0xFF || sMonAnimTaskIdArray[1] != 0xFF) + || sMonAnimTaskIdArray[0] != TASK_NONE || sMonAnimTaskIdArray[1] != TASK_NONE) { sSoundAnimFramesToWait = 0; gAnimFramesToWait = 1; @@ -2300,7 +2300,7 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) RequestDma3Fill(0xFF, (void*)(BG_SCREEN_ADDR(28)), 0x1000, 0); } - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); CpuFill16(0, animBg.bgTiles, 0x1000); CpuFill16(0xFF, animBg.bgTilemap, 0x800); @@ -2338,7 +2338,7 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) { RequestDma3Fill(0, (void*)(BG_SCREEN_ADDR(12)), 0x2000, 1); RequestDma3Fill(0, (void*)(BG_SCREEN_ADDR(30)), 0x1000, 1); - sub_80A6B90(&animBg, 2); + GetBattleAnimBgData(&animBg, 2); CpuFill16(0, animBg.bgTiles + 0x1000, 0x1000); CpuFill16(0, animBg.bgTilemap + 0x400, 0x800); SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); @@ -2371,7 +2371,7 @@ static void sub_80A46A0(void) if (IsSpeciesNotUnown(gContestResources->moveAnim->species)) { - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); ptr = animBg.bgTilemap; for (i = 0; i < 8; i++) { @@ -2408,20 +2408,20 @@ void sub_80A4720(u16 a, u16 *b, u32 c, u8 d) } } -void sub_80A477C(bool8 to_BG2) +void ResetBattleAnimBg(bool8 toBG2) { struct BattleAnimBgData animBg; - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); - if (!to_BG2 || IsContest()) + if (!toBG2 || IsContest()) { - sub_80A6C68(1); + ClearBattleAnimBg(1); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; } else { - sub_80A6C68(2); + ClearBattleAnimBg(2); gBattle_BG2_X = 0; gBattle_BG2_Y = 0; } @@ -2435,7 +2435,7 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) spriteId = gTasks[taskId].data[0]; palIndex = gTasks[taskId].data[6]; - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); x = gTasks[taskId].data[1] - (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x); y = gTasks[taskId].data[2] - (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y); @@ -2482,9 +2482,9 @@ static void ScriptCmd_clearmonbg(void) else battlerId = gBattleAnimTarget; - if (sMonAnimTaskIdArray[0] != 0xFF) + if (sMonAnimTaskIdArray[0] != TASK_NONE) gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; - if (animBattlerId > 1 && sMonAnimTaskIdArray[1] != 0xFF) + if (animBattlerId > 1 && sMonAnimTaskIdArray[1] != TASK_NONE) gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = FALSE; else animBattlerId = 0; @@ -2508,17 +2508,17 @@ static void sub_80A4980(u8 taskId) else to_BG2 = TRUE; - if (sMonAnimTaskIdArray[0] != 0xFF) + if (sMonAnimTaskIdArray[0] != TASK_NONE) { - sub_80A477C(to_BG2); + ResetBattleAnimBg(to_BG2); DestroyTask(sMonAnimTaskIdArray[0]); - sMonAnimTaskIdArray[0] = 0xFF; + sMonAnimTaskIdArray[0] = TASK_NONE; } if (gTasks[taskId].data[0] > 1) { - sub_80A477C(to_BG2 ^ 1); + ResetBattleAnimBg(to_BG2 ^ 1); DestroyTask(sMonAnimTaskIdArray[1]); - sMonAnimTaskIdArray[1] = 0xFF; + sMonAnimTaskIdArray[1] = TASK_NONE; } DestroyTask(taskId); } @@ -2617,9 +2617,9 @@ static void sub_80A4BB0(u8 taskId) toBG_2 = TRUE; if (IsBattlerSpriteVisible(battlerId)) - sub_80A477C(toBG_2); + ResetBattleAnimBg(toBG_2); if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK)) - sub_80A477C(toBG_2 ^ 1); + ResetBattleAnimBg(toBG_2 ^ 1); DestroyTask(taskId); } @@ -3362,7 +3362,7 @@ static void ScriptCmd_invisible(void) u8 spriteId; spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) gSprites[spriteId].invisible = TRUE; sBattleAnimScriptPtr += 2; @@ -3373,7 +3373,7 @@ static void ScriptCmd_visible(void) u8 spriteId; spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) gSprites[spriteId].invisible = FALSE; sBattleAnimScriptPtr += 2; @@ -3400,16 +3400,16 @@ static void ScriptCmd_doublebattle_2D(void) r4 = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget); spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); } - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) { gSprites[spriteId].invisible = FALSE; if (r4 == 2) gSprites[spriteId].oam.priority = 3; if (r4 == 1) - sub_80A477C(FALSE); + ResetBattleAnimBg(FALSE); else - sub_80A477C(TRUE); + ResetBattleAnimBg(TRUE); } } } @@ -3436,7 +3436,7 @@ static void ScriptCmd_doublebattle_2E(void) spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); } - if (spriteId != 0xFF && r4 == 2) + if (spriteId != SPRITE_NONE && r4 == 2) gSprites[spriteId].oam.priority = 2; } } diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index b8aba8976..9d9952979 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -274,7 +274,7 @@ static void AnimTranslateWebThread(struct Sprite *sprite) SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]); } - sub_80A6FD4(sprite); + InitAnimLinearTranslationWithSpeed(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimTranslateWebThread_Step; } diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 7253b5247..c2bfe269b 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -9,24 +9,24 @@ #include "util.h" #include "constants/rgb.h" -static void sub_81138D4(struct Sprite *); +static void AnimUnusedBagSteal(struct Sprite *); +static void AnimUnusedBagSteal_Step(struct Sprite *); static void AnimBite(struct Sprite *); static void AnimTearDrop(struct Sprite *); static void AnimClawSlash(struct Sprite *); static void AnimTask_AttackerFadeToInvisible_Step(u8); static void AnimTask_AttackerFadeFromInvisible_Step(u8); -static void sub_8113950(struct Sprite *); static void AnimBite_Step1(struct Sprite *); static void AnimBite_Step2(struct Sprite *); static void AnimTearDrop_Step(struct Sprite *); static void AnimTask_MoveAttackerMementoShadow_Step(u8); static void AnimTask_MoveTargetMementoShadow_Step(u8); -static void sub_8114244(struct Task *); -static void sub_8114374(u8); +static void DoMementoShadowEffect(struct Task *); +static void SetAllBattlersSpritePriority(u8); static void AnimTask_MetallicShine_Step(u8); // Unused -const struct SpriteTemplate gUnknown_08596FC8 = +static const struct SpriteTemplate sUnusedBagStealSpriteTemplate = { .tileTag = ANIM_TAG_TIED_BAG, .paletteTag = ANIM_TAG_TIED_BAG, @@ -34,7 +34,7 @@ const struct SpriteTemplate gUnknown_08596FC8 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81138D4, + .callback = AnimUnusedBagSteal, }; static const union AffineAnimCmd sAffineAnim_Bite_0[] = @@ -268,7 +268,7 @@ void AnimTask_InitAttackerFadeFromInvisible(u8 taskId) DestroyAnimVisualTask(taskId); } -static void sub_81138D4(struct Sprite *sprite) +static void AnimUnusedBagSteal(struct Sprite *sprite) { sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); @@ -279,11 +279,11 @@ static void sub_81138D4(struct Sprite *sprite) sprite->data[3] = -sprite->data[1]; sprite->data[4] = -sprite->data[2]; sprite->data[6] = 0xFFD8; - sprite->callback = sub_8113950; + sprite->callback = AnimUnusedBagSteal_Step; sprite->callback(sprite); } -static void sub_8113950(struct Sprite *sprite) +static void AnimUnusedBagSteal_Step(struct Sprite *sprite) { sprite->data[3] += sprite->data[1]; sprite->data[4] += sprite->data[2]; @@ -423,14 +423,14 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); if (task->data[3] == 1) { - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); task->data[10] = gBattle_BG1_Y; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); FillPalette(0, animBg.paletteId * 16, 32); scanlineParams.dmaDest = ®_BG1VOFS; var0 = WINOUT_WIN01_BG1; if (!IsContest()) - gBattle_BG2_X += 240; + gBattle_BG2_X += DISPLAY_WIDTH; } else { @@ -440,7 +440,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) scanlineParams.dmaDest = ®_BG2VOFS; var0 = WINOUT_WIN01_BG2; if (!IsContest()) - gBattle_BG1_X += 240; + gBattle_BG1_X += DISPLAY_WIDTH; } scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; @@ -451,7 +451,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; - sub_8114374(3); + SetAllBattlersSpritePriority(3); for (i = 0; i < 112; i++) { gScanlineEffectRegBuffers[0][i] = task->data[10]; @@ -462,7 +462,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR))); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; - gBattle_WIN0V = 160; + gBattle_WIN0V = DISPLAY_HEIGHT; task->func = AnimTask_MoveAttackerMementoShadow_Step; } @@ -496,14 +496,14 @@ static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId) break; case 1: task->data[4] -= 8; - sub_8114244(task); + DoMementoShadowEffect(task); if (task->data[4] < task->data[8]) task->data[0]++; break; case 2: task->data[4] -= 8; - sub_8114244(task); + DoMementoShadowEffect(task); task->data[14] += 4; task->data[15] -= 4; @@ -550,12 +550,12 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) if (task->data[3] == 1) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); - gBattle_BG2_X += 240; + gBattle_BG2_X += DISPLAY_WIDTH; } else { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); - gBattle_BG1_X += 240; + gBattle_BG1_X += DISPLAY_WIDTH; } task->data[0]++; @@ -564,7 +564,7 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) case 1: if (task->data[3] == 1) { - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); task->data[10] = gBattle_BG1_Y; FillPalette(0, animBg.paletteId * 16, 32); } @@ -574,7 +574,7 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) FillPalette(0, 9 * 16, 32); } - sub_8114374(3); + SetAllBattlersSpritePriority(3); task->data[0]++; break; case 2: @@ -622,7 +622,7 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; - gBattle_WIN0V = 160; + gBattle_WIN0V = DISPLAY_HEIGHT; task->data[0] = 0; task->data[1] = 0; @@ -644,7 +644,7 @@ static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) if (task->data[5] >= task->data[7]) task->data[5] = task->data[7]; - sub_8114244(task); + DoMementoShadowEffect(task); if (task->data[5] == task->data[7]) task->data[0]++; break; @@ -664,7 +664,7 @@ static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) if (task->data[4] >= task->data[6]) task->data[4] = task->data[6]; - sub_8114244(task); + DoMementoShadowEffect(task); if (task->data[4] == task->data[6] && task->data[1]) { task->data[1] = 0; @@ -706,7 +706,7 @@ static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) } } -static void sub_8114244(struct Task *task) +static void DoMementoShadowEffect(struct Task *task) { int var0, var1; s16 var2; @@ -757,14 +757,14 @@ static void sub_8114244(struct Task *task) } } -static void sub_8114374(u8 priority) +static void SetAllBattlersSpritePriority(u8 priority) { u16 i; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { u8 spriteId = GetAnimBattlerSpriteId(i); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) gSprites[spriteId].oam.priority = priority; } } @@ -787,10 +787,10 @@ void AnimTask_InitMementoShadow(u8 taskId) void sub_8114470(u8 taskId) { u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0; - sub_80A477C(toBG2); + ResetBattleAnimBg(toBG2); if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) - sub_80A477C(toBG2 ^ 1); + ResetBattleAnimBg(toBG2 ^ 1); DestroyAnimVisualTask(taskId); } @@ -858,9 +858,9 @@ void AnimTask_MetallicShine(u8 taskId) } spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - newSpriteId = sub_80A89C8(gBattleAnimAttacker, spriteId, species); + newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset); LoadCompressedPalette(gMetalShinePalette, animBg.paletteId * 16, 32); @@ -903,8 +903,8 @@ static void AnimTask_MetallicShine_Step(u8 taskId) SetGreyscaleOrOriginalPalette(paletteNum, TRUE); DestroySprite(&gSprites[gTasks[taskId].data[0]]); - sub_80A6B30(&animBg); - sub_80A6C68(animBg.bgId); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(animBg.bgId); if (gTasks[taskId].data[6] == 1) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++; } @@ -960,7 +960,7 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId) calcSpriteId = TRUE; break; default: - spriteId = 0xFF; + spriteId = SPRITE_NONE; break; } @@ -970,10 +970,10 @@ void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId) if (IsBattlerSpriteVisible(battler)) spriteId = gBattlerSpriteIds[battler]; else - spriteId = 0xFF; + spriteId = SPRITE_NONE; } - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); DestroyAnimVisualTask(taskId); diff --git a/src/battle_anim_dragon.c b/src/battle_anim_dragon.c index 1d426cac7..caafdf3b8 100644 --- a/src/battle_anim_dragon.c +++ b/src/battle_anim_dragon.c @@ -13,11 +13,11 @@ static void AnimDragonDanceOrb_Step(struct Sprite *); static void AnimOverheatFlame(struct Sprite *); static void AnimOverheatFlame_Step(struct Sprite *); static void AnimTask_DragonDanceWaver_Step(u8); -static void sub_8113574(struct Task *); +static void UpdateDragonDanceScanlineEffect(struct Task *); -EWRAM_DATA static u16 gUnknown_0203A100[7] = {0}; +EWRAM_DATA static u16 gUnusedOverheatData[7] = {0}; -static const union AnimCmd gUnknown_08596E60[] = +static const union AnimCmd sAnim_OutrageOverheatFire_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), @@ -27,9 +27,9 @@ static const union AnimCmd gUnknown_08596E60[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_08596E78[] = +static const union AnimCmd *const sAnims_OutrageOverheatFire[] = { - gUnknown_08596E60, + sAnim_OutrageOverheatFire_0, }; const struct SpriteTemplate gOutrageFlameSpriteTemplate = @@ -37,7 +37,7 @@ const struct SpriteTemplate gOutrageFlameSpriteTemplate = .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_08596E78, + .anims = sAnims_OutrageOverheatFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOutrageFlame, @@ -181,7 +181,7 @@ const struct SpriteTemplate gOverheatFlameSpriteTemplate = .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_08596E78, + .anims = sAnims_OutrageOverheatFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOverheatFlame, @@ -212,7 +212,7 @@ static void AnimOutrageFlame(struct Sprite *sprite) sprite->callback = TranslateSpriteLinearAndFlicker; } -static void sub_8113100(struct Sprite *sprite) +static void StartDragonFireTranslation(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); @@ -263,7 +263,7 @@ static void AnimDragonFireToTarget(struct Sprite *sprite) if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) StartSpriteAffineAnim(sprite, 1); - sub_8113100(sprite); + StartDragonFireTranslation(sprite); } static void AnimDragonDanceOrb(struct Sprite *sprite) @@ -328,27 +328,27 @@ static void AnimDragonDanceOrb_Step(struct Sprite *sprite) // Used by Dragon Dance void AnimTask_DragonDanceWaver(u8 taskId) { - struct ScanlineEffectParams sp; + struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; u16 i; - u8 r1; + u8 y; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) { - sp.dmaDest = ®_BG1HOFS; + scanlineParams.dmaDest = ®_BG1HOFS; task->data[2] = gBattle_BG1_X; } else { - sp.dmaDest = ®_BG2HOFS; + scanlineParams.dmaDest = ®_BG2HOFS; task->data[2] = gBattle_BG2_X; } - sp.dmaControl = 0xA2600001; - sp.initState = 1; - sp.unused9 = 0; - r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); - task->data[3] = r1 - 32; - task->data[4] = r1 + 32; + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; + scanlineParams.initState = 1; + scanlineParams.unused9 = 0; + y = GetBattlerYCoordWithElevation(gBattleAnimAttacker); + task->data[3] = y - 32; + task->data[4] = y + 32; if (task->data[3] < 0) task->data[3] = 0; @@ -358,7 +358,7 @@ void AnimTask_DragonDanceWaver(u8 taskId) gScanlineEffectRegBuffers[1][i] = task->data[2]; } - ScanlineEffect_SetParams(sp); + ScanlineEffect_SetParams(scanlineParams); task->func = AnimTask_DragonDanceWaver_Step; } @@ -374,12 +374,12 @@ static void AnimTask_DragonDanceWaver_Step(u8 taskId) if (++task->data[6] == 3) task->data[0]++; } - sub_8113574(task); + UpdateDragonDanceScanlineEffect(task); break; case 1: if (++task->data[1] > 0x3C) task->data[0]++; - sub_8113574(task); + UpdateDragonDanceScanlineEffect(task); break; case 2: if (++task->data[7] > 1) @@ -388,7 +388,7 @@ static void AnimTask_DragonDanceWaver_Step(u8 taskId) if (--task->data[6] == 0) task->data[0]++; } - sub_8113574(task); + UpdateDragonDanceScanlineEffect(task); break; case 3: gScanlineEffect.state = 3; @@ -400,14 +400,14 @@ static void AnimTask_DragonDanceWaver_Step(u8 taskId) } } -static void sub_8113574(struct Task *task) +static void UpdateDragonDanceScanlineEffect(struct Task *task) { - u16 r3 = task->data[5]; + u16 sineIndex = task->data[5]; u16 i; for (i = task->data[3]; i <= task->data[4]; i++) { - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[r3] * task->data[6]) >> 7) + task->data[2]; - r3 = (r3 + 8) & 0xFF; + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[sineIndex] * task->data[6]) >> 7) + task->data[2]; + sineIndex = (sineIndex + 8) & 0xFF; } task->data[5] = (task->data[5] + 9) & 0xFF; @@ -415,18 +415,18 @@ static void sub_8113574(struct Task *task) static void AnimOverheatFlame(struct Sprite *sprite) { - int r6 = (gBattleAnimArgs[2] * 3) / 5; int i; + int yAmplitude = (gBattleAnimArgs[2] * 3) / 5; sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[4]; sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]); - sprite->data[2] = Sin(gBattleAnimArgs[1], r6); + sprite->data[2] = Sin(gBattleAnimArgs[1], yAmplitude); sprite->pos1.x += sprite->data[1] * gBattleAnimArgs[0]; sprite->pos1.y += sprite->data[2] * gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[3]; sprite->callback = AnimOverheatFlame_Step; for (i = 0; i < 7; i++) - gUnknown_0203A100[i] = sprite->data[i]; + gUnusedOverheatData[i] = sprite->data[i]; } static void AnimOverheatFlame_Step(struct Sprite *sprite) diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 04bab2f85..9901aa5dd 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -16,7 +16,12 @@ #include "constants/rgb.h" #include "constants/songs.h" -EWRAM_DATA s16 gUnknown_0203A0F8[4] = {0}; +struct { + s16 startX; + s16 startY; + s16 targetX; + s16 targetY; +} static EWRAM_DATA sFrenzyPlantRootData = {0}; // Debug? Written to but never read. static void AnimMovePowderParticle(struct Sprite *); static void AnimMovePowderParticle_Step(struct Sprite *); @@ -65,14 +70,14 @@ static void AnimFlyingParticle(struct Sprite *); static void AnimFlyingParticle_Step(struct Sprite *); static void AnimNeedleArmSpike(struct Sprite *); static void AnimNeedleArmSpike_Step(struct Sprite *); -static void sub_81009F8(struct Sprite *); +static void AnimSlidingHit(struct Sprite *); static void AnimWhipHit(struct Sprite *); -static void sub_8100A94(struct Sprite *); +static void AnimFlickeringPunch(struct Sprite *); static void AnimCuttingSlice(struct Sprite *); static void AnimAirCutterSlice(struct Sprite *); static void AnimSlice_Step(struct Sprite *); -static void sub_8100E1C(struct Sprite *); -static void sub_8100E80(struct Sprite *); +static void AnimCirclingMusicNote(struct Sprite *); +static void AnimCirclingMusicNote_Step(struct Sprite *); static void AnimProtect(struct Sprite *); static void AnimProtect_Step(struct Sprite *); static void AnimMilkBottle(struct Sprite *); @@ -80,8 +85,8 @@ static void AnimMilkBottle_Step1(struct Sprite *); static void AnimMilkBottle_Step2(struct Sprite *, int, int); static void AnimGrantingStars(struct Sprite *); static void AnimSparkingStars(struct Sprite *); -static void sub_8101440(struct Sprite *); -static void sub_81014A0(struct Sprite *); +static void AnimBubbleBurst(struct Sprite *); +static void AnimBubbleBurst_Step(struct Sprite *); static void AnimSleepLetterZ(struct Sprite *); static void AnimSleepLetterZ_Step(struct Sprite *); static void AnimLockOnTarget(struct Sprite *); @@ -99,8 +104,8 @@ static void AnimBowMon_Step2(struct Sprite *); static void AnimBowMon_Step3(struct Sprite *); static void AnimBowMon_Step4(struct Sprite *); static void AnimBowMon_Step3_Callback(struct Sprite *); -static void sub_8101B90(struct Sprite *); -static void sub_8101BA0(struct Sprite *); +static void AnimTipMon(struct Sprite *); +static void AnimTipMon_Step(struct Sprite *); static void AnimSlashSlice(struct Sprite *); static void AnimFalseSwipeSlice(struct Sprite *); static void AnimFalseSwipeSlice_Step1(struct Sprite *); @@ -571,7 +576,7 @@ const struct SpriteTemplate gSwiftStarSpriteTemplate = .callback = AnimTranslateLinearSingleSineWave, }; -const union AnimCmd gConstrictBindingAnimCmds1[] = +static const union AnimCmd sAnim_ConstrictBinding[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(32, 4), @@ -580,7 +585,7 @@ const union AnimCmd gConstrictBindingAnimCmds1[] = ANIMCMD_END, }; -const union AnimCmd gConstrictBindingAnimCmds2[] = +static const union AnimCmd sAnim_ConstrictBinding_Flipped[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .hFlip = TRUE), @@ -589,29 +594,29 @@ const union AnimCmd gConstrictBindingAnimCmds2[] = ANIMCMD_END, }; -const union AnimCmd *const gConstrictBindingAnimTable[] = +static const union AnimCmd *const sAnims_ConstrictBinding[] = { - gConstrictBindingAnimCmds1, - gConstrictBindingAnimCmds2, + sAnim_ConstrictBinding, + sAnim_ConstrictBinding_Flipped, }; -const union AffineAnimCmd gConstrictBindingAffineAnimCmds1[] = { +static const union AffineAnimCmd sAffineAnim_ConstrictBinding[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-11, 0, 0, 6), AFFINEANIMCMD_FRAME(11, 0, 0, 6), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gConstrictBindingAffineAnimCmds2[] = { +static const union AffineAnimCmd sAffineAnim_ConstrictBinding_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(11, 0, 0, 6), AFFINEANIMCMD_FRAME(-11, 0, 0, 6), AFFINEANIMCMD_END, }; -const union AffineAnimCmd *const gConstrictBindingAffineAnimTable[] = { - gConstrictBindingAffineAnimCmds1, - gConstrictBindingAffineAnimCmds2, +static const union AffineAnimCmd *const sAffineAnims_ConstrictBinding[] = { + sAffineAnim_ConstrictBinding, + sAffineAnim_ConstrictBinding_Flipped, }; const struct SpriteTemplate gConstrictBindingSpriteTemplate = @@ -619,9 +624,9 @@ const struct SpriteTemplate gConstrictBindingSpriteTemplate = .tileTag = ANIM_TAG_TENDRILS, .paletteTag = ANIM_TAG_TENDRILS, .oam = &gOamData_AffineNormal_ObjNormal_64x32, - .anims = gConstrictBindingAnimTable, + .anims = sAnims_ConstrictBinding, .images = NULL, - .affineAnims = gConstrictBindingAffineAnimTable, + .affineAnims = sAffineAnims_ConstrictBinding, .callback = AnimConstrictBinding, }; @@ -1060,7 +1065,7 @@ const struct SpriteTemplate gNeedleArmSpikeSpriteTemplate = .callback = AnimNeedleArmSpike, }; -const union AnimCmd gWhipAnimCmds1[] = +static const union AnimCmd sAnim_Whip[] = { ANIMCMD_FRAME(64, 3), ANIMCMD_FRAME(80, 3), @@ -1069,7 +1074,7 @@ const union AnimCmd gWhipAnimCmds1[] = ANIMCMD_END, }; -const union AnimCmd gWhipAnimCmds2[] = +static const union AnimCmd sAnim_Whip_Flipped[] = { ANIMCMD_FRAME(64, 3, .hFlip = TRUE), ANIMCMD_FRAME(80, 3, .hFlip = TRUE), @@ -1078,10 +1083,10 @@ const union AnimCmd gWhipAnimCmds2[] = ANIMCMD_END, }; -const union AnimCmd *const gWhipAnimTable[] = +static const union AnimCmd *const sAnims_Whip[] = { - gWhipAnimCmds1, - gWhipAnimCmds2, + sAnim_Whip, + sAnim_Whip_Flipped, }; const struct SpriteTemplate gSlamHitSpriteTemplate = @@ -1089,7 +1094,7 @@ const struct SpriteTemplate gSlamHitSpriteTemplate = .tileTag = ANIM_TAG_SLAM_HIT, .paletteTag = ANIM_TAG_SLAM_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gWhipAnimTable, + .anims = sAnims_Whip, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWhipHit, @@ -1100,13 +1105,13 @@ const struct SpriteTemplate gVineWhipSpriteTemplate = .tileTag = ANIM_TAG_WHIP_HIT, .paletteTag = ANIM_TAG_WHIP_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gWhipAnimTable, + .anims = sAnims_Whip, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWhipHit, }; -const union AnimCmd gUnknown_08592900[] = +static const union AnimCmd sAnim_SlidingHit[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), @@ -1116,96 +1121,96 @@ const union AnimCmd gUnknown_08592900[] = ANIMCMD_END, }; -const union AnimCmd *const gUnknown_08592918[] = +static const union AnimCmd *const sAnims_SlidingHit[] = { - gUnknown_08592900, + sAnim_SlidingHit, }; // Unused -const struct SpriteTemplate gUnknown_0859291C = +static const struct SpriteTemplate sSlidingHit1SpriteTemplate = { .tileTag = ANIM_TAG_HIT, .paletteTag = ANIM_TAG_HIT, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_08592918, + .anims = sAnims_SlidingHit, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81009F8, + .callback = AnimSlidingHit, }; // Unused -const struct SpriteTemplate gUnknown_08592934 = +static const struct SpriteTemplate sSlidingHit2SpriteTemplate = { .tileTag = ANIM_TAG_HIT_2, .paletteTag = ANIM_TAG_HIT_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_08592918, + .anims = sAnims_SlidingHit, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81009F8, + .callback = AnimSlidingHit, }; -const union AffineAnimCmd gUnknown_0859294C[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_Normal[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_0859295C[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedTopLeft[] = { AFFINEANIMCMD_FRAME(256, 256, 32, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_0859296C[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedLeft[] = { AFFINEANIMCMD_FRAME(256, 256, 64, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_0859297C[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedBottomLeft[] = { AFFINEANIMCMD_FRAME(256, 256, 96, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_0859298C[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_UpsideDown[] = { AFFINEANIMCMD_FRAME(256, 256, -128, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_0859299C[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedBottomRight[] = { AFFINEANIMCMD_FRAME(256, 256, -96, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_085929AC[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedRight[] = { AFFINEANIMCMD_FRAME(256, 256, -64, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gUnknown_085929BC[] = { +static const union AffineAnimCmd sAffineAnim_FlickeringPunch_TurnedTopRight[] = { AFFINEANIMCMD_FRAME(256, 256, -32, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd *const gUnknown_085929CC[] = { - gUnknown_0859294C, - gUnknown_0859295C, - gUnknown_0859296C, - gUnknown_0859297C, - gUnknown_0859298C, - gUnknown_0859299C, - gUnknown_085929AC, - gUnknown_085929BC, +static const union AffineAnimCmd *const sAffineAnims_FlickeringPunch[] = { + sAffineAnim_FlickeringPunch_Normal, + sAffineAnim_FlickeringPunch_TurnedTopLeft, + sAffineAnim_FlickeringPunch_TurnedLeft, + sAffineAnim_FlickeringPunch_TurnedBottomLeft, + sAffineAnim_FlickeringPunch_UpsideDown, + sAffineAnim_FlickeringPunch_TurnedBottomRight, + sAffineAnim_FlickeringPunch_TurnedRight, + sAffineAnim_FlickeringPunch_TurnedTopRight, }; // Unused -const struct SpriteTemplate gUnknown_085929EC = +static const struct SpriteTemplate sFlickeringPunchSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gUnknown_085929CC, - .callback = sub_8100A94, + .affineAnims = sAffineAnims_FlickeringPunch, + .callback = AnimFlickeringPunch, }; const union AnimCmd gCuttingSliceAnimCmds[] = @@ -1244,90 +1249,90 @@ const struct SpriteTemplate gAirCutterSliceSpriteTemplate = .callback = AnimAirCutterSlice, }; -const union AnimCmd gUnknown_08592A4C[] = +static const union AnimCmd sAnim_CirclingMusicNote_Eighth[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A54[] = +static const union AnimCmd sAnim_CirclingMusicNote_BeamedEighth[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A5C[] = +static const union AnimCmd sAnim_CirclingMusicNote_SlantedBeamedEighth[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A64[] = +static const union AnimCmd sAnim_CirclingMusicNote_Quarter[] = { ANIMCMD_FRAME(12, 1), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A6C[] = +static const union AnimCmd sAnim_CirclingMusicNote_QuarterRest[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A74[] = +static const union AnimCmd sAnim_CirclingMusicNote_EighthRest[] = { ANIMCMD_FRAME(20, 1), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A7C[] = +static const union AnimCmd sAnim_CirclingMusicNote_Eighth_Flipped[] = { ANIMCMD_FRAME(0, 1, .vFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A84[] = +static const union AnimCmd sAnim_CirclingMusicNote_BeamedEighth_Flipped[] = { ANIMCMD_FRAME(4, 1, .vFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A8C[] = +static const union AnimCmd sAnim_CirclingMusicNote_SlantedBeamedEighth_Flipped[] = { ANIMCMD_FRAME(8, 1, .vFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gUnknown_08592A94[] = +static const union AnimCmd sAnim_CirclingMusicNote_Quarter_Flipped[] = { ANIMCMD_FRAME(12, 1, .vFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd *const gUnknown_08592A9C[] = +static const union AnimCmd *const sAnims_CirclingMusicNote[] = { - gUnknown_08592A4C, - gUnknown_08592A54, - gUnknown_08592A5C, - gUnknown_08592A64, - gUnknown_08592A6C, - gUnknown_08592A74, - gUnknown_08592A7C, - gUnknown_08592A84, - gUnknown_08592A8C, - gUnknown_08592A94, + sAnim_CirclingMusicNote_Eighth, + sAnim_CirclingMusicNote_BeamedEighth, + sAnim_CirclingMusicNote_SlantedBeamedEighth, + sAnim_CirclingMusicNote_Quarter, + sAnim_CirclingMusicNote_QuarterRest, + sAnim_CirclingMusicNote_EighthRest, + sAnim_CirclingMusicNote_Eighth_Flipped, + sAnim_CirclingMusicNote_BeamedEighth_Flipped, + sAnim_CirclingMusicNote_SlantedBeamedEighth_Flipped, + sAnim_CirclingMusicNote_Quarter_Flipped, }; // Unused -const struct SpriteTemplate gUnknown_08592AC4 = +static const struct SpriteTemplate sCirclingMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = gUnknown_08592A9C, + .anims = sAnims_CirclingMusicNote, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8100E1C, + .callback = AnimCirclingMusicNote, }; const struct SpriteTemplate gProtectSpriteTemplate = @@ -1414,7 +1419,7 @@ const struct SpriteTemplate gSparklingStarsSpriteTemplate = .callback = AnimSparkingStars, }; -const union AnimCmd gUnknown_08592BAC[] = +static const union AnimCmd sAnim_BubbleBurst[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_FRAME(4, 10), @@ -1427,7 +1432,7 @@ const union AnimCmd gUnknown_08592BAC[] = ANIMCMD_END, }; -const union AnimCmd gUnknown_08592BD0[] = +static const union AnimCmd sAnim_BubbleBurst_Flipped[] = { ANIMCMD_FRAME(0, 10, .hFlip = TRUE), ANIMCMD_FRAME(4, 10, .hFlip = TRUE), @@ -1440,22 +1445,22 @@ const union AnimCmd gUnknown_08592BD0[] = ANIMCMD_END, }; -const union AnimCmd *const gUnknown_08592BF4[] = +static const union AnimCmd *const sAnims_BubbleBurst[] = { - gUnknown_08592BAC, - gUnknown_08592BD0, + sAnim_BubbleBurst, + sAnim_BubbleBurst_Flipped, }; // Unused -const struct SpriteTemplate gUnknown_08592BFC = +static const struct SpriteTemplate sBubbleBurstSpriteTemplate = { .tileTag = ANIM_TAG_BUBBLE_BURST, .paletteTag = ANIM_TAG_BUBBLE_BURST, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = gUnknown_08592BF4, + .anims = sAnims_BubbleBurst, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8101440, + .callback = AnimBubbleBurst, }; const union AnimCmd gSleepLetterZAnimCmds[] = @@ -1556,7 +1561,8 @@ const struct SpriteTemplate gBowMonSpriteTemplate = }; // Unused -const struct SpriteTemplate gUnknown_08592CF0 = +// Same as BowMon above but without backing up +static const struct SpriteTemplate sTipMonSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -1564,7 +1570,7 @@ const struct SpriteTemplate gUnknown_08592CF0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8101B90, + .callback = AnimTipMon, }; const union AnimCmd gSlashSliceAnimCmds1[] = @@ -2684,9 +2690,9 @@ static void AnimTranslateLinearSingleSineWave_Step(struct Sprite* sprite) destroy = TRUE; } - if (sprite->pos1.x + sprite->pos2.x > 256 + if (sprite->pos1.x + sprite->pos2.x > DISPLAY_WIDTH + 16 || sprite->pos1.x + sprite->pos2.x < -16 - || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT || sprite->pos1.y + sprite->pos2.y < -16) destroy = TRUE; @@ -2940,10 +2946,10 @@ static void AnimFrenzyPlantRoot(struct Sprite *sprite) StartSpriteAnim(sprite, gBattleAnimArgs[4]); sprite->data[2] = gBattleAnimArgs[5]; sprite->callback = AnimRootFlickerOut; - gUnknown_0203A0F8[0] = sprite->pos1.x; - gUnknown_0203A0F8[1] = sprite->pos1.y; - gUnknown_0203A0F8[2] = targetX; - gUnknown_0203A0F8[3] = targetY; + sFrenzyPlantRootData.startX = sprite->pos1.x; + sFrenzyPlantRootData.startY = sprite->pos1.y; + sFrenzyPlantRootData.targetX = targetX; + sFrenzyPlantRootData.targetY = targetY; } static void AnimRootFlickerOut(struct Sprite* sprite) @@ -2979,7 +2985,7 @@ static void AnimIngrainOrb(struct Sprite* sprite) DestroyAnimSprite(sprite); } -static void sub_80FF9B8(struct Sprite* sprite, s16 c) +static void InitItemBagData(struct Sprite* sprite, s16 c) { int a = (sprite->pos1.x << 8) | sprite->pos1.y; int b = (sprite->data[6] << 8) | sprite->data[7]; @@ -3005,7 +3011,7 @@ bool8 moveAlongLinearPath(struct Sprite* sprite) if (xEndPos == 0) xEndPos = -32; else if (xEndPos == 255) - xEndPos = 272; + xEndPos = DISPLAY_WIDTH + 32; yEndPos_2 = yEndPos - yStartPos; r0 = xEndPos - xStartPos; @@ -3059,14 +3065,14 @@ static void AnimPresent(struct Sprite* sprite) { sprite->data[6] = targetX; sprite->data[7] = targetY + 10; - sub_80FF9B8(sprite, 60); + InitItemBagData(sprite, 60); sprite->data[3] = 1; } else { sprite->data[6] = targetX; sprite->data[7] = targetY + 10; - sub_80FF9B8(sprite, 60); + InitItemBagData(sprite, 60); sprite->data[3] = 3; } @@ -3074,7 +3080,7 @@ static void AnimPresent(struct Sprite* sprite) sprite->callback = AnimItemSteal_Step1; } -static void sub_80FFB90(struct Sprite* sprite) +static void AnimKnockOffOpponentsItem(struct Sprite* sprite) { int zero; sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]); @@ -3101,7 +3107,7 @@ static void AnimKnockOffItem(struct Sprite* sprite) { sprite->data[6] = 0; sprite->data[7] = targetY + 10; - sub_80FF9B8(sprite, 40); + InitItemBagData(sprite, 40); sprite->data[3] = 3; sprite->data[4] = 60; sprite->callback = AnimItemSteal_Step1; @@ -3113,10 +3119,10 @@ static void AnimKnockOffItem(struct Sprite* sprite) if (IsContest()) sprite->data[6] = 0; - sub_80FF9B8(sprite, 40); + InitItemBagData(sprite, 40); sprite->data[3] = 3; sprite->data[4] = 60; - sprite->callback = sub_80FFB90; + sprite->callback = AnimKnockOffOpponentsItem; } } @@ -3150,14 +3156,14 @@ static void AnimItemSteal(struct Sprite* sprite) { sprite->data[6] = attackerX; sprite->data[7] = attackerY + 10; - sub_80FF9B8(sprite, 60); + InitItemBagData(sprite, 60); sprite->data[3] = 1; } else { sprite->data[6] = attackerX; sprite->data[7] = attackerY + 10; - sub_80FF9B8(sprite, 60); + InitItemBagData(sprite, 60); sprite->data[3] = 3; } @@ -3731,13 +3737,13 @@ static void AnimNeedleArmSpike_Step(struct Sprite* sprite) } } -static void sub_81009DC(struct Sprite* sprite) +static void AnimWhipHit_WaitEnd(struct Sprite* sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } -static void sub_81009F8(struct Sprite* sprite) +static void AnimSlidingHit(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -3759,12 +3765,12 @@ static void AnimWhipHit(struct Sprite* sprite) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) StartSpriteAnim(sprite, 1); - sprite->callback = sub_81009DC; + sprite->callback = AnimWhipHit_WaitEnd; SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; } -static void sub_8100A94(struct Sprite* sprite) +static void AnimFlickeringPunch(struct Sprite* sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -3879,7 +3885,7 @@ static void AnimSlice_Step(struct Sprite* sprite) } } -void unref_sub_8100D38(struct Sprite* sprite) +static void UnusedFlickerAnim(struct Sprite* sprite) { if (sprite->data[2] > 1) { @@ -3912,7 +3918,7 @@ void unref_sub_8100D38(struct Sprite* sprite) } } -static void sub_8100E1C(struct Sprite* sprite) +static void AnimCirclingMusicNote(struct Sprite* sprite) { sprite->data[0] = gBattleAnimArgs[2]; if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) @@ -3924,11 +3930,11 @@ static void sub_8100E1C(struct Sprite* sprite) sprite->data[1] = -gBattleAnimArgs[3]; sprite->pos1.y += gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[4]; - sprite->callback = sub_8100E80; + sprite->callback = AnimCirclingMusicNote_Step; sprite->callback(sprite); } -static void sub_8100E80(struct Sprite* sprite) +static void AnimCirclingMusicNote_Step(struct Sprite* sprite) { sprite->pos2.x = Cos(sprite->data[0], 100); sprite->pos2.y = Sin(sprite->data[0], 20); @@ -3938,7 +3944,7 @@ static void sub_8100E80(struct Sprite* sprite) sprite->subpriority = 14; sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; - sprite->data[5] += 0x82; + sprite->data[5] += 130; sprite->pos2.y += sprite->data[5] >> 8; sprite->data[2]++; if (sprite->data[2] == sprite->data[3]) @@ -4169,7 +4175,7 @@ static void AnimSparkingStars(struct Sprite* sprite) sprite->callback = TranslateSpriteLinearFixedPoint; } -static void sub_8101440(struct Sprite* sprite) +static void AnimBubbleBurst(struct Sprite* sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) @@ -4184,10 +4190,10 @@ static void sub_8101440(struct Sprite* sprite) StartSpriteAnim(sprite, 1); } - sprite->callback = sub_81014A0; + sprite->callback = AnimBubbleBurst_Step; } -static void sub_81014A0(struct Sprite* sprite) +static void AnimBubbleBurst_Step(struct Sprite* sprite) { if (++sprite->data[0] > 30) { @@ -4338,7 +4344,7 @@ static void AnimLockOnTarget_Step4(struct Sprite* sprite) sprite->data[1] = 0; } - BlendPalettes(sub_80A75AC(1, 1, 1, 1, 1, 0, 0), sprite->data[1], RGB(31, 31, 31)); + BlendPalettes(GetBattleBgPalettesMask(1, 1, 1, 1, 1, 0, 0), sprite->data[1], RGB(31, 31, 31)); if (sprite->data[1] == 16) { int pal; @@ -4511,13 +4517,13 @@ static void AnimBowMon_Step4(struct Sprite* sprite) DestroyAnimSprite(sprite); } -static void sub_8101B90(struct Sprite *sprite) +static void AnimTipMon(struct Sprite *sprite) { sprite->data[0] = 0; - sprite->callback = sub_8101BA0; + sprite->callback = AnimTipMon_Step; } -static void sub_8101BA0(struct Sprite *sprite) +static void AnimTipMon_Step(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -4912,22 +4918,24 @@ void AnimTask_Conversion2AlphaBlend(u8 taskId) } } -void unref_sub_8102434(u8 taskId) +// Unused +static void AnimTask_HideBattlersHealthbox(u8 taskId) { u8 i; for (i = 0; i < gBattlersCount; i++) { - if (gBattleAnimArgs[0] == 1 && GetBattlerSide(i) == B_SIDE_PLAYER) + if (gBattleAnimArgs[0] == TRUE && GetBattlerSide(i) == B_SIDE_PLAYER) SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]); - if (gBattleAnimArgs[1] == 1 && GetBattlerSide(i) == B_SIDE_OPPONENT) + if (gBattleAnimArgs[1] == TRUE && GetBattlerSide(i) == B_SIDE_OPPONENT) SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]); } DestroyAnimVisualTask(taskId); } -void unref_sub_81024A8(u8 taskId) +// Unused +static void AnimTask_ShowBattlersHealthbox(u8 taskId) { u8 i; for (i = 0; i < gBattlersCount; i++) @@ -4991,7 +4999,7 @@ static void AnimMoonlightSparkle_Step(struct Sprite* sprite) void AnimTask_MoonlightEndFade(u8 taskId) { - int a = sub_80A75AC(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; + int a = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; int b; int c; int d; @@ -5006,7 +5014,7 @@ void AnimTask_MoonlightEndFade(u8 taskId) gTasks[taskId].data[7] = 13; gTasks[taskId].data[8] = 14; gTasks[taskId].data[9] = 15; - b = sub_80A76C4(1, 1, 1, 1); + b = GetBattleMonSpritePalettesMask(1, 1, 1, 1); c = a | b; StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c); b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON)); diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index d891a4d01..5dd584386 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -16,13 +16,13 @@ #include "constants/rgb.h" #include "constants/songs.h" -static void sub_8103448(struct Sprite *); -static void sub_8103498(struct Sprite *); -static void sub_81034D8(struct Sprite *); -static void sub_810358C(struct Sprite *); -static void sub_8103620(struct Sprite *); -static void sub_8103658(struct Sprite *); -static void sub_8103680(struct Sprite *); +static void AnimCirclingFinger(struct Sprite *); +static void AnimBouncingMusicNote(struct Sprite *); +static void AnimBouncingMusicNote_Step(struct Sprite *); +static void AnimVibrateBattlerBack(struct Sprite *); +static void AnimMovingClamp(struct Sprite *); +static void AnimMovingClamp_Step(struct Sprite *); +static void AnimMovingClamp_End(struct Sprite *); static void AnimKinesisZapEnergy(struct Sprite *); static void AnimSwordsDanceBlade(struct Sprite *); static void AnimSwordsDanceBlade_Step(struct Sprite *); @@ -30,8 +30,8 @@ static void AnimSonicBoomProjectile(struct Sprite *); static void AnimAirWaveProjectile(struct Sprite *); static void AnimAirWaveProjectile_Step1(struct Sprite *sprite); static void AnimAirWaveProjectile_Step2(struct Sprite *sprite); -static void sub_8103FE8(struct Sprite *); -static void sub_8104018(struct Sprite *); +static void AnimVoidLines(struct Sprite *); +static void AnimVoidLines_Step(struct Sprite *); static void AnimCoinThrow(struct Sprite *); static void AnimFallingCoin(struct Sprite *); static void AnimFallingCoin_Step(struct Sprite *); @@ -109,7 +109,7 @@ static void AnimTask_ScaryFace_Step(u8); static void AnimTask_UproarDistortion_Step(u8); // Unused -const struct SpriteTemplate gUnknown_08593264 = +static const struct SpriteTemplate sCirclingFingerSpriteTemplate = { .tileTag = ANIM_TAG_FINGER, .paletteTag = ANIM_TAG_FINGER, @@ -117,23 +117,23 @@ const struct SpriteTemplate gUnknown_08593264 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8103448, + .callback = AnimCirclingFinger, }; -const union AnimCmd gUnknown_0859327C[] = +static const union AnimCmd sAnim_BouncingMusicNote[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; -// Unused -const union AnimCmd *const gUnknown_08593284[] = +// Unused (association assumed) +static const union AnimCmd *const sAnims_BouncingMusicNote[] = { - gUnknown_0859327C, + sAnim_BouncingMusicNote, }; // Unused -const struct SpriteTemplate gUnknown_08593288 = +static const struct SpriteTemplate sBouncingMusicNoteSpriteTemplate = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, @@ -141,11 +141,11 @@ const struct SpriteTemplate gUnknown_08593288 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8103498, + .callback = AnimBouncingMusicNote, }; // Unused -const struct SpriteTemplate gUnknown_085932A0 = +static const struct SpriteTemplate sVibrateBattlerBackSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -153,11 +153,11 @@ const struct SpriteTemplate gUnknown_085932A0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810358C, + .callback = AnimVibrateBattlerBack, }; // Unused -const struct SpriteTemplate gUnknown_085932B8 = +static const struct SpriteTemplate sMovingClampSpriteTemplate = { .tileTag = ANIM_TAG_CLAMP, .paletteTag = ANIM_TAG_CLAMP, @@ -165,10 +165,10 @@ const struct SpriteTemplate gUnknown_085932B8 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, - .callback = sub_8103620, + .callback = AnimMovingClamp, }; -const union AnimCmd gUnknown_085932D0[] = +static const union AnimCmd sAnim_SmallExplosion[] = { ANIMCMD_FRAME(0, 9), ANIMCMD_FRAME(16, 3), @@ -177,32 +177,32 @@ const union AnimCmd gUnknown_085932D0[] = ANIMCMD_END, }; -const union AnimCmd *const gUnknown_085932E4[] = +static const union AnimCmd *const sAnims_SmallExplosion[] = { - gUnknown_085932D0, + sAnim_SmallExplosion, }; -const union AffineAnimCmd gUnknown_085932E8[] = +static const union AffineAnimCmd sAffineAnim_SmallExplosion[] = { AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0), AFFINEANIMCMD_FRAME(0x9, 0x9, 0, 18), AFFINEANIMCMD_END, }; -const union AffineAnimCmd *const gUnknown_08593300[] = +static const union AffineAnimCmd *const sAffineAnims_SmallExplosion[] = { - gUnknown_085932E8, + sAffineAnim_SmallExplosion, }; // Unused -const struct SpriteTemplate gUnknown_08593304 = +static const struct SpriteTemplate sSmallExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_6, .paletteTag = ANIM_TAG_EXPLOSION_6, .oam = &gOamData_AffineNormal_ObjNormal_32x32, - .anims = gUnknown_085932E4, + .anims = sAnims_SmallExplosion, .images = NULL, - .affineAnims = gUnknown_08593300, + .affineAnims = sAffineAnims_SmallExplosion, .callback = AnimSpriteOnMonPos, }; @@ -366,7 +366,7 @@ const struct SpriteTemplate gEggThrowSpriteTemplate = }; // Unused -const struct SpriteTemplate gUnknown_085934A0 = +static const struct SpriteTemplate sVoidLinesSpriteTemplate = { .tileTag = ANIM_TAG_VOID_LINES, .paletteTag = ANIM_TAG_VOID_LINES, @@ -374,7 +374,7 @@ const struct SpriteTemplate gUnknown_085934A0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8103FE8, + .callback = AnimVoidLines, }; const union AnimCmd gCoinAnimCmds[] = @@ -1096,7 +1096,7 @@ const struct SpriteTemplate gDevilSpriteTemplate = .callback = AnimDevil, }; -const union AnimCmd gUnknown_08593B08[] = +static const union AnimCmd sAnim_FurySwipes[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), @@ -1105,7 +1105,7 @@ const union AnimCmd gUnknown_08593B08[] = ANIMCMD_END, }; -const union AnimCmd gUnknown_08593B1C[] = +static const union AnimCmd sAnim_FurySwipes_Flipped[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .hFlip = TRUE), @@ -1114,10 +1114,10 @@ const union AnimCmd gUnknown_08593B1C[] = ANIMCMD_END, }; -const union AnimCmd *const gFurySwipesAnimTable[] = +static const union AnimCmd *const sAnims_FurySwipes[] = { - gUnknown_08593B08, - gUnknown_08593B1C, + sAnim_FurySwipes, + sAnim_FurySwipes_Flipped, }; const struct SpriteTemplate gFurySwipesSpriteTemplate = @@ -1125,7 +1125,7 @@ const struct SpriteTemplate gFurySwipesSpriteTemplate = .tileTag = ANIM_TAG_SWIPE, .paletteTag = ANIM_TAG_SWIPE, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gFurySwipesAnimTable, + .anims = sAnims_FurySwipes, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFurySwipes, @@ -1262,7 +1262,7 @@ const struct SpriteTemplate gGuardRingSpriteTemplate = .callback = AnimGuardRing, }; -static void sub_8103448(struct Sprite *sprite) +static void AnimCirclingFinger(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); @@ -1276,7 +1276,7 @@ static void sub_8103448(struct Sprite *sprite) sprite->callback(sprite); } -static void sub_8103498(struct Sprite *sprite) +static void AnimBouncingMusicNote(struct Sprite *sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) @@ -1287,10 +1287,10 @@ static void sub_8103498(struct Sprite *sprite) SetSpriteNextToMonHead(battler, sprite); sprite->data[0] = 0; sprite->data[1] = 0; - sprite->callback = sub_81034D8; + sprite->callback = AnimBouncingMusicNote_Step; } -static void sub_81034D8(struct Sprite *sprite) +static void AnimBouncingMusicNote_Step(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -1311,7 +1311,7 @@ static void sub_81034D8(struct Sprite *sprite) } } -static void sub_810353C(struct Sprite *sprite) +static void AnimVibrateBattlerBack_Step(struct Sprite *sprite) { s16 temp; gSprites[sprite->data[2]].pos2.x += sprite->data[1]; @@ -1326,7 +1326,7 @@ static void sub_810353C(struct Sprite *sprite) sprite->data[0]--; } -static void sub_810358C(struct Sprite *sprite) +static void AnimVibrateBattlerBack(struct Sprite *sprite) { u8 spriteId; sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); @@ -1341,30 +1341,30 @@ static void sub_810358C(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = spriteId; - sprite->callback = sub_810353C; + sprite->callback = AnimVibrateBattlerBack_Step; sprite->invisible = TRUE; } -static void sub_8103620(struct Sprite *sprite) +static void AnimMovingClamp(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[4]; sprite->callback = WaitAnimForDuration; - StoreSpriteCallbackInData6(sprite, sub_8103658); + StoreSpriteCallbackInData6(sprite, AnimMovingClamp_Step); } -static void sub_8103658(struct Sprite *sprite) +static void AnimMovingClamp_Step(struct Sprite *sprite) { sprite->data[0] = sprite->data[1]; sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y + 15; sprite->callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData6(sprite, sub_8103680); + StoreSpriteCallbackInData6(sprite, AnimMovingClamp_End); } -static void sub_8103680(struct Sprite *sprite) +static void AnimMovingClamp_End(struct Sprite *sprite) { if (sprite->data[5] == 0) DestroyAnimSprite(sprite); @@ -1738,14 +1738,14 @@ void AnimTask_AirCutterProjectile(u8 taskId) gTasks[taskId].func = AirCutterProjectileStep1; } -static void sub_8103FE8(struct Sprite *sprite) +static void AnimVoidLines(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); - sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(gUnknown_085934A0.paletteTag) << 4); - sprite->callback = sub_8104018; + sprite->data[0] = 0x100 + (IndexOfSpritePaletteTag(sVoidLinesSpriteTemplate.paletteTag) << 4); + sprite->callback = AnimVoidLines_Step; } -static void sub_8104018(struct Sprite *sprite) +static void AnimVoidLines_Step(struct Sprite *sprite) { u16 id, val; int i; @@ -1784,7 +1784,7 @@ static void AnimCoinThrow(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = r6; sprite->data[4] = r7; - sprite->callback = sub_80A7000; + sprite->callback = InitAnimLinearTranslationWithSpeedAndPos; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } @@ -2569,7 +2569,7 @@ static void AnimBlendThinRing(struct Sprite *sprite) sprite->callback(sprite); } -void sub_8105284(struct Sprite *sprite) +static void AnimHyperVoiceRing_WaitEnd(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) { @@ -2659,7 +2659,7 @@ static void AnimHyperVoiceRing(struct Sprite *sprite) sprite->data[4] = sp1; sprite->data[0] = gBattleAnimArgs[0]; InitAnimLinearTranslation(sprite); - sprite->callback = sub_8105284; + sprite->callback = AnimHyperVoiceRing_WaitEnd; sprite->callback(sprite); } @@ -3069,17 +3069,17 @@ static void AnimMagentaHeart(struct Sprite *sprite) void AnimTask_FakeOut(u8 taskId) { - u16 win0h = IsContest() ? 0x98 : 0xF0; + u16 win0h = IsContest() ? 152 : DISPLAY_WIDTH; u16 win0v = 0; gBattle_WIN0H = win0h; - gBattle_WIN0V = 0xA0; + gBattle_WIN0V = DISPLAY_HEIGHT; SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); - SetGpuReg(REG_OFFSET_WININ, 0x3F1F); - SetGpuReg(REG_OFFSET_WINOUT, 0x3F3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL | WINOUT_WINOBJ_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN); - SetGpuReg(REG_OFFSET_BLDY, 0x10); + SetGpuReg(REG_OFFSET_BLDY, 16); gTasks[taskId].data[0] = win0v; gTasks[taskId].data[1] = win0h; gTasks[taskId].func = AnimTask_FakeOut_Step1; @@ -3096,7 +3096,7 @@ static void AnimTask_FakeOut_Step1(u8 taskId) } else { - gBattle_WIN0H = gTasks[taskId].data[1] | (gTasks[taskId].data[0] << 8); + gBattle_WIN0H = WIN_RANGE(gTasks[taskId].data[0], gTasks[taskId].data[1]); } } @@ -3106,7 +3106,7 @@ static void AnimTask_FakeOut_Step2(u8 taskId) { gTasks[taskId].data[11] = 0x88; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_LIGHTEN); - BlendPalettes(sub_80A75AC(1, 0, 0, 0, 0, 0, 0), 16, RGB(31, 31, 31)); + BlendPalettes(GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0), 16, RGB(31, 31, 31)); } else if (gTasks[taskId].data[10] > 4) { @@ -3210,7 +3210,7 @@ void AnimParticleBurst(struct Sprite *sprite) static void AnimRedHeartRising(struct Sprite *sprite) { sprite->pos1.x = gBattleAnimArgs[0]; - sprite->pos1.y = 160; + sprite->pos1.y = DISPLAY_HEIGHT; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[1]; sprite->callback = WaitAnimForDuration; @@ -3248,7 +3248,7 @@ void AnimTask_HeartsBackground(u8 taskId) gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgGfx(animBg.bgId, &gBattleAnimBgImage_Attract, animBg.tilesOffset); AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_Attract, 0); LoadCompressedPalette(&gBattleAnimBgPalette_Attract, animBg.paletteId * 16, 32); @@ -3295,8 +3295,8 @@ static void AnimTask_HeartsBackground_Step(u8 taskId) } break; case 3: - sub_80A6B30(&animBg); - sub_80A6C68(animBg.bgId); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(animBg.bgId); gTasks[taskId].data[12]++; break; case 4: @@ -3326,7 +3326,7 @@ void AnimTask_ScaryFace(u8 taskId) gBattle_BG1_Y = 0; SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); if (IsContest()) AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimBgTilemap_ScaryFaceContest, 0); else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) @@ -3379,9 +3379,9 @@ static void AnimTask_ScaryFace_Step(u8 taskId) } break; case 3: - sub_80A6B30(&animBg); - sub_80A6C68(1); - sub_80A6C68(2); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(1); + ClearBattleAnimBg(2); gTasks[taskId].data[12]++; // fall through case 4: @@ -3464,7 +3464,8 @@ static void AnimOrbitScatter_Step(struct Sprite *sprite) { sprite->pos2.x += sprite->data[0]; sprite->pos2.y += sprite->data[1]; - if (sprite->pos1.x + sprite->pos2.x + 16 > 272u || sprite->pos1.y + sprite->pos2.y > 160 || sprite->pos1.y + sprite->pos2.y < -16) + if (sprite->pos1.x + sprite->pos2.x + 16 > ((u32)DISPLAY_WIDTH + 32) + || sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT || sprite->pos1.y + sprite->pos2.y < -16) DestroyAnimSprite(sprite); } @@ -3523,7 +3524,7 @@ static void AnimAngel(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void sub_8106A64(struct Sprite *sprite) +static void AnimPinkHeart_Step(struct Sprite *sprite) { sprite->data[5]++; sprite->pos2.x = Sin(sprite->data[3], 5); @@ -3552,7 +3553,7 @@ static void AnimPinkHeart(struct Sprite *sprite) sprite->data[3] = (sprite->data[3] + 3) & 0xFF; if (sprite->data[3] > 70) { - sprite->callback = sub_8106A64; + sprite->callback = AnimPinkHeart_Step; sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; sprite->pos2.x = 0; diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 9e50a8477..5aaf45f19 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -91,7 +91,7 @@ static void AnimMeteorMashStar(struct Sprite *); static void AnimMeteorMashStar_Step(struct Sprite *sprite); static void AnimBlockX(struct Sprite *); static void AnimBlockX_Step(struct Sprite *); -static void sub_815FE80(struct Sprite *); +static void AnimUnusedItemBagSteal(struct Sprite *); static void AnimKnockOffStrike(struct Sprite *); static void AnimKnockOffStrike_Step(struct Sprite *sprite); static void AnimRecycle(struct Sprite *); @@ -432,7 +432,7 @@ const struct SpriteTemplate gRapidSpinSpriteTemplate = .callback = AnimRapidSpin, }; -const union AffineAnimCmd gUnknown_085CE2A0[] = +static const union AffineAnimCmd sAffineAnims_Torment[] = { AFFINEANIMCMD_FRAME(-12, 8, 0, 4), AFFINEANIMCMD_FRAME(20, -20, 0, 4), @@ -718,7 +718,7 @@ const struct SpriteTemplate gSweetScentPetalSpriteTemplate = .callback = AnimSweetScentPetal, }; -const u16 gUnknown_085CE55C[] = INCBIN_U16("graphics/unknown/unknown_85CE55C.gbapal"); +static const u16 sUnusedPalette[] = INCBIN_U16("graphics/battle_anims/unused.gbapal"); const union AnimCmd gPainSplitAnimCmds[] = { @@ -1071,7 +1071,7 @@ const struct SpriteTemplate gMeteorMashStarSpriteTemplate = .callback = AnimMeteorMashStar, }; -const struct SpriteTemplate gUnknown_085CE8F4 = +static const struct SpriteTemplate sUnusedStarBurstSpriteTemplate = { .tileTag = ANIM_TAG_GOLD_STARS, .paletteTag = ANIM_TAG_GOLD_STARS, @@ -1093,7 +1093,7 @@ const struct SpriteTemplate gBlockXSpriteTemplate = .callback = AnimBlockX, }; -const struct SpriteTemplate gUnknown_085CE924 = +static const struct SpriteTemplate sUnusedItemBagStealSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, @@ -1101,7 +1101,7 @@ const struct SpriteTemplate gUnknown_085CE924 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_815FE80, + .callback = AnimUnusedItemBagSteal, }; const union AnimCmd gKnockOffStrikeAnimCmds[] = @@ -1509,7 +1509,7 @@ static void AnimLetterZ(struct Sprite *sprite) sprite->pos2.x = sprite->data[3] / 2; sprite->pos2.y = Sin(var0 & 0xFF, 5) + (sprite->data[4] / 2); - if ((u16)(sprite->pos1.x + sprite->pos2.x) > 240) + if ((u16)(sprite->pos1.x + sprite->pos2.x) > DISPLAY_WIDTH) DestroyAnimSprite(sprite); } @@ -1676,18 +1676,18 @@ void AnimTask_CreateSpotlight(u8 taskId) { if (IsContest()) { - SetGpuReg(REG_OFFSET_WININ, 0x1F3F); - gBattle_WIN1H = 0x98F0; - gBattle_WIN1V = 0x00A0; + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); + gBattle_WIN1H = WIN_RANGE(152, DISPLAY_WIDTH); + gBattle_WIN1V = WIN_RANGE(0, DISPLAY_HEIGHT); SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN0V); } else { SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); - gBattle_WIN1H = 0x00F0; - gBattle_WIN1V = 0x78A0; - SetGpuReg(REG_OFFSET_WIN1H, 0x00F0); + gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH); + gBattle_WIN1V = WIN_RANGE(120, DISPLAY_HEIGHT); + SetGpuReg(REG_OFFSET_WIN1H, gBattle_WIN1H); SetGpuReg(REG_OFFSET_WIN1V, gBattle_WIN1V); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN1_ON); } @@ -1785,13 +1785,13 @@ void AnimTask_RapinSpinMonElevation(u8 taskId) { var3 = gBattle_BG1_X; task->data[8] = var3; - var4 = var3 + 240; + var4 = var3 + DISPLAY_WIDTH; } else { var3 = gBattle_BG2_X; task->data[8] = var3; - var4 = var3 + 240; + var4 = var3 + DISPLAY_WIDTH; } task->data[9] = var4; @@ -1944,7 +1944,7 @@ static void TormentAttacker_Step(u8 taskId) task->data[5] -= 6; } - PrepareAffineAnimInTaskData(task, task->data[15], gUnknown_085CE2A0); + PrepareAffineAnimInTaskData(task, task->data[15], sAffineAnims_Torment); task->data[1]++; task->data[0] = 1; break; @@ -2292,7 +2292,7 @@ void AnimTask_TransformMon(u8 taskId) src = gMonSpritesGfxPtr->sprites.ptr[position] + (gBattleMonForms[gBattleAnimAttacker] << 11); dest = animBg.bgTiles; - CpuCopy32(src, dest, 0x800); + CpuCopy32(src, dest, MON_PIC_SIZE); LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset); if (IsContest()) { @@ -2319,11 +2319,11 @@ void AnimTask_TransformMon(u8 taskId) } if (IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies)) - gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF6C0; + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest; else - gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF694; + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteOpponentSide; - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0); + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL); } gTasks[taskId].data[0]++; @@ -2387,7 +2387,7 @@ void AnimTask_MorningSunLightBeam(u8 taskId) if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimMaskTilemap_LightBeam, 0); if (IsContest()) { @@ -2450,8 +2450,8 @@ void AnimTask_MorningSunLightBeam(u8 taskId) } break; case 4: - sub_80A6B30(&animBg); - sub_80A6C68(animBg.bgId); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(animBg.bgId); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); @@ -2568,7 +2568,7 @@ void AnimTask_DoomDesireLightBeam(u8 taskId) if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemapHandleContest(&animBg, &gBattleAnimMaskTilemap_LightBeam, 0); if (IsContest()) { @@ -2639,8 +2639,8 @@ void AnimTask_DoomDesireLightBeam(u8 taskId) gTasks[taskId].data[0] = 1; break; case 5: - sub_80A6B30(&animBg); - sub_80A6C68(animBg.bgId); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(animBg.bgId); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); @@ -2807,7 +2807,7 @@ static void AnimSweetScentPetal(struct Sprite *sprite) } else { - sprite->pos1.x = 240; + sprite->pos1.x = DISPLAY_WIDTH; sprite->pos1.y = gBattleAnimArgs[0] - 30; } @@ -2824,7 +2824,7 @@ static void AnimSweetScentPetal_Step(struct Sprite *sprite) sprite->pos1.x += 5; sprite->pos1.y -= 1; - if (sprite->pos1.x > 240) + if (sprite->pos1.x > DISPLAY_WIDTH) DestroyAnimSprite(sprite); sprite->pos2.y = Sin(sprite->data[0] & 0xFF, 16); @@ -3248,7 +3248,7 @@ void AnimTask_RolePlaySilhouette(u8 taskId) coord1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); coord2 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1); - spriteId = sub_80A8394(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, 1); + spriteId = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, coord1 + xOffset, coord2, 5, personality, otId, gBattleAnimTarget, TRUE); gSprites[spriteId].oam.priority = priority; gSprites[spriteId].oam.objMode = ST_OAM_OBJ_BLEND; @@ -3286,7 +3286,7 @@ static void AnimTask_RolePlaySilhouette_Step2(u8 taskId) TrySetSpriteRotScale(&gSprites[spriteId], TRUE, gTasks[taskId].data[10], gTasks[taskId].data[11], 0); if (++gTasks[taskId].data[12] == 9) { - sub_80A749C(&gSprites[spriteId]); + ResetSpriteRotScale_PreserveAffine(&gSprites[spriteId]); DestroySpriteAndFreeResources_(&gSprites[spriteId]); gTasks[taskId].func = DestroyAnimVisualTaskAndDisableBlend; } @@ -3580,7 +3580,7 @@ static void AnimSmokeBallEscapeCloud(struct Sprite *sprite) sprite->callback = DestroyAnimSpriteAfterTimer; } -static void sub_815D8D8(u8 taskId) +static void AnimTask_SlideMonForFocusBand_Step2(u8 taskId) { u16 var0 = 0; u16 var1 = 0; @@ -3630,7 +3630,7 @@ static void sub_815D8D8(u8 taskId) } } -static void sub_815DA20(u8 taskId) +static void AnimTask_SlideMonForFocusBand_Step1(u8 taskId) { u16 var0 = 0; u16 var1 = 0; @@ -3679,7 +3679,7 @@ static void sub_815DA20(u8 taskId) { gTasks[taskId].data[0] = 30; gTasks[taskId].data[13] = 0; - gTasks[taskId].func = sub_815D8D8; + gTasks[taskId].func = AnimTask_SlideMonForFocusBand_Step2; } } @@ -3714,7 +3714,7 @@ void AnimTask_SlideMonForFocusBand(u8 taskId) gTasks[taskId].data[7] = 0; gTasks[taskId].data[4] = gBattleAnimArgs[4]; gTasks[taskId].data[5] = gBattleAnimArgs[5]; - gTasks[taskId].func = sub_815DA20; + gTasks[taskId].func = AnimTask_SlideMonForFocusBand_Step1; } // Squishes the mon vertically and emits sweat droplets a few times. @@ -3866,7 +3866,7 @@ static void AnimTask_FacadeColorBlend_Step(u8 taskId) // The sliding circle effect used by Refresh and Aromatherapy void AnimTask_StatusClearedEffect(u8 taskId) { - sub_8117854( + StartMonScrollingBgMask( taskId, 0, 0x1A0, @@ -4733,11 +4733,11 @@ void AnimTask_MonToSubstitute(u8 taskId) LoadBattleMonGfxAndAnimate(gBattleAnimAttacker, 0, spriteId); if (IsContest()) { - gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gUnknown_082FF6C0; - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], 0); + gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest; + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL); } - for (i = 0; i < 16; i++) + for (i = 0; i < NUM_TASK_DATA; i++) gTasks[taskId].data[i] = 0; gTasks[taskId].func = AnimTask_MonToSubstituteDoll; @@ -4947,7 +4947,6 @@ static void AnimTask_OdorSleuthMovementWaitFinish(u8 taskId) static void MoveOdorSleuthClone(struct Sprite *sprite) { - int zero = 0; if (++sprite->data[1] > 1) { sprite->data[1] = 0; @@ -5050,7 +5049,7 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1; isBackPic = FALSE; - x = 272; + x = DISPLAY_WIDTH + 32; } else { @@ -5067,7 +5066,7 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) } } - spriteId2 = sub_80A8394(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, 0); + spriteId2 = CreateAdditionalMonSpriteForMoveAnim(species, isBackPic, 0, x, GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y), subpriority, personality, otId, gBattleAnimAttacker, FALSE); if (gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies != SPECIES_NONE) BlendPalette((gSprites[spriteId2].oam.paletteNum * 16) | 0x100, 16, 6, RGB_WHITE); @@ -5117,7 +5116,7 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) gSprites[spriteId].pos2.x = -gSprites[spriteId].pos1.x - 32; else - gSprites[spriteId].pos2.x = 272 - gSprites[spriteId].pos1.x; + gSprites[spriteId].pos2.x = DISPLAY_WIDTH + 32 - gSprites[spriteId].pos1.x; gTasks[taskId].data[0]++; break; @@ -5144,7 +5143,7 @@ void AnimTask_SnatchOpposingMonMove(u8 taskId) } } -static void sub_815FE80(struct Sprite *sprite) +static void AnimUnusedItemBagSteal(struct Sprite *sprite) { switch (sprite->data[7]) { diff --git a/src/battle_anim_electric.c b/src/battle_anim_electric.c index a57e88b03..2c5c7e0f1 100644 --- a/src/battle_anim_electric.c +++ b/src/battle_anim_electric.c @@ -7,9 +7,9 @@ static void AnimLightning(struct Sprite *); static void AnimLightning_Step(struct Sprite *); -static void sub_810A214(struct Sprite *); -static void sub_810A258(struct Sprite *); -static void sub_810A274(struct Sprite *); +static void AnimUnusedSpinningFist(struct Sprite *); +static void AnimUnusedSpinningFist_Step(struct Sprite *); +static void AnimUnusedCirclingShock(struct Sprite *); static void AnimSparkElectricity(struct Sprite *); static void AnimZapCannonSpark(struct Sprite *); static void AnimZapCannonSpark_Step(struct Sprite *); @@ -29,13 +29,13 @@ static void AnimGrowingChargeOrb(struct Sprite *); static void AnimElectricPuff(struct Sprite *); static void AnimVoltTackleOrbSlide(struct Sprite *); static void AnimVoltTackleOrbSlide_Step(struct Sprite *); -static bool8 sub_810B154(struct Task *task, u8 taskId); +static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId); static void AnimVoltTackleBolt(struct Sprite *); static void AnimGrowingShockWaveOrb(struct Sprite *); -static bool8 sub_810B430(struct Task *task, u8 taskId); +static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId); static void AnimShockWaveProgressingBolt(struct Sprite *); -static bool8 sub_810B614(struct Task *task, u8 taskId); -static void sub_810B684(struct Sprite *sprite); +static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId); +static void AnimShockWaveLightning(struct Sprite *sprite); static const union AnimCmd sAnim_Lightning[] = { @@ -63,7 +63,7 @@ const struct SpriteTemplate gLightningSpriteTemplate = .callback = AnimLightning, }; -static const union AffineAnimCmd gUnknown_085956D8[] = +static const union AffineAnimCmd sAffineAnim_UnusedSpinningFist[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20), @@ -71,24 +71,24 @@ static const union AffineAnimCmd gUnknown_085956D8[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const gUnknown_085956F8[] = +static const union AffineAnimCmd *const sAffineAnims_UnusedSpinningFist[] = { - gUnknown_085956D8, + sAffineAnim_UnusedSpinningFist, }; // Unused -const struct SpriteTemplate gUnknown_085956FC = +static const struct SpriteTemplate sUnusedSpinningFistSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gUnknown_085956F8, - .callback = sub_810A214, + .affineAnims = sAffineAnims_UnusedSpinningFist, + .callback = AnimUnusedSpinningFist, }; -static const union AnimCmd gUnknown_08595714[] = +static const union AnimCmd sAnim_UnusedCirclingShock[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), @@ -99,21 +99,21 @@ static const union AnimCmd gUnknown_08595714[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_08595730[] = +static const union AnimCmd *const sAnims_UnusedCirclingShock[] = { - gUnknown_08595714, + sAnim_UnusedCirclingShock, }; // Unused -const struct SpriteTemplate gUnknown_08595734 = +static const struct SpriteTemplate sUnusedCirclingShockSpriteTemplate = { .tileTag = ANIM_TAG_SHOCK, .paletteTag = ANIM_TAG_SHOCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_08595730, + .anims = sAnims_UnusedCirclingShock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810A274, + .callback = AnimUnusedCirclingShock, }; const struct SpriteTemplate gSparkElectricitySpriteTemplate = @@ -473,23 +473,23 @@ static void AnimLightning_Step(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void sub_810A214(struct Sprite *sprite) +static void AnimUnusedSpinningFist(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->pos1.x -= gBattleAnimArgs[0]; else sprite->pos1.x += gBattleAnimArgs[0]; - sprite->callback = sub_810A258; + sprite->callback = AnimUnusedSpinningFist_Step; } -static void sub_810A258(struct Sprite *sprite) +static void AnimUnusedSpinningFist_Step(struct Sprite *sprite) { if (sprite->affineAnimEnded) DestroySpriteAndMatrix(sprite); } -static void sub_810A274(struct Sprite *sprite) +static void AnimUnusedCirclingShock(struct Sprite *sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); @@ -1076,7 +1076,7 @@ void AnimTask_VoltTackleBolt(u8 taskId) if (++task->data[2] > 0) { task->data[2] = 0; - if (sub_810B154(task, taskId) || sub_810B154(task, taskId)) + if (CreateVoltTackleBolt(task, taskId) || CreateVoltTackleBolt(task, taskId)) task->data[0]++; } break; @@ -1086,7 +1086,7 @@ void AnimTask_VoltTackleBolt(u8 taskId) } } -static bool8 sub_810B154(struct Task *task, u8 taskId) +static bool8 CreateVoltTackleBolt(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gVoltTackleBoltSpriteTemplate, task->data[3], task->data[5], 35); if (spriteId != MAX_SPRITES) @@ -1169,7 +1169,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId) if (++task->data[1] > 0) { task->data[1] = 0; - if (sub_810B430(task, taskId)) + if (CreateShockWaveBoltSprite(task, taskId)) { if (task->data[2] == 5) task->data[0] = 3; @@ -1222,7 +1222,7 @@ void AnimTask_ShockWaveProgressingBolt(u8 taskId) } } -static bool8 sub_810B430(struct Task *task, u8 taskId) +static bool8 CreateShockWaveBoltSprite(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gShockWaveProgressingBoltSpriteTemplate, task->data[6], task->data[7], 35); if (spriteId != MAX_SPRITES) @@ -1291,7 +1291,7 @@ void AnimTask_ShockWaveLightning(u8 taskId) if (++task->data[1] > 1) { task->data[1] = 0; - if (sub_810B614(task, taskId)) + if (CreateShockWaveLightningSprite(task, taskId)) task->data[0]++; } break; @@ -1302,13 +1302,13 @@ void AnimTask_ShockWaveLightning(u8 taskId) } } -bool8 sub_810B614(struct Task *task, u8 taskId) +static bool8 CreateShockWaveLightningSprite(struct Task *task, u8 taskId) { u8 spriteId = CreateSprite(&gLightningSpriteTemplate, task->data[13], task->data[14], task->data[12]); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].callback = sub_810B684; + gSprites[spriteId].callback = AnimShockWaveLightning; gSprites[spriteId].data[6] = taskId; gSprites[spriteId].data[7] = 10; task->data[10]++; @@ -1319,7 +1319,7 @@ bool8 sub_810B614(struct Task *task, u8 taskId) return FALSE; } -static void sub_810B684(struct Sprite *sprite) +static void AnimShockWaveLightning(struct Sprite *sprite) { if (sprite->animEnded) { diff --git a/src/battle_anim_fight.c b/src/battle_anim_fight.c index 5211860e0..b3399901e 100644 --- a/src/battle_anim_fight.c +++ b/src/battle_anim_fight.c @@ -6,7 +6,7 @@ #include "trig.h" #include "constants/rgb.h" -static void unc_080B08A0(struct Sprite *); +static void AnimUnusedHumanoidFoot(struct Sprite *); static void AnimSlideHandOrFootToTarget(struct Sprite *); static void AnimJumpKick(struct Sprite *); static void AnimBasicFistOrFoot(struct Sprite *); @@ -40,7 +40,7 @@ static void AnimSpinningKickOrPunchFinish(struct Sprite *); extern struct SpriteTemplate gBasicHitSplatSpriteTemplate; // Unused -const struct SpriteTemplate gUnknown_08595E14 = +static const struct SpriteTemplate sUnusedHumanoidFootSpriteTemplate = { .tileTag = ANIM_TAG_HUMANOID_FOOT, .paletteTag = ANIM_TAG_HUMANOID_FOOT, @@ -48,54 +48,46 @@ const struct SpriteTemplate gUnknown_08595E14 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = unc_080B08A0, + .callback = AnimUnusedHumanoidFoot, }; -static const union AnimCmd sAnim_HandOrFoot[] = +static const union AnimCmd sAnim_Fist[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_SlidingKick_0[] = +static const union AnimCmd sAnim_FootWide[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_SlidingKick_1[] = +static const union AnimCmd sAnim_FootTall[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_CrossChopHand_0[] = +static const union AnimCmd sAnim_HandLeft[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_CrossChopHand_1[] = +static const union AnimCmd sAnim_HandRight[] = { ANIMCMD_FRAME(48, 1, .hFlip = TRUE), ANIMCMD_END, }; -static const union AnimCmd *const sAnims_HandOrFoot[] = +static const union AnimCmd *const sAnims_HandsAndFeet[] = { - sAnim_HandOrFoot, -}; - -static const union AnimCmd *const sAnims_SlidingKick[] = -{ - sAnim_SlidingKick_0, - sAnim_SlidingKick_1, -}; - -static const union AnimCmd *const sAnims_CrossChopHand[] = -{ - sAnim_CrossChopHand_0, - sAnim_CrossChopHand_1, + sAnim_Fist, + sAnim_FootWide, + sAnim_FootTall, + sAnim_HandLeft, + sAnim_HandRight, }; const struct SpriteTemplate gKarateChopSpriteTemplate = @@ -103,7 +95,7 @@ const struct SpriteTemplate gKarateChopSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlideHandOrFootToTarget, @@ -114,7 +106,7 @@ const struct SpriteTemplate gJumpKickSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick, @@ -125,7 +117,7 @@ const struct SpriteTemplate gFistFootSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBasicFistOrFoot, @@ -136,7 +128,7 @@ const struct SpriteTemplate gFistFootRandomPosSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFistOrFootRandomPos, @@ -147,7 +139,7 @@ const struct SpriteTemplate gCrossChopHandSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_CrossChopHand, + .anims = &sAnims_HandsAndFeet[3], .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCrossChopHand, @@ -158,7 +150,7 @@ const struct SpriteTemplate gSlidingKickSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_SlidingKick, + .anims = &sAnims_HandsAndFeet[1], .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSlidingKick, @@ -182,7 +174,7 @@ const struct SpriteTemplate gSpinningHandOrFootSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = sAffineAnims_SpinningHandOrFoot, .callback = AnimSpinningKickOrPunch, @@ -205,7 +197,7 @@ const struct SpriteTemplate gMegaPunchKickSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = sAffineAnims_MegaPunchKick, .callback = AnimSpinningKickOrPunch, @@ -216,7 +208,7 @@ const struct SpriteTemplate gStompFootSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_SlidingKick, + .anims = &sAnims_HandsAndFeet[1], .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot, @@ -307,7 +299,7 @@ const struct SpriteTemplate gArmThrustHandSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimArmThrustHit, @@ -411,13 +403,13 @@ const struct SpriteTemplate gFocusPunchFistSpriteTemplate = .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = sAnims_HandOrFoot, + .anims = sAnims_HandsAndFeet, .images = NULL, .affineAnims = sAffineAnims_FocusPunchFist, .callback = AnimFocusPunchFist, }; -static void unc_080B08A0(struct Sprite *sprite) +static void AnimUnusedHumanoidFoot(struct Sprite *sprite) { SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; @@ -835,7 +827,7 @@ static void AnimSuperpowerOrb_Step(struct Sprite *sprite) InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); - sprite->callback = sub_80A6F98; + sprite->callback = AnimTranslateLinear_WaitEnd; } } @@ -931,7 +923,7 @@ static void AnimSuperpowerFireball(struct Sprite *sprite) InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); - sprite->callback = sub_80A6F98; + sprite->callback = AnimTranslateLinear_WaitEnd; } static void AnimArmThrustHit_Step(struct Sprite *sprite) @@ -1008,7 +1000,7 @@ void AnimTask_MoveSkyUppercutBg(u8 taskId) switch (task->data[0]) { case 0: - sub_80A6DAC(0); + UpdateAnimBg3ScreenSize(FALSE); task->data[8] = gBattleAnimArgs[0]; task->data[0]++; break; @@ -1037,7 +1029,7 @@ void AnimTask_MoveSkyUppercutBg(u8 taskId) { gBattle_BG3_X = 0; gBattle_BG3_Y = 0; - sub_80A6DAC(1); + UpdateAnimBg3ScreenSize(TRUE); DestroyAnimVisualTask(taskId); } } diff --git a/src/battle_anim_fire.c b/src/battle_anim_fire.c index c8402f727..e18d72c31 100644 --- a/src/battle_anim_fire.c +++ b/src/battle_anim_fire.c @@ -11,9 +11,9 @@ static void AnimFireSpiralInward(struct Sprite *); static void AnimFireSpread(struct Sprite *); static void AnimFirePlume(struct Sprite *); static void AnimLargeFlame(struct Sprite *); -static void sub_8109028(struct Sprite *); -static void sub_8109064(struct Sprite *); -static void sub_81090D8(struct Sprite *); +static void AnimLargeFlame_Step(struct Sprite *); +static void AnimUnusedSmallEmber(struct Sprite *); +static void AnimUnusedSmallEmber_Step(struct Sprite *); static void AnimSunlight(struct Sprite *); static void AnimEmberFlare(struct Sprite *); static void AnimBurnFlame(struct Sprite *); @@ -162,7 +162,7 @@ const struct SpriteTemplate gFirePlumeSpriteTemplate = }; // Unused -const struct SpriteTemplate gUnknown_08595440 = +static const struct SpriteTemplate sUnusedEmberFirePlumeSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, @@ -173,7 +173,7 @@ const struct SpriteTemplate gUnknown_08595440 = .callback = AnimFirePlume, }; -static const union AnimCmd gUnknown_08595458[] = +static const union AnimCmd sAnim_UnusedSmallEmber[] = { ANIMCMD_FRAME(16, 6), ANIMCMD_FRAME(32, 6), @@ -181,21 +181,21 @@ static const union AnimCmd gUnknown_08595458[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_08595468[] = +static const union AnimCmd *const sAnims_UnusedSmallEmber[] = { - gUnknown_08595458, + sAnim_UnusedSmallEmber, }; // Unused -const struct SpriteTemplate gUnknown_0859546C = +static const struct SpriteTemplate sUnusedSmallEmberSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_08595468, + .anims = sAnims_UnusedSmallEmber, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8109064, + .callback = AnimUnusedSmallEmber, }; static const union AffineAnimCmd sAffineAnim_SunlightRay[] = @@ -292,23 +292,23 @@ static const union AnimCmd *const sAnims_FireBlastCross[] = sAnim_FireBlastCross, }; -static const union AffineAnimCmd gUnknown_08595544[] = +static const union AffineAnimCmd sAffineAnim_Unused_0[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_08595554[] = +static const union AffineAnimCmd sAffineAnim_Unused_1[] = { AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), AFFINEANIMCMD_END, }; // Unused -static const union AffineAnimCmd *const gUnknown_08595564[] = +static const union AffineAnimCmd *const sAffineAnims_Unused[] = { - gUnknown_08595544, - gUnknown_08595554, + sAffineAnim_Unused_0, + sAffineAnim_Unused_1, }; const struct SpriteTemplate gFireBlastCrossSpriteTemplate = @@ -511,7 +511,7 @@ static void AnimFirePlume(struct Sprite *sprite) sprite->data[4] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[5]; - sprite->callback = sub_8109028; + sprite->callback = AnimLargeFlame_Step; } static void AnimLargeFlame(struct Sprite *sprite) @@ -533,10 +533,10 @@ static void AnimLargeFlame(struct Sprite *sprite) sprite->data[4] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[5]; - sprite->callback = sub_8109028; + sprite->callback = AnimLargeFlame_Step; } -static void sub_8109028(struct Sprite *sprite) +static void AnimLargeFlame_Step(struct Sprite *sprite) { if (++sprite->data[0] < sprite->data[4]) { @@ -548,7 +548,7 @@ static void sub_8109028(struct Sprite *sprite) DestroySpriteAndMatrix(sprite); } -static void sub_8109064(struct Sprite *sprite) +static void AnimUnusedSmallEmber(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); @@ -570,10 +570,10 @@ static void sub_8109064(struct Sprite *sprite) sprite->data[4] = gBattleAnimArgs[6]; sprite->data[5] = 0; - sprite->callback = sub_81090D8; + sprite->callback = AnimUnusedSmallEmber_Step; } -static void sub_81090D8(struct Sprite *sprite) +static void AnimUnusedSmallEmber_Step(struct Sprite *sprite) { if (sprite->data[3]) { @@ -611,8 +611,6 @@ static void AnimSunlight(struct Sprite *sprite) StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } -//fire 2 - // Animates the secondary effect of MOVE_EMBER, where the flames grow and slide // horizontally a bit. // arg 0: initial x pixel offset @@ -792,15 +790,14 @@ void AnimTask_EruptionLaunchRocks(u8 taskId) task->func = AnimTask_EruptionLaunchRocks_Step; } -static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTION? +static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[0]) { case 0: - sub_80A805C(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20); - + PrepareEruptAnimTaskData(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 32); task->data[0]++; case 1: if (++task->data[1] > 1) @@ -813,7 +810,7 @@ static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTIO gSprites[task->data[15]].pos2.x = -3; } - if (task->data[5]) + if (task->data[5] != B_SIDE_PLAYER) { if (++task->data[3] > 4) { @@ -822,7 +819,7 @@ static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTIO } } - if(!sub_80A80C8(task)) + if(!UpdateEruptAnimTask(task)) { SetBattlerSpriteYOffsetFromYScale(task->data[15]); gSprites[task->data[15]].pos2.x = 0; @@ -836,20 +833,19 @@ static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTIO case 2: if (++task->data[1] > 4) { - if (task->data[5]) - sub_80A805C(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6); + if (task->data[5] != B_SIDE_PLAYER) + PrepareEruptAnimTaskData(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 6); else - sub_80A805C(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6); + PrepareEruptAnimTaskData(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 6); task->data[1] = 0; task->data[0]++; } break; case 3: - if (!sub_80A80C8(task)) + if (!UpdateEruptAnimTask(task)) { CreateEruptionLaunchRocks(task->data[15], taskId, 6); - task->data[0]++; } break; @@ -866,10 +862,10 @@ static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTIO if (++task->data[3] > 0x18) { - if (task->data[5]) - sub_80A805C(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8); + if (task->data[5] != B_SIDE_PLAYER) + PrepareEruptAnimTaskData(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 8); else - sub_80A805C(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8); + PrepareEruptAnimTaskData(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 8); if (task->data[2] & 1) gSprites[task->data[15]].pos2.y -= 3; @@ -881,14 +877,13 @@ static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTIO } break; case 5: - if (task->data[5]) + if (task->data[5] != B_SIDE_PLAYER) gSprites[task->data[15]].pos1.y--; - if (!sub_80A80C8(task)) + if (!UpdateEruptAnimTask(task)) { gSprites[task->data[15]].pos1.y = task->data[4]; ResetSpriteRotScale(task->data[15]); - task->data[2] = 0; task->data[0]++; } @@ -896,7 +891,6 @@ static void AnimTask_EruptionLaunchRocks_Step(u8 taskId) // animate Move_ERUPTIO case 6: if (!task->data[6]) DestroyAnimVisualTask(taskId); - break; default: break; @@ -955,16 +949,12 @@ static void AnimEruptionLaunchRock(struct Sprite *sprite) static u16 GetEruptionLaunchRockInitialYPos(u8 spriteId) { - u16 y = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY; + s16 y = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) - { - y = ((y << 16) + 0x4A0000) >> 16; - } + y += 74; else - { - y = ((y << 16) + 0x2C0000) >> 16; - } + y += 44; return y; } @@ -1115,7 +1105,7 @@ static void AnimWillOWispOrb(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - sub_80A6FD4(sprite); + InitAnimLinearTranslationWithSpeed(sprite); sprite->callback = AnimWillOWispOrb_Step; } break; @@ -1282,14 +1272,14 @@ static void AnimTask_MoveHeatWaveTargets_Step(u8 taskId) } } -// Used to add a color mask to the battle interface / HUD in Heat Wave. +// Used to add a color mask to the battle background. // arg 0: opacity // arg 1: color code void AnimTask_BlendBackground(u8 taskId) { struct BattleAnimBgData animBg; - sub_80A6B30(&animBg); - BlendPalette(animBg.paletteId * 16, 16, gBattleAnimArgs[0], gBattleAnimArgs[1]); // u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor + GetBattleAnimBg1Data(&animBg); + BlendPalette(animBg.paletteId * 16, 16, gBattleAnimArgs[0], gBattleAnimArgs[1]); DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index f8d47f4ec..9e3e6c33e 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -18,9 +18,9 @@ static void AnimFlyBallUp_Step(struct Sprite *); static void AnimFlyBallAttack(struct Sprite *); static void AnimFlyBallAttack_Step(struct Sprite *); static void AnimFallingFeather(struct Sprite *); -static void sub_810E520(struct Sprite *); -static void sub_810EB40(struct Sprite *); -static void sub_810EA4C(struct Sprite *); +static void AnimFallingFeather_Step(struct Sprite *); +static void AnimWhirlwindLine_Step(struct Sprite *); +static void AnimUnusedBubbleThrow(struct Sprite *); static void AnimWhirlwindLine(struct Sprite *); static void AnimBounceBallShrink(struct Sprite *); static void AnimBounceBallLand(struct Sprite *); @@ -30,8 +30,8 @@ static void AnimDiveBall_Step2(struct Sprite *); static void AnimDiveWaterSplash(struct Sprite *); static void AnimSprayWaterDroplet(struct Sprite *); static void AnimSprayWaterDroplet_Step(struct Sprite *); -static void sub_810F004(struct Sprite *); -static void sub_810F018(struct Sprite *); +static void AnimUnusedFlashingLight(struct Sprite *); +static void AnimUnusedFlashingLight_Step(struct Sprite *); static void AnimSkyAttackBird(struct Sprite *); static void AnimSkyAttackBird_Step(struct Sprite *); static void AnimTask_AnimateGustTornadoPalette_Step(u8); @@ -179,7 +179,8 @@ const struct SpriteTemplate gFallingFeatherSpriteTemplate = .callback = AnimFallingFeather, }; -const struct SpriteTemplate gUnknown_085963A0 = +// Unused +static const struct SpriteTemplate sUnusedBubbleThrowSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, @@ -187,7 +188,7 @@ const struct SpriteTemplate gUnknown_085963A0 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810EA4C, + .callback = AnimUnusedBubbleThrow, }; static const union AnimCmd sAnim_WhirlwindLines[] = @@ -289,7 +290,7 @@ const struct SpriteTemplate gDiveBallSpriteTemplate = .callback = AnimDiveBall, }; -static const union AffineAnimCmd gUnknown_085964A8[] = +static const union AffineAnimCmd sAnim_Unused[] = { AFFINEANIMCMD_FRAME(0x100, 0x0, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x20, 0, 12), @@ -298,9 +299,9 @@ static const union AffineAnimCmd gUnknown_085964A8[] = }; // Unused -static const union AffineAnimCmd *const gUnknown_085964C8[] = +static const union AffineAnimCmd *const sAnims_Unused[] = { - gUnknown_085964A8, + sAnim_Unused, }; const struct SpriteTemplate gDiveWaterSplashSpriteTemplate = @@ -325,7 +326,8 @@ const struct SpriteTemplate gSprayWaterDropletSpriteTemplate = .callback = AnimSprayWaterDroplet, }; -const struct SpriteTemplate gUnknown_085964FC = +// Unused +static const struct SpriteTemplate sUnusedFlashingLightSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, @@ -333,7 +335,7 @@ const struct SpriteTemplate gUnknown_085964FC = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810F004, + .callback = AnimUnusedFlashingLight, }; const struct SpriteTemplate gSkyAttackBirdSpriteTemplate = @@ -494,7 +496,7 @@ static void AnimFlyBallAttack(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { - sprite->pos1.x = 272; + sprite->pos1.x = DISPLAY_WIDTH + 32; sprite->pos1.y = -32; StartSpriteAffineAnim(sprite, 1); } @@ -526,8 +528,8 @@ static void AnimFlyBallAttack_Step(struct Sprite *sprite) } if (sprite->pos1.x + sprite->pos2.x < -32 - || sprite->pos1.x + sprite->pos2.x > 272 - || sprite->pos1.y + sprite->pos2.y > 160) + || sprite->pos1.x + sprite->pos2.x > DISPLAY_WIDTH + 32 + || sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT) { gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = FALSE; DestroyAnimSprite(sprite); @@ -639,10 +641,10 @@ static void AnimFallingFeather(struct Sprite *sprite) gOamMatrices[matrixNum].b = spriteCoord; gOamMatrices[matrixNum].c = -spriteCoord; - sprite->callback = sub_810E520; + sprite->callback = AnimFallingFeather_Step; } -static void sub_810E520(struct Sprite *sprite) +static void AnimFallingFeather_Step(struct Sprite *sprite) { u8 matrixNum, sinIndex; s16 sinVal = 0; @@ -708,7 +710,6 @@ static void sub_810E520(struct Sprite *sprite) } } data->unk0_0d = 0; - data->unk2; } data->unk0_1 = 0; break; @@ -891,7 +892,7 @@ static void sub_810E520(struct Sprite *sprite) } } -static void sub_810EA4C(struct Sprite *sprite) +static void AnimUnusedBubbleThrow(struct Sprite *sprite) { sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); @@ -901,7 +902,7 @@ static void sub_810EA4C(struct Sprite *sprite) static void AnimWhirlwindLine(struct Sprite * sprite) { - u16 arg; + u16 offset; u8 mult; if (gBattleAnimArgs[2] == ANIM_ATTACKER) @@ -919,15 +920,15 @@ static void AnimWhirlwindLine(struct Sprite * sprite) sprite->pos1.x -= 32; sprite->data[1] = 0x0ccc; - arg = gBattleAnimArgs[4]; + offset = gBattleAnimArgs[4]; mult = 12; - sprite->pos2.x += mult * arg; - sprite->data[0] = arg; + sprite->pos2.x += mult * offset; + sprite->data[0] = offset; sprite->data[7] = gBattleAnimArgs[3]; - sprite->callback = sub_810EB40; + sprite->callback = AnimWhirlwindLine_Step; } -static void sub_810EB40(struct Sprite *sprite) +static void AnimWhirlwindLine_Step(struct Sprite *sprite) { sprite->pos2.x += sprite->data[1] >> 8; @@ -1064,9 +1065,9 @@ static void AnimDiveWaterSplash(struct Sprite *sprite) sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1); } - sprite->data[1] = 512; + sprite->data[1] = 0x200; - TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); + TrySetSpriteRotScale(sprite, 0, 0x100, sprite->data[1], 0); sprite->data[0]++; break; case 1: @@ -1077,11 +1078,11 @@ static void AnimDiveWaterSplash(struct Sprite *sprite) sprite->data[2]++; - TrySetSpriteRotScale(sprite, 0, 256, sprite->data[1], 0); + TrySetSpriteRotScale(sprite, 0, 0x100, sprite->data[1], 0); matrixNum = sprite->oam.matrixNum; - t1 = 15616; + t1 = 0x3D00; t2 = t1 / gOamMatrices[matrixNum].d + 1; if (t2 > 128) @@ -1092,7 +1093,7 @@ static void AnimDiveWaterSplash(struct Sprite *sprite) if (sprite->data[2] == 24) { - sub_80A749C(sprite); + ResetSpriteRotScale_PreserveAffine(sprite); DestroyAnimSprite(sprite); } break; @@ -1157,14 +1158,14 @@ static void AnimSprayWaterDroplet_Step(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void sub_810F004(struct Sprite *sprite) +static void AnimUnusedFlashingLight(struct Sprite *sprite) { sprite->data[6] = 0; sprite->data[7] = 64; - sprite->callback = sub_810F018; + sprite->callback = AnimUnusedFlashingLight_Step; } -static void sub_810F018(struct Sprite *sprite) +static void AnimUnusedFlashingLight_Step(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -1219,7 +1220,8 @@ void AnimSkyAttackBird_Step(struct Sprite *sprite) DestroySpriteAndMatrix(sprite); } -void unref_sub_810F184(u8 taskId) +// Unused +static void AnimTask_SetAttackerVisibility(u8 taskId) { if (gBattleAnimArgs[0] == 0) { diff --git a/src/battle_anim_ghost.c b/src/battle_anim_ghost.c index 632954351..e7cd4b253 100644 --- a/src/battle_anim_ghost.c +++ b/src/battle_anim_ghost.c @@ -13,7 +13,7 @@ static void AnimConfuseRayBallBounce(struct Sprite *); static void AnimConfuseRayBallBounce_Step1(struct Sprite *); static void AnimConfuseRayBallBounce_Step2(struct Sprite *); -static void sub_8111764(struct Sprite *); +static void UpdateConfuseRayBallBlend(struct Sprite *); static void AnimConfuseRayBallSpiral(struct Sprite *); static void AnimConfuseRayBallSpiral_Step(struct Sprite *); static void AnimTask_NightShadeClone_Step1(u8 taskId); @@ -39,8 +39,8 @@ static void AnimGhostStatusSprite(struct Sprite *); static void AnimGhostStatusSprite_Step(struct Sprite *); static void AnimTask_GrudgeFlames_Step(u8 taskId); static void AnimGrudgeFlame(struct Sprite *); -static void sub_8112F60(struct Sprite *); -static void sub_8112FB8(struct Sprite *); +static void AnimMonMoveCircular(struct Sprite *); +static void AnimMonMoveCircular_Step(struct Sprite *); static const union AffineAnimCmd sAffineAnim_ConfuseRayBallBounce[] = { @@ -124,16 +124,16 @@ const struct SpriteTemplate gLickSpriteTemplate = .callback = AnimLick, }; -static const union AffineAnimCmd gUnknown_08596DA4[] = +static const union AffineAnimCmd sAffineAnim_Unused[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END, }; // Unused -static const union AffineAnimCmd *const gUnknown_08596DB4[] = +static const union AffineAnimCmd *const sAffineAnims_Unused[] = { - gUnknown_08596DA4, + sAffineAnim_Unused, }; const struct SpriteTemplate gDestinyBondWhiteShadowSpriteTemplate = @@ -206,7 +206,7 @@ const struct SpriteTemplate gGrudgeFlameSpriteTemplate = }; // Unused -const struct SpriteTemplate gUnknown_08596E48 = +static const struct SpriteTemplate sMonMoveCircularSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -214,18 +214,18 @@ const struct SpriteTemplate gUnknown_08596E48 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8112F60, + .callback = AnimMonMoveCircular, }; static void AnimConfuseRayBallBounce(struct Sprite *sprite) { - InitSpritePosToAnimAttacker(sprite, 1); + InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); - sub_80A6FD4(sprite); + InitAnimLinearTranslationWithSpeed(sprite); sprite->callback = AnimConfuseRayBallBounce_Step1; sprite->data[6] = 16; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); @@ -236,7 +236,7 @@ static void AnimConfuseRayBallBounce_Step1(struct Sprite *sprite) { s16 r0; s16 r2; - sub_8111764(sprite); + UpdateConfuseRayBallBlend(sprite); if (AnimTranslateLinear(sprite)) { sprite->callback = AnimConfuseRayBallBounce_Step2; @@ -280,13 +280,11 @@ static void AnimConfuseRayBallBounce_Step2(struct Sprite *sprite) sprite->callback = DestroyAnimSpriteAndDisableBlend; } else - sub_8111764(sprite); + UpdateConfuseRayBallBlend(sprite); } -static void sub_8111764(struct Sprite *sprite) +static void UpdateConfuseRayBallBlend(struct Sprite *sprite) { - - s16 r0; if (sprite->data[6] > 0xFF) { if (++sprite->data[6] == 0x10d) @@ -294,10 +292,7 @@ static void sub_8111764(struct Sprite *sprite) return; } - r0 = sprite->data[7]; - sprite->data[7]++; - - if ((r0 & 0xFF) == 0) + if ((sprite->data[7]++ & 0xFF) == 0) { sprite->data[7] &= 0xff00; if ((sprite->data[7] & 0x100) != 0) @@ -648,7 +643,7 @@ static void AnimTask_SpiteTargetShadow_Step1(u8 taskId) break; case 1: task->data[14] = (task->data[14] + 16) * 16; - CpuSet(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], 0x4000008); + CpuCopy32(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], 32); BlendPalette(task->data[4], 16, 10, RGB(13, 0, 15)); task->data[15]++; break; @@ -955,19 +950,19 @@ void AnimTask_CurseStretchingBlackBg(u8 taskId) SetGpuReg(REG_OFFSET_WINOUT, ((WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ) | (WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR))); SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_DARKEN)); - SetGpuReg(REG_OFFSET_BLDY, 0x10); + SetGpuReg(REG_OFFSET_BLDY, 16); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest()) startX = 40; else startX = 200; - gBattle_WIN0H = (startX << 8) | startX; + gBattle_WIN0H = WIN_RANGE(startX, startX); startY = 40; - gBattle_WIN0V = (startY << 8) | startY; + gBattle_WIN0V = WIN_RANGE(startY, startY); leftDistance = startX; - rightDistance = 240 - startX; + rightDistance = DISPLAY_WIDTH - startX; topDistance = startY; bottomDistance = 72; gTasks[taskId].data[1] = leftDistance; @@ -1006,16 +1001,16 @@ static void AnimTask_CurseStretchingBlackBg_Step1(u8 taskId) else { left = 0; - right = 240; + right = DISPLAY_WIDTH; top = 0; bottom = 112; - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0); BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0)); gTasks[taskId].func = AnimTask_CurseStretchingBlackBg_Step2; } - gBattle_WIN0H = (left << 8) | right; - gBattle_WIN0V = (top << 8) | bottom; + gBattle_WIN0H = WIN_RANGE(left, right); + gBattle_WIN0V = WIN_RANGE(top, bottom); } static void AnimTask_CurseStretchingBlackBg_Step2(u8 taskId) @@ -1307,7 +1302,7 @@ static void AnimGrudgeFlame(struct Sprite *sprite) } } -static void sub_8112F60(struct Sprite *sprite) +static void AnimMonMoveCircular(struct Sprite *sprite) { sprite->invisible = TRUE; sprite->data[5] = gBattlerSpriteIds[gBattleAnimAttacker]; @@ -1315,12 +1310,12 @@ static void sub_8112F60(struct Sprite *sprite) sprite->data[1] = 10; sprite->data[2] = gBattleAnimArgs[0]; sprite->data[3] = gBattleAnimArgs[1]; - sprite->callback = sub_8112FB8; + sprite->callback = AnimMonMoveCircular_Step; gSprites[sprite->data[5]].pos1.y += 8; } -static void sub_8112FB8(struct Sprite *sprite) +static void AnimMonMoveCircular_Step(struct Sprite *sprite) { if (sprite->data[3]) { diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index 875ecbd75..aa089394e 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -21,11 +21,11 @@ static void AnimTask_DigBounceMovement(u8); static void AnimTask_DigEndBounceMovementSetInvisible(u8); static void AnimTask_DigSetVisibleUnderground(u8); static void AnimTask_DigRiseUpFromHole(u8); -static void sub_81150E0(u8, s16, s16); +static void SetDigScanlineEffect(u8, s16, s16); static void AnimTask_ShakeTerrain(u8); static void AnimTask_ShakeBattlers(u8); static void SetBattlersXOffsetForShake(struct Task *); -static void sub_81156D0(u8); +static void WaitForFissureCompletion(u8); static const union AffineAnimCmd sAffineAnim_Bonemerang[] = { @@ -299,7 +299,7 @@ void AnimTask_DigDownMovement(u8 taskId) static void AnimTask_DigBounceMovement(u8 taskId) { - u8 var0; + u8 y; struct Task *task = &gTasks[taskId]; switch (task->data[0]) @@ -318,9 +318,9 @@ static void AnimTask_DigBounceMovement(u8 taskId) task->data[13] = gBattle_BG2_Y; } - var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker); - task->data[14] = var0 - 32; - task->data[15] = var0 + 32; + y = GetBattlerYCoordWithElevation(gBattleAnimAttacker); + task->data[14] = y - 32; + task->data[15] = y + 32; if (task->data[14] < 0) task->data[14] = 0; @@ -328,7 +328,7 @@ static void AnimTask_DigBounceMovement(u8 taskId) task->data[0]++; break; case 1: - sub_81150E0(task->data[11], task->data[14], task->data[15]); + SetDigScanlineEffect(task->data[11], task->data[14], task->data[15]); task->data[0]++; break; case 2: @@ -353,7 +353,7 @@ static void AnimTask_DigBounceMovement(u8 taskId) else gBattle_BG2_Y = task->data[13] - task->data[5]; - gSprites[task->data[10]].pos2.x = 272 - gSprites[task->data[10]].pos1.x; + gSprites[task->data[10]].pos2.x = DISPLAY_WIDTH + 32 - gSprites[task->data[10]].pos1.x; task->data[0]++; } break; @@ -405,7 +405,7 @@ static void AnimTask_DigSetVisibleUnderground(u8 taskId) task->data[10] = GetAnimBattlerSpriteId(ANIM_ATTACKER); gSprites[task->data[10]].invisible = FALSE; gSprites[task->data[10]].pos2.x = 0; - gSprites[task->data[10]].pos2.y = 160 - gSprites[task->data[10]].pos1.y; + gSprites[task->data[10]].pos2.y = DISPLAY_HEIGHT - gSprites[task->data[10]].pos1.y; task->data[0]++; break; case 1: @@ -434,7 +434,7 @@ static void AnimTask_DigRiseUpFromHole(u8 taskId) task->data[0]++; break; case 1: - sub_81150E0(task->data[11], 0, task->data[15]); + SetDigScanlineEffect(task->data[11], 0, task->data[15]); task->data[0]++; break; case 2: @@ -455,7 +455,7 @@ static void AnimTask_DigRiseUpFromHole(u8 taskId) } } -static void sub_81150E0(u8 useBG1, s16 y, s16 endY) +static void SetDigScanlineEffect(u8 useBG1, s16 y, s16 endY) { s16 bgX; struct ScanlineEffectParams scanlineParams; @@ -603,7 +603,7 @@ void AnimTask_HorizontalShake(u8 taskId) break; default: // Shake specific battler task->tbattlerSpriteIds(0) = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (task->tbattlerSpriteIds(0) == 0xFF) + if (task->tbattlerSpriteIds(0) == SPRITE_NONE) { DestroyAnimVisualTask(taskId); } @@ -743,21 +743,23 @@ void AnimTask_PositionFissureBgOnBattler(u8 taskId) u8 battler = (gBattleAnimArgs[0] & ANIM_TARGET) ? gBattleAnimTarget : gBattleAnimAttacker; if (gBattleAnimArgs[0] > ANIM_TARGET) - battler ^= 2; + battler = BATTLE_PARTNER(battler); - newTask = &gTasks[CreateTask(sub_81156D0, gBattleAnimArgs[1])]; - newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, 2)) & 0x1FF; - newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, 3)) & 0xFF; + newTask = &gTasks[CreateTask(WaitForFissureCompletion, gBattleAnimArgs[1])]; + newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2)) & 0x1FF; + newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET)) & 0xFF; gBattle_BG3_X = newTask->data[1]; gBattle_BG3_Y = newTask->data[2]; newTask->data[3] = gBattleAnimArgs[2]; DestroyAnimVisualTask(taskId); } -static void sub_81156D0(u8 taskId) +static void WaitForFissureCompletion(u8 taskId) { struct Task *task = &gTasks[taskId]; + // Holds the BG3 offsets until gBattleAnimArgs[7] + // is set to a special terminator value. if (gBattleAnimArgs[7] == task->data[3]) { gBattle_BG3_X = 0; diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 24ddf3b32..23b0f6c3b 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -20,8 +20,8 @@ struct HailStruct { s32 unk3:4; }; -static void sub_810B6C4(struct Sprite *); -static void sub_810B848(struct Sprite *); +static void AnimUnusedIceCrystalThrow(struct Sprite *); +static void AnimUnusedIceCrystalThrow_Step(struct Sprite *); static void AnimIcePunchSwirlingParticle(struct Sprite *); static void AnimIceBeamParticle(struct Sprite *); static void AnimIceEffectParticle(struct Sprite *); @@ -44,25 +44,25 @@ static void InitIceBallAnim(struct Sprite *); static void AnimThrowIceBall(struct Sprite *); static void InitIceBallParticle(struct Sprite *); static void AnimIceBallParticle(struct Sprite *); -static void AnimTask_Haze2(u8); -static void AnimTask_OverlayFogTiles(u8); +static void AnimTask_HazeScrollingFog_Step(u8); +static void AnimTask_LoadMistTiles_Step(u8); static void AnimTask_Hail2(u8); static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c); -static const union AnimCmd gUnknown_08595A48[] = +static const union AnimCmd sAnim_Unused[] = { ANIMCMD_FRAME(0, 5, .hFlip = TRUE), ANIMCMD_FRAME(1, 5, .hFlip = TRUE), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_08595A54[] = +static const union AnimCmd *const sAnims_Unused[] = { - gUnknown_08595A48, + sAnim_Unused, }; // Unused -const struct SpriteTemplate gUnknown_08595A58 = +static const struct SpriteTemplate sUnusedIceCrystalThrowSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, @@ -70,10 +70,10 @@ const struct SpriteTemplate gUnknown_08595A58 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_810B6C4, + .callback = AnimUnusedIceCrystalThrow, }; -static const union AnimCmd gUnknown_08595A70[] = +static const union AnimCmd sAnim_IceCrystalLargeChunk[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, @@ -110,10 +110,10 @@ static const union AnimCmd sAnim_SmallBubblePair[] = ANIMCMD_JUMP(0), }; -// Unused -static const union AnimCmd *const gUnknown_08595AA4[] = +// Unused, contains just the top left corner of the large ice crystal +static const union AnimCmd *const sAnims_IceCrystalLargeChunk[] = { - gUnknown_08595A70, + sAnim_IceCrystalLargeChunk, }; static const union AnimCmd *const sAnims_IceCrystalLarge[] = @@ -337,7 +337,7 @@ const struct SpriteTemplate gSmogCloudSpriteTemplate = .callback = InitSwirlingFogAnim, }; -static const u8 sUnknown_08595C5C[] = +static const u8 sHazeBlendAmounts[] = { 0, 1, 2, 2, 2, 2, 3, 4, 4, 4, 5, 6, 6, 6, 6, 7, 8, 8, 8, 9, }; @@ -353,7 +353,7 @@ const struct SpriteTemplate gMistBallSpriteTemplate = .callback = AnimThrowMistBall, }; -static const u8 sUnknown_08595C88[] = +static const u8 wMistBlendAmounts[] = { 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, }; @@ -524,7 +524,7 @@ const struct SpriteTemplate gIceBallImpactShardSpriteTemplate = }; // Unused -static void sub_810B6C4(struct Sprite *sprite) +static void AnimUnusedIceCrystalThrow(struct Sprite *sprite) { s16 targetX, targetY, attackerX, attackerY; @@ -540,13 +540,13 @@ static void sub_810B6C4(struct Sprite *sprite) sprite->data[4] = gBattleAnimArgs[3] + targetY; sub_80A64EC(sprite); - for (;(targetX >= -32 && targetX <= 272) && (targetY >= -32 && targetY <= 192); + for (;(targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32); targetX += sprite->data[1], targetY += sprite->data[2]) ; sprite->data[1] = -sprite->data[1]; sprite->data[2] = -sprite->data[2]; - for (;(attackerX >= -32 && attackerX <= 272) && (attackerY >= -32 && attackerY <= 192); + for (;(attackerX >= -32 && attackerX <= DISPLAY_WIDTH + 32) && (attackerY >= -32 && attackerY <= DISPLAY_HEIGHT + 32); attackerX += sprite->data[1], attackerY += sprite->data[2]) ; @@ -560,10 +560,10 @@ static void sub_810B6C4(struct Sprite *sprite) sub_80A64EC(sprite); sprite->data[3] = gBattleAnimArgs[5]; sprite->data[4] = gBattleAnimArgs[6]; - sprite->callback = sub_810B848; + sprite->callback = AnimUnusedIceCrystalThrow_Step; } -static void sub_810B848(struct Sprite *sprite) +static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite) { if (sprite->data[0] != 0) { @@ -696,8 +696,8 @@ static void AnimSwirlingSnowball(struct Sprite *sprite) sprite->data[0] = 1; AnimFastTranslateLinear(sprite); - if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 - || sprite->pos1.y + sprite->pos2.y > 160 + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > DISPLAY_WIDTH + 32 + || sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT || sprite->pos1.y + sprite->pos2.y < -16) break; } @@ -710,7 +710,7 @@ static void AnimSwirlingSnowball(struct Sprite *sprite) for (i = 0; i < 8; i++) sprite->data[i] = tempDataHolder[i]; - sprite->callback = sub_80A718C; + sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos; StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1); } @@ -762,7 +762,7 @@ static void AnimSwirlingSnowball_End(struct Sprite *sprite) sprite->data[0] = 1; AnimFastTranslateLinear(sprite); - if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > DISPLAY_WIDTH + 32 || sprite->pos1.y + sprite->pos2.y > 256 || sprite->pos1.y + sprite->pos2.y < -16) DestroyAnimSprite(sprite); @@ -816,8 +816,8 @@ static void AnimMoveParticleBeyondTarget(struct Sprite *sprite) { sprite->data[0] = 1; AnimFastTranslateLinear(sprite); - if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 - || sprite->pos1.y + sprite->pos2.y > 160 + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > DISPLAY_WIDTH + 32 + || sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT || sprite->pos1.y + sprite->pos2.y < -16) break; } @@ -846,8 +846,8 @@ static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite) sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF; if (sprite->data[0] == 1) { - if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > 272 - || sprite->pos1.y + sprite->pos2.y > 160 + if ((u32)(sprite->pos1.x + sprite->pos2.x + 16) > DISPLAY_WIDTH + 32 + || sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT || sprite->pos1.y + sprite->pos2.y < -16) DestroyAnimSprite(sprite); } @@ -998,15 +998,15 @@ void AnimTask_HazeScrollingFog(u8 taskId) SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset); AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, 0); - LoadPalette(&gUnknown_083970E8, animBg.paletteId * 16, 32); + LoadPalette(&gFogPalette, animBg.paletteId * 16, 32); - gTasks[taskId].func = AnimTask_Haze2; + gTasks[taskId].func = AnimTask_HazeScrollingFog_Step; } -static void AnimTask_Haze2(u8 taskId) +static void AnimTask_HazeScrollingFog_Step(u8 taskId) { struct BattleAnimBgData animBg; @@ -1020,7 +1020,7 @@ static void AnimTask_Haze2(u8 taskId) { gTasks[taskId].data[10] = 0; gTasks[taskId].data[9]++; - gTasks[taskId].data[11] = sUnknown_08595C5C[gTasks[taskId].data[9]]; + gTasks[taskId].data[11] = sHazeBlendAmounts[gTasks[taskId].data[9]]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 9) @@ -1052,12 +1052,10 @@ static void AnimTask_Haze2(u8 taskId) } break; case 3: - sub_80A6B30(&animBg); - sub_80A6C68(1); - sub_80A6C68(2); - + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(1); + ClearBattleAnimBg(2); gTasks[taskId].data[12]++; - // fall through case 4: if (!IsContest()) @@ -1105,16 +1103,16 @@ void AnimTask_LoadMistTiles(u8 taskId) SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset); AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, 0); - LoadPalette(&gUnknown_083970E8, animBg.paletteId * 16, 32); + LoadPalette(&gFogPalette, animBg.paletteId * 16, 32); gTasks[taskId].data[15] = -1; - gTasks[taskId].func = AnimTask_OverlayFogTiles; + gTasks[taskId].func = AnimTask_LoadMistTiles_Step; } -static void AnimTask_OverlayFogTiles(u8 taskId) +static void AnimTask_LoadMistTiles_Step(u8 taskId) { struct BattleAnimBgData animBg; @@ -1125,7 +1123,7 @@ static void AnimTask_OverlayFogTiles(u8 taskId) { case 0: gTasks[taskId].data[9] += 1; - gTasks[taskId].data[11] = sUnknown_08595C88[gTasks[taskId].data[9]]; + gTasks[taskId].data[11] = wMistBlendAmounts[gTasks[taskId].data[9]]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11])); if (gTasks[taskId].data[11] == 5) { @@ -1154,9 +1152,9 @@ static void AnimTask_OverlayFogTiles(u8 taskId) } break; case 3: - sub_80A6B30(&animBg); - sub_80A6C68(1); - sub_80A6C68(2); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(1); + ClearBattleAnimBg(2); gTasks[taskId].data[12]++; @@ -1311,7 +1309,7 @@ static void MovePoisonGasCloud(struct Sprite *sprite) sprite->data[7]++; sprite->pos2.x = sprite->pos2.y = 0; - sub_80A6FD4(sprite); + InitAnimLinearTranslationWithSpeed(sprite); } break; case 2: diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index e789e4680..b9c4c7b30 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -94,7 +94,7 @@ void AnimTask_ShakeMon(u8 taskId) { u8 spriteId; spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (spriteId == 0xff) + if (spriteId == SPRITE_NONE) { DestroyAnimVisualTask(taskId); return; @@ -162,7 +162,7 @@ void AnimTask_ShakeMon2(u8 taskId) if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT) { spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (spriteId == 0xff) + if (spriteId == SPRITE_NONE) { DestroyAnimVisualTask(taskId); return; @@ -255,7 +255,7 @@ static void AnimTask_ShakeMon2_Step(u8 taskId) void AnimTask_ShakeMonInPlace(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (spriteId == 0xff) + if (spriteId == SPRITE_NONE) { DestroyAnimVisualTask(taskId); return; diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index d626e1604..2082512ff 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -16,27 +16,20 @@ #include "util.h" #include "constants/battle_anim.h" -#define GET_UNOWN_LETTER(personality) (( \ - (((personality & 0x03000000) >> 24) << 6) \ - | (((personality & 0x00030000) >> 16) << 4) \ - | (((personality & 0x00000300) >> 8) << 2) \ - | (((personality & 0x00000003) >> 0) << 0) \ -) % 28) - #define IS_DOUBLE_BATTLE() ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) extern const struct OamData gOamData_AffineNormal_ObjNormal_64x64; static void sub_80A6FB4(struct Sprite *sprite); -static void sub_80A7144(struct Sprite *sprite); +static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite); static void AnimThrowProjectile_Step(struct Sprite *sprite); static void sub_80A8DFC(struct Sprite *sprite); -static void sub_80A8E88(struct Sprite *sprite); +static void AnimWeatherBallUp_Step(struct Sprite *sprite); static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId); static void AnimTask_BlendPalInAndOutSetup(struct Task *task); -static void sub_80A7AFC(u8 taskId); -static void sub_80A8CAC(u8 taskId); -static void AnimTask_BlendMonInAndOutStep(u8 taskId); +static void AnimTask_AlphaFadeIn_Step(u8 taskId); +static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId); +static void AnimTask_BlendMonInAndOut_Step(u8 taskId); static bool8 sub_80A7238(void); static void sub_80A8D78(struct Task *task, u8 taskId); @@ -86,11 +79,15 @@ static const u8 sCastformBackSpriteYCoords[] = 0, // HAIL }; -static const struct SpriteTemplate sUnknown_08525F90[] = +// Placeholders for pokemon sprites to be created for a move animation effect (e.g. Role Play / Snatch) +#define TAG_MOVE_EFFECT_MON_1 55125 +#define TAG_MOVE_EFFECT_MON_2 55126 + +static const struct SpriteTemplate sSpriteTemplate_MoveEffectMons[] = { { - .tileTag = 55125, - .paletteTag = 55125, + .tileTag = TAG_MOVE_EFFECT_MON_1, + .paletteTag = TAG_MOVE_EFFECT_MON_1, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -98,8 +95,8 @@ static const struct SpriteTemplate sUnknown_08525F90[] = .callback = SpriteCallbackDummy, }, { - .tileTag = 55126, - .paletteTag = 55126, + .tileTag = TAG_MOVE_EFFECT_MON_2, + .paletteTag = TAG_MOVE_EFFECT_MON_2, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, @@ -108,10 +105,10 @@ static const struct SpriteTemplate sUnknown_08525F90[] = } }; -static const struct SpriteSheet sUnknown_08525FC0[] = +static const struct SpriteSheet sSpriteSheet_MoveEffectMons[] = { - { gMiscBlank_Gfx, 0x800, 55125, }, - { gMiscBlank_Gfx, 0x800, 55126, }, + { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_1, }, + { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_2, }, }; u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) @@ -852,90 +849,90 @@ bool8 IsDoubleBattle(void) return IS_DOUBLE_BATTLE(); } -void sub_80A6B30(struct BattleAnimBgData *unk) +void GetBattleAnimBg1Data(struct BattleAnimBgData *out) { if (IsContest()) { - unk->bgTiles = gUnknown_0202305C; - unk->bgTilemap = (u16 *)gUnknown_02023060; - unk->paletteId = 14; - unk->bgId = 1; - unk->tilesOffset = 0; - unk->unused = 0; + out->bgTiles = gUnknown_0202305C; + out->bgTilemap = (u16 *)gUnknown_02023060; + out->paletteId = 14; + out->bgId = 1; + out->tilesOffset = 0; + out->unused = 0; } else { - unk->bgTiles = gUnknown_0202305C; - unk->bgTilemap = (u16 *)gUnknown_02023060; - unk->paletteId = 8; - unk->bgId = 1; - unk->tilesOffset = 0x200; - unk->unused = 0; + out->bgTiles = gUnknown_0202305C; + out->bgTilemap = (u16 *)gUnknown_02023060; + out->paletteId = 8; + out->bgId = 1; + out->tilesOffset = 0x200; + out->unused = 0; } } -void sub_80A6B90(struct BattleAnimBgData *unk, u32 arg1) +void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId) { if (IsContest()) { - unk->bgTiles = gUnknown_0202305C; - unk->bgTilemap = (u16 *)gUnknown_02023060; - unk->paletteId = 14; - unk->bgId = 1; - unk->tilesOffset = 0; - unk->unused = 0; + out->bgTiles = gUnknown_0202305C; + out->bgTilemap = (u16 *)gUnknown_02023060; + out->paletteId = 14; + out->bgId = 1; + out->tilesOffset = 0; + out->unused = 0; } - else if (arg1 == 1) + else if (bgId == 1) { - sub_80A6B30(unk); + GetBattleAnimBg1Data(out); } else { - unk->bgTiles = gUnknown_0202305C; - unk->bgTilemap = (u16 *)gUnknown_02023060; - unk->paletteId = 9; - unk->bgId = 2; - unk->tilesOffset = 0x300; - unk->unused = 0; + out->bgTiles = gUnknown_0202305C; + out->bgTilemap = (u16 *)gUnknown_02023060; + out->paletteId = 9; + out->bgId = 2; + out->tilesOffset = 0x300; + out->unused = 0; } } -void sub_80A6BFC(struct BattleAnimBgData *unk, u8 unused) +void sub_80A6BFC(struct BattleAnimBgData *out, u8 unused) { - unk->bgTiles = gUnknown_0202305C; - unk->bgTilemap = (u16 *)gUnknown_02023060; + out->bgTiles = gUnknown_0202305C; + out->bgTilemap = (u16 *)gUnknown_02023060; if (IsContest()) { - unk->paletteId = 14; - unk->bgId = 1; - unk->tilesOffset = 0; - unk->unused = 0; + out->paletteId = 14; + out->bgId = 1; + out->tilesOffset = 0; + out->unused = 0; } else if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) { - unk->paletteId = 8; - unk->bgId = 1; - unk->tilesOffset = 0x200; - unk->unused = 0; + out->paletteId = 8; + out->bgId = 1; + out->tilesOffset = 0x200; + out->unused = 0; } else { - unk->paletteId = 9; - unk->bgId = 2; - unk->tilesOffset = 0x300; - unk->unused = 0; + out->paletteId = 9; + out->bgId = 2; + out->tilesOffset = 0x300; + out->unused = 0; } } -void sub_80A6C68(u32 bgId) +void ClearBattleAnimBg(u32 bgId) { - struct BattleAnimBgData unkStruct; + struct BattleAnimBgData bgAnimData; - sub_80A6B90(&unkStruct, bgId); - CpuFill32(0, unkStruct.bgTiles, 0x2000); - LoadBgTiles(unkStruct.bgId, unkStruct.bgTiles, 0x2000, unkStruct.tilesOffset); - FillBgTilemapBufferRect(unkStruct.bgId, 0, 0, 0, 32, 64, 17); - CopyBgTilemapBufferToVram(unkStruct.bgId); + GetBattleAnimBgData(&bgAnimData, bgId); + CpuFill32(0, bgAnimData.bgTiles, 0x2000); + LoadBgTiles(bgAnimData.bgId, bgAnimData.bgTiles, 0x2000, bgAnimData.tilesOffset); + FillBgTilemapBufferRect(bgAnimData.bgId, 0, 0, 0, 32, 64, 17); + CopyBgTilemapBufferToVram(bgAnimData.bgId); } void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset) @@ -973,9 +970,9 @@ u8 GetBattleBgPaletteNum(void) return 2; } -void sub_80A6DAC(bool8 arg0) +void UpdateAnimBg3ScreenSize(bool8 largeScreenSize) { - if (!arg0 || IsContest()) + if (!largeScreenSize || IsContest()) { SetAnimBgAttribute(3, BG_ANIM_SCREEN_SIZE, 0); SetAnimBgAttribute(3, BG_ANIM_AREA_OVERFLOW_MODE, 1); @@ -1039,7 +1036,7 @@ void StartAnimLinearTranslation(struct Sprite *sprite) sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; InitAnimLinearTranslation(sprite); - sprite->callback = sub_80A6F98; + sprite->callback = AnimTranslateLinear_WaitEnd; sprite->callback(sprite); } @@ -1082,7 +1079,7 @@ bool8 AnimTranslateLinear(struct Sprite *sprite) return FALSE; } -void sub_80A6F98(struct Sprite *sprite) +void AnimTranslateLinear_WaitEnd(struct Sprite *sprite) { if (AnimTranslateLinear(sprite)) SetCallbackToStoredInData6(sprite); @@ -1095,19 +1092,19 @@ static void sub_80A6FB4(struct Sprite *sprite) SetCallbackToStoredInData6(sprite); } -void sub_80A6FD4(struct Sprite *sprite) +void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite) { int v1 = abs(sprite->data[2] - sprite->data[1]) << 8; sprite->data[0] = v1 / sprite->data[0]; InitAnimLinearTranslation(sprite); } -void sub_80A7000(struct Sprite *sprite) +void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; - sub_80A6FD4(sprite); - sprite->callback = sub_80A6F98; + InitAnimLinearTranslationWithSpeed(sprite); + sprite->callback = AnimTranslateLinear_WaitEnd; sprite->callback(sprite); } @@ -1144,7 +1141,7 @@ void InitAndRunAnimFastLinearTranslation(struct Sprite *sprite) sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; InitAnimFastLinearTranslation(sprite); - sprite->callback = sub_80A7144; + sprite->callback = AnimFastTranslateLinearWaitEnd; sprite->callback(sprite); } @@ -1178,7 +1175,7 @@ bool8 AnimFastTranslateLinear(struct Sprite *sprite) return FALSE; } -static void sub_80A7144(struct Sprite *sprite) +static void AnimFastTranslateLinearWaitEnd(struct Sprite *sprite) { if (AnimFastTranslateLinear(sprite)) SetCallbackToStoredInData6(sprite); @@ -1191,12 +1188,12 @@ void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite) InitAnimFastLinearTranslation(sprite); } -void sub_80A718C(struct Sprite *sprite) +void InitAnimFastLinearTranslationWithSpeedAndPos(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; InitAnimFastLinearTranslationWithSpeed(sprite); - sprite->callback = sub_80A7144; + sprite->callback = AnimFastTranslateLinearWaitEnd; sprite->callback(sprite); } @@ -1295,7 +1292,7 @@ void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 x } } -void sub_80A749C(struct Sprite *sprite) +void ResetSpriteRotScale_PreserveAffine(struct Sprite *sprite) { TrySetSpriteRotScale(sprite, TRUE, 0x100, 0x100, 0); sprite->affineAnimPaused = FALSE; @@ -1342,7 +1339,7 @@ void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) } } -u32 sub_80A75AC(u8 battleBackground, u8 attacker, u8 target, u8 attackerPartner, u8 targetPartner, u8 a6, u8 a7) +u32 GetBattleBgPalettesMask(u8 battleBackground, u8 attacker, u8 target, u8 attackerPartner, u8 targetPartner, u8 a6, u8 a7) { u32 selectedPalettes = 0; u32 shift; @@ -1395,59 +1392,60 @@ u32 sub_80A75AC(u8 battleBackground, u8 attacker, u8 target, u8 attackerPartner, return selectedPalettes; } -u32 sub_80A76C4(u8 a1, u8 a2, u8 a3, u8 a4) +u32 GetBattleMonSpritePalettesMask(u8 playerLeft, u8 playerRight, u8 opponentLeft, u8 opponentRight) { - u32 var = 0; + u32 selectedPalettes = 0; u32 shift; if (IsContest()) { - if (a1) + if (playerLeft) { - var |= 1 << 18; - return var; + selectedPalettes |= 1 << 18; + return selectedPalettes; } } else { - if (a1) + if (playerLeft) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_LEFT))) { - var |= 1 << (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) + 16); + selectedPalettes |= 1 << (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) + 16); } } - if (a2) + if (playerRight) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))) { shift = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT) + 16; - var |= 1 << shift; + selectedPalettes |= 1 << shift; } } - if (a3) + if (opponentLeft) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))) { shift = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT) + 16; - var |= 1 << shift; + selectedPalettes |= 1 << shift; } } - if (a4) + if (opponentRight) { if (IsBattlerSpriteVisible(GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))) { shift = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT) + 16; - var |= 1 << shift; + selectedPalettes |= 1 << shift; } } } - return var; + return selectedPalettes; } -u8 sub_80A77AC(u8 a1) +// Presumably something commented here, just returns arg +u8 AnimDummyReturnArg(u8 battler) { - return a1; + return battler; } static u8 GetBattlerAtPosition_(u8 position) @@ -1571,7 +1569,7 @@ s16 CloneBattlerSpriteWithBlend(u8 animBattler) u16 i; u8 spriteId = GetAnimBattlerSpriteId(animBattler); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) { for (i = 0; i < MAX_SPRITES; i++) { @@ -1618,10 +1616,10 @@ void AnimTask_AlphaFadeIn(u8 taskId) gTasks[taskId].data[7] = gBattleAnimArgs[2]; gTasks[taskId].data[8] = gBattleAnimArgs[3]; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gBattleAnimArgs[0], gBattleAnimArgs[1])); - gTasks[taskId].func = sub_80A7AFC; + gTasks[taskId].func = AnimTask_AlphaFadeIn_Step; } -static void sub_80A7AFC(u8 taskId) +static void AnimTask_AlphaFadeIn_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1657,7 +1655,7 @@ static void sub_80A7AFC(u8 taskId) void AnimTask_BlendMonInAndOut(u8 task) { u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); - if (spriteId == 0xff) + if (spriteId == SPRITE_NONE) { DestroyAnimVisualTask(task); return; @@ -1675,10 +1673,10 @@ static void AnimTask_BlendPalInAndOutSetup(struct Task *task) task->data[5] = gBattleAnimArgs[3]; task->data[6] = 0; task->data[7] = gBattleAnimArgs[4]; - task->func = AnimTask_BlendMonInAndOutStep; + task->func = AnimTask_BlendMonInAndOut_Step; } -static void AnimTask_BlendMonInAndOutStep(u8 taskId) +static void AnimTask_BlendMonInAndOut_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1817,7 +1815,7 @@ void SetBattlerSpriteYOffsetFromYScale(u8 spriteId) { int var = 64 - GetBattlerYDeltaFromSpriteId(spriteId) * 2; u16 matrix = gSprites[spriteId].oam.matrixNum; - int var2 = (var << 8) / gOamMatrices[matrix].d; + int var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d); if (var2 > 128) var2 = 128; @@ -1830,7 +1828,7 @@ void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId) { int var = 64 - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2; u16 matrix = gSprites[spriteId].oam.matrixNum; - int var2 = (var << 8) / gOamMatrices[matrix].d; + int var2 = SAFE_DIV(var << 8, gOamMatrices[matrix].d); if (var2 > 128) var2 = 128; @@ -1898,19 +1896,19 @@ void *LoadPointerFromVars(s16 lo, s16 hi) return (void *)((u16)lo | ((u16)hi << 16)); } -void sub_80A805C(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) +void PrepareEruptAnimTaskData(struct Task *task, u8 spriteId, s16 xScaleStart, s16 yScaleStart, s16 xScaleEnd, s16 yScaleEnd, u16 duration) { - task->data[8] = a7; - task->data[15] = a2; // spriteId - task->data[9] = a3; - task->data[10] = a4; - task->data[13] = a5; - task->data[14] = a6; - task->data[11] = (a5 - a3) / a7; - task->data[12] = (a6 - a4) / a7; + task->data[8] = duration; + task->data[15] = spriteId; + task->data[9] = xScaleStart; + task->data[10] = yScaleStart; + task->data[13] = xScaleEnd; + task->data[14] = yScaleEnd; + task->data[11] = (xScaleEnd - xScaleStart) / duration; + task->data[12] = (yScaleEnd - yScaleStart) / duration; } -u8 sub_80A80C8(struct Task *task) +u8 UpdateEruptAnimTask(struct Task *task) { if (!task->data[8]) return 0; @@ -2028,18 +2026,19 @@ u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) return 1; } -u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, u32 a10) +// Create pokemon sprite to be used for a move animation effect (e.g. Role Play / Snatch) +u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxysForm) { u8 spriteId; - u16 sheet = LoadSpriteSheet(&sUnknown_08525FC0[a3]); - u16 palette = AllocSpritePalette(sUnknown_08525F90[a3].paletteTag); + u16 sheet = LoadSpriteSheet(&sSpriteSheet_MoveEffectMons[id]); + u16 palette = AllocSpritePalette(sSpriteTemplate_MoveEffectMons[id].paletteTag); if (gMonSpritesGfxPtr != NULL && gMonSpritesGfxPtr->buffer == NULL) gMonSpritesGfxPtr->buffer = AllocZeroed(0x2000); if (!isBackpic) { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20); - if (a10 == 1 || sub_80688F8(5, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) + if (ignoreDeoxysForm == TRUE || ShouldIgnoreDeoxysForm(5, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->buffer, species, @@ -2055,7 +2054,7 @@ u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority else { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), (palette * 0x10) + 0x100, 0x20); - if (a10 == 1 || sub_80688F8(5, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) + if (ignoreDeoxysForm == TRUE || ShouldIgnoreDeoxysForm(5, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->buffer, species, @@ -2069,18 +2068,18 @@ u8 sub_80A8394(u16 species, bool8 isBackpic, u8 a3, s16 x, s16 y, u8 subpriority FALSE); } - RequestDma3Copy(gMonSpritesGfxPtr->buffer, (void *)(OBJ_VRAM0 + (sheet * 0x20)), 0x800, 1); + RequestDma3Copy(gMonSpritesGfxPtr->buffer, (void *)(OBJ_VRAM0 + (sheet * 0x20)), MON_PIC_SIZE, 1); FREE_AND_SET_NULL(gMonSpritesGfxPtr->buffer); if (!isBackpic) - spriteId = CreateSprite(&sUnknown_08525F90[a3], x, y + gMonFrontPicCoords[species].y_offset, subpriority); + spriteId = CreateSprite(&sSpriteTemplate_MoveEffectMons[id], x, y + gMonFrontPicCoords[species].y_offset, subpriority); else - spriteId = CreateSprite(&sUnknown_08525F90[a3], x, y + gMonBackPicCoords[species].y_offset, subpriority); + spriteId = CreateSprite(&sSpriteTemplate_MoveEffectMons[id], x, y + gMonBackPicCoords[species].y_offset, subpriority); if (IsContest()) { - gSprites[spriteId].affineAnims = gUnknown_082FF6C0; - StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].affineAnims = gAffineAnims_BattleSpriteContest; + StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_NORMAL); } return spriteId; } @@ -2262,7 +2261,7 @@ void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x *y = (battlerY + partnerY) / 2; } -u8 sub_80A89C8(int battlerId, u8 spriteId, int species) +u8 CreateInvisibleSpriteCopy(int battlerId, u8 spriteId, int species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[newSpriteId] = gSprites[spriteId]; @@ -2274,7 +2273,7 @@ u8 sub_80A89C8(int battlerId, u8 spriteId, int species) return newSpriteId; } -void sub_80A8A6C(struct Sprite *sprite) +void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker)) @@ -2296,7 +2295,8 @@ void sub_80A8A6C(struct Sprite *sprite) sprite->callback = TranslateSpriteLinearAndFlicker; } -void sub_80A8AEC(struct Sprite *sprite) +// Used by three different unused battle anim sprite templates. +void AnimTranslateLinearAndFlicker(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -2344,7 +2344,7 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId) task->data[2] = 0; task->data[3] = 0; gSprites[task->data[0]].pos2.x -= task->data[0]; - task->data[4] = AllocSpritePalette(10097); + task->data[4] = AllocSpritePalette(ANIM_TAG_BENT_SPOON); task->data[5] = 0; dest = (task->data[4] + 0x10) * 0x10; @@ -2356,10 +2356,10 @@ void AnimTask_AttackerPunchWithTrace(u8 taskId) task->data[6] = 3; CpuCopy32(&gPlttBufferUnfaded[src], &gPlttBufferFaded[dest], 0x20); BlendPalette(dest, 16, gBattleAnimArgs[1], gBattleAnimArgs[0]); - task->func = sub_80A8CAC; + task->func = AnimTask_AttackerPunchWithTrace_Step; } -static void sub_80A8CAC(u8 taskId) +static void AnimTask_AttackerPunchWithTrace_Step(u8 taskId) { struct Task *task = &gTasks[taskId]; switch (task->data[2]) @@ -2426,10 +2426,10 @@ void AnimWeatherBallUp(struct Sprite *sprite) else sprite->data[0] = -10; sprite->data[1] = -40; - sprite->callback = sub_80A8E88; + sprite->callback = AnimWeatherBallUp_Step; } -static void sub_80A8E88(struct Sprite *sprite) +static void AnimWeatherBallUp_Step(struct Sprite *sprite) { sprite->data[2] += sprite->data[0]; sprite->data[3] += sprite->data[1]; diff --git a/src/battle_anim_normal.c b/src/battle_anim_normal.c index f7df9a4a9..9be56880a 100644 --- a/src/battle_anim_normal.c +++ b/src/battle_anim_normal.c @@ -12,7 +12,7 @@ static void AnimSimplePaletteBlend_Step(struct Sprite *); static void AnimComplexPaletteBlend(struct Sprite *); static void AnimComplexPaletteBlend_Step1(struct Sprite *); static void AnimComplexPaletteBlend_Step2(struct Sprite *); -static void sub_81159B4(struct Sprite *); +static void AnimCirclingSparkle(struct Sprite *); static void AnimShakeMonOrBattleTerrain(struct Sprite *); static void AnimShakeMonOrBattleTerrain_Step(struct Sprite *); static void AnimShakeMonOrBattleTerrain_UpdateCoordOffsetEnabled(void); @@ -92,7 +92,7 @@ const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate = .callback = AnimComplexPaletteBlend, }; -static const union AnimCmd gUnknown_085972A4[] = +static const union AnimCmd sAnim_CirclingSparkle[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), @@ -102,21 +102,21 @@ static const union AnimCmd gUnknown_085972A4[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_085972BC[] = +static const union AnimCmd *const sAnims_CirclingSparkle[] = { - gUnknown_085972A4, + sAnim_CirclingSparkle, }; // Unused -const struct SpriteTemplate gUnknown_085972C0 = +static const struct SpriteTemplate sCirclingSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_085972BC, + .anims = sAnims_CirclingSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81159B4, + .callback = AnimCirclingSparkle, }; const struct SpriteTemplate gShakeMonOrTerrainSpriteTemplate = @@ -304,7 +304,7 @@ static void AnimConfusionDuck_Step(struct Sprite *sprite) // arg 4: blend color static void AnimSimplePaletteBlend(struct Sprite *sprite) { - u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); + u32 selectedPalettes = UnpackSelectedBattleBgPalettes(gBattleAnimArgs[0]); BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]); sprite->invisible = TRUE; sprite->callback = AnimSimplePaletteBlend_Step; @@ -319,7 +319,7 @@ static void AnimSimplePaletteBlend(struct Sprite *sprite) // 4: gBattleAnimTarget partner OBJ palette // 5: BG palette 4 // 6: BG palette 5 -u32 UnpackSelectedBattleAnimPalettes(s16 selector) +u32 UnpackSelectedBattleBgPalettes(s16 selector) { u8 battleBackground = selector & 1; u8 attacker = (selector >> 1) & 1; @@ -328,7 +328,7 @@ u32 UnpackSelectedBattleAnimPalettes(s16 selector) u8 targetPartner = (selector >> 4) & 1; u8 arg5 = (selector >> 5) & 1; u8 arg6 = (selector >> 6) & 1; - return sub_80A75AC(battleBackground, attacker, target, attackerPartner, targetPartner, arg5, arg6); + return GetBattleBgPalettesMask(battleBackground, attacker, target, attackerPartner, targetPartner, arg5, arg6); } static void AnimSimplePaletteBlend_Step(struct Sprite *sprite) @@ -350,7 +350,7 @@ static void AnimComplexPaletteBlend(struct Sprite *sprite) sprite->data[6] = gBattleAnimArgs[6]; sprite->data[7] = gBattleAnimArgs[0]; - selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); + selectedPalettes = UnpackSelectedBattleBgPalettes(sprite->data[7]); BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]); sprite->invisible = TRUE; sprite->callback = AnimComplexPaletteBlend_Step1; @@ -375,7 +375,7 @@ static void AnimComplexPaletteBlend_Step1(struct Sprite *sprite) return; } - selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); + selectedPalettes = UnpackSelectedBattleBgPalettes(sprite->data[7]); if (sprite->data[1] & 0x100) BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]); else @@ -392,13 +392,13 @@ static void AnimComplexPaletteBlend_Step2(struct Sprite *sprite) if (!gPaletteFade.active) { - selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); + selectedPalettes = UnpackSelectedBattleBgPalettes(sprite->data[7]); BlendPalettes(selectedPalettes, 0, 0); DestroyAnimSprite(sprite); } } -static void sub_81159B4(struct Sprite *sprite) +static void AnimCirclingSparkle(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -442,7 +442,7 @@ void AnimTask_BlendColorCycle(u8 taskId) static void BlendColorCycle(u8 taskId, u8 startBlendAmount, u8 targetBlendAmount) { - u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gTasks[taskId].tPalSelector); + u32 selectedPalettes = UnpackSelectedBattleBgPalettes(gTasks[taskId].tPalSelector); BeginNormalPaletteFade( selectedPalettes, gTasks[taskId].tDelay, @@ -564,8 +564,6 @@ static void AnimTask_BlendColorCycleExcludeLoop(u8 taskId) // See AnimTask_BlendColorCycle. Same, but selects palette by ANIM_TAG_* void AnimTask_BlendColorCycleByTag(u8 taskId) { - u8 paletteIndex; - gTasks[taskId].tPalTag = gBattleAnimArgs[0]; gTasks[taskId].tDelay = gBattleAnimArgs[1]; gTasks[taskId].tNumBlends = gBattleAnimArgs[2]; @@ -723,7 +721,7 @@ void AnimTask_InvertScreenColor(u8 taskId) u8 targetBattler = gBattleAnimTarget; if (gBattleAnimArgs[0] & 0x100) - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0); if (gBattleAnimArgs[1] & 0x100) selectedPalettes |= (0x10000 << attackerBattler); @@ -735,7 +733,7 @@ void AnimTask_InvertScreenColor(u8 taskId) DestroyAnimVisualTask(taskId); } -void sub_8115F94(u8 taskId) +void UnusedAnimTask_8115F94(u8 taskId) { u8 attackerBattler; u8 targetBattler; diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 3f451998c..718fce396 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -565,14 +565,14 @@ static void AnimDefensiveWall_Step5(struct Sprite *sprite) u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); u8 rank = GetBattlerSpriteBGPriorityRank(battler); int var0 = 1; - u8 toBG_2 = (rank ^ var0) != 0; + bool8 toBG2 = (rank ^ var0) != 0; if (IsBattlerSpriteVisible(battler)) - sub_80A477C(toBG_2); + ResetBattleAnimBg(toBG2); battler = battlerCopy ^ 2; if (IsBattlerSpriteVisible(battler)) - sub_80A477C(toBG_2 ^ var0); + ResetBattleAnimBg(toBG2 ^ var0); } sprite->callback = DestroyAnimSprite; @@ -737,7 +737,7 @@ static void AnimTask_Teleport_Step(u8 taskId) else { gSprites[task->data[0]].invisible = TRUE; - gSprites[task->data[0]].pos1.x = 272; + gSprites[task->data[0]].pos1.x = DISPLAY_WIDTH + 32; ResetSpriteRotScale(task->data[0]); DestroyAnimVisualTask(taskId); } @@ -836,7 +836,7 @@ static void AnimTask_ImprisonOrbs_Step(u8 taskId) } } -static void sub_810FB60(struct Sprite *sprite) +static void AnimRedX_Step(struct Sprite *sprite) { if (sprite->data[1] > sprite->data[0] - 10) sprite->invisible = sprite->data[1] & 1; @@ -856,7 +856,7 @@ static void AnimRedX(struct Sprite *sprite) } sprite->data[0] = gBattleAnimArgs[1]; - sprite->callback = sub_810FB60; + sprite->callback = AnimRedX_Step; } void AnimTask_SkillSwap(u8 taskId) diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 29ba49346..3e9eafb90 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -24,7 +24,7 @@ static void AnimRockScatter_Step(struct Sprite *sprite); static void AnimParticleInVortex(struct Sprite *); static void AnimParticleInVortex_Step(struct Sprite *sprite); static void AnimTask_LoadSandstormBackground_Step(u8 taskId); -static void sub_8111214(struct Task *task); +static void CreateRolloutDirtSprite(struct Task *task); static u8 GetRolloutCounter(void); static const union AnimCmd sAnim_FlyingRock_0[] = @@ -142,37 +142,37 @@ static const struct SubspriteTable sFlyingSandSubspriteTable[] = {ARRAY_COUNT(sFlyingSandSubsprites), sFlyingSandSubsprites}, }; -static const union AnimCmd sAnim_BasicRock_0[] = +static const union AnimCmd sAnim_Rock_Biggest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_BasicRock_1[] = +static const union AnimCmd sAnim_Rock_Bigger[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_WeatherBallRockDown_0[] = +static const union AnimCmd sAnim_Rock_Big[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_WeatherBallRockDown_1[] = +static const union AnimCmd sAnim_Rock_Small[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_TwisterRock_0[] = +static const union AnimCmd sAnim_Rock_Smaller[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END, }; -static const union AnimCmd sAnim_TwisterRock_1[] = +static const union AnimCmd sAnim_Rock_Smallest[] = { ANIMCMD_FRAME(80, 1), ANIMCMD_END, @@ -180,16 +180,12 @@ static const union AnimCmd sAnim_TwisterRock_1[] = static const union AnimCmd *const sAnims_BasicRock[] = { - sAnim_BasicRock_0, - sAnim_BasicRock_1, - sAnim_WeatherBallRockDown_0, - sAnim_WeatherBallRockDown_1, -}; - -static const union AnimCmd *const sAnims_TwisterRock[] = -{ - sAnim_TwisterRock_0, - sAnim_TwisterRock_1, + sAnim_Rock_Biggest, + sAnim_Rock_Bigger, + sAnim_Rock_Big, + sAnim_Rock_Small, + sAnim_Rock_Smaller, + sAnim_Rock_Smallest, }; const struct SpriteTemplate gAncientPowerRockSpriteTemplate = @@ -281,7 +277,7 @@ const struct SpriteTemplate gTwisterRockSpriteTemplate = .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sAnims_TwisterRock, + .anims = &sAnims_BasicRock[4], .images = NULL, .affineAnims = sAffineAnims_BasicRock, .callback = AnimMoveTwisterParticle, @@ -411,7 +407,7 @@ void AnimTask_LoadSandstormBackground(u8 taskId) SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgGfx(animBg.bgId, gBattleAnimBgImage_Sandstorm, animBg.tilesOffset); AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimBgTilemap_Sandstorm, 0); LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, animBg.paletteId * 16, 32); @@ -470,8 +466,8 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId) } break; case 3: - sub_80A6B30(&animBg); - sub_80A6C68(animBg.bgId); + GetBattleAnimBg1Data(&animBg); + ClearBattleAnimBg(animBg.bgId); gTasks[taskId].data[12]++; break; case 4: @@ -500,7 +496,7 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { - sprite->pos1.x = 304; + sprite->pos1.x = DISPLAY_WIDTH + 64; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; sprite->data[5] = 1; sprite->oam.matrixNum = ST_OAM_HFLIP; @@ -527,7 +523,7 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite) if (sprite->data[5] == 0) { - if (sprite->pos1.x + sprite->pos2.x > 272) + if (sprite->pos1.x + sprite->pos2.x > DISPLAY_WIDTH + 32) { sprite->callback = DestroyAnimSprite; } @@ -659,7 +655,7 @@ static void AnimTask_Rollout_Step(u8 taskId) if (++task->data[9] >= task->data[10]) { task->data[9] = 0; - sub_8111214(task); + CreateRolloutDirtSprite(task); task->data[13] += task->data[14]; PlaySE12WithPanning(SE_M_DIG, task->data[13]); } @@ -676,7 +672,7 @@ static void AnimTask_Rollout_Step(u8 taskId) } } -static void sub_8111214(struct Task *task) +static void CreateRolloutDirtSprite(struct Task *task) { const struct SpriteTemplate *spriteTemplate; int tileOffset; @@ -731,7 +727,7 @@ static void AnimRolloutParticle(struct Sprite *sprite) if (TranslateAnimHorizontalArc(sprite)) { u8 taskId = FindTaskIdByFunc(AnimTask_Rollout_Step); - if (taskId != 0xFF) + if (taskId != TASK_NONE) gTasks[taskId].data[11]--; DestroySprite(sprite); @@ -833,7 +829,7 @@ void AnimTask_MoveSeismicTossBg(u8 taskId) { if (gTasks[taskId].data[0] == 0) { - sub_80A6DAC(FALSE); + UpdateAnimBg3ScreenSize(FALSE); gTasks[taskId].data[1] = 200; } @@ -842,7 +838,7 @@ void AnimTask_MoveSeismicTossBg(u8 taskId) if (gTasks[taskId].data[0] == 120) { - sub_80A6DAC(TRUE); + UpdateAnimBg3ScreenSize(TRUE); DestroyAnimVisualTask(taskId); } @@ -853,7 +849,7 @@ void AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId) { if (gTasks[taskId].data[0] == 0) { - sub_80A6DAC(FALSE); + UpdateAnimBg3ScreenSize(FALSE); gTasks[taskId].data[0]++; gTasks[taskId].data[2] = gBattle_BG3_Y; } @@ -865,7 +861,7 @@ void AnimTask_SeismicTossBgAccelerateDownAtEnd(u8 taskId) if (gBattleAnimArgs[7] == 0xFFF) { gBattle_BG3_Y = 0; - sub_80A6DAC(TRUE); + UpdateAnimBg3ScreenSize(TRUE); DestroyAnimVisualTask(taskId); } } diff --git a/src/battle_anim_smokescreen.c b/src/battle_anim_smokescreen.c index 4120dda72..ea7f94843 100644 --- a/src/battle_anim_smokescreen.c +++ b/src/battle_anim_smokescreen.c @@ -125,7 +125,7 @@ const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow = .data = gEnemyMonShadow_Gfx, .size = 0x80, .tag = 55129 }; -static const struct OamData gUnknown_0831C6A8 = +static const struct OamData sOamData_EnemyShadow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -146,7 +146,7 @@ const struct SpriteTemplate gSpriteTemplate_EnemyShadow = { .tileTag = 55129, .paletteTag = 55039, - .oam = &gUnknown_0831C6A8, + .oam = &sOamData_EnemyShadow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index eed163816..39d6729e8 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -6,16 +6,21 @@ #include "task.h" #include "constants/battle_anim.h" -// this file's functions -static void sub_8158B98(u8 taskId); -static void sub_8158C04(u8 taskId); +static void SoundTask_FireBlast_Step1(u8 taskId); +static void SoundTask_FireBlast_Step2(u8 taskId); static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId); static void SoundTask_PlayDoubleCry_Step(u8 taskId); static void SoundTask_PlayCryWithEcho_Step(u8 taskId); static void SoundTask_AdjustPanningVar_Step(u8 taskId); -// task start -void sub_8158B30(u8 taskId) +// Loops the specified sound effect and pans from the +// attacker to the target. The second specified sound effect +// is played at the very end. This task is effectively +// hardcoded to the move FIRE_BLAST due to the baked-in +// durations. +// arg 0: looped sound effect +// arg 1: ending sound effect +void SoundTask_FireBlast(u8 taskId) { s8 pan1, pan2, panIncrement; @@ -31,10 +36,10 @@ void sub_8158B30(u8 taskId) gTasks[taskId].data[4] = panIncrement; gTasks[taskId].data[10] = 10; - gTasks[taskId].func = sub_8158B98; + gTasks[taskId].func = SoundTask_FireBlast_Step1; } -static void sub_8158B98(u8 taskId) +static void SoundTask_FireBlast_Step1(u8 taskId) { s16 pan = gTasks[taskId].data[2]; s8 panIncrement = gTasks[taskId].data[4]; @@ -42,7 +47,7 @@ static void sub_8158B98(u8 taskId) { gTasks[taskId].data[10] = 5; gTasks[taskId].data[11] = 0; - gTasks[taskId].func = sub_8158C04; + gTasks[taskId].func = SoundTask_FireBlast_Step2; } else { @@ -56,7 +61,7 @@ static void sub_8158B98(u8 taskId) } } -static void sub_8158C04(u8 taskId) +static void SoundTask_FireBlast_Step2(u8 taskId) { if (++gTasks[taskId].data[10] == 6) { @@ -69,9 +74,7 @@ static void sub_8158C04(u8 taskId) DestroyAnimSoundTask(taskId); } } -// task end -// task start void SoundTask_LoopSEAdjustPanning(u8 taskId) { u16 songId = gBattleAnimArgs[0]; @@ -123,9 +126,7 @@ static void SoundTask_LoopSEAdjustPanning_Step(u8 taskId) gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan); } } -// task end -// task start void SoundTask_PlayCryHighPitch(u8 taskId) { u16 species = 0; @@ -134,8 +135,10 @@ void SoundTask_PlayCryHighPitch(u8 taskId) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) species = gContestResources->moveAnim->species; + #ifndef UBFIX else - DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task. + DestroyAnimVisualTask(taskId); // UB: task gets destroyed twice. + #endif } else { @@ -169,9 +172,7 @@ void SoundTask_PlayCryHighPitch(u8 taskId) DestroyAnimVisualTask(taskId); } -// task end -// task start void SoundTask_PlayDoubleCry(u8 taskId) { u16 species = 0; @@ -180,8 +181,10 @@ void SoundTask_PlayDoubleCry(u8 taskId) { if (gBattleAnimArgs[0] == ANIM_ATTACKER) species = gContestResources->moveAnim->species; + #ifndef UBFIX else - DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task. + DestroyAnimVisualTask(taskId); // UB: task gets destroyed twice. + #endif } else { @@ -258,7 +261,6 @@ static void SoundTask_PlayDoubleCry_Step(u8 taskId) } } } -// task end void SoundTask_WaitForCry(u8 taskId) { @@ -273,7 +275,6 @@ void SoundTask_WaitForCry(u8 taskId) } } -// task start void SoundTask_PlayCryWithEcho(u8 taskId) { u16 species; @@ -329,7 +330,6 @@ static void SoundTask_PlayCryWithEcho_Step(u8 taskId) break; } } -// task end void SoundTask_PlaySE1WithPanning(u8 taskId) { @@ -389,4 +389,3 @@ static void SoundTask_AdjustPanningVar_Step(u8 taskId) if (gTasks[taskId].data[11] == gTasks[taskId].data[2]) DestroyAnimVisualTask(taskId); } - diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index 56a8afa53..e859bed62 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -17,18 +17,16 @@ extern const u8 *const gBattleAnims_StatusConditions[]; extern const struct OamData gOamData_AffineOff_ObjNormal_8x8; extern const struct OamData gOamData_AffineOff_ObjBlend_64x64; -// This file's functions. -static void sub_80A9DB4(u8 taskId); +static void Task_UpdateFlashingCircleImpacts(u8 taskId); static void AnimTask_FrozenIceCube_Step1(u8 taskId); static void AnimTask_FrozenIceCube_Step2(u8 taskId); static void AnimTask_FrozenIceCube_Step3(u8 taskId); static void AnimTask_FrozenIceCube_Step4(u8 taskId); static void Task_DoStatusAnimation(u8 taskId); -static void sub_80A9E44(struct Sprite *sprite); -static void sub_80A9E78(struct Sprite *sprite); +static void AnimFlashingCircleImpact(struct Sprite *sprite); +static void AnimFlashingCircleImpact_Step(struct Sprite *sprite); -// const rom data -static const union AnimCmd sSpriteAnim_853EDE4[] = +static const union AnimCmd sAnim_FlickeringOrb[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(4, 3), @@ -37,33 +35,33 @@ static const union AnimCmd sSpriteAnim_853EDE4[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_853EDF8[] = +static const union AnimCmd *const sAnims_FlickeringOrb[] = { - sSpriteAnim_853EDE4 + sAnim_FlickeringOrb }; // Unused -const struct SpriteTemplate gUnknown_0853EDFC = +static const struct SpriteTemplate sFlickeringOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sSpriteAnimTable_853EDF8, + .anims = sAnims_FlickeringOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8AEC, + .callback = AnimTranslateLinearAndFlicker, }; // Unused -const struct SpriteTemplate gUnknown_0853EE14 = +static const struct SpriteTemplate sFlickeringOrbFlippedSpriteTemplate = { .tileTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = sSpriteAnimTable_853EDF8, + .anims = sAnims_FlickeringOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8A6C, + .callback = AnimTranslateLinearAndFlicker_Flipped, }; static const union AnimCmd sAnim_WeatherBallNormal[] = @@ -99,7 +97,7 @@ const struct SpriteTemplate gWeatherBallNormalDownSpriteTemplate = .callback = AnimWeatherBallDown, }; -static const union AnimCmd sSpriteAnim_853EE68[] = +static const union AnimCmd sAnim_SpinningSparkle[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), @@ -109,9 +107,9 @@ static const union AnimCmd sSpriteAnim_853EE68[] = ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_853EE80[] = +static const union AnimCmd *const sAnims_SpinningSparkle[] = { - sSpriteAnim_853EE68 + sAnim_SpinningSparkle }; const struct SpriteTemplate gSpinningSparkleSpriteTemplate = @@ -119,14 +117,14 @@ const struct SpriteTemplate gSpinningSparkleSpriteTemplate = .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sSpriteAnimTable_853EE80, + .anims = sAnims_SpinningSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpinningSparkle, }; // Unused -const struct SpriteTemplate gUnknown_0853EE9C = +static const struct SpriteTemplate sFlickeringFootSpriteTemplate = { .tileTag = ANIM_TAG_MONSTER_FOOT, .paletteTag = ANIM_TAG_MONSTER_FOOT, @@ -134,78 +132,79 @@ const struct SpriteTemplate gUnknown_0853EE9C = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8AEC, + .callback = AnimTranslateLinearAndFlicker, }; -static const union AnimCmd sSpriteAnim_853EEB4[] = +static const union AnimCmd sAnim_FlickeringImpact_0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_853EEBC[] = +static const union AnimCmd sAnim_FlickeringImpact_1[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_853EEC4[] = +static const union AnimCmd sAnim_FlickeringImpact_2[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_853EECC[] = +static const union AnimCmd *const sAnims_FlickeringImpact[] = { - sSpriteAnim_853EEB4, - sSpriteAnim_853EEBC, - sSpriteAnim_853EEC4 + sAnim_FlickeringImpact_0, + sAnim_FlickeringImpact_1, + sAnim_FlickeringImpact_2, }; // Unused -const struct SpriteTemplate gUnknown_0853EED8 = +static const struct SpriteTemplate sFlickeringImpactSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sSpriteAnimTable_853EECC, + .anims = sAnims_FlickeringImpact, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A8AEC, + .callback = AnimTranslateLinearAndFlicker, }; -static const union AnimCmd sSpriteAnim_853EEF0[] = +static const union AnimCmd sAnim_FlickeringShrinkOrb[] = { ANIMCMD_FRAME(0, 15), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_853EEF8[] = +static const union AnimCmd *const sAnims_FlickeringShrinkOrb[] = { - sSpriteAnim_853EEF0 + sAnim_FlickeringShrinkOrb }; -static const union AffineAnimCmd sSpriteAffineAnim_853EEFC[] = +static const union AffineAnimCmd sAffineAnim_FlickeringShrinkOrb[] = { AFFINEANIMCMD_FRAME(96, 96, 0, 0), AFFINEANIMCMD_FRAME(2, 2, 0, 1), AFFINEANIMCMD_JUMP(1) }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_853EEF8[] = +static const union AffineAnimCmd *const sAffineAnims_FlickeringShrinkOrb[] = { - sSpriteAffineAnim_853EEFC + sAffineAnim_FlickeringShrinkOrb }; -const struct SpriteTemplate gUnknown_0853EF18 = +// Unused +static const struct SpriteTemplate sFlickeringShrinkOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORB, .paletteTag = ANIM_TAG_ORB, .oam = &gOamData_AffineDouble_ObjNormal_16x16, - .anims = sSpriteAnimTable_853EEF8, + .anims = sAnims_FlickeringShrinkOrb, .images = NULL, - .affineAnims = sSpriteAffineAnimTable_853EEF8, - .callback = sub_80A8A6C, + .affineAnims = sAffineAnims_FlickeringShrinkOrb, + .callback = AnimTranslateLinearAndFlicker_Flipped, }; static const struct Subsprite sFrozenIceCubeSubsprites[] = @@ -260,7 +259,7 @@ static const struct SpriteTemplate gFrozenIceCubeSpriteTemplate = .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate gUnknown_0853EF60 = +static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_IMPACT, .paletteTag = ANIM_TAG_CIRCLE_IMPACT, @@ -268,31 +267,31 @@ static const struct SpriteTemplate gUnknown_0853EF60 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80A9E44, + .callback = AnimFlashingCircleImpact, }; // Unused -u8 sub_80A9C70(u8 battlerId, bool8 b) +static u8 Task_FlashingCircleImpacts(u8 battlerId, bool8 red) { u8 battlerSpriteId = gBattlerSpriteIds[battlerId]; - u8 taskId = CreateTask(sub_80A9DB4, 10); - u8 spriteId2; + u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10); + u8 spriteId; u8 i; LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); gTasks[taskId].data[0] = battlerId; - if (b) + if (red) { gTasks[taskId].data[1] = RGB_RED; for (i = 0; i < 10; i++) { - spriteId2 = CreateSprite(&gUnknown_0853EF60, gSprites[battlerSpriteId].pos1.x, gSprites[battlerSpriteId].pos1.y + 32, 0); - gSprites[spriteId2].data[0] = i * 51; - gSprites[spriteId2].data[1] = -256; - gSprites[spriteId2].invisible = TRUE; + spriteId = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].pos1.x, gSprites[battlerSpriteId].pos1.y + 32, 0); + gSprites[spriteId].data[0] = i * 51; + gSprites[spriteId].data[1] = -256; + gSprites[spriteId].invisible = TRUE; if (i > 4) - gSprites[spriteId2].data[6] = 21; + gSprites[spriteId].data[6] = 21; } } else @@ -300,19 +299,19 @@ u8 sub_80A9C70(u8 battlerId, bool8 b) gTasks[taskId].data[1] = RGB_BLUE; for (i = 0; i < 10; i++) { - spriteId2 = CreateSprite(&gUnknown_0853EF60, gSprites[battlerSpriteId].pos1.x, gSprites[battlerSpriteId].pos1.y - 32, 0); - gSprites[spriteId2].data[0] = i * 51; - gSprites[spriteId2].data[1] = 256; - gSprites[spriteId2].invisible = TRUE; + spriteId = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].pos1.x, gSprites[battlerSpriteId].pos1.y - 32, 0); + gSprites[spriteId].data[0] = i * 51; + gSprites[spriteId].data[1] = 256; + gSprites[spriteId].invisible = TRUE; if (i > 4) - gSprites[spriteId2].data[6] = 21; + gSprites[spriteId].data[6] = 21; } } - gSprites[spriteId2].data[7] = 1; + gSprites[spriteId].data[7] = 1; return taskId; } -static void sub_80A9DB4(u8 taskId) +static void Task_UpdateFlashingCircleImpacts(u8 taskId) { if (gTasks[taskId].data[2] == 2) { @@ -345,13 +344,13 @@ static void sub_80A9DB4(u8 taskId) } } -static void sub_80A9E44(struct Sprite *sprite) +static void AnimFlashingCircleImpact(struct Sprite *sprite) { if (sprite->data[6] == 0) { sprite->invisible = FALSE; - sprite->callback = sub_80A9E78; - sub_80A9E78(sprite); + sprite->callback = AnimFlashingCircleImpact_Step; + AnimFlashingCircleImpact_Step(sprite); } else { @@ -359,7 +358,7 @@ static void sub_80A9E44(struct Sprite *sprite) } } -static void sub_80A9E78(struct Sprite *sprite) +static void AnimFlashingCircleImpact_Step(struct Sprite *sprite) { sprite->pos2.x = Cos(sprite->data[0], 32); sprite->pos2.y = Sin(sprite->data[0], 8); @@ -538,8 +537,8 @@ void AnimTask_StatsChange(u8 taskId) gBattleAnimArgs[2] = 0; gBattleAnimArgs[3] = 0; gBattleAnimArgs[4] = sharply; - gTasks[taskId].func = sub_8116EB4; - sub_8116EB4(taskId); + gTasks[taskId].func = InitStatsChangeAnimation; + InitStatsChangeAnimation(taskId); } #undef CASE diff --git a/src/battle_anim_throw.c b/src/battle_anim_throw.c index fef301326..83768b476 100755 --- a/src/battle_anim_throw.c +++ b/src/battle_anim_throw.c @@ -16,6 +16,7 @@ #include "task.h" #include "trig.h" #include "util.h" +#include "data.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/songs.h" @@ -48,7 +49,7 @@ enum { SHINY_STAR_DIAGONAL, }; -static void sub_8170660(u8); +static void AnimTask_UnusedLevelUpHealthBox_Step(u8); static void AnimTask_FlashHealthboxOnLevelUp_Step(u8); static void AnimTask_ThrowBall_Step(u8); static void SpriteCB_Ball_Throw(struct Sprite *); @@ -429,9 +430,12 @@ static const struct SpriteTemplate sSafariRockSpriteTemplate = extern const struct SpriteTemplate gWishStarSpriteTemplate; extern const struct SpriteTemplate gMiniTwinklingStarSpriteTemplate; -void unref_sub_8170478(u8 taskId) +// This is an unused function, but it seems likely that it was +// intended to be an additional effect during the level-up animation. +// It is an upward blue gradient effect on the mon's healthbox. +void AnimTask_UnusedLevelUpHealthBox(u8 taskId) { - struct BattleAnimBgData unknownStruct; + struct BattleAnimBgData animBgData; u8 healthBoxSpriteId; u8 battler; u8 spriteId1, spriteId2, spriteId3, spriteId4; @@ -464,20 +468,20 @@ void unref_sub_8170478(u8 taskId) gSprites[spriteId3].callback = SpriteCallbackDummy; gSprites[spriteId4].callback = SpriteCallbackDummy; - sub_80A6B30(&unknownStruct); - AnimLoadCompressedBgTilemap(unknownStruct.bgId, gUnknown_08C2EA9C); - AnimLoadCompressedBgGfx(unknownStruct.bgId, gUnknown_08C2EA50, unknownStruct.tilesOffset); - LoadCompressedPalette(gCureBubblesPal, unknownStruct.paletteId << 4, 32); + GetBattleAnimBg1Data(&animBgData); + AnimLoadCompressedBgTilemap(animBgData.bgId, UnusedLevelupAnimationTilemap); + AnimLoadCompressedBgGfx(animBgData.bgId, UnusedLevelupAnimationGfx, animBgData.tilesOffset); + LoadCompressedPalette(gCureBubblesPal, animBgData.paletteId << 4, 32); gBattle_BG1_X = -gSprites[spriteId3].pos1.x + 32; gBattle_BG1_Y = -gSprites[spriteId3].pos1.y - 32; gTasks[taskId].data[1] = 640; gTasks[taskId].data[0] = spriteId3; gTasks[taskId].data[2] = spriteId4; - gTasks[taskId].func = sub_8170660; + gTasks[taskId].func = AnimTask_UnusedLevelUpHealthBox_Step; } -static void sub_8170660(u8 taskId) +static void AnimTask_UnusedLevelUpHealthBox_Step(u8 taskId) { u8 spriteId1, spriteId2; u8 battler; @@ -511,7 +515,7 @@ static void sub_8170660(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 0) { - sub_80A477C(0); + ResetBattleAnimBg(0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); @@ -686,7 +690,7 @@ void AnimTask_SwitchOutBallEffect(u8 taskId) priority = gSprites[spriteId].oam.priority; subpriority = gSprites[spriteId].subpriority; gTasks[taskId].data[10] = AnimateBallOpenParticles(x, y + 32, priority, subpriority, ballId); - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0); gTasks[taskId].data[11] = LaunchBallFadeMonTask(FALSE, gBattleAnimAttacker, selectedPalettes, ballId); gTasks[taskId].data[0]++; break; @@ -1468,7 +1472,7 @@ static void SpriteCB_Ball_Release_Step(struct Sprite *sprite) // Animate Pokémon emerging from Poké Ball gSprites[gBattlerSpriteIds[gBattleAnimTarget]].invisible = FALSE; - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 1); + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], BATTLER_AFFINE_EMERGE); AnimateSprite(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]]); gSprites[gBattlerSpriteIds[gBattleAnimTarget]].sOffsetY = 4096; } @@ -1482,7 +1486,7 @@ static void SpriteCB_Ball_Release_Wait(struct Sprite *sprite) if (gSprites[gBattlerSpriteIds[gBattleAnimTarget]].affineAnimEnded) { - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], 0); + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimTarget]], BATTLER_AFFINE_NORMAL); released = TRUE; } else @@ -1534,7 +1538,7 @@ static void SpriteCB_Ball_Block_Step(struct Sprite *sprite) sprite->sDy = (sprite->sDy + 0x800) & 0xFF; sprite->sDx = (sprite->sDx + 0x680) & 0xFF; - if (sprite->pos1.y + sprite->pos2.y > 160 + if (sprite->pos1.y + sprite->pos2.y > DISPLAY_HEIGHT || sprite->pos1.x + sprite->pos2.x < -8) { sprite->sFrame = 0; @@ -1551,8 +1555,6 @@ static void SpriteCB_Ball_Block_Step(struct Sprite *sprite) static void LoadBallParticleGfx(u8 ballId) { - u8 taskId; - if (GetSpriteTileStartByTag(sBallParticleSpriteSheets[ballId].tag) == 0xFFFF) { LoadCompressedSpriteSheetUsingHeap(&sBallParticleSpriteSheets[ballId]); @@ -2181,7 +2183,7 @@ void AnimTask_SubstituteFadeToInvisible(u8 taskId) break; case 2: spriteId = gBattlerSpriteIds[gBattleAnimAttacker]; - RequestDma3Fill(0, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, 0x800, 1); + RequestDma3Fill(0, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, MON_PIC_SIZE, 1); ClearBehindSubstituteBit(gBattleAnimAttacker); DestroyAnimVisualTask(taskId); break; diff --git a/src/battle_anim_utility_funcs.c b/src/battle_anim_utility_funcs.c index 9790cf9ea..9b2b2e03c 100644 --- a/src/battle_anim_utility_funcs.c +++ b/src/battle_anim_utility_funcs.c @@ -29,26 +29,26 @@ static void AnimTask_HardwarePaletteFade_Step(u8); static void AnimTask_TraceMonBlended_Step(u8); static void AnimMonTrace(struct Sprite*); static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8); -static void sub_8116F04(u8); -static void sub_81170EC(u8); -static void sub_81172EC(u8); +static void StatsChangeAnimation_Step1(u8); +static void StatsChangeAnimation_Step2(u8); +static void StatsChangeAnimation_Step3(u8); static void AnimTask_Flash_Step(u8); -static void sub_81175C4(u32, u16); +static void SetPalettesToColor(u32, u16); static void AnimTask_UpdateSlidingBg(u8); -static void sub_8117A60(u8); +static void UpdateMonScrollingBgMask(u8); static void AnimTask_WaitAndRestoreVisibility(u8); -const u16 gUnknown_08597418 = RGB(31, 31, 31); +static const u16 sCurseLinesPalette[] = { RGB_WHITE }; -// These belong in battle_intro.c, but there putting them there causes 2 bytes of alignment padding +// These belong in battle_intro.c, but putting them there causes 2 bytes of alignment padding // between the two .rodata segments. Perhaps battle_intro.c actually belongs in this file, too. -const u8 gUnknown_0859741A[] = {REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT}; -const u8 gUnknown_0859741E[] = {REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT}; +const u8 gBattleAnimBgCntSet[] = {REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT}; +const u8 gBattleAnimBgCntGet[] = {REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT}; void AnimTask_BlendBattleAnimPal(u8 taskId) { - u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); - selectedPalettes |= sub_80A76C4((gBattleAnimArgs[0] >> 7) & 1, + u32 selectedPalettes = UnpackSelectedBattleBgPalettes(gBattleAnimArgs[0]); + selectedPalettes |= GetBattleMonSpritePalettesMask((gBattleAnimArgs[0] >> 7) & 1, (gBattleAnimArgs[0] >> 8) & 1, (gBattleAnimArgs[0] >> 9) & 1, (gBattleAnimArgs[0] >> 10) & 1); @@ -62,7 +62,7 @@ void AnimTask_BlendBattleAnimPalExclude(u8 taskId) u8 animBattlers[2]; animBattlers[1] = 0xFF; - selectedPalettes = UnpackSelectedBattleAnimPalettes(1); + selectedPalettes = UnpackSelectedBattleBgPalettes(1); switch (gBattleAnimArgs[0]) { case 2: @@ -97,7 +97,7 @@ void AnimTask_BlendBattleAnimPalExclude(u8 taskId) for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { if (battler != animBattlers[0] && battler != animBattlers[1] && IsBattlerSpriteVisible(battler)) - selectedPalettes |= 0x10000 << sub_80A77AC(battler); + selectedPalettes |= 0x10000 << AnimDummyReturnArg(battler); } StartBlendAnimSpriteColor(taskId, selectedPalettes); @@ -105,7 +105,7 @@ void AnimTask_BlendBattleAnimPalExclude(u8 taskId) void AnimTask_SetCamouflageBlend(u8 taskId) { - u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); + u32 selectedPalettes = UnpackSelectedBattleBgPalettes(gBattleAnimArgs[0]); switch (gBattleTerrain) { case BATTLE_TERRAIN_GRASS: @@ -278,7 +278,7 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId) int spriteId, newSpriteId; u16 var0; u16 bg1Cnt; - struct BattleAnimBgData unknownStruct; + struct BattleAnimBgData animBgData; var0 = 0; gBattle_WIN0H = 0; @@ -329,11 +329,11 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId) } spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - newSpriteId = sub_80A89C8(gBattleAnimAttacker, spriteId, species); - sub_80A6B30(&unknownStruct); - AnimLoadCompressedBgTilemapHandleContest(&unknownStruct, gUnknown_08C20684, 0); - AnimLoadCompressedBgGfx(unknownStruct.bgId, gUnknown_08C20668, unknownStruct.tilesOffset); - LoadPalette(&gUnknown_08597418, unknownStruct.paletteId * 16 + 1, 2); + newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); + GetBattleAnimBg1Data(&animBgData); + AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleAnimMaskTilemap_Curse, 0); + AnimLoadCompressedBgGfx(animBgData.bgId, gBattleAnimMaskImage_Curse, animBgData.tilesOffset); + LoadPalette(sCurseLinesPalette, animBgData.paletteId * 16 + 1, 2); gBattle_BG1_X = -gSprites[spriteId].pos1.x + 32; gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32; @@ -344,7 +344,7 @@ void AnimTask_DrawFallingWhiteLinesOnAttacker(u8 taskId) static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId) { - struct BattleAnimBgData unknownStruct; + struct BattleAnimBgData animBgData; struct Sprite *sprite; u16 bg1Cnt; @@ -356,7 +356,7 @@ static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId) gBattle_BG1_Y += 64; if (++gTasks[taskId].data[11] == 4) { - sub_80A477C(0); + ResetBattleAnimBg(0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR @@ -377,8 +377,8 @@ static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId) sprite = &gSprites[gTasks[taskId].data[0]]; DestroySprite(sprite); - sub_80A6B30(&unknownStruct); - sub_80A6C68(unknownStruct.bgId); + GetBattleAnimBg1Data(&animBgData); + ClearBattleAnimBg(animBgData.bgId); if (gTasks[taskId].data[6] == 1) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++; @@ -388,7 +388,7 @@ static void AnimTask_DrawFallingWhiteLinesOnAttacker_Step(u8 taskId) } } -void sub_8116EB4(u8 taskId) +void InitStatsChangeAnimation(u8 taskId) { u8 i; @@ -396,10 +396,10 @@ void sub_8116EB4(u8 taskId) for (i = 0; i < 8; i++) sAnimStatsChangeData->data[i] = gBattleAnimArgs[i]; - gTasks[taskId].func = sub_8116F04; + gTasks[taskId].func = StatsChangeAnimation_Step1; } -static void sub_8116F04(u8 taskId) +static void StatsChangeAnimation_Step1(u8 taskId) { if (sAnimStatsChangeData->data[2] == 0) sAnimStatsChangeData->battler1 = gBattleAnimAttacker; @@ -450,56 +450,56 @@ static void sub_8116F04(u8 taskId) sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES); } - gTasks[taskId].func = sub_81170EC; + gTasks[taskId].func = StatsChangeAnimation_Step2; } -static void sub_81170EC(u8 taskId) +static void StatsChangeAnimation_Step2(u8 taskId) { - struct BattleAnimBgData unknownStruct; + struct BattleAnimBgData animBgData; u8 spriteId, spriteId2; u8 battlerSpriteId; spriteId2 = 0; battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1]; - spriteId = sub_80A89C8(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); + spriteId = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species); if (sAnimStatsChangeData->data[3]) { battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; - spriteId2 = sub_80A89C8(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); + spriteId2 = CreateInvisibleSpriteCopy(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species); } - sub_80A6B30(&unknownStruct); + GetBattleAnimBg1Data(&animBgData); if (sAnimStatsChangeData->data[0] == 0) - AnimLoadCompressedBgTilemapHandleContest(&unknownStruct, gBattleStatMask1_Tilemap, 0); + AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask1_Tilemap, 0); else - AnimLoadCompressedBgTilemapHandleContest(&unknownStruct, gBattleStatMask2_Tilemap, 0); + AnimLoadCompressedBgTilemapHandleContest(&animBgData, gBattleStatMask2_Tilemap, 0); - AnimLoadCompressedBgGfx(unknownStruct.bgId, gBattleStatMask_Gfx, unknownStruct.tilesOffset); + AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset); switch (sAnimStatsChangeData->data[1]) { case 0: - LoadCompressedPalette(gBattleStatMask2_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask2_Pal, animBgData.paletteId * 16, 32); break; case 1: - LoadCompressedPalette(gBattleStatMask1_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask1_Pal, animBgData.paletteId * 16, 32); break; case 2: - LoadCompressedPalette(gBattleStatMask3_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask3_Pal, animBgData.paletteId * 16, 32); break; case 3: - LoadCompressedPalette(gBattleStatMask4_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask4_Pal, animBgData.paletteId * 16, 32); break; case 4: - LoadCompressedPalette(gBattleStatMask6_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask6_Pal, animBgData.paletteId * 16, 32); break; case 5: - LoadCompressedPalette(gBattleStatMask7_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask7_Pal, animBgData.paletteId * 16, 32); break; case 6: - LoadCompressedPalette(gBattleStatMask8_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask8_Pal, animBgData.paletteId * 16, 32); break; default: - LoadCompressedPalette(gBattleStatMask5_Pal, unknownStruct.paletteId * 16, 32); + LoadCompressedPalette(gBattleStatMask5_Pal, animBgData.paletteId * 16, 32); break; } @@ -532,7 +532,7 @@ static void sub_81170EC(u8 taskId) gTasks[taskId].data[3] = spriteId2; gTasks[taskId].data[6] = sAnimStatsChangeData->higherPriority; gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2]; - gTasks[taskId].func = sub_81172EC; + gTasks[taskId].func = StatsChangeAnimation_Step3; if (sAnimStatsChangeData->data[0] == 0) PlaySE12WithPanning(SE_M_STAT_INCREASE, BattleAnimAdjustPanning2(-64)); @@ -540,7 +540,7 @@ static void sub_81170EC(u8 taskId) PlaySE12WithPanning(SE_M_STAT_DECREASE, BattleAnimAdjustPanning2(-64)); } -static void sub_81172EC(u8 taskId) +static void StatsChangeAnimation_Step3(u8 taskId) { gBattle_BG1_Y += gTasks[taskId].data[1]; @@ -568,7 +568,7 @@ static void sub_81172EC(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 0) { - sub_80A477C(0); + ResetBattleAnimBg(0); gTasks[taskId].data[15]++; } } @@ -603,12 +603,12 @@ static void sub_81172EC(u8 taskId) void AnimTask_Flash(u8 taskId) { - u32 selectedPalettes = sub_80A76C4(1, 1, 1, 1); - sub_81175C4(selectedPalettes, 0); + u32 selectedPalettes = GetBattleMonSpritePalettesMask(1, 1, 1, 1); + SetPalettesToColor(selectedPalettes, RGB_BLACK); gTasks[taskId].data[14] = selectedPalettes >> 16; - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; - sub_81175C4(selectedPalettes, 0xFFFF); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; + SetPalettesToColor(selectedPalettes, RGB_WHITEALPHA); gTasks[taskId].data[15] = selectedPalettes; gTasks[taskId].data[0] = 0; @@ -662,7 +662,7 @@ static void AnimTask_Flash_Step(u8 taskId) } } -static void sub_81175C4(u32 selectedPalettes, u16 color) +static void SetPalettesToColor(u32 selectedPalettes, u16 color) { u16 i; @@ -705,7 +705,7 @@ void AnimTask_StartSlidingBg(u8 taskId) { u8 newTaskId; - sub_80A6DAC(0); + UpdateAnimBg3ScreenSize(FALSE); newTaskId = CreateTask(AnimTask_UpdateSlidingBg, 5); if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { @@ -733,7 +733,7 @@ static void AnimTask_UpdateSlidingBg(u8 taskId) { gBattle_BG3_X = 0; gBattle_BG3_Y = 0; - sub_80A6DAC(1); + UpdateAnimBg3ScreenSize(TRUE); DestroyTask(taskId); } } @@ -756,8 +756,6 @@ void AnimTask_GetTargetIsAttackerPartner(u8 taskId) DestroyAnimVisualTask(taskId); } -#define tInvisible gBattleAnimArgs[0]; - // For hiding or subsequently revealing all other battlers void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId) { @@ -766,27 +764,25 @@ void AnimTask_SetAllNonAttackersInvisiblity(u8 taskId) for (battler = 0; battler < MAX_BATTLERS_COUNT; battler++) { if (battler != gBattleAnimAttacker && IsBattlerSpriteVisible(battler)) - gSprites[gBattlerSpriteIds[battler]].invisible = tInvisible; + gSprites[gBattlerSpriteIds[battler]].invisible = gBattleAnimArgs[0]; } DestroyAnimVisualTask(taskId); } -#undef tInvisible - -void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette) +void StartMonScrollingBgMask(u8 taskId, int unused, u16 scrollSpeed, u8 battler, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette) { u16 species; u8 spriteId, spriteId2; u16 bg1Cnt; - struct BattleAnimBgData unknownStruct; + struct BattleAnimBgData animBgData; u8 battler2; spriteId2 = 0; - battler2 = BATTLE_PARTNER(battler1); + battler2 = BATTLE_PARTNER(battler); - if (IsContest() || (arg4 && !IsBattlerSpriteVisible(battler2))) - arg4 = 0; + if (IsContest() || (includePartner && !IsBattlerSpriteVisible(battler2))) + includePartner = FALSE; gBattle_WIN0H = 0; gBattle_WIN0V = 0; @@ -814,34 +810,34 @@ void sub_8117854(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, } else { - if (GetBattlerSide(battler1) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); } - spriteId = sub_80A89C8(battler1, gBattlerSpriteIds[battler1], species); - if (arg4) - spriteId2 = sub_80A89C8(battler2, gBattlerSpriteIds[battler2], species); + spriteId = CreateInvisibleSpriteCopy(battler, gBattlerSpriteIds[battler], species); + if (includePartner) + spriteId2 = CreateInvisibleSpriteCopy(battler2, gBattlerSpriteIds[battler2], species); - sub_80A6B30(&unknownStruct); - AnimLoadCompressedBgTilemapHandleContest(&unknownStruct, tilemap, 0); - AnimLoadCompressedBgGfx(unknownStruct.bgId, gfx, unknownStruct.tilesOffset); - LoadCompressedPalette(palette, unknownStruct.paletteId * 16, 32); + GetBattleAnimBg1Data(&animBgData); + AnimLoadCompressedBgTilemapHandleContest(&animBgData, tilemap, 0); + AnimLoadCompressedBgGfx(animBgData.bgId, gfx, animBgData.tilesOffset); + LoadCompressedPalette(palette, animBgData.paletteId * 16, 32); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; - gTasks[taskId].data[1] = arg2; - gTasks[taskId].data[4] = arg5; - gTasks[taskId].data[5] = arg7; - gTasks[taskId].data[6] = arg6; + gTasks[taskId].data[1] = scrollSpeed; + gTasks[taskId].data[4] = numFadeSteps; + gTasks[taskId].data[5] = duration; + gTasks[taskId].data[6] = fadeStepDelay; gTasks[taskId].data[0] = spriteId; - gTasks[taskId].data[2] = arg4; + gTasks[taskId].data[2] = includePartner; gTasks[taskId].data[3] = spriteId2; - gTasks[taskId].func = sub_8117A60; + gTasks[taskId].func = UpdateMonScrollingBgMask; } -static void sub_8117A60(u8 taskId) +static void UpdateMonScrollingBgMask(u8 taskId) { gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1]; if (gTasks[taskId].data[1] < 0) @@ -874,7 +870,7 @@ static void sub_8117A60(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12])); if (gTasks[taskId].data[12] == 0) { - sub_80A477C(0); + ResetBattleAnimBg(0); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR @@ -927,7 +923,7 @@ void AnimTask_CopyPalUnfadedToBackup(u8 taskId) if (gBattleAnimArgs[0] == 0) { - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0); while ((selectedPalettes & 1) == 0) { selectedPalettes >>= 1; @@ -954,7 +950,7 @@ void AnimTask_CopyPalUnfadedFromBackup(u8 taskId) if (gBattleAnimArgs[0] == 0) { - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0); while ((selectedPalettes & 1) == 0) { selectedPalettes >>= 1; @@ -981,7 +977,7 @@ void AnimTask_CopyPalFadedToUnfaded(u8 taskId) if (gBattleAnimArgs[0] == 0) { - selectedPalettes = sub_80A75AC(1, 0, 0, 0, 0, 0, 0); + selectedPalettes = GetBattleBgPalettesMask(1, 0, 0, 0, 0, 0, 0); while ((selectedPalettes & 1) == 0) { selectedPalettes >>= 1; diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index 2bb90e585..d9cfeab9a 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -487,8 +487,8 @@ void AnimTask_CreateRaindrops(u8 taskId) gTasks[taskId].data[0]++; if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1) { - x = Random2() % 240; - y = Random2() % 80; + x = Random2() % DISPLAY_WIDTH; + y = Random2() % (DISPLAY_HEIGHT / 2); CreateSprite(&gRainDropSpriteTemplate, x, y, 4); } if (gTasks[taskId].data[0] == gTasks[taskId].data[3]) @@ -811,7 +811,7 @@ void AnimTask_CreateSurfWave(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); if (!IsContest()) { SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); @@ -881,12 +881,10 @@ static void AnimTask_CreateSurfWave_Step1(u8 taskId) u16 rgbBuffer; u16 *BGptrX = &gBattle_BG1_X; u16 *BGptrY = &gBattle_BG1_Y; - u32 palOffset; - u16 palNum; *BGptrX += gTasks[taskId].data[0]; *BGptrY += gTasks[taskId].data[1]; - sub_80A6B30(&animBg); + GetBattleAnimBg1Data(&animBg); gTasks[taskId].data[2] += gTasks[taskId].data[1]; if (++gTasks[taskId].data[5] == 4) { @@ -925,8 +923,8 @@ static void AnimTask_CreateSurfWave_Step2(u8 taskId) u16 *BGptrY = &gBattle_BG1_Y; if (gTasks[taskId].data[0] == 0) { - sub_80A6C68(1); - sub_80A6C68(2); + ClearBattleAnimBg(1); + ClearBattleAnimBg(2); gTasks[taskId].data[0]++; } else @@ -1055,7 +1053,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) switch (task->data[0]) { case 0: - sub_80A805C(task, task->data[15], 0x100, 0x100, 224, 0x200, 32); + PrepareEruptAnimTaskData(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 32); task->data[0]++; case 1: if (++task->data[3] > 1) @@ -1071,7 +1069,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) gSprites[task->data[15]].pos2.x = -3; } } - if (sub_80A80C8(task) == 0) + if (UpdateEruptAnimTask(task) == 0) { SetBattlerSpriteYOffsetFromYScale(task->data[15]); gSprites[task->data[15]].pos2.x = 0; @@ -1083,13 +1081,13 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) case 2: if (++task->data[3] > 4) { - sub_80A805C(task, task->data[15], 224, 0x200, 384, 224, 8); + PrepareEruptAnimTaskData(task, task->data[15], 0xE0, 0x200, 0x180, 0xE0, 8); task->data[3] = 0; task->data[0]++; } break; case 3: - if (sub_80A80C8(task) == 0) + if (UpdateEruptAnimTask(task) == 0) { task->data[3] = 0; task->data[4] = 0; @@ -1109,7 +1107,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) gSprites[task->data[15]].pos2.y -= 2; if (task->data[4] == 10) { - sub_80A805C(task, task->data[15], 384, 224, 0x100, 0x100, 8); + PrepareEruptAnimTaskData(task, task->data[15], 0x180, 0xE0, 0x100, 0x100, 8); task->data[3] = 0; task->data[4] = 0; task->data[0]++; @@ -1118,7 +1116,7 @@ static void AnimTask_WaterSpoutLaunch_Step(u8 taskId) break; case 6: gSprites[task->data[15]].pos1.y--; - if (sub_80A80C8(task) == 0) + if (UpdateEruptAnimTask(task) == 0) { ResetSpriteRotScale(task->data[15]); gSprites[task->data[15]].pos1.y = task->data[5]; @@ -1262,14 +1260,14 @@ static void AnimTask_WaterSpoutRain_Step(u8 taskId) gBattleAnimArgs[1] = 0; gBattleAnimArgs[2] = 12; taskId2 = CreateTask(AnimTask_HorizontalShake, 80); - if (taskId2 != 0xFF) + if (taskId2 != TASK_NONE) { gTasks[taskId2].func(taskId2); gAnimVisualTaskCount++; } gBattleAnimArgs[0] = ANIM_DEF_PARTNER; taskId2 = CreateTask(AnimTask_HorizontalShake, 80); - if (taskId2 != 0xFF) + if (taskId2 != TASK_NONE) { gTasks[taskId2].func(taskId2); gAnimVisualTaskCount++; diff --git a/src/battle_arena.c b/src/battle_arena.c index 0ffba4910..11c918225 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -774,7 +774,8 @@ void BattleArena_DeductMindPoints(u8 battler, u16 stringId) } } -void sub_81A586C(u8 battler) // Unused. +// Unused +static void UpdateHPAtStart(u8 battler) { u16 *hpAtStart = gBattleStruct->arenaStartHp; diff --git a/src/battle_bg.c b/src/battle_bg.c index 7c9b05b25..ae5d27779 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -100,7 +100,7 @@ static const struct SpriteTemplate sVsLetter_V_SpriteTemplate = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sVsLetterAffineAnimTable, - .callback = nullsub_17 + .callback = SpriteCB_VsLetterDummy }; static const struct SpriteTemplate sVsLetter_S_SpriteTemplate = @@ -111,7 +111,7 @@ static const struct SpriteTemplate sVsLetter_S_SpriteTemplate = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sVsLetterAffineAnimTable, - .callback = nullsub_17 + .callback = SpriteCB_VsLetterDummy }; static const struct CompressedSpriteSheet sVsLettersSpriteSheet = @@ -759,7 +759,7 @@ void LoadBattleMenuWindowGfx(void) void DrawMainBattleBackground(void) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK)) { LZDecompressVram(gBattleTerrainTiles_Building, (void*)(BG_CHAR_ADDR(2))); LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); @@ -1126,7 +1126,7 @@ void DrawBattleEntryBackground(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { LZDecompressVram(gUnknown_08D778F0, (void*)(BG_CHAR_ADDR(1))); - LZDecompressVram(gVsLettersGfx, (void*)(VRAM + 0x10000)); + LZDecompressVram(gVsLettersGfx, (void*)OBJ_VRAM0); LoadCompressedPalette(gUnknown_08D77AE4, 0x60, 0x20); SetBgAttribute(1, BG_ATTR_SCREENSIZE, 1); SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04); @@ -1134,13 +1134,13 @@ void DrawBattleEntryBackground(void) CopyToBgTilemapBuffer(2, gUnknown_08D779D8, 0, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); - SetGpuReg(REG_OFFSET_WININ, 0x36); - SetGpuReg(REG_OFFSET_WINOUT, 0x36); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_OBJ | WININ_WIN0_CLR); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); gBattle_BG1_Y = 0xFF5C; gBattle_BG2_Y = 0xFF5C; LoadCompressedSpriteSheetUsingHeap(&sVsLettersSpriteSheet); } - else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) + else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { @@ -1221,7 +1221,7 @@ bool8 LoadChosenBattleElement(u8 caseId) LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); break; case 3: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) + if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { LZDecompressVram(gBattleTerrainTiles_Building, (void*)(BG_CHAR_ADDR(2))); } @@ -1280,7 +1280,7 @@ bool8 LoadChosenBattleElement(u8 caseId) } break; case 4: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) + if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(BG_SCREEN_ADDR(26))); } @@ -1342,7 +1342,7 @@ bool8 LoadChosenBattleElement(u8 caseId) } break; case 5: - if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) + if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_EREADER_TRAINER)) { LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60); } diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 1041f6fda..0f612f964 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -51,7 +51,7 @@ static void LinkOpponentHandleMoveAnimation(void); static void LinkOpponentHandlePrintString(void); static void LinkOpponentHandlePrintSelectionString(void); static void LinkOpponentHandleChooseAction(void); -static void LinkOpponentHandleUnknownYesNoBox(void); +static void LinkOpponentHandleYesNoBox(void); static void LinkOpponentHandleChooseMove(void); static void LinkOpponentHandleChooseItem(void); static void LinkOpponentHandleChoosePokemon(void); @@ -69,12 +69,12 @@ static void LinkOpponentHandleTwoReturnValues(void); static void LinkOpponentHandleChosenMonReturnValue(void); static void LinkOpponentHandleOneReturnValue(void); static void LinkOpponentHandleOneReturnValue_Duplicate(void); -static void LinkOpponentHandleCmd37(void); -static void LinkOpponentHandleCmd38(void); -static void LinkOpponentHandleCmd39(void); -static void LinkOpponentHandleCmd40(void); +static void LinkOpponentHandleClearUnkVar(void); +static void LinkOpponentHandleSetUnkVar(void); +static void LinkOpponentHandleClearUnkFlag(void); +static void LinkOpponentHandleToggleUnkFlag(void); static void LinkOpponentHandleHitAnimation(void); -static void LinkOpponentHandleCmd42(void); +static void LinkOpponentHandleCantSwitch(void); static void LinkOpponentHandlePlaySE(void); static void LinkOpponentHandlePlayFanfareOrBGM(void); static void LinkOpponentHandleFaintingCry(void); @@ -87,83 +87,83 @@ static void LinkOpponentHandleSpriteInvisibility(void); static void LinkOpponentHandleBattleAnimation(void); static void LinkOpponentHandleLinkStandbyMsg(void); static void LinkOpponentHandleResetActionMoveSelection(void); -static void LinkOpponentHandleCmd55(void); +static void LinkOpponentHandleEndLinkBattle(void); static void LinkOpponentCmdEnd(void); static void LinkOpponentBufferRunCommand(void); static void LinkOpponentBufferExecCompleted(void); -static void sub_8064DD0(void); +static void SwitchIn_HandleSoundAndEnd(void); static u32 CopyLinkOpponentMonData(u8 monId, u8 *dst); static void SetLinkOpponentMonData(u8 monId); -static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void LinkOpponentDoMoveAnimation(void); -static void sub_8067618(u8 taskId); -static void sub_80676FC(struct Sprite *sprite); -static void sub_806782C(void); +static void Task_StartSendOutAnim(u8 taskId); +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); +static void EndDrawPartyStatusSummary(void); static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - LinkOpponentHandleGetMonData, - LinkOpponentHandleGetRawMonData, - LinkOpponentHandleSetMonData, - LinkOpponentHandleSetRawMonData, - LinkOpponentHandleLoadMonSprite, - LinkOpponentHandleSwitchInAnim, - LinkOpponentHandleReturnMonToBall, - LinkOpponentHandleDrawTrainerPic, - LinkOpponentHandleTrainerSlide, - LinkOpponentHandleTrainerSlideBack, - LinkOpponentHandleFaintAnimation, - LinkOpponentHandlePaletteFade, - LinkOpponentHandleSuccessBallThrowAnim, - LinkOpponentHandleBallThrowAnim, - LinkOpponentHandlePause, - LinkOpponentHandleMoveAnimation, - LinkOpponentHandlePrintString, - LinkOpponentHandlePrintSelectionString, - LinkOpponentHandleChooseAction, - LinkOpponentHandleUnknownYesNoBox, - LinkOpponentHandleChooseMove, - LinkOpponentHandleChooseItem, - LinkOpponentHandleChoosePokemon, - LinkOpponentHandleCmd23, - LinkOpponentHandleHealthBarUpdate, - LinkOpponentHandleExpUpdate, - LinkOpponentHandleStatusIconUpdate, - LinkOpponentHandleStatusAnimation, - LinkOpponentHandleStatusXor, - LinkOpponentHandleDataTransfer, - LinkOpponentHandleDMA3Transfer, - LinkOpponentHandlePlayBGM, - LinkOpponentHandleCmd32, - LinkOpponentHandleTwoReturnValues, - LinkOpponentHandleChosenMonReturnValue, - LinkOpponentHandleOneReturnValue, - LinkOpponentHandleOneReturnValue_Duplicate, - LinkOpponentHandleCmd37, - LinkOpponentHandleCmd38, - LinkOpponentHandleCmd39, - LinkOpponentHandleCmd40, - LinkOpponentHandleHitAnimation, - LinkOpponentHandleCmd42, - LinkOpponentHandlePlaySE, - LinkOpponentHandlePlayFanfareOrBGM, - LinkOpponentHandleFaintingCry, - LinkOpponentHandleIntroSlide, - LinkOpponentHandleIntroTrainerBallThrow, - LinkOpponentHandleDrawPartyStatusSummary, - LinkOpponentHandleHidePartyStatusSummary, - LinkOpponentHandleEndBounceEffect, - LinkOpponentHandleSpriteInvisibility, - LinkOpponentHandleBattleAnimation, - LinkOpponentHandleLinkStandbyMsg, - LinkOpponentHandleResetActionMoveSelection, - LinkOpponentHandleCmd55, - LinkOpponentCmdEnd + [CONTROLLER_GETMONDATA] = LinkOpponentHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = LinkOpponentHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = LinkOpponentHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = LinkOpponentHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = LinkOpponentHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = LinkOpponentHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = LinkOpponentHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = LinkOpponentHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = LinkOpponentHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = LinkOpponentHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = LinkOpponentHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = LinkOpponentHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = LinkOpponentHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = LinkOpponentHandleBallThrowAnim, + [CONTROLLER_PAUSE] = LinkOpponentHandlePause, + [CONTROLLER_MOVEANIMATION] = LinkOpponentHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = LinkOpponentHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = LinkOpponentHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = LinkOpponentHandleChooseAction, + [CONTROLLER_YESNOBOX] = LinkOpponentHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = LinkOpponentHandleChooseMove, + [CONTROLLER_OPENBAG] = LinkOpponentHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = LinkOpponentHandleChoosePokemon, + [CONTROLLER_23] = LinkOpponentHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = LinkOpponentHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = LinkOpponentHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = LinkOpponentHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = LinkOpponentHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = LinkOpponentHandleStatusXor, + [CONTROLLER_DATATRANSFER] = LinkOpponentHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = LinkOpponentHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = LinkOpponentHandlePlayBGM, + [CONTROLLER_32] = LinkOpponentHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = LinkOpponentHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = LinkOpponentHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = LinkOpponentHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = LinkOpponentHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = LinkOpponentHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = LinkOpponentHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = LinkOpponentHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = LinkOpponentHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = LinkOpponentHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = LinkOpponentHandleCantSwitch, + [CONTROLLER_PLAYSE] = LinkOpponentHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = LinkOpponentHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = LinkOpponentHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = LinkOpponentHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = LinkOpponentHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = LinkOpponentHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = LinkOpponentHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = LinkOpponentHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = LinkOpponentHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = LinkOpponentHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = LinkOpponentHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = LinkOpponentHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = LinkOpponentHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = LinkOpponentCmdEnd }; -static void nullsub_28(void) +static void LinkOpponentDummy(void) { } @@ -195,7 +195,7 @@ static void CompleteOnBankSpriteCallbackDummy2(void) LinkOpponentBufferExecCompleted(); } -static void sub_8064470(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { @@ -206,38 +206,38 @@ static void sub_8064470(void) } } -static void sub_80644D8(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; LinkOpponentBufferExecCompleted(); } } -static void sub_8064520(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool32 r8 = FALSE; - bool32 r4 = FALSE; + bool32 healthboxAnimDone = FALSE; + bool32 twoMons = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - r8 = TRUE; + healthboxAnimDone = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]].callback == SpriteCallbackDummy) { - r8 = TRUE; + healthboxAnimDone = TRUE; } - r4 = TRUE; + twoMons = TRUE; } - if (r8) + if (healthboxAnimDone) { - if (r4 || !IsBattlerSpriteVisible(BATTLE_PARTNER(gActiveBattler))) + if (twoMons || !IsBattlerSpriteVisible(BATTLE_PARTNER(gActiveBattler))) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) return; @@ -250,8 +250,8 @@ static void sub_8064520(void) gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } else { @@ -263,19 +263,19 @@ static void sub_8064520(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_80644D8; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } -static void sub_8064734(void) +static void Intro_TryShinyAnimShowHealthbox(void) { - bool32 r10 = FALSE; + bool32 bgmRestored = FALSE; if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim @@ -294,27 +294,27 @@ static void sub_8064734(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].ballAnimActive) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)], &gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], HEALTHBOX_ALL); - sub_8076918(BATTLE_PARTNER(gActiveBattler)); + StartHealthboxSlideIn(BATTLE_PARTNER(gActiveBattler)); SetHealthboxSpriteVisible(gHealthboxSpriteIds[BATTLE_PARTNER(gActiveBattler)]); } UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 - && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].field_1_x40 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[BATTLE_PARTNER(gActiveBattler)].waitForCry && !IsCryPlayingOrClearCrySongs()) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -327,42 +327,42 @@ static void sub_8064734(void) } } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1; - r10 = TRUE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; + bgmRestored = TRUE; } - if (r10) + if (bgmRestored) { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - if (++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 1) + if (++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == 1) return; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; } if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - DestroySprite(&gSprites[gUnknown_03005D7C[BATTLE_PARTNER(gActiveBattler)]]); + DestroySprite(&gSprites[gBattleControllerData[BATTLE_PARTNER(gActiveBattler)]]); SetBattlerShadowSpriteCallback(BATTLE_PARTNER(gActiveBattler), GetMonData(&gEnemyParty[gBattlerPartyIndexes[BATTLE_PARTNER(gActiveBattler)]], MON_DATA_SPECIES)); } - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; - gBattlerControllerFuncs[gActiveBattler] = sub_8064520; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } } -static void sub_8064B04(void) +static void TryShinyAnimAfterMonAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) @@ -377,8 +377,8 @@ static void sub_8064B04(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); LinkOpponentBufferExecCompleted(); } } @@ -401,7 +401,7 @@ static void CompleteOnHealthbarDone(void) } } -static void sub_8064C14(void) +static void HideHealthboxAfterMonFaint(void) { if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { @@ -410,7 +410,7 @@ static void sub_8064C14(void) } } -static void sub_8064C58(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -447,18 +447,18 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_8064D60(void) +static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_8064DD0; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } -static void sub_8064DD0(void) +static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) { @@ -471,7 +471,7 @@ static void sub_8064DD0(void) } } -static void sub_8064E50(void) +static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) @@ -479,20 +479,20 @@ static void sub_8064E50(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); - gBattlerControllerFuncs[gActiveBattler] = sub_8064D60; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } -static void sub_8064F40(void) +static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) @@ -500,12 +500,12 @@ static void sub_8064F40(void) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); } - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[gActiveBattler] = sub_8064E50; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } @@ -1134,31 +1134,31 @@ static void LinkOpponentHandleLoadMonSprite(void) GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[gActiveBattler] = sub_8064B04; + gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; } static void LinkOpponentHandleSwitchInAnim(void) { gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_8066494(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_8064F40; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1168,8 +1168,8 @@ static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit) GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -1180,7 +1180,7 @@ static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void LinkOpponentHandleReturnMonToBall(void) @@ -1215,12 +1215,14 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_8064C58; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + static void LinkOpponentHandleDrawTrainerPic(void) { s16 xPos; @@ -1300,11 +1302,11 @@ static void LinkOpponentHandleDrawTrainerPic(void) (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } @@ -1324,15 +1326,17 @@ static void LinkOpponentHandleTrainerSlide(void) gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 96; gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.x += 32; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; // this line is redundant, because LinkOpponentBufferExecCompleted changes the battle battlerId function LinkOpponentBufferExecCompleted(); } +#undef sSpeedX + static void LinkOpponentHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -1341,7 +1345,7 @@ static void LinkOpponentHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = sub_8064470; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } static void LinkOpponentHandleFaintAnimation(void) @@ -1359,7 +1363,7 @@ static void LinkOpponentHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; - gBattlerControllerFuncs[gActiveBattler] = sub_8064C14; + gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; } } } @@ -1386,7 +1390,7 @@ static void LinkOpponentHandlePause(void) static void LinkOpponentHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -1429,7 +1433,7 @@ static void LinkOpponentDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1438,7 +1442,7 @@ static void LinkOpponentDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1482,7 +1486,7 @@ static void LinkOpponentHandleChooseAction(void) LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleUnknownYesNoBox(void) +static void LinkOpponentHandleYesNoBox(void) { LinkOpponentBufferExecCompleted(); } @@ -1538,7 +1542,7 @@ static void LinkOpponentHandleExpUpdate(void) static void LinkOpponentHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -1551,7 +1555,7 @@ static void LinkOpponentHandleStatusIconUpdate(void) static void LinkOpponentHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -1604,27 +1608,27 @@ static void LinkOpponentHandleOneReturnValue_Duplicate(void) LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleCmd37(void) +static void LinkOpponentHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleCmd38(void) +static void LinkOpponentHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleCmd39(void) +static void LinkOpponentHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleCmd40(void) +static void LinkOpponentHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; LinkOpponentBufferExecCompleted(); } @@ -1643,7 +1647,7 @@ static void LinkOpponentHandleHitAnimation(void) } } -static void LinkOpponentHandleCmd42(void) +static void LinkOpponentHandleCantSwitch(void) { LinkOpponentBufferExecCompleted(); } @@ -1693,7 +1697,6 @@ static void LinkOpponentHandleIntroSlide(void) static void LinkOpponentHandleIntroTrainerBallThrow(void) { - u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -1703,19 +1706,19 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_80676FC); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); - taskId = CreateTask(sub_8067618, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_28; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDummy; } -static void sub_8067618(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { u8 savedActiveBank = gActiveBattler; @@ -1723,23 +1726,23 @@ static void sub_8067618(u8 taskId) if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_8066494(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_8066494(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler = BATTLE_PARTNER(gActiveBattler); gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_8066494(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler = BATTLE_PARTNER(gActiveBattler); } - gBattlerControllerFuncs[gActiveBattler] = sub_8064734; + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } -static void sub_80676FC(struct Sprite *sprite) +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) { FreeTrainerFrontPicPalette(sprite->oam.affineParam); FreeSpriteOamMatrix(sprite); @@ -1770,20 +1773,20 @@ static void LinkOpponentHandleDrawPartyStatusSummary(void) } gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_806782C; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_806782C(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; LinkOpponentBufferExecCompleted(); } } @@ -1812,7 +1815,7 @@ static void LinkOpponentHandleSpriteInvisibility(void) static void LinkOpponentHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -1828,7 +1831,7 @@ static void LinkOpponentHandleBattleAnimation(void) static void LinkOpponentHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + RecordedBattle_RecordAllBattlerData(&gBattleBufferA[gActiveBattler][2]); LinkOpponentBufferExecCompleted(); } @@ -1837,9 +1840,9 @@ static void LinkOpponentHandleResetActionMoveSelection(void) LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleCmd55(void) +static void LinkOpponentHandleEndLinkBattle(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); + RecordedBattle_RecordAllBattlerData(&gBattleBufferA[gActiveBattler][4]); if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) gBattleOutcome = gBattleBufferA[gActiveBattler][1]; @@ -1850,7 +1853,7 @@ static void LinkOpponentHandleCmd55(void) FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkOpponentBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void LinkOpponentCmdEnd(void) diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index af81b06d5..9184f5ac9 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -49,7 +49,7 @@ static void LinkPartnerHandleMoveAnimation(void); static void LinkPartnerHandlePrintString(void); static void LinkPartnerHandlePrintSelectionString(void); static void LinkPartnerHandleChooseAction(void); -static void LinkPartnerHandleUnknownYesNoBox(void); +static void LinkPartnerHandleYesNoBox(void); static void LinkPartnerHandleChooseMove(void); static void LinkPartnerHandleChooseItem(void); static void LinkPartnerHandleChoosePokemon(void); @@ -67,12 +67,12 @@ static void LinkPartnerHandleTwoReturnValues(void); static void LinkPartnerHandleChosenMonReturnValue(void); static void LinkPartnerHandleOneReturnValue(void); static void LinkPartnerHandleOneReturnValue_Duplicate(void); -static void LinkPartnerHandleCmd37(void); -static void LinkPartnerHandleCmd38(void); -static void LinkPartnerHandleCmd39(void); -static void LinkPartnerHandleCmd40(void); +static void LinkPartnerHandleClearUnkVar(void); +static void LinkPartnerHandleSetUnkVar(void); +static void LinkPartnerHandleClearUnkFlag(void); +static void LinkPartnerHandleToggleUnkFlag(void); static void LinkPartnerHandleHitAnimation(void); -static void LinkPartnerHandleCmd42(void); +static void LinkPartnerHandleCantSwitch(void); static void LinkPartnerHandlePlaySE(void); static void LinkPartnerHandlePlayFanfareOrBGM(void); static void LinkPartnerHandleFaintingCry(void); @@ -85,79 +85,79 @@ static void LinkPartnerHandleSpriteInvisibility(void); static void LinkPartnerHandleBattleAnimation(void); static void LinkPartnerHandleLinkStandbyMsg(void); static void LinkPartnerHandleResetActionMoveSelection(void); -static void LinkPartnerHandleCmd55(void); +static void LinkPartnerHandleEndLinkBattle(void); static void LinkPartnerCmdEnd(void); static void LinkPartnerBufferRunCommand(void); static void LinkPartnerBufferExecCompleted(void); -static void sub_814B554(void); +static void SwitchIn_WaitAndEnd(void); static u32 CopyLinkPartnerMonData(u8 monId, u8 *dst); static void SetLinkPartnerMonData(u8 monId); -static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void LinkPartnerDoMoveAnimation(void); -static void sub_814DCCC(u8 taskId); -static void sub_814DE9C(void); +static void Task_StartSendOutAnim(u8 taskId); +static void EndDrawPartyStatusSummary(void); static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - LinkPartnerHandleGetMonData, - LinkPartnerHandleGetRawMonData, - LinkPartnerHandleSetMonData, - LinkPartnerHandleSetRawMonData, - LinkPartnerHandleLoadMonSprite, - LinkPartnerHandleSwitchInAnim, - LinkPartnerHandleReturnMonToBall, - LinkPartnerHandleDrawTrainerPic, - LinkPartnerHandleTrainerSlide, - LinkPartnerHandleTrainerSlideBack, - LinkPartnerHandleFaintAnimation, - LinkPartnerHandlePaletteFade, - LinkPartnerHandleSuccessBallThrowAnim, - LinkPartnerHandleBallThrowAnim, - LinkPartnerHandlePause, - LinkPartnerHandleMoveAnimation, - LinkPartnerHandlePrintString, - LinkPartnerHandlePrintSelectionString, - LinkPartnerHandleChooseAction, - LinkPartnerHandleUnknownYesNoBox, - LinkPartnerHandleChooseMove, - LinkPartnerHandleChooseItem, - LinkPartnerHandleChoosePokemon, - LinkPartnerHandleCmd23, - LinkPartnerHandleHealthBarUpdate, - LinkPartnerHandleExpUpdate, - LinkPartnerHandleStatusIconUpdate, - LinkPartnerHandleStatusAnimation, - LinkPartnerHandleStatusXor, - LinkPartnerHandleDataTransfer, - LinkPartnerHandleDMA3Transfer, - LinkPartnerHandlePlayBGM, - LinkPartnerHandleCmd32, - LinkPartnerHandleTwoReturnValues, - LinkPartnerHandleChosenMonReturnValue, - LinkPartnerHandleOneReturnValue, - LinkPartnerHandleOneReturnValue_Duplicate, - LinkPartnerHandleCmd37, - LinkPartnerHandleCmd38, - LinkPartnerHandleCmd39, - LinkPartnerHandleCmd40, - LinkPartnerHandleHitAnimation, - LinkPartnerHandleCmd42, - LinkPartnerHandlePlaySE, - LinkPartnerHandlePlayFanfareOrBGM, - LinkPartnerHandleFaintingCry, - LinkPartnerHandleIntroSlide, - LinkPartnerHandleIntroTrainerBallThrow, - LinkPartnerHandleDrawPartyStatusSummary, - LinkPartnerHandleHidePartyStatusSummary, - LinkPartnerHandleEndBounceEffect, - LinkPartnerHandleSpriteInvisibility, - LinkPartnerHandleBattleAnimation, - LinkPartnerHandleLinkStandbyMsg, - LinkPartnerHandleResetActionMoveSelection, - LinkPartnerHandleCmd55, - LinkPartnerCmdEnd + [CONTROLLER_GETMONDATA] = LinkPartnerHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = LinkPartnerHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = LinkPartnerHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = LinkPartnerHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = LinkPartnerHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = LinkPartnerHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = LinkPartnerHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = LinkPartnerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = LinkPartnerHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = LinkPartnerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = LinkPartnerHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = LinkPartnerHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = LinkPartnerHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = LinkPartnerHandleBallThrowAnim, + [CONTROLLER_PAUSE] = LinkPartnerHandlePause, + [CONTROLLER_MOVEANIMATION] = LinkPartnerHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = LinkPartnerHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = LinkPartnerHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = LinkPartnerHandleChooseAction, + [CONTROLLER_YESNOBOX] = LinkPartnerHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = LinkPartnerHandleChooseMove, + [CONTROLLER_OPENBAG] = LinkPartnerHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = LinkPartnerHandleChoosePokemon, + [CONTROLLER_23] = LinkPartnerHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = LinkPartnerHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = LinkPartnerHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = LinkPartnerHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = LinkPartnerHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = LinkPartnerHandleStatusXor, + [CONTROLLER_DATATRANSFER] = LinkPartnerHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = LinkPartnerHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = LinkPartnerHandlePlayBGM, + [CONTROLLER_32] = LinkPartnerHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = LinkPartnerHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = LinkPartnerHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = LinkPartnerHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = LinkPartnerHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = LinkPartnerHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = LinkPartnerHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = LinkPartnerHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = LinkPartnerHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = LinkPartnerHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = LinkPartnerHandleCantSwitch, + [CONTROLLER_PLAYSE] = LinkPartnerHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = LinkPartnerHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = LinkPartnerHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = LinkPartnerHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = LinkPartnerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = LinkPartnerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = LinkPartnerHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = LinkPartnerHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = LinkPartnerHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = LinkPartnerHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = LinkPartnerHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = LinkPartnerHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = LinkPartnerHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = LinkPartnerCmdEnd }; static void SpriteCB_Null2(void) @@ -186,84 +186,84 @@ static void CompleteOnBattlerSpriteCallbackDummy(void) LinkPartnerBufferExecCompleted(); } -static void sub_814AF54(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - nullsub_25(0); + BattleGfxSfxDummy3(MALE); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); LinkPartnerBufferExecCompleted(); } } -static void sub_814AFBC(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; LinkPartnerBufferExecCompleted(); } } -static void sub_814B004(void) +static void Intro_WaitForHealthbox(void) { - bool32 r6 = FALSE; + bool32 finished = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; + finished = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r6 = TRUE; + finished = TRUE; } } if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; + finished = FALSE; - if (r6) + if (finished) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_814AFBC; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } -static void sub_814B0E8(void) +static void Intro_ShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive - && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 != 1) + && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay != 1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; - gBattlerControllerFuncs[gActiveBattler] = sub_814B004; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox; } } -static void sub_814B290(void) +static void WaitForMonAnimAfterLoad(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) LinkPartnerBufferExecCompleted(); @@ -286,13 +286,13 @@ static void CompleteOnHealthbarDone(void) } } -static void sub_814B340(void) +static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - nullsub_24(species); + BattleGfxSfxDummy2(species); FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); @@ -300,7 +300,7 @@ static void sub_814B340(void) } } -static void sub_814B3DC(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -336,7 +336,7 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_814B4E0(void) +static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { @@ -344,11 +344,11 @@ static void sub_814B4E0(void) if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_814B554; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd; } } -static void sub_814B554(void) +static void SwitchIn_WaitAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) @@ -357,28 +357,28 @@ static void sub_814B554(void) } } -static void sub_814B5A8(void) +static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - CreateTask(c3_0802FDF4, 10); + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_814B4E0; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } -static void sub_814B69C(void) +static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) @@ -386,11 +386,11 @@ static void sub_814B69C(void) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); - gBattlerControllerFuncs[gActiveBattler] = sub_814B5A8; + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } @@ -1021,11 +1021,11 @@ static void LinkPartnerHandleLoadMonSprite(void) GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_814B290; + gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad; } static void LinkPartnerHandleSwitchInAnim(void) @@ -1033,18 +1033,18 @@ static void LinkPartnerHandleSwitchInAnim(void) ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_814CC98(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_814B69C; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( @@ -1053,8 +1053,8 @@ static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit) GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -1065,7 +1065,7 @@ static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void LinkPartnerHandleReturnMonToBall(void) @@ -1099,12 +1099,14 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_814B3DC; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + static void LinkPartnerHandleDrawTrainerPic(void) { s16 xPos; @@ -1142,13 +1144,15 @@ static void LinkPartnerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerBackPicCoords[trainerPicId].size) * 4 + 80, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } +#undef sSpeedX + static void LinkPartnerHandleTrainerSlide(void) { LinkPartnerBufferExecCompleted(); @@ -1162,9 +1166,12 @@ static void LinkPartnerHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = sub_814AF54; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } +#define sSpeedX data[1] +#define sSpeedY data[2] + static void LinkPartnerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) @@ -1180,14 +1187,17 @@ static void LinkPartnerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00; - gBattlerControllerFuncs[gActiveBattler] = sub_814B340; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } +#undef sSpeedX +#undef sSpeedY + static void LinkPartnerHandlePaletteFade(void) { LinkPartnerBufferExecCompleted(); @@ -1210,7 +1220,7 @@ static void LinkPartnerHandlePause(void) static void LinkPartnerHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -1253,7 +1263,7 @@ static void LinkPartnerDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1262,7 +1272,7 @@ static void LinkPartnerDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1306,7 +1316,7 @@ static void LinkPartnerHandleChooseAction(void) LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleUnknownYesNoBox(void) +static void LinkPartnerHandleYesNoBox(void) { LinkPartnerBufferExecCompleted(); } @@ -1362,7 +1372,7 @@ static void LinkPartnerHandleExpUpdate(void) static void LinkPartnerHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -1375,7 +1385,7 @@ static void LinkPartnerHandleStatusIconUpdate(void) static void LinkPartnerHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -1428,27 +1438,27 @@ static void LinkPartnerHandleOneReturnValue_Duplicate(void) LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleCmd37(void) +static void LinkPartnerHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleCmd38(void) +static void LinkPartnerHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleCmd39(void) +static void LinkPartnerHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleCmd40(void) +static void LinkPartnerHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; LinkPartnerBufferExecCompleted(); } @@ -1467,7 +1477,7 @@ static void LinkPartnerHandleHitAnimation(void) } } -static void LinkPartnerHandleCmd42(void) +static void LinkPartnerHandleCantSwitch(void) { LinkPartnerBufferExecCompleted(); } @@ -1529,7 +1539,7 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F9); @@ -1553,17 +1563,17 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(sub_814DCCC, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; gBattlerControllerFuncs[gActiveBattler] = SpriteCB_Null2; } -static void sub_814DCCC(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 24) { @@ -1577,19 +1587,19 @@ static void sub_814DCCC(u8 taskId) if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_814CC98(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_814CC98(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_814CC98(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } - gBattlerControllerFuncs[gActiveBattler] = sub_814B0E8; + gBattlerControllerFuncs[gActiveBattler] = Intro_ShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } @@ -1605,20 +1615,20 @@ static void LinkPartnerHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_814DE9C; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_814DE9C(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; LinkPartnerBufferExecCompleted(); } } @@ -1647,7 +1657,7 @@ static void LinkPartnerHandleSpriteInvisibility(void) static void LinkPartnerHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -1663,7 +1673,7 @@ static void LinkPartnerHandleBattleAnimation(void) static void LinkPartnerHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + RecordedBattle_RecordAllBattlerData(&gBattleBufferA[gActiveBattler][2]); LinkPartnerBufferExecCompleted(); } @@ -1672,15 +1682,15 @@ static void LinkPartnerHandleResetActionMoveSelection(void) LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleCmd55(void) +static void LinkPartnerHandleEndLinkBattle(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); + RecordedBattle_RecordAllBattlerData(&gBattleBufferA[gActiveBattler][4]); gBattleOutcome = gBattleBufferA[gActiveBattler][1]; gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleBufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkPartnerBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void LinkPartnerCmdEnd(void) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index f186bf3ff..9fce5050e 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -56,7 +56,7 @@ static void OpponentHandleMoveAnimation(void); static void OpponentHandlePrintString(void); static void OpponentHandlePrintSelectionString(void); static void OpponentHandleChooseAction(void); -static void OpponentHandleUnknownYesNoBox(void); +static void OpponentHandleYesNoBox(void); static void OpponentHandleChooseMove(void); static void OpponentHandleChooseItem(void); static void OpponentHandleChoosePokemon(void); @@ -74,12 +74,12 @@ static void OpponentHandleTwoReturnValues(void); static void OpponentHandleChosenMonReturnValue(void); static void OpponentHandleOneReturnValue(void); static void OpponentHandleOneReturnValue_Duplicate(void); -static void OpponentHandleCmd37(void); -static void OpponentHandleCmd38(void); -static void OpponentHandleCmd39(void); -static void OpponentHandleCmd40(void); +static void OpponentHandleClearUnkVar(void); +static void OpponentHandleSetUnkVar(void); +static void OpponentHandleClearUnkFlag(void); +static void OpponentHandleToggleUnkFlag(void); static void OpponentHandleHitAnimation(void); -static void OpponentHandleCmd42(void); +static void OpponentHandleCantSwitch(void); static void OpponentHandlePlaySE(void); static void OpponentHandlePlayFanfareOrBGM(void); static void OpponentHandleFaintingCry(void); @@ -92,86 +92,86 @@ static void OpponentHandleSpriteInvisibility(void); static void OpponentHandleBattleAnimation(void); static void OpponentHandleLinkStandbyMsg(void); static void OpponentHandleResetActionMoveSelection(void); -static void OpponentHandleCmd55(void); +static void OpponentHandleEndLinkBattle(void); static void OpponentCmdEnd(void); static void OpponentBufferRunCommand(void); static void OpponentBufferExecCompleted(void); -static void sub_805FC80(void); +static void SwitchIn_HandleSoundAndEnd(void); static u32 GetOpponentMonData(u8 monId, u8 *dst); static void SetOpponentMonData(u8 monId); -static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void OpponentDoMoveAnimation(void); -static void sub_806280C(struct Sprite *sprite); -static void sub_8062828(u8 taskId); -static void sub_8062A2C(void); +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); +static void Task_StartSendOutAnim(u8 taskId); +static void EndDrawPartyStatusSummary(void); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - OpponentHandleGetMonData, - OpponentHandleGetRawMonData, - OpponentHandleSetMonData, - OpponentHandleSetRawMonData, - OpponentHandleLoadMonSprite, - OpponentHandleSwitchInAnim, - OpponentHandleReturnMonToBall, - OpponentHandleDrawTrainerPic, - OpponentHandleTrainerSlide, - OpponentHandleTrainerSlideBack, - OpponentHandleFaintAnimation, - OpponentHandlePaletteFade, - OpponentHandleSuccessBallThrowAnim, - OpponentHandleBallThrow, - OpponentHandlePause, - OpponentHandleMoveAnimation, - OpponentHandlePrintString, - OpponentHandlePrintSelectionString, - OpponentHandleChooseAction, - OpponentHandleUnknownYesNoBox, - OpponentHandleChooseMove, - OpponentHandleChooseItem, - OpponentHandleChoosePokemon, - OpponentHandleCmd23, - OpponentHandleHealthBarUpdate, - OpponentHandleExpUpdate, - OpponentHandleStatusIconUpdate, - OpponentHandleStatusAnimation, - OpponentHandleStatusXor, - OpponentHandleDataTransfer, - OpponentHandleDMA3Transfer, - OpponentHandlePlayBGM, - OpponentHandleCmd32, - OpponentHandleTwoReturnValues, - OpponentHandleChosenMonReturnValue, - OpponentHandleOneReturnValue, - OpponentHandleOneReturnValue_Duplicate, - OpponentHandleCmd37, - OpponentHandleCmd38, - OpponentHandleCmd39, - OpponentHandleCmd40, - OpponentHandleHitAnimation, - OpponentHandleCmd42, - OpponentHandlePlaySE, - OpponentHandlePlayFanfareOrBGM, - OpponentHandleFaintingCry, - OpponentHandleIntroSlide, - OpponentHandleIntroTrainerBallThrow, - OpponentHandleDrawPartyStatusSummary, - OpponentHandleHidePartyStatusSummary, - OpponentHandleEndBounceEffect, - OpponentHandleSpriteInvisibility, - OpponentHandleBattleAnimation, - OpponentHandleLinkStandbyMsg, - OpponentHandleResetActionMoveSelection, - OpponentHandleCmd55, - OpponentCmdEnd + [CONTROLLER_GETMONDATA] = OpponentHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = OpponentHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = OpponentHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = OpponentHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = OpponentHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = OpponentHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = OpponentHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = OpponentHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = OpponentHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = OpponentHandleBallThrow, + [CONTROLLER_PAUSE] = OpponentHandlePause, + [CONTROLLER_MOVEANIMATION] = OpponentHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = OpponentHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = OpponentHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = OpponentHandleChooseAction, + [CONTROLLER_YESNOBOX] = OpponentHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = OpponentHandleChooseMove, + [CONTROLLER_OPENBAG] = OpponentHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = OpponentHandleChoosePokemon, + [CONTROLLER_23] = OpponentHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = OpponentHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = OpponentHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = OpponentHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = OpponentHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = OpponentHandleStatusXor, + [CONTROLLER_DATATRANSFER] = OpponentHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = OpponentHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = OpponentHandlePlayBGM, + [CONTROLLER_32] = OpponentHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = OpponentHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = OpponentHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = OpponentHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OpponentHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = OpponentHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = OpponentHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = OpponentHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = OpponentHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = OpponentHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = OpponentHandleCantSwitch, + [CONTROLLER_PLAYSE] = OpponentHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = OpponentHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = OpponentHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = OpponentHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = OpponentHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = OpponentHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = OpponentHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = OpponentHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = OpponentHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = OpponentHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = OpponentHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = OpponentHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = OpponentHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = OpponentCmdEnd }; // unknown unused data -static const u8 sUnknown_0831C7AC[] = {0xB0, 0xB0, 0xC8, 0x98, 0x28, 0x28, 0x28, 0x20}; +static const u8 sUnused[] = {0xB0, 0xB0, 0xC8, 0x98, 0x28, 0x28, 0x28, 0x20}; -static void nullsub_26(void) +static void OpponentDummy(void) { } @@ -203,7 +203,7 @@ static void CompleteOnBankSpriteCallbackDummy2(void) OpponentBufferExecCompleted(); } -static void sub_805F240(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { @@ -214,40 +214,40 @@ static void sub_805F240(void) } } -static void sub_805F2A8(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; OpponentBufferExecCompleted(); } } -static void sub_805F2F0(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool8 var = FALSE; - bool8 var2; + bool8 healthboxAnimDone = FALSE; + bool8 twoMons; if (!IsDoubleBattle() || ((IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) || (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - var = TRUE; - var2 = FALSE; + healthboxAnimDone = TRUE; + twoMons = FALSE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) - var = TRUE; - var2 = TRUE; + healthboxAnimDone = TRUE; + twoMons = TRUE; } - gUnknown_020244D8 = &gBattleSpritesDataPtr->healthBoxesData[gActiveBattler]; - gUnknown_020244DC = &gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK]; + gBattleControllerOpponentHealthboxData = &gBattleSpritesDataPtr->healthBoxesData[gActiveBattler]; + gBattleControllerOpponentFlankHealthboxData = &gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK]; - if (var) + if (healthboxAnimDone) { - if (var2 == TRUE) + if (twoMons == TRUE) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) @@ -256,8 +256,8 @@ static void sub_805F2F0(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } else return; @@ -269,8 +269,8 @@ static void sub_805F2F0(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } else return; @@ -281,15 +281,15 @@ static void sub_805F2F0(void) else return; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_805F2A8; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } -static void sub_805F560(void) +static void Intro_TryShinyAnimShowHealthbox(void) { - bool32 sp = FALSE; - bool32 r10 = FALSE; + bool32 bgmRestored = FALSE; + bool32 battlerAnimsDone = FALSE; if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive @@ -306,27 +306,27 @@ static void sub_805F560(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].waitForCry && !IsCryPlayingOrClearCrySongs()) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -336,48 +336,48 @@ static void sub_805F560(void) else m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1; - sp = TRUE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; + bgmRestored = TRUE; } if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - r10 = TRUE; + battlerAnimsDone = TRUE; } } else { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r10 = TRUE; + battlerAnimsDone = TRUE; } } - if (sp && r10) + if (bgmRestored && battlerAnimsDone) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES)); } - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; - gBattlerControllerFuncs[gActiveBattler] = sub_805F2F0; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } -static void sub_805F994(void) +static void TryShinyAnimAfterMonAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0 && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim @@ -389,8 +389,8 @@ static void sub_805F994(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); OpponentBufferExecCompleted(); } } @@ -407,7 +407,7 @@ static void CompleteOnHealthbarDone(void) OpponentBufferExecCompleted(); } -static void sub_805FAC4(void) +static void HideHealthboxAfterMonFaint(void) { if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { @@ -416,7 +416,7 @@ static void sub_805FAC4(void) } } -static void sub_805FB08(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -453,21 +453,22 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_805FC10(void) +static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_805FC80; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } -static void sub_805FC80(void) +static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) { - if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2) + if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy + || gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy_2) { m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); OpponentBufferExecCompleted(); @@ -475,36 +476,36 @@ static void sub_805FC80(void) } } -static void sub_805FD00(void) +static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); - gBattlerControllerFuncs[gActiveBattler] = sub_805FC10; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } -static void sub_805FDF0(void) +static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[gActiveBattler] = sub_805FD00; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } @@ -1142,7 +1143,7 @@ static void OpponentHandleLoadMonSprite(void) GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = species; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; @@ -1150,25 +1151,25 @@ static void OpponentHandleLoadMonSprite(void) SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[gActiveBattler] = sub_805F994; + gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; } static void OpponentHandleSwitchInAnim(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6; gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_80613DC(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_805FDF0; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1180,8 +1181,8 @@ static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; @@ -1190,7 +1191,7 @@ static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void OpponentHandleReturnMonToBall(void) @@ -1225,12 +1226,14 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_805FB08; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + static void OpponentHandleDrawTrainerPic(void) { u32 trainerPicId; @@ -1260,7 +1263,7 @@ static void OpponentHandleDrawTrainerPic(void) } else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if (gActiveBattler == 1) trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); @@ -1307,11 +1310,11 @@ static void OpponentHandleDrawTrainerPic(void) (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } @@ -1344,7 +1347,7 @@ static void OpponentHandleTrainerSlide(void) } else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if (gActiveBattler == 1) trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_A); @@ -1378,14 +1381,16 @@ static void OpponentHandleTrainerSlide(void) gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 96; gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.x += 32; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; } +#undef sSpeedX + static void OpponentHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -1394,7 +1399,7 @@ static void OpponentHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = sub_805F240; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } static void OpponentHandleFaintAnimation(void) @@ -1412,7 +1417,7 @@ static void OpponentHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; - gBattlerControllerFuncs[gActiveBattler] = sub_805FAC4; + gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; } } } @@ -1439,7 +1444,7 @@ static void OpponentHandlePause(void) static void OpponentHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -1481,7 +1486,7 @@ static void OpponentDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1490,7 +1495,7 @@ static void OpponentDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1535,7 +1540,7 @@ static void OpponentHandleChooseAction(void) OpponentBufferExecCompleted(); } -static void OpponentHandleUnknownYesNoBox(void) +static void OpponentHandleYesNoBox(void) { OpponentBufferExecCompleted(); } @@ -1632,7 +1637,7 @@ static void OpponentHandleChoosePokemon(void) battler2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) + if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_TOWER_LINK_MULTI)) { if (gActiveBattler == 1) firstId = 0, lastId = 3; @@ -1703,7 +1708,7 @@ static void OpponentHandleExpUpdate(void) static void OpponentHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -1716,7 +1721,7 @@ static void OpponentHandleStatusIconUpdate(void) static void OpponentHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -1769,27 +1774,27 @@ static void OpponentHandleOneReturnValue_Duplicate(void) OpponentBufferExecCompleted(); } -static void OpponentHandleCmd37(void) +static void OpponentHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; OpponentBufferExecCompleted(); } -static void OpponentHandleCmd38(void) +static void OpponentHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; OpponentBufferExecCompleted(); } -static void OpponentHandleCmd39(void) +static void OpponentHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; OpponentBufferExecCompleted(); } -static void OpponentHandleCmd40(void) +static void OpponentHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; OpponentBufferExecCompleted(); } @@ -1808,7 +1813,7 @@ static void OpponentHandleHitAnimation(void) } } -static void OpponentHandleCmd42(void) +static void OpponentHandleCantSwitch(void) { OpponentBufferExecCompleted(); } @@ -1858,7 +1863,6 @@ static void OpponentHandleIntroSlide(void) static void OpponentHandleIntroTrainerBallThrow(void) { - u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -1868,26 +1872,26 @@ static void OpponentHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_806280C); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); - taskId = CreateTask(sub_8062828, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_26; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = OpponentDummy; } -static void sub_806280C(struct Sprite *sprite) +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) { FreeTrainerFrontPicPalette(sprite->oam.affineParam); FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } -static void sub_8062828(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { u8 savedActiveBank = gActiveBattler; @@ -1895,23 +1899,23 @@ static void sub_8062828(u8 taskId) if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_80613DC(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_80613DC(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_80613DC(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_80613DC(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } - gBattlerControllerFuncs[gActiveBattler] = sub_805F560; + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } @@ -1940,20 +1944,20 @@ static void OpponentHandleDrawPartyStatusSummary(void) } gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_8062A2C; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_8062A2C(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; OpponentBufferExecCompleted(); } } @@ -1982,7 +1986,7 @@ static void OpponentHandleSpriteInvisibility(void) static void OpponentHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -2004,7 +2008,7 @@ static void OpponentHandleResetActionMoveSelection(void) OpponentBufferExecCompleted(); } -static void OpponentHandleCmd55(void) +static void OpponentHandleEndLinkBattle(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 7c34efd44..34fcb82f6 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -57,7 +57,7 @@ static void PlayerHandleMoveAnimation(void); static void PlayerHandlePrintString(void); static void PlayerHandlePrintSelectionString(void); static void PlayerHandleChooseAction(void); -static void PlayerHandleUnknownYesNoBox(void); +static void PlayerHandleYesNoBox(void); static void PlayerHandleChooseMove(void); static void PlayerHandleChooseItem(void); static void PlayerHandleChoosePokemon(void); @@ -75,12 +75,12 @@ static void PlayerHandleTwoReturnValues(void); static void PlayerHandleChosenMonReturnValue(void); static void PlayerHandleOneReturnValue(void); static void PlayerHandleOneReturnValue_Duplicate(void); -static void PlayerHandleCmd37(void); -static void PlayerHandleCmd38(void); -static void PlayerHandleCmd39(void); -static void PlayerHandleCmd40(void); +static void PlayerHandleClearUnkVar(void); +static void PlayerHandleSetUnkVar(void); +static void PlayerHandleClearUnkFlag(void); +static void PlayerHandleToggleUnkFlag(void); static void PlayerHandleHitAnimation(void); -static void PlayerHandleCmd42(void); +static void PlayerHandleCantSwitch(void); static void PlayerHandlePlaySE(void); static void PlayerHandlePlayFanfareOrBGM(void); static void PlayerHandleFaintingCry(void); @@ -93,7 +93,7 @@ static void PlayerHandleSpriteInvisibility(void); static void PlayerHandleBattleAnimation(void); static void PlayerHandleLinkStandbyMsg(void); static void PlayerHandleResetActionMoveSelection(void); -static void PlayerHandleCmd55(void); +static void PlayerHandleEndLinkBattle(void); static void PlayerCmdEnd(void); static void PlayerBufferRunCommand(void); @@ -106,90 +106,90 @@ static void MoveSelectionDisplayPpString(void); static void MoveSelectionDisplayMoveType(void); static void MoveSelectionDisplayMoveNames(void); static void HandleMoveSwitching(void); -static void sub_8058FC0(void); +static void SwitchIn_HandleSoundAndEnd(void); static void WaitForMonSelection(void); static void CompleteWhenChoseItem(void); static void Task_LaunchLvlUpAnim(u8 taskId); static void Task_PrepareToGiveExpWithExpBar(u8 taskId); static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId); -static void sub_8059400(u8 taskId); +static void Task_GiveExpWithExpBar(u8 taskId); static void Task_UpdateLvlInHealthbox(u8 taskId); static void PrintLinkStandbyMsg(void); static u32 CopyPlayerMonData(u8 monId, u8 *dst); static void SetPlayerMonData(u8 monId); -static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void PlayerDoMoveAnimation(void); -static void task05_08033660(u8 taskId); -static void sub_805CE38(void); +static void Task_StartSendOutAnim(u8 taskId); +static void EndDrawPartyStatusSummary(void); static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - PlayerHandleGetMonData, - PlayerHandleGetRawMonData, - PlayerHandleSetMonData, - PlayerHandleSetRawMonData, - PlayerHandleLoadMonSprite, - PlayerHandleSwitchInAnim, - PlayerHandleReturnMonToBall, - PlayerHandleDrawTrainerPic, - PlayerHandleTrainerSlide, - PlayerHandleTrainerSlideBack, - PlayerHandleFaintAnimation, - PlayerHandlePaletteFade, - PlayerHandleSuccessBallThrowAnim, - PlayerHandleBallThrowAnim, - PlayerHandlePause, - PlayerHandleMoveAnimation, - PlayerHandlePrintString, - PlayerHandlePrintSelectionString, - PlayerHandleChooseAction, - PlayerHandleUnknownYesNoBox, - PlayerHandleChooseMove, - PlayerHandleChooseItem, - PlayerHandleChoosePokemon, - PlayerHandleCmd23, - PlayerHandleHealthBarUpdate, - PlayerHandleExpUpdate, - PlayerHandleStatusIconUpdate, - PlayerHandleStatusAnimation, - PlayerHandleStatusXor, - PlayerHandleDataTransfer, - PlayerHandleDMA3Transfer, - PlayerHandlePlayBGM, - PlayerHandleCmd32, - PlayerHandleTwoReturnValues, - PlayerHandleChosenMonReturnValue, - PlayerHandleOneReturnValue, - PlayerHandleOneReturnValue_Duplicate, - PlayerHandleCmd37, - PlayerHandleCmd38, - PlayerHandleCmd39, - PlayerHandleCmd40, - PlayerHandleHitAnimation, - PlayerHandleCmd42, - PlayerHandlePlaySE, - PlayerHandlePlayFanfareOrBGM, - PlayerHandleFaintingCry, - PlayerHandleIntroSlide, - PlayerHandleIntroTrainerBallThrow, - PlayerHandleDrawPartyStatusSummary, - PlayerHandleHidePartyStatusSummary, - PlayerHandleEndBounceEffect, - PlayerHandleSpriteInvisibility, - PlayerHandleBattleAnimation, - PlayerHandleLinkStandbyMsg, - PlayerHandleResetActionMoveSelection, - PlayerHandleCmd55, - PlayerCmdEnd + [CONTROLLER_GETMONDATA] = PlayerHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = PlayerHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = PlayerHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = PlayerHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = PlayerHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = PlayerHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = PlayerHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = PlayerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = PlayerHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = PlayerHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, + [CONTROLLER_PAUSE] = PlayerHandlePause, + [CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = PlayerHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction, + [CONTROLLER_YESNOBOX] = PlayerHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove, + [CONTROLLER_OPENBAG] = PlayerHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon, + [CONTROLLER_23] = PlayerHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = PlayerHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = PlayerHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = PlayerHandleStatusXor, + [CONTROLLER_DATATRANSFER] = PlayerHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = PlayerHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = PlayerHandlePlayBGM, + [CONTROLLER_32] = PlayerHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = PlayerHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = PlayerHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = PlayerHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = PlayerHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = PlayerHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = PlayerHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = PlayerHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = PlayerHandleCantSwitch, + [CONTROLLER_PLAYSE] = PlayerHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = PlayerHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = PlayerHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = PlayerHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = PlayerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PlayerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PlayerHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = PlayerHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = PlayerHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = PlayerHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = PlayerHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = PlayerCmdEnd }; -static const u8 sTargetIdentities[] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT}; +static const u8 sTargetIdentities[MAX_BATTLERS_COUNT] = {B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT}; // unknown unused data -static const u8 sUnknown_0831C5FC[] = {0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58}; +static const u8 sUnused[] = {0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58}; -void nullsub_21(void) +void BattleControllerDummy(void) { } @@ -332,7 +332,7 @@ static void HandleInputChooseAction(void) } } -static void sub_80577F0(void) // unused +static void UnusedEndBounceEffect(void) { EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); EndBounceEffect(gActiveBattler, BOUNCE_MON); @@ -342,7 +342,7 @@ static void sub_80577F0(void) // unused static void HandleInputChooseTarget(void) { s32 i; - u8 identities[4]; + u8 identities[MAX_BATTLERS_COUNT]; memcpy(identities, sTargetIdentities, ARRAY_COUNT(sTargetIdentities)); DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1); @@ -398,7 +398,11 @@ static void HandleInputChooseTarget(void) do { if (--i < 0) +#ifdef UBFIX + i = MAX_BATTLERS_COUNT - 1; +#else i = MAX_BATTLERS_COUNT; // UB: array out of range +#endif gMultiUsePlayerCursor = GetBattlerAtPosition(identities[i]); } while (gMultiUsePlayerCursor == gBattlersCount); @@ -613,7 +617,7 @@ static void HandleInputChooseMove(void) } } -u32 sub_8057FBC(void) // unused +static u32 HandleMoveInputUnused(void) { u32 var = 0; @@ -626,7 +630,7 @@ u32 sub_8057FBC(void) // unused { PlaySE(SE_SELECT); gBattle_BG0_X = 0; - gBattle_BG0_Y = 0x140; + gBattle_BG0_Y = DISPLAY_HEIGHT * 2; var = 0xFF; } if (JOY_NEW(DPAD_LEFT) && gMoveSelectionCursor[gActiveBattler] & 1) @@ -847,7 +851,7 @@ static void HandleMoveSwitching(void) } } -static void sub_80586F8(void) +static void SetLinkBattleEndCallbacks(void) { if (gWirelessCommType == 0) { @@ -856,7 +860,7 @@ static void sub_80586F8(void) m4aSongNumStop(SE_LOW_HEALTH); gMain.inBattle = 0; gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(sub_8038D64); + SetMainCallback2(CB2_InitEndLinkBattle); if (gBattleOutcome == B_OUTCOME_WON) TryPutLinkBattleTvShowOnAir(); FreeAllWindowBuffers(); @@ -869,7 +873,7 @@ static void sub_80586F8(void) m4aSongNumStop(SE_LOW_HEALTH); gMain.inBattle = 0; gMain.callback1 = gPreBattleCallback1; - SetMainCallback2(sub_8038D64); + SetMainCallback2(CB2_InitEndLinkBattle); if (gBattleOutcome == B_OUTCOME_WON) TryPutLinkBattleTvShowOnAir(); FreeAllWindowBuffers(); @@ -877,7 +881,8 @@ static void sub_80586F8(void) } } -void sub_80587B0(void) +// Despite handling link battles separately, this is only ever used by link battles +void SetBattleEndCallbacks(void) { if (!gPaletteFade.active) { @@ -890,7 +895,7 @@ void sub_80587B0(void) else SetLinkStandbyCallback(); - gBattlerControllerFuncs[gActiveBattler] = sub_80586F8; + gBattlerControllerFuncs[gActiveBattler] = SetLinkBattleEndCallbacks; } } else @@ -915,161 +920,174 @@ static void CompleteOnBankSpriteCallbackDummy2(void) PlayerBufferExecCompleted(); } -static void sub_80588B4(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - nullsub_25(gSaveBlock2Ptr->playerGender); + BattleGfxSfxDummy3(gSaveBlock2Ptr->playerGender); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); PlayerBufferExecCompleted(); } } -static void sub_8058924(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; PlayerBufferExecCompleted(); } } -static void sub_805896C(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool8 var = FALSE; + bool8 healthboxAnimDone = FALSE; + // Check if healthbox has finished sliding in if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - var = TRUE; + healthboxAnimDone = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) - var = TRUE; + healthboxAnimDone = TRUE; } - if (var && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + // If healthbox and shiny anim are done + if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { + // Reset shiny anim (even if it didn't occur) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); if (IsDoubleBattle()) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], gActiveBattler ^ BIT_FLANK); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_8058924; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } -static void sub_8058B40(void) +static void Intro_TryShinyAnimShowHealthbox(void) { - bool32 r9 = FALSE; - bool32 r8 = FALSE; + bool32 bgmRestored = FALSE; + bool32 battlerAnimsDone = FALSE; + // Start shiny animation if applicable for 1st pokemon if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); + // Start shiny animation if applicable for 2nd pokemon if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) TryShinyAnimation(gActiveBattler ^ BIT_FLANK, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]]); - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) + // Show healthbox after ball anim + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40 + // Restore bgm after cry has played and healthbox anim is started + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].waitForCry && !IsCryPlayingOrClearCrySongs()) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) m4aMPlayContinue(&gMPlayInfo_BGM); else m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1; - r9 = TRUE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; + bgmRestored = TRUE; } + // Wait for battler anims if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - r8 = TRUE; + battlerAnimsDone = TRUE; } } else { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r8 = TRUE; + battlerAnimsDone = TRUE; } } - if (r9 && r8) + // Clean up + if (bgmRestored && battlerAnimsDone) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; - gBattlerControllerFuncs[gActiveBattler] = sub_805896C; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } -static void sub_8058EDC(void) +static void SwitchIn_CleanShinyAnimShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { CopyBattleSpriteInvisibility(gActiveBattler); + + // Reset shiny anim (even if it didn't occur) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + // Check if Substitute should be shown if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_8058FC0; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } -static void sub_8058FC0(void) +static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) @@ -1080,24 +1098,26 @@ static void sub_8058FC0(void) } } -static void sub_805902C(void) +static void SwitchIn_TryShinyAnimShowHealthbox(void) { + // Start shiny animation if applicable if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + // Wait for ball anim, then show healthbox + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_8058EDC; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_CleanShinyAnimShowSubstitute; } } -void c3_0802FDF4(u8 taskId) +void Task_PlayerController_RestoreBgmAfterCry(u8 taskId) { if (!IsCryPlayingOrClearCrySongs()) { @@ -1196,10 +1216,10 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) expToNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLvlExp; SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); - gTasks[taskId].func = sub_8059400; + gTasks[taskId].func = Task_GiveExpWithExpBar; } -static void sub_8059400(u8 taskId) +static void Task_GiveExpWithExpBar(u8 taskId) { if (gTasks[taskId].tExpTask_frames < 13) { @@ -1294,13 +1314,13 @@ static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) DestroyTask(taskId); } -static void sub_80596A8(void) +static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - nullsub_24(species); + BattleGfxSfxDummy2(species); FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1308,7 +1328,7 @@ static void sub_80596A8(void) } } -static void sub_8059744(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -1332,8 +1352,8 @@ static void OpenPartyMenuToChooseMon(void) u8 caseId; gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection; - caseId = gTasks[gUnknown_03005D7C[gActiveBattler]].data[0]; - DestroyTask(gUnknown_03005D7C[gActiveBattler]); + caseId = gTasks[gBattleControllerData[gActiveBattler]].data[0]; + DestroyTask(gBattleControllerData[gActiveBattler]); FreeAllWindowBuffers(); OpenPartyMenuInBattle(caseId); } @@ -1360,7 +1380,7 @@ static void OpenBagAndChooseItem(void) if (!gPaletteFade.active) { gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChoseItem; - nullsub_35(); + ReshowBattleScreenDummy(); FreeAllWindowBuffers(); CB2_BagMenuFromBattle(); } @@ -1400,7 +1420,7 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void PlayerHandleUnknownYesNoInput(void) +static void PlayerHandleYesNoInput(void) { if (JOY_NEW(DPAD_UP) && gMultiUsePlayerCursor != 0) { @@ -2171,18 +2191,18 @@ static void PlayerHandleSwitchInAnim(void) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); gActionSelectionCursor[gActiveBattler] = 0; gMoveSelectionCursor[gActiveBattler] = 0; - sub_805B258(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_805902C; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox; } -static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( @@ -2191,8 +2211,8 @@ static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit) GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -2203,7 +2223,7 @@ static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerHandleReturnMonToBall(void) @@ -2237,12 +2257,14 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_8059744; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + // In emerald it's possible to have a tag battle in the battle frontier facilities with AI // which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) // that use an animated back pic. @@ -2306,10 +2328,10 @@ static void PlayerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y = 48; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; } @@ -2321,9 +2343,9 @@ static void PlayerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; } gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; @@ -2361,12 +2383,14 @@ static void PlayerHandleTrainerSlide(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -96; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; } +#undef sSpeedX + static void PlayerHandleTrainerSlideBack(void) { SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -2376,9 +2400,12 @@ static void PlayerHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); - gBattlerControllerFuncs[gActiveBattler] = sub_80588B4; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } +#define sSpeedX data[1] +#define sSpeedY data[2] + static void PlayerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) @@ -2394,17 +2421,20 @@ static void PlayerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00; - gBattlerControllerFuncs[gActiveBattler] = sub_80596A8; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } +#undef sSpeedX +#undef sSpeedY + static void PlayerHandlePaletteFade(void) { - BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); PlayerBufferExecCompleted(); } @@ -2428,18 +2458,17 @@ static void PlayerHandleBallThrowAnim(void) static void PlayerHandlePause(void) { - u8 var = gBattleBufferA[gActiveBattler][1]; + u8 timer = gBattleBufferA[gActiveBattler][1]; - // WTF is this?? - while (var != 0) - var--; + while (timer != 0) + timer--; PlayerBufferExecCompleted(); } static void PlayerHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -2482,7 +2511,7 @@ static void PlayerDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -2491,7 +2520,7 @@ static void PlayerDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -2539,7 +2568,7 @@ static void HandleChooseActionAfterDma3(void) if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; + gBattle_BG0_Y = DISPLAY_HEIGHT; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; } } @@ -2560,7 +2589,7 @@ static void PlayerHandleChooseAction(void) BattlePutTextOnWindow(gDisplayedStringBattle, 1); } -static void PlayerHandleUnknownYesNoBox(void) +static void PlayerHandleYesNoBox(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { @@ -2568,7 +2597,7 @@ static void PlayerHandleUnknownYesNoBox(void) BattlePutTextOnWindow(gText_BattleYesNoChoice, 12); gMultiUsePlayerCursor = 1; BattleCreateYesNoCursorAt(1); - gBattlerControllerFuncs[gActiveBattler] = PlayerHandleUnknownYesNoInput; + gBattlerControllerFuncs[gActiveBattler] = PlayerHandleYesNoInput; } else { @@ -2581,7 +2610,7 @@ static void HandleChooseMoveAfterDma3(void) if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; - gBattle_BG0_Y = 320; + gBattle_BG0_Y = DISPLAY_HEIGHT * 2; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; } } @@ -2626,7 +2655,7 @@ static void PlayerHandleChooseItem(void) { s32 i; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem; gBattlerInMenuId = gActiveBattler; @@ -2648,12 +2677,12 @@ static void PlayerHandleChoosePokemon(void) } else { - gUnknown_03005D7C[gActiveBattler] = CreateTask(TaskDummy, 0xFF); - gTasks[gUnknown_03005D7C[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; + gBattleControllerData[gActiveBattler] = CreateTask(TaskDummy, 0xFF); + gTasks[gBattleControllerData[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4; - *(&gBattleStruct->field_8B) = gBattleBufferA[gActiveBattler][2]; + *(&gBattleStruct->prevSelectedPartySlot) = gBattleBufferA[gActiveBattler][2]; *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3]; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; } @@ -2662,7 +2691,7 @@ static void PlayerHandleChoosePokemon(void) static void PlayerHandleCmd23(void) { BattleStopLowHpSound(); - BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); PlayerBufferExecCompleted(); } @@ -2715,7 +2744,7 @@ static void PlayerHandleExpUpdate(void) gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; gTasks[taskId].tExpTask_battler = gActiveBattler; - gBattlerControllerFuncs[gActiveBattler] = nullsub_21; + gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } } @@ -2726,7 +2755,7 @@ static void PlayerHandleExpUpdate(void) static void PlayerHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -2739,7 +2768,7 @@ static void PlayerHandleStatusIconUpdate(void) static void PlayerHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -2822,27 +2851,27 @@ static void PlayerHandleOneReturnValue_Duplicate(void) PlayerBufferExecCompleted(); } -static void PlayerHandleCmd37(void) +static void PlayerHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; PlayerBufferExecCompleted(); } -static void PlayerHandleCmd38(void) +static void PlayerHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; PlayerBufferExecCompleted(); } -static void PlayerHandleCmd39(void) +static void PlayerHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; PlayerBufferExecCompleted(); } -static void PlayerHandleCmd40(void) +static void PlayerHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; PlayerBufferExecCompleted(); } @@ -2861,7 +2890,7 @@ static void PlayerHandleHitAnimation(void) } } -static void PlayerHandleCmd42(void) +static void PlayerHandleCantSwitch(void) { PlayerBufferExecCompleted(); } @@ -2909,6 +2938,12 @@ static void PlayerHandleIntroSlide(void) PlayerBufferExecCompleted(); } +// Task data for Task_StartSendOutAnim +#define tBattlerId data[0] +#define tStartTimer data[1] + +#define sBattlerId data[5] + static void PlayerHandleIntroTrainerBallThrow(void) { u8 paletteNum; @@ -2920,68 +2955,77 @@ static void PlayerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; + gSprites[gBattlerSpriteIds[gActiveBattler]].sBattlerId = gActiveBattler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2Ptr->playerGender].data, 0x100 + paletteNum * 16, 32); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(task05_08033660, 5); - gTasks[taskId].data[0] = gActiveBattler; + taskId = CreateTask(Task_StartSendOutAnim, 5); + gTasks[taskId].tBattlerId = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_21; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } -void sub_805CC00(struct Sprite *sprite) +void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) { - u8 battlerId = sprite->data[5]; + u8 battlerId = sprite->sBattlerId; + // Free player trainer sprite FreeSpriteOamMatrix(sprite); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); DestroySprite(sprite); + + // Load mon sprite BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); } -static void task05_08033660(u8 taskId) +#undef sBattlerId + +// Send out at start of battle +static void Task_StartSendOutAnim(u8 taskId) { - if (gTasks[taskId].data[1] < 31) + if (gTasks[taskId].tStartTimer < 31) { - gTasks[taskId].data[1]++; + gTasks[taskId].tStartTimer++; } else { u8 savedActiveBattler = gActiveBattler; - gActiveBattler = gTasks[taskId].data[0]; + gActiveBattler = gTasks[taskId].tBattlerId; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_805B258(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_805B258(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_805B258(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } - gBattlerControllerFuncs[gActiveBattler] = sub_8058B40; + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBattler; DestroyTask(taskId); } } +#undef tBattlerId +#undef tStartTimer + static void PlayerHandleDrawPartyStatusSummary(void) { if (gBattleBufferA[gActiveBattler][1] != 0 && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) @@ -2992,20 +3036,21 @@ static void PlayerHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; + // If intro, skip the delay after drawing if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_805CE38; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_805CE38(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; PlayerBufferExecCompleted(); } } @@ -3036,7 +3081,7 @@ static void PlayerHandleSpriteInvisibility(void) static void PlayerHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -3052,7 +3097,7 @@ static void PlayerHandleBattleAnimation(void) static void PlayerHandleLinkStandbyMsg(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][2]); + RecordedBattle_RecordAllBattlerData(&gBattleBufferA[gActiveBattler][2]); switch (gBattleBufferA[gActiveBattler][1]) { case 0: @@ -3087,15 +3132,15 @@ static void PlayerHandleResetActionMoveSelection(void) PlayerBufferExecCompleted(); } -static void PlayerHandleCmd55(void) +static void PlayerHandleEndLinkBattle(void) { - sub_81851A8(&gBattleBufferA[gActiveBattler][4]); + RecordedBattle_RecordAllBattlerData(&gBattleBufferA[gActiveBattler][4]); gBattleOutcome = gBattleBufferA[gActiveBattler][1]; gSaveBlock2Ptr->frontier.disableRecordBattle = gBattleBufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void PlayerCmdEnd(void) diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index af6b739cc..401ad311b 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -47,7 +47,7 @@ static void PlayerPartnerHandleMoveAnimation(void); static void PlayerPartnerHandlePrintString(void); static void PlayerPartnerHandlePrintSelectionString(void); static void PlayerPartnerHandleChooseAction(void); -static void PlayerPartnerHandleUnknownYesNoBox(void); +static void PlayerPartnerHandleYesNoBox(void); static void PlayerPartnerHandleChooseMove(void); static void PlayerPartnerHandleChooseItem(void); static void PlayerPartnerHandleChoosePokemon(void); @@ -65,12 +65,12 @@ static void PlayerPartnerHandleTwoReturnValues(void); static void PlayerPartnerHandleChosenMonReturnValue(void); static void PlayerPartnerHandleOneReturnValue(void); static void PlayerPartnerHandleOneReturnValue_Duplicate(void); -static void PlayerPartnerHandleCmd37(void); -static void PlayerPartnerHandleCmd38(void); -static void PlayerPartnerHandleCmd39(void); -static void PlayerPartnerHandleCmd40(void); +static void PlayerPartnerHandleClearUnkVar(void); +static void PlayerPartnerHandleSetUnkVar(void); +static void PlayerPartnerHandleClearUnkFlag(void); +static void PlayerPartnerHandleToggleUnkFlag(void); static void PlayerPartnerHandleHitAnimation(void); -static void PlayerPartnerHandleCmd42(void); +static void PlayerPartnerHandleCantSwitch(void); static void PlayerPartnerHandlePlaySE(void); static void PlayerPartnerHandlePlayFanfareOrBGM(void); static void PlayerPartnerHandleFaintingCry(void); @@ -83,89 +83,88 @@ static void PlayerPartnerHandleSpriteInvisibility(void); static void PlayerPartnerHandleBattleAnimation(void); static void PlayerPartnerHandleLinkStandbyMsg(void); static void PlayerPartnerHandleResetActionMoveSelection(void); -static void PlayerPartnerHandleCmd55(void); +static void PlayerPartnerHandleEndLinkBattle(void); static void PlayerPartnerCmdEnd(void); static void PlayerPartnerBufferRunCommand(void); static void PlayerPartnerBufferExecCompleted(void); -static void sub_81BB628(u8 taskId); +static void Task_LaunchLvlUpAnim(u8 taskId); static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId); static void Task_PrepareToGiveExpWithExpBar(u8 taskId); -static void sub_81BB4E4(u8 taskId); -static void sub_81BB628(u8 taskId); -static void sub_81BB688(u8 taskId); -static void sub_81BB9A0(void); +static void Task_GiveExpWithExpBar(u8 taskId); +static void Task_UpdateLvlInHealthbox(u8 taskId); +static void SwitchIn_WaitAndEnd(void); static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst); static void SetPlayerPartnerMonData(u8 monId); -static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void PlayerPartnerDoMoveAnimation(void); -static void sub_81BE2C8(u8 taskId); -static void sub_81BE498(void); +static void Task_StartSendOutAnim(u8 taskId); +static void EndDrawPartyStatusSummary(void); static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - PlayerPartnerHandleGetMonData, - PlayerPartnerHandleGetRawMonData, - PlayerPartnerHandleSetMonData, - PlayerPartnerHandleSetRawMonData, - PlayerPartnerHandleLoadMonSprite, - PlayerPartnerHandleSwitchInAnim, - PlayerPartnerHandleReturnMonToBall, - PlayerPartnerHandleDrawTrainerPic, - PlayerPartnerHandleTrainerSlide, - PlayerPartnerHandleTrainerSlideBack, - PlayerPartnerHandleFaintAnimation, - PlayerPartnerHandlePaletteFade, - PlayerPartnerHandleSuccessBallThrowAnim, - PlayerPartnerHandleBallThrowAnim, - PlayerPartnerHandlePause, - PlayerPartnerHandleMoveAnimation, - PlayerPartnerHandlePrintString, - PlayerPartnerHandlePrintSelectionString, - PlayerPartnerHandleChooseAction, - PlayerPartnerHandleUnknownYesNoBox, - PlayerPartnerHandleChooseMove, - PlayerPartnerHandleChooseItem, - PlayerPartnerHandleChoosePokemon, - PlayerPartnerHandleCmd23, - PlayerPartnerHandleHealthBarUpdate, - PlayerPartnerHandleExpUpdate, - PlayerPartnerHandleStatusIconUpdate, - PlayerPartnerHandleStatusAnimation, - PlayerPartnerHandleStatusXor, - PlayerPartnerHandleDataTransfer, - PlayerPartnerHandleDMA3Transfer, - PlayerPartnerHandlePlayBGM, - PlayerPartnerHandleCmd32, - PlayerPartnerHandleTwoReturnValues, - PlayerPartnerHandleChosenMonReturnValue, - PlayerPartnerHandleOneReturnValue, - PlayerPartnerHandleOneReturnValue_Duplicate, - PlayerPartnerHandleCmd37, - PlayerPartnerHandleCmd38, - PlayerPartnerHandleCmd39, - PlayerPartnerHandleCmd40, - PlayerPartnerHandleHitAnimation, - PlayerPartnerHandleCmd42, - PlayerPartnerHandlePlaySE, - PlayerPartnerHandlePlayFanfareOrBGM, - PlayerPartnerHandleFaintingCry, - PlayerPartnerHandleIntroSlide, - PlayerPartnerHandleIntroTrainerBallThrow, - PlayerPartnerHandleDrawPartyStatusSummary, - PlayerPartnerHandleHidePartyStatusSummary, - PlayerPartnerHandleEndBounceEffect, - PlayerPartnerHandleSpriteInvisibility, - PlayerPartnerHandleBattleAnimation, - PlayerPartnerHandleLinkStandbyMsg, - PlayerPartnerHandleResetActionMoveSelection, - PlayerPartnerHandleCmd55, - PlayerPartnerCmdEnd + [CONTROLLER_GETMONDATA] = PlayerPartnerHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = PlayerPartnerHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = PlayerPartnerHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = PlayerPartnerHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = PlayerPartnerHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = PlayerPartnerHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = PlayerPartnerHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = PlayerPartnerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = PlayerPartnerHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = PlayerPartnerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = PlayerPartnerHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = PlayerPartnerHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerPartnerHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = PlayerPartnerHandleBallThrowAnim, + [CONTROLLER_PAUSE] = PlayerPartnerHandlePause, + [CONTROLLER_MOVEANIMATION] = PlayerPartnerHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = PlayerPartnerHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerPartnerHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = PlayerPartnerHandleChooseAction, + [CONTROLLER_YESNOBOX] = PlayerPartnerHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = PlayerPartnerHandleChooseMove, + [CONTROLLER_OPENBAG] = PlayerPartnerHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = PlayerPartnerHandleChoosePokemon, + [CONTROLLER_23] = PlayerPartnerHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = PlayerPartnerHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = PlayerPartnerHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = PlayerPartnerHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = PlayerPartnerHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = PlayerPartnerHandleStatusXor, + [CONTROLLER_DATATRANSFER] = PlayerPartnerHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = PlayerPartnerHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = PlayerPartnerHandlePlayBGM, + [CONTROLLER_32] = PlayerPartnerHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = PlayerPartnerHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerPartnerHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = PlayerPartnerHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerPartnerHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = PlayerPartnerHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = PlayerPartnerHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = PlayerPartnerHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = PlayerPartnerHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = PlayerPartnerHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = PlayerPartnerHandleCantSwitch, + [CONTROLLER_PLAYSE] = PlayerPartnerHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = PlayerPartnerHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = PlayerPartnerHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = PlayerPartnerHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = PlayerPartnerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PlayerPartnerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PlayerPartnerHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = PlayerPartnerHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = PlayerPartnerHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = PlayerPartnerHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = PlayerPartnerHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerPartnerHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = PlayerPartnerHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = PlayerPartnerCmdEnd }; // unknown unused data -static const u8 sUnknown_08617254[] = +static const u8 sUnused[] = { 0x83, 0x4d, 0xf3, 0x5f, 0x6f, 0x4f, 0xeb, 0x3e, 0x67, 0x2e, 0x10, 0x46, 0x8c, 0x3d, 0x28, 0x35, @@ -173,7 +172,7 @@ static const u8 sUnknown_08617254[] = 0x3b, 0x43, 0xda, 0x36, 0x79, 0x2a, 0x0e, 0x53, }; -static void nullsub_77(void) +static void PlayerPartnerDummy(void) { } @@ -199,84 +198,84 @@ static void CompleteOnBattlerSpriteCallbackDummy(void) PlayerPartnerBufferExecCompleted(); } -static void sub_81BAE98(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - nullsub_25(0); + BattleGfxSfxDummy3(MALE); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); PlayerPartnerBufferExecCompleted(); } } -static void sub_81BAF00(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; PlayerPartnerBufferExecCompleted(); } } -static void sub_81BAF48(void) +static void Intro_WaitForHealthbox(void) { - bool32 r6 = FALSE; + bool32 finished = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; + finished = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r6 = TRUE; + finished = TRUE; } } if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; + finished = FALSE; - if (r6) + if (finished) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_81BAF00; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } -static void sub_81BB02C(void) +static void Intro_ShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive - && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 != 1) + && ++gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay != 1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; - gBattlerControllerFuncs[gActiveBattler] = sub_81BAF48; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForHealthbox; } } -static void sub_81BB1D4(void) +static void WaitForMonAnimAfterLoad(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) PlayerPartnerBufferExecCompleted(); @@ -339,7 +338,7 @@ static void Task_GiveExpToMon(u8 taskId) if (IsDoubleBattle() == TRUE && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])) - gTasks[taskId].func = sub_81BB628; + gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } @@ -373,10 +372,10 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) expToNextLvl = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLvlExp; SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); - gTasks[taskId].func = sub_81BB4E4; + gTasks[taskId].func = Task_GiveExpWithExpBar; } -static void sub_81BB4E4(u8 taskId) +static void Task_GiveExpWithExpBar(u8 taskId) { if (gTasks[taskId].tExpTask_frames < 13) { @@ -415,7 +414,7 @@ static void sub_81BB4E4(u8 taskId) gActiveBattler = battlerId; BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; - gTasks[taskId].func = sub_81BB628; + gTasks[taskId].func = Task_LaunchLvlUpAnim; } else { @@ -428,7 +427,7 @@ static void sub_81BB4E4(u8 taskId) } } -static void sub_81BB628(u8 taskId) +static void Task_LaunchLvlUpAnim(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_bank; u8 monIndex = gTasks[taskId].tExpTask_monId; @@ -437,10 +436,10 @@ static void sub_81BB628(u8 taskId) battlerId ^= BIT_FLANK; InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); - gTasks[taskId].func = sub_81BB688; + gTasks[taskId].func = Task_UpdateLvlInHealthbox; } -static void sub_81BB688(u8 taskId) +static void Task_UpdateLvlInHealthbox(u8 taskId) { u8 battlerId = gTasks[taskId].tExpTask_bank; @@ -471,13 +470,13 @@ static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) DestroyTask(taskId); } -static void sub_81BB78C(void) +static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - nullsub_24(species); + BattleGfxSfxDummy2(species); FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); @@ -485,7 +484,7 @@ static void sub_81BB78C(void) } } -static void sub_81BB828(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -521,7 +520,7 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_81BB92C(void) +static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { @@ -529,11 +528,11 @@ static void sub_81BB92C(void) if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_81BB9A0; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd; } } -static void sub_81BB9A0(void) +static void SwitchIn_WaitAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) @@ -542,28 +541,28 @@ static void sub_81BB9A0(void) } } -static void sub_81BB9F4(void) +static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - CreateTask(c3_0802FDF4, 10); + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_81BB92C; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } -static void sub_81BBAE8(void) +static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) @@ -571,11 +570,11 @@ static void sub_81BBAE8(void) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); - gBattlerControllerFuncs[gActiveBattler] = sub_81BB9F4; + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } @@ -1206,11 +1205,11 @@ static void PlayerPartnerHandleLoadMonSprite(void) GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_81BB1D4; + gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad; } static void PlayerPartnerHandleSwitchInAnim(void) @@ -1218,18 +1217,18 @@ static void PlayerPartnerHandleSwitchInAnim(void) ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_81BD0E4(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_81BBAE8; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( @@ -1238,8 +1237,8 @@ static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit) GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -1250,7 +1249,7 @@ static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerPartnerHandleReturnMonToBall(void) @@ -1284,12 +1283,14 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_81BB828; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + // some explanation here // in emerald it's possible to have a tag battle in the battle frontier facilities with AI // which use the front sprite for both the player and the partner as opposed to any other battles (including the one with Steven) that use the back pic as well as animate it @@ -1319,9 +1320,9 @@ static void PlayerPartnerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; } else // otherwise use front sprite { @@ -1330,10 +1331,10 @@ static void PlayerPartnerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y = 48; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; } @@ -1341,6 +1342,8 @@ static void PlayerPartnerHandleDrawTrainerPic(void) gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } +#undef sSpeedX + static void PlayerPartnerHandleTrainerSlide(void) { PlayerPartnerBufferExecCompleted(); @@ -1354,9 +1357,12 @@ static void PlayerPartnerHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = sub_81BAE98; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } +#define sSpeedX data[1] +#define sSpeedY data[2] + static void PlayerPartnerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) @@ -1372,14 +1378,17 @@ static void PlayerPartnerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, SOUND_PAN_ATTACKER); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00; - gBattlerControllerFuncs[gActiveBattler] = sub_81BB78C; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } +#undef sSpeedX +#undef sSpeedY + static void PlayerPartnerHandlePaletteFade(void) { PlayerPartnerBufferExecCompleted(); @@ -1402,7 +1411,7 @@ static void PlayerPartnerHandlePause(void) static void PlayerPartnerHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -1444,7 +1453,7 @@ static void PlayerPartnerDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1453,7 +1462,7 @@ static void PlayerPartnerDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1497,7 +1506,7 @@ static void PlayerPartnerHandleChooseAction(void) PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleUnknownYesNoBox(void) +static void PlayerPartnerHandleYesNoBox(void) { PlayerPartnerBufferExecCompleted(); } @@ -1602,7 +1611,7 @@ static void PlayerPartnerHandleExpUpdate(void) gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; gTasks[taskId].tExpTask_bank = gActiveBattler; - gBattlerControllerFuncs[gActiveBattler] = nullsub_21; + gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } } @@ -1613,7 +1622,7 @@ static void PlayerPartnerHandleExpUpdate(void) static void PlayerPartnerHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -1626,7 +1635,7 @@ static void PlayerPartnerHandleStatusIconUpdate(void) static void PlayerPartnerHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -1679,27 +1688,27 @@ static void PlayerPartnerHandleOneReturnValue_Duplicate(void) PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleCmd37(void) +static void PlayerPartnerHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleCmd38(void) +static void PlayerPartnerHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleCmd39(void) +static void PlayerPartnerHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleCmd40(void) +static void PlayerPartnerHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; PlayerPartnerBufferExecCompleted(); } @@ -1718,7 +1727,7 @@ static void PlayerPartnerHandleHitAnimation(void) } } -static void PlayerPartnerHandleCmd42(void) +static void PlayerPartnerHandleCantSwitch(void) { PlayerPartnerBufferExecCompleted(); } @@ -1779,7 +1788,7 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F9); @@ -1797,17 +1806,17 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(sub_81BE2C8, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_77; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = PlayerPartnerDummy; } -static void sub_81BE2C8(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 24) { @@ -1821,19 +1830,19 @@ static void sub_81BE2C8(u8 taskId) if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_81BD0E4(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_81BD0E4(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_81BD0E4(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } - gBattlerControllerFuncs[gActiveBattler] = sub_81BB02C; + gBattlerControllerFuncs[gActiveBattler] = Intro_ShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } @@ -1849,20 +1858,20 @@ static void PlayerPartnerHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_81BE498; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_81BE498(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; PlayerPartnerBufferExecCompleted(); } } @@ -1891,7 +1900,7 @@ static void PlayerPartnerHandleSpriteInvisibility(void) static void PlayerPartnerHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -1913,13 +1922,13 @@ static void PlayerPartnerHandleResetActionMoveSelection(void) PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleCmd55(void) +static void PlayerPartnerHandleEndLinkBattle(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerPartnerBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void PlayerPartnerCmdEnd(void) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index ca7cd4adc..245e4bd30 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -51,7 +51,7 @@ static void RecordedOpponentHandleMoveAnimation(void); static void RecordedOpponentHandlePrintString(void); static void RecordedOpponentHandlePrintSelectionString(void); static void RecordedOpponentHandleChooseAction(void); -static void RecordedOpponentHandleUnknownYesNoBox(void); +static void RecordedOpponentHandleYesNoBox(void); static void RecordedOpponentHandleChooseMove(void); static void RecordedOpponentHandleChooseItem(void); static void RecordedOpponentHandleChoosePokemon(void); @@ -69,12 +69,12 @@ static void RecordedOpponentHandleTwoReturnValues(void); static void RecordedOpponentHandleChosenMonReturnValue(void); static void RecordedOpponentHandleOneReturnValue(void); static void RecordedOpponentHandleOneReturnValue_Duplicate(void); -static void RecordedOpponentHandleCmd37(void); -static void RecordedOpponentHandleCmd38(void); -static void RecordedOpponentHandleCmd39(void); -static void RecordedOpponentHandleCmd40(void); +static void RecordedOpponentHandleClearUnkVar(void); +static void RecordedOpponentHandleSetUnkVar(void); +static void RecordedOpponentHandleClearUnkFlag(void); +static void RecordedOpponentHandleToggleUnkFlag(void); static void RecordedOpponentHandleHitAnimation(void); -static void RecordedOpponentHandleCmd42(void); +static void RecordedOpponentHandleCantSwitch(void); static void RecordedOpponentHandlePlaySE(void); static void RecordedOpponentHandlePlayFanfareOrBGM(void); static void RecordedOpponentHandleFaintingCry(void); @@ -87,83 +87,83 @@ static void RecordedOpponentHandleSpriteInvisibility(void); static void RecordedOpponentHandleBattleAnimation(void); static void RecordedOpponentHandleLinkStandbyMsg(void); static void RecordedOpponentHandleResetActionMoveSelection(void); -static void RecordedOpponentHandleCmd55(void); +static void RecordedOpponentHandleEndLinkBattle(void); static void RecordedOpponentCmdEnd(void); static void RecordedOpponentBufferRunCommand(void); static void RecordedOpponentBufferExecCompleted(void); -static void sub_8186F14(void); +static void SwitchIn_HandleSoundAndEnd(void); static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst); static void SetRecordedOpponentMonData(u8 monId); -static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void RecordedOpponentDoMoveAnimation(void); -static void sub_8189548(u8 taskId); -static void sub_818962C(struct Sprite *sprite); -static void sub_818975C(void); +static void Task_StartSendOutAnim(u8 taskId); +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); +static void EndDrawPartyStatusSummary(void); static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - RecordedOpponentHandleGetMonData, - RecordedOpponentHandleGetRawMonData, - RecordedOpponentHandleSetMonData, - RecordedOpponentHandleSetRawMonData, - RecordedOpponentHandleLoadMonSprite, - RecordedOpponentHandleSwitchInAnim, - RecordedOpponentHandleReturnMonToBall, - RecordedOpponentHandleDrawTrainerPic, - RecordedOpponentHandleTrainerSlide, - RecordedOpponentHandleTrainerSlideBack, - RecordedOpponentHandleFaintAnimation, - RecordedOpponentHandlePaletteFade, - RecordedOpponentHandleSuccessBallThrowAnim, - RecordedOpponentHandleBallThrowAnim, - RecordedOpponentHandlePause, - RecordedOpponentHandleMoveAnimation, - RecordedOpponentHandlePrintString, - RecordedOpponentHandlePrintSelectionString, - RecordedOpponentHandleChooseAction, - RecordedOpponentHandleUnknownYesNoBox, - RecordedOpponentHandleChooseMove, - RecordedOpponentHandleChooseItem, - RecordedOpponentHandleChoosePokemon, - RecordedOpponentHandleCmd23, - RecordedOpponentHandleHealthBarUpdate, - RecordedOpponentHandleExpUpdate, - RecordedOpponentHandleStatusIconUpdate, - RecordedOpponentHandleStatusAnimation, - RecordedOpponentHandleStatusXor, - RecordedOpponentHandleDataTransfer, - RecordedOpponentHandleDMA3Transfer, - RecordedOpponentHandlePlayBGM, - RecordedOpponentHandleCmd32, - RecordedOpponentHandleTwoReturnValues, - RecordedOpponentHandleChosenMonReturnValue, - RecordedOpponentHandleOneReturnValue, - RecordedOpponentHandleOneReturnValue_Duplicate, - RecordedOpponentHandleCmd37, - RecordedOpponentHandleCmd38, - RecordedOpponentHandleCmd39, - RecordedOpponentHandleCmd40, - RecordedOpponentHandleHitAnimation, - RecordedOpponentHandleCmd42, - RecordedOpponentHandlePlaySE, - RecordedOpponentHandlePlayFanfareOrBGM, - RecordedOpponentHandleFaintingCry, - RecordedOpponentHandleIntroSlide, - RecordedOpponentHandleIntroTrainerBallThrow, - RecordedOpponentHandleDrawPartyStatusSummary, - RecordedOpponentHandleHidePartyStatusSummary, - RecordedOpponentHandleEndBounceEffect, - RecordedOpponentHandleSpriteInvisibility, - RecordedOpponentHandleBattleAnimation, - RecordedOpponentHandleLinkStandbyMsg, - RecordedOpponentHandleResetActionMoveSelection, - RecordedOpponentHandleCmd55, - RecordedOpponentCmdEnd + [CONTROLLER_GETMONDATA] = RecordedOpponentHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = RecordedOpponentHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = RecordedOpponentHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = RecordedOpponentHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = RecordedOpponentHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = RecordedOpponentHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = RecordedOpponentHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = RecordedOpponentHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = RecordedOpponentHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = RecordedOpponentHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = RecordedOpponentHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = RecordedOpponentHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = RecordedOpponentHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = RecordedOpponentHandleBallThrowAnim, + [CONTROLLER_PAUSE] = RecordedOpponentHandlePause, + [CONTROLLER_MOVEANIMATION] = RecordedOpponentHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = RecordedOpponentHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = RecordedOpponentHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = RecordedOpponentHandleChooseAction, + [CONTROLLER_YESNOBOX] = RecordedOpponentHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = RecordedOpponentHandleChooseMove, + [CONTROLLER_OPENBAG] = RecordedOpponentHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = RecordedOpponentHandleChoosePokemon, + [CONTROLLER_23] = RecordedOpponentHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = RecordedOpponentHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = RecordedOpponentHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = RecordedOpponentHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = RecordedOpponentHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = RecordedOpponentHandleStatusXor, + [CONTROLLER_DATATRANSFER] = RecordedOpponentHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = RecordedOpponentHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = RecordedOpponentHandlePlayBGM, + [CONTROLLER_32] = RecordedOpponentHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = RecordedOpponentHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = RecordedOpponentHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = RecordedOpponentHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = RecordedOpponentHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = RecordedOpponentHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = RecordedOpponentHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = RecordedOpponentHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = RecordedOpponentHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = RecordedOpponentHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = RecordedOpponentHandleCantSwitch, + [CONTROLLER_PLAYSE] = RecordedOpponentHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = RecordedOpponentHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = RecordedOpponentHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = RecordedOpponentHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedOpponentHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedOpponentHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = RecordedOpponentHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = RecordedOpponentHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = RecordedOpponentHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = RecordedOpponentHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = RecordedOpponentHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = RecordedOpponentHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = RecordedOpponentHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = RecordedOpponentCmdEnd }; -static void nullsub_70(void) +static void RecordedOpponentDummy(void) { } @@ -195,7 +195,7 @@ static void CompleteOnBankSpriteCallbackDummy2(void) RecordedOpponentBufferExecCompleted(); } -static void sub_81865C8(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { @@ -206,24 +206,24 @@ static void sub_81865C8(void) } } -static void sub_8186630(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; RecordedOpponentBufferExecCompleted(); } } -static void sub_8186678(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool8 var = FALSE; + bool8 healthboxAnimDone = FALSE; if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded) - var = TRUE; + healthboxAnimDone = TRUE; } else @@ -232,10 +232,10 @@ static void sub_8186678(void) && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].animEnded) - var = TRUE; + healthboxAnimDone = TRUE; } - if (var) + if (healthboxAnimDone) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { @@ -248,19 +248,19 @@ static void sub_8186678(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_8186630; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } -static void sub_818686C(void) +static void Intro_TryShinyAnimShowHealthbox(void) { - bool32 r9 = FALSE; - bool32 r8 = FALSE; + bool32 bgmRestored = FALSE; + bool32 battlerAnimsDone = FALSE; if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) @@ -272,27 +272,27 @@ static void sub_818686C(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; } - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40 - && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40 + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry + && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].waitForCry && !IsCryPlayingOrClearCrySongs()) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -304,49 +304,49 @@ static void sub_818686C(void) m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); } } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1; - r9 = TRUE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; + bgmRestored = TRUE; } if (!IsDoubleBattle()) { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - r8 = TRUE; + battlerAnimsDone = TRUE; } } else { - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy - && gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r8 = TRUE; + battlerAnimsDone = TRUE; } } - if (r9 && r8) + if (bgmRestored && battlerAnimsDone) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); SetBattlerShadowSpriteCallback(gActiveBattler ^ BIT_FLANK, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], MON_DATA_SPECIES)); } - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; - gBattlerControllerFuncs[gActiveBattler] = sub_8186678; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } -static void sub_8186C48(void) +static void TryShinyAnimAfterMonAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) @@ -361,8 +361,8 @@ static void sub_8186C48(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); RecordedOpponentBufferExecCompleted(); } } @@ -385,7 +385,7 @@ static void CompleteOnHealthbarDone(void) } } -static void sub_8186D58(void) +static void HideHealthboxAfterMonFaint(void) { if (!gSprites[gBattlerSpriteIds[gActiveBattler]].inUse) { @@ -394,7 +394,7 @@ static void sub_8186D58(void) } } -static void sub_8186D9C(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -431,18 +431,18 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_8186EA4(void) +static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_8186F14; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_HandleSoundAndEnd; } } -static void sub_8186F14(void) +static void SwitchIn_HandleSoundAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) @@ -456,7 +456,7 @@ static void sub_8186F14(void) } } -static void sub_8186F94(void) +static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) @@ -464,31 +464,31 @@ static void sub_8186F94(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); CopyBattleSpriteInvisibility(gActiveBattler); - gBattlerControllerFuncs[gActiveBattler] = sub_8186EA4; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } -static void sub_8187084(void) +static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim) TryShinyAnimation(gActiveBattler, &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]]); - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[gActiveBattler] = sub_8186F94; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } @@ -1117,31 +1117,31 @@ static void RecordedOpponentHandleLoadMonSprite(void) GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); SetBattlerShadowSpriteCallback(gActiveBattler, GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES)); - gBattlerControllerFuncs[gActiveBattler] = sub_8186C48; + gBattlerControllerFuncs[gActiveBattler] = TryShinyAnimAfterMonAnim; } static void RecordedOpponentHandleSwitchInAnim(void) { gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; - sub_81885D8(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_8187084; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); @@ -1150,8 +1150,8 @@ static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit) GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -1162,7 +1162,7 @@ static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void RecordedOpponentHandleReturnMonToBall(void) @@ -1197,12 +1197,14 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_OPPONENT_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_8186D9C; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + static void RecordedOpponentHandleDrawTrainerPic(void) { s16 xPos; @@ -1236,7 +1238,7 @@ static void RecordedOpponentHandleDrawTrainerPic(void) } else { - trainerPicId = PlayerGenderToFrontTrainerPicId(gLinkPlayers[gUnknown_0203C7B4 ^ BIT_SIDE].gender); + trainerPicId = PlayerGenderToFrontTrainerPicId(gLinkPlayers[gRecordedBattleMultiplayerId ^ BIT_SIDE].gender); } } @@ -1247,15 +1249,17 @@ static void RecordedOpponentHandleDrawTrainerPic(void) (8 - gTrainerFrontPicCoords[trainerPicId].size) * 4 + 40, GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } +#undef sSpeedX + static void RecordedOpponentHandleTrainerSlide(void) { RecordedOpponentBufferExecCompleted(); @@ -1269,7 +1273,7 @@ static void RecordedOpponentHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = sub_81865C8; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } static void RecordedOpponentHandleFaintAnimation(void) @@ -1287,7 +1291,7 @@ static void RecordedOpponentHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_FAINT, SOUND_PAN_TARGET); gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; - gBattlerControllerFuncs[gActiveBattler] = sub_8186D58; + gBattlerControllerFuncs[gActiveBattler] = HideHealthboxAfterMonFaint; } } } @@ -1314,7 +1318,7 @@ static void RecordedOpponentHandlePause(void) static void RecordedOpponentHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -1356,7 +1360,7 @@ static void RecordedOpponentDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1365,7 +1369,7 @@ static void RecordedOpponentDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1409,7 +1413,7 @@ static void RecordedOpponentHandleChooseAction(void) RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleUnknownYesNoBox(void) +static void RecordedOpponentHandleYesNoBox(void) { RecordedOpponentBufferExecCompleted(); } @@ -1478,7 +1482,7 @@ static void RecordedOpponentHandleExpUpdate(void) static void RecordedOpponentHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -1491,7 +1495,7 @@ static void RecordedOpponentHandleStatusIconUpdate(void) static void RecordedOpponentHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -1544,27 +1548,27 @@ static void RecordedOpponentHandleOneReturnValue_Duplicate(void) RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleCmd37(void) +static void RecordedOpponentHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleCmd38(void) +static void RecordedOpponentHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleCmd39(void) +static void RecordedOpponentHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleCmd40(void) +static void RecordedOpponentHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; RecordedOpponentBufferExecCompleted(); } @@ -1583,7 +1587,7 @@ static void RecordedOpponentHandleHitAnimation(void) } } -static void RecordedOpponentHandleCmd42(void) +static void RecordedOpponentHandleCantSwitch(void) { RecordedOpponentBufferExecCompleted(); } @@ -1633,7 +1637,6 @@ static void RecordedOpponentHandleIntroSlide(void) static void RecordedOpponentHandleIntroTrainerBallThrow(void) { - u8 paletteNum; u8 taskId; SetSpritePrimaryCoordsFromSecondaryCoords(&gSprites[gBattlerSpriteIds[gActiveBattler]]); @@ -1643,19 +1646,19 @@ static void RecordedOpponentHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_818962C); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreeOpponentSprite); - taskId = CreateTask(sub_8189548, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_70; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = RecordedOpponentDummy; } -static void sub_8189548(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { u8 savedActiveBank = gActiveBattler; @@ -1663,23 +1666,23 @@ static void sub_8189548(u8 taskId) if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_81885D8(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_81885D8(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_81885D8(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } - gBattlerControllerFuncs[gActiveBattler] = sub_818686C; + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } -static void sub_818962C(struct Sprite *sprite) +static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite) { FreeTrainerFrontPicPalette(sprite->oam.affineParam); FreeSpriteOamMatrix(sprite); @@ -1710,20 +1713,20 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(void) } gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_818975C; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_818975C(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; RecordedOpponentBufferExecCompleted(); } } @@ -1752,7 +1755,7 @@ static void RecordedOpponentHandleSpriteInvisibility(void) static void RecordedOpponentHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -1774,7 +1777,7 @@ static void RecordedOpponentHandleResetActionMoveSelection(void) RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleCmd55(void) +static void RecordedOpponentHandleEndLinkBattle(void) { if (gBattleBufferA[gActiveBattler][1] == B_OUTCOME_DREW) gBattleOutcome = gBattleBufferA[gActiveBattler][1]; @@ -1784,7 +1787,7 @@ static void RecordedOpponentHandleCmd55(void) FadeOutMapMusic(5); BeginFastPaletteFade(3); RecordedOpponentBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void RecordedOpponentCmdEnd(void) diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 72af27d5e..73c23afc5 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -47,7 +47,7 @@ static void RecordedPlayerHandleMoveAnimation(void); static void RecordedPlayerHandlePrintString(void); static void RecordedPlayerHandlePrintSelectionString(void); static void RecordedPlayerHandleChooseAction(void); -static void RecordedPlayerHandleUnknownYesNoBox(void); +static void RecordedPlayerHandleYesNoBox(void); static void RecordedPlayerHandleChooseMove(void); static void RecordedPlayerHandleChooseItem(void); static void RecordedPlayerHandleChoosePokemon(void); @@ -65,12 +65,12 @@ static void RecordedPlayerHandleTwoReturnValues(void); static void RecordedPlayerHandleChosenMonReturnValue(void); static void RecordedPlayerHandleOneReturnValue(void); static void RecordedPlayerHandleOneReturnValue_Duplicate(void); -static void RecordedPlayerHandleCmd37(void); -static void RecordedPlayerHandleCmd38(void); -static void RecordedPlayerHandleCmd39(void); -static void RecordedPlayerHandleCmd40(void); +static void RecordedPlayerHandleClearUnkVar(void); +static void RecordedPlayerHandleSetUnkVar(void); +static void RecordedPlayerHandleClearUnkFlag(void); +static void RecordedPlayerHandleToggleUnkFlag(void); static void RecordedPlayerHandleHitAnimation(void); -static void RecordedPlayerHandleCmd42(void); +static void RecordedPlayerHandleCantSwitch(void); static void RecordedPlayerHandlePlaySE(void); static void RecordedPlayerHandlePlayFanfareOrBGM(void); static void RecordedPlayerHandleFaintingCry(void); @@ -83,82 +83,82 @@ static void RecordedPlayerHandleSpriteInvisibility(void); static void RecordedPlayerHandleBattleAnimation(void); static void RecordedPlayerHandleLinkStandbyMsg(void); static void RecordedPlayerHandleResetActionMoveSelection(void); -static void RecordedPlayerHandleCmd55(void); +static void RecordedPlayerHandleEndLinkBattle(void); static void RecordedPlayerCmdEnd(void); static void RecordedPlayerBufferRunCommand(void); static void RecordedPlayerBufferExecCompleted(void); -static void sub_818A328(void); +static void SwitchIn_WaitAndEnd(void); static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst); static void SetRecordedPlayerMonData(u8 monId); -static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void RecordedPlayerDoMoveAnimation(void); -static void sub_818CC24(u8 taskId); -static void sub_818CDF4(void); +static void Task_StartSendOutAnim(u8 taskId); +static void EndDrawPartyStatusSummary(void); static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - RecordedPlayerHandleGetMonData, - RecordedPlayerHandleGetRawMonData, - RecordedPlayerHandleSetMonData, - RecordedPlayerHandleSetRawMonData, - RecordedPlayerHandleLoadMonSprite, - RecordedPlayerHandleSwitchInAnim, - RecordedPlayerHandleReturnMonToBall, - RecordedPlayerHandleDrawTrainerPic, - RecordedPlayerHandleTrainerSlide, - RecordedPlayerHandleTrainerSlideBack, - RecordedPlayerHandleFaintAnimation, - RecordedPlayerHandlePaletteFade, - RecordedPlayerHandleSuccessBallThrowAnim, - RecordedPlayerHandleBallThrowAnim, - RecordedPlayerHandlePause, - RecordedPlayerHandleMoveAnimation, - RecordedPlayerHandlePrintString, - RecordedPlayerHandlePrintSelectionString, - RecordedPlayerHandleChooseAction, - RecordedPlayerHandleUnknownYesNoBox, - RecordedPlayerHandleChooseMove, - RecordedPlayerHandleChooseItem, - RecordedPlayerHandleChoosePokemon, - RecordedPlayerHandleCmd23, - RecordedPlayerHandleHealthBarUpdate, - RecordedPlayerHandleExpUpdate, - RecordedPlayerHandleStatusIconUpdate, - RecordedPlayerHandleStatusAnimation, - RecordedPlayerHandleStatusXor, - RecordedPlayerHandleDataTransfer, - RecordedPlayerHandleDMA3Transfer, - RecordedPlayerHandlePlayBGM, - RecordedPlayerHandleCmd32, - RecordedPlayerHandleTwoReturnValues, - RecordedPlayerHandleChosenMonReturnValue, - RecordedPlayerHandleOneReturnValue, - RecordedPlayerHandleOneReturnValue_Duplicate, - RecordedPlayerHandleCmd37, - RecordedPlayerHandleCmd38, - RecordedPlayerHandleCmd39, - RecordedPlayerHandleCmd40, - RecordedPlayerHandleHitAnimation, - RecordedPlayerHandleCmd42, - RecordedPlayerHandlePlaySE, - RecordedPlayerHandlePlayFanfareOrBGM, - RecordedPlayerHandleFaintingCry, - RecordedPlayerHandleIntroSlide, - RecordedPlayerHandleIntroTrainerBallThrow, - RecordedPlayerHandleDrawPartyStatusSummary, - RecordedPlayerHandleHidePartyStatusSummary, - RecordedPlayerHandleEndBounceEffect, - RecordedPlayerHandleSpriteInvisibility, - RecordedPlayerHandleBattleAnimation, - RecordedPlayerHandleLinkStandbyMsg, - RecordedPlayerHandleResetActionMoveSelection, - RecordedPlayerHandleCmd55, - RecordedPlayerCmdEnd + [CONTROLLER_GETMONDATA] = RecordedPlayerHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = RecordedPlayerHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = RecordedPlayerHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = RecordedPlayerHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = RecordedPlayerHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = RecordedPlayerHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = RecordedPlayerHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = RecordedPlayerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = RecordedPlayerHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = RecordedPlayerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = RecordedPlayerHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = RecordedPlayerHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = RecordedPlayerHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = RecordedPlayerHandleBallThrowAnim, + [CONTROLLER_PAUSE] = RecordedPlayerHandlePause, + [CONTROLLER_MOVEANIMATION] = RecordedPlayerHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = RecordedPlayerHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = RecordedPlayerHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = RecordedPlayerHandleChooseAction, + [CONTROLLER_YESNOBOX] = RecordedPlayerHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = RecordedPlayerHandleChooseMove, + [CONTROLLER_OPENBAG] = RecordedPlayerHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = RecordedPlayerHandleChoosePokemon, + [CONTROLLER_23] = RecordedPlayerHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = RecordedPlayerHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = RecordedPlayerHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = RecordedPlayerHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = RecordedPlayerHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = RecordedPlayerHandleStatusXor, + [CONTROLLER_DATATRANSFER] = RecordedPlayerHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = RecordedPlayerHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = RecordedPlayerHandlePlayBGM, + [CONTROLLER_32] = RecordedPlayerHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = RecordedPlayerHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = RecordedPlayerHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = RecordedPlayerHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = RecordedPlayerHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = RecordedPlayerHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = RecordedPlayerHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = RecordedPlayerHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = RecordedPlayerHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = RecordedPlayerHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = RecordedPlayerHandleCantSwitch, + [CONTROLLER_PLAYSE] = RecordedPlayerHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = RecordedPlayerHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = RecordedPlayerHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = RecordedPlayerHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = RecordedPlayerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = RecordedPlayerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = RecordedPlayerHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = RecordedPlayerHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = RecordedPlayerHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = RecordedPlayerHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = RecordedPlayerHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = RecordedPlayerHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = RecordedPlayerHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = RecordedPlayerCmdEnd }; -static void nullsub_120(void) +static void RecordedPlayerDummy(void) { } @@ -184,47 +184,47 @@ static void CompleteOnBattlerSpriteCallbackDummy(void) RecordedPlayerBufferExecCompleted(); } -static void sub_81899F0(void) +static void FreeTrainerSpriteAfterSlide(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { - nullsub_25(0); + BattleGfxSfxDummy3(MALE); FreeSpriteOamMatrix(&gSprites[gBattlerSpriteIds[gActiveBattler]]); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); RecordedPlayerBufferExecCompleted(); } } -static void sub_8189A58(void) +static void Intro_DelayAndEnd(void) { - if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 == 0xFF) + if (--gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay == (u8)-1) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 0; RecordedPlayerBufferExecCompleted(); } } -static void sub_8189AA0(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool32 r6 = FALSE; + bool32 healthboxAnimDone = FALSE; if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; + healthboxAnimDone = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r6 = TRUE; + healthboxAnimDone = TRUE; } } - if (r6 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; @@ -233,15 +233,15 @@ static void sub_8189AA0(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); if (IsDoubleBattle()) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], gActiveBattler ^ BIT_FLANK); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_8189A58; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } else @@ -249,31 +249,31 @@ static void sub_8189AA0(void) if (!IsDoubleBattle() || (IsDoubleBattle() && (gBattleTypeFlags & BATTLE_TYPE_MULTI))) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - r6 = TRUE; + healthboxAnimDone = TRUE; } else { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]].callback == SpriteCallbackDummy) { - r6 = TRUE; + healthboxAnimDone = TRUE; } } if (IsCryPlayingOrClearCrySongs()) - r6 = FALSE; + healthboxAnimDone = FALSE; - if (r6) + if (healthboxAnimDone) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_9 = 3; - gBattlerControllerFuncs[gActiveBattler] = sub_8189A58; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].introEndDelay = 3; + gBattlerControllerFuncs[gActiveBattler] = Intro_DelayAndEnd; } } } -static void sub_8189D40(void) +static void Intro_TryShinyAnimShowHealthbox(void) { - bool32 r10 = FALSE; + bool32 bgmRestored = FALSE; if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { @@ -289,27 +289,27 @@ static void sub_8189D40(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = TRUE; } - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x40 - && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].field_1_x40 + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].waitForCry + && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].waitForCry && !IsCryPlayingOrClearCrySongs()) { - if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20) + if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored) { if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { @@ -322,25 +322,25 @@ static void sub_8189D40(void) } } - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 1; - r10 = TRUE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = TRUE; + bgmRestored = TRUE; } - if (r10 && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (bgmRestored && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x20 = 0; - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_1_x80 = 0; - gBattlerControllerFuncs[gActiveBattler] = sub_8189AA0; + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].bgmRestored = FALSE; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].healthboxSlideInStarted = FALSE; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } -static void sub_818A064(void) +static void WaitForMonAnimAfterLoad(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].animEnded && gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x == 0) RecordedPlayerBufferExecCompleted(); @@ -363,13 +363,13 @@ static void CompleteOnHealthbarDone(void) } } -static void sub_818A114(void) +static void FreeMonSpriteAfterFaintAnim(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y > DISPLAY_HEIGHT) { u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - nullsub_24(species); + BattleGfxSfxDummy2(species); FreeOamMatrix(gSprites[gBattlerSpriteIds[gActiveBattler]].oam.matrixNum); DestroySprite(&gSprites[gBattlerSpriteIds[gActiveBattler]]); SetHealthboxSpriteInvisible(gHealthboxSpriteIds[gActiveBattler]); @@ -377,7 +377,7 @@ static void sub_818A114(void) } } -static void sub_818A1B0(void) +static void FreeMonSpriteAfterSwitchOutAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -413,7 +413,7 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_818A2B4(void) +static void SwitchIn_ShowSubstitute(void) { if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { @@ -421,11 +421,11 @@ static void sub_818A2B4(void) if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); - gBattlerControllerFuncs[gActiveBattler] = sub_818A328; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_WaitAndEnd; } } -static void sub_818A328(void) +static void SwitchIn_WaitAndEnd(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) @@ -434,28 +434,28 @@ static void sub_818A328(void) } } -static void sub_818A37C(void) +static void SwitchIn_ShowHealthbox(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - CreateTask(c3_0802FDF4, 10); + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 0); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_818A2B4; + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowSubstitute; } } -static void sub_818A470(void) +static void SwitchIn_TryShinyAnim(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) @@ -463,11 +463,11 @@ static void sub_818A470(void) TryShinyAnimation(gActiveBattler, &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]]); } - if (gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + if (gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); - gBattlerControllerFuncs[gActiveBattler] = sub_818A37C; + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_ShowHealthbox; } } @@ -1098,11 +1098,11 @@ static void RecordedPlayerHandleLoadMonSprite(void) GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), GetBattlerSpriteSubpriority(gActiveBattler)); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], gBattleMonForms[gActiveBattler]); - gBattlerControllerFuncs[gActiveBattler] = sub_818A064; + gBattlerControllerFuncs[gActiveBattler] = WaitForMonAnimAfterLoad; } static void RecordedPlayerHandleSwitchInAnim(void) @@ -1110,18 +1110,18 @@ static void RecordedPlayerHandleSwitchInAnim(void) ClearTemporarySpeciesSpriteData(gActiveBattler, gBattleBufferA[gActiveBattler][2]); gBattlerPartyIndexes[gActiveBattler] = gBattleBufferA[gActiveBattler][1]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_818BA6C(gActiveBattler, gBattleBufferA[gActiveBattler][2]); - gBattlerControllerFuncs[gActiveBattler] = sub_818A470; + StartSendOutAnim(gActiveBattler, gBattleBufferA[gActiveBattler][2]); + gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) { u16 species; ClearTemporarySpeciesSpriteData(battlerId, dontClearSubstituteBit); gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( @@ -1130,8 +1130,8 @@ static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit) GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -1142,7 +1142,7 @@ static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit) gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void RecordedPlayerHandleReturnMonToBall(void) @@ -1176,23 +1176,25 @@ static void DoSwitchOutAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_818A1B0; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterSwitchOutAnim; } break; } } +#define sSpeedX data[0] + static void RecordedPlayerHandleDrawTrainerPic(void) { s16 xPos, yPos; u32 trainerPicId; - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) trainerPicId = GetActiveBattlerLinkPlayerGender(); else - trainerPicId = gLinkPlayers[gUnknown_0203C7B4].gender; + trainerPicId = gLinkPlayers[gRecordedBattleMultiplayerId].gender; } else { @@ -1231,10 +1233,10 @@ static void RecordedPlayerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.y = 48; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = ST_OAM_AFFINE_OFF; gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; } @@ -1245,14 +1247,16 @@ static void RecordedPlayerHandleDrawTrainerPic(void) gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, GetBattlerSpriteSubpriority(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; } gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } +#undef sSpeedX + static void RecordedPlayerHandleTrainerSlide(void) { RecordedPlayerBufferExecCompleted(); @@ -1266,9 +1270,12 @@ static void RecordedPlayerHandleTrainerSlideBack(void) gSprites[gBattlerSpriteIds[gActiveBattler]].data[4] = gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.y; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCallbackDummy); - gBattlerControllerFuncs[gActiveBattler] = sub_81899F0; + gBattlerControllerFuncs[gActiveBattler] = FreeTrainerSpriteAfterSlide; } +#define sSpeedX data[1] +#define sSpeedY data[2] + static void RecordedPlayerHandleFaintAnimation(void) { if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState == 0) @@ -1284,14 +1291,17 @@ static void RecordedPlayerHandleFaintAnimation(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); PlaySE12WithPanning(SE_FAINT, -64); - gSprites[gBattlerSpriteIds[gActiveBattler]].data[1] = 0; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[2] = 5; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039C00; - gBattlerControllerFuncs[gActiveBattler] = sub_818A114; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 0; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedY = 5; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintSlideAnim; + gBattlerControllerFuncs[gActiveBattler] = FreeMonSpriteAfterFaintAnim; } } } +#undef sSpeedX +#undef sSpeedY + static void RecordedPlayerHandlePaletteFade(void) { RecordedPlayerBufferExecCompleted(); @@ -1314,7 +1324,7 @@ static void RecordedPlayerHandlePause(void) static void RecordedPlayerHandleMoveAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u16 move = gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8); @@ -1356,7 +1366,7 @@ static void RecordedPlayerDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1365,7 +1375,7 @@ static void RecordedPlayerDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute && multihit < 2) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1425,7 +1435,7 @@ static void RecordedPlayerHandleChooseAction(void) } } -static void RecordedPlayerHandleUnknownYesNoBox(void) +static void RecordedPlayerHandleYesNoBox(void) { RecordedPlayerBufferExecCompleted(); } @@ -1495,7 +1505,7 @@ static void RecordedPlayerHandleExpUpdate(void) static void RecordedPlayerHandleStatusIconUpdate(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 battlerId; @@ -1508,7 +1518,7 @@ static void RecordedPlayerHandleStatusIconUpdate(void) static void RecordedPlayerHandleStatusAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { InitAndLaunchChosenStatusAnimation(gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8) | (gBattleBufferA[gActiveBattler][4] << 16) | (gBattleBufferA[gActiveBattler][5] << 24)); @@ -1561,27 +1571,27 @@ static void RecordedPlayerHandleOneReturnValue_Duplicate(void) RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleCmd37(void) +static void RecordedPlayerHandleClearUnkVar(void) { - gUnknown_02022D0C.field_0 = 0; + gUnusedControllerStruct.unk = 0; RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleCmd38(void) +static void RecordedPlayerHandleSetUnkVar(void) { - gUnknown_02022D0C.field_0 = gBattleBufferA[gActiveBattler][1]; + gUnusedControllerStruct.unk = gBattleBufferA[gActiveBattler][1]; RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleCmd39(void) +static void RecordedPlayerHandleClearUnkFlag(void) { - gUnknown_02022D0C.flag_x80 = 0; + gUnusedControllerStruct.flag = 0; RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleCmd40(void) +static void RecordedPlayerHandleToggleUnkFlag(void) { - gUnknown_02022D0C.flag_x80 ^= 1; + gUnusedControllerStruct.flag ^= 1; RecordedPlayerBufferExecCompleted(); } @@ -1600,7 +1610,7 @@ static void RecordedPlayerHandleHitAnimation(void) } } -static void RecordedPlayerHandleCmd42(void) +static void RecordedPlayerHandleCantSwitch(void) { RecordedPlayerBufferExecCompleted(); } @@ -1662,11 +1672,11 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F9); - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender; else trainerPicId = gSaveBlock2Ptr->playerGender; @@ -1675,17 +1685,17 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(sub_818CC24, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_120; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = RecordedPlayerDummy; } -static void sub_818CC24(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 24) { @@ -1699,19 +1709,19 @@ static void sub_818CC24(u8 taskId) if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_818BA6C(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); } else { gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_818BA6C(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_818BA6C(gActiveBattler, FALSE); + StartSendOutAnim(gActiveBattler, FALSE); gActiveBattler ^= BIT_FLANK; } - gBattlerControllerFuncs[gActiveBattler] = sub_8189D40; + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } @@ -1727,20 +1737,20 @@ static void RecordedPlayerHandleDrawPartyStatusSummary(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; if (gBattleBufferA[gActiveBattler][2] != 0) - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0x5D; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 93; - gBattlerControllerFuncs[gActiveBattler] = sub_818CDF4; + gBattlerControllerFuncs[gActiveBattler] = EndDrawPartyStatusSummary; } } -static void sub_818CDF4(void) +static void EndDrawPartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5++ > 0x5C) + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer++ > 92) { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_5 = 0; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusDelayTimer = 0; RecordedPlayerBufferExecCompleted(); } } @@ -1769,7 +1779,7 @@ static void RecordedPlayerHandleSpriteInvisibility(void) static void RecordedPlayerHandleBattleAnimation(void) { - if (!mplay_80342A4(gActiveBattler)) + if (!IsBattleSEPlaying(gActiveBattler)) { u8 animationId = gBattleBufferA[gActiveBattler][1]; u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); @@ -1791,13 +1801,13 @@ static void RecordedPlayerHandleResetActionMoveSelection(void) RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleCmd55(void) +static void RecordedPlayerHandleEndLinkBattle(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); RecordedPlayerBufferExecCompleted(); - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void RecordedPlayerCmdEnd(void) diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 9cb427e12..5d8b46ebd 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -44,7 +44,7 @@ static void SafariHandleMoveAnimation(void); static void SafariHandlePrintString(void); static void SafariHandlePrintSelectionString(void); static void SafariHandleChooseAction(void); -static void SafariHandleUnknownYesNoBox(void); +static void SafariHandleYesNoBox(void); static void SafariHandleChooseMove(void); static void SafariHandleChooseItem(void); static void SafariHandleChoosePokemon(void); @@ -62,12 +62,12 @@ static void SafariHandleTwoReturnValues(void); static void SafariHandleChosenMonReturnValue(void); static void SafariHandleOneReturnValue(void); static void SafariHandleOneReturnValue_Duplicate(void); -static void SafariHandleCmd37(void); -static void SafariHandleCmd38(void); -static void SafariHandleCmd39(void); -static void SafariHandleCmd40(void); +static void SafariHandleClearUnkVar(void); +static void SafariHandleSetUnkVar(void); +static void SafariHandleClearUnkFlag(void); +static void SafariHandleToggleUnkFlag(void); static void SafariHandleHitAnimation(void); -static void SafariHandleCmd42(void); +static void SafariHandleCantSwitch(void); static void SafariHandlePlaySE(void); static void SafariHandlePlayFanfareOrBGM(void); static void SafariHandleFaintingCry(void); @@ -80,7 +80,7 @@ static void SafariHandleSpriteInvisibility(void); static void SafariHandleBattleAnimation(void); static void SafariHandleLinkStandbyMsg(void); static void SafariHandleResetActionMoveSelection(void); -static void SafariHandleCmd55(void); +static void SafariHandleEndLinkBattle(void); static void SafariCmdEnd(void); static void SafariBufferRunCommand(void); @@ -89,63 +89,63 @@ static void CompleteWhenChosePokeblock(void); static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - SafariHandleGetMonData, - SafariHandleGetRawMonData, - SafariHandleSetMonData, - SafariHandleSetRawMonData, - SafariHandleLoadMonSprite, - SafariHandleSwitchInAnim, - SafariHandleReturnMonToBall, - SafariHandleDrawTrainerPic, - SafariHandleTrainerSlide, - SafariHandleTrainerSlideBack, - SafariHandleFaintAnimation, - SafariHandlePaletteFade, - SafariHandleSuccessBallThrowAnim, - SafariHandleBallThrowAnim, - SafariHandlePause, - SafariHandleMoveAnimation, - SafariHandlePrintString, - SafariHandlePrintSelectionString, - SafariHandleChooseAction, - SafariHandleUnknownYesNoBox, - SafariHandleChooseMove, - SafariHandleChooseItem, - SafariHandleChoosePokemon, - SafariHandleCmd23, - SafariHandleHealthBarUpdate, - SafariHandleExpUpdate, - SafariHandleStatusIconUpdate, - SafariHandleStatusAnimation, - SafariHandleStatusXor, - SafariHandleDataTransfer, - SafariHandleDMA3Transfer, - SafariHandlePlayBGM, - SafariHandleCmd32, - SafariHandleTwoReturnValues, - SafariHandleChosenMonReturnValue, - SafariHandleOneReturnValue, - SafariHandleOneReturnValue_Duplicate, - SafariHandleCmd37, - SafariHandleCmd38, - SafariHandleCmd39, - SafariHandleCmd40, - SafariHandleHitAnimation, - SafariHandleCmd42, - SafariHandlePlaySE, - SafariHandlePlayFanfareOrBGM, - SafariHandleFaintingCry, - SafariHandleIntroSlide, - SafariHandleIntroTrainerBallThrow, - SafariHandleDrawPartyStatusSummary, - SafariHandleHidePartyStatusSummary, - SafariHandleEndBounceEffect, - SafariHandleSpriteInvisibility, - SafariHandleBattleAnimation, - SafariHandleLinkStandbyMsg, - SafariHandleResetActionMoveSelection, - SafariHandleCmd55, - SafariCmdEnd + [CONTROLLER_GETMONDATA] = SafariHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = SafariHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = SafariHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = SafariHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = SafariHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = SafariHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = SafariHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = SafariHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = SafariHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = SafariHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = SafariHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = SafariHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = SafariHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim, + [CONTROLLER_PAUSE] = SafariHandlePause, + [CONTROLLER_MOVEANIMATION] = SafariHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = SafariHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = SafariHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = SafariHandleChooseAction, + [CONTROLLER_YESNOBOX] = SafariHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = SafariHandleChooseMove, + [CONTROLLER_OPENBAG] = SafariHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = SafariHandleChoosePokemon, + [CONTROLLER_23] = SafariHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = SafariHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = SafariHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = SafariHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = SafariHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = SafariHandleStatusXor, + [CONTROLLER_DATATRANSFER] = SafariHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = SafariHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = SafariHandlePlayBGM, + [CONTROLLER_32] = SafariHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = SafariHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = SafariHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = SafariHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = SafariHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = SafariHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = SafariHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = SafariHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = SafariHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = SafariHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = SafariHandleCantSwitch, + [CONTROLLER_PLAYSE] = SafariHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = SafariHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = SafariHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = SafariHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = SafariHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = SafariHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = SafariHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = SafariHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = SafariHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = SafariHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = SafariHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = SafariHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = SafariHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = SafariCmdEnd }; static void SpriteCB_Null4(void) @@ -251,7 +251,7 @@ static void CompleteOnHealthboxSpriteCallbackDummy(void) SafariBufferExecCompleted(); } -static void sub_81595E4(void) +static void SafariSetBattleEndCallbacks(void) { if (!gPaletteFade.active) { @@ -349,6 +349,8 @@ static void SafariHandleReturnMonToBall(void) SafariBufferExecCompleted(); } +#define sSpeedX data[0] + static void SafariHandleDrawTrainerPic(void) { DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBattler); @@ -359,12 +361,14 @@ static void SafariHandleDrawTrainerPic(void) (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].size) * 4 + 80, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } +#undef sSpeedX + static void SafariHandleTrainerSlide(void) { SafariBufferExecCompleted(); @@ -438,7 +442,7 @@ static void HandleChooseActionAfterDma3(void) if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; + gBattle_BG0_Y = DISPLAY_HEIGHT; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction; } } @@ -458,7 +462,7 @@ static void SafariHandleChooseAction(void) BattlePutTextOnWindow(gDisplayedStringBattle, 1); } -static void SafariHandleUnknownYesNoBox(void) +static void SafariHandleYesNoBox(void) { SafariBufferExecCompleted(); } @@ -470,9 +474,7 @@ static void SafariHandleChooseMove(void) static void SafariHandleChooseItem(void) { - s32 i; - - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase; gBattlerInMenuId = gActiveBattler; } @@ -553,22 +555,22 @@ static void SafariHandleOneReturnValue_Duplicate(void) SafariBufferExecCompleted(); } -static void SafariHandleCmd37(void) +static void SafariHandleClearUnkVar(void) { SafariBufferExecCompleted(); } -static void SafariHandleCmd38(void) +static void SafariHandleSetUnkVar(void) { SafariBufferExecCompleted(); } -static void SafariHandleCmd39(void) +static void SafariHandleClearUnkFlag(void) { SafariBufferExecCompleted(); } -static void SafariHandleCmd40(void) +static void SafariHandleToggleUnkFlag(void) { SafariBufferExecCompleted(); } @@ -578,7 +580,7 @@ static void SafariHandleHitAnimation(void) SafariBufferExecCompleted(); } -static void SafariHandleCmd42(void) +static void SafariHandleCantSwitch(void) { SafariBufferExecCompleted(); } @@ -629,7 +631,7 @@ static void SafariHandleIntroSlide(void) static void SafariHandleIntroTrainerBallThrow(void) { UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_ALL_TEXT); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthboxSpriteCallbackDummy; } @@ -675,14 +677,14 @@ static void SafariHandleResetActionMoveSelection(void) SafariBufferExecCompleted(); } -static void SafariHandleCmd55(void) +static void SafariHandleEndLinkBattle(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); BeginFastPaletteFade(3); SafariBufferExecCompleted(); if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) - gBattlerControllerFuncs[gActiveBattler] = sub_81595E4; + gBattlerControllerFuncs[gActiveBattler] = SafariSetBattleEndCallbacks; } static void SafariCmdEnd(void) diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index aa50bc159..b35ffa692 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -52,7 +52,7 @@ static void WallyHandleMoveAnimation(void); static void WallyHandlePrintString(void); static void WallyHandlePrintSelectionString(void); static void WallyHandleChooseAction(void); -static void WallyHandleUnknownYesNoBox(void); +static void WallyHandleYesNoBox(void); static void WallyHandleChooseMove(void); static void WallyHandleChooseItem(void); static void WallyHandleChoosePokemon(void); @@ -70,12 +70,12 @@ static void WallyHandleTwoReturnValues(void); static void WallyHandleChosenMonReturnValue(void); static void WallyHandleOneReturnValue(void); static void WallyHandleOneReturnValue_Duplicate(void); -static void WallyHandleCmd37(void); -static void WallyHandleCmd38(void); -static void WallyHandleCmd39(void); -static void WallyHandleCmd40(void); +static void WallyHandleClearUnkVar(void); +static void WallyHandleSetUnkVar(void); +static void WallyHandleClearUnkFlag(void); +static void WallyHandleToggleUnkFlag(void); static void WallyHandleHitAnimation(void); -static void WallyHandleCmd42(void); +static void WallyHandleCantSwitch(void); static void WallyHandlePlaySE(void); static void WallyHandlePlayFanfareOrBGM(void); static void WallyHandleFaintingCry(void); @@ -88,77 +88,77 @@ static void WallyHandleSpriteInvisibility(void); static void WallyHandleBattleAnimation(void); static void WallyHandleLinkStandbyMsg(void); static void WallyHandleResetActionMoveSelection(void); -static void WallyHandleCmd55(void); +static void WallyHandleEndLinkBattle(void); static void WallyCmdEnd(void); static void WallyBufferRunCommand(void); static void WallyBufferExecCompleted(void); static void CompleteOnChosenItem(void); -static void sub_8168818(void); +static void Intro_WaitForShinyAnimAndHealthbox(void); static u32 CopyWallyMonData(u8 monId, u8 *dst); static void SetWallyMonData(u8 monId); static void WallyDoMoveAnimation(void); -static void sub_816AC04(u8 taskId); +static void Task_StartSendOutAnim(u8 taskId); static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - WallyHandleGetMonData, - WallyHandleGetRawMonData, - WallyHandleSetMonData, - WallyHandleSetRawMonData, - WallyHandleLoadMonSprite, - WallyHandleSwitchInAnim, - WallyHandleReturnMonToBall, - WallyHandleDrawTrainerPic, - WallyHandleTrainerSlide, - WallyHandleTrainerSlideBack, - WallyHandleFaintAnimation, - WallyHandlePaletteFade, - WallyHandleSuccessBallThrowAnim, - WallyHandleBallThrowAnim, - WallyHandlePause, - WallyHandleMoveAnimation, - WallyHandlePrintString, - WallyHandlePrintSelectionString, - WallyHandleChooseAction, - WallyHandleUnknownYesNoBox, - WallyHandleChooseMove, - WallyHandleChooseItem, - WallyHandleChoosePokemon, - WallyHandleCmd23, - WallyHandleHealthBarUpdate, - WallyHandleExpUpdate, - WallyHandleStatusIconUpdate, - WallyHandleStatusAnimation, - WallyHandleStatusXor, - WallyHandleDataTransfer, - WallyHandleDMA3Transfer, - WallyHandlePlayBGM, - WallyHandleCmd32, - WallyHandleTwoReturnValues, - WallyHandleChosenMonReturnValue, - WallyHandleOneReturnValue, - WallyHandleOneReturnValue_Duplicate, - WallyHandleCmd37, - WallyHandleCmd38, - WallyHandleCmd39, - WallyHandleCmd40, - WallyHandleHitAnimation, - WallyHandleCmd42, - WallyHandlePlaySE, - WallyHandlePlayFanfareOrBGM, - WallyHandleFaintingCry, - WallyHandleIntroSlide, - WallyHandleIntroTrainerBallThrow, - WallyHandleDrawPartyStatusSummary, - WallyHandleHidePartyStatusSummary, - WallyHandleEndBounceEffect, - WallyHandleSpriteInvisibility, - WallyHandleBattleAnimation, - WallyHandleLinkStandbyMsg, - WallyHandleResetActionMoveSelection, - WallyHandleCmd55, - WallyCmdEnd + [CONTROLLER_GETMONDATA] = WallyHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = WallyHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = WallyHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = WallyHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = WallyHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = WallyHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = WallyHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = WallyHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = WallyHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = WallyHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = WallyHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = WallyHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = WallyHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = WallyHandleBallThrowAnim, + [CONTROLLER_PAUSE] = WallyHandlePause, + [CONTROLLER_MOVEANIMATION] = WallyHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = WallyHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = WallyHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = WallyHandleChooseAction, + [CONTROLLER_YESNOBOX] = WallyHandleYesNoBox, + [CONTROLLER_CHOOSEMOVE] = WallyHandleChooseMove, + [CONTROLLER_OPENBAG] = WallyHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = WallyHandleChoosePokemon, + [CONTROLLER_23] = WallyHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = WallyHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = WallyHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = WallyHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = WallyHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = WallyHandleStatusXor, + [CONTROLLER_DATATRANSFER] = WallyHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = WallyHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = WallyHandlePlayBGM, + [CONTROLLER_32] = WallyHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = WallyHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = WallyHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = WallyHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = WallyHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = WallyHandleClearUnkVar, + [CONTROLLER_SETUNKVAR] = WallyHandleSetUnkVar, + [CONTROLLER_CLEARUNKFLAG] = WallyHandleClearUnkFlag, + [CONTROLLER_TOGGLEUNKFLAG] = WallyHandleToggleUnkFlag, + [CONTROLLER_HITANIMATION] = WallyHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = WallyHandleCantSwitch, + [CONTROLLER_PLAYSE] = WallyHandlePlaySE, + [CONTROLLER_PLAYFANFAREORBGM] = WallyHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = WallyHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = WallyHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = WallyHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = WallyHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = WallyHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = WallyHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = WallyHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = WallyHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = WallyHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = WallyHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = WallyHandleEndLinkBattle, + [CONTROLLER_TERMINATOR_NOP] = WallyCmdEnd }; static void SpriteCB_Null7(void) @@ -190,7 +190,7 @@ static void WallyHandleActions(void) switch (gBattleStruct->wallyBattleState) { case 0: - gBattleStruct->wallyWaitFrames = 64; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; gBattleStruct->wallyBattleState++; case 1: if (--gBattleStruct->wallyWaitFrames == 0) @@ -200,7 +200,7 @@ static void WallyHandleActions(void) WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = 64; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; } break; case 2: @@ -211,17 +211,17 @@ static void WallyHandleActions(void) WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = 64; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; } break; case 3: if (--gBattleStruct->wallyWaitFrames == 0) { - BtlController_EmitTwoReturnValues(1, 9, 0); + BtlController_EmitTwoReturnValues(1, B_ACTION_WALLY_THROW, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; - gBattleStruct->wallyWaitFrames = 64; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; } break; case 4: @@ -230,7 +230,7 @@ static void WallyHandleActions(void) PlaySE(SE_SELECT); ActionSelectionDestroyCursorAt(0); ActionSelectionCreateCursorAt(1, 0); - gBattleStruct->wallyWaitFrames = 64; + gBattleStruct->wallyWaitFrames = B_WAIT_TIME_LONG; gBattleStruct->wallyBattleState++; } break; @@ -268,7 +268,7 @@ static void OpenBagAfterPaletteFade(void) if (!gPaletteFade.active) { gBattlerControllerFuncs[gActiveBattler] = CompleteOnChosenItem; - nullsub_35(); + ReshowBattleScreenDummy(); FreeAllWindowBuffers(); DoWallyTutorialBagMenu(); } @@ -283,7 +283,7 @@ static void CompleteOnChosenItem(void) } } -static void sub_816864C(void) +static void Intro_TryShinyAnimShowHealthbox(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive) @@ -295,35 +295,35 @@ static void sub_816864C(void) if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive && !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].ballAnimActive - && gSprites[gUnknown_03005D7C[gActiveBattler]].callback == SpriteCallbackDummy + && gSprites[gBattleControllerData[gActiveBattler]].callback == SpriteCallbackDummy && gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) { if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler ^ BIT_FLANK]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler ^ BIT_FLANK]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler ^ BIT_FLANK]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler ^ BIT_FLANK); + StartHealthboxSlideIn(gActiveBattler ^ BIT_FLANK); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler ^ BIT_FLANK]); } - DestroySprite(&gSprites[gUnknown_03005D7C[gActiveBattler]]); + DestroySprite(&gSprites[gBattleControllerData[gActiveBattler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_ALL); - sub_8076918(gActiveBattler); + StartHealthboxSlideIn(gActiveBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); - gBattleSpritesDataPtr->animationData->field_9_x1 = 0; - gBattlerControllerFuncs[gActiveBattler] = sub_8168818; + gBattleSpritesDataPtr->animationData->introAnimActive = FALSE; + gBattlerControllerFuncs[gActiveBattler] = Intro_WaitForShinyAnimAndHealthbox; } } -static void sub_8168818(void) +static void Intro_WaitForShinyAnimAndHealthbox(void) { - bool32 r4 = FALSE; + bool32 healthboxAnimDone = FALSE; if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) - r4 = TRUE; + healthboxAnimDone = TRUE; - if (r4 && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim + if (healthboxAnimDone && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].finishedShinyMonAnim && gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].triedShinyMonAnim = FALSE; @@ -332,10 +332,10 @@ static void sub_8168818(void) gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].triedShinyMonAnim = FALSE; gBattleSpritesDataPtr->healthBoxesData[gActiveBattler ^ BIT_FLANK].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(0x27F9); - FreeSpritePaletteByTag(0x27F9); + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - CreateTask(c3_0802FDF4, 10); + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); WallyBufferExecCompleted(); @@ -378,7 +378,7 @@ static void DoHitAnimBlinkSpriteEffect(void) } } -static void sub_8168A20(void) +static void DoSwitchOutAnimation(void) { if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { @@ -1019,7 +1019,7 @@ static void WallyHandleReturnMonToBall(void) if (gBattleBufferA[gActiveBattler][1] == 0) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_SWITCH_OUT_PLAYER_MON); - gBattlerControllerFuncs[gActiveBattler] = sub_8168A20; + gBattlerControllerFuncs[gActiveBattler] = DoSwitchOutAnimation; } else { @@ -1030,6 +1030,8 @@ static void WallyHandleReturnMonToBall(void) } } +#define sSpeedX data[0] + static void WallyHandleDrawTrainerPic(void) { DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); @@ -1039,9 +1041,9 @@ static void WallyHandleDrawTrainerPic(void) 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].size), 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; - gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = DISPLAY_WIDTH; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = -2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } @@ -1055,11 +1057,13 @@ static void WallyHandleTrainerSlide(void) 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -96; - gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = 2; - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; + gSprites[gBattlerSpriteIds[gActiveBattler]].sSpeedX = 2; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; } +#undef sSpeedX + static void WallyHandleTrainerSlideBack(void) { WallyBufferExecCompleted(); @@ -1137,7 +1141,7 @@ static void WallyDoMoveAnimation(void) case 1: if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive) { - sub_805EB9C(ST_OAM_AFFINE_OFF); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_OFF); DoMoveAnim(move); gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 2; } @@ -1146,7 +1150,7 @@ static void WallyDoMoveAnimation(void) gAnimScriptCallback(); if (!gAnimScriptActive) { - sub_805EB9C(ST_OAM_AFFINE_NORMAL); + SetBattlerSpriteAffineMode(ST_OAM_AFFINE_NORMAL); if (gBattleSpritesDataPtr->battlerData[gActiveBattler].behindSubstitute) { InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, gActiveBattler, B_ANIM_MON_TO_SUBSTITUTE); @@ -1191,7 +1195,7 @@ static void HandleChooseActionAfterDma3(void) if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; + gBattle_BG0_Y = DISPLAY_HEIGHT; gBattlerControllerFuncs[gActiveBattler] = WallyHandleActions; } } @@ -1211,7 +1215,7 @@ static void WallyHandleChooseAction(void) BattlePutTextOnWindow(gDisplayedStringBattle, 1); } -static void WallyHandleUnknownYesNoBox(void) +static void WallyHandleYesNoBox(void) { WallyBufferExecCompleted(); } @@ -1229,7 +1233,7 @@ static void WallyHandleChooseMove(void) if (!IsDma3ManagerBusyWithBgCopy()) { gBattle_BG0_X = 0; - gBattle_BG0_Y = 0x140; + gBattle_BG0_Y = DISPLAY_HEIGHT * 2; gBattleStruct->wallyMovesState++; } break; @@ -1246,7 +1250,7 @@ static void WallyHandleChooseMove(void) static void WallyHandleChooseItem(void) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattlerControllerFuncs[gActiveBattler] = OpenBagAfterPaletteFade; gBattlerInMenuId = gActiveBattler; } @@ -1346,22 +1350,22 @@ static void WallyHandleOneReturnValue_Duplicate(void) WallyBufferExecCompleted(); } -static void WallyHandleCmd37(void) +static void WallyHandleClearUnkVar(void) { WallyBufferExecCompleted(); } -static void WallyHandleCmd38(void) +static void WallyHandleSetUnkVar(void) { WallyBufferExecCompleted(); } -static void WallyHandleCmd39(void) +static void WallyHandleClearUnkFlag(void) { WallyBufferExecCompleted(); } -static void WallyHandleCmd40(void) +static void WallyHandleToggleUnkFlag(void) { WallyBufferExecCompleted(); } @@ -1381,7 +1385,7 @@ static void WallyHandleHitAnimation(void) } } -static void WallyHandleCmd42(void) +static void WallyHandleCantSwitch(void) { WallyBufferExecCompleted(); } @@ -1435,39 +1439,39 @@ static void WallyHandleIntroTrainerBallThrow(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBattlerSpriteIds[gActiveBattler]].data[5] = gActiveBattler; - StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], sub_805CC00); + StoreSpriteCallbackInData6(&gSprites[gBattlerSpriteIds[gActiveBattler]], SpriteCB_FreePlayerSpriteLoadMonSprite); StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F8); LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_WALLY].data, 0x100 + paletteNum * 16, 32); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; - taskId = CreateTask(sub_816AC04, 5); + taskId = CreateTask(Task_StartSendOutAnim, 5); gTasks[taskId].data[0] = gActiveBattler; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; - gBattleSpritesDataPtr->animationData->field_9_x1 = 1; - gBattlerControllerFuncs[gActiveBattler] = nullsub_21; + gBattleSpritesDataPtr->animationData->introAnimActive = TRUE; + gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } -static void sub_816AA80(u8 battlerId) +static void StartSendOutAnim(u8 battlerId) { u16 species; gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = 0; gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); + gBattleControllerData[battlerId] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), GetBattlerSpriteSubpriority(battlerId)); - gSprites[gUnknown_03005D7C[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gUnknown_03005D7C[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; + gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; @@ -1476,10 +1480,10 @@ static void sub_816AA80(u8 battlerId) StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; - gSprites[gUnknown_03005D7C[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } -static void sub_816AC04(u8 taskId) +static void Task_StartSendOutAnim(u8 taskId) { if (gTasks[taskId].data[1] < 31) { @@ -1491,8 +1495,8 @@ static void sub_816AC04(u8 taskId) gActiveBattler = gTasks[taskId].data[0]; gBattleBufferA[gActiveBattler][1] = gBattlerPartyIndexes[gActiveBattler]; - sub_816AA80(gActiveBattler); - gBattlerControllerFuncs[gActiveBattler] = sub_816864C; + StartSendOutAnim(gActiveBattler); + gBattlerControllerFuncs[gActiveBattler] = Intro_TryShinyAnimShowHealthbox; gActiveBattler = savedActiveBank; DestroyTask(taskId); } @@ -1548,7 +1552,7 @@ static void WallyHandleResetActionMoveSelection(void) WallyBufferExecCompleted(); } -static void WallyHandleCmd55(void) +static void WallyHandleEndLinkBattle(void) { gBattleOutcome = gBattleBufferA[gActiveBattler][1]; FadeOutMapMusic(5); @@ -1556,7 +1560,7 @@ static void WallyHandleCmd55(void) WallyBufferExecCompleted(); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) && gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattlerControllerFuncs[gActiveBattler] = sub_80587B0; + gBattlerControllerFuncs[gActiveBattler] = SetBattleEndCallbacks; } static void WallyCmdEnd(void) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 3ebc5d3bd..0f3234579 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -16,11 +16,10 @@ static EWRAM_DATA u8 sLinkSendTaskId = 0; static EWRAM_DATA u8 sLinkReceiveTaskId = 0; -static EWRAM_DATA u8 sUnknown_02022D0A = 0; -EWRAM_DATA struct UnusedControllerStruct gUnknown_02022D0C = {}; +static EWRAM_DATA u8 sUnused = 0; // Debug? Never read +EWRAM_DATA struct UnusedControllerStruct gUnusedControllerStruct = {}; // Debug? Unused code that writes to it, never read static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {}; -// this file's funcionts static void CreateTasksForSendRecvLinkBuffers(void); static void InitLinkBtlControllers(void); static void InitSinglePlayerBtlControllers(void); @@ -45,11 +44,11 @@ void SetUpBattleVarsAndBirchZigzagoon(void) { s32 i; - gBattleMainFunc = nullsub_20; + gBattleMainFunc = BeginBattleIntroDummy; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - gBattlerControllerFuncs[i] = nullsub_21; + gBattlerControllerFuncs[i] = BattleControllerDummy; gBattlerPositions[i] = 0xFF; gActionSelectionCursor[i] = 0; gMoveSelectionCursor[i] = 0; @@ -64,23 +63,24 @@ void SetUpBattleVarsAndBirchZigzagoon(void) if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, OT_ID_PLAYER_ID, 0); + CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, USE_RANDOM_IVS, 0, 0, OT_ID_PLAYER_ID, 0); i = 0; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i); } - gUnknown_02022FF4 = 0; - gUnknown_0202428C = 0; + // Below are never read + gUnusedFirstBattleVar1 = 0; + gUnusedFirstBattleVar2 = 0; } -void sub_8032768(void) +void InitBattleControllers(void) { s32 i; if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - sub_8184DA4(1); + RecordedBattle_Init(B_RECORD_MODE_RECORDING); else - sub_8184DA4(2); + RecordedBattle_Init(B_RECORD_MODE_PLAYBACK); if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) RecordedBattle_SaveParties(); @@ -174,9 +174,9 @@ static void InitSinglePlayerBtlControllers(void) if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) { gBattleMainFunc = BeginBattleIntro; @@ -259,9 +259,9 @@ static void InitSinglePlayerBtlControllers(void) } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - u8 var; // multiplayer Id in a recorded battle? + u8 multiplayerId; - for (var = gUnknown_0203C7B4, i = 0; i < MAX_BATTLERS_COUNT; i++) + for (multiplayerId = gRecordedBattleMultiplayerId, i = 0; i < MAX_BATTLERS_COUNT; i++) { switch (gLinkPlayers[i].id) { @@ -275,7 +275,7 @@ static void InitSinglePlayerBtlControllers(void) break; } - if (i == var) + if (i == multiplayerId) { gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; switch (gLinkPlayers[i].id) @@ -292,8 +292,8 @@ static void InitSinglePlayerBtlControllers(void) break; } } - else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[var].id & 1)) - || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[var].id & 1))) + else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) + || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) { gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; switch (gLinkPlayers[i].id) @@ -337,7 +337,7 @@ static void InitSinglePlayerBtlControllers(void) gBattlerControllerFuncs[2] = SetControllerToRecordedPlayer; gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { gBattlerControllerFuncs[1] = SetControllerToRecordedOpponent; gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; @@ -362,7 +362,7 @@ static void InitSinglePlayerBtlControllers(void) gBattlerControllerFuncs[3] = SetControllerToRecordedPlayer; gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT; - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { gBattlerControllerFuncs[0] = SetControllerToRecordedOpponent; gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; @@ -693,7 +693,7 @@ static void CreateTasksForSendRecvLinkBuffers(void) gTasks[sLinkReceiveTaskId].data[14] = 0; gTasks[sLinkReceiveTaskId].data[15] = 0; - sUnknown_02022D0A = 0; + sUnused = 0; } enum @@ -819,13 +819,13 @@ static void Task_HandleSendLinkBuffersData(u8 taskId) } } -void sub_8033648(void) +void TryReceiveLinkBattleData(void) { u8 i; s32 j; u8 *recvBuffer; - if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_20)) + if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE)) { DestroyTask_RfuIdle(); for (i = 0; i < GetLinkPlayerCount(); i++) @@ -836,9 +836,9 @@ void sub_8033648(void) recvBuffer = (u8 *)gBlockRecvBuffer[i]; { u8 *dest, *src; - u16 r6 = gBlockRecvBuffer[i][2]; + u16 dataSize = gBlockRecvBuffer[i][2]; - if (gTasks[sLinkReceiveTaskId].data[14] + 9 + r6 > 0x1000) + if (gTasks[sLinkReceiveTaskId].data[14] + 9 + dataSize > 0x1000) { gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14]; gTasks[sLinkReceiveTaskId].data[14] = 0; @@ -847,10 +847,10 @@ void sub_8033648(void) dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].data[14]]; src = recvBuffer; - for (j = 0; j < r6 + 8; j++) + for (j = 0; j < dataSize + 8; j++) dest[j] = src[j]; - gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + r6 + 8; + gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + dataSize + 8; } } } @@ -881,7 +881,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) return; memcpy(gBattleBufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); - sub_803F850(battlerId); + MarkBattlerReceivedLinkData(battlerId); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { @@ -1143,12 +1143,14 @@ void BtlController_EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitUnknownYesNoBox(u8 bufferId) +// Only used by the forfeit prompt in the Battle Frontier +// For other Yes/No boxes in battle, see Cmd_yesnobox +void BtlController_EmitYesNoBox(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_UNKNOWNYESNOBOX; - sBattleBuffersTransferData[1] = CONTROLLER_UNKNOWNYESNOBOX; - sBattleBuffersTransferData[2] = CONTROLLER_UNKNOWNYESNOBOX; - sBattleBuffersTransferData[3] = CONTROLLER_UNKNOWNYESNOBOX; + sBattleBuffersTransferData[0] = CONTROLLER_YESNOBOX; + sBattleBuffersTransferData[1] = CONTROLLER_YESNOBOX; + sBattleBuffersTransferData[2] = CONTROLLER_YESNOBOX; + sBattleBuffersTransferData[3] = CONTROLLER_YESNOBOX; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } @@ -1282,7 +1284,7 @@ void BtlController_EmitPlayBGM(u8 bufferId, u16 songId, void *unusedDumbDataPara { s32 i; - sBattleBuffersTransferData[0] = CONTROLLER_31; + sBattleBuffersTransferData[0] = CONTROLLER_PLAYBGM; sBattleBuffersTransferData[1] = songId; sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; for (i = 0; i < songId; i++) // ???? @@ -1340,37 +1342,37 @@ void BtlController_EmitOneReturnValue_Duplicate(u8 bufferId, u16 b) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitCmd37(u8 bufferId) +void BtlController_EmitClearUnkVar(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_37; - sBattleBuffersTransferData[1] = CONTROLLER_37; - sBattleBuffersTransferData[2] = CONTROLLER_37; - sBattleBuffersTransferData[3] = CONTROLLER_37; + sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKVAR; + sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKVAR; + sBattleBuffersTransferData[2] = CONTROLLER_CLEARUNKVAR; + sBattleBuffersTransferData[3] = CONTROLLER_CLEARUNKVAR; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitCmd38(u8 bufferId, u8 b) +void BtlController_EmitSetUnkVar(u8 bufferId, u8 b) { - sBattleBuffersTransferData[0] = CONTROLLER_38; + sBattleBuffersTransferData[0] = CONTROLLER_SETUNKVAR; sBattleBuffersTransferData[1] = b; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } -void BtlController_EmitCmd39(u8 bufferId) +void BtlController_EmitClearUnkFlag(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_39; - sBattleBuffersTransferData[1] = CONTROLLER_39; - sBattleBuffersTransferData[2] = CONTROLLER_39; - sBattleBuffersTransferData[3] = CONTROLLER_39; + sBattleBuffersTransferData[0] = CONTROLLER_CLEARUNKFLAG; + sBattleBuffersTransferData[1] = CONTROLLER_CLEARUNKFLAG; + sBattleBuffersTransferData[2] = CONTROLLER_CLEARUNKFLAG; + sBattleBuffersTransferData[3] = CONTROLLER_CLEARUNKFLAG; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitCmd40(u8 bufferId) +void BtlController_EmitToggleUnkFlag(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_40; - sBattleBuffersTransferData[1] = CONTROLLER_40; - sBattleBuffersTransferData[2] = CONTROLLER_40; - sBattleBuffersTransferData[3] = CONTROLLER_40; + sBattleBuffersTransferData[0] = CONTROLLER_TOGGLEUNKFLAG; + sBattleBuffersTransferData[1] = CONTROLLER_TOGGLEUNKFLAG; + sBattleBuffersTransferData[2] = CONTROLLER_TOGGLEUNKFLAG; + sBattleBuffersTransferData[3] = CONTROLLER_TOGGLEUNKFLAG; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } @@ -1383,18 +1385,18 @@ void BtlController_EmitHitAnimation(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitCmd42(u8 bufferId) +void BtlController_EmitCantSwitch(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_42; - sBattleBuffersTransferData[1] = CONTROLLER_42; - sBattleBuffersTransferData[2] = CONTROLLER_42; - sBattleBuffersTransferData[3] = CONTROLLER_42; + sBattleBuffersTransferData[0] = CONTROLLER_CANTSWITCH; + sBattleBuffersTransferData[1] = CONTROLLER_CANTSWITCH; + sBattleBuffersTransferData[2] = CONTROLLER_CANTSWITCH; + sBattleBuffersTransferData[3] = CONTROLLER_CANTSWITCH; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } void BtlController_EmitPlaySE(u8 bufferId, u16 songId) { - sBattleBuffersTransferData[0] = CONTROLLER_EFFECTIVENESSSOUND; + sBattleBuffersTransferData[0] = CONTROLLER_PLAYSE; sBattleBuffersTransferData[1] = songId; sBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; sBattleBuffersTransferData[3] = 0; @@ -1435,13 +1437,13 @@ void BtlController_EmitIntroTrainerBallThrow(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 arg2) +void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 flags) { s32 i; sBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; - sBattleBuffersTransferData[1] = arg2 & 0x7F; - sBattleBuffersTransferData[2] = (arg2 & 0x80) >> 7; + sBattleBuffersTransferData[1] = flags & 0x7F; + sBattleBuffersTransferData[2] = (flags & 0x80) >> 7; // If true, skip delay after drawing. True during intro sBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * PARTY_SIZE); i++) sBattleBuffersTransferData[4 + i] = *(i + (u8*)(hpAndStatus)); @@ -1484,14 +1486,14 @@ void BtlController_EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 arg2) +void BtlController_EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 record) { - bool8 arg2_ = arg2; + bool8 record_ = record; sBattleBuffersTransferData[0] = CONTROLLER_LINKSTANDBYMSG; sBattleBuffersTransferData[1] = arg1; - if (arg2_) - sBattleBuffersTransferData[3] = sBattleBuffersTransferData[2] = sub_81850DC(&sBattleBuffersTransferData[4]); + if (record_) + sBattleBuffersTransferData[3] = sBattleBuffersTransferData[2] = RecordedBattle_BufferNewBattlerData(&sBattleBuffersTransferData[4]); else sBattleBuffersTransferData[3] = sBattleBuffersTransferData[2] = 0; @@ -1505,12 +1507,12 @@ void BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } -void BtlController_EmitCmd55(u8 bufferId, u8 battleOutcome) +void BtlController_EmitEndLinkBattle(u8 bufferId, u8 battleOutcome) { - sBattleBuffersTransferData[0] = CONTROLLER_55; + sBattleBuffersTransferData[0] = CONTROLLER_ENDLINKBATTLE; sBattleBuffersTransferData[1] = battleOutcome; sBattleBuffersTransferData[2] = gSaveBlock2Ptr->frontier.disableRecordBattle; sBattleBuffersTransferData[3] = gSaveBlock2Ptr->frontier.disableRecordBattle; - sBattleBuffersTransferData[5] = sBattleBuffersTransferData[4] = sub_81850DC(&sBattleBuffersTransferData[6]); + sBattleBuffersTransferData[5] = sBattleBuffersTransferData[4] = RecordedBattle_BufferNewBattlerData(&sBattleBuffersTransferData[6]); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sBattleBuffersTransferData[4] + 6); } diff --git a/src/battle_dome.c b/src/battle_dome.c index 0d1bee8cf..59e418a06 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2766,13 +2766,22 @@ static int GetTypeEffectivenessPoints(int move, int targetSpecies, int arg2) } if (TYPE_EFFECT_ATK_TYPE(i) == moveType) { - // BUG: TYPE_x2 is not necessary and makes the condition always false if the ability is wonder guard. + // BUG: the value of TYPE_x2 does not exist in gTypeEffectiveness, so if defAbility is ABILITY_WONDER_GUARD, the conditional always fails + #ifndef BUGFIX if (TYPE_EFFECT_DEF_TYPE(i) == defType1) if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_x2) || defAbility != ABILITY_WONDER_GUARD) typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10; if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_x2) || defAbility != ABILITY_WONDER_GUARD) typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10; + #else + if (TYPE_EFFECT_DEF_TYPE(i) == defType1) + if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) || defAbility != ABILITY_WONDER_GUARD) + typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10; + if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) + if ((defAbility == ABILITY_WONDER_GUARD && TYPE_EFFECT_MULTIPLIER(i) == TYPE_MUL_SUPER_EFFECTIVE) || defAbility != ABILITY_WONDER_GUARD) + typePower = (typePower * TYPE_EFFECT_MULTIPLIER(i)) / 10; + #endif } i += 3; } @@ -2875,7 +2884,7 @@ static u8 GetDomeTrainerMonIvs(u16 trainerId) else if (trainerId <= FRONTIER_TRAINER_TESS) // 200 - 219 fixedIv = 21; else // 220+ (- 299) - fixedIv = 31; + fixedIv = MAX_PER_STAT_IVS; return fixedIv; } @@ -2998,7 +3007,7 @@ static void Task_ShowTourneyInfoCard(u8 taskId) if (mode == INFOCARD_MATCH) gBattle_BG2_X = 0, gBattle_BG2_Y = 0; else - gBattle_BG2_X = 0, gBattle_BG2_Y = 160; + gBattle_BG2_X = 0, gBattle_BG2_Y = DISPLAY_HEIGHT; gTasks[taskId].tState++; break; @@ -3040,7 +3049,7 @@ static void Task_ShowTourneyInfoCard(u8 taskId) SetVBlankCallback(VblankCb_TourneyInfoCard); sInfoCard = AllocZeroed(sizeof(*sInfoCard)); for (i = 0; i < NUM_INFOCARD_SPRITES; i++) - sInfoCard->spriteIds[i] = 0xFF; + sInfoCard->spriteIds[i] = SPRITE_NONE; LoadMonIconPalettes(); i = CreateTask(Task_HandleInfoCardInput, 0); gTasks[i].data[0] = 0; @@ -3105,7 +3114,7 @@ static void SpriteCb_TrainerIconCardScrollUp(struct Sprite *sprite) { if (sprite->pos1.y >= 192) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyTrainerPicSprite(sprite->data[3]); } } @@ -3125,7 +3134,7 @@ static void SpriteCb_TrainerIconCardScrollDown(struct Sprite *sprite) { if (sprite->pos1.y <= -32) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyTrainerPicSprite(sprite->data[3]); } } @@ -3143,9 +3152,9 @@ static void SpriteCb_TrainerIconCardScrollLeft(struct Sprite *sprite) } else { - if (sprite->pos1.x >= 272) + if (sprite->pos1.x >= DISPLAY_WIDTH + 32) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyTrainerPicSprite(sprite->data[3]); } } @@ -3156,7 +3165,7 @@ static void SpriteCb_TrainerIconCardScrollRight(struct Sprite *sprite) sprite->pos1.x -= 4; if (sprite->data[0] != 0) { - if (sprite->pos1.x <= 272) + if (sprite->pos1.x <= DISPLAY_WIDTH + 32) sprite->invisible = FALSE; if (++sprite->data[1] == 64) sprite->callback = SpriteCallbackDummy; @@ -3165,7 +3174,7 @@ static void SpriteCb_TrainerIconCardScrollRight(struct Sprite *sprite) { if (sprite->pos1.x <= -32) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyTrainerPicSprite(sprite->data[3]); } } @@ -3195,7 +3204,7 @@ static void SpriteCb_MonIconCardScrollUp(struct Sprite *sprite) { if (sprite->pos1.y >= 176) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyMonIconSprite(sprite); } } @@ -3217,7 +3226,7 @@ static void SpriteCb_MonIconCardScrollDown(struct Sprite *sprite) { if (sprite->pos1.y <= -16) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyMonIconSprite(sprite); } } @@ -3237,9 +3246,9 @@ static void SpriteCb_MonIconCardScrollLeft(struct Sprite *sprite) } else { - if (sprite->pos1.x >= 256) + if (sprite->pos1.x >= DISPLAY_WIDTH + 16) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyMonIconSprite(sprite); } } @@ -3252,7 +3261,7 @@ static void SpriteCb_MonIconCardScrollRight(struct Sprite *sprite) sprite->pos1.x -= 4; if (sprite->data[0] != 0) { - if (sprite->pos1.x <= 256) + if (sprite->pos1.x <= DISPLAY_WIDTH + 16) sprite->invisible = FALSE; if (++sprite->data[1] == 64) sprite->callback = SpriteCb_MonIcon; @@ -3261,7 +3270,7 @@ static void SpriteCb_MonIconCardScrollRight(struct Sprite *sprite) { if (sprite->pos1.x <= -16) { - sInfoCard->spriteIds[sprite->data[2]] = 0xFF; + sInfoCard->spriteIds[sprite->data[2]] = SPRITE_NONE; FreeAndDestroyMonIconSprite(sprite); } } @@ -3393,7 +3402,7 @@ static void Task_HandleInfoCardInput(u8 taskId) case STATE_FADE_IN: if (!gPaletteFade.active) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gTasks[taskId].tState = STATE_WAIT_FADE; } break; @@ -3406,7 +3415,7 @@ static void Task_HandleInfoCardInput(u8 taskId) switch (i) { case INFOCARD_INPUT_AB: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState = STATE_CLOSE_CARD; break; case TRAINERCARD_INPUT_UP ... TRAINERCARD_INPUT_RIGHT: @@ -3439,12 +3448,12 @@ static void Task_HandleInfoCardInput(u8 taskId) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; - gBattle_BG1_Y = 160; + gBattle_BG1_Y = DISPLAY_HEIGHT; } else { gBattle_BG0_X = 0; - gBattle_BG0_Y = 160; + gBattle_BG0_Y = DISPLAY_HEIGHT; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; } @@ -3454,13 +3463,13 @@ static void Task_HandleInfoCardInput(u8 taskId) if (sInfoCard->pos == 0) { gBattle_BG2_X = 0; - gBattle_BG2_Y = 320; + gBattle_BG2_Y = DISPLAY_HEIGHT * 2; trainerTourneyId = sTourneyTreeTrainerIds[gTasks[taskId2].data[1]]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_UP, trainerTourneyId); } else { - gBattle_BG2_X = 256; + gBattle_BG2_X = DISPLAY_WIDTH + 16; gBattle_BG2_Y = 0; trainerTourneyId = sTourneyTreeTrainerIds[gTasks[taskId2].data[1]]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_UP, trainerTourneyId); @@ -3474,7 +3483,7 @@ static void Task_HandleInfoCardInput(u8 taskId) matchNo = gTasks[taskId2].data[1] - 16; BufferDomeWinString(matchNo, sInfoCard->tournamentIds); gBattle_BG2_X = 0; - gBattle_BG2_Y = 320; + gBattle_BG2_Y = DISPLAY_HEIGHT * 2; trainerTourneyId = sInfoCard->tournamentIds[0]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_UP, trainerTourneyId); } @@ -3483,14 +3492,14 @@ static void Task_HandleInfoCardInput(u8 taskId) matchNo = gTasks[taskId2].data[1] - 16; BufferDomeWinString(matchNo, sInfoCard->tournamentIds); gBattle_BG2_X = 0; - gBattle_BG2_Y = 320; + gBattle_BG2_Y = DISPLAY_HEIGHT * 2; trainerTourneyId = sInfoCard->tournamentIds[1]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_UP, trainerTourneyId); } else { - gBattle_BG2_X = 256; - gBattle_BG2_Y = 160; + gBattle_BG2_X = DISPLAY_WIDTH + 16; + gBattle_BG2_Y = DISPLAY_HEIGHT; matchNo = gTasks[taskId2].data[1] - 16; DisplayMatchInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_UP, matchNo); } @@ -3500,7 +3509,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollUp; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3511,7 +3520,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollUp; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3524,7 +3533,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollUp; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3535,7 +3544,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollUp; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3555,12 +3564,12 @@ static void Task_HandleInfoCardInput(u8 taskId) gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; - gBattle_BG1_Y = -160; + gBattle_BG1_Y = -DISPLAY_HEIGHT; } else { gBattle_BG0_X = 0; - gBattle_BG0_Y = -160; + gBattle_BG0_Y = -DISPLAY_HEIGHT; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; } @@ -3570,7 +3579,7 @@ static void Task_HandleInfoCardInput(u8 taskId) if (sInfoCard->pos == 0) { gBattle_BG2_X = 0; - gBattle_BG2_Y = 160; + gBattle_BG2_Y = DISPLAY_HEIGHT; trainerTourneyId = sTourneyTreeTrainerIds[gTasks[taskId2].data[1]]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_DOWN, trainerTourneyId); } @@ -3590,7 +3599,7 @@ static void Task_HandleInfoCardInput(u8 taskId) matchNo = gTasks[taskId2].data[1] - 16; BufferDomeWinString(matchNo, sInfoCard->tournamentIds); gBattle_BG2_X = 0; - gBattle_BG2_Y = 160; + gBattle_BG2_Y = DISPLAY_HEIGHT; trainerTourneyId = sInfoCard->tournamentIds[0]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_DOWN, trainerTourneyId); } @@ -3599,13 +3608,13 @@ static void Task_HandleInfoCardInput(u8 taskId) matchNo = gTasks[taskId2].data[1] - 16; BufferDomeWinString(matchNo, sInfoCard->tournamentIds); gBattle_BG2_X = 0; - gBattle_BG2_Y = 160; + gBattle_BG2_Y = DISPLAY_HEIGHT; trainerTourneyId = sInfoCard->tournamentIds[1]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_DOWN, trainerTourneyId); } else { - gBattle_BG2_X = 256; + gBattle_BG2_X = DISPLAY_WIDTH + 16; gBattle_BG2_Y = 0; matchNo = gTasks[taskId2].data[1] - 16; DisplayMatchInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_DOWN, matchNo); @@ -3616,7 +3625,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollDown; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3627,7 +3636,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollDown; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3640,7 +3649,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollDown; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3651,7 +3660,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollDown; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3669,12 +3678,12 @@ static void Task_HandleInfoCardInput(u8 taskId) { gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gBattle_BG1_X = 256; + gBattle_BG1_X = DISPLAY_WIDTH + 16; gBattle_BG1_Y = 0; } else { - gBattle_BG0_X = 256; + gBattle_BG0_X = DISPLAY_WIDTH + 16; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; @@ -3682,14 +3691,14 @@ static void Task_HandleInfoCardInput(u8 taskId) if (sInfoCard->pos == 0) { - gBattle_BG2_X = 256; - gBattle_BG2_Y = 160; + gBattle_BG2_X = DISPLAY_WIDTH + 16; + gBattle_BG2_Y = DISPLAY_HEIGHT; trainerTourneyId = sTourneyTreeTrainerIds[gTasks[taskId2].data[1]]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_LEFT, trainerTourneyId); } else { - gBattle_BG2_X = 256; + gBattle_BG2_X = DISPLAY_WIDTH + 16; gBattle_BG2_Y = 0; matchNo = sIdToMatchNumber[gTasks[taskId2].data[1]][sInfoCard->pos - 1]; DisplayMatchInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_LEFT, matchNo); @@ -3699,7 +3708,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3710,7 +3719,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3723,7 +3732,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3734,7 +3743,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3752,12 +3761,12 @@ static void Task_HandleInfoCardInput(u8 taskId) { gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gBattle_BG1_X = 256; + gBattle_BG1_X = DISPLAY_WIDTH + 16; gBattle_BG1_Y = 0; } else { - gBattle_BG0_X = 256; + gBattle_BG0_X = DISPLAY_WIDTH + 16; gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; @@ -3765,15 +3774,15 @@ static void Task_HandleInfoCardInput(u8 taskId) if (sInfoCard->pos == 0) { - gBattle_BG2_X = 256; - gBattle_BG2_Y = 160; + gBattle_BG2_X = DISPLAY_WIDTH + 16; + gBattle_BG2_Y = DISPLAY_HEIGHT; trainerTourneyId = sInfoCard->tournamentIds[0]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_LEFT, trainerTourneyId); } else { gBattle_BG2_X = 0; - gBattle_BG2_Y = 160; + gBattle_BG2_Y = DISPLAY_HEIGHT; matchNo = gTasks[taskId2].data[1] - 16; DisplayMatchInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_LEFT, matchNo); } @@ -3782,7 +3791,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3793,7 +3802,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3806,7 +3815,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3817,7 +3826,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollLeft; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3835,12 +3844,12 @@ static void Task_HandleInfoCardInput(u8 taskId) { gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gBattle_BG1_X = -256; + gBattle_BG1_X = -(DISPLAY_WIDTH + 16); gBattle_BG1_Y = 0; } else { - gBattle_BG0_X = -256; + gBattle_BG0_X = -(DISPLAY_WIDTH + 16); gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; @@ -3849,7 +3858,7 @@ static void Task_HandleInfoCardInput(u8 taskId) if (sInfoCard->pos == 1) { gBattle_BG2_X = 0; - gBattle_BG2_Y = 160; + gBattle_BG2_Y = DISPLAY_HEIGHT; } else { @@ -3863,7 +3872,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3874,7 +3883,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3887,7 +3896,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3898,7 +3907,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3916,12 +3925,12 @@ static void Task_HandleInfoCardInput(u8 taskId) { gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gBattle_BG1_X = -256; + gBattle_BG1_X = -(DISPLAY_WIDTH + 16); gBattle_BG1_Y = 0; } else { - gBattle_BG0_X = -256; + gBattle_BG0_X = -(DISPLAY_WIDTH + 16); gBattle_BG0_Y = 0; gBattle_BG1_X = 0; gBattle_BG1_Y = 0; @@ -3929,15 +3938,15 @@ static void Task_HandleInfoCardInput(u8 taskId) if (sInfoCard->pos == 2) { - gBattle_BG2_X = 256; - gBattle_BG2_Y = 160; + gBattle_BG2_X = DISPLAY_WIDTH + 16; + gBattle_BG2_Y = DISPLAY_HEIGHT; trainerTourneyId = sInfoCard->tournamentIds[1]; DisplayTrainerInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_RIGHT, trainerTourneyId); } else { gBattle_BG2_X = 0; - gBattle_BG2_Y = 160; + gBattle_BG2_Y = DISPLAY_HEIGHT; matchNo = gTasks[taskId2].data[1] - 16; DisplayMatchInfoOnCard(gTasks[taskId].tUsingAlternateSlot | MOVE_CARD_RIGHT, matchNo); } @@ -3946,7 +3955,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3957,7 +3966,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot ^ 1; @@ -3970,7 +3979,7 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_TrainerIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -3981,7 +3990,7 @@ static void Task_HandleInfoCardInput(u8 taskId) } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) { gSprites[sInfoCard->spriteIds[i]].callback = SpriteCb_MonIconCardScrollRight; gSprites[sInfoCard->spriteIds[i]].data[0] = gTasks[taskId].tUsingAlternateSlot; @@ -4051,12 +4060,12 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 2) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) FreeAndDestroyTrainerPicSprite(sInfoCard->spriteIds[i]); } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) FreeAndDestroyMonIconSprite(&gSprites[sInfoCard->spriteIds[i]]); } } @@ -4064,12 +4073,12 @@ static void Task_HandleInfoCardInput(u8 taskId) { if (i < 10) { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) FreeAndDestroyTrainerPicSprite(sInfoCard->spriteIds[i]); } else { - if (sInfoCard->spriteIds[i] != 0xFF) + if (sInfoCard->spriteIds[i] != SPRITE_NONE) FreeAndDestroyMonIconSprite(&gSprites[sInfoCard->spriteIds[i]]); } } @@ -4248,13 +4257,13 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) if (flags & CARD_ALTERNATE_SLOT) arrId = 2 * (FRONTIER_PARTY_SIZE + 1), windowId = 9, palSlot = 2; if (flags & MOVE_CARD_RIGHT) - x = 256; + x = DISPLAY_WIDTH + 16; if (flags & MOVE_CARD_DOWN) - y = 160; + y = DISPLAY_HEIGHT; if (flags & MOVE_CARD_LEFT) - x = -256; + x = -(DISPLAY_WIDTH + 16); if (flags & MOVE_CARD_UP) - y = -160; + y = -DISPLAY_HEIGHT; // Create trainer pic sprite if (trainerId == TRAINER_PLAYER) @@ -4709,13 +4718,13 @@ static void DisplayMatchInfoOnCard(u8 flags, u8 matchNo) if (flags & CARD_ALTERNATE_SLOT) arrId = 2 * (FRONTIER_PARTY_SIZE + 1), windowId = 9, palSlot = 2; if (flags & MOVE_CARD_RIGHT) - x = 256; + x = DISPLAY_WIDTH + 16; if (flags & MOVE_CARD_DOWN) - y = 160; + y = DISPLAY_HEIGHT; if (flags & MOVE_CARD_LEFT) - x = -256; + x = -(DISPLAY_WIDTH + 16); if (flags & MOVE_CARD_UP) - y = -160; + y = -DISPLAY_HEIGHT; // Copy trainers information to handy arrays. winStringId = BufferDomeWinString(matchNo, sInfoCard->tournamentIds); @@ -4946,7 +4955,7 @@ static void Task_HandleTourneyTreeInput(u8 taskId) case STATE_FADE_IN: if (!gPaletteFade.active) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gTasks[taskId].tState = STATE_WAIT_FADE; StartSpriteAnim(&gSprites[spriteId], 1); } @@ -4960,17 +4969,17 @@ static void Task_HandleTourneyTreeInput(u8 taskId) { case TOURNEY_TREE_SELECTED_CLOSE: default: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState = STATE_CLOSE_TOURNEY_TREE; break; case TOURNEY_TREE_NO_SELECTION: break; case TOURNEY_TREE_SELECTED_TRAINER: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState = STATE_SHOW_INFOCARD_TRAINER; break; case TOURNEY_TREE_SELECTED_MATCH: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState = STATE_SHOW_INFOCARD_MATCH; break; } @@ -5211,40 +5220,38 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun } j = bestId; - goto LABEL; - while (j != 0) + do { - for (j = 0, k = 0; k < MAX_MON_MOVES * FRONTIER_PARTY_SIZE; k++) + for (i = 0; i < roundId - 1; i++) { - if (bestScore < moveScores[k]) - { - j = k; - bestScore = moveScores[k]; - } - else if (bestScore == moveScores[k] && moveIds[j] < moveIds[k]) - { - j = k; - } + if (gSaveBlock2Ptr->frontier.domeWinningMoves[sub_81953E8(winnerTournamentId, i)] == moveIds[j]) + break; } - if (i == roundId - 1) - break; - LABEL: + if (i != roundId - 1) { - for (i = 0; i < roundId - 1; i++) - { - if (gSaveBlock2Ptr->frontier.domeWinningMoves[sub_81953E8(winnerTournamentId, i)] == moveIds[j]) - break; - } - if (i == roundId - 1) - break; - moveScores[j] = 0; bestScore = 0; j = 0; for (k = 0; k < MAX_MON_MOVES * FRONTIER_PARTY_SIZE; k++) j += moveScores[k]; + if (j == 0) + break; + j = 0; + for (k = 0; k < MAX_MON_MOVES * FRONTIER_PARTY_SIZE; k++) + { + if (bestScore < moveScores[k]) + { + j = k; + bestScore = moveScores[k]; + } + else if (bestScore == moveScores[k] && moveIds[j] < moveIds[k]) // Yes, these conditions are redundant + { + j = k; + bestScore = moveScores[k]; + } + } } - } + } while (i != roundId - 1); if (moveScores[j] == 0) j = bestId; @@ -5285,10 +5292,10 @@ static void Task_ShowTourneyTree(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0x5860); - SetGpuReg(REG_OFFSET_WIN0V, 0x9F); - SetGpuReg(REG_OFFSET_WIN1H, 0x9098); - SetGpuReg(REG_OFFSET_WIN1V, 0x9F); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(88, 96)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT - 1)); + SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(144, 152)); + SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, DISPLAY_HEIGHT - 1)); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); ResetPaletteFade(); @@ -5397,7 +5404,7 @@ static void Task_ShowTourneyTree(u8 taskId) { if (DOME_TRAINERS[i].trainerId == TRAINER_PLAYER) { - textPrinter.fgColor = TEXT_COLOR_LIGHT_GREY; + textPrinter.fgColor = TEXT_COLOR_LIGHT_GRAY; textPrinter.shadowColor = TEXT_COLOR_RED; } else @@ -5410,7 +5417,7 @@ static void Task_ShowTourneyTree(u8 taskId) { if (DOME_TRAINERS[i].trainerId == TRAINER_PLAYER) { - textPrinter.fgColor = TEXT_COLOR_LIGHT_GREY; + textPrinter.fgColor = TEXT_COLOR_LIGHT_GRAY; textPrinter.shadowColor = TEXT_COLOR_RED; } else @@ -5509,7 +5516,7 @@ static void Task_HandleStaticTourneyTreeInput(u8 taskId) switch (gTasks[taskId].tState) { case STATE_FADE_IN: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gTasks[taskId].tState = STATE_SHOW_RESULTS; break; case STATE_SHOW_RESULTS: @@ -5559,7 +5566,7 @@ static void Task_HandleStaticTourneyTreeInput(u8 taskId) case STATE_WAIT_FOR_INPUT: if (JOY_NEW(A_BUTTON | B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState = STATE_CLOSE_TOURNEY_TREE; } break; @@ -5774,6 +5781,8 @@ static void InitRandomTourneyTreeResults(void) int monTypesBits; int trainerId; int monId; + int zero1; + int zero2; u8 lvlMode; u16 *statSums; int *statValues; @@ -5789,12 +5798,11 @@ static void InitRandomTourneyTreeResults(void) statValues = AllocZeroed(sizeof(int) * NUM_STATS); lvlMode = gSaveBlock2Ptr->frontier.lvlMode; gSaveBlock2Ptr->frontier.lvlMode = FRONTIER_LVL_50; - // This one, I'd like to call a 'C fakematching'. - { - u8 one; - gSaveBlock2Ptr->frontier.domeLvlMode = (one = 1); - gSaveBlock2Ptr->frontier.domeBattleMode = one; - } + zero1 = 0; + zero2 = 0; + + gSaveBlock2Ptr->frontier.domeLvlMode = zero1 + 1; + gSaveBlock2Ptr->frontier.domeBattleMode = zero2 + 1; for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++) { diff --git a/src/battle_factory.c b/src/battle_factory.c index a2b1d337a..72772929a 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -25,8 +25,8 @@ static void InitFactoryChallenge(void); static void GetBattleFactoryData(void); static void SetBattleFactoryData(void); static void SaveFactoryChallenge(void); -static void nullsub_75(void); -static void nullsub_123(void); +static void FactoryDummy1(void); +static void FactoryDummy2(void); static void SelectInitialRentalMons(void); static void SwapRentalMons(void); static void SetPerformedRentalSwap(void); @@ -41,8 +41,16 @@ static void RestorePlayerPartyHeldItems(void); static u16 GetFactoryMonId(u8 lvlMode, u8 challengeNum, bool8 arg2); static u8 GetMoveBattleStyle(u16 move); -// Const rom data. -static const u8 sRequiredMoveCounts[] = {3, 3, 3, 2, 2, 2, 2}; +// Number of moves needed on the team to be considered using a certain battle style +static const u8 sRequiredMoveCounts[FACTORY_NUM_STYLES - 1] = { + [FACTORY_STYLE_PREPARATION - 1] = 3, + [FACTORY_STYLE_SLOW_STEADY - 1] = 3, + [FACTORY_STYLE_ENDURANCE - 1] = 3, + [FACTORY_STYLE_HIGH_RISK - 1] = 2, + [FACTORY_STYLE_WEAKENING - 1] = 2, + [FACTORY_STYLE_UNPREDICTABLE - 1] = 2, + [FACTORY_STYLE_WEATHER - 1] = 2 +}; static const u16 sMoves_TotalPreparation[] = { @@ -119,8 +127,8 @@ static void (* const sBattleFactoryFunctions[])(void) = [BATTLE_FACTORY_FUNC_GET_DATA] = GetBattleFactoryData, [BATTLE_FACTORY_FUNC_SET_DATA] = SetBattleFactoryData, [BATTLE_FACTORY_FUNC_SAVE] = SaveFactoryChallenge, - [BATTLE_FACTORY_FUNC_NULL] = nullsub_75, - [BATTLE_FACTORY_FUNC_NULL2] = nullsub_123, + [BATTLE_FACTORY_FUNC_NULL] = FactoryDummy1, + [BATTLE_FACTORY_FUNC_NULL2] = FactoryDummy2, [BATTLE_FACTORY_FUNC_SELECT_RENT_MONS] = SelectInitialRentalMons, [BATTLE_FACTORY_FUNC_SWAP_RENT_MONS] = SwapRentalMons, [BATTLE_FACTORY_FUNC_SET_SWAPPED] = SetPerformedRentalSwap, @@ -266,12 +274,12 @@ static void SaveFactoryChallenge(void) SaveGameFrontier(); } -static void nullsub_75(void) +static void FactoryDummy1(void) { } -static void nullsub_123(void) +static void FactoryDummy2(void) { } @@ -376,10 +384,10 @@ static void SetRentalsToOpponentParty(void) for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { - gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId = gFrontierTempParty[i]; - gSaveBlock2Ptr->frontier.rentalMons[i + 3].ivs = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ATK_IV, NULL); - gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality = GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY, NULL); - gSaveBlock2Ptr->frontier.rentalMons[i + 3].abilityNum = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ABILITY_NUM, NULL); + gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].monId = gFrontierTempParty[i]; + gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].ivs = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ATK_IV, NULL); + gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].personality = GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY, NULL); + gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].abilityNum = GetBoxMonData(&gEnemyParty[i].box, MON_DATA_ABILITY_NUM, NULL); SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[gFrontierTempParty[i]].itemTableId]); } } @@ -455,13 +463,13 @@ static void SetPlayerAndOpponentParties(void) case 2: for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { - monId = gSaveBlock2Ptr->frontier.rentalMons[i + 3].monId; - ivs = gSaveBlock2Ptr->frontier.rentalMons[i + 3].ivs; + monId = gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].monId; + ivs = gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].ivs; CreateMon(&gEnemyParty[i], gFacilityTrainerMons[monId].species, monLevel, ivs, - TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality, + TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].personality, OT_ID_PLAYER_ID, 0); count = 0; @@ -484,7 +492,7 @@ static void SetPlayerAndOpponentParties(void) for (k = 0; k < MAX_MON_MOVES; k++) SetMonMoveAvoidReturn(&gEnemyParty[i], gFacilityTrainerMons[monId].moves[k], k); SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]); - SetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM, &gSaveBlock2Ptr->frontier.rentalMons[i + 3].abilityNum); + SetMonData(&gEnemyParty[i], MON_DATA_ABILITY_NUM, &gSaveBlock2Ptr->frontier.rentalMons[i + FRONTIER_PARTY_SIZE].abilityNum); } break; } @@ -584,39 +592,58 @@ static void GenerateInitialRentalMons(void) } } +// Determines if the upcoming opponent has a single most-common +// type in its party. If there are two different types that are +// tied, then the opponent is deemed to have no preferred type, +// and NUMBER_OF_MON_TYPES is the result. static void GetOpponentMostCommonMonType(void) { u8 i; - u8 typesCount[NUMBER_OF_MON_TYPES]; - u8 usedType[2]; + u8 typeCounts[NUMBER_OF_MON_TYPES]; + u8 mostCommonTypes[2]; gFacilityTrainerMons = gBattleFrontierMons; - for (i = 0; i < NUMBER_OF_MON_TYPES; i++) - typesCount[i] = 0; + + // Count the number of times each type occurs in the opponent's party. + for (i = TYPE_NORMAL; i < NUMBER_OF_MON_TYPES; i++) + typeCounts[i] = 0; for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { u32 species = gFacilityTrainerMons[gFrontierTempParty[i]].species; - - typesCount[gBaseStats[species].type1]++; + typeCounts[gBaseStats[species].type1]++; if (gBaseStats[species].type1 != gBaseStats[species].type2) - typesCount[gBaseStats[species].type2]++; + typeCounts[gBaseStats[species].type2]++; } - usedType[0] = 0; - usedType[1] = 0; - for (i = 1; i < NUMBER_OF_MON_TYPES; i++) + // Determine which are the two most-common types. + // The second most-common type is only updated if + // its count is equal to the most-common type. + mostCommonTypes[0] = TYPE_NORMAL; + mostCommonTypes[1] = TYPE_NORMAL; + for (i = TYPE_FIGHTING; i < NUMBER_OF_MON_TYPES; i++) { - if (typesCount[usedType[0]] < typesCount[i]) - usedType[0] = i; - else if (typesCount[usedType[0]] == typesCount[i]) - usedType[1] = i; + if (typeCounts[mostCommonTypes[0]] < typeCounts[i]) + mostCommonTypes[0] = i; + else if (typeCounts[mostCommonTypes[0]] == typeCounts[i]) + mostCommonTypes[1] = i; } - gSpecialVar_Result = gSpecialVar_Result; // Needed to match. Don't ask me why. - if (typesCount[usedType[0]] != 0 && (typesCount[usedType[0]] > typesCount[usedType[1]] || usedType[0] == usedType[1])) - gSpecialVar_Result = usedType[0]; + if (typeCounts[mostCommonTypes[0]] != 0) + { + // The most-common type must be strictly greater than + // the second-most-common type, or the top two must be + // the same type. + if (typeCounts[mostCommonTypes[0]] > typeCounts[mostCommonTypes[1]]) + gSpecialVar_Result = mostCommonTypes[0]; + else if (mostCommonTypes[0] == mostCommonTypes[1]) + gSpecialVar_Result = mostCommonTypes[0]; + else + gSpecialVar_Result = NUMBER_OF_MON_TYPES; + } else + { gSpecialVar_Result = NUMBER_OF_MON_TYPES; + } } static void GetOpponentBattleStyle(void) @@ -639,7 +666,7 @@ static void GetOpponentBattleStyle(void) } } - gSpecialVar_Result = 0; + gSpecialVar_Result = FACTORY_STYLE_NONE; for (i = 1; i < FACTORY_NUM_STYLES; i++) { if (stylePoints[i] >= sRequiredMoveCounts[i - 1]) diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index ba1e39006..db810e965 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -25,52 +25,77 @@ #include "util.h" #include "trainer_pokemon_sprites.h" #include "starter_choose.h" +#include "strings.h" +#include "graphics.h" #include "constants/battle_frontier.h" #include "constants/songs.h" #include "constants/rgb.h" -// Select_ refers to the first Pokemon selection screen where you choose 3 Pokemon. -// Swap_ refers to the consecutive selection screen where you can keep your Pokemon or swap one with beaten trainer's. +// Select_ refers to the first Pokemon selection screen where you choose your initial 3 rental Pokemon. +// Swap_ refers to the subsequent selection screens where you can swap a Pokemon with one from the beaten trainer -#define MENU_SUMMARY 0 -#define MENU_RENT 1 -#define MENU_DESELECT 1 -#define MENU_OTHERS 2 -#define MENU_OPTIONS_COUNT 3 +// Note that, generally, "Action" will refer to the immediate actions that can be taken on each screen, +// i.e. selecting a pokemon or selecting the Cancel button +// The "Options menu" will refer to the popup menu that shows when some actions have been selected + +#define SWAP_PLAYER_SCREEN 0 // The screen where the player selects which of their pokemon to swap away +#define SWAP_ENEMY_SCREEN 1 // The screen where the player selects which new pokemon from the defeated party to swap for #define SELECTABLE_MONS_COUNT 6 -#define TAG_PAL_BALL_GREY 0x64 -#define TAG_PAL_BALL_SELECTED 0x65 -#define TAG_PAL_66 0x66 -#define TAG_PAL_67 0x67 +enum { + PALTAG_BALL_GRAY = 100, + PALTAG_BALL_SELECTED, + PALTAG_INTERFACE, + PALTAG_MON_PIC_BG, +}; + +enum { + GFXTAG_BALL = 100, + GFXTAG_ARROW, + GFXTAG_MENU_HIGHLIGHT_LEFT, + GFXTAG_MENU_HIGHLIGHT_RIGHT, + GFXTAG_ACTION_BOX_LEFT, + GFXTAG_ACTION_BOX_RIGHT, + GFXTAG_ACTION_HIGHLIGHT_LEFT, + GFXTAG_ACTION_HIGHLIGHT_MIDDLE, + GFXTAG_ACTION_HIGHLIGHT_RIGHT, + GFXTAG_MON_PIC_BG_ANIM, +}; + +// Tasks in this file universally use data[0] as a state for switches +#define tState data[0] -#define TAG_TILE_64 0x64 -#define TAG_TILE_65 0x65 -#define TAG_TILE_66 0x66 -#define TAG_TILE_67 0x67 -#define TAG_TILE_68 0x68 -#define TAG_TILE_69 0x69 -#define TAG_TILE_6A 0x6A -#define TAG_TILE_6B 0x6B -#define TAG_TILE_6C 0x6C -#define TAG_TILE_6D 0x6D +// States for both Select/Swap versions of Task_FadeSpeciesName +enum { + FADESTATE_INIT, + FADESTATE_RUN, + FADESTATE_DELAY +}; + +// Return states for the Select Actions +enum { + SELECT_SUMMARY, + SELECT_CONTINUE_CHOOSING, + SELECT_CONFIRM_MONS, + SELECT_INVALID_MON, +}; -struct FactorySelecteableMon +struct FactorySelectableMon { u16 monId; - u16 spriteId; + u16 ballSpriteId; u8 selectedId; // 0 - not selected, 1 - first pokemon, 2 - second pokemon, 3 - third pokemon struct Pokemon monData; }; -struct UnkFactoryStruct +struct FactoryMonPic { - u8 field0; - u8 field1; + u8 monSpriteId; + u8 bgSpriteId; }; -struct FactorySelectMonsStruct +struct FactorySelectScreen { u8 menuCursorPos; u8 menuCursor1SpriteId; @@ -80,206 +105,201 @@ struct FactorySelectMonsStruct u8 selectingMonsState; bool8 fromSummaryScreen; u8 yesNoCursorPos; - u8 unused8; - struct FactorySelecteableMon mons[SELECTABLE_MONS_COUNT]; - struct UnkFactoryStruct unk294[3]; - bool8 unk2A0; + u8 unused; + struct FactorySelectableMon mons[SELECTABLE_MONS_COUNT]; + struct FactoryMonPic monPics[FRONTIER_PARTY_SIZE]; // Array so all chosen mons can be shown at once + bool8 monPicAnimating; u8 fadeSpeciesNameTaskId; - bool8 unk2A2; - u16 unk2A4; - bool8 unk2A6; - u8 unk2A7; - u8 unk2A8; - u8 unk2A9; + bool8 fadeSpeciesNameActive; + u16 speciesNameColorBackup; + bool8 fadeSpeciesNameFadeOut; + u8 fadeSpeciesNameCoeffDelay; + u8 fadeSpeciesNameCoeff; + u8 faceSpeciesNameDelay; }; -// 'Action' refers to the 3 Selectable mons, Cancel, Pknm for swap windows. -#define ACTIONS_PLAYER_SCREEN 0 -#define ACTIONS_ENEMY_SCREEN 1 - -struct SwapActionIdAndFunc +struct SwapScreenAction { u8 id; void (*func)(u8 taskId); }; -struct FactorySwapMonsStruct +struct FactorySwapScreen { u8 menuCursorPos; u8 menuCursor1SpriteId; u8 menuCursor2SpriteId; u8 cursorPos; u8 cursorSpriteId; - u8 ballSpriteIds[3]; - u8 unk8[2][3]; - u8 unkE[2][2]; + u8 ballSpriteIds[FRONTIER_PARTY_SIZE]; + u8 pkmnForSwapButtonSpriteIds[2][3]; // For this and sprite ID array below, [0][i] is the button background, [1][i] is the button highlight + u8 cancelButtonSpriteIds[2][2]; u8 playerMonId; u8 enemyMonId; bool8 inEnemyScreen; bool8 fromSummaryScreen; u8 yesNoCursorPos; u8 actionsCount; - const struct SwapActionIdAndFunc *actionsData; - u8 unused1C[4]; + const struct SwapScreenAction *actionsData; + u8 unused[4]; bool8 monSwapped; u8 fadeSpeciesNameTaskId; - bool8 unk22; - u16 unk24; - bool8 unk26; - u8 unk27; - u8 unk28; - u8 unk29; - struct UnkFactoryStruct unk2C; - bool8 unk30; + bool8 fadeSpeciesNameActive; + u16 speciesNameColorBackup; + bool8 fadeSpeciesNameFadeOut; + u8 fadeSpeciesNameCoeffDelay; + u8 fadeSpeciesNameCoeff; + u8 faceSpeciesNameDelay; + struct FactoryMonPic monPic; + bool8 monPicAnimating; }; -// This file's functions. -static void sub_819A44C(struct Sprite *sprite); +static void SpriteCB_Pokeball(struct Sprite *); +static void SpriteCB_OpenMonPic(struct Sprite *); +static void OpenMonPic(u8 *, bool8 *, bool8); +static void HideMonPic(struct FactoryMonPic, bool8 *); +static void CloseMonPic(struct FactoryMonPic, bool8 *, bool8); +static void Task_OpenMonPic(u8); +static void Task_CloseMonPic(u8); + +// Select screen static void CB2_InitSelectScreen(void); -static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V); +static void Select_SetWinRegs(s16, s16, s16, s16); static void Select_InitMonsData(void); static void Select_InitAllSprites(void); -static void Select_ShowSummaryMonSprite(void); +static void Select_ReshowMonSprite(void); static void Select_PrintSelectMonString(void); static void Select_PrintMonSpecies(void); static void Select_PrintMonCategory(void); static void Select_PrintRentalPkmnString(void); static void Select_CopyMonsToPlayerParty(void); -static void sub_819C4B4(void); +static void Select_ShowChosenMons(void); static void Select_ShowYesNoOptions(void); -static void sub_819C568(void); +static void Select_HideChosenMons(void); static void Select_ShowMenuOptions(void); static void Select_PrintMenuOptions(void); static void Select_PrintYesNoOptions(void); -static void Task_SelectFadeSpeciesName(u8 taskId); -static void sub_819C1D0(u8 taskId); -static void Task_HandleSelectionScreenChooseMons(u8 taskId); -static void Task_HandleSelectionScreenMenu(u8 taskId); -static void CreateFrontierFactorySelectableMons(u8 firstMonId); -static void CreateTentFactorySelectableMons(u8 firstMonId); -static void Select_SetBallSpritePaletteNum(u8 id); -static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1); -static void sub_819B958(u8 windowId); -static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen); -static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen); +static void Select_Task_FadeSpeciesName(u8); +static void Select_Task_OpenChosenMonPics(u8); +static void Select_Task_HandleChooseMons(u8); +static void Select_Task_HandleMenu(u8); +static void CreateFrontierFactorySelectableMons(u8); +static void CreateSlateportTentSelectableMons(u8); +static void Select_SetBallSpritePaletteNum(u8); +static void Select_ErasePopupMenu(u8); static u8 Select_RunMenuOptionFunc(void); -static u8 sub_819BC9C(void); +static u8 Select_DeclineChosenMons(void); static u8 Select_OptionSummary(void); static u8 Select_OptionOthers(void); static u8 Select_OptionRentDeselect(void); -static bool32 Select_AreSpeciesValid(u16 monId); +static bool32 Select_AreSpeciesValid(u16); + +// Swap screen +static void CB2_InitSwapScreen(void); static void Swap_DestroyAllSprites(void); static void Swap_ShowYesNoOptions(void); -static void sub_819E8EC(void); -static void sub_819EAC0(void); -static void Swap_UpdateYesNoCursorPosition(s8 direction); -static void Swap_UpdateMenuCursorPosition(s8 direction); -static void sub_819EA64(u8 windowId); -static void sub_819D770(u8 taskId); -static void Task_HandleSwapScreenChooseMons(u8 taskId); -static void sub_819D588(u8 taskId); -static void sub_819F7B4(u8 taskId); -static void Swap_PrintOnInfoWindow(const u8 *str); +static void Swap_HideActionButtonHighlights(void); +static void Swap_EraseSpeciesWindow(void); +static void Swap_UpdateYesNoCursorPosition(s8); +static void Swap_UpdateMenuCursorPosition(s8); +static void Swap_ErasePopupMenu(u8); +static void Swap_Task_ScreenInfoTransitionIn(u8); +static void Swap_Task_HandleChooseMons(u8); +static void Swap_Task_ScreenInfoTransitionOut(u8); +static void Swap_PrintOnInfoWindow(const u8 *); static void Swap_ShowMenuOptions(void); static void Swap_PrintMenuOptions(void); static void Swap_PrintYesNoOptions(void); static void Swap_PrintMonSpecies(void); -static void Swap_PrintMonSpecies2(void); -static void Swap_PrintMonSpecies3(void); +static void Swap_PrintMonSpeciesAtFade(void); +static void Swap_PrintMonSpeciesForTransition(void); static void Swap_PrintMonCategory(void); static void Swap_InitAllSprites(void); static void Swap_PrintPkmnSwap(void); -static void sub_819EADC(void); -static void sub_819EAF8(void); -static void CB2_InitSwapScreen(void); +static void Swap_EraseSpeciesAtFadeWindow(void); +static void Swap_EraseActionFadeWindow(void); static void Swap_ShowSummaryMonSprite(void); -static void Swap_UpdateActionCursorPosition(s8 direction); -static void Swap_UpdateBallCursorPosition(s8 direction); -static void Swap_RunMenuOptionFunc(u8 taskId); -static void sub_819F0CC(u8 taskId); -static void sub_819F114(u8 taskId); -static void sub_819F134(u8 taskId); -static void Swap_RunActionFunc(u8 taskId); -static void sub_819F69C(u8 taskId); -static void Task_SwapCantHaveSameMons(u8 taskId); -static void Swap_ShowMonSprite(void); +static void Swap_UpdateActionCursorPosition(s8); +static void Swap_UpdateBallCursorPosition(s8); +static void Swap_RunMenuOptionFunc(u8); +static void Swap_OptionSwap(u8); +static void Swap_OptionSummary(u8); +static void Swap_OptionRechoose(u8); +static void Swap_RunActionFunc(u8); +static void Swap_TaskCantHaveSameMons(u8); +static void Swap_CreateMonSprite(void); static void Swap_PrintActionStrings(void); static void Swap_PrintActionStrings2(void); -static void Swap_PrintOneActionString(u8 which); -static void Swap_InitActions(u8 id); -static void sub_819E838(u8 arg0); -static bool8 Swap_AlreadyHasSameSpecies(u8 monId); -static void sub_819F600(struct Sprite *sprite); -static void Swap_ActionMon(u8 taskId); -static void Swap_ActionCancel(u8 taskId); -static void Swap_ActionPkmnForSwap(u8 taskId); - -// Ewram variables +static void Swap_PrintOneActionString(u8); +static void Swap_InitActions(u8); +static void Swap_HighlightActionButton(u8); +static bool8 Swap_AlreadyHasSameSpecies(u8); +static void Swap_ActionMon(u8); +static void Swap_ActionCancel(u8); +static void Swap_ActionPkmnForSwap(u8); + static EWRAM_DATA u8 *sSelectMenuTilesetBuffer = NULL; -static EWRAM_DATA u8 *sSelectMonCardBgTilesetBuffer = NULL; +static EWRAM_DATA u8 *sSelectMonPicBgTilesetBuffer = NULL; static EWRAM_DATA u8 *sSelectMenuTilemapBuffer = NULL; -static EWRAM_DATA u8 *sSelectMonCardBgTilemapBuffer = NULL; +static EWRAM_DATA u8 *sSelectMonPicBgTilemapBuffer = NULL; static EWRAM_DATA struct Pokemon *sFactorySelectMons = NULL; static EWRAM_DATA u8 *sSwapMenuTilesetBuffer = NULL; -static EWRAM_DATA u8 *sSwapMonCardBgTilesetBuffer = NULL; +static EWRAM_DATA u8 *sSwapMonPicBgTilesetBuffer = NULL; static EWRAM_DATA u8 *sSwapMenuTilemapBuffer = NULL; -static EWRAM_DATA u8 *sSwapMonCardBgTilemapBuffer = NULL; - -// IWRAM bss -static struct FactorySelectMonsStruct *sFactorySelectScreen; -static void (*sSwap_CurrentTableFunc)(u8 taskId); -static struct FactorySwapMonsStruct *sFactorySwapScreen; - -// IWRAM common -u8 (*gUnknown_030062E8)(void); - -// Const rom data. -static const u16 gUnknown_0860F13C[] = INCBIN_U16("graphics/unknown/unknown_60F13C.gbapal"); -static const u16 gUnknown_0860F15C[] = INCBIN_U16("graphics/unknown/unknown_60F15C.gbapal"); -static const u16 gUnknown_0860F17C[] = INCBIN_U16("graphics/unknown/unknown_60F17C.gbapal"); -static const u8 gUnknown_0860F1BC[] = INCBIN_U8("graphics/unknown/unknown_60F1BC.4bpp"); -static const u8 gUnknown_0860F3BC[] = INCBIN_U8("graphics/unknown/unknown_60F3BC.4bpp"); -static const u8 gUnknown_0860F43C[] = INCBIN_U8("graphics/unknown/unknown_60F43C.4bpp"); -static const u8 gUnknown_0860F53C[] = INCBIN_U8("graphics/unknown/unknown_60F53C.4bpp"); -static const u8 gUnknown_0860F63C[] = INCBIN_U8("graphics/unknown/unknown_60F63C.4bpp"); -static const u8 gUnknown_0860F6BC[] = INCBIN_U8("graphics/unknown/unknown_60F6BC.4bpp"); -static const u8 gUnknown_0860F7BC[] = INCBIN_U8("graphics/unknown/unknown_60F7BC.4bpp"); -static const u8 gUnknown_0860F83C[] = INCBIN_U8("graphics/unknown/unknown_60F83C.4bpp"); -static const u8 gUnknown_0860F93C[] = INCBIN_U8("graphics/unknown/unknown_60F93C.4bpp"); -static const u8 gUnknown_0860FA3C[] = INCBIN_U8("graphics/unknown/unknown_60FA3C.4bpp"); -static const u8 gUnknown_0861023C[] = INCBIN_U8("graphics/unknown/unknown_61023C.bin"); -static const u8 gUnknown_0861033C[] = INCBIN_U8("graphics/unknown/unknown_61033C.4bpp"); -static const u16 gUnknown_0861039C[] = INCBIN_U16("graphics/unknown/unknown_61039C.gbapal"); - -static const struct SpriteSheet gUnknown_086103BC[] = -{ - {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65}, - {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66}, - {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67}, - {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D}, +static EWRAM_DATA u8 *sSwapMonPicBgTilemapBuffer = NULL; + +static struct FactorySelectScreen *sFactorySelectScreen; +static void (*sSwap_CurrentOptionFunc)(u8 taskId); +static struct FactorySwapScreen *sFactorySwapScreen; + +u8 (*gFactorySelect_CurrentOptionFunc)(void); + +static const u16 sPokeballGray_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/pokeball_gray.gbapal"); +static const u16 sPokeballSelected_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/pokeball_selected.gbapal"); +static const u16 sInterface_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/interface.gbapal"); // Arrow, menu/action highlights, action box, etc +static const u8 sPokeball_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/pokeball.4bpp"); // Unused, gPokeballSelection_Gfx used instead +static const u8 sArrow_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/arrow.4bpp"); +static const u8 sMenuHighlightLeft_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/menu_highlight_left.4bpp"); +static const u8 sMenuHighlightRight_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/menu_highlight_right.4bpp"); +static const u8 sActionBoxLeft_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_box_left.4bpp"); +static const u8 sActionBoxRight_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_box_right.4bpp"); +static const u8 sActionHighlightLeft_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_highlight_left.4bpp"); +static const u8 sActionHighlightMiddle_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_highlight_middle.4bpp"); +static const u8 sActionHighlightRight_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/action_highlight_right.4bpp"); +static const u8 sMonPicBgAnim_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg_anim.4bpp"); +static const u8 sMonPicBg_Tilemap[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg.bin"); +static const u8 sMonPicBg_Gfx[] = INCBIN_U8( "graphics/battle_frontier/factory_screen/mon_pic_bg.4bpp"); +static const u16 sMonPicBg_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/mon_pic_bg.gbapal"); + +static const struct SpriteSheet sSelect_SpriteSheets[] = +{ + {sArrow_Gfx, sizeof(sArrow_Gfx), GFXTAG_ARROW}, + {sMenuHighlightLeft_Gfx, sizeof(sMenuHighlightLeft_Gfx), GFXTAG_MENU_HIGHLIGHT_LEFT}, + {sMenuHighlightRight_Gfx, sizeof(sMenuHighlightRight_Gfx), GFXTAG_MENU_HIGHLIGHT_RIGHT}, + {sMonPicBgAnim_Gfx, sizeof(sMonPicBgAnim_Gfx), GFXTAG_MON_PIC_BG_ANIM}, {}, }; -static const struct CompressedSpriteSheet gUnknown_086103E4[] = +static const struct CompressedSpriteSheet sSelect_BallGfx[] = { - {gPokeballSelection_Gfx, 0x800, TAG_TILE_64}, + {gPokeballSelection_Gfx, 0x800, GFXTAG_BALL}, {}, }; -static const struct SpritePalette gUnknown_086103F4[] = +static const struct SpritePalette sSelect_SpritePalettes[] = { - {gUnknown_0860F13C, TAG_PAL_BALL_GREY}, - {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED}, - {gUnknown_0860F17C, TAG_PAL_66}, - {gUnknown_0861039C, TAG_PAL_67}, + {sPokeballGray_Pal, PALTAG_BALL_GRAY}, + {sPokeballSelected_Pal, PALTAG_BALL_SELECTED}, + {sInterface_Pal, PALTAG_INTERFACE}, + {sMonPicBg_Pal, PALTAG_MON_PIC_BG}, {}, }; u8 static (* const sSelect_MenuOptionFuncs[])(void) = { - [MENU_SUMMARY] = Select_OptionSummary, - [MENU_RENT] /*Or Deselect*/ = Select_OptionRentDeselect, - [MENU_OTHERS] = Select_OptionOthers + Select_OptionSummary, + Select_OptionRentDeselect, + Select_OptionOthers }; static const struct BgTemplate sSelect_BgTemplates[] = @@ -313,9 +333,18 @@ static const struct BgTemplate sSelect_BgTemplates[] = }, }; +enum { + SELECT_WIN_TITLE, + SELECT_WIN_SPECIES, + SELECT_WIN_INFO, + SELECT_WIN_OPTIONS, + SELECT_WIN_YES_NO, + SELECT_WIN_MON_CATEGORY, +}; + static const struct WindowTemplate sSelect_WindowTemplates[] = { - { + [SELECT_WIN_TITLE] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 2, @@ -324,7 +353,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x0001, }, - { + [SELECT_WIN_SPECIES] = { .bg = 0, .tilemapLeft = 19, .tilemapTop = 2, @@ -333,7 +362,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .paletteNum = 14, .baseBlock = 0x0019, }, - { + [SELECT_WIN_INFO] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 15, @@ -342,7 +371,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x002f, }, - { + [SELECT_WIN_OPTIONS] = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 14, @@ -351,7 +380,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x006b, }, - { + [SELECT_WIN_YES_NO] = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 14, @@ -360,7 +389,7 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x009b, }, - { + [SELECT_WIN_MON_CATEGORY] = { .bg = 0, .tilemapLeft = 15, .tilemapTop = 0, @@ -372,12 +401,11 @@ static const struct WindowTemplate sSelect_WindowTemplates[] = DUMMY_WIN_TEMPLATE, }; -static const u16 gUnknown_0861046C[] = INCBIN_U16("graphics/unknown/unknown_61046C.gbapal"); - -static const u8 sMenuOptionTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_TRANSPARENT}; +static const u16 sSelectText_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/text.gbapal"); +static const u8 sMenuOptionTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_TRANSPARENT}; static const u8 sSpeciesNameTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_TRANSPARENT}; -static const struct OamData gUnknown_0861047C = +static const struct OamData sOam_Select_Pokeball = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -394,7 +422,7 @@ static const struct OamData gUnknown_0861047C = .affineParam = 0, }; -static const struct OamData gUnknown_08610484 = +static const struct OamData sOam_Select_Arrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -411,7 +439,7 @@ static const struct OamData gUnknown_08610484 = .affineParam = 0, }; -static const struct OamData gUnknown_0861048C = +static const struct OamData sOam_Select_MenuHighlight = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -428,7 +456,7 @@ static const struct OamData gUnknown_0861048C = .affineParam = 0, }; -static const struct OamData gUnknown_08610494 = +static const struct OamData sOam_Select_MonPicBgAnim = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, @@ -445,25 +473,25 @@ static const struct OamData gUnknown_08610494 = .affineParam = 1, }; -static const union AnimCmd gUnknown_0861049C[] = +static const union AnimCmd sAnim_Select_Interface[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd gUnknown_086104A4[] = +static const union AnimCmd sAnim_Select_MonPicBgAnim[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd gUnknown_086104AC[] = +static const union AnimCmd sAnim_Select_Pokeball_Still[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; -static const union AnimCmd gUnknown_086104B4[] = +static const union AnimCmd sAnim_Select_Pokeball_Moving[] = { ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(0, 4), @@ -485,23 +513,23 @@ static const union AnimCmd gUnknown_086104B4[] = ANIMCMD_END, }; -static const union AnimCmd * const gUnknown_086104FC[] = +static const union AnimCmd * const sAnims_Select_Interface[] = { - gUnknown_0861049C, + sAnim_Select_Interface, }; -static const union AnimCmd * const gUnknown_08610500[] = +static const union AnimCmd * const sAnims_Select_MonPicBgAnim[] = { - gUnknown_086104A4, + sAnim_Select_MonPicBgAnim, }; -static const union AnimCmd * const gUnknown_08610504[] = +static const union AnimCmd * const sAnims_Select_Pokeball[] = { - gUnknown_086104AC, - gUnknown_086104B4, + sAnim_Select_Pokeball_Still, + sAnim_Select_Pokeball_Moving, }; -static const union AffineAnimCmd gUnknown_0861050C[] = +static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Opening[] = { AFFINEANIMCMD_FRAME(5, 5, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 1), @@ -517,7 +545,7 @@ static const union AffineAnimCmd gUnknown_0861050C[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_0861056C[] = +static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Closing[] = { AFFINEANIMCMD_FRAME(128, 5, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 1), @@ -531,104 +559,104 @@ static const union AffineAnimCmd gUnknown_0861056C[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_086105BC[] = +static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Open[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const gUnknown_086105CC[] = +static const union AffineAnimCmd * const sAffineAnims_Select_MonPicBgAnim[] = { - gUnknown_0861050C, - gUnknown_0861056C, - gUnknown_086105BC, + sAffineAnim_Select_MonPicBg_Opening, + sAffineAnim_Select_MonPicBg_Closing, + sAffineAnim_Select_MonPicBg_Open, }; -static const struct SpriteTemplate gUnknown_086105D8 = +static const struct SpriteTemplate sSpriteTemplate_Select_Pokeball = { - .tileTag = TAG_TILE_64, - .paletteTag = TAG_PAL_BALL_GREY, - .oam = &gUnknown_0861047C, - .anims = gUnknown_08610504, + .tileTag = GFXTAG_BALL, + .paletteTag = PALTAG_BALL_GRAY, + .oam = &sOam_Select_Pokeball, + .anims = sAnims_Select_Pokeball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_819A44C + .callback = SpriteCB_Pokeball }; -static const struct SpriteTemplate gUnknown_086105F0 = +static const struct SpriteTemplate sSpriteTemplate_Select_Arrow = { - .tileTag = TAG_TILE_65, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_08610484, - .anims = gUnknown_086104FC, + .tileTag = GFXTAG_ARROW, + .paletteTag = PALTAG_INTERFACE, + .oam = &sOam_Select_Arrow, + .anims = sAnims_Select_Interface, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_08610608 = +static const struct SpriteTemplate sSpriteTemplate_Select_MenuHighlightLeft = { - .tileTag = TAG_TILE_66, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_0861048C, - .anims = gUnknown_086104FC, + .tileTag = GFXTAG_MENU_HIGHLIGHT_LEFT, + .paletteTag = PALTAG_INTERFACE, + .oam = &sOam_Select_MenuHighlight, + .anims = sAnims_Select_Interface, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_08610620 = +static const struct SpriteTemplate sSpriteTemplate_Select_MenuHighlightRight = { - .tileTag = TAG_TILE_67, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_0861048C, - .anims = gUnknown_086104FC, + .tileTag = GFXTAG_MENU_HIGHLIGHT_RIGHT, + .paletteTag = PALTAG_INTERFACE, + .oam = &sOam_Select_MenuHighlight, + .anims = sAnims_Select_Interface, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_08610638 = +static const struct SpriteTemplate sSpriteTemplate_Select_MonPicBgAnim = { - .tileTag = TAG_TILE_6D, - .paletteTag = TAG_PAL_67, - .oam = &gUnknown_08610494, - .anims = gUnknown_08610500, + .tileTag = GFXTAG_MON_PIC_BG_ANIM, + .paletteTag = PALTAG_MON_PIC_BG, + .oam = &sOam_Select_MonPicBgAnim, + .anims = sAnims_Select_MonPicBgAnim, .images = NULL, - .affineAnims = gUnknown_086105CC, + .affineAnims = sAffineAnims_Select_MonPicBgAnim, .callback = SpriteCallbackDummy }; -static const struct SpriteSheet gUnknown_08610650[] = -{ - {gUnknown_0860F3BC, sizeof(gUnknown_0860F3BC), TAG_TILE_65}, - {gUnknown_0860F43C, sizeof(gUnknown_0860F43C), TAG_TILE_66}, - {gUnknown_0860F53C, sizeof(gUnknown_0860F53C), TAG_TILE_67}, - {gUnknown_0860F63C, sizeof(gUnknown_0860F63C), TAG_TILE_68}, - {gUnknown_0860F6BC, sizeof(gUnknown_0860F6BC), TAG_TILE_69}, - {gUnknown_0860F7BC, 0x100, TAG_TILE_6A}, - {gUnknown_0860F83C, sizeof(gUnknown_0860F83C), TAG_TILE_6B}, - {gUnknown_0860F93C, sizeof(gUnknown_0860F93C), TAG_TILE_6C}, - {gUnknown_0860FA3C, sizeof(gUnknown_0860FA3C), TAG_TILE_6D}, +static const struct SpriteSheet sSwap_SpriteSheets[] = +{ + {sArrow_Gfx, sizeof(sArrow_Gfx), GFXTAG_ARROW}, + {sMenuHighlightLeft_Gfx, sizeof(sMenuHighlightLeft_Gfx), GFXTAG_MENU_HIGHLIGHT_LEFT}, + {sMenuHighlightRight_Gfx, sizeof(sMenuHighlightRight_Gfx), GFXTAG_MENU_HIGHLIGHT_RIGHT}, + {sActionBoxLeft_Gfx, sizeof(sActionBoxLeft_Gfx), GFXTAG_ACTION_BOX_LEFT}, + {sActionBoxRight_Gfx, sizeof(sActionBoxRight_Gfx), GFXTAG_ACTION_BOX_RIGHT}, + {sActionHighlightLeft_Gfx, 0x100, GFXTAG_ACTION_HIGHLIGHT_LEFT}, + {sActionHighlightMiddle_Gfx, sizeof(sActionHighlightMiddle_Gfx), GFXTAG_ACTION_HIGHLIGHT_MIDDLE}, + {sActionHighlightRight_Gfx, sizeof(sActionHighlightRight_Gfx), GFXTAG_ACTION_HIGHLIGHT_RIGHT}, + {sMonPicBgAnim_Gfx, sizeof(sMonPicBgAnim_Gfx), GFXTAG_MON_PIC_BG_ANIM}, {}, }; -static const struct CompressedSpriteSheet gUnknown_086106A0[] = +static const struct CompressedSpriteSheet sSwap_BallGfx[] = { - {gPokeballSelection_Gfx, 0x800, TAG_TILE_64}, + {gPokeballSelection_Gfx, 0x800, GFXTAG_BALL}, {}, }; -static const struct SpritePalette gUnknown_086106B0[] = +static const struct SpritePalette sSwap_SpritePalettes[] = { - {gUnknown_0860F13C, TAG_PAL_BALL_GREY}, - {gUnknown_0860F15C, TAG_PAL_BALL_SELECTED}, - {gUnknown_0860F17C, TAG_PAL_66}, - {gUnknown_0861039C, TAG_PAL_67}, + {sPokeballGray_Pal, PALTAG_BALL_GRAY}, + {sPokeballSelected_Pal, PALTAG_BALL_SELECTED}, + {sInterface_Pal, PALTAG_INTERFACE}, + {sMonPicBg_Pal, PALTAG_MON_PIC_BG}, {}, }; -static const struct OamData gUnknown_086106D8 = +static const struct OamData sOam_Swap_Pokeball = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -645,7 +673,7 @@ static const struct OamData gUnknown_086106D8 = .affineParam = 0, }; -static const struct OamData gUnknown_086106E0 = +static const struct OamData sOam_Swap_Arrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -662,7 +690,7 @@ static const struct OamData gUnknown_086106E0 = .affineParam = 0, }; -static const struct OamData gUnknown_086106E8 = +static const struct OamData sOam_Swap_MenuHighlight = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -679,7 +707,7 @@ static const struct OamData gUnknown_086106E8 = .affineParam = 0, }; -static const struct OamData gUnknown_086106F0 = +static const struct OamData sOam_Swap_MonPicBgAnim = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, @@ -696,25 +724,25 @@ static const struct OamData gUnknown_086106F0 = .affineParam = 1, }; -static const union AnimCmd gUnknown_086106F8[] = +static const union AnimCmd sAnim_Swap_Interface[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd gUnknown_08610700[] = +static const union AnimCmd sAnim_Swap_MonPicBgAnim[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd gUnknown_08610708[] = +static const union AnimCmd sAnim_Swap_Pokeball_Still[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; -static const union AnimCmd gUnknown_08610710[] = +static const union AnimCmd sAnim_Swap_Pokeball_Moving[] = { ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(0, 4), @@ -736,23 +764,23 @@ static const union AnimCmd gUnknown_08610710[] = ANIMCMD_END, }; -static const union AnimCmd * const gUnknown_08610758[] = +static const union AnimCmd * const sAnims_Swap_Interface[] = { - gUnknown_086106F8, + sAnim_Swap_Interface, }; -static const union AnimCmd * const gUnknown_0861075C[] = +static const union AnimCmd * const sAnims_Swap_MonPicBgAnim[] = { - gUnknown_08610700, + sAnim_Swap_MonPicBgAnim, }; -static const union AnimCmd * const gUnknown_08610760[] = +static const union AnimCmd * const sAnims_Swap_Pokeball[] = { - gUnknown_08610708, - gUnknown_08610710, + sAnim_Swap_Pokeball_Still, + sAnim_Swap_Pokeball_Moving, }; -static const union AffineAnimCmd gUnknown_08610768[] = +static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Opening[] = { AFFINEANIMCMD_FRAME(5, 5, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 1), @@ -768,7 +796,7 @@ static const union AffineAnimCmd gUnknown_08610768[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_086107C8[] = +static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Closing[] = { AFFINEANIMCMD_FRAME(128, 5, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 1), @@ -782,79 +810,79 @@ static const union AffineAnimCmd gUnknown_086107C8[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_08610818[] = +static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Open[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const gUnknown_08610828[] = +static const union AffineAnimCmd * const sAffineAnims_Swap_MonPicBgAnim[] = { - gUnknown_08610768, - gUnknown_086107C8, - gUnknown_08610818, + sAffineAnim_Swap_MonPicBg_Opening, + sAffineAnim_Swap_MonPicBg_Closing, + sAffineAnim_Swap_MonPicBg_Open, }; -static const struct SpriteTemplate gUnknown_08610834 = +static const struct SpriteTemplate sSpriteTemplate_Swap_Pokeball = { - .tileTag = TAG_TILE_64, - .paletteTag = TAG_PAL_BALL_GREY, - .oam = &gUnknown_086106D8, - .anims = gUnknown_08610760, + .tileTag = GFXTAG_BALL, + .paletteTag = PALTAG_BALL_GRAY, + .oam = &sOam_Swap_Pokeball, + .anims = sAnims_Swap_Pokeball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_819A44C + .callback = SpriteCB_Pokeball }; -static const struct SpriteTemplate gUnknown_0861084C = +static const struct SpriteTemplate sSpriteTemplate_Swap_Arrow = { - .tileTag = TAG_TILE_65, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_086106E0, - .anims = gUnknown_08610758, + .tileTag = GFXTAG_ARROW, + .paletteTag = PALTAG_INTERFACE, + .oam = &sOam_Swap_Arrow, + .anims = sAnims_Swap_Interface, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_08610864 = +static const struct SpriteTemplate sSpriteTemplate_Swap_MenuHighlightLeft = { - .tileTag = TAG_TILE_66, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_086106E8, - .anims = gUnknown_08610758, + .tileTag = GFXTAG_MENU_HIGHLIGHT_LEFT, + .paletteTag = PALTAG_INTERFACE, + .oam = &sOam_Swap_MenuHighlight, + .anims = sAnims_Swap_Interface, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_0861087C = +static const struct SpriteTemplate sSpriteTemplate_Swap_MenuHighlightRight = { - .tileTag = TAG_TILE_67, - .paletteTag = TAG_PAL_66, - .oam = &gUnknown_086106E8, - .anims = gUnknown_08610758, + .tileTag = GFXTAG_MENU_HIGHLIGHT_RIGHT, + .paletteTag = PALTAG_INTERFACE, + .oam = &sOam_Swap_MenuHighlight, + .anims = sAnims_Swap_Interface, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_08610894 = +static const struct SpriteTemplate sSpriteTemplate_Swap_MonPicBgAnim = { - .tileTag = TAG_TILE_6D, - .paletteTag = TAG_PAL_67, - .oam = &gUnknown_086106F0, - .anims = gUnknown_0861075C, + .tileTag = GFXTAG_MON_PIC_BG_ANIM, + .paletteTag = PALTAG_MON_PIC_BG, + .oam = &sOam_Swap_MonPicBgAnim, + .anims = sAnims_Swap_MonPicBgAnim, .images = NULL, - .affineAnims = gUnknown_08610828, + .affineAnims = sAffineAnims_Swap_MonPicBgAnim, .callback = SpriteCallbackDummy }; void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) = { - sub_819F114, - sub_819F0CC, - sub_819F134, + Swap_OptionSummary, + Swap_OptionSwap, + Swap_OptionRechoose, }; static const struct BgTemplate sSwap_BgTemplates[4] = @@ -897,9 +925,21 @@ static const struct BgTemplate sSwap_BgTemplates[4] = }, }; +enum { + SWAP_WIN_TITLE, + SWAP_WIN_SPECIES, + SWAP_WIN_INFO, + SWAP_WIN_OPTIONS, + SWAP_WIN_YES_NO, + SWAP_WIN_ACTION_FADE, // Used for action text fading out during screen transition + SWAP_WIN_UNUSED, + SWAP_WIN_SPECIES_AT_FADE, // Used to print species name stopped at current fade level + SWAP_WIN_MON_CATEGORY, +}; + static const struct WindowTemplate sSwap_WindowTemplates[] = { - { + [SWAP_WIN_TITLE] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 2, @@ -908,7 +948,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x0001, }, - { + [SWAP_WIN_SPECIES] = { .bg = 2, .tilemapLeft = 19, .tilemapTop = 2, @@ -917,7 +957,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 14, .baseBlock = 0x0019, }, - { + [SWAP_WIN_INFO] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 15, @@ -926,7 +966,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x002f, }, - { + [SWAP_WIN_OPTIONS] = { .bg = 0, .tilemapLeft = 21, .tilemapTop = 14, @@ -935,7 +975,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x006b, }, - { + [SWAP_WIN_YES_NO] = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 14, @@ -944,7 +984,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x00a1, }, - { + [SWAP_WIN_ACTION_FADE] = { .bg = 2, .tilemapLeft = 21, .tilemapTop = 15, @@ -953,7 +993,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 14, .baseBlock = 0x006b, }, - { + [SWAP_WIN_UNUSED] = { .bg = 2, .tilemapLeft = 10, .tilemapTop = 2, @@ -962,7 +1002,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 14, .baseBlock = 0x00c1, }, - { + [SWAP_WIN_SPECIES_AT_FADE] = { .bg = 0, .tilemapLeft = 19, .tilemapTop = 2, @@ -971,7 +1011,7 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = .paletteNum = 15, .baseBlock = 0x00c9, }, - { + [SWAP_WIN_MON_CATEGORY] = { .bg = 0, .tilemapLeft = 15, .tilemapTop = 0, @@ -983,64 +1023,36 @@ static const struct WindowTemplate sSwap_WindowTemplates[] = DUMMY_WIN_TEMPLATE, }; -static const u16 gUnknown_08610918[] = {RGB_BLACK, RGB_BLACK, RGB_WHITE, RGB_BLACK, RGB_RED}; // Palette. -static const u8 sSwapMenuOptionsTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_TRANSPARENT}; +static const u16 sSwapText_Pal[] = INCBIN_U16("graphics/battle_frontier/factory_screen/text.gbapal"); // Identical to sSelectText_Pal +static const u8 sSwapMenuOptionsTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_TRANSPARENT}; static const u8 sSwapSpeciesNameTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_TRANSPARENT}; -static const struct SwapActionIdAndFunc sSwap_PlayerScreenActions[] = +#define SWAPACTION_MON 1 +#define SWAPACTION_PKMN_FOR_SWAP 2 +#define SWAPACTION_CANCEL 3 + +static const struct SwapScreenAction sSwap_PlayerScreenActions[] = { - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {3, Swap_ActionCancel}, + {.id = SWAPACTION_MON, .func = Swap_ActionMon}, + {.id = SWAPACTION_MON, .func = Swap_ActionMon}, + {.id = SWAPACTION_MON, .func = Swap_ActionMon}, + {.id = SWAPACTION_CANCEL, .func = Swap_ActionCancel}, }; -static const struct SwapActionIdAndFunc sSwap_EnemyScreenActions[] = +static const struct SwapScreenAction sSwap_EnemyScreenActions[] = { - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {1, Swap_ActionMon}, - {2, Swap_ActionPkmnForSwap}, - {3, Swap_ActionCancel}, + {.id = SWAPACTION_MON, .func = Swap_ActionMon}, + {.id = SWAPACTION_MON, .func = Swap_ActionMon}, + {.id = SWAPACTION_MON, .func = Swap_ActionMon}, + {.id = SWAPACTION_PKMN_FOR_SWAP, .func = Swap_ActionPkmnForSwap}, + {.id = SWAPACTION_CANCEL, .func = Swap_ActionCancel}, }; -// gfx -extern const u8 gFrontierFactorySelectMenu_Gfx[]; -extern const u8 gFrontierFactorySelectMenu_Tilemap[]; -extern const u16 gFrontierFactorySelectMenu_Pal[]; - -// text -extern const u8 gText_RentalPkmn2[]; -extern const u8 gText_SelectFirstPkmn[]; -extern const u8 gText_SelectSecondPkmn[]; -extern const u8 gText_SelectThirdPkmn[]; -extern const u8 gText_TheseThreePkmnOkay[]; -extern const u8 gText_CantSelectSamePkmn[]; -extern const u8 gText_Summary[]; -extern const u8 gText_Rechoose[]; -extern const u8 gText_Deselect[]; -extern const u8 gText_Rent[]; -extern const u8 gText_Others2[]; -extern const u8 gText_Yes2[]; -extern const u8 gText_Yes3[]; -extern const u8 gText_No2[]; -extern const u8 gText_No3[]; -extern const u8 gText_QuitSwapping[]; -extern const u8 gText_AcceptThisPkmn[]; -extern const u8 gText_SelectPkmnToAccept[]; -extern const u8 gText_SelectPkmnToSwap[]; -extern const u8 gText_PkmnSwap[]; -extern const u8 gText_Swap[]; -extern const u8 gText_Summary2[]; -extern const u8 gText_PkmnForSwap[]; -extern const u8 gText_SamePkmnInPartyAlready[]; -extern const u8 gText_Cancel3[]; - -// code -static void sub_819A44C(struct Sprite *sprite) -{ - if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED)) +static void SpriteCB_Pokeball(struct Sprite *sprite) +{ + if (sprite->oam.paletteNum == IndexOfSpritePaletteTag(PALTAG_BALL_SELECTED)) { + // Pokeball selected, do rocking animation if (sprite->animEnded) { if (sprite->data[0] != 0) @@ -1064,11 +1076,12 @@ static void sub_819A44C(struct Sprite *sprite) } else { + // Pokeball not selected, remain still StartSpriteAnimIfDifferent(sprite, 0); } } -static void Select_CB2(void) +static void CB2_SelectScreen(void) { AnimateSprites(); BuildOamBuffer(); @@ -1077,7 +1090,7 @@ static void Select_CB2(void) RunTasks(); } -static void Select_VblankCb(void) +static void VBlankCB_SelectScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); @@ -1090,6 +1103,27 @@ void DoBattleFactorySelectScreen(void) SetMainCallback2(CB2_InitSelectScreen); } +// Main select states +// States for the main tasks of the Select_ functions after initialization, including: +// Select_Task_OpenSummaryScreen, Select_Task_HandleYesNo, Select_Task_HandleMenu, and Select_Task_HandleChooseMons +// Unnecessarily complicated, could easily have just kept states numbered in each task always starting at 0 +// There's only one instance (Select_Task_HandleChooseMons) where a non-initial case is used +// Select_Task_Exit has its own straightforward states +#define STATE_CHOOSE_MONS_INIT 0 +#define STATE_CHOOSE_MONS_HANDLE_INPUT 1 +#define STATE_MENU_INIT 2 +#define STATE_MENU_HANDLE_INPUT 3 +#define STATE_YESNO_SHOW_OPTIONS 4 +#define STATE_YESNO_HANDLE_INPUT 5 +#define STATE_SUMMARY_FADE 6 +#define STATE_SUMMARY_CLEAN 7 +#define STATE_SUMMARY_SHOW 8 +#define STATE_MENU_SHOW_OPTIONS 9 +#define STATE_YESNO_SHOW_MONS 10 +#define STATE_CHOOSE_MONS_INVALID 11 +#define STATE_MENU_REINIT 12 +#define STATE_MENU_RESHOW 13 + static void CB2_InitSelectScreen(void) { u8 taskId; @@ -1110,9 +1144,9 @@ static void CB2_InitSelectScreen(void) break; case 1: sSelectMenuTilesetBuffer = Alloc(0x440); - sSelectMonCardBgTilesetBuffer = AllocZeroed(0x440); - sSelectMenuTilemapBuffer = Alloc(0x800); - sSelectMonCardBgTilemapBuffer = AllocZeroed(0x800); + sSelectMonPicBgTilesetBuffer = AllocZeroed(0x440); + sSelectMenuTilemapBuffer = Alloc(BG_SCREEN_SIZE); + sSelectMonPicBgTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -1137,45 +1171,45 @@ static void CB2_InitSelectScreen(void) ResetTasks(); FreeAllSpritePalettes(); CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSelectMenuTilesetBuffer, 0x440); - CpuCopy16(gUnknown_0861033C, sSelectMonCardBgTilesetBuffer, 0x60); + CpuCopy16(sMonPicBg_Gfx, sSelectMonPicBgTilesetBuffer, 0x60); LoadBgTiles(1, sSelectMenuTilesetBuffer, 0x440, 0); - LoadBgTiles(3, sSelectMonCardBgTilesetBuffer, 0x60, 0); - CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, 0x800); - LoadBgTilemap(1, sSelectMenuTilemapBuffer, 0x800, 0); + LoadBgTiles(3, sSelectMonPicBgTilesetBuffer, 0x60, 0); + CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSelectMenuTilemapBuffer, BG_SCREEN_SIZE); + LoadBgTilemap(1, sSelectMenuTilemapBuffer, BG_SCREEN_SIZE, 0); LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40); - LoadPalette(gUnknown_0861046C, 0xF0, 8); - LoadPalette(gUnknown_0861046C, 0xE0, 10); - #if MODERN + LoadPalette(sSelectText_Pal, 0xF0, 8); + LoadPalette(sSelectText_Pal, 0xE0, 10); +#ifdef UBFIX if (sFactorySelectScreen && sFactorySelectScreen->fromSummaryScreen) - #else +#else if (sFactorySelectScreen->fromSummaryScreen == TRUE) - #endif - gPlttBufferUnfaded[228] = sFactorySelectScreen->unk2A4; - LoadPalette(gUnknown_0861039C, 0x20, 4); +#endif + gPlttBufferUnfaded[228] = sFactorySelectScreen->speciesNameColorBackup; + LoadPalette(sMonPicBg_Pal, 0x20, 4); gMain.state++; break; case 3: - SetBgTilemapBuffer(3, sSelectMonCardBgTilemapBuffer); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 2, 4, 8, 8); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 20, 4, 8, 8); + SetBgTilemapBuffer(3, sSelectMonPicBgTilemapBuffer); + CopyToBgTilemapBufferRect(3, sMonPicBg_Tilemap, 11, 4, 8, 8); + CopyToBgTilemapBufferRect(3, sMonPicBg_Tilemap, 2, 4, 8, 8); + CopyToBgTilemapBufferRect(3, sMonPicBg_Tilemap, 20, 4, 8, 8); CopyBgTilemapBufferToVram(3); gMain.state++; break; case 4: - LoadSpritePalettes(gUnknown_086103F4); - LoadSpriteSheets(gUnknown_086103BC); - LoadCompressedSpriteSheet(gUnknown_086103E4); + LoadSpritePalettes(sSelect_SpritePalettes); + LoadSpriteSheets(sSelect_SpriteSheets); + LoadCompressedSpriteSheet(sSelect_BallGfx); ShowBg(0); ShowBg(1); - SetVBlankCallback(Select_VblankCb); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(VBlankCB_SelectScreen); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_1D_MAP); - #if MODERN +#ifdef UBFIX if (sFactorySelectScreen && sFactorySelectScreen->fromSummaryScreen) - #else +#else if (sFactorySelectScreen->fromSummaryScreen == TRUE) - #endif +#endif { Select_SetWinRegs(88, 152, 32, 96); ShowBg(3); @@ -1189,54 +1223,54 @@ static void CB2_InitSelectScreen(void) gMain.state++; break; case 5: - #if MODERN +#ifdef UBFIX if (sFactorySelectScreen && sFactorySelectScreen->fromSummaryScreen) - #else +#else if (sFactorySelectScreen->fromSummaryScreen == TRUE) - #endif +#endif sFactorySelectScreen->cursorPos = gLastViewedMonIndex; Select_InitMonsData(); Select_InitAllSprites(); if (sFactorySelectScreen->fromSummaryScreen == TRUE) - Select_ShowSummaryMonSprite(); + Select_ReshowMonSprite(); gMain.state++; break; case 6: Select_PrintSelectMonString(); - PutWindowTilemap(2); + PutWindowTilemap(SELECT_WIN_INFO); gMain.state++; break; case 7: Select_PrintMonCategory(); - PutWindowTilemap(5); + PutWindowTilemap(SELECT_WIN_MON_CATEGORY); gMain.state++; break; case 8: Select_PrintMonSpecies(); - PutWindowTilemap(1); + PutWindowTilemap(SELECT_WIN_SPECIES); gMain.state++; break; case 9: Select_PrintRentalPkmnString(); - PutWindowTilemap(0); + PutWindowTilemap(SELECT_WIN_TITLE); gMain.state++; break; case 10: - sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Task_SelectFadeSpeciesName, 0); + sFactorySelectScreen->fadeSpeciesNameTaskId = CreateTask(Select_Task_FadeSpeciesName, 0); if (!sFactorySelectScreen->fromSummaryScreen) { - gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 0; - taskId = CreateTask(Task_HandleSelectionScreenChooseMons, 0); - gTasks[taskId].data[0] = 0; + gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].tState = FADESTATE_INIT; + taskId = CreateTask(Select_Task_HandleChooseMons, 0); + gTasks[taskId].tState = STATE_CHOOSE_MONS_INIT; } else { - gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].data[0] = 1; - sFactorySelectScreen->unk2A2 = FALSE; - taskId = CreateTask(Task_HandleSelectionScreenMenu, 0); - gTasks[taskId].data[0] = 13; + gTasks[sFactorySelectScreen->fadeSpeciesNameTaskId].tState = FADESTATE_RUN; + sFactorySelectScreen->fadeSpeciesNameActive = FALSE; + taskId = CreateTask(Select_Task_HandleMenu, 0); + gTasks[taskId].tState = STATE_MENU_RESHOW; } - SetMainCallback2(Select_CB2); + SetMainCallback2(CB2_SelectScreen); break; } } @@ -1258,7 +1292,7 @@ static void Select_InitMonsData(void) if (gSaveBlock2Ptr->frontier.lvlMode != FRONTIER_LVL_TENT) CreateFrontierFactorySelectableMons(0); else - CreateTentFactorySelectableMons(0); + CreateSlateportTentSelectableMons(0); } static void Select_InitAllSprites(void) @@ -1268,15 +1302,15 @@ static void Select_InitAllSprites(void) for (i = 0; i < SELECTABLE_MONS_COUNT; i++) { - sFactorySelectScreen->mons[i].spriteId = CreateSprite(&gUnknown_086105D8, (35 * i) + 32, 64, 1); - gSprites[sFactorySelectScreen->mons[i].spriteId].data[0] = 0; + sFactorySelectScreen->mons[i].ballSpriteId = CreateSprite(&sSpriteTemplate_Select_Pokeball, (35 * i) + 32, 64, 1); + gSprites[sFactorySelectScreen->mons[i].ballSpriteId].data[0] = 0; Select_SetBallSpritePaletteNum(i); } cursorPos = sFactorySelectScreen->cursorPos; - x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x; - sFactorySelectScreen->cursorSpriteId = CreateSprite(&gUnknown_086105F0, x, 88, 0); - sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610608, 176, 112, 0); - sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_08610620, 176, 144, 0); + x = gSprites[sFactorySelectScreen->mons[cursorPos].ballSpriteId].pos1.x; + sFactorySelectScreen->cursorSpriteId = CreateSprite(&sSpriteTemplate_Select_Arrow, x, 88, 0); + sFactorySelectScreen->menuCursor1SpriteId = CreateSprite(&sSpriteTemplate_Select_MenuHighlightLeft, 176, 112, 0); + sFactorySelectScreen->menuCursor2SpriteId = CreateSprite(&sSpriteTemplate_Select_MenuHighlightRight, 176, 144, 0); gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; @@ -1292,7 +1326,7 @@ static void Select_DestroyAllSprites(void) u8 i; for (i = 0; i < SELECTABLE_MONS_COUNT; i++) - DestroySprite(&gSprites[sFactorySelectScreen->mons[i].spriteId]); + DestroySprite(&gSprites[sFactorySelectScreen->mons[i].ballSpriteId]); DestroySprite(&gSprites[sFactorySelectScreen->cursorSpriteId]); DestroySprite(&gSprites[sFactorySelectScreen->menuCursor1SpriteId]); @@ -1318,14 +1352,14 @@ static void Select_UpdateBallCursorPosition(s8 direction) } cursorPos = sFactorySelectScreen->cursorPos; - gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].pos1.x; + gSprites[sFactorySelectScreen->cursorSpriteId].pos1.x = gSprites[sFactorySelectScreen->mons[cursorPos].ballSpriteId].pos1.x; } static void Select_UpdateMenuCursorPosition(s8 direction) { if (direction > 0) // Move cursor down. { - if (sFactorySelectScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1) + if (sFactorySelectScreen->menuCursorPos != ARRAY_COUNT(sSelect_MenuOptionFuncs) - 1) sFactorySelectScreen->menuCursorPos++; else sFactorySelectScreen->menuCursorPos = 0; @@ -1335,7 +1369,7 @@ static void Select_UpdateMenuCursorPosition(s8 direction) if (sFactorySelectScreen->menuCursorPos != 0) sFactorySelectScreen->menuCursorPos--; else - sFactorySelectScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1; + sFactorySelectScreen->menuCursorPos = ARRAY_COUNT(sSelect_MenuOptionFuncs) - 1; } gSprites[sFactorySelectScreen->menuCursor1SpriteId].pos1.y = (sFactorySelectScreen->menuCursorPos * 16) + 112; @@ -1369,12 +1403,13 @@ static void Select_HandleMonSelectionChange(void) u8 cursorPos = sFactorySelectScreen->cursorPos; if (sFactorySelectScreen->mons[cursorPos].selectedId) // Deselect a mon. { - paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); - if (sFactorySelectScreen->selectingMonsState == 3 && sFactorySelectScreen->mons[cursorPos].selectedId == 1) + paletteNum = IndexOfSpritePaletteTag(PALTAG_BALL_GRAY); + if (sFactorySelectScreen->selectingMonsState == FRONTIER_PARTY_SIZE + && sFactorySelectScreen->mons[cursorPos].selectedId == 1) { for (i = 0; i < SELECTABLE_MONS_COUNT; i++) { - if (sFactorySelectScreen->mons[i].selectedId == 2) + if (sFactorySelectScreen->mons[i].selectedId == FRONTIER_PARTY_SIZE - 1) break; } if (i == SELECTABLE_MONS_COUNT) @@ -1387,12 +1422,12 @@ static void Select_HandleMonSelectionChange(void) } else // Select a mon. { - paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); + paletteNum = IndexOfSpritePaletteTag(PALTAG_BALL_SELECTED); sFactorySelectScreen->mons[cursorPos].selectedId = sFactorySelectScreen->selectingMonsState; sFactorySelectScreen->selectingMonsState++; } - gSprites[sFactorySelectScreen->mons[cursorPos].spriteId].oam.paletteNum = paletteNum; + gSprites[sFactorySelectScreen->mons[cursorPos].ballSpriteId].oam.paletteNum = paletteNum; } static void Select_SetBallSpritePaletteNum(u8 id) @@ -1400,191 +1435,196 @@ static void Select_SetBallSpritePaletteNum(u8 id) u8 palNum; if (sFactorySelectScreen->mons[id].selectedId) - palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); + palNum = IndexOfSpritePaletteTag(PALTAG_BALL_SELECTED); else - palNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); + palNum = IndexOfSpritePaletteTag(PALTAG_BALL_GRAY); - gSprites[sFactorySelectScreen->mons[id].spriteId].oam.paletteNum = palNum; + gSprites[sFactorySelectScreen->mons[id].ballSpriteId].oam.paletteNum = palNum; } -static void Task_FromSelectScreenToSummaryScreen(u8 taskId) +static void Select_Task_OpenSummaryScreen(u8 taskId) { u8 i; u8 currMonId; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 6: + case STATE_SUMMARY_FADE: gPlttBufferUnfaded[228] = gPlttBufferFaded[228]; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].data[0] = 7; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].tState = STATE_SUMMARY_CLEAN; break; - case 7: + case STATE_SUMMARY_CLEAN: if (!gPaletteFade.active) { DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); - sub_819F444(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0); + HideMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating); Select_DestroyAllSprites(); FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); - FREE_AND_SET_NULL(sSelectMonCardBgTilesetBuffer); + FREE_AND_SET_NULL(sSelectMonPicBgTilesetBuffer); FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); - FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer); + FREE_AND_SET_NULL(sSelectMonPicBgTilemapBuffer); FreeAllWindowBuffers(); - gTasks[taskId].data[0] = 8; + gTasks[taskId].tState = STATE_SUMMARY_SHOW; } break; - case 8: - sFactorySelectScreen->unk2A4 = gPlttBufferUnfaded[228]; + case STATE_SUMMARY_SHOW: + sFactorySelectScreen->speciesNameColorBackup = gPlttBufferUnfaded[228]; DestroyTask(taskId); sFactorySelectScreen->fromSummaryScreen = TRUE; currMonId = sFactorySelectScreen->cursorPos; sFactorySelectMons = AllocZeroed(sizeof(struct Pokemon) * SELECTABLE_MONS_COUNT); for (i = 0; i < SELECTABLE_MONS_COUNT; i++) sFactorySelectMons[i] = sFactorySelectScreen->mons[i].monData; - ShowPokemonSummaryScreen(1, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen); + ShowPokemonSummaryScreen(SUMMARY_MODE_LOCK_MOVES, sFactorySelectMons, currMonId, SELECTABLE_MONS_COUNT - 1, CB2_InitSelectScreen); break; } } -static void Task_CloseSelectionScreen(u8 taskId) +static void Select_Task_Exit(u8 taskId) { - if (sFactorySelectScreen->unk2A0 != TRUE) + if (sFactorySelectScreen->monPicAnimating == TRUE) + return; + + switch (gTasks[taskId].tState) { - switch (gTasks[taskId].data[0]) + case 0: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].tState++; + break; + case 1: + if (!UpdatePaletteFade()) { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].data[0]++; - break; - case 1: - if (!UpdatePaletteFade()) - { - Select_CopyMonsToPlayerParty(); - DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); - Select_DestroyAllSprites(); - FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); - FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); - FREE_AND_SET_NULL(sSelectMonCardBgTilemapBuffer); - FREE_AND_SET_NULL(sFactorySelectScreen); - FreeAllWindowBuffers(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); - DestroyTask(taskId); - } - break; + Select_CopyMonsToPlayerParty(); + DestroyTask(sFactorySelectScreen->fadeSpeciesNameTaskId); + Select_DestroyAllSprites(); + FREE_AND_SET_NULL(sSelectMenuTilesetBuffer); + FREE_AND_SET_NULL(sSelectMenuTilemapBuffer); + FREE_AND_SET_NULL(sSelectMonPicBgTilemapBuffer); + FREE_AND_SET_NULL(sFactorySelectScreen); + FreeAllWindowBuffers(); + SetMainCallback2(CB2_ReturnToFieldContinueScript); + DestroyTask(taskId); } + break; } } -static void Task_HandleSelectionScreenYesNo(u8 taskId) +// Handles the Yes/No prompt when confirming the 3 selected rental pokemon +static void Select_Task_HandleYesNo(u8 taskId) { - if (sFactorySelectScreen->unk2A0 != TRUE) + if (sFactorySelectScreen->monPicAnimating == TRUE) + return; + + switch (gTasks[taskId].tState) { - switch (gTasks[taskId].data[0]) + case STATE_YESNO_SHOW_MONS: + Select_ShowChosenMons(); + gTasks[taskId].tState = STATE_YESNO_SHOW_OPTIONS; + break; + case STATE_YESNO_SHOW_OPTIONS: + Select_ShowYesNoOptions(); + gTasks[taskId].tState = STATE_YESNO_HANDLE_INPUT; + break; + case STATE_YESNO_HANDLE_INPUT: + if (JOY_NEW(A_BUTTON)) { - case 10: - sub_819C4B4(); - gTasks[taskId].data[0] = 4; - break; - case 4: - Select_ShowYesNoOptions(); - gTasks[taskId].data[0] = 5; - break; - case 5: - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if (sFactorySelectScreen->yesNoCursorPos == 0) - { - sub_819C568(); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_CloseSelectionScreen; - } - else - { - sub_819B958(4); - sub_819BC9C(); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - } - else if (JOY_NEW(B_BUTTON)) - { - PlaySE(SE_SELECT); - sub_819B958(4); - sub_819BC9C(); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; - } - else if (JOY_REPEAT(DPAD_UP)) + PlaySE(SE_SELECT); + if (sFactorySelectScreen->yesNoCursorPos == 0) { - PlaySE(SE_SELECT); - Select_UpdateYesNoCursorPosition(-1); + // Selected Yes, confirmed selected pokemon + Select_HideChosenMons(); + gTasks[taskId].tState = 0; + gTasks[taskId].func = Select_Task_Exit; } - else if (JOY_REPEAT(DPAD_DOWN)) + else { - PlaySE(SE_SELECT); - Select_UpdateYesNoCursorPosition(1); + // Selected No, continue choosing pokemon + Select_ErasePopupMenu(SELECT_WIN_YES_NO); + Select_DeclineChosenMons(); + sFactorySelectScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Select_Task_HandleChooseMons; } - break; } + else if (JOY_NEW(B_BUTTON)) + { + // Pressed B, Continue choosing pokemon + PlaySE(SE_SELECT); + Select_ErasePopupMenu(SELECT_WIN_YES_NO); + Select_DeclineChosenMons(); + sFactorySelectScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Select_Task_HandleChooseMons; + } + else if (JOY_REPEAT(DPAD_UP)) + { + PlaySE(SE_SELECT); + Select_UpdateYesNoCursorPosition(-1); + } + else if (JOY_REPEAT(DPAD_DOWN)) + { + PlaySE(SE_SELECT); + Select_UpdateYesNoCursorPosition(1); + } + break; } } -static void Task_HandleSelectionScreenMenu(u8 taskId) +// Handles the popup menu that shows when a pokemon is selected +static void Select_Task_HandleMenu(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 2: + case STATE_MENU_INIT: if (!sFactorySelectScreen->fromSummaryScreen) - sub_819F2B4(&sFactorySelectScreen->unk294[1].field1, &sFactorySelectScreen->unk2A0, FALSE); - gTasks[taskId].data[0] = 9; + OpenMonPic(&sFactorySelectScreen->monPics[1].bgSpriteId, &sFactorySelectScreen->monPicAnimating, FALSE); + gTasks[taskId].tState = STATE_MENU_SHOW_OPTIONS; break; - case 9: - if (sFactorySelectScreen->unk2A0 != TRUE) + case STATE_MENU_SHOW_OPTIONS: + if (sFactorySelectScreen->monPicAnimating != TRUE) { Select_ShowMenuOptions(); sFactorySelectScreen->fromSummaryScreen = FALSE; - gTasks[taskId].data[0] = 3; + gTasks[taskId].tState = STATE_MENU_HANDLE_INPUT; } break; - case 3: + case STATE_MENU_HANDLE_INPUT: if (JOY_NEW(A_BUTTON)) { u8 retVal; PlaySE(SE_SELECT); retVal = Select_RunMenuOptionFunc(); - if (retVal == 1) + if (retVal == SELECT_CONTINUE_CHOOSING) { - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + sFactorySelectScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Select_Task_HandleChooseMons; } - else if (retVal == 2) + else if (retVal == SELECT_CONFIRM_MONS) { - gTasks[taskId].data[0] = 10; - gTasks[taskId].func = Task_HandleSelectionScreenYesNo; + gTasks[taskId].tState = STATE_YESNO_SHOW_MONS; + gTasks[taskId].func = Select_Task_HandleYesNo; } - else if (retVal == 3) + else if (retVal == SELECT_INVALID_MON) { - gTasks[taskId].data[0] = 11; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + gTasks[taskId].tState = STATE_CHOOSE_MONS_INVALID; + gTasks[taskId].func = Select_Task_HandleChooseMons; } - else + else // SELECT_SUMMARY { - gTasks[taskId].data[0] = 6; - gTasks[taskId].func = Task_FromSelectScreenToSummaryScreen; + gTasks[taskId].tState = STATE_SUMMARY_FADE; + gTasks[taskId].func = Select_Task_OpenSummaryScreen; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - sub_819B958(3); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - gTasks[taskId].func = Task_HandleSelectionScreenChooseMons; + CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); + Select_ErasePopupMenu(SELECT_WIN_OPTIONS); + sFactorySelectScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Select_Task_HandleChooseMons; } else if (JOY_REPEAT(DPAD_UP)) { @@ -1597,81 +1637,97 @@ static void Task_HandleSelectionScreenMenu(u8 taskId) Select_UpdateMenuCursorPosition(1); } break; - case 12: + case STATE_MENU_REINIT: if (!gPaletteFade.active) { if (sFactorySelectScreen->fromSummaryScreen == TRUE) { - gPlttBufferFaded[228] = sFactorySelectScreen->unk2A4; + gPlttBufferFaded[228] = sFactorySelectScreen->speciesNameColorBackup; gPlttBufferUnfaded[228] = gPlttBufferUnfaded[244]; } sFactorySelectScreen->fromSummaryScreen = FALSE; - gTasks[taskId].data[0] = 3; + gTasks[taskId].tState = STATE_MENU_HANDLE_INPUT; } break; - case 13: + case STATE_MENU_RESHOW: Select_ShowMenuOptions(); - gTasks[taskId].data[0] = 12; + gTasks[taskId].tState = STATE_MENU_REINIT; break; } } -static void Task_HandleSelectionScreenChooseMons(u8 taskId) +// Handles input on the main selection screen, when no popup menu is open +static void Select_Task_HandleChooseMons(u8 taskId) { - if (sFactorySelectScreen->unk2A0 != TRUE) + if (sFactorySelectScreen->monPicAnimating == TRUE) + return; + + switch (gTasks[taskId].tState) { - switch (gTasks[taskId].data[0]) + case STATE_CHOOSE_MONS_INIT: + if (!gPaletteFade.active) { - case 0: - if (!gPaletteFade.active) - { - gTasks[taskId].data[0] = 1; - sFactorySelectScreen->unk2A2 = TRUE; - } - break; - case 1: - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - sFactorySelectScreen->unk2A2 = FALSE; - gTasks[taskId].data[0] = 2; - gTasks[taskId].func = Task_HandleSelectionScreenMenu; - } - else if (JOY_REPEAT(DPAD_LEFT)) - { - PlaySE(SE_SELECT); - Select_UpdateBallCursorPosition(-1); - Select_PrintMonCategory(); - Select_PrintMonSpecies(); - } - else if (JOY_REPEAT(DPAD_RIGHT)) - { - PlaySE(SE_SELECT); - Select_UpdateBallCursorPosition(1); - Select_PrintMonCategory(); - Select_PrintMonSpecies(); - } - break; - case 11: - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - Select_PrintSelectMonString(); - sFactorySelectScreen->unk2A2 = TRUE; - gTasks[taskId].data[0] = 1; - } - break; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; + sFactorySelectScreen->fadeSpeciesNameActive = TRUE; + } + break; + case STATE_CHOOSE_MONS_HANDLE_INPUT: + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + sFactorySelectScreen->fadeSpeciesNameActive = FALSE; + gTasks[taskId].tState = STATE_MENU_INIT; + gTasks[taskId].func = Select_Task_HandleMenu; + } + else if (JOY_REPEAT(DPAD_LEFT)) + { + PlaySE(SE_SELECT); + Select_UpdateBallCursorPosition(-1); + Select_PrintMonCategory(); + Select_PrintMonSpecies(); + } + else if (JOY_REPEAT(DPAD_RIGHT)) + { + PlaySE(SE_SELECT); + Select_UpdateBallCursorPosition(1); + Select_PrintMonCategory(); + Select_PrintMonSpecies(); + } + break; + case STATE_CHOOSE_MONS_INVALID: + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); + Select_PrintSelectMonString(); + sFactorySelectScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; } + break; } } +#undef STATE_CHOOSE_MONS_INIT +#undef STATE_CHOOSE_MONS_HANDLE_INPUT +#undef STATE_MENU_INIT +#undef STATE_MENU_HANDLE_INPUT +#undef STATE_YESNO_SHOW_OPTIONS +#undef STATE_YESNO_HANDLE_INPUT +#undef STATE_SUMMARY_FADE +#undef STATE_SUMMARY_CLEAN +#undef STATE_SUMMARY_SHOW +#undef STATE_MENU_SHOW_OPTIONS +#undef STATE_YESNO_SHOW_MONS +#undef STATE_CHOOSE_MONS_INVALID +#undef STATE_MENU_REINIT +#undef STATE_MENU_RESHOW + static void CreateFrontierFactorySelectableMons(u8 firstMonId) { u8 i, j = 0; u8 ivs = 0; u8 level = 0; - u8 happiness = 0; + u8 friendship = 0; u32 otId = 0; u8 battleMode = VarGet(VAR_FRONTIER_BATTLE_MODE); u8 lvlMode = gSaveBlock2Ptr->frontier.lvlMode; @@ -1702,20 +1758,20 @@ static void CreateFrontierFactorySelectableMons(u8 firstMonId) ivs, gFacilityTrainerMons[monId].evSpread, otId); - happiness = 0; + friendship = 0; for (j = 0; j < MAX_MON_MOVES; j++) SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monId].moves[j], j); - SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); + SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &friendship); SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]); } } -static void CreateTentFactorySelectableMons(u8 firstMonId) +static void CreateSlateportTentSelectableMons(u8 firstMonId) { u8 i, j; u8 ivs = 0; u8 level = 30; - u8 happiness = 0; + u8 friendship = 0; u32 otId = 0; gFacilityTrainerMons = gSlateportBattleTentMons; @@ -1732,10 +1788,10 @@ static void CreateTentFactorySelectableMons(u8 firstMonId) ivs, gFacilityTrainerMons[monId].evSpread, otId); - happiness = 0; + friendship = 0; for (j = 0; j < MAX_MON_MOVES; j++) SetMonMoveAvoidReturn(&sFactorySelectScreen->mons[i + firstMonId].monData, gFacilityTrainerMons[monId].moves[j], j); - SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &happiness); + SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_FRIENDSHIP, &friendship); SetMonData(&sFactorySelectScreen->mons[i + firstMonId].monData, MON_DATA_HELD_ITEM, &gBattleFrontierHeldItems[gFacilityTrainerMons[monId].itemTableId]); } } @@ -1744,7 +1800,7 @@ static void Select_CopyMonsToPlayerParty(void) { u8 i, j; - for (i = 0; i < 3; i++) + for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { for (j = 0; j < SELECTABLE_MONS_COUNT; j++) { @@ -1793,7 +1849,7 @@ static void Select_ShowYesNoOptions(void) Select_PrintYesNoOptions(); } -static void sub_819B958(u8 windowId) +static void Select_ErasePopupMenu(u8 windowId) { gSprites[sFactorySelectScreen->menuCursor1SpriteId].invisible = TRUE; gSprites[sFactorySelectScreen->menuCursor2SpriteId].invisible = TRUE; @@ -1804,9 +1860,9 @@ static void sub_819B958(u8 windowId) static void Select_PrintRentalPkmnString(void) { - FillWindowPixelBuffer(0, PIXEL_FILL(0)); - AddTextPrinterParameterized(0, 1, gText_RentalPkmn2, 2, 1, 0, NULL); - CopyWindowToVram(0, 3); + FillWindowPixelBuffer(SELECT_WIN_TITLE, PIXEL_FILL(0)); + AddTextPrinterParameterized(SELECT_WIN_TITLE, 1, gText_RentalPkmn2, 2, 1, 0, NULL); + CopyWindowToVram(SELECT_WIN_TITLE, 3); } static void Select_PrintMonSpecies(void) @@ -1815,19 +1871,19 @@ static void Select_PrintMonSpecies(void) u8 x; u8 monId = sFactorySelectScreen->cursorPos; - FillWindowPixelBuffer(1, PIXEL_FILL(0)); + FillWindowPixelBuffer(SELECT_WIN_SPECIES, PIXEL_FILL(0)); species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); StringCopy(gStringVar4, gSpeciesNames[species]); x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(1, 1, x, 1, sSpeciesNameTextColors, 0, gStringVar4); - CopyWindowToVram(1, 2); + AddTextPrinterParameterized3(SELECT_WIN_SPECIES, 1, x, 1, sSpeciesNameTextColors, 0, gStringVar4); + CopyWindowToVram(SELECT_WIN_SPECIES, 2); } static void Select_PrintSelectMonString(void) { const u8 *str = NULL; - FillWindowPixelBuffer(2, PIXEL_FILL(0)); + FillWindowPixelBuffer(SELECT_WIN_INFO, PIXEL_FILL(0)); if (sFactorySelectScreen->selectingMonsState == 1) str = gText_SelectFirstPkmn; else if (sFactorySelectScreen->selectingMonsState == 2) @@ -1837,46 +1893,46 @@ static void Select_PrintSelectMonString(void) else str = gText_TheseThreePkmnOkay; - AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL); - CopyWindowToVram(2, 2); + AddTextPrinterParameterized(SELECT_WIN_INFO, 1, str, 2, 5, 0, NULL); + CopyWindowToVram(SELECT_WIN_INFO, 2); } static void Select_PrintCantSelectSameMon(void) { - FillWindowPixelBuffer(2, PIXEL_FILL(0)); - AddTextPrinterParameterized(2, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL); - CopyWindowToVram(2, 2); + FillWindowPixelBuffer(SELECT_WIN_INFO, PIXEL_FILL(0)); + AddTextPrinterParameterized(SELECT_WIN_INFO, 1, gText_CantSelectSamePkmn, 2, 5, 0, NULL); + CopyWindowToVram(SELECT_WIN_INFO, 2); } static void Select_PrintMenuOptions(void) { u8 selectedId = sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].selectedId; - PutWindowTilemap(3); - FillWindowPixelBuffer(3, PIXEL_FILL(0)); - AddTextPrinterParameterized3(3, 1, 7, 1, sMenuOptionTextColors, 0, gText_Summary); + PutWindowTilemap(SELECT_WIN_OPTIONS); + FillWindowPixelBuffer(SELECT_WIN_OPTIONS, PIXEL_FILL(0)); + AddTextPrinterParameterized3(SELECT_WIN_OPTIONS, 1, 7, 1, sMenuOptionTextColors, 0, gText_Summary); if (selectedId != 0) - AddTextPrinterParameterized3(3, 1, 7, 17, sMenuOptionTextColors, 0, gText_Deselect); + AddTextPrinterParameterized3(SELECT_WIN_OPTIONS, 1, 7, 17, sMenuOptionTextColors, 0, gText_Deselect); else - AddTextPrinterParameterized3(3, 1, 7, 17, sMenuOptionTextColors, 0, gText_Rent); + AddTextPrinterParameterized3(SELECT_WIN_OPTIONS, 1, 7, 17, sMenuOptionTextColors, 0, gText_Rent); - AddTextPrinterParameterized3(3, 1, 7, 33, sMenuOptionTextColors, 0, gText_Others2); - CopyWindowToVram(3, 3); + AddTextPrinterParameterized3(SELECT_WIN_OPTIONS, 1, 7, 33, sMenuOptionTextColors, 0, gText_Others2); + CopyWindowToVram(SELECT_WIN_OPTIONS, 3); } static void Select_PrintYesNoOptions(void) { - PutWindowTilemap(4); - FillWindowPixelBuffer(4, PIXEL_FILL(0)); - AddTextPrinterParameterized3(4, 1, 7, 1, sMenuOptionTextColors, 0, gText_Yes2); - AddTextPrinterParameterized3(4, 1, 7, 17, sMenuOptionTextColors, 0, gText_No2); - CopyWindowToVram(4, 3); + PutWindowTilemap(SELECT_WIN_YES_NO); + FillWindowPixelBuffer(SELECT_WIN_YES_NO, PIXEL_FILL(0)); + AddTextPrinterParameterized3(SELECT_WIN_YES_NO, 1, 7, 1, sMenuOptionTextColors, 0, gText_Yes2); + AddTextPrinterParameterized3(SELECT_WIN_YES_NO, 1, 7, 17, sMenuOptionTextColors, 0, gText_No2); + CopyWindowToVram(SELECT_WIN_YES_NO, 3); } static u8 Select_RunMenuOptionFunc(void) { - gUnknown_030062E8 = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos]; - return gUnknown_030062E8(); + gFactorySelect_CurrentOptionFunc = sSelect_MenuOptionFuncs[sFactorySelectScreen->menuCursorPos]; + return gFactorySelect_CurrentOptionFunc(); } static u8 Select_OptionRentDeselect(void) @@ -1886,29 +1942,29 @@ static u8 Select_OptionRentDeselect(void) if (selectedId == 0 && !Select_AreSpeciesValid(monId)) { Select_PrintCantSelectSameMon(); - sub_819B958(3); - return 3; + Select_ErasePopupMenu(SELECT_WIN_OPTIONS); + return SELECT_INVALID_MON; } else { - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); + CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); Select_HandleMonSelectionChange(); Select_PrintSelectMonString(); - sub_819B958(3); - if (sFactorySelectScreen->selectingMonsState > 3) - return 2; + Select_ErasePopupMenu(SELECT_WIN_OPTIONS); + if (sFactorySelectScreen->selectingMonsState > FRONTIER_PARTY_SIZE) + return SELECT_CONFIRM_MONS; else - return 1; + return SELECT_CONTINUE_CHOOSING; } } -static u8 sub_819BC9C(void) +static u8 Select_DeclineChosenMons(void) { - sub_819C568(); + Select_HideChosenMons(); Select_HandleMonSelectionChange(); Select_PrintSelectMonString(); - sub_819B958(3); - if (sFactorySelectScreen->selectingMonsState > 3) + Select_ErasePopupMenu(SELECT_WIN_OPTIONS); + if (sFactorySelectScreen->selectingMonsState > FRONTIER_PARTY_SIZE) return 2; else return 1; @@ -1916,14 +1972,14 @@ static u8 sub_819BC9C(void) static u8 Select_OptionSummary(void) { - return 0; + return SELECT_SUMMARY; } static u8 Select_OptionOthers(void) { - sub_819F3F8(sFactorySelectScreen->unk294[1], &sFactorySelectScreen->unk2A0, FALSE); - sub_819B958(3); - return 1; + CloseMonPic(sFactorySelectScreen->monPics[1], &sFactorySelectScreen->monPicAnimating, FALSE); + Select_ErasePopupMenu(SELECT_WIN_OPTIONS); + return SELECT_CONTINUE_CHOOSING; } static void Select_PrintMonCategory(void) @@ -1934,17 +1990,17 @@ static void Select_PrintMonCategory(void) u8 monId = sFactorySelectScreen->cursorPos; if (monId < SELECTABLE_MONS_COUNT) { - PutWindowTilemap(5); - FillWindowPixelBuffer(5, PIXEL_FILL(0)); + PutWindowTilemap(SELECT_WIN_MON_CATEGORY); + FillWindowPixelBuffer(SELECT_WIN_MON_CATEGORY, PIXEL_FILL(0)); species = GetMonData(&sFactorySelectScreen->mons[monId].monData, MON_DATA_SPECIES, NULL); CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); x = GetStringRightAlignXOffset(1, text, 0x76); - AddTextPrinterParameterized(5, 1, text, x, 1, 0, NULL); - CopyWindowToVram(5, 2); + AddTextPrinterParameterized(SELECT_WIN_MON_CATEGORY, 1, text, x, 1, 0, NULL); + CopyWindowToVram(SELECT_WIN_MON_CATEGORY, 2); } } -static void Summary_ShowMonSprite(void) +static void Select_CreateMonSprite(void) { u8 monId = sFactorySelectScreen->cursorPos; struct Pokemon *mon = &sFactorySelectScreen->mons[monId].monData; @@ -1952,44 +2008,44 @@ static void Summary_ShowMonSprite(void) u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0; + sFactorySelectScreen->monPics[1].monSpriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); + gSprites[sFactorySelectScreen->monPics[1].monSpriteId].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->monPics[1].monSpriteId].centerToCornerVecY = 0; - sFactorySelectScreen->unk2A0 = FALSE; + sFactorySelectScreen->monPicAnimating = FALSE; } -static void sub_819BE20(bool8 arg0) +static void Select_SetMonPicAnimating(bool8 animating) { - sFactorySelectScreen->unk2A0 = arg0; + sFactorySelectScreen->monPicAnimating = animating; } -static void Select_ShowSummaryMonSprite(void) +static void Select_ReshowMonSprite(void) { struct Pokemon *mon; u16 species; u32 personality, otId; - sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1); - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 2); + sFactorySelectScreen->monPics[1].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 120, 64, 1); + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[1].bgSpriteId], 2); mon = &sFactorySelectScreen->mons[sFactorySelectScreen->cursorPos].monData; species = GetMonData(mon, MON_DATA_SPECIES, NULL); personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - sFactorySelectScreen->unk294[1].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->unk294[1].field0].centerToCornerVecY = 0; + sFactorySelectScreen->monPics[1].monSpriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); + gSprites[sFactorySelectScreen->monPics[1].monSpriteId].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->monPics[1].monSpriteId].centerToCornerVecY = 0; - gSprites[sFactorySelectScreen->unk294[1].field1].invisible = TRUE; + gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].invisible = TRUE; } -static void Select_ShowChosenMonsSprites(void) +static void Select_CreateChosenMonsSprites(void) { u8 i, j; - for (i = 0; i < 3; i++) + for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { for (j = 0; j < SELECTABLE_MONS_COUNT; j++) { @@ -2000,66 +2056,80 @@ static void Select_ShowChosenMonsSprites(void) u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - sFactorySelectScreen->unk294[i].field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF); - gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecX = 0; - gSprites[sFactorySelectScreen->unk294[i].field0].centerToCornerVecY = 0; + sFactorySelectScreen->monPics[i].monSpriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, (i * 72) + 16, 32, i + 13, 0xFFFF); + gSprites[sFactorySelectScreen->monPics[i].monSpriteId].centerToCornerVecX = 0; + gSprites[sFactorySelectScreen->monPics[i].monSpriteId].centerToCornerVecY = 0; break; } } } - sFactorySelectScreen->unk2A0 = FALSE; + sFactorySelectScreen->monPicAnimating = FALSE; } -static void sub_819C040(struct Sprite *sprite) +static void SpriteCB_OpenChosenMonPics(struct Sprite *sprite) { u8 taskId; + // Current sprite is monPics[1] if (sprite->affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded) + && gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].affineAnimEnded + && gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].affineAnimEnded) { sprite->invisible = TRUE; - gSprites[sFactorySelectScreen->unk294[0].field1].invisible = TRUE; - gSprites[sFactorySelectScreen->unk294[2].field1].invisible = TRUE; + gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].invisible = TRUE; + gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].invisible = TRUE; - taskId = CreateTask(sub_819C1D0, 1); + taskId = CreateTask(Select_Task_OpenChosenMonPics, 1); gTasks[taskId].func(taskId); sprite->callback = SpriteCallbackDummy; } } -static void sub_819C100(struct Sprite *sprite) +static void SpriteCB_CloseChosenMonPics(struct Sprite *sprite) { + // Current sprite is monPics[1] if (sprite->affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[0].field1].affineAnimEnded - && gSprites[sFactorySelectScreen->unk294[2].field1].affineAnimEnded) + && gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].affineAnimEnded + && gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].affineAnimEnded) { FreeOamMatrix(sprite->oam.matrixNum); - FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[0].field1].oam.matrixNum); - FreeOamMatrix(gSprites[sFactorySelectScreen->unk294[2].field1].oam.matrixNum); + FreeOamMatrix(gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].oam.matrixNum); + FreeOamMatrix(gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].oam.matrixNum); - sFactorySelectScreen->unk2A0 = FALSE; + sFactorySelectScreen->monPicAnimating = FALSE; - DestroySprite(&gSprites[sFactorySelectScreen->unk294[0].field1]); - DestroySprite(&gSprites[sFactorySelectScreen->unk294[2].field1]); + DestroySprite(&gSprites[sFactorySelectScreen->monPics[0].bgSpriteId]); + DestroySprite(&gSprites[sFactorySelectScreen->monPics[2].bgSpriteId]); DestroySprite(sprite); } } -static void sub_819C1D0(u8 taskId) +// Task data for Select_Task_OpenChosenMonPics, Select_Task_CloseChosenMonPics, Task_CloseMonPic, and Task_OpenMonPic +#define tWinLeft data[3] +#ifndef UBFIX +#define tWinRight data[24] // UB: Typo? Likely meant data[4], 24 is out of bounds +#else +#define tWinRight data[4] +#endif +#define tWinTop data[5] +#define tWinBottom data[8] +#define tSpriteId data[6] // TODO: Clarify, what sprite +#define tIsSwapScreen data[7] + +static void Select_Task_OpenChosenMonPics(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: - task->data[3] = 16; - task->data[24] = 224; // BUG: writing outside the array's bounds. - task->data[5] = 64; - task->data[8] = 65; + task->tWinLeft = 16; + task->tWinRight = DISPLAY_WIDTH - 16; + task->tWinTop = 64; + task->tWinBottom = 65; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWinLeft, task->tWinRight)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); break; @@ -2069,97 +2139,97 @@ static void sub_819C1D0(u8 taskId) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); break; case 2: - task->data[5] -= 4; - task->data[8] += 4; - if (task->data[5] <= 32 || task->data[8] >= 96) + task->tWinTop -= 4; + task->tWinBottom += 4; + if (task->tWinTop <= 32 || task->tWinBottom >= 96) { - task->data[5] = 32; - task->data[8] = 96; + task->tWinTop = 32; + task->tWinBottom = 96; ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] != 32) + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); + if (task->tWinTop != 32) return; break; default: DestroyTask(taskId); - Select_ShowChosenMonsSprites(); + Select_CreateChosenMonsSprites(); return; } - task->data[0]++; + task->tState++; } -static void sub_819C2D4(u8 taskId) +static void Select_Task_CloseChosenMonPics(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { - default: - HideBg(3); - gSprites[sFactorySelectScreen->unk294[1].field1].invisible = FALSE; - gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C100; - gSprites[sFactorySelectScreen->unk294[0].field1].invisible = FALSE; - gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy; - gSprites[sFactorySelectScreen->unk294[2].field1].invisible = FALSE; - gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy; - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[1].field1], 1); - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[0].field1], 1); - StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->unk294[2].field1], 1); - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - DestroyTask(taskId); - break; case 0: - task->data[3] = 16; - task->data[24] = 224; // BUG: writing outside the array's bounds. - task->data[5] = 32; - task->data[8] = 96; + task->tWinLeft = 16; + task->tWinRight = DISPLAY_WIDTH - 16; + task->tWinTop = 32; + task->tWinBottom = 96; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWinLeft, task->tWinRight)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); - task->data[0]++; + task->tState++; break; case 1: - task->data[5] += 4; - task->data[8] -= 4; - if (task->data[5] >= 64 || task->data[8] <= 65) + task->tWinTop += 4; + task->tWinBottom -= 4; + if (task->tWinTop >= 64 || task->tWinBottom <= 65) { - task->data[5] = 64; - task->data[8] = 65; + task->tWinTop = 64; + task->tWinBottom = 65; } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] == 64) - task->data[0]++; + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); + if (task->tWinTop == 64) + task->tState++; + break; + default: + HideBg(3); + gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].invisible = FALSE; + gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].callback = SpriteCB_CloseChosenMonPics; + gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].invisible = FALSE; + gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].callback = SpriteCallbackDummy; + gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].invisible = FALSE; + gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].callback = SpriteCallbackDummy; + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[1].bgSpriteId], 1); + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[0].bgSpriteId], 1); + StartSpriteAffineAnim(&gSprites[sFactorySelectScreen->monPics[2].bgSpriteId], 1); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + DestroyTask(taskId); break; } } -static void sub_819C4B4(void) +static void Select_ShowChosenMons(void) { - sFactorySelectScreen->unk294[1].field1 = CreateSprite(&gUnknown_08610638, 120, 64, 1); - sFactorySelectScreen->unk294[0].field1 = CreateSprite(&gUnknown_08610638, 44, 64, 1); - sFactorySelectScreen->unk294[2].field1 = CreateSprite(&gUnknown_08610638, 196, 64, 1); + sFactorySelectScreen->monPics[1].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 120, 64, 1); + sFactorySelectScreen->monPics[0].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 44, 64, 1); + sFactorySelectScreen->monPics[2].bgSpriteId = CreateSprite(&sSpriteTemplate_Select_MonPicBgAnim, 196, 64, 1); - gSprites[sFactorySelectScreen->unk294[1].field1].callback = sub_819C040; - gSprites[sFactorySelectScreen->unk294[0].field1].callback = SpriteCallbackDummy; - gSprites[sFactorySelectScreen->unk294[2].field1].callback = SpriteCallbackDummy; + gSprites[sFactorySelectScreen->monPics[1].bgSpriteId].callback = SpriteCB_OpenChosenMonPics; + gSprites[sFactorySelectScreen->monPics[0].bgSpriteId].callback = SpriteCallbackDummy; + gSprites[sFactorySelectScreen->monPics[2].bgSpriteId].callback = SpriteCallbackDummy; - sFactorySelectScreen->unk2A0 = TRUE; + sFactorySelectScreen->monPicAnimating = TRUE; } -static void sub_819C568(void) +static void Select_HideChosenMons(void) { u8 taskId; - FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[0].field0); - FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[1].field0); - FreeAndDestroyMonPicSprite(sFactorySelectScreen->unk294[2].field0); + FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[0].monSpriteId); + FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[1].monSpriteId); + FreeAndDestroyMonPicSprite(sFactorySelectScreen->monPics[2].monSpriteId); - taskId = CreateTask(sub_819C2D4, 1); + taskId = CreateTask(Select_Task_CloseChosenMonPics, 1); gTasks[taskId].func(taskId); - sFactorySelectScreen->unk2A0 = TRUE; + sFactorySelectScreen->monPicAnimating = TRUE; } static void Select_SetWinRegs(s16 mWin0H, s16 nWin0H, s16 mWin0V, s16 nWin0V) @@ -2190,60 +2260,59 @@ static bool32 Select_AreSpeciesValid(u16 monId) } } } - return TRUE; } -static void Task_SelectFadeSpeciesName(u8 taskId) +static void Select_Task_FadeSpeciesName(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 0: - sFactorySelectScreen->unk2A7 = 0; - sFactorySelectScreen->unk2A8 = 0; - sFactorySelectScreen->unk2A6 = TRUE; - gTasks[taskId].data[0] = 1; + case FADESTATE_INIT: + sFactorySelectScreen->fadeSpeciesNameCoeffDelay = 0; + sFactorySelectScreen->fadeSpeciesNameCoeff = 0; + sFactorySelectScreen->fadeSpeciesNameFadeOut = TRUE; + gTasks[taskId].tState = FADESTATE_RUN; break; - case 1: - if (sFactorySelectScreen->unk2A2) + case FADESTATE_RUN: + if (sFactorySelectScreen->fadeSpeciesNameActive) { - if (sFactorySelectScreen->unk2A9) + if (sFactorySelectScreen->faceSpeciesNameDelay) { - gTasks[taskId].data[0] = 2; + gTasks[taskId].tState = FADESTATE_DELAY; } else { - sFactorySelectScreen->unk2A7++; - if (sFactorySelectScreen->unk2A7 > 6) + sFactorySelectScreen->fadeSpeciesNameCoeffDelay++; + if (sFactorySelectScreen->fadeSpeciesNameCoeffDelay > 6) { - sFactorySelectScreen->unk2A7 = 0; - if (!sFactorySelectScreen->unk2A6) - sFactorySelectScreen->unk2A8--; + sFactorySelectScreen->fadeSpeciesNameCoeffDelay = 0; + if (!sFactorySelectScreen->fadeSpeciesNameFadeOut) + sFactorySelectScreen->fadeSpeciesNameCoeff--; else - sFactorySelectScreen->unk2A8++; + sFactorySelectScreen->fadeSpeciesNameCoeff++; } - BlendPalettes(0x4000, sFactorySelectScreen->unk2A8, 0); - if (sFactorySelectScreen->unk2A8 > 5) + BlendPalettes(0x4000, sFactorySelectScreen->fadeSpeciesNameCoeff, 0); + if (sFactorySelectScreen->fadeSpeciesNameCoeff > 5) { - sFactorySelectScreen->unk2A6 = FALSE; + sFactorySelectScreen->fadeSpeciesNameFadeOut = FALSE; } - else if (sFactorySelectScreen->unk2A8 == 0) + else if (sFactorySelectScreen->fadeSpeciesNameCoeff == 0) { - gTasks[taskId].data[0] = 2; - sFactorySelectScreen->unk2A6 = TRUE; + gTasks[taskId].tState = FADESTATE_DELAY; + sFactorySelectScreen->fadeSpeciesNameFadeOut = TRUE; } } } break; - case 2: - if (sFactorySelectScreen->unk2A9 > 14) + case FADESTATE_DELAY: + if (sFactorySelectScreen->faceSpeciesNameDelay > 14) { - sFactorySelectScreen->unk2A9 = 0; - gTasks[taskId].data[0] = 1; + sFactorySelectScreen->faceSpeciesNameDelay = 0; + gTasks[taskId].tState = FADESTATE_RUN; } else { - sFactorySelectScreen->unk2A9++; + sFactorySelectScreen->faceSpeciesNameDelay++; } break; } @@ -2269,233 +2338,257 @@ static void Swap_VblankCb(void) static void CopySwappedMonData(void) { - u8 happiness; + u8 friendship; gPlayerParty[sFactorySwapScreen->playerMonId] = gEnemyParty[sFactorySwapScreen->enemyMonId]; - happiness = 0; - SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &happiness); - gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->enemyMonId + 3].monId; - gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->enemyMonId + 3].ivs; + friendship = 0; + SetMonData(&gPlayerParty[sFactorySwapScreen->playerMonId], MON_DATA_FRIENDSHIP, &friendship); + gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->playerMonId].monId = gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->enemyMonId + FRONTIER_PARTY_SIZE].monId; + gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->playerMonId].ivs = gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->enemyMonId + FRONTIER_PARTY_SIZE].ivs; gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->playerMonId].personality = GetMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId], MON_DATA_PERSONALITY, NULL); gSaveBlock2Ptr->frontier.rentalMons[sFactorySwapScreen->playerMonId].abilityNum = GetBoxMonData(&gEnemyParty[sFactorySwapScreen->enemyMonId].box, MON_DATA_ABILITY_NUM, NULL); } -static void Task_FromSwapScreenToSummaryScreen(u8 taskId) -{ - switch (gTasks[taskId].data[0]) +// Main swap states +// States for the main tasks of the Swap_ functions after initialization, including: +// Swap_Task_OpenSummaryScreen, Swap_Task_HandleYesNo, Swap_Task_HandleMenu, and Swap_Task_HandleChooseMons +// Tasks sharing states was unnecessary, see "Main select states" +#define STATE_CHOOSE_MONS_INIT 0 +#define STATE_CHOOSE_MONS_HANDLE_INPUT 1 +#define STATE_MENU_INIT 2 +#define STATE_MENU_HANDLE_INPUT 3 +#define STATE_YESNO_SHOW 4 +#define STATE_YESNO_HANDLE_INPUT 5 +#define STATE_SUMMARY_FADE 6 +#define STATE_SUMMARY_CLEAN 7 +#define STATE_SUMMARY_SHOW 8 +#define STATE_MENU_SHOW_OPTIONS 9 + +static void Swap_Task_OpenSummaryScreen(u8 taskId) +{ + switch (gTasks[taskId].tState) { - case 6: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].data[0] = 7; + case STATE_SUMMARY_FADE: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].tState = STATE_SUMMARY_CLEAN; break; - case 7: + case STATE_SUMMARY_CLEAN: if (!gPaletteFade.active) { DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); - sub_819F444(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30); + HideMonPic(sFactorySwapScreen->monPic, &sFactorySwapScreen->monPicAnimating); Swap_DestroyAllSprites(); FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer); + FREE_AND_SET_NULL(sSwapMonPicBgTilesetBuffer); FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer); + FREE_AND_SET_NULL(sSwapMonPicBgTilemapBuffer); FreeAllWindowBuffers(); - gTasks[taskId].data[0] = 8; + gTasks[taskId].tState = STATE_SUMMARY_SHOW; } break; - case 8: + case STATE_SUMMARY_SHOW: DestroyTask(taskId); sFactorySwapScreen->fromSummaryScreen = TRUE; - sFactorySwapScreen->unk24 = gPlttBufferUnfaded[244]; - ShowPokemonSummaryScreen(0, gPlayerParty, sFactorySwapScreen->cursorPos, 3 - 1, CB2_InitSwapScreen); + sFactorySwapScreen->speciesNameColorBackup = gPlttBufferUnfaded[244]; + ShowPokemonSummaryScreen(SUMMARY_MODE_NORMAL, gPlayerParty, sFactorySwapScreen->cursorPos, FRONTIER_PARTY_SIZE - 1, CB2_InitSwapScreen); break; } } -static void Task_CloseSwapScreen(u8 taskId) +static void Swap_Task_Exit(u8 taskId) { - if (sFactorySwapScreen->unk30 != TRUE) + if (sFactorySwapScreen->monPicAnimating == TRUE) + return; + + switch (gTasks[taskId].tState) { - switch (gTasks[taskId].data[0]) + case 0: + // Set return value for script + // TRUE if player kept their current pokemon + if (sFactorySwapScreen->monSwapped == TRUE) { - case 0: - if (sFactorySwapScreen->monSwapped == TRUE) - { - gTasks[taskId].data[0]++; - gSpecialVar_Result = 0; - } - else - { - gTasks[taskId].data[0] = 2; - gSpecialVar_Result = 1; - } - break; - case 1: - if (sFactorySwapScreen->monSwapped == TRUE) - { - sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos; - CopySwappedMonData(); - } - gTasks[taskId].data[0]++; - break; - case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].data[0]++; - break; - case 3: - if (!UpdatePaletteFade()) - { - DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); - Swap_DestroyAllSprites(); - FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilesetBuffer); - FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); - FREE_AND_SET_NULL(sSwapMonCardBgTilemapBuffer); - FREE_AND_SET_NULL(sFactorySwapScreen); - FreeAllWindowBuffers(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); - DestroyTask(taskId); - } - break; + gTasks[taskId].tState++; + gSpecialVar_Result = FALSE; + } + else + { + gTasks[taskId].tState = 2; + gSpecialVar_Result = TRUE; + } + break; + case 1: + if (sFactorySwapScreen->monSwapped == TRUE) + { + sFactorySwapScreen->enemyMonId = sFactorySwapScreen->cursorPos; + CopySwappedMonData(); + } + gTasks[taskId].tState++; + break; + case 2: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].tState++; + break; + case 3: + if (!UpdatePaletteFade()) + { + DestroyTask(sFactorySwapScreen->fadeSpeciesNameTaskId); + Swap_DestroyAllSprites(); + FREE_AND_SET_NULL(sSwapMenuTilesetBuffer); + FREE_AND_SET_NULL(sSwapMonPicBgTilesetBuffer); + FREE_AND_SET_NULL(sSwapMenuTilemapBuffer); + FREE_AND_SET_NULL(sSwapMonPicBgTilemapBuffer); + FREE_AND_SET_NULL(sFactorySwapScreen); + FreeAllWindowBuffers(); + SetMainCallback2(CB2_ReturnToFieldContinueScript); + DestroyTask(taskId); } + break; } } -static void Task_HandleSwapScreenYesNo(u8 taskId) +#define tSaidYes data[1] +#define tFollowUpTaskState data[5] +#define tFollowUpTaskPtrHi data[6] +#define tFollowUpTaskPtrLo data[7] + +static void Swap_Task_HandleYesNo(u8 taskId) { u16 loPtr, hiPtr; - if (sFactorySwapScreen->unk30 != TRUE) + if (sFactorySwapScreen->monPicAnimating == TRUE) + return; + + switch (gTasks[taskId].tState) { - switch (gTasks[taskId].data[0]) + case STATE_YESNO_SHOW: + Swap_ShowYesNoOptions(); + gTasks[taskId].tState = STATE_YESNO_HANDLE_INPUT; + break; + case STATE_YESNO_HANDLE_INPUT: + if (JOY_NEW(A_BUTTON)) { - case 4: - Swap_ShowYesNoOptions(); - gTasks[taskId].data[0] = 5; - break; - case 5: - if (JOY_NEW(A_BUTTON)) - { - PlaySE(SE_SELECT); - if (sFactorySwapScreen->yesNoCursorPos == 0) - { - gTasks[taskId].data[1] = 1; - hiPtr = gTasks[taskId].data[6]; - loPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); - } - else - { - gTasks[taskId].data[1] = 0; - sub_819EA64(4); - hiPtr = gTasks[taskId].data[6]; - loPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); - } - } - else if (JOY_NEW(B_BUTTON)) + PlaySE(SE_SELECT); + if (sFactorySwapScreen->yesNoCursorPos == 0) { - PlaySE(SE_SELECT); - gTasks[taskId].data[1] = 0; - sub_819EA64(4); - hiPtr = gTasks[taskId].data[6]; - loPtr = gTasks[taskId].data[7]; + // Selected Yes + gTasks[taskId].tSaidYes = TRUE; + hiPtr = gTasks[taskId].tFollowUpTaskPtrHi; + loPtr = gTasks[taskId].tFollowUpTaskPtrLo; gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); } - else if (JOY_REPEAT(DPAD_UP)) - { - PlaySE(SE_SELECT); - Swap_UpdateYesNoCursorPosition(-1); - } - else if (JOY_REPEAT(DPAD_DOWN)) + else { - PlaySE(SE_SELECT); - Swap_UpdateYesNoCursorPosition(1); + // Selected No + gTasks[taskId].tSaidYes = FALSE; + Swap_ErasePopupMenu(SWAP_WIN_YES_NO); + hiPtr = gTasks[taskId].tFollowUpTaskPtrHi; + loPtr = gTasks[taskId].tFollowUpTaskPtrLo; + gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); } - break; } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + gTasks[taskId].tSaidYes = FALSE; + Swap_ErasePopupMenu(SWAP_WIN_YES_NO); + hiPtr = gTasks[taskId].tFollowUpTaskPtrHi; + loPtr = gTasks[taskId].tFollowUpTaskPtrLo; + gTasks[taskId].func = (void*)((hiPtr << 16) | loPtr); + } + else if (JOY_REPEAT(DPAD_UP)) + { + PlaySE(SE_SELECT); + Swap_UpdateYesNoCursorPosition(-1); + } + else if (JOY_REPEAT(DPAD_DOWN)) + { + PlaySE(SE_SELECT); + Swap_UpdateYesNoCursorPosition(1); + } + break; } } -static void sub_819CBDC(u8 taskId) +static void Swap_HandleQuitSwappingResposne(u8 taskId) { - if (gTasks[taskId].data[1] == 1) + if (gTasks[taskId].tSaidYes == TRUE) { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_CloseSwapScreen; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Swap_Task_Exit; } else { - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_HandleChooseMons) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_HandleChooseMons); + gTasks[taskId].tFollowUpTaskState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionIn; } } -static void sub_819CC24(u8 taskId) +static void Swap_AskQuitSwapping(u8 taskId) { - if (gTasks[taskId].data[0] == 0) + if (gTasks[taskId].tState == 0) { Swap_PrintOnInfoWindow(gText_QuitSwapping); sFactorySwapScreen->monSwapped = FALSE; - gTasks[taskId].data[0] = 4; - gTasks[taskId].data[6] = (u32)(sub_819CBDC) >> 16; - gTasks[taskId].data[7] = (u32)(sub_819CBDC); - gTasks[taskId].func = Task_HandleSwapScreenYesNo; + gTasks[taskId].tState = STATE_YESNO_SHOW; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_HandleQuitSwappingResposne) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_HandleQuitSwappingResposne); + gTasks[taskId].func = Swap_Task_HandleYesNo; } } -static void sub_819CC74(u8 taskId) +static void Swap_HandleAcceptMonResponse(u8 taskId) { - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - if (gTasks[taskId].data[1] == 1) + CloseMonPic(sFactorySwapScreen->monPic, &sFactorySwapScreen->monPicAnimating, TRUE); + if (gTasks[taskId].tSaidYes == TRUE) { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_CloseSwapScreen; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Swap_Task_Exit; } else { - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_HandleChooseMons) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_HandleChooseMons); + gTasks[taskId].tFollowUpTaskState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionIn; } } -static void sub_819CCD4(u8 taskId) +static void Swap_AskAcceptMon(u8 taskId) { - if (gTasks[taskId].data[0] == 0) + if (gTasks[taskId].tState == 0) { - sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); + OpenMonPic(&sFactorySwapScreen->monPic.bgSpriteId, &sFactorySwapScreen->monPicAnimating, TRUE); Swap_PrintOnInfoWindow(gText_AcceptThisPkmn); sFactorySwapScreen->monSwapped = TRUE; - gTasks[taskId].data[0] = 4; - gTasks[taskId].data[6] = (u32)(sub_819CC74) >> 16; - gTasks[taskId].data[7] = (u32)(sub_819CC74); - gTasks[taskId].func = Task_HandleSwapScreenYesNo; + gTasks[taskId].tState = STATE_YESNO_SHOW; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_HandleAcceptMonResponse) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_HandleAcceptMonResponse); + gTasks[taskId].func = Swap_Task_HandleYesNo; } } -static void Task_HandleSwapScreenMenu(u8 taskId) +static void Swap_Task_HandleMenu(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 2: + case STATE_MENU_INIT: if (!sFactorySwapScreen->fromSummaryScreen) - sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); - gTasks[taskId].data[0] = 9; + OpenMonPic(&sFactorySwapScreen->monPic.bgSpriteId, &sFactorySwapScreen->monPicAnimating, TRUE); + gTasks[taskId].tState = STATE_MENU_SHOW_OPTIONS; break; - case 9: - if (sFactorySwapScreen->unk30 != TRUE) + case STATE_MENU_SHOW_OPTIONS: + if (sFactorySwapScreen->monPicAnimating != TRUE) { Swap_ShowMenuOptions(); - gTasks[taskId].data[0] = 3; + gTasks[taskId].tState = STATE_MENU_HANDLE_INPUT; } break; - case 3: - if (sFactorySwapScreen->unk30 != TRUE) + case STATE_MENU_HANDLE_INPUT: + if (sFactorySwapScreen->monPicAnimating != TRUE) { if (JOY_NEW(A_BUTTON)) { @@ -2505,13 +2598,13 @@ static void Task_HandleSwapScreenMenu(u8 taskId) else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - sub_819EA64(3); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 16; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; + CloseMonPic(sFactorySwapScreen->monPic, &sFactorySwapScreen->monPicAnimating, TRUE); + Swap_ErasePopupMenu(SWAP_WIN_OPTIONS); + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_HandleChooseMons) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_HandleChooseMons); + gTasks[taskId].tFollowUpTaskState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionIn; } else if (JOY_REPEAT(DPAD_UP)) { @@ -2526,37 +2619,40 @@ static void Task_HandleSwapScreenMenu(u8 taskId) } } -static void Task_HandleSwapScreenChooseMons(u8 taskId) +// Handles input on the two main swap screens (choosing a current pokeon to get rid of, and choosing a new pokemon to receive) +static void Swap_Task_HandleChooseMons(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 0: + case STATE_CHOOSE_MONS_INIT: if (!gPaletteFade.active) { - sFactorySwapScreen->unk22 = TRUE; - gTasks[taskId].data[0] = 1; + sFactorySwapScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = STATE_CHOOSE_MONS_HANDLE_INPUT; } break; - case 1: + case STATE_CHOOSE_MONS_HANDLE_INPUT: if (JOY_NEW(A_BUTTON)) { + // Run whatever action is currently selected (a pokeball, the Cancel button, etc.) PlaySE(SE_SELECT); - sFactorySwapScreen->unk22 = FALSE; - Swap_PrintMonSpecies2(); - sub_819EAC0(); + sFactorySwapScreen->fadeSpeciesNameActive = FALSE; + Swap_PrintMonSpeciesAtFade(); + Swap_EraseSpeciesWindow(); Swap_RunActionFunc(taskId); } else if (JOY_NEW(B_BUTTON)) { + // Ask if player wants to quit swapping PlaySE(SE_SELECT); - sFactorySwapScreen->unk22 = FALSE; - Swap_PrintMonSpecies2(); - sub_819EAC0(); - gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 16; - gTasks[taskId].data[7] = (u32)(sub_819CC24); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[5] = 0; - gTasks[taskId].func = sub_819D588; + sFactorySwapScreen->fadeSpeciesNameActive = FALSE; + Swap_PrintMonSpeciesAtFade(); + Swap_EraseSpeciesWindow(); + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_AskQuitSwapping) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_AskQuitSwapping); + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskState = 0; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionOut; } else if (JOY_REPEAT(DPAD_LEFT)) { @@ -2586,116 +2682,121 @@ static void Task_HandleSwapScreenChooseMons(u8 taskId) } } -static void Task_SwapFadeSpeciesName(u8 taskId) +static void Swap_Task_FadeSpeciesName(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 0: - sFactorySwapScreen->unk27 = 0; - sFactorySwapScreen->unk28 = 0; - sFactorySwapScreen->unk26 = TRUE; - gTasks[taskId].data[0] = 1; + case FADESTATE_INIT: + sFactorySwapScreen->fadeSpeciesNameCoeffDelay = 0; + sFactorySwapScreen->fadeSpeciesNameCoeff = 0; + sFactorySwapScreen->fadeSpeciesNameFadeOut = TRUE; + gTasks[taskId].tState = FADESTATE_RUN; break; - case 1: - if (sFactorySwapScreen->unk22) + case FADESTATE_RUN: + if (sFactorySwapScreen->fadeSpeciesNameActive) { - if (sFactorySwapScreen->unk29) + if (sFactorySwapScreen->faceSpeciesNameDelay) { - gTasks[taskId].data[0] = 2; + gTasks[taskId].tState = FADESTATE_DELAY; } else { - sFactorySwapScreen->unk27++; - if (sFactorySwapScreen->unk27 > 6) + sFactorySwapScreen->fadeSpeciesNameCoeffDelay++; + if (sFactorySwapScreen->fadeSpeciesNameCoeffDelay > 6) { - sFactorySwapScreen->unk27 = 0; - if (!sFactorySwapScreen->unk26) - sFactorySwapScreen->unk28--; + sFactorySwapScreen->fadeSpeciesNameCoeffDelay = 0; + if (!sFactorySwapScreen->fadeSpeciesNameFadeOut) + sFactorySwapScreen->fadeSpeciesNameCoeff--; else - sFactorySwapScreen->unk28++; + sFactorySwapScreen->fadeSpeciesNameCoeff++; } - BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0); - if (sFactorySwapScreen->unk28 > 5) + BlendPalettes(0x4000, sFactorySwapScreen->fadeSpeciesNameCoeff, 0); + if (sFactorySwapScreen->fadeSpeciesNameCoeff > 5) { - sFactorySwapScreen->unk26 = FALSE; + sFactorySwapScreen->fadeSpeciesNameFadeOut = FALSE; } - else if (sFactorySwapScreen->unk28 == 0) + else if (sFactorySwapScreen->fadeSpeciesNameCoeff == 0) { - gTasks[taskId].data[0] = 2; - sFactorySwapScreen->unk26 = TRUE; + gTasks[taskId].tState = FADESTATE_DELAY; + sFactorySwapScreen->fadeSpeciesNameFadeOut = TRUE; } } } break; - case 2: - if (sFactorySwapScreen->unk29 > 14) + case FADESTATE_DELAY: + if (sFactorySwapScreen->faceSpeciesNameDelay > 14) { - sFactorySwapScreen->unk29 = 0; - gTasks[taskId].data[0] = 1; + sFactorySwapScreen->faceSpeciesNameDelay = 0; + gTasks[taskId].tState = FADESTATE_RUN; } else { - sFactorySwapScreen->unk29++; + sFactorySwapScreen->faceSpeciesNameDelay++; } break; } } -static void Task_SwapFadeSpeciesName2(u8 taskId) +#define tFadeOutFinished data[4] + +static void Swap_Task_FadeOutSpeciesName(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - sFactorySwapScreen->unk27 = 0; - gTasks[taskId].data[4] = 0; - gTasks[taskId].data[0]++; + sFactorySwapScreen->fadeSpeciesNameCoeffDelay = 0; + gTasks[taskId].tFadeOutFinished = FALSE; + gTasks[taskId].tState++; break; case 1: LoadPalette(&gPlttBufferUnfaded[0xF0], 0xE0, 0xA); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 2: - if (sFactorySwapScreen->unk28 > 15) + if (sFactorySwapScreen->fadeSpeciesNameCoeff > 15) { - gTasks[taskId].data[4] = 1; - gTasks[taskId].data[0]++; + gTasks[taskId].tFadeOutFinished = TRUE; + gTasks[taskId].tState++; } - sFactorySwapScreen->unk27++; - if (sFactorySwapScreen->unk27 > 3) + sFactorySwapScreen->fadeSpeciesNameCoeffDelay++; + if (sFactorySwapScreen->fadeSpeciesNameCoeffDelay > 3) { - sFactorySwapScreen->unk27 = 0; + sFactorySwapScreen->fadeSpeciesNameCoeffDelay = 0; gPlttBufferUnfaded[244] = gPlttBufferFaded[228]; - sFactorySwapScreen->unk28++; + sFactorySwapScreen->fadeSpeciesNameCoeff++; } - BlendPalettes(0x4000, sFactorySwapScreen->unk28, 0); + BlendPalettes(0x4000, sFactorySwapScreen->fadeSpeciesNameCoeff, 0); break; } } -static void sub_819D12C(u8 taskId) +// Slide current pokeballs offscreen to the right and new pokeballs onscreen from +// the left during transition between player's/enemy's party screens +#define tBallCycled(i) data[(i) + 1] +static void Swap_Task_SlideCycleBalls(u8 taskId) { s8 i; - u8 var_2C; - bool8 destroyTask; + u8 lastX; + bool8 finished; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[0] = 1; + gTasks[taskId].tBallCycled(0) = FALSE; + gTasks[taskId].tBallCycled(1) = FALSE; + gTasks[taskId].tBallCycled(2) = FALSE; + gTasks[taskId].tState = 1; break; case 1: - var_2C = 0; - for (i = 2; i >= 0; i--) + lastX = 0; + for (i = FRONTIER_PARTY_SIZE - 1; i >= 0; i--) { - if (i != 2) + if (i != FRONTIER_PARTY_SIZE - 1) { - u8 posX = var_2C - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; - if (posX == 16 || gTasks[taskId].data[i + 2] == 1) + u8 posX = lastX - gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + if (posX == 16 || gTasks[taskId].tBallCycled(i + 1) == TRUE) { - var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + lastX = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10; } else if (posX > 16) @@ -2705,402 +2806,449 @@ static void sub_819D12C(u8 taskId) } else { - var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + lastX = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x += 10; } - if (gTasks[taskId].data[i + 1] == 1) + if (gTasks[taskId].tBallCycled(i) == TRUE) { + // New ball coming in from left, check if it has reached dest if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x > (i * 48) + 72) { + // Overshot dest, set x and finish gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = (i * 48) + 72; - destroyTask = TRUE; + finished = TRUE; } else if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x == (i * 48) + 72) { - destroyTask = TRUE; + finished = TRUE; } else { - destroyTask = FALSE; + finished = FALSE; } } else { - destroyTask = FALSE; + finished = FALSE; } - if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > 240) + if (gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x - 16 > DISPLAY_WIDTH) { - var_2C = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; + // Ball is offscreen right, cycle its palette and move to left side of screen + lastX = gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x; gSprites[sFactorySwapScreen->ballSpriteIds[i]].pos1.x = -16; if (sFactorySwapScreen->inEnemyScreen == TRUE) - gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_SELECTED); + gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(PALTAG_BALL_SELECTED); else - gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(TAG_PAL_BALL_GREY); + gSprites[sFactorySwapScreen->ballSpriteIds[i]].oam.paletteNum = IndexOfSpritePaletteTag(PALTAG_BALL_GRAY); - gTasks[taskId].data[i + 1] = 1; + gTasks[taskId].tBallCycled(i) = TRUE; } } - if (destroyTask == TRUE) + if (finished == TRUE) DestroyTask(taskId); break; } } -static void sub_819D324(u8 taskId) +// For sliding the action buttons (Cancel, Pkmn for Swap) on/off screen + +#define SLIDE_BUTTON_PKMN 0 +#define SLIDE_BUTTON_CANCEL 1 + +#define tTaskId data[1] +#define tSlidingOn data[2] +#define tXIncrement data[3] + +// Data to be used by the task that creates this task +#define tSecondSlideDelay data[2] +#define tSlideFinishedPkmn data[3] +#define tSlideFinishedCancel data[4] + +static void Swap_Task_SlideButtonOnOffScreen(u8 taskId) { u8 i, j; s32 posX = 0; - s8 r4 = gTasks[taskId].data[3]; - bool8 r1; + s8 deltaX = gTasks[taskId].tXIncrement; + bool8 sliding; s16 currPosX; - u8 taskId2; + u8 prevTaskId; - if (gTasks[taskId].data[2] == 1) - r4 *= -1; + if (gTasks[taskId].tSlidingOn == TRUE) + deltaX *= -1; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 0: - currPosX = gSprites[sFactorySwapScreen->unk8[0][0]].pos1.x; - if (!gTasks[taskId].data[2]) + case SLIDE_BUTTON_PKMN: + currPosX = gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][0]].pos1.x; + if (!gTasks[taskId].tSlidingOn) { - if (currPosX + r4 < 240) + // Sliding "Pkmn for Swap" offscreen + if (currPosX + deltaX < DISPLAY_WIDTH) { - r1 = TRUE; + sliding = TRUE; } else { - r1 = FALSE; - posX = 240; + sliding = FALSE; + posX = DISPLAY_WIDTH; } } else { - if (currPosX + r4 > 160) + // Sliding "Pkmn for Swap" onscreen + if (currPosX + deltaX > 160) { - r1 = TRUE; + sliding = TRUE; } else { - r1 = FALSE; + sliding = FALSE; posX = 160; } } - if (r1 == TRUE) + if (sliding == TRUE) { - for (i = 0; i < 3; i++) + // Do movement + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0]); i++) { - for (j = 0; j < 2; j++) - gSprites[sFactorySwapScreen->unk8[j][i]].pos1.x += r4; + for (j = 0; j < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds); j++) + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[j][i]].pos1.x += deltaX; } } else { - for (j = 0; j < 2; j++) + // Set final position + for (j = 0; j < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds); j++) { - gSprites[sFactorySwapScreen->unk8[j][0]].pos1.x = posX; - gSprites[sFactorySwapScreen->unk8[j][1]].pos1.x = posX + 16; - gSprites[sFactorySwapScreen->unk8[j][2]].pos1.x = posX + 48; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[j][0]].pos1.x = posX; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[j][1]].pos1.x = posX + 16; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[j][2]].pos1.x = posX + 48; } - taskId2 = gTasks[taskId].data[1]; - gTasks[taskId2].data[3] = 1; + prevTaskId = gTasks[taskId].tTaskId; + gTasks[prevTaskId].tSlideFinishedPkmn = TRUE; DestroyTask(taskId); } break; - case 1: - currPosX = gSprites[sFactorySwapScreen->unkE[0][0]].pos1.x; - if (!gTasks[taskId].data[2]) + case SLIDE_BUTTON_CANCEL: + currPosX = gSprites[sFactorySwapScreen->cancelButtonSpriteIds[0][0]].pos1.x; + if (!gTasks[taskId].tSlidingOn) { - if (currPosX + r4 < 240) + // Sliding "Cancel" offscreen + if (currPosX + deltaX < DISPLAY_WIDTH) { - r1 = TRUE; + sliding = TRUE; } else { - r1 = FALSE; - posX = 240; + sliding = FALSE; + posX = DISPLAY_WIDTH; } } else { - if (currPosX + r4 > 192) + // Sliding "Cancel" onscreen + if (currPosX + deltaX > 192) { - r1 = TRUE; + sliding = TRUE; } else { - r1 = FALSE; + sliding = FALSE; posX = 192; } } - if (r1 == TRUE) + if (sliding == TRUE) { - for (i = 0; i < 2; i++) + // Do movement + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds); i++) { - for (j = 0; j < 2; j++) - gSprites[sFactorySwapScreen->unkE[j][i]].pos1.x += r4; + for (j = 0; j < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds[0]); j++) + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[j][i]].pos1.x += deltaX; } } else { - for (j = 0; j < 2; j++) + // Set final position + for (j = 0; j < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds); j++) { - gSprites[sFactorySwapScreen->unkE[j][0]].pos1.x = posX; - gSprites[sFactorySwapScreen->unkE[j][1]].pos1.x = posX + 16; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[j][0]].pos1.x = posX; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[j][1]].pos1.x = posX + 16; } - taskId2 = gTasks[taskId].data[1]; - gTasks[taskId2].data[4] = 1; + prevTaskId = gTasks[taskId].tTaskId; + gTasks[prevTaskId].tSlideFinishedCancel = TRUE; DestroyTask(taskId); } break; } } -static void sub_819D588(u8 taskId) +// Slide action buttons offscreen +static void Swap_Task_ScreenInfoTransitionOut(u8 taskId) { - u8 anotherTaskId; - u16 loPtr, hiPtr; + u8 slideTaskId; + u16 hiPtr, loPtr; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); + LoadPalette(sSwapText_Pal, 0xE0, sizeof(sSwapText_Pal)); Swap_PrintActionStrings(); - PutWindowTilemap(5); - gTasks[taskId].data[0]++; + PutWindowTilemap(SWAP_WIN_ACTION_FADE); + gTasks[taskId].tState++; break; case 1: - sub_819EA64(3); - gTasks[taskId].data[0]++; + Swap_ErasePopupMenu(SWAP_WIN_OPTIONS); + gTasks[taskId].tState++; break; case 2: - BeginNormalPaletteFade(0x4000, 0, 0, 0x10, gUnknown_0860F13C[37]); - gTasks[taskId].data[0]++; + BeginNormalPaletteFade(0x4000, 0, 0, 16, sPokeballGray_Pal[37]); + gTasks[taskId].tState++; break; case 3: if (!gPaletteFade.active) { - FillWindowPixelBuffer(5, PIXEL_FILL(0)); - CopyWindowToVram(5, 2); + FillWindowPixelBuffer(SWAP_WIN_ACTION_FADE, PIXEL_FILL(0)); + CopyWindowToVram(SWAP_WIN_ACTION_FADE, 2); if (sFactorySwapScreen->inEnemyScreen == TRUE) { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 0; - gTasks[anotherTaskId].data[2] = 0; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[2] = 5; - gTasks[taskId].data[0]++; + // Start "Pkmn for Swap" button slide offscreen + slideTaskId = CreateTask(Swap_Task_SlideButtonOnOffScreen, 0); + gTasks[taskId].tSlideFinishedPkmn = FALSE; + gTasks[slideTaskId].tTaskId = taskId; + gTasks[slideTaskId].tState = SLIDE_BUTTON_PKMN; + gTasks[slideTaskId].tSlidingOn = FALSE; + gTasks[slideTaskId].tXIncrement = 6; + gTasks[taskId].tSecondSlideDelay = 5; + gTasks[taskId].tState++; } else { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 1; - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 0; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0] += 2; + // Start "Cancel" button slide offscreen + slideTaskId = CreateTask(Swap_Task_SlideButtonOnOffScreen, 0); + gTasks[taskId].tSlideFinishedPkmn = TRUE; + gTasks[taskId].tSlideFinishedCancel = FALSE; + gTasks[slideTaskId].tTaskId = taskId; + gTasks[slideTaskId].tState = SLIDE_BUTTON_CANCEL; + gTasks[slideTaskId].tSlidingOn = FALSE; + gTasks[slideTaskId].tXIncrement = 6; + gTasks[taskId].tState += 2; } } break; case 4: - if (gTasks[taskId].data[2] == 0) + // Start "Cancel" button slide offscreen for screens with both buttons + if (gTasks[taskId].tSecondSlideDelay == 0) { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 0; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0]++; + slideTaskId = CreateTask(Swap_Task_SlideButtonOnOffScreen, 0); + gTasks[taskId].tSlideFinishedCancel = FALSE; + gTasks[slideTaskId].tTaskId = taskId; + gTasks[slideTaskId].tState = SLIDE_BUTTON_CANCEL; + gTasks[slideTaskId].tSlidingOn = FALSE; + gTasks[slideTaskId].tXIncrement = 6; + gTasks[taskId].tState++; } else { - gTasks[taskId].data[2]--; + gTasks[taskId].tSecondSlideDelay--; } break; case 5: - if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1) + if (gTasks[taskId].tSlideFinishedPkmn == TRUE + && gTasks[taskId].tSlideFinishedCancel == TRUE) { - gTasks[taskId].data[0] = gTasks[taskId].data[5]; - loPtr = gTasks[taskId].data[6]; - hiPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr)); + gTasks[taskId].tState = gTasks[taskId].tFollowUpTaskState; + hiPtr = gTasks[taskId].tFollowUpTaskPtrHi; + loPtr = gTasks[taskId].tFollowUpTaskPtrLo; + gTasks[taskId].func = (void *)((hiPtr << 16) | (loPtr)); } break; } } -static void sub_819D770(u8 taskId) +// Slide action buttons onscreen, reprint swap dialogue and mon info +static void Swap_Task_ScreenInfoTransitionIn(u8 taskId) { - u8 anotherTaskId; - u16 loPtr, hiPtr; - if (sFactorySwapScreen->unk30 == TRUE) + u8 slideTaskId; + u16 hiPtr, loPtr; + if (sFactorySwapScreen->monPicAnimating == TRUE) return; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: if (sFactorySwapScreen->inEnemyScreen == TRUE) { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 0; - gTasks[anotherTaskId].data[2] = 1; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[2] = 10; - gTasks[taskId].data[0]++; + // Start "Pkmn for Swap" button slide onscreen + slideTaskId = CreateTask(Swap_Task_SlideButtonOnOffScreen, 0); + gTasks[taskId].tSlideFinishedPkmn = FALSE; + gTasks[slideTaskId].tTaskId = taskId; + gTasks[slideTaskId].tState = SLIDE_BUTTON_PKMN; + gTasks[slideTaskId].tSlidingOn = TRUE; + gTasks[slideTaskId].tXIncrement = 6; + gTasks[taskId].tSecondSlideDelay = 10; + gTasks[taskId].tState++; } else { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[3] = 1; - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 1; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0] += 2; + // Start "Cancel" button slide onscreen + slideTaskId = CreateTask(Swap_Task_SlideButtonOnOffScreen, 0); + gTasks[taskId].tSlideFinishedPkmn = TRUE; + gTasks[taskId].tSlideFinishedCancel = FALSE; + gTasks[slideTaskId].tTaskId = taskId; + gTasks[slideTaskId].tState = SLIDE_BUTTON_CANCEL; + gTasks[slideTaskId].tSlidingOn = TRUE; + gTasks[slideTaskId].tXIncrement = 6; + gTasks[taskId].tState += 2; } break; case 1: - if (gTasks[taskId].data[2] == 0) + // Start "Cancel" button slide onscreen for screens with both buttons + if (gTasks[taskId].tSecondSlideDelay == 0) { - anotherTaskId = CreateTask(sub_819D324, 0); - gTasks[taskId].data[4] = 0; - gTasks[anotherTaskId].data[1] = taskId; - gTasks[anotherTaskId].data[0] = 1; - gTasks[anotherTaskId].data[2] = 1; - gTasks[anotherTaskId].data[3] = 6; - gTasks[taskId].data[0]++; + slideTaskId = CreateTask(Swap_Task_SlideButtonOnOffScreen, 0); + gTasks[taskId].tSlideFinishedCancel = FALSE; + gTasks[slideTaskId].tTaskId = taskId; + gTasks[slideTaskId].tState = SLIDE_BUTTON_CANCEL; + gTasks[slideTaskId].tSlidingOn = TRUE; + gTasks[slideTaskId].tXIncrement = 6; + gTasks[taskId].tState++; } else { - gTasks[taskId].data[2]--; + gTasks[taskId].tSecondSlideDelay--; } break; case 2: - if (gTasks[taskId].data[3] == 1 && gTasks[taskId].data[4] == 1) + if (gTasks[taskId].tSlideFinishedPkmn == TRUE + && gTasks[taskId].tSlideFinishedCancel == TRUE) { - gPlttBufferFaded[226] = gUnknown_0860F13C[37]; + gPlttBufferFaded[226] = sPokeballGray_Pal[37]; Swap_PrintActionStrings(); - PutWindowTilemap(5); - gTasks[taskId].data[0]++; + PutWindowTilemap(SWAP_WIN_ACTION_FADE); + gTasks[taskId].tState++; } break; case 3: - BeginNormalPaletteFade(0x4000, 0, 0x10, 0, gUnknown_0860F13C[37]); - gTasks[taskId].data[0]++; + BeginNormalPaletteFade(0x4000, 0, 16, 0, sPokeballGray_Pal[37]); + gTasks[taskId].tState++; break; case 4: if (!gPaletteFade.active) { Swap_PrintOneActionString(0); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 5: Swap_PrintOneActionString(1); - PutWindowTilemap(3); - gTasks[taskId].data[0]++; + PutWindowTilemap(SWAP_WIN_OPTIONS); + gTasks[taskId].tState++; break; case 6: - FillWindowPixelBuffer(5, PIXEL_FILL(0)); - CopyWindowToVram(5, 2); - gTasks[taskId].data[0]++; + FillWindowPixelBuffer(SWAP_WIN_ACTION_FADE, PIXEL_FILL(0)); + CopyWindowToVram(SWAP_WIN_ACTION_FADE, 2); + gTasks[taskId].tState++; break; case 7: if (!sFactorySwapScreen->inEnemyScreen) Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap); else Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept); - if (sFactorySwapScreen->cursorPos < 3) + if (sFactorySwapScreen->cursorPos < FRONTIER_PARTY_SIZE) gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; Swap_PrintMonCategory(); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 8: - Swap_PrintMonSpecies3(); - sub_819EADC(); - sFactorySwapScreen->unk22 = TRUE; - gTasks[taskId].data[0] = gTasks[taskId].data[5]; - loPtr = gTasks[taskId].data[6]; - hiPtr = gTasks[taskId].data[7]; - gTasks[taskId].func = (void *)((loPtr << 0x10) | (hiPtr)); + Swap_PrintMonSpeciesForTransition(); + Swap_EraseSpeciesAtFadeWindow(); + sFactorySwapScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = gTasks[taskId].tFollowUpTaskState; + hiPtr = gTasks[taskId].tFollowUpTaskPtrHi; + loPtr = gTasks[taskId].tFollowUpTaskPtrLo; + gTasks[taskId].func = (void *)((hiPtr << 16) | (loPtr)); break; } } -static void sub_819D9EC(u8 taskId) +#undef tTaskId +#undef tSlidingOn +#undef tXIncrement +#undef tSlideFinishedPkmn +#undef tSlideFinishedCancel + +// For switching between the swap screens with the player's / enemy's parties +static void Swap_Task_SwitchPartyScreen(u8 taskId) { u8 i; - if (sFactorySwapScreen->unk30 == TRUE) + if (sFactorySwapScreen->monPicAnimating == TRUE) return; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: - Swap_PrintMonSpecies3(); - gTasks[taskId].data[0]++; + Swap_PrintMonSpeciesForTransition(); + gTasks[taskId].tState++; break; case 1: - sub_819EADC(); + Swap_EraseSpeciesAtFadeWindow(); gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 2: - CreateTask(sub_819D12C, 0); - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName2; - gTasks[taskId].data[0]++; + CreateTask(Swap_Task_SlideCycleBalls, 0); + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Swap_Task_FadeOutSpeciesName; + gTasks[taskId].tState++; break; case 3: - if (!FuncIsActiveTask(sub_819D12C) && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[4] == 1) + if (!FuncIsActiveTask(Swap_Task_SlideCycleBalls) + && gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].tFadeOutFinished == TRUE) { - sub_819EAC0(); + Swap_EraseSpeciesWindow(); if (!sFactorySwapScreen->inEnemyScreen) { - Swap_InitActions(ACTIONS_ENEMY_SCREEN); + Swap_InitActions(SWAP_ENEMY_SCREEN); } else { - Swap_InitActions(ACTIONS_PLAYER_SCREEN); - for (i = 0; i < 3; i++) - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + Swap_InitActions(SWAP_PLAYER_SCREEN); + + // Hide "Pkmn for Swap" button + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0]); i++) + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][i]].invisible = TRUE; } gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x; - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Task_SwapFadeSpeciesName; - sFactorySwapScreen->unk27 = 0; - sFactorySwapScreen->unk28 = 6; - sFactorySwapScreen->unk26 = FALSE; - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1; - gTasks[taskId].data[0]++; + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].func = Swap_Task_FadeSpeciesName; + sFactorySwapScreen->fadeSpeciesNameCoeffDelay = 0; + sFactorySwapScreen->fadeSpeciesNameCoeff = 6; + sFactorySwapScreen->fadeSpeciesNameFadeOut = FALSE; + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].tState = FADESTATE_RUN; + gTasks[taskId].tState++; } break; case 4: - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_HandleChooseMons) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_HandleChooseMons); + gTasks[taskId].tFollowUpTaskState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionIn; break; } } +#undef tFadeOutFinished + static void Swap_InitStruct(void) { if (sFactorySwapScreen == NULL) { sFactorySwapScreen = AllocZeroed(sizeof(*sFactorySwapScreen)); sFactorySwapScreen->cursorPos = 0; - sFactorySwapScreen->unk30 = FALSE; + sFactorySwapScreen->monPicAnimating = FALSE; sFactorySwapScreen->fromSummaryScreen = FALSE; } } @@ -3129,9 +3277,9 @@ static void CB2_InitSwapScreen(void) break; case 1: sSwapMenuTilesetBuffer = Alloc(0x440); - sSwapMonCardBgTilesetBuffer = AllocZeroed(0x440); - sSwapMenuTilemapBuffer = Alloc(0x800); - sSwapMonCardBgTilemapBuffer = AllocZeroed(0x800); + sSwapMonPicBgTilesetBuffer = AllocZeroed(0x440); + sSwapMenuTilemapBuffer = Alloc(BG_SCREEN_SIZE); + sSwapMonPicBgTilemapBuffer = AllocZeroed(BG_SCREEN_SIZE); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -3157,36 +3305,36 @@ static void CB2_InitSwapScreen(void) FreeAllSpritePalettes(); ResetAllPicSprites(); CpuCopy16(gFrontierFactorySelectMenu_Gfx, sSwapMenuTilesetBuffer, 0x440); - CpuCopy16(gUnknown_0861033C, sSwapMonCardBgTilesetBuffer, 0x60); + CpuCopy16(sMonPicBg_Gfx, sSwapMonPicBgTilesetBuffer, 0x60); LoadBgTiles(1, sSwapMenuTilesetBuffer, 0x440, 0); - LoadBgTiles(3, sSwapMonCardBgTilesetBuffer, 0x60, 0); - CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, 0x800); - LoadBgTilemap(1, sSwapMenuTilemapBuffer, 0x800, 0); + LoadBgTiles(3, sSwapMonPicBgTilesetBuffer, 0x60, 0); + CpuCopy16(gFrontierFactorySelectMenu_Tilemap, sSwapMenuTilemapBuffer, BG_SCREEN_SIZE); + LoadBgTilemap(1, sSwapMenuTilemapBuffer, BG_SCREEN_SIZE, 0); LoadPalette(gFrontierFactorySelectMenu_Pal, 0, 0x40); - LoadPalette(gUnknown_08610918, 0xF0, sizeof(gUnknown_08610918)); - LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); - LoadPalette(gUnknown_0861039C, 0x20, 4); + LoadPalette(sSwapText_Pal, 0xF0, sizeof(sSwapText_Pal)); + LoadPalette(sSwapText_Pal, 0xE0, sizeof(sSwapText_Pal)); + LoadPalette(sMonPicBg_Pal, 0x20, 4); gMain.state++; break; case 3: - SetBgTilemapBuffer(3, sSwapMonCardBgTilemapBuffer); - CopyToBgTilemapBufferRect(3, gUnknown_0861023C, 11, 4, 8, 8); + SetBgTilemapBuffer(3, sSwapMonPicBgTilemapBuffer); + CopyToBgTilemapBufferRect(3, sMonPicBg_Tilemap, 11, 4, 8, 8); CopyBgTilemapBufferToVram(3); gMain.state++; break; case 4: - LoadSpritePalettes(gUnknown_086106B0); - LoadSpriteSheets(gUnknown_08610650); - LoadCompressedSpriteSheet(gUnknown_086106A0); + LoadSpritePalettes(sSwap_SpritePalettes); + LoadSpriteSheets(sSwap_SpriteSheets); + LoadCompressedSpriteSheet(sSwap_BallGfx); SetVBlankCallback(Swap_VblankCb); gMain.state++; break; case 5: - #if MODERN +#ifdef UBFIX if (sFactorySwapScreen && sFactorySwapScreen->fromSummaryScreen) - #else +#else if (sFactorySwapScreen->fromSummaryScreen == TRUE) - #endif +#endif sFactorySwapScreen->cursorPos = gLastViewedMonIndex; gMain.state++; break; @@ -3195,28 +3343,28 @@ static void CB2_InitSwapScreen(void) Swap_InitAllSprites(); if (sFactorySwapScreen->fromSummaryScreen == TRUE) Swap_ShowSummaryMonSprite(); - Swap_InitActions(ACTIONS_PLAYER_SCREEN); + Swap_InitActions(SWAP_PLAYER_SCREEN); gMain.state++; break; case 7: Swap_PrintOnInfoWindow(gText_SelectPkmnToSwap); - PutWindowTilemap(2); + PutWindowTilemap(SWAP_WIN_INFO); gMain.state++; break; case 8: Swap_PrintMonCategory(); - PutWindowTilemap(8); + PutWindowTilemap(SWAP_WIN_MON_CATEGORY); gMain.state++; break; case 9: if (!sFactorySwapScreen->fromSummaryScreen) Swap_PrintMonSpecies(); - PutWindowTilemap(1); + PutWindowTilemap(SWAP_WIN_SPECIES); gMain.state++; break; case 10: Swap_PrintPkmnSwap(); - PutWindowTilemap(0); + PutWindowTilemap(SWAP_WIN_TITLE); gMain.state++; break; case 11: @@ -3224,16 +3372,16 @@ static void CB2_InitSwapScreen(void) break; case 12: if (sFactorySwapScreen->fromSummaryScreen) - Swap_PrintMonSpecies2(); + Swap_PrintMonSpeciesAtFade(); gMain.state++; break; case 13: Swap_PrintActionStrings2(); - PutWindowTilemap(3); + PutWindowTilemap(SWAP_WIN_OPTIONS); gMain.state++; break; case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); ShowBg(1); @@ -3251,20 +3399,20 @@ static void CB2_InitSwapScreen(void) gMain.state++; break; case 15: - sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Task_SwapFadeSpeciesName, 0); + sFactorySwapScreen->fadeSpeciesNameTaskId = CreateTask(Swap_Task_FadeSpeciesName, 0); if (!sFactorySwapScreen->fromSummaryScreen) { - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 0; - taskId = CreateTask(Task_HandleSwapScreenChooseMons, 0); - gTasks[taskId].data[0] = 0; + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].tState = FADESTATE_INIT; + taskId = CreateTask(Swap_Task_HandleChooseMons, 0); + gTasks[taskId].tState = STATE_CHOOSE_MONS_INIT; } else { - sub_819EAF8(); - gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].data[0] = 1; - sFactorySwapScreen->unk22 = FALSE; - taskId = CreateTask(Task_HandleSwapScreenMenu, 0); - gTasks[taskId].data[0] = 2; + Swap_EraseActionFadeWindow(); + gTasks[sFactorySwapScreen->fadeSpeciesNameTaskId].tState = FADESTATE_RUN; + sFactorySwapScreen->fadeSpeciesNameActive = FALSE; + taskId = CreateTask(Swap_Task_HandleMenu, 0); + gTasks[taskId].tState = STATE_MENU_INIT; } SetMainCallback2(Swap_CB2); break; @@ -3277,17 +3425,17 @@ static void Swap_InitAllSprites(void) u8 x; struct SpriteTemplate spriteTemplate; - spriteTemplate = gUnknown_08610834; - spriteTemplate.paletteTag = TAG_PAL_BALL_SELECTED; + spriteTemplate = sSpriteTemplate_Swap_Pokeball; + spriteTemplate.paletteTag = PALTAG_BALL_SELECTED; - for (i = 0; i < 3; i++) + for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { sFactorySwapScreen->ballSpriteIds[i] = CreateSprite(&spriteTemplate, (48 * i) + 72, 64, 1); gSprites[sFactorySwapScreen->ballSpriteIds[i]].data[0] = 0; } - sFactorySwapScreen->cursorSpriteId = CreateSprite(&gUnknown_0861084C, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0); - sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&gUnknown_08610864, 176, 112, 0); - sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&gUnknown_0861087C, 176, 144, 0); + sFactorySwapScreen->cursorSpriteId = CreateSprite(&sSpriteTemplate_Swap_Arrow, gSprites[sFactorySwapScreen->ballSpriteIds[sFactorySwapScreen->cursorPos]].pos1.x, 88, 0); + sFactorySwapScreen->menuCursor1SpriteId = CreateSprite(&sSpriteTemplate_Swap_MenuHighlightLeft, 176, 112, 0); + sFactorySwapScreen->menuCursor2SpriteId = CreateSprite(&sSpriteTemplate_Swap_MenuHighlightRight, 176, 144, 0); gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE; gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE; gSprites[sFactorySwapScreen->menuCursor1SpriteId].centerToCornerVecX = 0; @@ -3296,105 +3444,110 @@ static void Swap_InitAllSprites(void) gSprites[sFactorySwapScreen->menuCursor2SpriteId].centerToCornerVecY = 0; if (sFactorySwapScreen->fromSummaryScreen == TRUE) - x = 240; + x = DISPLAY_WIDTH; else - x = 192; - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_68; - sFactorySwapScreen->unk8[0][0] = CreateSprite(&spriteTemplate, 240, 120, 10); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_69; - sFactorySwapScreen->unk8[0][1] = CreateSprite(&spriteTemplate, 256, 120, 10); - sFactorySwapScreen->unk8[0][2] = CreateSprite(&spriteTemplate, 288, 120, 10); - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_6A; - sFactorySwapScreen->unk8[1][0] = CreateSprite(&spriteTemplate, 240, 120, 1); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_6B; - sFactorySwapScreen->unk8[1][1] = CreateSprite(&spriteTemplate, 256, 120, 1); - spriteTemplate.tileTag = TAG_TILE_6C; - sFactorySwapScreen->unk8[1][2] = CreateSprite(&spriteTemplate, 288, 120, 1); - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_68; - sFactorySwapScreen->unkE[0][0] = CreateSprite(&spriteTemplate, x, 144, 10); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_69; - sFactorySwapScreen->unkE[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10); - - spriteTemplate = gUnknown_0861084C; - spriteTemplate.tileTag = TAG_TILE_6A; - sFactorySwapScreen->unkE[1][0] = CreateSprite(&spriteTemplate, x, 144, 1); - - spriteTemplate = gUnknown_08610864; - spriteTemplate.tileTag = TAG_TILE_6C; - sFactorySwapScreen->unkE[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1); + x = DISPLAY_WIDTH - 48; + + // Unusual way to create sprites + // The sprite template for the selector arrow is re-used + // with the tiles swapped out + spriteTemplate = sSpriteTemplate_Swap_Arrow; + spriteTemplate.tileTag = GFXTAG_ACTION_BOX_LEFT; + sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][0] = CreateSprite(&spriteTemplate, DISPLAY_WIDTH, 120, 10); + + spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft; + spriteTemplate.tileTag = GFXTAG_ACTION_BOX_RIGHT; + sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][1] = CreateSprite(&spriteTemplate, DISPLAY_WIDTH + 16, 120, 10); + sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][2] = CreateSprite(&spriteTemplate, DISPLAY_WIDTH + 48, 120, 10); + + spriteTemplate = sSpriteTemplate_Swap_Arrow; + spriteTemplate.tileTag = GFXTAG_ACTION_HIGHLIGHT_LEFT; + sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][0] = CreateSprite(&spriteTemplate, DISPLAY_WIDTH, 120, 1); + + spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft; + spriteTemplate.tileTag = GFXTAG_ACTION_HIGHLIGHT_MIDDLE; + sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][1] = CreateSprite(&spriteTemplate, DISPLAY_WIDTH + 16, 120, 1); + spriteTemplate.tileTag = GFXTAG_ACTION_HIGHLIGHT_RIGHT; + sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][2] = CreateSprite(&spriteTemplate, DISPLAY_WIDTH + 48, 120, 1); + + spriteTemplate = sSpriteTemplate_Swap_Arrow; + spriteTemplate.tileTag = GFXTAG_ACTION_BOX_LEFT; + sFactorySwapScreen->cancelButtonSpriteIds[0][0] = CreateSprite(&spriteTemplate, x, 144, 10); + + spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft; + spriteTemplate.tileTag = GFXTAG_ACTION_BOX_RIGHT; + sFactorySwapScreen->cancelButtonSpriteIds[0][1] = CreateSprite(&spriteTemplate, x + 16, 144, 10); + + spriteTemplate = sSpriteTemplate_Swap_Arrow; + spriteTemplate.tileTag = GFXTAG_ACTION_HIGHLIGHT_LEFT; + sFactorySwapScreen->cancelButtonSpriteIds[1][0] = CreateSprite(&spriteTemplate, x, 144, 1); + + spriteTemplate = sSpriteTemplate_Swap_MenuHighlightLeft; + spriteTemplate.tileTag = GFXTAG_ACTION_HIGHLIGHT_RIGHT; + sFactorySwapScreen->cancelButtonSpriteIds[1][1] = CreateSprite(&spriteTemplate, x + 16, 144, 1); for (i = 0; i < 2; i++) { - gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk8[i][0]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk8[i][1]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk8[i][2]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unkE[i][0]].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unkE[i][1]].centerToCornerVecY = 0; - - gSprites[sFactorySwapScreen->unk8[i][0]].invisible = TRUE; - gSprites[sFactorySwapScreen->unk8[i][1]].invisible = TRUE; - gSprites[sFactorySwapScreen->unk8[i][2]].invisible = TRUE; - gSprites[sFactorySwapScreen->unkE[i][0]].invisible = TRUE; - gSprites[sFactorySwapScreen->unkE[i][1]].invisible = TRUE; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][0]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][0]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][1]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][1]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][2]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][2]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][0]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][0]].centerToCornerVecY = 0; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][1]].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][1]].centerToCornerVecY = 0; + + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][0]].invisible = TRUE; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][1]].invisible = TRUE; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][2]].invisible = TRUE; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][0]].invisible = TRUE; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][1]].invisible = TRUE; } - gSprites[sFactorySwapScreen->unkE[0][0]].invisible = FALSE; - gSprites[sFactorySwapScreen->unkE[0][1]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[0][0]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[0][1]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[0][2]].invisible = FALSE; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[0][0]].invisible = FALSE; + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[0][1]].invisible = FALSE; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][0]].invisible = FALSE; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][1]].invisible = FALSE; + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0][2]].invisible = FALSE; } static void Swap_DestroyAllSprites(void) { u8 i, j; - for (i = 0; i < 3; i++) + for (i = 0; i < FRONTIER_PARTY_SIZE; i++) DestroySprite(&gSprites[sFactorySwapScreen->ballSpriteIds[i]]); DestroySprite(&gSprites[sFactorySwapScreen->cursorSpriteId]); DestroySprite(&gSprites[sFactorySwapScreen->menuCursor1SpriteId]); DestroySprite(&gSprites[sFactorySwapScreen->menuCursor2SpriteId]); - for (i = 0; i < 2; i++) + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds); i++) { - for (j = 0; j < 3; j++) - DestroySprite(&gSprites[sFactorySwapScreen->unk8[i][j]]); + for (j = 0; j < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0]); j++) + DestroySprite(&gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[i][j]]); } - for (i = 0; i < 2; i++) + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds); i++) { - for (j = 0; j < 2; j++) - DestroySprite(&gSprites[sFactorySwapScreen->unkE[i][j]]); + for (j = 0; j < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds[0]); j++) + DestroySprite(&gSprites[sFactorySwapScreen->cancelButtonSpriteIds[i][j]]); } } static void Swap_HandleActionCursorChange(u8 cursorId) { - if (cursorId < 3) + if (cursorId < FRONTIER_PARTY_SIZE) { + // Cursor is on one of the pokemon gSprites[sFactorySwapScreen->cursorSpriteId].invisible = FALSE; - sub_819E8EC(); + Swap_HideActionButtonHighlights(); gSprites[sFactorySwapScreen->cursorSpriteId].pos1.x = gSprites[sFactorySwapScreen->ballSpriteIds[cursorId]].pos1.x; } else { + // Cursor is on an action button gSprites[sFactorySwapScreen->cursorSpriteId].invisible = TRUE; - sub_819E838(sFactorySwapScreen->actionsData[cursorId].id); + Swap_HighlightActionButton(sFactorySwapScreen->actionsData[cursorId].id); } } @@ -3427,8 +3580,8 @@ static void Swap_UpdateActionCursorPosition(s8 direction) PlaySE(SE_SELECT); if (direction > 0) // Move cursor down. { - if (sFactorySwapScreen->cursorPos < 3) - sFactorySwapScreen->cursorPos = 3; + if (sFactorySwapScreen->cursorPos < FRONTIER_PARTY_SIZE) + sFactorySwapScreen->cursorPos = FRONTIER_PARTY_SIZE; else if (sFactorySwapScreen->cursorPos + 1 != sFactorySwapScreen->actionsCount) sFactorySwapScreen->cursorPos++; else @@ -3436,7 +3589,7 @@ static void Swap_UpdateActionCursorPosition(s8 direction) } else // Move cursor up. { - if (sFactorySwapScreen->cursorPos < 3) + if (sFactorySwapScreen->cursorPos < FRONTIER_PARTY_SIZE) sFactorySwapScreen->cursorPos = sFactorySwapScreen->actionsCount - 1; else if (sFactorySwapScreen->cursorPos != 0) sFactorySwapScreen->cursorPos--; @@ -3474,7 +3627,7 @@ static void Swap_UpdateMenuCursorPosition(s8 direction) PlaySE(SE_SELECT); if (direction > 0) // Move cursor down. { - if (sFactorySwapScreen->menuCursorPos != MENU_OPTIONS_COUNT - 1) + if (sFactorySwapScreen->menuCursorPos != ARRAY_COUNT(sSwap_MenuOptionFuncs) - 1) sFactorySwapScreen->menuCursorPos++; else sFactorySwapScreen->menuCursorPos = 0; @@ -3484,43 +3637,52 @@ static void Swap_UpdateMenuCursorPosition(s8 direction) if (sFactorySwapScreen->menuCursorPos != 0) sFactorySwapScreen->menuCursorPos--; else - sFactorySwapScreen->menuCursorPos = MENU_OPTIONS_COUNT - 1; + sFactorySwapScreen->menuCursorPos = ARRAY_COUNT(sSwap_MenuOptionFuncs) - 1; } gSprites[sFactorySwapScreen->menuCursor1SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; gSprites[sFactorySwapScreen->menuCursor2SpriteId].pos1.y = (sFactorySwapScreen->menuCursorPos * 16) + 112; } -static void sub_819E838(u8 arg0) +static void Swap_HighlightActionButton(u8 actionId) { u8 i; - for (i = 0; i < 3; i++) + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0]); i++) { - if (arg0 == 2) + if (actionId == SWAPACTION_PKMN_FOR_SWAP) { - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = FALSE; - if (i < 2) - gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE; + // Show button highlight on "Pkmn for Swap" + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][i]].invisible = FALSE; + + // Hide button highlight on Cancel + if (i < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds[0])) + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[1][i]].invisible = TRUE; } - else if (arg0 == 3) + else if (actionId == SWAPACTION_CANCEL) { - if (i < 2) - gSprites[sFactorySwapScreen->unkE[1][i]].invisible = FALSE; - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; + // Show button highlight on Cancel + if (i < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds[0])) + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[1][i]].invisible = FALSE; + + // Hide button highlight on "Pkmn for Swap" + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][i]].invisible = TRUE; } } } -static void sub_819E8EC(void) +static void Swap_HideActionButtonHighlights(void) { u8 i; - for (i = 0; i < 3; i++) + for (i = 0; i < ARRAY_COUNT(sFactorySwapScreen->pkmnForSwapButtonSpriteIds[0]); i++) { - gSprites[sFactorySwapScreen->unk8[1][i]].invisible = TRUE; - if (i < 2) - gSprites[sFactorySwapScreen->unkE[1][i]].invisible = TRUE; + // Hide button highlight on "Pkmn for Swap" + gSprites[sFactorySwapScreen->pkmnForSwapButtonSpriteIds[1][i]].invisible = TRUE; + + // Hide button highlight on Cancel + if (i < ARRAY_COUNT(sFactorySwapScreen->cancelButtonSpriteIds[0])) + gSprites[sFactorySwapScreen->cancelButtonSpriteIds[1][i]].invisible = TRUE; } } @@ -3557,7 +3719,7 @@ static void Swap_ShowYesNoOptions(void) Swap_PrintYesNoOptions(); } -static void sub_819EA64(u8 windowId) +static void Swap_ErasePopupMenu(u8 windowId) { gSprites[sFactorySwapScreen->menuCursor1SpriteId].invisible = TRUE; gSprites[sFactorySwapScreen->menuCursor2SpriteId].invisible = TRUE; @@ -3566,33 +3728,33 @@ static void sub_819EA64(u8 windowId) ClearWindowTilemap(windowId); } -static void sub_819EAC0(void) +static void Swap_EraseSpeciesWindow(void) { - PutWindowTilemap(1); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - CopyWindowToVram(1, 2); + PutWindowTilemap(SWAP_WIN_SPECIES); + FillWindowPixelBuffer(SWAP_WIN_SPECIES, PIXEL_FILL(0)); + CopyWindowToVram(SWAP_WIN_SPECIES, 2); } -static void sub_819EADC(void) +static void Swap_EraseSpeciesAtFadeWindow(void) { - PutWindowTilemap(7); - FillWindowPixelBuffer(7, PIXEL_FILL(0)); - CopyWindowToVram(7, 2); + PutWindowTilemap(SWAP_WIN_SPECIES_AT_FADE); + FillWindowPixelBuffer(SWAP_WIN_SPECIES_AT_FADE, PIXEL_FILL(0)); + CopyWindowToVram(SWAP_WIN_SPECIES_AT_FADE, 2); } -static void sub_819EAF8(void) +static void Swap_EraseActionFadeWindow(void) { - sub_819EAC0(); - PutWindowTilemap(5); - FillWindowPixelBuffer(5, PIXEL_FILL(0)); - CopyWindowToVram(5, 2); + Swap_EraseSpeciesWindow(); + PutWindowTilemap(SWAP_WIN_ACTION_FADE); + FillWindowPixelBuffer(SWAP_WIN_ACTION_FADE, PIXEL_FILL(0)); + CopyWindowToVram(SWAP_WIN_ACTION_FADE, 2); } static void Swap_PrintPkmnSwap(void) { - FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized(0, 1, gText_PkmnSwap, 2, 1, 0, NULL); - CopyWindowToVram(0, 3); + FillWindowPixelBuffer(SWAP_WIN_TITLE, PIXEL_FILL(1)); + AddTextPrinterParameterized(SWAP_WIN_TITLE, 1, gText_PkmnSwap, 2, 1, 0, NULL); + CopyWindowToVram(SWAP_WIN_TITLE, 3); } static void Swap_PrintMonSpecies(void) @@ -3600,10 +3762,10 @@ static void Swap_PrintMonSpecies(void) u16 species; u8 x; - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - if (sFactorySwapScreen->cursorPos > 2) + FillWindowPixelBuffer(SWAP_WIN_SPECIES, PIXEL_FILL(0)); + if (sFactorySwapScreen->cursorPos >= FRONTIER_PARTY_SIZE) { - CopyWindowToVram(1, 2); + CopyWindowToVram(SWAP_WIN_SPECIES, 2); } else { @@ -3614,35 +3776,35 @@ static void Swap_PrintMonSpecies(void) species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); StringCopy(gStringVar4, gSpeciesNames[species]); x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(1, 1, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); - CopyWindowToVram(1, 3); + AddTextPrinterParameterized3(SWAP_WIN_SPECIES, 1, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); + CopyWindowToVram(SWAP_WIN_SPECIES, 3); } } static void Swap_PrintOnInfoWindow(const u8 *str) { - FillWindowPixelBuffer(2, PIXEL_FILL(0)); - AddTextPrinterParameterized(2, 1, str, 2, 5, 0, NULL); - CopyWindowToVram(2, 2); + FillWindowPixelBuffer(SWAP_WIN_INFO, PIXEL_FILL(0)); + AddTextPrinterParameterized(SWAP_WIN_INFO, 1, str, 2, 5, 0, NULL); + CopyWindowToVram(SWAP_WIN_INFO, 2); } static void Swap_PrintMenuOptions(void) { - PutWindowTilemap(3); - FillWindowPixelBuffer(3, PIXEL_FILL(0)); - AddTextPrinterParameterized3(3, 1, 15, 1, sSwapMenuOptionsTextColors, 0, gText_Summary2); - AddTextPrinterParameterized3(3, 1, 15, 17, sSwapMenuOptionsTextColors, 0, gText_Swap); - AddTextPrinterParameterized3(3, 1, 15, 33, sSwapMenuOptionsTextColors, 0, gText_Rechoose); - CopyWindowToVram(3, 3); + PutWindowTilemap(SWAP_WIN_OPTIONS); + FillWindowPixelBuffer(SWAP_WIN_OPTIONS, PIXEL_FILL(0)); + AddTextPrinterParameterized3(SWAP_WIN_OPTIONS, 1, 15, 1, sSwapMenuOptionsTextColors, 0, gText_Summary2); + AddTextPrinterParameterized3(SWAP_WIN_OPTIONS, 1, 15, 17, sSwapMenuOptionsTextColors, 0, gText_Swap); + AddTextPrinterParameterized3(SWAP_WIN_OPTIONS, 1, 15, 33, sSwapMenuOptionsTextColors, 0, gText_Rechoose); + CopyWindowToVram(SWAP_WIN_OPTIONS, 3); } static void Swap_PrintYesNoOptions(void) { - PutWindowTilemap(4); - FillWindowPixelBuffer(4, PIXEL_FILL(0)); - AddTextPrinterParameterized3(4, 1, 7, 1, sSwapMenuOptionsTextColors, 0, gText_Yes3); - AddTextPrinterParameterized3(4, 1, 7, 17, sSwapMenuOptionsTextColors, 0, gText_No3); - CopyWindowToVram(4, 3); + PutWindowTilemap(SWAP_WIN_YES_NO); + FillWindowPixelBuffer(SWAP_WIN_YES_NO, PIXEL_FILL(0)); + AddTextPrinterParameterized3(SWAP_WIN_YES_NO, 1, 7, 1, sSwapMenuOptionsTextColors, 0, gText_Yes3); + AddTextPrinterParameterized3(SWAP_WIN_YES_NO, 1, 7, 17, sSwapMenuOptionsTextColors, 0, gText_No3); + CopyWindowToVram(SWAP_WIN_YES_NO, 3); } static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId) @@ -3653,30 +3815,30 @@ static void Swap_PrintActionString(const u8 *str, u32 y, u32 windowId) static void Swap_PrintActionStrings(void) { - FillWindowPixelBuffer(5, PIXEL_FILL(0)); + FillWindowPixelBuffer(SWAP_WIN_ACTION_FADE, PIXEL_FILL(0)); switch (sFactorySwapScreen->inEnemyScreen) { case TRUE: - Swap_PrintActionString(gText_PkmnForSwap, 0, 5); + Swap_PrintActionString(gText_PkmnForSwap, 0, SWAP_WIN_ACTION_FADE); case FALSE: - Swap_PrintActionString(gText_Cancel3, 24, 5); + Swap_PrintActionString(gText_Cancel3, 24, SWAP_WIN_ACTION_FADE); break; } - CopyWindowToVram(5, 3); + CopyWindowToVram(SWAP_WIN_ACTION_FADE, 3); } static void Swap_PrintActionStrings2(void) { - FillWindowPixelBuffer(3, PIXEL_FILL(0)); + FillWindowPixelBuffer(SWAP_WIN_OPTIONS, PIXEL_FILL(0)); switch (sFactorySwapScreen->inEnemyScreen) { case TRUE: - Swap_PrintActionString(gText_PkmnForSwap, 8, 3); + Swap_PrintActionString(gText_PkmnForSwap, 8, SWAP_WIN_OPTIONS); case FALSE: - Swap_PrintActionString(gText_Cancel3, 32, 3); + Swap_PrintActionString(gText_Cancel3, 32, SWAP_WIN_OPTIONS); break; } - CopyWindowToVram(3, 3); + CopyWindowToVram(SWAP_WIN_OPTIONS, 3); } static void Swap_PrintOneActionString(u8 which) @@ -3685,33 +3847,34 @@ static void Swap_PrintOneActionString(u8 which) { case 0: if (sFactorySwapScreen->inEnemyScreen == TRUE) - Swap_PrintActionString(gText_PkmnForSwap, 8, 3); + Swap_PrintActionString(gText_PkmnForSwap, 8, SWAP_WIN_OPTIONS); break; case 1: - Swap_PrintActionString(gText_Cancel3, 32, 3); + Swap_PrintActionString(gText_Cancel3, 32, SWAP_WIN_OPTIONS); break; } - CopyWindowToVram(3, 3); + CopyWindowToVram(SWAP_WIN_OPTIONS, 3); } -static void Swap_PrintMonSpecies2(void) +// For printing the species name once its selected. Keep the current fade but don't keep fading in and out +static void Swap_PrintMonSpeciesAtFade(void) { u16 species; u8 x; u16 pal[5]; - CpuCopy16(gUnknown_08610918, pal, 8); + CpuCopy16(sSwapText_Pal, pal, 8); if (!sFactorySwapScreen->fromSummaryScreen) pal[4] = gPlttBufferFaded[228]; else - pal[4] = sFactorySwapScreen->unk24; - LoadPalette(pal, 0xF0, 0xA); + pal[4] = sFactorySwapScreen->speciesNameColorBackup; + LoadPalette(pal, 0xF0, sizeof(sSwapText_Pal)); - PutWindowTilemap(7); - FillWindowPixelBuffer(7, PIXEL_FILL(0)); - if (sFactorySwapScreen->cursorPos > 2) + PutWindowTilemap(SWAP_WIN_SPECIES_AT_FADE); + FillWindowPixelBuffer(SWAP_WIN_SPECIES_AT_FADE, PIXEL_FILL(0)); + if (sFactorySwapScreen->cursorPos >= FRONTIER_PARTY_SIZE) { - CopyWindowToVram(7, 3); + CopyWindowToVram(SWAP_WIN_SPECIES_AT_FADE, 3); } else { @@ -3722,22 +3885,23 @@ static void Swap_PrintMonSpecies2(void) species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); StringCopy(gStringVar4, gSpeciesNames[species]); x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(7, 1, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); - CopyWindowToVram(7, 3); + AddTextPrinterParameterized3(SWAP_WIN_SPECIES_AT_FADE, 1, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); + CopyWindowToVram(SWAP_WIN_SPECIES_AT_FADE, 3); } } -static void Swap_PrintMonSpecies3(void) +// Reprints the species name over the faded one after a transition +static void Swap_PrintMonSpeciesForTransition(void) { u16 species; u8 x; - LoadPalette(gUnknown_08610918, 0xE0, sizeof(gUnknown_08610918)); - CpuCopy16(gPlttBufferUnfaded + 240, gPlttBufferFaded + 224, 10); + LoadPalette(sSwapText_Pal, 0xE0, sizeof(sSwapText_Pal)); + CpuCopy16(&gPlttBufferUnfaded[240], &gPlttBufferFaded[224], 10); - if (sFactorySwapScreen->cursorPos > 2) + if (sFactorySwapScreen->cursorPos >= FRONTIER_PARTY_SIZE) { - CopyWindowToVram(1, 2); + CopyWindowToVram(SWAP_WIN_SPECIES, 2); } else { @@ -3748,8 +3912,8 @@ static void Swap_PrintMonSpecies3(void) species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); StringCopy(gStringVar4, gSpeciesNames[species]); x = GetStringRightAlignXOffset(1, gStringVar4, 86); - AddTextPrinterParameterized3(1, 1, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); - CopyWindowToVram(1, 3); + AddTextPrinterParameterized3(SWAP_WIN_SPECIES, 1, x, 1, sSwapSpeciesNameTextColors, 0, gStringVar4); + CopyWindowToVram(SWAP_WIN_SPECIES, 3); } } @@ -3760,22 +3924,22 @@ static void Swap_PrintMonCategory(void) u8 x; u8 monId = sFactorySwapScreen->cursorPos; - FillWindowPixelBuffer(8, PIXEL_FILL(0)); - if (monId > 2) + FillWindowPixelBuffer(SWAP_WIN_MON_CATEGORY, PIXEL_FILL(0)); + if (monId >= FRONTIER_PARTY_SIZE) { - CopyWindowToVram(8, 2); + CopyWindowToVram(SWAP_WIN_MON_CATEGORY, 2); } else { - PutWindowTilemap(8); + PutWindowTilemap(SWAP_WIN_MON_CATEGORY); if (!sFactorySwapScreen->inEnemyScreen) species = GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES, NULL); else species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); CopyMonCategoryText(SpeciesToNationalPokedexNum(species), text); x = GetStringRightAlignXOffset(1, text, 0x76); - AddTextPrinterParameterized(8, 1, text, x, 1, 0, NULL); - CopyWindowToVram(8, 2); + AddTextPrinterParameterized(SWAP_WIN_MON_CATEGORY, 1, text, x, 1, 0, NULL); + CopyWindowToVram(SWAP_WIN_MON_CATEGORY, 2); } } @@ -3785,13 +3949,13 @@ static void Swap_InitActions(u8 id) { switch (id) { - case ACTIONS_PLAYER_SCREEN: + case SWAP_PLAYER_SCREEN: sFactorySwapScreen->inEnemyScreen = FALSE; sFactorySwapScreen->cursorPos = 0; sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_PlayerScreenActions); sFactorySwapScreen->actionsData = sSwap_PlayerScreenActions; break; - case ACTIONS_ENEMY_SCREEN: + case SWAP_ENEMY_SCREEN: sFactorySwapScreen->inEnemyScreen = TRUE; sFactorySwapScreen->cursorPos = 0; sFactorySwapScreen->actionsCount = ARRAY_COUNT(sSwap_EnemyScreenActions); @@ -3803,92 +3967,94 @@ static void Swap_InitActions(u8 id) static void Swap_RunMenuOptionFunc(u8 taskId) { - sSwap_CurrentTableFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos]; - sSwap_CurrentTableFunc(taskId); + sSwap_CurrentOptionFunc = sSwap_MenuOptionFuncs[sFactorySwapScreen->menuCursorPos]; + sSwap_CurrentOptionFunc(taskId); } -static void sub_819F0CC(u8 taskId) +static void Swap_OptionSwap(u8 taskId) { - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); + CloseMonPic(sFactorySwapScreen->monPic, &sFactorySwapScreen->monPicAnimating, TRUE); sFactorySwapScreen->playerMonId = sFactorySwapScreen->cursorPos; - sub_819EA64(3); - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_819D9EC; + Swap_ErasePopupMenu(SWAP_WIN_OPTIONS); + gTasks[taskId].tState = 0; + gTasks[taskId].func = Swap_Task_SwitchPartyScreen; } -static void sub_819F114(u8 taskId) +static void Swap_OptionSummary(u8 taskId) { - gTasks[taskId].data[0] = 6; - gTasks[taskId].func = Task_FromSwapScreenToSummaryScreen; + gTasks[taskId].tState = STATE_SUMMARY_FADE; + gTasks[taskId].func = Swap_Task_OpenSummaryScreen; } -static void sub_819F134(u8 taskId) +static void Swap_OptionRechoose(u8 taskId) { - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - sub_819EA64(3); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenChooseMons) >> 0x10; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenChooseMons); - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = sub_819D770; + CloseMonPic(sFactorySwapScreen->monPic, &sFactorySwapScreen->monPicAnimating, TRUE); + Swap_ErasePopupMenu(SWAP_WIN_OPTIONS); + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_HandleChooseMons) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_HandleChooseMons); + gTasks[taskId].tFollowUpTaskState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionIn; } static void Swap_RunActionFunc(u8 taskId) { - sSwap_CurrentTableFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func; - sSwap_CurrentTableFunc(taskId); + sSwap_CurrentOptionFunc = sFactorySwapScreen->actionsData[sFactorySwapScreen->cursorPos].func; + sSwap_CurrentOptionFunc(taskId); } static void Swap_ActionCancel(u8 taskId) { - gTasks[taskId].data[6] = (u32)(sub_819CC24) >> 0x10; - gTasks[taskId].data[7] = (u32)(sub_819CC24); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[5] = 0; - gTasks[taskId].func = sub_819D588; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_AskQuitSwapping) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_AskQuitSwapping); + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskState = 0; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionOut; } static void Swap_ActionPkmnForSwap(u8 taskId) { - gTasks[taskId].data[6] = (u32)(sub_819D9EC) >> 0x10; - gTasks[taskId].data[7] = (u32)(sub_819D9EC); - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_819D588; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_SwitchPartyScreen) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_SwitchPartyScreen); + gTasks[taskId].tFollowUpTaskState = 0; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionOut; } static void Swap_ActionMon(u8 taskId) { if (!sFactorySwapScreen->inEnemyScreen) { - gTasks[taskId].data[6] = (u32)(Task_HandleSwapScreenMenu) >> 0x10; - gTasks[taskId].data[7] = (u32)(Task_HandleSwapScreenMenu); - gTasks[taskId].data[5] = 2; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_Task_HandleMenu) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_Task_HandleMenu); + gTasks[taskId].tFollowUpTaskState = STATE_MENU_INIT; } else if (Swap_AlreadyHasSameSpecies(sFactorySwapScreen->cursorPos) == TRUE) { - sub_819F2B4(&sFactorySwapScreen->unk2C.field1, &sFactorySwapScreen->unk30, TRUE); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[5] = 1; - gTasks[taskId].func = Task_SwapCantHaveSameMons; + OpenMonPic(&sFactorySwapScreen->monPic.bgSpriteId, &sFactorySwapScreen->monPicAnimating, TRUE); + gTasks[taskId].tState = 0; + gTasks[taskId].tFollowUpTaskState = STATE_CHOOSE_MONS_HANDLE_INPUT; + gTasks[taskId].func = Swap_TaskCantHaveSameMons; return; } else { - gTasks[taskId].data[6] = (u32)(sub_819CCD4) >> 0x10; - gTasks[taskId].data[7] = (u32)(sub_819CCD4); - gTasks[taskId].data[5] = 0; + gTasks[taskId].tFollowUpTaskPtrHi = (u32)(Swap_AskAcceptMon) >> 16; + gTasks[taskId].tFollowUpTaskPtrLo = (u32)(Swap_AskAcceptMon); + gTasks[taskId].tFollowUpTaskState = 0; } - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = sub_819D588; + gTasks[taskId].tState = 0; + gTasks[taskId].func = Swap_Task_ScreenInfoTransitionOut; } -static void sub_819F2B4(u8 *arg0, bool8 *arg1, bool8 swapScreen) +#define sIsSwapScreen data[7] + +static void OpenMonPic(u8 *spriteId, bool8 *animating, bool8 swapScreen) { - *arg0 = CreateSprite(&gUnknown_08610894, 120, 64, 1); - gSprites[*arg0].callback = sub_819F600; - gSprites[*arg0].data[7] = swapScreen; - *arg1 = TRUE; + *spriteId = CreateSprite(&sSpriteTemplate_Swap_MonPicBgAnim, 120, 64, 1); + gSprites[*spriteId].callback = SpriteCB_OpenMonPic; + gSprites[*spriteId].sIsSwapScreen = swapScreen; + *animating = TRUE; } static void Swap_ShowSummaryMonSprite(void) @@ -3897,83 +4063,83 @@ static void Swap_ShowSummaryMonSprite(void) u16 species; u32 personality, otId; - sFactorySwapScreen->unk2C.field1 = CreateSprite(&gUnknown_08610894, 120, 64, 1); - StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->unk2C.field1], 2); + sFactorySwapScreen->monPic.bgSpriteId = CreateSprite(&sSpriteTemplate_Swap_MonPicBgAnim, 120, 64, 1); + StartSpriteAffineAnim(&gSprites[sFactorySwapScreen->monPic.bgSpriteId], 2); mon = &gPlayerParty[sFactorySwapScreen->cursorPos]; species = GetMonData(mon, MON_DATA_SPECIES, NULL); personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - #ifdef BUGFIX - sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - #else - sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); - #endif - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0; +#ifdef BUGFIX + sFactorySwapScreen->monPic.monSpriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); +#else + sFactorySwapScreen->monPic.monSpriteId = CreateMonPicSprite_HandleDeoxys(species, personality, otId, TRUE, 88, 32, 15, 0xFFFF); +#endif + gSprites[sFactorySwapScreen->monPic.monSpriteId].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->monPic.monSpriteId].centerToCornerVecY = 0; - gSprites[sFactorySwapScreen->unk2C.field1].invisible = TRUE; + gSprites[sFactorySwapScreen->monPic.bgSpriteId].invisible = TRUE; } -static void sub_819F3F8(struct UnkFactoryStruct arg0, bool8 *arg1, bool8 swapScreen) +static void CloseMonPic(struct FactoryMonPic pic, bool8 *animating, bool8 swapScreen) { u8 taskId; - FreeAndDestroyMonPicSprite(arg0.field0); - taskId = CreateTask(sub_819F7B4, 1); - gTasks[taskId].data[7] = swapScreen; - gTasks[taskId].data[6] = arg0.field1; + FreeAndDestroyMonPicSprite(pic.monSpriteId); + taskId = CreateTask(Task_CloseMonPic, 1); + gTasks[taskId].tIsSwapScreen = swapScreen; + gTasks[taskId].tSpriteId = pic.bgSpriteId; gTasks[taskId].func(taskId); - *arg1 = TRUE; + *animating = TRUE; } -static void sub_819F444(struct UnkFactoryStruct arg0, bool8 *arg1) +static void HideMonPic(struct FactoryMonPic pic, bool8 *animating) { - FreeAndDestroyMonPicSprite(arg0.field0); - FreeOamMatrix(gSprites[arg0.field1].oam.matrixNum); - DestroySprite(&gSprites[arg0.field1]); - *arg1 = FALSE; + FreeAndDestroyMonPicSprite(pic.monSpriteId); + FreeOamMatrix(gSprites[pic.bgSpriteId].oam.matrixNum); + DestroySprite(&gSprites[pic.bgSpriteId]); + *animating = FALSE; } -static void Task_SwapCantHaveSameMons(u8 taskId) +static void Swap_TaskCantHaveSameMons(u8 taskId) { - if (sFactorySwapScreen->unk30 == TRUE) + if (sFactorySwapScreen->monPicAnimating == TRUE) return; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: Swap_PrintOnInfoWindow(gText_SamePkmnInPartyAlready); sFactorySwapScreen->monSwapped = FALSE; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 1: if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - sub_819F3F8(sFactorySwapScreen->unk2C, &sFactorySwapScreen->unk30, TRUE); - gTasks[taskId].data[0]++; + CloseMonPic(sFactorySwapScreen->monPic, &sFactorySwapScreen->monPicAnimating, TRUE); + gTasks[taskId].tState++; } break; case 2: - if (sFactorySwapScreen->unk30 != TRUE) + if (sFactorySwapScreen->monPicAnimating != TRUE) { - FillWindowPixelBuffer(5, PIXEL_FILL(0)); - CopyWindowToVram(5, 2); - gTasks[taskId].data[0]++; + FillWindowPixelBuffer(SWAP_WIN_ACTION_FADE, PIXEL_FILL(0)); + CopyWindowToVram(SWAP_WIN_ACTION_FADE, 2); + gTasks[taskId].tState++; } break; case 3: Swap_PrintOnInfoWindow(gText_SelectPkmnToAccept); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 4: - Swap_PrintMonSpecies3(); - sub_819EADC(); - sFactorySwapScreen->unk22 = TRUE; - gTasks[taskId].data[0] = gTasks[taskId].data[5]; - gTasks[taskId].func = Task_HandleSwapScreenChooseMons; + Swap_PrintMonSpeciesForTransition(); + Swap_EraseSpeciesAtFadeWindow(); + sFactorySwapScreen->fadeSpeciesNameActive = TRUE; + gTasks[taskId].tState = gTasks[taskId].tFollowUpTaskState; + gTasks[taskId].func = Swap_Task_HandleChooseMons; break; } } @@ -3983,7 +4149,7 @@ static bool8 Swap_AlreadyHasSameSpecies(u8 monId) u8 i; u16 species = GetMonData(&gEnemyParty[monId], MON_DATA_SPECIES, NULL); - for (i = 0; i < 3; i++) + for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { if (i != sFactorySwapScreen->playerMonId && (u16)(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES, NULL)) == species) return TRUE; @@ -3991,120 +4157,131 @@ static bool8 Swap_AlreadyHasSameSpecies(u8 monId) return FALSE; } -static void sub_819F600(struct Sprite *sprite) +static void SpriteCB_OpenMonPic(struct Sprite *sprite) { u8 taskId; if (sprite->affineAnimEnded) { sprite->invisible = TRUE; - taskId = CreateTask(sub_819F69C, 1); - gTasks[taskId].data[7] = sprite->data[7]; + taskId = CreateTask(Task_OpenMonPic, 1); + gTasks[taskId].tIsSwapScreen = sprite->sIsSwapScreen; gTasks[taskId].func(taskId); sprite->callback = SpriteCallbackDummy; } } -static void sub_819F654(struct Sprite *sprite) +static void SpriteCB_CloseMonPic(struct Sprite *sprite) { if (sprite->affineAnimEnded) { FreeOamMatrix(sprite->oam.matrixNum); - if (sprite->data[7] == TRUE) - sFactorySwapScreen->unk30 = FALSE; + if (sprite->sIsSwapScreen == TRUE) + sFactorySwapScreen->monPicAnimating = FALSE; else - sub_819BE20(FALSE); + Select_SetMonPicAnimating(FALSE); DestroySprite(sprite); } } -static void sub_819F69C(u8 taskId) +static void Task_OpenMonPic(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: - task->data[3] = 88; - task->data[24] = 152; // BUG: writing outside the array's bounds. - task->data[5] = 64; - task->data[8] = 65; + // Init + task->tWinLeft = 88; + task->tWinRight = DISPLAY_WIDTH - 88; + task->tWinTop = 64; + task->tWinBottom = 65; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWinLeft, task->tWinRight)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); break; case 1: + // Show mon pic bg ShowBg(3); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(11, 4)); break; case 2: - task->data[5] -= 4; - task->data[8] += 4; - if (task->data[5] <= 32 || task->data[8] >= 96) + // Animate mon pic bg + task->tWinTop -= 4; + task->tWinBottom += 4; + if (task->tWinTop <= 32 || task->tWinBottom >= 96) { - task->data[5] = 32; - task->data[8] = 96; + task->tWinTop = 32; + task->tWinBottom = 96; } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] != 32) + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); + if (task->tWinTop != 32) return; break; default: + #ifndef UBFIX DestroyTask(taskId); + #endif // UB: Should not use the task after it has been deleted. - if (gTasks[taskId].data[7] == TRUE) - Swap_ShowMonSprite(); + if (gTasks[taskId].tIsSwapScreen == TRUE) + Swap_CreateMonSprite(); else - Summary_ShowMonSprite(); + Select_CreateMonSprite(); + #ifdef UBFIX + DestroyTask(taskId); + #endif return; } - task->data[0]++; + task->tState++; } -static void sub_819F7B4(u8 taskId) +static void Task_CloseMonPic(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { - default: - HideBg(3); - gSprites[task->data[6]].data[7] = task->data[7]; - gSprites[task->data[6]].invisible = FALSE; - gSprites[task->data[6]].callback = sub_819F654; - StartSpriteAffineAnim(&gSprites[task->data[6]], 1); - ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - DestroyTask(taskId); - break; case 0: - task->data[3] = 88; - task->data[24] = 152; // BUG: writing outside the array's bounds. - task->data[5] = 32; - task->data[8] = 96; + // Init + task->tWinLeft = 88; + task->tWinRight = DISPLAY_WIDTH - 88; + task->tWinTop = 32; + task->tWinBottom = 96; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->data[3], task->data[24])); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWinLeft, task->tWinRight)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_CLR | WINOUT_WIN01_OBJ); - task->data[0]++; + task->tState++; break; case 1: - task->data[5] += 4; - task->data[8] -= 4; - if (task->data[5] >= 64 || task->data[8] <= 65) + // Animate bg + task->tWinTop += 4; + task->tWinBottom -= 4; + if (task->tWinTop >= 64 || task->tWinBottom <= 65) { - task->data[5] = 64; - task->data[8] = 65; + task->tWinTop = 64; + task->tWinBottom = 65; } - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->data[5], task->data[8])); - if (task->data[5] == 64) - task->data[0]++; + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(task->tWinTop, task->tWinBottom)); + if (task->tWinTop == 64) + task->tState++; + break; + default: + // Hide bg + HideBg(3); + gSprites[task->tSpriteId].sIsSwapScreen = task->tIsSwapScreen; + gSprites[task->tSpriteId].invisible = FALSE; + gSprites[task->tSpriteId].callback = SpriteCB_CloseMonPic; + StartSpriteAffineAnim(&gSprites[task->tSpriteId], 1); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); + DestroyTask(taskId); break; } } -static void Swap_ShowMonSprite(void) +static void Swap_CreateMonSprite(void) { struct Pokemon *mon; u16 species; @@ -4119,9 +4296,9 @@ static void Swap_ShowMonSprite(void) personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - sFactorySwapScreen->unk2C.field0 = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecX = 0; - gSprites[sFactorySwapScreen->unk2C.field0].centerToCornerVecY = 0; + sFactorySwapScreen->monPic.monSpriteId = CreateMonPicSprite_HandleDeoxys(species, otId, personality, TRUE, 88, 32, 15, 0xFFFF); + gSprites[sFactorySwapScreen->monPic.monSpriteId].centerToCornerVecX = 0; + gSprites[sFactorySwapScreen->monPic.monSpriteId].centerToCornerVecY = 0; - sFactorySwapScreen->unk30 = FALSE; + sFactorySwapScreen->monPicAnimating = FALSE; } diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index c6db4ad42..88e69665e 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -39,8 +39,8 @@ extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; // this file's functions static u8 GetBattlePalaceMoveGroup(u16 move); static u16 GetBattlePalaceTarget(void); -static void sub_805D7EC(struct Sprite *sprite); -static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId); +static void SpriteCB_TrainerSlideVertical(struct Sprite *sprite); +static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId); static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId); static void Task_ClearBitWhenSpecialAnimDone(u8 taskId); static void ClearSpritesBattlerHealthboxAnimData(void); @@ -336,7 +336,8 @@ static u16 GetBattlePalaceTarget(void) return (gActiveBattler ^ BIT_SIDE) << 8; } -void sub_805D714(struct Sprite *sprite) +// Wait for the pokemon to finish appearing out from the pokeball on send out +void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite) { u8 spriteId = sprite->data[1]; @@ -356,9 +357,9 @@ void sub_805D714(struct Sprite *sprite) } } -void sub_805D770(struct Sprite *sprite, bool8 arg1) +static void UnusedDoBattleSpriteAffineAnim(struct Sprite *sprite, bool8 arg1) { - sprite->animPaused = 1; + sprite->animPaused = TRUE; sprite->callback = SpriteCallbackDummy; if (!arg1) @@ -369,28 +370,33 @@ void sub_805D770(struct Sprite *sprite, bool8 arg1) AnimateSprite(sprite); } -void sub_805D7AC(struct Sprite *sprite) +#define sSpeedX data[0] + +void SpriteCB_TrainerSlideIn(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { - sprite->pos2.x += sprite->data[0]; + sprite->pos2.x += sprite->sSpeedX; if (sprite->pos2.x == 0) { if (sprite->pos2.y != 0) - sprite->callback = sub_805D7EC; + sprite->callback = SpriteCB_TrainerSlideVertical; else sprite->callback = SpriteCallbackDummy; } } } -static void sub_805D7EC(struct Sprite *sprite) +// Slide up to 0 if necessary (used by multi battle intro) +static void SpriteCB_TrainerSlideVertical(struct Sprite *sprite) { sprite->pos2.y -= 2; if (sprite->pos2.y == 0) sprite->callback = SpriteCallbackDummy; } +#undef sSpeedX + void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive = 1; @@ -438,7 +444,7 @@ bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 de return TRUE; } if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute - && !ShouldAnimBeDoneRegardlessOfSubsitute(tableId)) + && !ShouldAnimBeDoneRegardlessOfSubstitute(tableId)) { return TRUE; } @@ -474,7 +480,7 @@ static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId) #undef tBattlerId -static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId) +static bool8 ShouldAnimBeDoneRegardlessOfSubstitute(u8 animId) { switch (animId) { @@ -522,14 +528,15 @@ bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) return FALSE; } -bool8 mplay_80342A4(u8 battlerId) +// Check if SE has finished or 30 calls, whichever comes first +bool8 IsBattleSEPlaying(u8 battlerId) { u8 zero = 0; if (IsSEPlaying()) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].field_8++; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].field_8 < 30) + gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer++; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].soundTimer < 30) return TRUE; m4aMPlayStop(&gMPlayInfo_SE1); @@ -537,10 +544,11 @@ bool8 mplay_80342A4(u8 battlerId) } if (zero == 0) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].field_8 = 0; + gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer = 0; return FALSE; } + // Never reached return TRUE; } @@ -621,7 +629,7 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) otId = GetMonData(mon, MON_DATA_OT_ID); position = GetBattlerPosition(battlerId); - if (sub_80688F8(1, battlerId) == 1 || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + if (ShouldIgnoreDeoxysForm(1, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) { HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[position], @@ -660,11 +668,12 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) } } -void nullsub_23(void) +// Unused +static void BattleGfxSfxDummy1(void) { } -void nullsub_24(u16 species) +void BattleGfxSfxDummy2(u16 species) { } @@ -687,7 +696,7 @@ void DecompressTrainerBackPic(u16 backPicId, u8 battlerId) 0x100 + 16 * battlerId, 0x20); } -void nullsub_25(u8 arg0) +void BattleGfxSfxDummy3(u8 gender) { } @@ -958,7 +967,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform src = gMonSpritesGfxPtr->sprites.ptr[position]; dst = (void *)(OBJ_VRAM0 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32); - DmaCopy32(3, src, dst, 0x800); + DmaCopy32(3, src, dst, MON_PIC_SIZE); paletteOffset = 0x100 + battlerAtk * 16; lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue); LZDecompressWram(lzPaletteData, gDecompressionBuffer); @@ -997,15 +1006,15 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite) position = GetBattlerPosition(battlerId); if (IsContest()) - LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites.ptr[position]); + LZDecompressVram(gSubstituteDollBackGfx, gMonSpritesGfxPtr->sprites.ptr[position]); else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - LZDecompressVram(gSubstituteDollGfx, gMonSpritesGfxPtr->sprites.ptr[position]); + LZDecompressVram(gSubstituteDollFrontGfx, gMonSpritesGfxPtr->sprites.ptr[position]); else - LZDecompressVram(gSubstituteDollTilemap, gMonSpritesGfxPtr->sprites.ptr[position]); + LZDecompressVram(gSubstituteDollBackGfx, gMonSpritesGfxPtr->sprites.ptr[position]); for (i = 1; i < 4; i++) { - Dma3CopyLarge32_(gMonSpritesGfxPtr->sprites.ptr[position], &gMonSpritesGfxPtr->sprites.byte[position][0x800 * i], 0x800); + Dma3CopyLarge32_(gMonSpritesGfxPtr->sprites.ptr[position], &gMonSpritesGfxPtr->sprites.byte[position][MON_PIC_SIZE * i], MON_PIC_SIZE); } palOffset = (battlerId * 16) + 0x100; @@ -1110,7 +1119,7 @@ void HandleBattleLowHpMusicChange(void) } } -void sub_805EB9C(u8 affineMode) +void SetBattlerSpriteAffineMode(u8 affineMode) { s32 i; @@ -1246,12 +1255,12 @@ void AllocateMonSpritesGfx(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { gMonSpritesGfxPtr->sprites.ptr[i] = gMonSpritesGfxPtr->firstDecompressed + (i * 0x2000); - *(gMonSpritesGfxPtr->templates + i) = gUnknown_08329D98[i]; + *(gMonSpritesGfxPtr->templates + i) = gBattlerSpriteTemplates[i]; for (j = 0; j < 4; j++) { - gMonSpritesGfxPtr->field_74[i][j].data = gMonSpritesGfxPtr->sprites.ptr[i] + (j * 0x800); - gMonSpritesGfxPtr->field_74[i][j].size = 0x800; + gMonSpritesGfxPtr->field_74[i][j].data = gMonSpritesGfxPtr->sprites.ptr[i] + (j * MON_PIC_SIZE); + gMonSpritesGfxPtr->field_74[i][j].size = MON_PIC_SIZE; } gMonSpritesGfxPtr->templates[i].images = gMonSpritesGfxPtr->field_74[i]; diff --git a/src/battle_interface.c b/src/battle_interface.c index adbef019d..ff376f6f1 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -330,7 +330,7 @@ static const struct SpriteTemplate sHealthbarSpriteTemplates[MAX_BATTLERS_COUNT] static const struct Subsprite sUnknown_0832C220[] = { { - .x = 240, + .x = DISPLAY_WIDTH, .y = 0, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), @@ -346,7 +346,7 @@ static const struct Subsprite sUnknown_0832C220[] = .priority = 1 }, { - .x = 240, + .x = DISPLAY_WIDTH, .y = 32, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), @@ -374,7 +374,7 @@ static const struct Subsprite sUnknown_0832C220[] = static const struct Subsprite sUnknown_0832C234[] = { { - .x = 240, + .x = DISPLAY_WIDTH, .y = 0, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), @@ -390,7 +390,7 @@ static const struct Subsprite sUnknown_0832C234[] = .priority = 1 }, { - .x = 240, + .x = DISPLAY_WIDTH, .y = 32, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), @@ -418,7 +418,7 @@ static const struct Subsprite sUnknown_0832C234[] = static const struct Subsprite sUnknown_0832C248[] = { { - .x = 240, + .x = DISPLAY_WIDTH, .y = 0, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), @@ -438,7 +438,7 @@ static const struct Subsprite sUnknown_0832C248[] = static const struct Subsprite sUnknown_0832C250[] = { { - .x = 240, + .x = DISPLAY_WIDTH, .y = 0, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), @@ -458,7 +458,7 @@ static const struct Subsprite sUnknown_0832C250[] = static const struct Subsprite sUnknown_0832C258[] = { { - .x = 240, + .x = DISPLAY_WIDTH, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), @@ -478,7 +478,7 @@ static const struct Subsprite sUnknown_0832C258[] = static const struct Subsprite sUnknown_0832C260[] = { { - .x = 240, + .x = DISPLAY_WIDTH, .y = 0, .shape = SPRITE_SHAPE(32x8), .size = SPRITE_SIZE(32x8), @@ -494,7 +494,7 @@ static const struct Subsprite sUnknown_0832C260[] = .priority = 1 }, { - .x = 224, + .x = DISPLAY_WIDTH - 16, .y = 0, .shape = SPRITE_SHAPE(8x8), .size = SPRITE_SIZE(8x8), @@ -869,8 +869,8 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { - healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxLeftSpriteId].oam.shape = ST_OAM_SQUARE; @@ -879,8 +879,8 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) } else { - healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxRightSpriteId].oam.tileNum += 32; @@ -895,8 +895,8 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) { if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { - healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; @@ -908,8 +908,8 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) } else { - healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; @@ -946,8 +946,8 @@ u8 CreateSafariPlayerHealthboxSprites(void) { u8 healthboxLeftSpriteId, healthboxRightSpriteId; - healthboxLeftSpriteId = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxSafariSpriteTemplate, DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxLeftSpriteId].oam.shape = ST_OAM_SQUARE; gSprites[healthboxRightSpriteId].oam.shape = ST_OAM_SQUARE; @@ -1099,21 +1099,14 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) u32 windowId, spriteTileNum; u8 *windowTileData; u8 text[16]; - u32 xPos, var1; - void *objVram; - - text[0] = 0xF9; - text[1] = 5; + u32 xPos; + u8 *objVram; + + text[0] = CHAR_EXTRA_SYMBOL; + text[1] = CHAR_LV_2; - xPos = (u32) ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); - // Alright, that part was unmatchable. It's basically doing: - // xPos = 5 * (3 - (u32)(&text[2])); - xPos--; - xPos--; - xPos -= ((u32)(text)); - var1 = (3 - xPos); - xPos = 4 * var1; - xPos += var1; + objVram = ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); + xPos = 5 * (3 - (objVram - (text + 2))); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * TILE_SIZE_4BPP; @@ -1897,7 +1890,6 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) { u8 nickname[POKEMON_NAME_LENGTH + 1]; void *ptr; - const u8 *genderTxt; u32 windowId, spriteTileNum; u8 *windowTileData; u16 species; @@ -1936,7 +1928,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER) { - TextIntoHealthboxObject((void*)(VRAM + 0x10040 + spriteTileNum), windowTileData, 6); + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x40 + spriteTileNum), windowTileData, 6); ptr = (void*)(OBJ_VRAM0); if (!IsDoubleBattle()) ptr += spriteTileNum + 0x800; @@ -1946,7 +1938,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) } else { - TextIntoHealthboxObject((void*)(VRAM + 0x10020 + spriteTileNum), windowTileData, 7); + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x20 + spriteTileNum), windowTileData, 7); } RemoveWindowOnHealthbox(windowId); diff --git a/src/battle_intro.c b/src/battle_intro.c index 36ff325f5..0ea65dab1 100644 --- a/src/battle_intro.c +++ b/src/battle_intro.c @@ -13,8 +13,8 @@ static EWRAM_DATA u16 sBgCnt = 0; -extern const u8 gUnknown_0859741A[]; -extern const u8 gUnknown_0859741E[]; +extern const u8 gBattleAnimBgCntSet[]; +extern const u8 gBattleAnimBgCntGet[]; static void BattleIntroSlide1(u8); static void BattleIntroSlide2(u8); @@ -24,23 +24,23 @@ static void BattleIntroSlidePartner(u8); static const TaskFunc sBattleIntroSlideFuncs[] = { - BattleIntroSlide1, // BATTLE_TERRAIN_GRASS - BattleIntroSlide1, // BATTLE_TERRAIN_LONG_GRASS - BattleIntroSlide2, // BATTLE_TERRAIN_SAND - BattleIntroSlide2, // BATTLE_TERRAIN_UNDERWATER - BattleIntroSlide2, // BATTLE_TERRAIN_WATER - BattleIntroSlide1, // BATTLE_TERRAIN_POND - BattleIntroSlide1, // BATTLE_TERRAIN_MOUNTAIN - BattleIntroSlide1, // BATTLE_TERRAIN_CAVE - BattleIntroSlide3, // BATTLE_TERRAIN_BUILDING - BattleIntroSlide3, // BATTLE_TERRAIN_PLAIN + [BATTLE_TERRAIN_GRASS] = BattleIntroSlide1, + [BATTLE_TERRAIN_LONG_GRASS] = BattleIntroSlide1, + [BATTLE_TERRAIN_SAND] = BattleIntroSlide2, + [BATTLE_TERRAIN_UNDERWATER] = BattleIntroSlide2, + [BATTLE_TERRAIN_WATER] = BattleIntroSlide2, + [BATTLE_TERRAIN_POND] = BattleIntroSlide1, + [BATTLE_TERRAIN_MOUNTAIN] = BattleIntroSlide1, + [BATTLE_TERRAIN_CAVE] = BattleIntroSlide1, + [BATTLE_TERRAIN_BUILDING] = BattleIntroSlide3, + [BATTLE_TERRAIN_PLAIN] = BattleIntroSlide3, }; void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value) { if (bgId < 4) { - sBgCnt = GetGpuReg(gUnknown_0859741A[bgId]); + sBgCnt = GetGpuReg(gBattleAnimBgCntSet[bgId]); switch (attributeId) { case BG_ANIM_SCREEN_SIZE: @@ -66,7 +66,7 @@ void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value) break; } - SetGpuReg(gUnknown_0859741A[bgId], sBgCnt); + SetGpuReg(gBattleAnimBgCntSet[bgId], sBgCnt); } } @@ -76,7 +76,7 @@ int GetAnimBgAttribute(u8 bgId, u8 attributeId) if (bgId < 4) { - bgCnt = GetGpuReg(gUnknown_0859741E[bgId]); + bgCnt = GetGpuReg(gBattleAnimBgCntGet[bgId]); switch (attributeId) { case BG_ANIM_SCREEN_SIZE: @@ -99,6 +99,9 @@ int GetAnimBgAttribute(u8 bgId, u8 attributeId) return 0; } +#define tState data[0] +#define tTerrain data[1] + void HandleIntroSlide(u8 terrain) { u8 taskId; @@ -125,8 +128,8 @@ void HandleIntroSlide(u8 terrain) taskId = CreateTask(sBattleIntroSlideFuncs[terrain], 0); } - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = terrain; + gTasks[taskId].tState = 0; + gTasks[taskId].tTerrain = terrain; gTasks[taskId].data[2] = 0; gTasks[taskId].data[3] = 0; gTasks[taskId].data[4] = 0; @@ -134,7 +137,7 @@ void HandleIntroSlide(u8 terrain) gTasks[taskId].data[6] = 0; } -void sub_811828C(u8 taskId) +static void BattleIntroSlideEnd(u8 taskId) { DestroyTask(taskId); gBattle_BG1_X = 0; @@ -153,24 +156,24 @@ static void BattleIntroSlide1(u8 taskId) int i; gBattle_BG1_X += 6; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTasks[taskId].data[2] = 16; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } else { gTasks[taskId].data[2] = 1; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 1: if (--gTasks[taskId].data[2] == 0) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); } break; @@ -178,7 +181,7 @@ static void BattleIntroSlide1(u8 taskId) gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; gTasks[taskId].data[2] = 240; gTasks[taskId].data[3] = 32; gIntroSlideFlags &= ~1; @@ -191,7 +194,7 @@ static void BattleIntroSlide1(u8 taskId) } else { - if (gTasks[taskId].data[1] == 1) + if (gTasks[taskId].tTerrain == BATTLE_TERRAIN_LONG_GRASS) { if (gBattle_BG1_Y != 0xFFB0) gBattle_BG1_Y -= 2; @@ -219,7 +222,7 @@ static void BattleIntroSlide1(u8 taskId) if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); @@ -228,7 +231,7 @@ static void BattleIntroSlide1(u8 taskId) } break; case 4: - sub_811828C(taskId); + BattleIntroSlideEnd(taskId); break; } } @@ -237,18 +240,18 @@ static void BattleIntroSlide2(u8 taskId) { int i; - switch (gTasks[taskId].data[1]) + switch (gTasks[taskId].tTerrain) { - case 2: - case 4: + case BATTLE_TERRAIN_SAND: + case BATTLE_TERRAIN_WATER: gBattle_BG1_X += 8; break; - case 3: + case BATTLE_TERRAIN_UNDERWATER: gBattle_BG1_X += 6; break; } - if (gTasks[taskId].data[1] == 4) + if (gTasks[taskId].tTerrain == BATTLE_TERRAIN_WATER) { gBattle_BG1_Y = Cos2(gTasks[taskId].data[6]) / 512 - 8; if (gTasks[taskId].data[6] < 180) @@ -260,25 +263,25 @@ static void BattleIntroSlide2(u8 taskId) gTasks[taskId].data[6] = 0; } - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: gTasks[taskId].data[4] = 16; if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTasks[taskId].data[2] = 16; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } else { gTasks[taskId].data[2] = 1; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 1: if (--gTasks[taskId].data[2] == 0) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); } break; @@ -286,7 +289,7 @@ static void BattleIntroSlide2(u8 taskId) gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; gTasks[taskId].data[2] = 240; gTasks[taskId].data[3] = 32; gTasks[taskId].data[5] = 1; @@ -328,7 +331,7 @@ static void BattleIntroSlide2(u8 taskId) if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); @@ -337,11 +340,11 @@ static void BattleIntroSlide2(u8 taskId) } break; case 4: - sub_811828C(taskId); + BattleIntroSlideEnd(taskId); break; } - if (gTasks[taskId].data[0] != 4) + if (gTasks[taskId].tState != 4) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0)); } @@ -350,28 +353,28 @@ static void BattleIntroSlide3(u8 taskId) int i; gBattle_BG1_X += 8; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].data[4] = BLDALPHA_BLEND(8, 8); - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { gTasks[taskId].data[2] = 16; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } else { gTasks[taskId].data[2] = 1; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 1: if (--gTasks[taskId].data[2] == 0) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); } break; @@ -379,7 +382,7 @@ static void BattleIntroSlide3(u8 taskId) gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; gTasks[taskId].data[2] = 240; gTasks[taskId].data[3] = 32; gTasks[taskId].data[5] = 1; @@ -416,7 +419,7 @@ static void BattleIntroSlide3(u8 taskId) if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE); SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); @@ -425,11 +428,11 @@ static void BattleIntroSlide3(u8 taskId) } break; case 4: - sub_811828C(taskId); + BattleIntroSlideEnd(taskId); break; } - if (gTasks[taskId].data[0] != 4) + if (gTasks[taskId].tState != 4) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0)); } @@ -437,7 +440,7 @@ static void BattleIntroSlideLink(u8 taskId) { int i; - if (gTasks[taskId].data[0] > 1 && !gTasks[taskId].data[4]) + if (gTasks[taskId].tState > 1 && !gTasks[taskId].data[4]) { u16 var0 = gBattle_BG1_X & 0x8000; if (var0 || gBattle_BG1_X < 80) @@ -453,20 +456,20 @@ static void BattleIntroSlideLink(u8 taskId) } } - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: gTasks[taskId].data[2] = 32; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 1: if (--gTasks[taskId].data[2] == 0) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; gSprites[gBattleStruct->linkBattleVsSpriteId_V].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = sub_8038B74; + gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = SpriteCB_VsLetterInit; gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.objMode = ST_OAM_OBJ_WINDOW; - gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = sub_8038B74; + gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = SpriteCB_VsLetterInit; SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2); } @@ -475,7 +478,7 @@ static void BattleIntroSlideLink(u8 taskId) gBattle_WIN0V -= 0xFF; if ((gBattle_WIN0V & 0xFF00) == 0x3000) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; gTasks[taskId].data[2] = 240; gTasks[taskId].data[3] = 32; gIntroSlideFlags &= ~1; @@ -498,7 +501,7 @@ static void BattleIntroSlideLink(u8 taskId) if (!gTasks[taskId].data[2]) { gScanlineEffect.state = 3; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0); SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); @@ -506,31 +509,31 @@ static void BattleIntroSlideLink(u8 taskId) } break; case 4: - sub_811828C(taskId); + BattleIntroSlideEnd(taskId); break; } } static void BattleIntroSlidePartner(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: gTasks[taskId].data[2] = 1; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 1: if (--gTasks[taskId].data[2] == 0) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT512x256); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3 | WININ_WIN1_OBJ | WININ_WIN1_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR); gBattle_BG0_Y = -48; - gBattle_BG1_X = 240; - gBattle_BG2_X = -240; + gBattle_BG1_X = DISPLAY_WIDTH; + gBattle_BG2_X = -DISPLAY_WIDTH; } break; case 2: @@ -540,7 +543,7 @@ static void BattleIntroSlidePartner(u8 taskId) if ((gBattle_WIN0V & 0xFF00) == 0x2000) { - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; gTasks[taskId].data[2] = 240; gIntroSlideFlags &= ~1; } @@ -555,7 +558,7 @@ static void BattleIntroSlidePartner(u8 taskId) gBattle_BG1_X = gTasks[taskId].data[2]; gBattle_BG2_X = -gTasks[taskId].data[2]; if (!gTasks[taskId].data[2]) - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 4: gBattle_BG0_Y += 2; @@ -572,11 +575,11 @@ static void BattleIntroSlidePartner(u8 taskId) SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256); gScanlineEffect.state = 3; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; } break; case 5: - sub_811828C(taskId); + BattleIntroSlideEnd(taskId); break; } } diff --git a/src/battle_main.c b/src/battle_main.c index 5bc80f61e..001e2ec17 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -68,9 +68,6 @@ extern const struct BgTemplate gBattleBgTemplates[]; extern const struct WindowTemplate *const gBattleWindowTemplates[]; // this file's functions -#if !defined(NONMATCHING) && MODERN -#define static -#endif static void CB2_InitBattleInternal(void); static void CB2_PreInitMultiBattle(void); static void CB2_PreInitIngamePlayerPartnerBattle(void); @@ -81,8 +78,8 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon); static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 firstTrainer); static void BattleMainCB1(void); static void sub_8038538(struct Sprite *sprite); -static void sub_8038F14(void); -static void sub_8038F34(void); +static void CB2_EndLinkBattle(void); +static void EndLinkBattleInSteps(void); static void sub_80392A8(void); static void sub_803937C(void); static void sub_803939C(void); @@ -93,7 +90,7 @@ static void sub_80398D0(struct Sprite *sprite); static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite); static void SpriteCb_BlinkVisible(struct Sprite *sprite); static void SpriteCallbackDummy_3(struct Sprite *sprite); -static void oac_poke_ally_(struct Sprite *sprite); +static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite); static void TurnValuesCleanUp(bool8 var0); static void SpriteCB_BounceEffect(struct Sprite *sprite); static void BattleStartClearSetData(void); @@ -147,7 +144,7 @@ EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0}; EWRAM_DATA static u32 sUnusedUnknownArray[25] = {0}; EWRAM_DATA u32 gBattleTypeFlags = 0; EWRAM_DATA u8 gBattleTerrain = 0; -EWRAM_DATA u32 gUnknown_02022FF4 = 0; +EWRAM_DATA u32 gUnusedFirstBattleVar1 = 0; // Never read EWRAM_DATA struct UnknownPokemonStruct4 gMultiPartnerParty[MULTI_PARTY_SIZE] = {0}; EWRAM_DATA static struct UnknownPokemonStruct4* sMultiPartnerPartyBuffer = NULL; EWRAM_DATA u8 *gUnknown_0202305C = NULL; @@ -200,7 +197,7 @@ EWRAM_DATA u8 gMoveResultFlags = 0; EWRAM_DATA u32 gHitMarker = 0; EWRAM_DATA static u8 sUnusedBattlersArray[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gTakenDmgByBattler[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u8 gUnknown_0202428C = 0; +EWRAM_DATA u8 gUnusedFirstBattleVar2 = 0; // Never read EWRAM_DATA u16 gSideStatuses[2] = {0}; EWRAM_DATA struct SideTimer gSideTimers[2] = {0}; EWRAM_DATA u32 gStatuses3[MAX_BATTLERS_COUNT] = {0}; @@ -233,8 +230,8 @@ EWRAM_DATA u32 gTransformedPersonalities[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gPlayerDpadHoldFrames = 0; EWRAM_DATA struct BattleSpriteData *gBattleSpritesDataPtr = NULL; EWRAM_DATA struct MonSpritesGfx *gMonSpritesGfxPtr = NULL; -EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244D8 = NULL; -EWRAM_DATA struct BattleHealthboxInfo *gUnknown_020244DC = NULL; +EWRAM_DATA struct BattleHealthboxInfo *gBattleControllerOpponentHealthboxData = NULL; // Never read +EWRAM_DATA struct BattleHealthboxInfo *gBattleControllerOpponentFlankHealthboxData = NULL; // Never read EWRAM_DATA u16 gBattleMovePower = 0; EWRAM_DATA u16 gMoveToLearn = 0; EWRAM_DATA u8 gBattleMonForms[MAX_BATTLERS_COUNT] = {0}; @@ -248,7 +245,7 @@ void (*gBattlerControllerFuncs[MAX_BATTLERS_COUNT])(void); u8 gHealthboxSpriteIds[MAX_BATTLERS_COUNT]; u8 gMultiUsePlayerCursor; u8 gNumberOfMovesToChoose; -u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT]; +u8 gBattleControllerData[MAX_BATTLERS_COUNT]; // Used by the battle controllers to store misc sprite/task IDs for each battler // rom const data static const struct ScanlineEffectParams sIntroScanlineParams16Bit = @@ -275,7 +272,7 @@ const struct SpriteTemplate gUnknown_0831AC88 = static const u8 sText_ShedinjaJpnName[] = _("ヌケニン"); // Nukenin -const struct OamData gOamData_831ACA8 = +const struct OamData gOamData_BattleSpriteOpponentSide = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, @@ -290,7 +287,7 @@ const struct OamData gOamData_831ACA8 = .affineParam = 0, }; -const struct OamData gOamData_831ACB0 = +const struct OamData gOamData_BattleSpritePlayerSide = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, @@ -306,10 +303,10 @@ const struct OamData gOamData_831ACB0 = }; // Unknown and unused data. Feel free to remove. -static const u16 gUnknown_0831ACB8[] = {0, 5, 0xfffe, 0}; -static const u16 *const gUnknown_0831ACC0 = gUnknown_0831ACB8; -static const u16 gUnknown_0831ACC4[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0}; -static const u16 *const gUnknown_0831ACDC = gUnknown_0831ACC4; +static const u16 sUnused1[] = {0, 5, 0xfffe, 0}; +static const u16 *const sUnused1Ptr = sUnused1; +static const u16 sUnused2[] = {0xfff0, 0, 0x0400, 0, 0, 0, 0x3c00, 0, 0x7ffe, 1, 0, 0}; +static const u16 *const sUnused2Ptr = sUnused2; static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0}; @@ -437,24 +434,24 @@ const u8 gTypeEffectiveness[336] = const u8 gTypeNames[NUMBER_OF_MON_TYPES][TYPE_NAME_LENGTH + 1] = { - _("NORMAL"), - _("FIGHT"), - _("FLYING"), - _("POISON"), - _("GROUND"), - _("ROCK"), - _("BUG"), - _("GHOST"), - _("STEEL"), - _("???"), - _("FIRE"), - _("WATER"), - _("GRASS"), - _("ELECTR"), - _("PSYCHC"), - _("ICE"), - _("DRAGON"), - _("DARK"), + [TYPE_NORMAL] = _("NORMAL"), + [TYPE_FIGHTING] = _("FIGHT"), + [TYPE_FLYING] = _("FLYING"), + [TYPE_POISON] = _("POISON"), + [TYPE_GROUND] = _("GROUND"), + [TYPE_ROCK] = _("ROCK"), + [TYPE_BUG] = _("BUG"), + [TYPE_GHOST] = _("GHOST"), + [TYPE_STEEL] = _("STEEL"), + [TYPE_MYSTERY] = _("???"), + [TYPE_FIRE] = _("FIRE"), + [TYPE_WATER] = _("WATER"), + [TYPE_GRASS] = _("GRASS"), + [TYPE_ELECTRIC] = _("ELECTR"), + [TYPE_PSYCHIC] = _("PSYCHC"), + [TYPE_ICE] = _("ICE"), + [TYPE_DRAGON] = _("DRAGON"), + [TYPE_DARK] = _("DARK"), }; // This is a factor in how much money you get for beating a trainer. @@ -579,7 +576,7 @@ void CB2_InitBattle(void) AllocateBattleResources(); AllocateBattleSpritesData(); AllocateMonSpritesGfx(); - sub_8185F84(); + RecordedBattle_ClearFrontierPassFlag(); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -614,22 +611,22 @@ static void CB2_InitBattleInternal(void) CpuFill32(0, (void*)(VRAM), VRAM_SIZE); SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WIN0H, 240); - SetGpuReg(REG_OFFSET_WIN0V, 0x5051); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1)); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); - gBattle_WIN0H = 240; + gBattle_WIN0H = DISPLAY_WIDTH; if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) { - gBattle_WIN0V = 159; - gBattle_WIN1H = 240; + gBattle_WIN0V = DISPLAY_HEIGHT - 1; + gBattle_WIN1H = DISPLAY_WIDTH; gBattle_WIN1V = 32; } else { - gBattle_WIN0V = 0x5051; + gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); ScanlineEffect_Clear(); i = 0; @@ -700,46 +697,52 @@ static void CB2_InitBattleInternal(void) gBattleCommunication[MULTIUSE_STATE] = 0; } -static void sub_8036A5C(void) +#define BUFFER_PARTY_VS_SCREEN_STATUS(party, flags, i) \ + for ((i) = 0; (i) < PARTY_SIZE; (i)++) \ + { \ + u16 species = GetMonData(&(party)[(i)], MON_DATA_SPECIES2); \ + u16 hp = GetMonData(&(party)[(i)], MON_DATA_HP); \ + u32 status = GetMonData(&(party)[(i)], MON_DATA_STATUS); \ + \ + if (species == SPECIES_NONE) \ + continue; \ + \ + /* Is healthy mon? */ \ + if (species != SPECIES_EGG && hp != 0 && status == 0) \ + (flags) |= 1 << (i) * 2; \ + \ + if (species == SPECIES_NONE) /* Redundant */ \ + continue; \ + \ + /* Is Egg or statused? */ \ + if (hp != 0 && (species == SPECIES_EGG || status != 0)) \ + (flags) |= 2 << (i) * 2; \ + \ + if (species == SPECIES_NONE) /* Redundant */ \ + continue; \ + \ + /* Is fainted? */ \ + if (species != SPECIES_EGG && hp == 0) \ + (flags) |= 3 << (i) * 2; \ + } + +// For Vs Screen at link battle start +static void BufferPartyVsScreenHealth_AtStart(void) { - u16 r6 = 0; - u16 species = 0; - u16 hp = 0; - u32 status = 0; + u16 flags = 0; s32 i; - for (i = 0; i < PARTY_SIZE; i++) - { - species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - hp = GetMonData(&gPlayerParty[i], MON_DATA_HP); - status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS); - - if (species == SPECIES_NONE) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r6 |= 1 << i * 2; - - if (species == SPECIES_NONE) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r6 |= 2 << i * 2; - - if (species == SPECIES_NONE) - continue; - if (species != SPECIES_EGG && hp == 0) - r6 |= 3 << i * 2; - } - - gBattleStruct->field_182 = r6; - *(&gBattleStruct->field_183) = r6 >> 8; - gBattleStruct->field_183 |= FlagGet(FLAG_SYS_FRONTIER_PASS) << 7; + BUFFER_PARTY_VS_SCREEN_STATUS(gPlayerParty, flags, i); + gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo = flags; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi) = flags >> 8; + gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi |= FlagGet(FLAG_SYS_FRONTIER_PASS) << 7; } static void SetPlayerBerryDataInBattleStruct(void) { s32 i; struct BattleStruct *battleStruct = gBattleStruct; - struct BattleEnigmaBerry *battleBerry = &battleStruct->battleEnigmaBerry; + struct BattleEnigmaBerry *battleBerry = &battleStruct->multiBuffer.linkBattlerHeader.battleEnigmaBerry; if (IsEnigmaBerryValid() == TRUE) { @@ -879,52 +882,56 @@ static void SetAllPlayersBerryData(void) } } -static void sub_8036EB8(u8 arg0, u8 arg1) +// This was inlined in Ruby/Sapphire +static void FindLinkBattleMaster(u8 numPlayers, u8 multiPlayerId) { - u8 var = 0; + u8 found = 0; - if (gBlockRecvBuffer[0][0] == 256) + // If player 1 is playing the minimum version, player 1 is master. + if (gBlockRecvBuffer[0][0] == 0x100) { - if (arg1 == 0) + if (multiPlayerId == 0) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; - var++; + found++; } - if (var == 0) + if (found == 0) { + // If multiple different versions are being used, player 1 is master. s32 i; - for (i = 0; i < arg0; i++) + for (i = 0; i < numPlayers; i++) { if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) break; } - if (i == arg0) + if (i == numPlayers) { - if (arg1 == 0) + if (multiPlayerId == 0) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; - var++; + found++; } - if (var == 0) + if (found == 0) { - for (i = 0; i < arg0; i++) + // Lowest index player with the highest game version is master. + for (i = 0; i < numPlayers; i++) { - if (gBlockRecvBuffer[i][0] == 0x300) + if (gBlockRecvBuffer[i][0] == 0x300 && i != multiPlayerId) { - if (i != arg1 && i < arg1) + if (i < multiPlayerId) break; } - if (gBlockRecvBuffer[i][0] > 0x300 && i != arg1) + if (gBlockRecvBuffer[i][0] > 0x300 && i != multiPlayerId) break; } - if (i == arg0) + if (i == numPlayers) gBattleTypeFlags |= BATTLE_TYPE_IS_MASTER | BATTLE_TYPE_TRAINER; else gBattleTypeFlags |= BATTLE_TYPE_TRAINER; @@ -967,9 +974,10 @@ static void CB2_HandleStartBattle(void) { if (IsLinkTaskFinished()) { - *(&gBattleStruct->field_180) = 0; - *(&gBattleStruct->field_181) = 3; - sub_8036A5C(); + // 0x300 + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3; + BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) @@ -978,7 +986,7 @@ static void CB2_HandleStartBattle(void) gLinkPlayers[1].id = 1; } - SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32); + SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); gBattleCommunication[MULTIUSE_STATE] = 2; } if (gWirelessCommType) @@ -999,16 +1007,16 @@ static void CB2_HandleStartBattle(void) u8 taskId; ResetBlockReceivedFlags(); - sub_8036EB8(2, playerMultiplayerId); + FindLinkBattleMaster(2, playerMultiplayerId); SetAllPlayersBerryData(); taskId = CreateTask(InitLinkBattleVsScreen, 0); gTasks[taskId].data[1] = 0x10E; gTasks[taskId].data[2] = 0x5A; gTasks[taskId].data[5] = 0; - gTasks[taskId].data[3] = gBattleStruct->field_182 | (gBattleStruct->field_183 << 8); + gTasks[taskId].data[3] = gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsLo | (gBattleStruct->multiBuffer.linkBattlerHeader.vsScreenHealthFlagsHi << 8); gTasks[taskId].data[4] = gBlockRecvBuffer[enemyMultiplayerId][1]; - sub_8185F90(gBlockRecvBuffer[playerMultiplayerId][1]); - sub_8185F90(gBlockRecvBuffer[enemyMultiplayerId][1]); + RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[playerMultiplayerId][1]); + RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[enemyMultiplayerId][1]); SetDeoxysStats(); gBattleCommunication[MULTIUSE_STATE]++; } @@ -1065,7 +1073,7 @@ static void CB2_HandleStartBattle(void) } break; case 15: - sub_8032768(); + InitBattleControllers(); sub_8184E58(); gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; @@ -1109,7 +1117,7 @@ static void CB2_HandleStartBattle(void) SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gBattleTypeFlags |= BATTLE_TYPE_20; + gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } break; @@ -1175,11 +1183,12 @@ static void CB2_HandleStartMultiPartnerBattle(void) if (IsLinkTaskFinished()) { - *(&gBattleStruct->field_180) = 0; - *(&gBattleStruct->field_181) = 3; - sub_8036A5C(); + // 0x300 + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3; + BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); - SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32); + SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); gBattleCommunication[MULTIUSE_STATE] = 2; } @@ -1201,7 +1210,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) u8 taskId; ResetBlockReceivedFlags(); - sub_8036EB8(2, playerMultiplayerId); + FindLinkBattleMaster(2, playerMultiplayerId); SetAllPlayersBerryData(); taskId = CreateTask(InitLinkBattleVsScreen, 0); gTasks[taskId].data[1] = 0x10E; @@ -1325,7 +1334,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) } break; case 13: - sub_8032768(); + InitBattleControllers(); sub_8184E58(); gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; @@ -1357,13 +1366,13 @@ static void CB2_HandleStartMultiPartnerBattle(void) case 16: if (BattleInitAllSprites(&gBattleCommunication[SPRITES_INIT_STATE1], &gBattleCommunication[SPRITES_INIT_STATE2])) { - sub_8166188(); + TrySetLinkBattleTowerEnemyPartyLevel(); gPreBattleCallback1 = gMain.callback1; gMain.callback1 = BattleMainCB1; SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gBattleTypeFlags |= BATTLE_TYPE_20; + gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } break; @@ -1562,12 +1571,13 @@ static void CB2_HandleStartMultiBattle(void) { if (IsLinkTaskFinished()) { - *(&gBattleStruct->field_180) = 0; - *(&gBattleStruct->field_181) = 3; - sub_8036A5C(); + // 0x300 + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureLo) = 0; + *(&gBattleStruct->multiBuffer.linkBattlerHeader.versionSignatureHi) = 3; + BufferPartyVsScreenHealth_AtStart(); SetPlayerBerryDataInBattleStruct(); - SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32); + SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->multiBuffer.linkBattlerHeader, sizeof(gBattleStruct->multiBuffer.linkBattlerHeader)); gBattleCommunication[MULTIUSE_STATE]++; } if (gWirelessCommType) @@ -1586,7 +1596,7 @@ static void CB2_HandleStartMultiBattle(void) if ((GetBlockReceivedStatus() & 0xF) == 0xF) { ResetBlockReceivedFlags(); - sub_8036EB8(4, playerMultiplayerId); + FindLinkBattleMaster(4, playerMultiplayerId); SetAllPlayersBerryData(); SetDeoxysStats(); var = CreateTask(InitLinkBattleVsScreen, 0); @@ -1598,7 +1608,7 @@ static void CB2_HandleStartMultiBattle(void) for (id = 0; id < MAX_LINK_PLAYERS; id++) { - sub_8185F90(gBlockRecvBuffer[id][1]); + RecordedBattle_SetFrontierPassFlagFromHword(gBlockRecvBuffer[id][1]); switch (gLinkPlayers[id].id) { case 0: @@ -1762,7 +1772,7 @@ static void CB2_HandleStartMultiBattle(void) } break; case 7: - sub_8032768(); + InitBattleControllers(); sub_8184E58(); gBattleCommunication[SPRITES_INIT_STATE1] = 0; gBattleCommunication[SPRITES_INIT_STATE2] = 0; @@ -1783,10 +1793,10 @@ static void CB2_HandleStartMultiBattle(void) case 8: if (IsLinkTaskFinished()) { - u32* ptr = (u32*)(&gBattleStruct->field_180); + u32* ptr = gBattleStruct->multiBuffer.battleVideo; ptr[0] = gBattleTypeFlags; ptr[1] = gRecordedBattleRngSeed; // UB: overwrites berry data - SendBlock(bitmask_all_link_players_but_self(), ptr, 8); + SendBlock(bitmask_all_link_players_but_self(), ptr, sizeof(gBattleStruct->multiBuffer.battleVideo)); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -1816,7 +1826,7 @@ static void CB2_HandleStartMultiBattle(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; - gBattleTypeFlags |= BATTLE_TYPE_20; + gBattleTypeFlags |= BATTLE_TYPE_LINK_IN_BATTLE; } } break; @@ -1835,7 +1845,7 @@ void BattleMainCB2(void) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; ResetPaletteFadeControl(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); SetMainCallback2(CB2_QuitRecordedBattle); } } @@ -1969,7 +1979,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; + fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); break; } @@ -1981,7 +1991,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; + fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); for (j = 0; j < MAX_MON_MOVES; j++) @@ -1999,7 +2009,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; + fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); @@ -2013,7 +2023,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir nameHash += gSpeciesNames[partyData[i].species][j]; personalityValue += nameHash << 8; - fixedIV = partyData[i].iv * 31 / 255; + fixedIV = partyData[i].iv * MAX_PER_STAT_IVS / 255; CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); @@ -2037,7 +2047,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir void sub_8038A04(void) // unused { if (REG_VCOUNT < 0xA0 && REG_VCOUNT >= 0x6F) - SetGpuReg(REG_OFFSET_BG0CNT, 0x9800); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_SCREENBASE(24) | BGCNT_TXT256x512); } void VBlankCB_Battle(void) @@ -2064,12 +2074,12 @@ void VBlankCB_Battle(void) ScanlineEffect_InitHBlankDmaTransfer(); } -void nullsub_17(struct Sprite *sprite) +void SpriteCB_VsLetterDummy(struct Sprite *sprite) { } -static void sub_8038B04(struct Sprite *sprite) +static void SpriteCB_VsLetter(struct Sprite *sprite) { if (sprite->data[0] != 0) sprite->pos1.x = sprite->data[1] + ((sprite->data[2] & 0xFF00) >> 8); @@ -2080,107 +2090,67 @@ static void sub_8038B04(struct Sprite *sprite) if (sprite->affineAnimEnded) { - FreeSpriteTilesByTag(0x2710); - FreeSpritePaletteByTag(0x2710); + FreeSpriteTilesByTag(ANIM_SPRITES_START); + FreeSpritePaletteByTag(ANIM_SPRITES_START); FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } } -void sub_8038B74(struct Sprite *sprite) +void SpriteCB_VsLetterInit(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_8038B04; + sprite->callback = SpriteCB_VsLetter; PlaySE(SE_MUGSHOT); } -static void sub_8038B94(u8 taskId) +static void BufferPartyVsScreenHealth_AtEnd(u8 taskId) { - struct Pokemon *sp4 = NULL; - struct Pokemon *sp8 = NULL; - u8 r2 = gBattleScripting.multiplayerId; - u32 r7; + struct Pokemon *party1 = NULL; + struct Pokemon *party2 = NULL; + u8 multiplayerId = gBattleScripting.multiplayerId; + u32 flags; s32 i; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - switch (gLinkPlayers[r2].id) + switch (gLinkPlayers[multiplayerId].id) { case 0: case 2: - sp4 = gPlayerParty; - sp8 = gEnemyParty; + party1 = gPlayerParty; + party2 = gEnemyParty; break; case 1: case 3: - sp4 = gEnemyParty; - sp8 = gPlayerParty; + party1 = gEnemyParty; + party2 = gPlayerParty; break; } } else { - sp4 = gPlayerParty; - sp8 = gEnemyParty; + party1 = gPlayerParty; + party2 = gEnemyParty; } - r7 = 0; - for (i = 0; i < PARTY_SIZE; i++) - { - u16 species = GetMonData(&sp4[i], MON_DATA_SPECIES2); - u16 hp = GetMonData(&sp4[i], MON_DATA_HP); - u32 status = GetMonData(&sp4[i], MON_DATA_STATUS); - - if (species == SPECIES_NONE) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r7 |= 1 << i * 2; - - if (species == SPECIES_NONE) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r7 |= 2 << i * 2; + flags = 0; + BUFFER_PARTY_VS_SCREEN_STATUS(party1, flags, i); + gTasks[taskId].data[3] = flags; - if (species == SPECIES_NONE) - continue; - if (species != SPECIES_EGG && hp == 0) - r7 |= 3 << i * 2; - } - gTasks[taskId].data[3] = r7; - - r7 = 0; - for (i = 0; i < PARTY_SIZE; i++) - { - u16 species = GetMonData(&sp8[i], MON_DATA_SPECIES2); - u16 hp = GetMonData(&sp8[i], MON_DATA_HP); - u32 status = GetMonData(&sp8[i], MON_DATA_STATUS); - - if (species == SPECIES_NONE) - continue; - if (species != SPECIES_EGG && hp != 0 && status == 0) - r7 |= 1 << i * 2; - - if (species == SPECIES_NONE) - continue; - if (hp != 0 && (species == SPECIES_EGG || status != 0)) - r7 |= 2 << i * 2; - - if (species == SPECIES_NONE) - continue; - if (species != SPECIES_EGG && hp == 0) - r7 |= 3 << i * 2; - } - gTasks[taskId].data[4] = r7; + flags = 0; + BUFFER_PARTY_VS_SCREEN_STATUS(party2, flags, i); + gTasks[taskId].data[4] = flags; } -void sub_8038D64(void) +void CB2_InitEndLinkBattle(void) { s32 i; u8 taskId; SetHBlankCallback(NULL); SetVBlankCallback(NULL); - gBattleTypeFlags &= ~(BATTLE_TYPE_20); + gBattleTypeFlags &= ~(BATTLE_TYPE_LINK_IN_BATTLE); if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { @@ -2193,12 +2163,12 @@ void sub_8038D64(void) { CpuFill32(0, (void*)(VRAM), VRAM_SIZE); SetGpuReg(REG_OFFSET_MOSAIC, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0xF0); - SetGpuReg(REG_OFFSET_WIN0V, 0x5051); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1)); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); - gBattle_WIN0H = 0xF0; - gBattle_WIN0V = 0x5051; + gBattle_WIN0H = DISPLAY_WIDTH; + gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2 + 1); ScanlineEffect_Clear(); i = 0; @@ -2233,24 +2203,26 @@ void sub_8038D64(void) ResetSpriteData(); ResetTasks(); DrawBattleEntryBackground(); - SetGpuReg(REG_OFFSET_WINOUT, 0x37); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); + // Show end Vs screen with battle results taskId = CreateTask(InitLinkBattleVsScreen, 0); gTasks[taskId].data[1] = 0x10E; gTasks[taskId].data[2] = 0x5A; gTasks[taskId].data[5] = 1; - sub_8038B94(taskId); - SetMainCallback2(sub_8038F14); + BufferPartyVsScreenHealth_AtEnd(taskId); + + SetMainCallback2(CB2_EndLinkBattle); gBattleCommunication[MULTIUSE_STATE] = 0; } } -static void sub_8038F14(void) +static void CB2_EndLinkBattle(void) { - sub_8038F34(); + EndLinkBattleInSteps(); AnimateSprites(); BuildOamBuffer(); RunTextPrinters(); @@ -2258,7 +2230,7 @@ static void sub_8038F14(void) RunTasks(); } -static void sub_8038F34(void) +static void EndLinkBattleInSteps(void) { s32 i; @@ -2274,7 +2246,7 @@ static void sub_8038F34(void) case 1: if (--gBattleCommunication[1] == 0) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -2283,7 +2255,7 @@ static void sub_8038F34(void) { u8 monsCount; - gMain.field_439_x4 = sub_8185FAC(); + gMain.anyLinkBattlerHasFrontierPass = RecordedBattle_GetFrontierPassFlag(); if (gBattleTypeFlags & BATTLE_TYPE_MULTI) monsCount = 4; @@ -2299,7 +2271,7 @@ static void sub_8038F34(void) FreeAllWindowBuffers(); SetMainCallback2(sub_80392A8); } - else if (!gMain.field_439_x4) + else if (!gMain.anyLinkBattlerHasFrontierPass) { SetMainCallback2(gMain.savedCallback); FreeBattleResources(); @@ -2308,7 +2280,7 @@ static void sub_8038F34(void) } else if (gReceivedRemoteLinkPlayers == 0) { - CreateTask(sub_80B3AF8, 5); + CreateTask(Task_ReconnectWithLinkPlayers, 5); gBattleCommunication[MULTIUSE_STATE]++; } else @@ -2331,7 +2303,7 @@ static void sub_8038F34(void) for (i = 0; i < 2; i++) LoadChosenBattleElement(i); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; break; case 4: @@ -2339,7 +2311,7 @@ static void sub_8038F34(void) gBattleCommunication[MULTIUSE_STATE]++; break; case 5: - if (!FuncIsActiveTask(sub_80B3AF8)) + if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers)) gBattleCommunication[MULTIUSE_STATE]++; break; case 6: @@ -2363,9 +2335,9 @@ static void sub_8038F34(void) gBattleCommunication[MULTIUSE_STATE]++; break; case 9: - if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1) + if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1) { - gMain.field_439_x4 = 0; + gMain.anyLinkBattlerHasFrontierPass = 0; SetMainCallback2(gMain.savedCallback); FreeBattleResources(); FreeBattleSpritesData(); @@ -2375,7 +2347,7 @@ static void sub_8038F34(void) } } -u32 sub_80391E0(u8 arrayId, u8 caseId) +u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId) { u32 ret = 0; @@ -2396,7 +2368,7 @@ u32 sub_80391E0(u8 arrayId, u8 caseId) case 4: ret = gBattleBgTemplates[arrayId].paletteMode; break; - case 5: + case 5: // Only this case is used ret = gBattleBgTemplates[arrayId].priority; break; case 6: @@ -2436,7 +2408,7 @@ static void sub_80392A8(void) gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); SetMainCallback2(sub_803937C); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE] = 0; } @@ -2461,12 +2433,12 @@ static void sub_803939C(void) gBattleCommunication[MULTIUSE_STATE]++; break; case 1: - if (gMain.field_439_x4 && gReceivedRemoteLinkPlayers == 0) - CreateTask(sub_80B3AF8, 5); + if (gMain.anyLinkBattlerHasFrontierPass && gReceivedRemoteLinkPlayers == 0) + CreateTask(Task_ReconnectWithLinkPlayers, 5); gBattleCommunication[MULTIUSE_STATE]++; break; case 2: - if (!FuncIsActiveTask(sub_80B3AF8)) + if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers)) gBattleCommunication[MULTIUSE_STATE]++; break; case 3: @@ -2531,7 +2503,7 @@ static void sub_803939C(void) if (IsLinkTaskFinished() == TRUE) { HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR); - if (gMain.field_439_x4) + if (gMain.anyLinkBattlerHasFrontierPass) { SetLinkStandbyCallback(); BattlePutTextOnWindow(gText_LinkStandby3, 0); @@ -2542,15 +2514,15 @@ static void sub_803939C(void) case 8: if (--gBattleCommunication[1] == 0) { - if (gMain.field_439_x4 && !gWirelessCommType) + if (gMain.anyLinkBattlerHasFrontierPass && !gWirelessCommType) SetCloseLinkCallback(); gBattleCommunication[MULTIUSE_STATE]++; } break; case 9: - if (!gMain.field_439_x4 || gWirelessCommType || gReceivedRemoteLinkPlayers != 1) + if (!gMain.anyLinkBattlerHasFrontierPass || gWirelessCommType || gReceivedRemoteLinkPlayers != 1) { - gMain.field_439_x4 = 0; + gMain.anyLinkBattlerHasFrontierPass = 0; if (!gPaletteFade.active) { SetMainCallback2(gMain.savedCallback); @@ -2580,7 +2552,7 @@ static void sub_803939C(void) case 11: if (IsLinkTaskFinished() == TRUE && !IsTextPrinterActive(0) && --gBattleCommunication[1] == 0) { - if (gMain.field_439_x4) + if (gMain.anyLinkBattlerHasFrontierPass) { SetLinkStandbyCallback(); BattlePutTextOnWindow(gText_LinkStandby3, 0); @@ -2592,11 +2564,11 @@ static void sub_803939C(void) case 7: if (!IsTextPrinterActive(0)) { - if (gMain.field_439_x4) + if (gMain.anyLinkBattlerHasFrontierPass) { if (IsLinkTaskFinished() == TRUE) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; gBattleCommunication[MULTIUSE_STATE] = 8; } @@ -2604,7 +2576,7 @@ static void sub_803939C(void) } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; gBattleCommunication[MULTIUSE_STATE] = 8; } @@ -2627,7 +2599,7 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon) } } -u32 sub_80397C4(u32 setId, u32 tableId) +u32 GetBattleWindowTemplatePixelWidth(u32 setId, u32 tableId) { return gBattleWindowTemplates[setId][tableId].width * 8; } @@ -2658,7 +2630,7 @@ static void SpriteCb_WildMonShowHealthbox(struct Sprite *sprite) { if (sprite->animEnded) { - sub_8076918(sprite->sBattler); + StartHealthboxSlideIn(sprite->sBattler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); sprite->callback = SpriteCb_WildMonAnimate; StartSpriteAnimIfDifferent(sprite, 0); @@ -2679,7 +2651,8 @@ void SpriteCallbackDummy_2(struct Sprite *sprite) } -static void sub_80398BC(struct Sprite *sprite) // unused? +// Unused +static void sub_80398BC(struct Sprite *sprite) { sprite->data[3] = 6; sprite->data[4] = 1; @@ -2722,7 +2695,7 @@ void SpriteCB_FaintOpponentMon(struct Sprite *sprite) if (species == SPECIES_UNOWN) { u32 personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); - u16 unownForm = ((((personalityValue & 0x3000000) >> 18) | ((personalityValue & 0x30000) >> 12) | ((personalityValue & 0x300) >> 6) | (personalityValue & 3)) % 0x1C); + u16 unownForm = GET_UNOWN_LETTER(personalityValue); u16 unownSpecies; if (unownForm == 0) @@ -2803,7 +2776,7 @@ void SpriteCb_OpponentMonFromBall(struct Sprite *sprite) { if (sprite->affineAnimEnded) { - if (!(gHitMarker & HITMARKER_NO_ANIMATIONS) || gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (!(gHitMarker & HITMARKER_NO_ANIMATIONS) || gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { if (HasTwoFramesAnimation(sprite->sSpeciesId)) StartSpriteAnim(sprite, 1); @@ -2812,12 +2785,13 @@ void SpriteCb_OpponentMonFromBall(struct Sprite *sprite) } } -void sub_8039BB4(struct Sprite *sprite) +// This callback is frequently overwritten by SpriteCB_TrainerSlideIn +void SpriteCB_BattleSpriteStartSlideLeft(struct Sprite *sprite) { - sprite->callback = oac_poke_ally_; + sprite->callback = SpriteCB_BattleSpriteSlideLeft; } -static void oac_poke_ally_(struct Sprite *sprite) +static void SpriteCB_BattleSpriteSlideLeft(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { @@ -2830,7 +2804,8 @@ static void oac_poke_ally_(struct Sprite *sprite) } } -void sub_80105DC(struct Sprite *sprite) +// Unused +static void sub_80105DC(struct Sprite *sprite) { sprite->callback = SpriteCallbackDummy_3; } @@ -2839,15 +2814,21 @@ static void SpriteCallbackDummy_3(struct Sprite *sprite) { } -void sub_8039C00(struct Sprite *sprite) +#define sSpeedX data[1] +#define sSpeedY data[2] + +void SpriteCB_FaintSlideAnim(struct Sprite *sprite) { if (!(gIntroSlideFlags & 1)) { - sprite->pos2.x += sprite->data[1]; - sprite->pos2.y += sprite->data[2]; + sprite->pos2.x += sprite->sSpeedX; + sprite->pos2.y += sprite->sSpeedY; } } +#undef sSpeedX +#undef sSpeedY + #define sSinIndex data[0] #define sDelta data[1] #define sAmplitude data[2] @@ -2967,7 +2948,7 @@ void sub_8039E9C(struct Sprite *sprite) sprite->centerToCornerVecX = gUnknown_0831ACE0[sprite->animCmdIndex]; } -void nullsub_20(void) +void BeginBattleIntroDummy(void) { } @@ -3041,7 +3022,7 @@ static void BattleStartClearSetData(void) if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && gSaveBlock2Ptr->optionsBattleSceneOff == TRUE) gHitMarker |= HITMARKER_NO_ANIMATIONS; } - else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && GetBattleSceneInRecordedBattle()) + else if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) && GetBattleSceneInRecordedBattle()) gHitMarker |= HITMARKER_NO_ANIMATIONS; gBattleScripting.battleStyle = gSaveBlock2Ptr->optionsBattleStyle; @@ -3396,7 +3377,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER_HILL))) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); @@ -3409,7 +3390,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER_HILL))) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); @@ -3544,9 +3525,9 @@ static void BattleIntroPrintOpponentSendsOut(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_OPPONENT_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) position = B_POSITION_OPPONENT_LEFT; else position = B_POSITION_PLAYER_LEFT; @@ -3564,9 +3545,9 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_OPPONENT_RIGHT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) position = B_POSITION_OPPONENT_RIGHT; else position = B_POSITION_PLAYER_RIGHT; @@ -3592,9 +3573,9 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void) if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) position = B_POSITION_OPPONENT_LEFT; else position = B_POSITION_PLAYER_LEFT; @@ -3635,7 +3616,7 @@ static void BattleIntroRecordMonsToDex(void) && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER_HILL))) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); @@ -3659,9 +3640,9 @@ static void BattleIntroPrintPlayerSendsOut(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_PLAYER_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) position = B_POSITION_PLAYER_LEFT; else position = B_POSITION_OPPONENT_LEFT; @@ -3682,9 +3663,9 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_PLAYER_RIGHT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) position = B_POSITION_PLAYER_RIGHT; else position = B_POSITION_OPPONENT_RIGHT; @@ -3714,9 +3695,9 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_PLAYER_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_IS_MASTER) position = B_POSITION_PLAYER_LEFT; else position = B_POSITION_OPPONENT_LEFT; @@ -3978,7 +3959,7 @@ u8 IsRunningFromBattleImpossible(void) { gBattleScripting.battler = i; gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PREVENTS_ESCAPE; return 2; } if (side != GetBattlerSide(i) @@ -3988,7 +3969,7 @@ u8 IsRunningFromBattleImpossible(void) { gBattleScripting.battler = i; gLastUsedAbility = gBattleMons[i].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PREVENTS_ESCAPE; return 2; } } @@ -3997,18 +3978,18 @@ u8 IsRunningFromBattleImpossible(void) { gBattleScripting.battler = i - 1; gLastUsedAbility = gBattleMons[i - 1].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PREVENTS_ESCAPE; return 2; } if ((gBattleMons[gActiveBattler].status2 & (STATUS2_ESCAPE_PREVENTION | STATUS2_WRAPPED)) || (gStatuses3[gActiveBattler] & STATUS3_ROOTED)) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_ESCAPE; return 1; } if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DONT_LEAVE_BIRCH; return 1; } return 0; @@ -4106,7 +4087,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) { RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]); gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; @@ -4155,7 +4136,7 @@ static void HandleTurnActionSelectionState(void) if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER_NO_PYRAMID | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_x2000000)) + | BATTLE_TYPE_RECORDED_LINK)) { RecordedBattle_ClearBattlerAction(gActiveBattler, 1); gSelectionBattleScripts[gActiveBattler] = BattleScript_ActionSelectionItemsCantBeUsed; @@ -4263,7 +4244,7 @@ static void HandleTurnActionSelectionState(void) return; } else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER - && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) { BattleScriptExecute(BattleScript_PrintCantRunFromTrainer); @@ -4285,7 +4266,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CASE_CHOSEN: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) { switch (gChosenActionByBattler[gActiveBattler]) { @@ -4393,7 +4374,11 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED_STANDBY: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) + | (0xF << 28) + | (gBitTable[gActiveBattler] << 4) + | (gBitTable[gActiveBattler] << 8) + | (gBitTable[gActiveBattler] << 12)))) { if (AllAtActionConfirmed()) i = TRUE; @@ -4415,7 +4400,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) { gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++; } @@ -4429,7 +4414,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = gActiveBattler; gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler]; - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } @@ -4437,7 +4422,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_SET_BEFORE_ACTION: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } @@ -4461,7 +4446,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = gActiveBattler; gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler]; - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) + if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } @@ -4574,7 +4559,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) } // badge boost - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) && FlagGet(FLAG_BADGE03_GET) && GetBattlerSide(battler1) == B_SIDE_PLAYER) { @@ -4608,7 +4593,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) } // badge boost - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) && FlagGet(FLAG_BADGE03_GET) && GetBattlerSide(battler2) == B_SIDE_PLAYER) { @@ -4892,7 +4877,7 @@ static void HandleEndTurn_BattleWon(void) { gCurrentActionFuncId = 0; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { gSpecialVar_Result = gBattleOutcome; gBattleTextBuff1[0] = gBattleOutcome; @@ -4950,7 +4935,7 @@ static void HandleEndTurn_BattleLost(void) { gCurrentActionFuncId = 0; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) { @@ -4962,7 +4947,7 @@ static void HandleEndTurn_BattleLost(void) } else { - gBattlescriptCurrInstr = BattleScript_82DAA0B; + gBattlescriptCurrInstr = BattleScript_FrontierLinkBattleLost; gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN); } } @@ -5031,7 +5016,7 @@ static void HandleEndTurn_FinishBattle(void) if (gCurrentActionFuncId == B_ACTION_TRY_FINISH || gCurrentActionFuncId == B_ACTION_FINISHED) { if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI | BATTLE_TYPE_EREADER_TRAINER @@ -5054,11 +5039,11 @@ static void HandleEndTurn_FinishBattle(void) } } } - PutPokemonTodayCaughtOnAir(); + TryPutPokemonTodayOnAir(); } if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_FIRST_BATTLE | BATTLE_TYPE_SAFARI @@ -5067,7 +5052,7 @@ static void HandleEndTurn_FinishBattle(void) | BATTLE_TYPE_WALLY_TUTORIAL)) && gBattleResults.shinyWildMon) { - sub_80EE184(); + TryPutBreakingNewsOnAir(); } sub_8186444(); @@ -5124,7 +5109,7 @@ static void TryEvolvePokemon(void) levelUpBits &= ~(gBitTable[i]); gLeveledUpInBattle = levelUpBits; - species = GetEvolutionTargetSpecies(&gPlayerParty[i], 0, levelUpBits); + species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_NORMAL, levelUpBits); if (species != SPECIES_NONE) { FreeAllWindowBuffers(); @@ -5163,7 +5148,12 @@ static void ReturnFromBattleToOverworld(void) if (gBattleTypeFlags & BATTLE_TYPE_ROAMER) { UpdateRoamerHPStatus(&gEnemyParty[0]); + +#ifndef BUGFIX if ((gBattleOutcome & B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT) +#else + if ((gBattleOutcome == B_OUTCOME_WON) || gBattleOutcome == B_OUTCOME_CAUGHT) // Bug: When Roar is used by roamer, gBattleOutcome is B_OUTCOME_PLAYER_TELEPORTED (5). +#endif // & with B_OUTCOME_WON (1) will return TRUE and deactivates the roamer. SetRoamerInactive(); } diff --git a/src/battle_message.c b/src/battle_message.c index e6c1666fc..a30866410 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -21,7 +21,6 @@ #include "window.h" #include "constants/battle_dome.h" #include "constants/battle_string_ids.h" -#include "constants/berry.h" #include "constants/frontier_util.h" #include "constants/items.h" #include "constants/moves.h" @@ -180,7 +179,7 @@ static const u8 sText_PkmnStayedAwakeUsing[] = _("{B_DEF_NAME_WITH_PREFIX} staye static const u8 sText_PkmnStoringEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} is storing\nenergy!"); static const u8 sText_PkmnUnleashedEnergy[] = _("{B_ATK_NAME_WITH_PREFIX} unleashed\nenergy!"); static const u8 sText_PkmnFatigueConfusion[] = _("{B_ATK_NAME_WITH_PREFIX} became\nconfused due to fatigue!"); -static const u8 sText_PkmnPickedUpItem[] = _("{B_PLAYER_NAME} picked up\n¥{B_BUFF1}!\p"); +static const u8 sText_PlayerPickedUpMoney[] = _("{B_PLAYER_NAME} picked up\n¥{B_BUFF1}!\p"); static const u8 sText_PkmnUnaffected[] = _("{B_DEF_NAME_WITH_PREFIX} is\nunaffected!"); static const u8 sText_PkmnTransformedInto[] = _("{B_ATK_NAME_WITH_PREFIX} transformed\ninto {B_BUFF1}!"); static const u8 sText_PkmnMadeSubstitute[] = _("{B_ATK_NAME_WITH_PREFIX} made\na SUBSTITUTE!"); @@ -306,11 +305,11 @@ static const u8 sText_StatSharply[] = _("sharply "); const u8 gText_StatRose[] = _("rose!"); static const u8 sText_StatHarshly[] = _("harshly "); static const u8 sText_StatFell[] = _("fell!"); -static const u8 sText_PkmnsStatChanged[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); -const u8 gText_PkmnsStatChanged2[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); -static const u8 sText_UsingXTheYOfZN[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}"); -static const u8 sText_PkmnsStatChanged3[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); -static const u8 sText_PkmnsStatChanged4[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +static const u8 sText_AttackersStatRose[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +const u8 gText_DefendersStatRose[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +static const u8 sText_UsingItemTheStatOfPkmnRose[] = _("Using {B_LAST_ITEM}, the {B_BUFF1}\nof {B_SCR_ACTIVE_NAME_WITH_PREFIX} {B_BUFF2}"); +static const u8 sText_AttackersStatFell[] = _("{B_ATK_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); +static const u8 sText_DefendersStatFell[] = _("{B_DEF_NAME_WITH_PREFIX}'s {B_BUFF1}\n{B_BUFF2}"); static const u8 sText_StatsWontIncrease2[] = _("{B_ATK_NAME_WITH_PREFIX}'s stats won't\ngo any higher!"); static const u8 sText_StatsWontDecrease2[] = _("{B_DEF_NAME_WITH_PREFIX}'s stats won't\ngo any lower!"); static const u8 sText_CriticalHit[] = _("A critical hit!"); @@ -340,9 +339,9 @@ static const u8 sText_ButItFailed[] = _("But it failed!"); static const u8 sText_ItHurtConfusion[] = _("It hurt itself in its\nconfusion!"); static const u8 sText_MirrorMoveFailed[] = _("The MIRROR MOVE failed!"); static const u8 sText_StartedToRain[] = _("It started to rain!"); -static const u8 sText_DownpourStarted[] = _("A downpour started!"); +static const u8 sText_DownpourStarted[] = _("A downpour started!"); // corresponds to DownpourText in pokegold and pokecrystal and is used by Rain Dance in GSC static const u8 sText_RainContinues[] = _("Rain continues to fall."); -static const u8 sText_DownpourContinues[] = _("The downpour continues."); +static const u8 sText_DownpourContinues[] = _("The downpour continues."); // unused static const u8 sText_RainStopped[] = _("The rain stopped."); static const u8 sText_SandstormBrewed[] = _("A sandstorm brewed!"); static const u8 sText_SandstormRages[] = _("The sandstorm rages."); @@ -632,7 +631,7 @@ const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_PKMNSTORINGENERGY - 12] = sText_PkmnStoringEnergy, [STRINGID_PKMNUNLEASHEDENERGY - 12] = sText_PkmnUnleashedEnergy, [STRINGID_PKMNFATIGUECONFUSION - 12] = sText_PkmnFatigueConfusion, - [STRINGID_PKMNPICKEDUPITEM - 12] = sText_PkmnPickedUpItem, + [STRINGID_PLAYERPICKEDUPMONEY - 12] = sText_PlayerPickedUpMoney, [STRINGID_PKMNUNAFFECTED - 12] = sText_PkmnUnaffected, [STRINGID_PKMNTRANSFORMEDINTO - 12] = sText_PkmnTransformedInto, [STRINGID_PKMNMADESUBSTITUTE - 12] = sText_PkmnMadeSubstitute, @@ -722,10 +721,10 @@ const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_STATROSE - 12] = gText_StatRose, [STRINGID_STATHARSHLY - 12] = sText_StatHarshly, [STRINGID_STATFELL - 12] = sText_StatFell, - [STRINGID_PKMNSSTATCHANGED - 12] = sText_PkmnsStatChanged, - [STRINGID_PKMNSSTATCHANGED2 - 12] = gText_PkmnsStatChanged2, - [STRINGID_PKMNSSTATCHANGED3 - 12] = sText_PkmnsStatChanged3, - [STRINGID_PKMNSSTATCHANGED4 - 12] = sText_PkmnsStatChanged4, + [STRINGID_ATTACKERSSTATROSE - 12] = sText_AttackersStatRose, + [STRINGID_DEFENDERSSTATROSE - 12] = gText_DefendersStatRose, + [STRINGID_ATTACKERSSTATFELL - 12] = sText_AttackersStatFell, + [STRINGID_DEFENDERSSTATFELL - 12] = sText_DefendersStatFell, [STRINGID_CRITICALHIT - 12] = sText_CriticalHit, [STRINGID_ONEHITKO - 12] = sText_OneHitKO, [STRINGID_123POOF - 12] = sText_123Poof, @@ -834,7 +833,7 @@ const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = [STRINGID_SOOTHINGAROMA - 12] = sText_SoothingAroma, [STRINGID_ITEMSCANTBEUSEDNOW - 12] = sText_ItemsCantBeUsedNow, [STRINGID_FORXCOMMAYZ - 12] = sText_ForXCommaYZ, - [STRINGID_USINGXTHEYOFZN - 12] = sText_UsingXTheYOfZN, + [STRINGID_USINGITEMSTATOFPKMNROSE - 12] = sText_UsingItemTheStatOfPkmnRose, [STRINGID_PKMNUSEDXTOGETPUMPED - 12] = sText_PkmnUsedXToGetPumped, [STRINGID_PKMNSXMADEYUSELESS - 12] = sText_PkmnsXMadeYUseless, [STRINGID_PKMNTRAPPEDBYSANDTOMB - 12] = sText_PkmnTrappedBySandTomb, @@ -894,112 +893,149 @@ const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] = const u16 gMissStringIds[] = { - STRINGID_ATTACKMISSED, STRINGID_PKMNPROTECTEDITSELF, - STRINGID_PKMNAVOIDEDATTACK, STRINGID_AVOIDEDDAMAGE, - STRINGID_PKMNMAKESGROUNDMISS + [B_MSG_MISSED] = STRINGID_ATTACKMISSED, + [B_MSG_PROTECTED] = STRINGID_PKMNPROTECTEDITSELF, + [B_MSG_AVOIDED_ATK] = STRINGID_PKMNAVOIDEDATTACK, + [B_MSG_AVOIDED_DMG] = STRINGID_AVOIDEDDAMAGE, + [B_MSG_GROUND_MISS] = STRINGID_PKMNMAKESGROUNDMISS }; const u16 gNoEscapeStringIds[] = { - STRINGID_CANTESCAPE, STRINGID_DONTLEAVEBIRCH, STRINGID_PREVENTSESCAPE, - STRINGID_CANTESCAPE2, STRINGID_ATTACKERCANTESCAPE + [B_MSG_CANT_ESCAPE] = STRINGID_CANTESCAPE, + [B_MSG_DONT_LEAVE_BIRCH] = STRINGID_DONTLEAVEBIRCH, + [B_MSG_PREVENTS_ESCAPE] = STRINGID_PREVENTSESCAPE, + [B_MSG_CANT_ESCAPE_2] = STRINGID_CANTESCAPE2, + [B_MSG_ATTACKER_CANT_ESCAPE] = STRINGID_ATTACKERCANTESCAPE }; const u16 gMoveWeatherChangeStringIds[] = { - STRINGID_STARTEDTORAIN, STRINGID_DOWNPOURSTARTED, STRINGID_BUTITFAILED, - STRINGID_SANDSTORMBREWED, STRINGID_SUNLIGHTGOTBRIGHT, STRINGID_STARTEDHAIL + [B_MSG_STARTED_RAIN] = STRINGID_STARTEDTORAIN, + [B_MSG_STARTED_DOWNPOUR] = STRINGID_DOWNPOURSTARTED, // Unused + [B_MSG_WEATHER_FAILED] = STRINGID_BUTITFAILED, + [B_MSG_STARTED_SANDSTORM] = STRINGID_SANDSTORMBREWED, + [B_MSG_STARTED_SUNLIGHT] = STRINGID_SUNLIGHTGOTBRIGHT, + [B_MSG_STARTED_HAIL] = STRINGID_STARTEDHAIL, }; const u16 gSandStormHailContinuesStringIds[] = { - STRINGID_SANDSTORMRAGES, STRINGID_HAILCONTINUES + [B_MSG_SANDSTORM] = STRINGID_SANDSTORMRAGES, + [B_MSG_HAIL] = STRINGID_HAILCONTINUES }; const u16 gSandStormHailDmgStringIds[] = { - STRINGID_PKMNBUFFETEDBYSANDSTORM, STRINGID_PKMNPELTEDBYHAIL + [B_MSG_SANDSTORM] = STRINGID_PKMNBUFFETEDBYSANDSTORM, + [B_MSG_HAIL] = STRINGID_PKMNPELTEDBYHAIL }; const u16 gSandStormHailEndStringIds[] = { - STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED + [B_MSG_SANDSTORM] = STRINGID_SANDSTORMSUBSIDED, + [B_MSG_HAIL] = STRINGID_HAILSTOPPED }; const u16 gRainContinuesStringIds[] = { - STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES, STRINGID_RAINSTOPPED + [B_MSG_RAIN_CONTINUES] = STRINGID_RAINCONTINUES, + [B_MSG_DOWNPOUR_CONTINUES] = STRINGID_DOWNPOURCONTINUES, + [B_MSG_RAIN_STOPPED] = STRINGID_RAINSTOPPED }; const u16 gProtectLikeUsedStringIds[] = { - STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED + [B_MSG_PROTECTED_ITSELF] = STRINGID_PKMNPROTECTEDITSELF2, + [B_MSG_BRACED_ITSELF] = STRINGID_PKMNBRACEDITSELF, + [B_MSG_PROTECT_FAILED] = STRINGID_BUTITFAILED, }; const u16 gReflectLightScreenSafeguardStringIds[] = { - STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF, STRINGID_PKMNRAISEDDEFALITTLE, - STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE, STRINGID_PKMNCOVEREDBYVEIL + [B_MSG_SIDE_STATUS_FAILED] = STRINGID_BUTITFAILED, + [B_MSG_SET_REFLECT_SINGLE] = STRINGID_PKMNRAISEDDEF, + [B_MSG_SET_REFLECT_DOUBLE] = STRINGID_PKMNRAISEDDEFALITTLE, + [B_MSG_SET_LIGHTSCREEN_SINGLE] = STRINGID_PKMNRAISEDSPDEF, + [B_MSG_SET_LIGHTSCREEN_DOUBLE] = STRINGID_PKMNRAISEDSPDEFALITTLE, + [B_MSG_SET_SAFEGUARD] = STRINGID_PKMNCOVEREDBYVEIL, }; const u16 gLeechSeedStringIds[] = { - STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK, - STRINGID_ITDOESNTAFFECT, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_ITSUCKEDLIQUIDOOZE, + [B_MSG_LEECH_SEED_SET] = STRINGID_PKMNSEEDED, + [B_MSG_LEECH_SEED_MISS] = STRINGID_PKMNEVADEDATTACK, + [B_MSG_LEECH_SEED_FAIL] = STRINGID_ITDOESNTAFFECT, + [B_MSG_LEECH_SEED_DRAIN] = STRINGID_PKMNSAPPEDBYLEECHSEED, + [B_MSG_LEECH_SEED_OOZE] = STRINGID_ITSUCKEDLIQUIDOOZE, }; const u16 gRestUsedStringIds[] = { - STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY + [B_MSG_REST] = STRINGID_PKMNWENTTOSLEEP, + [B_MSG_REST_STATUSED] = STRINGID_PKMNSLEPTHEALTHY }; const u16 gUproarOverTurnStringIds[] = { - STRINGID_PKMNMAKINGUPROAR, STRINGID_PKMNCALMEDDOWN + [B_MSG_UPROAR_CONTINUES] = STRINGID_PKMNMAKINGUPROAR, + [B_MSG_UPROAR_ENDS] = STRINGID_PKMNCALMEDDOWN }; const u16 gStockpileUsedStringIds[] = { - STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE, + [B_MSG_STOCKPILED] = STRINGID_PKMNSTOCKPILED, + [B_MSG_CANT_STOCKPILE] = STRINGID_PKMNCANTSTOCKPILE, }; const u16 gWokeUpStringIds[] = { - STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR + [B_MSG_WOKE_UP] = STRINGID_PKMNWOKEUP, + [B_MSG_WOKE_UP_UPROAR] = STRINGID_PKMNWOKEUPINUPROAR }; const u16 gSwallowFailStringIds[] = { - STRINGID_FAILEDTOSWALLOW, STRINGID_PKMNHPFULL + [B_MSG_SWALLOW_FAILED] = STRINGID_FAILEDTOSWALLOW, + [B_MSG_SWALLOW_FULL_HP] = STRINGID_PKMNHPFULL }; const u16 gUproarAwakeStringIds[] = { - STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, STRINGID_PKMNSTAYEDAWAKEUSING + [B_MSG_CANT_SLEEP_UPROAR] = STRINGID_PKMNCANTSLEEPINUPROAR2, + [B_MSG_UPROAR_KEPT_AWAKE] = STRINGID_UPROARKEPTPKMNAWAKE, + [B_MSG_STAYED_AWAKE_USING] = STRINGID_PKMNSTAYEDAWAKEUSING, }; const u16 gStatUpStringIds[] = { - STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2, STRINGID_STATSWONTINCREASE, - STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN, STRINGID_PKMNUSEDXTOGETPUMPED + [B_MSG_ATTACKER_STAT_ROSE] = STRINGID_ATTACKERSSTATROSE, + [B_MSG_DEFENDER_STAT_ROSE] = STRINGID_DEFENDERSSTATROSE, + [B_MSG_STAT_WONT_INCREASE] = STRINGID_STATSWONTINCREASE, + [B_MSG_STAT_ROSE_EMPTY] = STRINGID_EMPTYSTRING3, + [B_MSG_STAT_ROSE_ITEM] = STRINGID_USINGITEMSTATOFPKMNROSE, + [B_MSG_USED_DIRE_HIT] = STRINGID_PKMNUSEDXTOGETPUMPED, }; const u16 gStatDownStringIds[] = { - STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4, STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3 + [B_MSG_ATTACKER_STAT_FELL] = STRINGID_ATTACKERSSTATFELL, + [B_MSG_DEFENDER_STAT_FELL] = STRINGID_DEFENDERSSTATFELL, + [B_MSG_STAT_WONT_DECREASE] = STRINGID_STATSWONTDECREASE, + [B_MSG_STAT_FELL_EMPTY] = STRINGID_EMPTYSTRING3, }; // Index read from sTWOTURN_STRINGID const u16 gFirstTurnOfTwoStringIds[] = { - STRINGID_PKMNWHIPPEDWHIRLWIND, // MOVE_RAZOR_WIND - STRINGID_PKMNTOOKSUNLIGHT, // MOVE_SOLAR_BEAM - STRINGID_PKMNLOWEREDHEAD, // MOVE_SKULL_BASH - STRINGID_PKMNISGLOWING, // MOVE_SKY_ATTACK - STRINGID_PKMNFLEWHIGH, // MOVE_FLY - STRINGID_PKMNDUGHOLE, // MOVE_DIG - STRINGID_PKMNHIDUNDERWATER, // MOVE_DIVE - STRINGID_PKMNSPRANGUP // MOVE_BOUNCE + [B_MSG_TURN1_RAZOR_WIND] = STRINGID_PKMNWHIPPEDWHIRLWIND, + [B_MSG_TURN1_SOLAR_BEAM] = STRINGID_PKMNTOOKSUNLIGHT, + [B_MSG_TURN1_SKULL_BASH] = STRINGID_PKMNLOWEREDHEAD, + [B_MSG_TURN1_SKY_ATTACK] = STRINGID_PKMNISGLOWING, + [B_MSG_TURN1_FLY] = STRINGID_PKMNFLEWHIGH, + [B_MSG_TURN1_DIG] = STRINGID_PKMNDUGHOLE, + [B_MSG_TURN1_DIVE] = STRINGID_PKMNHIDUNDERWATER, + [B_MSG_TURN1_BOUNCE] = STRINGID_PKMNSPRANGUP, }; // Index copied from move's index in gTrappingMoves @@ -1015,89 +1051,109 @@ const u16 gWrappedStringIds[] = const u16 gMistUsedStringIds[] = { - STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED + [B_MSG_SET_MIST] = STRINGID_PKMNSHROUDEDINMIST, + [B_MSG_MIST_FAILED] = STRINGID_BUTITFAILED }; const u16 gFocusEnergyUsedStringIds[] = { - STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED + [B_MSG_GETTING_PUMPED] = STRINGID_PKMNGETTINGPUMPED, + [B_MSG_FOCUS_ENERGY_FAILED] = STRINGID_BUTITFAILED }; const u16 gTransformUsedStringIds[] = { - STRINGID_PKMNTRANSFORMEDINTO, STRINGID_BUTITFAILED + [B_MSG_TRANSFORMED] = STRINGID_PKMNTRANSFORMEDINTO, + [B_MSG_TRANSFORM_FAILED] = STRINGID_BUTITFAILED }; -const u16 gSubsituteUsedStringIds[] = +const u16 gSubstituteUsedStringIds[] = { - STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE + [B_MSG_SET_SUBSTITUTE] = STRINGID_PKMNMADESUBSTITUTE, + [B_MSG_SUBSTITUTE_FAILED] = STRINGID_TOOWEAKFORSUBSTITUTE }; const u16 gGotPoisonedStringIds[] = { - STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY + [B_MSG_STATUSED] = STRINGID_PKMNWASPOISONED, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNPOISONEDBY }; const u16 gGotParalyzedStringIds[] = { - STRINGID_PKMNWASPARALYZED, STRINGID_PKMNWASPARALYZEDBY + [B_MSG_STATUSED] = STRINGID_PKMNWASPARALYZED, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNWASPARALYZEDBY }; const u16 gFellAsleepStringIds[] = { - STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP, + [B_MSG_STATUSED] = STRINGID_PKMNFELLASLEEP, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNMADESLEEP, }; const u16 gGotBurnedStringIds[] = { - STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY + [B_MSG_STATUSED] = STRINGID_PKMNWASBURNED, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNBURNEDBY }; const u16 gGotFrozenStringIds[] = { - STRINGID_PKMNWASFROZEN, STRINGID_PKMNFROZENBY + [B_MSG_STATUSED] = STRINGID_PKMNWASFROZEN, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNFROZENBY }; const u16 gGotDefrostedStringIds[] = { - STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY + [B_MSG_DEFROSTED] = STRINGID_PKMNWASDEFROSTED2, + [B_MSG_DEFROSTED_BY_MOVE] = STRINGID_PKMNWASDEFROSTEDBY }; const u16 gKOFailedStringIds[] = { - STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED + [B_MSG_KO_MISS] = STRINGID_ATTACKMISSED, + [B_MSG_KO_UNAFFECTED] = STRINGID_PKMNUNAFFECTED }; const u16 gAttractUsedStringIds[] = { - STRINGID_PKMNFELLINLOVE, STRINGID_PKMNSXINFATUATEDY + [B_MSG_STATUSED] = STRINGID_PKMNFELLINLOVE, + [B_MSG_STATUSED_BY_ABILITY] = STRINGID_PKMNSXINFATUATEDY }; -const u16 gLeechSeedDrainStringIds[] = +const u16 gAbsorbDrainStringIds[] = { - STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE + [B_MSG_ABSORB] = STRINGID_PKMNENERGYDRAINED, + [B_MSG_ABSORB_OOZE] = STRINGID_ITSUCKEDLIQUIDOOZE }; const u16 gSportsUsedStringIds[] = { - STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED + [B_MSG_WEAKEN_ELECTRIC] = STRINGID_ELECTRICITYWEAKENED, + [B_MSG_WEAKEN_FIRE] = STRINGID_FIREWEAKENED }; const u16 gPartyStatusHealStringIds[] = { - STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, - // interesting how there are four instances of the same string - STRINGID_SOOTHINGAROMA + [B_MSG_BELL] = STRINGID_BELLCHIMED, + [B_MSG_BELL_SOUNDPROOF_ATTACKER] = STRINGID_BELLCHIMED, + [B_MSG_BELL_SOUNDPROOF_PARTNER] = STRINGID_BELLCHIMED, + [B_MSG_BELL_BOTH_SOUNDPROOF] = STRINGID_BELLCHIMED, + [B_MSG_SOOTHING_AROMA] = STRINGID_SOOTHINGAROMA }; const u16 gFutureMoveUsedStringIds[] = { - STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY + [B_MSG_FUTURE_SIGHT] = STRINGID_PKMNFORESAWATTACK, + [B_MSG_DOOM_DESIRE] = STRINGID_PKMNCHOSEXASDESTINY }; const u16 gBallEscapeStringIds[] = { - STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT, STRINGID_SHOOTSOCLOSE + [BALL_NO_SHAKES] = STRINGID_PKMNBROKEFREE, + [BALL_1_SHAKE] = STRINGID_ITAPPEAREDCAUGHT, + [BALL_2_SHAKES] = STRINGID_AARGHALMOSTHADIT, + [BALL_3_SHAKES_FAIL] = STRINGID_SHOOTSOCLOSE }; // Overworld weathers that don't have an associated battle weather default to "It is raining." @@ -1123,59 +1179,82 @@ const u16 gWeatherStartsStringIds[] = const u16 gInobedientStringIds[] = { - STRINGID_PKMNLOAFING, STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY, - STRINGID_PKMNPRETENDNOTNOTICE, STRINGID_PKMNINCAPABLEOFPOWER + [B_MSG_LOAFING] = STRINGID_PKMNLOAFING, + [B_MSG_WONT_OBEY] = STRINGID_PKMNWONTOBEY, + [B_MSG_TURNED_AWAY] = STRINGID_PKMNTURNEDAWAY, + [B_MSG_PRETEND_NOT_NOTICE] = STRINGID_PKMNPRETENDNOTNOTICE, + [B_MSG_INCAPABLE_OF_POWER] = STRINGID_PKMNINCAPABLEOFPOWER }; const u16 gSafariGetNearStringIds[] = { - STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER + [B_MSG_CREPT_CLOSER] = STRINGID_CREPTCLOSER, + [B_MSG_CANT_GET_CLOSER] = STRINGID_CANTGETCLOSER }; const u16 gSafariPokeblockResultStringIds[] = { - STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX + [B_MSG_MON_CURIOUS] = STRINGID_PKMNCURIOUSABOUTX, + [B_MSG_MON_ENTHRALLED] = STRINGID_PKMNENTHRALLEDBYX, + [B_MSG_MON_IGNORED] = STRINGID_PKMNIGNOREDX }; const u16 gTrainerItemCuredStatusStringIds[] = { - STRINGID_PKMNSITEMSNAPPEDOUT, STRINGID_PKMNSITEMCUREDPARALYSIS, STRINGID_PKMNSITEMDEFROSTEDIT, - STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT + [AI_HEAL_CONFUSION] = STRINGID_PKMNSITEMSNAPPEDOUT, + [AI_HEAL_PARALYSIS] = STRINGID_PKMNSITEMCUREDPARALYSIS, + [AI_HEAL_FREEZE] = STRINGID_PKMNSITEMDEFROSTEDIT, + [AI_HEAL_BURN] = STRINGID_PKMNSITEMHEALEDBURN, + [AI_HEAL_POISON] = STRINGID_PKMNSITEMCUREDPOISON, + [AI_HEAL_SLEEP] = STRINGID_PKMNSITEMWOKEIT }; const u16 gBerryEffectStringIds[] = { - STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS + [B_MSG_CURED_PROBLEM] = STRINGID_PKMNSITEMCUREDPROBLEM, + [B_MSG_NORMALIZED_STATUS] = STRINGID_PKMNSITEMNORMALIZEDSTATUS }; const u16 gBRNPreventionStringIds[] = { - STRINGID_PKMNSXPREVENTSBURNS, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY + [B_MSG_ABILITY_PREVENTS_MOVE_STATUS] = STRINGID_PKMNSXPREVENTSBURNS, + [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, + [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY }; const u16 gPRLZPreventionStringIds[] = { - STRINGID_PKMNPREVENTSPARALYSISWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY + [B_MSG_ABILITY_PREVENTS_MOVE_STATUS] = STRINGID_PKMNPREVENTSPARALYSISWITH, + [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, + [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY }; const u16 gPSNPreventionStringIds[] = { - STRINGID_PKMNPREVENTSPOISONINGWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY + [B_MSG_ABILITY_PREVENTS_MOVE_STATUS] = STRINGID_PKMNPREVENTSPOISONINGWITH, + [B_MSG_ABILITY_PREVENTS_ABILITY_STATUS] = STRINGID_PKMNSXPREVENTSYSZ, + [B_MSG_STATUS_HAD_NO_EFFECT] = STRINGID_PKMNSXHADNOEFFECTONY }; const u16 gItemSwapStringIds[] = { - STRINGID_PKMNOBTAINEDX, STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ + [B_MSG_ITEM_SWAP_TAKEN] = STRINGID_PKMNOBTAINEDX, + [B_MSG_ITEM_SWAP_GIVEN] = STRINGID_PKMNOBTAINEDX2, + [B_MSG_ITEM_SWAP_BOTH] = STRINGID_PKMNOBTAINEDXYOBTAINEDZ }; const u16 gFlashFireStringIds[] = { - STRINGID_PKMNRAISEDFIREPOWERWITH, STRINGID_PKMNSXMADEYINEFFECTIVE + [B_MSG_FLASH_FIRE_BOOST] = STRINGID_PKMNRAISEDFIREPOWERWITH, + [B_MSG_FLASH_FIRE_NO_BOOST] = STRINGID_PKMNSXMADEYINEFFECTIVE }; const u16 gCaughtMonStringIds[] = { - STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC, STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL, + [B_MSG_SENT_SOMEONES_PC] = STRINGID_PKMNTRANSFERREDSOMEONESPC, + [B_MSG_SENT_LANETTES_PC] = STRINGID_PKMNTRANSFERREDLANETTESPC, + [B_MSG_SOMEONES_BOX_FULL] = STRINGID_PKMNBOXSOMEONESPCFULL, + [B_MSG_LANETTES_BOX_FULL] = STRINGID_PKMNBOXLANETTESPCFULL, }; const u16 gTrappingMoves[] = @@ -1217,14 +1296,15 @@ static const u8 sText_Defense[] = _("DEFENSE"); static const u8 sText_SpAtk[] = _("SP. ATK"); static const u8 sText_SpDef[] = _("SP. DEF"); -const u8 * const gStatNamesTable2[] = +// Unused +static const u8 * const sStatNamesTable2[] = { sText_HP, sText_SpAtk, sText_Attack, sText_SpDef, sText_Defense, sText_Speed }; -const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GREY}SAFARI BALLS"); -const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GREY}Left: $" "{HIGHLIGHT DARK_GREY}"); +const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GRAY}SAFARI BALLS"); +const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GRAY}Left: $" "{HIGHLIGHT DARK_GRAY}"); const u8 gText_Sleep[] = _("sleep"); const u8 gText_Poison[] = _("poison"); const u8 gText_Burn[] = _("burn"); @@ -1310,10 +1390,10 @@ static const u8 sText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is const u16 gBattlePalaceFlavorTextTable[] = { - STRINGID_GLINTAPPEARSINEYE, - STRINGID_PKMNGETTINGINTOPOSITION, - STRINGID_PKMNBEGANGROWLINGDEEPLY, - STRINGID_PKMNEAGERFORMORE + [B_MSG_GLINT_IN_EYE] = STRINGID_GLINTAPPEARSINEYE, + [B_MSG_GETTING_IN_POS] = STRINGID_PKMNGETTINGINTOPOSITION, + [B_MSG_GROWL_DEEPLY] = STRINGID_PKMNBEGANGROWLINGDEEPLY, + [B_MSG_EAGER_FOR_MORE] = STRINGID_PKMNEAGERFORMORE, }; static const u8 sText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!"); @@ -1321,9 +1401,9 @@ static const u8 sText_RefThatsIt[] = _("REFEREE: That's it! We will now go to\nj static const u8 sText_RefJudgeMind[] = _("REFEREE: Judging category 1, Mind!\nThe POKéMON showing the most guts!\p"); static const u8 sText_RefJudgeSkill[] = _("REFEREE: Judging category 2, Skill!\nThe POKéMON using moves the best!\p"); static const u8 sText_RefJudgeBody[] = _("REFEREE: Judging category 3, Body!\nThe POKéMON with the most vitality!\p"); -static const u8 sText_RefJudgement1[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_PLAYER_NAME}'s {B_PLAYER_MON1_NAME}!\p"); -static const u8 sText_RefJudgement2[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_TRAINER1_NAME}'s {B_OPPONENT_MON1_NAME}!\p"); -static const u8 sText_RefJudgement3[] = _("REFEREE: Judgment: 3 to 3!\nWe have a draw!\p"); +static const u8 sText_RefPlayerWon[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_PLAYER_NAME}'s {B_PLAYER_MON1_NAME}!\p"); +static const u8 sText_RefOpponentWon[] = _("REFEREE: Judgment: {B_BUFF1} to {B_BUFF2}!\nThe winner is {B_TRAINER1_NAME}'s {B_OPPONENT_MON1_NAME}!\p"); +static const u8 sText_RefDraw[] = _("REFEREE: Judgment: 3 to 3!\nWe have a draw!\p"); static const u8 sText_DefeatedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} defeated the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE's decision!"); static const u8 sText_LostToOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} lost to the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE's decision!"); static const u8 sText_TiedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} tied the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE's decision!"); @@ -1331,15 +1411,15 @@ static const u8 sText_RefCommenceBattle[] = _("REFEREE: {B_PLAYER_MON1_NAME} VS const u8 * const gRefereeStringsTable[] = { - sText_RefIfNothingIsDecided, - sText_RefThatsIt, - sText_RefJudgeMind, - sText_RefJudgeSkill, - sText_RefJudgeBody, - sText_RefJudgement1, - sText_RefJudgement2, - sText_RefJudgement3, - sText_RefCommenceBattle, + [B_MSG_REF_NOTHING_IS_DECIDED] = sText_RefIfNothingIsDecided, + [B_MSG_REF_THATS_IT] = sText_RefThatsIt, + [B_MSG_REF_JUDGE_MIND] = sText_RefJudgeMind, + [B_MSG_REF_JUDGE_SKILL] = sText_RefJudgeSkill, + [B_MSG_REF_JUDGE_BODY] = sText_RefJudgeBody, + [B_MSG_REF_PLAYER_WON] = sText_RefPlayerWon, + [B_MSG_REF_OPPONENT_WON] = sText_RefOpponentWon, + [B_MSG_REF_DRAW] = sText_RefDraw, + [B_MSG_REF_COMMENCE_BATTLE] = sText_RefCommenceBattle, }; static const u8 sText_QuestionForfeitMatch[] = _("Would you like to forfeit the match\nand quit now?"); @@ -2009,9 +2089,9 @@ void BufferStringBattle(u16 stringID) case STRINGID_INTROMSG: // first battle msg if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { - if (gBattleTypeFlags & BATTLE_TYPE_x800000) + if (gBattleTypeFlags & BATTLE_TYPE_TOWER_LINK_MULTI) { stringPtr = sText_TwoTrainersWantToBattle; } @@ -2079,18 +2159,18 @@ void BufferStringBattle(u16 stringID) { if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) stringPtr = sText_TwoTrainersSentPkmn; - else if (gBattleTypeFlags & BATTLE_TYPE_x800000) + else if (gBattleTypeFlags & BATTLE_TYPE_TOWER_LINK_MULTI) stringPtr = sText_TwoTrainersSentPkmn; else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_TwoLinkTrainersSentOutPkmn; - else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) stringPtr = sText_LinkTrainerSentOutTwoPkmn; else stringPtr = sText_Trainer1SentOutTwoPkmn; } else { - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))) stringPtr = sText_Trainer1SentOutPkmn; else if (gTrainerBattleOpponent_A == TRAINER_UNION_ROOM) stringPtr = sText_Trainer1SentOutPkmn; @@ -2113,7 +2193,7 @@ void BufferStringBattle(u16 stringID) } else { - if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_LinkTrainer2WithdrewPkmn; @@ -2140,9 +2220,9 @@ void BufferStringBattle(u16 stringID) } else { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { - if (gBattleTypeFlags & BATTLE_TYPE_x800000) + if (gBattleTypeFlags & BATTLE_TYPE_TOWER_LINK_MULTI) { if (gBattleScripting.battler == 1) stringPtr = sText_Trainer1SentOutPkmn2; @@ -2210,7 +2290,7 @@ void BufferStringBattle(u16 stringID) switch (gBattleTextBuff1[0]) { case B_OUTCOME_WON: - if (gBattleTypeFlags & BATTLE_TYPE_x800000) + if (gBattleTypeFlags & BATTLE_TYPE_TOWER_LINK_MULTI) stringPtr = sText_TwoInGameTrainersDefeated; else stringPtr = sText_TwoLinkTrainersDefeated; @@ -2336,8 +2416,8 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) u8 multiplayerId; s32 i; - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - multiplayerId = gUnknown_0203C7B4; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + multiplayerId = gRecordedBattleMultiplayerId; else multiplayerId = GetMultiplayerId(); @@ -2477,7 +2557,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gMoveNames[gBattleMsgDataPtr->originallyUsedMove]; break; case B_TXT_LAST_ITEM: // last used item - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { if (gLastUsedItem == ITEM_ENIGMA_BERRY) { @@ -2858,7 +2938,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) break; case B_BUFF_ITEM: // item name hword = T1_READ_16(&src[srcID + 1]); - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { if (hword == ITEM_ENIGMA_BERRY) { @@ -3001,7 +3081,7 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId) if (printerTemplate.x == 0xFF) { - u32 width = sub_80397C4(gBattleScripting.windowsType, windowId); + u32 width = GetBattleWindowTemplatePixelWidth(gBattleScripting.windowsType, windowId); s32 alignX = GetStringCenterAlignXOffsetWithLetterSpacing(printerTemplate.fontId, printerTemplate.currentChar, width, printerTemplate.letterSpacing); printerTemplate.x = printerTemplate.currentX = alignX; } @@ -3018,7 +3098,7 @@ void BattlePutTextOnWindow(const u8 *text, u8 windowId) if (windowId == 0 || windowId == 0x16) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) speed = 1; else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) speed = sRecordedBattleTextSpeeds[GetTextSpeedInRecordedBattle()]; diff --git a/src/battle_pike.c b/src/battle_pike.c index a161b88b8..d889d7cdd 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -57,8 +57,8 @@ static void GetRoomType(void); static void SetInWildMonRoom(void); static void ClearInWildMonRoom(void); static void SavePikeChallenge(void); -static void nullsub_76(void); -static void nullsub_124(void); +static void PikeDummy1(void); +static void PikeDummy2(void); static void GetRoomInflictedStatus(void); static void GetRoomInflictedStatusMon(void); static void HealOneOrTwoMons(void); @@ -428,32 +428,32 @@ static const u16 sNPCSpeeches[][EASY_CHAT_BATTLE_WORDS_COUNT] = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_A, EC_WORD_MISTAKE, EC_WORD_QUES}, {EC_WORD_IT_S, EC_WORD_MEAN, EC_WORD_AND, EC_WORD_AWFUL, EC_WORD_IN, EC_WORD_HERE}, {EC_WORD_I_AM, EC_WORD_SO, EC_WORD_TIRED, EC_WORD_OF, EC_WORD_THIS, EC_WORD_PLACE}, - {EC_WORD_I, EC_WORD_QUITE, EC_WORD_ENJOY, EC_WORD_THIS, EC_WORD_CHALLENGE, 0xFFFF}, + {EC_WORD_I, EC_WORD_QUITE, EC_WORD_ENJOY, EC_WORD_THIS, EC_WORD_CHALLENGE, EC_EMPTY_WORD}, {EC_WORD_LOOK, EC_WORD_AT, EC_WORD_HOW, EC_WORD_I, EC_MOVE2(TACKLE), EC_WORD_THIS}, - {EC_WORD_READY, EC_WORD_TO, EC_WORD_GIVE_UP, EC_WORD_YET, EC_WORD_QUES, 0xFFFF}, + {EC_WORD_READY, EC_WORD_TO, EC_WORD_GIVE_UP, EC_WORD_YET, EC_WORD_QUES, EC_EMPTY_WORD}, {EC_WORD_OH, EC_WORD_NO, EC_WORD_WHO, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_QUES}, {EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_WANDERING, EC_WORD_ABOUT, EC_WORD_FOREVER, EC_WORD_ELLIPSIS}, - {EC_WORD_I, EC_WORD_THINK, EC_WORD_I, EC_WORD_WILL, EC_WORD_GIVE_UP, 0xFFFF}, + {EC_WORD_I, EC_WORD_THINK, EC_WORD_I, EC_WORD_WILL, EC_WORD_GIVE_UP, EC_EMPTY_WORD}, {EC_WORD_WHAT, EC_WORD_SHOULD, EC_WORD_I, EC_WORD_DO, EC_WORD_NEXT, EC_WORD_QUES}, {EC_WORD_I, EC_WORD_CAN_WIN, EC_WORD_WITH, EC_WORD_MY, EC_MOVE(SHEER_COLD), EC_WORD_GENIUS}, {EC_WORD_WON_T, EC_WORD_SOMEONE, EC_WORD_COOL, EC_WORD_SHOW, EC_WORD_UP, EC_WORD_QUES}, - {EC_WORD_BATTLE, EC_WORD_GAME, EC_WORD_IS, EC_WORD_AWESOME, EC_WORD_EXCL, 0xFFFF}, + {EC_WORD_BATTLE, EC_WORD_GAME, EC_WORD_IS, EC_WORD_AWESOME, EC_WORD_EXCL, EC_EMPTY_WORD}, {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_TAKE, EC_WORD_THIS, EC_WORD_ANY, EC_WORD_MORE}, {EC_WORD_I, EC_WORD_DON_T, EC_WORD_KNOW, EC_WORD_IF, EC_WORD_IT_S, EC_WORD_OKAY}, {EC_WORD_OH, EC_WORD_NO, EC_WORD_EXCL, EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_TRAINER}, {EC_WORD_IT, EC_WORD_HAS, EC_WORD_TO, EC_WORD_BE, EC_WORD_LEFT, EC_WORD_NEXT}, {EC_WORD_IT, EC_WORD_MUST_BE, EC_WORD_OVER, EC_WORD_SOON, EC_WORD_RIGHT, EC_WORD_QUES}, - {EC_WORD_THIS, EC_WORD_IS, EC_WORD_TOTALLY, EC_WORD_EASY, EC_WORD_ISN_T_IT_QUES, 0xFFFF}, - {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_POWER, EC_WORD_ON, 0xFFFF}, + {EC_WORD_THIS, EC_WORD_IS, EC_WORD_TOTALLY, EC_WORD_EASY, EC_WORD_ISN_T_IT_QUES, EC_EMPTY_WORD}, + {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_POWER, EC_WORD_ON, EC_EMPTY_WORD}, {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NO, EC_WORD_GIVE_UP, EC_WORD_IN, EC_WORD_ME}, {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_TO, EC_WORD_MAKE, EC_WORD_IT}, {EC_WORD_GO, EC_WORD_ON, EC_WORD_I, EC_WORD_CAN_T, EC_WORD_ANY, EC_WORD_MORE}, - {EC_WORD_A, EC_WORD_TRAINER, EC_WORD_AFTER, EC_WORD_ANOTHER, EC_WORD_ELLIPSIS, 0xFFFF}, + {EC_WORD_A, EC_WORD_TRAINER, EC_WORD_AFTER, EC_WORD_ANOTHER, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, {EC_WORD_DO, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_STEEL, EC_WORD_POKEMON, EC_WORD_QUES}, - {EC_WORD_EVERY, EC_WORD_TRAINER, EC_WORD_HERE, EC_WORD_IS, EC_WORD_TOO_WEAK, 0xFFFF}, + {EC_WORD_EVERY, EC_WORD_TRAINER, EC_WORD_HERE, EC_WORD_IS, EC_WORD_TOO_WEAK, EC_EMPTY_WORD}, {EC_WORD_YOU, EC_WORD_THINK, EC_WORD_THIS, EC_WORD_IS, EC_WORD_EASY, EC_WORD_QUES}, {EC_WORD_WHAT, EC_WORD_WILL, EC_WORD_COME, EC_WORD_AFTER, EC_WORD_THIS, EC_WORD_QUES}, - {EC_WORD_I_AM, EC_WORD_JUST, EC_WORD_SO, EC_WORD_CONFUSED, EC_WORD_EXCL, 0xFFFF}, + {EC_WORD_I_AM, EC_WORD_JUST, EC_WORD_SO, EC_WORD_CONFUSED, EC_WORD_EXCL, EC_EMPTY_WORD}, {EC_WORD_I, EC_WORD_JUST, EC_WORD_WANT, EC_WORD_TO, EC_WORD_GO_HOME, EC_WORD_ELLIPSIS}, {EC_WORD_YEEHAW_EXCL, EC_WORD_THIS, EC_WORD_PLACE, EC_WORD_IS, EC_WORD_A, EC_WORD_PUSHOVER}, {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_BEEN, EC_WORD_IN, EC_WORD_A, EC_WORD_BATTLE}, @@ -488,8 +488,8 @@ static void (* const sBattlePikeFunctions[])(void) = [BATTLE_PIKE_FUNC_SET_IN_WILD_MON_ROOM] = SetInWildMonRoom, [BATTLE_PIKE_FUNC_CLEAR_IN_WILD_MON_ROOM] = ClearInWildMonRoom, [BATTLE_PIKE_FUNC_SAVE] = SavePikeChallenge, - [BATTLE_PIKE_FUNC_NULL_9] = nullsub_76, - [BATTLE_PIKE_FUNC_NULL_10] = nullsub_124, + [BATTLE_PIKE_FUNC_DUMMY_1] = PikeDummy1, + [BATTLE_PIKE_FUNC_DUMMY_2] = PikeDummy2, [BATTLE_PIKE_FUNC_GET_ROOM_STATUS] = GetRoomInflictedStatus, [BATTLE_PIKE_FUNC_GET_ROOM_STATUS_MON] = GetRoomInflictedStatusMon, [BATTLE_PIKE_FUNC_HEAL_ONE_TWO_MONS] = HealOneOrTwoMons, @@ -711,16 +711,16 @@ static void SavePikeChallenge(void) gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_0, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; - save_serialize_map(); + SaveMapView(); TrySavingData(SAVE_LINK); } -static void nullsub_76(void) +static void PikeDummy1(void) { } -static void nullsub_124(void) +static void PikeDummy2(void) { } @@ -1184,7 +1184,7 @@ static bool8 StatusInflictionFadeOut(struct Task *task) task->data[7] += task->data[4]; if (task->data[7] > 16) task->data[7] = 16; - BlendPalettes(0xFFFFFFFF, task->data[7], RGB(11, 11, 11)); + BlendPalettes(PALETTES_ALL, task->data[7], RGB(11, 11, 11)); } if (task->data[7] >= 16) @@ -1203,7 +1203,7 @@ static bool8 StatusInflictionFadeIn(struct Task *task) task->data[7] -= task->data[5]; if (task->data[7] < 0) task->data[7] = 0; - BlendPalettes(0xFFFFFFFF, task->data[7], RGB(11, 11, 11)); + BlendPalettes(PALETTES_ALL, task->data[7], RGB(11, 11, 11)); } if (task->data[7] == 0) @@ -1235,7 +1235,7 @@ static void StartStatusInflictionScreenFlash(s16 fadeOutDelay, s16 fadeInDelay, static bool8 IsStatusInflictionScreenFlashTaskFinished(void) { - if (FindTaskIdByFunc(DoStatusInflictionScreenFlash) == 0xFF) + if (FindTaskIdByFunc(DoStatusInflictionScreenFlash) == TASK_NONE) return TRUE; else return FALSE; @@ -1326,7 +1326,7 @@ bool8 InBattlePike(void) return gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS - || gMapHeader.mapLayoutId == LAYOUT_UNKNOWN_084693AC; + || gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_UNUSED; } static void SetHintedRoom(void) diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index ac6d95338..50efeecb4 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -933,7 +933,7 @@ static void SavePyramidChallenge(void) gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_0, 0); gSaveBlock2Ptr->frontier.challengePaused = TRUE; - save_serialize_map(); + SaveMapView(); TrySavingData(SAVE_LINK); } @@ -1399,8 +1399,12 @@ void GenerateBattlePyramidWildMon(void) for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(&gEnemyParty[0], wildMons[id].moves[i], i); - // BUG: Reading outside the array as lvl was used for mon level instead of frontier lvl mode. + // UB: Reading outside the array as lvl was used for mon level instead of frontier lvl mode. + #ifndef UBFIX if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvl] >= 140) + #else + if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[gSaveBlock2Ptr->frontier.lvlMode] >= 140) + #endif { id = (Random() % 17) + 15; for (i = 0; i < NUM_STATS; i++) diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index 8fee57855..0b13512ec 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -34,71 +34,83 @@ #include "constants/rgb.h" #include "constants/songs.h" -EWRAM_DATA struct PyramidBagResources *gPyramidBagResources = NULL; -EWRAM_DATA struct PyramidBagCursorData gPyramidBagCursorData = {0}; - -// This file's functions. -static void Task_HandlePyramidBagInput(u8 taskId); -static void Task_ChooseItemsToTossFromPyramidBag(u8 taskId); -static void sub_81C5B4C(u8 taskId); -static void Task_BeginItemSwap(u8 taskId); -static void sub_81C5D20(u8 taskId); -static void sub_81C674C(u8 taskId); -static void HandleMenuActionInput(u8 taskId); -static void HandleFewMenuActionsInput(u8 taskId); -static void sub_81C66EC(u8 taskId); -static void SetTaskToMainPyramidBagInputHandler(u8 taskId); -static void sub_81C6350(u8 taskId); -static void sub_81C64B4(u8 taskId); -static void sub_81C65CC(u8 taskId); -static void sub_81C66AC(u8 taskId); -static void PerformItemSwap(u8 taskId); -static void Task_ItemSwapHandleInput(u8 taskId); -static void sub_81C6A14(u8 taskId); +#define TAG_SCROLL_ARROW 2910 +#define TAG_PYRAMID_BAG 4132 +#define TAG_ITEM_ICON 4133 +#define TAG_ITEM_ICON_ALT 4134 + +#define POS_NONE ((u8)-1) + +enum { + WIN_LIST, + WIN_INFO, + WIN_MSG, + WIN_TOSS_NUM, +}; + +EWRAM_DATA struct PyramidBagMenu *gPyramidBagMenu = NULL; +EWRAM_DATA struct PyramidBagMenuState gPyramidBagMenuState = {0}; + +static void Task_HandlePyramidBagInput(u8); +static void Task_ChooseItemsToTossFromPyramidBag(u8); +static void Task_ClosePyramidBag(u8); +static void Task_BeginItemSwap(u8); +static void OpenContextMenu(u8); +static void TryCloseBagToGiveItem(u8); +static void HandleMenuActionInput_2x2(u8); +static void HandleMenuActionInput_SingleRow(u8); +static void Task_WaitCloseErrorMessage(u8); +static void SetTaskToMainPyramidBagInputHandler(u8); +static void AskConfirmToss(u8); +static void Task_ChooseHowManyToToss(u8); +static void Task_TossItem(u8); +static void ShowCantHoldMessage(u8); +static void PerformItemSwap(u8); +static void Task_ItemSwapHandleInput(u8); +static void CancelItemSwap(u8); static void SetBagItemsListTemplate(void); -static void sub_81C504C(void); -static void sub_81C51DC(void); -static void AddScrollArrow(void); -static void sub_81C56F8(void); -static void sub_81C5A20(void); -static void sub_81C6BD8(void); -static void sub_81C6EF4(void); -static void sub_81C700C(void); -static void sub_81C6E98(void); -static void sub_81C6F20(void); -static void sub_81C6404(void); +static void CB2_LoadPyramidBagMenu(void); +static void InitPyramidBagBgs(void); +static void AddScrollArrows(void); +static void CreatePyramidBagInputTask(void); +static void InitPyramidBagScroll(void); +static void InitPyramidBagWindows(void); +static void CreatePyramidBagSprite(void); +static void CreateSwapLine(void); +static void LoadPyramidBagPalette(void); +static void ShakePyramidBag(void); +static void ShowNumToToss(void); static void CloseBattlePyramidBagTextWindow(void); -static bool8 sub_81C5238(void); -static bool8 sub_81C5078(void); -static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId); -static void PyramidBag_CopyItemName(u8 *dst, u16 itemId); -static void sub_81C6FF8(u8 arg0); -static void PrintItemDescription(s32 listMenuId); -static void sub_81C5AB8(u8 y, u8 arg1); -static void PrintOnWindow_Font1(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId); -static void PrintOnWindow_Font7(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId); -static u8 sub_81C6D24(u8 windowArrayId); -static void sub_81C6D6C(u8 windowArrayId); -static void sub_81C5EAC(u8 windowId); -static void sub_81C5F08(u8 windowId, u8 horizontalCount, u8 verticalCount); -static bool8 IsValidMenuAction(s8 arg0); -static void sub_81C6DAC(u8 taskId, const struct YesNoFuncTable *yesNoTable); -static void sub_81C6CEC(u8 windowId); -static void sub_81C704C(u8 y); -static void sub_81C7028(bool8 invisible); -static void sub_81C6F68(struct Sprite *sprite); -static void BagAction_UseOnField(u8 taskId); -static void BagAction_Toss(u8 taskId); -static void BagAction_Give(u8 taskId); -static void BagAction_Cancel(u8 taskId); -static void BagAction_UseInBattle(u8 taskId); -static void PyramidBagMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); -static void PrintItemQuantity(u8 windowId, s32 itemIndex, u8 y); -static void TossItem(u8 taskId); -static void DontTossItem(u8 taskId); - -// Const rom data. -static const struct BgTemplate gUnknown_0861F2B4[] = +static bool8 LoadPyramidBagGfx(void); +static bool8 LoadPyramidBagMenu(void); +static void ShowItemIcon(u16, u8); +static void CopyBagItemName(u8 *, u16); +static void FreeItemIconSpriteByAltId(u8); +static void PrintItemDescription(s32); +static void PrintSelectorArrowAtPos(u8, u8); +static void PrintOnWindow_Font1(u8, const u8 *, u8, u8, u8, u8, u8, u8); +static void PrintOnWindow_Font7(u8, const u8 *, u8, u8, u8, u8, u8, u8); +static u8 OpenMenuActionWindowById(u8); +static void CloseMenuActionWindowById(u8); +static void PrintMenuActionText_SingleRow(u8); +static void PrintMenuActionText_MultiRow(u8, u8, u8); +static bool8 IsValidMenuAction(s8); +static void CreatePyramidBagYesNo(u8, const struct YesNoFuncTable *); +static void DrawTossNumberWindow(u8); +static void UpdateSwapLinePos(u8); +static void SetSwapLineInvisibility(bool8); +static void SpriteCB_BagWaitForShake(struct Sprite *); +static void BagAction_UseOnField(u8); +static void BagAction_Toss(u8); +static void BagAction_Give(u8); +static void BagAction_Cancel(u8); +static void BagAction_UseInBattle(u8); +static void BagCursorMoved(s32, bool8, struct ListMenu *); +static void PrintItemQuantity(u8, s32, u8); +static void TossItem(u8); +static void DontTossItem(u8); + +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, @@ -129,14 +141,14 @@ static const struct BgTemplate gUnknown_0861F2B4[] = }, }; -static const struct ListMenuTemplate gUnknown_0861F2C0 = +static const struct ListMenuTemplate sListMenuTemplate = { .items = NULL, - .moveCursorFunc = PyramidBagMoveCursorFunc, + .moveCursorFunc = BagCursorMoved, .itemPrintFunc = PrintItemQuantity, .totalItems = 0, .maxShowed = 0, - .windowId = 0, + .windowId = WIN_LIST, .header_X = 0, .item_X = 8, .cursor_X = 0, @@ -151,12 +163,14 @@ static const struct ListMenuTemplate gUnknown_0861F2C0 = .cursorKind = 0 }; -#define ACTION_USE_FIELD 0 -#define ACTION_TOSS 1 -#define ACTION_GIVE 2 -#define ACTION_CANCEL 3 -#define ACTION_USE_BATTLE 4 -#define ACTION_DUMMY 5 +enum { + ACTION_USE_FIELD, + ACTION_TOSS, + ACTION_GIVE, + ACTION_CANCEL, + ACTION_USE_BATTLE, + ACTION_DUMMY, +}; static const struct MenuAction sMenuActions[] = { @@ -168,26 +182,33 @@ static const struct MenuAction sMenuActions[] = [ACTION_DUMMY] = { gText_EmptyString2, NULL }, }; -static const u8 sFieldMenuActionIds[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL}; -static const u8 gUnknown_0861F30C[] = {ACTION_TOSS, ACTION_CANCEL}; -static const u8 sBattleMenuActionIds[] = {ACTION_USE_BATTLE, ACTION_CANCEL}; -static const u8 gUnknown_0861F310[] = {ACTION_CANCEL}; +static const u8 sMenuActionIds_Field[] = {ACTION_USE_FIELD, ACTION_GIVE, ACTION_TOSS, ACTION_CANCEL}; +static const u8 sMenuActionIds_ChooseToss[] = {ACTION_TOSS, ACTION_CANCEL}; +static const u8 sMenuActionIds_Battle[] = {ACTION_USE_BATTLE, ACTION_CANCEL}; +static const u8 sMenuActionIds_BattleCannotUse[] = {ACTION_CANCEL}; static const struct YesNoFuncTable sYesNoTossFuncions = { TossItem, DontTossItem }; -static const u8 sColorTable[][3] = +enum { + COLORID_DARK_GRAY, + COLORID_LIGHT_GRAY, + COLORID_WHITE_BG, + COLORID_NONE = 0xFF +}; + +static const u8 sTextColors[][3] = { - {0, 2, 3}, - {0, 3, 1}, - {1, 2, 3}, + [COLORID_DARK_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, + [COLORID_LIGHT_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE}, + [COLORID_WHITE_BG] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Unused }; -static const struct WindowTemplate gUnknown_0861F328[] = +static const struct WindowTemplate sWindowTemplates[] = { - { + [WIN_LIST] = { .bg = 0, .tilemapLeft = 14, .tilemapTop = 2, @@ -196,7 +217,7 @@ static const struct WindowTemplate gUnknown_0861F328[] = .paletteNum = 15, .baseBlock = 30 }, - { + [WIN_INFO] = { .bg = 0, .tilemapLeft = 0, .tilemapTop = 13, @@ -205,7 +226,7 @@ static const struct WindowTemplate gUnknown_0861F328[] = .paletteNum = 15, .baseBlock = 270 }, - { + [WIN_MSG] = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 15, @@ -214,7 +235,7 @@ static const struct WindowTemplate gUnknown_0861F328[] = .paletteNum = 15, .baseBlock = 354 }, - { + [WIN_TOSS_NUM] = { .bg = 1, .tilemapLeft = 24, .tilemapTop = 17, @@ -226,9 +247,17 @@ static const struct WindowTemplate gUnknown_0861F328[] = DUMMY_WIN_TEMPLATE, }; -static const struct WindowTemplate gUnknown_0861F350[] = +enum { + MENU_WIN_1x1, + MENU_WIN_1x2, + MENU_WIN_2x2, + MENU_WIN_2x3, + MENU_WIN_YESNO, +}; + +static const struct WindowTemplate sWindowTemplates_MenuActions[] = { - { + [MENU_WIN_1x1] = { .bg = 1, .tilemapLeft = 22, .tilemapTop = 17, @@ -237,7 +266,7 @@ static const struct WindowTemplate gUnknown_0861F350[] = .paletteNum = 15, .baseBlock = 472 }, - { + [MENU_WIN_1x2] = { .bg = 1, .tilemapLeft = 22, .tilemapTop = 15, @@ -246,7 +275,7 @@ static const struct WindowTemplate gUnknown_0861F350[] = .paletteNum = 15, .baseBlock = 472 }, - { + [MENU_WIN_2x2] = { .bg = 1, .tilemapLeft = 15, .tilemapTop = 15, @@ -255,7 +284,7 @@ static const struct WindowTemplate gUnknown_0861F350[] = .paletteNum = 15, .baseBlock = 472 }, - { + [MENU_WIN_2x3] = { // Unused .bg = 1, .tilemapLeft = 15, .tilemapTop = 13, @@ -264,7 +293,7 @@ static const struct WindowTemplate gUnknown_0861F350[] = .paletteNum = 15, .baseBlock = 472 }, - { + [MENU_WIN_YESNO] = { .bg = 1, .tilemapLeft = 24, .tilemapTop = 15, @@ -275,7 +304,7 @@ static const struct WindowTemplate gUnknown_0861F350[] = }, }; -static const struct OamData gOamData_861F378 = +static const struct OamData sOamData_PyramidBag = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, @@ -292,24 +321,24 @@ static const struct OamData gOamData_861F378 = .affineParam = 0, }; -static const union AnimCmd gSpriteAnim_861F380[] = +static const union AnimCmd sAnim_PyramidBag[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; -static const union AnimCmd * const gSpriteAnimTable_861F388[] = +static const union AnimCmd * const sAnims_PyramidBag[] = { - gSpriteAnim_861F380, + sAnim_PyramidBag, }; -static const union AffineAnimCmd gSpriteAffineAnim_861F38C[] = +static const union AffineAnimCmd sAffineAnim_PyramidBag_Still[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gSpriteAffineAnim_861F39C[] = +static const union AffineAnimCmd sAffineAnim_PyramidBag_Shake[] = { AFFINEANIMCMD_FRAME(0, 0, 254, 2), AFFINEANIMCMD_FRAME(0, 0, 2, 4), @@ -318,42 +347,50 @@ static const union AffineAnimCmd gSpriteAffineAnim_861F39C[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const gSpriteAffineAnimTable_861F3C4[] = +enum { + ANIM_BAG_STILL, + ANIM_BAG_SHAKE, +}; + +static const union AffineAnimCmd * const sAffineAnims_PyramidBag[] = { - gSpriteAffineAnim_861F38C, - gSpriteAffineAnim_861F39C, + [ANIM_BAG_STILL] = sAffineAnim_PyramidBag_Still, + [ANIM_BAG_SHAKE] = sAffineAnim_PyramidBag_Shake, }; -static const struct CompressedSpriteSheet gPyramidBagSpriteSheet = {gBattleFrontierGfx_PyramidBag, 0x0800, 0x1024}; +static const struct CompressedSpriteSheet sSpriteSheet_PyramidBag = {gBattleFrontierGfx_PyramidBag, 0x0800, TAG_PYRAMID_BAG}; -static const struct SpriteTemplate gUnknown_0861F3D4 = +static const struct SpriteTemplate sSpriteTemplate_PyramidBag = { - .tileTag = 0x1024, - .paletteTag = 0x1024, - .oam = &gOamData_861F378, - .anims = gSpriteAnimTable_861F388, + .tileTag = TAG_PYRAMID_BAG, + .paletteTag = TAG_PYRAMID_BAG, + .oam = &sOamData_PyramidBag, + .anims = sAnims_PyramidBag, .images = NULL, - .affineAnims = gSpriteAffineAnimTable_861F3C4, + .affineAnims = sAffineAnims_PyramidBag, .callback = SpriteCallbackDummy }; -// code void InitBattlePyramidBagCursorPosition(void) { - gPyramidBagCursorData.cursorPosition = 0; - gPyramidBagCursorData.scrollPosition = 0; + gPyramidBagMenuState.cursorPosition = 0; + gPyramidBagMenuState.scrollPosition = 0; } void CB2_PyramidBagMenuFromStartMenu(void) { - GoToBattlePyramidBagMenu(0, CB2_ReturnToFieldWithOpenMenu); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_FIELD, CB2_ReturnToFieldWithOpenMenu); } -static void sub_81C4F10(void) +// Unused, CB2_BagMenuFromBattle is used instead +static void OpenBattlePyramidBagInBattle(void) { - GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2); } +// If the player finishes a round at the Battle Pyramid with insufficient space in their +// Pyramid Bag to store the party's held items, they may choose items to toss in order to +// make room. void ChooseItemsToTossFromPyramidBag(void) { ScriptContext2_Enable(); @@ -367,37 +404,37 @@ static void Task_ChooseItemsToTossFromPyramidBag(u8 taskId) { CleanupOverworldWindowsAndTilemaps(); gFieldCallback2 = CB2_FadeFromPartyMenu; - GoToBattlePyramidBagMenu(3, CB2_ReturnToField); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_CHOOSE_TOSS, CB2_ReturnToField); DestroyTask(taskId); } } void CB2_ReturnToPyramidBagMenu(void) { - GoToBattlePyramidBagMenu(4, gPyramidBagCursorData.callback); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.callback); } -void GoToBattlePyramidBagMenu(u8 a0, void (*callback)(void)) +void GoToBattlePyramidBagMenu(u8 location, void (*callback)(void)) { - gPyramidBagResources = AllocZeroed(sizeof(*gPyramidBagResources)); + gPyramidBagMenu = AllocZeroed(sizeof(*gPyramidBagMenu)); - if (a0 != 4) - gPyramidBagCursorData.unk4 = a0; + if (location != PYRAMIDBAG_LOC_PREV) + gPyramidBagMenuState.location = location; if (callback != NULL) - gPyramidBagCursorData.callback = callback; + gPyramidBagMenuState.callback = callback; - gPyramidBagResources->callback2 = NULL; - gPyramidBagResources->unk814 = 0xFF; - gPyramidBagResources->scrollIndicatorsTaskId = 0xFF; + gPyramidBagMenu->exitCallback = NULL; + gPyramidBagMenu->toSwapPos = POS_NONE; + gPyramidBagMenu->scrollIndicatorsTaskId = TASK_NONE; - memset(gPyramidBagResources->itemsSpriteIds, 0xFF, sizeof(gPyramidBagResources->itemsSpriteIds)); - memset(gPyramidBagResources->windowIds, 0xFF, sizeof(gPyramidBagResources->windowIds)); + memset(gPyramidBagMenu->spriteIds, SPRITE_NONE, sizeof(gPyramidBagMenu->spriteIds)); + memset(gPyramidBagMenu->windowIds, WINDOW_NONE, sizeof(gPyramidBagMenu->windowIds)); - SetMainCallback2(sub_81C504C); + SetMainCallback2(CB2_LoadPyramidBagMenu); } -static void sub_81C501C(void) +static void CB2_PyramidBag(void) { RunTasks(); AnimateSprites(); @@ -406,19 +443,21 @@ static void sub_81C501C(void) UpdatePaletteFade(); } -static void sub_81C5038(void) +static void VBlankCB_PyramidBag(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void sub_81C504C(void) +static void CB2_LoadPyramidBagMenu(void) { - while (MenuHelpers_CallLinkSomething() != TRUE && sub_81C5078() != TRUE && MenuHelpers_LinkSomething() != TRUE); + while (MenuHelpers_CallLinkSomething() != TRUE + && LoadPyramidBagMenu() != TRUE + && MenuHelpers_LinkSomething() != TRUE); } -static bool8 sub_81C5078(void) +static bool8 LoadPyramidBagMenu(void) { switch (gMain.state) { @@ -446,30 +485,26 @@ static bool8 sub_81C5078(void) break; case 5: if (!MenuHelpers_LinkSomething()) - { ResetTasks(); - } gMain.state++; break; case 6: - sub_81C51DC(); - gPyramidBagResources->state = 0; + InitPyramidBagBgs(); + gPyramidBagMenu->state = 0; gMain.state++; break; case 7: - if (sub_81C5238()) - { + if (LoadPyramidBagGfx()) gMain.state++; - } break; case 8: - sub_81C6BD8(); + InitPyramidBagWindows(); gMain.state++; break; case 9: - sub_81C5924(); - sub_81C59BC(); - sub_81C5A20(); + UpdatePyramidBagList(); + UpdatePyramidBagCursorPos(); + InitPyramidBagScroll(); gMain.state++; break; case 10: @@ -477,44 +512,44 @@ static bool8 sub_81C5078(void) gMain.state++; break; case 11: - sub_81C56F8(); + CreatePyramidBagInputTask(); gMain.state++; break; case 12: - sub_81C6EF4(); + CreatePyramidBagSprite(); gMain.state++; break; case 13: - AddScrollArrow(); + AddScrollArrows(); gMain.state++; break; case 14: - sub_81C700C(); + CreateSwapLine(); gMain.state++; break; case 15: - BlendPalettes(0xFFFFFFFF, 0x10, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gMain.state++; break; case 16: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; default: - SetVBlankCallback(sub_81C5038); - SetMainCallback2(sub_81C501C); + SetVBlankCallback(VBlankCB_PyramidBag); + SetMainCallback2(CB2_PyramidBag); return TRUE; } return FALSE; } -static void sub_81C51DC(void) +static void InitPyramidBagBgs(void) { ResetVramOamAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0861F2B4, ARRAY_COUNT(gUnknown_0861F2B4)); - SetBgTilemapBuffer(2, gPyramidBagResources->tilemapBuffer); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + SetBgTilemapBuffer(2, gPyramidBagMenu->tilemapBuffer); ResetAllBgsCoordinates(); ScheduleBgCopyTilemapToVram(2); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | @@ -526,37 +561,37 @@ static void sub_81C51DC(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); } -static bool8 sub_81C5238(void) +static bool8 LoadPyramidBagGfx(void) { - switch (gPyramidBagResources->state) + switch (gPyramidBagMenu->state) { case 0: ResetTempTileDataBuffers(); DecompressAndCopyTileDataToVram(2, gBagScreen_Gfx, 0, 0, 0); - gPyramidBagResources->state++; + gPyramidBagMenu->state++; break; case 1: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gBattleFrontierGfx_PyramidBagTileMap, gPyramidBagResources->tilemapBuffer); - gPyramidBagResources->state++; + LZDecompressWram(gBattleFrontierGfx_PyramidBagTileMap, gPyramidBagMenu->tilemapBuffer); + gPyramidBagMenu->state++; } break; case 2: - LoadCompressedPalette(gUnknown_08D9AF44, 0, 0x20); - gPyramidBagResources->state++; + LoadCompressedPalette(gUnknown_08D9AF44, 0, 32); + gPyramidBagMenu->state++; break; case 3: - LoadCompressedSpriteSheet(&gPyramidBagSpriteSheet); - gPyramidBagResources->state++; + LoadCompressedSpriteSheet(&sSpriteSheet_PyramidBag); + gPyramidBagMenu->state++; break; case 4: - sub_81C6E98(); - gPyramidBagResources->state++; + LoadPyramidBagPalette(); + gPyramidBagMenu->state++; break; default: - LoadListMenuArrowsGfx(); - gPyramidBagResources->state = 0; + LoadListMenuSwapLineGfx(); + gPyramidBagMenu->state = 0; return TRUE; } @@ -566,24 +601,24 @@ static bool8 sub_81C5238(void) static void SetBagItemsListTemplate(void) { u16 i; - u16 *pyramidItems = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; + u16 *itemIds = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; - for (i = 0; i < gPyramidBagResources->listMenuCount - 1; i++) + for (i = 0; i < gPyramidBagMenu->listMenuCount - 1; i++) { - PyramidBag_CopyItemName(gPyramidBagResources->itemStrings[i], pyramidItems[i]); - gPyramidBagResources->bagListItems[i].name = gPyramidBagResources->itemStrings[i]; - gPyramidBagResources->bagListItems[i].id = i; + CopyBagItemName(gPyramidBagMenu->itemStrings[i], itemIds[i]); + gPyramidBagMenu->bagListItems[i].name = gPyramidBagMenu->itemStrings[i]; + gPyramidBagMenu->bagListItems[i].id = i; } - StringCopy(gPyramidBagResources->itemStrings[i], gText_CloseBag); - gPyramidBagResources->bagListItems[i].name = gPyramidBagResources->itemStrings[i]; - gPyramidBagResources->bagListItems[i].id = LIST_CANCEL; - gMultiuseListMenuTemplate = gUnknown_0861F2C0; - gMultiuseListMenuTemplate.totalItems = gPyramidBagResources->listMenuCount; - gMultiuseListMenuTemplate.items = gPyramidBagResources->bagListItems; - gMultiuseListMenuTemplate.maxShowed = gPyramidBagResources->listMenuMaxShown; + StringCopy(gPyramidBagMenu->itemStrings[i], gText_CloseBag); + gPyramidBagMenu->bagListItems[i].name = gPyramidBagMenu->itemStrings[i]; + gPyramidBagMenu->bagListItems[i].id = LIST_CANCEL; + gMultiuseListMenuTemplate = sListMenuTemplate; + gMultiuseListMenuTemplate.totalItems = gPyramidBagMenu->listMenuCount; + gMultiuseListMenuTemplate.items = gPyramidBagMenu->bagListItems; + gMultiuseListMenuTemplate.maxShowed = gPyramidBagMenu->listMenuMaxShown; } -static void PyramidBag_CopyItemName(u8 *dst, u16 itemId) +static void CopyBagItemName(u8 *dst, u16 itemId) { if (ItemId_GetPocket(itemId) == POCKET_BERRIES) { @@ -597,21 +632,21 @@ static void PyramidBag_CopyItemName(u8 *dst, u16 itemId) } } -static void PyramidBagMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) +static void BagCursorMoved(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (onInit != TRUE) { PlaySE(SE_SELECT); - sub_81C6F20(); + ShakePyramidBag(); } - if (gPyramidBagResources->unk814 == 0xFF) + if (gPyramidBagMenu->toSwapPos == POS_NONE) { - sub_81C6FF8(gPyramidBagResources->unk815 ^ 1); + FreeItemIconSpriteByAltId(gPyramidBagMenu->isAltIcon ^ 1); if (itemIndex != LIST_CANCEL) - ShowItemImage(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], gPyramidBagResources->unk815); + ShowItemIcon(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], gPyramidBagMenu->isAltIcon); else - ShowItemImage(0xFFFF, gPyramidBagResources->unk815); - gPyramidBagResources->unk815 ^= 1; + ShowItemIcon(0xFFFF, gPyramidBagMenu->isAltIcon); // Show exit arrow if on Cancel + gPyramidBagMenu->isAltIcon ^= 1; PrintItemDescription(itemIndex); } } @@ -622,20 +657,23 @@ static void PrintItemQuantity(u8 windowId, s32 itemIndex, u8 y) if (itemIndex == LIST_CANCEL) return; - if (gPyramidBagResources->unk814 != 0xFF) + if (gPyramidBagMenu->toSwapPos != POS_NONE) { - if (gPyramidBagResources->unk814 == (u8)(itemIndex)) - sub_81C5AB8(y, 1); + // Performing a swap. Keep a gray selector arrow on the position to swap to + // and erase the selector arrow anywhere else + if (gPyramidBagMenu->toSwapPos == (u8)(itemIndex)) + PrintSelectorArrowAtPos(y, COLORID_LIGHT_GRAY); else - sub_81C5AB8(y, 0xFF); + PrintSelectorArrowAtPos(y, COLORID_NONE); } + ConvertIntToDecimalStringN(gStringVar1, gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][itemIndex], STR_CONV_MODE_RIGHT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, gText_xVar1); - xAlign = GetStringRightAlignXOffset(7, gStringVar4, 0x77); - PrintOnWindow_Font7(windowId, gStringVar4, xAlign, y, 0, 0, TEXT_SPEED_FF, 0); + xAlign = GetStringRightAlignXOffset(7, gStringVar4, 119); + PrintOnWindow_Font7(windowId, gStringVar4, xAlign, y, 0, 0, TEXT_SPEED_FF, COLORID_DARK_GRAY); } static void PrintItemDescription(s32 listMenuId) @@ -647,34 +685,42 @@ static void PrintItemDescription(s32 listMenuId) } else { - StringCopy(gStringVar1, gReturnToXStringsTable2[gPyramidBagCursorData.unk4]); + StringCopy(gStringVar1, gPyramidBagMenu_ReturnToStrings[gPyramidBagMenuState.location]); StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1); desc = gStringVar4; } - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - PrintOnWindow_Font1(1, desc, 3, 0, 0, 1, 0, 0); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PrintOnWindow_Font1(WIN_INFO, desc, 3, 0, 0, 1, 0, COLORID_DARK_GRAY); } -static void AddScrollArrow(void) +static void AddScrollArrows(void) { - if (gPyramidBagResources->scrollIndicatorsTaskId == 0xFF) - gPyramidBagResources->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(2, 172, 12, 148, gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown, 0xB5E, 0xB5E, &gPyramidBagCursorData.scrollPosition); + if (gPyramidBagMenu->scrollIndicatorsTaskId == TASK_NONE) + gPyramidBagMenu->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 172, 12, 148, + gPyramidBagMenu->listMenuCount - gPyramidBagMenu->listMenuMaxShown, + TAG_SCROLL_ARROW, TAG_SCROLL_ARROW, + &gPyramidBagMenuState.scrollPosition); } static void RemoveScrollArrow(void) { - if (gPyramidBagResources->scrollIndicatorsTaskId != 0xFF) + if (gPyramidBagMenu->scrollIndicatorsTaskId != TASK_NONE) { - RemoveScrollIndicatorArrowPair(gPyramidBagResources->scrollIndicatorsTaskId); - gPyramidBagResources->scrollIndicatorsTaskId = 0xFF; + RemoveScrollIndicatorArrowPair(gPyramidBagMenu->scrollIndicatorsTaskId); + gPyramidBagMenu->scrollIndicatorsTaskId = TASK_NONE; } } -static void sub_81C56F8(void) +#define tListTaskId data[0] +#define tListPos data[1] +#define tQuantity data[2] +#define tNumToToss data[8] + +static void CreatePyramidBagInputTask(void) { u8 taskId = CreateTask(Task_HandlePyramidBagInput, 0); s16 *data = gTasks[taskId].data; - data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gPyramidBagCursorData.scrollPosition, gPyramidBagCursorData.cursorPosition); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, gPyramidBagMenuState.scrollPosition, gPyramidBagMenuState.cursorPosition); } static void SwapItems(u8 id1, u8 id2) @@ -728,9 +774,9 @@ static void CompactItems(void) for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) { - if (itemIds[i] == 0 || quantities[i] == 0) + if (itemIds[i] == ITEM_NONE || quantities[i] == 0) { - itemIds[i] = 0; + itemIds[i] = ITEM_NONE; quantities[i] = 0; } } @@ -738,98 +784,97 @@ static void CompactItems(void) { for (j = i + 1; j < PYRAMID_BAG_ITEMS_COUNT; j++) { - if (itemIds[i] == 0 || quantities[i] == 0) + if (itemIds[i] == ITEM_NONE || quantities[i] == 0) SwapItems(i, j); } } } -void sub_81C5924(void) +void UpdatePyramidBagList(void) { u16 i; u16 *itemIds = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; CompactItems(); - gPyramidBagResources->listMenuCount = 0; + gPyramidBagMenu->listMenuCount = 0; for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) { - if (itemIds[i] != 0) - gPyramidBagResources->listMenuCount++; + if (itemIds[i] != ITEM_NONE) + gPyramidBagMenu->listMenuCount++; } - gPyramidBagResources->listMenuCount++; - if (gPyramidBagResources->listMenuCount > 8) - gPyramidBagResources->listMenuMaxShown = 8; + gPyramidBagMenu->listMenuCount++; + if (gPyramidBagMenu->listMenuCount > 8) + gPyramidBagMenu->listMenuMaxShown = 8; else - gPyramidBagResources->listMenuMaxShown = gPyramidBagResources->listMenuCount; + gPyramidBagMenu->listMenuMaxShown = gPyramidBagMenu->listMenuCount; } -void sub_81C59BC(void) +void UpdatePyramidBagCursorPos(void) { - if (gPyramidBagCursorData.scrollPosition != 0 && gPyramidBagCursorData.scrollPosition + gPyramidBagResources->listMenuMaxShown > gPyramidBagResources->listMenuCount) - gPyramidBagCursorData.scrollPosition = gPyramidBagResources->listMenuCount - gPyramidBagResources->listMenuMaxShown; - if (gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition >= gPyramidBagResources->listMenuCount) + if (gPyramidBagMenuState.scrollPosition != 0 && gPyramidBagMenuState.scrollPosition + gPyramidBagMenu->listMenuMaxShown > gPyramidBagMenu->listMenuCount) + gPyramidBagMenuState.scrollPosition = gPyramidBagMenu->listMenuCount - gPyramidBagMenu->listMenuMaxShown; + + if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition >= gPyramidBagMenu->listMenuCount) { - if (gPyramidBagResources->listMenuCount == 0) - gPyramidBagCursorData.cursorPosition = 0; + if (gPyramidBagMenu->listMenuCount == 0) + gPyramidBagMenuState.cursorPosition = 0; else - gPyramidBagCursorData.cursorPosition = gPyramidBagResources->listMenuCount - 1; + gPyramidBagMenuState.cursorPosition = gPyramidBagMenu->listMenuCount - 1; } } -static void sub_81C5A20(void) +static void InitPyramidBagScroll(void) { u8 i; - if (gPyramidBagCursorData.cursorPosition > 4) + if (gPyramidBagMenuState.cursorPosition > 4) { - for (i = 0; i <= gPyramidBagCursorData.cursorPosition - 4; i++) + for (i = 0; i <= gPyramidBagMenuState.cursorPosition - 4; i++) { - if (gPyramidBagCursorData.scrollPosition + gPyramidBagResources->listMenuMaxShown == gPyramidBagResources->listMenuCount) - { - // daycare.c sends its regards. + if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenu->listMenuMaxShown == gPyramidBagMenu->listMenuCount) break; - } - gPyramidBagCursorData.cursorPosition--; - gPyramidBagCursorData.scrollPosition++; + + gPyramidBagMenuState.cursorPosition--; + gPyramidBagMenuState.scrollPosition++; } } } -static void sub_81C5A98(u8 listMenuTaskId, u8 arg1) +static void PrintSelectorArrow(u8 listMenuTaskId, u8 colorId) { u8 y = ListMenuGetYCoordForPrintingArrowCursor(listMenuTaskId); - sub_81C5AB8(y, arg1); + PrintSelectorArrowAtPos(y, colorId); } -static void sub_81C5AB8(u8 y, u8 arg1) +static void PrintSelectorArrowAtPos(u8 y, u8 colorId) { - if (arg1 == 0xFF) - FillWindowPixelRect(0, PIXEL_FILL(0), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1)); + if (colorId == COLORID_NONE) // If 'no color', erase arrow + FillWindowPixelRect(WIN_LIST, PIXEL_FILL(0), 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1)); else - PrintOnWindow_Font1(0, gText_SelectorArrow2, 0, y, 0, 0, 0, arg1); + PrintOnWindow_Font1(WIN_LIST, gText_SelectorArrow2, 0, y, 0, 0, 0, colorId); } -void CloseBattlePyramidBagAndSetCallback(u8 taskId) +void CloseBattlePyramidBag(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].func = sub_81C5B4C; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_ClosePyramidBag; } -static void sub_81C5B4C(u8 taskId) +static void Task_ClosePyramidBag(u8 taskId) { s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - DestroyListMenuTask(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); - if (gPyramidBagResources->callback2 != NULL) - SetMainCallback2(gPyramidBagResources->callback2); + DestroyListMenuTask(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition); + if (gPyramidBagMenu->exitCallback != NULL) + SetMainCallback2(gPyramidBagMenu->exitCallback); else - SetMainCallback2(gPyramidBagCursorData.callback); + SetMainCallback2(gPyramidBagMenuState.callback); RemoveScrollArrow(); ResetSpriteData(); FreeAllSpritePalettes(); FreeAllWindowBuffers(); - Free(gPyramidBagResources); + Free(gPyramidBagMenu); DestroyTask(taskId); } } @@ -837,108 +882,110 @@ static void sub_81C5B4C(u8 taskId) static void Task_HandlePyramidBagInput(u8 taskId) { s16 *data = gTasks[taskId].data; - if (MenuHelpers_CallLinkSomething() != TRUE && !gPaletteFade.active) + if (MenuHelpers_CallLinkSomething() == TRUE || gPaletteFade.active) + return; + + if (JOY_NEW(SELECT_BUTTON)) { - if (JOY_NEW(SELECT_BUTTON)) + if (gPyramidBagMenuState.location != PYRAMIDBAG_LOC_PARTY) { - if (gPyramidBagCursorData.unk4 != 2) + ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition); + if (gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition != gPyramidBagMenu->listMenuCount - 1) { - ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); - if (gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition != gPyramidBagResources->listMenuCount - 1) - { - PlaySE(SE_SELECT); - Task_BeginItemSwap(taskId); - } + PlaySE(SE_SELECT); + Task_BeginItemSwap(taskId); } } - else + } + else + { + s32 listId = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition); + switch (listId) { - s32 listId = ListMenu_ProcessInput(data[0]); - ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); - switch (listId) - { - case LIST_NOTHING_CHOSEN: - break; - case LIST_CANCEL: - PlaySE(SE_SELECT); - gSpecialVar_ItemId = 0; - CloseBattlePyramidBagAndSetCallback(taskId); - break; - default: - PlaySE(SE_SELECT); - gSpecialVar_ItemId = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listId]; - data[1] = listId; - data[2] = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][listId]; - if (gPyramidBagCursorData.unk4 == 2) - sub_81C674C(taskId); - else - sub_81C5D20(taskId); - break; - } + case LIST_NOTHING_CHOSEN: + break; + case LIST_CANCEL: + PlaySE(SE_SELECT); + gSpecialVar_ItemId = ITEM_NONE; + CloseBattlePyramidBag(taskId); + break; + default: + PlaySE(SE_SELECT); + gSpecialVar_ItemId = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listId]; + tListPos = listId; + tQuantity = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode][listId]; + if (gPyramidBagMenuState.location == PYRAMIDBAG_LOC_PARTY) + TryCloseBagToGiveItem(taskId); + else + OpenContextMenu(taskId); + break; } } } -static void sub_81C5D20(u8 taskId) +static void OpenContextMenu(u8 taskId) { s16 *data = gTasks[taskId].data; RemoveScrollArrow(); - sub_81C5A98(data[0], 1); - switch (gPyramidBagCursorData.unk4) + PrintSelectorArrow(tListTaskId, COLORID_LIGHT_GRAY); + switch (gPyramidBagMenuState.location) { default: - gPyramidBagResources->menuActionIds = sFieldMenuActionIds; - gPyramidBagResources->menuActionsCount = ARRAY_COUNT(sFieldMenuActionIds); +// case PYRAMIDBAG_LOC_FIELD: +// case PYRAMIDBAG_LOC_PARTY: + gPyramidBagMenu->menuActionIds = sMenuActionIds_Field; + gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Field); break; - case 1: + case PYRAMIDBAG_LOC_BATTLE: if (ItemId_GetBattleUsage(gSpecialVar_ItemId)) { - gPyramidBagResources->menuActionIds = sBattleMenuActionIds; - gPyramidBagResources->menuActionsCount = ARRAY_COUNT(sBattleMenuActionIds); + gPyramidBagMenu->menuActionIds = sMenuActionIds_Battle; + gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Battle); } else { - gPyramidBagResources->menuActionIds = gUnknown_0861F310; - gPyramidBagResources->menuActionsCount = ARRAY_COUNT(gUnknown_0861F310); + gPyramidBagMenu->menuActionIds = sMenuActionIds_BattleCannotUse; + gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_BattleCannotUse); } break; - case 3: - gPyramidBagResources->menuActionIds = gUnknown_0861F30C; - gPyramidBagResources->menuActionsCount = ARRAY_COUNT(gUnknown_0861F30C); + case PYRAMIDBAG_LOC_CHOOSE_TOSS: + gPyramidBagMenu->menuActionIds = sMenuActionIds_ChooseToss; + gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_ChooseToss); break; } CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_Var1IsSelected); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0); - if (gPyramidBagResources->menuActionsCount == 1) - sub_81C5EAC(sub_81C6D24(0)); - else if (gPyramidBagResources->menuActionsCount == 2) - sub_81C5EAC(sub_81C6D24(1)); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY); + if (gPyramidBagMenu->menuActionsCount == 1) + PrintMenuActionText_SingleRow(OpenMenuActionWindowById(MENU_WIN_1x1)); + else if (gPyramidBagMenu->menuActionsCount == 2) + PrintMenuActionText_SingleRow(OpenMenuActionWindowById(MENU_WIN_1x2)); else - sub_81C5F08(sub_81C6D24(2), 2, 2); + PrintMenuActionText_MultiRow(OpenMenuActionWindowById(MENU_WIN_2x2), 2, 2); - if (gPyramidBagResources->menuActionsCount == 4) - gTasks[taskId].func = HandleMenuActionInput; + if (gPyramidBagMenu->menuActionsCount == 2 * 2) // Assumes any non 2x2 menu is single-row + gTasks[taskId].func = HandleMenuActionInput_2x2; else - gTasks[taskId].func = HandleFewMenuActionsInput; + gTasks[taskId].func = HandleMenuActionInput_SingleRow; } -static void sub_81C5EAC(u8 windowId) +static void PrintMenuActionText_SingleRow(u8 windowId) { - AddItemMenuActionTextPrinters(windowId, 7, 8, 1, 0, 0x10, gPyramidBagResources->menuActionsCount, sMenuActions, gPyramidBagResources->menuActionIds); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, gPyramidBagResources->menuActionsCount, 0); + AddItemMenuActionTextPrinters(windowId, 7, 8, 1, 0, 0x10, gPyramidBagMenu->menuActionsCount, sMenuActions, gPyramidBagMenu->menuActionIds); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, gPyramidBagMenu->menuActionsCount, 0); } -static void sub_81C5F08(u8 windowId, u8 horizontalCount, u8 verticalCount) +static void PrintMenuActionText_MultiRow(u8 windowId, u8 horizontalCount, u8 verticalCount) { - sub_8198DBC(windowId, 7, 8, 1, 0x38, horizontalCount, verticalCount, sMenuActions, gPyramidBagResources->menuActionIds); - sub_8199944(windowId, 0x38, horizontalCount, verticalCount, 0); + PrintMenuActionGrid(windowId, 7, 8, 1, 56, horizontalCount, verticalCount, sMenuActions, gPyramidBagMenu->menuActionIds); + InitMenuActionGrid(windowId, 56, horizontalCount, verticalCount, 0); } -static void HandleFewMenuActionsInput(u8 taskId) +static void HandleMenuActionInput_SingleRow(u8 taskId) { if (MenuHelpers_CallLinkSomething() != TRUE) { @@ -953,14 +1000,14 @@ static void HandleFewMenuActionsInput(u8 taskId) break; default: PlaySE(SE_SELECT); - if (sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8 != NULL) - sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8(taskId); + if (sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8 != NULL) + sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8(taskId); break; } } } -static void HandleMenuActionInput(u8 taskId) +static void HandleMenuActionInput_2x2(u8 taskId) { if (MenuHelpers_CallLinkSomething() != TRUE) { @@ -975,7 +1022,7 @@ static void HandleMenuActionInput(u8 taskId) } else if (JOY_NEW(DPAD_DOWN)) { - if (id < gPyramidBagResources->menuActionsCount - 2 && IsValidMenuAction(id + 2)) + if (id < gPyramidBagMenu->menuActionsCount - 2 && IsValidMenuAction(id + 2)) { PlaySE(SE_SELECT); ChangeListMenuCursorPosition(MENU_CURSOR_DELTA_NONE, MENU_CURSOR_DELTA_DOWN); @@ -1000,8 +1047,8 @@ static void HandleMenuActionInput(u8 taskId) else if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if (sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8 != NULL) - sMenuActions[gPyramidBagResources->menuActionIds[id]].func.void_u8(taskId); + if (sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8 != NULL) + sMenuActions[gPyramidBagMenu->menuActionIds[id]].func.void_u8(taskId); } else if (JOY_NEW(B_BUTTON)) { @@ -1015,22 +1062,22 @@ static bool8 IsValidMenuAction(s8 actionTableId) { if (actionTableId < 0) return FALSE; - else if (actionTableId > gPyramidBagResources->menuActionsCount) + else if (actionTableId > gPyramidBagMenu->menuActionsCount) return FALSE; - else if (gPyramidBagResources->menuActionIds[actionTableId] == ACTION_DUMMY) + else if (gPyramidBagMenu->menuActionIds[actionTableId] == ACTION_DUMMY) return FALSE; else return TRUE; } -static void sub_81C61A8(void) +static void CloseMenuActionWindow(void) { - if (gPyramidBagResources->menuActionsCount == 1) - sub_81C6D6C(0); - else if (gPyramidBagResources->menuActionsCount == 2) - sub_81C6D6C(1); + if (gPyramidBagMenu->menuActionsCount == 1) + CloseMenuActionWindowById(MENU_WIN_1x1); + else if (gPyramidBagMenu->menuActionsCount == 2) + CloseMenuActionWindowById(MENU_WIN_1x2); else - sub_81C6D6C(2); + CloseMenuActionWindowById(MENU_WIN_2x2); } static void BagAction_UseOnField(u8 taskId) @@ -1042,13 +1089,13 @@ static void BagAction_UseOnField(u8 taskId) || pocketId == POCKET_TM_HM || ItemIsMail(gSpecialVar_ItemId) == TRUE) { - sub_81C61A8(); + CloseMenuActionWindow(); DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, Task_CloseBattlePyramidBagMessage); } else if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL) { - sub_81C61A8(); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); + CloseMenuActionWindow(); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); ScheduleBgCopyTilemapToVram(0); ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); } @@ -1058,17 +1105,17 @@ static void BagAction_Cancel(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81C61A8(); - PrintItemDescription(data[1]); + CloseMenuActionWindow(); + PrintItemDescription(tListPos); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); - sub_81C5A98(data[0], 0); + PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY); SetTaskToMainPyramidBagInputHandler(taskId); } static void SetTaskToMainPyramidBagInputHandler(u8 taskId) { - AddScrollArrow(); + AddScrollArrows(); gTasks[taskId].func = Task_HandlePyramidBagInput; } @@ -1076,86 +1123,86 @@ static void BagAction_Toss(u8 taskId) { s16 *data = gTasks[taskId].data; - sub_81C61A8(); - data[8] = 1; - if (data[2] == 1) + CloseMenuActionWindow(); + tNumToToss = 1; + if (tQuantity == 1) { - sub_81C6350(taskId); + AskConfirmToss(taskId); } else { CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_TossHowManyVar1s); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0); - sub_81C6404(); - gTasks[taskId].func = sub_81C64B4; + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY); + ShowNumToToss(); + gTasks[taskId].func = Task_ChooseHowManyToToss; } } -static void sub_81C6350(u8 taskId) +static void AskConfirmToss(u8 taskId) { s16 *data = gTasks[taskId].data; CopyItemName(gSpecialVar_ItemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar2, tNumToToss, STR_CONV_MODE_LEFT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, gText_ConfirmTossItems); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0); - sub_81C6DAC(taskId, &sYesNoTossFuncions); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY); + CreatePyramidBagYesNo(taskId, &sYesNoTossFuncions); } static void DontTossItem(u8 taskId) { s16 *data = gTasks[taskId].data; - PrintItemDescription(data[1]); - sub_81C5A98(data[0], 0); + PrintItemDescription(tListPos); + PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY); SetTaskToMainPyramidBagInputHandler(taskId); } -static void sub_81C6404(void) +static void ShowNumToToss(void) { s32 x; - ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_xVar1); - sub_81C6CEC(3); + DrawTossNumberWindow(WIN_TOSS_NUM); x = GetStringCenterAlignXOffset(1, gStringVar4, 0x28); - AddTextPrinterParameterized(3, 1, gStringVar4, x, 2, 0, NULL); + AddTextPrinterParameterized(WIN_TOSS_NUM, 1, gStringVar4, x, 2, 0, NULL); } -static void sub_81C645C(s16 value) +static void UpdateNumToToss(s16 num) { s32 x; - - ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar1, num, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_xVar1); x = GetStringCenterAlignXOffset(1, gStringVar4, 0x28); - AddTextPrinterParameterized(3, 1, gStringVar4, x, 2, 0, NULL); + AddTextPrinterParameterized(WIN_TOSS_NUM, 1, gStringVar4, x, 2, 0, NULL); } -static void sub_81C64B4(u8 taskId) +static void Task_ChooseHowManyToToss(u8 taskId) { s16 *data = gTasks[taskId].data; - if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) + if (AdjustQuantityAccordingToDPadInput(&tNumToToss, tQuantity) == TRUE) { - sub_81C645C(data[8]); + UpdateNumToToss(tNumToToss); } else if (JOY_NEW(A_BUTTON)) { + // Toss PlaySE(SE_SELECT); - ClearStdWindowAndFrameToTransparent(3, 0); - ClearWindowTilemap(3); + ClearStdWindowAndFrameToTransparent(WIN_TOSS_NUM, 0); + ClearWindowTilemap(WIN_TOSS_NUM); ScheduleBgCopyTilemapToVram(1); - sub_81C6350(taskId); + AskConfirmToss(taskId); } else if (JOY_NEW(B_BUTTON)) { + // Cancel tossing PlaySE(SE_SELECT); - ClearStdWindowAndFrameToTransparent(3, 0); - ClearWindowTilemap(3); + ClearStdWindowAndFrameToTransparent(WIN_TOSS_NUM, 0); + ClearWindowTilemap(WIN_TOSS_NUM); ScheduleBgCopyTilemapToVram(1); DontTossItem(taskId); } @@ -1166,28 +1213,28 @@ static void TossItem(u8 taskId) s16 *data = gTasks[taskId].data; CopyItemName(gSpecialVar_ItemId, gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar2, tNumToToss, STR_CONV_MODE_LEFT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, gText_ThrewAwayVar2Var1s); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0); - gTasks[taskId].func = sub_81C65CC; + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY); + gTasks[taskId].func = Task_TossItem; } -static void sub_81C65CC(u8 taskId) +static void Task_TossItem(u8 taskId) { s16 *data = gTasks[taskId].data; - u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition; - u16 *selectedRow = &gPyramidBagCursorData.cursorPosition; + u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition; + u16 *selectedRow = &gPyramidBagMenuState.cursorPosition; if (JOY_NEW(A_BUTTON | B_BUTTON)) { PlaySE(SE_SELECT); - RemovePyramidBagItem(gSpecialVar_ItemId, data[8]); - DestroyListMenuTask(data[0], scrollOffset, selectedRow); - sub_81C5924(); - sub_81C59BC(); + RemovePyramidBagItem(gSpecialVar_ItemId, tNumToToss); + DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow); + UpdatePyramidBagList(); + UpdatePyramidBagCursorPos(); SetBagItemsListTemplate(); - data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); ScheduleBgCopyTilemapToVram(0); SetTaskToMainPyramidBagInputHandler(taskId); } @@ -1195,30 +1242,30 @@ static void sub_81C65CC(u8 taskId) static void BagAction_Give(u8 taskId) { - sub_81C61A8(); + CloseMenuActionWindow(); if (ItemIsMail(gSpecialVar_ItemId) == TRUE) { - DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, sub_81C66EC); + DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage); } else if (!ItemId_GetImportance(gSpecialVar_ItemId)) { - gPyramidBagResources->callback2 = CB2_ChooseMonToGiveItem; - CloseBattlePyramidBagAndSetCallback(taskId); + gPyramidBagMenu->exitCallback = CB2_ChooseMonToGiveItem; + CloseBattlePyramidBag(taskId); } else { - sub_81C66AC(taskId); + ShowCantHoldMessage(taskId); } } -static void sub_81C66AC(u8 taskId) +static void ShowCantHoldMessage(u8 taskId) { CopyItemName(gSpecialVar_ItemId, gStringVar1); StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeld); - DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C66EC); + DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_WaitCloseErrorMessage); } -static void sub_81C66EC(u8 taskId) +static void Task_WaitCloseErrorMessage(u8 taskId) { if (JOY_NEW(A_BUTTON)) { @@ -1232,26 +1279,26 @@ void Task_CloseBattlePyramidBagMessage(u8 taskId) s16 *data = gTasks[taskId].data; CloseBattlePyramidBagTextWindow(); - PrintItemDescription(data[1]); - sub_81C5A98(data[0], 0); + PrintItemDescription(tListPos); + PrintSelectorArrow(tListTaskId, COLORID_DARK_GRAY); SetTaskToMainPyramidBagInputHandler(taskId); } -static void sub_81C674C(u8 taskId) +static void TryCloseBagToGiveItem(u8 taskId) { - if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId)) - DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, sub_81C66EC); + if (!IsWritingMailAllowed(gSpecialVar_ItemId)) + DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage); else if (!ItemId_GetImportance(gSpecialVar_ItemId)) - CloseBattlePyramidBagAndSetCallback(taskId); + CloseBattlePyramidBag(taskId); else - sub_81C66AC(taskId); + ShowCantHoldMessage(taskId); } static void BagAction_UseInBattle(u8 taskId) { if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL) { - sub_81C61A8(); + CloseMenuActionWindow(); ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); } } @@ -1260,15 +1307,15 @@ static void Task_BeginItemSwap(u8 taskId) { s16 *data = gTasks[taskId].data; - data[1] = gPyramidBagCursorData.scrollPosition + gPyramidBagCursorData.cursorPosition; - gPyramidBagResources->unk814 = data[1]; - ListMenuSetUnkIndicatorsStructField(data[0], 0x10, 1); - CopyItemName(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][data[1]], gStringVar1); + tListPos = gPyramidBagMenuState.scrollPosition + gPyramidBagMenuState.cursorPosition; + gPyramidBagMenu->toSwapPos = tListPos; + ListMenuSetUnkIndicatorsStructField(tListTaskId, 0x10, 1); + CopyItemName(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][tListPos], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where); - FillWindowPixelBuffer(1, PIXEL_FILL(0)); - PrintOnWindow_Font1(1, gStringVar4, 3, 0, 0, 1, 0, 0); - sub_81C5A98(data[0], 1); - sub_81C704C(data[1]); + FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); + PrintOnWindow_Font1(WIN_INFO, gStringVar4, 3, 0, 0, 1, 0, COLORID_DARK_GRAY); + PrintSelectorArrow(tListTaskId, COLORID_LIGHT_GRAY); + UpdateSwapLinePos(tListPos); gTasks[taskId].func = Task_ItemSwapHandleInput; } @@ -1280,15 +1327,15 @@ static void Task_ItemSwapHandleInput(u8 taskId) if (JOY_NEW(SELECT_BUTTON)) { PlaySE(SE_SELECT); - ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); + ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition); PerformItemSwap(taskId); } else { - s32 id = ListMenu_ProcessInput(data[0]); - ListMenuGetScrollAndRow(data[0], &gPyramidBagCursorData.scrollPosition, &gPyramidBagCursorData.cursorPosition); - sub_81C7028(FALSE); - sub_81C704C(gPyramidBagCursorData.cursorPosition); + s32 id = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &gPyramidBagMenuState.scrollPosition, &gPyramidBagMenuState.cursorPosition); + SetSwapLineInvisibility(FALSE); + UpdateSwapLinePos(gPyramidBagMenuState.cursorPosition); switch (id) { case LIST_NOTHING_CHOSEN: @@ -1298,7 +1345,7 @@ static void Task_ItemSwapHandleInput(u8 taskId) if (JOY_NEW(A_BUTTON)) PerformItemSwap(taskId); else - sub_81C6A14(taskId); + CancelItemSwap(taskId); break; default: PlaySE(SE_SELECT); @@ -1312,41 +1359,41 @@ static void Task_ItemSwapHandleInput(u8 taskId) static void PerformItemSwap(u8 taskId) { s16 *data = gTasks[taskId].data; - u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition; - u16 *selectedRow = &gPyramidBagCursorData.cursorPosition; - u16 var = *scrollOffset + *selectedRow; + u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition; + u16 *selectedRow = &gPyramidBagMenuState.cursorPosition; + u16 swapPos = *scrollOffset + *selectedRow; - if (data[1] == var || data[1] == var - 1) + if (tListPos == swapPos || tListPos == swapPos - 1) { - sub_81C6A14(taskId); + CancelItemSwap(taskId); } else { - MovePyramidBagItemSlotInList(data[1], var); - gPyramidBagResources->unk814 = 0xFF; - sub_81C7028(TRUE); - DestroyListMenuTask(data[0], scrollOffset, selectedRow); - if (data[1] < var) - gPyramidBagCursorData.cursorPosition--; + MovePyramidBagItemSlotInList(tListPos, swapPos); + gPyramidBagMenu->toSwapPos = POS_NONE; + SetSwapLineInvisibility(TRUE); + DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow); + if (tListPos < swapPos) + gPyramidBagMenuState.cursorPosition--; SetBagItemsListTemplate(); - data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); SetTaskToMainPyramidBagInputHandler(taskId); } } -static void sub_81C6A14(u8 taskId) +static void CancelItemSwap(u8 taskId) { s16 *data = gTasks[taskId].data; - u16 *scrollOffset = &gPyramidBagCursorData.scrollPosition; - u16 *selectedRow = &gPyramidBagCursorData.cursorPosition; - - gPyramidBagResources->unk814 = 0xFF; - sub_81C7028(TRUE); - DestroyListMenuTask(data[0], scrollOffset, selectedRow); - if (data[1] < *scrollOffset + *selectedRow) - gPyramidBagCursorData.cursorPosition--; + u16 *scrollOffset = &gPyramidBagMenuState.scrollPosition; + u16 *selectedRow = &gPyramidBagMenuState.cursorPosition; + + gPyramidBagMenu->toSwapPos = POS_NONE; + SetSwapLineInvisibility(TRUE); + DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow); + if (tListPos < *scrollOffset + *selectedRow) + gPyramidBagMenuState.cursorPosition--; SetBagItemsListTemplate(); - data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); SetTaskToMainPyramidBagInputHandler(taskId); } @@ -1385,152 +1432,153 @@ void TryStoreHeldItemsInPyramidBag(void) Free(newQuantities); } -static void sub_81C6BD8(void) +static void InitPyramidBagWindows(void) { u8 i; - InitWindows(gUnknown_0861F328); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); LoadUserWindowBorderGfx(0, 0x1, 0xE0); LoadMessageBoxGfx(0, 0xA, 0xD0); LoadPalette(gUnknown_0860F074, 0xF0, 0x20); - for (i = 0; i < 5; i++) + for (i = 0; i < ARRAY_COUNT(sWindowTemplates); i++) FillWindowPixelBuffer(i, PIXEL_FILL(0)); - PutWindowTilemap(0); - PutWindowTilemap(1); + PutWindowTilemap(WIN_LIST); + PutWindowTilemap(WIN_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); } static void PrintOnWindow_Font1(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId) { - AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sColorTable[colorTableId], speed, src); + AddTextPrinterParameterized4(windowId, 1, x, y, letterSpacing, lineSpacing, sTextColors[colorTableId], speed, src); } static void PrintOnWindow_Font7(u8 windowId, const u8 *src, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorTableId) { - AddTextPrinterParameterized4(windowId, 7, x, y, letterSpacing, lineSpacing, sColorTable[colorTableId], speed, src); + AddTextPrinterParameterized4(windowId, 7, x, y, letterSpacing, lineSpacing, sTextColors[colorTableId], speed, src); } -static void sub_81C6CEC(u8 windowId) +static void DrawTossNumberWindow(u8 windowId) { DrawStdFrameWithCustomTileAndPalette(windowId, 0, 1, 0xE); ScheduleBgCopyTilemapToVram(1); } -static u8 sub_81C6D08(u8 windowArrayId) +// Unused +static u8 GetMenuActionWindowId(u8 windowArrayId) { - return gPyramidBagResources->windowIds[windowArrayId]; + return gPyramidBagMenu->windowIds[windowArrayId]; } -static u8 sub_81C6D24(u8 windowArrayId) +static u8 OpenMenuActionWindowById(u8 windowArrayId) { - u8 *windowId = &gPyramidBagResources->windowIds[windowArrayId]; - if (*windowId == 0xFF) + u8 *windowId = &gPyramidBagMenu->windowIds[windowArrayId]; + if (*windowId == WINDOW_NONE) { - *windowId = AddWindow(&gUnknown_0861F350[windowArrayId]); + *windowId = AddWindow(&sWindowTemplates_MenuActions[windowArrayId]); DrawStdFrameWithCustomTileAndPalette(*windowId, FALSE, 1, 0xE); ScheduleBgCopyTilemapToVram(1); } return *windowId; } -static void sub_81C6D6C(u8 windowArrayId) +static void CloseMenuActionWindowById(u8 windowArrayId) { - u8 *windowId = &gPyramidBagResources->windowIds[windowArrayId]; - if (*windowId != 0xFF) + u8 *windowId = &gPyramidBagMenu->windowIds[windowArrayId]; + if (*windowId != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(*windowId, FALSE); ClearWindowTilemap(*windowId); RemoveWindow(*windowId); ScheduleBgCopyTilemapToVram(1); - *windowId = 0xFF; + *windowId = WINDOW_NONE; } } -static void sub_81C6DAC(u8 taskId, const struct YesNoFuncTable *yesNoTable) +static void CreatePyramidBagYesNo(u8 taskId, const struct YesNoFuncTable *yesNoTable) { - CreateYesNoMenuWithCallbacks(taskId, &gUnknown_0861F350[4], 1, 0, 2, 1, 0xE, yesNoTable); + CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_MenuActions[MENU_WIN_YESNO], 1, 0, 2, 1, 0xE, yesNoTable); } void DisplayItemMessageInBattlePyramid(u8 taskId, const u8 *str, void (*callback)(u8 taskId)) { - FillWindowPixelBuffer(2, PIXEL_FILL(1)); - DisplayMessageAndContinueTask(taskId, 2, 0xA, 0xD, 1, GetPlayerTextSpeedDelay(), str, callback); + FillWindowPixelBuffer(WIN_MSG, PIXEL_FILL(1)); + DisplayMessageAndContinueTask(taskId, WIN_MSG, 0xA, 0xD, 1, GetPlayerTextSpeedDelay(), str, callback); ScheduleBgCopyTilemapToVram(1); } static void CloseBattlePyramidBagTextWindow(void) { - ClearDialogWindowAndFrameToTransparent(2, FALSE); + ClearDialogWindowAndFrameToTransparent(WIN_MSG, FALSE); // This ClearWindowTilemap call is redundant, since ClearDialogWindowAndFrameToTransparent already calls it. - ClearWindowTilemap(2); + ClearWindowTilemap(WIN_MSG); ScheduleBgCopyTilemapToVram(1); } -#define ITEM_IMAGE_TAG 0x1024 - -static void sub_81C6E38(u8 itemSpriteArrayId) +static void FreeItemIconSprite(u8 spriteArrId) { - u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[itemSpriteArrayId]; - if (*spriteId != 0xFF) + u8 *spriteId = &gPyramidBagMenu->spriteIds[spriteArrId]; + if (*spriteId != SPRITE_NONE) { - FreeSpriteTilesByTag(ITEM_IMAGE_TAG + itemSpriteArrayId); - FreeSpritePaletteByTag(ITEM_IMAGE_TAG + itemSpriteArrayId); + // spriteArrId is PBAG_SPRITE_ITEM_ICON / PBAG_SPRITE_ITEM_ICON_ALT here (1-2) + // so tag will be TAG_ITEM_ICON / TAG_ITEM_ICON_ALT + FreeSpriteTilesByTag(TAG_ITEM_ICON - 1 + spriteArrId); + FreeSpritePaletteByTag(TAG_ITEM_ICON - 1 + spriteArrId); FreeSpriteOamMatrix(&gSprites[*spriteId]); DestroySprite(&gSprites[*spriteId]); - *spriteId = 0xFF; + *spriteId = SPRITE_NONE; } } -static void sub_81C6E98(void) +static void LoadPyramidBagPalette(void) { struct SpritePalette spritePalette; u16 *palPtr = Alloc(0x40); LZDecompressWram(gBattleFrontierGfx_PyramidBag_Pal, palPtr); spritePalette.data = palPtr + (gSaveBlock2Ptr->frontier.lvlMode * 16); - spritePalette.tag = ITEM_IMAGE_TAG; + spritePalette.tag = TAG_PYRAMID_BAG; LoadSpritePalette(&spritePalette); Free(palPtr); } -static void sub_81C6EF4(void) +static void CreatePyramidBagSprite(void) { - u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[0]; - *spriteId = CreateSprite(&gUnknown_0861F3D4, 0x44, 0x38, 0); + u8 *spriteId = &gPyramidBagMenu->spriteIds[PBAG_SPRITE_BAG]; + *spriteId = CreateSprite(&sSpriteTemplate_PyramidBag, 68, 56, 0); } -static void sub_81C6F20(void) +static void ShakePyramidBag(void) { - struct Sprite *sprite = &gSprites[gPyramidBagResources->itemsSpriteIds[0]]; + struct Sprite *sprite = &gSprites[gPyramidBagMenu->spriteIds[PBAG_SPRITE_BAG]]; if (sprite->affineAnimEnded) { - StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_81C6F68; + StartSpriteAffineAnim(sprite, ANIM_BAG_SHAKE); + sprite->callback = SpriteCB_BagWaitForShake; } } -static void sub_81C6F68(struct Sprite *sprite) +static void SpriteCB_BagWaitForShake(struct Sprite *sprite) { if (sprite->affineAnimEnded) { - StartSpriteAffineAnim(sprite, 0); + StartSpriteAffineAnim(sprite, ANIM_BAG_STILL); sprite->callback = SpriteCallbackDummy; } } -static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId) +static void ShowItemIcon(u16 itemId, bool8 isAlt) { u8 itemSpriteId; - u8 *spriteId = &gPyramidBagResources->itemsSpriteIds[itemSpriteArrayId + 1]; - if (*spriteId == 0xFF) + u8 *spriteId = &gPyramidBagMenu->spriteIds[isAlt + PBAG_SPRITE_ITEM_ICON]; + if (*spriteId == SPRITE_NONE) { - FreeSpriteTilesByTag(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId); - FreeSpritePaletteByTag(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId); - itemSpriteId = AddItemIconSprite(ITEM_IMAGE_TAG + 1 + itemSpriteArrayId, ITEM_IMAGE_TAG + 1 + itemSpriteArrayId, itemId); + FreeSpriteTilesByTag(TAG_ITEM_ICON + isAlt); + FreeSpritePaletteByTag(TAG_ITEM_ICON + isAlt); + itemSpriteId = AddItemIconSprite(TAG_ITEM_ICON + isAlt, TAG_ITEM_ICON + isAlt, itemId); if (itemSpriteId != MAX_SPRITES) { *spriteId = itemSpriteId; @@ -1540,22 +1588,22 @@ static void ShowItemImage(u16 itemId, u8 itemSpriteArrayId) } } -static void sub_81C6FF8(u8 itemSpriteArrayId) +static void FreeItemIconSpriteByAltId(bool8 isAlt) { - sub_81C6E38(itemSpriteArrayId + 1); + FreeItemIconSprite(isAlt + PBAG_SPRITE_ITEM_ICON); } -static void sub_81C700C(void) +static void CreateSwapLine(void) { - sub_8122344(&gPyramidBagResources->itemsSpriteIds[3], 8); + CreateSwapLineSprites(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES); } -static void sub_81C7028(bool8 invisible) +static void SetSwapLineInvisibility(bool8 invisible) { - sub_81223FC(&gPyramidBagResources->itemsSpriteIds[3], 8, invisible); + SetSwapLineSpritesInvisibility(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES, invisible); } -static void sub_81C704C(u8 y) +static void UpdateSwapLinePos(u8 y) { - sub_8122448(&gPyramidBagResources->itemsSpriteIds[3], 8 | 0x80, 120, (y + 1) * 16); + UpdateSwapLineSpritesPos(&gPyramidBagMenu->spriteIds[PBAG_SPRITE_SWAP_LINE_START], NUM_SWAP_LINE_SPRITES | 0x80, 120, (y + 1) * 16); } diff --git a/src/battle_records.c b/src/battle_records.c index a8b9ead14..5dff8e6d3 100644 --- a/src/battle_records.c +++ b/src/battle_records.c @@ -365,7 +365,7 @@ static void Task_CloseTrainerHillRecordsOnButton(u8 taskId) static void Task_BeginPaletteFade(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ExitTrainerHillRecords; } @@ -512,7 +512,7 @@ static void CB2_ShowTrainerHillRecords(void) gMain.state++; break; case 6: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gMain.state++; break; case 7: diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6ec9d16b1..15e44dd75 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -163,7 +163,7 @@ static void Cmd_trainerslidein(void); static void Cmd_playse(void); static void Cmd_fanfare(void); static void Cmd_playfaintcry(void); -static void Cmd_unknown_57(void); +static void Cmd_endlinkbattle(void); static void Cmd_returntoball(void); static void Cmd_handlelearnnewmove(void); static void Cmd_yesnoboxlearnmove(void); @@ -258,7 +258,7 @@ static void Cmd_trysetperishsong(void); static void Cmd_rolloutdamagecalculation(void); static void Cmd_jumpifconfusedandstatmaxed(void); static void Cmd_furycuttercalc(void); -static void Cmd_happinesstodamagecalculation(void); +static void Cmd_friendshiptodamagecalculation(void); static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); @@ -415,7 +415,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_playse, //0x54 Cmd_fanfare, //0x55 Cmd_playfaintcry, //0x56 - Cmd_unknown_57, //0x57 + Cmd_endlinkbattle, //0x57 Cmd_returntoball, //0x58 Cmd_handlelearnnewmove, //0x59 Cmd_yesnoboxlearnmove, //0x5A @@ -510,7 +510,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = Cmd_rolloutdamagecalculation, //0xB3 Cmd_jumpifconfusedandstatmaxed, //0xB4 Cmd_furycuttercalc, //0xB5 - Cmd_happinesstodamagecalculation, //0xB6 + Cmd_friendshiptodamagecalculation, //0xB6 Cmd_presentdamagecalculation, //0xB7 Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 @@ -876,34 +876,33 @@ const ALIGNED(4) u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4] = [NATURE_QUIRKY] = PALACE_STYLE(56, 22, 56, 22) // 22%, 22% }; -// Indices into gBattlePalaceFlavorTextTable static const u8 sBattlePalaceNatureToFlavorTextId[NUM_NATURES] = { - [NATURE_HARDY] = 3, - [NATURE_LONELY] = 0, - [NATURE_BRAVE] = 1, - [NATURE_ADAMANT] = 0, - [NATURE_NAUGHTY] = 0, - [NATURE_BOLD] = 1, - [NATURE_DOCILE] = 3, - [NATURE_RELAXED] = 0, - [NATURE_IMPISH] = 1, - [NATURE_LAX] = 2, - [NATURE_TIMID] = 2, - [NATURE_HASTY] = 0, - [NATURE_SERIOUS] = 3, - [NATURE_JOLLY] = 1, - [NATURE_NAIVE] = 3, - [NATURE_MODEST] = 1, - [NATURE_MILD] = 2, - [NATURE_QUIET] = 3, - [NATURE_BASHFUL] = 3, - [NATURE_RASH] = 2, - [NATURE_CALM] = 1, - [NATURE_GENTLE] = 0, - [NATURE_SASSY] = 2, - [NATURE_CAREFUL] = 2, - [NATURE_QUIRKY] = 3, + [NATURE_HARDY] = B_MSG_EAGER_FOR_MORE, + [NATURE_LONELY] = B_MSG_GLINT_IN_EYE, + [NATURE_BRAVE] = B_MSG_GETTING_IN_POS, + [NATURE_ADAMANT] = B_MSG_GLINT_IN_EYE, + [NATURE_NAUGHTY] = B_MSG_GLINT_IN_EYE, + [NATURE_BOLD] = B_MSG_GETTING_IN_POS, + [NATURE_DOCILE] = B_MSG_EAGER_FOR_MORE, + [NATURE_RELAXED] = B_MSG_GLINT_IN_EYE, + [NATURE_IMPISH] = B_MSG_GETTING_IN_POS, + [NATURE_LAX] = B_MSG_GROWL_DEEPLY, + [NATURE_TIMID] = B_MSG_GROWL_DEEPLY, + [NATURE_HASTY] = B_MSG_GLINT_IN_EYE, + [NATURE_SERIOUS] = B_MSG_EAGER_FOR_MORE, + [NATURE_JOLLY] = B_MSG_GETTING_IN_POS, + [NATURE_NAIVE] = B_MSG_EAGER_FOR_MORE, + [NATURE_MODEST] = B_MSG_GETTING_IN_POS, + [NATURE_MILD] = B_MSG_GROWL_DEEPLY, + [NATURE_QUIET] = B_MSG_EAGER_FOR_MORE, + [NATURE_BASHFUL] = B_MSG_EAGER_FOR_MORE, + [NATURE_RASH] = B_MSG_GROWL_DEEPLY, + [NATURE_CALM] = B_MSG_GETTING_IN_POS, + [NATURE_GENTLE] = B_MSG_GLINT_IN_EYE, + [NATURE_SASSY] = B_MSG_GROWL_DEEPLY, + [NATURE_CAREFUL] = B_MSG_GROWL_DEEPLY, + [NATURE_QUIRKY] = B_MSG_EAGER_FOR_MORE, }; static void Cmd_attackcanceler(void) @@ -991,7 +990,7 @@ static void Cmd_attackcanceler(void) gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = 1; + gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; gBattlescriptCurrInstr++; } else @@ -1024,7 +1023,7 @@ static void Cmd_jumpifaffectedbyprotect(void) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(5, 0); - gBattleCommunication[6] = 1; + gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; } else { @@ -1039,7 +1038,7 @@ bool8 JumpIfMoveAffectedByProtect(u16 move) { gMoveResultFlags |= MOVE_RESULT_MISSED; JumpIfMoveFailed(7, move); - gBattleCommunication[6] = 1; + gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; affected = TRUE; } return affected; @@ -1172,9 +1171,9 @@ static void Cmd_accuracycheck(void) gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && (gBattleMoves[move].target == MOVE_TARGET_BOTH || gBattleMoves[move].target == MOVE_TARGET_FOES_AND_ALLY)) - gBattleCommunication[6] = 2; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_ATK; else - gBattleCommunication[6] = 0; + gBattleCommunication[MISS_TYPE] = B_MSG_MISSED; CheckWonderGuardAndLevitate(); } @@ -1370,7 +1369,7 @@ static void Cmd_typecalc(void) gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = moveType; + gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else @@ -1406,7 +1405,7 @@ static void Cmd_typecalc(void) gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattleCommunication[6] = 3; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) @@ -1429,7 +1428,7 @@ static void CheckWonderGuardAndLevitate(void) if (gBattleMons[gBattlerTarget].ability == ABILITY_LEVITATE && moveType == TYPE_GROUND) { gLastUsedAbility = ABILITY_LEVITATE; - gBattleCommunication[6] = moveType; + gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, ABILITY_LEVITATE); return; } @@ -1484,7 +1483,7 @@ static void CheckWonderGuardAndLevitate(void) if (((flags & 2) || !(flags & 1)) && gBattleMoves[gCurrentMove].power) { gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleCommunication[6] = 3; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, ABILITY_WONDER_GUARD); } } @@ -2019,9 +2018,9 @@ static void Cmd_resultmessage(void) if (gBattleControllerExecFlags) return; - if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[6] > 2)) + if (gMoveResultFlags & MOVE_RESULT_MISSED && (!(gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) || gBattleCommunication[MISS_TYPE] > B_MSG_AVOIDED_ATK)) { - stringId = gMissStringIds[gBattleCommunication[6]]; + stringId = gMissStringIds[gBattleCommunication[MISS_TYPE]]; gBattleCommunication[MSG_DISPLAY] = 1; } else @@ -2273,12 +2272,12 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } RESET_RETURN } @@ -2289,7 +2288,7 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; RESET_RETURN } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_POISON)) @@ -2314,12 +2313,12 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } RESET_RETURN } @@ -2330,7 +2329,7 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_BRNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; RESET_RETURN } if (IS_BATTLER_OF_TYPE(gEffectBattler, TYPE_FIRE)) @@ -2370,12 +2369,12 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } RESET_RETURN } @@ -2398,12 +2397,12 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_ABILITY_STATUS; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ABILITY_PREVENTS_MOVE_STATUS; } RESET_RETURN } @@ -2414,7 +2413,7 @@ void SetMoveEffect(bool8 primary, u8 certain) BattleScriptPush(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = BattleScript_PSNPrevention; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUS_HAD_NO_EFFECT; RESET_RETURN } if (gBattleMons[gEffectBattler].status1) @@ -2453,12 +2452,12 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED_BY_ABILITY; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STATUSED; } // for synchronize @@ -2713,7 +2712,7 @@ void SetMoveEffect(bool8 primary, u8 certain) (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_SECRET_BASE))) { gBattlescriptCurrInstr++; @@ -2722,7 +2721,7 @@ void SetMoveEffect(bool8 primary, u8 certain) (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_SECRET_BASE)) && (gWishFutureKnock.knockedOffMons[side] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]])) { @@ -3228,7 +3227,7 @@ static void Cmd_getexp(void) case 0: // check if should receive exp at all if (GetBattlerSide(gBattlerFainted) != B_SIDE_OPPONENT || (gBattleTypeFlags & (BATTLE_TYPE_LINK - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_SAFARI @@ -3358,7 +3357,7 @@ static void Cmd_getexp(void) // get exp getter battlerId if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterMonId) && !(gAbsentBattlerFlags & gBitTable[2])) + if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2])) gBattleStruct->expGetterBattlerId = 2; else { @@ -3432,14 +3431,13 @@ static void Cmd_getexp(void) gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); - // Why is this duplicated? + // Speed is duplicated, likely due to a copy-paste error. gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); - gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); } - // What is else if? + if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_LEVEL); @@ -3447,10 +3445,13 @@ static void Cmd_getexp(void) gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MAX_HP); gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_ATK); gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_DEF); - // Duplicated again, but this time there's no Sp Defense gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); + // Speed is duplicated again, but Special Defense is missing. +#ifdef BUGFIX + gBattleMons[2].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); +#else gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPEED); - +#endif gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPATK); } gBattleScripting.getexpState = 5; @@ -3533,7 +3534,7 @@ static void Cmd_unknown_24(void) if (HP_count == 0) gBattleOutcome |= B_OUTCOME_WON; - if (gBattleOutcome == 0 && (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) + if (gBattleOutcome == 0 && (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))) { s32 foundPlayer = 0; s32 foundOpponent; @@ -3579,7 +3580,7 @@ static void MoveValuesCleanUp(void) gBattleScripting.dmgMultiplier = 1; gCritMultiplier = 1; gBattleCommunication[MOVE_EFFECT_BYTE] = 0; - gBattleCommunication[6] = 0; + gBattleCommunication[MISS_TYPE] = 0; gHitMarker &= ~(HITMARKER_DESTINYBOND); gHitMarker &= ~(HITMARKER_SYNCHRONISE_EFFECT); } @@ -4459,7 +4460,7 @@ static void Cmd_typecalc2(void) gLastUsedAbility = gBattleMons[gBattlerTarget].ability; gMoveResultFlags |= (MOVE_RESULT_MISSED | MOVE_RESULT_DOESNT_AFFECT_FOE); gLastLandedMoves[gBattlerTarget] = 0; - gBattleCommunication[6] = moveType; + gBattleCommunication[MISS_TYPE] = B_MSG_GROUND_MISS; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } else @@ -4534,7 +4535,7 @@ static void Cmd_typecalc2(void) gLastUsedAbility = ABILITY_WONDER_GUARD; gMoveResultFlags |= MOVE_RESULT_MISSED; gLastLandedMoves[gBattlerTarget] = 0; - gBattleCommunication[6] = 3; + gBattleCommunication[MISS_TYPE] = B_MSG_AVOIDED_DMG; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) @@ -4634,7 +4635,7 @@ static void Cmd_switchinanim(void) if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER - | BATTLE_TYPE_x2000000 + | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_FRONTIER))) HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); @@ -4691,7 +4692,7 @@ static void Cmd_jumpifcantswitch(void) } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gBattleTypeFlags & BATTLE_TYPE_x800000) + if (gBattleTypeFlags & BATTLE_TYPE_TOWER_LINK_MULTI) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { @@ -4802,7 +4803,9 @@ static void Cmd_jumpifcantswitch(void) } } -static void sub_804CF10(u8 slotId) +// Opens the party screen to choose a new Pokémon to send out +// slotId is the Pokémon to replace +static void ChooseMonToSendOut(u8 slotId) { *(gBattleStruct->field_58 + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; @@ -4823,7 +4826,7 @@ static void Cmd_openpartyscreen(void) flags = 0; jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); - if (gBattlescriptCurrInstr[1] == 5) + if (gBattlescriptCurrInstr[1] == BS_UNK_5) { if ((gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_MULTI)) != BATTLE_TYPE_DOUBLE) { @@ -4831,22 +4834,22 @@ static void Cmd_openpartyscreen(void) { if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) { - if (HasNoMonsToSwitch(gActiveBattler, 6, 6)) + if (HasNoMonsToSwitch(gActiveBattler, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(PARTY_SIZE); + ChooseMonToSendOut(PARTY_SIZE); gSpecialStatuses[gActiveBattler].flag40 = 1; } } else { - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4855,26 +4858,26 @@ static void Cmd_openpartyscreen(void) { u8 flag40_0, flag40_1, flag40_2, flag40_3; - hitmarkerFaintBits = gHitMarker >> 0x1C; + hitmarkerFaintBits = gHitMarker >> 28; if (gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 0; - if (HasNoMonsToSwitch(0, 6, 6)) + if (HasNoMonsToSwitch(0, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitCmd42(0); + BtlController_EmitCantSwitch(0); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(gBattleStruct->monToSwitchIntoId[2]); + ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[2]); gSpecialStatuses[gActiveBattler].flag40 = 1; } else { - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 1; } @@ -4882,42 +4885,42 @@ static void Cmd_openpartyscreen(void) if (gBitTable[2] & hitmarkerFaintBits && !(gBitTable[0] & hitmarkerFaintBits)) { gActiveBattler = 2; - if (HasNoMonsToSwitch(2, 6, 6)) + if (HasNoMonsToSwitch(2, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitCmd42(0); + BtlController_EmitCantSwitch(0); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(gBattleStruct->monToSwitchIntoId[0]); + ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]); gSpecialStatuses[gActiveBattler].flag40 = 1; } else if (!(flags & 1)) { - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } if (gBitTable[1] & hitmarkerFaintBits) { gActiveBattler = 1; - if (HasNoMonsToSwitch(1, 6, 6)) + if (HasNoMonsToSwitch(1, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitCmd42(0); + BtlController_EmitCantSwitch(0); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(gBattleStruct->monToSwitchIntoId[3]); + ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[3]); gSpecialStatuses[gActiveBattler].flag40 = 1; } else { - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 2; } @@ -4925,21 +4928,21 @@ static void Cmd_openpartyscreen(void) if (gBitTable[3] & hitmarkerFaintBits && !(gBitTable[1] & hitmarkerFaintBits)) { gActiveBattler = 3; - if (HasNoMonsToSwitch(3, 6, 6)) + if (HasNoMonsToSwitch(3, PARTY_SIZE, PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitCmd42(0); + BtlController_EmitCantSwitch(0); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(gBattleStruct->monToSwitchIntoId[1]); + ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]); gSpecialStatuses[gActiveBattler].flag40 = 1; } else if (!(flags & 2)) { - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4955,7 +4958,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 0; - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } @@ -4971,49 +4974,49 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 1; - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } } gBattlescriptCurrInstr += 6; } - else if (gBattlescriptCurrInstr[1] == 6) + else if (gBattlescriptCurrInstr[1] == BS_UNK_6) { if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - hitmarkerFaintBits = gHitMarker >> 0x1C; + hitmarkerFaintBits = gHitMarker >> 28; if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 2; - if (HasNoMonsToSwitch(2, gBattleBufferB[0][1], 6)) + if (HasNoMonsToSwitch(2, gBattleBufferB[0][1], PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitCmd42(0); + BtlController_EmitCantSwitch(0); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(gBattleStruct->monToSwitchIntoId[0]); + ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[0]); gSpecialStatuses[gActiveBattler].flag40 = 1; } } if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1]) { gActiveBattler = 3; - if (HasNoMonsToSwitch(3, gBattleBufferB[1][1], 6)) + if (HasNoMonsToSwitch(3, gBattleBufferB[1][1], PARTY_SIZE)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); - BtlController_EmitCmd42(0); + BtlController_EmitCantSwitch(0); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].flag40) { - sub_804CF10(gBattleStruct->monToSwitchIntoId[1]); + ChooseMonToSendOut(gBattleStruct->monToSwitchIntoId[1]); gSpecialStatuses[gActiveBattler].flag40 = 1; } } @@ -5029,7 +5032,7 @@ static void Cmd_openpartyscreen(void) gBattlescriptCurrInstr += 6; } - hitmarkerFaintBits = gHitMarker >> 0x1C; + hitmarkerFaintBits = gHitMarker >> 28; gBattlerFainted = 0; while (!(gBitTable[gBattlerFainted] & hitmarkerFaintBits) @@ -5041,17 +5044,17 @@ static void Cmd_openpartyscreen(void) } else { - if (gBattlescriptCurrInstr[1] & 0x80) + if (gBattlescriptCurrInstr[1] & PARTY_SCREEN_OPTIONAL) hitmarkerFaintBits = PARTY_ACTION_CHOOSE_MON; // Used here as the caseId for the EmitChoose function. else hitmarkerFaintBits = PARTY_ACTION_SEND_OUT; - battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(0x80)); + battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(PARTY_SCREEN_OPTIONAL)); if (gSpecialStatuses[battlerId].flag40) { gBattlescriptCurrInstr += 6; } - else if (HasNoMonsToSwitch(battlerId, 6, 6)) + else if (HasNoMonsToSwitch(battlerId, PARTY_SIZE, PARTY_SIZE)) { gActiveBattler = battlerId; gAbsentBattlerFlags |= gBitTable[gActiveBattler]; @@ -5079,7 +5082,7 @@ static void Cmd_openpartyscreen(void) { if (gActiveBattler != battlerId) { - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5090,7 +5093,7 @@ static void Cmd_openpartyscreen(void) if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; - BtlController_EmitLinkStandbyMsg(0, 2, 0); + BtlController_EmitLinkStandbyMsg(0, 2, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5229,7 +5232,7 @@ static void Cmd_switchineffects(void) if (gBattlescriptCurrInstr[1] == 5) { - u32 hitmarkerFaintBits = gHitMarker >> 0x1C; + u32 hitmarkerFaintBits = gHitMarker >> 28; gBattlerFainted++; while (1) @@ -5282,10 +5285,10 @@ static void Cmd_playfaintcry(void) gBattlescriptCurrInstr += 2; } -static void Cmd_unknown_57(void) +static void Cmd_endlinkbattle(void) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitCmd55(0, gBattleOutcome); + BtlController_EmitEndLinkBattle(0, gBattleOutcome); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 1; @@ -5374,7 +5377,7 @@ static void Cmd_yesnoboxlearnmove(void) if (gBattleCommunication[1] == 0) { HandleBattleWindow(0x18, 0x8, 0x1D, 0xD, WINDOW_CLEAR); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattleScripting.learnMoveState++; } else @@ -6033,7 +6036,7 @@ static void PutLevelAndGenderOnLvlUpBox(void) printerTemplate.unk = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_TRANSPARENT; - printerTemplate.shadowColor = TEXT_COLOR_DARK_GREY; + printerTemplate.shadowColor = TEXT_COLOR_DARK_GRAY; AddTextPrinter(&printerTemplate, 0xFF, NULL); @@ -6044,7 +6047,7 @@ static void PutLevelAndGenderOnLvlUpBox(void) var = (u32)(txtPtr); txtPtr = ConvertIntToDecimalStringN(txtPtr, monLevel, STR_CONV_MODE_LEFT_ALIGN, 3); var = (u32)(txtPtr) - var; - txtPtr = StringFill(txtPtr, CHAR_UNK_SPACER, 4 - var); + txtPtr = StringFill(txtPtr, CHAR_GENDERLESS, 4 - var); if (monGender != MON_GENDERLESS) { @@ -6167,7 +6170,13 @@ static void Cmd_recordlastability(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); RecordAbilityBattle(gActiveBattler, gLastUsedAbility); - gBattlescriptCurrInstr += 1; // UB: Should be + 2, one byte for command and one byte for battlerId argument. + +#ifdef BUGFIX + // This command occupies two bytes (one for the command id, and one for the battler id parameter). + gBattlescriptCurrInstr += 2; +#else + gBattlescriptCurrInstr += 1; +#endif } void BufferMoveToLearnIntoBattleTextBuff2(void) @@ -6245,7 +6254,7 @@ static void Cmd_hpthresholds2(void) static void Cmd_useitemonopponent(void) { gBattlerInMenuId = gBattlerAttacker; - PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBattlerAttacker], 0, 1); + PokemonUseItemEffects(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker]], gLastUsedItem, gBattlerPartyIndexes[gBattlerAttacker], 0, TRUE); gBattlescriptCurrInstr += 1; } @@ -6362,7 +6371,7 @@ static void Cmd_various(void) gDisableStructs[1].truantSwitchInHack = 1; break; case VARIOUS_EMIT_YESNOBOX: - BtlController_EmitUnknownYesNoBox(0); + BtlController_EmitYesNoBox(0); MarkBattlerForControllerExec(gActiveBattler); break; case 14: @@ -6373,10 +6382,10 @@ static void Cmd_various(void) break; case VARIOUS_ARENA_JUDGMENT_STRING: BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[gBattlescriptCurrInstr[1]]); - BattlePutTextOnWindow(gDisplayedStringBattle, 0x16); + BattlePutTextOnWindow(gDisplayedStringBattle, 22); break; case VARIOUS_ARENA_WAIT_STRING: - if (IsTextPrinterActive(0x16)) + if (IsTextPrinterActive(22)) return; break; case VARIOUS_WAIT_CRY: @@ -6446,19 +6455,19 @@ static void Cmd_setprotectlike(void) // protect and endure if (gBattleMoves[gCurrentMove].effect == EFFECT_PROTECT) { gProtectStructs[gBattlerAttacker].protected = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECTED_ITSELF; } if (gBattleMoves[gCurrentMove].effect == EFFECT_ENDURE) { gProtectStructs[gBattlerAttacker].endured = 1; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BRACED_ITSELF; } gDisableStructs[gBattlerAttacker].protectUses++; } else { gDisableStructs[gBattlerAttacker].protectUses = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_PROTECT_FAILED; gMoveResultFlags |= MOVE_RESULT_MISSED; } @@ -6611,12 +6620,12 @@ static void Cmd_setrain(void) if (gBattleWeather & WEATHER_RAIN_ANY) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = WEATHER_RAIN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_RAIN; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; @@ -6627,7 +6636,7 @@ static void Cmd_setreflect(void) if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_REFLECT) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { @@ -6636,9 +6645,9 @@ static void Cmd_setreflect(void) gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].reflectBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_DOUBLE; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_REFLECT_SINGLE; } gBattlescriptCurrInstr++; } @@ -6648,18 +6657,18 @@ static void Cmd_setseeded(void) if (gMoveResultFlags & MOVE_RESULT_NO_EFFECT || gStatuses3[gBattlerTarget] & STATUS3_LEECHSEED) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_MISS; } else if (IS_BATTLER_OF_TYPE(gBattlerTarget, TYPE_GRASS)) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_FAIL; } else { gStatuses3[gBattlerTarget] |= gBattlerAttacker; gStatuses3[gBattlerTarget] |= STATUS3_LEECHSEED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LEECH_SEED_SET; } gBattlescriptCurrInstr++; @@ -6700,11 +6709,11 @@ static void Cmd_trysetrest(void) else { if (gBattleMons[gBattlerTarget].status1 & ((u8)(~STATUS1_SLEEP))) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST_STATUSED; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; - gBattleMons[gBattlerTarget].status1 = 3; + gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -6740,9 +6749,9 @@ bool8 UproarWakeUpCheck(u8 battlerId) if (gBattlerTarget == 0xFF) gBattlerTarget = i; else if (gBattlerTarget == i) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_SLEEP_UPROAR; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_KEPT_AWAKE; break; } @@ -6765,7 +6774,7 @@ static void Cmd_jumpifcantmakeasleep(void) || gBattleMons[gBattlerTarget].ability == ABILITY_VITAL_SPIRIT) { gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAYED_AWAKE_USING; gBattlescriptCurrInstr = jumpPtr; RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); } @@ -6780,7 +6789,7 @@ static void Cmd_stockpile(void) if (gDisableStructs[gBattlerAttacker].stockpileCounter == 3) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_STOCKPILE; } else { @@ -6788,7 +6797,7 @@ static void Cmd_stockpile(void) PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff1, 1, gDisableStructs[gBattlerAttacker].stockpileCounter) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STOCKPILED; } gBattlescriptCurrInstr++; } @@ -6802,7 +6811,7 @@ static void Cmd_stockpiletobasedamage(void) } else { - if (gBattleCommunication[6] != 1) + if (gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) { gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerTarget], gCurrentMove, gSideStatuses[GET_BATTLER_SIDE(gBattlerTarget)], 0, @@ -6826,14 +6835,14 @@ static void Cmd_stockpiletohpheal(void) if (gDisableStructs[gBattlerAttacker].stockpileCounter == 0) { gBattlescriptCurrInstr = jumpPtr; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FAILED; } else if (gBattleMons[gBattlerAttacker].maxHP == gBattleMons[gBattlerAttacker].hp) { gDisableStructs[gBattlerAttacker].stockpileCounter = 0; gBattlescriptCurrInstr = jumpPtr; gBattlerTarget = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWALLOW_FULL_HP; } else { @@ -6985,9 +6994,9 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[index] = B_BUFF_EOS; if (gBattleMons[gActiveBattler].statStages[statId] == MIN_STAT_STAGE) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_DECREASE; else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_FELL or B_MSG_DEFENDER_STAT_FELL } } @@ -7012,9 +7021,9 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) gBattleTextBuff2[index] = B_BUFF_EOS; if (gBattleMons[gActiveBattler].statStages[statId] == MAX_STAT_STAGE) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_WONT_INCREASE; else - gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); + gBattleCommunication[MULTISTRING_CHOOSER] = (gBattlerTarget == gActiveBattler); // B_MSG_ATTACKER_STAT_ROSE or B_MSG_DEFENDER_STAT_ROSE } gBattleMons[gActiveBattler].statStages[statId] += statValue; @@ -7023,10 +7032,10 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) if (gBattleMons[gActiveBattler].statStages[statId] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[statId] = MAX_STAT_STAGE; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && flags & STAT_BUFF_ALLOW_PTR) + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && flags & STAT_BUFF_ALLOW_PTR) gMoveResultFlags |= MOVE_RESULT_MISSED; - if (gBattleCommunication[MULTISTRING_CHOOSER] == 2 && !(flags & STAT_BUFF_ALLOW_PTR)) + if (gBattleCommunication[MULTISTRING_CHOOSER] == B_MSG_STAT_WONT_INCREASE && !(flags & STAT_BUFF_ALLOW_PTR)) return STAT_BUFF_DIDNT_WORK; return STAT_BUFF_WORKED; @@ -7137,7 +7146,7 @@ static void Cmd_forcerandomswitch(void) party = gEnemyParty; if ((gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_LINK) - || (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_x2000000) + || (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER && gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) || (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)) { if ((gBattlerTarget & BIT_FLANK) != 0) @@ -7156,7 +7165,7 @@ static void Cmd_forcerandomswitch(void) battler1PartyId = gBattlerPartyIndexes[gBattlerTarget ^ BIT_FLANK]; } else if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) - || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_x2000000)) + || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK)) { if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1) { @@ -7256,8 +7265,8 @@ static void Cmd_forcerandomswitch(void) if ((gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) || (gBattleTypeFlags & BATTLE_TYPE_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI) - || (gBattleTypeFlags & BATTLE_TYPE_x2000000 && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) - || (gBattleTypeFlags & BATTLE_TYPE_x2000000 && gBattleTypeFlags & BATTLE_TYPE_MULTI)) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + || (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK && gBattleTypeFlags & BATTLE_TYPE_MULTI)) { SwitchPartyOrderLinkMulti(gBattlerTarget, i, 0); SwitchPartyOrderLinkMulti(gBattlerTarget ^ BIT_FLANK, i, 1); @@ -7314,7 +7323,7 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to do { - while ((moveChecked = Random() & 3) >= validMoves); + while ((moveChecked = Random() & (MAX_MON_MOVES - 1)) >= validMoves); moveType = gBattleMoves[gBattleMons[gBattlerAttacker].moves[moveChecked]].type; @@ -7337,7 +7346,7 @@ static void Cmd_tryconversiontypechange(void) // randomly changes user's type to static void Cmd_givepaydaymoney(void) { - if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) && gPaydayMoney != 0) + if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) && gPaydayMoney != 0) { u32 bonusMoney = gPaydayMoney * gBattleStruct->moneyMultiplier; AddMoney(&gSaveBlock1Ptr->money, bonusMoney); @@ -7358,7 +7367,7 @@ static void Cmd_setlightscreen(void) if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_LIGHTSCREEN) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { @@ -7367,9 +7376,9 @@ static void Cmd_setlightscreen(void) gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].lightscreenBattlerId = gBattlerAttacker; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && CountAliveMonsInBattle(BATTLE_ALIVE_ATK_SIDE) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_DOUBLE; else - gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_LIGHTSCREEN_SINGLE; } gBattlescriptCurrInstr++; @@ -7453,9 +7462,9 @@ static void Cmd_tryKO(void) { gMoveResultFlags |= MOVE_RESULT_MISSED; if (gBattleMons[gBattlerAttacker].level >= gBattleMons[gBattlerTarget].level) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_MISS; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_KO_UNAFFECTED; gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } } @@ -7475,12 +7484,12 @@ static void Cmd_setsandstorm(void) if (gBattleWeather & WEATHER_SANDSTORM_ANY) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = WEATHER_SANDSTORM_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SANDSTORM; gWishFutureKnock.weatherDuration = 5; } gBattlescriptCurrInstr++; @@ -7621,14 +7630,14 @@ static void Cmd_setmist(void) if (gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer) { gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MIST_FAILED; } else { gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].mistBattlerId = gBattlerAttacker; gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_MIST; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; } gBattlescriptCurrInstr++; } @@ -7638,12 +7647,12 @@ static void Cmd_setfocusenergy(void) if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FOCUS_ENERGY) { gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FOCUS_ENERGY_FAILED; } else { gBattleMons[gBattlerAttacker].status2 |= STATUS2_FOCUS_ENERGY; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_GETTING_PUMPED; } gBattlescriptCurrInstr++; } @@ -7656,7 +7665,7 @@ static void Cmd_transformdataexecution(void) || gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE) { gMoveResultFlags |= MOVE_RESULT_FAILED; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORM_FAILED; } else { @@ -7688,7 +7697,7 @@ static void Cmd_transformdataexecution(void) gActiveBattler = gBattlerAttacker; BtlController_EmitResetActionMoveSelection(0, RESET_MOVE_SELECTION); MarkBattlerForControllerExec(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; } } @@ -7701,7 +7710,7 @@ static void Cmd_setsubstitute(void) if (gBattleMons[gBattlerAttacker].hp <= hp) { gBattleMoveDamage = 0; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SUBSTITUTE_FAILED; } else { @@ -7712,7 +7721,7 @@ static void Cmd_setsubstitute(void) gBattleMons[gBattlerAttacker].status2 |= STATUS2_SUBSTITUTE; gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_WRAPPED); gDisableStructs[gBattlerAttacker].substituteHP = gBattleMoveDamage; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SUBSTITUTE; gHitMarker |= HITMARKER_IGNORE_SUBSTITUTE; } @@ -8139,7 +8148,7 @@ static void Cmd_trychoosesleeptalkmove(void) do { - movePosition = Random() & 3; + movePosition = Random() & (MAX_MON_MOVES - 1); } while ((gBitTable[movePosition] & unusableMovesBits)); gCalledMove = gBattleMons[gBattlerAttacker].moves[movePosition]; @@ -8250,7 +8259,7 @@ static void Cmd_healpartystatus(void) struct Pokemon *party; s32 i; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_BELL; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) party = gPlayerParty; @@ -8265,7 +8274,7 @@ static void Cmd_healpartystatus(void) else { RecordAbilityBattle(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 1; + gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_ATTACKER; } gActiveBattler = gBattleScripting.battler = GetBattlerAtPosition(GetBattlerPosition(gBattlerAttacker) ^ BIT_FLANK); @@ -8281,10 +8290,12 @@ static void Cmd_healpartystatus(void) else { RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); - gBattleCommunication[MULTISTRING_CHOOSER] |= 2; + gBattleCommunication[MULTISTRING_CHOOSER] |= B_MSG_BELL_SOUNDPROOF_PARTNER; } } + // Because the above MULTISTRING_CHOOSER are ORd, if both are set then it will be B_MSG_BELL_BOTH_SOUNDPROOF + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); @@ -8310,7 +8321,7 @@ static void Cmd_healpartystatus(void) } else // Aromatherapy { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOOTHING_AROMA; toHeal = 0x3F; gBattleMons[gBattlerAttacker].status1 = 0; @@ -8471,7 +8482,7 @@ static void Cmd_furycuttercalc(void) } } -static void Cmd_happinesstodamagecalculation(void) +static void Cmd_friendshiptodamagecalculation(void) { if (gBattleMoves[gCurrentMove].effect == EFFECT_RETURN) gDynamicBasePower = 10 * (gBattleMons[gBattlerAttacker].friendship) / 25; @@ -8514,14 +8525,14 @@ static void Cmd_setsafeguard(void) if (gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] & SIDE_STATUS_SAFEGUARD) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SIDE_STATUS_FAILED; } else { gSideStatuses[GET_BATTLER_SIDE(gBattlerAttacker)] |= SIDE_STATUS_SAFEGUARD; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardTimer = 5; gSideTimers[GET_BATTLER_SIDE(gBattlerAttacker)].safeguardBattlerId = gBattlerAttacker; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_SAFEGUARD; } gBattlescriptCurrInstr++; @@ -8630,12 +8641,12 @@ static void Cmd_setsunny(void) if (gBattleWeather & WEATHER_SUN_ANY) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = WEATHER_SUN_TEMPORARY; - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_SUNLIGHT; gWishFutureKnock.weatherDuration = 5; } @@ -8806,9 +8817,9 @@ static void Cmd_trysetfutureattack(void) gWishFutureKnock.futureSightDmg[gBattlerTarget] = gWishFutureKnock.futureSightDmg[gBattlerTarget] * 15 / 10; if (gCurrentMove == MOVE_DOOM_DESIRE) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; gBattlescriptCurrInstr += 5; } @@ -8912,12 +8923,12 @@ static void Cmd_sethail(void) if (gBattleWeather & WEATHER_HAIL_ANY) { gMoveResultFlags |= MOVE_RESULT_MISSED; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEATHER_FAILED; } else { gBattleWeather = WEATHER_HAIL; - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STARTED_HAIL; gWishFutureKnock.weatherDuration = 5; } @@ -8928,7 +8939,7 @@ static void Cmd_jumpifattackandspecialattackcannotfall(void) // memento { if (gBattleMons[gBattlerTarget].statStages[STAT_ATK] == MIN_STAT_STAGE && gBattleMons[gBattlerTarget].statStages[STAT_SPATK] == MIN_STAT_STAGE - && gBattleCommunication[6] != 1) + && gBattleCommunication[MISS_TYPE] != B_MSG_PROTECTED) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -9044,7 +9055,7 @@ static void Cmd_tryswapitems(void) // trick | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_SECRET_BASE - | BATTLE_TYPE_x2000000)))) + | BATTLE_TYPE_RECORDED_LINK)))) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); } @@ -9058,7 +9069,7 @@ static void Cmd_tryswapitems(void) // trick | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_SECRET_BASE - | BATTLE_TYPE_x2000000)) + | BATTLE_TYPE_RECORDED_LINK)) && (gWishFutureKnock.knockedOffMons[sideAttacker] & gBitTable[gBattlerPartyIndexes[gBattlerAttacker]] || gWishFutureKnock.knockedOffMons[sideTarget] & gBitTable[gBattlerPartyIndexes[gBattlerTarget]])) { @@ -9113,11 +9124,11 @@ static void Cmd_tryswapitems(void) // trick PREPARE_ITEM_BUFFER(gBattleTextBuff2, oldItemAtk) if (oldItemAtk != 0 && *newItemAtk != 0) - gBattleCommunication[MULTISTRING_CHOOSER] = 2; // attacker's item -> <- target's item + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_BOTH; // attacker's item -> <- target's item else if (oldItemAtk == 0 && *newItemAtk != 0) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; // nothing -> <- target's item + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_TAKEN; // nothing -> <- target's item else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; // attacker's item -> <- nothing + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ITEM_SWAP_GIVEN; // attacker's item -> <- nothing } } } @@ -9605,7 +9616,7 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport if (!(gStatuses3[gBattlerAttacker] & STATUS3_MUDSPORT)) { gStatuses3[gBattlerAttacker] |= STATUS3_MUDSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_ELECTRIC; worked = TRUE; } } @@ -9614,7 +9625,7 @@ static void Cmd_settypebasedhalvers(void) // water and mud sport if (!(gStatuses3[gBattlerAttacker] & STATUS3_WATERSPORT)) { gStatuses3[gBattlerAttacker] |= STATUS3_WATERSPORT; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WEAKEN_FIRE; worked = TRUE; } } @@ -9883,7 +9894,6 @@ static void Cmd_handleballthrow(void) else // not caught { gBattleCommunication[MULTISTRING_CHOOSER] = shakes; - // Maybe inject SpriteCB_TestBallThrow here gBattlescriptCurrInstr = BattleScript_ShakeBallThrow; } } @@ -9896,7 +9906,7 @@ static void Cmd_givecaughtmon(void) { if (!ShouldShowBoxWasFullMessage()) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SENT_SOMEONES_PC; StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); } @@ -9905,9 +9915,10 @@ static void Cmd_givecaughtmon(void) StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_PC_BOX_TO_SEND_MON))); // box the mon was sent to GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerAttacker ^ BIT_SIDE]], MON_DATA_NICKNAME, gStringVar2); StringCopy(gStringVar3, GetBoxNamePtr(GetPCBoxToSendMon())); //box the mon was going to be sent to - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SOMEONES_BOX_FULL; } + // Change to B_MSG_SENT_LANETTES_PC or B_MSG_LANETTES_BOX_FULL if (FlagGet(FLAG_SYS_PC_LANETTE)) gBattleCommunication[MULTISTRING_CHOOSER]++; } @@ -9942,7 +9953,7 @@ static void Cmd_displaydexinfo(void) switch (gBattleCommunication[0]) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[0]++; break; case 1: @@ -9973,7 +9984,7 @@ static void Cmd_displaydexinfo(void) case 4: if (!IsDma3ManagerBusyWithBgCopy()) { - BeginNormalPaletteFade(0xFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_BG, 0, 0x10, 0, RGB_BLACK); ShowBg(0); ShowBg(3); gBattleCommunication[0]++; diff --git a/src/battle_setup.c b/src/battle_setup.c index 40b5993f0..cb65d25d6 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -607,7 +607,7 @@ static void CB2_EndWildBattle(void) else { SetMainCallback2(CB2_ReturnToField); - gFieldCallback = sub_80AF6F0; + gFieldCallback = FieldCB_ReturnToFieldNoScriptCheckMusic; } } @@ -1197,7 +1197,7 @@ void ConfigureAndSetUpOneTrainerBattle(u8 trainerObjEventId, const u8 *trainerSc gSelectedObjectEvent = trainerObjEventId; gSpecialVar_LastTalked = gObjectEvents[trainerObjEventId].localId; BattleSetup_ConfigureTrainerBattle(trainerScript + 1); - ScriptContext1_SetupScript(EventScript_271354); + ScriptContext1_SetupScript(EventScript_StartTrainerApproach); ScriptContext2_Enable(); } @@ -1210,7 +1210,7 @@ void ConfigureTwoTrainersBattle(u8 trainerObjEventId, const u8 *trainerScript) void SetUpTwoTrainersBattle(void) { - ScriptContext1_SetupScript(EventScript_271354); + ScriptContext1_SetupScript(EventScript_StartTrainerApproach); ScriptContext2_Enable(); } @@ -1220,10 +1220,12 @@ bool32 GetTrainerFlagFromScriptPointer(const u8 *data) return FlagGet(TRAINER_FLAGS_START + flag); } -void SetUpTrainerMovement(void) +// Set trainer's movement type so they stop and remain facing that direction +// Note: Only for trainers who are spoken to directly +// For trainers who spot the player this is handled by PlayerFaceApproachingTrainer +void SetTrainerFacingDirection(void) { struct ObjectEvent *objectEvent = &gObjectEvents[gSelectedObjectEvent]; - SetTrainerMovementType(objectEvent, GetTrainerFacingDirectionMovementType(objectEvent->facingDirection)); } @@ -1437,7 +1439,7 @@ void ShowTrainerCantBattleSpeech(void) ShowFieldMessage(GetTrainerCantBattleSpeech()); } -void SetUpTrainerEncounterMusic(void) +void PlayTrainerEncounterMusic(void) { u16 trainerId; u16 music; diff --git a/src/battle_tower.c b/src/battle_tower.c index d7123f3d2..082ea6822 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -36,7 +36,6 @@ #include "constants/event_objects.h" #include "constants/moves.h" #include "constants/easy_chat.h" -#include "constants/tv.h" extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_MaxieTrainer[]; extern const u8 MossdeepCity_SpaceCenter_2F_EventScript_TabithaTrainer[]; @@ -57,12 +56,12 @@ static void SetTowerBattleWon(void); static void AwardBattleTowerRibbons(void); static void SaveTowerChallenge(void); static void GetOpponentIntroSpeech(void); -static void nullsub_61(void); -static void nullsub_116(void); +static void BattleTowerNop1(void); +static void BattleTowerNop2(void); static void LoadMultiPartnerCandidatesData(void); static void ShowPartnerCandidateMessage(void); static void LoadLinkMultiOpponentsData(void); -static void sub_8164DCC(void); +static void TowerTryCloseLink(void); static void SetMultiPartnerGfx(void); static void SetTowerInterviewData(void); static void ValidateBattleTowerRecordChecksums(void); @@ -775,7 +774,7 @@ struct { { .species = SPECIES_METANG, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .level = 42, .nature = NATURE_BRAVE, .evs = {0, 252, 252, 0, 6, 0}, @@ -783,7 +782,7 @@ struct }, { .species = SPECIES_SKARMORY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .level = 43, .nature = NATURE_IMPISH, .evs = {252, 0, 0, 0, 6, 252}, @@ -791,7 +790,7 @@ struct }, { .species = SPECIES_AGGRON, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .level = 44, .nature = NATURE_ADAMANT, .evs = {0, 252, 0, 0, 252, 6}, @@ -811,12 +810,12 @@ static void (* const sBattleTowerFuncs[])(void) = [BATTLE_TOWER_FUNC_GIVE_RIBBONS] = AwardBattleTowerRibbons, [BATTLE_TOWER_FUNC_SAVE] = SaveTowerChallenge, [BATTLE_TOWER_FUNC_GET_OPPONENT_INTRO] = GetOpponentIntroSpeech, - [BATTLE_TOWER_FUNC_NOP] = nullsub_61, - [BATTLE_TOWER_FUNC_NOP2] = nullsub_116, + [BATTLE_TOWER_FUNC_NOP] = BattleTowerNop1, + [BATTLE_TOWER_FUNC_NOP2] = BattleTowerNop2, [BATTLE_TOWER_FUNC_LOAD_PARTNERS] = LoadMultiPartnerCandidatesData, [BATTLE_TOWER_FUNC_PARTNER_MSG] = ShowPartnerCandidateMessage, [BATTLE_TOWER_FUNC_LOAD_LINK_OPPONENTS] = LoadLinkMultiOpponentsData, - [BATTLE_TOWER_FUNC_13] = sub_8164DCC, + [BATTLE_TOWER_FUNC_TRY_CLOSE_LINK] = TowerTryCloseLink, [BATTLE_TOWER_FUNC_SET_PARTNER_GFX] = SetMultiPartnerGfx, [BATTLE_TOWER_FUNC_SET_INTERVIEW_DATA] = SetTowerInterviewData, }; @@ -878,12 +877,8 @@ static const u16 sFrontierTrainerIdRangesHard[][2] = {FRONTIER_TRAINER_JAXON, FRONTIER_TRAINER_GRETEL}, // 200 - 299 }; -// Trainer IDs? Don't make sense as part of previous array, min/max relationship reversed and never accessed -static const u16 sUnused_085DFA1A[][2] = -{ - {179, 141}, // FRONTIER_TRAINER_ALISON - FRONTIER_TRAINER_KAYDEN - {200, 183}, // FRONTIER_TRAINER_JAXON - FRONTIER_TRAINER_HUNTER -}; +// Unknown, unused data +static const u16 sUnused[] = { 179, 141, 200, 183 }; static const u8 sBattleTowerPartySizes[FRONTIER_MODE_COUNT] = { @@ -1547,7 +1542,7 @@ void GetFrontierTrainerName(u8 *dst, u16 trainerId) { if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - sub_8186468(dst); + GetRecordedBattleRecordMixFriendName(dst); return; } else @@ -1854,7 +1849,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) } else { - fixedIV = 31; + fixedIV = MAX_PER_STAT_IVS; } level = SetFacilityPtrsGetLevel(); @@ -2024,7 +2019,7 @@ void DoSpecialTrainerBattle(void) gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS; break; case FRONTIER_MODE_LINK_MULTIS: - gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_x800000; + gBattleTypeFlags |= BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_MULTI | BATTLE_TYPE_TOWER_LINK_MULTI; FillFrontierTrainersParties(FRONTIER_MULTI_PARTY_SIZE); break; } @@ -2059,7 +2054,7 @@ void DoSpecialTrainerBattle(void) if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) FillFrontierTrainerParty(DOME_BATTLE_PARTY_SIZE); CreateTask(Task_StartBattleAfterTransition, 1); - sub_806E694(0); + CreateTask_PlayMapChosenOrBattleBGM(0); BattleTransition_StartOnField(GetSpecialBattleTransition(3)); break; case SPECIAL_BATTLE_PALACE: @@ -2139,7 +2134,7 @@ static void SaveCurrentWinStreak(void) gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] = winStreak; } -static void sub_8163EE4(void) +static void SaveBattleTowerRecord(void) { s32 i; u8 lvlMode, battleMode, class; @@ -2178,7 +2173,7 @@ static void sub_8163EE4(void) for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++) { if (gSaveBlock2Ptr->frontier.selectedPartyMons[i] != 0) - sub_80686FC(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], &playerRecord->party[i]); + ConvertPokemonToBattleTowerPokemon(&gPlayerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[i] - 1], &playerRecord->party[i]); } playerRecord->language = gGameLanguage; @@ -2193,7 +2188,7 @@ static void SaveTowerChallenge(void) s32 challengeNum = (signed)(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode] / 7); if (gSpecialVar_0x8005 == 0 && (challengeNum > 1 || gSaveBlock2Ptr->frontier.curChallengeBattleNum != 0)) - sub_8163EE4(); + SaveBattleTowerRecord(); gSaveBlock2Ptr->frontier.challengeStatus = gSpecialVar_0x8005; VarSet(VAR_TEMP_0, 0); @@ -2201,12 +2196,12 @@ static void SaveTowerChallenge(void) SaveGameFrontier(); } -static void nullsub_61(void) +static void BattleTowerNop1(void) { } -static void nullsub_116(void) +static void BattleTowerNop2(void) { } @@ -2410,7 +2405,7 @@ static void LoadMultiPartnerCandidatesData(void) } } -static void sub_81646BC(u16 trainerId, u16 monId) +static void GetPotentialPartnerMoveAndSpecies(u16 trainerId, u16 monId) { u16 move = 0; u16 species = 0; @@ -2445,6 +2440,14 @@ static void sub_81646BC(u16 trainerId, u16 monId) StringCopy(gStringVar2, gSpeciesNames[species]); } +// For multi battles in the Battle Tower, the player may choose a partner by talking to them +// These partners can be an NPC or a former/record-mixed Apprentice +// When talked to, their response consists of: +// PARTNER_MSGID_INTRO - A greeting +// PARTNER_MSGID_MON1 - Naming one pokemon on their team, and a move it has +// PARTNER_MSGID_MON2_ASK - Naming a second pokemon on their team, a move it has, and asking if they'd like to be their partner +// PARTNER_MSGID_ACCEPT - If the player agrees to be their partner +// PARTNER_MSGID_REJECT - If the player declines to be their partner static void ShowPartnerCandidateMessage(void) { s32 i, j, partnerId; @@ -2487,11 +2490,11 @@ static void ShowPartnerCandidateMessage(void) break; case PARTNER_MSGID_MON1: monId = gSaveBlock2Ptr->frontier.trainerIds[8 + k * 2]; - sub_81646BC(trainerId, monId); + GetPotentialPartnerMoveAndSpecies(trainerId, monId); break; case PARTNER_MSGID_MON2_ASK: monId = gSaveBlock2Ptr->frontier.trainerIds[9 + k * 2]; - sub_81646BC(trainerId, monId); + GetPotentialPartnerMoveAndSpecies(trainerId, monId); break; case PARTNER_MSGID_ACCEPT: gPartnerTrainerId = trainerId; @@ -2643,7 +2646,7 @@ static void LoadLinkMultiOpponentsData(void) } } -static void sub_8164DCC(void) +static void TowerTryCloseLink(void) { if (gWirelessCommType != 0) SetCloseLinkCallback(); @@ -2757,7 +2760,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); @@ -2838,7 +2845,7 @@ static void FillEReaderTrainerWithPlayerData(void) } for (i = 0; i < 3; i++) - sub_80686FC(&gPlayerParty[i], &ereaderTrainer->party[i]); + ConvertPokemonToBattleTowerPokemon(&gPlayerParty[i], &ereaderTrainer->party[i]); SetEReaderTrainerChecksum(ereaderTrainer); } @@ -3287,21 +3294,21 @@ static u8 GetFrontierTrainerFixedIvs(u16 trainerId) else if (trainerId <= FRONTIER_TRAINER_TESS) // 200 - 219 fixedIv = 21; else // 220+ (- 299) - fixedIv = 31; + fixedIv = MAX_PER_STAT_IVS; return fixedIv; } -static u16 sub_8165D40(void) +static u16 GetBattleTentTrainerId(void) { u32 facility = VarGet(VAR_FRONTIER_FACILITY); - if (facility == FRONTIER_FACILITY_PALACE) - return Random() % 30; - else if (facility == FRONTIER_FACILITY_ARENA) - return Random() % 30; - else if (facility == FRONTIER_FACILITY_FACTORY) - return Random() % 30; + if (facility == FRONTIER_FACILITY_PALACE) // Verdanturf Tent; uses Palace mechanics + return Random() % NUM_BATTLE_TENT_TRAINERS; + else if (facility == FRONTIER_FACILITY_ARENA) // Fallarbor Tent; uses Arena mechanics + return Random() % NUM_BATTLE_TENT_TRAINERS; + else if (facility == FRONTIER_FACILITY_FACTORY) // Slateport Tent; uses Factory mechanics + return Random() % NUM_BATTLE_TENT_TRAINERS; else if (facility == FRONTIER_FACILITY_TOWER) return 0; else @@ -3348,7 +3355,7 @@ static void SetNextBattleTentOpponent(void) do { - trainerId = sub_8165D40(); + trainerId = GetBattleTentTrainerId(); for (i = 0; i < gSaveBlock2Ptr->frontier.curChallengeBattleNum; i++) { if (gSaveBlock2Ptr->frontier.trainerIds[i] == trainerId) @@ -3511,9 +3518,9 @@ bool32 ValidateBattleTowerRecord(u8 recordId) // unused } } -void sub_8166188(void) +void TrySetLinkBattleTowerEnemyPartyLevel(void) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { s32 i; u8 enemyLevel = SetFacilityPtrsGetLevel(); diff --git a/src/battle_transition.c b/src/battle_transition.c index 74e1548e7..479700e53 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -991,7 +991,7 @@ static bool8 Transition_Phase1(struct Task *task) static bool8 Transition_WaitForPhase1(struct Task *task) { - if (FindTaskIdByFunc(sPhase1_Tasks[task->tTransitionId]) == 0xFF) + if (FindTaskIdByFunc(sPhase1_Tasks[task->tTransitionId]) == TASK_NONE) { task->tState++; return TRUE; @@ -1012,7 +1012,7 @@ static bool8 Transition_Phase2(struct Task *task) static bool8 Transition_WaitForPhase2(struct Task *task) { task->tTransitionDone = FALSE; - if (FindTaskIdByFunc(sPhase2_Tasks[task->tTransitionId]) == 0xFF) + if (FindTaskIdByFunc(sPhase2_Tasks[task->tTransitionId]) == TASK_NONE) task->tTransitionDone = TRUE; return FALSE; } @@ -1071,7 +1071,7 @@ static bool8 Phase2_Blur_Func2(struct Task *task) { task->tData1 = 4; if (++task->tData2 == 10) - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, RGB_BLACK); SetGpuReg(REG_OFFSET_MOSAIC, (task->tData2 & 15) * 17); if (task->tData2 > 14) task->tState++; @@ -1098,7 +1098,7 @@ static bool8 Phase2_Swirl_Func1(struct Task *task) { InitTransitionStructVars(); ScanlineEffect_Clear(); - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 0x10, RGB_BLACK); sub_8149F98(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_14, 0, 2, 0, 160); SetVBlankCallback(VBlankCB_Phase2_Swirl); @@ -1153,7 +1153,7 @@ static bool8 Phase2_Shuffle_Func1(struct Task *task) InitTransitionStructVars(); ScanlineEffect_Clear(); - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 0x10, RGB_BLACK); memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_16, 0x140); SetVBlankCallback(VBlankCB_Phase2_Shuffle); @@ -1250,12 +1250,12 @@ static void sub_814669C(struct Task *task) task->tData2 = 0; task->tData4 = 0; task->tData5 = 0x4000; - sTransitionStructPtr->WININ = 63; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; sTransitionStructPtr->WINOUT = 0; - sTransitionStructPtr->WIN0H = 240; - sTransitionStructPtr->WIN0V = 160; - sTransitionStructPtr->BLDCNT = 0x3F41; - sTransitionStructPtr->BLDALPHA = (task->tData1 << 8) | (task->tData2); + sTransitionStructPtr->WIN0H = DISPLAY_WIDTH; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; + sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; + sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData2, task->tData1); for (i = 0; i < 160; i++) { @@ -1456,7 +1456,7 @@ static bool8 Phase2_Kyogre_Func5(struct Task *task) static bool8 Phase2_WeatherDuo_Func6(struct Task *task) { - BeginNormalPaletteFade(0xFFFF8000, 1, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_OBJECTS | 0x8000, 1, 0, 0x10, RGB_BLACK); task->tState++; return FALSE; } @@ -1480,7 +1480,7 @@ static bool8 Phase2_BigPokeball_Func3(struct Task *task) task->tData2++; task->tData3 = 2; } - sTransitionStructPtr->BLDALPHA = (task->tData1 << 8) | task->tData2; + sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData2, task->tData1); if (task->tData2 > 15) task->tState++; task->tData4 += 8; @@ -1500,7 +1500,7 @@ static bool8 Phase2_BigPokeball_Func4(struct Task *task) task->tData1--; task->tData3 = 2; } - sTransitionStructPtr->BLDALPHA = (task->tData1 << 8) | task->tData2; + sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData2, task->tData1); if (task->tData1 == 0) task->tState++; task->tData4 += 8; @@ -1541,7 +1541,7 @@ static bool8 Phase2_FramesCountdown(struct Task *task) static bool8 Phase2_WeatherTrio_Func1(struct Task *task) { - BeginNormalPaletteFade(0x0000FFFF, 1, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_BG, 1, 0, 0x10, RGB_BLACK); task->tState++; return FALSE; } @@ -1692,7 +1692,7 @@ static void sub_814713C(struct Sprite *sprite) } else { - if (sprite->pos1.x >= 0 && sprite->pos1.x <= 240) + if (sprite->pos1.x >= 0 && sprite->pos1.x <= DISPLAY_WIDTH) { s16 posX = sprite->pos1.x >> 3; s16 posY = sprite->pos1.y >> 3; @@ -1731,9 +1731,9 @@ static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task) ScanlineEffect_Clear(); sTransitionStructPtr->WININ = 0; - sTransitionStructPtr->WINOUT = 63; + sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL; sTransitionStructPtr->WIN0H = -3855; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 160; i++) { @@ -1962,7 +1962,7 @@ static bool8 Phase2_Ripple_Func2(struct Task *task) if (++task->tData3 == 81) { task->tData4++; - BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 0x10, RGB_BLACK); } if (task->tData4 != 0 && !gPaletteFade.active) @@ -1999,10 +1999,10 @@ static bool8 Phase2_Wave_Func1(struct Task *task) InitTransitionStructVars(); ScanlineEffect_Clear(); - sTransitionStructPtr->WININ = 63; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; sTransitionStructPtr->WINOUT = 0; - sTransitionStructPtr->WIN0H = 240; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WIN0H = DISPLAY_WIDTH; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 160; i++) { @@ -2111,9 +2111,9 @@ static bool8 Phase2_Mugshot_Func1(struct Task *task) task->tData1 = 0; task->tData2 = 1; task->tData3 = 239; - sTransitionStructPtr->WININ = 63; - sTransitionStructPtr->WINOUT = 62; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; + sTransitionStructPtr->WINOUT = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 160; i++) { @@ -2253,12 +2253,12 @@ static bool8 Phase2_Mugshot_Func6(struct Task *task) DmaStop(0); memset(gScanlineEffectRegBuffers[0], 0, 0x140); memset(gScanlineEffectRegBuffers[1], 0, 0x140); - SetGpuReg(REG_OFFSET_WIN0H, 0xF0); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); SetGpuReg(REG_OFFSET_BLDY, 0); task->tState++; task->tData3 = 0; task->tData4 = 0; - sTransitionStructPtr->BLDCNT = 0xBF; + sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN; SetVBlankCallback(VBlankCB1_Phase2_Mugshots); } return FALSE; @@ -2308,7 +2308,7 @@ static bool8 Phase2_Mugshot_Func7(struct Task *task) static bool8 Phase2_Mugshot_Func8(struct Task *task) { sTransitionStructPtr->VBlank_DMA = FALSE; - BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); + BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE); sTransitionStructPtr->BLDCNT = 0xFF; task->tData3 = 0; @@ -2384,7 +2384,7 @@ static void Mugshots_CreateOpponentPlayerSprites(struct Task *task) sMugshotsOpponentCoords[mugshotId][0] - 32, sMugshotsOpponentCoords[mugshotId][1] + 42, 0, gDecompressionBuffer); - task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), 272, 106, 0, gDecompressionBuffer); + task->tPlayerSpriteId = CreateTrainerSprite(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), DISPLAY_WIDTH + 32, 106, 0, gDecompressionBuffer); opponentSprite = &gSprites[task->tOpponentSpriteId]; playerSprite = &gSprites[task->tPlayerSpriteId]; @@ -2505,9 +2505,9 @@ static bool8 Phase2_Slice_Func1(struct Task *task) task->tData2 = 256; task->tData3 = 1; - sTransitionStructPtr->WININ = 63; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; sTransitionStructPtr->WINOUT = 0; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; sTransitionStructPtr->VBlank_DMA = FALSE; for (i = 0; i < 160; i++) @@ -2606,9 +2606,9 @@ static bool8 Phase2_ShredSplit_Func1(struct Task *task) InitTransitionStructVars(); ScanlineEffect_Clear(); - sTransitionStructPtr->WININ = 63; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; sTransitionStructPtr->WINOUT = 0; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 0xA0; i++) { @@ -2779,9 +2779,9 @@ static bool8 Phase2_Blackhole_Func1(struct Task *task) ScanlineEffect_Clear(); sTransitionStructPtr->WININ = 0; - sTransitionStructPtr->WINOUT = 63; - sTransitionStructPtr->WIN0H = 240; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL; + sTransitionStructPtr->WIN0H = DISPLAY_WIDTH; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 0xA0; i++) { @@ -3116,7 +3116,7 @@ static bool8 Phase2_Rayquaza_Func3(struct Task *task) InitTransitionStructVars(); ScanlineEffect_Clear(); - SetGpuReg(REG_OFFSET_BG0CNT, 0x9A08); + SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_TXT256x512); GetBg0TilesDst(&tilemap, &tileset); CpuFill16(0, tilemap, 0x800); CpuCopy16(sRayquaza_Tileset, tileset, 0x2000); @@ -3168,7 +3168,7 @@ static bool8 Phase2_Rayquaza_Func6(struct Task *task) { task->tState++; task->tData1 = 0; - BeginNormalPaletteFade(0xFFFF8000, 2, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_OBJECTS | 0x8000, 2, 0, 0x10, RGB_BLACK); } return FALSE; @@ -3187,8 +3187,8 @@ static bool8 Phase2_Rayquaza_Func7(struct Task *task) static bool8 Phase2_Rayquaza_Func8(struct Task *task) { - BlendPalettes(0x00007FFF, 8, 0); - BlendPalettes(0xFFFF8000, 0, 0); + BlendPalettes(PALETTES_BG & ~(0x8000), 8, 0); + BlendPalettes(PALETTES_OBJECTS | 0x8000, 0, 0); task->tState++; return FALSE; @@ -3207,9 +3207,9 @@ static bool8 Phase2_Rayquaza_Func9(struct Task *task) u16 i; sTransitionStructPtr->WININ = 0; - sTransitionStructPtr->WINOUT = 63; - sTransitionStructPtr->WIN0H = 240; - sTransitionStructPtr->WIN0V = 160; + sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL; + sTransitionStructPtr->WIN0H = DISPLAY_WIDTH; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 160; i++) { @@ -3255,11 +3255,11 @@ static bool8 Phase2_WhiteFade_Func1(struct Task *task) InitTransitionStructVars(); ScanlineEffect_Clear(); - sTransitionStructPtr->BLDCNT = 0xBF; + sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_ALL | BLDCNT_EFFECT_LIGHTEN; sTransitionStructPtr->BLDY = 0; - sTransitionStructPtr->WININ = 0x1E; - sTransitionStructPtr->WINOUT = 0x3F; - sTransitionStructPtr->WIN0V = 0xA0; + sTransitionStructPtr->WININ = WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ; + sTransitionStructPtr->WINOUT = WINOUT_WIN01_ALL; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 160; i++) { @@ -3300,7 +3300,7 @@ static bool8 Phase2_WhiteFade_Func3(struct Task *task) sTransitionStructPtr->VBlank_DMA = 0; if (sTransitionStructPtr->field_20 > 7) { - BlendPalettes(-1, 0x10, 0x7FFF); + BlendPalettes(PALETTES_ALL, 0x10, 0x7FFF); task->tState++; } return FALSE; @@ -3314,10 +3314,10 @@ static bool8 Phase2_WhiteFade_Func4(struct Task *task) SetVBlankCallback(0); SetHBlankCallback(0); - sTransitionStructPtr->WIN0H = 0xF0; + sTransitionStructPtr->WIN0H = DISPLAY_WIDTH; sTransitionStructPtr->BLDY = 0; sTransitionStructPtr->BLDCNT = 0xFF; - sTransitionStructPtr->WININ = 0x3F; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; SetVBlankCallback(VBlankCB1_Phase2_WhiteFade); @@ -3468,9 +3468,9 @@ static bool8 Phase2_Shards_Func1(struct Task *task) InitTransitionStructVars(); ScanlineEffect_Clear(); - sTransitionStructPtr->WININ = 0x3F; + sTransitionStructPtr->WININ = WININ_WIN0_ALL; sTransitionStructPtr->WINOUT = 0; - sTransitionStructPtr->WIN0V = 0xA0; + sTransitionStructPtr->WIN0V = DISPLAY_HEIGHT; for (i = 0; i < 160; i++) { @@ -3612,7 +3612,7 @@ static void CreatePhase1Task(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4) static bool8 IsPhase1Done(void) { - if (FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == 0xFF) + if (FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == TASK_NONE) return TRUE; else return FALSE; @@ -3631,7 +3631,7 @@ static bool8 Phase1_TransitionAll_Func1(struct Task *task) task->tData7 += task->tData4; if (task->tData7 > 16) task->tData7 = 16; - BlendPalettes(-1, task->tData7, 0x2D6B); + BlendPalettes(PALETTES_ALL, task->tData7, 0x2D6B); } if (task->tData7 > 15) { @@ -3649,7 +3649,7 @@ static bool8 Phase1_TransitionAll_Func2(struct Task *task) task->tData7 -= task->tData5; if (task->tData7 < 0) task->tData7 = 0; - BlendPalettes(-1, task->tData7, 0x2D6B); + BlendPalettes(PALETTES_ALL, task->tData7, 0x2D6B); } if (task->tData7 == 0) { @@ -3675,7 +3675,7 @@ static bool8 Phase1_TransitionAll_Func2(struct Task *task) static void InitTransitionStructVars(void) { memset(sTransitionStructPtr, 0, sizeof(*sTransitionStructPtr)); - sub_8089C08(&sTransitionStructPtr->field_14, &sTransitionStructPtr->field_16); + GetCameraOffsetWithPan(&sTransitionStructPtr->field_14, &sTransitionStructPtr->field_16); } static void VBlankCB_BattleTransition(void) @@ -3706,7 +3706,7 @@ void GetBg0TilesDst(u16 **tilemap, u16 **tileset) static void FadeScreenBlack(void) { - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); } static void sub_8149F98(s16 *array, s16 sinAdd, s16 index, s16 indexIncrementer, s16 amplitude, s16 arrSize) @@ -3895,8 +3895,8 @@ static bool8 Phase2_FrontierLogoWave_Func1(struct Task *task) task->tData5 = 0; task->tData6 = 16; task->tData7 = 2560; - sTransitionStructPtr->BLDCNT = 0x3F41; - sTransitionStructPtr->BLDALPHA = (task->tData6 << 8) | (task->tData5); + sTransitionStructPtr->BLDCNT = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL; + sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData5, task->tData6); REG_BLDCNT = sTransitionStructPtr->BLDCNT; REG_BLDALPHA = sTransitionStructPtr->BLDALPHA; GetBg0TilesDst(&tilemap, &tileset); @@ -3965,7 +3965,7 @@ static bool8 Phase2_FrontierLogoWave_Func4(struct Task *task) else if (task->tData6 > 0) task->tData6--; - sTransitionStructPtr->BLDALPHA = (task->tData6 << 8) | (task->tData5); + sTransitionStructPtr->BLDALPHA = BLDALPHA_BLEND(task->tData5, task->tData6); } for (i = 0; i < 160; i++, var6 += var8) @@ -3977,7 +3977,7 @@ static bool8 Phase2_FrontierLogoWave_Func4(struct Task *task) if (++task->tData3 == 101) { task->tData4++; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); } if (task->tData4 != 0 && !gPaletteFade.active) @@ -4077,7 +4077,7 @@ static bool8 Phase2_FrontierSquares_Func3(struct Task *task) } break; case 1: - BlendPalettes(0xFFFF7FFF, 0x10, 0); + BlendPalettes(PALETTES_ALL & ~(0x8000), 0x10, 0); LZ77UnCompVram(sFrontierSquares_EmptyBg_Tileset, tileset); break; case 2: @@ -4138,7 +4138,7 @@ static bool8 Phase2_FrontierSquaresSpiral_Func2(struct Task *task) static bool8 Phase2_FrontierSquaresSpiral_Func3(struct Task *task) { BlendPalette(0xE0, 0x10, 3, 0); - BlendPalettes(0xFFFF3FFF, 0x10, 0); + BlendPalettes(PALETTES_ALL & ~(0x8000 | 0x4000), 0x10, 0); task->tData2 = 0; task->tData3 = 0; @@ -4194,7 +4194,7 @@ static bool8 Phase2_FrontierSquares_End(struct Task *task) { FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20); CopyBgTilemapBufferToVram(0); - BlendPalettes(0xFFFFFFFF, 0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); DestroyTask(FindTaskIdByFunc(task->func)); return FALSE; } @@ -4286,7 +4286,7 @@ static bool8 Phase2_FrontierSquaresScroll_Func2(struct Task *task) static bool8 Phase2_FrontierSquaresScroll_Func3(struct Task *task) { - BlendPalettes(0xFFFF7FFF, 0x10, 0); + BlendPalettes(PALETTES_ALL & ~(0x8000), 0x10, 0); task->tData2 = 0; @@ -4325,10 +4325,13 @@ static bool8 Phase2_FrontierSquaresScroll_Func5(struct Task *task) FillBgTilemapBufferRect_Palette0(0, 1, 0, 0, 0x20, 0x20); CopyBgTilemapBufferToVram(0); - BlendPalettes(0xFFFFFFFF, 0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); DestroyTask(FindTaskIdByFunc(task->func)); + +#ifndef UBFIX task->tState++; // UB: changing value of a destroyed task +#endif return FALSE; } diff --git a/src/battle_transition_frontier.c b/src/battle_transition_frontier.c index 931de5e44..cb3519c4e 100644 --- a/src/battle_transition_frontier.c +++ b/src/battle_transition_frontier.c @@ -373,7 +373,7 @@ static bool8 FadeInCenterLogoCircle(struct Task *task) { if (task->data[3] == 31) { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, RGB_BLACK); task->tState++; } else diff --git a/src/battle_tv.c b/src/battle_tv.c index 7e311fdab..a61f5ff29 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -8,15 +8,68 @@ #include "constants/moves.h" #include "battle_message.h" #include "tv.h" +#include "constants/battle_move_effects.h" // this file's functions -static bool8 sub_817E0B8(u16 stringId); +static bool8 IsNotSpecialBattleString(u16 stringId); static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3); static void TrySetBattleSeminarShow(void); static void AddPointsOnFainting(bool8 targetFainted); static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot); static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride); +#define TABLE_END ((u16)-1) + +enum { + PTS_MOVE_EFFECT, + PTS_EFFECTIVENESS, + PTS_SET_UP, // Broadly. Used by Wish, Future Sight, Ingrain, etc. + PTS_RAIN, + PTS_SUN, + PTS_SANDSTORM, + PTS_HAIL, + PTS_ELECTRIC, + PTS_STATUS_DMG, + PTS_STATUS, + PTS_SPIKES, + PTS_WATER_SPORT, + PTS_MUD_SPORT, + PTS_REFLECT, + PTS_LIGHT_SCREEN, + PTS_SAFEGUARD, + PTS_MIST, + PTS_BREAK_WALL, + PTS_CRITICAL_HIT, + PTS_FAINT, + PTS_FAINT_SET_UP, + PTS_FLINCHED, + PTS_STAT_INCREASE_1, + PTS_STAT_INCREASE_2, + PTS_STAT_DECREASE_SELF, + PTS_STAT_DECREASE_1, + PTS_STAT_DECREASE_2, + PTS_STAT_INCREASE_NOT_SELF, +}; + +enum { + FNT_NONE, + FNT_CURSE, + FNT_LEECH_SEED, + FNT_POISON, + FNT_BURN, + FNT_NIGHTMARE, + FNT_WRAP, + FNT_SPIKES, + FNT_FUTURE_SIGHT, + FNT_DOOM_DESIRE, + FNT_PERISH_SONG, + FNT_DESTINY_BOND, + FNT_CONFUSION, + FNT_EXPLOSION, + FNT_RECOIL, + FNT_OTHER, +}; + // const rom data static const u16 sVariableDmgMoves[] = { @@ -26,180 +79,462 @@ static const u16 sVariableDmgMoves[] = MOVE_WATER_SPOUT, MOVE_DREAM_EATER, MOVE_WEATHER_BALL, MOVE_SNORE, MOVE_PAIN_SPLIT, MOVE_GUILLOTINE, MOVE_FRUSTRATION, MOVE_RETURN, MOVE_ENDEAVOR, - MOVE_PRESENT, MOVE_REVENGE, 0xFFFF, + MOVE_PRESENT, MOVE_REVENGE, TABLE_END, // those are handled by the function itself - MOVE_MAGNITUDE, MOVE_PSYWAVE, 0xFFFF + MOVE_MAGNITUDE, MOVE_PSYWAVE, TABLE_END }; -static const u16 sUnknown_0860A4E0[] = -{ - 0x0001, 0x0001, 0x0001, 0x0004, 0x0001, 0x0001, 0x0001, 0x0000, 0x0005, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0005, 0x0005, 0x0004, 0x0005, 0x0001, 0x0003, 0x0001, - 0x0003, 0x0005, 0x0001, 0x0007, 0x0001, 0x0007, 0x0007, 0x0001, 0x0005, 0x0002, 0x0004, 0x0001, 0x0001, 0x0001, 0x0005, 0x0001, - 0x0002, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0007, 0x0004, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0004, 0x0001, 0x0001, 0x0001, 0x0004, - 0x0005, 0x0002, 0x0004, 0x0001, 0x0004, 0x0001, 0x0007, 0x0002, 0x0001, 0x0005, 0x0007, 0x0003, 0x0003, 0x0004, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0002, 0x0004, 0x0001, 0x0005, 0x0001, 0x0001, 0x0004, 0x0005, 0x0003, 0x0001, 0x0002, 0x0001, 0x0005, - 0x0004, 0x0003, 0x0006, 0x0004, 0x0003, 0x0003, 0x0003, 0x0002, 0x0004, 0x0001, 0x0001, 0x0001, 0x0005, 0x0001, 0x0001, 0x0007, - 0x0002, 0x0002, 0x0001, 0x0001, 0x0004, 0x0004, 0x0004, 0x0001, 0x0004, 0x0004, 0x0001, 0x0001, 0x0001, 0x0001, 0x0007, 0x0007, - 0x0006, 0x0003, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0003, 0x0001, 0x0001, 0x0004, 0x0004, - 0x0003, 0x0003, 0x0003, 0x0001, 0x0004, 0x0007, 0x0007, 0x0005, 0x0007, 0x0001, 0x0007, 0x0001, 0x0005, 0x0000, 0x0004, 0x0004, - 0x0004, 0x0004, 0x0004, 0x0002, 0x0002, 0x0006, 0x0003, 0x0006, 0x0004, 0x0004, 0x0002, 0x0005, 0x0002, 0x0001, 0x0001, 0x0006, - 0x0006, 0x0006, 0x0001, 0x0001, 0x0001, 0x0001, 0x0002, 0x0006, 0x0001, 0x0004, 0x0001, 0x0001, 0x0003, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0004, 0x0001, 0x0001, 0x0003 -}; -static const u16 sUnknown_0860A68C[] = -{ - 0x0004, 0xfffd, 0xfffa -}; -static const u16 sUnknown_0860A692[] = -{ - 0x0004, 0x0004, 0x0006, 0x0006, 0x0007, 0x0006, 0x0002 -}; -static const u16 sUnknown_0860A6A0[] = -{ - 0x0091, 0x0003, 0x00fa, 0x0003, 0x00be, 0x0003, 0x0080, 0x0003, 0x006e, 0x0003, 0x0098, 0x0003, 0x0143, 0x0003, 0x0123, 0x0003, - 0x007f, 0x0003, 0x014a, 0x0003, 0x0039, 0x0003, 0x0134, 0x0003, 0x0038, 0x0003, 0x003d, 0x0003, 0x015a, 0x0000, 0x0037, 0x0003, - 0x0160, 0x0003, 0x0137, 0x0003, 0x0057, 0x0003, 0x004c, 0xfffc, 0x013b, 0xfffc, 0x00ac, 0xfffc, 0x0035, 0xfffc, 0x00dd, 0xfffc, - 0x007e, 0xfffc, 0x0101, 0xfffc, 0x0034, 0xfffc, 0x0133, 0xfffc, 0x012b, 0xfffc, 0x011c, 0xfffc, 0x0053, 0xfffc, 0x0007, 0xfffc, - 0x004c, 0xfffc, 0xffff, 0x0000 -}; -static const u16 sUnknown_0860A728[] = -{ - 0x013b, 0x0003, 0x00ac, 0x0003, 0x0035, 0x0003, 0x00dd, 0x0003, 0x007e, 0x0003, 0x0101, 0x0003, 0x0034, 0x0003, 0x0133, 0x0003, - 0x012b, 0x0003, 0x011c, 0x0003, 0x0053, 0x0003, 0x0007, 0x0003, 0x004c, 0x0005, 0x00eb, 0x0003, 0x00ea, 0x0003, 0x00ec, 0x0003, - 0x0137, 0x0003, 0xffff, 0x0000 -}; -static const u16 sUnknown_0860A770[] = -{ - 0x0137, 0x0003, 0x004c, 0xfffd, 0xffff, 0x0000 -}; -static const u16 sUnknown_0860A77C[] = +static const u16 sPoints_MoveEffect[NUM_BATTLE_MOVE_EFFECTS] = { - 0x0137, 0x0003, 0x004c, 0xfffd, 0xffff, 0x0000 + [EFFECT_HIT] = 1, + [EFFECT_SLEEP] = 1, + [EFFECT_POISON_HIT] = 1, + [EFFECT_ABSORB] = 4, + [EFFECT_BURN_HIT] = 1, + [EFFECT_FREEZE_HIT] = 1, + [EFFECT_PARALYZE_HIT] = 1, + [EFFECT_EXPLOSION] = 0, + [EFFECT_DREAM_EATER] = 5, + [EFFECT_MIRROR_MOVE] = 1, + [EFFECT_ATTACK_UP] = 1, + [EFFECT_DEFENSE_UP] = 1, + [EFFECT_SPEED_UP] = 1, + [EFFECT_SPECIAL_ATTACK_UP] = 1, + [EFFECT_SPECIAL_DEFENSE_UP] = 1, + [EFFECT_ACCURACY_UP] = 1, + [EFFECT_EVASION_UP] = 1, + [EFFECT_ALWAYS_HIT] = 2, + [EFFECT_ATTACK_DOWN] = 1, + [EFFECT_DEFENSE_DOWN] = 1, + [EFFECT_SPEED_DOWN] = 1, + [EFFECT_SPECIAL_ATTACK_DOWN] = 1, + [EFFECT_SPECIAL_DEFENSE_DOWN] = 1, + [EFFECT_ACCURACY_DOWN] = 1, + [EFFECT_EVASION_DOWN] = 1, + [EFFECT_HAZE] = 5, + [EFFECT_BIDE] = 5, + [EFFECT_RAMPAGE] = 4, + [EFFECT_ROAR] = 5, + [EFFECT_MULTI_HIT] = 1, + [EFFECT_CONVERSION] = 3, + [EFFECT_FLINCH_HIT] = 1, + [EFFECT_RESTORE_HP] = 3, + [EFFECT_TOXIC] = 5, + [EFFECT_PAY_DAY] = 1, + [EFFECT_LIGHT_SCREEN] = 7, + [EFFECT_TRI_ATTACK] = 1, + [EFFECT_REST] = 7, + [EFFECT_OHKO] = 7, + [EFFECT_RAZOR_WIND] = 1, + [EFFECT_SUPER_FANG] = 5, + [EFFECT_DRAGON_RAGE] = 2, + [EFFECT_TRAP] = 4, + [EFFECT_HIGH_CRITICAL] = 1, + [EFFECT_DOUBLE_HIT] = 1, + [EFFECT_RECOIL_IF_MISS] = 1, + [EFFECT_MIST] = 5, + [EFFECT_FOCUS_ENERGY] = 1, + [EFFECT_RECOIL] = 2, + [EFFECT_CONFUSE] = 4, + [EFFECT_ATTACK_UP_2] = 1, + [EFFECT_DEFENSE_UP_2] = 1, + [EFFECT_SPEED_UP_2] = 1, + [EFFECT_SPECIAL_ATTACK_UP_2] = 1, + [EFFECT_SPECIAL_DEFENSE_UP_2] = 1, + [EFFECT_ACCURACY_UP_2] = 1, + [EFFECT_EVASION_UP_2] = 1, + [EFFECT_TRANSFORM] = 0, + [EFFECT_ATTACK_DOWN_2] = 1, + [EFFECT_DEFENSE_DOWN_2] = 1, + [EFFECT_SPEED_DOWN_2] = 1, + [EFFECT_SPECIAL_ATTACK_DOWN_2] = 1, + [EFFECT_SPECIAL_DEFENSE_DOWN_2] = 1, + [EFFECT_ACCURACY_DOWN_2] = 1, + [EFFECT_EVASION_DOWN_2] = 1, + [EFFECT_REFLECT] = 7, + [EFFECT_POISON] = 4, + [EFFECT_PARALYZE] = 4, + [EFFECT_ATTACK_DOWN_HIT] = 1, + [EFFECT_DEFENSE_DOWN_HIT] = 1, + [EFFECT_SPEED_DOWN_HIT] = 1, + [EFFECT_SPECIAL_ATTACK_DOWN_HIT] = 1, + [EFFECT_SPECIAL_DEFENSE_DOWN_HIT] = 1, + [EFFECT_ACCURACY_DOWN_HIT] = 1, + [EFFECT_EVASION_DOWN_HIT] = 1, + [EFFECT_SKY_ATTACK] = 4, + [EFFECT_CONFUSE_HIT] = 1, + [EFFECT_TWINEEDLE] = 1, + [EFFECT_VITAL_THROW] = 1, + [EFFECT_SUBSTITUTE] = 4, + [EFFECT_RECHARGE] = 5, + [EFFECT_RAGE] = 2, + [EFFECT_MIMIC] = 4, + [EFFECT_METRONOME] = 1, + [EFFECT_LEECH_SEED] = 4, + [EFFECT_SPLASH] = 1, + [EFFECT_DISABLE] = 7, + [EFFECT_LEVEL_DAMAGE] = 2, + [EFFECT_PSYWAVE] = 1, + [EFFECT_COUNTER] = 5, + [EFFECT_ENCORE] = 7, + [EFFECT_PAIN_SPLIT] = 3, + [EFFECT_SNORE] = 3, + [EFFECT_CONVERSION_2] = 4, + [EFFECT_LOCK_ON] = 3, + [EFFECT_SKETCH] = 3, + [EFFECT_UNUSED_60] = 3, + [EFFECT_SLEEP_TALK] = 3, + [EFFECT_DESTINY_BOND] = 3, + [EFFECT_FLAIL] = 2, + [EFFECT_SPITE] = 4, + [EFFECT_FALSE_SWIPE] = 1, + [EFFECT_HEAL_BELL] = 5, + [EFFECT_QUICK_ATTACK] = 1, + [EFFECT_TRIPLE_KICK] = 1, + [EFFECT_THIEF] = 4, + [EFFECT_MEAN_LOOK] = 5, + [EFFECT_NIGHTMARE] = 3, + [EFFECT_MINIMIZE] = 1, + [EFFECT_CURSE] = 2, + [EFFECT_UNUSED_6E] = 1, + [EFFECT_PROTECT] = 5, + [EFFECT_SPIKES] = 4, + [EFFECT_FORESIGHT] = 3, + [EFFECT_PERISH_SONG] = 6, + [EFFECT_SANDSTORM] = 4, + [EFFECT_ENDURE] = 3, + [EFFECT_ROLLOUT] = 3, + [EFFECT_SWAGGER] = 3, + [EFFECT_FURY_CUTTER] = 2, + [EFFECT_ATTRACT] = 4, + [EFFECT_RETURN] = 1, + [EFFECT_PRESENT] = 1, + [EFFECT_FRUSTRATION] = 1, + [EFFECT_SAFEGUARD] = 5, + [EFFECT_THAW_HIT] = 1, + [EFFECT_MAGNITUDE] = 1, + [EFFECT_BATON_PASS] = 7, + [EFFECT_PURSUIT] = 2, + [EFFECT_RAPID_SPIN] = 2, + [EFFECT_SONICBOOM] = 1, + [EFFECT_UNUSED_83] = 1, + [EFFECT_MORNING_SUN] = 4, + [EFFECT_SYNTHESIS] = 4, + [EFFECT_MOONLIGHT] = 4, + [EFFECT_HIDDEN_POWER] = 1, + [EFFECT_RAIN_DANCE] = 4, + [EFFECT_SUNNY_DAY] = 4, + [EFFECT_DEFENSE_UP_HIT] = 1, + [EFFECT_ATTACK_UP_HIT] = 1, + [EFFECT_ALL_STATS_UP_HIT] = 1, + [EFFECT_UNUSED_8D] = 1, + [EFFECT_BELLY_DRUM] = 7, + [EFFECT_PSYCH_UP] = 7, + [EFFECT_MIRROR_COAT] = 6, + [EFFECT_SKULL_BASH] = 3, + [EFFECT_TWISTER] = 1, + [EFFECT_EARTHQUAKE] = 1, + [EFFECT_FUTURE_SIGHT] = 1, + [EFFECT_GUST] = 1, + [EFFECT_FLINCH_MINIMIZE_HIT] = 1, + [EFFECT_SOLARBEAM] = 1, + [EFFECT_THUNDER] = 1, + [EFFECT_TELEPORT] = 1, + [EFFECT_BEAT_UP] = 2, + [EFFECT_SEMI_INVULNERABLE] = 3, + [EFFECT_DEFENSE_CURL] = 1, + [EFFECT_SOFTBOILED] = 1, + [EFFECT_FAKE_OUT] = 4, + [EFFECT_UPROAR] = 4, + [EFFECT_STOCKPILE] = 3, + [EFFECT_SPIT_UP] = 3, + [EFFECT_SWALLOW] = 3, + [EFFECT_UNUSED_A3] = 1, + [EFFECT_HAIL] = 4, + [EFFECT_TORMENT] = 7, + [EFFECT_FLATTER] = 7, + [EFFECT_WILL_O_WISP] = 5, + [EFFECT_MEMENTO] = 7, + [EFFECT_FACADE] = 1, + [EFFECT_FOCUS_PUNCH] = 7, + [EFFECT_SMELLINGSALT] = 1, + [EFFECT_FOLLOW_ME] = 5, + [EFFECT_NATURE_POWER] = 0, + [EFFECT_CHARGE] = 4, + [EFFECT_TAUNT] = 4, + [EFFECT_HELPING_HAND] = 4, + [EFFECT_TRICK] = 4, + [EFFECT_ROLE_PLAY] = 4, + [EFFECT_WISH] = 2, + [EFFECT_ASSIST] = 2, + [EFFECT_INGRAIN] = 6, + [EFFECT_SUPERPOWER] = 3, + [EFFECT_MAGIC_COAT] = 6, + [EFFECT_RECYCLE] = 4, + [EFFECT_REVENGE] = 4, + [EFFECT_BRICK_BREAK] = 2, + [EFFECT_YAWN] = 5, + [EFFECT_KNOCK_OFF] = 2, + [EFFECT_ENDEAVOR] = 1, + [EFFECT_ERUPTION] = 1, + [EFFECT_SKILL_SWAP] = 6, + [EFFECT_IMPRISON] = 6, + [EFFECT_REFRESH] = 6, + [EFFECT_GRUDGE] = 1, + [EFFECT_SNATCH] = 1, + [EFFECT_LOW_KICK] = 1, + [EFFECT_SECRET_POWER] = 1, + [EFFECT_DOUBLE_EDGE] = 2, + [EFFECT_TEETER_DANCE] = 6, + [EFFECT_BLAZE_KICK] = 1, + [EFFECT_MUD_SPORT] = 4, + [EFFECT_POISON_FANG] = 1, + [EFFECT_WEATHER_BALL] = 1, + [EFFECT_OVERHEAT] = 3, + [EFFECT_TICKLE] = 1, + [EFFECT_COSMIC_POWER] = 1, + [EFFECT_SKY_UPPERCUT] = 1, + [EFFECT_BULK_UP] = 1, + [EFFECT_POISON_TAIL] = 1, + [EFFECT_WATER_SPORT] = 4, + [EFFECT_CALM_MIND] = 1, + [EFFECT_DRAGON_DANCE] = 1, + [EFFECT_CAMOUFLAGE] = 3 }; -static const u16 sUnknown_0860A788[] = -{ - 0x0055, 0x0003, 0x0009, 0x0003, 0x00d1, 0x0003, 0x0054, 0x0003, 0x00c0, 0x0003, 0x015f, 0x0003, 0x0056, 0x0000, 0x0057, 0x0003, - 0x0158, 0x0003, 0xffff, 0x0000 -}; -static const u16 sUnknown_0860A7B0[] = -{ - 0x0005, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003 -}; -static const u16 sUnknown_0860A7BE[] = -{ - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005 -}; -static const u16 sUnknown_0860A7C8[] = -{ - 0x0004 -}; -static const u16 sUnknown_0860A7CA[] = -{ - 0x0005 -}; -static const u16 sUnknown_0860A7CC[] = + +static const u16 sPoints_Effectiveness[] = { - 0x0005 + 4, // Super Effective + -3, // Not Very Effective + -6 // No Effect }; -static const u16 sUnknown_0860A7CE[] = +static const u16 sPoints_SetUp[] = { - 0x0003 + 4, // Future Sight + 4, // Doom Desire + 6, + 6, // Wish + 7, // Grudge + 6, + 2 // Ingrain }; -static const u16 sUnknown_0860A7D0[] = +static const u16 sPoints_RainMoves[] = { - 0x0003 + MOVE_BUBBLE, 3, + MOVE_WHIRLPOOL, 3, + MOVE_OCTAZOOKA, 3, + MOVE_CLAMP, 3, + MOVE_WITHDRAW, 3, + MOVE_CRABHAMMER, 3, + MOVE_WATER_SPOUT, 3, + MOVE_DIVE, 3, + MOVE_WATERFALL, 3, + MOVE_MUDDY_WATER, 3, + MOVE_SURF, 3, + MOVE_HYDRO_CANNON, 3, + MOVE_HYDRO_PUMP, 3, + MOVE_BUBBLE_BEAM, 3, + MOVE_WATER_SPORT, 0, // Unnecessary, unlisted moves are already given 0 points + MOVE_WATER_GUN, 3, + MOVE_WATER_PULSE, 3, + MOVE_WEATHER_BALL, 3, + MOVE_THUNDER, 3, + MOVE_SOLAR_BEAM, -4, + MOVE_OVERHEAT, -4, + MOVE_FLAME_WHEEL, -4, + MOVE_FLAMETHROWER, -4, + MOVE_SACRED_FIRE, -4, + MOVE_FIRE_BLAST, -4, + MOVE_HEAT_WAVE, -4, + MOVE_EMBER, -4, + MOVE_BLAST_BURN, -4, + MOVE_BLAZE_KICK, -4, + MOVE_ERUPTION, -4, + MOVE_FIRE_SPIN, -4, + MOVE_FIRE_PUNCH, -4, + MOVE_SOLAR_BEAM, -4, // Repeated + TABLE_END, 0 }; -static const u16 sUnknown_0860A7D2[] = +static const u16 sPoints_SunMoves[] = { - 0x0004 + MOVE_OVERHEAT, 3, + MOVE_FLAME_WHEEL, 3, + MOVE_FLAMETHROWER, 3, + MOVE_SACRED_FIRE, 3, + MOVE_FIRE_BLAST, 3, + MOVE_HEAT_WAVE, 3, + MOVE_EMBER, 3, + MOVE_BLAST_BURN, 3, + MOVE_BLAZE_KICK, 3, + MOVE_ERUPTION, 3, + MOVE_FIRE_SPIN, 3, + MOVE_FIRE_PUNCH, 3, + MOVE_SOLAR_BEAM, 5, + MOVE_SYNTHESIS, 3, + MOVE_MORNING_SUN, 3, + MOVE_MOONLIGHT, 3, + MOVE_WEATHER_BALL, 3, + TABLE_END, 0 }; -static const u16 sUnknown_0860A7D4[] = +static const u16 sPoints_SandstormMoves[] = { - 0x0003 + MOVE_WEATHER_BALL, 3, + MOVE_SOLAR_BEAM, -3, + TABLE_END, 0 }; -static const u16 sUnknown_0860A7D6[] = +static const u16 sPoints_HailMoves[] = { - 0x0006 + MOVE_WEATHER_BALL, 3, + MOVE_SOLAR_BEAM, -3, + TABLE_END, 0 }; -static const u16 sUnknown_0860A7D8[] = +static const u16 sPoints_ElectricMoves[] = { - 0x0006 + MOVE_THUNDERBOLT, 3, + MOVE_THUNDER_PUNCH, 3, + MOVE_SPARK, 3, + MOVE_THUNDER_SHOCK, 3, + MOVE_ZAP_CANNON, 3, + MOVE_SHOCK_WAVE, 3, + MOVE_THUNDER_WAVE, 0, // Unnecessary, unlisted moves are already given 0 points + MOVE_THUNDER, 3, + MOVE_VOLT_TACKLE, 3, + TABLE_END, 0 }; -static const u16 sUnknown_0860A7DA[] = +static const u16 sPoints_StatusDmg[] = { - 0x0006 + 5, // Curse + 3, // Leech Seed + 3, // Poison + 3, // Toxic + 3, // Burn + 3, // Nightmare + 3 // Wrap (Trapping move) }; -static const u16 sUnknown_0860A7DC[] = +static const u16 sPoints_Status[] = { - 0x0004 + 5, // Attraction + 5, // Confusion + 5, // Paralysis + 5, // Sleep + 5 // Freeze }; -static const u16 sUnknown_0860A7DE[] = + +static const u16 sPoints_Spikes[] = { 4 }; +static const u16 sPoints_WaterSport[] = { 5 }; +static const u16 sPoints_MudSport[] = { 5 }; +static const u16 sPoints_Reflect[] = { 3 }; +static const u16 sPoints_LightScreen[] = { 3 }; +static const u16 sPoints_Safeguard[] = { 4 }; +static const u16 sPoints_Mist[] = { 3 }; +static const u16 sPoints_BreakWall[] = { 6 }; +static const u16 sPoints_CriticalHit[] = { 6 }; +static const u16 sPoints_Faint[] = { 6 }; +static const u16 sPoints_Flinched[] = { 4 }; + +static const u16 sPoints_StatIncrease1[NUM_BATTLE_STATS - 1] = { - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002 + [STAT_ATK - 1] = 2, + [STAT_DEF - 1] = 2, + [STAT_SPEED - 1] = 2, + [STAT_SPATK - 1] = 2, + [STAT_SPDEF - 1] = 2, + [STAT_ACC - 1] = 2, + [STAT_EVASION - 1] = 2 }; -static const u16 sUnknown_0860A7EC[] = +static const u16 sPoints_StatIncrease2[NUM_BATTLE_STATS - 1] = { - 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004 + [STAT_ATK - 1] = 4, + [STAT_DEF - 1] = 4, + [STAT_SPEED - 1] = 4, + [STAT_SPATK - 1] = 4, + [STAT_SPDEF - 1] = 4, + [STAT_ACC - 1] = 4, + [STAT_EVASION - 1] = 4 }; -static const u16 sUnknown_0860A7FA[] = +static const u16 sPoints_StatDecreaseSelf[NUM_BATTLE_STATS - 1] = { - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff + [STAT_ATK - 1] = -1, + [STAT_DEF - 1] = -1, + [STAT_SPEED - 1] = -1, + [STAT_SPATK - 1] = -1, + [STAT_SPDEF - 1] = -1, + [STAT_ACC - 1] = -1, + [STAT_EVASION - 1] = -1 }; -static const u16 sUnknown_0860A808[] = +static const u16 sPoints_StatDecrease1[NUM_BATTLE_STATS - 1] = { - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002 + [STAT_ATK - 1] = 2, + [STAT_DEF - 1] = 2, + [STAT_SPEED - 1] = 2, + [STAT_SPATK - 1] = 2, + [STAT_SPDEF - 1] = 2, + [STAT_ACC - 1] = 2, + [STAT_EVASION - 1] = 2 }; -static const u16 sUnknown_0860A816[] = +static const u16 sPoints_StatDecrease2[NUM_BATTLE_STATS - 1] = { - 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004 + [STAT_ATK - 1] = 4, + [STAT_DEF - 1] = 4, + [STAT_SPEED - 1] = 4, + [STAT_SPATK - 1] = 4, + [STAT_SPDEF - 1] = 4, + [STAT_ACC - 1] = 4, + [STAT_EVASION - 1] = 4 }; -static const u16 sUnknown_0860A824[] = +static const u16 sPoints_StatIncreaseNotSelf[NUM_BATTLE_STATS - 1] = { - 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe, 0xfffe + [STAT_ATK - 1] = -2, + [STAT_DEF - 1] = -2, + [STAT_SPEED - 1] = -2, + [STAT_SPATK - 1] = -2, + [STAT_SPDEF - 1] = -2, + [STAT_ACC - 1] = -2, + [STAT_EVASION - 1] = -2 }; static const u16 *const sPointsArray[] = { - sUnknown_0860A4E0, - sUnknown_0860A68C, - sUnknown_0860A692, - sUnknown_0860A6A0, - sUnknown_0860A728, - sUnknown_0860A770, - sUnknown_0860A77C, - sUnknown_0860A788, - sUnknown_0860A7B0, - sUnknown_0860A7BE, - sUnknown_0860A7C8, - sUnknown_0860A7CA, - sUnknown_0860A7CC, - sUnknown_0860A7CE, - sUnknown_0860A7D0, - sUnknown_0860A7D2, - sUnknown_0860A7D4, - sUnknown_0860A7D6, - sUnknown_0860A7D8, - sUnknown_0860A7DA, - sUnknown_0860A7DA, - sUnknown_0860A7DC, - sUnknown_0860A7DE, - sUnknown_0860A7EC, - sUnknown_0860A7FA, - sUnknown_0860A808, - sUnknown_0860A816, - sUnknown_0860A824 + [PTS_MOVE_EFFECT] = sPoints_MoveEffect, + [PTS_EFFECTIVENESS] = sPoints_Effectiveness, + [PTS_SET_UP] = sPoints_SetUp, + [PTS_RAIN] = sPoints_RainMoves, + [PTS_SUN] = sPoints_SunMoves, + [PTS_SANDSTORM] = sPoints_SandstormMoves, + [PTS_HAIL] = sPoints_HailMoves, + [PTS_ELECTRIC] = sPoints_ElectricMoves, + [PTS_STATUS_DMG] = sPoints_StatusDmg, + [PTS_STATUS] = sPoints_Status, + [PTS_SPIKES] = sPoints_Spikes, + [PTS_WATER_SPORT] = sPoints_WaterSport, + [PTS_MUD_SPORT] = sPoints_MudSport, + [PTS_REFLECT] = sPoints_Reflect, + [PTS_LIGHT_SCREEN] = sPoints_LightScreen, + [PTS_SAFEGUARD] = sPoints_Safeguard, + [PTS_MIST] = sPoints_Mist, + [PTS_BREAK_WALL] = sPoints_BreakWall, + [PTS_CRITICAL_HIT] = sPoints_CriticalHit, + [PTS_FAINT] = sPoints_Faint, + [PTS_FAINT_SET_UP] = sPoints_Faint, + [PTS_FLINCHED] = sPoints_Flinched, + [PTS_STAT_INCREASE_1] = sPoints_StatIncrease1, + [PTS_STAT_INCREASE_2] = sPoints_StatIncrease2, + [PTS_STAT_DECREASE_SELF] = sPoints_StatDecreaseSelf, + [PTS_STAT_DECREASE_1] = sPoints_StatDecrease1, + [PTS_STAT_DECREASE_2] = sPoints_StatDecrease2, + [PTS_STAT_INCREASE_NOT_SELF] = sPoints_StatIncreaseNotSelf }; -static const u16 sUnknown_0860A8A4[] = +// Points will always be calculated for these messages +// even if current pokemon does not have corresponding move +static const u16 sSpecialBattleStrings[] = { STRINGID_PKMNPERISHCOUNTFELL, STRINGID_PKMNWISHCAMETRUE, STRINGID_PKMNLOSTPPGRUDGE, STRINGID_PKMNTOOKFOE, STRINGID_PKMNABSORBEDNUTRIENTS, STRINGID_PKMNANCHOREDITSELF, STRINGID_PKMNAFFLICTEDBYCURSE, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_PKMNLOCKEDINNIGHTMARE, STRINGID_PKMNHURTBY, STRINGID_PKMNHURTBYBURN, STRINGID_PKMNHURTBYPOISON, STRINGID_PKMNHURTBYSPIKES, STRINGID_ATTACKERFAINTED, STRINGID_TARGETFAINTED, - STRINGID_PKMNHITWITHRECOIL, STRINGID_PKMNCRASHED, 0xFFFF + STRINGID_PKMNHITWITHRECOIL, STRINGID_PKMNCRASHED, TABLE_END }; // code @@ -235,9 +570,9 @@ void BattleTv_SetDataBasedOnString(u16 stringId) moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, gBattleMsgDataPtr->currentMove); - if (moveSlot >= 4 && sub_817E0B8(stringId) && stringId > BATTLESTRINGS_ID_ADDER) + if (moveSlot >= MAX_MON_MOVES && IsNotSpecialBattleString(stringId) && stringId > BATTLESTRINGS_ID_ADDER) { - tvPtr->side[atkSide].faintCause = 15; + tvPtr->side[atkSide].faintCause = FNT_OTHER; return; } @@ -252,17 +587,17 @@ void BattleTv_SetDataBasedOnString(u16 stringId) switch (stringId) { case STRINGID_ITDOESNTAFFECT: - AddMovePoints(1, moveSlot, 2, 0); + AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 2, 0); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) TrySetBattleSeminarShow(); break; case STRINGID_NOTVERYEFFECTIVE: - AddMovePoints(1, moveSlot, 1, 0); + AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 1, 0); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && GetMonData(defMon, MON_DATA_HP, NULL) != 0) TrySetBattleSeminarShow(); break; case STRINGID_SUPEREFFECTIVE: - AddMovePoints(1, moveSlot, 0, 0); + AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 0, 0); break; case STRINGID_PKMNFORESAWATTACK: tvPtr->side[atkSide].futureSightMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -279,12 +614,12 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNPERISHCOUNTFELL: if (*perishCount == 0) - tvPtr->side[atkSide].faintCause = 10; + tvPtr->side[atkSide].faintCause = FNT_PERISH_SONG; break; case STRINGID_PKMNWISHCAMETRUE: if (tvPtr->side[defSide].wishMonId != 0) { - AddMovePoints(2, 3, defSide, + AddMovePoints(PTS_SET_UP, 3, defSide, (tvPtr->side[defSide].wishMonId - 1) * 4 + tvPtr->side[defSide].wishMoveSlot); } break; @@ -295,7 +630,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) case STRINGID_PKMNLOSTPPGRUDGE: if (tvPtr->side[defSide].grudgeMonId != 0) { - AddMovePoints(2, 4, defSide, + AddMovePoints(PTS_SET_UP, 4, defSide, (tvPtr->side[defSide].grudgeMonId - 1) * 4 + tvPtr->side[defSide].grudgeMoveSlot); } break; @@ -305,7 +640,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNTOOKFOE: if (tvPtr->side[defSide].destinyBondMonId != 0) - tvPtr->side[atkSide].faintCause = 11; + tvPtr->side[atkSide].faintCause = FNT_DESTINY_BOND; break; case STRINGID_PKMNPLANTEDROOTS: tvPtr->pos[atkSide][atkFlank].ingrainMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -314,14 +649,14 @@ void BattleTv_SetDataBasedOnString(u16 stringId) case STRINGID_PKMNABSORBEDNUTRIENTS: if (tvPtr->pos[atkSide][atkFlank].ingrainMonId != 0) { - AddMovePoints(2, 6, atkSide, + AddMovePoints(PTS_SET_UP, 6, atkSide, (tvPtr->pos[atkSide][atkFlank].ingrainMonId - 1) * 4 + tvPtr->pos[atkSide][atkFlank].ingrainMoveSlot); } break; case STRINGID_PKMNANCHOREDITSELF: if (tvPtr->pos[defSide][defFlank].ingrainMonId != 0) { - AddMovePoints(2, 6, defSide, + AddMovePoints(PTS_SET_UP, 6, defSide, (tvPtr->pos[defSide][defFlank].ingrainMonId - 1) * 4 + tvPtr->pos[defSide][defFlank].ingrainMoveSlot); } break; @@ -329,44 +664,44 @@ void BattleTv_SetDataBasedOnString(u16 stringId) gBattleStruct->anyMonHasTransformed = TRUE; break; case STRINGID_CRITICALHIT: - AddMovePoints(0x12, moveSlot, 0, 0); + AddMovePoints(PTS_CRITICAL_HIT, moveSlot, 0, 0); break; - case STRINGID_PKMNSSTATCHANGED: + case STRINGID_ATTACKERSSTATROSE: if (gBattleTextBuff1[2] != 0) { if (*statStringId == STRINGID_STATSHARPLY) - AddMovePoints(0x17, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_INCREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else - AddMovePoints(0x16, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_INCREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); } break; - case STRINGID_PKMNSSTATCHANGED2: + case STRINGID_DEFENDERSSTATROSE: if (gBattleTextBuff1[2] != 0) { if (gBattlerAttacker == gBattlerTarget) { if (*statStringId == STRINGID_STATSHARPLY) - AddMovePoints(0x17, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_INCREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else - AddMovePoints(0x16, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_INCREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); } else { - AddMovePoints(0x1B, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_INCREASE_NOT_SELF, moveSlot, gBattleTextBuff1[2] - 1, 0); } } break; - case STRINGID_PKMNSSTATCHANGED3: + case STRINGID_ATTACKERSSTATFELL: if (gBattleTextBuff1[2] != 0) - AddMovePoints(0x18, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_DECREASE_SELF, moveSlot, gBattleTextBuff1[2] - 1, 0); break; - case STRINGID_PKMNSSTATCHANGED4: + case STRINGID_DEFENDERSSTATFELL: if (gBattleTextBuff1[2] != 0) { if (*statStringId == STRINGID_STATHARSHLY) - AddMovePoints(0x1A, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_DECREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else - AddMovePoints(0x19, moveSlot, gBattleTextBuff1[2] - 1, 0); + AddMovePoints(PTS_STAT_DECREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); } break; case STRINGID_PKMNLAIDCURSE: @@ -377,8 +712,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) if (GetMonData(atkMon, MON_DATA_HP, NULL) && tvPtr->pos[atkSide][atkFlank].curseMonId != 0) { - AddMovePoints(8, 0, tvPtr->pos[atkSide][atkFlank].curseMonId - 1, tvPtr->pos[atkSide][atkFlank].curseMoveSlot); - tvPtr->side[atkSide].faintCause = 1; + AddMovePoints(PTS_STATUS_DMG, 0, tvPtr->pos[atkSide][atkFlank].curseMonId - 1, tvPtr->pos[atkSide][atkFlank].curseMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_CURSE; tvPtr->side[atkSide].faintCauseMonId = atkFlank; } break; @@ -389,8 +724,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) case STRINGID_PKMNSAPPEDBYLEECHSEED: if (tvPtr->pos[atkSide][atkFlank].leechSeedMonId != 0) { - AddMovePoints(8, 1, tvPtr->pos[atkSide][atkFlank].leechSeedMonId - 1, tvPtr->pos[atkSide][atkFlank].leechSeedMoveSlot); - tvPtr->side[atkSide].faintCause = 2; + AddMovePoints(PTS_STATUS_DMG, 1, tvPtr->pos[atkSide][atkFlank].leechSeedMonId - 1, tvPtr->pos[atkSide][atkFlank].leechSeedMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_LEECH_SEED; tvPtr->side[atkSide].faintCauseMonId = atkFlank; } break; @@ -402,8 +737,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0 && tvPtr->pos[atkSide][atkFlank].nightmareMonId != 0) { - AddMovePoints(8, 5, tvPtr->pos[atkSide][atkFlank].nightmareMonId - 1, tvPtr->pos[atkSide][atkFlank].nightmareMoveSlot); - tvPtr->side[atkSide].faintCause = 5; + AddMovePoints(PTS_STATUS_DMG, 5, tvPtr->pos[atkSide][atkFlank].nightmareMonId - 1, tvPtr->pos[atkSide][atkFlank].nightmareMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_NIGHTMARE; tvPtr->side[atkSide].faintCauseMonId = atkFlank; } break; @@ -419,8 +754,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0 && tvPtr->pos[atkSide][atkFlank].wrapMonId != 0) { - AddMovePoints(8, 6, tvPtr->pos[atkSide][atkFlank].wrapMonId - 1, tvPtr->pos[atkSide][atkFlank].wrapMoveSlot); - tvPtr->side[atkSide].faintCause = 6; + AddMovePoints(PTS_STATUS_DMG, 6, tvPtr->pos[atkSide][atkFlank].wrapMonId - 1, tvPtr->pos[atkSide][atkFlank].wrapMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_WRAP; tvPtr->side[atkSide].faintCauseMonId = atkFlank; } break; @@ -432,8 +767,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0) { if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMonId != 0) - AddMovePoints(8, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMoveSlot); - tvPtr->side[atkSide].faintCause = 4; + AddMovePoints(PTS_STATUS_DMG, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].brnMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_BURN; tvPtr->side[atkSide].faintCauseMonId = gBattlerPartyIndexes[gBattlerAttacker]; } break; @@ -449,10 +784,10 @@ void BattleTv_SetDataBasedOnString(u16 stringId) if (GetMonData(atkMon, MON_DATA_HP, NULL) != 0) { if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMonId != 0) - AddMovePoints(8, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMoveSlot); + AddMovePoints(PTS_STATUS_DMG, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].psnMoveSlot); if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMonId != 0) - AddMovePoints(8, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMoveSlot); - tvPtr->side[atkSide].faintCause = 3; + AddMovePoints(PTS_STATUS_DMG, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].badPsnMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_POISON; tvPtr->side[atkSide].faintCauseMonId = gBattlerPartyIndexes[gBattlerAttacker]; } break; @@ -462,7 +797,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNIMMOBILIZEDBYLOVE: if (tvPtr->pos[atkSide][atkFlank].attractMonId != 0) - AddMovePoints(9, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot); + AddMovePoints(PTS_STATUS, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot); break; case STRINGID_PKMNWASPARALYZED: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].prlzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -470,7 +805,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNISPARALYZED: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId != 0) - AddMovePoints(9, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot); + AddMovePoints(PTS_STATUS, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot); break; case STRINGID_PKMNFELLASLEEP: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].slpMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -480,7 +815,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId != 0 && gBattleMsgDataPtr->currentMove != MOVE_SNORE && gBattleMsgDataPtr->currentMove != MOVE_SLEEP_TALK) - AddMovePoints(9, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot); + AddMovePoints(PTS_STATUS, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot); break; case STRINGID_PKMNWASFROZEN: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].frzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -488,7 +823,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNISFROZEN: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId != 0) - AddMovePoints(9, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot); + AddMovePoints(PTS_STATUS, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot); break; case STRINGID_PKMNWASCONFUSED: tvPtr->pos[effSide][effFlank].confusionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -496,8 +831,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_ITHURTCONFUSION: if (tvPtr->pos[atkSide][atkFlank].confusionMonId != 0) - AddMovePoints(9, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot); - tvPtr->side[atkSide].faintCause = 12; + AddMovePoints(PTS_STATUS, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot); + tvPtr->side[atkSide].faintCause = FNT_CONFUSION; break; case STRINGID_SPIKESSCATTERED: tvPtr->side[defSide].spikesMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -506,8 +841,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) case STRINGID_PKMNHURTBYSPIKES: if (tvPtr->side[scriptingSide].spikesMonId != 0) { - AddMovePoints(10, scriptingSide ^ BIT_SIDE, tvPtr->side[scriptingSide].spikesMonId - 1, tvPtr->side[scriptingSide].spikesMoveSlot); - tvPtr->side[scriptingSide].faintCause = 7; + AddMovePoints(PTS_SPIKES, scriptingSide ^ BIT_SIDE, tvPtr->side[scriptingSide].spikesMonId - 1, tvPtr->side[scriptingSide].spikesMoveSlot); + tvPtr->side[scriptingSide].faintCause = FNT_SPIKES; } break; case STRINGID_PKMNBLEWAWAYSPIKES: @@ -582,7 +917,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNUSEDSAFEGUARD: if (tvPtr->side[defSide].safeguardMonId != 0) - AddMovePoints(15, 0, tvPtr->side[defSide].safeguardMonId - 1, tvPtr->side[defSide].safeguardMoveSlot); + AddMovePoints(PTS_SAFEGUARD, 0, tvPtr->side[defSide].safeguardMonId - 1, tvPtr->side[defSide].safeguardMoveSlot); break; case STRINGID_PKMNSAFEGUARDEXPIRED: tvPtr->side[atkSide].safeguardMonId = 0; @@ -594,40 +929,40 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNPROTECTEDBYMIST: if (tvPtr->side[defSide].mistMonId != 0) - AddMovePoints(16, 0, tvPtr->side[defSide].mistMonId - 1, tvPtr->side[defSide].mistMoveSlot); + AddMovePoints(PTS_MIST, 0, tvPtr->side[defSide].mistMonId - 1, tvPtr->side[defSide].mistMoveSlot); break; case STRINGID_THEWALLSHATTERED: tvPtr->side[defSide].reflectMonId = 0; tvPtr->side[defSide].reflectMoveSlot = 0; tvPtr->side[defSide].lightScreenMonId = 0; tvPtr->side[defSide].lightScreenMoveSlot = 0; - AddMovePoints(17, 0, gBattlerPartyIndexes[gBattlerAttacker], moveSlot); + AddMovePoints(PTS_BREAK_WALL, 0, gBattlerPartyIndexes[gBattlerAttacker], moveSlot); break; case STRINGID_PKMNFLINCHED: if (tvPtr->pos[atkSide][0].attackedByMonId != 0) - AddMovePoints(21, 0, tvPtr->pos[atkSide][0].attackedByMonId - 1, tvPtr->pos[atkSide][0].attackedByMoveSlot); + AddMovePoints(PTS_FLINCHED, 0, tvPtr->pos[atkSide][0].attackedByMonId - 1, tvPtr->pos[atkSide][0].attackedByMoveSlot); if (tvPtr->pos[atkSide][1].attackedByMonId != 0) - AddMovePoints(21, 0, tvPtr->pos[atkSide][1].attackedByMonId - 1, tvPtr->pos[atkSide][1].attackedByMoveSlot); + AddMovePoints(PTS_FLINCHED, 0, tvPtr->pos[atkSide][1].attackedByMonId - 1, tvPtr->pos[atkSide][1].attackedByMoveSlot); break; case STRINGID_PKMNCRASHED: case STRINGID_PKMNHITWITHRECOIL: - tvPtr->side[atkSide].faintCause = 14; + tvPtr->side[atkSide].faintCause = FNT_RECOIL; break; } } -static bool8 sub_817E0B8(u16 stringId) +static bool8 IsNotSpecialBattleString(u16 stringId) { s32 i = 0; do { - if (sUnknown_0860A8A4[i] == stringId) + if (sSpecialBattleStrings[i] == stringId) break; i++; - } while (sUnknown_0860A8A4[i] != 0xFFFF); + } while (sSpecialBattleStrings[i] != TABLE_END); - if (sUnknown_0860A8A4[i] == 0xFFFF) + if (sSpecialBattleStrings[i] == TABLE_END) return TRUE; else return FALSE; @@ -648,19 +983,19 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc defSide = GetBattlerSide(gBattlerTarget); moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, move); - if (moveSlot >= 4) + if (moveSlot >= MAX_MON_MOVES) { - tvPtr->side[atkSide].faintCause = 15; + tvPtr->side[atkSide].faintCause = FNT_OTHER; return; } tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->pos[defSide][GetBattlerPosition(gBattlerAttacker) / 2].attackedByMoveSlot = moveSlot; tvPtr->side[atkSide].usedMoveSlot = moveSlot; - AddMovePoints(0, moveSlot, gBattleMoves[move].effect, 0); + AddMovePoints(PTS_MOVE_EFFECT, moveSlot, gBattleMoves[move].effect, 0); AddPointsBasedOnWeather(weatherFlags, move, moveSlot); if (disableStructPtr->chargeTimer != 0) - AddMovePoints(7, move, moveSlot, 0); + AddMovePoints(PTS_ELECTRIC, move, moveSlot, 0); if (move == MOVE_WISH) { @@ -671,14 +1006,14 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc { tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot = moveSlot; - tvPtr->side[atkSide ^ BIT_SIDE].faintCause = 13; - tvPtr->side[atkSide ^ BIT_SIDE].explosion = 1; + tvPtr->side[atkSide ^ BIT_SIDE].faintCause = FNT_EXPLOSION; + tvPtr->side[atkSide ^ BIT_SIDE].explosion = TRUE; } - AddMovePoints(13, gBattleMoves[move].type, gBattleMoves[move].power, 0); - AddMovePoints(14, gBattleMoves[move].type, gBattleMoves[move].power, 0); - AddMovePoints(11, gBattleMoves[move].type, 0, 0); - AddMovePoints(12, gBattleMoves[move].type, 0, 0); + AddMovePoints(PTS_REFLECT, gBattleMoves[move].type, gBattleMoves[move].power, 0); + AddMovePoints(PTS_LIGHT_SCREEN, gBattleMoves[move].type, gBattleMoves[move].power, 0); + AddMovePoints(PTS_WATER_SPORT, gBattleMoves[move].type, 0, 0); + AddMovePoints(PTS_MUD_SPORT, gBattleMoves[move].type, 0, 0); } void BattleTv_SetDataBasedOnAnimation(u8 animationId) @@ -696,17 +1031,17 @@ void BattleTv_SetDataBasedOnAnimation(u8 animationId) case B_ANIM_FUTURE_SIGHT_HIT: if (tvPtr->side[atkSide].futureSightMonId != 0) { - AddMovePoints(2, 0, atkSide, + AddMovePoints(PTS_SET_UP, 0, atkSide, (tvPtr->side[atkSide].futureSightMonId - 1) * 4 + tvPtr->side[atkSide].futureSightMoveSlot); - tvPtr->side[atkSide].faintCause = 8; + tvPtr->side[atkSide].faintCause = FNT_FUTURE_SIGHT; } break; case B_ANIM_DOOM_DESIRE_HIT: if (tvPtr->side[atkSide].doomDesireMonId != 0) { - AddMovePoints(2, 1, atkSide, + AddMovePoints(PTS_SET_UP, 1, atkSide, (tvPtr->side[atkSide].doomDesireMonId - 1) * 4 + tvPtr->side[atkSide].doomDesireMoveSlot); - tvPtr->side[atkSide].faintCause = 9; + tvPtr->side[atkSide].faintCause = FNT_DOOM_DESIRE; } break; } @@ -819,49 +1154,67 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) switch (caseId) { - case 0: - case 1: - case 18: - case 22 ... 27: + case PTS_MOVE_EFFECT: + case PTS_EFFECTIVENESS: + case PTS_CRITICAL_HIT: + case PTS_STAT_INCREASE_1: + case PTS_STAT_INCREASE_2: + case PTS_STAT_DECREASE_SELF: + case PTS_STAT_DECREASE_1: + case PTS_STAT_DECREASE_2: + case PTS_STAT_INCREASE_NOT_SELF: movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += sPointsArray[caseId][arg2]; break; - case 3 ... 7: + +#define move arg1 + case PTS_RAIN: + case PTS_SUN: + case PTS_SANDSTORM: + case PTS_HAIL: + case PTS_ELECTRIC: i = 0; ptr = sPointsArray[caseId]; do { - if (arg1 == ptr[i]) + if (move == ptr[i]) { movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += ptr[i+1]; break; } i += 2; - } while (ptr[i] != 0xFFFF); + } while (ptr[i] != TABLE_END); break; - case 19: - tvPtr->side[arg2 ^ 1].faintCause = 0; +#undef move + + case PTS_FAINT: + tvPtr->side[arg2 ^ 1].faintCause = FNT_NONE; movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1]; break; - case 20: - tvPtr->side[arg2].faintCause = 0; - case 2: + case PTS_FAINT_SET_UP: + tvPtr->side[arg2].faintCause = FNT_NONE; + // fallthrough + case PTS_SET_UP: movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1]; break; - case 17: + case PTS_BREAK_WALL: movePoints->points[atkSide][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; break; - case 8: - case 9: - case 15: - case 16: - case 21: + case PTS_STATUS_DMG: + case PTS_STATUS: + case PTS_SAFEGUARD: + case PTS_MIST: + case PTS_FLINCHED: movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; break; - case 10: + case PTS_SPIKES: movePoints->points[arg1][arg2 * 4 + arg3] += sPointsArray[caseId][0]; break; - case 11: - if (tvPtr->pos[defSide][0].waterSportMonId != -(tvPtr->pos[defSide][1].waterSportMonId) && arg1 == 10) + +#define type arg1 +#define power arg2 + case PTS_WATER_SPORT: + // If used fire move during Water Sport + if (tvPtr->pos[defSide][0].waterSportMonId != -(tvPtr->pos[defSide][1].waterSportMonId) && type == TYPE_FIRE) { if (tvPtr->pos[defSide][0].waterSportMonId != 0) { @@ -875,8 +1228,9 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) } } break; - case 12: - if (tvPtr->pos[defSide][0].mudSportMonId != -(tvPtr->pos[defSide][1].mudSportMonId) && arg1 == 13) + case PTS_MUD_SPORT: + // If used Electric move during Mud Sport + if (tvPtr->pos[defSide][0].mudSportMonId != -(tvPtr->pos[defSide][1].mudSportMonId) && type == TYPE_ELECTRIC) { if (tvPtr->pos[defSide][0].mudSportMonId != 0) { @@ -890,20 +1244,24 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) } } break; - case 13: - if (arg1 <= 8 && arg2 != 0 && tvPtr->side[defSide].reflectMonId != 0) + case PTS_REFLECT: + // If hit Reflect with damaging physical move + if (type < TYPE_MYSTERY && power != 0 && tvPtr->side[defSide].reflectMonId != 0) { u32 id = (tvPtr->side[defSide].reflectMonId - 1) * 4; movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += sPointsArray[caseId][0]; } break; - case 14: - if (arg1 > 8 && arg2 != 0 && tvPtr->side[defSide].lightScreenMonId != 0) + case PTS_LIGHT_SCREEN: + // If hit Light Screen with damaging special move + if (type >= TYPE_MYSTERY && power != 0 && tvPtr->side[defSide].lightScreenMonId != 0) { u32 id = (tvPtr->side[defSide].lightScreenMonId - 1) * 4; movePoints->points[defSide][id + tvPtr->side[defSide].lightScreenMoveSlot] += sPointsArray[caseId][0]; } break; +#undef type +#undef power } } @@ -915,144 +1273,144 @@ static void AddPointsOnFainting(bool8 targetFainted) u32 atkArrId = tvPtr->side[atkSide].faintCauseMonId; s32 i; - if (tvPtr->side[atkSide].faintCause != 0) + if (tvPtr->side[atkSide].faintCause != FNT_NONE) { switch (tvPtr->side[atkSide].faintCause) { - case 1: + case FNT_CURSE: if (tvPtr->pos[atkSide][atkArrId].curseMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->pos[atkSide][atkArrId].curseMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].curseMoveSlot); } break; - case 2: + case FNT_LEECH_SEED: if (tvPtr->pos[atkSide][atkArrId].leechSeedMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->pos[atkSide][atkArrId].leechSeedMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].leechSeedMoveSlot); } break; - case 3: + case FNT_POISON: if (tvPtr->mon[atkSide][atkArrId].psnMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->mon[atkSide][atkArrId].psnMonId - 1) * 4 + tvPtr->mon[atkSide][atkArrId].psnMoveSlot); } if (tvPtr->mon[atkSide][atkArrId].badPsnMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->mon[atkSide][atkArrId].badPsnMonId - 1) * 4 + tvPtr->mon[atkSide][atkArrId].badPsnMoveSlot); } break; - case 4: + case FNT_BURN: if (tvPtr->mon[atkSide][atkArrId].brnMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->mon[atkSide][atkArrId].brnMonId - 1) * 4 + tvPtr->mon[atkSide][atkArrId].brnMoveSlot); } break; - case 5: + case FNT_NIGHTMARE: if (tvPtr->pos[atkSide][atkArrId].nightmareMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->pos[atkSide][atkArrId].nightmareMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].nightmareMoveSlot); } break; - case 6: + case FNT_WRAP: if (tvPtr->pos[atkSide][atkArrId].wrapMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->pos[atkSide][atkArrId].wrapMonId - 1) * 4 + tvPtr->pos[atkSide][atkArrId].wrapMoveSlot); } break; - case 7: + case FNT_SPIKES: if (tvPtr->side[atkSide].spikesMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->side[atkSide].spikesMonId - 1) * 4 + tvPtr->side[atkSide].spikesMoveSlot); } break; - case 8: + case FNT_FUTURE_SIGHT: if (tvPtr->side[atkSide].futureSightMonId != 0) { - AddMovePoints(20, 0, atkSide, + AddMovePoints(PTS_FAINT_SET_UP, 0, atkSide, (tvPtr->side[atkSide].futureSightMonId - 1) * 4 + tvPtr->side[atkSide].futureSightMoveSlot); } break; - case 9: + case FNT_DOOM_DESIRE: if (tvPtr->side[atkSide].doomDesireMonId != 0) { - AddMovePoints(20, 0, atkSide, + AddMovePoints(PTS_FAINT_SET_UP, 0, atkSide, (tvPtr->side[atkSide].doomDesireMonId - 1) * 4 + tvPtr->side[atkSide].doomDesireMoveSlot); } break; - case 10: + case FNT_PERISH_SONG: if (tvPtr->side[atkSide].perishSong && tvPtr->side[atkSide].perishSongMonId - 1 != gBattlerPartyIndexes[gBattlerAttacker]) { - AddMovePoints(19, 0, atkSide, + AddMovePoints(PTS_FAINT, 0, atkSide, (tvPtr->side[atkSide].perishSongMonId - 1) * 4 + tvPtr->side[atkSide].perishSongMoveSlot); } if (tvPtr->side[atkSide ^ BIT_SIDE].perishSong) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->side[atkSide ^ BIT_SIDE].perishSongMonId - 1) * 4 + tvPtr->side[atkSide ^ BIT_SIDE].perishSongMoveSlot); } break; - case 11: + case FNT_DESTINY_BOND: if (tvPtr->side[atkSide ^ BIT_SIDE].destinyBondMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->side[atkSide ^ BIT_SIDE].destinyBondMonId - 1) * 4 + tvPtr->side[atkSide ^ BIT_SIDE].destinyBondMoveSlot); } break; - case 12: + case FNT_CONFUSION: for (i = 0; i < 2; i++) { if (tvPtr->pos[atkSide][i].confusionMonId != 0) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->pos[atkSide][i].confusionMonId - 1) * 4 + tvPtr->pos[atkSide][i].confusionMoveSlot); } } break; - case 13: + case FNT_EXPLOSION: if (tvPtr->side[atkSide].explosion) { - AddMovePoints(19, 0, atkSide, + AddMovePoints(PTS_FAINT, 0, atkSide, (tvPtr->side[atkSide].explosionMonId - 1) * 4 + tvPtr->side[atkSide].explosionMoveSlot); } if (tvPtr->side[atkSide ^ BIT_SIDE].explosion) { - AddMovePoints(19, 0, atkSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, atkSide ^ BIT_SIDE, (tvPtr->side[atkSide ^ BIT_SIDE].explosionMonId - 1) * 4 + tvPtr->side[atkSide ^ BIT_SIDE].explosionMoveSlot); } break; - case 14: + case FNT_RECOIL: if (targetFainted == TRUE) { - AddMovePoints(20, 0, atkSide, + AddMovePoints(PTS_FAINT_SET_UP, 0, atkSide, (gBattlerPartyIndexes[gBattlerAttacker]) * 4 + tvPtr->side[atkSide].usedMoveSlot); } break; - case 15: + case FNT_OTHER: break; } } else { - if (tvPtr->side[defSide].faintCause == 7) + if (tvPtr->side[defSide].faintCause == FNT_SPIKES) { if (tvPtr->side[defSide].spikesMonId != 0) { - AddMovePoints(19, 0, defSide ^ BIT_SIDE, + AddMovePoints(PTS_FAINT, 0, defSide ^ BIT_SIDE, (tvPtr->side[defSide].spikesMonId - 1) * 4 + tvPtr->side[defSide].spikesMoveSlot); } } else { - AddMovePoints(20, 0, atkSide, + AddMovePoints(PTS_FAINT_SET_UP, 0, atkSide, (gBattlerPartyIndexes[gBattlerAttacker]) * 4 + tvPtr->side[atkSide].usedMoveSlot); } } @@ -1061,11 +1419,11 @@ static void AddPointsOnFainting(bool8 targetFainted) static void TrySetBattleSeminarShow(void) { s32 i; - s32 dmgByMove[4]; + s32 dmgByMove[MAX_MON_MOVES]; u16 powerOverride; u16 currMoveSaved; - if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return; else if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT) return; @@ -1087,9 +1445,9 @@ static void TrySetBattleSeminarShow(void) if (currMoveSaved == sVariableDmgMoves[i]) break; i++; - } while (sVariableDmgMoves[i] != 0xFFFF); + } while (sVariableDmgMoves[i] != TABLE_END); - if (sVariableDmgMoves[i] != 0xFFFF) + if (sVariableDmgMoves[i] != TABLE_END) return; dmgByMove[gMoveSelectionCursor[gBattlerAttacker]] = gBattleMoveDamage; @@ -1138,7 +1496,7 @@ static void TrySetBattleSeminarShow(void) opponentSpecies = GetMonData(&gEnemyParty [gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES, NULL); playerSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_SPECIES, NULL); - sub_80EE35C(opponentSpecies, playerSpecies, gMoveSelectionCursor[gBattlerAttacker], gBattleMons[gBattlerAttacker].moves, gBattleMons[gBattlerAttacker].moves[bestMoveId]); + TryPutBattleSeminarOnAir(opponentSpecies, playerSpecies, gMoveSelectionCursor[gBattlerAttacker], gBattleMons[gBattlerAttacker].moves, gBattleMons[gBattlerAttacker].moves[bestMoveId]); break; } } @@ -1162,9 +1520,9 @@ static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride) if (moveId == sVariableDmgMoves[i]) break; i++; - } while (sVariableDmgMoves[i] != 0xFFFF); + } while (sVariableDmgMoves[i] != TABLE_END); - if (sVariableDmgMoves[i] != 0xFFFF) + if (sVariableDmgMoves[i] != TABLE_END) { *dmg = 0; return FALSE; @@ -1193,8 +1551,8 @@ void BattleTv_ClearExplosionFaintCause(void) { struct BattleTv *tvPtr = &gBattleStruct->tv; - tvPtr->side[B_SIDE_PLAYER].faintCause = 0; - tvPtr->side[B_SIDE_OPPONENT].faintCause = 0; + tvPtr->side[B_SIDE_PLAYER].faintCause = FNT_NONE; + tvPtr->side[B_SIDE_OPPONENT].faintCause = FNT_NONE; tvPtr->side[B_SIDE_PLAYER].faintCauseMonId = 0; tvPtr->side[B_SIDE_OPPONENT].faintCauseMonId = 0; @@ -1205,8 +1563,8 @@ void BattleTv_ClearExplosionFaintCause(void) tvPtr->side[B_SIDE_PLAYER].explosionMoveSlot = 0; tvPtr->side[B_SIDE_OPPONENT].explosionMoveSlot = 0; - tvPtr->side[B_SIDE_PLAYER].explosion = 0; - tvPtr->side[B_SIDE_OPPONENT].explosion = 0; + tvPtr->side[B_SIDE_PLAYER].explosion = FALSE; + tvPtr->side[B_SIDE_OPPONENT].explosion = FALSE; } } @@ -1236,11 +1594,11 @@ u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId) static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot) { if (weatherFlags & WEATHER_RAIN_ANY) - AddMovePoints(3, moveId, moveSlot, 0); + AddMovePoints(PTS_RAIN, moveId, moveSlot, 0); else if (weatherFlags & WEATHER_SUN_ANY) - AddMovePoints(4, moveId, moveSlot, 0); + AddMovePoints(PTS_SUN, moveId, moveSlot, 0); else if (weatherFlags & WEATHER_SANDSTORM_ANY) - AddMovePoints(5, moveId, moveSlot, 0); + AddMovePoints(PTS_SANDSTORM, moveId, moveSlot, 0); else if (weatherFlags & WEATHER_HAIL_ANY) - AddMovePoints(6, moveId, moveSlot, 0); + AddMovePoints(PTS_HAIL, moveId, moveSlot, 0); } diff --git a/src/battle_util.c b/src/battle_util.c index e929de091..cbcd445b7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -29,7 +29,6 @@ #include "constants/battle_move_effects.h" #include "constants/battle_script_commands.h" #include "constants/battle_string_ids.h" -#include "constants/berry.h" #include "constants/hold_effects.h" #include "constants/items.h" #include "constants/moves.h" @@ -50,7 +49,29 @@ extern const u8 *const gBattlescriptsForRunningByItem[]; extern const u8 *const gBattlescriptsForUsingItem[]; extern const u8 *const gBattlescriptsForSafariActions[]; -static const u8 sPkblToEscapeFactor[][3] = {{0, 0, 0}, {3, 5, 0}, {2, 3, 0}, {1, 2, 0}, {1, 1, 0}}; +static const u8 sPkblToEscapeFactor[][3] = { + { + [B_MSG_MON_CURIOUS] = 0, + [B_MSG_MON_ENTHRALLED] = 0, + [B_MSG_MON_IGNORED] = 0 + },{ + [B_MSG_MON_CURIOUS] = 3, + [B_MSG_MON_ENTHRALLED] = 5, + [B_MSG_MON_IGNORED] = 0 + },{ + [B_MSG_MON_CURIOUS] = 2, + [B_MSG_MON_ENTHRALLED] = 3, + [B_MSG_MON_IGNORED] = 0 + },{ + [B_MSG_MON_CURIOUS] = 1, + [B_MSG_MON_ENTHRALLED] = 2, + [B_MSG_MON_IGNORED] = 0 + },{ + [B_MSG_MON_CURIOUS] = 1, + [B_MSG_MON_ENTHRALLED] = 1, + [B_MSG_MON_IGNORED] = 0 + } +}; static const u8 sGoNearCounterToCatchFactor[] = {4, 3, 2, 1}; static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4}; @@ -239,10 +260,9 @@ void HandleAction_UseMove(void) } } - // choose battlescript - if (gBattleTypeFlags & BATTLE_TYPE_PALACE - && gProtectStructs[gBattlerAttacker].palaceUnableToUseMove) + if (gBattleTypeFlags & BATTLE_TYPE_PALACE && gProtectStructs[gBattlerAttacker].palaceUnableToUseMove) { + // Battle Palace, select battle script for failure to use move if (gBattleMons[gBattlerAttacker].hp == 0) { gCurrentActionFuncId = B_ACTION_FINISHED; @@ -250,13 +270,13 @@ void HandleAction_UseMove(void) } else if (gPalaceSelectionBattleScripts[gBattlerAttacker] != NULL) { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_INCAPABLE_OF_POWER; gBattlescriptCurrInstr = gPalaceSelectionBattleScripts[gBattlerAttacker]; gPalaceSelectionBattleScripts[gBattlerAttacker] = NULL; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_INCAPABLE_OF_POWER; gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; } } @@ -319,26 +339,29 @@ void HandleAction_UseItem(void) case AI_ITEM_HEAL_HP: break; case AI_ITEM_CURE_CONDITION: - gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1) + gBattleCommunication[MULTISTRING_CHOOSER] = AI_HEAL_CONFUSION; + if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & (1 << AI_HEAL_CONFUSION)) { if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = AI_HEAL_SLEEP; } else { + // Check for other statuses, stopping at first (shouldn't be more than one) while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)) { *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; gBattleCommunication[MULTISTRING_CHOOSER]++; + // MULTISTRING_CHOOSER will be either AI_HEAL_PARALYSIS, AI_HEAL_FREEZE, + // AI_HEAL_BURN, AI_HEAL_POISON, or AI_HEAL_SLEEP } } break; case AI_ITEM_X_STAT: - gBattleCommunication[MULTISTRING_CHOOSER] = 4; - if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x80) + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_STAT_ROSE_ITEM; + if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & (1 << AI_DIRE_HIT)) { - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_USED_DIRE_HIT; } else { @@ -355,11 +378,20 @@ void HandleAction_UseItem(void) gBattleScripting.animArg2 = 0; } break; - case AI_ITEM_GUARD_SPECS: + case AI_ITEM_GUARD_SPEC: + // It seems probable that at some point there was a special message for + // an AI trainer using Guard Spec in a double battle. + // There isn't now however, and the assignment to 2 below goes out of + // bounds for gMistUsedStringIds and instead prints "{mon} is getting pumped" + // from the next table, gFocusEnergyUsedStringIds. + // In any case this isn't an issue in the retail version, as no trainers + // are ever given any Guard Spec to use. +#ifndef UBFIX if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) gBattleCommunication[MULTISTRING_CHOOSER] = 2; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; +#endif + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SET_MIST; break; } @@ -452,7 +484,7 @@ void HandleAction_Run(void) { gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) { gCurrentTurnActionNumber = gBattlersCount; @@ -480,7 +512,7 @@ void HandleAction_Run(void) if (!TryRunFromBattle(gBattlerAttacker)) // failed to run away { ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); - gBattleCommunication[MULTISTRING_CHOOSER] = 3; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_ESCAPE_2; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -489,7 +521,7 @@ void HandleAction_Run(void) { if (gBattleMons[gBattlerAttacker].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) { - gBattleCommunication[MULTISTRING_CHOOSER] = 4; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_ATTACKER_CANT_ESCAPE; gBattlescriptCurrInstr = BattleScript_PrintFailedToRunString; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } @@ -568,11 +600,11 @@ void HandleAction_GoNear(void) if (gBattleStruct->safariGoNearCounter < 3) { gBattleStruct->safariGoNearCounter++; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CREPT_CLOSER; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Can't get closer. + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CANT_GET_CLOSER; } gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; @@ -802,7 +834,7 @@ void MarkAllBattlersForControllerExec(void) // unused if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= gBitTable[i] << 0x1C; + gBattleControllerExecFlags |= gBitTable[i] << (32 - MAX_BATTLERS_COUNT); } else { @@ -814,19 +846,19 @@ void MarkAllBattlersForControllerExec(void) // unused void MarkBattlerForControllerExec(u8 battlerId) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleControllerExecFlags |= gBitTable[battlerId] << 0x1C; + gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT); else gBattleControllerExecFlags |= gBitTable[battlerId]; } -void sub_803F850(u8 arg0) +void MarkBattlerReceivedLinkData(u8 battlerId) { s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) - gBattleControllerExecFlags |= gBitTable[arg0] << (i << 2); + gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2); - gBattleControllerExecFlags &= ~(0x10000000 << arg0); + gBattleControllerExecFlags &= ~(0x10000000 << battlerId); } void CancelMultiTurnMoves(u8 battler) @@ -1296,20 +1328,20 @@ u8 DoFieldEndTurnEffects(void) { gBattleWeather &= ~WEATHER_RAIN_TEMPORARY; gBattleWeather &= ~WEATHER_RAIN_DOWNPOUR; - gBattleCommunication[MULTISTRING_CHOOSER] = 2; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_STOPPED; } else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; else - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; } else if (gBattleWeather & WEATHER_RAIN_DOWNPOUR) { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOWNPOUR_CONTINUES; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_RAIN_CONTINUES; } BattleScriptExecute(BattleScript_RainContinuesOrEnds); @@ -1331,7 +1363,7 @@ u8 DoFieldEndTurnEffects(void) } gBattleScripting.animArg1 = B_ANIM_SANDSTORM_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SANDSTORM; BattleScriptExecute(gBattlescriptCurrInstr); effect++; } @@ -1369,7 +1401,7 @@ u8 DoFieldEndTurnEffects(void) } gBattleScripting.animArg1 = B_ANIM_HAIL_CONTINUES; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_HAIL; BattleScriptExecute(gBattlescriptCurrInstr); effect++; } @@ -1598,16 +1630,16 @@ u8 DoBattlerEndTurnEffects(void) if (WasUnableToUseMove(gActiveBattler)) { CancelMultiTurnMoves(gActiveBattler); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; } else if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_CONTINUES; gBattleMons[gActiveBattler].status2 |= STATUS2_MULTIPLETURNS; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_UPROAR_ENDS; CancelMultiTurnMoves(gActiveBattler); } BattleScriptExecute(BattleScript_PrintUproarOverTurns); @@ -1750,9 +1782,9 @@ bool8 HandleWishPerishSongOnTurnEnd(void) && gBattleMons[gActiveBattler].hp != 0) { if (gWishFutureKnock.futureSightMove[gActiveBattler] == MOVE_FUTURE_SIGHT) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FUTURE_SIGHT; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DOOM_DESIRE; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gWishFutureKnock.futureSightMove[gActiveBattler]); @@ -1851,7 +1883,7 @@ bool8 HandleFaintedMonActions(void) gBattleStruct->faintedActionsState++; for (i = 0; i < gBattlersCount; i++) { - if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, 6, 6)) + if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, PARTY_SIZE, PARTY_SIZE)) gAbsentBattlerFlags &= ~(gBitTable[i]); } // fall through @@ -1963,7 +1995,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_SLEEP); gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } @@ -1991,7 +2023,7 @@ u8 AtkCanceller_UnableToUseMove(void) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_NIGHTMARE); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } @@ -2020,7 +2052,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } effect = 2; } @@ -2031,7 +2063,7 @@ u8 AtkCanceller_UnableToUseMove(void) { CancelMultiTurnMoves(gBattlerAttacker); gHitMarker |= HITMARKER_UNABLE_TO_USE_MOVE; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_LOAFING; gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; gMoveResultFlags |= MOVE_RESULT_MISSED; effect = 1; @@ -2104,12 +2136,14 @@ u8 AtkCanceller_UnableToUseMove(void) { if (Random() & 1) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + // The MULTISTRING_CHOOSER is used here as a bool to signal + // to BattleScript_MoveUsedIsConfused whether or not damage was taken + gBattleCommunication[MULTISTRING_CHOOSER] = FALSE; BattleScriptPushCursor(); } else // confusion dmg { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = TRUE; gBattlerTarget = gBattlerAttacker; gBattleMoveDamage = CalculateBaseDamage(&gBattleMons[gBattlerAttacker], &gBattleMons[gBattlerAttacker], MOVE_POUND, 0, 40, 0, gBattlerAttacker, gBattlerAttacker); gProtectStructs[gBattlerAttacker].confusionSelfDmg = 1; @@ -2196,7 +2230,7 @@ u8 AtkCanceller_UnableToUseMove(void) gBattleMons[gBattlerAttacker].status1 &= ~(STATUS1_FREEZE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED_BY_MOVE; } effect = 2; } @@ -2245,7 +2279,7 @@ bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gBattleTypeFlags & BATTLE_TYPE_x800000) + if (gBattleTypeFlags & BATTLE_TYPE_TOWER_LINK_MULTI) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) { @@ -2594,7 +2628,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattleMons[battler].statStages[STAT_SPEED] < MAX_STAT_STAGE && gDisableStructs[battler].isFirstTurn != 2) { gBattleMons[battler].statStages[STAT_SPEED]++; - gBattleScripting.animArg1 = 0x11; + gBattleScripting.animArg1 = 14 + STAT_SPEED; gBattleScripting.animArg2 = 0; BattleScriptPushCursorAndCallback(BattleScript_SpeedBoostActivates); gBattleScripting.battler = battler; @@ -2656,7 +2690,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA { if (!(gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE)) { - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_BOOST; if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_FlashFireBoost; else @@ -2667,7 +2701,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_FLASH_FIRE_NO_BOOST; if (gProtectStructs[gBattlerAttacker].notFirstStrike) gBattlescriptCurrInstr = BattleScript_FlashFireBoost; else @@ -3432,7 +3466,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gEffectBattler = battlerId; SET_STATCHANGER(STAT_ATK, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_ATK; + gBattleScripting.animArg1 = 14 + STAT_ATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3446,7 +3480,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gEffectBattler = battlerId; SET_STATCHANGER(STAT_DEF, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_DEF; + gBattleScripting.animArg1 = 14 + STAT_DEF; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3460,7 +3494,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gEffectBattler = battlerId; SET_STATCHANGER(STAT_SPEED, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPEED; + gBattleScripting.animArg1 = 14 + STAT_SPEED; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3474,7 +3508,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gEffectBattler = battlerId; SET_STATCHANGER(STAT_SPATK, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPATK; + gBattleScripting.animArg1 = 14 + STAT_SPATK; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3488,7 +3522,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gEffectBattler = battlerId; SET_STATCHANGER(STAT_SPDEF, 1, FALSE); - gBattleScripting.animArg1 = 0xE + STAT_SPDEF; + gBattleScripting.animArg1 = 14 + STAT_SPDEF; gBattleScripting.animArg2 = 0; BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); effect = ITEM_STATS_CHANGE; @@ -3623,9 +3657,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) i++; } if (!(i > 1)) - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; else - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; gBattleMons[battlerId].status1 = 0; gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); @@ -3638,7 +3672,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION); StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; effect = ITEM_EFFECT_OTHER; } break; @@ -3741,7 +3775,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleMons[battlerId].status2 &= ~(STATUS2_INFATUATION); StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_EFFECT_OTHER; } @@ -3777,7 +3811,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleMons[battlerId].status1 = 0; gBattleMons[battlerId].status2 &= ~(STATUS2_CONFUSION); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; effect = ITEM_STATUS_CHANGE; } @@ -3950,14 +3984,14 @@ u8 GetMoveTarget(u16 move, u8 setTarget) return targetBattler; } -static bool32 HasObedientBitSet(u8 battlerId) +static bool32 IsMonEventLegal(u8 battlerId) { if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) return TRUE; if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES, NULL) != SPECIES_MEW) return TRUE; - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_OBEDIENCE, NULL); + return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_EVENT_LEGAL, NULL); } u8 IsMonDisobedient(void) @@ -3966,12 +4000,12 @@ u8 IsMonDisobedient(void) s32 calc; u8 obedienceLevel = 0; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return 0; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_OPPONENT) return 0; - if (HasObedientBitSet(gBattlerAttacker)) // only if species is Mew or Deoxys + if (IsMonEventLegal(gBattlerAttacker)) // only false if illegal Mew or Deoxys { if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gBattlerAttacker) == 2) return 0; @@ -4017,7 +4051,9 @@ u8 IsMonDisobedient(void) calc = CheckMoveLimitations(gBattlerAttacker, gBitTable[gCurrMovePos], 0xFF); if (calc == 0xF) // all moves cannot be used { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; + // Randomly select, then print a disobedient string + // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE + gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } @@ -4025,7 +4061,7 @@ u8 IsMonDisobedient(void) { do { - gCurrMovePos = gChosenMovePos = Random() & 3; + gCurrMovePos = gChosenMovePos = Random() & (MAX_MON_MOVES - 1); } while (gBitTable[gCurrMovePos] & calc); gCalledMove = gBattleMons[gBattlerAttacker].moves[gCurrMovePos]; @@ -4066,7 +4102,9 @@ u8 IsMonDisobedient(void) } else { - gBattleCommunication[MULTISTRING_CHOOSER] = Random() & 3; + // Randomly select, then print a disobedient string + // B_MSG_LOAFING, B_MSG_WONT_OBEY, B_MSG_TURNED_AWAY, or B_MSG_PRETEND_NOT_NOTICE + gBattleCommunication[MULTISTRING_CHOOSER] = Random() & (NUM_LOAF_STRINGS - 1); gBattlescriptCurrInstr = BattleScript_MoveUsedLoafingAround; return 1; } diff --git a/src/battle_util2.c b/src/battle_util2.c index 6d51f51e7..def7302d3 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -10,6 +10,7 @@ #include "constants/abilities.h" #include "random.h" #include "battle_scripts.h" +#include "constants/battle_string_ids.h" void AllocateBattleResources(void) { @@ -136,7 +137,7 @@ u32 sub_805725C(u8 battlerId) gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } @@ -163,7 +164,7 @@ u32 sub_805725C(u8 battlerId) { gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); BattleScriptPushCursor(); - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; effect = 2; } @@ -183,7 +184,7 @@ u32 sub_805725C(u8 battlerId) gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; - gBattleCommunication[MULTISTRING_CHOOSER] = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; } effect = 2; } diff --git a/src/berry.c b/src/berry.c index 98264f37b..d56ec801c 100644 --- a/src/berry.c +++ b/src/berry.c @@ -11,7 +11,6 @@ #include "random.h" #include "string_util.h" #include "text.h" -#include "constants/berry.h" #include "constants/event_object_movement.h" #include "constants/items.h" @@ -890,50 +889,50 @@ const struct Berry gBerries[] = }, }; -const struct UnkStruct_0858AB24 gUnknown_0858AB24[] = { - { 50, 20}, - { 50, 20}, - { 50, 20}, - { 50, 20}, - { 50, 20}, - { 50, 30}, - { 50, 30}, - { 50, 30}, - { 50, 30}, - { 50, 30}, - { 60, 50}, - { 60, 50}, - { 60, 50}, - { 60, 50}, - { 60, 50}, - { 80, 70}, - { 80, 70}, - { 80, 70}, - { 80, 70}, - { 80, 70}, - {100, 100}, - {100, 100}, - {100, 100}, - {100, 100}, - {100, 100}, - {130, 150}, - {130, 150}, - {130, 150}, - {130, 150}, - {130, 150}, - {160, 250}, - {160, 250}, - {160, 250}, - {160, 250}, - {160, 250}, - {180, 500}, - {180, 500}, - {180, 500}, - {180, 500}, - {180, 500}, - {200, 750}, - {200, 750}, - {150, 200} +const struct BerryCrushBerryData gBerryCrush_BerryData[] = { + [ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20}, + [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20}, + [ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20}, + [ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20}, + [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 20}, + [ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30}, + [ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30}, + [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30}, + [ITEM_LUM_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30}, + [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 50, .powder = 30}, + [ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50}, + [ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50}, + [ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50}, + [ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50}, + [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 60, .powder = 50}, + [ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70}, + [ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70}, + [ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70}, + [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70}, + [ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 80, .powder = 70}, + [ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100}, + [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100}, + [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100}, + [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100}, + [ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 100, .powder = 100}, + [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150}, + [ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150}, + [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150}, + [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150}, + [ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 130, .powder = 150}, + [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250}, + [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250}, + [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250}, + [ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250}, + [ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 160, .powder = 250}, + [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500}, + [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500}, + [ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500}, + [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500}, + [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 180, .powder = 500}, + [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 200, .powder = 750}, + [ITEM_STARF_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 200, .powder = 750}, + [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = {.difficulty = 150, .powder = 200} }; const struct BerryTree gBlankBerryTree = {}; @@ -1046,8 +1045,9 @@ void ClearBerryTrees(void) static bool32 BerryTreeGrow(struct BerryTree *tree) { - if (tree->growthSparkle) + if (tree->stopGrowth) return FALSE; + switch (tree->stage) { case BERRY_STAGE_NO_BERRY: @@ -1082,7 +1082,7 @@ void BerryTreeTimeUpdate(s32 minutes) { tree = &gSaveBlock1Ptr->berryTrees[i]; - if (tree->berry && tree->stage && !tree->growthSparkle) + if (tree->berry && tree->stage && !tree->stopGrowth) { if (minutes >= GetStageDurationByBerryType(tree->berry) * 71) { @@ -1111,7 +1111,7 @@ void BerryTreeTimeUpdate(s32 minutes) } } -void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle) +void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 allowGrowth) { struct BerryTree *tree = GetBerryTreeInfo(id); @@ -1125,8 +1125,10 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle) tree->minutesUntilNextStage *= 4; } - if (!sparkle) - tree->growthSparkle = TRUE; + // Stop growth, to keep tree at this stage until the player has seen it + // allowGrowth is always true for berry trees the player has planted + if (!allowGrowth) + tree->stopGrowth = TRUE; } void RemoveBerryTree(u8 id) @@ -1175,9 +1177,9 @@ void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount) GetBerryCountString(dest, GetBerryInfo(berry)->name, berryCount); } -void ResetBerryTreeSparkleFlag(u8 id) +void AllowBerryTreeGrowth(u8 id) { - GetBerryTreeInfo(id)->growthSparkle = FALSE; + GetBerryTreeInfo(id)->stopGrowth = FALSE; } static u8 BerryTreeGetNumStagesWatered(struct BerryTree *tree) @@ -1262,7 +1264,7 @@ void ObjectEventInteractionGetBerryTreeData(void) id = GetObjectEventBerryTreeId(gSelectedObjectEvent); berry = GetBerryTypeByBerryTreeId(id); - ResetBerryTreeSparkleFlag(id); + AllowBerryTreeGrowth(id); localId = gSpecialVar_LastTalked; num = gSaveBlock1Ptr->location.mapNum; group = gSaveBlock1Ptr->location.mapGroup; @@ -1313,7 +1315,7 @@ void ObjectEventInteractionPickBerryTree(void) void ObjectEventInteractionRemoveBerryTree(void) { RemoveBerryTree(GetObjectEventBerryTreeId(gSelectedObjectEvent)); - sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + SetBerryTreeJustPicked(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } bool8 PlayerHasBerries(void) @@ -1321,7 +1323,9 @@ bool8 PlayerHasBerries(void) return IsBagPocketNonEmpty(POCKET_BERRIES); } -void ResetBerryTreeSparkleFlags(void) +// Berry tree growth is frozen at their initial stage (usually, fully grown) until the player has seen the tree +// For all berry trees on screen, allow normal growth +void SetBerryTreesSeen(void) { s16 cam_left; s16 cam_top; @@ -1343,7 +1347,7 @@ void ResetBerryTreeSparkleFlags(void) cam_left = gObjectEvents[i].currentCoords.x; cam_top = gObjectEvents[i].currentCoords.y; if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom) - ResetBerryTreeSparkleFlag(gObjectEvents[i].trainerRange_berryTreeId); + AllowBerryTreeGrowth(gObjectEvents[i].trainerRange_berryTreeId); } } } diff --git a/src/berry_blender.c b/src/berry_blender.c index 573affbd5..d47aa707d 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -34,7 +34,6 @@ #include "new_game.h" #include "save.h" #include "strings.h" -#include "constants/berry.h" #include "constants/game_stat.h" #include "constants/items.h" #include "constants/rgb.h" @@ -1098,7 +1097,7 @@ static void CB2_LoadBerryBlender(void) } break; case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); UpdateBlenderCenter(); sBerryBlender->mainState++; break; @@ -1112,7 +1111,7 @@ static void CB2_LoadBerryBlender(void) sBerryBlender->mainState++; break; case 5: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); sBerryBlender->mainState++; break; case 6: @@ -1327,7 +1326,7 @@ static void CB2_StartBlenderLink(void) sBerryBlender->mainState++; break; case 3: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); sBerryBlender->mainState++; break; case 4: @@ -1427,7 +1426,7 @@ static void CB2_StartBlenderLink(void) sBerryBlender->centerScale += 4; if (sBerryBlender->centerScale > 255) { - SetGpuRegBits(REG_OFFSET_BG2CNT, 2); + SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)); sBerryBlender->mainState++; sBerryBlender->centerScale = 256; sBerryBlender->arrowPos = sArrowStartPos[sArrowStartPosIds[sBerryBlender->numPlayers - 2]]; @@ -1665,7 +1664,7 @@ static void CB2_StartBlenderLocal(void) sBerryBlender->mainState++; break; case 3: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); sBerryBlender->mainState++; sBerryBlender->framesToWait = 0; break; @@ -1727,7 +1726,7 @@ static void CB2_StartBlenderLocal(void) sBerryBlender->mainState++; sBerryBlender->centerScale = 256; sBerryBlender->arrowPos = sArrowStartPos[sArrowStartPosIds[sBerryBlender->numPlayers - 2]]; - SetGpuRegBits(REG_OFFSET_BG2CNT, 2); + SetGpuRegBits(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2)); sBerryBlender->framesToWait = 0; PlaySE(SE_TRUCK_DOOR); PrintPlayerNames(); @@ -2390,7 +2389,7 @@ static s16 Debug_GetGameTimeStage(void) static void CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 numPlayers, u8 *flavors, u16 maxRPM) { s32 i, j; - s32 multiuseVar, var2; + s32 multiuseVar; u8 numNegatives; for (i = 0; i < FLAVOR_COUNT + 1; i++) @@ -2896,7 +2895,7 @@ static void CB2_CheckPlayAgainLink(void) case 9: if (IsLinkTaskFinished()) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); sBerryBlender->gameEndState++; } break; @@ -3860,13 +3859,13 @@ static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s3 case 0: case 3: txtColor[0] = TEXT_COLOR_WHITE; - txtColor[1] = TEXT_COLOR_DARK_GREY; - txtColor[2] = TEXT_COLOR_LIGHT_GREY; + txtColor[1] = TEXT_COLOR_DARK_GRAY; + txtColor[2] = TEXT_COLOR_LIGHT_GRAY; break; case 1: txtColor[0] = TEXT_COLOR_TRANSPARENT; - txtColor[1] = TEXT_COLOR_DARK_GREY; - txtColor[2] = TEXT_COLOR_LIGHT_GREY; + txtColor[1] = TEXT_COLOR_DARK_GRAY; + txtColor[2] = TEXT_COLOR_LIGHT_GRAY; break; case 2: txtColor[0] = TEXT_COLOR_TRANSPARENT; diff --git a/src/berry_crush.c b/src/berry_crush.c index 90bc7150d..abaad232e 100755 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -38,200 +38,352 @@ #include "constants/rgb.h" #include "constants/songs.h" -struct BerryCrushGame_Player -{ - u8 unk0[PLAYER_NAME_LENGTH + 1 + 4]; - u16 unkC; - u16 unkE; - u16 unk10; - u16 unk12; - u16 unk14; - u16 unk16; - u16 unk18; - u16 unk1A; - u8 unk1B; - u8 unk1C; +#define MAX_TIME (10 * 60 * 60) // Timer can go up to 9:59:59 + +#define TAG_CRUSHER_BASE 1 +#define PALTAG_EFFECT 2 // The next two gfx tags share this pal tag +#define GFXTAG_IMPACT 2 +#define GFXTAG_SPARKLE 3 +#define TAG_TIMER_DIGITS 4 +#define TAG_PLAYER1_BERRY 5 +#define TAG_PLAYER2_BERRY 6 +#define TAG_PLAYER3_BERRY 7 +#define TAG_PLAYER4_BERRY 8 +#define TAG_PLAYER5_BERRY 9 + +#define TAG_COUNTDOWN 0x1000 + +#define CRUSHER_START_Y (-104) + +enum { + RUN_CMD, + SCHEDULE_CMD, }; -struct BerryCrushGame_4E -{ - u16 unk0; - u16 unk2; - u8 unk4_0:1; - u8 unk4_1:1; - u8 unk4_2:1; - u8 unk4_3:5; - s8 unk5; - u16 unk6; - u16 unk8; - u16 unkA; - u16 unkC; +// IDs for the main berry crush game functions +enum { + CMD_NONE, + CMD_FADE, + CMD_WAIT_FADE, + CMD_PRINT_MSG, + CMD_SHOW_GAME, + CMD_HIDE_GAME, + CMD_READY_BEGIN, + CMD_ASK_PICK_BERRY, + CMD_PICK_BERRY, + CMD_WAIT_BERRIES, + CMD_DROP_BERRIES, + CMD_DROP_LID, + CMD_COUNTDOWN, + CMD_PLAY_GAME_LEADER, + CMD_PLAY_GAME_MEMBER, + CMD_FINISH_GAME, + CMD_TIMES_UP, + CMD_CALC_RESULTS, + CMD_SHOW_RESULTS, + CMD_SAVE, + CMD_ASK_PLAY_AGAIN, + CMD_COMM_PLAY_AGAIN, + CMD_PLAY_AGAIN_YES, + CMD_PLAY_AGAIN_NO, + CMD_CLOSE_LINK, + CMD_QUIT, }; -struct BerryCrushGame_40 -{ - s16 unk0; - s16 unk2; - s16 unk4; - s16 unk6; - s16 unk8; - s16 unkA; - s16 unkC; - s16 unkE; +enum { + MSG_PICK_BERRY, + MSG_WAIT_PICK, + MSG_POWDER, + MSG_SAVING, + MSG_PLAY_AGAIN, + MSG_NO_BERRIES, + MSG_DROPPED, + MSG_TIMES_UP, + MSG_COMM_STANDBY, +}; + +#define F_MSG_CLEAR (1 << 0) +#define F_MSG_EXPAND (1 << 1) + +// Main states for the game. Many are assigned but never checked +enum { + STATE_INIT = 1, + STATE_RESET, + STATE_PICK_BERRY, + STATE_DROP_BERRIES, + STATE_DROP_LID, + STATE_COUNTDOWN, + STATE_PLAYING, + STATE_FINISHED, + STATE_TIMES_UP, + STATE_10, // Unused + STATE_RESULTS_PRESSES, + STATE_RESULTS_RANDOM, + STATE_RESULTS_CRUSHING, + STATE_14, // Unused + STATE_PLAY_AGAIN, +}; + +#define RESULTS_STATE_START STATE_RESULTS_PRESSES +#define RESULTS_STATE_END STATE_RESULTS_CRUSHING + +// IDs for each results page that shows in succession at the game's end. +// Only 3 pages are shown for a given game. Presses and Crushing are always shown 1st and 3rd. +// The 2nd page is random, and can be rankings for either Neatness, Cooperative, or Power. +enum { + RESULTS_PAGE_PRESSES, + RESULTS_PAGE_RANDOM, + RESULTS_PAGE_CRUSHING, + NUM_RESULTS_PAGES, +}; +// Random pages, see above +// "Neatness" is how many of the player's inputs were at a regular interval +// "Cooperative" is how often the player pressed A at the same time as others +// "Power" is how much of the time the player spent pressing A +enum { + RESULTS_PAGE_NEATNESS, + RESULTS_PAGE_COOPERATIVE, + RESULTS_PAGE_POWER, + NUM_RANDOM_RESULTS_PAGES +}; + +#define PLAY_AGAIN_YES 0 +#define PLAY_AGAIN_NO 1 +#define PLAY_AGAIN_NO_BERRIES 3 + +enum { + COLORID_GRAY, + COLORID_BLACK, + COLORID_LIGHT_GRAY, + COLORID_BLUE, + COLORID_GREEN, + COLORID_RED, }; -struct BerryCrushGame_5C -{ - u16 unk00; - u8 unk02_0:1; - u8 unk02_1:1; - u8 unk02_2:1; - u8 unk02_3:5; - s8 unk03; - u16 unk04; - u16 unk06; - u16 unk08; - u16 unk0A; +// Flags for the inputFlags field +// Field is 16 bits; 3 bits for each player, last bit is unused +// The first two bits are interchangeable +// Needlessly complicated system, the inputState field is sufficient by itself +#define F_INPUT_HIT_A (1 << 0) +#define F_INPUT_HIT_B (1 << 1) +#define F_INPUT_HIT_SYNC (1 << 2) // Input at same time as another player +#define INPUT_FLAGS_PER_PLAYER 3 +#define INPUT_FLAG_MASK ((1 << INPUT_FLAGS_PER_PLAYER) - 1) + +// Values for the inputState field +enum { + INPUT_STATE_NONE, + INPUT_STATE_HIT, // Hit the crusher + INPUT_STATE_HIT_SYNC, // Hit the crusher at same time as another player }; -struct BerryCrushGame_68 +// No reason for this to be 2 +// Simply a flag for whether a given player has sent their data this round +// Data is only sent if the player is the leader or if they pressed A +#define SEND_GAME_STATE 2 + +struct BerryCrushGame_Player { - u32 unk00; - u16 unk04; - u16 unk06; - u16 unk08; - u16 unk0A; - u16 unk0C[2][5]; - u8 unk20[2][8]; + u8 name[PLAYER_NAME_LENGTH + 1 + 4]; + u16 berryId; + u16 inputTime; + u16 neatInputStreak; + u16 timeSincePrevInput; + u16 maxNeatInputStreak; + u16 numAPresses; + u16 numSyncedAPresses; + u16 timePressingA; + u8 inputFlags; + u8 inputState; +}; + +// This data is set locally and sent to the other players +struct BerryCrushGame_LocalState +{ + u16 sendFlag; + bool8 endGame:1; + bool8 bigSparkle:1; + bool8 pushedAButton:1; + u8 playerPressedAFlags:5; // 1 bit for each player + s8 vibration; + u16 depth; + u16 timer; + u16 inputFlags; + u16 sparkleAmount; }; -struct BerryCrushGame_138_C +// This data is read from another player's local state above by casting the recvCmd buffer +// It is identical with exception to the addition of rfuCmd +struct BerryCrushGame_LinkState +{ + u16 rfuCmd; + u16 sendFlag; + bool8 endGame:1; + bool8 bigSparkle:1; + bool8 pushedAButton:1; + u8 playerPressedAFlags:5; + s8 vibration; + u16 depth; + u16 timer; + u16 inputFlags; + u16 sparkleAmount; +}; + +struct BerryCrushGame_Results { - u8 unk0; - u8 unk1; - u8 unk2; - s16 unk4; - s16 unk6; - s16 unk8; - s16 unkA; + u32 powder; + u16 time; + u16 targetPressesPerSec; // Never read + u16 silkiness; + u16 totalAPresses; + u16 stats[2][MAX_RFU_PLAYERS]; + u8 playerIdsRanked[2][MAX_RFU_PLAYERS + 3]; +}; + +// playerIdsRanked above has 3 additional elements after the players. +// Only 1 of these 2*3 is ever used, and it stores the id for which +// random results page to show. Its define below is for readability. +#define randomPageId playerIdsRanked[0][7] + +// Holds position data for various player-associated graphics +struct BerryCrushPlayerCoords +{ + u8 playerId; + u8 windowGfxX; + u8 windowGfxY; + s16 impactXOffset; + s16 impactYOffset; + s16 berryXOffset; + s16 berryXDest; }; -struct BerryCrushGame_138 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - s16 unk4; - s16 unk6; - s16 unk8; - const struct BerryCrushGame_138_C *unkC[5]; - struct Sprite *unk20; - struct Sprite *unk24[5]; - struct Sprite *unk38[5]; - struct Sprite *unk4C[11]; - struct Sprite *unk78[2]; - u8 unk80; - u8 filler81; - u8 unk82; - u8 unk83[5]; - u16 unk88[4][0x800]; +struct BerryCrushGame_Gfx +{ + u8 counter; + u8 vibrationIdx; + u8 numVibrations; + bool8 vibrating; + s16 minutes; + s16 secondsInt; + s16 secondsFrac; + const struct BerryCrushPlayerCoords *playerCoords[MAX_RFU_PLAYERS]; + struct Sprite *coreSprite; + struct Sprite *impactSprites[MAX_RFU_PLAYERS]; + struct Sprite *berrySprites[MAX_RFU_PLAYERS]; + struct Sprite *sparkleSprites[11]; + struct Sprite *timerSprites[2]; + u8 resultsState; + u8 unused; + u8 resultsWindowId; + u8 nameWindowIds[MAX_RFU_PLAYERS]; + u16 bgBuffers[4][0x800]; }; struct BerryCrushGame { - MainCallback unk0; - u32 (* unk4)(struct BerryCrushGame *, u8 *); - u8 unk8; - u8 unk9; - u8 mainTask; - u8 unkB; - u8 unkC; - u8 unkD; - u8 unkE; - u8 unkF; - u16 unk10; - u16 unk12; - u16 unk14; - u16 unk16; - s16 unk18; - s16 unk1A; - s32 unk1C; - s32 unk20; - u8 unk24; - u8 unk25_0:1; - u8 unk25_1:1; - u8 unk25_2:1; - u8 unk25_3:1; - u8 unk25_4:1; - u8 unk25_5:3; - u16 unk26; - u16 unk28; - s16 unk2A; - s16 unk2C; - s16 unk2E; - s16 unk30; - s16 unk32; - s16 unk34; - u8 unk36[0xC]; - u16 unk42[6]; - u16 unk4E[7]; - struct BerryCrushGame_5C unk5C; - struct BerryCrushGame_68 unk68; - struct BerryCrushGame_Player unk98[5]; - struct BerryCrushGame_138 unk138; + MainCallback exitCallback; + u32 (*cmdCallback)(struct BerryCrushGame *, u8 *); + u8 localId; + u8 playerCount; + u8 taskId; + u8 textSpeed; + u8 cmdState; + u8 unused; // Never read + u8 nextCmd; + u8 afterPalFadeCmd; + u16 cmdTimer; + u16 gameState; + u16 playAgainState; + u16 pressingSpeed; + s16 targetAPresses; + s16 totalAPresses; + s32 powder; + s32 targetDepth; + u8 newDepth; + bool8 noRoomForPowder:1; // Never read + bool8 newRecord:1; + bool8 playedSound:1; + bool8 endGame:1; + bool8 bigSparkle:1; + u8 sparkleAmount:3; + u16 leaderTimer; + u16 timer; + s16 depth; + s16 vibration; + s16 bigSparkleCounter; + s16 numBigSparkles; + s16 numBigSparkleChecks; + s16 sparkleCounter; + u8 commandArgs[12]; + u16 sendCmd[6]; + u16 recvCmd[7]; + struct BerryCrushGame_LocalState localState; + struct BerryCrushGame_Results results; + struct BerryCrushGame_Player players[MAX_RFU_PLAYERS]; + struct BerryCrushGame_Gfx gfx; }; static void VBlankCB(void); static void MainCB(void); static void MainTask(u8); -static void ParseName_Options(struct BerryCrushGame *); -void sub_8022BEC(u16, u8, u8 *); -static void BerryCrush_SetPaletteFadeParams(u8 *, bool8, u32, s8, u8, u8, u16); -static int sub_8021450(struct BerryCrushGame *); -void sub_8022588(struct BerryCrushGame *); -void sub_8022600(struct BerryCrushGame *); -void sub_80226D0(struct BerryCrushGame *); -void sub_8022730(struct BerryCrushGame *); -void sub_8022960(struct BerryCrushGame *); -void sub_8022524(struct BerryCrushGame_138 *, u16); -void sub_8022B28(struct Sprite *); -void sub_8022554(struct BerryCrushGame_138 *r0); -void sub_8024578(struct BerryCrushGame *); -void sub_8024644(u8 *, u32, u32, u32, u32); -static void sub_8022A20(struct Sprite *sprite); -static u32 BerryCrushCommand_BeginNormalPaletteFade(struct BerryCrushGame *r6, u8 *r1); -static u32 sub_8022CB0(struct BerryCrushGame *r4, u8 *r5); -static u32 sub_8022D14(struct BerryCrushGame *r7, u8 *r5); -static u32 sub_8022E1C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_8022E3C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_8022E5C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_8022EAC(struct BerryCrushGame *r4, u8 *r5); -static u32 sub_8022F04(struct BerryCrushGame *r0, __attribute__((unused)) u8 *r1); -static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2); -static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_80232EC(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_80238F0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_8023998(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6); -static u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((unused)) u8 *r1); -static u32 sub_8024048(struct BerryCrushGame *r5, u8 *r6); -static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4); -static u32 sub_8024228(struct BerryCrushGame *r5, u8 *r6); -static u32 sub_80242E0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1); -static u32 sub_80243BC(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1); -static u32 sub_8024444(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1); -static u32 sub_8024508(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1); -static u32 sub_8024568(__attribute__((unused)) struct BerryCrushGame *r0, __attribute__((unused)) u8 *r1); - -static EWRAM_DATA struct BerryCrushGame *gBerryCrushGame = NULL; - -static const u8 gUnknown_082F325C[] = { 1, 2, 4, 8, 16, 32, 64, 128 }; -static const u8 gUnknown_082F3264[] = { 0, 1, 2, 3, 5, 0, 0, 0 }; - -static const s8 gUnknown_082F326C[][7] = +static void SetNamesAndTextSpeed(struct BerryCrushGame *); +static void RunOrScheduleCommand(u16, u8, u8 *); +static void SetPaletteFadeArgs(u8 *, bool8, u32, s8, u8, u8, u16); +static s32 UpdateGame(struct BerryCrushGame *); +static void CreatePlayerNameWindows(struct BerryCrushGame *); +static void DrawPlayerNameWindows(struct BerryCrushGame *); +static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame *); +static void CreateGameSprites(struct BerryCrushGame *); +static void DestroyGameSprites(struct BerryCrushGame *); +static void PrintTimer(struct BerryCrushGame_Gfx *, u16); +static void SpriteCB_Sparkle_Init(struct Sprite *); +static void HideTimer(struct BerryCrushGame_Gfx *); +static void ResetGame(struct BerryCrushGame *); +static void SetPrintMessageArgs(u8 *, u8, u8, u16, u8); +static void SpriteCB_Impact(struct Sprite *); +static u32 Cmd_BeginNormalPaletteFade(struct BerryCrushGame *, u8 *); +static u32 Cmd_WaitPaletteFade(struct BerryCrushGame *, u8 *); +static u32 Cmd_PrintMessage(struct BerryCrushGame *, u8 *); +static u32 Cmd_ShowGameDisplay(struct BerryCrushGame *, u8 *); +static u32 Cmd_HideGameDisplay(struct BerryCrushGame *, u8 *); +static u32 Cmd_SignalReadyToBegin(struct BerryCrushGame *, u8 *); +static u32 Cmd_AskPickBerry(struct BerryCrushGame *, u8 *); +static u32 Cmd_GoToBerryPouch(struct BerryCrushGame *, u8 *); +static u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame *, u8 *); +static u32 Cmd_DropBerriesIntoCrusher(struct BerryCrushGame *, u8 *); +static u32 Cmd_DropLid(struct BerryCrushGame *, u8 *); +static u32 Cmd_Countdown(struct BerryCrushGame *, u8 *); +static u32 Cmd_PlayGame_Leader(struct BerryCrushGame *, u8 *); +static u32 Cmd_PlayGame_Member(struct BerryCrushGame *, u8 *); +static u32 Cmd_FinishGame(struct BerryCrushGame *, u8 *); +static u32 Cmd_HandleTimeUp(struct BerryCrushGame *, u8 *); +static u32 Cmd_TabulateResults(struct BerryCrushGame *, u8 *); +static u32 Cmd_ShowResults(struct BerryCrushGame *, u8 *); +static u32 Cmd_SaveGame(struct BerryCrushGame *, u8 *); +static u32 Cmd_AskPlayAgain(struct BerryCrushGame *, u8 *); +static u32 Cmd_CommunicatePlayAgainResponses(struct BerryCrushGame *, u8 *); +static u32 Cmd_PlayAgain(struct BerryCrushGame *, u8 *); +static u32 Cmd_StopGame(struct BerryCrushGame *, u8 *); +static u32 Cmd_CloseLink(struct BerryCrushGame *, u8 *); +static u32 Cmd_Quit(struct BerryCrushGame *, u8 *); + +static EWRAM_DATA struct BerryCrushGame *sGame = NULL; + +static const u8 sBitTable[] = { + 1 << 0, + 1 << 1, + 1 << 2, + 1 << 3, + 1 << 4, + 1 << 5, + 1 << 6, + 1 << 7 +}; +// Additional A presses are counted depending on the number of players +// The bonus of 5 is unobtainable +static const u8 sSyncPressBonus[MAX_RFU_PLAYERS] = { 0, 1, 2, 3, 5 }; +ALIGNED(4) +static const s8 sIntroOutroVibrationData[][7] = { { 4, 1, 0, -1, 0, 0, 0}, { 4, 2, 0, -1, 0, 0, 0}, @@ -240,9 +392,8 @@ static const s8 gUnknown_082F326C[][7] = { 6, 4, 1, -2, -4, -2, 0}, }; -static const u8 sUnusedZero = 0; - -static const u8 gUnknown_082F3290[][4] = +ALIGNED(4) +static const u8 sVibrationData[MAX_RFU_PLAYERS][4] = { {3, 2, 1, 0}, {3, 3, 1, 0}, @@ -251,20 +402,20 @@ static const u8 gUnknown_082F3290[][4] = {3, 5, 3, 0}, }; -static const u8 *const gUnknown_082F32A4[] = -{ - gText_ReadyToBerryCrush, - gText_WaitForAllChooseBerry, - gText_EndedWithXUnitsPowder, - gText_RecordingGameResults, - gText_PlayBerryCrushAgain, - gText_YouHaveNoBerries, - gText_MemberDroppedOut, - gText_TimesUpNoGoodPowder, - gText_CommunicationStandby2, +static const u8 *const sMessages[] = +{ + [MSG_PICK_BERRY] = gText_ReadyPickBerry, + [MSG_WAIT_PICK] = gText_WaitForAllChooseBerry, + [MSG_POWDER] = gText_EndedWithXUnitsPowder, + [MSG_SAVING] = gText_RecordingGameResults, + [MSG_PLAY_AGAIN] = gText_PlayBerryCrushAgain, + [MSG_NO_BERRIES] = gText_YouHaveNoBerries, + [MSG_DROPPED] = gText_MemberDroppedOut, + [MSG_TIMES_UP] = gText_TimesUpNoGoodPowder, + [MSG_COMM_STANDBY] = gText_CommunicationStandby2, }; -static const struct BgTemplate gUnknown_082F32C8[4] = +static const struct BgTemplate sBgTemplates[4] = { { .bg = 0, @@ -304,19 +455,18 @@ static const struct BgTemplate gUnknown_082F32C8[4] = }, }; - -static const u8 sBerryCrushTextColorTable[][3] = +static const u8 sTextColorTable[][3] = { - {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}, - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}, - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GREY, TEXT_COLOR_RED}, - {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, - {TEXT_COLOR_WHITE, TEXT_COLOR_GREEN, TEXT_COLOR_LIGHT_GREEN}, - {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, + [COLORID_GRAY] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, + [COLORID_BLACK] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, + [COLORID_LIGHT_GRAY] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_RED}, + [COLORID_BLUE] = {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, + [COLORID_GREEN] = {TEXT_COLOR_WHITE, TEXT_COLOR_GREEN, TEXT_COLOR_LIGHT_GREEN}, + [COLORID_RED] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, }; -static const struct WindowTemplate sWindowTemplate_BerryCrushRankings = +static const struct WindowTemplate sWindowTemplate_Rankings = { .bg = 0, .tilemapLeft = 3, @@ -327,7 +477,7 @@ static const struct WindowTemplate sWindowTemplate_BerryCrushRankings = .baseBlock = 1 }; -static const struct WindowTemplate gUnknown_082F32F4[] = +static const struct WindowTemplate sWindowTemplates_PlayerNames[MAX_RFU_PLAYERS + 1] = { { .bg = 0, @@ -377,9 +527,9 @@ static const struct WindowTemplate gUnknown_082F32F4[] = DUMMY_WIN_TEMPLATE, }; -static const struct WindowTemplate gUnknown_082F3324[] = +static const struct WindowTemplate sWindowTemplates_Results[] = { - { + [STATE_RESULTS_PRESSES - RESULTS_STATE_START] = { .bg = 0, .tilemapLeft = 5, .tilemapTop = 2, @@ -388,7 +538,7 @@ static const struct WindowTemplate gUnknown_082F3324[] = .paletteNum = 15, .baseBlock = 1 }, - { + [STATE_RESULTS_RANDOM - RESULTS_STATE_START] = { .bg = 0, .tilemapLeft = 5, .tilemapTop = 2, @@ -397,7 +547,7 @@ static const struct WindowTemplate gUnknown_082F3324[] = .paletteNum = 15, .baseBlock = 1 }, - { + [STATE_RESULTS_CRUSHING - RESULTS_STATE_START] = { .bg = 0, .tilemapLeft = 4, .tilemapTop = 2, @@ -409,101 +559,105 @@ static const struct WindowTemplate gUnknown_082F3324[] = DUMMY_WIN_TEMPLATE, }; -static const u8 gUnknown_082F3344[][4] = +// The height of the results window depending on the number of players +// 2 players, 3 players, 4 players, or 5 players +static const u8 sResultsWindowHeights[][MAX_RFU_PLAYERS - 1] = { - {6, 8, 9, 11}, - {12, 14, 15, 16}, + {6, 8, 9, 11}, // "Presses" and "Neatness/Cooperative/Power" pages + {12, 14, 15, 16}, // "Crushing" page }; static const u32 sPressingSpeedConversionTable[] = { - 50000000 / (1 << 0), - 50000000 / (1 << 1), - 50000000 / (1 << 2), - 50000000 / (1 << 3), - 50000000 / (1 << 4), - 50000000 / (1 << 5), - 50000000 / (1 << 6), - 50000000 / (1 << 7), + 50000000, // 50 + 25000000, // 25 + 12500000, // 12.5 + 6250000, // 6.25 + 3125000, // 3.125 + 1562500, // 1.5625 + 781250, // 0.78125 + 390625 // 0.390625 }; -static const u16 gBerryCrushGrinderBasePal[] = INCBIN_U16("graphics/link_games/berrycrush_grinder_base.gbapal"); -static const u16 gBerryCrushMiscSpritesPal[] = INCBIN_U16("graphics/link_games/berrycrush_misc.gbapal"); -static const u16 gBerryCrushTimerDigitsPal[] = INCBIN_U16("graphics/link_games/berrycrush_timerdigits.gbapal"); -static const u32 gBerryCrushGrinderBaseGfx[] = INCBIN_U32("graphics/link_games/berrycrush_grinder_base.4bpp.lz"); -static const u32 gBerryCrushBtnPressGfx[] = INCBIN_U32("graphics/link_games/berrycrush_btnpress.4bpp.lz"); -static const u32 gBerryCrushSparkleGfx[] = INCBIN_U32("graphics/link_games/berrycrush_sparkle.4bpp.lz"); -static const u8 gBerryCrushTimerDigitsGfx[] = INCBIN_U8("graphics/link_games/berrycrush_timerdigits.4bpp.lz"); -static const u8 gBerryCrushGrinderTopTilemap[] = INCBIN_U8("graphics/link_games/berrycrush_grinder_top.bin.lz"); -static const u8 gBerryCrushContainerCapTilemap[] = INCBIN_U8("graphics/link_games/berrycrush_container_cap.bin.lz"); -static const u8 gBerryCrushBackgroundTilemap[] = INCBIN_U8("graphics/link_games/berrycrush_background.bin.lz"); - -static const u8 gUnknown_082F417C[][5] = -{ - {1, 3, 0, 0, 0}, - {0, 1, 3, 0, 0}, - {1, 3, 2, 4, 0}, +static const u16 sCrusherBase_Pal[] = INCBIN_U16("graphics/berry_crush/crusher_base.gbapal"); +static const u16 sEffects_Pal[] = INCBIN_U16("graphics/berry_crush/effects.gbapal"); +static const u16 sTimerDigits_Pal[] = INCBIN_U16("graphics/berry_crush/timer_digits.gbapal"); +static const u32 sCrusherBase_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher_base.4bpp.lz"); +static const u32 sImpact_Gfx[] = INCBIN_U32("graphics/berry_crush/impact.4bpp.lz"); +static const u32 sSparkle_Gfx[] = INCBIN_U32("graphics/berry_crush/sparkle.4bpp.lz"); +static const u32 sTimerDigits_Gfx[] = INCBIN_U32("graphics/berry_crush/timer_digits.4bpp.lz"); +static const u8 sCrusherTop_Tilemap[] = INCBIN_U8("graphics/berry_crush/crusher_top.bin.lz"); +static const u8 sContainerCap_Tilemap[] = INCBIN_U8("graphics/berry_crush/container_cap.bin.lz"); +static const u8 sBg_Tilemap[] = INCBIN_U8("graphics/berry_crush/bg.bin.lz"); + +// Takes the number of players - 2 and a player id and returns the +// index into sPlayerCoords where that player should be seated +static const u8 sPlayerIdToPosId[MAX_RFU_PLAYERS - 1][MAX_RFU_PLAYERS] = +{ + {1, 3}, + {0, 1, 3}, + {1, 3, 2, 4}, {0, 1, 3, 2, 4}, }; -static const struct BerryCrushGame_138_C gUnknown_082F4190[] = +static const struct BerryCrushPlayerCoords sPlayerCoords[MAX_RFU_PLAYERS] = { { - .unk0 = 0, - .unk1 = 0, - .unk2 = 0, - .unk4 = 0, - .unk6 = -16, - .unk8 = 0, - .unkA = 0, + .playerId = 0, + .windowGfxX = 0, + .windowGfxY = 0, + .impactXOffset = 0, + .impactYOffset = -16, + .berryXOffset = 0, + .berryXDest = 0, }, { - .unk0 = 1, - .unk1 = 0, - .unk2 = 3, - .unk4 = -28, - .unk6 = -4, - .unk8 = -24, - .unkA = 16, + .playerId = 1, + .windowGfxX = 0, + .windowGfxY = 3, + .impactXOffset = -28, + .impactYOffset = -4, + .berryXOffset = -24, + .berryXDest = 16, }, { - .unk0 = 2, - .unk1 = 0, - .unk2 = 6, - .unk4 = -16, - .unk6 = 20, - .unk8 = -8, - .unkA = 16, + .playerId = 2, + .windowGfxX = 0, + .windowGfxY = 6, + .impactXOffset = -16, + .impactYOffset = 20, + .berryXOffset = -8, + .berryXDest = 16, }, { - .unk0 = 3, - .unk1 = 20, - .unk2 = 3, - .unk4 = 28, - .unk6 = -4, - .unk8 = 32, - .unkA = -8, + .playerId = 3, + .windowGfxX = 20, + .windowGfxY = 3, + .impactXOffset = 28, + .impactYOffset = -4, + .berryXOffset = 32, + .berryXDest = -8, }, { - .unk0 = 4, - .unk1 = 20, - .unk2 = 6, - .unk4 = 16, - .unk6 = 20, - .unk8 = 16, - .unkA = -8, + .playerId = 4, + .windowGfxX = 20, + .windowGfxY = 6, + .impactXOffset = 16, + .impactYOffset = 20, + .berryXOffset = 16, + .berryXDest = -8, } }; -static const s8 gUnknown_082F41CC[][2] = +static const s8 sImpactCoords[][2] = { { 0, 0}, {-1, 0}, { 1, 1}, }; -static const s8 gUnknown_082F41D2[][2] = +static const s8 sSparkleCoords[][2] = { { 0, 0}, {-16, -4}, @@ -518,41 +672,42 @@ static const s8 gUnknown_082F41D2[][2] = { 40, -16}, }; -static const u16 gUnknown_082F41E8[] = {5, 6, 7, 8, 9, 0}; - -static const struct CompressedSpriteSheet gUnknown_082F41F4[] = +static const u16 sPlayerBerrySpriteTags[MAX_RFU_PLAYERS] = { - { .data = gBerryCrushGrinderBaseGfx, .size = 0x800, .tag = 1 }, - { .data = gBerryCrushBtnPressGfx, .size = 0xE00, .tag = 2 }, - { .data = gBerryCrushSparkleGfx, .size = 0x700, .tag = 3 }, + TAG_PLAYER1_BERRY, + TAG_PLAYER2_BERRY, + TAG_PLAYER3_BERRY, + TAG_PLAYER4_BERRY, + TAG_PLAYER5_BERRY }; -static const struct SpriteSheet gUnknown_082F420C[] = +// sTimerDigits_Gfx is part of this array but is (apparently) uncompressed +// It gets cast to raw uncompressed data when used in sDigitObjTemplates +static const struct CompressedSpriteSheet sSpriteSheets[] = { - { .data = gBerryCrushTimerDigitsGfx, .size = 0x2C0, .tag = 4 }, + { .data = sCrusherBase_Gfx, .size = 0x800, .tag = TAG_CRUSHER_BASE }, + { .data = sImpact_Gfx, .size = 0xE00, .tag = GFXTAG_IMPACT }, + { .data = sSparkle_Gfx, .size = 0x700, .tag = GFXTAG_SPARKLE }, + { .data = sTimerDigits_Gfx, .size = 0x2C0, .tag = TAG_TIMER_DIGITS }, {} }; -static const struct SpritePalette gUnknown_082F421C[] = -{ - { .data = gBerryCrushGrinderBasePal, .tag = 1 }, - { .data = gBerryCrushMiscSpritesPal, .tag = 2 }, -}; - -static const struct SpritePalette gUnknown_082F422C[] = +static const struct SpritePalette sSpritePals[] = { - { .data = gBerryCrushTimerDigitsPal, .tag = 4 }, + { .data = sCrusherBase_Pal, .tag = TAG_CRUSHER_BASE }, + { .data = sEffects_Pal, .tag = PALTAG_EFFECT }, // For the impact and sparkle effects + { .data = sTimerDigits_Pal, .tag = TAG_TIMER_DIGITS }, {} }; -static const union AnimCmd gUnknown_082F423C[] = +static const union AnimCmd sAnim_CrusherBase[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd gUnknown_082F4244[] = +static const union AnimCmd sAnim_Impact_Small[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), @@ -560,7 +715,7 @@ static const union AnimCmd gUnknown_082F4244[] = ANIMCMD_END }; -static const union AnimCmd gUnknown_082F4254[] = +static const union AnimCmd sAnim_Impact_Big[] = { ANIMCMD_FRAME(48, 2), ANIMCMD_FRAME(64, 2), @@ -569,7 +724,7 @@ static const union AnimCmd gUnknown_082F4254[] = ANIMCMD_END }; -static const union AnimCmd gUnknown_082F4268[] = +static const union AnimCmd sAnim_Sparkle_Small[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(4, 2), @@ -580,7 +735,7 @@ static const union AnimCmd gUnknown_082F4268[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd gUnknown_082F4284[] = +static const union AnimCmd sAnim_Sparkle_Big[] = { ANIMCMD_FRAME(24, 4), ANIMCMD_FRAME(28, 4), @@ -593,124 +748,124 @@ static const union AnimCmd gUnknown_082F4284[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd gUnknown_082F42A8[] = +static const union AnimCmd sAnim_Timer[] = { ANIMCMD_FRAME(20, 0), ANIMCMD_END }; -static const union AnimCmd gUnknown_082F42B0[] = +static const union AnimCmd sAnim_PlayerBerry[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AffineAnimCmd gUnknown_082F42B8[] = +static const union AffineAnimCmd sAffineAnim_PlayerBerry_0[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 2, 1), AFFINEANIMCMD_JUMP(1) }; -static const union AffineAnimCmd gUnknown_082F42D0[] = +static const union AffineAnimCmd sAffineAnim_PlayerBerry_1[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -2, 1), AFFINEANIMCMD_JUMP(1) }; -static const union AnimCmd *const gUnknown_082F42E8[] = +static const union AnimCmd *const sAnims_CrusherBase[] = { - gUnknown_082F423C + sAnim_CrusherBase }; -static const union AnimCmd *const gUnknown_082F42EC[] = +static const union AnimCmd *const sAnims_Impact[] = { - gUnknown_082F4244, - gUnknown_082F4254, + sAnim_Impact_Small, + sAnim_Impact_Big, }; -static const union AnimCmd *const gUnknown_082F42F4[] = +static const union AnimCmd *const sAnims_Sparkle[] = { - gUnknown_082F4268, - gUnknown_082F4284, + sAnim_Sparkle_Small, + sAnim_Sparkle_Big, }; -static const union AnimCmd *const gUnknown_082F42FC[] = +static const union AnimCmd *const sAnims_Timer[] = { - gUnknown_082F42A8 + sAnim_Timer }; -static const union AnimCmd *const gUnknown_082F4300[] = +static const union AnimCmd *const sAnims_PlayerBerry[] = { - gUnknown_082F42B0 + sAnim_PlayerBerry }; -static const union AffineAnimCmd *const gUnknown_082F4304[] = +static const union AffineAnimCmd *const sAffineAnims_PlayerBerry[] = { - gUnknown_082F42B8, - gUnknown_082F42D0, + sAffineAnim_PlayerBerry_0, + sAffineAnim_PlayerBerry_1, }; -static const struct SpriteTemplate gUnknown_082F430C = +static const struct SpriteTemplate sSpriteTemplate_CrusherBase = { - .tileTag = 1, - .paletteTag = 1, + .tileTag = TAG_CRUSHER_BASE, + .paletteTag = TAG_CRUSHER_BASE, .oam = &gOamData_AffineOff_ObjNormal_64x64, - .anims = gUnknown_082F42E8, + .anims = sAnims_CrusherBase, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_082F4324 = +static const struct SpriteTemplate sSpriteTemplate_Impact = { - .tileTag = 2, - .paletteTag = 2, + .tileTag = GFXTAG_IMPACT, + .paletteTag = PALTAG_EFFECT, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = gUnknown_082F42EC, + .anims = sAnims_Impact, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8022A20 + .callback = SpriteCB_Impact }; -static const struct SpriteTemplate gUnknown_082F433C = +static const struct SpriteTemplate sSpriteTemplate_Sparkle = { - .tileTag = 3, - .paletteTag = 2, + .tileTag = GFXTAG_SPARKLE, + .paletteTag = PALTAG_EFFECT, .oam = &gOamData_AffineOff_ObjNormal_16x16, - .anims = gUnknown_082F42F4, + .anims = sAnims_Sparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_082F4354 = +static const struct SpriteTemplate sSpriteTemplate_Timer = { - .tileTag = 4, - .paletteTag = 4, + .tileTag = TAG_TIMER_DIGITS, + .paletteTag = TAG_TIMER_DIGITS, .oam = &gOamData_AffineOff_ObjNormal_8x16, - .anims = gUnknown_082F42FC, + .anims = sAnims_Timer, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_082F436C = +static const struct SpriteTemplate sSpriteTemplate_PlayerBerry = { - .tileTag = 5, - .paletteTag = 5, + .tileTag = TAG_PLAYER1_BERRY, + .paletteTag = TAG_PLAYER1_BERRY, .oam = &gOamData_AffineDouble_ObjNormal_32x32, - .anims = gUnknown_082F4300, + .anims = sAnims_PlayerBerry, .images = NULL, - .affineAnims = gUnknown_082F4304, + .affineAnims = sAffineAnims_PlayerBerry, .callback = SpriteCallbackDummy }; -static const struct DigitObjUtilTemplate gUnknown_082F4384[] = +static const struct DigitObjUtilTemplate sDigitObjTemplates[] = { - { + { // Minutes .strConvMode = 1, .shape = 2, .size = 0, @@ -719,10 +874,10 @@ static const struct DigitObjUtilTemplate gUnknown_082F4384[] = .xDelta = 8, .x = 156, .y = 0, - .spriteSheet = gUnknown_082F420C, - .spritePal = gUnknown_082F422C, + .spriteSheet = (void*) &sSpriteSheets[3], + .spritePal = &sSpritePals[2], }, - { + { // Seconds .strConvMode = 0, .shape = 2, .size = 0, @@ -731,10 +886,10 @@ static const struct DigitObjUtilTemplate gUnknown_082F4384[] = .xDelta = 8, .x = 180, .y = 0, - .spriteSheet = gUnknown_082F420C, - .spritePal = gUnknown_082F422C, + .spriteSheet = (void*) &sSpriteSheets[3], + .spritePal = &sSpritePals[2], }, - { + { // 1/60ths of a second .strConvMode = 0, .shape = 2, .size = 0, @@ -743,79 +898,83 @@ static const struct DigitObjUtilTemplate gUnknown_082F4384[] = .xDelta = 8, .x = 204, .y = 0, - .spriteSheet = gUnknown_082F420C, - .spritePal = gUnknown_082F422C, + .spriteSheet = (void*) &sSpriteSheets[3], + .spritePal = &sSpritePals[2], } }; -static const u8 *const gUnknown_082F43B4[] = +static const u8 *const sResultsTexts[] = { - gText_SpaceTimes2, - gText_XDotY, - gText_Var1Berry, - gText_NeatnessRankings, - gText_CoopRankings, - gText_PressingPowerRankings, + [RESULTS_PAGE_PRESSES] = gText_SpaceTimes2, // " times" + [RESULTS_PAGE_RANDOM] = gText_XDotY, // "##.##", for Neatness, Cooperation, or Power value + [RESULTS_PAGE_CRUSHING] = gText_Var1Berry, + + [RESULTS_PAGE_NEATNESS + NUM_RESULTS_PAGES] = gText_NeatnessRankings, + [RESULTS_PAGE_COOPERATIVE + NUM_RESULTS_PAGES] = gText_CoopRankings, + [RESULTS_PAGE_POWER + NUM_RESULTS_PAGES] = gText_PressingPowerRankings, }; -static u32 (*const gUnknown_082F43CC[])(struct BerryCrushGame *, u8 *) = -{ - NULL, - BerryCrushCommand_BeginNormalPaletteFade, - sub_8022CB0, - sub_8022D14, - sub_8022E1C, - sub_8022E3C, - sub_8022E5C, - sub_8022EAC, - sub_8022F04, - sub_8022F1C, - sub_8023070, - sub_80231B8, - sub_80232EC, - sub_80238F0, - sub_8023998, - sub_8023A30, - sub_8023BC0, - sub_8023CAC, - sub_8024048, - sub_8024134, - sub_8024228, - sub_80242E0, - sub_80243BC, - sub_8024444, - sub_8024508, - sub_8024568, +static u32 (*const sBerryCrushCommands[])(struct BerryCrushGame * game, u8 * data) = +{ + [CMD_NONE] = NULL, + [CMD_FADE] = Cmd_BeginNormalPaletteFade, + [CMD_WAIT_FADE] = Cmd_WaitPaletteFade, + [CMD_PRINT_MSG] = Cmd_PrintMessage, + [CMD_SHOW_GAME] = Cmd_ShowGameDisplay, + [CMD_HIDE_GAME] = Cmd_HideGameDisplay, + [CMD_READY_BEGIN] = Cmd_SignalReadyToBegin, + [CMD_ASK_PICK_BERRY] = Cmd_AskPickBerry, + [CMD_PICK_BERRY] = Cmd_GoToBerryPouch, + [CMD_WAIT_BERRIES] = Cmd_WaitForOthersToPickBerries, + [CMD_DROP_BERRIES] = Cmd_DropBerriesIntoCrusher, + [CMD_DROP_LID] = Cmd_DropLid, + [CMD_COUNTDOWN] = Cmd_Countdown, + [CMD_PLAY_GAME_LEADER] = Cmd_PlayGame_Leader, + [CMD_PLAY_GAME_MEMBER] = Cmd_PlayGame_Member, + [CMD_FINISH_GAME] = Cmd_FinishGame, + [CMD_TIMES_UP] = Cmd_HandleTimeUp, + [CMD_CALC_RESULTS] = Cmd_TabulateResults, + [CMD_SHOW_RESULTS] = Cmd_ShowResults, + [CMD_SAVE] = Cmd_SaveGame, + [CMD_ASK_PLAY_AGAIN] = Cmd_AskPlayAgain, + [CMD_COMM_PLAY_AGAIN] = Cmd_CommunicatePlayAgainResponses, + [CMD_PLAY_AGAIN_YES] = Cmd_PlayAgain, + [CMD_PLAY_AGAIN_NO] = Cmd_StopGame, + [CMD_CLOSE_LINK] = Cmd_CloseLink, + [CMD_QUIT] = Cmd_Quit, }; -static const u8 gUnknown_082F4434[][4] = +// Per group size, the number of A presses required to increase the number of sparkles. +static const u8 sSparkleThresholds[MAX_RFU_PLAYERS - 1][4] = { - {2, 4, 6, 7}, - {3, 5, 8, 11}, - {3, 7, 11, 15}, - {4, 8, 12, 17}, + {2, 4, 6, 7}, // 2 players + {3, 5, 8, 11}, // 3 players + {3, 7, 11, 15}, // 4 players + {4, 8, 12, 17}, // 5 players }; -static const u8 gUnknown_082F4444[] = {5, 7, 9, 12}; -static const u8 gUnknown_082F4448[] = {3, 7, 15, 31}; +// Per group size, the number of A presses required to get big sparkles +static const u8 sBigSparkleThresholds[MAX_RFU_PLAYERS - 1] = {5, 7, 9, 12}; + +static const u8 sReceivedPlayerBitmasks[] = {0x03, 0x07, 0x0F, 0x1F}; -struct BerryCrushGame * GetBerryCrushGame(void) +static struct BerryCrushGame * GetBerryCrushGame(void) { - return gBerryCrushGame; + return sGame; } -u32 QuitBerryCrush(MainCallback callback) +static u32 QuitBerryCrush(MainCallback exitCallback) { - if (!gBerryCrushGame) + if (!sGame) return 2; - if (!callback) - callback = gBerryCrushGame->unk0; + if (!exitCallback) + exitCallback = sGame->exitCallback; - DestroyTask(gBerryCrushGame->mainTask); - FREE_AND_SET_NULL(gBerryCrushGame); - SetMainCallback2(callback); - if (callback == CB2_ReturnToField) + DestroyTask(sGame->taskId); + FREE_AND_SET_NULL(sGame); + SetMainCallback2(exitCallback); + if (exitCallback == CB2_ReturnToField) { gTextFlags.autoScroll = TRUE; PlayNewMapMusic(MUS_POKE_CENTER); @@ -825,17 +984,23 @@ u32 QuitBerryCrush(MainCallback callback) return 0; } -void StartBerryCrush(MainCallback callback) +#define ERROR_EXIT(exitCallback) \ + { \ + SetMainCallback2(exitCallback); \ + Rfu.unk_10 = 0; \ + Rfu.unk_12 = 0; \ + Rfu.errorState = 1; \ + } + +void StartBerryCrush(MainCallback exitCallback) { u8 playerCount = 0; u8 multiplayerId; if (!gReceivedRemoteLinkPlayers || gWirelessCommType == 0) { - SetMainCallback2(callback); - Rfu.unk_10 = 0; - Rfu.unk_12 = 0; - Rfu.errorState = 1; + // Link disconnected + ERROR_EXIT(exitCallback); return; } @@ -843,56 +1008,52 @@ void StartBerryCrush(MainCallback callback) multiplayerId = GetMultiplayerId(); if (playerCount < 2 || multiplayerId >= playerCount) { - SetMainCallback2(callback); - Rfu.unk_10 = 0; - Rfu.unk_12 = 0; - Rfu.errorState = 1; + // Too few players, or invalid id + ERROR_EXIT(exitCallback); return; } - gBerryCrushGame = AllocZeroed(sizeof(*gBerryCrushGame)); - if (!gBerryCrushGame) + sGame = AllocZeroed(sizeof(*sGame)); + if (!sGame) { - SetMainCallback2(callback); - Rfu.unk_10 = 0; - Rfu.unk_12 = 0; - Rfu.errorState = 1; + // Alloc failed + ERROR_EXIT(exitCallback); return; } - gBerryCrushGame->unk0 = callback; - gBerryCrushGame->unk8 = multiplayerId; - gBerryCrushGame->unk9 = playerCount; - ParseName_Options(gBerryCrushGame); - gBerryCrushGame->unk12 = 1; - gBerryCrushGame->unkE = 1; - gBerryCrushGame->unkF = 6; - BerryCrush_SetPaletteFadeParams(gBerryCrushGame->unk36, 1, -1, 0, 16, 0, 0); - sub_8022BEC(4, 1, gBerryCrushGame->unk36); + sGame->exitCallback = exitCallback; + sGame->localId = multiplayerId; + sGame->playerCount = playerCount; + SetNamesAndTextSpeed(sGame); + sGame->gameState = STATE_INIT; + sGame->nextCmd = CMD_FADE; + sGame->afterPalFadeCmd = CMD_READY_BEGIN; + SetPaletteFadeArgs(sGame->commandArgs, TRUE, PALETTES_ALL, 0, 16, 0, RGB_BLACK); + RunOrScheduleCommand(CMD_SHOW_GAME, 1, sGame->commandArgs); SetMainCallback2(MainCB); - gBerryCrushGame->mainTask = CreateTask(MainTask, 8); - gTextFlags.autoScroll = 0; + sGame->taskId = CreateTask(MainTask, 8); + gTextFlags.autoScroll = FALSE; } static void GetBerryFromBag(void) { if (gSpecialVar_ItemId < FIRST_BERRY_INDEX || gSpecialVar_ItemId > LAST_BERRY_INDEX + 1) - gSpecialVar_ItemId = ITEM_CHERI_BERRY; + gSpecialVar_ItemId = FIRST_BERRY_INDEX; else RemoveBagItem(gSpecialVar_ItemId, 1); - gBerryCrushGame->unk98[gBerryCrushGame->unk8].unkC = gSpecialVar_ItemId - FIRST_BERRY_INDEX; - gBerryCrushGame->unkE = 1; - gBerryCrushGame->unkF = 9; - BerryCrush_SetPaletteFadeParams(gBerryCrushGame->unk36, 0, -1, 0, 16, 0, 0); - sub_8022BEC(4, 1, gBerryCrushGame->unk36); - gBerryCrushGame->mainTask = CreateTask(MainTask, 8); + sGame->players[sGame->localId].berryId = gSpecialVar_ItemId - FIRST_BERRY_INDEX; + sGame->nextCmd = CMD_FADE; + sGame->afterPalFadeCmd = CMD_WAIT_BERRIES; + SetPaletteFadeArgs(sGame->commandArgs, FALSE, PALETTES_ALL, 0, 16, 0, RGB_BLACK); + RunOrScheduleCommand(CMD_SHOW_GAME, 1, sGame->commandArgs); + sGame->taskId = CreateTask(MainTask, 8); SetMainCallback2(MainCB); } -static void BerryCrush_SetupMainTask(void) +static void ChooseBerry(void) { - DestroyTask(gBerryCrushGame->mainTask); + DestroyTask(sGame->taskId); ChooseBerryForMachine(GetBerryFromBag); } @@ -906,54 +1067,60 @@ static void BerryCrush_InitVBlankCB(void) SetVBlankCallback(NULL); } -static void BerryCrush_SaveResults(void) +static void SaveResults(void) { - u32 var0, var1; + u32 time, presses; - var0 = gBerryCrushGame->unk68.unk04; - var0 = Q_24_8(var0); - var0 = MathUtil_Div32(var0, Q_24_8(60)); - var1 = gBerryCrushGame->unk68.unk0A; - var1 = Q_24_8(var1); - var1 = MathUtil_Div32(var1, var0) & 0xFFFF; - gBerryCrushGame->unk16 = var1; - switch (gBerryCrushGame->unk9) + // Calculate pressing speed ((time / 60) / presses) + time = sGame->results.time; + time = Q_24_8(time); + time = MathUtil_Div32(time, Q_24_8(60)); + presses = sGame->results.totalAPresses; + presses = Q_24_8(presses); + presses = MathUtil_Div32(presses, time) & 0xFFFF; + sGame->pressingSpeed = presses; + + switch (sGame->playerCount) { case 2: - if (gBerryCrushGame->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[0]) + if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[0]) { - gBerryCrushGame->unk25_1 = 1; - gSaveBlock2Ptr->berryCrush.berryCrushResults[0] = gBerryCrushGame->unk16; + // New 2-player record + sGame->newRecord = TRUE; + gSaveBlock2Ptr->berryCrush.pressingSpeeds[0] = sGame->pressingSpeed; } break; case 3: - if (gBerryCrushGame->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[1]) + if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[1]) { - gBerryCrushGame->unk25_1 = 1; - gSaveBlock2Ptr->berryCrush.berryCrushResults[1] = gBerryCrushGame->unk16; + // New 3-player record + sGame->newRecord = TRUE; + gSaveBlock2Ptr->berryCrush.pressingSpeeds[1] = sGame->pressingSpeed; } break; case 4: - if (gBerryCrushGame->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[2]) + if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[2]) { - gBerryCrushGame->unk25_1 = 1; - gSaveBlock2Ptr->berryCrush.berryCrushResults[2] = gBerryCrushGame->unk16; + // New 4-player record + sGame->newRecord = TRUE; + gSaveBlock2Ptr->berryCrush.pressingSpeeds[2] = sGame->pressingSpeed; } break; case 5: - if (gBerryCrushGame->unk16 > gSaveBlock2Ptr->berryCrush.berryCrushResults[3]) + if (sGame->pressingSpeed > gSaveBlock2Ptr->berryCrush.pressingSpeeds[3]) { - gBerryCrushGame->unk25_1 = 1; - gSaveBlock2Ptr->berryCrush.berryCrushResults[3] = gBerryCrushGame->unk16; + // New 5-player record + sGame->newRecord = TRUE; + gSaveBlock2Ptr->berryCrush.pressingSpeeds[3] = sGame->pressingSpeed; } break; } - gBerryCrushGame->unk1C = gBerryCrushGame->unk68.unk00; - if (GiveBerryPowder(gBerryCrushGame->unk1C)) + sGame->powder = sGame->results.powder; + if (GiveBerryPowder(sGame->powder)) return; - gBerryCrushGame->unk25_0 = 1; + sGame->noRoomForPowder = TRUE; } static void VBlankCB(void) @@ -973,46 +1140,44 @@ static void MainCB(void) static void MainTask(u8 taskId) { - if (gBerryCrushGame->unk4) - gBerryCrushGame->unk4(gBerryCrushGame, gBerryCrushGame->unk36); + if (sGame->cmdCallback) + sGame->cmdCallback(sGame, sGame->commandArgs); - sub_8021450(gBerryCrushGame); + UpdateGame(sGame); } -static void ParseName_Options(struct BerryCrushGame *arg0) +static void SetNamesAndTextSpeed(struct BerryCrushGame *game) { - u8 i = 0; - - for (; i < arg0->unk9; i++) - StringCopy(arg0->unk98[i].unk0, gLinkPlayers[i].name); - for (; i < 5; i++) + u8 i; + for (i = 0; i < game->playerCount; i++) + StringCopy(game->players[i].name, gLinkPlayers[i].name); + for (; i < MAX_RFU_PLAYERS; i++) { - memset(arg0->unk98[i].unk0, 1, PLAYER_NAME_LENGTH); - arg0->unk98[i].unk0[PLAYER_NAME_LENGTH] = EOS; + memset(game->players[i].name, 1, PLAYER_NAME_LENGTH); + game->players[i].name[PLAYER_NAME_LENGTH] = EOS; } switch (gSaveBlock2Ptr->optionsTextSpeed) { case OPTIONS_TEXT_SPEED_SLOW: - arg0->unkB = 8; + game->textSpeed = 8; break; case OPTIONS_TEXT_SPEED_MID: - arg0->unkB = 4; + game->textSpeed = 4; break; case OPTIONS_TEXT_SPEED_FAST: - arg0->unkB = 1; + game->textSpeed = 1; break; } } -// TODO: Everything from here on is likely in separate files. -s32 InitBerryCrushDisplay(void) +static s32 ShowGameDisplay(void) { struct BerryCrushGame *game = GetBerryCrushGame(); if (!game) return -1; - switch (game->unkC) + switch (game->cmdState) { case 0: SetVBlankCallback(NULL); @@ -1033,10 +1198,10 @@ s32 InitBerryCrushDisplay(void) break; case 3: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_082F32C8, ARRAY_COUNT(gUnknown_082F32C8)); - SetBgTilemapBuffer(1, game->unk138.unk88[0]); - SetBgTilemapBuffer(2, game->unk138.unk88[2]); - SetBgTilemapBuffer(3, game->unk138.unk88[3]); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + SetBgTilemapBuffer(1, game->gfx.bgBuffers[0]); + SetBgTilemapBuffer(2, game->gfx.bgBuffers[2]); + SetBgTilemapBuffer(3, game->gfx.bgBuffers[3]); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(2, 0, 0); @@ -1057,7 +1222,7 @@ s32 InitBerryCrushDisplay(void) CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); - DecompressAndCopyTileDataToVram(1, gUnknown_08DE34B8, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, gBerryCrush_Crusher_Gfx, 0, 0, 0); break; case 6: if (FreeTempTileDataBuffersIfPossible()) @@ -1065,16 +1230,16 @@ s32 InitBerryCrushDisplay(void) InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); - sub_8022588(game); - sub_8022600(game); + CreatePlayerNameWindows(game); + DrawPlayerNameWindows(game); gPaletteFade.bufferTransferDisabled = TRUE; break; case 7: - LoadPalette(gUnknown_08DE3398, 0, 0x180); - CopyToBgTilemapBuffer(1, gBerryCrushGrinderTopTilemap, 0, 0); - CopyToBgTilemapBuffer(2, gBerryCrushContainerCapTilemap, 0, 0); - CopyToBgTilemapBuffer(3, gBerryCrushBackgroundTilemap, 0, 0); - sub_80226D0(game); + LoadPalette(gBerryCrush_Crusher_Pal, 0, 0x180); + CopyToBgTilemapBuffer(1, sCrusherTop_Tilemap, 0, 0); + CopyToBgTilemapBuffer(2, sContainerCap_Tilemap, 0, 0); + CopyToBgTilemapBuffer(3, sBg_Tilemap, 0, 0); + CopyPlayerNameWindowGfxToBg(game); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); @@ -1082,35 +1247,35 @@ s32 InitBerryCrushDisplay(void) case 8: LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); - sub_8022730(game); + CreateGameSprites(game); SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); break; case 9: gPaletteFade.bufferTransferDisabled = FALSE; - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); BerryCrush_SetVBlankCB(); - game->unkC = 0; + game->cmdState = 0; return 1; } - game->unkC++; + game->cmdState++; return 0; } -int sub_802130C(void) +static s32 HideGameDisplay(void) { - struct BerryCrushGame *var0 = GetBerryCrushGame(); - if (!var0) + struct BerryCrushGame *game = GetBerryCrushGame(); + if (!game) return -1; - switch (var0->unkC) + switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); @@ -1118,10 +1283,13 @@ int sub_802130C(void) case 1: if (!IsLinkTaskFinished()) return 0; - // fall through. The original author forgot to use "break" here - // because this will call BeginNormalPaletteFade() twice. + // fall through + // This will call BeginNormalPaletteFade() twice. +#ifdef BUGFIX + break; +#endif case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); UpdatePaletteFade(); break; case 3: @@ -1152,106 +1320,121 @@ int sub_802130C(void) break; case 6: DestroyWirelessStatusIndicatorSprite(); - sub_8022960(var0); + DestroyGameSprites(game); DigitObjUtil_Free(); break; case 7: - var0->unkC = 0; + game->cmdState = 0; return 1; } - var0->unkC++; + game->cmdState++; return 0; } -static int sub_8021450(struct BerryCrushGame *arg0) +// Handles the crusher vibration and the timer +static s32 UpdateGame(struct BerryCrushGame *game) { - gSpriteCoordOffsetY = arg0->unk2A + arg0->unk2C; + gSpriteCoordOffsetY = game->depth + game->vibration; SetGpuReg(REG_OFFSET_BG1VOFS, -gSpriteCoordOffsetY); - if (arg0->unk12 == 7) - { - sub_8022524(&arg0->unk138, arg0->unk28); - } + + if (game->gameState == STATE_PLAYING) + PrintTimer(&game->gfx, game->timer); return 0; } -void sub_8021488(struct BerryCrushGame *arg0) +static void ResetCrusherPos(struct BerryCrushGame *game) { - arg0->unk2A = -104; - arg0->unk2C = 0; + game->depth = CRUSHER_START_Y; + game->vibration = 0; gSpriteCoordOffsetX = 0; - gSpriteCoordOffsetY = -104; -} - -void sub_80214A8(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1) + gSpriteCoordOffsetY = CRUSHER_START_Y; +} + +// Sprite data for berry sprites. Identical to fields for sparkle sprites +#define sX data[0] +#define sYSpeed data[1] +#define sYAccel data[2] +#define sXSpeed data[3] +#define sSinIdx data[4] +#define sSinSpeed data[5] +#define sAmplitude data[6] +// The last element (data[7]) is a bitfield. +// The first 15 bits are the y coord to stop at. +// The last bit is a flag for whether or not to move horizontally too +#define sBitfield data[7] +#define MASK_TARGET_Y 0x7FFF +#define F_MOVE_HORIZ 0x8000 + +static void CreateBerrySprites(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx) { u8 i; u8 spriteId; - s16 var0, var1; + s16 distance, var1; s16 *data; - int var3; - s16 var5; - u32 var6; + s32 amplitude; + s16 speed; + u32 var2; - for (i = 0; i < arg0->unk9; i++) + for (i = 0; i < game->playerCount; i++) { spriteId = AddCustomItemIconSprite( - &gUnknown_082F436C, - gUnknown_082F41E8[i], - gUnknown_082F41E8[i], - arg0->unk98[i].unkC + 133); - arg1->unk38[i] = &gSprites[spriteId]; - arg1->unk38[i]->oam.priority = 3; - arg1->unk38[i]->affineAnimPaused = TRUE; - arg1->unk38[i]->pos1.x = arg1->unkC[i]->unk8 + 120; - arg1->unk38[i]->pos1.y = -16; - data = arg1->unk38[i]->data; - var5 = 512; - data[1] = var5; - data[2] = 32; - data[7] = 112; - var0 = arg1->unkC[i]->unkA - arg1->unkC[i]->unk8; - var3 = var0; - if (var0 < 0) - var3 += 3; - - data[6] = var3 >> 2; - var0 *= 128; - var6 = var5 + 32; - var6 = var6 / 2; - var1 = MathUtil_Div16Shift(7, Q_8_8(63.5), var6); - data[0] = (u16)arg1->unk38[i]->pos1.x * 128; - data[3] = MathUtil_Div16Shift(7, var0, var1); + &sSpriteTemplate_PlayerBerry, + sPlayerBerrySpriteTags[i], + sPlayerBerrySpriteTags[i], + game->players[i].berryId + FIRST_BERRY_INDEX); + gfx->berrySprites[i] = &gSprites[spriteId]; + gfx->berrySprites[i]->oam.priority = 3; + gfx->berrySprites[i]->affineAnimPaused = TRUE; + gfx->berrySprites[i]->pos1.x = gfx->playerCoords[i]->berryXOffset + 120; + gfx->berrySprites[i]->pos1.y = -16; + data = gfx->berrySprites[i]->data; + speed = 512; + sYSpeed = speed; + sYAccel = 32; + sBitfield = 112; // Setting bits in MASK_TARGET_Y + distance = gfx->playerCoords[i]->berryXDest - gfx->playerCoords[i]->berryXOffset; + amplitude = distance; + if (distance < 0) + amplitude += 3; + + sAmplitude = amplitude >> 2; + distance *= 128; + var2 = speed + 32; + var2 = var2 / 2; + var1 = MathUtil_Div16Shift(7, Q_8_8(63.5), var2); + sX = (u16)gfx->berrySprites[i]->pos1.x * 128; + sXSpeed = MathUtil_Div16Shift(7, distance, var1); var1 = MathUtil_Mul16Shift(7, var1, 85); - data[4] = 0; - data[5] = MathUtil_Div16Shift(7, Q_8_8(63.5), var1); - data[7] |= 0x8000; - if (arg1->unkC[i]->unk8 < 0) - StartSpriteAffineAnim(arg1->unk38[i], 1); + sSinIdx = 0; + sSinSpeed = MathUtil_Div16Shift(7, Q_8_8(63.5), var1); + sBitfield |= F_MOVE_HORIZ; + if (gfx->playerCoords[i]->berryXOffset < 0) + StartSpriteAffineAnim(gfx->berrySprites[i], 1); } } -void sub_8021608(struct Sprite *sprite) +static void SpriteCB_DropBerryIntoCrusher(struct Sprite *sprite) { s16 *data = sprite->data; - data[1] += data[2]; - sprite->pos2.y += data[1] >> 8; - if (data[7] & 0x8000) + sYSpeed += sYAccel; + sprite->pos2.y += sYSpeed >> 8; + if (sBitfield & F_MOVE_HORIZ) { - sprite->data[0] += data[3]; - data[4] += data[5]; - sprite->pos2.x = Sin(data[4] >> 7, data[6]); - if ((data[7] & 0x8000) && (data[4] >> 7) > 126) + sprite->sX += sXSpeed; + sSinIdx += sSinSpeed; + sprite->pos2.x = Sin(sSinIdx >> 7, sAmplitude); + if ((sBitfield & F_MOVE_HORIZ) && (sSinIdx >> 7) > 126) { sprite->pos2.x = 0; - data[7] &= 0x7FFF; + sBitfield &= MASK_TARGET_Y; } } - sprite->pos1.x = data[0] >> 7; - if (sprite->pos1.y + sprite->pos2.y >= (data[7] & 0x7FFF)) + sprite->pos1.x = sX >> 7; + if (sprite->pos1.y + sprite->pos2.y >= (sBitfield & MASK_TARGET_Y)) { sprite->callback = SpriteCallbackDummy; FreeSpriteOamMatrix(sprite); @@ -1259,398 +1442,406 @@ void sub_8021608(struct Sprite *sprite) } } -void sub_80216A8(struct BerryCrushGame *arg0, __attribute__((unused)) struct BerryCrushGame_138 *arg1) +#undef sX +#undef sYSpeed +#undef sYAccel +#undef sXSpeed +#undef sSinIdx +#undef sSinSpeed +#undef sAmplitude +#undef sBitfield +#undef MASK_TARGET_Y +#undef F_MOVE_HORIZ + +static void BerryCrushFreeBerrySpriteGfx(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx) { u8 i; - for (i = 0; i < arg0->unk9; i++) + for (i = 0; i < game->playerCount; i++) { - FreeSpritePaletteByTag(gUnknown_082F41E8[i]); - FreeSpriteTilesByTag(gUnknown_082F41E8[i]); + FreeSpritePaletteByTag(sPlayerBerrySpriteTags[i]); + FreeSpriteTilesByTag(sPlayerBerrySpriteTags[i]); } } -void sub_80216E0(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1) +static void UpdateInputEffects(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx) { - u8 sp4; - struct BerryCrushGame_4E *var4E; + u8 numPlayersPressed; + struct BerryCrushGame_LinkState *linkState; u8 i; - u16 var, var2; + u16 temp1, xModifier; - sp4 = 0; - var4E = (struct BerryCrushGame_4E *)arg0->unk4E; - for (i = 0; i < arg0->unk9; i++) + numPlayersPressed = 0; + linkState = (struct BerryCrushGame_LinkState *)game->recvCmd; + + // Read inputs and update impact effects + for (i = 0; i < game->playerCount; i++) { - var = var4E->unkA >> (i * 3); - var &= 7; - if (var) + #define flags temp1 + + flags = linkState->inputFlags >> (i * INPUT_FLAGS_PER_PLAYER); + flags &= INPUT_FLAG_MASK; + if (flags) { - sp4++; - if (var & 0x4) - StartSpriteAnim(arg1->unk24[i], 1); + numPlayersPressed++; + if (flags & F_INPUT_HIT_SYNC) + StartSpriteAnim(gfx->impactSprites[i], 1); // Big impact sprite else - StartSpriteAnim(arg1->unk24[i], 0); + StartSpriteAnim(gfx->impactSprites[i], 0); // Small impact sprite - arg1->unk24[i]->invisible = FALSE; - arg1->unk24[i]->animPaused = FALSE; - arg1->unk24[i]->pos2.x = gUnknown_082F41CC[(var % 4) - 1][0]; - arg1->unk24[i]->pos2.y = gUnknown_082F41CC[(var % 4) - 1][1]; + gfx->impactSprites[i]->invisible = FALSE; + gfx->impactSprites[i]->animPaused = FALSE; + gfx->impactSprites[i]->pos2.x = sImpactCoords[(flags % (ARRAY_COUNT(sImpactCoords) + 1)) - 1][0]; + gfx->impactSprites[i]->pos2.y = sImpactCoords[(flags % (ARRAY_COUNT(sImpactCoords) + 1)) - 1][1]; } + + #undef flags } - if (sp4 == 0) + if (numPlayersPressed == 0) { - arg0->unk25_2 = 0; + game->playedSound = FALSE; } else { - var = (u8)(arg0->unk28 % 3); - var2 = var; - for (i = 0; i < var4E->unkC * 2 + 3; i++) + // Update sparkle effect + #define yModifier temp1 + + yModifier = (u8)(game->timer % 3); + xModifier = yModifier; + for (i = 0; i < linkState->sparkleAmount * 2 + 3; i++) { - if (arg1->unk4C[i]->invisible) + if (gfx->sparkleSprites[i]->invisible) { - arg1->unk4C[i]->callback = sub_8022B28; - arg1->unk4C[i]->pos1.x = gUnknown_082F41D2[i][0] + 120; - arg1->unk4C[i]->pos1.y = gUnknown_082F41D2[i][1] + 136 - (var * 4); - arg1->unk4C[i]->pos2.x = gUnknown_082F41D2[i][0] + (gUnknown_082F41D2[i][0] / (var2 * 4)); - arg1->unk4C[i]->pos2.y = gUnknown_082F41D2[i][1]; - if (var4E->unk4_1) - StartSpriteAnim(arg1->unk4C[i], 1); + gfx->sparkleSprites[i]->callback = SpriteCB_Sparkle_Init; + gfx->sparkleSprites[i]->pos1.x = sSparkleCoords[i][0] + 120; + gfx->sparkleSprites[i]->pos1.y = sSparkleCoords[i][1] + 136 - (yModifier * 4); + gfx->sparkleSprites[i]->pos2.x = sSparkleCoords[i][0] + (sSparkleCoords[i][0] / (xModifier * 4)); + gfx->sparkleSprites[i]->pos2.y = sSparkleCoords[i][1]; + if (linkState->bigSparkle) + StartSpriteAnim(gfx->sparkleSprites[i], 1); else - StartSpriteAnim(arg1->unk4C[i], 0); + StartSpriteAnim(gfx->sparkleSprites[i], 0); - var++; - if (var > 3) - var = 0; + yModifier++; + if (yModifier > 3) + yModifier = 0; } } - if (arg0->unk25_2) + #undef yModifier + + if (game->playedSound) { - arg0->unk25_2 = 0; + game->playedSound = FALSE; } else { - if (sp4 == 1) + if (numPlayersPressed == 1) PlaySE(SE_MUD_BALL); else PlaySE(SE_BREAKABLE_DOOR); - arg0->unk25_2 = 1; + game->playedSound = TRUE; } } } -bool32 sub_80218D4(struct BerryCrushGame *arg0, struct BerryCrushGame_138 *arg1) +static bool32 AreEffectsFinished(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx) { u8 i; - for (i = 0; i < arg0->unk9; i++) + // Are any impact sprites active + for (i = 0; i < game->playerCount; i++) { - if (!arg1->unk24[i]->invisible) + if (!gfx->impactSprites[i]->invisible) return FALSE; } - for (i = 0; i < 11; i++) + // Are any sparkle sprites active + for (i = 0; i < ARRAY_COUNT(gfx->sparkleSprites); i++) { - if (!arg1->unk4C[i]->invisible) + if (!gfx->sparkleSprites[i]->invisible) return FALSE; } - if (arg0->unk2C != 0) - arg0->unk2C = 0; + if (game->vibration != 0) + game->vibration = 0; return TRUE; } -void sub_8021944(struct BerryCrushGame_138 *arg0, u16 arg1) +static void FramesToMinSec(struct BerryCrushGame_Gfx *gfx, u16 frames) { u8 i = 0; - u32 r7 = 0; + u32 fractionalFrames = 0; s16 r3 = 0; - arg0->unk4 = arg1 / 3600; - arg0->unk6 = (arg1 % 3600) / 60; - r3 = MathUtil_Mul16(Q_8_8(arg1 % 60), 4); + gfx->minutes = frames / (60 * 60); + gfx->secondsInt = (frames % (60 * 60)) / 60; + r3 = MathUtil_Mul16(Q_8_8(frames % 60), 4); for (i = 0; i < 8; i++) { if ((r3 >> (7 - i)) & 1) - r7 += sPressingSpeedConversionTable[i]; + fractionalFrames += sPressingSpeedConversionTable[i]; } - arg0->unk8 = r7 / 1000000; + gfx->secondsFrac = fractionalFrames / 1000000; } -void sub_80219C8(u8 windowId, u8 left, u8 colorId, const u8 *string) +static void PrintTextCentered(u8 windowId, u8 left, u8 colorId, const u8 *string) { left = (left * 4) - (GetStringWidth(2, string, -1) / 2u); - AddTextPrinterParameterized3(windowId, 2, left, 0, sBerryCrushTextColorTable[colorId], 0, string); + AddTextPrinterParameterized3(windowId, 2, left, 0, sTextColorTable[colorId], 0, string); } -void sub_8021A28(struct BerryCrushGame * sp0C, u8 sp10, u8 sp14, u8 sp18) +static void PrintResultsText(struct BerryCrushGame * game, u8 page, u8 sp14, u8 baseY) { - u8 r8; - u8 sp1C = 0; - u8 sp20 = 0; - u8 r2; - s32 r3; - u8 r7; - struct BerryCrushGame_68 * sp24 = &sp0C->unk68; + u8 i, j; + u8 playerId = 0; + u8 ranking = 0; + s32 x; + u8 stat; + struct BerryCrushGame_Results * results = &game->results; u32 xOffset; - s32 r6; - - sp18 -= 16; - if (sp10 == 2) - sp18 -= 42; - r6 = sp18 - 14 * sp0C->unk9; - if (r6 > 0) - r6 = r6 / 2 + 16; + s32 y; + + baseY -= 16; + if (page == RESULTS_PAGE_CRUSHING) + baseY -= 42; + + y = baseY - 14 * game->playerCount; + if (y > 0) + y = y / 2 + 16; else - r6 = 16; + y = 16; - for (r8 = 0; r8 < sp0C->unk9; r6 += 14, ++r8) + for (i = 0; i < game->playerCount; y += 14, i++) { DynamicPlaceholderTextUtil_Reset(); - switch (sp10) + switch (page) { - case 0: - sp1C = sp24->unk20[sp10][r8]; - if (r8 != 0 && sp24->unk0C[sp10][r8] != sp24->unk0C[sp10][r8 - 1]) - sp20 = r8; - ConvertIntToDecimalStringN(gStringVar4, sp24->unk0C[sp10][r8], STR_CONV_MODE_RIGHT_ALIGN, 4); - StringAppend(gStringVar4, gUnknown_082F43B4[sp10]); + case RESULTS_PAGE_PRESSES: + playerId = results->playerIdsRanked[page][i]; + if (i != 0 && results->stats[page][i] != results->stats[page][i - 1]) + ranking = i; + ConvertIntToDecimalStringN(gStringVar4, results->stats[page][i], STR_CONV_MODE_RIGHT_ALIGN, 4); + StringAppend(gStringVar4, sResultsTexts[page]); break; - case 1: - sp1C = sp24->unk20[sp10][r8]; - if (r8 != 0 && sp24->unk0C[sp10][r8] != sp24->unk0C[sp10][r8 - 1]) - sp20 = r8; - ConvertIntToDecimalStringN(gStringVar1, sp24->unk0C[sp10][r8] >> 4, STR_CONV_MODE_RIGHT_ALIGN, 3); + case RESULTS_PAGE_RANDOM: + playerId = results->playerIdsRanked[page][i]; + if (i != 0 && results->stats[page][i] != results->stats[page][i - 1]) + ranking = i; + ConvertIntToDecimalStringN(gStringVar1, results->stats[page][i] >> 4, STR_CONV_MODE_RIGHT_ALIGN, 3); xOffset = 0; - r7 = sp24->unk0C[sp10][r8] & 15; - for (r2 = 0; r2 < 4; ++r2) - if ((r7 >> (3 - r2)) & 1) - xOffset += sPressingSpeedConversionTable[r2]; - r7 = xOffset / 1000000u; - ConvertIntToDecimalStringN(gStringVar2, r7, STR_CONV_MODE_LEADING_ZEROS, 2); - StringExpandPlaceholders(gStringVar4, gUnknown_082F43B4[sp10]); + stat = results->stats[page][i] & 15; + for (j = 0; j < 4; j++) + if ((stat >> (3 - j)) & 1) + xOffset += sPressingSpeedConversionTable[j]; + stat = xOffset / 1000000u; + ConvertIntToDecimalStringN(gStringVar2, stat, STR_CONV_MODE_LEADING_ZEROS, 2); + StringExpandPlaceholders(gStringVar4, sResultsTexts[page]); break; - case 2: - sp1C = r8; - sp20 = r8; - r2 = sp0C->unk98[r8].unkC; - if (r2 >= LAST_BERRY_INDEX - FIRST_BERRY_INDEX + 2) - r2 = 0; - StringCopy(gStringVar1, gBerries[r2].name); - StringExpandPlaceholders(gStringVar4, gUnknown_082F43B4[sp10]); + case RESULTS_PAGE_CRUSHING: + playerId = i; + ranking = i; + j = game->players[i].berryId; + if (j >= LAST_BERRY_INDEX - FIRST_BERRY_INDEX + 2) + j = 0; + StringCopy(gStringVar1, gBerries[j].name); + StringExpandPlaceholders(gStringVar4, sResultsTexts[page]); break; } - r3 = GetStringRightAlignXOffset(2, gStringVar4, sp14 - 4); - AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, r3, r6, sBerryCrushTextColorTable[0], 0, gStringVar4); - if (sp1C == sp0C->unk8) + x = GetStringRightAlignXOffset(2, gStringVar4, sp14 - 4); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gStringVar4); + if (playerId == game->localId) StringCopy(gStringVar3, gText_1DotBlueF700); else StringCopy(gStringVar3, gText_1DotF700); - gStringVar3[0] = sp20 + CHAR_1; - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sp0C->unk98[sp1C].unk0); + gStringVar3[0] = ranking + CHAR_1; + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, game->players[playerId].name); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gStringVar3); - AddTextPrinterParameterized3(sp0C->unk138.unk82, 2, 4, r6, sBerryCrushTextColorTable[0], 0, gStringVar4); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, 4, y, sTextColorTable[COLORID_GRAY], 0, gStringVar4); } } -void sub_8021D34(struct BerryCrushGame *r8) +static void PrintCrushingResults(struct BerryCrushGame *game) { - u8 r10 = 0; - u8 r6 = 0; - u32 sp0C = 0; - struct BerryCrushGame_68 *sp10 = &r8->unk68; - u8 r7 = GetWindowAttribute(r8->unk138.unk82, WINDOW_HEIGHT) * 8 - 42; + u8 i = 0; + u8 x = 0; + u32 pressingSpeedFrac = 0; + struct BerryCrushGame_Results *results = &game->results; + u8 y = GetWindowAttribute(game->gfx.resultsWindowId, WINDOW_HEIGHT) * 8 - 42; + + FramesToMinSec(&game->gfx, results->time); + + // Print time text + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gText_TimeColon); - sub_8021944(&r8->unk138, sp10->unk04); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_TimeColon); - r6 = 176 - (u8)GetStringWidth(2, gText_SpaceSec, -1); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_SpaceSec); - ConvertIntToDecimalStringN(gStringVar1, r8->unk138.unk6, STR_CONV_MODE_LEADING_ZEROS, 2); - ConvertIntToDecimalStringN(gStringVar2, r8->unk138.unk8, STR_CONV_MODE_LEADING_ZEROS, 2); + // Print seconds text + x = 176 - (u8)GetStringWidth(2, gText_SpaceSec, -1); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gText_SpaceSec); + + // Print seconds value + ConvertIntToDecimalStringN(gStringVar1, game->gfx.secondsInt, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar2, game->gfx.secondsFrac, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_XDotY2); - r6 -= GetStringWidth(2, gStringVar4, -1); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4); - r6 -= GetStringWidth(2, gText_SpaceMin, -1); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_SpaceMin); - ConvertIntToDecimalStringN(gStringVar1, r8->unk138.unk4, STR_CONV_MODE_LEADING_ZEROS, 1); + x -= GetStringWidth(2, gStringVar4, -1); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gStringVar4); + + // Print minutes text + x -= GetStringWidth(2, gText_SpaceMin, -1); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gText_SpaceMin); + + // Print minutes value + ConvertIntToDecimalStringN(gStringVar1, game->gfx.minutes, STR_CONV_MODE_LEADING_ZEROS, 1); StringExpandPlaceholders(gStringVar4, gText_StrVar1); - r6 -= GetStringWidth(2, gStringVar4, -1); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4); - r7 += 14; - AddTextPrinterParameterized3(r8->unk138.unk82, 2, 0, r7, sBerryCrushTextColorTable[0], 0, gText_PressingSpeed); - r6 = 176 - (u8)GetStringWidth(2, gText_TimesPerSec, -1); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gText_TimesPerSec); - for (; r10 < 8; ++r10) - if (((u8)r8->unk16 >> (7 - r10)) & 1) - sp0C += *(r10 + sPressingSpeedConversionTable); // It's accessed in a different way here for unknown reason - ConvertIntToDecimalStringN(gStringVar1, r8->unk16 >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); - ConvertIntToDecimalStringN(gStringVar2, sp0C / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); + x -= GetStringWidth(2, gStringVar4, -1); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gStringVar4); + + // Print pressing speed text + y += 14; + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, 0, y, sTextColorTable[COLORID_GRAY], 0, gText_PressingSpeed); + x = 176 - (u8)GetStringWidth(2, gText_TimesPerSec, -1); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gText_TimesPerSec); + + // Print pressing speed value + for (i = 0; i < 8; i++) + if (((u8)game->pressingSpeed >> (7 - i)) & 1) + pressingSpeedFrac += *(i + sPressingSpeedConversionTable); // It's accessed in a different way here for unknown reason + ConvertIntToDecimalStringN(gStringVar1, game->pressingSpeed >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar2, pressingSpeedFrac / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_XDotY3); - r6 -= GetStringWidth(2, gStringVar4, -1); - if (r8->unk25_1) - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[5], 0, gStringVar4); + x -= GetStringWidth(2, gStringVar4, -1); + if (game->newRecord) + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_RED], 0, gStringVar4); else - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4); - r7 += 14; - AddTextPrinterParameterized3(r8->unk138.unk82, 2, 0, r7, sBerryCrushTextColorTable[0], 0, gText_Silkiness); - ConvertIntToDecimalStringN(gStringVar1, sp10->unk08, STR_CONV_MODE_RIGHT_ALIGN, 3); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gStringVar4); + + // Print silkiness text + y += 14; + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, 0, y, sTextColorTable[COLORID_GRAY], 0, gText_Silkiness); + + // Print silkiness value + ConvertIntToDecimalStringN(gStringVar1, results->silkiness, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_Var1Percent); - r6 = 176 - (u8)GetStringWidth(2, gStringVar4, -1); - AddTextPrinterParameterized3(r8->unk138.unk82, 2, r6, r7, sBerryCrushTextColorTable[0], 0, gStringVar4); + x = 176 - (u8)GetStringWidth(2, gStringVar4, -1); + AddTextPrinterParameterized3(game->gfx.resultsWindowId, 2, x, y, sTextColorTable[COLORID_GRAY], 0, gStringVar4); } -bool32 sub_8022070(struct BerryCrushGame *r4, struct BerryCrushGame_138 *r6) +static bool32 OpenResultsWindow(struct BerryCrushGame *game, struct BerryCrushGame_Gfx *gfx) { - u8 r5; + u8 playerCountIdx; struct WindowTemplate template; - switch (r6->unk80) + switch (gfx->resultsState) { case 0: - r5 = r4->unk9 - 2; - sub_8022554(r6); - memcpy(&template, &gUnknown_082F3324[r4->unk12 - 11], sizeof(struct WindowTemplate)); - if (r4->unk12 == 13) - template.height = gUnknown_082F3344[1][r5]; + playerCountIdx = game->playerCount - 2; + HideTimer(gfx); + memcpy(&template, &sWindowTemplates_Results[game->gameState - RESULTS_STATE_START], sizeof(struct WindowTemplate)); + if (game->gameState == STATE_RESULTS_CRUSHING) + template.height = sResultsWindowHeights[1][playerCountIdx]; else - template.height = gUnknown_082F3344[0][r5]; - r6->unk82 = AddWindow(&template); + template.height = sResultsWindowHeights[0][playerCountIdx]; + gfx->resultsWindowId = AddWindow(&template); break; case 1: - PutWindowTilemap(r6->unk82); - FillWindowPixelBuffer(r6->unk82, PIXEL_FILL(0)); + PutWindowTilemap(gfx->resultsWindowId); + FillWindowPixelBuffer(gfx->resultsWindowId, PIXEL_FILL(0)); break; case 2: - LoadUserWindowBorderGfx_(r6->unk82, 541, 208); - DrawStdFrameWithCustomTileAndPalette(r6->unk82, 0, 541, 13); + LoadUserWindowBorderGfx_(gfx->resultsWindowId, 541, 208); + DrawStdFrameWithCustomTileAndPalette(gfx->resultsWindowId, 0, 541, 13); break; case 3: - r5 = r4->unk9 - 2; - switch (r4->unk12) + playerCountIdx = game->playerCount - 2; + switch (game->gameState) { - case 11: - sub_80219C8(r6->unk82, 20, 3, gText_PressesRankings); - sub_8021A28(r4, 0, 0xA0, 8 * gUnknown_082F3344[0][r5]); - r6->unk80 = 5; + case STATE_RESULTS_PRESSES: + PrintTextCentered(gfx->resultsWindowId, 20, COLORID_BLUE, gText_PressesRankings); + PrintResultsText(game, RESULTS_PAGE_PRESSES, 0xA0, 8 * sResultsWindowHeights[0][playerCountIdx]); + gfx->resultsState = 5; // Skip past Crushing Results text return FALSE; - case 12: - sub_80219C8(r6->unk82, 20, 4, gUnknown_082F43B4[r4->unk68.unk20[0][7] + 3]); - sub_8021A28(r4, 1, 0xA0, 8 * gUnknown_082F3344[0][r5]); - r6->unk80 = 5; + case STATE_RESULTS_RANDOM: + PrintTextCentered(gfx->resultsWindowId, 20, COLORID_GREEN, sResultsTexts[game->results.randomPageId + NUM_RESULTS_PAGES]); + PrintResultsText(game, RESULTS_PAGE_RANDOM, 0xA0, 8 * sResultsWindowHeights[0][playerCountIdx]); + gfx->resultsState = 5; // Skip past Crushing Results text return FALSE; - case 13: - sub_80219C8(r6->unk82, 22, 3, gText_CrushingResults); - sub_8021A28(r4, 2, 0xB0, 8 * gUnknown_082F3344[1][r5]); + case STATE_RESULTS_CRUSHING: + PrintTextCentered(gfx->resultsWindowId, 22, COLORID_BLUE, gText_CrushingResults); + PrintResultsText(game, RESULTS_PAGE_CRUSHING, 0xB0, 8 * sResultsWindowHeights[1][playerCountIdx]); break; } break; case 4: - sub_8021D34(r4); + PrintCrushingResults(game); break; case 5: - CopyWindowToVram(r6->unk82, 3); - r6->unk80 = 0; + CopyWindowToVram(gfx->resultsWindowId, 3); + gfx->resultsState = 0; return TRUE; } - ++r6->unk80; + gfx->resultsState++; return FALSE; } -void sub_802222C(struct BerryCrushGame *r4) +static void CloseResultsWindow(struct BerryCrushGame *game) { - ClearStdWindowAndFrameToTransparent(r4->unk138.unk82, 1); - RemoveWindow(r4->unk138.unk82); - sub_8022600(r4); + ClearStdWindowAndFrameToTransparent(game->gfx.resultsWindowId, 1); + RemoveWindow(game->gfx.resultsWindowId); + DrawPlayerNameWindows(game); } -static void Task_ShowBerryCrushRankings(u8 taskId) +#define tState data[0] +#define tWindowId data[1] +#define tPressingSpeeds(i) data[2 + (i)] // data[2]-[5], for different group sizes + +static void Task_ShowRankings(u8 taskId) { u8 i = 0, j, xPos, yPos; u32 score = 0; s16 *data = gTasks[taskId].data; - u8 *str; - switch (data[0]) + switch (tState) { case 0: - data[1] = AddWindow(&sWindowTemplate_BerryCrushRankings); - PutWindowTilemap(data[1]); - FillWindowPixelBuffer(data[1], PIXEL_FILL(0)); - LoadUserWindowBorderGfx_(data[1], 541, 208); - DrawStdFrameWithCustomTileAndPalette(data[1], 0, 541, 13); + tWindowId = AddWindow(&sWindowTemplate_Rankings); + PutWindowTilemap(tWindowId); + FillWindowPixelBuffer(tWindowId, PIXEL_FILL(0)); + LoadUserWindowBorderGfx_(tWindowId, 541, 208); + DrawStdFrameWithCustomTileAndPalette(tWindowId, 0, 541, 13); break; case 1: + // Print header text xPos = 96 - GetStringWidth(1, gText_BerryCrush2, -1) / 2u; - AddTextPrinterParameterized3( - data[1], - 1, - xPos, - 1, - sBerryCrushTextColorTable[3], - 0, - gText_BerryCrush2 - ); + AddTextPrinterParameterized3(tWindowId, 1, xPos, 1, sTextColorTable[COLORID_BLUE], 0, gText_BerryCrush2); xPos = 96 - GetStringWidth(1, gText_PressingSpeedRankings, -1) / 2u; - AddTextPrinterParameterized3( - data[1], - 1, - xPos, - 17, - sBerryCrushTextColorTable[3], - 0, - gText_PressingSpeedRankings - ); + AddTextPrinterParameterized3(tWindowId, 1, xPos, 17, sTextColorTable[COLORID_BLUE], 0, gText_PressingSpeedRankings); + + // Print pressing speed record for each group size, ranked yPos = 41; - for (i = 0; i < 4; ++i) + for (i = 0; i < MAX_RFU_PLAYERS - 1; i++) { ConvertIntToDecimalStringN(gStringVar1, i + 2, STR_CONV_MODE_LEFT_ALIGN, 1); StringExpandPlaceholders(gStringVar4, gText_Var1Players); - AddTextPrinterParameterized3( - data[1], - 1, - 0, - yPos, - sBerryCrushTextColorTable[0], - 0, - gStringVar4 - ); + AddTextPrinterParameterized3(tWindowId, 1, 0, yPos, sTextColorTable[COLORID_GRAY], 0, gStringVar4); xPos = 192 - (u8)GetStringWidth(1, gText_TimesPerSec, -1); - AddTextPrinterParameterized3( - data[1], - 1, - xPos, - yPos, - sBerryCrushTextColorTable[0], - 0, - gText_TimesPerSec - ); - for (j = 0; j < 8; ++j) + AddTextPrinterParameterized3(tWindowId, 1, xPos, yPos, sTextColorTable[COLORID_GRAY], 0, gText_TimesPerSec); + for (j = 0; j < 8; j++) { - if (((data[i + 2] & 0xFF) >> (7 - j)) & 1) + if (((tPressingSpeeds(i) & 0xFF) >> (7 - j)) & 1) score += sPressingSpeedConversionTable[j]; } - ConvertIntToDecimalStringN(gStringVar1, (u16)data[i + 2] >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, (u16)tPressingSpeeds(i) >> 8, STR_CONV_MODE_RIGHT_ALIGN, 3); ConvertIntToDecimalStringN(gStringVar2, score / 1000000, STR_CONV_MODE_LEADING_ZEROS, 2); StringExpandPlaceholders(gStringVar4, gText_XDotY3); xPos -= GetStringWidth(1, gStringVar4, -1); - AddTextPrinterParameterized3( - data[1], - 1, - xPos, - yPos, - sBerryCrushTextColorTable[0], - 0, - gStringVar4 - ); + AddTextPrinterParameterized3(tWindowId, 1, xPos, yPos, sTextColorTable[COLORID_GRAY], 0, gStringVar4); yPos += 16; score = 0; } - CopyWindowToVram(data[1], 3); + CopyWindowToVram(tWindowId, 3); break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) @@ -1658,16 +1849,16 @@ static void Task_ShowBerryCrushRankings(u8 taskId) else return; case 3: - ClearStdWindowAndFrameToTransparent(data[1], 1); - ClearWindowTilemap(data[1]); - RemoveWindow(data[1]); + ClearStdWindowAndFrameToTransparent(tWindowId, 1); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); DestroyTask(taskId); EnableBothScriptContexts(); ScriptContext2_Disable(); - data[0] = 0; + tState = 0; return; } - ++data[0]; + tState++; } void ShowBerryCrushRankings(void) @@ -1675,98 +1866,98 @@ void ShowBerryCrushRankings(void) u8 taskId; ScriptContext2_Enable(); - taskId = CreateTask(Task_ShowBerryCrushRankings, 0); - gTasks[taskId].data[2] = gSaveBlock2Ptr->berryCrush.berryCrushResults[0]; - gTasks[taskId].data[3] = gSaveBlock2Ptr->berryCrush.berryCrushResults[1]; - gTasks[taskId].data[4] = gSaveBlock2Ptr->berryCrush.berryCrushResults[2]; - gTasks[taskId].data[5] = gSaveBlock2Ptr->berryCrush.berryCrushResults[3]; + taskId = CreateTask(Task_ShowRankings, 0); + gTasks[taskId].tPressingSpeeds(0) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[0]; + gTasks[taskId].tPressingSpeeds(1) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[1]; + gTasks[taskId].tPressingSpeeds(2) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[2]; + gTasks[taskId].tPressingSpeeds(3) = gSaveBlock2Ptr->berryCrush.pressingSpeeds[3]; } -void sub_8022524(struct BerryCrushGame_138 *r4, u16 r1) +static void PrintTimer(struct BerryCrushGame_Gfx *gfx, u16 timer) { - sub_8021944(r4, r1); - DigitObjUtil_PrintNumOn(0, r4->unk4); - DigitObjUtil_PrintNumOn(1, r4->unk6); - DigitObjUtil_PrintNumOn(2, r4->unk8); + FramesToMinSec(gfx, timer); + DigitObjUtil_PrintNumOn(0, gfx->minutes); + DigitObjUtil_PrintNumOn(1, gfx->secondsInt); + DigitObjUtil_PrintNumOn(2, gfx->secondsFrac); } -void sub_8022554(struct BerryCrushGame_138 *r0) +static void HideTimer(struct BerryCrushGame_Gfx *gfx) { - r0->unk78[0]->invisible = TRUE; - r0->unk78[1]->invisible = TRUE; + gfx->timerSprites[0]->invisible = TRUE; + gfx->timerSprites[1]->invisible = TRUE; DigitObjUtil_HideOrShow(2, 1); DigitObjUtil_HideOrShow(1, 1); DigitObjUtil_HideOrShow(0, 1); } -void sub_8022588(struct BerryCrushGame *r5) +static void CreatePlayerNameWindows(struct BerryCrushGame *game) { - u8 r6; - - for (r6 = 0; r6 < r5->unk9; ++r6) + u8 i; + for (i = 0; i < game->playerCount; i++) { - r5->unk138.unkC[r6] = &gUnknown_082F4190[gUnknown_082F417C[r5->unk9 - 2][r6]]; - r5->unk138.unk83[r6] = AddWindow(&gUnknown_082F32F4[r5->unk138.unkC[r6]->unk0]); - PutWindowTilemap(r5->unk138.unk83[r6]); - FillWindowPixelBuffer(r5->unk138.unk83[r6], 0); + game->gfx.playerCoords[i] = &sPlayerCoords[sPlayerIdToPosId[game->playerCount - 2][i]]; + game->gfx.nameWindowIds[i] = AddWindow(&sWindowTemplates_PlayerNames[game->gfx.playerCoords[i]->playerId]); + PutWindowTilemap(game->gfx.nameWindowIds[i]); + FillWindowPixelBuffer(game->gfx.nameWindowIds[i], 0); } } -void sub_8022600(struct BerryCrushGame *r6) +static void DrawPlayerNameWindows(struct BerryCrushGame *game) { - u8 r7, r2; - u8 *r4; - - for (r7 = 0; r7 < r6->unk9; ++r7) + u8 i; + for (i = 0; i < game->playerCount; i++) { - PutWindowTilemap(r6->unk138.unk83[r7]); - if (r7 == r6->unk8) + PutWindowTilemap(game->gfx.nameWindowIds[i]); + if (i == game->localId) { + // Print the player's name AddTextPrinterParameterized4( - r6->unk138.unk83[r7], + game->gfx.nameWindowIds[i], 2, - 36 - GetStringWidth(2, r6->unk98[r7].unk0, 0) / 2u, + 36 - GetStringWidth(2, game->players[i].name, 0) / 2u, 1, 0, 0, - sBerryCrushTextColorTable[1], + sTextColorTable[COLORID_BLACK], 0, - r6->unk98[r7].unk0 + game->players[i].name ); } else { + // Print a partner's name AddTextPrinterParameterized4( - r6->unk138.unk83[r7], + game->gfx.nameWindowIds[i], 2, - 36 - GetStringWidth(2, r6->unk98[r7].unk0, 0) / 2u, + 36 - GetStringWidth(2, game->players[i].name, 0) / 2u, 1, 0, 0, - sBerryCrushTextColorTable[2], + sTextColorTable[COLORID_LIGHT_GRAY], 0, - r6->unk98[r7].unk0 + game->players[i].name ); } - CopyWindowToVram(r6->unk138.unk83[r7], 3); + CopyWindowToVram(game->gfx.nameWindowIds[i], 3); } CopyBgTilemapBufferToVram(0); } -void sub_80226D0(struct BerryCrushGame *r6) +// Each player name window border uses a color that corresponds to a slot of the crusher lid +static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame *game) { - u8 r5 = 0; - u8 * r4; + u8 i = 0; + u8 * crusherGfx; - LZ77UnCompWram(gUnknown_08DE3FD4, gDecompressionBuffer); + LZ77UnCompWram(gBerryCrush_Crusher_Tilemap, gDecompressionBuffer); - for (r4 = gDecompressionBuffer; r5 < r6->unk9; ++r5) + for (crusherGfx = gDecompressionBuffer; i < game->playerCount; i++) { CopyToBgTilemapBufferRect( 3, - &r4[r6->unk138.unkC[r5]->unk0 * 40], - r6->unk138.unkC[r5]->unk1, - r6->unk138.unkC[r5]->unk2, + &crusherGfx[game->gfx.playerCoords[i]->playerId * 40], + game->gfx.playerCoords[i]->windowGfxX, + game->gfx.playerCoords[i]->windowGfxY, 10, 2 ); @@ -1774,96 +1965,99 @@ void sub_80226D0(struct BerryCrushGame *r6) CopyBgTilemapBufferToVram(3); } -void sub_8022730(struct BerryCrushGame *r6) +static void CreateGameSprites(struct BerryCrushGame *game) { - u8 r5 = 0; - u8 r2; + u8 i = 0; + u8 spriteId; - r6->unk2A = -104; - r6->unk2C = 0; + game->depth = CRUSHER_START_Y; + game->vibration = 0; gSpriteCoordOffsetX = 0; - gSpriteCoordOffsetY = -104; - for (; r5 < 4; ++r5) - LoadCompressedSpriteSheet(&gUnknown_082F41F4[r5]); - LoadSpritePalettes(gUnknown_082F421C); - r2 = CreateSprite(&gUnknown_082F430C, 120, 88, 5); - r6->unk138.unk20 = &gSprites[r2]; - r6->unk138.unk20->oam.priority = 3; - r6->unk138.unk20->coordOffsetEnabled = TRUE; - r6->unk138.unk20->animPaused = TRUE; - for (r5 = 0; r5 < r6->unk9; ++r5) - { - r2 = CreateSprite( - &gUnknown_082F4324, - r6->unk138.unkC[r5]->unk4 + 120, - r6->unk138.unkC[r5]->unk6 + 32, + gSpriteCoordOffsetY = CRUSHER_START_Y; + for (i = 0; i < ARRAY_COUNT(sSpriteSheets) - 1; i++) + LoadCompressedSpriteSheet(&sSpriteSheets[i]); + LoadSpritePalettes(sSpritePals); + + // Create sprite for crusher base + spriteId = CreateSprite(&sSpriteTemplate_CrusherBase, 120, 88, 5); + game->gfx.coreSprite = &gSprites[spriteId]; + game->gfx.coreSprite->oam.priority = 3; + game->gfx.coreSprite->coordOffsetEnabled = TRUE; + game->gfx.coreSprite->animPaused = TRUE; + + // Create sprites for the impact effect + for (i = 0; i < game->playerCount; i++) + { + spriteId = CreateSprite( + &sSpriteTemplate_Impact, + game->gfx.playerCoords[i]->impactXOffset + 120, + game->gfx.playerCoords[i]->impactYOffset + 32, 0 ); - r6->unk138.unk24[r5] = &gSprites[r2]; - r6->unk138.unk24[r5]->oam.priority = 1; - r6->unk138.unk24[r5]->invisible = TRUE; - r6->unk138.unk24[r5]->coordOffsetEnabled = TRUE; - r6->unk138.unk24[r5]->animPaused = TRUE; - } - for (r5 = 0; r5 < ARRAY_COUNT(r6->unk138.unk4C); ++r5) - { - r2 = CreateSprite( - &gUnknown_082F433C, - gUnknown_082F41D2[r5][0] + 120, - gUnknown_082F41D2[r5][1] + 136, + game->gfx.impactSprites[i] = &gSprites[spriteId]; + game->gfx.impactSprites[i]->oam.priority = 1; + game->gfx.impactSprites[i]->invisible = TRUE; + game->gfx.impactSprites[i]->coordOffsetEnabled = TRUE; + game->gfx.impactSprites[i]->animPaused = TRUE; + } + + // Create sprites for sparkle effect + for (i = 0; i < ARRAY_COUNT(game->gfx.sparkleSprites); i++) + { + spriteId = CreateSprite( + &sSpriteTemplate_Sparkle, + sSparkleCoords[i][0] + 120, + sSparkleCoords[i][1] + 136, 6 ); - r6->unk138.unk4C[r5] = &gSprites[r2]; - r6->unk138.unk4C[r5]->oam.priority = 3; - r6->unk138.unk4C[r5]->invisible = TRUE; - r6->unk138.unk4C[r5]->animPaused = TRUE; - r6->unk138.unk4C[r5]->data[0] = r5; - } - for (r5 = 0; r5 < ARRAY_COUNT(r6->unk138.unk78); ++r5) - { - r2 = CreateSprite( - &gUnknown_082F4354, - 24 * r5 + 176, - 8, - 0 - ); - r6->unk138.unk78[r5] = &gSprites[r2]; - r6->unk138.unk78[r5]->oam.priority = 0; - r6->unk138.unk78[r5]->invisible = FALSE; - r6->unk138.unk78[r5]->animPaused = FALSE; - } - DigitObjUtil_CreatePrinter(0, 0, &gUnknown_082F4384[0]); - DigitObjUtil_CreatePrinter(1, 0, &gUnknown_082F4384[1]); - DigitObjUtil_CreatePrinter(2, 0, &gUnknown_082F4384[2]); - if (r6->unk12 == 1) - sub_8022554(&r6->unk138); -} - -void sub_8022960(struct BerryCrushGame *r5) -{ - u8 r4 = 0; - - FreeSpriteTilesByTag(4); - FreeSpriteTilesByTag(3); - FreeSpriteTilesByTag(2); - FreeSpriteTilesByTag(1); - FreeSpritePaletteByTag(4); - FreeSpritePaletteByTag(2); - FreeSpritePaletteByTag(1); - for (; r4 < ARRAY_COUNT(r5->unk138.unk78); ++r4) - DestroySprite(r5->unk138.unk78[r4]); + game->gfx.sparkleSprites[i] = &gSprites[spriteId]; + game->gfx.sparkleSprites[i]->oam.priority = 3; + game->gfx.sparkleSprites[i]->invisible = TRUE; + game->gfx.sparkleSprites[i]->animPaused = TRUE; + game->gfx.sparkleSprites[i]->data[0] = i; + } + + // Create sprites for timer + for (i = 0; i < ARRAY_COUNT(game->gfx.timerSprites); i++) + { + spriteId = CreateSprite(&sSpriteTemplate_Timer, 24 * i + 176, 8, 0); + game->gfx.timerSprites[i] = &gSprites[spriteId]; + game->gfx.timerSprites[i]->oam.priority = 0; + game->gfx.timerSprites[i]->invisible = FALSE; + game->gfx.timerSprites[i]->animPaused = FALSE; + } + DigitObjUtil_CreatePrinter(0, 0, &sDigitObjTemplates[0]); + DigitObjUtil_CreatePrinter(1, 0, &sDigitObjTemplates[1]); + DigitObjUtil_CreatePrinter(2, 0, &sDigitObjTemplates[2]); + + if (game->gameState == STATE_INIT) + HideTimer(&game->gfx); +} + +static void DestroyGameSprites(struct BerryCrushGame *game) +{ + u8 i = 0; + FreeSpriteTilesByTag(TAG_TIMER_DIGITS); + FreeSpriteTilesByTag(GFXTAG_SPARKLE); + FreeSpriteTilesByTag(GFXTAG_IMPACT); + FreeSpriteTilesByTag(TAG_CRUSHER_BASE); + FreeSpritePaletteByTag(TAG_TIMER_DIGITS); + FreeSpritePaletteByTag(PALTAG_EFFECT); + FreeSpritePaletteByTag(TAG_CRUSHER_BASE); + for (i = 0; i < ARRAY_COUNT(game->gfx.timerSprites); i++) + DestroySprite(game->gfx.timerSprites[i]); DigitObjUtil_DeletePrinter(2); DigitObjUtil_DeletePrinter(1); DigitObjUtil_DeletePrinter(0); - for (r4 = 0; r4 < ARRAY_COUNT(r5->unk138.unk4C); ++r4) - DestroySprite(r5->unk138.unk4C[r4]); - for (r4 = 0; r4 < r5->unk9; ++r4) - DestroySprite(r5->unk138.unk24[r4]); - if (r5->unk138.unk20->inUse) - DestroySprite(r5->unk138.unk20); + for (i = 0; i < ARRAY_COUNT(game->gfx.sparkleSprites); i++) + DestroySprite(game->gfx.sparkleSprites[i]); + for (i = 0; i < game->playerCount; i++) + DestroySprite(game->gfx.impactSprites[i]); + if (game->gfx.coreSprite->inUse) + DestroySprite(game->gfx.coreSprite); } -static void sub_8022A20(struct Sprite *sprite) +static void SpriteCB_Impact(struct Sprite *sprite) { if (sprite->animEnded) { @@ -1872,93 +2066,116 @@ static void sub_8022A20(struct Sprite *sprite) } } -void sub_8022A4C(struct Sprite *sprite) +static void SpriteCB_Sparkle_End(struct Sprite *sprite) { - u8 r1 = 0; - SpriteCallback r5 = SpriteCallbackDummy; - - for (; r1 < ARRAY_COUNT(sprite->data); ++r1) - sprite->data[r1] = 0; + u8 i; + for (i = 0; i < ARRAY_COUNT(sprite->data); i++) + sprite->data[i] = 0; sprite->pos2.x = 0; sprite->pos2.y = 0; sprite->invisible = TRUE; sprite->animPaused = TRUE; - sprite->callback = r5; + sprite->callback = SpriteCallbackDummy; } -void sub_8022A94(struct Sprite *sprite) +#define sX data[0] +#define sYSpeed data[1] +#define sYAccel data[2] +#define sXSpeed data[3] +#define sSinIdx data[4] +#define sSinSpeed data[5] +#define sAmplitude data[6] +// The last element (data[7]) is a bitfield. +// The first 15 bits are the y coord to stop at. +// The last bit is a flag for whether or not to move on the x too +#define sBitfield data[7] +#define MASK_TARGET_Y 0x7FFF +#define F_MOVE_HORIZ 0x8000 + +static void SpriteCB_Sparkle(struct Sprite *sprite) { - s16 *r4 = sprite->data; + s16 *data = sprite->data; - r4[1] += r4[2]; - sprite->pos2.y += r4[1] >> 8; - if (r4[7] & 0x8000) + sYSpeed += sYAccel; + sprite->pos2.y += sYSpeed >> 8; + if (sBitfield & F_MOVE_HORIZ) { - sprite->data[0] += r4[3]; - r4[4] += r4[5]; - sprite->pos2.x = Sin(r4[4] >> 7, r4[6]); - if (r4[7] & 0x8000 && r4[4] >> 7 > 126) + sprite->sX += sXSpeed; + sSinIdx += sSinSpeed; + sprite->pos2.x = Sin(sSinIdx >> 7, sAmplitude); + if (sBitfield & F_MOVE_HORIZ && sSinIdx >> 7 > 126) { sprite->pos2.x = 0; - r4[7] &= 0x7FFF; + sBitfield &= MASK_TARGET_Y; } } - sprite->pos1.x = r4[0] >> 7; - if (sprite->pos1.y + sprite->pos2.y > (r4[7] & 0x7FFF)) - sprite->callback = sub_8022A4C; -} - -void sub_8022B28(struct Sprite *sprite) -{ - s16 *r7 = sprite->data; - s16 r4, r5; - s32 r2; - u32 r8 = 0; - - r2 = 640; - r7[1] = r2; - r7[2] = 32; - r7[7] = 168; - r4 = sprite->pos2.x * 128; - r5 = MathUtil_Div16Shift(7, (168 - sprite->pos1.y) << 7, (r2 + 32) >> 1); - sprite->data[0] = sprite->pos1.x << 7; - r7[3] = MathUtil_Div16Shift(7, r4, r5); - r2 = MathUtil_Mul16Shift(7, r5, 85); - r7[4] = r8; - r7[5] = MathUtil_Div16Shift(7, Q_8_8(63.5), r2); - r7[6] = sprite->pos2.x / 4; - r7[7] |= 0x8000; - sprite->pos2.y = r8; - sprite->pos2.x = r8; - sprite->callback = sub_8022A94; + sprite->pos1.x = sX >> 7; + if (sprite->pos1.y + sprite->pos2.y > (sBitfield & MASK_TARGET_Y)) + sprite->callback = SpriteCB_Sparkle_End; +} + +static void SpriteCB_Sparkle_Init(struct Sprite *sprite) +{ + s16 *data = sprite->data; + s16 xMult, xDiv; + s32 var; + u32 zero = 0; + + var = 640; + sYSpeed = var; + sYAccel = 32; + sBitfield = 168; // Setting bits in MASK_TARGET_Y + xMult = sprite->pos2.x * 128; + xDiv = MathUtil_Div16Shift(7, (168 - sprite->pos1.y) << 7, (var + 32) >> 1); + sprite->sX = sprite->pos1.x << 7; + sXSpeed = MathUtil_Div16Shift(7, xMult, xDiv); + var = MathUtil_Mul16Shift(7, xDiv, 85); + sSinIdx = zero; + sSinSpeed = MathUtil_Div16Shift(7, Q_8_8(63.5), var); + sAmplitude = sprite->pos2.x / 4; + sBitfield |= F_MOVE_HORIZ; + sprite->pos2.y = zero; + sprite->pos2.x = zero; + sprite->callback = SpriteCB_Sparkle; sprite->animPaused = FALSE; sprite->invisible = FALSE; } -void sub_8022BEC(u16 r5, u8 r4, u8 *r7) +#undef sX +#undef sYSpeed +#undef sYAccel +#undef sXSpeed +#undef sSinIdx +#undef sSinSpeed +#undef sAmplitude +#undef sBitfield +#undef MASK_TARGET_Y +#undef F_MOVE_HORIZ + +static void RunOrScheduleCommand(u16 cmdId, u8 mode, u8 *args) { - struct BerryCrushGame *r6 = GetBerryCrushGame(); + struct BerryCrushGame *game = GetBerryCrushGame(); - if (r5 > 25) - r5 = 0; - switch (r4) + if (cmdId >= ARRAY_COUNT(sBerryCrushCommands)) + cmdId = CMD_NONE; + switch (mode) { - case 0: - if (r5 != 0) - gUnknown_082F43CC[r5](r6, r7); - if (r6->unkE > 25) - r6->unkE = r4; - r6->unk4 = gUnknown_082F43CC[r6->unkE]; + case RUN_CMD: + if (cmdId != CMD_NONE) + sBerryCrushCommands[cmdId](game, args); + if (game->nextCmd >= ARRAY_COUNT(sBerryCrushCommands)) + game->nextCmd = CMD_NONE; + game->cmdCallback = sBerryCrushCommands[game->nextCmd]; break; - case 1: - r6->unk4 = gUnknown_082F43CC[r5]; + case SCHEDULE_CMD: + game->cmdCallback = sBerryCrushCommands[cmdId]; break; } } -static u32 BerryCrushCommand_BeginNormalPaletteFade(struct BerryCrushGame *game, u8 *params) +static u32 Cmd_BeginNormalPaletteFade(struct BerryCrushGame *game, u8 *args) { - // params points to packed values: + // args points to packed values: // bytes 0-3: selectedPals (bitfield) // byte 4: delay // byte 5: startY @@ -1969,126 +2186,128 @@ static u32 BerryCrushCommand_BeginNormalPaletteFade(struct BerryCrushGame *game, u16 color; u32 selectedPals[2]; - selectedPals[0] = (u32)params[0]; - selectedPals[1] = (u32)params[1]; + selectedPals[0] = (u32)args[0]; + selectedPals[1] = (u32)args[1]; selectedPals[1] <<= 8; selectedPals[0] |= selectedPals[1]; - selectedPals[1] = (u32)params[2]; + selectedPals[1] = (u32)args[2]; selectedPals[1] <<= 16; selectedPals[0] |= selectedPals[1]; - selectedPals[1] = (u32)params[3]; + selectedPals[1] = (u32)args[3]; selectedPals[1] <<= 24; selectedPals[0] |= selectedPals[1]; - params[0] = params[9]; + args[0] = args[9]; - color = params[8]; + color = args[8]; color <<= 8; - color |= params[7]; + color |= args[7]; gPaletteFade.bufferTransferDisabled = FALSE; - BeginNormalPaletteFade(selectedPals[0], params[4], params[5], params[6], color); + BeginNormalPaletteFade(selectedPals[0], args[4], args[5], args[6], color); UpdatePaletteFade(); - game->unkE = 2; + game->nextCmd = CMD_WAIT_FADE; return 0; } -static u32 sub_8022CB0(struct BerryCrushGame *r4, u8 *r5) +static u32 Cmd_WaitPaletteFade(struct BerryCrushGame *game, u8 *args) { - switch (r4->unkC) + switch (game->cmdState) { case 0: if (UpdatePaletteFade()) return 0; - if(r5[0] != 0) - ++r4->unkC; + if(args[0] != 0) + game->cmdState++; else - r4->unkC = 3; + game->cmdState = 3; return 0; case 1: Rfu_SetLinkStandbyCallback(); - ++r4->unkC; + game->cmdState++; return 0; case 2: if (IsLinkTaskFinished()) { - ++r4->unkC; + game->cmdState++; return 0; } return 0; case 3: - sub_8022BEC(r4->unkF, 1, NULL); - r4->unkC = 0; + RunOrScheduleCommand(game->afterPalFadeCmd, SCHEDULE_CMD, NULL); + game->cmdState = 0; return 0; default: - ++r4->unkC; + game->cmdState++; return 0; } } -static u32 sub_8022D14(struct BerryCrushGame *r7, u8 *r5) +static u32 Cmd_PrintMessage(struct BerryCrushGame *game, u8 *args) { - u16 r4 = r5[3]; + u16 keys = args[3]; + keys <<= 8; + keys |= args[2]; - r4 <<= 8; - r4 |= r5[2]; - switch (r7->unkC) + switch (game->cmdState) { case 0: DrawDialogueFrame(0, 0); - if (r5[1] & 2) + if (args[1] & F_MSG_EXPAND) { - StringExpandPlaceholders(gStringVar4, gUnknown_082F32A4[r5[0]]); - AddTextPrinterParameterized2(0, 1, gStringVar4, r7->unkB, 0, 2, 1, 3); + StringExpandPlaceholders(gStringVar4, sMessages[args[0]]); + AddTextPrinterParameterized2(0, 1, gStringVar4, game->textSpeed, 0, 2, 1, 3); } else { - AddTextPrinterParameterized2(0, 1, gUnknown_082F32A4[r5[0]], r7->unkB, 0, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, sMessages[args[0]], game->textSpeed, 0, 2, 1, 3); } CopyWindowToVram(0, 3); break; case 1: if (!IsTextPrinterActive(0)) { - if (r4 == 0) - ++r7->unkC; + // If no wait keys are given, skip + // waiting state below + if (keys == 0) + game->cmdState++; break; } return 0; case 2: - if (!(r4 & gMain.newKeys)) + if (!JOY_NEW(keys)) return 0; break; case 3: - if (r5[1] & 1) + if (args[1] & F_MSG_CLEAR) ClearDialogWindowAndFrame(0, 1); - sub_8022BEC(r7->unkE, 1, NULL); - r7->unkC = r5[4]; + RunOrScheduleCommand(game->nextCmd, SCHEDULE_CMD, NULL); + game->cmdState = args[4]; return 0; } - ++r7->unkC; + game->cmdState++; return 0; } -static u32 sub_8022E1C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_ShowGameDisplay(struct BerryCrushGame *game, u8 *args) { - if (InitBerryCrushDisplay() != 0) - sub_8022BEC(r4->unkE, 0, r4->unk36); + if (ShowGameDisplay()) + RunOrScheduleCommand(game->nextCmd, RUN_CMD, game->commandArgs); return 0; } -static u32 sub_8022E3C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_HideGameDisplay(struct BerryCrushGame *game, u8 *args) { - if (sub_802130C() != 0) - sub_8022BEC(r4->unkE, 0, r4->unk36); + if (HideGameDisplay()) + RunOrScheduleCommand(game->nextCmd, RUN_CMD, game->commandArgs); return 0; } -static u32 sub_8022E5C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_SignalReadyToBegin(struct BerryCrushGame *game, u8 *args) { - switch (r4->unkC) + switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); @@ -2097,55 +2316,55 @@ static u32 sub_8022E5C(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1 if (IsLinkTaskFinished()) { PlayNewMapMusic(MUS_RG_GAME_CORNER); - sub_8022BEC(7, 1, NULL); - r4->unk12 = 3; - r4->unkC = 0; + RunOrScheduleCommand(CMD_ASK_PICK_BERRY, SCHEDULE_CMD, NULL); + game->gameState = STATE_PICK_BERRY; + game->cmdState = 0; } return 0; } - ++r4->unkC; + game->cmdState++; return 0; } -static u32 sub_8022EAC(struct BerryCrushGame *r4, u8 *r5) +static u32 Cmd_AskPickBerry(struct BerryCrushGame *game, u8 *args) { - switch (r4->unkC) + switch (game->cmdState) { default: - ++r4->unkC; + game->cmdState++; break; case 0: - sub_8024578(r4); - sub_8024644(r5, 0, 1, 0, 1); - r4->unkE = 7; - sub_8022BEC(3, 1, NULL); + ResetGame(game); + SetPrintMessageArgs(args, MSG_PICK_BERRY, F_MSG_CLEAR, 0, 1); + game->nextCmd = CMD_ASK_PICK_BERRY; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); break; case 1: - r4->unkE = 8; - sub_8022BEC(5, 1, NULL); - r4->unkC = 2; + game->nextCmd = CMD_PICK_BERRY; + RunOrScheduleCommand(CMD_HIDE_GAME, SCHEDULE_CMD, NULL); + game->cmdState = 2; break; } return 0; } -static u32 sub_8022F04(struct BerryCrushGame *r0, __attribute__((unused)) u8 *r1) +static u32 Cmd_GoToBerryPouch(struct BerryCrushGame *game, u8 *args) { - r0->unk4 = NULL; - SetMainCallback2(BerryCrush_SetupMainTask); + game->cmdCallback = NULL; + SetMainCallback2(ChooseBerry); return 0; } -static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2) +static u32 Cmd_WaitForOthersToPickBerries(struct BerryCrushGame *game, u8 *args) { - u8 r3; + u8 i; - switch (r5->unkC) + switch (game->cmdState) { case 0: - sub_8024644(r2, 1, 0, 0, 1); - r5->unkE = 9; - sub_8022BEC(3, 1, NULL); + SetPrintMessageArgs(args, MSG_WAIT_PICK, 0, 0, 1); + game->nextCmd = CMD_WAIT_BERRIES; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); return 0; case 1: Rfu_SetLinkStandbyCallback(); @@ -2153,126 +2372,131 @@ static u32 sub_8022F1C(struct BerryCrushGame *r5, u8 *r2) case 2: if (!IsLinkTaskFinished()) return 0; - memset(r5->unk42, 0, sizeof(r5->unk42)); - r5->unk42[0] = r5->unk98[r5->unk8].unkC; - SendBlock(0, r5->unk42, 2); + + // Send player's chosen berry to partners + memset(game->sendCmd, 0, sizeof(game->sendCmd)); + game->sendCmd[0] = game->players[game->localId].berryId; + SendBlock(0, game->sendCmd, 2); break; case 3: if (!IsLinkTaskFinished()) return 0; - r5->unk10 = 0; + game->cmdTimer = 0; break; case 4: - if (GetBlockReceivedStatus() != gUnknown_082F4448[r5->unk9 - 2]) + // Wait for partners responses + if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2]) return 0; - for (r3 = 0; r3 < r5->unk9; ++r3) + + // Read partners chosen berries + for (i = 0; i < game->playerCount; i++) { - r5->unk98[r3].unkC = gBlockRecvBuffer[r3][0]; - if (r5->unk98[r3].unkC > 0xB0) - r5->unk98[r3].unkC = 0; - r5->unk18 += gUnknown_0858AB24[r5->unk98[r3].unkC].unk0; - r5->unk1C += gUnknown_0858AB24[r5->unk98[r3].unkC].unk1; + game->players[i].berryId = gBlockRecvBuffer[i][0]; + if (game->players[i].berryId > LAST_BERRY_INDEX + 1) + game->players[i].berryId = 0; + game->targetAPresses += gBerryCrush_BerryData[game->players[i].berryId].difficulty; + game->powder += gBerryCrush_BerryData[game->players[i].berryId].powder; } - r5->unk10 = 0; + game->cmdTimer = 0; ResetBlockReceivedFlags(); - r5->unk20 = MathUtil_Div32(Q_24_8(r5->unk18), Q_24_8(32)); + game->targetDepth = MathUtil_Div32(Q_24_8(game->targetAPresses), Q_24_8(32)); break; case 5: ClearDialogWindowAndFrame(0, 1); - sub_8022BEC(10, 1, NULL); - r5->unk12 = 4; - r5->unkC = 0; + RunOrScheduleCommand(CMD_DROP_BERRIES, SCHEDULE_CMD, NULL); + game->gameState = STATE_DROP_BERRIES; + game->cmdState = 0; return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8023070(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_DropBerriesIntoCrusher(struct BerryCrushGame *game, u8 *args) { - switch (r4->unkC) + switch (game->cmdState) { case 0: - sub_80214A8(r4, &r4->unk138); + CreateBerrySprites(game, &game->gfx); Rfu_SetLinkStandbyCallback(); break; case 1: if (!IsLinkTaskFinished()) return 0; - r4->unk138.unk0 = 0; - r4->unk138.unk1 = 0; - r4->unk138.unk2 = 0; - r4->unk138.unk3 = 0; + game->gfx.counter = 0; + game->gfx.vibrationIdx = 0; + game->gfx.numVibrations = 0; + game->gfx.vibrating = FALSE; break; case 2: - r4->unk138.unk38[r4->unk138.unk0]->callback = sub_8021608; - r4->unk138.unk38[r4->unk138.unk0]->affineAnimPaused = FALSE; + game->gfx.berrySprites[game->gfx.counter]->callback = SpriteCB_DropBerryIntoCrusher; + game->gfx.berrySprites[game->gfx.counter]->affineAnimPaused = FALSE; PlaySE(SE_BALL_THROW); break; case 3: - if (r4->unk138.unk38[r4->unk138.unk0]->callback == sub_8021608) + if (game->gfx.berrySprites[game->gfx.counter]->callback == SpriteCB_DropBerryIntoCrusher) return 0; - r4->unk138.unk38[r4->unk138.unk0] = NULL; - ++r4->unk138.unk0; + game->gfx.berrySprites[game->gfx.counter] = NULL; + game->gfx.counter++; Rfu_SetLinkStandbyCallback(); break; case 4: if (!IsLinkTaskFinished()) return 0; - if (r4->unk138.unk0 < r4->unk9) + if (game->gfx.counter < game->playerCount) { - r4->unkC = 2; + game->cmdState = 2; return 0; } - r4->unk138.unk0 = 0; + game->gfx.counter = 0; break; case 5: - sub_80216A8(r4, &r4->unk138); + BerryCrushFreeBerrySpriteGfx(game, &game->gfx); Rfu_SetLinkStandbyCallback(); break; case 6: if (!IsLinkTaskFinished()) return 0; PlaySE(SE_FALL); - sub_8022BEC(11, 1, NULL); - r4->unk12 = 5; - r4->unkC = 0; + RunOrScheduleCommand(CMD_DROP_LID, SCHEDULE_CMD, NULL); + game->gameState = STATE_DROP_LID; + game->cmdState = 0; return 0; } - ++r4->unkC; + game->cmdState++; return 0; } -static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_DropLid(struct BerryCrushGame *game, u8 *args) { - switch (r4->unkC) + switch (game->cmdState) { case 0: - r4->unk2A += 4; - if (r4->unk2A < 0) + game->depth += 4; + if (game->depth < 0) return 0; - r4->unk2A = 0; - r4->unk138.unk1 = 4; - r4->unk138.unk0 = 0; - r4->unk138.unk2 = gUnknown_082F326C[r4->unk138.unk1][0]; + game->depth = 0; + game->gfx.vibrationIdx = 4; + game->gfx.counter = 0; + game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; PlaySE(SE_M_STRENGTH); break; case 1: - r4->unk2C = gUnknown_082F326C[r4->unk138.unk1][r4->unk138.unk0]; - SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C); - ++r4->unk138.unk0; - if (r4->unk138.unk0 < r4->unk138.unk2) + game->vibration = sIntroOutroVibrationData[game->gfx.vibrationIdx][game->gfx.counter]; + SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); + game->gfx.counter++; + if (game->gfx.counter < game->gfx.numVibrations) return 0; - if (r4->unk138.unk1 == 0) + if (game->gfx.vibrationIdx == 0) break; - --r4->unk138.unk1; - r4->unk138.unk2 = gUnknown_082F326C[r4->unk138.unk1][0]; - r4->unk138.unk0 = 0; + game->gfx.vibrationIdx--; + game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; + game->gfx.counter = 0; return 0; case 2: - r4->unk2C = 0; + game->vibration = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); @@ -2281,23 +2505,23 @@ static u32 sub_80231B8(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r case 3: if (!IsLinkTaskFinished()) return 0; - sub_8022BEC(12, 1, NULL); - r4->unk12 = 6; - r4->unkC = 0; + RunOrScheduleCommand(CMD_COUNTDOWN, SCHEDULE_CMD, NULL); + game->gameState = STATE_COUNTDOWN; + game->cmdState = 0; return 0; } - ++r4->unkC; + game->cmdState++; return 0; } -static u32 sub_80232EC(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_Countdown(struct BerryCrushGame *game, u8 *args) { - switch (r4-> unkC) + switch (game->cmdState) { case 1: if (!IsLinkTaskFinished()) return 0; - StartMinigameCountdown(0x1000, 0x1000, 120, 80, 0); + StartMinigameCountdown(TAG_COUNTDOWN, TAG_COUNTDOWN, 120, 80, 0); break; case 2: if (IsMinigameCountdownRunning()) @@ -2309,405 +2533,442 @@ static u32 sub_80232EC(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r case 3: if (!IsLinkTaskFinished()) return 0; - r4->unk138.unk0 = 0; - r4->unk138.unk1 = 0; - r4->unk138.unk2 = 0; - r4->unk138.unk3 = 0; - r4->unk10 = 0; - if (r4->unk8 == 0) - sub_8022BEC(13, 1, NULL); + game->gfx.counter = 0; + game->gfx.vibrationIdx = 0; + game->gfx.numVibrations = 0; + game->gfx.vibrating = FALSE; + game->cmdTimer = 0; + if (game->localId == 0) + RunOrScheduleCommand(CMD_PLAY_GAME_LEADER, SCHEDULE_CMD, NULL); else - sub_8022BEC(14, 1, NULL); - r4->unk12 = 7; - r4->unkC = 0; + RunOrScheduleCommand(CMD_PLAY_GAME_MEMBER, SCHEDULE_CMD, NULL); + game->gameState = STATE_PLAYING; + game->cmdState = 0; return 0; } - ++r4->unkC; + game->cmdState++; return 0; } -void sub_802339C(struct BerryCrushGame *r4) +// Receive and process data from all players +// Only used by the link leader +static void HandlePartnerInput(struct BerryCrushGame *game) { - u8 r8 = 0; - u8 r7 = 0; - u16 r3; - s32 r2_ = 0; - struct BerryCrushGame_4E *r2; + u8 numPlayersPressed = 0; + u8 i = 0; + u16 timeDiff; + s32 temp = 0; + struct BerryCrushGame_LinkState *linkState; - for (r7 = 0; r7 < r4->unk9; r7++) + for (i = 0; i < game->playerCount; i++) { - r2 = (struct BerryCrushGame_4E *)gRecvCmds[r7]; - if ((r2->unk0 & 0xFF00) != RFUCMD_SEND_PACKET) + linkState = (struct BerryCrushGame_LinkState *)gRecvCmds[i]; + + // Skip player if we have not received a packet from them + if ((linkState->rfuCmd & 0xFF00) != RFUCMD_SEND_PACKET) continue; - if (r2->unk2 != 2) + if (linkState->sendFlag != SEND_GAME_STATE) continue; - if (r2->unk4_2) + if (linkState->pushedAButton) { - r4->unk5C.unk02_3 |= gUnknown_082F325C[r7]; - r4->unk98[r7].unk1C = 1; - ++r4->unk98[r7].unk16; - ++r8; - r3 = r4->unk28 - r4->unk98[r7].unkE; - if (r3 >= r4->unk98[r7].unk12 - 1 && r3 <= r4->unk98[r7].unk12 + 1) + game->localState.playerPressedAFlags |= sBitTable[i]; + game->players[i].inputState = INPUT_STATE_HIT; + game->players[i].numAPresses++; + numPlayersPressed++; + timeDiff = game->timer - game->players[i].inputTime; + + // If the interval between inputs is regular, the input is considered "neat" + // This counts toward the player's neatness score + if (timeDiff >= game->players[i].timeSincePrevInput - 1 + && timeDiff <= game->players[i].timeSincePrevInput + 1) { - ++r4->unk98[r7].unk10; - r4->unk98[r7].unk12 = r3; - if (r4->unk98[r7].unk10 > r4->unk98[r7].unk14) - r4->unk98[r7].unk14 = r4->unk98[r7].unk10; + // On neat input streak + game->players[i].neatInputStreak++; + game->players[i].timeSincePrevInput = timeDiff; + if (game->players[i].neatInputStreak > game->players[i].maxNeatInputStreak) + game->players[i].maxNeatInputStreak = game->players[i].neatInputStreak; } else { - r4->unk98[r7].unk10 = 0; - r4->unk98[r7].unk12 = r3; + // End neat input streak + game->players[i].neatInputStreak = 0; + game->players[i].timeSincePrevInput = timeDiff; } - r4->unk98[r7].unkE = r4->unk28; - ++r4->unk98[r7].unk1B; - if (r4->unk98[r7].unk1B > 2) - r4->unk98[r7].unk1B = 0; + + game->players[i].inputTime = game->timer; + game->players[i].inputFlags++; + if (game->players[i].inputFlags > F_INPUT_HIT_B) + game->players[i].inputFlags = 0; } else { - r4->unk98[r7].unk1C = 0; + game->players[i].inputState = INPUT_STATE_NONE; } } - if (r8 > 1) + if (numPlayersPressed > 1) { - for (r7 = 0; r7 < r4->unk9; ++r7) + // For each player that pressed A, flag their input as synchronous + // This is used to change their impact sprite to a big impact + for (i = 0; i < game->playerCount; i++) { - if (!r4->unk98[r7].unk1C) + if (game->players[i].inputState == INPUT_STATE_NONE) continue; - r4->unk98[r7].unk1C |= 2; - ++r4->unk98[r7].unk18; + game->players[i].inputState |= INPUT_STATE_HIT_SYNC; + game->players[i].numSyncedAPresses++; } } - if (r8 == 0) + if (numPlayersPressed == 0) return; - r4->unk2E += r8; - r8 += gUnknown_082F3264[r8 - 1]; - r4->unk34 += r8; - r4->unk1A += r8; - if (r4->unk18 - r4->unk1A > 0) - { - r2_ = (s32)r4->unk1A; - r2_ <<= 8; - r2_ = MathUtil_Div32(r2_, r4->unk20); - r2_ >>= 8; - r4->unk24 = (u8)r2_; + game->bigSparkleCounter += numPlayersPressed; + numPlayersPressed += sSyncPressBonus[numPlayersPressed - 1]; + game->sparkleCounter += numPlayersPressed; + game->totalAPresses += numPlayersPressed; + if (game->targetAPresses - game->totalAPresses > 0) + { + temp = (s32)game->totalAPresses; + temp = Q_24_8(temp); + temp = MathUtil_Div32(temp, game->targetDepth); + temp = Q_24_8_TO_INT(temp); + game->newDepth = (u8)temp; return; } - r4->unk24 = 32; - r4->unk5C.unk02_0 = 1; + // Target number of A presses has been reached, game is complete + game->newDepth = 32; + game->localState.endGame = TRUE; } -void sub_8023558(struct BerryCrushGame *r3) +// Updates the crusher, input flags, and timer to send to group members +// Only used by the link leader +static void UpdateLeaderGameState(struct BerryCrushGame *game) { - u8 r6 = 0; - u16 r1 = 0; - u16 r2 = 0; - u8 r4 = 0; + u8 numPlayersPressed = 0; + u16 flags = 0; + u16 temp = 0; + u8 i = 0; - for (r4 = 0; r4 < r3->unk9; ++r4) + for (i = 0; i < game->playerCount; i++) { - if (r3->unk98[r4].unk1C != 0) + if (game->players[i].inputState != INPUT_STATE_NONE) { - ++r6; - r1 = r3->unk98[r4].unk1B + 1; - if (r3->unk98[r4].unk1C & 2) - r1 |= 4; - r1 <<= 3 * r4; - r3->unk5C.unk08 |= r1; + numPlayersPressed++; + flags = game->players[i].inputFlags + F_INPUT_HIT_A; + if (game->players[i].inputState & INPUT_STATE_HIT_SYNC) + flags |= F_INPUT_HIT_SYNC; + flags <<= INPUT_FLAGS_PER_PLAYER * i; + game->localState.inputFlags |= flags; } } - r2 = (u16)r3->unk24; - r3->unk5C.unk04 = r2; - if (r6 == 0) + temp = (u16)game->newDepth; + game->localState.depth = temp; + if (numPlayersPressed == 0) { - if (r3->unk138.unk3 != 0) - ++r3->unk138.unk0; + if (game->gfx.vibrating) + game->gfx.counter++; } - else if (r3->unk138.unk3 != 0) + else if (game->gfx.vibrating) { - if (r6 != r3->unk138.unk1) + if (numPlayersPressed != game->gfx.vibrationIdx) { - r3->unk138.unk1 = r6 - 1; - r3->unk138.unk2 = gUnknown_082F3290[r6 - 1][0]; + game->gfx.vibrationIdx = numPlayersPressed - 1; + game->gfx.numVibrations = sVibrationData[numPlayersPressed - 1][0]; } else { - ++r3->unk138.unk0; + game->gfx.counter++; } } else { - r3->unk138.unk0 = 0; - r3->unk138.unk1 = r6 - 1; - r3->unk138.unk2 = gUnknown_082F3290[r6 - 1][0]; - r3->unk138.unk3 = 1; + game->gfx.counter = 0; + game->gfx.vibrationIdx = numPlayersPressed - 1; + game->gfx.numVibrations = sVibrationData[numPlayersPressed - 1][0]; + game->gfx.vibrating = TRUE; } - if (r3->unk138.unk3 != 0) + if (game->gfx.vibrating) { - if (r3->unk138.unk0 >= r3->unk138.unk2) + if (game->gfx.counter >= game->gfx.numVibrations) { - r3->unk138.unk0 = 0; - r3->unk138.unk1 = 0; - r3->unk138.unk2 = 0; - r3->unk138.unk3 = 0; - r1 = 0; + game->gfx.counter = 0; + game->gfx.vibrationIdx = 0; + game->gfx.numVibrations = 0; + game->gfx.vibrating = FALSE; + temp = 0; } else { - r1 = gUnknown_082F3290[r3->unk138.unk1][r3->unk138.unk0 + 1]; + temp = sVibrationData[game->gfx.vibrationIdx][game->gfx.counter + 1]; } - r3->unk5C.unk03 = (u8)r1; + game->localState.vibration = (u8)temp; } else { - r3->unk5C.unk03 = 0; + game->localState.vibration = 0; } - r3->unk5C.unk06 = r3->unk26; + game->localState.timer = game->leaderTimer; } -void sub_80236B8(struct BerryCrushGame *r5) +// Checks for input and sends data to group members +static void HandlePlayerInput(struct BerryCrushGame *game) { if (JOY_NEW(A_BUTTON)) - r5->unk5C.unk02_2 = 1; + game->localState.pushedAButton = TRUE; + if (JOY_HELD(A_BUTTON)) { - if (r5->unk98[r5->unk8].unk1A < r5->unk28) - ++r5->unk98[r5->unk8].unk1A; + if (game->players[game->localId].timePressingA < game->timer) + game->players[game->localId].timePressingA++; } - if (r5->unk8 != 0 && r5->unk5C.unk02_2 == 0) + + // Only send data to other players if you are the leader or you pressed A + if (game->localId != 0 && !game->localState.pushedAButton) return; - r5->unk5C.unk00 = 2; - if (r5->unk28 % 30 == 0) + game->localState.sendFlag = SEND_GAME_STATE; + + // Every 30 frames, check whether the sparkles produced should be big, + // depending on how many A presses there were in that time + if (game->timer % 30 == 0) { - if (r5->unk2E > gUnknown_082F4444[r5->unk9 - 2]) + if (game->bigSparkleCounter > sBigSparkleThresholds[game->playerCount - 2]) { - ++r5->unk30; - r5->unk25_4 = 1; + game->numBigSparkles++; + game->bigSparkle = TRUE; } else { - r5->unk25_4 = 0; + game->bigSparkle = FALSE; } - r5->unk2E = 0; - ++r5->unk32; - } - if (r5->unk28 % 15 == 0) - { - if (r5->unk34 < gUnknown_082F4434[r5->unk9 - 2][0]) - r5->unk25_5 = 0; - else if (r5->unk34 < gUnknown_082F4434[r5->unk9 - 2][1]) - r5->unk25_5 = 1; - else if (r5->unk34 < gUnknown_082F4434[r5->unk9 - 2][2]) - r5->unk34 = 2; // typo since r5->unk34 will be reset? - else if (r5->unk34 < gUnknown_082F4434[r5->unk9 - 2][3]) - r5->unk34 = 3; // typo since r5->unk34 will be reset? + game->bigSparkleCounter = 0; + game->numBigSparkleChecks++; + } + + // Every 15 frames, update the amount of sparkles that should be produced, + // depending on how many A presses there were in that time (including the bonus) + if (game->timer % 15 == 0) + { + // BUG: The wrong field is used twice below + // As a result, only a sparkleAmount of 0, 1, or 4 is attainable + #ifdef BUGFIX + #define field sparkleAmount + #else + #define field sparkleCounter + #endif + + if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][0]) + game->sparkleAmount = 0; + else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][1]) + game->sparkleAmount = 1; + else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][2]) + game->field = 2; + else if (game->sparkleCounter < sSparkleThresholds[game->playerCount - 2][3]) + game->field = 3; else - r5->unk25_5 = 4; - r5->unk34 = 0; + game->sparkleAmount = 4; + game->sparkleCounter = 0; + + #undef field } else { - ++r5->unk10; - if (r5->unk10 > 60) + game->cmdTimer++; + if (game->cmdTimer > 60) { - if (r5->unk10 > 70) + if (game->cmdTimer > 70) { - sub_8011AC8(); - r5->unk10 = 0; + ClearRecvCommands(); + game->cmdTimer = 0; } - else if (r5->unk5C.unk02_3 == 0) + else if (game->localState.playerPressedAFlags == 0) { - sub_8011AC8(); - r5->unk10 = 0; + ClearRecvCommands(); + game->cmdTimer = 0; } } } - if (r5->unk28 >= 36000) - r5->unk5C.unk02_0 = 1; - r5->unk5C.unk02_1 = r5->unk25_4; - r5->unk5C.unk0A = r5->unk25_5; - memcpy(r5->unk42, &r5->unk5C, sizeof(r5->unk42)); - Rfu_SendPacket(r5->unk42); + if (game->timer >= MAX_TIME) + game->localState.endGame = TRUE; + game->localState.bigSparkle = game->bigSparkle; + game->localState.sparkleAmount = game->sparkleAmount; + memcpy(game->sendCmd, &game->localState, sizeof(game->sendCmd)); + Rfu_SendPacket(game->sendCmd); } -void sub_802385C(struct BerryCrushGame *r5) +static void RecvLinkData(struct BerryCrushGame *game) { - u8 r4 = 0; - struct BerryCrushGame_4E *r4_ = NULL; + u8 i = 0; + struct BerryCrushGame_LinkState *linkState = NULL; + + for (i = 0; i < game->playerCount; i++) + game->players[i].inputState = INPUT_STATE_NONE; - for (r4 = 0; r4 < r5->unk9; r4++) - r5->unk98[r4].unk1C = 0; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) { - r5->unk25_2 = 0; + game->playedSound = FALSE; return; } if (gRecvCmds[0][1] != 2) { - r5->unk25_2 = 0; + game->playedSound = FALSE; return; } - memcpy(r5->unk4E, gRecvCmds[0], 14); - r4_ = (struct BerryCrushGame_4E *)&r5->unk4E; - r5->unk2A = r4_->unk6; - r5->unk2C = (s16)r4_->unk5; - r5->unk28 = r4_->unk8; - sub_80216E0(r5, &(r5->unk138)); - if (r4_->unk4_0) - { - r5->unk25_3 = 1; - } + memcpy(game->recvCmd, gRecvCmds[0], sizeof(game->recvCmd)); + linkState = (struct BerryCrushGame_LinkState *)&game->recvCmd; + game->depth = linkState->depth; + game->vibration = (s16)linkState->vibration; + game->timer = linkState->timer; + UpdateInputEffects(game, &(game->gfx)); + + if (linkState->endGame) + game->endGame = TRUE; } -static u32 sub_80238F0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_PlayGame_Leader(struct BerryCrushGame *game, u8 *args) { - memset(&r4->unk5C, 0, sizeof(r4->unk5C)); - memset(&r4->unk4E, 0, sizeof(r4->unk4E)); - sub_802385C(r4); - SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C); - if (r4->unk25_3) + memset(&game->localState, 0, sizeof(game->localState)); + memset(&game->recvCmd, 0, sizeof(game->recvCmd)); + RecvLinkData(game); + SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); + if (game->endGame) { - if (r4->unk28 >= 36000) + if (game->timer >= MAX_TIME) { - r4->unk28 = 36000; - sub_8022BEC(16, 1, NULL); + game->timer = MAX_TIME; + RunOrScheduleCommand(CMD_TIMES_UP, SCHEDULE_CMD, NULL); } else { - sub_8022BEC(15, 1, NULL); + RunOrScheduleCommand(CMD_FINISH_GAME, SCHEDULE_CMD, NULL); } - r4->unk10 = 0; - r4->unkC = 0; + game->cmdTimer = 0; + game->cmdState = 0; return 0; } else { - ++r4->unk26; - sub_802339C(r4); - sub_8023558(r4); - sub_80236B8(r4); + game->leaderTimer++; + HandlePartnerInput(game); + UpdateLeaderGameState(game); + HandlePlayerInput(game); return 0; } } -static u32 sub_8023998(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_PlayGame_Member(struct BerryCrushGame *game, u8 *args) { - memset(&r4->unk5C, 0, sizeof(r4->unk5C)); - memset(&r4->unk4E, 0, sizeof(r4->unk4E)); - sub_802385C(r4); - SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C); - if (r4->unk25_3) + memset(&game->localState, 0, sizeof(game->localState)); + memset(&game->recvCmd, 0, sizeof(game->recvCmd)); + RecvLinkData(game); + SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); + if (game->endGame) { - if (r4->unk28 >= 36000) + if (game->timer >= MAX_TIME) { - r4->unk28 = 36000; - sub_8022BEC(16, 1, NULL); + game->timer = MAX_TIME; + RunOrScheduleCommand(CMD_TIMES_UP, SCHEDULE_CMD, NULL); } else { - sub_8022BEC(15, 1, NULL); + RunOrScheduleCommand(CMD_FINISH_GAME, SCHEDULE_CMD, NULL); } - r4->unk10 = 0; - r4->unkC = 0; + game->cmdTimer = 0; + game->cmdState = 0; return 0; } else { - sub_80236B8(r4); + HandlePlayerInput(game); return 0; } } -static u32 sub_8023A30(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +// Game was 'won', crusher was pushed down fully before time was up +static u32 Cmd_FinishGame(struct BerryCrushGame *game, u8 *args) { - switch (r4->unkC) + switch (game->cmdState) { case 0: - r4->unk12 = 8; + game->gameState = STATE_FINISHED; PlaySE(SE_M_STRENGTH); - BlendPalettes(0xFFFFFFFF, 8, RGB(31, 31, 0)); - r4->unk138.unk0 = 2; + BlendPalettes(PALETTES_ALL, 8, RGB(31, 31, 0)); + game->gfx.counter = 2; break; case 1: - if (--r4->unk138.unk0 != 255) + if (--game->gfx.counter != (u8)-1) return 0; - BlendPalettes(0xFFFFFFFF, 0, RGB(31, 31, 0)); - r4->unk138.unk1 = 4; - r4->unk138.unk0 = 0; - r4->unk138.unk2 = gUnknown_082F326C[r4->unk138.unk1][0]; + BlendPalettes(PALETTES_ALL, 0, RGB(31, 31, 0)); + game->gfx.vibrationIdx = 4; + game->gfx.counter = 0; + game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; break; case 2: - r4->unk2C = gUnknown_082F326C[r4->unk138.unk1][r4->unk138.unk0]; - SetGpuReg(REG_OFFSET_BG0VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG2VOFS, -r4->unk2C); - SetGpuReg(REG_OFFSET_BG3VOFS, -r4->unk2C); - if (++r4->unk138.unk0 < r4->unk138.unk2) + game->vibration = sIntroOutroVibrationData[game->gfx.vibrationIdx][game->gfx.counter]; + SetGpuReg(REG_OFFSET_BG0VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG2VOFS, -game->vibration); + SetGpuReg(REG_OFFSET_BG3VOFS, -game->vibration); + if (++game->gfx.counter < game->gfx.numVibrations) return 0; - if (r4->unk138.unk1 != 0) + if (game->gfx.vibrationIdx != 0) { - --r4->unk138.unk1; - r4->unk138.unk2 = gUnknown_082F326C[r4->unk138.unk1][0]; - r4->unk138.unk0 = 0; + game->gfx.vibrationIdx--; + game->gfx.numVibrations = sIntroOutroVibrationData[game->gfx.vibrationIdx][0]; + game->gfx.counter = 0; return 0; } break; case 3: - r4->unk2C = 0; + game->vibration = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); break; case 4: - if (!sub_80218D4(r4, &r4->unk138)) + if (!AreEffectsFinished(game, &game->gfx)) return 0; Rfu_SetLinkStandbyCallback(); - r4->unk10 = 0; + game->cmdTimer = 0; break; case 5: if (!IsLinkTaskFinished()) return 0; - sub_8022BEC(17, 1, NULL); - r4->unk10 = 0; - r4->unkC = 0; + RunOrScheduleCommand(CMD_CALC_RESULTS, SCHEDULE_CMD, NULL); + game->cmdTimer = 0; + game->cmdState = 0; return 0; } - ++r4->unkC; + game->cmdState++; return 0; } -static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6) +static u32 Cmd_HandleTimeUp(struct BerryCrushGame *game, u8 *args) { - switch (r5->unkC) + switch (game->cmdState) { case 0: - r5->unk12 = 9; + game->gameState = STATE_TIMES_UP; PlaySE(SE_FAILURE); - BlendPalettes(0xFFFFFFFF, 8, RGB(31, 0, 0)); - r5->unk138.unk0 = 4; + BlendPalettes(PALETTES_ALL, 8, RGB(31, 0, 0)); + game->gfx.counter = 4; break; case 1: - if (--r5->unk138.unk0 != 255) + if (--game->gfx.counter != (u8)-1) return 0; - BlendPalettes(0xFFFFFFFF, 0, RGB(31, 0, 0)); - r5->unk138.unk0 = 0; + BlendPalettes(PALETTES_ALL, 0, RGB(31, 0, 0)); + game->gfx.counter = 0; break; case 2: - if (!sub_80218D4(r5, &r5->unk138)) + if (!AreEffectsFinished(game, &game->gfx)) return 0; Rfu_SetLinkStandbyCallback(); - r5->unk10 = 0; + game->cmdTimer = 0; SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); @@ -2715,235 +2976,264 @@ static u32 sub_8023BC0(struct BerryCrushGame *r5, u8 *r6) case 3: if (!IsLinkTaskFinished()) return 0; - ConvertIntToDecimalStringN(gStringVar1, r5->unk1C, STR_CONV_MODE_LEFT_ALIGN, 6); - sub_8024644(r6, 7, 1, 0, 0); - r5->unkE = 19; - sub_8022BEC(3, 1, NULL); - r5->unk10 = 0; - r5->unkC = 0; + ConvertIntToDecimalStringN(gStringVar1, game->powder, STR_CONV_MODE_LEFT_ALIGN, 6); + SetPrintMessageArgs(args, MSG_TIMES_UP, F_MSG_CLEAR, 0, 0); + game->nextCmd = CMD_SAVE; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); + game->cmdTimer = 0; + game->cmdState = 0; return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8023CAC(struct BerryCrushGame *r7, __attribute__((unused)) u8 *r1) +static u32 Cmd_TabulateResults(struct BerryCrushGame *game, u8 *args) { - u8 r8, r4_, r3; - s32 r2; - s32 r4; - u16 r6; + u8 i, j, tempPlayerId; + s32 temp1, temp2; + u16 tempStat; - switch (r7->unkC) + switch (game->cmdState) { case 0: - memset(r7->unk42, 0, 2 * sizeof(u16)); - if (r7->unk98[r7->unk8].unk1A > r7->unk28) - r7->unk98[r7->unk8].unk1A = r7->unk28; - r7->unk42[0] = r7->unk98[r7->unk8].unk1A; - SendBlock(0, r7->unk42, 2); + memset(game->sendCmd, 0, 2 * sizeof(u16)); + if (game->players[game->localId].timePressingA > game->timer) + game->players[game->localId].timePressingA = game->timer; + game->sendCmd[0] = game->players[game->localId].timePressingA; + SendBlock(0, game->sendCmd, 2); break; case 1: if (!IsLinkTaskFinished()) return 0; - r7->unk10 = 0; + game->cmdTimer = 0; break; case 2: - if (GetBlockReceivedStatus() != gUnknown_082F4448[r7->unk9 - 2]) + if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2]) return 0; - for (r8 = 0; r8 < r7->unk9; ++r8) - r7->unk98[r8].unk1A = gBlockRecvBuffer[r8][0]; - r7->unk10 = 0; - r7->unk42[0] = 0; + for (i = 0; i < game->playerCount; i++) + game->players[i].timePressingA = gBlockRecvBuffer[i][0]; + + game->cmdTimer = 0; + game->sendCmd[0] = 0; ResetBlockReceivedFlags(); - if (r7->unk8 == 0) - r7->unkC = 3; + + // If player is not leader, skip the steps + // where the results are calculated and sent. + // Group members just read the results sent + // to them by the leader. + if (game->localId == 0) + game->cmdState = 3; else - r7->unkC = 6; + game->cmdState = 6; return 0; case 3: - memset(&r7->unk68, 0, sizeof(struct BerryCrushGame_68)); - r7->unk68.unk04 = r7->unk28; - r7->unk68.unk06 = r7->unk18 / (r7->unk28 / 60); - r2 = MathUtil_Mul32(Q_24_8(r7->unk30), Q_24_8(50)); - r2 = MathUtil_Div32(r2, Q_24_8(r7->unk32)) + Q_24_8(50); - r2 = Q_24_8_TO_INT(r2); - r7->unk68.unk08 = r2 & 0x7F; - r2 = Q_24_8(r2); - r2 = MathUtil_Div32(r2, Q_24_8(100)); - r4 = Q_24_8(r7->unk1C * r7->unk9); - r4 = MathUtil_Mul32(r4, r2); - r7->unk68.unk00 = r4 >> 8; - r7->unk68.unk20[0][7] = Random() % 3; - for (r8 = 0; r8 < r7->unk9; ++r8) + memset(&game->results, 0, sizeof(game->results)); + game->results.time = game->timer; + game->results.targetPressesPerSec = game->targetAPresses / (game->timer / 60); + + // Calculate silkiness + // Silkiness is the percentage of times big sparkles were produced when possible, + // which itself depends on the number of A presses every 30 frames + temp1 = MathUtil_Mul32(Q_24_8(game->numBigSparkles), Q_24_8(50)); + temp1 = MathUtil_Div32(temp1, Q_24_8(game->numBigSparkleChecks)) + Q_24_8(50); + temp1 = Q_24_8_TO_INT(temp1); + game->results.silkiness = temp1 & 0x7F; + + // Calculate amount of powder + temp1 = Q_24_8(temp1); + temp1 = MathUtil_Div32(temp1, Q_24_8(100)); + temp2 = Q_24_8(game->powder * game->playerCount); + temp2 = MathUtil_Mul32(temp2, temp1); + game->results.powder = Q_24_8_TO_INT(temp2); + + // Choose random second results page + game->results.randomPageId = Random() % NUM_RANDOM_RESULTS_PAGES; + + for (i = 0; i < game->playerCount; i++) { - r7->unk68.unk20[0][r8] = r8; - r7->unk68.unk20[1][r8] = r8; - r7->unk68.unk0C[0][r8] = r7->unk98[r8].unk16; - r7->unk68.unk0A += r7->unk68.unk0C[0][r8]; - switch (r7->unk68.unk20[0][7]) + game->results.playerIdsRanked[RESULTS_PAGE_PRESSES][i] = i; + game->results.playerIdsRanked[RESULTS_PAGE_RANDOM][i] = i; + game->results.stats[RESULTS_PAGE_PRESSES][i] = game->players[i].numAPresses; + game->results.totalAPresses += game->results.stats[RESULTS_PAGE_PRESSES][i]; + + // Calculate value for random second results page + switch (game->results.randomPageId) { - case 0: - if (r7->unk98[r8].unk16 != 0) + case RESULTS_PAGE_NEATNESS: + if (game->players[i].numAPresses != 0) { - r2 = r7->unk98[r8].unk14; - r2 = Q_24_8(r2); - r2 = MathUtil_Mul32(r2, Q_24_8(100)); - r4 = r7->unk98[r8].unk16; - r4 = Q_24_8(r4); - r4 = MathUtil_Div32(r2, r4); + // Calculate percentage of inputs that were in largest "neat" streak + // "Neat" inputs are those done at a regular interval + temp1 = game->players[i].maxNeatInputStreak; + temp1 = Q_24_8(temp1); + temp1 = MathUtil_Mul32(temp1, Q_24_8(100)); + temp2 = game->players[i].numAPresses; + temp2 = Q_24_8(temp2); + temp2 = MathUtil_Div32(temp1, temp2); } else { - r4 = 0; + temp2 = 0; } break; - case 1: - if (r7->unk98[r8].unk16 != 0) + case RESULTS_PAGE_COOPERATIVE: + if (game->players[i].numAPresses != 0) { - r2 = r7->unk98[r8].unk18; - r2 = Q_24_8(r2); - r2 = MathUtil_Mul32(r2, Q_24_8(100)); - r4 = r7->unk98[r8].unk16; - r4 = Q_24_8(r4); - r4 = MathUtil_Div32(r2, r4); + // Calculate percentage of inputs that were + // done at the same time as another player + temp1 = game->players[i].numSyncedAPresses; + temp1 = Q_24_8(temp1); + temp1 = MathUtil_Mul32(temp1, Q_24_8(100)); + temp2 = game->players[i].numAPresses; + temp2 = Q_24_8(temp2); + temp2 = MathUtil_Div32(temp1, temp2); } else { - r4 = 0; + temp2 = 0; } break; - case 2: - if (r7->unk98[r8].unk16 == 0) + case RESULTS_PAGE_POWER: + if (game->players[i].numAPresses == 0) { - r4 = 0; + temp2 = 0; } - else if (r7->unk98[r8].unk1A >= r7->unk28) + else if (game->players[i].timePressingA >= game->timer) { - r4 = 0x6400; + // Spent 100% of the time pressing A + temp2 = Q_24_8(100); } else { - r2 = r7->unk98[r8].unk1A; - r2 = Q_24_8(r2); - r2 = MathUtil_Mul32(r2, Q_24_8(100)); - r4 = r7->unk28; - r4 = Q_24_8(r4); - r4 = MathUtil_Div32(r2, r4); + // Calculate percentage of time the + // player spent pressing A + temp1 = game->players[i].timePressingA; + temp1 = Q_24_8(temp1); + temp1 = MathUtil_Mul32(temp1, Q_24_8(100)); + temp2 = game->timer; + temp2 = Q_24_8(temp2); + temp2 = MathUtil_Div32(temp1, temp2); } break; } - r4 >>= 4; - r7->unk68.unk0C[1][r8] = r4; + temp2 >>= 4; + game->results.stats[RESULTS_PAGE_RANDOM][i] = temp2; } break; case 4: - for (r8 = 0; r8 < r7->unk9 - 1; ++r8) + for (i = 0; i < game->playerCount - 1; i++) { - for (r4_ = r7->unk9 - 1; r4_ > r8; --r4_) + for (j = game->playerCount - 1; j > i; j--) { - if (r7->unk68.unk0C[0][r4_ - 1] < r7->unk68.unk0C[0][r4_]) + // Calculate player rankings for "Number of Presses" by sorting arrays + if (game->results.stats[RESULTS_PAGE_PRESSES][j - 1] < game->results.stats[RESULTS_PAGE_PRESSES][j]) { - r6 = r7->unk68.unk0C[0][r4_]; - r7->unk68.unk0C[0][r4_] = r7->unk68.unk0C[0][r4_ - 1]; - r7->unk68.unk0C[0][r4_ - 1] = r6; - r3 = r7->unk68.unk20[0][r4_]; - r7->unk68.unk20[0][r4_] = r7->unk68.unk20[0][r4_ - 1]; - r7->unk68.unk20[0][r4_ - 1] = r3; + SWAP(game->results.stats[RESULTS_PAGE_PRESSES][j], + game->results.stats[RESULTS_PAGE_PRESSES][j - 1], + tempStat); + SWAP(game->results.playerIdsRanked[RESULTS_PAGE_PRESSES][j], + game->results.playerIdsRanked[RESULTS_PAGE_PRESSES][j - 1], + tempPlayerId); } - if (r7->unk68.unk0C[1][r4_ - 1] < r7->unk68.unk0C[1][r4_]) + // Calculate player rankings for random second results page by sorting arrays + if (game->results.stats[RESULTS_PAGE_RANDOM][j - 1] < game->results.stats[RESULTS_PAGE_RANDOM][j]) { - r6 = r7->unk68.unk0C[1][r4_]; - r7->unk68.unk0C[1][r4_] = r7->unk68.unk0C[1][r4_ - 1]; - r7->unk68.unk0C[1][r4_ - 1] = r6; - r3 = r7->unk68.unk20[1][r4_]; - r7->unk68.unk20[1][r4_] = r7->unk68.unk20[1][r4_ - 1]; - r7->unk68.unk20[1][r4_ - 1] = r3; + SWAP(game->results.stats[RESULTS_PAGE_RANDOM][j], + game->results.stats[RESULTS_PAGE_RANDOM][j - 1], + tempStat); + SWAP(game->results.playerIdsRanked[RESULTS_PAGE_RANDOM][j], + game->results.playerIdsRanked[RESULTS_PAGE_RANDOM][j - 1], + tempPlayerId); } } } - SendBlock(0,&r7->unk68, sizeof(struct BerryCrushGame_68)); + SendBlock(0, &game->results, sizeof(game->results)); break; case 5: if (!IsLinkTaskFinished()) return 0; - r7->unk10 = 0; + game->cmdTimer = 0; break; case 6: if (GetBlockReceivedStatus() != 1) return 0; - memset(&r7->unk68, 0, sizeof(struct BerryCrushGame_68)); - memcpy(&r7->unk68, gBlockRecvBuffer, sizeof(struct BerryCrushGame_68)); + + // Receive results calculated by leader + memset(&game->results, 0, sizeof(game->results)); + memcpy(&game->results, gBlockRecvBuffer, sizeof(game->results)); ResetBlockReceivedFlags(); - r7->unk10 = 0; + game->cmdTimer = 0; break; case 7: - BerryCrush_SaveResults(); - sub_8022BEC(18, 1, NULL); - r7->unk12 = 11; - r7->unkC = 0; - r7->unk24 = 0; + SaveResults(); + RunOrScheduleCommand(CMD_SHOW_RESULTS, SCHEDULE_CMD, NULL); + game->gameState = STATE_RESULTS_PRESSES; + game->cmdState = 0; + game->newDepth = 0; return 0; } - ++r7->unkC; + game->cmdState++; return 0; } -static u32 sub_8024048(struct BerryCrushGame *r5, u8 *r6) +static u32 Cmd_ShowResults(struct BerryCrushGame *game, u8 *args) { - switch (r5->unkC) + switch (game->cmdState) { case 0: - if (!sub_8022070(r5, &r5->unk138)) + if (!OpenResultsWindow(game, &game->gfx)) return 0; break; case 1: CopyBgTilemapBufferToVram(0); - r5->unk138.unk0 = 30; + game->gfx.counter = 30; break; case 2: - if (r5->unk138.unk0 != 0) + if (game->gfx.counter != 0) { - --r5->unk138.unk0; + game->gfx.counter--; return 0; } if (!(JOY_NEW(A_BUTTON))) return 0; PlaySE(SE_SELECT); - sub_802222C(r5); + CloseResultsWindow(game); break; case 3: - if (r5->unk12 <= 12) + // Progress through each page of the results + if (game->gameState < RESULTS_STATE_END) { - ++r5->unk12; - r5->unkC = 0; + game->gameState++; + game->cmdState = 0; return 0; } break; case 4: - ConvertIntToDecimalStringN(gStringVar1, r5->unk1C, STR_CONV_MODE_LEFT_ALIGN, 6); + // Print message showing how much powder was created + ConvertIntToDecimalStringN(gStringVar1, game->powder, STR_CONV_MODE_LEFT_ALIGN, 6); ConvertIntToDecimalStringN(gStringVar2, GetBerryPowder(), STR_CONV_MODE_LEFT_ALIGN, 6); - sub_8024644(r6, 2, 3, 0, 0); - r5->unkE = 19; - sub_8022BEC(3, 1, NULL); - r5->unkC = 0; + SetPrintMessageArgs(args, MSG_POWDER, F_MSG_CLEAR | F_MSG_EXPAND, 0, 0); + game->nextCmd = CMD_SAVE; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); + game->cmdState = 0; return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4) +static u32 Cmd_SaveGame(struct BerryCrushGame *game, u8 *args) { - switch (r5->unkC) + switch (game->cmdState) { case 0: - if (r5->unk28 >= 36000) - sub_8022554(&r5->unk138); - sub_8024644(r4, 8, 0, 0, 1); - r5->unkE = 19; - sub_8022BEC(3, 1, NULL); - r5->unkC = 0; + if (game->timer >= MAX_TIME) + HideTimer(&game->gfx); + SetPrintMessageArgs(args, MSG_COMM_STANDBY, 0, 0, 1); + game->nextCmd = CMD_SAVE; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); + game->cmdState = 0; // State is progressed by CMD_PRINT_MSG return 0; case 1: Rfu_SetLinkStandbyCallback(); @@ -2961,63 +3251,67 @@ static u32 sub_8024134(struct BerryCrushGame *r5, u8 *r4) return 0; break; case 4: - sub_8022BEC(20, 1, NULL); - r5->unk12 = 15; - r5->unkC = 0; + RunOrScheduleCommand(CMD_ASK_PLAY_AGAIN, SCHEDULE_CMD, NULL); + game->gameState = STATE_PLAY_AGAIN; + game->cmdState = 0; return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8024228(struct BerryCrushGame *r5, u8 *r6) +static u32 Cmd_AskPlayAgain(struct BerryCrushGame *game, u8 *args) { - s8 r4 = 0; + s8 input = 0; - switch (r5->unkC) + switch (game->cmdState) { case 0: - sub_8024644(r6, 4, 0, 0, 1); - r5->unkE = 20; - sub_8022BEC(3, 1, NULL); - r5->unkC = 0; // dunno what it's doing because it's already in case 0 + SetPrintMessageArgs(args, MSG_PLAY_AGAIN, 0, 0, 1); + game->nextCmd = CMD_ASK_PLAY_AGAIN; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); + game->cmdState = 0; // State is progressed by CMD_PRINT_MSG return 0; case 1: DisplayYesNoMenuDefaultYes(); break; case 2: - r4 = Menu_ProcessInputNoWrapClearOnChoose(); - if (r4 != -2) + input = Menu_ProcessInputNoWrapClearOnChoose(); + if (input != -2) { - memset(r5->unk42, 0, sizeof(r5->unk42)); - if (r4 == 0) + memset(game->sendCmd, 0, sizeof(game->sendCmd)); + if (input == 0) { + // Selected Yes if (HasAtLeastOneBerry()) - r5->unk14 = 0; + game->playAgainState = PLAY_AGAIN_YES; else - r5->unk14 = 3; + game->playAgainState = PLAY_AGAIN_NO_BERRIES; } else { - r5->unk14 = 1; + // Selected No + game->playAgainState = PLAY_AGAIN_NO; } + + // Close Yes/No and start communication ClearDialogWindowAndFrame(0, 1); - sub_8024644(r6, 8, 0, 0, 0); - r5->unkE = 21; - sub_8022BEC(3, 1, NULL); - r5->unkC = 0; + SetPrintMessageArgs(args, MSG_COMM_STANDBY, 0, 0, 0); + game->nextCmd = CMD_COMM_PLAY_AGAIN; + RunOrScheduleCommand(CMD_PRINT_MSG, SCHEDULE_CMD, NULL); + game->cmdState = 0; } return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_80242E0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1) +static u32 Cmd_CommunicatePlayAgainResponses(struct BerryCrushGame *game, u8 *args) { - u8 r5 = 0; + u8 i = 0; - switch (r4->unkC) + switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); @@ -3025,41 +3319,47 @@ static u32 sub_80242E0(struct BerryCrushGame *r4, __attribute__((unused)) u8 *r1 case 1: if (!IsLinkTaskFinished()) return 0; - r4->unk42[0] = r4->unk14; - r4->unk4E[0] = 0; - SendBlock(0, r4->unk42, sizeof(u16)); + + // Send player's Yes/No response to partners + game->sendCmd[0] = game->playAgainState; + game->recvCmd[0] = 0; + SendBlock(0, game->sendCmd, sizeof(u16)); break; case 2: if (!IsLinkTaskFinished()) return 0; - r4->unk10 = 0; + game->cmdTimer = 0; break; case 3: - if (GetBlockReceivedStatus() != gUnknown_082F4448[r4->unk9 - 2]) + // Wait for partners responses + if (GetBlockReceivedStatus() != sReceivedPlayerBitmasks[game->playerCount - 2]) return 0; - for (; r5 < r4->unk9; ++r5) - r4->unk4E[0] += gBlockRecvBuffer[r5][0]; - if (r4->unk4E[0] != 0) - sub_8022BEC(23, 1, NULL); + + // Read partners responses + for (i = 0; i < game->playerCount; i++) + game->recvCmd[0] += gBlockRecvBuffer[i][0]; + + if (game->recvCmd[0] != PLAY_AGAIN_YES) + RunOrScheduleCommand(CMD_PLAY_AGAIN_NO, SCHEDULE_CMD, NULL); else - sub_8022BEC(22, 1, NULL); + RunOrScheduleCommand(CMD_PLAY_AGAIN_YES, SCHEDULE_CMD, NULL); ResetBlockReceivedFlags(); - r4->unk42[0] = 0; - r4->unk4E[0] = 0; - r4->unk10 = 0; - r4->unkC = 0; + game->sendCmd[0] = 0; + game->recvCmd[0] = 0; + game->cmdTimer = 0; + game->cmdState = 0; return 0; } - ++r4->unkC; + game->cmdState++; return 0; } -static u32 sub_80243BC(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1) +static u32 Cmd_PlayAgain(struct BerryCrushGame *game, u8 *args) { - switch (r5->unkC) + switch (game->cmdState) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 1, 0, 16, RGB_BLACK); UpdatePaletteFade(); break; case 1: @@ -3068,56 +3368,56 @@ static u32 sub_80243BC(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1 break; case 2: ClearDialogWindowAndFrame(0, 1); - sub_8021488(r5); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + ResetCrusherPos(game); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); UpdatePaletteFade(); break; case 3: if (UpdatePaletteFade()) return 0; - sub_8022BEC(7, 1, NULL); - r5->unk12 = 3; - r5->unkC = 0; + RunOrScheduleCommand(CMD_ASK_PICK_BERRY, SCHEDULE_CMD, NULL); + game->gameState = STATE_PICK_BERRY; + game->cmdState = 0; return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8024444(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1) +static u32 Cmd_StopGame(struct BerryCrushGame *game, u8 *args) { - switch (r5->unkC) + switch (game->cmdState) { case 0: DrawDialogueFrame(0, 0); - if (r5->unk14 == 3) - AddTextPrinterParameterized2(0, 1, gUnknown_082F32A4[5], r5->unkB, 0, 2, 1, 3); + if (game->playAgainState == PLAY_AGAIN_NO_BERRIES) + AddTextPrinterParameterized2(0, 1, sMessages[MSG_NO_BERRIES], game->textSpeed, 0, 2, 1, 3); else - AddTextPrinterParameterized2(0, 1, gUnknown_082F32A4[6], r5->unkB, 0, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, sMessages[MSG_DROPPED], game->textSpeed, 0, 2, 1, 3); CopyWindowToVram(0, 3); break; case 1: if (IsTextPrinterActive(0)) return 0; - r5->unk138.unk0 = 120; + game->gfx.counter = 120; break; case 2: - if (r5->unk138.unk0 != 0) - --r5->unk138.unk0; + if (game->gfx.counter != 0) + game->gfx.counter--; else { - sub_8022BEC(24, 1, NULL); - r5->unkC = 0; + RunOrScheduleCommand(CMD_CLOSE_LINK, SCHEDULE_CMD, NULL); + game->cmdState = 0; } return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8024508(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1) +static u32 Cmd_CloseLink(struct BerryCrushGame *game, u8 *args) { - switch (r5->unkC) + switch (game->cmdState) { case 0: Rfu_SetLinkStandbyCallback(); @@ -3130,84 +3430,81 @@ static u32 sub_8024508(struct BerryCrushGame *r5, __attribute__((unused)) u8 *r1 case 2: if (gReceivedRemoteLinkPlayers != 0) return 0; - r5->unkE = 25; - sub_8022BEC(5, 1, NULL); - r5->unkC = 2; // ??? + game->nextCmd = CMD_QUIT; + RunOrScheduleCommand(CMD_HIDE_GAME, SCHEDULE_CMD, NULL); + game->cmdState = 2; // ??? return 0; } - ++r5->unkC; + game->cmdState++; return 0; } -static u32 sub_8024568(__attribute__((unused)) struct BerryCrushGame *r0, __attribute__((unused)) u8 *r1) +static u32 Cmd_Quit(struct BerryCrushGame *game, u8 *args) { QuitBerryCrush(NULL); return 0; } -void sub_8024578(struct BerryCrushGame *r4) -{ - u8 r5 = 0; - - IncrementGameStat(GAME_STAT_51); - r4->unkD = 0; - r4->unk10 = 0; - r4->unk12 = 2; - r4->unk14 = 0; - r4->unk1C = 0; - r4->unk18 = 0; - r4->unk1A = 0; - r4->unk20 = 0; - r4->unk24 = 0; - r4->unk25_0 = 0; - r4->unk25_1 = 0; - r4->unk25_2 = 0; - r4->unk25_3 = 0; - r4->unk25_4 = 0; - r4->unk25_5 = 0; - r4->unk26 = 0; - r4->unk28 = 0; - r4->unk2E = 0; - r4->unk32 = -1; - r4->unk30 = 0; - r4->unk34 = 0; - for (; r5 < 5; ++r5) - { - r4->unk98[r5].unkC = -1; - r4->unk98[r5].unkE = 0; - r4->unk98[r5].unk10 = 0; - r4->unk98[r5].unk12 = 1; - r4->unk98[r5].unk14 = 0; - r4->unk98[r5].unk16 = 0; - r4->unk98[r5].unk18 = 0; - r4->unk98[r5].unk1A = 0; - r4->unk98[r5].unk1B = 0; - r4->unk98[r5].unk1C = 0; - } -} - -static void BerryCrush_SetPaletteFadeParams(u8 *params, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette) -{ - params[0] = ((u8 *)&selectedPals)[0]; - params[1] = ((u8 *)&selectedPals)[1]; - params[2] = ((u8 *)&selectedPals)[2]; - params[3] = ((u8 *)&selectedPals)[3]; - params[4] = delay; - params[5] = startY; - params[6] = targetY; - params[7] = ((u8 *)&palette)[0]; - params[8] = ((u8 *)&palette)[1]; - params[9] = communicateAfter; -} - -void sub_8024644(u8 *r0, u32 r1, u32 r2, u32 r3, u32 r5) -{ - u8 sp[4]; - - 0[(u16 *)sp] = r3; - r0[0] = r1; - r0[1] = r2; - r0[2] = sp[0]; - r0[3] = sp[1]; - r0[4] = r5; +static void ResetGame(struct BerryCrushGame *game) +{ + u8 i = 0; + + IncrementGameStat(GAME_STAT_PLAYED_BERRY_CRUSH); + game->unused = 0; + game->cmdTimer = 0; + game->gameState = STATE_RESET; + game->playAgainState = 0; + game->powder = 0; + game->targetAPresses = 0; + game->totalAPresses = 0; + game->targetDepth = 0; + game->newDepth = 0; + game->noRoomForPowder = FALSE; + game->newRecord = FALSE; + game->playedSound = FALSE; + game->endGame = FALSE; + game->bigSparkle = FALSE; + game->sparkleAmount = 0; + game->leaderTimer = 0; + game->timer = 0; + game->bigSparkleCounter = 0; + game->numBigSparkleChecks = -1; + game->numBigSparkles = 0; + game->sparkleCounter = 0; + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + game->players[i].berryId = -1; + game->players[i].inputTime = 0; + game->players[i].neatInputStreak = 0; + game->players[i].timeSincePrevInput = 1; + game->players[i].maxNeatInputStreak = 0; + game->players[i].numAPresses = 0; + game->players[i].numSyncedAPresses = 0; + game->players[i].timePressingA = 0; + game->players[i].inputFlags = 0; + game->players[i].inputState = INPUT_STATE_NONE; + } +} + +static void SetPaletteFadeArgs(u8 *args, bool8 communicateAfter, u32 selectedPals, s8 delay, u8 startY, u8 targetY, u16 palette) +{ + args[0] = ((u8 *)&selectedPals)[0]; + args[1] = ((u8 *)&selectedPals)[1]; + args[2] = ((u8 *)&selectedPals)[2]; + args[3] = ((u8 *)&selectedPals)[3]; + args[4] = delay; + args[5] = startY; + args[6] = targetY; + args[7] = ((u8 *)&palette)[0]; + args[8] = ((u8 *)&palette)[1]; + args[9] = communicateAfter; +} + +static void SetPrintMessageArgs(u8 *args, u8 msgId, u8 flags, u16 waitKeys, u8 followupState) +{ + args[0] = msgId; + args[1] = flags; + args[2] = ((u8 *)&waitKeys)[0]; + args[3] = ((u8 *)&waitKeys)[1]; + args[4] = followupState; } diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index 4c4a010b2..31caf79cc 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -12,40 +12,42 @@ #include "text.h" #include "menu.h" #include "m4a.h" +#include "constants/rgb.h" -// Static type declarations - -typedef struct { +struct { u8 state; - u8 unk1; - u16 unk2; + u8 curScene; + u16 timer; struct MultiBootParam mb; -} berryfix_t; - -// Static RAM declarations - -static berryfix_t *berry_fix_mb_manager; - -// Static ROM declarations - -static void berry_fix_main(void); -static void berry_fix_gpu_set(void); -static int berry_fix_text_update(int); -static void berry_fix_text_print(int); -static void berry_fix_bg_hide(void); +} static * sBerryFix; -// .rodata +static void BerryFix_Main(void); +static void BerryFix_GpuSet(void); +static int BerryFix_TrySetScene(int); +static void BerryFix_SetScene(int); +static void BerryFix_HideScene(void); static const u8 sText_BerryProgramUpdate[] = _("Berry Program Update"); static const u8 sText_RubySapphire[] = _("Ruby/Sapphire"); static const u8 sText_Emerald[] = _("Emerald"); - -static const u8 sText_BerryProgramWillBeUpdatedPressA[] = _("The Berry Program on your POKéMON\nRuby/Sapphire Game Pak will be updated.\n{COLOR RED}{SHADOW LIGHT_RED}Press the A Button."); -static const u8 sText_EnsureGBAConnectionMatches[] = _("Please ensure the connection of your\nGame Boy Advance system matches this.\n{COLOR RED}{SHADOW LIGHT_RED}YES: Press the A Button.\nNO: Turn off the power and try again."); -static const u8 sText_TurnOffPowerHoldingStartSelect[] = _("Please turn on the power of POKéMON\nRuby/Sapphire while holding START and\nSELECT simultaneously. Then, ensure\nthe picture above appears."); -static const u8 sText_TransmittingPleaseWait[] = _("Transmitting. Please wait.\n{COLOR RED}{SHADOW LIGHT_RED}Please do not turn off the power or\nunplug the Game Boy Advance Game\nLink Cable."); -static const u8 sText_PleaseFollowInstructionsOnScreen[] = _("Please follow the instructions on your\nPOKéMON Ruby/Sapphire screen."); -static const u8 sText_TransmissionFailureTryAgain[] = _("Transmission failure.\n{COLOR RED}{SHADOW LIGHT_RED}Please try again."); +static const u8 sText_BerryProgramWillBeUpdatedPressA[] = _("The Berry Program on your POKéMON\n" + "Ruby/Sapphire Game Pak will be updated.\n" + "{COLOR RED}{SHADOW LIGHT_RED}Press the A Button."); +static const u8 sText_EnsureGBAConnectionMatches[] = _("Please ensure the connection of your\n" + "Game Boy Advance system matches this.\n" + "{COLOR RED}{SHADOW LIGHT_RED}YES: Press the A Button.\n" + "NO: Turn off the power and try again."); +static const u8 sText_TurnOffPowerHoldingStartSelect[] = _("Please turn on the power of POKéMON\n" + "Ruby/Sapphire while holding START and\n" + "SELECT simultaneously. Then, ensure\n" + "the picture above appears."); +static const u8 sText_TransmittingPleaseWait[] = _("Transmitting. Please wait.\n" + "{COLOR RED}{SHADOW LIGHT_RED}Please do not turn off the power or\n" + "unplug the Game Boy Advance Game\nLink Cable."); +static const u8 sText_PleaseFollowInstructionsOnScreen[] = _("Please follow the instructions on your\n" + "POKéMON Ruby/Sapphire screen."); +static const u8 sText_TransmissionFailureTryAgain[] = _("Transmission failure.\n" + "{COLOR RED}{SHADOW LIGHT_RED}Please try again."); static const struct BgTemplate sBerryFixBgTemplates[] = { { @@ -108,52 +110,66 @@ static const struct WindowTemplate sBerryFixWindowTemplates[] = { DUMMY_WIN_TEMPLATE }; -static const u16 sUnknown_08618138[] = { - 0x7fff, 0x7fff, 0x318c, 0x675a, - 0x043c, 0x3aff, 0x0664, 0x4bd2, - 0x6546, 0x7b14, 0x7fff, 0x318c, - 0x675a, 0, 0, 0 +static const u16 sBerryFixPalColors[] = { + RGB_WHITE, RGB_WHITE, RGB(12, 12, 12), RGB(26, 26, 25), + RGB(28, 1, 1), RGB(31, 23, 14), RGB(4, 19, 1), RGB(18, 30, 18), + RGB(6, 10, 25), RGB(20, 24, 30), RGB_WHITE, RGB(12, 12, 12), + RGB(26, 26, 25), RGB_BLACK, RGB_BLACK, RGB_BLACK }; static const u8 sBerryProgramTextColors[] = {TEXT_DYNAMIC_COLOR_1, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3}; static const u8 sGameTitleTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_1, TEXT_DYNAMIC_COLOR_4}; -static const u8 *const sBerryProgramTexts[] = { - sText_EnsureGBAConnectionMatches, - sText_TurnOffPowerHoldingStartSelect, - sText_TransmittingPleaseWait, - sText_PleaseFollowInstructionsOnScreen, - sText_TransmissionFailureTryAgain, - sText_BerryProgramWillBeUpdatedPressA +enum { + SCENE_ENSURE_CONNECT, + SCENE_TURN_OFF_POWER, + SCENE_TRANSMITTING, + SCENE_FOLLOW_INSTRUCT, + SCENE_TRANSMIT_FAILED, + SCENE_BEGIN, + SCENE_NONE }; +static const u8 *const sBerryProgramTexts[] = { + [SCENE_ENSURE_CONNECT] = sText_EnsureGBAConnectionMatches, + [SCENE_TURN_OFF_POWER] = sText_TurnOffPowerHoldingStartSelect, + [SCENE_TRANSMITTING] = sText_TransmittingPleaseWait, + [SCENE_FOLLOW_INSTRUCT] = sText_PleaseFollowInstructionsOnScreen, + [SCENE_TRANSMIT_FAILED] = sText_TransmissionFailureTryAgain, + [SCENE_BEGIN] = sText_BerryProgramWillBeUpdatedPressA +}; static const struct { const u32 *gfx; const u32 *tilemap; - const u16 *pltt; + const u16 *palette; } sBerryFixGraphics[] = { - { + [SCENE_ENSURE_CONNECT] = { gBerryFixGameboy_Gfx, gBerryFixGameboy_Tilemap, gBerryFixGameboy_Pal - }, { + }, + [SCENE_TURN_OFF_POWER] = { gBerryFixGameboyLogo_Gfx, gBerryFixGameboyLogo_Tilemap, gBerryFixGameboyLogo_Pal - }, { + }, + [SCENE_TRANSMITTING] = { gBerryFixGbaTransfer_Gfx, gBerryFixGbaTransfer_Tilemap, gBerryFixGbaTransfer_Pal - }, { + }, + [SCENE_FOLLOW_INSTRUCT] = { gBerryFixGbaTransferHighlight_Gfx, gBerryFixGbaTransferHighlight_Tilemap, gBerryFixGbaTransferHighlight_Pal - }, { + }, + [SCENE_TRANSMIT_FAILED] = { gBerryFixGbaTransferError_Gfx, gBerryFixGbaTransferError_Tilemap, gBerryFixGbaTransferError_Pal - }, { + }, + [SCENE_BEGIN] = { gBerryFixWindow_Gfx, gBerryFixWindow_Tilemap, gBerryFixWindow_Pal @@ -163,7 +179,16 @@ static const struct { extern const u8 gMultiBootProgram_BerryGlitchFix_Start[0x3BF4]; extern const u8 gMultiBootProgram_BerryGlitchFix_End[]; -// .text +enum { + MAINSTATE_INIT, + MAINSTATE_BEGIN, + MAINSTATE_CONNECT, + MAINSTATE_INIT_MULTIBOOT, + MAINSTATE_MULTIBOOT, + MAINSTATE_TRANSMIT, + MAINSTATE_EXIT, + MAINSTATE_FAILED, +}; void CB2_InitBerryFixProgram(void) { @@ -175,81 +200,79 @@ void CB2_InitBerryFixProgram(void) ResetTasks(); ScanlineEffect_Stop(); SetGpuReg(REG_OFFSET_DISPCNT, 0); - berry_fix_mb_manager = AllocZeroed(0x50); - berry_fix_mb_manager->state = 0; - berry_fix_mb_manager->unk1 = 6; - SetMainCallback2(berry_fix_main); + sBerryFix = AllocZeroed(sizeof(*sBerryFix)); + sBerryFix->state = MAINSTATE_INIT; + sBerryFix->curScene = SCENE_NONE; + SetMainCallback2(BerryFix_Main); } -static void berry_fix_main(void) +#define TryScene(sceneNum) BerryFix_TrySetScene(sceneNum) == (sceneNum) + +static void BerryFix_Main(void) { - switch (berry_fix_mb_manager->state) + switch (sBerryFix->state) { - case 0: - berry_fix_gpu_set(); - berry_fix_mb_manager->state = 1; + case MAINSTATE_INIT: + BerryFix_GpuSet(); + sBerryFix->state = MAINSTATE_BEGIN; break; - case 1: - if (berry_fix_text_update(5) == 5 && (JOY_NEW(A_BUTTON))) - { - berry_fix_mb_manager->state = 2; - } + case MAINSTATE_BEGIN: + if (TryScene(SCENE_BEGIN) && (JOY_NEW(A_BUTTON))) + sBerryFix->state = MAINSTATE_CONNECT; break; - case 2: - if (berry_fix_text_update(0) == 0 && (JOY_NEW(A_BUTTON))) - { - berry_fix_mb_manager->state = 3; - } + case MAINSTATE_CONNECT: + if (TryScene(SCENE_ENSURE_CONNECT) && (JOY_NEW(A_BUTTON))) + sBerryFix->state = MAINSTATE_INIT_MULTIBOOT; break; - case 3: - if (berry_fix_text_update(1) == 1) + case MAINSTATE_INIT_MULTIBOOT: + if (TryScene(SCENE_TURN_OFF_POWER)) { - berry_fix_mb_manager->mb.masterp = gMultiBootProgram_BerryGlitchFix_Start; - berry_fix_mb_manager->mb.server_type = 0; - MultiBootInit(&berry_fix_mb_manager->mb); - berry_fix_mb_manager->unk2 = 0; - berry_fix_mb_manager->state = 4; + sBerryFix->mb.masterp = gMultiBootProgram_BerryGlitchFix_Start; + sBerryFix->mb.server_type = 0; + MultiBootInit(&sBerryFix->mb); + sBerryFix->timer = 0; + sBerryFix->state = MAINSTATE_MULTIBOOT; } break; - case 4: - MultiBootMain(&berry_fix_mb_manager->mb); - if (berry_fix_mb_manager->mb.probe_count != 0 || (!(berry_fix_mb_manager->mb.response_bit & 2) || !(berry_fix_mb_manager->mb.client_bit & 2))) + case MAINSTATE_MULTIBOOT: + MultiBootMain(&sBerryFix->mb); + if (sBerryFix->mb.probe_count != 0 || (!(sBerryFix->mb.response_bit & 2) || !(sBerryFix->mb.client_bit & 2))) { - berry_fix_mb_manager->unk2 = 0; + sBerryFix->timer = 0; } - else if (++ berry_fix_mb_manager->unk2 > 180) + else if (++sBerryFix->timer > 180) { - MultiBootStartMaster(&berry_fix_mb_manager->mb, gMultiBootProgram_BerryGlitchFix_Start + ROM_HEADER_SIZE, (u32)(gMultiBootProgram_BerryGlitchFix_End - (gMultiBootProgram_BerryGlitchFix_Start + ROM_HEADER_SIZE)), 4, 1); - berry_fix_mb_manager->state = 5; + MultiBootStartMaster(&sBerryFix->mb, + gMultiBootProgram_BerryGlitchFix_Start + ROM_HEADER_SIZE, + (u32)(gMultiBootProgram_BerryGlitchFix_End - (gMultiBootProgram_BerryGlitchFix_Start + ROM_HEADER_SIZE)), + 4, + 1); + sBerryFix->state = MAINSTATE_TRANSMIT; } break; - case 5: - if (berry_fix_text_update(2) == 2) { - MultiBootMain(&berry_fix_mb_manager->mb); - if (MultiBootCheckComplete(&berry_fix_mb_manager->mb)) { - berry_fix_mb_manager->state = 6; - } - else if (!(berry_fix_mb_manager->mb.client_bit & 2)) { - berry_fix_mb_manager->state = 7; - } + case MAINSTATE_TRANSMIT: + if (TryScene(SCENE_TRANSMITTING)) + { + MultiBootMain(&sBerryFix->mb); + + if (MultiBootCheckComplete(&sBerryFix->mb)) + sBerryFix->state = MAINSTATE_EXIT; + else if (!(sBerryFix->mb.client_bit & 2)) + sBerryFix->state = MAINSTATE_FAILED; } break; - case 6: - if (berry_fix_text_update(3) == 3 && JOY_NEW(A_BUTTON)) - { + case MAINSTATE_EXIT: + if (TryScene(SCENE_FOLLOW_INSTRUCT) && JOY_NEW(A_BUTTON)) DoSoftReset(); - } break; - case 7: - if (berry_fix_text_update(4) == 4 && JOY_NEW(A_BUTTON)) - { - berry_fix_mb_manager->state = 1; - } + case MAINSTATE_FAILED: + if (TryScene(SCENE_TRANSMIT_FAILED) && JOY_NEW(A_BUTTON)) + sBerryFix->state = MAINSTATE_BEGIN; break; } } -static void berry_fix_gpu_set(void) +static void BerryFix_GpuSet(void) { s32 width, left; @@ -274,26 +297,26 @@ static void berry_fix_gpu_set(void) InitWindows(sBerryFixWindowTemplates); DeactivateAllTextPrinters(); - DmaCopy32(3, sUnknown_08618138, BG_PLTT + 0x1E0, 0x20); + DmaCopy32(3, sBerryFixPalColors, BG_PLTT + 0x1E0, sizeof(sBerryFixPalColors)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP); FillWindowPixelBuffer(2, PIXEL_FILL(0)); FillWindowPixelBuffer(3, PIXEL_FILL(0)); - FillWindowPixelBuffer(0, PIXEL_FILL(0xA)); + FillWindowPixelBuffer(0, PIXEL_FILL(10)); width = GetStringWidth(0, sText_Emerald, 0); - left = (0x78 - width) / 2; + left = (120 - width) / 2; AddTextPrinterParameterized3(2, 0, left, 3, sGameTitleTextColors, TEXT_SPEED_FF, sText_Emerald); width = GetStringWidth(0, sText_RubySapphire, 0); - left = (0x78 - width) / 2 + 0x78; + left = (120 - width) / 2 + 120; AddTextPrinterParameterized3(2, 0, left, 3, sGameTitleTextColors, TEXT_SPEED_FF, sText_RubySapphire); width = GetStringWidth(0, sText_RubySapphire, 0); - left = (0x70 - width) / 2; + left = (112 - width) / 2; AddTextPrinterParameterized3(3, 0, left, 0, sGameTitleTextColors, TEXT_SPEED_FF, sText_RubySapphire); width = GetStringWidth(1, sText_BerryProgramUpdate, 0); - left = (0xD0 - width) / 2; + left = (208 - width) / 2; AddTextPrinterParameterized3(0, 1, left, 2, sBerryProgramTextColors, TEXT_SPEED_FF, sText_BerryProgramUpdate); CopyWindowToVram(2, 2); @@ -301,56 +324,55 @@ static void berry_fix_gpu_set(void) CopyWindowToVram(0, 2); } -static int berry_fix_text_update(int checkval) +static int BerryFix_TrySetScene(int scene) { - if (berry_fix_mb_manager->unk1 == checkval) - { - return checkval; - } - if (berry_fix_mb_manager->unk1 == 6) + if (sBerryFix->curScene == scene) + return scene; + + if (sBerryFix->curScene == SCENE_NONE) { - berry_fix_text_print(checkval); - berry_fix_mb_manager->unk1 = checkval; + BerryFix_SetScene(scene); + sBerryFix->curScene = scene; } else { - berry_fix_bg_hide(); - berry_fix_mb_manager->unk1 = 6; + BerryFix_HideScene(); + sBerryFix->curScene = SCENE_NONE; } - return berry_fix_mb_manager->unk1; + return sBerryFix->curScene; } -static void berry_fix_text_print(int scene) +static void BerryFix_SetScene(int scene) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32); - FillWindowPixelBuffer(1, PIXEL_FILL(0xA)); + FillWindowPixelBuffer(1, PIXEL_FILL(10)); AddTextPrinterParameterized3(1, 1, 0, 0, sBerryProgramTextColors, -1, sBerryProgramTexts[scene]); PutWindowTilemap(1); CopyWindowToVram(1, 2); switch (scene) { - case 0: - case 2: - case 3: - case 4: - PutWindowTilemap(2); - break; - case 1: - PutWindowTilemap(3); - break; - case 5: - PutWindowTilemap(0); - break; + case SCENE_ENSURE_CONNECT: + case SCENE_TRANSMITTING: + case SCENE_FOLLOW_INSTRUCT: + case SCENE_TRANSMIT_FAILED: + PutWindowTilemap(2); + break; + case SCENE_TURN_OFF_POWER: + PutWindowTilemap(3); + break; + case SCENE_BEGIN: + PutWindowTilemap(0); + break; } CopyBgTilemapBufferToVram(0); LZ77UnCompVram(sBerryFixGraphics[scene].gfx, (void *)BG_CHAR_ADDR(1)); LZ77UnCompVram(sBerryFixGraphics[scene].tilemap, (void *)BG_SCREEN_ADDR(31)); - CpuCopy32(sBerryFixGraphics[scene].pltt, (void *)BG_PLTT, 0x100); + CpuCopy32(sBerryFixGraphics[scene].palette, (void *)BG_PLTT, 0x100); ShowBg(0); ShowBg(1); } -static void berry_fix_bg_hide(void) +static void BerryFix_HideScene(void) { HideBg(0); HideBg(1); diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index 089228b17..27efb7e7a 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -26,7 +26,6 @@ #include "item_menu_icons.h" #include "decompress.h" #include "international_string_util.h" -#include "constants/berry.h" #include "constants/items.h" #include "constants/rgb.h" #include "constants/songs.h" @@ -277,11 +276,11 @@ static bool8 InitBerryTagScreen(void) gMain.state++; break; case 14: - BlendPalettes(-1, 0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); gMain.state++; break; case 15: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -515,7 +514,7 @@ static void DestroyFlavorCircleSprites(void) static void PrepareToCloseBerryTagScreen(u8 taskId) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_CloseBerryTagScreen; } diff --git a/src/bike.c b/src/bike.c index c4964b627..62ce3cd44 100644 --- a/src/bike.c +++ b/src/bike.c @@ -614,27 +614,24 @@ static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) return; } collision = GetBikeCollision(direction); - // TODO: Try to get rid of this goto - if (collision == 0 || collision == COLLISION_WHEELIE_HOP) + if (collision && collision != COLLISION_WHEELIE_HOP) { - goto derp; - } - else if (collision == COLLISION_LEDGE_JUMP) - { - PlayerLedgeHoppingWheelie(direction); - } - else if (collision < COLLISION_STOP_SURFING || collision > COLLISION_ROTATING_GATE) - { - if (collision < COLLISION_VERTICAL_RAIL) + if (collision == COLLISION_LEDGE_JUMP) { - AcroBikeTransition_WheelieHoppingStanding(direction); + PlayerLedgeHoppingWheelie(direction); + return; } - else + if (collision >= COLLISION_STOP_SURFING && collision <= COLLISION_ROTATING_GATE) + { + return; + } + if (collision < COLLISION_VERTICAL_RAIL) { - derp: - PlayerMovingHoppingWheelie(direction); + AcroBikeTransition_WheelieHoppingStanding(direction); + return; } } + PlayerMovingHoppingWheelie(direction); } static void AcroBikeTransition_SideJump(u8 direction) @@ -963,9 +960,10 @@ bool8 IsBikingDisallowedByPlayer(void) return TRUE; } -bool8 player_should_look_direction_be_enforced_upon_movement(void) +bool8 IsPlayerNotUsingAcroBikeOnBumpySlope(void) { - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior) != FALSE) + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) + && MetatileBehavior_IsBumpySlope(gObjectEvents[gPlayerAvatar.objectEventId].currentMetatileBehavior)) return FALSE; else return TRUE; diff --git a/src/cable_car.c b/src/cable_car.c index acd0bc7a5..733d10436 100644 --- a/src/cable_car.c +++ b/src/cable_car.c @@ -246,7 +246,7 @@ void CableCar(void) { ScriptContext2_Enable(); CreateTask(Task_LoadCableCar, 1); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); } static void CB2_LoadCableCar(void) @@ -350,7 +350,7 @@ static void CB2_LoadCableCar(void) gMain.state++; break; case 8: - BeginNormalPaletteFade(0xFFFFFFFF, 3, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 3, 16, 0, RGB(0, 0, 0)); FadeInNewBGM(MUS_CABLE_CAR, 1); SetBgRegs(TRUE); gMain.state++; @@ -468,7 +468,7 @@ static void Task_CableCar(u8 taskId) if (sCableCar->timer == 570) { sCableCar->state = 3; - BeginNormalPaletteFade(0xFFFFFFFF, 3, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 3, 0, 16, RGB(0, 0, 0)); FadeOutBGM(4); } break; @@ -684,7 +684,7 @@ static void SpriteCB_HikerGoingUp(struct Sprite *sprite) break; } - if (sprite->pos1.y > 160) + if (sprite->pos1.y > DISPLAY_HEIGHT) DestroySprite(sprite); } } diff --git a/src/cable_club.c b/src/cable_club.c index f02683c9d..abe1d5d4d 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -82,7 +82,7 @@ static void Task_ReestablishLinkAwaitConfirmation(u8 taskId); static void CreateLinkupTask(u8 minPlayers, u8 maxPlayers) { - if (FindTaskIdByFunc(Task_LinkupStart) == 0xFF) + if (FindTaskIdByFunc(Task_LinkupStart) == TASK_NONE) { u8 taskId1; @@ -128,8 +128,6 @@ static void UpdateLinkPlayerCountDisplay(u8 taskId, u8 numPlayers) static u32 ExchangeDataAndGetLinkupStatus(u8 minPlayers, u8 maxPlayers) { - int playerCount; - switch (GetLinkPlayerDataExchangeStatusTimed(minPlayers, maxPlayers)) { case EXCHANGE_COMPLETE: @@ -511,7 +509,6 @@ static void FinishLinkup(u16 *linkupStatus, u32 taskId) static void Task_LinkupAwaitTrainerCardData(u8 taskId) { u8 index; - struct TrainerCard *trainerCards; if (CheckLinkErrored(taskId) == TRUE) return; @@ -630,7 +627,7 @@ void ValidateMixingGameLanguage(void) { u32 taskId = FindTaskIdByFunc(Task_ValidateMixingGameLanguage); - if (taskId == 0xFF) + if (taskId == TASK_NONE) { taskId = CreateTask(Task_ValidateMixingGameLanguage, 80); gTasks[taskId].tState = 0; @@ -907,7 +904,7 @@ static void Task_StartWirelessCableClubBattle(u8 taskId) { struct LinkPlayer *player = (struct LinkPlayer *)gBlockRecvBuffer[i]; gLinkPlayers[i] = *player; - sub_800B524(&gLinkPlayers[i]); + ConvertLinkPlayerName(&gLinkPlayers[i]); ResetBlockReceivedFlag(i); } tState = 4; @@ -993,7 +990,7 @@ static void CB2_ReturnFromUnionRoomBattle(void) void CB2_ReturnFromCableClubBattle(void) { - gBattleTypeFlags &= ~BATTLE_TYPE_20; + gBattleTypeFlags &= ~BATTLE_TYPE_LINK_IN_BATTLE; Overworld_ResetMapMusic(); LoadPlayerParty(); SavePlayerBag(); @@ -1056,29 +1053,31 @@ static void Task_EnterCableClubSeat(u8 taskId) case 1: if (IsFieldMessageBoxHidden()) { - sub_8087288(); + SetInCableClubSeat(); SetLocalLinkPlayerId(gSpecialVar_0x8005); task->tState = 2; } break; case 2: - switch (sub_8087214()) + switch (GetCableClubPartnersReady()) { - case 0: + case CABLE_SEAT_WAITING: break; - case 1: + case CABLE_SEAT_SUCCESS: + // Partners linked and ready, switch to relevant link function HideFieldMessageBox(); task->tState = 0; - sub_80872C4(); + SetStartedCableClubActivity(); SwitchTaskToFollowupFunc(taskId); break; - case 2: + case CABLE_SEAT_FAILED: task->tState = 3; break; } break; case 3: - sub_808729C(); + // Exit, failure + SetLinkWaitingForScript(); sub_8197AE8(TRUE); DestroyTask(taskId); EnableBothScriptContexts(); @@ -1270,7 +1269,8 @@ static void sub_80B3AD0(u8 taskId) #define tTimer data[1] -void sub_80B3AF8(u8 taskId) +// Confirm that all cabled link players are connected +void Task_ReconnectWithLinkPlayers(u8 taskId) { s16 *data = gTasks[taskId].data; diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c index b91506352..0d69eb0fa 100644 --- a/src/clear_save_data_screen.c +++ b/src/clear_save_data_screen.c @@ -163,7 +163,7 @@ static bool8 SetupClearSaveDataScreen(void) ShowBg(3); SetGpuReg(REG_OFFSET_BLDCNT, 0); InitClearSaveDataScreenWindows(); - BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_BG, 0, 0x10, 0, RGB_WHITEALPHA); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(VBlankCB); gMain.state = 1; @@ -185,7 +185,7 @@ static void CB2_FadeAndDoReset(void) { case 0: default: - BeginNormalPaletteFade(0x0000FFFF, 0, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_BG, 0, 0, 0x10, RGB_WHITEALPHA); gMain.state = 1; break; case 1: diff --git a/src/confetti_util.c b/src/confetti_util.c index 3bda3ab53..bcf19f705 100644 --- a/src/confetti_util.c +++ b/src/confetti_util.c @@ -210,8 +210,8 @@ u8 ConfettiUtil_Remove(u8 id) return 0xFF; memset(&sWork->array[id], 0, sizeof(struct ConfettiUtil)); - sWork->array[id].oam.y = 160; - sWork->array[id].oam.x = 240; + sWork->array[id].oam.y = DISPLAY_HEIGHT; + sWork->array[id].oam.x = DISPLAY_WIDTH; sWork->array[id].dummied = TRUE; memcpy(&gMain.oamBuffer[id + 64], &gDummyOamData, sizeof(struct OamData)); return id; diff --git a/src/contest.c b/src/contest.c index 40a0eac66..dbbd6ef63 100644 --- a/src/contest.c +++ b/src/contest.c @@ -42,7 +42,6 @@ #include "constants/moves.h" #include "constants/rgb.h" #include "constants/songs.h" -#include "constants/tv.h" // This file's functions. static void LoadContestPalettes(void); @@ -350,8 +349,8 @@ EWRAM_DATA u8 gHighestRibbonRank = 0; EWRAM_DATA struct ContestResources *gContestResources = NULL; EWRAM_DATA u8 sContestBgCopyFlags = 0; EWRAM_DATA struct ContestWinner gCurContestWinner = {0}; -EWRAM_DATA bool8 gUnknown_02039F5C = 0; -EWRAM_DATA u8 gUnknown_02039F5D = 0; +EWRAM_DATA bool8 gCurContestWinnerIsForArtist = 0; +EWRAM_DATA u8 gCurContestWinnerSaveIdx = 0; // IWRAM common vars. u32 gContestRngValue; @@ -1034,7 +1033,7 @@ void LoadContestBgAfterMoveAnim(void) { u32 contestantWindowId = 5 + i; - LoadPalette(eUnknownHeap1A004.cachedWindowPalettes[contestantWindowId], 16 * (5 + gContestantTurnOrder[i]), sizeof((eUnknownHeap1A004.cachedWindowPalettes[contestantWindowId]))); + LoadPalette(eContestTempSave.cachedWindowPalettes[contestantWindowId], 16 * (5 + gContestantTurnOrder[i]), sizeof((eContestTempSave.cachedWindowPalettes[contestantWindowId]))); } } @@ -1320,7 +1319,7 @@ static bool8 SetupContestGraphics(u8 *stateVar) CopyToBgTilemapBuffer(2, gUnknown_08C17170, 0, 0); CopyBgTilemapBufferToVram(2); // This is a bug, and copies random junk. savedJunk is never read. - DmaCopy32Defvars(3, gContestResources->contestBgTilemaps[2], eUnknownHeap1A004.savedJunk, sizeof(eUnknownHeap1A004.savedJunk)); + DmaCopy32Defvars(3, gContestResources->contestBgTilemaps[2], eContestTempSave.savedJunk, sizeof(eContestTempSave.savedJunk)); break; case 5: LoadCompressedPalette(gOldContestPalette, 0, 0x200); @@ -1328,7 +1327,7 @@ static bool8 SetupContestGraphics(u8 *stateVar) CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, tempPalette2, 16 * sizeof(u16)); CpuCopy32(tempPalette2, gPlttBufferUnfaded + 128, 16 * sizeof(u16)); CpuCopy32(tempPalette1, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16)); - DmaCopy32Defvars(3, gPlttBufferUnfaded, eUnknownHeap1A004.cachedWindowPalettes, sizeof(eUnknownHeap1A004.cachedWindowPalettes)); + DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedWindowPalettes, sizeof(eContestTempSave.cachedWindowPalettes)); LoadContestPalettes(); break; case 6: @@ -1393,7 +1392,7 @@ static void Task_RaiseCurtainAtStart(u8 taskId) break; case 1: *(s16*)&gBattle_BG1_Y += 7; - if ((s16)gBattle_BG1_Y <= 160) + if ((s16)gBattle_BG1_Y <= DISPLAY_HEIGHT) break; gTasks[taskId].data[0]++; break; @@ -1468,7 +1467,7 @@ static void Task_DisplayAppealNumberText(u8 taskId) gBattle_BG0_Y = 0; gBattle_BG2_Y = 0; ContestDebugDoPrint(); - DmaCopy32Defvars(3, gPlttBufferUnfaded, eUnknownHeap1A004.unk18204, PLTT_BUFFER_SIZE * 2); + DmaCopy32Defvars(3, gPlttBufferUnfaded, eContestTempSave.cachedPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); ConvertIntToDecimalStringN(gStringVar1, eContest.appealNumber + 1, STR_CONV_MODE_LEFT_ALIGN, 1); if (!Contest_IsMonsTurnDisabled(gContestPlayerMonIndex)) StringCopy(gDisplayedStringBattle, gText_AppealNumWhichMoveWillBePlayed); @@ -1513,8 +1512,8 @@ static void Task_ShowMoveSelectScreen(u8 taskId) u8 i; u8 moveName[32]; - gBattle_BG0_Y = 160; - gBattle_BG2_Y = 160; + gBattle_BG0_Y = DISPLAY_HEIGHT; + gBattle_BG2_Y = DISPLAY_HEIGHT; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -1667,8 +1666,8 @@ static void Task_HideMoveSelectScreen(u8 taskId) } Contest_SetBgCopyFlags(0); // This seems to be a bug; it should have just copied PLTT_BUFFER_SIZE. - DmaCopy32Defvars(3, gPlttBufferFaded, eUnknownHeap1A004.unk18604, PLTT_BUFFER_SIZE * 2); - LoadPalette(eUnknownHeap1A004.unk18204, 0, PLTT_BUFFER_SIZE * 2); + DmaCopy32Defvars(3, gPlttBufferFaded, eContestTempSave.cachedPlttBufferFaded, PLTT_BUFFER_SIZE * 2); + LoadPalette(eContestTempSave.cachedPlttBufferUnfaded, 0, PLTT_BUFFER_SIZE * 2); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].func = Task_HideApplauseMeterForAppealStart; @@ -2554,7 +2553,7 @@ static void Task_WaitForHeartSliders(u8 taskId) static void sub_80DA348(u8 taskId) { - DmaCopy32Defvars(3, eUnknownHeap1A004.unk18204, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); + DmaCopy32Defvars(3, eContestTempSave.cachedPlttBufferUnfaded, gPlttBufferUnfaded, PLTT_BUFFER_SIZE * 2); gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 2; gTasks[taskId].func = Task_WaitPrintRoundResult; @@ -2681,7 +2680,7 @@ static void Task_WaitForOutOfTimeMsg(u8 taskId) { SetBgForCurtainDrop(); gBattle_BG1_X = 0; - gBattle_BG1_Y = 160; + gBattle_BG1_Y = DISPLAY_HEIGHT; PlaySE12WithPanning(SE_CONTEST_CURTAIN_FALL, 0); gTasks[taskId].data[0] = 0; gTasks[taskId].func = Task_DropCurtainAtAppealsEnd; @@ -2711,7 +2710,7 @@ static void Task_TryCommunicateFinalStandings(u8 taskId) } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ContestReturnToField; } } @@ -2730,7 +2729,7 @@ static void Task_CommunicateFinalStandings(u8 taskId) static void Task_EndCommunicateFinalStandings(u8 taskId) { DestroyTask(taskId); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[eContest.mainTaskId].func = Task_ContestReturnToField; } @@ -3133,10 +3132,10 @@ static u8 CreateContestantSprite(u16 species, u32 otId, u32 personality, u32 ind gSprites[spriteId].data[0] = gSprites[spriteId].oam.paletteNum; gSprites[spriteId].data[2] = species; if (IsSpeciesNotUnown(species)) - gSprites[spriteId].affineAnims = gUnknown_082FF6C0; + gSprites[spriteId].affineAnims = gAffineAnims_BattleSpriteContest; else - gSprites[spriteId].affineAnims = gUnknown_082FF694; - StartSpriteAffineAnim(gSprites + spriteId, 0); + gSprites[spriteId].affineAnims = gAffineAnims_BattleSpriteOpponentSide; + StartSpriteAffineAnim(&gSprites[spriteId], BATTLER_AFFINE_NORMAL); return spriteId; } @@ -4412,7 +4411,7 @@ static void DrawContestantWindows(void) for (i = 0; i < CONTESTANT_COUNT; i++) { s32 windowId = i + 5; - LoadPalette(eUnknownHeap1A004.cachedWindowPalettes[windowId], (gContestantTurnOrder[i] + 5) * 16, sizeof(eUnknownHeap1A004.cachedWindowPalettes[0])); + LoadPalette(eContestTempSave.cachedWindowPalettes[windowId], (gContestantTurnOrder[i] + 5) * 16, sizeof(eContestTempSave.cachedWindowPalettes[0])); } DrawContestantWindowText(); } @@ -4422,7 +4421,6 @@ static void CalculateAppealMoveImpact(u8 contestant) u16 move; u8 effect; u8 rnd; - bool8 canUseTurn; s32 i; eContestantStatus[contestant].appeal = 0; @@ -5517,40 +5515,46 @@ void ResetContestLinkResults(void) gSaveBlock2Ptr->contestLinkResults[i][j] = 0; } -bool8 sub_80DEDA8(u8 rank) +bool8 SaveContestWinner(u8 rank) { s32 i; - u8 r7 = Random() % 3; + u8 captionId = Random() % NUM_PAINTING_CAPTIONS; + // Get the index of the winner among the contestants for (i = 0; i < CONTESTANT_COUNT - 1; i++) - { if (gContestFinalStandings[i] == 0) break; - } - if (rank == 0xFF && i != gContestPlayerMonIndex) + + // Exit if attempting to save a Pokémon other than the player's to the museum + if (rank == CONTEST_SAVE_FOR_MUSEUM && i != gContestPlayerMonIndex) return FALSE; + + // Adjust the random painting caption depending on the category switch (gSpecialVar_ContestCategory) { case CONTEST_CATEGORY_COOL: - r7 += 0; + captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL; break; case CONTEST_CATEGORY_BEAUTY: - r7 += 3; + captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY; break; case CONTEST_CATEGORY_CUTE: - r7 += 6; + captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE; break; case CONTEST_CATEGORY_SMART: - r7 += 9; + captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART; break; case CONTEST_CATEGORY_TOUGH: - r7 += 12; + captionId += NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH; break; } - if (rank != 0xFE) - { - u8 id = sub_80DEFA8(rank, 1); + if (rank != CONTEST_SAVE_FOR_ARTIST) + { + // Save winner in the saveblock + // Used to save any winner for the Contest Hall or the Museum + // but excludes the temporary save used by the artist + u8 id = GetContestWinnerSaveIdx(rank, TRUE); gSaveBlock1Ptr->contestWinners[id].personality = gContestMons[i].personality; gSaveBlock1Ptr->contestWinners[id].species = gContestMons[i].species; gSaveBlock1Ptr->contestWinners[id].trainerId = gContestMons[i].otId; @@ -5561,24 +5565,29 @@ bool8 sub_80DEDA8(u8 rank) else gSaveBlock1Ptr->contestWinners[id].contestRank = gSpecialVar_ContestRank; - if (rank != 0xFF) + if (rank != CONTEST_SAVE_FOR_MUSEUM) gSaveBlock1Ptr->contestWinners[id].contestCategory = gSpecialVar_ContestCategory; else - gSaveBlock1Ptr->contestWinners[id].contestCategory = r7; + gSaveBlock1Ptr->contestWinners[id].contestCategory = captionId; } else { + // Set the most recent winner so the artist can show the player their painting gCurContestWinner.personality = gContestMons[i].personality; gCurContestWinner.trainerId = gContestMons[i].otId; gCurContestWinner.species = gContestMons[i].species; StringCopy(gCurContestWinner.monName, gContestMons[i].nickname); StringCopy(gCurContestWinner.trainerName, gContestMons[i].trainerName); - gCurContestWinner.contestCategory = r7; + gCurContestWinner.contestCategory = captionId; } return TRUE; } -u8 sub_80DEFA8(u8 rank, u8 b) +// Rank is either a regular contest rank (for saving winners to show in the Contest Hall) +// Or one of two special IDs listed below (for saving winners to show in Museum, or from the artist) +// If just retrieving the index where the winner *would* go, shift is FALSE +// If actually preparing to insert the winner into the saveblock, shift is TRUE +u8 GetContestWinnerSaveIdx(u8 rank, bool8 shift) { s32 i; @@ -5588,13 +5597,15 @@ u8 sub_80DEFA8(u8 rank, u8 b) case CONTEST_RANK_SUPER: case CONTEST_RANK_HYPER: case CONTEST_RANK_MASTER: - if (b != 0) + if (shift) { - for (i = NUM_CONTEST_HALL_WINNERS - 1; i >= 1; i--) + for (i = NUM_CONTEST_HALL_WINNERS - 1; i > 0; i--) memcpy(&gSaveBlock1Ptr->contestWinners[i], &gSaveBlock1Ptr->contestWinners[i - 1], sizeof(struct ContestWinner)); } - return 0; + return CONTEST_WINNER_HALL_1 - 1; default: +// case CONTEST_SAVE_FOR_MUSEUM: +// case CONTEST_SAVE_FOR_ARTIST: switch (gSpecialVar_ContestCategory) { case CONTEST_CATEGORY_COOL: @@ -5616,7 +5627,7 @@ void ClearContestWinnerPicsInContestHall(void) { s32 i; - for (i = 0; i < 8; i++) + for (i = 0; i < MUSEUM_CONTEST_WINNERS_START; i++) gSaveBlock1Ptr->contestWinners[i] = gDefaultContestWinners[i]; } @@ -5999,7 +6010,7 @@ static u8 GetMonNicknameLanguage(u8 *nickname) u8 ret = GAME_LANGUAGE; if (nickname[0] == EXT_CTRL_CODE_BEGIN && nickname[1] == EXT_CTRL_CODE_JPN) - return LANGUAGE_ENGLISH; + return GAME_LANGUAGE; if (StringLength(nickname) < PLAYER_NAME_LENGTH - 1) { diff --git a/src/contest_painting.c b/src/contest_painting.c index 1602eb94f..d4bc8ca04 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -21,18 +21,16 @@ #include "window.h" #include "constants/rgb.h" -// IWRAM common u16 (*gContestMonPixels)[][32]; struct ImageProcessingContext gImageProcessingContext; struct ContestWinner *gContestPaintingWinner; u16 *gContestPaintingMonPalette; -// IWRAM bss -static u8 gContestPaintingState; -static u16 gContestPaintingMosaicVal; -static u16 gContestPaintingFadeCounter; -static bool8 gUnknown_030011F6; -static u8 gContestPaintingWindowId; +static u8 sHoldState; +static u16 sMosaicVal; +static u16 sFadeCounter; +static bool8 sVarsInitialized; +static u8 sWindowId; static void ShowContestPainting(void); static void HoldContestPainting(void); @@ -44,7 +42,7 @@ static void PrintContestPaintingCaption(u8, u8); static void VBlankCB_ContestPainting(void); static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels)[64][64]); -extern const u8 gUnknown_0827EA0C[]; +extern const u8 gContestHallPaintingCaption[]; extern const u8 gContestCoolness[]; extern const u8 gContestBeauty[]; extern const u8 gContestCuteness[]; @@ -71,39 +69,39 @@ extern const u8 gContestPaintingTough1[]; extern const u8 gContestPaintingTough2[]; extern const u8 gContestPaintingTough3[]; -const u16 gPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal"); -const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl"); -const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl"); -const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl"); -const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl"); -const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl"); -const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl"); -const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl"); -const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl"); -const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl"); -const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl"); -const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl"); -const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl"); +static const u16 sPictureFramePalettes[] = INCBIN_U16("graphics/picture_frame/bg.gbapal"); +static const u8 sPictureFrameTiles_Cool[] = INCBIN_U8("graphics/picture_frame/cool.4bpp.rl"); +static const u8 sPictureFrameTiles_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty.4bpp.rl"); +static const u8 sPictureFrameTiles_Cute[] = INCBIN_U8("graphics/picture_frame/cute.4bpp.rl"); +static const u8 sPictureFrameTiles_Smart[] = INCBIN_U8("graphics/picture_frame/smart.4bpp.rl"); +static const u8 sPictureFrameTiles_Tough[] = INCBIN_U8("graphics/picture_frame/tough.4bpp.rl"); +static const u8 sPictureFrameTiles_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby.4bpp.rl"); +static const u8 sPictureFrameTilemap_Cool[] = INCBIN_U8("graphics/picture_frame/cool_map.bin.rl"); +static const u8 sPictureFrameTilemap_Beauty[] = INCBIN_U8("graphics/picture_frame/beauty_map.bin.rl"); +static const u8 sPictureFrameTilemap_Cute[] = INCBIN_U8("graphics/picture_frame/cute_map.bin.rl"); +static const u8 sPictureFrameTilemap_Smart[] = INCBIN_U8("graphics/picture_frame/smart_map.bin.rl"); +static const u8 sPictureFrameTilemap_Tough[] = INCBIN_U8("graphics/picture_frame/tough_map.bin.rl"); +static const u8 sPictureFrameTilemap_HallLobby[] = INCBIN_U8("graphics/picture_frame/lobby_map.bin.rl"); static const u8 *const sContestCategoryNames_Unused[] = { - gContestCoolness, - gContestBeauty, - gContestCuteness, - gContestSmartness, - gContestToughness, + [CONTEST_CATEGORY_COOL] = gContestCoolness, + [CONTEST_CATEGORY_BEAUTY] = gContestBeauty, + [CONTEST_CATEGORY_CUTE] = gContestCuteness, + [CONTEST_CATEGORY_SMART] = gContestSmartness, + [CONTEST_CATEGORY_TOUGH] = gContestToughness, }; static const u8 *const sContestRankNames[] = { - gContestRankNormal, - gContestRankSuper, - gContestRankHyper, - gContestRankMaster, - gContestLink, + [CONTEST_RANK_NORMAL] = gContestRankNormal, + [CONTEST_RANK_SUPER] = gContestRankSuper, + [CONTEST_RANK_HYPER] = gContestRankHyper, + [CONTEST_RANK_MASTER] = gContestRankMaster, + [CONTEST_RANK_LINK] = gContestLink, }; -static const struct BgTemplate sContestPaintingBgTemplates[] = +static const struct BgTemplate sBgTemplates[] = { { .bg = 1, @@ -116,7 +114,7 @@ static const struct BgTemplate sContestPaintingBgTemplates[] = }, }; -static const struct WindowTemplate sContestPaintingWindowTemplate = +static const struct WindowTemplate sWindowTemplate = { .bg = 1, .tilemapLeft = 2, @@ -127,23 +125,23 @@ static const struct WindowTemplate sContestPaintingWindowTemplate = .baseBlock = 1, }; -static const u8 *const sContestPaintingDescriptionPointers[] = +static const u8 *const sMuseumCaptions[NUM_PAINTING_CAPTIONS * CONTEST_CATEGORIES_COUNT] = { - gContestPaintingCool1, - gContestPaintingCool2, - gContestPaintingCool3, - gContestPaintingBeauty1, - gContestPaintingBeauty2, - gContestPaintingBeauty3, - gContestPaintingCute1, - gContestPaintingCute2, - gContestPaintingCute3, - gContestPaintingSmart1, - gContestPaintingSmart2, - gContestPaintingSmart3, - gContestPaintingTough1, - gContestPaintingTough2, - gContestPaintingTough3, + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool1, + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool2, + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_COOL] = gContestPaintingCool3, + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty1, + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty2, + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_BEAUTY] = gContestPaintingBeauty3, + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute1, + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute2, + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_CUTE] = gContestPaintingCute3, + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart1, + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart2, + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_SMART] = gContestPaintingSmart3, + [0 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough1, + [1 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough2, + [2 + NUM_PAINTING_CAPTIONS * CONTEST_CATEGORY_TOUGH] = gContestPaintingTough3, }; static const struct OamData sContestPaintingMonOamData = @@ -161,16 +159,15 @@ static const struct OamData sContestPaintingMonOamData = .paletteNum = 0, }; -const u16 gUnknown_085B0838[] = {RGB(0, 0, 0), RGB(0, 0, 0)}; +static const u16 sBgPalette[] = {RGB_BLACK, RGB_BLACK}; void SetContestWinnerForPainting(int contestWinnerId) { - // probably fakematching - u8 *ptr1 = &gUnknown_02039F5D; - u8 *ptr2 = &gUnknown_02039F5C; - gCurContestWinner = gSaveBlock1Ptr->contestWinners[contestWinnerId - 1]; - *ptr1 = contestWinnerId - 1; - *ptr2 = FALSE; + u8 *saveIdx = &gCurContestWinnerSaveIdx; + u8 *isForArtist = &gCurContestWinnerIsForArtist; + gCurContestWinner = gSaveBlock1Ptr->contestWinners[contestWinnerId - 1]; + *saveIdx = contestWinnerId - 1; + *isForArtist = FALSE; } void CB2_ContestPainting(void) @@ -190,7 +187,7 @@ static void CB2_QuitContestPainting(void) SetMainCallback2(gMain.savedCallback); FREE_AND_SET_NULL(gContestPaintingMonPalette); FREE_AND_SET_NULL(gContestMonPixels); - RemoveWindow(gContestPaintingWindowId); + RemoveWindow(sWindowId); Free(GetBgTilemapBuffer(1)); FreeMonSpritesGfx(); } @@ -204,13 +201,13 @@ static void ShowContestPainting(void) SetVBlankCallback(NULL); AllocateMonSpritesGfx(); gContestPaintingWinner = &gCurContestWinner; - InitContestPaintingVars(1); + InitContestPaintingVars(TRUE); InitContestPaintingBg(); gMain.state++; break; case 1: ResetPaletteFade(); - DmaFillLarge32(3, 0, (void *)BG_VRAM, 0x18000, 0x1000); + DmaFillLarge32(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); ResetSpriteData(); gMain.state++; break; @@ -221,16 +218,16 @@ static void ShowContestPainting(void) gMain.state++; break; case 3: - CreateContestPaintingPicture(gUnknown_02039F5D, gUnknown_02039F5C); + CreateContestPaintingPicture(gCurContestWinnerSaveIdx, gCurContestWinnerIsForArtist); gMain.state++; break; case 4: - PrintContestPaintingCaption(gUnknown_02039F5D, gUnknown_02039F5C); - LoadPalette(gUnknown_085B0838, 0, 1 * 2); + PrintContestPaintingCaption(gCurContestWinnerSaveIdx, gCurContestWinnerIsForArtist); + LoadPalette(sBgPalette, 0, 1 * 2); DmaClear32(3, PLTT, PLTT_SIZE); BeginFastPaletteFade(2); SetVBlankCallback(VBlankCB_ContestPainting); - gContestPaintingState = 0; + sHoldState = 0; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); SetMainCallback2(CB2_HoldContestPainting); break; @@ -239,29 +236,29 @@ static void ShowContestPainting(void) static void HoldContestPainting(void) { - switch (gContestPaintingState) + switch (sHoldState) { case 0: if (!gPaletteFade.active) - gContestPaintingState = 1; - if (gUnknown_030011F6 && gContestPaintingFadeCounter) - gContestPaintingFadeCounter--; + sHoldState = 1; + if (sVarsInitialized && sFadeCounter) + sFadeCounter--; break; case 1: if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON))) { - gContestPaintingState++; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); + sHoldState++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); } - if (gUnknown_030011F6) - gContestPaintingFadeCounter = 0; + if (sVarsInitialized) + sFadeCounter = 0; break; case 2: if (!gPaletteFade.active) SetMainCallback2(CB2_QuitContestPainting); - if (gUnknown_030011F6 && gContestPaintingFadeCounter < 30) - gContestPaintingFadeCounter++; + if (sVarsInitialized && sFadeCounter < 30) + sFadeCounter++; break; } } @@ -269,45 +266,48 @@ static void HoldContestPainting(void) static void InitContestPaintingWindow(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sContestPaintingBgTemplates, ARRAY_COUNT(sContestPaintingBgTemplates)); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); SetBgTilemapBuffer(1, AllocZeroed(BG_SCREEN_SIZE)); - gContestPaintingWindowId = AddWindow(&sContestPaintingWindowTemplate); + sWindowId = AddWindow(&sWindowTemplate); DeactivateAllTextPrinters(); - FillWindowPixelBuffer(gContestPaintingWindowId, PIXEL_FILL(0)); - PutWindowTilemap(gContestPaintingWindowId); - CopyWindowToVram(gContestPaintingWindowId, 3); + FillWindowPixelBuffer(sWindowId, PIXEL_FILL(0)); + PutWindowTilemap(sWindowId); + CopyWindowToVram(sWindowId, 3); ShowBg(1); } -static void PrintContestPaintingCaption(u8 contestType, bool8 arg1) +static void PrintContestPaintingCaption(u8 contestType, bool8 isForArtist) { int x; u8 category; - if (arg1 == TRUE) + // Artist's painting has no caption + if (isForArtist == TRUE) return; category = gContestPaintingWinner->contestCategory; - if (contestType < 8) + if (contestType < MUSEUM_CONTEST_WINNERS_START) { + // Contest Hall caption BufferContestName(gStringVar1, category); StringAppend(gStringVar1, gText_Space); StringAppend(gStringVar1, sContestRankNames[gContestPaintingWinner->contestRank]); StringCopy(gStringVar2, gContestPaintingWinner->trainerName); - sub_81DB5AC(gStringVar2); + ConvertInternationalContestantName(gStringVar2); StringCopy(gStringVar3, gContestPaintingWinner->monName); - StringExpandPlaceholders(gStringVar4, gUnknown_0827EA0C); + StringExpandPlaceholders(gStringVar4, gContestHallPaintingCaption); } else { + // Museum caption StringCopy(gStringVar1, gContestPaintingWinner->monName); - StringExpandPlaceholders(gStringVar4, sContestPaintingDescriptionPointers[category]); + StringExpandPlaceholders(gStringVar4, sMuseumCaptions[category]); } x = GetStringCenterAlignXOffset(1, gStringVar4, 208); - AddTextPrinterParameterized(gContestPaintingWindowId, 1, gStringVar4, x, 1, 0, 0); + AddTextPrinterParameterized(sWindowId, 1, gStringVar4, x, 1, 0, 0); CopyBgTilemapBufferToVram(1); } @@ -322,33 +322,34 @@ static void InitContestPaintingBg(void) SetGpuReg(REG_OFFSET_BLDY, 0); } -static void InitContestPaintingVars(bool8 arg0) +static void InitContestPaintingVars(bool8 reset) { - if (arg0 == FALSE) + if (reset == FALSE) { - gUnknown_030011F6 = FALSE; - gContestPaintingMosaicVal = 0; - gContestPaintingFadeCounter = 0; + // Never reached + sVarsInitialized = FALSE; + sMosaicVal = 0; + sFadeCounter = 0; } else { - gUnknown_030011F6 = TRUE; - gContestPaintingMosaicVal = 15; - gContestPaintingFadeCounter = 30; + sVarsInitialized = TRUE; + sMosaicVal = 15; + sFadeCounter = 30; } } static void UpdateContestPaintingMosaicEffect(void) { - if (!gUnknown_030011F6) + if (!sVarsInitialized) { SetGpuReg(REG_OFFSET_MOSAIC, 0); } else { SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256); - gContestPaintingMosaicVal = gContestPaintingFadeCounter / 2; - SetGpuReg(REG_OFFSET_MOSAIC, (gContestPaintingMosaicVal << 12) | (gContestPaintingMosaicVal << 8) | (gContestPaintingMosaicVal << 4) | (gContestPaintingMosaicVal << 0)); + sMosaicVal = sFadeCounter / 2; + SetGpuReg(REG_OFFSET_MOSAIC, (sMosaicVal << 12) | (sMosaicVal << 8) | (sMosaicVal << 4) | (sMosaicVal << 0)); } } @@ -415,34 +416,35 @@ static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 (*destPixels) #define VRAM_PICTURE_DATA(x, y) (((u16 *)(BG_SCREEN_ADDR(12)))[(y) * 32 + (x)]) -static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1) +static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 isForArtist) { u8 x, y; - LoadPalette(gPictureFramePalettes, 0, 0x100); - if (arg1 == TRUE) + LoadPalette(sPictureFramePalettes, 0, 0x100); + if (isForArtist == TRUE) { - switch (gContestPaintingWinner->contestCategory / 3) + // Load Artist's frame + switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS) { case CONTEST_CATEGORY_COOL: - RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_0, gContestMonPixels); + RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM); + RLUnCompWram(sPictureFrameTilemap_Cool, gContestMonPixels); break; case CONTEST_CATEGORY_BEAUTY: - RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_1, gContestMonPixels); + RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM); + RLUnCompWram(sPictureFrameTilemap_Beauty, gContestMonPixels); break; case CONTEST_CATEGORY_CUTE: - RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_2, gContestMonPixels); + RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM); + RLUnCompWram(sPictureFrameTilemap_Cute, gContestMonPixels); break; case CONTEST_CATEGORY_SMART: - RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_3, gContestMonPixels); + RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM); + RLUnCompWram(sPictureFrameTilemap_Smart, gContestMonPixels); break; case CONTEST_CATEGORY_TOUGH: - RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_4, gContestMonPixels); + RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM); + RLUnCompWram(sPictureFrameTilemap_Tough, gContestMonPixels); break; } @@ -464,34 +466,36 @@ static void LoadContestPaintingFrame(u8 contestWinnerId, bool8 arg1) for (x = 0; x < 16; x++) VRAM_PICTURE_DATA(x + 7, 2) = (*gContestMonPixels)[2][7]; } - else if (contestWinnerId < 8) + else if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START) { - RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_5, (void *)(BG_SCREEN_ADDR(12))); + // Load Contest Hall lobby frame + RLUnCompVram(sPictureFrameTiles_HallLobby, (void *)VRAM); + RLUnCompVram(sPictureFrameTilemap_HallLobby, (void *)(BG_SCREEN_ADDR(12))); } else { - switch (gContestPaintingWinner->contestCategory / 3) + // Load Museum frame + switch (gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS) { case CONTEST_CATEGORY_COOL: - RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_0, (void *)(BG_SCREEN_ADDR(12))); + RLUnCompVram(sPictureFrameTiles_Cool, (void *)VRAM); + RLUnCompVram(sPictureFrameTilemap_Cool, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_BEAUTY: - RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_1, (void *)(BG_SCREEN_ADDR(12))); + RLUnCompVram(sPictureFrameTiles_Beauty, (void *)VRAM); + RLUnCompVram(sPictureFrameTilemap_Beauty, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_CUTE: - RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_2, (void *)(BG_SCREEN_ADDR(12))); + RLUnCompVram(sPictureFrameTiles_Cute, (void *)VRAM); + RLUnCompVram(sPictureFrameTilemap_Cute, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_SMART: - RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_3, (void *)(BG_SCREEN_ADDR(12))); + RLUnCompVram(sPictureFrameTiles_Smart, (void *)VRAM); + RLUnCompVram(sPictureFrameTilemap_Smart, (void *)(BG_SCREEN_ADDR(12))); break; case CONTEST_CATEGORY_TOUGH: - RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompVram(gPictureFrameTilemap_4, (void *)(BG_SCREEN_ADDR(12))); + RLUnCompVram(sPictureFrameTiles_Tough, (void *)VRAM); + RLUnCompVram(sPictureFrameTilemap_Tough, (void *)(BG_SCREEN_ADDR(12))); break; } } @@ -520,10 +524,10 @@ static u8 GetImageEffectForContestWinner(u8 contestWinnerId) { u8 contestCategory; - if (contestWinnerId < 8) + if (contestWinnerId < MUSEUM_CONTEST_WINNERS_START) contestCategory = gContestPaintingWinner->contestCategory; else - contestCategory = gContestPaintingWinner->contestCategory / 3; + contestCategory = gContestPaintingWinner->contestCategory / NUM_PAINTING_CAPTIONS; switch (contestCategory) { @@ -585,12 +589,12 @@ static void DoContestPaintingImageProcessing(u8 imageEffect) LoadPalette(gContestPaintingMonPalette, 0x100, 0x200); } -static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 arg1) +static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 isForArtist) { AllocPaintingResources(); InitContestMonPixels(gContestPaintingWinner->species, 0); DoContestPaintingImageProcessing(GetImageEffectForContestWinner(contestWinnerId)); InitPaintingMonOamData(contestWinnerId); - LoadContestPaintingFrame(contestWinnerId, arg1); + LoadContestPaintingFrame(contestWinnerId, isForArtist); } diff --git a/src/contest_util.c b/src/contest_util.c index e690a3bbe..decbded2c 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -44,7 +44,6 @@ #include "constants/game_stat.h" #include "constants/rgb.h" #include "constants/songs.h" -#include "constants/tv.h" #include "contest.h" enum { @@ -61,10 +60,29 @@ enum { #define GET_CONTEST_WINNER_ID(i) { for ((i) = 0; (i) < CONTESTANT_COUNT && gContestFinalStandings[(i)] != 0; (i)++); } +// Gfx/pal tags for the text window sprites on the contest results screen. +// Both types of text windows are made up of 4 individual sprites +// These tags are used by the spritesheets, and implicitly in the loop in CreateResultsTextWindowSprites +#define TAG_TEXT_WINDOW_BASE 3009 +enum { + TAG_RESULTS_TEXT_WINDOW_LEFT = TAG_TEXT_WINDOW_BASE, + TAG_RESULTS_TEXT_WINDOW_MIDLEFT, + TAG_RESULTS_TEXT_WINDOW_MIDRIGHT, + TAG_RESULTS_TEXT_WINDOW_RIGHT, + TAG_LINK_TEXT_WINDOW_LEFT, + TAG_LINK_TEXT_WINDOW_MIDLEFT, + TAG_LINK_TEXT_WINDOW_MIDRIGHT, + TAG_LINK_TEXT_WINDOW_RIGHT, // 3016 +}; #define TAG_CONFETTI 3017 +#define TAG_WIRELESS_INDICATOR_WINDOW 22222 #define MAX_BAR_LENGTH 87 +// Starting x/y for the sliding results screen text box +#define TEXT_BOX_X (DISPLAY_WIDTH + 32) +#define TEXT_BOX_Y (DISPLAY_HEIGHT - 16) + struct ContestResultsInternal { u8 slidingTextBoxSpriteId; @@ -105,14 +123,14 @@ struct ContestResults static EWRAM_DATA struct ContestResults *sContestResults = NULL; static void LoadAllContestMonIconPalettes(void); -static void LoadContestResultsTilemaps(void); +static void LoadContestResultsTitleBarTilemaps(void); static u8 GetNumPreliminaryPoints(u8, bool8); static s8 GetNumRound2Points(u8, bool8); static void AddContestTextPrinter(int, u8 *, int); static void AllocContestResults(void); static void FreeContestResults(void); static void LoadAllContestMonIcons(u8, u8); -static void LoadContestResultSprites(void); +static void CreateResultsTextWindowSprites(void); static void TryCreateWirelessSprites(void); static void Task_StartShowContestResults(u8 taskId); static void CB2_StartShowContestResults(void); @@ -166,11 +184,11 @@ static void SpriteCB_Confetti(struct Sprite *sprite); static void Task_ShowContestEntryMonPic(u8 taskId); static void Task_LinkContestWaitForConnection(u8 taskId); -static const u16 sUnknown_0858D6B0[] = INCBIN_U16("graphics/unknown/unknown_58D6B0.gbapal"); -static const u8 sUnknown_0858D6D0[] = INCBIN_U8("graphics/unknown/unknown_58D6D0.4bpp"); +static const u16 sResultsTextWindow_Pal[] = INCBIN_U16("graphics/contest/results_screen/text_window.gbapal"); +static const u8 sResultsTextWindow_Gfx[] = INCBIN_U8("graphics/contest/results_screen/text_window.4bpp"); static const u16 sMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal"); -static const struct OamData sOamData_858D7F0 = +static const struct OamData sOamData_ResultsTextWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -187,33 +205,33 @@ static const struct OamData sOamData_858D7F0 = .affineParam = 0, }; -static const struct SpriteTemplate sSpriteTemplate_858D7F8 = +static const struct SpriteTemplate sSpriteTemplate_ResultsTextWindow = { - .tileTag = 3009, - .paletteTag = 3009, - .oam = &sOamData_858D7F0, + .tileTag = TAG_TEXT_WINDOW_BASE, + .paletteTag = TAG_TEXT_WINDOW_BASE, + .oam = &sOamData_ResultsTextWindow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteSheet sUnknown_0858D810[] = +static const struct SpriteSheet sSpriteSheets_ResultsTextWindow[] = { - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3009 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3010 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3011 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3012 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3013 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3014 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3015 }, - { .data = gMiscBlank_Gfx, .size = 0x400, .tag = 3016 }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_LEFT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDLEFT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_MIDRIGHT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_RESULTS_TEXT_WINDOW_RIGHT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_LEFT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDLEFT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_MIDRIGHT }, + { .data = gMiscBlank_Gfx, .size = 0x400, .tag = TAG_LINK_TEXT_WINDOW_RIGHT }, }; -static const struct SpritePalette sUnknown_0858D850 = +static const struct SpritePalette sSpritePalette_ResultsTextWindow = { .data = sMiscBlank_Pal, - .tag = 3009, + .tag = TAG_TEXT_WINDOW_BASE, }; static const struct OamData sOamData_Confetti = @@ -339,7 +357,7 @@ static const struct WindowTemplate sWindowTemplates[] = DUMMY_WIN_TEMPLATE, }; -static const struct OamData sUnknown_0858D8C0 = +static const struct OamData sOamData_WirelessIndicatorWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -357,22 +375,22 @@ static const struct OamData sUnknown_0858D8C0 = }; -static const struct SpriteTemplate sSpriteTemplate_858D8C8 = +static const struct SpriteTemplate sSpriteTemplate_WirelessIndicatorWindow = { - .tileTag = 22222, + .tileTag = TAG_WIRELESS_INDICATOR_WINDOW, .paletteTag = 0, - .oam = &sUnknown_0858D8C0, + .oam = &sOamData_WirelessIndicatorWindow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteSheet sUnknown_0858D8E0 = +static const struct SpriteSheet sSpriteSheet_WirelessIndicatorWindow = { .data = gMiscBlank_Gfx, .size = 0x200, - .tag = 22222 + .tag = TAG_WIRELESS_INDICATOR_WINDOW }; static const u8 sContestLinkTextColors[4] = {TEXT_COLOR_WHITE, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; @@ -430,12 +448,12 @@ static void LoadContestResultsBgGfx(void) u16 tile1, tile2; LZDecompressVram(gContestResults_Gfx, (void *)BG_CHAR_ADDR(0)); - CopyToBgTilemapBuffer(3, gUnknown_08C1A12C, 0, 0); - CopyToBgTilemapBuffer(2, gUnknown_08C1A000, 0, 0); - CopyToBgTilemapBuffer(0, gUnknown_08C19EEC, 0, 0); - LoadContestResultsTilemaps(); + CopyToBgTilemapBuffer(3, gContestResults_Bg_Tilemap, 0, 0); + CopyToBgTilemapBuffer(2, gContestResults_Interface_Tilemap, 0, 0); + CopyToBgTilemapBuffer(0, gContestResults_WinnerBanner_Tilemap, 0, 0); + LoadContestResultsTitleBarTilemaps(); LoadCompressedPalette(gContestResults_Pal, 0, 0x200); - LoadPalette(sUnknown_0858D6B0, 0xF0, 0x20); + LoadPalette(sResultsTextWindow_Pal, 0xF0, sizeof(sResultsTextWindow_Pal)); for (i = 0; i < CONTESTANT_COUNT; i++) { @@ -515,14 +533,14 @@ static void CB2_StartShowContestResults(void) LoadAllContestMonNames(); memset(sContestResults->data, 0, sizeof(*sContestResults->data)); memset(sContestResults->monResults, 0, sizeof(*sContestResults->monResults)); - LoadContestResultSprites(); + CreateResultsTextWindowSprites(); TryCreateWirelessSprites(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = FALSE; sContestResults->data->showResultsTaskId = CreateTask(Task_ShowContestResults, 5); SetMainCallback2(CB2_ShowContestResults); - gBattle_WIN1H = 0x00F0; - gBattle_WIN1V = 0x80A0; + gBattle_WIN1H = WIN_RANGE(0, DISPLAY_WIDTH); + gBattle_WIN1V = WIN_RANGE(DISPLAY_HEIGHT - 32, DISPLAY_HEIGHT); CreateTask(Task_SlideContestResultsBg, 20); CalculateContestantsResultData(); if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_WIRELESS) @@ -587,10 +605,10 @@ static void Task_ShowContestResults(u8 taskId) } TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); - sub_80DEDA8(gSpecialVar_ContestRank); - sub_80DEDA8(0xFE); - gUnknown_02039F5C = TRUE; - gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); + SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting + SaveContestWinner(CONTEST_SAVE_FOR_ARTIST); + gCurContestWinnerIsForArtist = TRUE; + gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE); var = VarGet(VAR_CONTEST_HALL_STATE); VarSet(VAR_CONTEST_HALL_STATE, 0); SetContinueGameWarpStatusToDynamicWarp(); @@ -637,10 +655,10 @@ static void Task_ShowContestResults(u8 taskId) if (gContestFinalStandings[gContestPlayerMonIndex] == 0) IncrementGameStat(GAME_STAT_WON_CONTEST); - sub_80DEDA8(gSpecialVar_ContestRank); - sub_80DEDA8(0xFE); - gUnknown_02039F5C = TRUE; - gUnknown_02039F5D = sub_80DEFA8(0xFE, 0); + SaveContestWinner(gSpecialVar_ContestRank); // Save for lobby painting + SaveContestWinner(CONTEST_SAVE_FOR_ARTIST); + gCurContestWinnerIsForArtist = TRUE; + gCurContestWinnerSaveIdx = GetContestWinnerSaveIdx(CONTEST_SAVE_FOR_ARTIST, FALSE); TryGainNewFanFromCounter(FANCOUNTER_FINISHED_CONTEST); gTasks[taskId].func = Task_AnnouncePreliminaryResults; } @@ -679,7 +697,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId) { CreateTask(Task_FlashStarsAndHearts, 20); x = DrawResultsTextWindow(gText_AnnouncingResults, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, 120, 1088); + StartTextBoxSlideIn(x, TEXT_BOX_Y, 120, 1088); gTasks[taskId].tState++; } else if (gTasks[taskId].tState == 1) @@ -702,7 +720,7 @@ static void Task_AnnouncePreliminaryResults(u8 taskId) else if (gTasks[taskId].tState == 3) { x = DrawResultsTextWindow(gText_PreliminaryResults, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, -1, 1088); + StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088); gTasks[taskId].tState++; } else if (gTasks[taskId].tState == 4) @@ -752,7 +770,7 @@ static void Task_AnnounceRound2Results(u8 taskId) { gTasks[taskId].tTimer = 0; x = DrawResultsTextWindow(gText_Round2Results, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, -1, 1088); + StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088); } } else if (sContestResults->data->slidingTextBoxState == SLIDING_TEXT_ARRIVED) @@ -837,11 +855,11 @@ static void Task_AnnounceWinner(u8 taskId) gTasks[taskId].tTimer = 0; GET_CONTEST_WINNER_ID(i); StringCopy(gStringVar1, gContestMons[i].trainerName); - sub_81DB5AC(gStringVar1); + ConvertInternationalContestantName(gStringVar1); StringCopy(gStringVar2, gContestMons[i].nickname); StringExpandPlaceholders(winnerTextBuffer, gText_ContestantsMonWon); x = DrawResultsTextWindow(winnerTextBuffer, sContestResults->data->slidingTextBoxSpriteId); - StartTextBoxSlideIn(x, 144, -1, 1088); + StartTextBoxSlideIn(x, TEXT_BOX_Y, -1, 1088); gTasks[taskId].tState++; } break; @@ -864,8 +882,8 @@ static void Task_ShowWinnerMonBanner(u8 taskId) switch (gTasks[taskId].tState) { case 0: - gBattle_WIN0H = 0x00F0; - gBattle_WIN0V = 0x5050; + gBattle_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); + gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2, DISPLAY_HEIGHT / 2); GET_CONTEST_WINNER_ID(i); species = gContestMons[i].species; @@ -892,7 +910,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId) LoadCompressedSpritePalette(pokePal); SetMultiuseSpriteTemplateToPokemon(species, B_POSITION_OPPONENT_LEFT); gMultiuseSpriteTemplate.paletteTag = pokePal->tag; - spriteId = CreateSprite(&gMultiuseSpriteTemplate, 272, 80, 10); + spriteId = CreateSprite(&gMultiuseSpriteTemplate, DISPLAY_WIDTH + 32, DISPLAY_HEIGHT / 2, 10); gSprites[spriteId].data[1] = species; gSprites[spriteId].oam.priority = 0; gSprites[spriteId].callback = SpriteCB_WinnerMonSlideIn; @@ -912,7 +930,7 @@ static void Task_ShowWinnerMonBanner(u8 taskId) gTasks[taskId].tCounter = 32; counter = gTasks[taskId].tCounter; - gBattle_WIN0V = ((80 - counter) << 8) | (80 + counter); + gBattle_WIN0V = WIN_RANGE(DISPLAY_HEIGHT / 2 - counter, DISPLAY_HEIGHT / 2 + counter); if (counter == 32) gTasks[taskId].tState++; } @@ -934,11 +952,11 @@ static void Task_ShowWinnerMonBanner(u8 taskId) { u8 top = (gBattle_WIN0V >> 8); top += 2; - if (top > 80) - top = 80; + if (top > DISPLAY_HEIGHT / 2) + top = DISPLAY_HEIGHT / 2; - gBattle_WIN0V = (top << 8) | (160 - top); - if (top == 80) + gBattle_WIN0V = WIN_RANGE(top, DISPLAY_HEIGHT - top); + if (top == DISPLAY_HEIGHT / 2) gTasks[taskId].tState++; } break; @@ -1018,12 +1036,12 @@ static void Task_EndShowContestResults(u8 taskId) if (gTasks[taskId].tTimer == 0) { DestroyTask(sContestResults->data->highlightWinnerTaskId); - BlendPalettes(0x0000FFFF, 16, RGB_BLACK); + BlendPalettes(PALETTES_BG, 16, RGB_BLACK); gTasks[taskId].tTimer++; } else if (gTasks[taskId].tTimer == 1) { - BlendPalettes(0xFFFF0000, 16, RGB_BLACK); + BlendPalettes(PALETTES_OBJECTS, 16, RGB_BLACK); gTasks[taskId].tTimer++; } else @@ -1136,9 +1154,9 @@ static void TryCreateWirelessSprites(void) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(8, 8); gSprites[gWirelessStatusIndicatorSpriteId].subpriority = 1; - sheet = LoadSpriteSheet(&sUnknown_0858D8E0); + sheet = LoadSpriteSheet(&sSpriteSheet_WirelessIndicatorWindow); RequestDma3Fill(0xFFFFFFFF, (void *)BG_CHAR_ADDR(4) + sheet * 0x20, 0x80, 1); - spriteId = CreateSprite(&sSpriteTemplate_858D8C8, 8, 8, 0); + spriteId = CreateSprite(&sSpriteTemplate_WirelessIndicatorWindow, 8, 8, 0); gSprites[spriteId].oam.objMode = ST_OAM_OBJ_WINDOW; } } @@ -1150,14 +1168,13 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) int strWidth; u8 *spriteTilePtrs[4]; u8 *dst; - { - struct WindowTemplate windowTemplate; - memset(&windowTemplate, 0, sizeof(windowTemplate)); - windowTemplate.width = 30; - windowTemplate.height = 2; - windowId = AddWindow(&windowTemplate); - FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - } + + struct WindowTemplate windowTemplate; + memset(&windowTemplate, 0, sizeof(windowTemplate)); + windowTemplate.width = 30; + windowTemplate.height = 2; + windowId = AddWindow(&windowTemplate); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); origWidth = GetStringWidth(1, text, 0); strWidth = (origWidth + 9) / 8; @@ -1169,16 +1186,16 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) s32 i; struct Sprite *sprite; const u8 *src, *windowTilesPtr; - windowTilesPtr = (u8 *)(GetWindowAttribute(windowId, WINDOW_TILE_DATA)); - src = (u8 *)(sUnknown_0858D6D0); + windowTilesPtr = (u8 *)GetWindowAttribute(windowId, WINDOW_TILE_DATA); + src = (u8 *)sResultsTextWindow_Gfx; sprite = &gSprites[spriteId]; spriteTilePtrs[0] = (u8 *)(sprite->oam.tileNum * 32 + OBJ_VRAM0); - for (i = 1; i < 4; i++) + for (i = 1; i < (int)ARRAY_COUNT(spriteTilePtrs); i++) spriteTilePtrs[i] = (void*)(gSprites[sprite->data[i - 1]].oam.tileNum * 32 + OBJ_VRAM0); - for (i = 0; i < 4; i++) + for (i = 0; i < (int)ARRAY_COUNT(spriteTilePtrs); i++) CpuFill32(0, spriteTilePtrs[i], 0x400); dst = spriteTilePtrs[0]; @@ -1205,30 +1222,34 @@ static s32 DrawResultsTextWindow(const u8 *text, u8 spriteId) } RemoveWindow(windowId); - return (240 - (strWidth + 2) * 8) / 2; + return (DISPLAY_WIDTH - (strWidth + 2) * 8) / 2; } -static void LoadContestResultSprites(void) +static void CreateResultsTextWindowSprites(void) { int i; struct SpriteTemplate template; - u8 spriteIds[ARRAY_COUNT(sUnknown_0858D810)]; + u8 spriteIds[ARRAY_COUNT(sSpriteSheets_ResultsTextWindow)]; - template = sSpriteTemplate_858D7F8; - for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) - LoadSpriteSheet(&sUnknown_0858D810[i]); + template = sSpriteTemplate_ResultsTextWindow; + for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++) + LoadSpriteSheet(&sSpriteSheets_ResultsTextWindow[i]); - LoadSpritePalette(&sUnknown_0858D850); - for (i = 0; i < (int)ARRAY_COUNT(sUnknown_0858D810); i++) + LoadSpritePalette(&sSpritePalette_ResultsTextWindow); + + // Create sprites for the two window types, each made up of 4 sprites + for (i = 0; i < (int)ARRAY_COUNT(sSpriteSheets_ResultsTextWindow); i++) { - spriteIds[i] = CreateSprite(&template, 272, 144, 10); + spriteIds[i] = CreateSprite(&template, TEXT_BOX_X, TEXT_BOX_Y, 10); template.tileTag++; } + // Save sprite ids of the sliding text box onto its leftmost sprite gSprites[spriteIds[0]].data[0] = spriteIds[1]; gSprites[spriteIds[0]].data[1] = spriteIds[2]; gSprites[spriteIds[0]].data[2] = spriteIds[3]; + // Save sprite ids of the link text box onto its leftmost sprite gSprites[spriteIds[4]].data[0] = spriteIds[5]; gSprites[spriteIds[4]].data[1] = spriteIds[6]; gSprites[spriteIds[4]].data[2] = spriteIds[7]; @@ -1248,7 +1269,7 @@ static void LoadContestResultSprites(void) static void StartTextBoxSlideIn(s16 x, u16 y, u16 slideOutTimer, u16 slideIncrement) { struct Sprite *sprite = &gSprites[sContestResults->data->slidingTextBoxSpriteId]; - sprite->pos1.x = 272; + sprite->pos1.x = TEXT_BOX_X; sprite->pos1.y = y; sprite->pos2.x = 0; sprite->pos2.y = 0; @@ -1275,8 +1296,8 @@ static void StartTextBoxSlideOut(u16 slideIncrement) static void EndTextBoxSlideOut(struct Sprite *sprite) { - sprite->pos1.x = 272; - sprite->pos1.y = 144; + sprite->pos1.x = TEXT_BOX_X; + sprite->pos1.y = TEXT_BOX_Y; sprite->pos2.y = 0; sprite->pos2.x = 0; sprite->callback = SpriteCallbackDummy; @@ -1353,8 +1374,8 @@ static void ShowLinkResultsTextBox(const u8 *text) gSprites[sprite->data[i]].invisible = FALSE; } - gBattle_WIN0H = 0x00F0; - gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16); + gBattle_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH); + gBattle_WIN0V = WIN_RANGE(sprite->pos1.y - 16, sprite->pos1.y + 16); SetGpuReg(REG_OFFSET_WININ, WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); } @@ -1377,7 +1398,7 @@ static void HideLinkResultsTextBox(void) | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); } -static void LoadContestResultsTilemaps(void) +static void LoadContestResultsTitleBarTilemaps(void) { u8 palette; int x, y; @@ -1386,58 +1407,58 @@ static void LoadContestResultsTilemaps(void) y = 1; if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) { - CopyToBgTilemapBufferRect(2, gLinkContestResults_Tilemap, 5, 1, 5, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Link_Tilemap, 5, 1, 5, 2); x = 10; } else if (gSpecialVar_ContestRank == CONTEST_RANK_NORMAL) { - CopyToBgTilemapBufferRect(2, gNormalContestResults_Tilemap, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Normal_Tilemap, 5, 1, 10, 2); x = 15; } else if (gSpecialVar_ContestRank == CONTEST_RANK_SUPER) { - CopyToBgTilemapBufferRect(2, gSuperContestResults_Tilemap, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Super_Tilemap, 5, 1, 10, 2); x = 15; } else if (gSpecialVar_ContestRank == CONTEST_RANK_HYPER) { - CopyToBgTilemapBufferRect(2, gHyperContestResults_Tilemap, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Hyper_Tilemap, 5, 1, 10, 2); x = 15; } else // CONTEST_RANK_MASTER { - CopyToBgTilemapBufferRect(2, gMasterContestResults_Tilemap, 5, 1, 10, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Master_Tilemap, 5, 1, 10, 2); x = 15; } if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_COOL) { palette = 0; - CopyToBgTilemapBufferRect(2, gCoolContestResults_Tilemap, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cool_Tilemap, x, y, 5, 2); } else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_BEAUTY) { palette = 1; - CopyToBgTilemapBufferRect(2, gBeautyContestResults_Tilemap, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Beauty_Tilemap, x, y, 5, 2); } else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_CUTE) { palette = 2; - CopyToBgTilemapBufferRect(2, gCuteContestResults_Tilemap, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Cute_Tilemap, x, y, 5, 2); } else if (gSpecialVar_ContestCategory == CONTEST_CATEGORY_SMART) { palette = 3; - CopyToBgTilemapBufferRect(2, gSmartContestResults_Tilemap, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Smart_Tilemap, x, y, 5, 2); } else // CONTEST_CATEGORY_TOUGH { palette = 4; - CopyToBgTilemapBufferRect(2, gToughContestResults_Tilemap, x, y, 5, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tough_Tilemap, x, y, 5, 2); } x += 5; - CopyToBgTilemapBufferRect(2, gContestResults_Tilemap, x, y, 6, 2); + CopyToBgTilemapBufferRect(2, gContestResultsTitle_Tilemap, x, y, 6, 2); CopyToBgTilemapBufferRect_ChangePalette(2, sContestResults->tilemapBuffers[2], 0, 0, 32, 4, palette); } @@ -1567,10 +1588,10 @@ static void SpriteCB_WinnerMonSlideIn(struct Sprite *sprite) sprite->pos1.x -= delta >> 8; sprite->data[1] += 0x600; sprite->data[1] &= 0xFF; - if (sprite->pos1.x < 120) - sprite->pos1.x = 120; + if (sprite->pos1.x < DISPLAY_WIDTH / 2) + sprite->pos1.x = DISPLAY_WIDTH / 2; - if (sprite->pos1.x == 120) + if (sprite->pos1.x == DISPLAY_WIDTH / 2) { sprite->callback = SpriteCallbackDummy; sprite->data[1] = 0; @@ -1600,7 +1621,7 @@ static void Task_CreateConfetti(u8 taskId) gTasks[taskId].data[0] = 0; if (sContestResults->data->confettiCount < 40) { - u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % 240) - 20, 44, 5); + u8 spriteId = CreateSprite(&sSpriteTemplate_Confetti, (Random() % DISPLAY_WIDTH) - 20, 44, 5); gSprites[spriteId].data[0] = Random() % 512; gSprites[spriteId].data[1] = (Random() % 24) + 16; gSprites[spriteId].data[2] = (Random() % 256) + 48; @@ -1628,7 +1649,7 @@ static void SpriteCB_Confetti(struct Sprite *sprite) if (sContestResults->data->destroyConfetti) sprite->invisible = TRUE; - if (sprite->pos1.x > 248 || sprite->pos1.y > 116) + if (sprite->pos1.x > DISPLAY_WIDTH + 8 || sprite->pos1.y > 116) { DestroySprite(sprite); sContestResults->data->confettiCount--; @@ -2035,7 +2056,7 @@ void GiveMonContestRibbon(void) void BufferContestantTrainerName(void) { StringCopy(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName); - sub_81DB5AC(gStringVar1); + ConvertInternationalContestantName(gStringVar1); } void BufferContestantMonNickname(void) @@ -2074,7 +2095,7 @@ void BufferContestWinnerTrainerName(void) u8 i; GET_CONTEST_WINNER_ID(i); StringCopy(gStringVar3, gContestMons[i].trainerName); - sub_81DB5AC(gStringVar3); + ConvertInternationalContestantName(gStringVar3); } void BufferContestWinnerMonName(void) @@ -2102,7 +2123,7 @@ void StartContest(void) { ScriptContext2_Enable(); CreateTask(Task_StartContest, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } void BufferContestantMonSpecies(void) @@ -2123,7 +2144,7 @@ void ShowContestResults(void) { ScriptContext2_Enable(); CreateTask(Task_StartShowContestResults, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } void GetContestPlayerId(void) @@ -2257,6 +2278,10 @@ static void Task_LinkContest_WaitDisconnect(u8 taskId) } } +/* + A section of contest script functions starts here +*/ + void SetContestTrainerGfxIds(void) { gSaveBlock1Ptr->vars[VAR_OBJ_GFX_ID_0 - VARS_START] = gContestMons[0].trainerGfxId; @@ -2265,27 +2290,27 @@ void SetContestTrainerGfxIds(void) } // Unused -void sub_80F8814(void) +void GetNpcContestantLocalId(void) { - u16 var1; - u8 var0 = gSpecialVar_0x8005; - switch (var0) + u16 localId; + u8 contestant = gSpecialVar_0x8005; + switch (contestant) { case 0: - var1 = 3; + localId = 3; break; case 1: - var1 = 4; + localId = 4; break; case 2: - var1 = 5; + localId = 5; break; - default: - var1 = 100; + default: // Invalid + localId = 100; break; } - gSpecialVar_0x8004 = var1; + gSpecialVar_0x8004 = localId; } void BufferContestTrainerAndMonNames(void) @@ -2296,26 +2321,26 @@ void BufferContestTrainerAndMonNames(void) } // Unused -void DoesContestCategoryHaveWinner(void) +void DoesContestCategoryHaveMuseumPainting(void) { int contestWinner; switch (gSpecialVar_ContestCategory) { case CONTEST_CATEGORY_COOL: - contestWinner = 8; + contestWinner = CONTEST_WINNER_MUSEUM_COOL - 1; break; case CONTEST_CATEGORY_BEAUTY: - contestWinner = 9; + contestWinner = CONTEST_WINNER_MUSEUM_BEAUTY - 1; break; case CONTEST_CATEGORY_CUTE: - contestWinner = 10; + contestWinner = CONTEST_WINNER_MUSEUM_CUTE - 1; break; case CONTEST_CATEGORY_SMART: - contestWinner = 11; + contestWinner = CONTEST_WINNER_MUSEUM_SMART - 1; break; case CONTEST_CATEGORY_TOUGH: default: - contestWinner = 12; + contestWinner = CONTEST_WINNER_MUSEUM_TOUGH - 1; break; } @@ -2327,7 +2352,7 @@ void DoesContestCategoryHaveWinner(void) void SaveMuseumContestPainting(void) { - sub_80DEDA8(0xFF); + SaveContestWinner(CONTEST_SAVE_FOR_MUSEUM); } void ShouldReadyContestArtist(void) @@ -2344,14 +2369,14 @@ void ShouldReadyContestArtist(void) } } -u8 CountPlayerContestPaintings(void) +u8 CountPlayerMuseumPaintings(void) { int i; u8 count = 0; - for (i = 0; i < 5; i++) + for (i = 0; i < NUM_CONTEST_WINNERS - MUSEUM_CONTEST_WINNERS_START; i++) { - if (gSaveBlock1Ptr->contestWinners[8 + i].species) + if (gSaveBlock1Ptr->contestWinners[MUSEUM_CONTEST_WINNERS_START + i].species) count++; } @@ -2359,19 +2384,21 @@ u8 CountPlayerContestPaintings(void) } // Unused -void sub_80F8970(void) +void GetContestantNamesAtRank(void) { s16 conditions[CONTESTANT_COUNT]; int i, j; s16 condition; - s8 var0; - u8 var2; - u8 r8; - u8 r7; + s8 numAtCondition; + u8 contestantOffset; + u8 tieRank; + u8 rank; + // Get round 1 points for (i = 0; i < CONTESTANT_COUNT; i++) conditions[i] = gContestMonRound1Points[i]; + // Sort round 1 points for (i = 0; i < CONTESTANT_COUNT - 1; i++) { for (j = CONTESTANT_COUNT - 1; j > i; j--) @@ -2384,58 +2411,65 @@ void sub_80F8970(void) } } + // Get round 1 points at specified rank condition = conditions[gSpecialVar_0x8006]; - var0 = 0; - r8 = 0; + + // Count number of contestants with the same number of points + numAtCondition = 0; + tieRank = 0; for (i = 0; i < CONTESTANT_COUNT; i++) { if (conditions[i] == condition) { - var0++; + numAtCondition++; if (i == gSpecialVar_0x8006) - r8 = var0; + tieRank = numAtCondition; } } + // Get rank of first contestant with the same number of points for (i = 0; i < CONTESTANT_COUNT; i++) { if (conditions[i] == condition) break; } + rank = i; - r7 = i; - var2 = r8; + // Get contestant id of player at rank (taking ties into account) + contestantOffset = tieRank; for (i = 0; i < CONTESTANT_COUNT; i++) { if (condition == gContestMonRound1Points[i]) { - if (var2 == 1) + if (contestantOffset == 1) break; - var2--; + contestantOffset--; } } + // Use contestant id to get names StringCopy(gStringVar1, gContestMons[i].nickname); StringCopy(gStringVar2, gContestMons[i].trainerName); - sub_81DB5AC(gStringVar2); + ConvertInternationalContestantName(gStringVar2); - if (var0 == 1) - gSpecialVar_0x8006 = r7; - else if (r8 == var0) - gSpecialVar_0x8006 = r7; + // Return adjusted rank + if (numAtCondition == 1) + gSpecialVar_0x8006 = rank; + else if (tieRank == numAtCondition) + gSpecialVar_0x8006 = rank; else - gSpecialVar_0x8006 = r7 + 4; + gSpecialVar_0x8006 = rank + CONTESTANT_COUNT; } -static void ExitContestWinnerPainting(void) +static void ExitContestPainting(void) { SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } -void ShowContestWinnerPainting(void) +void ShowContestPainting(void) { SetMainCallback2(CB2_ContestPainting); - gMain.savedCallback = ExitContestWinnerPainting; + gMain.savedCallback = ExitContestPainting; } void SetLinkContestPlayerGfx(void) @@ -2535,7 +2569,7 @@ void ShowContestEntryMonPic(void) u8 taskId; u8 left, top; - if (FindTaskIdByFunc(Task_ShowContestEntryMonPic) == 0xFF) + if (FindTaskIdByFunc(Task_ShowContestEntryMonPic) == TASK_NONE) { AllocateMonSpritesGfx(); left = 10; @@ -2578,7 +2612,7 @@ void ShowContestEntryMonPic(void) void HideContestEntryMonPic(void) { u8 taskId = FindTaskIdByFunc(Task_ShowContestEntryMonPic); - if (taskId != 0xFF) + if (taskId != TASK_NONE) { gTasks[taskId].data[0]++; FreeMonSpritesGfx(); diff --git a/src/credits.c b/src/credits.c index 41d1c1686..b32949754 100644 --- a/src/credits.c +++ b/src/credits.c @@ -23,111 +23,44 @@ #include "event_data.h" #include "random.h" -enum -{ - PAGE_TITLE, - PAGE_DIRECTOR, - PAGE_ART_DIRECTOR, - PAGE_WORLD_DIRECTOR, - PAGE_LEAD_PROGRAMMER, - PAGE_PROGRAMMERS_1, - PAGE_PROGRAMMERS_2, - PAGE_PROGRAMMERS_3, - PAGE_PROGRAMMERS_4, - PAGE_GRAPHIC_DESIGNERS_1, - PAGE_GRAPHIC_DESIGNERS_2, - PAGE_GRAPHIC_DESIGNERS_3, - PAGE_MUSIC_COMPOSITION, - PAGE_SOUND_EFFECTS, - PAGE_GAME_DESIGNERS_1, - PAGE_GAME_DESIGNERS_2, - PAGE_GAME_DESIGNERS_3, - PAGE_SCENARIO_PLOT, - PAGE_SCENARIO, - PAGE_SCRIPT_DESIGNERS, - PAGE_MAP_DESIGNERS, - PAGE_BATTLE_FRONTIER_DATA, - PAGE_PARAMETRIC_DESIGNERS, - PAGE_POKEDEX_TEXT, - PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_1, - PAGE_PKMN_DESIGNERS_1, - PAGE_PKMN_DESIGNERS_2, - PAGE_PKMN_DESIGNERS_3, - PAGE_PKMN_DESIGNERS_4, - PAGE_SUPPORT_PROGRAMMERS, - PAGE_NCL_PRODUCT_TESTING, - PAGE_PACKAGE_AND_MANUAL, - PAGE_SPECIAL_THANKS_1, - PAGE_SPECIAL_THANKS_2, - PAGE_SPECIAL_THANKS_3, - PAGE_SPECIAL_THANKS_4, - PAGE_INFORMATION_SUPERVISORS, - PAGE_ARTWORK_1, - PAGE_ARTWORK_2, - PAGE_ARTWORK_3, - PAGE_COORDINATORS, - PAGE_ENGLISH_VERSION, - PAGE_TRANSLATOR, - PAGE_TEXT_EDITOR, - PAGE_NCL_COORDINATOR, - PAGE_PROGRAMMERS_5, - PAGE_GRAPHIC_DESIGNER, - PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_2, - PAGE_NOA_TESTING, - PAGE_BRAILLE_CODE_CHECK_1, - PAGE_BRAILLE_CODE_CHECK_2, - PAGE_SPECIAL_THANKS_5, - PAGE_TASK_MANAGERS, - PAGE_PRODUCERS, - PAGE_EXECUTIVE_DIRECTOR, - PAGE_EXECUTIVE_PRODUCERS_1, - PAGE_EXECUTIVE_PRODUCERS_2, - PAGE_COUNT -}; - #define COLOR_DARK_GREEN RGB(7, 11, 6) #define COLOR_LIGHT_GREEN RGB(13, 20, 12) -enum -{ - TDA_0 = 0, - TDA_TASK_C_ID = 1, - TDA_TASK_E_ID = 2, - TDA_TASK_D_ID = 3, - TDA_4 = 4, - TDA_PLAYER_CYCLIST = 5, - TDA_RIVAL_CYCLIST = 6, - TDA_7 = 7, // Has something to do with the bike scene - TDA_11 = 11, // Gets set depending on whether the bike or the grass scene should be shown - TDA_12 = 12, - TDA_13 = 13, - TDA_14 = 14, - TDA_TASK_B_ID = 15, - - // Appears to be responsible for text - TDB_0 = 0, - TDB_TASK_A_ID = 1, - TDB_CURRENT_PAGE = 2, - TDB_3 = 3, - - TDC_0 = 0, - TDC_1 = 1, - TDC_2 = 2, - TDC_3 = 3, - TDC_4 = 4, - TDC_5 = 5, - - TDD_STATE = 0, - TDD_TASK_A_ID = 1, - TDD_2 = 2, - TDD_3 = 3, - - TDE_0 = 0, - TDE_1 = 1, - TDE_TASK_A_ID = 2, +#define TAG_MON_BG 1001 + +// Positions for the Pokémon images +enum { + POS_LEFT, + POS_CENTER, + POS_RIGHT, }; +enum { + MODE_NONE, + MODE_BIKE_SCENE, + MODE_SHOW_MONS, +}; + +#define tState data[0] + +// Task data for the main Credits tasks +#define tTaskId_BgScenery data[0] // ID for Task_BicycleBgAnimation (created by CreateBicycleBgAnimationTask) +#define tTaskId_BikeScene data[1] // ID for Task_BikeScene +#define tTaskId_SceneryPal data[2] // ID for Task_CycleSceneryPalette +#define tTaskId_ShowMons data[3] // ID for Task_ShowMons +#define tEndCredits data[4] +#define tPlayerSpriteId data[5] +#define tRivalSpriteId data[6] +#define tSceneNum data[7] +// data[8]-[10] are unused +#define tNextMode data[11] +#define tTheEndDelay data[12] +#define tCurrentMode data[13] +#define tPrintedPage data[14] +#define tTaskId_UpdatePage data[15] + #define NUM_MON_SLIDES 71 + struct CreditsData { u16 monToShow[NUM_MON_SLIDES]; // List of Pokemon species ids that will show during the credits @@ -137,35 +70,55 @@ struct CreditsData u16 numMonToShow; //number of pokemon to show, always NUM_MON_SLIDES after determine function u16 caughtMonIds[NATIONAL_DEX_COUNT]; //temporary location to hold a condensed array of all caught pokemon u16 numCaughtMon; //count of filled spaces in caughtMonIds - u16 unk39C[7]; // unused padding? + u16 unused[7]; }; struct CreditsEntry { - u8 var_0; + u8 unk; // Never read bool8 isTitle; const u8 *text; }; -static EWRAM_DATA s16 gUnknown_0203BCE0 = 0; -static EWRAM_DATA u16 gUnknown_0203BCE2 = 0; // TASK A +static EWRAM_DATA s16 sUnkVar = 0; // Never read, only set to 0 +static EWRAM_DATA u16 sSavedTaskId = 0; EWRAM_DATA bool8 gHasHallOfFameRecords = 0; -static EWRAM_DATA u8 gUnknown_0203BCE5 = 0; +static EWRAM_DATA bool8 sUsedSpeedUp = 0; // Never read static EWRAM_DATA struct CreditsData *sCreditsData = {0}; -static const u16 gUnknown_085E56F0[][16] = -{ - INCBIN_U16("graphics/credits/credits_1.gbapal"), - INCBIN_U16("graphics/credits/credits_2.gbapal"), - INCBIN_U16("graphics/credits/credits_3.gbapal"), - INCBIN_U16("graphics/credits/credits_4.gbapal"), -}; - -static const u32 gCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_end_copyright.4bpp.lz"); - -static void sub_81772B8(struct Sprite *sprite); +static const u16 sCredits_Pal[] = INCBIN_U16("graphics/credits/credits.gbapal"); +static const u32 sCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_end_copyright.4bpp.lz"); + +static void SpriteCB_CreditsMonBg(struct Sprite *); +static void Task_WaitPaletteFade(u8); +static void Task_CreditsMain(u8); +static void Task_ReadyBikeScene(u8); +static void Task_SetBikeScene(u8); +static void Task_LoadShowMons(u8); +static void Task_ReadyShowMons(u8); +static void Task_CreditsTheEnd1(u8); +static void Task_CreditsTheEnd2(u8); +static void Task_CreditsTheEnd3(u8); +static void Task_CreditsTheEnd4(u8); +static void Task_CreditsTheEnd5(u8); +static void Task_CreditsTheEnd6(u8); +static void Task_CreditsSoftReset(u8); +static void ResetGpuAndVram(void); +static void Task_UpdatePage(u8); +static u8 CheckChangeScene(u8, u8); +static void Task_ShowMons(u8); +static void Task_CycleSceneryPalette(u8); +static void Task_BikeScene(u8); +static bool8 LoadBikeScene(u8 data, u8); +static void ResetCreditsTasks(u8); +static void LoadTheEndScreen(u16, u16, u16); +static void DrawTheEnd(u16, u16); +static void SpriteCB_Player(struct Sprite *); +static void SpriteCB_Rival(struct Sprite *); +static u8 CreateCreditsMonSprite(u16, s16, s16, u16); +static void DeterminePokemonToShow(void); -static const u8 sTheEnd_LetterTMap[] = +static const u8 sTheEnd_LetterMap_T[] = { 0, 1, 0, 0xFF, 1, 0xFF, @@ -174,7 +127,7 @@ static const u8 sTheEnd_LetterTMap[] = 0xFF, 1, 0xFF, }; -static const u8 sTheEnd_LetterHMap[] = +static const u8 sTheEnd_LetterMap_H[] = { 1, 0xFF, 1, 1, 0xFF, 1, @@ -183,7 +136,7 @@ static const u8 sTheEnd_LetterHMap[] = 1, 0xFF, 1, }; -static const u8 sTheEnd_LetterEMap[] = +static const u8 sTheEnd_LetterMap_E[] = { 1, 0, 0, 1, 0xFF, 0xFF, @@ -192,7 +145,7 @@ static const u8 sTheEnd_LetterEMap[] = 1, 0x80, 0x80, }; -static const u8 sTheEnd_LetterNMap[] = +static const u8 sTheEnd_LetterMap_N[] = { 1, 3, 1, 1, 4, 1, @@ -201,7 +154,7 @@ static const u8 sTheEnd_LetterNMap[] = 1, 0xC3, 1, }; -static const u8 sTheEnd_LetterDMap[] = +static const u8 sTheEnd_LetterMap_D[] = { 1, 6, 7, 1, 8, 9, @@ -210,729 +163,7 @@ static const u8 sTheEnd_LetterDMap[] = 1, 0x86, 0x87, }; -static const u8 gCreditsText_EmptyString[] = _(""); -static const u8 gCreditsText_PkmnEmeraldVersion[] = _("POKéMON EMERALD VERSION"); -static const u8 gCreditsText_Credits[] = _("Credits"); -static const u8 gCreditsText_ExecutiveDirector[] = _("Executive Director"); -static const u8 gCreditsText_Director[] = _("Director"); -static const u8 gCreditsText_ArtDirector[] = _("Art Director"); -static const u8 gCreditsText_BattleDirector[] = _("Battle Director"); -static const u8 gCreditsText_MainProgrammer[] = _("Main Programmer"); -static const u8 gCreditsText_BattleSystemPgrms[] = _("Battle System Programmers"); -static const u8 gCreditsText_FieldSystemPgrms[] = _("Field System Programmer"); -static const u8 gCreditsText_Programmers[] = _("Programmers"); -static const u8 gCreditsText_MainGraphicDesigner[] = _("Main Graphic Designer"); -static const u8 gCreditsText_GraphicDesigners[] = _("Graphic Designers"); -static const u8 gCreditsText_PkmnDesigners[] = _("POKéMON Designers"); -static const u8 gCreditsText_MusicComposition[] = _("Music Composition"); -static const u8 gCreditsText_SoundEffectsAndPkmnVoices[] = _("Sound Effects & POKéMON Voices"); -static const u8 gCreditsText_GameDesigners[] = _("Game Designers"); -static const u8 gCreditsText_ScenarioPlot[] = _("Scenario Plot"); -static const u8 gCreditsText_Scenario[] = _("Scenario"); -static const u8 gCreditsText_ScriptDesigners[] = _("Script Designers"); -static const u8 gCreditsText_MapDesigners[] = _("Map Designers"); -static const u8 gCreditsText_MapDataDesigners[] = _("Map Data Designers"); -static const u8 gCreditsText_ParametricDesigners[] = _("Parametric Designers"); -static const u8 gCreditsText_PokedexText[] = _("POKéDEX Text"); -static const u8 gCreditsText_EnvAndToolPgrms[] = _("Environment & Tool Programmers"); -static const u8 gCreditsText_NCLProductTesting[] = _("NCL Product Testing"); -static const u8 gCreditsText_SpecialThanks[] = _("Special Thanks"); -static const u8 gCreditsText_Coordinators[] = _("Coordinators"); -static const u8 gCreditsText_Producers[] = _("Producers"); -static const u8 gCreditsText_ExecProducers[] = _("Executive Producers"); -static const u8 gCreditsText_InfoSupervisors[] = _("Information Supervisors"); -static const u8 gCreditsText_TaskManagers[] = _("Task Managers"); -static const u8 gCreditsText_BrailleCodeCheck[] = _("Braille Code Check"); -static const u8 gCreditsText_WorldDirector[] = _("World Director"); -static const u8 gCreditsText_BattleFrontierData[] = _("Battle Frontier Data"); -static const u8 gCreditsText_SupportProgrammers[] = _("Support Programmers"); -static const u8 gCreditsText_Artwork[] = _("Artwork"); -static const u8 gCreditsText_LeadProgrammer[] = _("Lead Programmer"); -static const u8 gCreditsText_LeadGraphicArtist[] = _("Lead Graphic Artist"); -static const u8 gCreditsText_SatoshiTajiri[] = _("Satoshi Tajiri"); -static const u8 gCreditsText_JunichiMasuda[] = _("Junichi Masuda"); -static const u8 gCreditsText_KenSugimori[] = _("Ken Sugimori"); -static const u8 gCreditsText_ShigekiMorimoto[] = _("Shigeki Morimoto"); -static const u8 gCreditsText_TetsuyaWatanabe[] = _("Tetsuya Watanabe"); -static const u8 gCreditsText_HisashiSogabe[] = _("Hisashi Sogabe"); -static const u8 gCreditsText_SosukeTamada[] = _("Sosuke Tamada"); -static const u8 gCreditsText_AkitoMori[] = _("Akito Mori"); -static const u8 gCreditsText_KeitaKagaya[] = _("Keita Kagaya"); -static const u8 gCreditsText_YoshinoriMatsuda[] = _("Yoshinori Matsuda"); -static const u8 gCreditsText_HiroyukiNakamura[] = _("Hiroyuki Nakamura"); -static const u8 gCreditsText_MasaoTaya[] = _("Masao Taya"); -static const u8 gCreditsText_SatoshiNohara[] = _("Satoshi Nohara"); -static const u8 gCreditsText_TomomichiOhta[] = _("Tomomichi Ohta"); -static const u8 gCreditsText_MiyukiIwasawa[] = _("Miyuki Iwasawa"); -static const u8 gCreditsText_TakenoriOhta[] = _("Takenori Ohta"); -static const u8 gCreditsText_HironobuYoshida[] = _("Hironobu Yoshida"); -static const u8 gCreditsText_MotofumiFujiwara[] = _("Motofumi Fujiwara"); -static const u8 gCreditsText_SatoshiOhta[] = _("Satoshi Ohta"); -static const u8 gCreditsText_AsukaIwashita[] = _("Asuka Iwashita"); -static const u8 gCreditsText_AimiTomita[] = _("Aimi Tomita"); -static const u8 gCreditsText_TakaoUnno[] = _("Takao Unno"); -static const u8 gCreditsText_KanakoEo[] = _("Kanako Eo"); -static const u8 gCreditsText_JunOkutani[] = _("Jun Okutani"); -static const u8 gCreditsText_AtsukoNishida[] = _("Atsuko Nishida"); -static const u8 gCreditsText_MuneoSaito[] = _("Muneo Saito"); -static const u8 gCreditsText_RenaYoshikawa[] = _("Rena Yoshikawa"); -static const u8 gCreditsText_GoIchinose[] = _("Go Ichinose"); -static const u8 gCreditsText_MorikazuAoki[] = _("Morikazu Aoki"); -static const u8 gCreditsText_KojiNishino[] = _("Koji Nishino"); -static const u8 gCreditsText_KenjiMatsushima[] = _("Kenji Matsushima"); -static const u8 gCreditsText_TetsujiOhta[] = _("Tetsuji Ohta"); -static const u8 gCreditsText_HitomiSato[] = _("Hitomi Sato"); -static const u8 gCreditsText_TakeshiKawachimaru[] = _("Takeshi Kawachimaru"); -static const u8 gCreditsText_TeruyukiShimoyamada[] = _("Teruyuki Shimoyamada"); -static const u8 gCreditsText_ShigeruOhmori[] = _("Shigeru Ohmori"); -static const u8 gCreditsText_TadashiTakahashi[] = _("Tadashi Takahashi"); -static const u8 gCreditsText_ToshinobuMatsumiya[] = _("Toshinobu Matsumiya"); -static const u8 gCreditsText_AkihitoTomisawa[] = _("Akihito Tomisawa"); -static const u8 gCreditsText_HirokiEnomoto[] = _("Hiroki Enomoto"); -static const u8 gCreditsText_KazuyukiTerada[] = _("Kazuyuki Terada"); -static const u8 gCreditsText_YuriSakurai[] = _("Yuri Sakurai"); -static const u8 gCreditsText_HiromiSagawa[] = _("Hiromi Sagawa"); -static const u8 gCreditsText_KenjiTominaga[] = _("Kenji Tominaga"); -static const u8 gCreditsText_YoshioTajiri[] = _("Yoshio Tajiri"); -static const u8 gCreditsText_TeikoSasaki[] = _("Teiko Sasaki"); -static const u8 gCreditsText_SachikoHamano[] = _("Sachiko Hamano"); -static const u8 gCreditsText_ChieMatsumiya[] = _("Chie Matsumiya"); -static const u8 gCreditsText_AkikoShinozaki[] = _("Akiko Shinozaki"); -static const u8 gCreditsText_AstukoFujii[] = _("Astuko Fujii"); -static const u8 gCreditsText_NozomuSaito[] = _("Nozomu Saito"); -static const u8 gCreditsText_KenkichiToyama[] = _("Kenkichi Toyama"); -static const u8 gCreditsText_SuguruNakatsui[] = _("Suguru Nakatsui"); -static const u8 gCreditsText_YumiFunasaka[] = _("Yumi Funasaka"); -static const u8 gCreditsText_NaokoYanase[] = _("Naoko Yanase"); -static const u8 gCreditsText_NCLSuperMarioClub[] = _("NCL Super Mario Club"); -static const u8 gCreditsText_AtsushiTada[] = _("Atsushi Tada"); -static const u8 gCreditsText_TakahiroOhnishi[] = _("Takahiro Ohnishi"); -static const u8 gCreditsText_NorihideOkamura[] = _("Norihide Okamura"); -static const u8 gCreditsText_HiroNakamura[] = _("Hiro Nakamura"); -static const u8 gCreditsText_HiroyukiUesugi[] = _("Hiroyuki Uesugi"); -static const u8 gCreditsText_TerukiMurakawa[] = _("Teruki Murakawa"); -static const u8 gCreditsText_AkiraKinashi[] = _("Akira Kinashi"); -static const u8 gCreditsText_MichikoTakizawa[] = _("Michiko Takizawa"); -static const u8 gCreditsText_MakikoTakada[] = _("Makiko Takada"); -static const u8 gCreditsText_TakanaoKondo[] = _("Takanao Kondo"); -static const u8 gCreditsText_AiMashima[] = _("Ai Mashima"); -static const u8 gCreditsText_GakujiNomoto[] = _("Gakuji Nomoto"); -static const u8 gCreditsText_TakehiroIzushi[] = _("Takehiro Izushi"); -static const u8 gCreditsText_HitoshiYamagami[] = _("Hitoshi Yamagami"); -static const u8 gCreditsText_KyokoWatanabe[] = _("Kyoko Watanabe"); -static const u8 gCreditsText_TakaoNakano[] = _("Takao Nakano"); -static const u8 gCreditsText_HiroyukiJinnai[] = _("Hiroyuki Jinnai"); -static const u8 gCreditsText_HiroakiTsuru[] = _("Hiroaki Tsuru"); -static const u8 gCreditsText_TsunekazIshihara[] = _("Tsunekaz Ishihara"); -static const u8 gCreditsText_SatoruIwata[] = _("Satoru Iwata"); -static const u8 gCreditsText_KazuyaSuyama[] = _("Kazuya Suyama"); -static const u8 gCreditsText_SatoshiMitsuhara[] = _("Satoshi Mitsuhara"); -static const u8 gCreditsText_JapanBrailleLibrary[] = _("Japan Braille Library"); -static const u8 gCreditsText_TomotakaKomura[] = _("Tomotaka Komura"); -static const u8 gCreditsText_MikikoOhhashi[] = _("Mikiko Ohhashi"); -static const u8 gCreditsText_DaisukeHoshino[] = _("Daisuke Hoshino"); -static const u8 gCreditsText_KenjiroIto[] = _("Kenjiro Ito"); -static const u8 gCreditsText_RuiKawaguchi[] = _("Rui Kawaguchi"); -static const u8 gCreditsText_ShunsukeKohori[] = _("Shunsuke Kohori"); -static const u8 gCreditsText_SachikoNakamichi[] = _("Sachiko Nakamichi"); -static const u8 gCreditsText_FujikoNomura[] = _("Fujiko Nomura"); -static const u8 gCreditsText_KazukiYoshihara[] = _("Kazuki Yoshihara"); -static const u8 gCreditsText_RetsujiNomoto[] = _("Retsuji Nomoto"); -static const u8 gCreditsText_AzusaTajima[] = _("Azusa Tajima"); -static const u8 gCreditsText_ShusakuEgami[] = _("Shusaku Egami"); -static const u8 gCreditsText_PackageAndManual[] = _("Package & Manual Illustration"); -static const u8 gCreditsText_EnglishVersion[] = _("English Version Coordinators"); -static const u8 gCreditsText_Translator[] = _("Translator"); -static const u8 gCreditsText_TextEditor[] = _("Text Editor"); -static const u8 gCreditsText_NCLCoordinator[] = _("NCL Coordinator"); -static const u8 gCreditsText_GraphicDesigner[] = _("Graphic Designer"); -static const u8 gCreditsText_NOAProductTesting[] = _("NOA Product Testing"); -static const u8 gCreditsText_HideyukiNakajima[] = _("Hideyuki Nakajima"); -static const u8 gCreditsText_HidenoriSaeki[] = _("Hidenori Saeki"); -static const u8 gCreditsText_YokoWatanabe[] = _("Yoko Watanabe"); -static const u8 gCreditsText_SakaeKimura[] = _("Sakae Kimura"); -static const u8 gCreditsText_ChiakiShinkai[] = _("Chiaki Shinkai"); -static const u8 gCreditsText_SethMcMahill[] = _("Seth McMahill"); -static const u8 gCreditsText_NobOgasawara[] = _("Nob Ogasawara"); -static const u8 gCreditsText_TeresaLillygren[] = _("Teresa Lillygren"); -static const u8 gCreditsText_KimikoNakamichi[] = _("Kimiko Nakamichi"); -static const u8 gCreditsText_SouichiYamamoto[] = _("Souichi Yamamoto"); -static const u8 gCreditsText_YuichiroIto[] = _("Yuichiro Ito"); -static const u8 gCreditsText_ThomasHertzog[] = _("Thomas Hertzog"); -static const u8 gCreditsText_MikaKurosawa[] = _("Mika Kurosawa"); -static const u8 gCreditsText_NationalFederationBlind[] = _("National Federation of the Blind"); -static const u8 gCreditsText_PatriciaAMaurer[] = _("Patricia A. Maurer"); -static const u8 gCreditsText_EuropeanBlindUnion[] = _("European Blind Union"); -static const u8 gCreditsText_AustralianBrailleAuthority[] = _("Australian Braille Authority"); -static const u8 gCreditsText_RoyalNewZealandFederationBlind[] = _("Royal New Zealand Federation for the Blind"); -static const u8 gCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima"); -static const u8 gCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow"); -static const u8 gCreditsText_ShellieDow[] = _("Shellie Dow"); -static const u8 gCreditsText_ErikJohnson[] = _("Erik Johnson"); -static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, FALSE, gCreditsText_EmptyString}; -static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, TRUE, gCreditsText_PkmnEmeraldVersion}; -static const struct CreditsEntry gCreditsEntry_Credits[] = {11, TRUE, gCreditsText_Credits}; -static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, TRUE, gCreditsText_ExecutiveDirector}; -static const struct CreditsEntry gCreditsEntry_Director[] = {12, TRUE, gCreditsText_Director}; -static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, TRUE, gCreditsText_ArtDirector}; -static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, TRUE, gCreditsText_BattleDirector}; -static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, TRUE, gCreditsText_MainProgrammer}; -static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, TRUE, gCreditsText_BattleSystemPgrms}; -static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, TRUE, gCreditsText_FieldSystemPgrms}; -static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, TRUE, gCreditsText_Programmers}; -static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, TRUE, gCreditsText_MainGraphicDesigner}; -static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, TRUE, gCreditsText_GraphicDesigners}; -static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, TRUE, gCreditsText_PkmnDesigners}; -static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, TRUE, gCreditsText_MusicComposition}; -static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, TRUE, gCreditsText_SoundEffectsAndPkmnVoices}; -static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, TRUE, gCreditsText_GameDesigners}; -static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, TRUE, gCreditsText_ScenarioPlot}; -static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, TRUE, gCreditsText_Scenario}; -static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, TRUE, gCreditsText_ScriptDesigners}; -static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, TRUE, gCreditsText_MapDesigners}; -static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, TRUE, gCreditsText_MapDataDesigners}; -static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, TRUE, gCreditsText_ParametricDesigners}; -static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, TRUE, gCreditsText_PokedexText}; -static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, TRUE, gCreditsText_EnvAndToolPgrms}; -static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, TRUE, gCreditsText_NCLProductTesting}; -static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, TRUE, gCreditsText_SpecialThanks}; -static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, TRUE, gCreditsText_Coordinators}; -static const struct CreditsEntry gCreditsEntry_Producers[] = {11, TRUE, gCreditsText_Producers}; -static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, TRUE, gCreditsText_ExecProducers}; -static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, TRUE, gCreditsText_InfoSupervisors}; -static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, TRUE, gCreditsText_TaskManagers}; -static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, TRUE, gCreditsText_BrailleCodeCheck}; -static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, TRUE, gCreditsText_WorldDirector}; -static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, TRUE, gCreditsText_BattleFrontierData}; -static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, TRUE, gCreditsText_SupportProgrammers}; -static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, TRUE, gCreditsText_Artwork}; -static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, TRUE, gCreditsText_LeadProgrammer}; -static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, TRUE, gCreditsText_LeadGraphicArtist}; -static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, FALSE, gCreditsText_SatoshiTajiri}; -static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, FALSE, gCreditsText_JunichiMasuda}; -static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, FALSE, gCreditsText_KenSugimori}; -static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, FALSE, gCreditsText_ShigekiMorimoto}; -static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, FALSE, gCreditsText_TetsuyaWatanabe}; -static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, FALSE, gCreditsText_HisashiSogabe}; -static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, FALSE, gCreditsText_SosukeTamada}; -static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, FALSE, gCreditsText_AkitoMori}; -static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, FALSE, gCreditsText_KeitaKagaya}; -static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, FALSE, gCreditsText_YoshinoriMatsuda}; -static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, FALSE, gCreditsText_HiroyukiNakamura}; -static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, FALSE, gCreditsText_MasaoTaya}; -static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, FALSE, gCreditsText_SatoshiNohara}; -static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, FALSE, gCreditsText_TomomichiOhta}; -static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, FALSE, gCreditsText_MiyukiIwasawa}; -static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, FALSE, gCreditsText_TakenoriOhta}; -static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, FALSE, gCreditsText_HironobuYoshida}; -static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, FALSE, gCreditsText_MotofumiFujiwara}; -static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, FALSE, gCreditsText_SatoshiOhta}; -static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, FALSE, gCreditsText_AsukaIwashita}; -static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, FALSE, gCreditsText_AimiTomita}; -static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, FALSE, gCreditsText_TakaoUnno}; -static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, FALSE, gCreditsText_KanakoEo}; -static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, FALSE, gCreditsText_JunOkutani}; -static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, FALSE, gCreditsText_AtsukoNishida}; -static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, FALSE, gCreditsText_MuneoSaito}; -static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, FALSE, gCreditsText_RenaYoshikawa}; -static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, FALSE, gCreditsText_GoIchinose}; -static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, FALSE, gCreditsText_MorikazuAoki}; -static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, FALSE, gCreditsText_KojiNishino}; -static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, FALSE, gCreditsText_KenjiMatsushima}; -static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, FALSE, gCreditsText_TetsujiOhta}; -static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, FALSE, gCreditsText_HitomiSato}; -static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, FALSE, gCreditsText_TakeshiKawachimaru}; -static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, FALSE, gCreditsText_TeruyukiShimoyamada}; -static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, FALSE, gCreditsText_ShigeruOhmori}; -static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, FALSE, gCreditsText_TadashiTakahashi}; -static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, FALSE, gCreditsText_ToshinobuMatsumiya}; -static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, FALSE, gCreditsText_AkihitoTomisawa}; -static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, FALSE, gCreditsText_HirokiEnomoto}; -static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, FALSE, gCreditsText_KazuyukiTerada}; -static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, FALSE, gCreditsText_YuriSakurai}; -static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, FALSE, gCreditsText_HiromiSagawa}; -static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, FALSE, gCreditsText_KenjiTominaga}; -static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, FALSE, gCreditsText_YoshioTajiri}; -static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, FALSE, gCreditsText_TeikoSasaki}; -static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, FALSE, gCreditsText_SachikoHamano}; -static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, FALSE, gCreditsText_ChieMatsumiya}; -static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, FALSE, gCreditsText_AkikoShinozaki}; -static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, FALSE, gCreditsText_AstukoFujii}; -static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, FALSE, gCreditsText_NozomuSaito}; -static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, FALSE, gCreditsText_KenkichiToyama}; -static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, FALSE, gCreditsText_SuguruNakatsui}; -static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, FALSE, gCreditsText_YumiFunasaka}; -static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, FALSE, gCreditsText_NaokoYanase}; -static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, FALSE, gCreditsText_NCLSuperMarioClub}; -static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, FALSE, gCreditsText_AtsushiTada}; -static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, FALSE, gCreditsText_TakahiroOhnishi}; -static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, FALSE, gCreditsText_NorihideOkamura}; -static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, FALSE, gCreditsText_HiroNakamura}; -static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, FALSE, gCreditsText_HiroyukiUesugi}; -static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, FALSE, gCreditsText_TerukiMurakawa}; -static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, FALSE, gCreditsText_AkiraKinashi}; -static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, FALSE, gCreditsText_MichikoTakizawa}; -static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, FALSE, gCreditsText_MakikoTakada}; -static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, FALSE, gCreditsText_TakanaoKondo}; -static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, FALSE, gCreditsText_AiMashima}; -static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, FALSE, gCreditsText_GakujiNomoto}; -static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, FALSE, gCreditsText_TakehiroIzushi}; -static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, FALSE, gCreditsText_HitoshiYamagami}; -static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, FALSE, gCreditsText_KyokoWatanabe}; -static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, FALSE, gCreditsText_TakaoNakano}; -static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, FALSE, gCreditsText_HiroyukiJinnai}; -static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, FALSE, gCreditsText_HiroakiTsuru}; -static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, FALSE, gCreditsText_TsunekazIshihara}; -static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, FALSE, gCreditsText_SatoruIwata}; -static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, FALSE, gCreditsText_KazuyaSuyama}; -static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, FALSE, gCreditsText_SatoshiMitsuhara}; -static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, FALSE, gCreditsText_JapanBrailleLibrary}; -static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, FALSE, gCreditsText_TomotakaKomura}; -static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, FALSE, gCreditsText_MikikoOhhashi}; -static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, FALSE, gCreditsText_DaisukeHoshino}; -static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, FALSE, gCreditsText_KenjiroIto}; -static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, FALSE, gCreditsText_RuiKawaguchi}; -static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, FALSE, gCreditsText_ShunsukeKohori}; -static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, FALSE, gCreditsText_SachikoNakamichi}; -static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, FALSE, gCreditsText_FujikoNomura}; -static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, FALSE, gCreditsText_KazukiYoshihara}; -static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, FALSE, gCreditsText_RetsujiNomoto}; -static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, FALSE, gCreditsText_AzusaTajima}; -static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, FALSE, gCreditsText_ShusakuEgami}; -static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, TRUE, gCreditsText_PackageAndManual}; -static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, TRUE, gCreditsText_EnglishVersion}; -static const struct CreditsEntry gCreditsEntry_Translator[] = {0, TRUE, gCreditsText_Translator}; -static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, TRUE, gCreditsText_TextEditor}; -static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, TRUE, gCreditsText_NCLCoordinator}; -static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, TRUE, gCreditsText_GraphicDesigner}; -static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, TRUE, gCreditsText_NOAProductTesting}; -static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, FALSE, gCreditsText_HideyukiNakajima}; -static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, FALSE, gCreditsText_HidenoriSaeki}; -static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, FALSE, gCreditsText_YokoWatanabe}; -static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, FALSE, gCreditsText_SakaeKimura}; -static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, FALSE, gCreditsText_ChiakiShinkai}; -static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, FALSE, gCreditsText_SethMcMahill}; -static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, FALSE, gCreditsText_NobOgasawara}; -static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, FALSE, gCreditsText_TeresaLillygren}; -static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, FALSE, gCreditsText_KimikoNakamichi}; -static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, FALSE, gCreditsText_SouichiYamamoto}; -static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, FALSE, gCreditsText_YuichiroIto}; -static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, FALSE, gCreditsText_ThomasHertzog}; -static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, FALSE, gCreditsText_MikaKurosawa}; -static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, FALSE, gCreditsText_NationalFederationBlind}; -static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, FALSE, gCreditsText_PatriciaAMaurer}; -static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, FALSE, gCreditsText_EuropeanBlindUnion}; -static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, FALSE, gCreditsText_AustralianBrailleAuthority}; -static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, FALSE, gCreditsText_RoyalNewZealandFederationBlind}; -static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, FALSE, gCreditsText_MotoyasuTojima}; -static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, FALSE, gCreditsText_NicolaPrattBarlow}; -static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, FALSE, gCreditsText_ShellieDow}; -static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, FALSE, gCreditsText_ErikJohnson}; - -#define _ gCreditsEntry_EmptyString -static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] = -{ - { - _, - gCreditsEntry_PkmnEmeraldVersion, - gCreditsEntry_Credits, - _, - _ - }, - { - _, - gCreditsEntry_Director, - gCreditsEntry_ShigekiMorimoto, - _, - _, - }, - { - _, - gCreditsEntry_ArtDirector, - gCreditsEntry_KenSugimori, - _, - _, - }, - { - _, - gCreditsEntry_WorldDirector, - gCreditsEntry_JunichiMasuda, - _, - _, - }, - { - gCreditsEntry_LeadProgrammer, - gCreditsEntry_HisashiSogabe, - gCreditsEntry_LeadGraphicArtist, - gCreditsEntry_MotofumiFujiwara, - _, - }, - { - gCreditsEntry_Programmers, - gCreditsEntry_HisashiSogabe, - gCreditsEntry_TomomichiOhta, - gCreditsEntry_NozomuSaito, - gCreditsEntry_EmptyString, - }, - { - gCreditsEntry_Programmers, - gCreditsEntry_AkitoMori, - gCreditsEntry_HiroyukiNakamura, - gCreditsEntry_MasaoTaya, - _, - }, - { - gCreditsEntry_Programmers, - gCreditsEntry_SatoshiNohara, - gCreditsEntry_MiyukiIwasawa, - gCreditsEntry_YoshinoriMatsuda, - gCreditsEntry_KeitaKagaya, - }, - { - gCreditsEntry_Programmers, - gCreditsEntry_TetsuyaWatanabe, - gCreditsEntry_SosukeTamada, - gCreditsEntry_TakenoriOhta, - _, - }, - { - _, - gCreditsEntry_GraphicDesigners, - gCreditsEntry_MotofumiFujiwara, - gCreditsEntry_SatoshiOhta, - _, - }, - { - gCreditsEntry_GraphicDesigners, - gCreditsEntry_KenkichiToyama, - gCreditsEntry_AsukaIwashita, - gCreditsEntry_TakaoUnno, - _, - }, - { - gCreditsEntry_GraphicDesigners, - gCreditsEntry_KenSugimori, - gCreditsEntry_HironobuYoshida, - gCreditsEntry_AimiTomita, - gCreditsEntry_KanakoEo, - }, - { - gCreditsEntry_MusicComposition, - gCreditsEntry_GoIchinose, - gCreditsEntry_JunichiMasuda, - gCreditsEntry_MorikazuAoki, - gCreditsEntry_HitomiSato, - }, - { - _, - gCreditsEntry_SoundEffectsAndPkmnVoices, - gCreditsEntry_GoIchinose, - gCreditsEntry_MorikazuAoki, - _, - }, - { - gCreditsEntry_GameDesigners, - gCreditsEntry_ShigekiMorimoto, - gCreditsEntry_TeruyukiShimoyamada, - gCreditsEntry_TakeshiKawachimaru, - gCreditsEntry_AkihitoTomisawa, - }, - { - gCreditsEntry_GameDesigners, - gCreditsEntry_SuguruNakatsui, - gCreditsEntry_TetsujiOhta, - gCreditsEntry_HitomiSato, - gCreditsEntry_KenjiMatsushima, - }, - { - gCreditsEntry_GameDesigners, - gCreditsEntry_JunichiMasuda, - gCreditsEntry_KojiNishino, - gCreditsEntry_ShigeruOhmori, - gCreditsEntry_TadashiTakahashi, - }, - { - gCreditsEntry_ScenarioPlot, - gCreditsEntry_AkihitoTomisawa, - gCreditsEntry_JunichiMasuda, - gCreditsEntry_KojiNishino, - _, - }, - { - gCreditsEntry_Scenario, - gCreditsEntry_AkihitoTomisawa, - gCreditsEntry_HitomiSato, - gCreditsEntry_ToshinobuMatsumiya, - _, - }, - { - gCreditsEntry_ScriptDesigners, - gCreditsEntry_TomomichiOhta, - gCreditsEntry_SatoshiNohara, - _, - _, - }, - { - gCreditsEntry_MapDesigners, - gCreditsEntry_SuguruNakatsui, - gCreditsEntry_TeruyukiShimoyamada, - gCreditsEntry_ShigeruOhmori, - gCreditsEntry_TetsujiOhta, - }, - { - _, - gCreditsEntry_BattleFrontierData, - gCreditsEntry_TetsujiOhta, - _, - _, - }, - { - gCreditsEntry_ParametricDesigners, - gCreditsEntry_TeruyukiShimoyamada, - gCreditsEntry_ShigekiMorimoto, - gCreditsEntry_TetsujiOhta, - gCreditsEntry_KojiNishino, - }, - { - _, - gCreditsEntry_PokedexText, - gCreditsEntry_KenjiMatsushima, - _, - _, - }, - { - gCreditsEntry_EnvAndToolPgrms, - gCreditsEntry_HisashiSogabe, - gCreditsEntry_SosukeTamada, - gCreditsEntry_HiroyukiNakamura, - gCreditsEntry_AkitoMori, - }, - { - gCreditsEntry_PkmnDesigners, - gCreditsEntry_KenSugimori, - gCreditsEntry_MotofumiFujiwara, - gCreditsEntry_ShigekiMorimoto, - _, - }, - { - gCreditsEntry_PkmnDesigners, - gCreditsEntry_HironobuYoshida, - gCreditsEntry_SatoshiOhta, - gCreditsEntry_AsukaIwashita, - _, - }, - { - gCreditsEntry_PkmnDesigners, - gCreditsEntry_TakaoUnno, - gCreditsEntry_KanakoEo, - gCreditsEntry_AimiTomita, - _, - }, - { - gCreditsEntry_PkmnDesigners, - gCreditsEntry_AtsukoNishida, - gCreditsEntry_MuneoSaito, - gCreditsEntry_RenaYoshikawa, - gCreditsEntry_JunOkutani, - }, - { - _, - gCreditsEntry_SupportProgrammers, - gCreditsEntry_SatoshiMitsuhara, - gCreditsEntry_DaisukeHoshino, - _, - }, - { - _, - gCreditsEntry_NCLProductTesting, - gCreditsEntry_NCLSuperMarioClub, - _, - _, - }, - { - _, - gCreditsEntry_PackageAndManual, - gCreditsEntry_KenSugimori, - _, - _, - }, - { - _, - gCreditsEntry_SpecialThanks, - gCreditsEntry_KenjiTominaga, - gCreditsEntry_HirokiEnomoto, - _, - }, - { - gCreditsEntry_SpecialThanks, - gCreditsEntry_KazuyaSuyama, - gCreditsEntry_KenjiroIto, - gCreditsEntry_MichikoTakizawa, - gCreditsEntry_MakikoTakada, - }, - { - gCreditsEntry_SpecialThanks, - gCreditsEntry_MikikoOhhashi, - gCreditsEntry_TakanaoKondo, - gCreditsEntry_RuiKawaguchi, - _, - }, - { - gCreditsEntry_SpecialThanks, - gCreditsEntry_TakahiroOhnishi, - gCreditsEntry_NorihideOkamura, - gCreditsEntry_ShunsukeKohori, - _, - }, - { - gCreditsEntry_InfoSupervisors, - gCreditsEntry_KazuyukiTerada, - gCreditsEntry_YuriSakurai, - gCreditsEntry_YumiFunasaka, - gCreditsEntry_NaokoYanase, - }, - { - _, - gCreditsEntry_Artwork, - gCreditsEntry_SachikoNakamichi, - gCreditsEntry_FujikoNomura, - _, - }, - { - _, - gCreditsEntry_Artwork, - gCreditsEntry_HideyukiNakajima, - gCreditsEntry_HidenoriSaeki, - _, - }, - { - gCreditsEntry_Artwork, - gCreditsEntry_YokoWatanabe, - gCreditsEntry_SakaeKimura, - gCreditsEntry_ChiakiShinkai, - _, - }, - { - gCreditsEntry_Coordinators, - gCreditsEntry_KazukiYoshihara, - gCreditsEntry_AkiraKinashi, - gCreditsEntry_RetsujiNomoto, - _, - }, - { - _, - gCreditsEntry_EnglishVersion, - gCreditsEntry_HiroNakamura, - gCreditsEntry_SethMcMahill, - _, - }, - { - _, - gCreditsEntry_Translator, - gCreditsEntry_NobOgasawara, - _, - _, - }, - { - _, - gCreditsEntry_TextEditor, - gCreditsEntry_TeresaLillygren, - _, - _, - }, - { - _, - gCreditsEntry_NCLCoordinator, - gCreditsEntry_KimikoNakamichi, - _, - _, - }, - { - gCreditsEntry_Programmers, - gCreditsEntry_TerukiMurakawa, - gCreditsEntry_SouichiYamamoto, - gCreditsEntry_YuichiroIto, - gCreditsEntry_AkiraKinashi, - }, - { - _, - gCreditsEntry_GraphicDesigner, - gCreditsEntry_AkiraKinashi, - _, - _, - }, - { - gCreditsEntry_EnvAndToolPgrms, - gCreditsEntry_TerukiMurakawa, - gCreditsEntry_SouichiYamamoto, - gCreditsEntry_KimikoNakamichi, - _, - }, - { - gCreditsEntry_NOAProductTesting, - gCreditsEntry_ThomasHertzog, - gCreditsEntry_ErikJohnson, - gCreditsEntry_MikaKurosawa, - _, - }, - { - gCreditsEntry_BrailleCodeCheck, - gCreditsEntry_NationalFederationBlind, - gCreditsEntry_PatriciaAMaurer, - gCreditsEntry_JapanBrailleLibrary, - gCreditsEntry_EuropeanBlindUnion, - }, - { - _, - gCreditsEntry_BrailleCodeCheck, - gCreditsEntry_AustralianBrailleAuthority, - gCreditsEntry_RoyalNewZealandFederationBlind, - _, - }, - { - gCreditsEntry_SpecialThanks, - gCreditsEntry_HiroyukiUesugi, - gCreditsEntry_MotoyasuTojima, - gCreditsEntry_NicolaPrattBarlow, - gCreditsEntry_ShellieDow, - }, - { - _, - gCreditsEntry_TaskManagers, - gCreditsEntry_AzusaTajima, - gCreditsEntry_ShusakuEgami, - _, - }, - { - gCreditsEntry_Producers, - gCreditsEntry_HiroyukiJinnai, - gCreditsEntry_HitoshiYamagami, - gCreditsEntry_GakujiNomoto, - gCreditsEntry_HiroakiTsuru, - }, - { - _, - gCreditsEntry_ExecutiveDirector, - gCreditsEntry_SatoshiTajiri, - _, - _, - }, - { - _, - gCreditsEntry_ExecProducers, - gCreditsEntry_SatoruIwata, - _, - _, - }, - { - _, - gCreditsEntry_ExecProducers, - gCreditsEntry_TsunekazIshihara, - _, - _, - }, -}; -#undef _ +#include "data/credits.h" static const struct BgTemplate sBackgroundTemplates[] = { @@ -966,7 +197,7 @@ static const u8 sMonSpritePos[][2] = {136, 36}, }; -static const union AnimCmd gUnknown_085E6F84[] = +static const union AnimCmd sAnim_Player_Slow[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(64, 8), @@ -975,7 +206,7 @@ static const union AnimCmd gUnknown_085E6F84[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E6F98[] = +static const union AnimCmd sAnim_Player_Fast[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(64, 4), @@ -984,7 +215,7 @@ static const union AnimCmd gUnknown_085E6F98[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E6FAC[] = +static const union AnimCmd sAnim_Player_LookBack[] = { ANIMCMD_FRAME(256, 4), ANIMCMD_FRAME(320, 4), @@ -992,7 +223,7 @@ static const union AnimCmd gUnknown_085E6FAC[] = ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E6FBC[] = +static const union AnimCmd sAnim_Player_LookForward[] = { ANIMCMD_FRAME(384, 30), ANIMCMD_FRAME(320, 30), @@ -1001,15 +232,15 @@ static const union AnimCmd gUnknown_085E6FBC[] = ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E6FD0[] = +static const union AnimCmd *const sAnims_Player[] = { - gUnknown_085E6F84, - gUnknown_085E6F98, - gUnknown_085E6FAC, - gUnknown_085E6FBC, + sAnim_Player_Slow, + sAnim_Player_Fast, + sAnim_Player_LookBack, + sAnim_Player_LookForward, }; -static const union AnimCmd gUnknown_085E6FE0[] = +static const union AnimCmd sAnim_Rival_Slow[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(64, 8), @@ -1018,7 +249,7 @@ static const union AnimCmd gUnknown_085E6FE0[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E6FF4[] = +static const union AnimCmd sAnim_Rival_Fast[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(64, 4), @@ -1027,31 +258,32 @@ static const union AnimCmd gUnknown_085E6FF4[] = ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E7008[] = +static const union AnimCmd sAnim_Rival_Still[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E7010[] = +static const union AnimCmd *const sAnims_Rival[] = { - gUnknown_085E6FE0, - gUnknown_085E6FF4, - gUnknown_085E7008, + sAnim_Rival_Slow, + sAnim_Rival_Fast, + sAnim_Rival_Still, }; -static const struct SpriteSheet gUnknown_085E701C[] = { - { gDecompressionBuffer, 6144, 1001 }, - { NULL }, +#define MONBG_OFFSET (MON_PIC_SIZE * 3) +static const struct SpriteSheet sSpriteSheet_MonBg[] = { + { gDecompressionBuffer, MONBG_OFFSET, TAG_MON_BG }, + {}, }; -static const struct SpritePalette gUnknown_085E702C[] = { - { (const u16 *)(gDecompressionBuffer + 0x1800), 1001 }, - { NULL }, +static const struct SpritePalette sSpritePalette_MonBg[] = { + { (const u16 *)&gDecompressionBuffer[MONBG_OFFSET], TAG_MON_BG }, + {}, }; -static const struct OamData gUnknown_085E703C = +static const struct OamData sOamData_MonBg = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -1066,101 +298,74 @@ static const struct OamData gUnknown_085E703C = .affineParam = 0, }; -static const union AnimCmd gUnknown_085E7044[] = +static const union AnimCmd sAnim_MonBg_Yellow[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E704C[] = +static const union AnimCmd sAnim_MonBg_Red[] = { ANIMCMD_FRAME(64, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E7054[] = +static const union AnimCmd sAnim_MonBg_Blue[] = { ANIMCMD_FRAME(128, 8), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E705C[] = +static const union AnimCmd *const sAnims_MonBg[] = { - gUnknown_085E7044, - gUnknown_085E704C, - gUnknown_085E7054, + [POS_LEFT] = sAnim_MonBg_Yellow, + [POS_CENTER] = sAnim_MonBg_Red, + [POS_RIGHT] = sAnim_MonBg_Blue, }; -static const struct SpriteTemplate gUnknown_085E7068 = +static const struct SpriteTemplate sSpriteTemplate_CreditsMonBg = { - .tileTag = 1001, - .paletteTag = 1001, - .oam = &gUnknown_085E703C, - .anims = gUnknown_085E705C, + .tileTag = TAG_MON_BG, + .paletteTag = TAG_MON_BG, + .oam = &sOamData_MonBg, + .anims = sAnims_MonBg, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_81772B8, + .callback = SpriteCB_CreditsMonBg, }; -static void Task_WaitPaletteFade(u8 taskIdA); -static void Task_ProgressCreditTasks(u8 taskIdA); -static void sub_8175808(u8 taskIdA); -static void c2_080C9BFC(u8 taskIdA); -static void Task_CreditsLoadGrassScene(u8 taskIdA); -static void sub_81758A4(u8 taskIdA); -static void Task_CreditsTheEnd1(u8 taskIdA); -static void Task_CreditsTheEnd2(u8 taskIdA); -static void Task_CreditsTheEnd3(u8 taskIdA); -static void Task_CreditsTheEnd4(u8 taskIdA); -static void Task_CreditsTheEnd5(u8 taskIdA); -static void Task_CreditsTheEnd6(u8 taskIdA); -static void Task_CreditsSoftReset(u8 taskIdA); -static void ResetGpuAndVram(void); -static void sub_8175DA0(u8 taskIdB); -static u8 CheckChangeScene(u8 page, u8 taskIdA); -static void sub_81760FC(u8 taskIdA); -static void sub_817651C(u8 taskIdA); -static void sub_817624C(u8 taskIdA); -static bool8 sub_8176AB0(u8 data, u8 taskIdA); -static void ResetCreditsTasks(u8 taskIdA); -static void LoadTheEndScreen(u16, u16, u16); -static void sub_8176E40(u16 arg0, u16 palette); -static void sub_8176EE8(struct Sprite *sprite); -static void sub_8176F90(struct Sprite *sprite); -static u8 MakeMonSprite(u16 species, s16 x, s16 y, u16 position); -static void DeterminePokemonToShow(void); - -static void CreditsVBlankCallback(void) +static void VBlankCB_Credits(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void CB2_RunCreditsSequence(void) +static void CB2_Credits(void) { RunTasks(); AnimateSprites(); if ((JOY_HELD(B_BUTTON)) - && gHasHallOfFameRecords != 0 - && gTasks[gUnknown_0203BCE2].func == Task_ProgressCreditTasks) + && gHasHallOfFameRecords + && gTasks[sSavedTaskId].func == Task_CreditsMain) { - CreditsVBlankCallback(); + // Speed up credits + VBlankCB_Credits(); RunTasks(); AnimateSprites(); - gUnknown_0203BCE5 = 1; + sUsedSpeedUp = TRUE; } BuildOamBuffer(); UpdatePaletteFade(); } -static void sub_8175548(void) +static void InitCreditsBgsAndWindows(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sBackgroundTemplates, 1); + InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates)); SetBgTilemapBuffer(0, AllocZeroed(BG_SCREEN_SIZE)); - LoadPalette(gUnknown_085E56F0, 0x80, 0x40); + LoadPalette(sCredits_Pal, 0x80, 64); InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); PutWindowTilemap(0); @@ -1168,7 +373,7 @@ static void sub_8175548(void) ShowBg(0); } -static void sub_81755A4(void) +static void FreeCreditsBgsAndWindows(void) { void *ptr; FreeAllWindowBuffers(); @@ -1182,153 +387,153 @@ static void PrintCreditsText(const u8 *string, u8 y, bool8 isTitle) u8 x; u8 color[3]; - color[0] = 0; + color[0] = TEXT_COLOR_TRANSPARENT; if (isTitle == TRUE) { - color[1] = 3; - color[2] = 4; + color[1] = TEXT_COLOR_LIGHT_GRAY; + color[2] = TEXT_COLOR_RED; } else { - color[1] = 1; - color[2] = 2; + color[1] = TEXT_COLOR_WHITE; + color[2] = TEXT_COLOR_DARK_GRAY; } - x = GetStringCenterAlignXOffsetWithLetterSpacing(1, string, 0xF0, 1); + x = GetStringCenterAlignXOffsetWithLetterSpacing(1, string, DISPLAY_WIDTH, 1); AddTextPrinterParameterized4(0, 1, x, y, 1, 0, color, -1, string); } +#define tMainTaskId data[1] + void CB2_StartCreditsSequence(void) { - u8 taskIdA; - s16 taskIdC; - u8 taskIdB; + u8 taskId; + s16 bikeTaskId; + u8 pageTaskId; ResetGpuAndVram(); SetVBlankCallback(NULL); InitHeap(gHeap, HEAP_SIZE); ResetPaletteFade(); ResetTasks(); - sub_8175548(); + InitCreditsBgsAndWindows(); - taskIdA = CreateTask(Task_WaitPaletteFade, 0); + taskId = CreateTask(Task_WaitPaletteFade, 0); - gTasks[taskIdA].data[TDA_4] = 0; - gTasks[taskIdA].data[TDA_7] = 0; - gTasks[taskIdA].data[TDA_11] = 0; - gTasks[taskIdA].data[TDA_13] = 1; + gTasks[taskId].tEndCredits = FALSE; + gTasks[taskId].tSceneNum = SCENE_OCEAN_MORNING; + gTasks[taskId].tNextMode = MODE_NONE; + gTasks[taskId].tCurrentMode = MODE_BIKE_SCENE; while (TRUE) { - if (sub_8176AB0(0, taskIdA)) + if (LoadBikeScene(SCENE_OCEAN_MORNING, taskId)) break; } - taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; - gTasks[taskIdC].data[TDC_0] = 40; + bikeTaskId = gTasks[taskId].tTaskId_BikeScene; + gTasks[bikeTaskId].tState = 40; SetGpuReg(REG_OFFSET_BG0VOFS, 0xFFFC); - taskIdB = CreateTask(sub_8175DA0, 0); + pageTaskId = CreateTask(Task_UpdatePage, 0); - gTasks[taskIdB].data[TDB_TASK_A_ID] = taskIdA; - gTasks[taskIdA].data[TDA_TASK_B_ID] = taskIdB; + gTasks[pageTaskId].tMainTaskId = taskId; + gTasks[taskId].tTaskId_UpdatePage = pageTaskId; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); EnableInterrupts(INTR_FLAG_VBLANK); - SetVBlankCallback(CreditsVBlankCallback); + SetVBlankCallback(VBlankCB_Credits); m4aSongNumStart(MUS_CREDITS); - SetMainCallback2(CB2_RunCreditsSequence); - gUnknown_0203BCE5 = 0; + SetMainCallback2(CB2_Credits); + sUsedSpeedUp = FALSE; sCreditsData = AllocZeroed(sizeof(struct CreditsData)); DeterminePokemonToShow(); sCreditsData->imgCounter = 0; - sCreditsData->nextImgPos = 0; + sCreditsData->nextImgPos = POS_LEFT; sCreditsData->currShownMon = 0; - gUnknown_0203BCE2 = taskIdA; + sSavedTaskId = taskId; } -static void Task_WaitPaletteFade(u8 taskIdA) +static void Task_WaitPaletteFade(u8 taskId) { if (!gPaletteFade.active) - gTasks[taskIdA].func = Task_ProgressCreditTasks; + gTasks[taskId].func = Task_CreditsMain; } -static void Task_ProgressCreditTasks(u8 taskIdA) +static void Task_CreditsMain(u8 taskId) { - u16 data1; + u16 mode; - if (gTasks[taskIdA].data[TDA_4]) + if (gTasks[taskId].tEndCredits) { - s16 taskIdC; - - taskIdC = gTasks[taskIdA].data[TDA_TASK_C_ID]; - gTasks[taskIdC].data[TDC_0] = 30; + s16 bikeTaskId = gTasks[taskId].tTaskId_BikeScene; + gTasks[bikeTaskId].tState = 30; - gTasks[taskIdA].data[TDA_12] = 0x100; - gTasks[taskIdA].func = Task_CreditsTheEnd1; + gTasks[taskId].tTheEndDelay = 256; + gTasks[taskId].func = Task_CreditsTheEnd1; return; } - gUnknown_0203BCE0 = 0; - data1 = gTasks[taskIdA].data[TDA_11]; + sUnkVar = 0; + mode = gTasks[taskId].tNextMode; - if (gTasks[taskIdA].data[TDA_11] == 1) + if (gTasks[taskId].tNextMode == MODE_BIKE_SCENE) { - gTasks[taskIdA].data[TDA_13] = data1; - gTasks[taskIdA].data[TDA_11] = 0; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - gTasks[taskIdA].func = sub_8175808; + // Start a bike cutscene + gTasks[taskId].tCurrentMode = mode; + gTasks[taskId].tNextMode = MODE_NONE; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_ReadyBikeScene; } - else if (gTasks[taskIdA].data[TDA_11] == 2) + else if (gTasks[taskId].tNextMode == MODE_SHOW_MONS) { - gTasks[taskIdA].data[TDA_13] = data1; - gTasks[taskIdA].data[TDA_11] = 0; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - gTasks[taskIdA].func = sub_81758A4; + // Start a Pokémon interlude + gTasks[taskId].tCurrentMode = mode; + gTasks[taskId].tNextMode = MODE_NONE; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_ReadyShowMons; } } -static void sub_8175808(u8 taskIdA) +static void Task_ReadyBikeScene(u8 taskId) { if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - ResetCreditsTasks(taskIdA); - gTasks[taskIdA].func = c2_080C9BFC; + ResetCreditsTasks(taskId); + gTasks[taskId].func = Task_SetBikeScene; } } -static void c2_080C9BFC(u8 taskIdA) +static void Task_SetBikeScene(u8 taskId) { - u16 backup; - SetVBlankCallback(NULL); - if (sub_8176AB0(gTasks[taskIdA].data[TDA_7], taskIdA)) + if (LoadBikeScene(gTasks[taskId].tSceneNum, taskId)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); EnableInterrupts(INTR_FLAG_VBLANK); - SetVBlankCallback(CreditsVBlankCallback); - gTasks[taskIdA].func = Task_WaitPaletteFade; + SetVBlankCallback(VBlankCB_Credits); + gTasks[taskId].func = Task_WaitPaletteFade; } } -static void sub_81758A4(u8 taskIdA) +static void Task_ReadyShowMons(u8 taskId) { if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - ResetCreditsTasks(taskIdA); - gTasks[taskIdA].func = Task_CreditsLoadGrassScene; + ResetCreditsTasks(taskId); + gTasks[taskId].func = Task_LoadShowMons; } } -static void Task_CreditsLoadGrassScene(u8 taskIdA) +static void Task_LoadShowMons(u8 taskId) { switch (gMain.state) { @@ -1346,32 +551,32 @@ static void Task_CreditsLoadGrassScene(u8 taskIdA) LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(7))); LoadPalette(gBirchBagGrassPal[0] + 1, 1, 31 * 2); - for (i = 0; i < 0x800; i++) + for (i = 0; i < MON_PIC_SIZE; i++) gDecompressionBuffer[i] = 0x11; - for (i = 0; i < 0x800; i++) - (gDecompressionBuffer + 0x800)[i] = 0x22; - for (i = 0; i < 0x800; i++) - (gDecompressionBuffer + 0x1000)[i] = 0x33; + for (i = 0; i < MON_PIC_SIZE; i++) + (gDecompressionBuffer + MON_PIC_SIZE)[i] = 0x22; + for (i = 0; i < MON_PIC_SIZE; i++) + (gDecompressionBuffer + MON_PIC_SIZE * 2)[i] = 0x33; - temp = (u16 *)(&gDecompressionBuffer[0x1800]); + temp = (u16 *)(&gDecompressionBuffer[MONBG_OFFSET]); temp[0] = RGB_BLACK; temp[1] = RGB(31, 31, 20); // light yellow temp[2] = RGB(31, 20, 20); // light red temp[3] = RGB(20, 20, 31); // light blue - LoadSpriteSheet(gUnknown_085E701C); - LoadSpritePalette(gUnknown_085E702C); + LoadSpriteSheet(sSpriteSheet_MonBg); + LoadSpritePalette(sSpritePalette_MonBg); - gMain.state += 1; + gMain.state++; break; } case 1: - gTasks[taskIdA].data[TDA_TASK_D_ID] = CreateTask(sub_81760FC, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_STATE] = 1; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_TASK_A_ID] = taskIdA; - gTasks[gTasks[taskIdA].data[TDA_TASK_D_ID]].data[TDD_2] = gTasks[taskIdA].data[TDA_7]; + gTasks[taskId].tTaskId_ShowMons = CreateTask(Task_ShowMons, 0); + gTasks[gTasks[taskId].tTaskId_ShowMons].tState = 1; + gTasks[gTasks[taskId].tTaskId_ShowMons].tMainTaskId = taskId; + gTasks[gTasks[taskId].tTaskId_ShowMons].data[2] = gTasks[taskId].tSceneNum; // data[2] never read - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 32); SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) @@ -1386,41 +591,43 @@ static void Task_CreditsLoadGrassScene(u8 taskIdA) | DISPCNT_OBJ_ON); gMain.state = 0; - gUnknown_0203BD28 = 0; - gTasks[taskIdA].func = Task_WaitPaletteFade; + gIntroCredits_MovingSceneryState = INTROCRED_SCENERY_NORMAL; + gTasks[taskId].func = Task_WaitPaletteFade; break; } } -static void Task_CreditsTheEnd1(u8 taskIdA) +static void Task_CreditsTheEnd1(u8 taskId) { - if (gTasks[taskIdA].data[TDA_12]) + if (gTasks[taskId].tTheEndDelay) { - gTasks[taskIdA].data[TDA_12] -= 1; + gTasks[taskId].tTheEndDelay--; return; } - BeginNormalPaletteFade(0xFFFFFFFF, 12, 0, 16, RGB_BLACK); - gTasks[taskIdA].func = Task_CreditsTheEnd2; + BeginNormalPaletteFade(PALETTES_ALL, 12, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_CreditsTheEnd2; } -static void Task_CreditsTheEnd2(u8 taskIdA) +static void Task_CreditsTheEnd2(u8 taskId) { if (!gPaletteFade.active) { - ResetCreditsTasks(taskIdA); - gTasks[taskIdA].func = Task_CreditsTheEnd3; + ResetCreditsTasks(taskId); + gTasks[taskId].func = Task_CreditsTheEnd3; } } -static void Task_CreditsTheEnd3(u8 taskIdA) +#define tDelay data[0] + +static void Task_CreditsTheEnd3(u8 taskId) { ResetGpuAndVram(); ResetPaletteFade(); LoadTheEndScreen(0, 0x3800, 0); ResetSpriteData(); FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 8, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 8, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) @@ -1432,60 +639,62 @@ static void Task_CreditsTheEnd3(u8 taskIdA) | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON); - gTasks[taskIdA].data[TDA_0] = 235; //set this to 215 to actually show "THE END" in time to the last song beat - gTasks[taskIdA].func = Task_CreditsTheEnd4; + gTasks[taskId].tDelay = 235; //set this to 215 to actually show "THE END" in time to the last song beat + gTasks[taskId].func = Task_CreditsTheEnd4; } -static void Task_CreditsTheEnd4(u8 taskIdA) +static void Task_CreditsTheEnd4(u8 taskId) { - if (gTasks[taskIdA].data[TDA_0]) + if (gTasks[taskId].tDelay) { - gTasks[taskIdA].data[TDA_0] -= 1; + gTasks[taskId].tDelay--; return; } - BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 16, RGB_BLACK); - gTasks[taskIdA].func = Task_CreditsTheEnd5; + BeginNormalPaletteFade(PALETTES_ALL, 6, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_CreditsTheEnd5; } -static void Task_CreditsTheEnd5(u8 taskIdA) +static void Task_CreditsTheEnd5(u8 taskId) { if (!gPaletteFade.active) { - sub_8176E40(0x3800, 0); + DrawTheEnd(0x3800, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK); - gTasks[taskIdA].data[TDA_0] = 7200; - gTasks[taskIdA].func = Task_CreditsTheEnd6; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0, RGB_BLACK); + gTasks[taskId].tDelay = 7200; + gTasks[taskId].func = Task_CreditsTheEnd6; } } -static void Task_CreditsTheEnd6(u8 taskIdA) +static void Task_CreditsTheEnd6(u8 taskId) { if (!gPaletteFade.active) { - if (gTasks[taskIdA].data[TDA_0] == 0 || gMain.newKeys) + if (gTasks[taskId].tDelay == 0 || gMain.newKeys) { FadeOutBGM(4); - BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA); - gTasks[taskIdA].func = Task_CreditsSoftReset; + BeginNormalPaletteFade(PALETTES_ALL, 8, 0, 16, RGB_WHITEALPHA); + gTasks[taskId].func = Task_CreditsSoftReset; return; } - if (gTasks[taskIdA].data[TDA_0] == 7144) + if (gTasks[taskId].tDelay == 7144) FadeOutBGM(8); - if (gTasks[taskIdA].data[TDA_0] == 6840) + if (gTasks[taskId].tDelay == 6840) m4aSongNumStart(MUS_END); - gTasks[taskIdA].data[TDA_0] -= 1; + gTasks[taskId].tDelay--; } } -static void Task_CreditsSoftReset(u8 taskIdA) +#undef tDelay + +static void Task_CreditsSoftReset(u8 taskId) { if (!gPaletteFade.active) - SoftReset(0xFF); + SoftReset(RESET_ALL); } static void ResetGpuAndVram(void) @@ -1510,11 +719,14 @@ static void ResetGpuAndVram(void) DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); } -static void sub_8175DA0(u8 taskIdB) +#define tCurrentPage data[2] +#define tDelay data[3] + +static void Task_UpdatePage(u8 taskId) { int i; - switch (gTasks[taskIdB].data[TDB_0]) + switch (gTasks[taskId].tState) { case 0: case 6: @@ -1524,419 +736,450 @@ static void sub_8175DA0(u8 taskIdB) default: if (!gPaletteFade.active) { - gTasks[taskIdB].data[TDB_0] = 1; - gTasks[taskIdB].data[TDB_3] = 0x48; - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; - gUnknown_0203BCE0 = 0; + gTasks[taskId].tState = 1; + gTasks[taskId].tDelay = 72; + gTasks[gTasks[taskId].tMainTaskId].tPrintedPage = FALSE; + sUnkVar = 0; } return; case 1: - if (gTasks[taskIdB].data[TDB_3] != 0) + if (gTasks[taskId].tDelay != 0) { - gTasks[taskIdB].data[TDB_3] -= 1; + gTasks[taskId].tDelay--; return; } - gTasks[taskIdB].data[TDB_0] += 1; + gTasks[taskId].tState++; return; case 2: - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == Task_ProgressCreditTasks) + if (gTasks[gTasks[taskId].tMainTaskId].func == Task_CreditsMain) { - if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) + if (gTasks[taskId].tCurrentPage < PAGE_COUNT) { - for (i = 0; i < 5; i++) + // Print text for this Credits page + for (i = 0; i < ENTRIES_PER_PAGE; i++) PrintCreditsText( - gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, + sCreditsEntryPointerTable[gTasks[taskId].tCurrentPage][i]->text, 5 + i * 16, - gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->isTitle); - + sCreditsEntryPointerTable[gTasks[taskId].tCurrentPage][i]->isTitle); CopyWindowToVram(0, 2); - gTasks[taskIdB].data[TDB_CURRENT_PAGE] += 1; - gTasks[taskIdB].data[TDB_0] += 1; + gTasks[taskId].tCurrentPage++; + gTasks[taskId].tState++; - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 1; + gTasks[gTasks[taskId].tMainTaskId].tPrintedPage = TRUE; - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) - BeginNormalPaletteFade(0x00000300, 0, 16, 0, COLOR_LIGHT_GREEN); - else - BeginNormalPaletteFade(0x00000300, 0, 16, 0, COLOR_DARK_GREEN); + if (gTasks[gTasks[taskId].tMainTaskId].tCurrentMode == MODE_BIKE_SCENE) + BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_LIGHT_GREEN); + else // MODE_SHOW_MONS + BeginNormalPaletteFade(0x300, 0, 16, 0, COLOR_DARK_GREEN); return; } - gTasks[taskIdB].data[TDB_0] = 10; + + // Reached final page of Credits, end task + gTasks[taskId].tState = 10; return; } - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_14] = 0; + gTasks[gTasks[taskId].tMainTaskId].tPrintedPage = FALSE; return; case 3: if (!gPaletteFade.active) { - gTasks[taskIdB].data[TDB_3] = 0x73; - gTasks[taskIdB].data[TDB_0] += 1; + gTasks[taskId].tDelay = 115; + gTasks[taskId].tState++; } return; case 4: - if (gTasks[taskIdB].data[TDB_3] != 0) + if (gTasks[taskId].tDelay != 0) { - gTasks[taskIdB].data[TDB_3] -= 1; + gTasks[taskId].tDelay--; return; } - if (CheckChangeScene((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) + if (CheckChangeScene((u8)gTasks[taskId].tCurrentPage, (u8)gTasks[taskId].tMainTaskId)) { - gTasks[taskIdB].data[TDB_0] += 1; + gTasks[taskId].tState++; return; } - gTasks[taskIdB].data[TDB_0] += 1; - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_13] == 1) - BeginNormalPaletteFade(0x00000300, 0, 0, 16, COLOR_LIGHT_GREEN); - else - BeginNormalPaletteFade(0x00000300, 0, 0, 16, COLOR_DARK_GREEN); + gTasks[taskId].tState++; + if (gTasks[gTasks[taskId].tMainTaskId].tCurrentMode == MODE_BIKE_SCENE) + BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_LIGHT_GREEN); + else // MODE_SHOW_MONS + BeginNormalPaletteFade(0x300, 0, 0, 16, COLOR_DARK_GREEN); return; case 5: if (!gPaletteFade.active) { + // Still more Credits pages to show, return to state 2 to print FillWindowPixelBuffer(0, PIXEL_FILL(0)); CopyWindowToVram(0, 2); - gTasks[taskIdB].data[TDB_0] = 2; + gTasks[taskId].tState = 2; } return; case 10: - gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].data[TDA_4] = 1; - DestroyTask(taskIdB); - sub_81755A4(); + gTasks[gTasks[taskId].tMainTaskId].tEndCredits = TRUE; + DestroyTask(taskId); + FreeCreditsBgsAndWindows(); FREE_AND_SET_NULL(sCreditsData); return; } } -static u8 CheckChangeScene(u8 page, u8 taskIdA) +#undef tDelay + +#define PAGE_INTERVAL (PAGE_COUNT / 9) // 9 scenes (5 bike scenes, 4 Pokémon interludes) + +static u8 CheckChangeScene(u8 page, u8 taskId) { - // Starts with bike + ocean + morning + // Starts with bike + ocean + morning (SCENE_OCEAN_MORNING) - if (page == 6) + if (page == PAGE_INTERVAL * 1) { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; + // Pokémon interlude + gTasks[taskId].tNextMode = MODE_SHOW_MONS; } - if (page == 12) + if (page == PAGE_INTERVAL * 2) { // Bike + ocean + sunset - gTasks[taskIdA].data[TDA_7] = 1; - gTasks[taskIdA].data[TDA_11] = 1; + gTasks[taskId].tSceneNum = SCENE_OCEAN_SUNSET; + gTasks[taskId].tNextMode = MODE_BIKE_SCENE; } - if (page == 18) + if (page == PAGE_INTERVAL * 3) { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; + // Pokémon interlude + gTasks[taskId].tNextMode = MODE_SHOW_MONS; } - if (page == 24) + if (page == PAGE_INTERVAL * 4) { // Bike + forest + sunset - gTasks[taskIdA].data[TDA_7] = 2; - gTasks[taskIdA].data[TDA_11] = 1; + gTasks[taskId].tSceneNum = SCENE_FOREST_RIVAL_ARRIVE; + gTasks[taskId].tNextMode = MODE_BIKE_SCENE; } - if (page == 30) + if (page == PAGE_INTERVAL * 5) { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; + // Pokémon interlude + gTasks[taskId].tNextMode = MODE_SHOW_MONS; } - if (page == 36) + if (page == PAGE_INTERVAL * 6) { // Bike + forest + sunset - gTasks[taskIdA].data[TDA_7] = 3; - gTasks[taskIdA].data[TDA_11] = 1; + gTasks[taskId].tSceneNum = SCENE_FOREST_CATCH_RIVAL; + gTasks[taskId].tNextMode = MODE_BIKE_SCENE; } - if (page == 42) + if (page == PAGE_INTERVAL * 7) { - // Grass patch - gTasks[taskIdA].data[TDA_11] = 2; + // Pokémon interlude + gTasks[taskId].tNextMode = MODE_SHOW_MONS; } - if (page == 48) + if (page == PAGE_INTERVAL * 8) { // Bike + town + night - gTasks[taskIdA].data[TDA_7] = 4; - gTasks[taskIdA].data[TDA_11] = 1; + gTasks[taskId].tSceneNum = SCENE_CITY_NIGHT; + gTasks[taskId].tNextMode = MODE_BIKE_SCENE; } - if (gTasks[taskIdA].data[TDA_11] != 0) + if (gTasks[taskId].tNextMode != MODE_NONE) { - // Returns true if changed? + // Returns true if changed return TRUE; } return FALSE; } -static void sub_81760FC(u8 taskIdD) +#define tDelay data[3] + +static void Task_ShowMons(u8 taskId) { - u8 r2; + u8 spriteId; - switch (gTasks[taskIdD].data[TDD_STATE]) + switch (gTasks[taskId].tState) { case 0: break; case 1: - if (sCreditsData->nextImgPos == 0 && gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].data[TDA_14] == 0) + if (sCreditsData->nextImgPos == POS_LEFT && gTasks[gTasks[taskId].tMainTaskId].tPrintedPage == FALSE) break; - gTasks[taskIdD].data[TDD_STATE]++; + gTasks[taskId].tState++; break; case 2: - if (sCreditsData->imgCounter == NUM_MON_SLIDES || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != Task_ProgressCreditTasks) + if (sCreditsData->imgCounter == NUM_MON_SLIDES || gTasks[gTasks[taskId].tMainTaskId].func != Task_CreditsMain) break; - r2 = MakeMonSprite(sCreditsData->monToShow[sCreditsData->currShownMon], sMonSpritePos[sCreditsData->nextImgPos][0], sMonSpritePos[sCreditsData->nextImgPos][1], sCreditsData->nextImgPos); + spriteId = CreateCreditsMonSprite(sCreditsData->monToShow[sCreditsData->currShownMon], + sMonSpritePos[sCreditsData->nextImgPos][0], + sMonSpritePos[sCreditsData->nextImgPos][1], + sCreditsData->nextImgPos); if (sCreditsData->currShownMon < sCreditsData->numMonToShow - 1) { sCreditsData->currShownMon++; - gSprites[r2].data[3] = 50; + gSprites[spriteId].data[3] = 50; } else { sCreditsData->currShownMon = 0; - gSprites[r2].data[3] = 512; + gSprites[spriteId].data[3] = 512; } sCreditsData->imgCounter++; - if (sCreditsData->nextImgPos == 2) - sCreditsData->nextImgPos = 0; + + if (sCreditsData->nextImgPos == POS_RIGHT) + sCreditsData->nextImgPos = POS_LEFT; else sCreditsData->nextImgPos++; - gTasks[taskIdD].data[TDD_3] = 50; - gTasks[taskIdD].data[TDD_STATE]++; + + gTasks[taskId].tDelay = 50; + gTasks[taskId].tState++; break; case 3: - if (gTasks[taskIdD].data[TDD_3] != 0) - gTasks[taskIdD].data[TDD_3]--; + if (gTasks[taskId].tDelay != 0) + gTasks[taskId].tDelay--; else - gTasks[taskIdD].data[TDD_STATE] = 1; + gTasks[taskId].tState = 1; break; } } -static void sub_817624C(u8 taskIdC) +#undef tMainTaskId +#undef tDelay + +#define tPlayer data[2] +#define tRival data[3] +#define tDelay data[4] +#define tSinIdx data[5] + +static void Task_BikeScene(u8 taskId) { - switch (gTasks[taskIdC].data[TDC_0]) + switch (gTasks[taskId].tState) { case 0: - gUnknown_0203BD26 = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[TDC_5]++; + gIntroCredits_MovingSceneryVOffset = Sin((gTasks[taskId].tSinIdx >> 1) & 0x7F, 12); + gTasks[taskId].tSinIdx++; break; case 1: - if (gUnknown_0203BD26 != 0) + if (gIntroCredits_MovingSceneryVOffset != 0) { - gUnknown_0203BD26 = Sin((gTasks[taskIdC].data[TDC_5] >> 1) & 0x7F, 12); - gTasks[taskIdC].data[TDC_5]++; + gIntroCredits_MovingSceneryVOffset = Sin((gTasks[taskId].tSinIdx >> 1) & 0x7F, 12); + gTasks[taskId].tSinIdx++; } else { - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 2; - gTasks[taskIdC].data[TDC_5] = 0; - gTasks[taskIdC].data[TDC_0]++; + gSprites[gTasks[taskId].tPlayer].data[0] = 2; + gTasks[taskId].tSinIdx = 0; + gTasks[taskId].tState++; } break; case 2: - if (gTasks[taskIdC].data[TDC_5] < 64) + if (gTasks[taskId].tSinIdx < 64) { - gTasks[taskIdC].data[TDC_5]++; - gUnknown_0203BD26 = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + gTasks[taskId].tSinIdx++; + gIntroCredits_MovingSceneryVOffset = Sin(gTasks[taskId].tSinIdx & 0x7F, 20); } else { - gTasks[taskIdC].data[TDC_0]++; + gTasks[taskId].tState++; } break; case 3: - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 3; - gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 1; - gTasks[taskIdC].data[TDC_4] = 120; - gTasks[taskIdC].data[TDC_0]++; + gSprites[gTasks[taskId].tPlayer].data[0] = 3; + gSprites[gTasks[taskId].tRival].data[0] = 1; + gTasks[taskId].tDelay = 120; + gTasks[taskId].tState++; break; case 4: - if (gTasks[taskIdC].data[TDC_4] != 0) + if (gTasks[taskId].tDelay != 0) { - gTasks[taskIdC].data[TDC_4]--; + gTasks[taskId].tDelay--; } else { - gTasks[taskIdC].data[TDC_5] = 64; - gTasks[taskIdC].data[TDC_0]++; + gTasks[taskId].tSinIdx = 64; + gTasks[taskId].tState++; } break; case 5: - if (gTasks[taskIdC].data[TDC_5] > 0) + if (gTasks[taskId].tSinIdx > 0) { - gTasks[taskIdC].data[TDC_5]--; - gUnknown_0203BD26 = Sin(gTasks[taskIdC].data[TDC_5] & 0x7F, 20); + gTasks[taskId].tSinIdx--; + gIntroCredits_MovingSceneryVOffset = Sin(gTasks[taskId].tSinIdx & 0x7F, 20); } else { - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 1; - gTasks[taskIdC].data[TDC_0]++; + gSprites[gTasks[taskId].tPlayer].data[0] = 1; + gTasks[taskId].tState++; } break; case 6: - gTasks[taskIdC].data[TDC_0] = 50; + gTasks[taskId].tState = 50; break; case 10: - gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 2; - gTasks[taskIdC].data[TDC_0] = 50; + gSprites[gTasks[taskId].tRival].data[0] = 2; + gTasks[taskId].tState = 50; break; case 20: - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 4; - gTasks[taskIdC].data[TDC_0] = 50; + gSprites[gTasks[taskId].tPlayer].data[0] = 4; + gTasks[taskId].tState = 50; break; case 30: - gSprites[gTasks[taskIdC].data[TDC_2]].data[0] = 5; - gSprites[gTasks[taskIdC].data[TDC_3]].data[0] = 3; - gTasks[taskIdC].data[TDC_0] = 50; + gSprites[gTasks[taskId].tPlayer].data[0] = 5; + gSprites[gTasks[taskId].tRival].data[0] = 3; + gTasks[taskId].tState = 50; break; case 50: - gTasks[taskIdC].data[TDC_0] = 0; + gTasks[taskId].tState = 0; break; } } -static void sub_817651C(u8 taskIdE) +#define TIMER_STOP 0x7FFF +#define tTimer data[1] +#define tMainTaskId data[2] + +static void Task_CycleSceneryPalette(u8 taskId) { - s16 taskIdC; + s16 bikeTaskId; - switch (gTasks[taskIdE].data[TDE_0]) + switch (gTasks[taskId].tState) { default: - case 0: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + case SCENE_OCEAN_MORNING: + if (gTasks[taskId].tTimer != TIMER_STOP) { - - if (gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_B_ID]].data[TDB_CURRENT_PAGE] == 2) + if (gTasks[gTasks[gTasks[taskId].tMainTaskId].tTaskId_UpdatePage].tCurrentPage == 2) { - gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 20; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; + gTasks[gTasks[gTasks[taskId].tMainTaskId].tTaskId_BikeScene].tState = 20; + gTasks[taskId].tTimer = TIMER_STOP; } } - sub_817B540(0); + CycleSceneryPalette(0); break; - case 1: - sub_817B540(0); + case SCENE_OCEAN_SUNSET: + CycleSceneryPalette(0); break; - case 2: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + case SCENE_FOREST_RIVAL_ARRIVE: + if (gTasks[taskId].tTimer != TIMER_STOP) { - taskIdC = gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]; + bikeTaskId = gTasks[gTasks[taskId].tMainTaskId].tTaskId_BikeScene; // Floor to multiple of 128 - if ((gTasks[taskIdC].data[TDC_5] & -128) == 640) + if ((gTasks[bikeTaskId].tSinIdx & -128) == 640) { - gTasks[taskIdC].data[TDC_0] = 1; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; + gTasks[bikeTaskId].tState = 1; + gTasks[taskId].tTimer = TIMER_STOP; } } - sub_817B540(1); + CycleSceneryPalette(1); break; - case 3: - if (gTasks[taskIdE].data[TDE_1] != 0x7FFF) + case SCENE_FOREST_CATCH_RIVAL: + if (gTasks[taskId].tTimer != TIMER_STOP) { - if (gTasks[taskIdE].data[TDE_1] == 0x248) + if (gTasks[taskId].tTimer == 584) { - gTasks[gTasks[gTasks[taskIdE].data[TDE_TASK_A_ID]].data[TDA_TASK_C_ID]].data[TDC_0] = 10; - gTasks[taskIdE].data[TDE_1] = 0x7FFF; + gTasks[gTasks[gTasks[taskId].tMainTaskId].tTaskId_BikeScene].tState = 10; + gTasks[taskId].tTimer = TIMER_STOP; } else { - gTasks[taskIdE].data[TDE_1] += 1; + gTasks[taskId].tTimer++; } } - sub_817B540(1); + CycleSceneryPalette(1); break; - case 4: - sub_817B540(2); + case SCENE_CITY_NIGHT: + CycleSceneryPalette(2); break; } } -static void sub_817664C(u8 data, u8 taskIdA) +static void SetBikeScene(u8 scene, u8 taskId) { - switch (data) + switch (scene) { - case 0: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = CreateBicycleAnimationTask(0, 0x2000, 0x20, 8); + case SCENE_OCEAN_MORNING: + gSprites[gTasks[taskId].tPlayerSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tRivalSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.x = DISPLAY_WIDTH + 32; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.x = DISPLAY_WIDTH + 32; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tPlayerSpriteId].data[0] = 0; + gSprites[gTasks[taskId].tRivalSpriteId].data[0] = 0; + gTasks[taskId].tTaskId_BgScenery = CreateBicycleBgAnimationTask(0, 0x2000, 0x20, 8); break; - case 1: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = CreateBicycleAnimationTask(0, 0x2000, 0x20, 8); + case SCENE_OCEAN_SUNSET: + gSprites[gTasks[taskId].tPlayerSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tRivalSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.x = 120; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.x = DISPLAY_WIDTH + 32; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tPlayerSpriteId].data[0] = 0; + gSprites[gTasks[taskId].tRivalSpriteId].data[0] = 0; + gTasks[taskId].tTaskId_BgScenery = CreateBicycleBgAnimationTask(0, 0x2000, 0x20, 8); break; - case 2: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 272; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = CreateBicycleAnimationTask(1, 0x2000, 0x200, 8); + case SCENE_FOREST_RIVAL_ARRIVE: + gSprites[gTasks[taskId].tPlayerSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tRivalSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.x = 120; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.x = DISPLAY_WIDTH + 32; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tPlayerSpriteId].data[0] = 0; + gSprites[gTasks[taskId].tRivalSpriteId].data[0] = 0; + gTasks[taskId].tTaskId_BgScenery = CreateBicycleBgAnimationTask(1, 0x2000, 0x200, 8); break; - case 3: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 120; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = -32; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = CreateBicycleAnimationTask(1, 0x2000, 0x200, 8); + case SCENE_FOREST_CATCH_RIVAL: + gSprites[gTasks[taskId].tPlayerSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tRivalSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.x = 120; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.x = -32; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tPlayerSpriteId].data[0] = 0; + gSprites[gTasks[taskId].tRivalSpriteId].data[0] = 0; + gTasks[taskId].tTaskId_BgScenery = CreateBicycleBgAnimationTask(1, 0x2000, 0x200, 8); break; - case 4: - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].invisible = FALSE; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.x = 88; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.x = 152; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].pos1.y = 46; - gSprites[gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]].data[0] = 0; - gSprites[gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]].data[0] = 0; - gTasks[taskIdA].data[TDA_0] = CreateBicycleAnimationTask(2, 0x2000, 0x200, 8); + case SCENE_CITY_NIGHT: + gSprites[gTasks[taskId].tPlayerSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tRivalSpriteId].invisible = FALSE; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.x = 88; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.x = 152; + gSprites[gTasks[taskId].tPlayerSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tRivalSpriteId].pos1.y = 46; + gSprites[gTasks[taskId].tPlayerSpriteId].data[0] = 0; + gSprites[gTasks[taskId].tRivalSpriteId].data[0] = 0; + gTasks[taskId].tTaskId_BgScenery = CreateBicycleBgAnimationTask(2, 0x2000, 0x200, 8); break; } - gTasks[taskIdA].data[TDA_TASK_E_ID] = CreateTask(sub_817651C, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_0] = data; - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_1] = 0; - gTasks[gTasks[taskIdA].data[TDA_TASK_E_ID]].data[TDE_TASK_A_ID] = taskIdA; + gTasks[taskId].tTaskId_SceneryPal = CreateTask(Task_CycleSceneryPalette, 0); + gTasks[gTasks[taskId].tTaskId_SceneryPal].tState = scene; + gTasks[gTasks[taskId].tTaskId_SceneryPal].tTimer = 0; + gTasks[gTasks[taskId].tTaskId_SceneryPal].tMainTaskId = taskId; - gTasks[taskIdA].data[TDA_TASK_C_ID] = CreateTask(sub_817624C, 0); - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_0] = 0; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_1] = taskIdA; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_2] = gTasks[taskIdA].data[TDA_PLAYER_CYCLIST]; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_3] = gTasks[taskIdA].data[TDA_RIVAL_CYCLIST]; - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_4] = 0; + gTasks[taskId].tTaskId_BikeScene = CreateTask(Task_BikeScene, 0); + gTasks[gTasks[taskId].tTaskId_BikeScene].tState = 0; + gTasks[gTasks[taskId].tTaskId_BikeScene].data[1] = taskId; // data[1] is never read + gTasks[gTasks[taskId].tTaskId_BikeScene].tPlayer = gTasks[taskId].tPlayerSpriteId; + gTasks[gTasks[taskId].tTaskId_BikeScene].tRival = gTasks[taskId].tRivalSpriteId; + gTasks[gTasks[taskId].tTaskId_BikeScene].tDelay = 0; - if (data == 2) - gTasks[gTasks[taskIdA].data[TDA_TASK_C_ID]].data[TDC_5] = 0x45; + if (scene == SCENE_FOREST_RIVAL_ARRIVE) + gTasks[gTasks[taskId].tTaskId_BikeScene].tSinIdx = 69; } -static bool8 sub_8176AB0(u8 data, u8 taskIdA) +#undef tTimer +#undef tDelay +#undef tSinIdx +#undef tRival +#undef tPlayer + +static bool8 LoadBikeScene(u8 scene, u8 taskId) { u8 spriteId; @@ -1958,116 +1201,120 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA) gMain.state = 1; break; case 1: - gUnknown_0203BD24 = 34; - gUnknown_0203BD26 = 0; - sub_817B1C8(data); - gMain.state += 1; + gIntroCredits_MovingSceneryVBase = 34; + gIntroCredits_MovingSceneryVOffset = 0; + LoadCreditsSceneGraphics(scene); + gMain.state++; break; case 2: if (gSaveBlock2Ptr->playerGender == MALE) { - LoadCompressedSpriteSheet(gUnknown_085F5334); - LoadCompressedSpriteSheet(gUnknown_085F53BC); - LoadCompressedSpriteSheet(gUnknown_085F5354); - LoadSpritePalettes(gUnknown_085F5384); - - spriteId = intro_create_brendan_sprite(120, 46); - gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; - gSprites[spriteId].callback = sub_8176EE8; - gSprites[spriteId].anims = gUnknown_085E6FD0; - - spriteId = intro_create_may_sprite(272, 46); - gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; - gSprites[spriteId].callback = sub_8176F90; - gSprites[spriteId].anims = gUnknown_085E7010; + LoadCompressedSpriteSheet(gSpriteSheet_CreditsBrendan); + LoadCompressedSpriteSheet(gSpriteSheet_CreditsRivalMay); + LoadCompressedSpriteSheet(gSpriteSheet_CreditsBicycle); + LoadSpritePalettes(gSpritePalettes_Credits); + + spriteId = CreateIntroBrendanSprite(120, 46); + gTasks[taskId].tPlayerSpriteId = spriteId; + gSprites[spriteId].callback = SpriteCB_Player; + gSprites[spriteId].anims = sAnims_Player; + + spriteId = CreateIntroMaySprite(DISPLAY_WIDTH + 32, 46); + gTasks[taskId].tRivalSpriteId = spriteId; + gSprites[spriteId].callback = SpriteCB_Rival; + gSprites[spriteId].anims = sAnims_Rival; } else { - LoadCompressedSpriteSheet(gUnknown_085F5344); - LoadCompressedSpriteSheet(gUnknown_085F53AC); - LoadCompressedSpriteSheet(gUnknown_085F5354); - LoadSpritePalettes(gUnknown_085F5384); - - spriteId = intro_create_may_sprite(120, 46); - gTasks[taskIdA].data[TDA_PLAYER_CYCLIST] = spriteId; - gSprites[spriteId].callback = sub_8176EE8; - gSprites[spriteId].anims = gUnknown_085E6FD0; - - spriteId = intro_create_brendan_sprite(272, 46); - gTasks[taskIdA].data[TDA_RIVAL_CYCLIST] = spriteId; - gSprites[spriteId].callback = sub_8176F90; - gSprites[spriteId].anims = gUnknown_085E7010; + LoadCompressedSpriteSheet(gSpriteSheet_CreditsMay); + LoadCompressedSpriteSheet(gSpriteSheet_CreditsRivalBrendan); + LoadCompressedSpriteSheet(gSpriteSheet_CreditsBicycle); + LoadSpritePalettes(gSpritePalettes_Credits); + + spriteId = CreateIntroMaySprite(120, 46); + gTasks[taskId].tPlayerSpriteId = spriteId; + gSprites[spriteId].callback = SpriteCB_Player; + gSprites[spriteId].anims = sAnims_Player; + + spriteId = CreateIntroBrendanSprite(DISPLAY_WIDTH + 32, 46); + gTasks[taskId].tRivalSpriteId = spriteId; + gSprites[spriteId].callback = SpriteCB_Rival; + gSprites[spriteId].anims = sAnims_Rival; }; - gMain.state += 1; + gMain.state++; break; case 3: - sub_817664C(data, taskIdA); - sub_817B3A8(data); + SetBikeScene(scene, taskId); + SetCreditsSceneBgCnt(scene); gMain.state = 0; return TRUE; } return FALSE; } -static void ResetCreditsTasks(u8 taskIdA) +static void ResetCreditsTasks(u8 taskId) { - if (gTasks[taskIdA].data[TDA_0] != 0) + // Destroy Task_BicycleBgAnimation, if running + if (gTasks[taskId].tTaskId_BgScenery != 0) { - DestroyTask(gTasks[taskIdA].data[TDA_0]); - gTasks[taskIdA].data[TDA_0] = 0; + DestroyTask(gTasks[taskId].tTaskId_BgScenery); + gTasks[taskId].tTaskId_BgScenery = 0; } - if (gTasks[taskIdA].data[TDA_TASK_C_ID] != 0) + // Destroy Task_BikeScene, if running + if (gTasks[taskId].tTaskId_BikeScene != 0) { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_C_ID]); - gTasks[taskIdA].data[TDA_TASK_C_ID] = 0; + DestroyTask(gTasks[taskId].tTaskId_BikeScene); + gTasks[taskId].tTaskId_BikeScene = 0; } - if (gTasks[taskIdA].data[TDA_TASK_E_ID] != 0) + // Destroy Task_CycleSceneryPalette, if running + if (gTasks[taskId].tTaskId_SceneryPal != 0) { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_E_ID]); - gTasks[taskIdA].data[TDA_TASK_E_ID] = 0; + DestroyTask(gTasks[taskId].tTaskId_SceneryPal); + gTasks[taskId].tTaskId_SceneryPal = 0; } - if (gTasks[taskIdA].data[TDA_TASK_D_ID] != 0) + // Destroy Task_ShowMons, if running + if (gTasks[taskId].tTaskId_ShowMons != 0) { - DestroyTask(gTasks[taskIdA].data[TDA_TASK_D_ID]); - gTasks[taskIdA].data[TDA_TASK_D_ID] = 0; + DestroyTask(gTasks[taskId].tTaskId_ShowMons); + gTasks[taskId].tTaskId_ShowMons = 0; } - gUnknown_0203BD28 = 1; + gIntroCredits_MovingSceneryState = INTROCRED_SCENERY_DESTROY; } -static void LoadTheEndScreen(u16 arg0, u16 arg1, u16 arg2) +static void LoadTheEndScreen(u16 arg0, u16 arg1, u16 palOffset) { u16 baseTile; u16 i; - LZ77UnCompVram(gCreditsCopyrightEnd_Gfx, (void *)(VRAM + arg0)); - LoadPalette(gIntroCopyright_Pal, arg2, sizeof(gIntroCopyright_Pal)); + LZ77UnCompVram(sCreditsCopyrightEnd_Gfx, (void *)(VRAM + arg0)); + LoadPalette(gIntroCopyright_Pal, palOffset, sizeof(gIntroCopyright_Pal)); - baseTile = (arg2 / 16) << 12; + baseTile = (palOffset / 16) << 12; for (i = 0; i < 32 * 32; i++) ((u16 *) (VRAM + arg1))[i] = baseTile + 1; } -static u16 sub_8176D78(u8 arg0) +static u16 GetLetterMapTile(u8 baseTiles) { - u16 out = (arg0 & 0x3F) + 80; + u16 out = (baseTiles & 0x3F) + 80; - if (arg0 == 0xFF) + if (baseTiles == 0xFF) return 1; - if (arg0 & (1 << 7)) + if (baseTiles & (1 << 7)) out |= 1 << 11; - if (arg0 & (1 << 6)) + if (baseTiles & (1 << 6)) out |= 1 << 10; return out; } -static void sub_8176DBC(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palette) +static void DrawLetterMapTiles(const u8 baseTiles[], u8 baseX, u8 baseY, u16 offset, u16 palette) { u8 y, x; const u16 tileOffset = (palette / 16) << 12; @@ -2075,35 +1322,37 @@ static void sub_8176DBC(const u8 arg0[], u8 baseX, u8 baseY, u16 arg3, u16 palet for (y = 0; y < 5; y++) { for (x = 0; x < 3; x++) - ((u16 *) (VRAM + arg3 + (baseY + y) * 64))[baseX + x] = tileOffset + sub_8176D78(arg0[y * 3 + x]); + ((u16 *) (VRAM + offset + (baseY + y) * 64))[baseX + x] = tileOffset + GetLetterMapTile(baseTiles[y * 3 + x]); } } -static void sub_8176E40(u16 arg0, u16 palette) +static void DrawTheEnd(u16 offset, u16 palette) { u16 pos; u16 baseTile = (palette / 16) << 12; for (pos = 0; pos < 32 * 32; pos++) - ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; - - sub_8176DBC(sTheEnd_LetterTMap, 3, 7, arg0, palette); - sub_8176DBC(sTheEnd_LetterHMap, 7, 7, arg0, palette); - sub_8176DBC(sTheEnd_LetterEMap, 11, 7, arg0, palette); - sub_8176DBC(sTheEnd_LetterEMap, 16, 7, arg0, palette); - sub_8176DBC(sTheEnd_LetterNMap, 20, 7, arg0, palette); - sub_8176DBC(sTheEnd_LetterDMap, 24, 7, arg0, palette); + ((u16 *) (VRAM + offset))[pos] = baseTile + 1; + + DrawLetterMapTiles(sTheEnd_LetterMap_T, 3, 7, offset, palette); + DrawLetterMapTiles(sTheEnd_LetterMap_H, 7, 7, offset, palette); + DrawLetterMapTiles(sTheEnd_LetterMap_E, 11, 7, offset, palette); + DrawLetterMapTiles(sTheEnd_LetterMap_E, 16, 7, offset, palette); + DrawLetterMapTiles(sTheEnd_LetterMap_N, 20, 7, offset, palette); + DrawLetterMapTiles(sTheEnd_LetterMap_D, 24, 7, offset, palette); } -static void sub_8176EE8(struct Sprite *sprite) +#define sState data[0] + +static void SpriteCB_Player(struct Sprite *sprite) { - if (gUnknown_0203BD28 != 0) + if (gIntroCredits_MovingSceneryState != INTROCRED_SCENERY_NORMAL) { DestroySprite(sprite); return; } - switch (sprite->data[0]) + switch (sprite->sState) { case 0: StartSpriteAnimIfDifferent(sprite, 0); @@ -2111,7 +1360,7 @@ static void sub_8176EE8(struct Sprite *sprite) case 1: StartSpriteAnimIfDifferent(sprite, 1); if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; + sprite->pos1.x--; break; case 2: StartSpriteAnimIfDifferent(sprite, 2); @@ -2122,25 +1371,25 @@ static void sub_8176EE8(struct Sprite *sprite) case 4: StartSpriteAnimIfDifferent(sprite, 0); if (sprite->pos1.x > 120) - sprite->pos1.x -= 1; + sprite->pos1.x--; break; case 5: StartSpriteAnimIfDifferent(sprite, 0); if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; + sprite->pos1.x--; break; } } -static void sub_8176F90(struct Sprite *sprite) +static void SpriteCB_Rival(struct Sprite *sprite) { - if (gUnknown_0203BD28 != 0) + if (gIntroCredits_MovingSceneryState != INTROCRED_SCENERY_NORMAL) { DestroySprite(sprite); return; } - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->pos2.y = 0; @@ -2153,64 +1402,67 @@ static void sub_8176F90(struct Sprite *sprite) StartSpriteAnimIfDifferent(sprite, 2); if (sprite->pos1.x > -32) sprite->pos1.x -= 2; - sprite->pos2.y = -gUnknown_0203BD26; + sprite->pos2.y = -gIntroCredits_MovingSceneryVOffset; break; case 2: - sprite->data[7] += 1; + sprite->data[7]++; StartSpriteAnimIfDifferent(sprite, 0); if ((sprite->data[7] & 3) == 0) - sprite->pos1.x += 1; + sprite->pos1.x++; break; case 3: StartSpriteAnimIfDifferent(sprite, 0); if (sprite->pos1.x > -32) - sprite->pos1.x -= 1; + sprite->pos1.x--; break; } } -static void sub_8177050(struct Sprite *sprite) +#define sPosition data[1] +#define sSpriteId data[6] + +static void SpriteCB_CreditsMon(struct Sprite *sprite) { - if (gUnknown_0203BD28) + if (gIntroCredits_MovingSceneryState != INTROCRED_SCENERY_NORMAL) { - FreeAndDestroyMonPicSprite(sprite->data[6]); + FreeAndDestroyMonPicSprite(sprite->sSpriteId); return; } - sprite->data[7] += 1; - switch (sprite->data[0]) + sprite->data[7]++; + switch (sprite->sState) { case 0: default: sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; - sprite->oam.matrixNum = sprite->data[1]; + sprite->oam.matrixNum = sprite->sPosition; sprite->data[2] = 16; - SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); + SetOamMatrix(sprite->sPosition, 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); sprite->invisible = FALSE; - sprite->data[0] = 1; + sprite->sState = 1; break; case 1: if (sprite->data[2] < 256) { sprite->data[2] += 8; - SetOamMatrix(sprite->data[1], 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); + SetOamMatrix(sprite->sPosition, 0x10000 / sprite->data[2], 0, 0, 0x10000 / sprite->data[2]); } else { - sprite->data[0] += 1; + sprite->sState++; } - switch (sprite->data[1]) + switch (sprite->sPosition) { - case 1: + case POS_LEFT + 1: if ((sprite->data[7] & 3) == 0) - sprite->pos1.y += 1; + sprite->pos1.y++; sprite->pos1.x -= 2; break; - case 2: + case POS_CENTER + 1: break; - case 3: + case POS_RIGHT + 1: if ((sprite->data[7] & 3) == 0) - sprite->pos1.y += 1; + sprite->pos1.y++; sprite->pos1.x += 2; break; } @@ -2218,7 +1470,7 @@ static void sub_8177050(struct Sprite *sprite) case 2: if (sprite->data[3] != 0) { - sprite->data[3] -= 1; + sprite->data[3]--; } else { @@ -2226,7 +1478,7 @@ static void sub_8177050(struct Sprite *sprite) SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); sprite->oam.objMode = ST_OAM_OBJ_BLEND; sprite->data[3] = 16; - sprite->data[0] += 1; + sprite->sState++; } break; case 3: @@ -2234,7 +1486,7 @@ static void sub_8177050(struct Sprite *sprite) { int data3; - sprite->data[3] -= 1; + sprite->data[3]--; data3 = 16 - sprite->data[3]; SetGpuReg(REG_OFFSET_BLDALPHA, (data3 << 8) + sprite->data[3]); @@ -2242,11 +1494,11 @@ static void sub_8177050(struct Sprite *sprite) else { sprite->invisible = TRUE; - sprite->data[0] = 9; + sprite->sState = 9; } break; case 9: - sprite->data[0] += 1; + sprite->sState++; break; case 10: SetGpuReg(REG_OFFSET_BLDCNT, 0); @@ -2256,40 +1508,44 @@ static void sub_8177050(struct Sprite *sprite) } } -static u8 MakeMonSprite(u16 nationalDexNum, s16 x, s16 y, u16 position) +#define sMonSpriteId data[0] + +static u8 CreateCreditsMonSprite(u16 nationalDexNum, s16 x, s16 y, u16 position) { - u8 spriteId; - u8 spriteId2; + u8 monSpriteId; + u8 bgSpriteId; - spriteId = CreateMonSpriteFromNationalDexNumber(nationalDexNum, x, y, position); - gSprites[spriteId].oam.priority = 1; - gSprites[spriteId].data[1] = position + 1; - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].callback = sub_8177050; - gSprites[spriteId].data[6] = spriteId; + monSpriteId = CreateMonSpriteFromNationalDexNumber(nationalDexNum, x, y, position); + gSprites[monSpriteId].oam.priority = 1; + gSprites[monSpriteId].sPosition = position + 1; + gSprites[monSpriteId].invisible = TRUE; + gSprites[monSpriteId].callback = SpriteCB_CreditsMon; + gSprites[monSpriteId].sSpriteId = monSpriteId; - spriteId2 = CreateSprite(&gUnknown_085E7068, gSprites[spriteId].pos1.x, gSprites[spriteId].pos1.y, 1); - gSprites[spriteId2].data[0] = spriteId; + bgSpriteId = CreateSprite(&sSpriteTemplate_CreditsMonBg, gSprites[monSpriteId].pos1.x, gSprites[monSpriteId].pos1.y, 1); + gSprites[bgSpriteId].sMonSpriteId = monSpriteId; - StartSpriteAnimIfDifferent(&gSprites[spriteId2], position); + StartSpriteAnimIfDifferent(&gSprites[bgSpriteId], position); - return spriteId; + return monSpriteId; } -static void sub_81772B8(struct Sprite *sprite) +static void SpriteCB_CreditsMonBg(struct Sprite *sprite) { - if (gSprites[sprite->data[0]].data[0] == 10 || gUnknown_0203BD28) + if (gSprites[sprite->sMonSpriteId].data[0] == 10 + || gIntroCredits_MovingSceneryState != INTROCRED_SCENERY_NORMAL) { DestroySprite(sprite); return; } - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->oam.objMode = gSprites[sprite->data[0]].oam.objMode; - sprite->oam.affineMode = gSprites[sprite->data[0]].oam.affineMode; - sprite->oam.matrixNum = gSprites[sprite->data[0]].oam.matrixNum; - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + // Copy sprite data from the associated Pokémon + sprite->invisible = gSprites[sprite->sMonSpriteId].invisible; + sprite->oam.objMode = gSprites[sprite->sMonSpriteId].oam.objMode; + sprite->oam.affineMode = gSprites[sprite->sMonSpriteId].oam.affineMode; + sprite->oam.matrixNum = gSprites[sprite->sMonSpriteId].oam.matrixNum; + sprite->pos1.x = gSprites[sprite->sMonSpriteId].pos1.x; + sprite->pos1.y = gSprites[sprite->sMonSpriteId].pos1.y; } static void DeterminePokemonToShow(void) @@ -2312,7 +1568,7 @@ static void DeterminePokemonToShow(void) // Fill the rest of the array with zeroes for (dexNum = j; dexNum < NATIONAL_DEX_COUNT; dexNum++) - sCreditsData->caughtMonIds[dexNum] = 0; + sCreditsData->caughtMonIds[dexNum] = NATIONAL_DEX_NONE; // Cap the number of pokemon we care about to NUM_MON_SLIDES, the max we show in the credits scene (-1 for the starter) sCreditsData->numCaughtMon = j; @@ -2354,7 +1610,7 @@ static void DeterminePokemonToShow(void) page = 0; } // Ensure the last pokemon is our starter - sCreditsData->monToShow[NUM_MON_SLIDES-1] = starter; + sCreditsData->monToShow[NUM_MON_SLIDES - 1] = starter; } else { @@ -2365,12 +1621,12 @@ static void DeterminePokemonToShow(void) if (dexNum < sCreditsData->numMonToShow - 1) { sCreditsData->monToShow[dexNum] = sCreditsData->monToShow[NUM_MON_SLIDES-1]; - sCreditsData->monToShow[NUM_MON_SLIDES-1] = starter; + sCreditsData->monToShow[NUM_MON_SLIDES - 1] = starter; } else { // Ensure the last pokemon is our starter - sCreditsData->monToShow[NUM_MON_SLIDES-1] = starter; + sCreditsData->monToShow[NUM_MON_SLIDES - 1] = starter; } } sCreditsData->numMonToShow = NUM_MON_SLIDES; diff --git a/src/crt0.s b/src/crt0.s index 49f214f80..385e340a5 100644 --- a/src/crt0.s +++ b/src/crt0.s @@ -1,3 +1,4 @@ +#include "constants/global.h" .include "constants/gba_constants.inc" .syntax unified @@ -34,8 +35,8 @@ GPIOPortReadEnable: @ 80000C8 @ 80000CC .space 0x34 - .4byte 3 - .4byte 2 + .4byte GAME_VERSION + .4byte GAME_LANGUAGE .ascii "pokemon emerald version" .space 9 @@ -51,17 +52,33 @@ GPIOPortReadEnable: @ 80000C8 .4byte gMoveNames .4byte gDecorations - .4byte 0x00001270, 0x0000139c, 0x00000018, 0x00000988 - .4byte 0x00003b24, 0x00000046, 0x000008e4, 0x000008ac - .4byte 0x00000182 + .4byte 0x00001270 @ offsetof(struct SaveBlock1, flags) + .4byte 0x0000139c @ offsetof(struct SaveBlock1, vars) + .4byte 0x00000018 @ offsetof(struct SaveBlock2, pokedex) + .4byte 0x00000988 @ offsetof(struct SaveBlock1, seen1) + .4byte 0x00003b24 @ offsetof(struct SaveBlock1, seen2) + .4byte 0x00000046 @ ? + .4byte 0x000008e4 @ ? + .4byte 0x000008ac @ ? + .4byte 0x00000182 @ NATIONAL_DEX_COUNT? .byte 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x06, 0x0c .byte 0x06, 0x10, 0x12, 0x0c, 0x0f, 0x0b, 0x01, 0x08 - .4byte 0x0000000c, 0x00000f2c, 0x00003d88, 0x00000234 - .4byte 0x00000238, 0x00000009, 0x0000000a, 0x00000000 - .4byte 0x00000008, 0x00000ca8, 0x00000ca8, 0x000031c7 - .4byte 0x000031b3, 0x00000000 + .4byte 0x0000000c @ ? + .4byte 0x00000f2c @ sizeof(struct SaveBlock2) + .4byte 0x00003d88 @ sizeof(struct SaveBlock1) + .4byte 0x00000234 @ offsetof(struct SaveBlock1, playerPartyCount) + .4byte 0x00000238 @ offsetof(struct SaveBlock1, playerParty) + .4byte 0x00000009 @ offsetof(struct SaveBlock2, specialSaveWarpFlags) + .4byte 0x0000000a @ offsetof(struct SaveBlock2, playerTrainerId) + .4byte 0x00000000 @ offsetof(struct SaveBlock2, playerName) + .4byte 0x00000008 @ offsetof(struct SaveBlock2, playerGender) + .4byte 0x00000ca8 @ offsetof(struct SaveBlock2, frontier.challengeStatus) + .4byte 0x00000ca8 @ offsetof(struct SaveBlock2, frontier.challengeStatus) + .4byte 0x000031c7 @ offsetof(struct SaveBlock1, externalEventFlags) + .4byte 0x000031b3 @ offsetof(struct SaveBlock1, externalEventData) + .4byte 0x00000000 .4byte gBaseStats .4byte gAbilityNames @@ -71,12 +88,19 @@ GPIOPortReadEnable: @ 80000C8 .4byte gBallSpriteSheets .4byte gBallSpritePalettes - .4byte 0x000000a8, 0x00000864, 0x0000089b + .4byte 0x000000a8 @ offsetof(struct SaveBlock2, gcnLinkFlags) + .4byte 0x00000864 @ ? + .4byte 0x0000089b @ ? .byte 0x1e, 0x1e, 0x10, 0x40 - .4byte 0x0000322e, 0x00000498, 0x000031a8, 0x000031f8 - .4byte 0x00000034, 0x00000000, 0x00000000 + .4byte 0x0000322e @ offsetof(struct SaveBlock1, ? part-way into unk_322C) + .4byte 0x00000498 @ offsetof(struct SaveBlock1, pcItems) + .4byte 0x000031a8 @ offsetof(struct SaveBlock1, giftRibbons) + .4byte 0x000031f8 @ offsetof(struct SaveBlock1, enigmaBerry) + .4byte 0x00000034 @ offsetof(struct SaveBlock1, mapView) + .4byte 0x00000000 + .4byte 0x00000000 .arm .align 2, 0 diff --git a/src/data.c b/src/data.c index 4861da18b..5856d17b8 100644 --- a/src/data.c +++ b/src/data.c @@ -8,41 +8,42 @@ #include "constants/trainers.h" #include "constants/battle_ai.h" -const u16 gUnknown_082FF1D8[] = INCBIN_U16("graphics/link/minigame_digits.gbapal"); -const u32 gUnknown_082FF1F8[] = INCBIN_U32("graphics/link/minigame_digits.4bpp.lz"); -// unused -const u32 gUnknown_082FF2B8[] = INCBIN_U32("graphics/link/minigame_digits2.4bpp.lz"); +const u16 gMinigameDigits_Pal[] = INCBIN_U16("graphics/link/minigame_digits.gbapal"); +const u32 gMinigameDigits_Gfx[] = INCBIN_U32("graphics/link/minigame_digits.4bpp.lz"); +static const u32 sMinigameDigitsThin_Gfx[] = INCBIN_U32("graphics/link/minigame_digits2.4bpp.lz"); // Unused -const struct SpriteFrameImage gUnknown_082FF3A8[] = +#define BATTLER_OFFSET(i) (gHeap + 0x8000 + MON_PIC_SIZE * (i)) + +const struct SpriteFrameImage gBattlerPicTable_PlayerLeft[] = { - gHeap + 0x8000, 0x800, - gHeap + 0x8800, 0x800, - gHeap + 0x9000, 0x800, - gHeap + 0x9800, 0x800, + BATTLER_OFFSET(0), MON_PIC_SIZE, + BATTLER_OFFSET(1), MON_PIC_SIZE, + BATTLER_OFFSET(2), MON_PIC_SIZE, + BATTLER_OFFSET(3), MON_PIC_SIZE, }; -const struct SpriteFrameImage gUnknown_082FF3C8[] = +const struct SpriteFrameImage gBattlerPicTable_OpponentLeft[] = { - gHeap + 0xA000, 0x800, - gHeap + 0xA800, 0x800, - gHeap + 0xB000, 0x800, - gHeap + 0xB800, 0x800, + BATTLER_OFFSET(4), MON_PIC_SIZE, + BATTLER_OFFSET(5), MON_PIC_SIZE, + BATTLER_OFFSET(6), MON_PIC_SIZE, + BATTLER_OFFSET(7), MON_PIC_SIZE, }; -const struct SpriteFrameImage gUnknown_082FF3E8[] = +const struct SpriteFrameImage gBattlerPicTable_PlayerRight[] = { - gHeap + 0xC000, 0x800, - gHeap + 0xC800, 0x800, - gHeap + 0xD000, 0x800, - gHeap + 0xD800, 0x800, + BATTLER_OFFSET(8), MON_PIC_SIZE, + BATTLER_OFFSET(9), MON_PIC_SIZE, + BATTLER_OFFSET(10), MON_PIC_SIZE, + BATTLER_OFFSET(11), MON_PIC_SIZE, }; -const struct SpriteFrameImage gUnknown_082FF408[] = +const struct SpriteFrameImage gBattlerPicTable_OpponentRight[] = { - gHeap + 0xE000, 0x800, - gHeap + 0xE800, 0x800, - gHeap + 0xF000, 0x800, - gHeap + 0xF800, 0x800, + BATTLER_OFFSET(12), MON_PIC_SIZE, + BATTLER_OFFSET(13), MON_PIC_SIZE, + BATTLER_OFFSET(14), MON_PIC_SIZE, + BATTLER_OFFSET(15), MON_PIC_SIZE, }; const struct SpriteFrameImage gTrainerBackPicTable_Brendan[] = @@ -123,175 +124,181 @@ static const union AnimCmd sAnim_GeneralFrame3[] = ANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF548[] = +// Many of these affine anims seem to go unused, and +// instead SetSpriteRotScale is used to manipulate +// the battler sprites directly (for instance, in AnimTask_SwitchOutShrinkMon). +// Those with explicit indexes are referenced elsewhere. + +static const union AffineAnimCmd sAffineAnim_Battler_Normal[] = { - AFFINEANIMCMD_FRAME(0x0100, 0x0100, 0x00, 0x00), + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF558[] = +static const union AffineAnimCmd sAffineAnim_Battler_Flipped[] = { - AFFINEANIMCMD_FRAME(0xff00, 0x0100, 0x00, 0x00), + AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF568[] = +static const union AffineAnimCmd sAffineAnim_Battler_Emerge[] = { - AFFINEANIMCMD_FRAME(0x0028, 0x0028, 0x00, 0x00), - AFFINEANIMCMD_FRAME(0x0012, 0x0012, 0x00, 0x0c), + AFFINEANIMCMD_FRAME(0x28, 0x28, 0, 0), + AFFINEANIMCMD_FRAME(0x12, 0x12, 0, 12), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF580[] = +static const union AffineAnimCmd sAffineAnim_Battler_Return[] = { - AFFINEANIMCMD_FRAME(0xfffe, 0xfffe, 0x00, 0x12), - AFFINEANIMCMD_FRAME(0xfff0, 0xfff0, 0x00, 0x0f), + AFFINEANIMCMD_FRAME( -0x2, -0x2, 0, 18), + AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 15), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF598[] = +static const union AffineAnimCmd sAffineAnim_Battler_HorizontalSquishLoop[] = { - AFFINEANIMCMD_FRAME(0x00a0, 0x0100, 0x00, 0x00), - AFFINEANIMCMD_FRAME(0x0004, 0x0000, 0x00, 0x08), - AFFINEANIMCMD_FRAME(0xfffc, 0x0000, 0x00, 0x08), + AFFINEANIMCMD_FRAME(0xA0, 0x100, 0, 0), + AFFINEANIMCMD_FRAME( 0x4, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(-0x4, 0x0, 0, 8), AFFINEANIMCMD_JUMP(1), }; -static const union AffineAnimCmd gUnknown_082FF5B8[] = +static const union AffineAnimCmd sAffineAnim_Battler_Grow[] = { - AFFINEANIMCMD_FRAME(0x0002, 0x0002, 0x00, 0x14), + AFFINEANIMCMD_FRAME(0x2, 0x2, 0, 20), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF5C8[] = +static const union AffineAnimCmd sAffineAnim_Battler_Shrink[] = { - AFFINEANIMCMD_FRAME(0xfffe, 0xfffe, 0x00, 0x14), + AFFINEANIMCMD_FRAME(-0x2, -0x2, 0, 20), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF5D8[] = +static const union AffineAnimCmd sAffineAnim_Battler_BigToSmall[] = { - AFFINEANIMCMD_FRAME(0x0100, 0x0100, 0x00, 0000), - AFFINEANIMCMD_FRAME(0xfff0, 0xfff0, 0x00, 0x09), + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 9), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF5F0[] = +static const union AffineAnimCmd sAffineAnim_Battler_GrowLarge[] = { - AFFINEANIMCMD_FRAME(0x0004, 0x0004, 0x00, 0x3f), + AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 63), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF600[] = +static const union AffineAnimCmd sAffineAnim_Battler_TipRight[] = { - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0xfd, 0x05), - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x03, 0x05), + AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5), + AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 5), AFFINEANIMCMD_END, }; -const union AffineAnimCmd *const gUnknown_082FF618[] = +const union AffineAnimCmd *const gAffineAnims_BattleSpritePlayerSide[] = { - gUnknown_082FF548, - gUnknown_082FF568, - gUnknown_082FF580, - gUnknown_082FF598, - gUnknown_082FF5B8, - gUnknown_082FF5C8, - gUnknown_082FF5F0, - gUnknown_082FF600, - gUnknown_082FF5D8, + [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal, + [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge, + [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return, + sAffineAnim_Battler_HorizontalSquishLoop, + sAffineAnim_Battler_Grow, + sAffineAnim_Battler_Shrink, + sAffineAnim_Battler_GrowLarge, + sAffineAnim_Battler_TipRight, + sAffineAnim_Battler_BigToSmall, }; -static const union AffineAnimCmd gUnknown_082FF63C[] = +static const union AffineAnimCmd sAffineAnim_Battler_SpinShrink[] = { - AFFINEANIMCMD_FRAME(0xfffc, 0xfffc, 0x04, 0x3f), + AFFINEANIMCMD_FRAME(-0x4, -0x4, 4, 63), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF64C[] = +static const union AffineAnimCmd sAffineAnim_Battler_TipLeft[] = { - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x03, 0x05), - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0xfd, 0x05), + AFFINEANIMCMD_FRAME(0x0, 0x0, 3, 5), + AFFINEANIMCMD_FRAME(0x0, 0x0, -3, 5), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF664[] = +static const union AffineAnimCmd sAffineAnim_Battler_RotateUpAndBack[] = { - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0xfb, 0x14), - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x00, 0x14), - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x05, 0x14), + AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 20), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 20), + AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 20), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_082FF684[] = +static const union AffineAnimCmd sAffineAnim_Battler_Spin[] = { - AFFINEANIMCMD_FRAME(0x0000, 0x0000, 0x09, 0x6e), + AFFINEANIMCMD_FRAME(0x0, 0x0, 9, 110), AFFINEANIMCMD_END, }; -const union AffineAnimCmd *const gUnknown_082FF694[] = +const union AffineAnimCmd *const gAffineAnims_BattleSpriteOpponentSide[] = { - gUnknown_082FF548, - gUnknown_082FF568, - gUnknown_082FF580, - gUnknown_082FF598, - gUnknown_082FF5B8, - gUnknown_082FF5C8, - gUnknown_082FF63C, - gUnknown_082FF64C, - gUnknown_082FF664, - gUnknown_082FF5D8, - gUnknown_082FF684, + [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Normal, + [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge, + [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return, + sAffineAnim_Battler_HorizontalSquishLoop, + sAffineAnim_Battler_Grow, + sAffineAnim_Battler_Shrink, + sAffineAnim_Battler_SpinShrink, + sAffineAnim_Battler_TipLeft, + sAffineAnim_Battler_RotateUpAndBack, + sAffineAnim_Battler_BigToSmall, + sAffineAnim_Battler_Spin, }; -const union AffineAnimCmd *const gUnknown_082FF6C0[] = +const union AffineAnimCmd *const gAffineAnims_BattleSpriteContest[] = { - gUnknown_082FF558, - gUnknown_082FF568, - gUnknown_082FF580, - gUnknown_082FF598, - gUnknown_082FF5B8, - gUnknown_082FF5C8, - gUnknown_082FF63C, - gUnknown_082FF64C, - gUnknown_082FF664, - gUnknown_082FF5D8, - gUnknown_082FF684, + [BATTLER_AFFINE_NORMAL] = sAffineAnim_Battler_Flipped, + [BATTLER_AFFINE_EMERGE] = sAffineAnim_Battler_Emerge, + [BATTLER_AFFINE_RETURN] = sAffineAnim_Battler_Return, + sAffineAnim_Battler_HorizontalSquishLoop, + sAffineAnim_Battler_Grow, + sAffineAnim_Battler_Shrink, + sAffineAnim_Battler_SpinShrink, + sAffineAnim_Battler_TipLeft, + sAffineAnim_Battler_RotateUpAndBack, + sAffineAnim_Battler_BigToSmall, + sAffineAnim_Battler_Spin, }; -static const union AnimCmd gUnknown_082FF6EC[] = + +static const union AnimCmd sAnim_MonPic_0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; -static const union AnimCmd gUnknown_082FF6F4[] = +static const union AnimCmd sAnim_MonPic_1[] = { ANIMCMD_FRAME(1, 0), ANIMCMD_END, }; -static const union AnimCmd gUnknown_082FF6FC[] = +static const union AnimCmd sAnim_MonPic_2[] = { ANIMCMD_FRAME(2, 0), ANIMCMD_END, }; -static const union AnimCmd gUnknown_082FF704[] = +static const union AnimCmd sAnim_MonPic_3[] = { ANIMCMD_FRAME(3, 0), ANIMCMD_END, }; -const union AnimCmd *const gUnknown_082FF70C[] = +const union AnimCmd *const gAnims_MonPic[] = { - gUnknown_082FF6EC, - gUnknown_082FF6F4, - gUnknown_082FF6FC, - gUnknown_082FF704, + sAnim_MonPic_0, + sAnim_MonPic_1, + sAnim_MonPic_2, + sAnim_MonPic_3, }; -#define SPECIES_SPRITE(species, sprite) [SPECIES_##species] = {sprite, 0x800, SPECIES_##species} +#define SPECIES_SPRITE(species, sprite) [SPECIES_##species] = {sprite, MON_PIC_SIZE, SPECIES_##species} #define SPECIES_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species} #define SPECIES_SHINY_PAL(species, pal) [SPECIES_##species] = {pal, SPECIES_##species + SPECIES_SHINY_TAG} @@ -312,121 +319,7 @@ const union AnimCmd *const gUnknown_082FF70C[] = #include "data/pokemon_graphics/enemy_mon_elevation.h" #include "data/pokemon_graphics/front_pic_anims.h" #include "data/pokemon_graphics/front_pic_table.h" - -// unused -const u32 gUnknown830AF4C[] = -{ - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000088, 0x00000888, 0x00000888, 0x00000886, - 0x00000888, 0x00000886, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000886, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000886, 0x00000886, - 0x00000888, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000888, 0x00000886, 0x00000888, - 0x00000888, 0x00000888, 0x00000886, 0x00000886, - 0x00000888, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000886, 0x00000886, 0x00000088, - 0x00000886, 0x00000886, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000886, 0x00000888, 0x00000088, 0x00000088, - 0x00000888, 0x00000888, 0x00000888, 0x00000886, - 0x00000888, 0x00000888, 0x00000888, 0x00000886, - 0x00000886, 0x00000886, 0x00000886, 0x00000886, - 0x00000886, 0x00000886, 0x00000888, 0x00000888, - 0x00000886, 0x00000886, 0x00000886, 0x00000886, - 0x00000886, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000886, 0x00000886, 0x00000888, - 0x00000886, 0x00000886, 0x00000888, 0x00000888, - 0x00000088, 0x00000088, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000886, 0x00000886, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000088, 0x00000886, - 0x00000888, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000888, 0x00000886, 0x00000888, - 0x00000088, 0x00000088, 0x00000886, 0x00000886, - 0x00000088, 0x00000088, 0x00000888, 0x00000886, - 0x00000886, 0x00000888, 0x00000888, 0x00000088, - 0x00000888, 0x00000886, 0x00000886, 0x00000888, - 0x00000886, 0x00000888, 0x00000888, 0x00000886, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000088, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000088, 0x00000888, 0x00000888, 0x00000886, - 0x00000886, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000886, - 0x00000888, 0x00000886, 0x00000088, 0x00000088, - 0x00000088, 0x00000888, 0x00000088, 0x00000888, - 0x00000888, 0x00000088, 0x00000088, 0x00000888, - 0x00000886, 0x00000888, 0x00000886, 0x00000886, - 0x00000886, 0x00000888, 0x00000888, 0x00000888, - 0x00000088, 0x00000888, 0x00000888, 0x00000888, - 0x00000088, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000088, 0x00000088, - 0x00000886, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000088, 0x00000888, - 0x00000886, 0x00000888, 0x00000088, 0x00000088, - 0x00000888, 0x00000888, 0x00000088, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000088, - 0x00000888, 0x00000888, 0x00000088, 0x00000088, - 0x00000088, 0x00000888, 0x00000088, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000886, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000886, 0x00000886, 0x00000886, - 0x00000088, 0x00000088, 0x00000088, 0x00000886, - 0x00000088, 0x00000886, 0x00000886, 0x00000886, - 0x00000088, 0x00000886, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000886, - 0x00000886, 0x00000886, 0x00000888, 0x00000888, - 0x00000886, 0x00000886, 0x00000886, 0x00000886, - 0x00000088, 0x00000088, 0x00000886, 0x00000886, - 0x00001882, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000886, 0x00000886, 0x00000886, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000886, 0x00000088, 0x00000886, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000886, 0x00000886, - 0x00000088, 0x00000088, 0x00000088, 0x00000886, - 0x00000886, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000886, 0x00000088, - 0x00000088, 0x00000886, 0x00000886, 0x00000886, - 0x00000886, 0x00000886, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000886, - 0x00000886, 0x00000886, 0x00000886, 0x00000088, - 0x00000886, 0x00000088, 0x00000886, 0x00000886, - 0x00000886, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000886, 0x00000886, - 0x00000886, 0x00000888, 0x00000886, 0x00000886, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000886, 0x00000886, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000088, 0x00000088, 0x00000088, - 0x00000088, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, - 0x00000888, 0x00000888, 0x00000888, 0x00000888, -}; +#include "data/pokemon_graphics/unknown_table.h" #include "data/trainer_parties.h" #include "data/text/trainer_class_names.h" diff --git a/src/data/bard_music/bard_sounds.h b/src/data/bard_music/bard_sounds.h index 4a0911726..1dd5c7f56 100644 --- a/src/data/bard_music/bard_sounds.h +++ b/src/data/bard_music/bard_sounds.h @@ -24,29 +24,29 @@ #include "events.h" #include "trendysaying.h" -const struct BardSound (*const gBardSoundsTable[])[6] = { - NULL, - gBardSounds_Trainer, - gBardSounds_Status, - gBardSounds_Battle, - gBardSounds_Greetings, - gBardSounds_People, - gBardSounds_Voices, - gBardSounds_Speech, - gBardSounds_Endings, - gBardSounds_Feelings, - gBardSounds_Conditions, - gBardSounds_Actions, - gBardSounds_Lifestyle, - gBardSounds_Hobbies, - gBardSounds_Time, - gBardSounds_Misc, - gBardSounds_Adjectives, - gBardSounds_Events, - NULL, - NULL, - gBardSounds_TrendySaying, - NULL +const struct BardSound (*const gBardSoundsTable[EC_NUM_GROUPS])[6] = { + [EC_GROUP_POKEMON] = NULL, // Handled by gBardSounds_Pokemon + [EC_GROUP_TRAINER] = gBardSounds_Trainer, + [EC_GROUP_STATUS] = gBardSounds_Status, + [EC_GROUP_BATTLE] = gBardSounds_Battle, + [EC_GROUP_GREETINGS] = gBardSounds_Greetings, + [EC_GROUP_PEOPLE] = gBardSounds_People, + [EC_GROUP_VOICES] = gBardSounds_Voices, + [EC_GROUP_SPEECH] = gBardSounds_Speech, + [EC_GROUP_ENDINGS] = gBardSounds_Endings, + [EC_GROUP_FEELINGS] = gBardSounds_Feelings, + [EC_GROUP_CONDITIONS] = gBardSounds_Conditions, + [EC_GROUP_ACTIONS] = gBardSounds_Actions, + [EC_GROUP_LIFESTYLE] = gBardSounds_Lifestyle, + [EC_GROUP_HOBBIES] = gBardSounds_Hobbies, + [EC_GROUP_TIME] = gBardSounds_Time, + [EC_GROUP_MISC] = gBardSounds_Misc, + [EC_GROUP_ADJECTIVES] = gBardSounds_Adjectives, + [EC_GROUP_EVENTS] = gBardSounds_Events, + [EC_GROUP_MOVE_1] = NULL, // Handled by gBardSounds_Moves + [EC_GROUP_MOVE_2] = NULL, // Handled by gBardSounds_Moves + [EC_GROUP_TRENDY_SAYING] = gBardSounds_TrendySaying, + [EC_GROUP_POKEMON_NATIONAL] = NULL // Handled by gBardSounds_Pokemon }; #endif //GUARD_BARD_SOUNDS_TABLE_H diff --git a/src/data/bard_music/moves.h b/src/data/bard_music/moves.h index 6bb350a7c..06cc68d53 100644 --- a/src/data/bard_music/moves.h +++ b/src/data/bard_music/moves.h @@ -1,12 +1,12 @@ #ifndef GUARD_DATA_BARD_MUSIC_MOVES_H #define GUARD_DATA_BARD_MUSIC_MOVES_H -#include "moves.h" +#include "constants/moves.h" -const u16 gUnknown_085FA1D4 = 0x163; +const u16 gNumBardWords_Moves = MOVES_COUNT; -const struct BardSound gBardSounds_Moves[][6] = { - { +const struct BardSound gBardSounds_Moves[MOVES_COUNT][6] = { + [MOVE_NONE] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -14,7 +14,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POUND] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -22,7 +22,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_KARATE_CHOP] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, @@ -30,7 +30,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DOUBLE_SLAP] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0xa, 0x0, 0x0, 0x0, 0x0}, { 0x2, 0x0, 0x0, 0x0, 0x0}, @@ -38,7 +38,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_COMET_PUNCH] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -46,7 +46,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEGA_PUNCH] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -54,7 +54,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PAY_DAY] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -62,7 +62,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FIRE_PUNCH] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -70,7 +70,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ICE_PUNCH] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, @@ -78,7 +78,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THUNDER_PUNCH] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -86,7 +86,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SCRATCH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -94,7 +94,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_VICE_GRIP] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -102,7 +102,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GUILLOTINE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, @@ -110,7 +110,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RAZOR_WIND] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -118,7 +118,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SWORDS_DANCE] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1, 0x0, 0x0, 0x0, 0x0}, @@ -126,7 +126,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CUT] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -134,7 +134,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GUST] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -142,7 +142,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WING_ATTACK] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -150,7 +150,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WHIRLWIND] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, @@ -158,7 +158,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FLY] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -166,7 +166,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BIND] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -174,7 +174,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLAM] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -182,7 +182,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_VINE_WHIP] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -190,7 +190,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STOMP] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -198,7 +198,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DOUBLE_KICK] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -206,7 +206,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEGA_KICK] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -214,7 +214,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_JUMP_KICK] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -222,7 +222,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROLLING_KICK] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -230,7 +230,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SAND_ATTACK] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -238,7 +238,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HEADBUTT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -246,7 +246,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HORN_ATTACK] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -254,7 +254,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FURY_ATTACK] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -262,7 +262,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HORN_DRILL] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -270,7 +270,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TACKLE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -278,7 +278,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BODY_SLAM] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2, 0x0, 0x0, 0x0, 0x0}, @@ -286,7 +286,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WRAP] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -294,7 +294,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TAKE_DOWN] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x23, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -302,7 +302,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THRASH] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -310,7 +310,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DOUBLE_EDGE] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0xa, 0x0, 0x0, 0x0, 0x0}, @@ -318,7 +318,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TAIL_WHIP] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -326,7 +326,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POISON_STING] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, @@ -334,7 +334,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TWINEEDLE] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -342,7 +342,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PIN_MISSILE] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -350,7 +350,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LEER] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -358,7 +358,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BITE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -366,7 +366,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GROWL] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -374,7 +374,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROAR] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -382,7 +382,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SING] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -390,7 +390,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SUPERSONIC] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -398,7 +398,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SONIC_BOOM] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -406,7 +406,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DISABLE] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -414,7 +414,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ACID] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -422,7 +422,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_EMBER] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -430,7 +430,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FLAMETHROWER] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -438,7 +438,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MIST] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -446,7 +446,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WATER_GUN] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -454,7 +454,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HYDRO_PUMP] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -462,7 +462,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SURF] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -470,7 +470,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ICE_BEAM] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -478,7 +478,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BLIZZARD] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -486,7 +486,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PSYBEAM] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -494,7 +494,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BUBBLE_BEAM] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -502,7 +502,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_AURORA_BEAM] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -510,7 +510,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_HYPER_BEAM] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -518,7 +518,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PECK] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -526,7 +526,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DRILL_PECK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -534,7 +534,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SUBMISSION] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, @@ -542,7 +542,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LOW_KICK] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -550,7 +550,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_COUNTER] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -558,7 +558,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SEISMIC_TOSS] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -566,7 +566,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STRENGTH] = { { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -574,7 +574,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ABSORB] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -582,7 +582,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEGA_DRAIN] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -590,7 +590,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LEECH_SEED] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -598,7 +598,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GROWTH] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -606,7 +606,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RAZOR_LEAF] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -614,7 +614,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SOLAR_BEAM] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -622,7 +622,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POISON_POWDER] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -630,7 +630,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STUN_SPORE] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -638,7 +638,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLEEP_POWDER] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -646,7 +646,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PETAL_DANCE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2, 0x0, 0x0, 0x0, 0x0}, @@ -654,7 +654,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STRING_SHOT] = { { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -662,7 +662,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DRAGON_RAGE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, @@ -670,7 +670,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_FIRE_SPIN] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -678,7 +678,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THUNDER_SHOCK] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -686,7 +686,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THUNDERBOLT] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -694,7 +694,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THUNDER_WAVE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, @@ -702,7 +702,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THUNDER] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -710,7 +710,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROCK_THROW] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -718,7 +718,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_EARTHQUAKE] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -726,7 +726,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FISSURE] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -734,7 +734,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DIG] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -742,7 +742,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TOXIC] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -750,7 +750,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CONFUSION] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x29, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -758,7 +758,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PSYCHIC] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -766,7 +766,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HYPNOSIS] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -774,7 +774,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEDITATE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -782,7 +782,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_AGILITY] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -790,7 +790,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_QUICK_ATTACK] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -798,7 +798,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RAGE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -806,7 +806,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TELEPORT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -814,7 +814,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_NIGHT_SHADE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -822,7 +822,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MIMIC] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -830,7 +830,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SCREECH] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xd, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -838,7 +838,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DOUBLE_TEAM] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -846,7 +846,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RECOVER] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -854,7 +854,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HARDEN] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -862,7 +862,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MINIMIZE] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -870,7 +870,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SMOKESCREEN] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -878,7 +878,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CONFUSE_RAY] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x2d, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -886,7 +886,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WITHDRAW] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -894,7 +894,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DEFENSE_CURL] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, @@ -902,7 +902,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BARRIER] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -910,7 +910,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LIGHT_SCREEN] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -918,7 +918,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HAZE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -926,7 +926,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_REFLECT] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -934,7 +934,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FOCUS_ENERGY] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, @@ -942,7 +942,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_BIDE] = { { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -950,7 +950,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_METRONOME] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -958,7 +958,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MIRROR_MOVE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x29, 0x0, 0x0, 0x0, 0x0}, @@ -966,7 +966,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SELF_DESTRUCT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -974,7 +974,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_EGG_BOMB] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -982,7 +982,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LICK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -990,7 +990,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SMOG] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -998,7 +998,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLUDGE] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1006,7 +1006,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BONE_CLUB] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1014,7 +1014,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FIRE_BLAST] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1022,7 +1022,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WATERFALL] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, @@ -1030,7 +1030,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CLAMP] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1038,7 +1038,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SWIFT] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1046,7 +1046,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SKULL_BASH] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1054,7 +1054,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPIKE_CANNON] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, @@ -1062,7 +1062,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CONSTRICT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1070,7 +1070,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_AMNESIA] = { { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1078,7 +1078,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_KINESIS] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1086,7 +1086,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SOFT_BOILED] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, @@ -1094,7 +1094,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HI_JUMP_KICK] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1102,7 +1102,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GLARE] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1110,7 +1110,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DREAM_EATER] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -1118,7 +1118,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POISON_GAS] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1126,7 +1126,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BARRAGE] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1134,7 +1134,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LEECH_LIFE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1142,7 +1142,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LOVELY_KISS] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1150,7 +1150,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_SKY_ATTACK] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1158,7 +1158,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TRANSFORM] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1166,7 +1166,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BUBBLE] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1174,7 +1174,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DIZZY_PUNCH] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1182,7 +1182,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPORE] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1190,7 +1190,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FLASH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1198,7 +1198,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PSYWAVE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1206,7 +1206,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPLASH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1214,7 +1214,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ACID_ARMOR] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1222,7 +1222,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CRABHAMMER] = { { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -1230,7 +1230,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_EXPLOSION] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1238,7 +1238,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_FURY_SWIPES] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1246,7 +1246,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BONEMERANG] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1254,7 +1254,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_REST] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1262,7 +1262,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROCK_SLIDE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1270,7 +1270,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HYPER_FANG] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1278,7 +1278,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SHARPEN] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1286,7 +1286,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CONVERSION] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1294,7 +1294,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TRI_ATTACK] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1302,7 +1302,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SUPER_FANG] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1, 0x0, 0x0, 0x0, 0x0}, @@ -1310,7 +1310,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLASH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1318,7 +1318,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SUBSTITUTE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -1326,7 +1326,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STRUGGLE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1334,7 +1334,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SKETCH] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1342,7 +1342,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TRIPLE_KICK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1350,7 +1350,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_THIEF] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1358,7 +1358,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPIDER_WEB] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -1366,7 +1366,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MIND_READER] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -1374,7 +1374,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_NIGHTMARE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1382,7 +1382,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FLAME_WHEEL] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1390,7 +1390,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SNORE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1398,7 +1398,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CURSE] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1406,7 +1406,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FLAIL] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1414,7 +1414,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CONVERSION_2] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1422,7 +1422,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_AEROBLAST] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1430,7 +1430,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_COTTON_SPORE] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -1438,7 +1438,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_REVERSAL] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -1446,7 +1446,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPITE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1454,7 +1454,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POWDER_SNOW] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -1462,7 +1462,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PROTECT] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1470,7 +1470,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MACH_PUNCH] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1478,7 +1478,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SCARY_FACE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -1486,7 +1486,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FAINT_ATTACK] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1494,7 +1494,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SWEET_KISS] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1502,7 +1502,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BELLY_DRUM] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -1510,7 +1510,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLUDGE_BOMB] = { { 0x2b, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1518,7 +1518,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MUD_SLAP] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1526,7 +1526,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_OCTAZOOKA] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x28, 0x0, 0x0, 0x0, 0x0}, @@ -1534,7 +1534,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPIKES] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1542,7 +1542,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ZAP_CANNON] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1550,7 +1550,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FORESIGHT] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1558,7 +1558,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DESTINY_BOND] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1566,7 +1566,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PERISH_SONG] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1574,7 +1574,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ICY_WIND] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -1582,7 +1582,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DETECT] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1590,7 +1590,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BONE_RUSH] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1598,7 +1598,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LOCK_ON] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1606,7 +1606,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_OUTRAGE] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1614,7 +1614,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SANDSTORM] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1622,7 +1622,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GIGA_DRAIN] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -1630,7 +1630,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ENDURE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1638,7 +1638,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CHARM] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1646,7 +1646,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROLLOUT] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1654,7 +1654,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FALSE_SWIPE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1662,7 +1662,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SWAGGER] = { { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1670,7 +1670,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MILK_DRINK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1678,7 +1678,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPARK] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1686,7 +1686,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FURY_CUTTER] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -1694,7 +1694,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STEEL_WING] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0xd, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1702,7 +1702,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEAN_LOOK] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1710,7 +1710,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ATTRACT] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1718,7 +1718,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLEEP_TALK] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1726,7 +1726,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HEAL_BELL] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0xa, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1734,7 +1734,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RETURN] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1742,7 +1742,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PRESENT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1750,7 +1750,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FRUSTRATION] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1758,7 +1758,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SAFEGUARD] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1766,7 +1766,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PAIN_SPLIT] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1774,7 +1774,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SACRED_FIRE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1782,7 +1782,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_MAGNITUDE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -1790,7 +1790,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DYNAMIC_PUNCH] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1798,7 +1798,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEGAHORN] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -1806,7 +1806,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DRAGON_BREATH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, @@ -1814,7 +1814,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_BATON_PASS] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1822,7 +1822,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ENCORE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1830,7 +1830,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PURSUIT] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1838,7 +1838,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RAPID_SPIN] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -1846,7 +1846,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SWEET_SCENT] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1854,7 +1854,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_IRON_TAIL] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, @@ -1862,7 +1862,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_METAL_CLAW] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1870,7 +1870,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_VITAL_THROW] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -1878,7 +1878,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MORNING_SUN] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1886,7 +1886,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SYNTHESIS] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -1894,7 +1894,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MOONLIGHT] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1902,7 +1902,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HIDDEN_POWER] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -1910,7 +1910,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CROSS_CHOP] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1918,7 +1918,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TWISTER] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1926,7 +1926,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RAIN_DANCE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1934,7 +1934,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SUNNY_DAY] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, @@ -1942,7 +1942,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CRUNCH] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1950,7 +1950,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MIRROR_COAT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -1958,7 +1958,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_PSYCH_UP] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1966,7 +1966,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_EXTREME_SPEED] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1974,7 +1974,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ANCIENT_POWER] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -1982,7 +1982,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_SHADOW_BALL] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1990,7 +1990,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FUTURE_SIGHT] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1998,7 +1998,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROCK_SMASH] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2006,7 +2006,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WHIRLPOOL] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2014,7 +2014,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BEAT_UP] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2022,7 +2022,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FAKE_OUT] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2030,7 +2030,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_UPROAR] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2038,7 +2038,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_STOCKPILE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2046,7 +2046,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SPIT_UP] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2054,7 +2054,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SWALLOW] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2062,7 +2062,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HEAT_WAVE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2070,7 +2070,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HAIL] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2078,7 +2078,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TORMENT] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2086,7 +2086,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FLATTER] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2094,7 +2094,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WILL_O_WISP] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -2102,7 +2102,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MEMENTO] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2110,7 +2110,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FACADE] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2118,7 +2118,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FOCUS_PUNCH] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -2126,7 +2126,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SMELLING_SALT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2134,7 +2134,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FOLLOW_ME] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2142,7 +2142,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_NATURE_POWER] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -2150,7 +2150,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CHARGE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2158,7 +2158,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TAUNT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2166,7 +2166,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HELPING_HAND] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2174,7 +2174,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TRICK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2182,7 +2182,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROLE_PLAY] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2190,7 +2190,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WISH] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2198,7 +2198,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ASSIST] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2206,7 +2206,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_INGRAIN] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2214,7 +2214,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SUPERPOWER] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -2222,7 +2222,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MAGIC_COAT] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2230,7 +2230,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_RECYCLE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -2238,7 +2238,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_REVENGE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2246,7 +2246,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BRICK_BREAK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2254,7 +2254,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_YAWN] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2262,7 +2262,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_KNOCK_OFF] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2270,7 +2270,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ENDEAVOR] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -2278,7 +2278,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ERUPTION] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, @@ -2286,7 +2286,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SKILL_SWAP] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2294,7 +2294,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_IMPRISON] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -2302,7 +2302,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_REFRESH] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2310,7 +2310,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GRUDGE] = { { 0x2b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2318,7 +2318,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SNATCH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2326,7 +2326,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SECRET_POWER] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -2334,7 +2334,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DIVE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2342,7 +2342,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ARM_THRUST] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2350,7 +2350,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CAMOUFLAGE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2358,7 +2358,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TAIL_GLOW] = { { 0x4, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2366,7 +2366,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LUSTER_PURGE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, @@ -2374,7 +2374,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MIST_BALL] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2382,7 +2382,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FEATHER_DANCE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2390,7 +2390,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TEETER_DANCE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2398,7 +2398,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BLAZE_KICK] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2406,7 +2406,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MUD_SPORT] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -2414,7 +2414,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ICE_BALL] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2422,7 +2422,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_NEEDLE_ARM] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, @@ -2430,7 +2430,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SLACK_OFF] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2438,7 +2438,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HYPER_VOICE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1e, 0x0, 0x0, 0x0, 0x0}, @@ -2446,7 +2446,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POISON_FANG] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2454,7 +2454,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CRUSH_CLAW] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2462,7 +2462,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BLAST_BURN] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -2470,7 +2470,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HYDRO_CANNON] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2478,7 +2478,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_METEOR_MASH] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2486,7 +2486,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0} }, - { + [MOVE_ASTONISH] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -2494,7 +2494,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WEATHER_BALL] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2502,7 +2502,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_AROMATHERAPY] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -2510,7 +2510,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0} }, - { + [MOVE_FAKE_TEARS] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2518,7 +2518,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_AIR_CUTTER] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -2526,7 +2526,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_OVERHEAT] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2534,7 +2534,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ODOR_SLEUTH] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -2542,7 +2542,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROCK_TOMB] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2550,7 +2550,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SILVER_WIND] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -2558,7 +2558,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_METAL_SOUND] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -2566,7 +2566,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_GRASS_WHISTLE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -2574,7 +2574,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_TICKLE] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2582,7 +2582,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_COSMIC_POWER] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -2590,7 +2590,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WATER_SPOUT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, @@ -2598,7 +2598,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SIGNAL_BEAM] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2606,7 +2606,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SHADOW_PUNCH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -2614,7 +2614,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_EXTRASENSORY] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -2622,7 +2622,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_SKY_UPPERCUT] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -2630,7 +2630,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SAND_TOMB] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2638,7 +2638,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SHEER_COLD] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2646,7 +2646,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MUDDY_WATER] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2654,7 +2654,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BULLET_SEED] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2662,7 +2662,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_AERIAL_ACE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2670,7 +2670,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ICICLE_SPEAR] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2678,7 +2678,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_IRON_DEFENSE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2686,7 +2686,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BLOCK] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2694,7 +2694,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_HOWL] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2702,7 +2702,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DRAGON_CLAW] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, @@ -2710,7 +2710,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_FRENZY_PLANT] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2718,7 +2718,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BULK_UP] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2726,7 +2726,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_BOUNCE] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2734,7 +2734,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MUD_SHOT] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2742,7 +2742,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_POISON_TAIL] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, @@ -2750,7 +2750,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_COVET] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2758,7 +2758,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_VOLT_TACKLE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2766,7 +2766,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_MAGICAL_LEAF] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -2774,7 +2774,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_WATER_SPORT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -2782,7 +2782,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_CALM_MIND] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2790,7 +2790,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_LEAF_BLADE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2798,7 +2798,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DRAGON_DANCE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2806,7 +2806,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_ROCK_BLAST] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2814,7 +2814,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_SHOCK_WAVE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2822,7 +2822,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_WATER_PULSE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -2830,7 +2830,7 @@ const struct BardSound gBardSounds_Moves[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [MOVE_DOOM_DESIRE] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2838,7 +2838,7 @@ const struct BardSound gBardSounds_Moves[][6] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [MOVE_PSYCHO_BOOST] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, diff --git a/src/data/bard_music/pokemon.h b/src/data/bard_music/pokemon.h index 5ccf2f830..294cd4078 100644 --- a/src/data/bard_music/pokemon.h +++ b/src/data/bard_music/pokemon.h @@ -1,10 +1,10 @@ #ifndef GUARD_DATA_BARD_MUSIC_POKEMON_H #define GUARD_DATA_BARD_MUSIC_POKEMON_H -const u16 gNumSpeciesNames = NUM_SPECIES; +const u16 gNumBardWords_Species = NUM_SPECIES; -const struct BardSound gBardSounds_Pokemon[][6] = { - { +const struct BardSound gBardSounds_Pokemon[NUM_SPECIES][6] = { + [SPECIES_NONE] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -12,7 +12,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BULBASAUR] = { { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -20,7 +20,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_IVYSAUR] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, @@ -28,7 +28,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VENUSAUR] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -36,7 +36,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CHARMANDER] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, @@ -44,7 +44,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CHARMELEON] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -52,7 +52,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_CHARIZARD] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, @@ -60,7 +60,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_SQUIRTLE] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -68,7 +68,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WARTORTLE] = { { 0x8, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -76,7 +76,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BLASTOISE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -84,7 +84,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CATERPIE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -92,7 +92,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_METAPOD] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -100,7 +100,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BUTTERFREE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -108,7 +108,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WEEDLE] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x26, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -116,7 +116,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KAKUNA] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -124,7 +124,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BEEDRILL] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -132,7 +132,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PIDGEY] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -140,7 +140,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PIDGEOTTO] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -148,7 +148,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PIDGEOT] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -156,7 +156,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RATTATA] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -164,7 +164,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RATICATE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -172,7 +172,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SPEAROW] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -180,7 +180,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FEAROW] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -188,7 +188,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_EKANS] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -196,7 +196,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ARBOK] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x17, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -204,7 +204,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PIKACHU] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -212,7 +212,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RAICHU] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -220,7 +220,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SANDSHREW] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -228,7 +228,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SANDSLASH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -236,7 +236,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NIDORAN_F] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -244,7 +244,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NIDORINA] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -252,7 +252,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NIDOQUEEN] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -260,7 +260,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NIDORAN_M] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -268,7 +268,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NIDORINO] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -276,7 +276,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NIDOKING] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -284,7 +284,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CLEFAIRY] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -292,7 +292,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CLEFABLE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, @@ -300,7 +300,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VULPIX] = { { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -308,7 +308,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NINETALES] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -316,7 +316,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_JIGGLYPUFF] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -324,7 +324,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_WIGGLYTUFF] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -332,7 +332,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_ZUBAT] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -340,7 +340,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GOLBAT] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -348,7 +348,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ODDISH] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -356,7 +356,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GLOOM] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -364,7 +364,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VILEPLUME] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -372,7 +372,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PARAS] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -380,7 +380,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PARASECT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -388,7 +388,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VENONAT] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -396,7 +396,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VENOMOTH] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -404,7 +404,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DIGLETT] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -412,7 +412,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DUGTRIO] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -420,7 +420,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MEOWTH] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -428,7 +428,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PERSIAN] = { { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -436,7 +436,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PSYDUCK] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -444,7 +444,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GOLDUCK] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -452,7 +452,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MANKEY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -460,7 +460,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PRIMEAPE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -468,7 +468,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GROWLITHE] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -476,7 +476,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ARCANINE] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -484,7 +484,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_POLIWAG] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -492,7 +492,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_POLIWHIRL] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -500,7 +500,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_POLIWRATH] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -508,7 +508,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ABRA] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -516,7 +516,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KADABRA] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -524,7 +524,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ALAKAZAM] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -532,7 +532,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MACHOP] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -540,7 +540,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MACHOKE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -548,7 +548,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MACHAMP] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -556,7 +556,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BELLSPROUT] = { { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -564,7 +564,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WEEPINBELL] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, @@ -572,7 +572,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VICTREEBEL] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -580,7 +580,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TENTACOOL] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -588,7 +588,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TENTACRUEL] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -596,7 +596,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GEODUDE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -604,7 +604,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GRAVELER] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -612,7 +612,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GOLEM] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -620,7 +620,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PONYTA] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -628,7 +628,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RAPIDASH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -636,7 +636,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SLOWPOKE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -644,7 +644,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SLOWBRO] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -652,7 +652,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAGNEMITE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -660,7 +660,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAGNETON] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -668,7 +668,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FARFETCHD] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -676,7 +676,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DODUO] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -684,7 +684,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DODRIO] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -692,7 +692,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SEEL] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -700,7 +700,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DEWGONG] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -708,7 +708,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GRIMER] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -716,7 +716,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MUK] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -724,7 +724,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHELLDER] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -732,7 +732,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CLOYSTER] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -740,7 +740,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GASTLY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -748,7 +748,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HAUNTER] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -756,7 +756,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GENGAR] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x8, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -764,7 +764,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ONIX] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -772,7 +772,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DROWZEE] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -780,7 +780,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HYPNO] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -788,7 +788,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KRABBY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -796,7 +796,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KINGLER] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -804,7 +804,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VOLTORB] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -812,7 +812,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ELECTRODE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -820,7 +820,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_EXEGGCUTE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -828,7 +828,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_EXEGGUTOR] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -836,7 +836,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_CUBONE] = { { 0x2d, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -844,7 +844,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAROWAK] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -852,7 +852,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HITMONLEE] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -860,7 +860,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HITMONCHAN] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -868,7 +868,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LICKITUNG] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -876,7 +876,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KOFFING] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -884,7 +884,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WEEZING] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -892,7 +892,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RHYHORN] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -900,7 +900,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RHYDON] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -908,7 +908,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CHANSEY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -916,7 +916,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TANGELA] = { { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -924,7 +924,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KANGASKHAN] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -932,7 +932,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HORSEA] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -940,7 +940,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SEADRA] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -948,7 +948,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GOLDEEN] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -956,7 +956,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SEAKING] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -964,7 +964,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_STARYU] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -972,7 +972,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_STARMIE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -980,7 +980,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MR_MIME] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -988,7 +988,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SCYTHER] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -996,7 +996,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_JYNX] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1004,7 +1004,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ELECTABUZZ] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1012,7 +1012,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAGMAR] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1020,7 +1020,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PINSIR] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1028,7 +1028,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TAUROS] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1036,7 +1036,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAGIKARP] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1044,7 +1044,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GYARADOS] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1052,7 +1052,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LAPRAS] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1060,7 +1060,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DITTO] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1068,7 +1068,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_EEVEE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1076,7 +1076,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VAPOREON] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1084,7 +1084,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_JOLTEON] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -1092,7 +1092,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FLAREON] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -1100,7 +1100,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PORYGON] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -1108,7 +1108,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OMANYTE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1116,7 +1116,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OMASTAR] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -1124,7 +1124,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KABUTO] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -1132,7 +1132,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KABUTOPS] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -1140,7 +1140,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_AERODACTYL] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1148,7 +1148,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SNORLAX] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1156,7 +1156,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ARTICUNO] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -1164,7 +1164,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ZAPDOS] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1172,7 +1172,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MOLTRES] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1180,7 +1180,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DRATINI] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1188,7 +1188,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DRAGONAIR] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, @@ -1196,7 +1196,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DRAGONITE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1204,7 +1204,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MEWTWO] = { { 0x2d, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND, @@ -1212,7 +1212,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MEW] = { { 0x2d, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -1220,7 +1220,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CHIKORITA] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1228,7 +1228,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BAYLEEF] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1236,7 +1236,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MEGANIUM] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1244,7 +1244,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CYNDAQUIL] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -1252,7 +1252,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_QUILAVA] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x8, 0x0, 0x0, 0x0, 0x0}, @@ -1260,7 +1260,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TYPHLOSION] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1268,7 +1268,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x33, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_TOTODILE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1276,7 +1276,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CROCONAW] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1284,7 +1284,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FERALIGATR] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -1292,7 +1292,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, NULL_BARD_SOUND }, - { + [SPECIES_SENTRET] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1300,7 +1300,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FURRET] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1308,7 +1308,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HOOTHOOT] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1316,7 +1316,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NOCTOWL] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1324,7 +1324,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LEDYBA] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -1332,7 +1332,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LEDIAN] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1340,7 +1340,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SPINARAK] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -1348,7 +1348,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ARIADOS] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -1356,7 +1356,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CROBAT] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1364,7 +1364,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CHINCHOU] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1372,7 +1372,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LANTURN] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1380,7 +1380,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PICHU] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1388,7 +1388,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CLEFFA] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1396,7 +1396,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_IGGLYBUFF] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1404,7 +1404,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TOGEPI] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1412,7 +1412,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TOGETIC] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1420,7 +1420,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NATU] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1428,7 +1428,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_XATU] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1436,7 +1436,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAREEP] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1444,7 +1444,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FLAAFFY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1452,7 +1452,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_AMPHAROS] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -1460,7 +1460,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BELLOSSOM] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1468,7 +1468,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MARILL] = { { 0x8, 0x0, 0x0, 0x0, 0x0}, { 0x10, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1476,7 +1476,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_AZUMARILL] = { { 0x8, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1484,7 +1484,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SUDOWOODO] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -1492,7 +1492,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_POLITOED] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -1500,7 +1500,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HOPPIP] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1508,7 +1508,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SKIPLOOM] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1516,7 +1516,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_JUMPLUFF] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1524,7 +1524,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_AIPOM] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1532,7 +1532,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SUNKERN] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1540,7 +1540,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SUNFLORA] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1548,7 +1548,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_YANMA] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1556,7 +1556,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WOOPER] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1564,7 +1564,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_QUAGSIRE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, @@ -1572,7 +1572,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ESPEON] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1580,7 +1580,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_UMBREON] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1588,7 +1588,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MURKROW] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1596,7 +1596,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SLOWKING] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1604,7 +1604,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MISDREAVUS] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, @@ -1612,7 +1612,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_UNOWN] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1620,7 +1620,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WOBBUFFET] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -1628,7 +1628,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GIRAFARIG] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -1636,7 +1636,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PINECO] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1644,7 +1644,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FORRETRESS] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -1652,7 +1652,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DUNSPARCE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1660,7 +1660,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GLIGAR] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1668,7 +1668,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_STEELIX] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1676,7 +1676,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SNUBBULL] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1684,7 +1684,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GRANBULL] = { { 0x2, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1692,7 +1692,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_QWILFISH] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1700,7 +1700,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SCIZOR] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1708,7 +1708,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHUCKLE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x26, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1716,7 +1716,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HERACROSS] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1724,7 +1724,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SNEASEL] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x26, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1732,7 +1732,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TEDDIURSA] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -1740,7 +1740,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_URSARING] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1748,7 +1748,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SLUGMA] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1756,7 +1756,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAGCARGO] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -1764,7 +1764,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SWINUB] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1772,7 +1772,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PILOSWINE] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -1780,7 +1780,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CORSOLA] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -1788,7 +1788,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_REMORAID] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -1796,7 +1796,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OCTILLERY] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -1804,7 +1804,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DELIBIRD] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -1812,7 +1812,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MANTINE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1820,7 +1820,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SKARMORY] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -1828,7 +1828,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HOUNDOUR] = { { 0x23, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1836,7 +1836,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HOUNDOOM] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1844,7 +1844,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KINGDRA] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1852,7 +1852,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PHANPY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1860,7 +1860,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DONPHAN] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1868,7 +1868,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PORYGON2] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1876,7 +1876,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_STANTLER] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1884,7 +1884,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SMEARGLE] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x26, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1892,7 +1892,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TYROGUE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1900,7 +1900,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HITMONTOP] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, @@ -1908,7 +1908,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SMOOCHUM] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1916,7 +1916,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ELEKID] = { { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1924,7 +1924,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAGBY] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1932,7 +1932,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MILTANK] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1940,7 +1940,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BLISSEY] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1948,7 +1948,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RAIKOU] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1956,7 +1956,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ENTEI] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1964,7 +1964,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SUICUNE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -1972,7 +1972,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LARVITAR] = { { 0x15, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x15, 0x0, 0x0, 0x0, 0x0}, @@ -1980,7 +1980,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PUPITAR] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -1988,7 +1988,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TYRANITAR] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -1996,7 +1996,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LUGIA] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2004,7 +2004,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HO_OH] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2012,7 +2012,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CELEBI] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2020,7 +2020,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_B] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2028,7 +2028,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_C] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2036,7 +2036,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_D] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2044,7 +2044,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_E] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2052,7 +2052,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_F] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2060,7 +2060,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_G] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2068,7 +2068,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_H] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2076,7 +2076,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_I] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2084,7 +2084,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_J] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2092,7 +2092,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_K] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2100,7 +2100,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_L] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2108,7 +2108,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_M] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2116,7 +2116,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_N] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2124,7 +2124,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_O] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2132,7 +2132,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_P] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2140,7 +2140,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_Q] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2148,7 +2148,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_R] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2156,7 +2156,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_S] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2164,7 +2164,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_T] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2172,7 +2172,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_U] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2180,7 +2180,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_V] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2188,7 +2188,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_W] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2196,7 +2196,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_X] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2204,7 +2204,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_Y] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2212,7 +2212,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_OLD_UNOWN_Z] = { NULL_BARD_SOUND, NULL_BARD_SOUND, NULL_BARD_SOUND, @@ -2220,7 +2220,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TREECKO] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2228,7 +2228,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GROVYLE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2236,7 +2236,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SCEPTILE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2244,7 +2244,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TORCHIC] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2252,7 +2252,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_COMBUSKEN] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -2260,7 +2260,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BLAZIKEN] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -2268,7 +2268,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MUDKIP] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2276,7 +2276,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MARSHTOMP] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2284,7 +2284,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SWAMPERT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2292,7 +2292,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_POOCHYENA] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -2300,7 +2300,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MIGHTYENA] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -2308,7 +2308,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ZIGZAGOON] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, @@ -2316,7 +2316,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LINOONE] = { { 0x14, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2324,7 +2324,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WURMPLE] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2332,7 +2332,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SILCOON] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x28, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2340,7 +2340,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BEAUTIFLY] = { { 0x2d, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -2348,7 +2348,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CASCOON] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2356,7 +2356,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DUSTOX] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x17, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2364,7 +2364,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LOTAD] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2372,7 +2372,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LOMBRE] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2380,7 +2380,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LUDICOLO] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, @@ -2388,7 +2388,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SEEDOT] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2396,7 +2396,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NUZLEAF] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2404,7 +2404,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHIFTRY] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2412,7 +2412,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NINCADA] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x6, 0x0, 0x0, 0x0, 0x0}, @@ -2420,7 +2420,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NINJASK] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2428,7 +2428,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHEDINJA] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2436,7 +2436,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TAILLOW] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2444,7 +2444,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SWELLOW] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2452,7 +2452,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHROOMISH] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2460,7 +2460,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BRELOOM] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2468,7 +2468,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SPINDA] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2476,7 +2476,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WINGULL] = { { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2484,7 +2484,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PELIPPER] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -2492,7 +2492,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SURSKIT] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2500,7 +2500,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MASQUERAIN] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, @@ -2508,7 +2508,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WAILMER] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2516,7 +2516,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WAILORD] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2524,7 +2524,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SKITTY] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2532,7 +2532,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DELCATTY] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2540,7 +2540,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KECLEON] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2548,7 +2548,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BALTOY] = { { 0x1, 0x0, 0x0, 0x0, 0x0}, { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2556,7 +2556,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CLAYDOL] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2564,7 +2564,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NOSEPASS] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2572,7 +2572,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TORKOAL] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2580,7 +2580,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SABLEYE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -2588,7 +2588,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BARBOACH] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2596,7 +2596,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WHISCASH] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2604,7 +2604,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LUVDISC] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2612,7 +2612,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CORPHISH] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2620,7 +2620,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CRAWDAUNT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2628,7 +2628,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FEEBAS] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2636,7 +2636,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MILOTIC] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -2644,7 +2644,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CARVANHA] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2652,7 +2652,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHARPEDO] = { { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2660,7 +2660,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TRAPINCH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2668,7 +2668,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VIBRAVA] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2676,7 +2676,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_FLYGON] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2684,7 +2684,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAKUHITA] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2692,7 +2692,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HARIYAMA] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2700,7 +2700,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ELECTRIKE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -2708,7 +2708,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MANECTRIC] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -2716,7 +2716,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_NUMEL] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0xb, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2724,7 +2724,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CAMERUPT] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2732,7 +2732,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SPHEAL] = { { 0xe, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2740,7 +2740,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SEALEO] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2748,7 +2748,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WALREIN] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2756,7 +2756,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CACNEA] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2764,7 +2764,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CACTURNE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2772,7 +2772,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SNORUNT] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2780,7 +2780,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GLALIE] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2788,7 +2788,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LUNATONE] = { { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -2796,7 +2796,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SOLROCK] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2804,7 +2804,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_AZURILL] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, @@ -2812,7 +2812,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SPOINK] = { { 0x1e, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2820,7 +2820,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GRUMPIG] = { { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2828,7 +2828,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_PLUSLE] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2836,7 +2836,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MINUN] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2844,7 +2844,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MAWILE] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2852,7 +2852,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MEDITITE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -2860,7 +2860,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_MEDICHAM] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -2868,7 +2868,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SWABLU] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2876,7 +2876,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ALTARIA] = { { 0x6, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2884,7 +2884,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WYNAUT] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2892,7 +2892,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DUSKULL] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x26, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2900,7 +2900,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DUSCLOPS] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2908,7 +2908,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ROSELIA] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -2916,7 +2916,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SLAKOTH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2924,7 +2924,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VIGOROTH] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -2932,7 +2932,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SLAKING] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2940,7 +2940,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GULPIN] = { { 0x24, 0x0, 0x0, 0x0, 0x0}, { 0xf, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2948,7 +2948,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SWALOT] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2956,7 +2956,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_TROPIUS] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -2964,7 +2964,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_WHISMUR] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2972,7 +2972,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LOUDRED] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2980,7 +2980,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_EXPLOUD] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2988,7 +2988,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CLAMPERL] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x32, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -2996,7 +2996,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_HUNTAIL] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3004,7 +3004,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GOREBYSS] = { { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x2c, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -3012,7 +3012,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ABSOL] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3020,7 +3020,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHUPPET] = { { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3028,7 +3028,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BANETTE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3036,7 +3036,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SEVIPER] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -3044,7 +3044,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ZANGOOSE] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3052,7 +3052,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RELICANTH] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -3060,7 +3060,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ARON] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1d, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3068,7 +3068,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LAIRON] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3076,7 +3076,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_AGGRON] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3084,7 +3084,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CASTFORM] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x1a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3092,7 +3092,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_VOLBEAT] = { { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3100,7 +3100,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ILLUMISE] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x27, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -3108,7 +3108,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LILEEP] = { { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3116,7 +3116,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CRADILY] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -3124,7 +3124,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ANORITH] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -3132,7 +3132,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_ARMALDO] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -3140,7 +3140,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RALTS] = { { 0x7, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3148,7 +3148,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KIRLIA] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -3156,7 +3156,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GARDEVOIR] = { { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -3164,7 +3164,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BAGON] = { { 0x5, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3172,7 +3172,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SHELGON] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3180,7 +3180,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_SALAMENCE] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, @@ -3188,7 +3188,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_BELDUM] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3196,7 +3196,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_METANG] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3204,7 +3204,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_METAGROSS] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -3212,7 +3212,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_REGIROCK] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, @@ -3220,7 +3220,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_REGICE] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x12, 0x0, 0x0, 0x0, 0x0}, @@ -3228,7 +3228,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_REGISTEEL] = { { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0xe, 0x0, 0x0, 0x0, 0x0}, @@ -3236,7 +3236,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_KYOGRE] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, { 0x30, 0x0, 0x0, 0x0, 0x0}, @@ -3244,7 +3244,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_GROUDON] = { { 0x21, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x33, 0x0, 0x0, 0x0, 0x0}, @@ -3252,7 +3252,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_RAYQUAZA] = { { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x3, 0x0, 0x0, 0x0, 0x0}, { 0x2a, 0x0, 0x0, 0x0, 0x0}, @@ -3260,7 +3260,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LATIAS] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x0, 0x0, 0x0, 0x0, 0x0}, @@ -3268,7 +3268,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_LATIOS] = { { 0x0, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, @@ -3276,7 +3276,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_JIRACHI] = { { 0x30, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0xc, 0x0, 0x0, 0x0, 0x0}, @@ -3284,7 +3284,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_DEOXYS] = { { 0xc, 0x0, 0x0, 0x0, 0x0}, { 0x1b, 0x0, 0x0, 0x0, 0x0}, { 0x11, 0x0, 0x0, 0x0, 0x0}, @@ -3292,7 +3292,7 @@ const struct BardSound gBardSounds_Pokemon[][6] = { NULL_BARD_SOUND, NULL_BARD_SOUND }, - { + [SPECIES_CHIMECHO] = { { 0x12, 0x0, 0x0, 0x0, 0x0}, { 0x9, 0x0, 0x0, 0x0, 0x0}, { 0x18, 0x0, 0x0, 0x0, 0x0}, diff --git a/src/data/bard_music/word_pitch.h b/src/data/bard_music/word_pitch.h index 54a87acc9..35527017c 100644 --- a/src/data/bard_music/word_pitch.h +++ b/src/data/bard_music/word_pitch.h @@ -1,182 +1,186 @@ #ifndef GUARD_WORD_PITCH_H #define GUARD_WORD_PITCH_H -const s16 gUnknown_0860A1C0[] = { - -0x300, 0x1800 +#define PITCH_END 0x1800 + +static const s16 sPitch1_0[] = { + -0x300, PITCH_END }; -const s16 gUnknown_0860A1C4[] = { - 0x0900, 0x1800 +static const s16 sPitch1_1[] = { + 0x0900, PITCH_END }; -const s16 gUnknown_0860A1C8[] = { - 0x0100, 0x1800 +static const s16 sPitch1_2[] = { + 0x0100, PITCH_END }; -const s16 gUnknown_0860A1CC[] = { - 0x0400, 0x1800 +static const s16 sPitch1_3[] = { + 0x0400, PITCH_END }; -const s16 gUnknown_0860A1D0[] = { - 0x0b00, 0x1800 +static const s16 sPitch1_4[] = { + 0x0b00, PITCH_END }; -const s16 gUnknown_0860A1D4[] = { - -0x300, -0x100, 0x1800 +static const s16 sPitch2_0[] = { + -0x300, -0x100, PITCH_END }; -const s16 gUnknown_0860A1DA[] = { - -0x300, 0x0200, 0x1800 +static const s16 sPitch2_1[] = { + -0x300, 0x0200, PITCH_END }; -const s16 gUnknown_0860A1E0[] = { - 0x0200, 0x0400, 0x1800 +static const s16 sPitch2_2[] = { + 0x0200, 0x0400, PITCH_END }; -const s16 gUnknown_0860A1E6[] = { - 0x0600, 0x0800, 0x1800 +static const s16 sPitch2_3[] = { + 0x0600, 0x0800, PITCH_END }; -const s16 gUnknown_0860A1EC[] = { - 0x0900, 0x0800, 0x1800 +static const s16 sPitch2_4[] = { + 0x0900, 0x0800, PITCH_END }; -const s16 gUnknown_0860A1F2[] = { - -0x300, -0x100, -0x300, 0x1800 +static const s16 sPitch3_0[] = { + -0x300, -0x100, -0x300, PITCH_END }; -const s16 gUnknown_0860A1FA[] = { - 0x0400, -0x300, 0x0400, 0x1800 +static const s16 sPitch3_1[] = { + 0x0400, -0x300, 0x0400, PITCH_END }; -const s16 gUnknown_0860A202[] = { - 0x0900, 0x0800, 0x0600, 0x1800 +static const s16 sPitch3_2[] = { + 0x0900, 0x0800, 0x0600, PITCH_END }; -const s16 gUnknown_0860A20A[] = { - 0x0100, 0x0200, 0x0400, 0x1800 +static const s16 sPitch3_3[] = { + 0x0100, 0x0200, 0x0400, PITCH_END }; -const s16 gUnknown_0860A212[] = { - 0x0600, 0x1000, 0x0d00, 0x1800 +static const s16 sPitch3_4[] = { + 0x0600, 0x1000, 0x0d00, PITCH_END }; -const s16 gUnknown_0860A21A[] = { - 0x0400, 0x0900, 0x0400, 0x0900, 0x1800 +static const s16 sPitch4_0[] = { + 0x0400, 0x0900, 0x0400, 0x0900, PITCH_END }; -const s16 gUnknown_0860A224[] = { - 0x0900, 0x0400, 0x0d00, 0x0400, 0x1800 +static const s16 sPitch4_1[] = { + 0x0900, 0x0400, 0x0d00, 0x0400, PITCH_END }; -const s16 gUnknown_0860A22E[] = { - 0x0100, 0x0200, 0x0400, 0x0600, 0x1800 +static const s16 sPitch4_2[] = { + 0x0100, 0x0200, 0x0400, 0x0600, PITCH_END }; -const s16 gUnknown_0860A238[] = { - 0x0800, 0x0600, 0x0400, 0x0200, 0x1800 +static const s16 sPitch4_3[] = { + 0x0800, 0x0600, 0x0400, 0x0200, PITCH_END }; -const s16 gUnknown_0860A242[] = { - 0x0f00, 0x0d00, 0x0b00, 0x0a00, 0x1800 +static const s16 sPitch4_4[] = { + 0x0f00, 0x0d00, 0x0b00, 0x0a00, PITCH_END }; -const s16 gUnknown_0860A24C[] = { - -0x300, -0x100, 0x0100, 0x0200, 0x0400, 0x1800 +static const s16 sPitch5_0[] = { + -0x300, -0x100, 0x0100, 0x0200, 0x0400, PITCH_END }; -const s16 gUnknown_0860A258[] = { - 0x0900, 0x0800, 0x0600, 0x0400, 0x0200, 0x1800 +static const s16 sPitch5_1[] = { + 0x0900, 0x0800, 0x0600, 0x0400, 0x0200, PITCH_END }; -const s16 gUnknown_0860A264[] = { - 0x0100, 0x0400, 0x0900, 0x0400, 0x0100, 0x1800 +static const s16 sPitch5_2[] = { + 0x0100, 0x0400, 0x0900, 0x0400, 0x0100, PITCH_END }; -const s16 gUnknown_0860A270[] = { - 0x0900, 0x0400, 0x0900, 0x0400, -0x300, 0x1800 +static const s16 sPitch5_3[] = { + 0x0900, 0x0400, 0x0900, 0x0400, -0x300, PITCH_END }; -const s16 gUnknown_0860A27C[] = { - 0x0b00, 0x0800, 0x0400, 0x0400, 0x0600, 0x1800 +static const s16 sPitch5_4[] = { + 0x0b00, 0x0800, 0x0400, 0x0400, 0x0600, PITCH_END }; -const s16 gUnknown_0860A288[] = { - -0x300, -0x100, 0x0100, 0x0200, 0x0400, 0x0600, 0x1800 +static const s16 sPitch6_0[] = { + -0x300, -0x100, 0x0100, 0x0200, 0x0400, 0x0600, PITCH_END }; -const s16 gUnknown_0860A296[] = { - 0x0800, 0x0600, 0x0400, 0x0200, 0x0100, -0x100, 0x1800 +static const s16 sPitch6_1[] = { + 0x0800, 0x0600, 0x0400, 0x0200, 0x0100, -0x100, PITCH_END }; -const s16 gUnknown_0860A2A4[] = { - 0x0100, 0x0200, 0x0400, 0x0100, 0x0200, 0x1000, 0x1800 +static const s16 sPitch6_2[] = { + 0x0100, 0x0200, 0x0400, 0x0100, 0x0200, 0x1000, PITCH_END }; -const s16 gUnknown_0860A2B2[] = { - 0x0400, -0x300, 0x0900, 0x0400, 0x0900, 0x0400, 0x1800 +static const s16 sPitch6_3[] = { + 0x0400, -0x300, 0x0900, 0x0400, 0x0900, 0x0400, PITCH_END }; -const s16 gUnknown_0860A2C0[] = { - 0x0800, 0x0900, 0x0800, 0x0900, 0x0800, 0x0900, 0x1800 +static const s16 sPitch6_4[] = { + 0x0800, 0x0900, 0x0800, 0x0900, 0x0800, 0x0900, PITCH_END }; -const s16 gUnknown_0860A2CE[] = { - 0x0200, 0x0100, 0x0200, 0x0100, 0x0200, 0x0400, 0x0200, 0x1800 +static const s16 sPitch7_0[] = { + 0x0200, 0x0100, 0x0200, 0x0100, 0x0200, 0x0400, 0x0200, PITCH_END }; -const s16 gUnknown_0860A2DE[] = { - 0x0100, 0x0100, -0x100, -0x100, -0x300, 0x0400, -0x300, 0x1800 +static const s16 sPitch7_1[] = { + 0x0100, 0x0100, -0x100, -0x100, -0x300, 0x0400, -0x300, PITCH_END }; -const s16 gUnknown_0860A2EE[] = { - 0x0800, 0x0900, 0x0b00, 0x0d00, 0x0e00, 0x0d00, 0x0b00, 0x1800 +static const s16 sPitch7_2[] = { + 0x0800, 0x0900, 0x0b00, 0x0d00, 0x0e00, 0x0d00, 0x0b00, PITCH_END }; -const s16 gUnknown_0860A2FE[] = { - 0x0800, 0x0600, 0x0400, 0x0200, 0x0d00, 0x0b00, 0x0900, 0x1800 +static const s16 sPitch7_3[] = { + 0x0800, 0x0600, 0x0400, 0x0200, 0x0d00, 0x0b00, 0x0900, PITCH_END }; -const s16 gUnknown_0860A30E[] = { - 0x0300, 0x0400, 0x0600, 0x0800, 0x0700, 0x0800, 0x0400, 0x1800 +static const s16 sPitch7_4[] = { + 0x0300, 0x0400, 0x0600, 0x0800, 0x0700, 0x0800, 0x0400, PITCH_END }; -const s16 *const gBardSoundPitchTables[] = { - gUnknown_0860A1C0, - gUnknown_0860A1C4, - gUnknown_0860A1C8, - gUnknown_0860A1CC, - gUnknown_0860A1D0, - gUnknown_0860A1D4, - gUnknown_0860A1DA, - gUnknown_0860A1E0, - gUnknown_0860A1E6, - gUnknown_0860A1EC, - gUnknown_0860A1F2, - gUnknown_0860A1FA, - gUnknown_0860A202, - gUnknown_0860A20A, - gUnknown_0860A212, - gUnknown_0860A21A, - gUnknown_0860A224, - gUnknown_0860A22E, - gUnknown_0860A238, - gUnknown_0860A242, - gUnknown_0860A24C, - gUnknown_0860A258, - gUnknown_0860A264, - gUnknown_0860A270, - gUnknown_0860A27C, - gUnknown_0860A288, - gUnknown_0860A296, - gUnknown_0860A2A4, - gUnknown_0860A2B2, - gUnknown_0860A2C0, - gUnknown_0860A2CE, - gUnknown_0860A2DE, - gUnknown_0860A2EE, - gUnknown_0860A2FE, - gUnknown_0860A30E +// Only sPitch7_# are used below +// This table is always indexed with (x + 30), where x is some value 0 - 4 +static const s16 *const sBardSoundPitchTables[] = { + sPitch1_0, + sPitch1_1, + sPitch1_2, + sPitch1_3, + sPitch1_4, + sPitch2_0, + sPitch2_1, + sPitch2_2, + sPitch2_3, + sPitch2_4, + sPitch3_0, + sPitch3_1, + sPitch3_2, + sPitch3_3, + sPitch3_4, + sPitch4_0, + sPitch4_1, + sPitch4_2, + sPitch4_3, + sPitch4_4, + sPitch5_0, + sPitch5_1, + sPitch5_2, + sPitch5_3, + sPitch5_4, + sPitch6_0, + sPitch6_1, + sPitch6_2, + sPitch6_3, + sPitch6_4, + sPitch7_0, + sPitch7_1, + sPitch7_2, + sPitch7_3, + sPitch7_4 }; diff --git a/src/data/battle_frontier/apprentice.h b/src/data/battle_frontier/apprentice.h index 349dc9619..144129743 100644 --- a/src/data/battle_frontier/apprentice.h +++ b/src/data/battle_frontier/apprentice.h @@ -326,7 +326,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] = .facilityClass = FACILITY_CLASS_LASS, .species = {SPECIES_SWALOT, SPECIES_XATU, SPECIES_ALTARIA, SPECIES_GOLDUCK, SPECIES_FLYGON, SPECIES_ALAKAZAM, SPECIES_GARDEVOIR, SPECIES_WAILORD, SPECIES_GRUMPIG, SPECIES_MIGHTYENA}, .id = 3, - .speechLost = {EC_WORD_IS, EC_WORD_THIS, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_QUES, 0xFFFF}, + .speechLost = {EC_WORD_IS, EC_WORD_THIS, EC_WORD_TOO, EC_WORD_MUCH, EC_WORD_QUES, EC_EMPTY_WORD}, }, { .name = {_("ヨウカ"), _("MACY"), _("AMELIE"), _("CLEO"), _("MARIA"), _("ELISA")}, @@ -358,7 +358,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] = .facilityClass = FACILITY_CLASS_BEAUTY, .species = {SPECIES_NINETALES, SPECIES_ALAKAZAM, SPECIES_SCEPTILE, SPECIES_SALAMENCE, SPECIES_GOLDUCK, SPECIES_MAWILE, SPECIES_WEEZING, SPECIES_LANTURN, SPECIES_GARDEVOIR, SPECIES_MILOTIC}, .id = 7, - .speechLost = {EC_WORD_YOU_RE, EC_WORD_STRONG, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_QUES, 0xFFFF}, + .speechLost = {EC_WORD_YOU_RE, EC_WORD_STRONG, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, }, { .name = {_("スミレ"), _("ANNIE"), _("ANNIE"), _("IMELDA"), _("INES"), _("ROSA")}, @@ -374,7 +374,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] = .facilityClass = FACILITY_CLASS_HIKER, .species = {SPECIES_SKARMORY, SPECIES_GOLEM, SPECIES_BLAZIKEN, SPECIES_CAMERUPT, SPECIES_DONPHAN, SPECIES_MUK, SPECIES_SALAMENCE, SPECIES_TROPIUS, SPECIES_SOLROCK, SPECIES_RHYDON}, .id = 9, - .speechLost = {EC_WORD_WE, EC_WORD_WERE, EC_WORD_JUST, EC_WORD_SHREDDED, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLost = {EC_WORD_WE, EC_WORD_WERE, EC_WORD_JUST, EC_WORD_SHREDDED, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, }, { .name = {_("トウゾウ"), _("DALLAS"), _("BRUNO"), _("LEARCO"), _("ANSGAR"), _("MANOLO")}, @@ -382,7 +382,7 @@ const struct ApprenticeTrainer gApprentices[NUM_APPRENTICES] = .facilityClass = FACILITY_CLASS_FISHERMAN, .species = {SPECIES_SEAKING, SPECIES_STARMIE, SPECIES_GOLDUCK, SPECIES_TENTACRUEL, SPECIES_OCTILLERY, SPECIES_GOREBYSS, SPECIES_GLALIE, SPECIES_WAILORD, SPECIES_SHARPEDO, SPECIES_KINGDRA}, .id = 10, - .speechLost = {EC_WORD_YOUR, EC_WORD_WIN, EC_WORD_ANGERS, EC_WORD_ME, EC_WORD_EXCL, 0xFFFF}, + .speechLost = {EC_WORD_YOUR, EC_WORD_WIN, EC_WORD_ANGERS, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, }, { .name = {_("セイヤ"), _("FRANK"), _("FRANK"), _("OLINDO"), _("FRANK"), _("MAURO")}, diff --git a/src/data/battle_frontier/battle_frontier_trainers.h b/src/data/battle_frontier/battle_frontier_trainers.h index bbd88d76f..1cae890c2 100644 --- a/src/data/battle_frontier/battle_frontier_trainers.h +++ b/src/data/battle_frontier/battle_frontier_trainers.h @@ -4,15 +4,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_YOUNGSTER, .trainerName = _("BRADY"), .speechBefore = {EC_WORD_I_AM, EC_WORD_NEVER, EC_WORD_GOING, EC_WORD_TO, EC_WORD_LOSE, EC_WORD_EXCL}, - .speechWin = {EC_WORD_I_AM, EC_WORD_STRONG, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, 0xFFFF}, - .speechLose = {EC_WORD_WHAT, EC_WORD_QUES, 0xFFFF, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, + .speechWin = {EC_WORD_I_AM, EC_WORD_STRONG, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WHAT, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, .monSet = gBattleFrontierTrainerMons_Brady }, [FRONTIER_TRAINER_CONNER] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, .trainerName = _("CONNER"), - .speechBefore = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_BUG, EC_WORD_ME, 0xFFFF, 0xFFFF}, - .speechWin = {EC_WORD_A, EC_WORD_WIN, EC_WORD_IS, EC_WORD_JUST, EC_WORD_AWESOME, 0xFFFF}, + .speechBefore = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_BUG, EC_WORD_ME, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_A, EC_WORD_WIN, EC_WORD_IS, EC_WORD_JUST, EC_WORD_AWESOME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_DARN, EC_WORD_ELLIPSIS, EC_WORD_LOSING, EC_WORD_DOES, EC_WORD_BUG, EC_WORD_ME}, .monSet = gBattleFrontierTrainerMons_Conner }, @@ -20,7 +20,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_YOUNGSTER, .trainerName = _("BRADLEY"), .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_MY, EC_WORD_OPPONENT, EC_WORD_TODAY}, - .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL, 0xFFFF, EC_WORD_SEE_YA, EC_WORD_LATER, EC_WORD_EXCL}, + .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_SEE_YA, EC_WORD_LATER, EC_WORD_EXCL}, .speechLose = {EC_WORD_TOMORROW, EC_WORD_IS, EC_WORD_WHEN, EC_WORD_WE, EC_WORD_REALLY, EC_WORD_BATTLE}, .monSet = gBattleFrontierTrainerMons_Bradley }, @@ -44,7 +44,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_LASS, .trainerName = _("PEGGY"), .speechBefore = {EC_WORD_GET, EC_WORD_READY, EC_WORD_TO, EC_WORD_BE, EC_WORD_DESTROYED, EC_WORD_EXCL}, - .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_I_AM, EC_WORD_LOLLING, EC_WORD_EXCL}, + .speechWin = {EC_WORD_HAHAHA, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_LOLLING, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_SAD, EC_WORD_THANKS, EC_WORD_TO, EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Peggy }, @@ -52,7 +52,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, .trainerName = _("KEITH"), .speechBefore = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_JUST, EC_WORD_STUDY, EC_WORD_YOU, EC_WORD_KNOW}, - .speechWin = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_STUDY, EC_WORD_ENOUGH, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechWin = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_STUDY, EC_WORD_ENOUGH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Keith }, @@ -60,15 +60,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, .trainerName = _("GRAYSON"), .speechBefore = {EC_WORD_A, EC_WORD_POKEMON, EC_WORD_BATTLE, EC_WORD_ISN_T, EC_WORD_CHILD_S_PLAY, EC_WORD_EXCL}, - .speechWin = {EC_WORD_YOU_RE, EC_WORD_DONE, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_YOU_RE, EC_WORD_DONE, EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WE, EC_WORD_WERE, EC_WORD_LIKE, EC_WORD_TOYS, EC_WORD_TO, EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Grayson }, [FRONTIER_TRAINER_GLENN] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, .trainerName = _("GLENN"), - .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_BE, EC_WORD_COOL, EC_WORD_IF_I_WIN, 0xFFFF}, - .speechWin = {EC_WORD_COOL, EC_WORD_EXCL, 0xFFFF, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM}, + .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_BE, EC_WORD_COOL, EC_WORD_IF_I_WIN, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_COOL, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_GOING, EC_WORD_TO, EC_WORD_BE, EC_WORD_COOL}, .monSet = gBattleFrontierTrainerMons_Glenn }, @@ -92,7 +92,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, .trainerName = _("ZOEY"), .speechBefore = {EC_WORD_PLEASE, EC_WORD_BATTLE, EC_WORD_LIKE, EC_WORD_YOU, EC_WORD_MEAN, EC_WORD_IT}, - .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, + .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, .speechLose = {EC_WORD_WERE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_BEING, EC_WORD_SERIOUS, EC_WORD_QUES}, .monSet = gBattleFrontierTrainerMons_Zoey }, @@ -100,8 +100,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_RICH_BOY, .trainerName = _("MANUEL"), .speechBefore = {EC_WORD_ME, EC_WORD_LOSE, EC_WORD_QUES, EC_WORD_THAT_S, EC_WORD_PREPOSTEROUS, EC_WORD_EXCL}, - .speechWin = {EC_WORD_NATURALLY, EC_WORD_I, EC_WORD_WIN, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_LOST, EC_WORD_MOTHER}, + .speechWin = {EC_WORD_NATURALLY, EC_WORD_I, EC_WORD_WIN, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_LOST, EC_WORD_MOTHER}, .monSet = gBattleFrontierTrainerMons_Manuel }, [FRONTIER_TRAINER_RUSS] = { @@ -115,16 +115,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_DUSTIN] = { .facilityClass = FACILITY_CLASS_RICH_BOY, .trainerName = _("DUSTIN"), - .speechBefore = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_COOL, EC_WORD_POKEMON, 0xFFFF}, - .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_WHEN_I_WIN, EC_WORD_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_IF_I_LOSE, EC_WORD_TOO, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_COOL, EC_WORD_POKEMON, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_WHEN_I_WIN, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_MYSELF, EC_WORD_IF_I_LOSE, EC_WORD_TOO, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Dustin }, [FRONTIER_TRAINER_TINA] = { .facilityClass = FACILITY_CLASS_LADY, .trainerName = _("TINA"), .speechBefore = {EC_WORD_IF_I_WIN, EC_WORD_YOU, EC_WORD_CAN, EC_WORD_HAVE, EC_WORD_A, EC_MOVE2(SWEET_KISS)}, - .speechWin = {EC_WORD_HERE_IT_IS, EC_WORD_YOUR, EC_MOVE2(SWEET_KISS), EC_WORD_FROM, EC_WORD_MY, EC_POKEMON2(JYNX)}, + .speechWin = {EC_WORD_HERE_IT_IS, EC_WORD_YOUR, EC_MOVE2(SWEET_KISS), EC_WORD_FROM, EC_WORD_MY, EC_POKEMON_NATIONAL(JYNX)}, .speechLose = {EC_WORD_YOU, EC_WORD_WANT, EC_WORD_A, EC_MOVE(SWIFT), EC_MOVE2(MEGA_KICK), EC_WORD_INSTEAD}, .monSet = gBattleFrontierTrainerMons_Tina }, @@ -133,14 +133,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("GILLIAN"), .speechBefore = {EC_WORD_THE, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_IS, EC_WORD_SO, EC_WORD_YESTERDAY}, .speechWin = {EC_WORD_POKEMON, EC_WORD_NEVER, EC_WORD_GO, EC_WORD_OUT, EC_WORD_OF, EC_WORD_FASHION}, - .speechLose = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_DISAPPOINT, EC_WORD_ME, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_LOSING, EC_WORD_DOESN_T, EC_WORD_DISAPPOINT, EC_WORD_ME, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Gillian }, [FRONTIER_TRAINER_ZOE] = { .facilityClass = FACILITY_CLASS_LADY, .trainerName = _("ZOE"), .speechBefore = {EC_WORD_I, EC_WORD_HAVEN_T, EC_WORD_A, EC_WORD_WORRY, EC_WORD_AT, EC_WORD_ALL}, - .speechWin = {EC_WORD_LIFE, EC_WORD_IS, EC_WORD_ALWAYS, EC_WORD_GOOD, EC_WORD_TO_ME, 0xFFFF}, + .speechWin = {EC_WORD_LIFE, EC_WORD_IS, EC_WORD_ALWAYS, EC_WORD_GOOD, EC_WORD_TO_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WORRY, EC_WORD_ABOUT, EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SKILL}, .monSet = gBattleFrontierTrainerMons_Zoe }, @@ -156,7 +156,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_CAMPER, .trainerName = _("AL"), .speechBefore = {EC_WORD_YOUR, EC_WORD_LOOK, EC_WORD_SAYS, EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_TOUGH}, - .speechWin = {EC_WORD_IT_S, EC_WORD_ME, EC_WORD_WHO_IS, EC_WORD_REALLY, EC_WORD_TOUGH, 0xFFFF}, + .speechWin = {EC_WORD_IT_S, EC_WORD_ME, EC_WORD_WHO_IS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_RIGHT, EC_WORD_EXCL, EC_WORD_YOU_RE, EC_WORD_REALLY, EC_WORD_TOUGH}, .monSet = gBattleFrontierTrainerMons_Al }, @@ -165,15 +165,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("MITCH"), .speechBefore = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_IS, EC_WORD_MY, EC_WORD_ALLY, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAS, EC_WORD_THAT, EC_WORD_ENOUGH, EC_WORD_FOR, EC_WORD_YOU, EC_WORD_QUES}, - .speechLose = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_DIDN_T, EC_WORD_LET_ME_WIN, EC_WORD_QUES, 0xFFFF}, + .speechLose = {EC_WORD_MOTHER, EC_WORD_NATURE, EC_WORD_DIDN_T, EC_WORD_LET_ME_WIN, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Mitch }, [FRONTIER_TRAINER_ANNE] = { .facilityClass = FACILITY_CLASS_PICNICKER, .trainerName = _("ANNE"), .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_LET_S, EC_WORD_BATTLE, EC_WORD_NOW}, - .speechWin = {EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechWin = {EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_MY, EC_WORD_HAPPINESS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Anne }, [FRONTIER_TRAINER_ALIZE] = { @@ -203,15 +203,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_JASON] = { .facilityClass = FACILITY_CLASS_TUBER_M, .trainerName = _("JASON"), - .speechBefore = {EC_WORD_TEACH, EC_WORD_ME, EC_WORD_A, EC_WORD_GOOD, EC_WORD_STRATEGY, 0xFFFF}, - .speechWin = {EC_WORD_THAT_WAS, EC_WORD_YOUR, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_WORD_QUES_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_TEACH, EC_WORD_ME, EC_WORD_A, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_THAT_WAS, EC_WORD_YOUR, EC_WORD_GOOD, EC_WORD_STRATEGY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WOW, EC_WORD_THAT, EC_WORD_IS, EC_WORD_AN, EC_WORD_AWESOME, EC_WORD_STRATEGY}, .monSet = gBattleFrontierTrainerMons_Jason }, [FRONTIER_TRAINER_JOHN] = { .facilityClass = FACILITY_CLASS_TUBER_M, .trainerName = _("JOHN"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_PRETTY, EC_WORD_NEW, EC_WORD_TRAINER, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_PRETTY, EC_WORD_NEW, EC_WORD_TRAINER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_NEW, EC_WORD_BUT, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_NEW, EC_WORD_SO, EC_WORD_WHAT, EC_WORD_IF_I_LOSE, EC_WORD_QUES}, .monSet = gBattleFrontierTrainerMons_John @@ -237,14 +237,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("CARLIE"), .speechBefore = {EC_WORD_MY, EC_WORD_SUMMER, EC_WORD_VACATION, EC_WORD_IS, EC_WORD_FOR, EC_WORD_POKEMON}, .speechWin = {EC_WORD_MY, EC_WORD_SUMMER, EC_WORD_VACATION, EC_WORD_WILL, EC_WORD_BE, EC_WORD_AWESOME}, - .speechLose = {EC_WORD_I, EC_WORD_CAN_T_WIN, EC_WORD_LIKE, EC_WORD_THIS, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLose = {EC_WORD_I, EC_WORD_CAN_T_WIN, EC_WORD_LIKE, EC_WORD_THIS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Carlie }, [FRONTIER_TRAINER_GORDON] = { .facilityClass = FACILITY_CLASS_SWIMMER_M, .trainerName = _("GORDON"), - .speechBefore = {EC_WORD_VICTORY, EC_WORD_WILL, EC_WORD_COME, EC_WORD_TO_ME, EC_WORD_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_OH_YEAH, EC_WORD_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_REALLY, EC_WORD_WON}, + .speechBefore = {EC_WORD_VICTORY, EC_WORD_WILL, EC_WORD_COME, EC_WORD_TO_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_OH_YEAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_REALLY, EC_WORD_WON}, .speechLose = {EC_WORD_NOTHING, EC_WORD_IS, EC_WORD_WORKING, EC_WORD_OUT, EC_WORD_FOR, EC_WORD_ME}, .monSet = gBattleFrontierTrainerMons_Gordon }, @@ -268,7 +268,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_SWIMMER_F, .trainerName = _("CIERRA"), .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_SYNCHRONIZE, EC_WORD_MY, EC_WORD_SWIFT_SWIM}, - .speechWin = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SYNCHRONIZE, EC_WORD_WITH, EC_WORD_ME, 0xFFFF}, + .speechWin = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_SYNCHRONIZE, EC_WORD_WITH, EC_WORD_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_NEED, EC_WORD_TO, EC_WORD_SYNCHRONIZE, EC_WORD_BETTER, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Cierra }, @@ -324,7 +324,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_POKEFAN_F, .trainerName = _("AMANDA"), .speechBefore = {EC_WORD_I, EC_WORD_COME, EC_WORD_FROM, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_FAMILY}, - .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TREASURE, EC_WORD_THIS, EC_WORD_WIN, 0xFFFF}, + .speechWin = {EC_WORD_I, EC_WORD_WILL, EC_WORD_TREASURE, EC_WORD_THIS, EC_WORD_WIN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_GO_HOME, EC_WORD_RIGHT, EC_WORD_NOW}, .monSet = gBattleFrontierTrainerMons_Amanda }, @@ -340,7 +340,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, .trainerName = _("RAFAEL"), .speechBefore = {EC_WORD_COME_ON, EC_WORD_EXCL, EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_SOME, EC_WORD_SPIRIT}, - .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_SPIRIT, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_SPIRIT, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WELL, EC_WORD_SO, EC_WORD_MUCH, EC_WORD_FOR, EC_WORD_OUR, EC_WORD_SPIRIT}, .monSet = gBattleFrontierTrainerMons_Rafael }, @@ -356,15 +356,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, .trainerName = _("PAYTON"), .speechBefore = {EC_WORD_I, EC_WORD_TRAIN, EC_WORD_FROM, EC_WORD_THE, EC_WORD_EGG, EC_WORD_UP}, - .speechWin = {EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_THAT_WAS, EC_WORD_A, EC_MOVE2(SOFT_BOILED), EC_WORD_LOSS, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechWin = {EC_WORD_WELL, EC_WORD_DONE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_THAT_WAS, EC_WORD_A, EC_MOVE2(SOFT_BOILED), EC_WORD_LOSS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Payton }, [FRONTIER_TRAINER_PAMELA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, .trainerName = _("PAMELA"), .speechBefore = {EC_WORD_ALL, EC_WORD_POKEMON, EC_WORD_ADORE, EC_WORD_A, EC_WORD_KIND, EC_WORD_TRAINER}, - .speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_YOU, EC_WORD_LOST, 0xFFFF}, + .speechWin = {EC_WORD_IT_S, EC_WORD_TOO, EC_WORD_BAD, EC_WORD_YOU, EC_WORD_LOST, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_KIND, EC_WORD_AND, EC_WORD_YOU_RE, EC_WORD_ALSO, EC_WORD_STRONG}, .monSet = gBattleFrontierTrainerMons_Pamela }, @@ -379,7 +379,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_MARISA] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, .trainerName = _("MARISA"), - .speechBefore = {EC_WORD_I, EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_BATTLE, EC_WORD_SERIOUSLY, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_BATTLE, EC_WORD_SERIOUSLY, EC_EMPTY_WORD}, .speechWin = {EC_WORD_PROMISE, EC_WORD_ME, EC_WORD_YOU, EC_WORD_WILL, EC_WORD_DO, EC_WORD_BETTER}, .speechLose = {EC_WORD_PROMISE, EC_WORD_ME, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_PLEASE, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Marisa @@ -397,23 +397,23 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("YOSHI"), .speechBefore = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_FEELING, EC_WORD_LOVEY_DOVEY}, .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_THE, EC_WORD_BEST, EC_WORD_EXCL}, - .speechLose = {EC_WORD_YOU_RE, EC_WORD_IGNORANT, EC_WORD_ABOUT, EC_WORD_BUG, EC_WORD_POKEMON, 0xFFFF}, + .speechLose = {EC_WORD_YOU_RE, EC_WORD_IGNORANT, EC_WORD_ABOUT, EC_WORD_BUG, EC_WORD_POKEMON, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Yoshi }, [FRONTIER_TRAINER_DESTIN] = { .facilityClass = FACILITY_CLASS_BUG_CATCHER, .trainerName = _("DESTIN"), - .speechBefore = {EC_WORD_IT_S, EC_WORD_WAY, EC_WORD_TOO, EC_WORD_HOT, EC_WORD_HERE, 0xFFFF}, - .speechWin = {EC_WORD_I_AM, EC_WORD_ABOUT, EC_WORD_TO, EC_MOVE(OVERHEAT), 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_PLEASE, EC_WORD_I, EC_WORD_NEED, EC_WORD_SOME, EC_WORD_WATER, 0xFFFF}, + .speechBefore = {EC_WORD_IT_S, EC_WORD_WAY, EC_WORD_TOO, EC_WORD_HOT, EC_WORD_HERE, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_I_AM, EC_WORD_ABOUT, EC_WORD_TO, EC_MOVE(OVERHEAT), EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_PLEASE, EC_WORD_I, EC_WORD_NEED, EC_WORD_SOME, EC_WORD_WATER, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Destin }, [FRONTIER_TRAINER_KEON] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, .trainerName = _("KEON"), - .speechBefore = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_BUT, EC_WORD_HERE_I_COME, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_BUT, EC_WORD_HERE_I_COME, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_FORGIVE, EC_WORD_ME, EC_WORD_FOR, EC_WORD_MY, EC_WORD_OVERWHELMING, EC_WORD_POWER}, - .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Keon }, [FRONTIER_TRAINER_STUART] = { @@ -429,7 +429,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("NESTOR"), .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_A, EC_WORD_REALLY, EC_WORD_SMOOTH, EC_WORD_MOVE}, .speechWin = {EC_WORD_THERE, EC_WORD_WAS, EC_WORD_NOTHING, EC_WORD_SMOOTH, EC_WORD_ABOUT, EC_WORD_THAT}, - .speechLose = {EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_ARE, EC_WORD_SMOOTH, EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_ARE, EC_WORD_SMOOTH, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Nestor }, [FRONTIER_TRAINER_DERRICK] = { @@ -445,13 +445,13 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("BRYSON"), .speechBefore = {EC_MOVE2(POISON_POWDER), EC_WORD_IS, EC_WORD_IN, EC_WORD_OUR, EC_MOVE2(COTTON_SPORE), EC_WORD_MOVE}, .speechWin = {EC_WORD_HOW_DO, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_OUR, EC_MOVE2(POISON_POWDER), EC_WORD_QUES}, - .speechLose = {EC_WORD_MY, EC_MOVE2(COTTON_SPORE), EC_WORD_WAS, EC_WORD_USELESS, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_MY, EC_MOVE2(COTTON_SPORE), EC_WORD_WAS, EC_WORD_USELESS, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Bryson }, [FRONTIER_TRAINER_CLAYTON] = { .facilityClass = FACILITY_CLASS_BUG_MANIAC, .trainerName = _("CLAYTON"), - .speechBefore = {EC_WORD_HUH_QUES, 0xFFFF, 0xFFFF, EC_WORD_WHERE, EC_WORD_IS_IT_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_WORD_POKENAV}, .speechLose = {EC_WORD_WHERE, EC_WORD_IS_IT_QUES, EC_WORD_I_VE, EC_WORD_LOST, EC_WORD_MY, EC_WORD_SENSE}, .monSet = gBattleFrontierTrainerMons_Clayton @@ -459,7 +459,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_TRENTON] = { .facilityClass = FACILITY_CLASS_FISHERMAN, .trainerName = _("TRENTON"), - .speechBefore = {EC_WORD_COME_OVER, EC_WORD_FOR, EC_WORD_SOME, EC_WORD_TASTY, EC_WORD_WATER, 0xFFFF}, + .speechBefore = {EC_WORD_COME_OVER, EC_WORD_FOR, EC_WORD_SOME, EC_WORD_TASTY, EC_WORD_WATER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MMM, EC_WORD_DO, EC_WORD_YOU, EC_WORD_WANT, EC_WORD_SOME, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_GOT, EC_WORD_THIS, EC_WORD_TASTY, EC_WORD_WATER, EC_WORD_SHOPPING}, .monSet = gBattleFrontierTrainerMons_Trenton @@ -475,9 +475,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_WESLEY] = { .facilityClass = FACILITY_CLASS_FISHERMAN, .trainerName = _("WESLEY"), - .speechBefore = {EC_POKEMON2(MEW), EC_POKEMON2(MEW), EC_WORD_IS, EC_WORD_HOW, EC_WORD_I, EC_WORD_CRY}, + .speechBefore = {EC_POKEMON_NATIONAL(MEW), EC_POKEMON_NATIONAL(MEW), EC_WORD_IS, EC_WORD_HOW, EC_WORD_I, EC_WORD_CRY}, .speechWin = {EC_WORD_YES, EC_WORD_I, EC_WORD_KNOW, EC_WORD_I_AM, EC_WORD_CUTE, EC_WORD_EXCL}, - .speechLose = {EC_POKEMON2(MEW), EC_POKEMON2(MEW), EC_WORD_EXCL, EC_POKEMON2(MEW), EC_WORD_EXCL_EXCL, 0xFFFF}, + .speechLose = {EC_POKEMON_NATIONAL(MEW), EC_POKEMON_NATIONAL(MEW), EC_WORD_EXCL, EC_POKEMON_NATIONAL(MEW), EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Wesley }, [FRONTIER_TRAINER_ANTON] = { @@ -491,7 +491,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_LAWSON] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, .trainerName = _("LAWSON"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AT, EC_WORD_HEART, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AT, EC_WORD_HEART, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_NOT, EC_WORD_COOL, EC_WORD_EXCL, EC_WORD_NOT, EC_WORD_AT, EC_WORD_ALL}, .speechLose = {EC_WORD_I_AM, EC_WORD_OLD, EC_WORD_AND, EC_WORD_FEELING, EC_WORD_SHAKY, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Lawson @@ -515,16 +515,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_ADRIAN] = { .facilityClass = FACILITY_CLASS_COLLECTOR, .trainerName = _("ADRIAN"), - .speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, 0xFFFF, EC_WORD_YAHOO, EC_WORD_EXCL_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, 0xFFFF, EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_GOOD_BYE, EC_WORD_EXCL, 0xFFFF, EC_WORD_GOOD_BYE, EC_WORD_EXCL_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_YAHOO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_YAHOO, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_THANK_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_GOOD_BYE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GOOD_BYE, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Adrian }, [FRONTIER_TRAINER_TRISTAN] = { .facilityClass = FACILITY_CLASS_COLLECTOR, .trainerName = _("TRISTAN"), - .speechBefore = {EC_WORD_CONFUSED, EC_WORD_QUES, 0xFFFF, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, - .speechWin = {EC_WORD_SEE, EC_WORD_QUES, 0xFFFF, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, + .speechBefore = {EC_WORD_CONFUSED, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, + .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_IN, EC_WORD_BATTLE}, .monSet = gBattleFrontierTrainerMons_Tristan }, @@ -548,8 +548,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PARASOL_LADY, .trainerName = _("CHELSEA"), .speechBefore = {EC_WORD_I, EC_WORD_SERIOUSLY, EC_WORD_MEAN, EC_WORD_TO, EC_WORD_WIN, EC_WORD_EXCL}, - .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MY, EC_WORD_WILL, EC_WORD_TO, EC_WORD_WIN, 0xFFFF}, - .speechLose = {EC_WORD_YOU_RE, EC_WORD_FAR, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, 0xFFFF}, + .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MY, EC_WORD_WILL, EC_WORD_TO, EC_WORD_WIN, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_YOU_RE, EC_WORD_FAR, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Chelsea }, [FRONTIER_TRAINER_DANELA] = { @@ -613,7 +613,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("JADEN"), .speechBefore = {EC_WORD_HELLO, EC_WORD_I, EC_WORD_THINK, EC_WORD_I, EC_WORD_ADORE, EC_WORD_YOU}, .speechWin = {EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_MOVE(THRASH), EC_WORD_IN, EC_MOVE2(FRUSTRATION)}, - .speechLose = {EC_WORD_THIS_IS_IT_EXCL, 0xFFFF, 0xFFFF, EC_WORD_GOOD_BYE, EC_WORD_FOREVER, EC_WORD_EXCL}, + .speechLose = {EC_WORD_THIS_IS_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_GOOD_BYE, EC_WORD_FOREVER, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Jaden }, [FRONTIER_TRAINER_DAKOTA] = { @@ -621,7 +621,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("DAKOTA"), .speechBefore = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_TO, EC_WORD_DANCE, EC_WORD_WITH, EC_WORD_POWER}, .speechWin = {EC_WORD_GOT, EC_WORD_IT, EC_WORD_QUES, EC_WORD_DANCE, EC_WORD_WITH, EC_WORD_POWER}, - .speechLose = {EC_WORD_OKAY, EC_WORD_YOU, EC_WORD_UNDERSTAND, EC_WORD_ALL_RIGHT, EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_OKAY, EC_WORD_YOU, EC_WORD_UNDERSTAND, EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Dakota }, [FRONTIER_TRAINER_BRAYDEN] = { @@ -637,22 +637,22 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("CORSON"), .speechBefore = {EC_WORD_I, EC_WORD_GET, EC_WORD_TO, EC_MOVE2(BEAT_UP), EC_WORD_ON, EC_WORD_YOU}, .speechWin = {EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_COOL}, - .speechLose = {EC_WORD_WHY, EC_WORD_QUES_EXCL, 0xFFFF, EC_WORD_I, EC_MOVE2(CURSE), EC_WORD_YOU}, + .speechLose = {EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_MOVE2(CURSE), EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Corson }, [FRONTIER_TRAINER_TREVIN] = { .facilityClass = FACILITY_CLASS_BIRD_KEEPER, .trainerName = _("TREVIN"), .speechBefore = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NONE, EC_WORD_BETTER, EC_WORD_THAN, EC_WORD_ME}, - .speechWin = {EC_WORD_YES_SIR_EXCL, 0xFFFF, 0xFFFF, EC_WORD_I_AM, EC_WORD_THE, EC_WORD_BEST}, - .speechLose = {EC_WORD_SERIOUS, EC_WORD_QUES_EXCL, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_YES_SIR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_THE, EC_WORD_BEST}, + .speechLose = {EC_WORD_SERIOUS, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Trevin }, [FRONTIER_TRAINER_PATRICK] = { .facilityClass = FACILITY_CLASS_SAILOR, .trainerName = _("PATRICK"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_EXCL, EC_WORD_GIVE_UP, EC_WORD_NOW, 0xFFFF}, - .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_DISAPPOINTED, EC_WORD_I_AM, EC_WORD_PERFECT, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_EXCL, EC_WORD_GIVE_UP, EC_WORD_NOW, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_DISAPPOINTED, EC_WORD_I_AM, EC_WORD_PERFECT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES, EC_WORD_I_AM, EC_WORD_PERFECT, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Patrick }, @@ -667,9 +667,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_MAXWELL] = { .facilityClass = FACILITY_CLASS_SAILOR, .trainerName = _("MAXWELL"), - .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_WHO_IS, EC_WORD_YOUR, EC_WORD_RIVAL, EC_WORD_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_WHO_IS, EC_WORD_YOUR, EC_WORD_RIVAL, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_RIVAL, EC_WORD_IS, EC_WORD_MY, EC_WORD_GIRL, EC_WORD_FRIEND}, - .speechLose = {EC_WORD_I_AM, EC_WORD_MAKING, EC_WORD_YOU, EC_WORD_MY, EC_WORD_RIVAL, 0xFFFF}, + .speechLose = {EC_WORD_I_AM, EC_WORD_MAKING, EC_WORD_YOU, EC_WORD_MY, EC_WORD_RIVAL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Maxwell }, [FRONTIER_TRAINER_DARYL] = { @@ -685,22 +685,22 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("KENNETH"), .speechBefore = {EC_WORD_YOU, EC_WORD_BETTER, EC_WORD_NOT, EC_MOVE2(SLACK_OFF), EC_WORD_WITH, EC_WORD_ME}, .speechWin = {EC_WORD_DID, EC_WORD_MY, EC_MOVE2(TAUNT), EC_WORD_INTIMIDATE, EC_WORD_YOU, EC_WORD_QUES}, - .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Kenneth }, [FRONTIER_TRAINER_RICH] = { .facilityClass = FACILITY_CLASS_HIKER, .trainerName = _("RICH"), - .speechBefore = {EC_WORD_YOUR, EC_MOVE(FACADE), EC_WORD_DOESN_T, EC_MOVE2(TRICK), EC_WORD_ME, 0xFFFF}, - .speechWin = {EC_WORD_SERIOUSLY, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_OK_QUES, 0xFFFF}, - .speechLose = {EC_WORD_THAT_WAS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_WORD_ON, EC_WORD_ME, 0xFFFF}, + .speechBefore = {EC_WORD_YOUR, EC_MOVE(FACADE), EC_WORD_DOESN_T, EC_MOVE2(TRICK), EC_WORD_ME, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_SERIOUSLY, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_REALLY, EC_WORD_OK_QUES, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_THAT_WAS, EC_WORD_REALLY, EC_WORD_TOUGH, EC_WORD_ON, EC_WORD_ME, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Rich }, [FRONTIER_TRAINER_CADEN] = { .facilityClass = FACILITY_CLASS_KINDLER, .trainerName = _("CADEN"), - .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_DEFEATED, EC_WORD_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_FIRE, EC_WORD_EXCL, 0xFFFF, EC_WORD_FIRE, EC_WORD_EXCL_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE, EC_WORD_DEFEATED, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_FIRE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_FIRE, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_SO, EC_WORD_HOT}, .monSet = gBattleFrontierTrainerMons_Caden }, @@ -715,9 +715,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_NASH] = { .facilityClass = FACILITY_CLASS_KINDLER, .trainerName = _("NASH"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_BABY, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_BABY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LEFT, EC_WORD_YOU, EC_WORD_JUST, EC_WORD_AN, EC_MOVE2(EMBER)}, - .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_NO, EC_WORD_WATER, EC_WORD_PLEASE}, + .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_WATER, EC_WORD_PLEASE}, .monSet = gBattleFrontierTrainerMons_Nash }, [FRONTIER_TRAINER_ROBBY] = { @@ -749,13 +749,13 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("ELLEN"), .speechBefore = {EC_WORD_CRUSH, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_AN, EC_WORD_EGG, EC_WORD_EXCL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_A, EC_WORD_TASTY, EC_WORD_VICTORY, EC_WORD_FOR, EC_WORD_ME}, - .speechLose = {EC_WORD_TOO, EC_WORD_TOUGH, EC_WORD_TO, EC_WORD_CRUSH, EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_TOO, EC_WORD_TOUGH, EC_WORD_TO, EC_WORD_CRUSH, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Ellen }, [FRONTIER_TRAINER_RAMON] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .trainerName = _("RAMON"), - .speechBefore = {EC_WORD_OKAY, EC_WORD_EXCL, 0xFFFF, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PERFECTION}, + .speechBefore = {EC_WORD_OKAY, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PERFECTION}, .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_THAT, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, .speechLose = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_SECRET, EC_WORD_WHY, EC_WORD_I_AM, EC_WORD_HAPPY}, .monSet = gBattleFrontierTrainerMons_Ramon @@ -764,8 +764,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .trainerName = _("ARTHUR"), .speechBefore = {EC_WORD_HERE_I_COME, EC_WORD_FEELING, EC_WORD_READY, EC_WORD_FOR, EC_WORD_IT, EC_WORD_ALL}, - .speechWin = {EC_WORD_THAT_S_IT_EXCL, 0xFFFF, 0xFFFF, EC_WORD_THAT_WAS, EC_WORD_FABULOUS, EC_WORD_EXCL}, - .speechLose = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_WHAT, EC_WORD_I, EC_WORD_NEED, 0xFFFF}, + .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_THAT_WAS, EC_WORD_FABULOUS, EC_WORD_EXCL}, + .speechLose = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_WHAT, EC_WORD_I, EC_WORD_NEED, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Arthur }, [FRONTIER_TRAINER_ALONDRA] = { @@ -781,7 +781,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("ADRIANA"), .speechBefore = {EC_WORD_COME, EC_WORD_SEE, EC_WORD_AN, EC_WORD_INCREDIBLE, EC_WORD_SWIFT_SWIM, EC_WORD_EXCL}, .speechWin = {EC_WORD_I, EC_WORD_MAKE, EC_WORD_IT, EC_WORD_LOOK, EC_WORD_SO, EC_WORD_EASY}, - .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_TIRED, 0xFFFF}, + .speechLose = {EC_WORD_I_AM, EC_WORD_FEELING, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_TIRED, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Adriana }, [FRONTIER_TRAINER_MALIK] = { @@ -795,17 +795,17 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_JILL] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .trainerName = _("JILL"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_WINS, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_WINS, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THE, EC_MOVE2(QUICK_ATTACK), EC_WORD_TRAINER, EC_WORD_GIVES, EC_WORD_UP, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Jill }, [FRONTIER_TRAINER_ERIK] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .trainerName = _("ERIK"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_FROM, EC_WORD_THE, EC_WORD_SPEED_BOOST, EC_WORD_HERO, EC_WORD_EXCL}, - .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, + .speechLose = {EC_WORD_WAAAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, .monSet = gBattleFrontierTrainerMons_Erik }, [FRONTIER_TRAINER_YAZMIN] = { @@ -843,9 +843,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_CARLO] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .trainerName = _("CARLO"), - .speechBefore = {EC_WORD_HAH, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_YEAH, EC_WORD_EXCL_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_HAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_DO, EC_WORD_THINGS, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_EXCL}, - .speechLose = {EC_WORD_I, EC_WORD_LOST, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLose = {EC_WORD_I, EC_WORD_LOST, EC_WORD_AT, EC_MOVE(EXTREME_SPEED), EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Carlo }, [FRONTIER_TRAINER_EMILIA] = { @@ -859,7 +859,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_DALIA] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_F, .trainerName = _("DALIA"), - .speechBefore = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_VERY, EC_WORD_EXPENSIVE, 0xFFFF}, + .speechBefore = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_VERY, EC_WORD_EXPENSIVE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_WORD_COME, EC_WORD_NEAR, EC_WORD_MY, EC_WORD_BIKE, EC_WORD_EXCL}, .speechLose = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_IS, EC_WORD_MY, EC_WORD_BEST, EC_WORD_FRIEND}, .monSet = gBattleFrontierTrainerMons_Dalia @@ -867,24 +867,24 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_HITOMI] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, .trainerName = _("HITOMI"), - .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_HAH, EC_WORD_EXCL_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, - .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, 0xFFFF, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_EXCL_EXCL}, + .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_HAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, + .speechLose = {EC_WORD_AIYEEH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_EXCL_EXCL}, .monSet = gBattleFrontierTrainerMons_Hitomi }, [FRONTIER_TRAINER_RICARDO] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, .trainerName = _("RICARDO"), .speechBefore = {EC_WORD_COME_ON, EC_WORD_EXCL, EC_WORD_PLAY, EC_WORD_TIME, EC_WORD_IS, EC_WORD_OVER}, - .speechWin = {EC_WORD_YOU_RE, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HERE, EC_WORD_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_HIT, EC_WORD_ME, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_YOU_RE, EC_WORD_OUT, EC_WORD_OF, EC_WORD_HERE, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_HIT, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Ricardo }, [FRONTIER_TRAINER_SHIZUKA] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, .trainerName = _("SHIZUKA"), .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_THAT, EC_WORD_YOU_RE, EC_WORD_SERIOUS, EC_WORD_EXCL}, - .speechWin = {EC_WORD_I, EC_WORD_WON_T, EC_WORD_FORGET, EC_WORD_ABOUT, EC_WORD_YOU, 0xFFFF}, + .speechWin = {EC_WORD_I, EC_WORD_WON_T, EC_WORD_FORGET, EC_WORD_ABOUT, EC_WORD_YOU, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_PERFECT, EC_WORD_IN, EC_WORD_EVERY, EC_WORD_WAY, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Shizuka }, @@ -900,7 +900,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_BATTLE_GIRL, .trainerName = _("KELLY"), .speechBefore = {EC_WORD_MY, EC_WORD_NIGHT, EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_REALLY, EC_WORD_SCARY}, - .speechWin = {EC_WORD_A, EC_WORD_LADY, EC_WORD_GHOST, EC_WORD_APPEARS, EC_WORD_THERE, 0xFFFF}, + .speechWin = {EC_WORD_A, EC_WORD_LADY, EC_WORD_GHOST, EC_WORD_APPEARS, EC_WORD_THERE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THE, EC_WORD_HOME, EC_WORD_WORK, EC_WORD_IS, EC_WORD_AWFULLY, EC_WORD_SCARY}, .monSet = gBattleFrontierTrainerMons_Kelly }, @@ -908,14 +908,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_BATTLE_GIRL, .trainerName = _("RAYNA"), .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_WHEN, EC_WORD_IT_S, EC_WORD_ABOUT, EC_WORD_POWER}, - .speechWin = {EC_WORD_UNDERSTAND, EC_WORD_MY, EC_WORD_POWER, EC_WORD_NOW, EC_WORD_QUES, 0xFFFF}, - .speechLose = {EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_I_AM, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, + .speechWin = {EC_WORD_UNDERSTAND, EC_WORD_MY, EC_WORD_POWER, EC_WORD_NOW, EC_WORD_QUES, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Rayna }, [FRONTIER_TRAINER_EVAN] = { .facilityClass = FACILITY_CLASS_EXPERT_M, .trainerName = _("EVAN"), - .speechBefore = {EC_WORD_EVERY, EC_WORD_BATTLE, EC_WORD_HAS, EC_WORD_A, EC_WORD_SMELL, 0xFFFF}, + .speechBefore = {EC_WORD_EVERY, EC_WORD_BATTLE, EC_WORD_HAS, EC_WORD_A, EC_WORD_SMELL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH, EC_WORD_EXCL, EC_WORD_THE, EC_MOVE(SWEET_SCENT), EC_WORD_OF, EC_WORD_VICTORY}, .speechLose = {EC_WORD_THE, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_OF, EC_WORD_A, EC_WORD_LOSS}, .monSet = gBattleFrontierTrainerMons_Evan @@ -923,23 +923,23 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_JORDAN] = { .facilityClass = FACILITY_CLASS_EXPERT_M, .trainerName = _("JORDAN"), - .speechBefore = {EC_WORD_GOOD, EC_WORD_EXCL, 0xFFFF, EC_WORD_COME_ON, EC_WORD_EXCL_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, 0xFFFF, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, + .speechBefore = {EC_WORD_GOOD, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_COME_ON, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WHAT, EC_WORD_QUES_EXCL, EC_EMPTY_WORD, EC_WORD_BUT, EC_WORD_HOW, EC_WORD_QUES}, .monSet = gBattleFrontierTrainerMons_Jordan }, [FRONTIER_TRAINER_JOEL] = { .facilityClass = FACILITY_CLASS_EXPERT_M, .trainerName = _("JOEL"), - .speechBefore = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_FUFUFU, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Joel }, [FRONTIER_TRAINER_KRISTEN] = { .facilityClass = FACILITY_CLASS_EXPERT_F, .trainerName = _("KRISTEN"), - .speechBefore = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_A, EC_WORD_KID, EC_WORD_ELLIPSIS}, + .speechBefore = {EC_WORD_HAHAHA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_A, EC_WORD_KID, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_JUST, EC_WORD_A_LITTLE, EC_WORD_KID, EC_WORD_AFTER, EC_WORD_ALL, EC_WORD_EXCL}, .speechLose = {EC_WORD_A, EC_WORD_TOUGH, EC_WORD_KID, EC_WORD_HUH_QUES, EC_WORD_HUMPH, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Kristen @@ -947,7 +947,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_SELPHY] = { .facilityClass = FACILITY_CLASS_EXPERT_F, .trainerName = _("SELPHY"), - .speechBefore = {EC_WORD_HUH_QUES, EC_WORD_WHAT, EC_WORD_IS_IT_QUES, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_HUH_QUES, EC_WORD_WHAT, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_OH, EC_WORD_YES, EC_WORD_EXCL, EC_WORD_WHY, EC_WORD_NOT, EC_WORD_QUES}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_EXCL, EC_WORD_WHY, EC_WORD_NOT, EC_WORD_QUES}, .monSet = gBattleFrontierTrainerMons_Selphy @@ -956,14 +956,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_EXPERT_F, .trainerName = _("CHLOE"), .speechBefore = {EC_WORD_COME, EC_WORD_WE, EC_WORD_WILL, EC_WORD_DO, EC_WORD_BATTLE, EC_WORD_NOW}, - .speechWin = {EC_WORD_MORE, EC_WORD_EXCL, 0xFFFF, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_EXCL}, - .speechLose = {EC_WORD_OH, EC_WORD_EXCL, 0xFFFF, EC_WORD_STRONG, EC_WORD_YOU, EC_WORD_ARE}, + .speechWin = {EC_WORD_MORE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_EXCL}, + .speechLose = {EC_WORD_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_STRONG, EC_WORD_YOU, EC_WORD_ARE}, .monSet = gBattleFrontierTrainerMons_Chloe }, [FRONTIER_TRAINER_NORTON] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, .trainerName = _("NORTON"), - .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_ONLY, EC_WORD_YOU, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_KNOW, EC_WORD_ONLY, EC_WORD_YOU, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_EXCUSE_ME, EC_WORD_BUT, EC_WORD_YOU_RE, EC_WORD_A, EC_WORD_PUSHOVER, EC_WORD_EXCL}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOME, EC_WORD_KIND, EC_WORD_OF, EC_WORD_AWESOME, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Norton @@ -973,15 +973,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("LUKAS"), .speechBefore = {EC_WORD_MY, EC_WORD_JOKING, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TERRIBLE, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_EXISTS, EC_WORD_TO, EC_WORD_SHINE, EC_WORD_EXCL}, - .speechLose = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_COME, EC_WORD_TO, EC_WORD_SHINE, 0xFFFF}, + .speechLose = {EC_WORD_YOUR, EC_WORD_ROCK_HEAD, EC_WORD_COME, EC_WORD_TO, EC_WORD_SHINE, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Lukas }, [FRONTIER_TRAINER_ZACH] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, .trainerName = _("ZACH"), .speechBefore = {EC_WORD_I_AM, EC_WORD_AN, EC_WORD_EXCELLENT, EC_MOVE2(MIMIC), EC_WORD_OF, EC_WORD_POKEMON}, - .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_LIKE, EC_WORD_A_LITTLE, EC_POKEMON2(TOGEPI), EC_WORD_EXCL}, - .speechLose = {EC_WORD_I_AM, EC_WORD_ANGRY, EC_WORD_LIKE, EC_WORD_A, EC_POKEMON2(MANKEY), EC_WORD_EXCL}, + .speechWin = {EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_LIKE, EC_WORD_A_LITTLE, EC_POKEMON_NATIONAL(TOGEPI), EC_WORD_EXCL}, + .speechLose = {EC_WORD_I_AM, EC_WORD_ANGRY, EC_WORD_LIKE, EC_WORD_A, EC_POKEMON_NATIONAL(MANKEY), EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Zach }, [FRONTIER_TRAINER_KAITLYN] = { @@ -997,7 +997,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("BREANNA"), .speechBefore = {EC_WORD_MY, EC_WORD_POKEMON, EC_WORD_WILL, EC_WORD_CRUSH, EC_WORD_YOU, EC_WORD_EXCL}, .speechWin = {EC_WORD_HAVE, EC_WORD_SOME, EC_WORD_MORE, EC_WORD_OF, EC_WORD_THIS, EC_WORD_EXCL}, - .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_GUTS, EC_WORD_AND, EC_WORD_SKILL, 0xFFFF}, + .speechLose = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_GUTS, EC_WORD_AND, EC_WORD_SKILL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Breanna }, [FRONTIER_TRAINER_KENDRA] = { @@ -1005,7 +1005,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("KENDRA"), .speechBefore = {EC_WORD_IF, EC_WORD_YOU_RE, EC_WORD_SMART, EC_WORD_STOP, EC_WORD_RIGHT, EC_WORD_NOW}, .speechWin = {EC_WORD_I, EC_WORD_SAID, EC_WORD_THAT, EC_WORD_YOU, EC_WORD_SHOULD, EC_WORD_STOP}, - .speechLose = {EC_WORD_WHY, EC_WORD_DIDN_T, EC_WORD_YOU, EC_WORD_STOP, EC_WORD_QUES, 0xFFFF}, + .speechLose = {EC_WORD_WHY, EC_WORD_DIDN_T, EC_WORD_YOU, EC_WORD_STOP, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Kendra }, [FRONTIER_TRAINER_MOLLY] = { @@ -1013,7 +1013,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("MOLLY"), .speechBefore = {EC_WORD_WILL, EC_WORD_MY, EC_WORD_CUTE_CHARM, EC_MOVE2(ATTRACT), EC_WORD_YOU, EC_WORD_QUES}, .speechWin = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_MY, EC_WORD_TOYS, EC_WORD_NOW}, - .speechLose = {EC_WORD_OH, EC_WORD_HOW, EC_WORD_COULD, EC_WORD_YOU, EC_WORD_QUES, 0xFFFF}, + .speechLose = {EC_WORD_OH, EC_WORD_HOW, EC_WORD_COULD, EC_WORD_YOU, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Molly }, [FRONTIER_TRAINER_JAZMIN] = { @@ -1077,7 +1077,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("BALEY"), .speechBefore = {EC_MOVE(SCREECH), EC_WORD_IS, EC_WORD_LIKE, EC_WORD_MUSIC, EC_WORD_TO_ME, EC_WORD_EXCL}, .speechWin = {EC_WORD_MY, EC_MOVE(SCREECH), EC_WORD_STRATEGY, EC_WORD_IS, EC_WORD_THE, EC_WORD_BEST}, - .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOUNDPROOF, EC_WORD_QUES, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_YOU_RE, EC_WORD_SOUNDPROOF, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Baley }, [FRONTIER_TRAINER_ZACKARY] = { @@ -1093,7 +1093,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("GABRIEL"), .speechBefore = {EC_MOVE2(POUND), EC_WORD_THE, EC_WORD_THICK_FAT, EC_WORD_ON, EC_WORD_MY, EC_MOVE2(BELLY_DRUM)}, .speechWin = {EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_MOVE2(POUND), EC_WORD_MY, EC_MOVE2(BELLY_DRUM)}, - .speechLose = {EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_WORD_WAS, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLose = {EC_WORD_MY, EC_MOVE2(BELLY_DRUM), EC_WORD_WAS, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Gabriel }, [FRONTIER_TRAINER_EMILY] = { @@ -1115,17 +1115,17 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_SOFIA] = { .facilityClass = FACILITY_CLASS_AROMA_LADY, .trainerName = _("SOFIA"), - .speechBefore = {EC_POKEMON(LOUDRED), EC_WORD_PROBABLY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), 0xFFFF}, + .speechBefore = {EC_POKEMON(LOUDRED), EC_WORD_PROBABLY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_EMPTY_WORD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_THE, EC_WORD_FEELING, EC_WORD_THAT, EC_WORD_I, EC_WORD_GET}, - .speechLose = {EC_WORD_I, EC_WORD_WORK, EC_WORD_AT, EC_WORD_THE, EC_WORD_DEPT_STORE, 0xFFFF}, + .speechLose = {EC_WORD_I, EC_WORD_WORK, EC_WORD_AT, EC_WORD_THE, EC_WORD_DEPT_STORE, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Sofia }, [FRONTIER_TRAINER_BRADEN] = { .facilityClass = FACILITY_CLASS_COOLTRAINER_M, .trainerName = _("BRADEN"), - .speechBefore = {EC_WORD_I_CHOOSE_YOU, EC_WORD_EXCL, 0xFFFF, EC_WORD_THIS_IS_IT_EXCL, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_I_CHOOSE_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_THIS_IS_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_PRETTY, EC_WORD_AWESOME, EC_WORD_ABOUT, EC_WORD_MYSELF}, - .speechLose = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_SURRENDER, EC_WORD_EXCL}, + .speechLose = {EC_WORD_ALL_RIGHT, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_SURRENDER, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Braden }, [FRONTIER_TRAINER_KAYDEN] = { @@ -1133,7 +1133,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("KAYDEN"), .speechBefore = {EC_WORD_THEY, EC_WORD_OVERDO, EC_WORD_THAT, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_ELLIPSIS}, .speechWin = {EC_WORD_THAT, EC_WORD_GOURMET, EC_WORD_THING, EC_WORD_ISN_T, EC_WORD_FOR, EC_WORD_ME}, - .speechLose = {EC_WORD_HEY, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TASTY, 0xFFFF}, + .speechLose = {EC_WORD_HEY, EC_WORD_THIS, EC_WORD_IS, EC_WORD_PRETTY, EC_WORD_TASTY, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Kayden }, [FRONTIER_TRAINER_COOPER] = { @@ -1141,7 +1141,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("COOPER"), .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_ABSOLUTELY, EC_WORD_BE, EC_WORD_A, EC_WORD_PUSHOVER}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_TOO, EC_WORD_EXCITING, EC_WORD_FOR, EC_WORD_ME, EC_WORD_ELLIPSIS}, - .speechLose = {EC_WORD_PLEASE, EC_WORD_EXCL, 0xFFFF, EC_WORD_SORRY, EC_WORD_I_AM, EC_WORD_SORRY}, + .speechLose = {EC_WORD_PLEASE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_SORRY, EC_WORD_I_AM, EC_WORD_SORRY}, .monSet = gBattleFrontierTrainerMons_Cooper }, [FRONTIER_TRAINER_JULIA] = { @@ -1179,8 +1179,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_DOMINIC] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, .trainerName = _("DOMINIC"), - .speechBefore = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_THIS, EC_WORD_EXCELLENT, EC_WORD_CAMERA, 0xFFFF}, - .speechWin = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_WAS, EC_WORD_AWFULLY, EC_WORD_EXPENSIVE, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_THIS, EC_WORD_EXCELLENT, EC_WORD_CAMERA, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_WAS, EC_WORD_AWFULLY, EC_WORD_EXPENSIVE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_CAMERA, EC_WORD_DOESN_T, EC_WORD_MISS, EC_WORD_A, EC_WORD_THING}, .monSet = gBattleFrontierTrainerMons_Dominic }, @@ -1188,8 +1188,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, .trainerName = _("NIKOLAS"), .speechBefore = {EC_WORD_I, EC_MOVE2(MIMIC), EC_WORD_POKEMON, EC_WORD_AFTER, EC_WORD_EVERY, EC_WORD_BATTLE}, - .speechWin = {EC_WORD_IF_I_WIN, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON2(TAUROS)}, - .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON2(MILTANK)}, + .speechWin = {EC_WORD_IF_I_WIN, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON_NATIONAL(TAUROS)}, + .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_PRETEND, EC_WORD_I_AM, EC_WORD_A, EC_POKEMON_NATIONAL(MILTANK)}, .monSet = gBattleFrontierTrainerMons_Nikolas }, [FRONTIER_TRAINER_VALERIA] = { @@ -1212,16 +1212,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, .trainerName = _("MEGHAN"), .speechBefore = {EC_WORD_SCHOOL, EC_WORD_IS, EC_WORD_OUT, EC_WORD_TIME, EC_WORD_TO, EC_WORD_PLAY}, - .speechWin = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_LIKES, EC_WORD_COMICS, 0xFFFF}, - .speechLose = {EC_WORD_IT_S, EC_WORD_BACK, EC_WORD_TO, EC_WORD_SCHOOL, EC_WORD_SOON, 0xFFFF}, + .speechWin = {EC_WORD_MY, EC_WORD_BOY, EC_WORD_FRIEND, EC_WORD_LIKES, EC_WORD_COMICS, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_IT_S, EC_WORD_BACK, EC_WORD_TO, EC_WORD_SCHOOL, EC_WORD_SOON, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Meghan }, [FRONTIER_TRAINER_ROBERTO] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, .trainerName = _("ROBERTO"), - .speechBefore = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_INVINCIBLE, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_DRAGON, EC_WORD_POKEMON, EC_WORD_ARE, EC_WORD_INVINCIBLE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_YOU, EC_WORD_WEREN_T, EC_WORD_BAD, EC_WORD_I_WAS, EC_WORD_JUST, EC_WORD_BETTER}, - .speechLose = {EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_SATISFIED, EC_WORD_YET, EC_WORD_QUES, 0xFFFF}, + .speechLose = {EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_SATISFIED, EC_WORD_YET, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Roberto }, [FRONTIER_TRAINER_DAMIAN] = { @@ -1229,7 +1229,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("DAMIAN"), .speechBefore = {EC_WORD_MY, EC_WORD_PURE_POWER, EC_WORD_IS, EC_WORD_MACHINE, EC_WORD_LIKE, EC_WORD_EXCL}, .speechWin = {EC_WORD_MY, EC_MOVE2(MACH_PUNCH), EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_A, EC_MOVE(BRICK_BREAK)}, - .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL, 0xFFFF, EC_WORD_NO, EC_WORD_EXCL_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_ARRGH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Damian }, [FRONTIER_TRAINER_BRODY] = { @@ -1243,7 +1243,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_GRAHAM] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, .trainerName = _("GRAHAM"), - .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL, 0xFFFF, EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_YEAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_YEAH_YEAH, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_WORD_WAHAHAHA, EC_WORD_WAHAHAHA, EC_WORD_EXCL_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_ELLIPSIS, EC_WORD_IT_S, EC_WORD_MY, EC_WORD_BAD}, .monSet = gBattleFrontierTrainerMons_Graham @@ -1252,23 +1252,23 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_POKEFAN_M, .trainerName = _("TYLOR"), .speechBefore = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_FEELING, EC_WORD_MY, EC_MOVE2(HEAT_WAVE), EC_WORD_QUES}, - .speechWin = {EC_WORD_YES, EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_YES, EC_WORD_I_AM, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_BUT, EC_WORD_I_WAS, EC_WORD_ON, EC_WORD_FIRE, EC_WORD_FOR, EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Tylor }, [FRONTIER_TRAINER_JAREN] = { .facilityClass = FACILITY_CLASS_POKEFAN_F, .trainerName = _("JAREN"), - .speechBefore = {EC_WORD_FIGHTING, EC_WORD_SPIRIT, EC_WORD_QUES, EC_WORD_ME, EC_WORD_QUES, 0xFFFF}, - .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MORE, EC_WORD_CUTE, EC_WORD_POKEMON, 0xFFFF}, - .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_LOOK, EC_WORD_QUITE, EC_WORD_CUTE, 0xFFFF}, + .speechBefore = {EC_WORD_FIGHTING, EC_WORD_SPIRIT, EC_WORD_QUES, EC_WORD_ME, EC_WORD_QUES, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MORE, EC_WORD_CUTE, EC_WORD_POKEMON, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_LOOK, EC_WORD_QUITE, EC_WORD_CUTE, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Jaren }, [FRONTIER_TRAINER_CORDELL] = { .facilityClass = FACILITY_CLASS_PKMN_BREEDER_M, .trainerName = _("CORDELL"), .speechBefore = {EC_WORD_A, EC_WORD_BATTLE, EC_WORD_IS, EC_WORD_DECIDED, EC_WORD_ON, EC_WORD_SPIRIT}, - .speechWin = {EC_WORD_CAN_T, EC_WORD_YOU, EC_WORD_ACCEPT, EC_WORD_THAT, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_CAN_T, EC_WORD_YOU, EC_WORD_ACCEPT, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_BE, EC_WORD_ON, EC_WORD_MY, EC_WORD_WAY}, .monSet = gBattleFrontierTrainerMons_Cordell }, @@ -1291,7 +1291,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_JOHAN] = { .facilityClass = FACILITY_CLASS_YOUNGSTER, .trainerName = _("JOHAN"), - .speechBefore = {EC_WORD_WINTER, EC_WORD_WILL, EC_WORD_SOON, EC_WORD_BE, EC_WORD_HERE, 0xFFFF}, + .speechBefore = {EC_WORD_WINTER, EC_WORD_WILL, EC_WORD_SOON, EC_WORD_BE, EC_WORD_HERE, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MY, EC_WORD_ALLOWANCE, EC_WORD_COULD, EC_WORD_USE, EC_WORD_A, EC_MOVE2(HELPING_HAND)}, .speechLose = {EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_USE, EC_WORD_MY, EC_WORD_ALLOWANCE, EC_WORD_UP}, .monSet = gBattleFrontierTrainerMons_Johan @@ -1315,7 +1315,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_ISIAH] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_M, .trainerName = _("ISIAH"), - .speechBefore = {EC_WORD_I, EC_WORD_PRETEND, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_A_LOT, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_PRETEND, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_A_LOT, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_MOVE2(TRICK), EC_WORD_MOTHER, EC_WORD_FOR, EC_WORD_MY, EC_WORD_ALLOWANCE}, .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_WANT, EC_WORD_TO, EC_WORD_STUDY, EC_WORD_MORE}, .monSet = gBattleFrontierTrainerMons_Isiah @@ -1340,14 +1340,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, .trainerName = _("MEGAN"), .speechBefore = {EC_WORD_I, EC_WORD_BELIEVE, EC_WORD_IN, EC_WORD_AN, EC_MOVE(AROMATHERAPY), EC_WORD_BATH}, - .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_HEALTHY, EC_WORD_CLEAR_BODY, 0xFFFF}, + .speechWin = {EC_WORD_I, EC_WORD_WANT, EC_WORD_A, EC_WORD_HEALTHY, EC_WORD_CLEAR_BODY, EC_EMPTY_WORD}, .speechLose = {EC_WORD_IF, EC_WORD_ONLY, EC_MOVE(AROMATHERAPY), EC_WORD_WERE, EC_WORD_LESS, EC_WORD_EXPENSIVE}, .monSet = gBattleFrontierTrainerMons_Megan }, [FRONTIER_TRAINER_ISSAC] = { .facilityClass = FACILITY_CLASS_RICH_BOY, .trainerName = _("ISSAC"), - .speechBefore = {EC_WORD_MY, EC_WORD_HOBBY, EC_WORD_QUES, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_MY, EC_WORD_HOBBY, EC_WORD_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_ANY, EC_WORD_KIND, EC_WORD_OF, EC_MOVE2(WATER_SPORT)}, .speechLose = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_ANY, EC_WORD_KIND, EC_WORD_OF, EC_MOVE2(MUD_SPORT)}, .monSet = gBattleFrontierTrainerMons_Issac @@ -1355,8 +1355,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_QUINTON] = { .facilityClass = FACILITY_CLASS_RICH_BOY, .trainerName = _("QUINTON"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_SAD, EC_WORD_CAUSE, EC_WORD_I_AM, EC_WORD_TOO_WEAK, 0xFFFF}, - .speechWin = {EC_WORD_YOU, EC_WORD_AREN_T, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_SAD, EC_WORD_CAUSE, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_YOU, EC_WORD_AREN_T, EC_WORD_TOO_STRONG, EC_WORD_FOR, EC_WORD_ME, EC_EMPTY_WORD}, .speechLose = {EC_WORD_HEY, EC_WORD_WHAT, EC_WORD_DID, EC_WORD_I, EC_WORD_DO, EC_WORD_QUES}, .monSet = gBattleFrontierTrainerMons_Quinton }, @@ -1372,7 +1372,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_LADY, .trainerName = _("ANSLEY"), .speechBefore = {EC_WORD_I_AM, EC_WORD_BORED, EC_WORD_ELLIPSIS, EC_WORD_DANCE, EC_WORD_FOR, EC_WORD_ME}, - .speechWin = {EC_WORD_YOU_VE, EC_WORD_BORED, EC_WORD_ME, EC_WORD_SOME, EC_WORD_MORE, 0xFFFF}, + .speechWin = {EC_WORD_YOU_VE, EC_WORD_BORED, EC_WORD_ME, EC_WORD_SOME, EC_WORD_MORE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_TAKE, EC_WORD_YOUR, EC_MOVE2(FRUSTRATION), EC_WORD_SOME, EC_WORD_OTHER, EC_WORD_PLACE}, .monSet = gBattleFrontierTrainerMons_Ansley }, @@ -1380,8 +1380,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_BUG_CATCHER, .trainerName = _("HOLDEN"), .speechBefore = {EC_WORD_LET_S, EC_WORD_COMMEMORATE, EC_WORD_MY, EC_WORD_COOLNESS, EC_WORD_IN, EC_WORD_BATTLE}, - .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_FOR, EC_WORD_ANY, EC_WORD_PRAISE, 0xFFFF}, - .speechLose = {EC_WORD_YOUR, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_AMUSING, 0xFFFF}, + .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_FOR, EC_WORD_ANY, EC_WORD_PRAISE, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_YOUR, EC_WORD_BATTLE, EC_WORD_SENSE, EC_WORD_IS, EC_WORD_AMUSING, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Holden }, [FRONTIER_TRAINER_LUCA] = { @@ -1396,14 +1396,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_NINJA_BOY, .trainerName = _("JAMISON"), .speechBefore = {EC_WORD_MY, EC_MOVE2(SECRET_POWER), EC_WORD_IS, EC_WORD_OVERWHELMING, EC_WORD_TO, EC_WORD_POKEMON}, - .speechWin = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_USE, EC_MOVE(SMOKESCREEN), EC_WORD_TO, EC_WORD_ESCAPE}, .monSet = gBattleFrontierTrainerMons_Jamison }, [FRONTIER_TRAINER_GUNNAR] = { .facilityClass = FACILITY_CLASS_NINJA_BOY, .trainerName = _("GUNNAR"), - .speechBefore = {EC_WORD_I, EC_MOVE(CUT), EC_WORD_DOWN, EC_WORD_EVERY, EC_WORD_OPPONENT, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_MOVE(CUT), EC_WORD_DOWN, EC_WORD_EVERY, EC_WORD_OPPONENT, EC_EMPTY_WORD}, .speechWin = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_FOR, EC_WORD_YOUR, EC_WORD_LOSS}, .speechLose = {EC_WORD_PLEASE, EC_WORD_LOSE, EC_WORD_THAT, EC_MOVE(SCARY_FACE), EC_WORD_OF, EC_WORD_YOURS}, .monSet = gBattleFrontierTrainerMons_Gunnar @@ -1413,22 +1413,22 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("CRAIG"), .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_FOR, EC_WORD_MY, EC_WORD_TRAIN}, .speechWin = {EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_ISN_T, EC_WORD_HERE, EC_WORD_YET, EC_WORD_ELLIPSIS}, - .speechLose = {EC_WORD_HERE_IT_IS, EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_SEE_YA, EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_HERE_IT_IS, EC_WORD_MY, EC_WORD_TRAIN, EC_WORD_SEE_YA, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Craig }, [FRONTIER_TRAINER_PIERCE] = { .facilityClass = FACILITY_CLASS_TUBER_M, .trainerName = _("PIERCE"), .speechBefore = {EC_WORD_THERE, EC_WORD_WAS, EC_WORD_A, EC_MOVE2(HEAT_WAVE), EC_WORD_LAST, EC_WORD_WEEK}, - .speechWin = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(HEAT_WAVE), 0xFFFF}, - .speechLose = {EC_WORD_DIDN_T, EC_WORD_IT, EC_MOVE(HAIL), EC_WORD_TOO, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(HEAT_WAVE), EC_EMPTY_WORD}, + .speechLose = {EC_WORD_DIDN_T, EC_WORD_IT, EC_MOVE(HAIL), EC_WORD_TOO, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Pierce }, [FRONTIER_TRAINER_REGINA] = { .facilityClass = FACILITY_CLASS_TUBER_F, .trainerName = _("REGINA"), .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_PLAY, EC_WORD_IN, EC_WORD_WATER}, - .speechWin = {EC_WORD_I, EC_WORD_REFUSE, EC_WORD_TO, EC_WORD_COME, EC_WORD_OUT, 0xFFFF}, + .speechWin = {EC_WORD_I, EC_WORD_REFUSE, EC_WORD_TO, EC_WORD_COME, EC_WORD_OUT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_NOT, EC_WORD_MUCH, EC_WORD_GOOD, EC_WORD_IN, EC_WORD_WATER}, .monSet = gBattleFrontierTrainerMons_Regina }, @@ -1469,7 +1469,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("HUNTER"), .speechBefore = {EC_WORD_SHOW, EC_WORD_ME, EC_WORD_A, EC_WORD_TOTALLY, EC_WORD_COOL, EC_MOVE(CROSS_CHOP)}, .speechWin = {EC_WORD_YOU_RE, EC_WORD_TOO_WEAK, EC_WORD_TO, EC_WORD_DO, EC_WORD_A, EC_MOVE(CROSS_CHOP)}, - .speechLose = {EC_WORD_WAS, EC_WORD_IT, EC_WORD_A, EC_WORD_MISTAKE, EC_WORD_QUES, 0xFFFF}, + .speechLose = {EC_WORD_WAS, EC_WORD_IT, EC_WORD_A, EC_WORD_MISTAKE, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Hunter }, [FRONTIER_TRAINER_AIDEN] = { @@ -1483,9 +1483,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_XAVIER] = { .facilityClass = FACILITY_CLASS_RUIN_MANIAC, .trainerName = _("XAVIER"), - .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, 0xFFFF, EC_WORD_LOOK, EC_WORD_LOOK, EC_WORD_EXCL_EXCL}, - .speechWin = {EC_WORD_GOOD_BYE, EC_WORD_AND, EC_WORD_THANK_YOU, EC_WORD_THAT_WAS, EC_WORD_FUNNY, 0xFFFF}, - .speechLose = {EC_WORD_WOWEE, EC_WORD_EXCL, 0xFFFF, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, + .speechBefore = {EC_WORD_HEY_THERE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_LOOK, EC_WORD_LOOK, EC_WORD_EXCL_EXCL}, + .speechWin = {EC_WORD_GOOD_BYE, EC_WORD_AND, EC_WORD_THANK_YOU, EC_WORD_THAT_WAS, EC_WORD_FUNNY, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WOWEE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_NO, EC_WORD_NO, EC_WORD_EXCL_EXCL}, .monSet = gBattleFrontierTrainerMons_Xavier }, [FRONTIER_TRAINER_CLINTON] = { @@ -1493,7 +1493,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("CLINTON"), .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_MY, EC_MOVE(HYPNOSIS), EC_WORD_QUES}, .speechWin = {EC_WORD_YOUR, EC_MOVE2(FURY_SWIPES), EC_WORD_YOUR, EC_MOVE(STRENGTH), EC_WORD_YOUNG, EC_WORD_TRAINER}, - .speechLose = {EC_WORD_TCH, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS}, + .speechLose = {EC_WORD_TCH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_TOO_WEAK, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Clinton }, [FRONTIER_TRAINER_JESSE] = { @@ -1501,7 +1501,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("JESSE"), .speechBefore = {EC_WORD_THIS, EC_WORD_BATTLE, EC_WORD_IS, EC_WORD_FOR, EC_WORD_MY, EC_WORD_MOTHER}, .speechWin = {EC_WORD_MOTHER, EC_WORD_WILL, EC_WORD_BE, EC_WORD_HAPPY, EC_WORD_FOR, EC_WORD_ME}, - .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MY, EC_WORD_MOTHER, EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_I, EC_WORD_WANT, EC_WORD_MY, EC_WORD_MOTHER, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Jesse }, [FRONTIER_TRAINER_EDUARDO] = { @@ -1515,7 +1515,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_HAL] = { .facilityClass = FACILITY_CLASS_GUITARIST, .trainerName = _("HAL"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_TRENDY, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_TRENDY, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_HIP_AND, EC_WORD_HAPPENING, EC_WORD_OH_YEAH, EC_WORD_EXCL}, .speechLose = {EC_WORD_I_AM, EC_WORD_ALWAYS, EC_WORD_TRENDY, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, .monSet = gBattleFrontierTrainerMons_Hal @@ -1525,7 +1525,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("GAGE"), .speechBefore = {EC_WORD_HERE_IT_IS, EC_WORD_A, EC_WORD_FLYING, EC_WORD_TYPE, EC_WORD_HIDDEN, EC_WORD_MOVE}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_FLYING, EC_WORD_TYPE, EC_WORD_VICTORY, EC_WORD_EXCL}, - .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_JUST, EC_MOVE(FLY), EC_WORD_AWAY, 0xFFFF}, + .speechLose = {EC_WORD_IF_I_LOSE, EC_WORD_I, EC_WORD_JUST, EC_MOVE(FLY), EC_WORD_AWAY, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Gage }, [FRONTIER_TRAINER_ARNOLD] = { @@ -1563,8 +1563,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_GUSTAVO] = { .facilityClass = FACILITY_CLASS_HIKER, .trainerName = _("GUSTAVO"), - .speechBefore = {EC_MOVE(CHARGE), EC_WORD_EXCL, 0xFFFF, EC_MOVE(CHARGE), EC_WORD_EXCL_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_SURRENDER, EC_WORD_QUES, 0xFFFF, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, + .speechBefore = {EC_MOVE(CHARGE), EC_WORD_EXCL, EC_EMPTY_WORD, EC_MOVE(CHARGE), EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_SURRENDER, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, .speechLose = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_SURRENDER, EC_WORD_YET}, .monSet = gBattleFrontierTrainerMons_Gustavo }, @@ -1581,7 +1581,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("ALFREDO"), .speechBefore = {EC_WORD_A, EC_WORD_FIERY, EC_WORD_GOURMET, EC_WORD_AM, EC_WORD_I, EC_WORD_EXCL}, .speechWin = {EC_WORD_IT_S, EC_WORD_A, EC_WORD_TASTY, EC_WORD_GOURMET, EC_WORD_VICTORY, EC_WORD_EXCL}, - .speechLose = {EC_WORD_WHAT, EC_WORD_A, EC_WORD_DISASTER, EC_WORD_THAT_WAS, EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_WHAT, EC_WORD_A, EC_WORD_DISASTER, EC_WORD_THAT_WAS, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Alfredo }, [FRONTIER_TRAINER_RUBEN] = { @@ -1589,15 +1589,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("RUBEN"), .speechBefore = {EC_WORD_I, EC_WORD_CAN_T, EC_WORD_WAIT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING}, .speechWin = {EC_WORD_GET, EC_WORD_GOING, EC_WORD_EXCL, EC_WORD_THIS, EC_WORD_IS, EC_WORD_GOOD_BYE}, - .speechLose = {EC_WORD_I_VE, EC_WORD_GOT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING, 0xFFFF}, + .speechLose = {EC_WORD_I_VE, EC_WORD_GOT, EC_WORD_TO, EC_WORD_GET, EC_WORD_GOING, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Ruben }, [FRONTIER_TRAINER_LAMAR] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, .trainerName = _("LAMAR"), - .speechBefore = {EC_WORD_A, EC_MOVE2(PRESENT), EC_WORD_FOR, EC_WORD_ME, EC_WORD_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_A, EC_MOVE2(PRESENT), EC_WORD_FOR, EC_WORD_ME, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_MMM, EC_WORD_THIS, EC_WORD_IS, EC_WORD_QUITE, EC_WORD_TASTY, EC_WORD_ELLIPSIS}, - .speechLose = {EC_WORD_OH, EC_WORD_IT_S, EC_WORD_A, EC_WORD_GAME, EC_WORD_IS_IT_QUES, 0xFFFF}, + .speechLose = {EC_WORD_OH, EC_WORD_IT_S, EC_WORD_A, EC_WORD_GAME, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Lamar }, [FRONTIER_TRAINER_JAXON] = { @@ -1645,14 +1645,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("SKYLER"), .speechBefore = {EC_MOVE2(INGRAIN), EC_WORD_IS, EC_WORD_MY, EC_WORD_CHOICE, EC_WORD_BATTLE, EC_WORD_MOVE}, .speechWin = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_MOVE, EC_WORD_ME, EC_WORD_NOW, EC_WORD_EXCL}, - .speechLose = {EC_WORD_YOU, EC_MOVE(CUT), EC_WORD_ME, EC_WORD_DOWN, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLose = {EC_WORD_YOU, EC_MOVE(CUT), EC_WORD_ME, EC_WORD_DOWN, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Skyler }, [FRONTIER_TRAINER_RUTH] = { .facilityClass = FACILITY_CLASS_PICNICKER, .trainerName = _("RUTH"), .speechBefore = {EC_WORD_I, EC_WORD_WANT, EC_WORD_TO, EC_WORD_ENJOY, EC_WORD_THIS, EC_WORD_BATTLE}, - .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MUCH, EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_THAT_WAS, EC_WORD_MUCH, EC_WORD_TOO, EC_WORD_EASY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_PLEASE, EC_WORD_STOP, EC_WORD_I, EC_WORD_DON_T, EC_WORD_ENJOY, EC_WORD_THIS}, .monSet = gBattleFrontierTrainerMons_Ruth }, @@ -1669,7 +1669,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("PEDRO"), .speechBefore = {EC_WORD_A, EC_WORD_SWIFT_SWIM, EC_WORD_WILL, EC_WORD_DO, EC_WORD_YOU, EC_WORD_GOOD}, .speechWin = {EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_I, EC_WORD_SINK, EC_WORD_AN, EC_WORD_OPPONENT}, - .speechLose = {EC_WORD_UH_OH, EC_WORD_EXCL, 0xFFFF, EC_WORD_A, EC_MOVE(WHIRLPOOL), EC_WORD_EXCL}, + .speechLose = {EC_WORD_UH_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_A, EC_MOVE(WHIRLPOOL), EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Pedro }, [FRONTIER_TRAINER_ERICK] = { @@ -1693,7 +1693,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("JOYCE"), .speechBefore = {EC_WORD_YOU, EC_WORD_MAKE, EC_WORD_ME, EC_WORD_GO, EC_WORD_AHAHA, EC_WORD_EXCL}, .speechWin = {EC_WORD_LALALA, EC_WORD_NO, EC_WORD_LOSING, EC_WORD_FOR, EC_WORD_ME, EC_WORD_EXCL}, - .speechLose = {EC_WORD_LALALA, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_HUH_QUES, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_LALALA, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_HUH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Joyce }, [FRONTIER_TRAINER_TODD] = { @@ -1707,8 +1707,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_GAVIN] = { .facilityClass = FACILITY_CLASS_POKEFAN_M, .trainerName = _("GAVIN"), - .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_MOVE(BIDE), EC_WORD_MY, EC_WORD_TIME, 0xFFFF}, - .speechWin = {EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_MOVE(BIDE), EC_WORD_MY, EC_WORD_TIME, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_MY, EC_WORD_MISTAKE, EC_WORD_WAS, EC_WORD_TOO, EC_WORD_EXPENSIVE, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Gavin }, @@ -1716,7 +1716,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_POKEFAN_F, .trainerName = _("MALORY"), .speechBefore = {EC_WORD_PROMISE, EC_WORD_TO, EC_WORD_SHOW, EC_WORD_ME, EC_WORD_CUTE, EC_WORD_POKEMON}, - .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, + .speechWin = {EC_WORD_GIGGLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_SO, EC_WORD_MUCH}, .speechLose = {EC_WORD_TCH, EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_VERY, EC_WORD_NICE}, .monSet = gBattleFrontierTrainerMons_Malory }, @@ -1733,7 +1733,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("OSCAR"), .speechBefore = {EC_WORD_LET_S, EC_WORD_SEE, EC_WORD_YOUR, EC_WORD_POWER, EC_WORD_IN, EC_WORD_FULL}, .speechWin = {EC_WORD_THAT_WAS, EC_WORD_NOT, EC_WORD_YOUR, EC_WORD_FULL, EC_WORD_POWER, EC_WORD_EXCL}, - .speechLose = {EC_WORD_NOT, EC_WORD_FUNNY, EC_WORD_ELLIPSIS, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, 0xFFFF}, + .speechLose = {EC_WORD_NOT, EC_WORD_FUNNY, EC_WORD_ELLIPSIS, EC_WORD_YOU_RE, EC_WORD_TOO_STRONG, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Oscar }, [FRONTIER_TRAINER_WILSON] = { @@ -1772,8 +1772,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_COOLTRAINER_M, .trainerName = _("ALONZO"), .speechBefore = {EC_WORD_I_VE, EC_WORD_NOT, EC_WORD_LOST, EC_WORD_ONCE, EC_WORD_YET, EC_WORD_EXCL}, - .speechWin = {EC_WORD_YOUR, EC_WORD_SAD, EC_WORD_LOOK, EC_WORD_BECOMES, EC_WORD_YOU, 0xFFFF}, - .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_BELIEVE, EC_WORD_THIS, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechWin = {EC_WORD_YOUR, EC_WORD_SAD, EC_WORD_LOOK, EC_WORD_BECOMES, EC_WORD_YOU, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_I, EC_WORD_DON_T, EC_WORD_BELIEVE, EC_WORD_THIS, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Alonzo }, [FRONTIER_TRAINER_VINCE] = { @@ -1812,7 +1812,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_COOLTRAINER_F, .trainerName = _("CARRIE"), .speechBefore = {EC_WORD_I, EC_WORD_WILL, EC_WORD_SHOW, EC_WORD_YOU, EC_WORD_GUTSY, EC_WORD_EXCL}, - .speechWin = {EC_WORD_IT_S, EC_WORD_ALL, EC_WORD_ABOUT, EC_WORD_GUTS, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_IT_S, EC_WORD_ALL, EC_WORD_ABOUT, EC_WORD_GUTS, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_OH, EC_WORD_NO, EC_WORD_ELLIPSIS, EC_MOVE(SELF_DESTRUCT), EC_WORD_MODE, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Carrie }, @@ -1827,9 +1827,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_TYLER] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, .trainerName = _("TYLER"), - .speechBefore = {EC_WORD_YO, EC_WORD_EXCL, 0xFFFF, EC_WORD_LET_S, EC_WORD_GO, EC_WORD_EXCL_EXCL}, - .speechWin = {EC_WORD_YO, EC_WORD_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_WON, EC_WORD_YO}, - .speechLose = {EC_WORD_YO, EC_WORD_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_LOST, EC_WORD_YO}, + .speechBefore = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_LET_S, EC_WORD_GO, EC_WORD_EXCL_EXCL}, + .speechWin = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_WON, EC_WORD_YO}, + .speechLose = {EC_WORD_YO, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_LOST, EC_WORD_YO}, .monSet = gBattleFrontierTrainerMons_Tyler }, [FRONTIER_TRAINER_CHAZ] = { @@ -1867,7 +1867,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_DORINE] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, .trainerName = _("DORINE"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AND, EC_WORD_STRONG, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_YOUNG, EC_WORD_AND, EC_WORD_STRONG, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SEE, EC_WORD_QUES, EC_WORD_AREN_T, EC_WORD_I, EC_WORD_GOOD, EC_WORD_QUES}, .speechLose = {EC_WORD_THIS, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_OUT, EC_WORD_AT, EC_WORD_ALL}, .monSet = gBattleFrontierTrainerMons_Dorine @@ -1883,9 +1883,9 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_DAVIN] = { .facilityClass = FACILITY_CLASS_DRAGON_TAMER, .trainerName = _("DAVIN"), - .speechBefore = {EC_WORD_LET_S, EC_WORD_HEAR, EC_WORD_YOU, EC_MOVE2(ROAR), EC_WORD_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_WROOOAAR_EXCL, 0xFFFF, 0xFFFF, EC_WORD_VICTORY, EC_WORD_EXCL_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_WROOOAAR_EXCL, 0xFFFF, 0xFFFF, EC_WORD_WHY, EC_WORD_QUES_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_LET_S, EC_WORD_HEAR, EC_WORD_YOU, EC_MOVE2(ROAR), EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_VICTORY, EC_WORD_EXCL_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WROOOAAR_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_WHY, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Davin }, [FRONTIER_TRAINER_TREVON] = { @@ -1915,7 +1915,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_RAUL] = { .facilityClass = FACILITY_CLASS_BLACK_BELT, .trainerName = _("RAUL"), - .speechBefore = {EC_WORD_I, EC_WORD_REJECT, EC_WORD_EVERY, EC_WORD_WEAK, EC_WORD_TRAINER, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_REJECT, EC_WORD_EVERY, EC_WORD_WEAK, EC_WORD_TRAINER, EC_EMPTY_WORD}, .speechWin = {EC_WORD_HUMPH, EC_WORD_EXCL, EC_WORD_ANOTHER, EC_WORD_WEAK, EC_WORD_TRAINER, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_THERE, EC_WORD_IS, EC_WORD_NOTHING, EC_WORD_WEAK, EC_WORD_ABOUT, EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Raul @@ -1923,7 +1923,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_KAY] = { .facilityClass = FACILITY_CLASS_BATTLE_GIRL, .trainerName = _("KAY"), - .speechBefore = {EC_WORD_AND, EC_WORD_YET, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_AND, EC_WORD_YET, EC_WORD_ANOTHER, EC_WORD_BATTLE, EC_WORD_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I, EC_WORD_WON, EC_WORD_BUT, EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_ELLIPSIS}, .speechLose = {EC_WORD_GOOD, EC_WORD_IT_S, EC_WORD_OVER, EC_WORD_AT, EC_WORD_LAST, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Kay @@ -1940,7 +1940,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_BATTLE_GIRL, .trainerName = _("ALANA"), .speechBefore = {EC_WORD_EAT, EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_ATTACK, EC_WORD_YOU, EC_WORD_EXCL}, - .speechWin = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_LEARN, 0xFFFF}, + .speechWin = {EC_WORD_YOU, EC_WORD_HAVE, EC_WORD_MUCH, EC_WORD_TO, EC_WORD_LEARN, EC_EMPTY_WORD}, .speechLose = {EC_WORD_SO, EC_WORD_MUCH, EC_WORD_FOR, EC_WORD_MY, EC_WORD_INVINCIBLE, EC_WORD_ATTACK}, .monSet = gBattleFrontierTrainerMons_Alana }, @@ -1948,7 +1948,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_EXPERT_M, .trainerName = _("ALEXAS"), .speechBefore = {EC_WORD_GOOD, EC_WORD_TO, EC_WORD_MEET_YOU, EC_WORD_YOUNG, EC_WORD_TRAINER, EC_WORD_EXCL}, - .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_EXCL, 0xFFFF, EC_WORD_GIVE, EC_WORD_IT, EC_WORD_UP}, + .speechWin = {EC_WORD_WAHAHAHA, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GIVE, EC_WORD_IT, EC_WORD_UP}, .speechLose = {EC_WORD_YOU, EC_WORD_ARE, EC_WORD_A, EC_WORD_STRONG, EC_WORD_TRAINER, EC_WORD_KID}, .monSet = gBattleFrontierTrainerMons_Alexas }, @@ -1964,7 +1964,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_EXPERT_M, .trainerName = _("JASPER"), .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_OLD, EC_WORD_I_AM, EC_WORD_SKILLED, EC_WORD_EXCL}, - .speechWin = {EC_WORD_SKILLED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_SKILLED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_SHOCKED, EC_WORD_EXCL, EC_WORD_DOWN, EC_WORD_I, EC_WORD_GO}, .monSet = gBattleFrontierTrainerMons_Jasper }, @@ -1972,14 +1972,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_EXPERT_F, .trainerName = _("NADIA"), .speechBefore = {EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_BEAT, EC_WORD_ME, EC_WORD_DOWN, EC_WORD_EXCL}, - .speechWin = {EC_WORD_HAH, EC_WORD_EXCL, 0xFFFF, EC_WORD_I, EC_WORD_BEAT, EC_WORD_YOU}, - .speechLose = {EC_WORD_I_AM, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_DOWNCAST, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechWin = {EC_WORD_HAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_BEAT, EC_WORD_YOU}, + .speechLose = {EC_WORD_I_AM, EC_MOVE2(BEAT_UP), EC_WORD_AND, EC_WORD_DOWNCAST, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Nadia }, [FRONTIER_TRAINER_MIRANDA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, .trainerName = _("MIRANDA"), - .speechBefore = {EC_WORD_WELL, EC_WORD_WELL, 0xFFFF, EC_WORD_LET_S, EC_WORD_START, 0xFFFF}, + .speechBefore = {EC_WORD_WELL, EC_WORD_WELL, EC_EMPTY_WORD, EC_WORD_LET_S, EC_WORD_START, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHAT, EC_WORD_QUES, EC_WORD_DONE, EC_WORD_SO, EC_WORD_SOON, EC_WORD_QUES}, .speechLose = {EC_WORD_WELL, EC_WORD_I, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_I_AM, EC_WORD_TOO_WEAK}, .monSet = gBattleFrontierTrainerMons_Miranda @@ -1987,8 +1987,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_EMMA] = { .facilityClass = FACILITY_CLASS_EXPERT_F, .trainerName = _("EMMA"), - .speechBefore = {EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_ABOUT, EC_WORD_YOU, 0xFFFF}, - .speechWin = {EC_WORD_I, EC_WORD_THINK, EC_WORD_I_VE, EC_WORD_MISHEARD, EC_WORD_THINGS, 0xFFFF}, + .speechBefore = {EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_ABOUT, EC_WORD_YOU, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_I, EC_WORD_THINK, EC_WORD_I_VE, EC_WORD_MISHEARD, EC_WORD_THINGS, EC_EMPTY_WORD}, .speechLose = {EC_WORD_WHAT, EC_WORD_I_VE, EC_WORD_BEEN, EC_WORD_HEARING, EC_WORD_IS, EC_WORD_RIGHT}, .monSet = gBattleFrontierTrainerMons_Emma }, @@ -2004,15 +2004,15 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PSYCHIC_M, .trainerName = _("STANLY"), .speechBefore = {EC_WORD_THIS, EC_WORD_SHOULD, EC_WORD_BE, EC_WORD_AN, EC_WORD_EASY, EC_WORD_MATCH}, - .speechWin = {EC_WORD_IT, EC_WORD_REALLY, EC_WORD_WAS, EC_WORD_EASY, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_HAPPY, EC_WORD_NOW, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_IT, EC_WORD_REALLY, EC_WORD_WAS, EC_WORD_EASY, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_ARE, EC_WORD_YOU, EC_WORD_HAPPY, EC_WORD_NOW, EC_WORD_QUES, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Stanly }, [FRONTIER_TRAINER_DARIO] = { .facilityClass = FACILITY_CLASS_PSYCHIC_M, .trainerName = _("DARIO"), .speechBefore = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_SAYS, EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN}, - .speechWin = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_HAS, EC_WORD_BEEN, EC_WORD_PERFECT, 0xFFFF}, + .speechWin = {EC_WORD_MY, EC_MOVE2(FORESIGHT), EC_WORD_HAS, EC_WORD_BEEN, EC_WORD_PERFECT, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_DIDN_T, EC_WORD_SEE, EC_WORD_THIS, EC_MOVE(REVERSAL), EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Dario }, @@ -2020,7 +2020,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_PSYCHIC_F, .trainerName = _("KARLEE"), .speechBefore = {EC_WORD_SOMETHING, EC_WORD_GOOD, EC_WORD_WILL, EC_WORD_COME, EC_WORD_OF, EC_WORD_THIS}, - .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_FANTASTIC, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_YOU, EC_WORD_SEE, EC_WORD_QUES, EC_WORD_FANTASTIC, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_THAT, EC_WORD_SOMETHING, EC_WORD_GOOD, EC_WORD_WENT, EC_WORD_TO, EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Karlee }, @@ -2043,7 +2043,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_DELILAH] = { .facilityClass = FACILITY_CLASS_HEX_MANIAC, .trainerName = _("DELILAH"), - .speechBefore = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_IF_I_WIN, EC_WORD_OK_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_DON_T, EC_MOVE(GRUDGE), EC_WORD_ME, EC_WORD_IF_I_WIN, EC_WORD_OK_QUES, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_TO, EC_WORD_SEE, EC_WORD_YOU, EC_WORD_ANGRY}, .speechLose = {EC_WORD_I, EC_WORD_HAVE, EC_WORD_A, EC_MOVE(GRUDGE), EC_WORD_WITH, EC_WORD_YOU}, .monSet = gBattleFrontierTrainerMons_Delilah @@ -2060,16 +2060,16 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_HEX_MANIAC, .trainerName = _("LEXIE"), .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_SEE, EC_WORD_SCARY, EC_WORD_POKEMON, EC_WORD_QUES}, - .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_SCARY, EC_WORD_EH_QUES, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_WASN_T, EC_WORD_THAT, EC_WORD_SCARY, EC_WORD_EH_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU_RE, EC_WORD_MORE, EC_WORD_SCARY, EC_WORD_THAN, EC_WORD_MY, EC_WORD_POKEMON}, .monSet = gBattleFrontierTrainerMons_Lexie }, [FRONTIER_TRAINER_MILLER] = { .facilityClass = FACILITY_CLASS_POKEMANIAC, .trainerName = _("MILLER"), - .speechBefore = {EC_WORD_HELLO, EC_WORD_QUES, 0xFFFF, EC_WORD_HELLO, EC_WORD_QUES_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_HELLO, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_HELLO, EC_WORD_QUES_EXCL, EC_EMPTY_WORD}, .speechWin = {EC_WORD_HELLO, EC_WORD_MOTHER, EC_WORD_EXCL, EC_WORD_I, EC_WORD_WON, EC_WORD_EXCL}, - .speechLose = {EC_WORD_MY, EC_WORD_PHONE, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLose = {EC_WORD_MY, EC_WORD_PHONE, EC_WORD_ISN_T, EC_WORD_WORKING, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Miller }, [FRONTIER_TRAINER_MARV] = { @@ -2099,7 +2099,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_GREGORY] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, .trainerName = _("GREGORY"), - .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD, EC_WORD_YET, 0xFFFF}, + .speechBefore = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD, EC_WORD_YET, EC_EMPTY_WORD}, .speechWin = {EC_WORD_WHO, EC_WORD_SAYS, EC_WORD_I_AM, EC_WORD_TOO, EC_WORD_OLD, EC_WORD_QUES}, .speechLose = {EC_WORD_PLEASE, EC_WORD_I_AM, EC_WORD_REALLY, EC_WORD_NOT, EC_WORD_THAT, EC_WORD_OLD}, .monSet = gBattleFrontierTrainerMons_Gregory @@ -2107,23 +2107,23 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_REESE] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, .trainerName = _("REESE"), - .speechBefore = {EC_WORD_I_VE, EC_WORD_A, EC_WORD_COUPLE, EC_WORD_THINGS, 0xFFFF, 0xFFFF}, - .speechWin = {EC_WORD_DON_T, EC_WORD_DIET, EC_WORD_PLAY, EC_WORD_SPORTS, EC_WORD_INSTEAD, 0xFFFF}, + .speechBefore = {EC_WORD_I_VE, EC_WORD_A, EC_WORD_COUPLE, EC_WORD_THINGS, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_DON_T, EC_WORD_DIET, EC_WORD_PLAY, EC_WORD_SPORTS, EC_WORD_INSTEAD, EC_EMPTY_WORD}, .speechLose = {EC_WORD_INSTEAD, EC_WORD_OF, EC_WORD_TELEVISION, EC_WORD_GET, EC_WORD_A, EC_WORD_BOOK}, .monSet = gBattleFrontierTrainerMons_Reese }, [FRONTIER_TRAINER_MASON] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .trainerName = _("MASON"), - .speechBefore = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THIS, EC_WORD_SCARY, 0xFFFF}, - .speechWin = {EC_WORD_THANK_YOU, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_NOW}, - .speechLose = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_ELLIPSIS, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_PLEASE, EC_WORD_DON_T, EC_WORD_MAKE, EC_WORD_THIS, EC_WORD_SCARY, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_THANK_YOU, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_HAPPY, EC_WORD_NOW}, + .speechLose = {EC_WORD_I_AM, EC_WORD_DISAPPOINTED, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Mason }, [FRONTIER_TRAINER_TOBY] = { .facilityClass = FACILITY_CLASS_RUNNING_TRIATHLETE_M, .trainerName = _("TOBY"), - .speechBefore = {EC_WORD_LISTEN, EC_WORD_UP, 0xFFFF, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_WIN}, + .speechBefore = {EC_WORD_LISTEN, EC_WORD_UP, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_WIN}, .speechWin = {EC_WORD_I_AM, EC_WORD_A, EC_WORD_GENIUS, EC_WORD_OR, EC_WORD_WHAT, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_CAN, EC_WORD_BEAT, EC_WORD_YOU, EC_WORD_AT, EC_WORD_SMARTNESS}, .monSet = gBattleFrontierTrainerMons_Toby @@ -2141,14 +2141,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("PIPER"), .speechBefore = {EC_WORD_COME_ON, EC_WORD_YOU, EC_WORD_NEED, EC_WORD_A, EC_WORD_SPEED_BOOST, EC_WORD_QUES}, .speechWin = {EC_WORD_YOU, EC_WORD_NEED, EC_WORD_TO, EC_WORD_SHOW, EC_WORD_MORE, EC_WORD_GUTS}, - .speechLose = {EC_WORD_OH, EC_WORD_YOU, EC_WORD_EXCL, 0xFFFF, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_OH, EC_WORD_YOU, EC_WORD_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Piper }, [FRONTIER_TRAINER_FINN] = { .facilityClass = FACILITY_CLASS_SWIMMING_TRIATHLETE_M, .trainerName = _("FINN"), - .speechBefore = {EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_TRAINER, EC_WORD_BATTLE, EC_WORD_ELLIPSIS, 0xFFFF}, - .speechWin = {EC_WORD_WON_T, EC_WORD_THIS, EC_WORD_EVER, EC_WORD_END, EC_WORD_QUES, 0xFFFF}, + .speechBefore = {EC_WORD_NOT, EC_WORD_ANOTHER, EC_WORD_TRAINER, EC_WORD_BATTLE, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_WON_T, EC_WORD_THIS, EC_WORD_EVER, EC_WORD_END, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_FINALLY, EC_WORD_GET, EC_WORD_TO, EC_MOVE2(REST), EC_WORD_A_LITTLE}, .monSet = gBattleFrontierTrainerMons_Finn }, @@ -2157,7 +2157,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("SAMIR"), .speechBefore = {EC_WORD_I, EC_MOVE2(DIVE), EC_WORD_BELOW, EC_WORD_THE, EC_MOVE2(SURF), EC_WORD_EXCL}, .speechWin = {EC_WORD_YAHOO, EC_WORD_TAKE, EC_WORD_A, EC_MOVE2(DIVE), EC_WORD_YOU, EC_WORD_EXCL}, - .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_SINK, EC_WORD_ELLIPSIS, 0xFFFF}, + .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_TO, EC_WORD_SINK, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Samir }, [FRONTIER_TRAINER_FIONA] = { @@ -2179,7 +2179,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_NICO] = { .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .trainerName = _("NICO"), - .speechBefore = {EC_WORD_LIKE, EC_WORD_A, EC_MOVE(SONIC_BOOM), EC_WORD_I_VE_ARRIVED, 0xFFFF, 0xFFFF}, + .speechBefore = {EC_WORD_LIKE, EC_WORD_A, EC_MOVE(SONIC_BOOM), EC_WORD_I_VE_ARRIVED, EC_EMPTY_WORD, EC_EMPTY_WORD}, .speechWin = {EC_WORD_SORRY, EC_WORD_TO, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SO, EC_WORD_DOWNCAST}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_WITH, EC_WORD_A, EC_MOVE2(SUPERSONIC), EC_WORD_SPEED_BOOST}, .monSet = gBattleFrontierTrainerMons_Nico @@ -2220,7 +2220,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_BUG_MANIAC, .trainerName = _("LIAM"), .speechBefore = {EC_WORD_WE, EC_WORD_REALLY, EC_WORD_DISLIKE, EC_WORD_FIRE, EC_WORD_AND, EC_WORD_FLYING}, - .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_BAD, EC_WORD_HEY_QUES, 0xFFFF}, + .speechWin = {EC_WORD_BUG, EC_WORD_POKEMON, EC_WORD_AREN_T, EC_WORD_BAD, EC_WORD_HEY_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU, EC_WORD_KNOW, EC_WORD_WHAT, EC_WORD_WE, EC_WORD_DISLIKE, EC_WORD_HEY_QUES}, .monSet = gBattleFrontierTrainerMons_Liam }, @@ -2269,14 +2269,14 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .trainerName = _("TRISTON"), .speechBefore = {EC_WORD_I, EC_WORD_WOULD, EC_WORD_RATHER, EC_WORD_LOOK, EC_WORD_AT, EC_WORD_POKEMON}, .speechWin = {EC_WORD_HUH_QUES, EC_WORD_YOU, EC_WORD_MEAN, EC_WORD_I, EC_WORD_WON, EC_WORD_QUES_EXCL}, - .speechLose = {EC_WORD_SEE, EC_WORD_QUES, 0xFFFF, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_LOSE}, + .speechLose = {EC_WORD_SEE, EC_WORD_QUES, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ALWAYS, EC_WORD_LOSE}, .monSet = gBattleFrontierTrainerMons_Triston }, [FRONTIER_TRAINER_CHARLES] = { .facilityClass = FACILITY_CLASS_GUITARIST, .trainerName = _("CHARLES"), .speechBefore = {EC_WORD_IT_S, EC_WORD_HOPELESS, EC_WORD_TO, EC_MOVE2(STRUGGLE), EC_WORD_WITH, EC_WORD_ME}, - .speechWin = {EC_MOVE(SUBMISSION), EC_WORD_WAS, EC_WORD_YOUR, EC_WORD_ONLY, EC_WORD_CHOICE, 0xFFFF}, + .speechWin = {EC_MOVE(SUBMISSION), EC_WORD_WAS, EC_WORD_YOUR, EC_WORD_ONLY, EC_WORD_CHOICE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_GOING, EC_WORD_DOWN, EC_WORD_DOWN, EC_WORD_DOWN, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Charles }, @@ -2284,7 +2284,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_GUITARIST, .trainerName = _("RAYMOND"), .speechBefore = {EC_WORD_WANT, EC_WORD_TO, EC_WORD_HEAR, EC_WORD_MY, EC_WORD_SONG, EC_WORD_QUES}, - .speechWin = {EC_WORD_SATISFIED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_SATISFIED, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_SATISFIED, EC_WORD_IS, EC_WORD_WHAT, EC_WORD_I, EC_WORD_CAN_T, EC_WORD_BE}, .monSet = gBattleFrontierTrainerMons_Raymond }, @@ -2348,7 +2348,7 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_KINDLER, .trainerName = _("FERRIS"), .speechBefore = {EC_WORD_I_AM, EC_WORD_NO_1, EC_WORD_IN, EC_WORD_THE, EC_WORD_OLD, EC_WORD_CLASS}, - .speechWin = {EC_WORD_NO_1, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_NO_1, EC_WORD_THAT_S, EC_WORD_WHAT, EC_WORD_I_AM, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_NO_1, EC_WORD_ANY, EC_WORD_MORE, EC_WORD_ELLIPSIS}, .monSet = gBattleFrontierTrainerMons_Ferris }, @@ -2363,24 +2363,24 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU [FRONTIER_TRAINER_PAIGE] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, .trainerName = _("PAIGE"), - .speechBefore = {EC_WORD_LET_S, EC_WORD_ENJOY, EC_WORD_OUR, EC_WORD_BATTLE, EC_WORD_TOGETHER, 0xFFFF}, - .speechWin = {EC_WORD_THAT_S_IT_EXCL, 0xFFFF, 0xFFFF, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, - .speechLose = {EC_WORD_THAT_S_IT_EXCL, 0xFFFF, 0xFFFF, EC_WORD_DO, EC_WORD_GO, EC_WORD_ON}, + .speechBefore = {EC_WORD_LET_S, EC_WORD_ENJOY, EC_WORD_OUR, EC_WORD_BATTLE, EC_WORD_TOGETHER, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_WORD_VERY, EC_WORD_MUCH}, + .speechLose = {EC_WORD_THAT_S_IT_EXCL, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_DO, EC_WORD_GO, EC_WORD_ON}, .monSet = gBattleFrontierTrainerMons_Paige }, [FRONTIER_TRAINER_ANYA] = { .facilityClass = FACILITY_CLASS_BEAUTY, .trainerName = _("ANYA"), .speechBefore = {EC_WORD_I, EC_WORD_DISLIKE, EC_WORD_OH, EC_WORD_SO, EC_WORD_PRETTY, EC_WORD_FASHION}, - .speechWin = {EC_WORD_FASHION, EC_WORD_SHOULD, EC_WORD_MATCH, EC_WORD_THE, EC_WORD_PERSON, 0xFFFF}, - .speechLose = {EC_WORD_PRETTY, EC_WORD_COULD, EC_WORD_BE, EC_WORD_GOOD, 0xFFFF, 0xFFFF}, + .speechWin = {EC_WORD_FASHION, EC_WORD_SHOULD, EC_WORD_MATCH, EC_WORD_THE, EC_WORD_PERSON, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_PRETTY, EC_WORD_COULD, EC_WORD_BE, EC_WORD_GOOD, EC_EMPTY_WORD, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Anya }, [FRONTIER_TRAINER_DAWN] = { .facilityClass = FACILITY_CLASS_BEAUTY, .trainerName = _("DAWN"), - .speechBefore = {EC_WORD_I, EC_WORD_GO, EC_WORD_ALL, EC_WORD_OUT, EC_WORD_EXCL, 0xFFFF}, - .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_A, EC_WORD_BABY, EC_WORD_EXCL, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_GO, EC_WORD_ALL, EC_WORD_OUT, EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_DON_T, EC_WORD_BE, EC_WORD_A, EC_WORD_BABY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_YOU, EC_WORD_WON, EC_WORD_EXCL, EC_WORD_MOVE, EC_WORD_ON, EC_WORD_EXCL}, .monSet = gBattleFrontierTrainerMons_Dawn }, @@ -2388,8 +2388,8 @@ const struct BattleFrontierTrainer gBattleFrontierTrainers[FRONTIER_TRAINERS_COU .facilityClass = FACILITY_CLASS_AROMA_LADY, .trainerName = _("ABBY"), .speechBefore = {EC_WORD_I, EC_WORD_LIKE, EC_WORD_A, EC_WORD_TRAINER, EC_WORD_THAT_S, EC_WORD_REFRESHING}, - .speechWin = {EC_WORD_VICTORY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_WORD_EXCL, 0xFFFF}, - .speechLose = {EC_WORD_WHAT, EC_WORD_AN, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_VICTORY, EC_WORD_HAS, EC_WORD_A, EC_MOVE(SWEET_SCENT), EC_WORD_EXCL, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WHAT, EC_WORD_AN, EC_WORD_AWFUL, EC_WORD_STENCH, EC_WORD_EXCL, EC_EMPTY_WORD}, .monSet = gBattleFrontierTrainerMons_Abby }, [FRONTIER_TRAINER_GRETEL] = { diff --git a/src/data/battle_frontier/battle_tent.h b/src/data/battle_frontier/battle_tent.h index bf89c5bc3..e1c3750bf 100644 --- a/src/data/battle_frontier/battle_tent.h +++ b/src/data/battle_frontier/battle_tent.h @@ -616,9 +616,9 @@ const struct BattleFrontierTrainer gSlateportBattleTentTrainers[NUM_BATTLE_TENT_ [SLATEPORT_TENT_TRAINER_MAGGIE] = { .facilityClass = FACILITY_CLASS_SCHOOL_KID_F, .trainerName = _("MAGGIE"), - .speechBefore = {EC_POKEMON(VULPIX), EC_POKEMON(XATU), EC_POKEMON2(UMBREON), EC_WORD_ELLIPSIS, EC_WORD_UM, EC_WORD_ELLIPSIS}, + .speechBefore = {EC_POKEMON(VULPIX), EC_POKEMON(XATU), EC_POKEMON_NATIONAL(UMBREON), EC_WORD_ELLIPSIS, EC_WORD_UM, EC_WORD_ELLIPSIS}, .speechWin = {EC_POKEMON(NOSEPASS), EC_WORD_ELLIPSIS, EC_WORD_UM, EC_POKEMON(SEVIPER), EC_WORD_EXCL, -1}, - .speechLose = {EC_POKEMON(NOSEPASS), EC_WORD_ELLIPSIS, EC_WORD_UM, EC_POKEMON2(SNORLAX), EC_WORD_ELLIPSIS, EC_WORD_UH_OH}, + .speechLose = {EC_POKEMON(NOSEPASS), EC_WORD_ELLIPSIS, EC_WORD_UM, EC_POKEMON_NATIONAL(SNORLAX), EC_WORD_ELLIPSIS, EC_WORD_UH_OH}, .monSet = gSlateportBattleTentTrainerMons_Maggie }, [SLATEPORT_TENT_TRAINER_STEPHON] = { diff --git a/src/data/battle_frontier/trainer_hill.h b/src/data/battle_frontier/trainer_hill.h index 1b41024d0..127eb8ed4 100644 --- a/src/data/battle_frontier/trainer_hill.h +++ b/src/data/battle_frontier/trainer_hill.h @@ -314,7 +314,7 @@ static const struct TrHillFloor sDataTagJPDefault_Floors[] = { .speechBefore = { EC_WORD_SISTER, EC_WORD_ALTHOUGH, EC_WORD_KIND, EC_WORD_MATCH, EC_WORD_PLEASE, EC_WORD_WITHOUT }, .speechWin = { EC_WORD_KIND, EC_WORD_ELLIPSIS, EC_WORD_INSTEAD, EC_WORD_DEEP, EC_WORD_WEAK, EC_WORD_QUES }, .speechLose = { EC_WORD_AWFUL, EC_WORD_GWAH, EC_WORD_HOPELESS, EC_WORD_CAN_T_WIN, EC_WORD_IS, EC_WORD_NONE }, - .speechAfter = { EC_WORD_AWW, 0xFFFF, 0xFFFF, EC_WORD_ALMOST, EC_WORD_GOOD, EC_WORD_ANYWHERE }, + .speechAfter = { EC_WORD_AWW, EC_EMPTY_WORD, EC_EMPTY_WORD, EC_WORD_ALMOST, EC_WORD_GOOD, EC_WORD_ANYWHERE }, .mons = { [0] = NULL_BATTLE_TOWER_POKEMON, [1] = NULL_BATTLE_TOWER_POKEMON, @@ -444,7 +444,7 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .unused = 0, .speechBefore = {EC_WORD_YOU, EC_WORD_CAN, EC_WORD_CHOOSE, EC_WORD_NOT, EC_WORD_TO, EC_WORD_BELIEVE}, .speechWin = {EC_WORD_A, EC_WORD_SUPER, EC_WORD_NATURAL, EC_WORD_POWER, EC_WORD_HAS, EC_WORD_COME}, - .speechLose = {EC_WORD_THIS, EC_WORD_MUST_BE, EC_WORD_A, EC_MOVE(NIGHTMARE), EC_WORD_EXCL, 0xFFFF}, + .speechLose = {EC_WORD_THIS, EC_WORD_MUST_BE, EC_WORD_A, EC_MOVE(NIGHTMARE), EC_WORD_EXCL, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_I, EC_WORD_WILL, EC_WORD_DISAPPEAR, EC_WORD_IN, EC_WORD_THE, EC_WORD_DARK}, .mons = { @@ -589,7 +589,7 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .name = _("ALFONSO"), .facilityClass = FACILITY_CLASS_CYCLING_TRIATHLETE_M, .unused = 0, - .speechBefore = {EC_WORD_I, EC_WORD_NEVER, EC_WORD_TAKE, EC_WORD_A, EC_WORD_TRAIN, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_NEVER, EC_WORD_TAKE, EC_WORD_A, EC_WORD_TRAIN, EC_EMPTY_WORD}, .speechWin = {EC_WORD_I_AM, EC_WORD_FEELING, EC_MOVE2(SUPERSONIC), EC_WORD_ON, EC_WORD_MY, EC_WORD_BIKE}, .speechLose = {EC_WORD_MY, EC_WORD_BIKE, EC_WORD_EXCL, EC_WORD_YOU_VE, EC_WORD_DESTROYED, EC_WORD_IT}, .speechAfter = {EC_WORD_A, EC_WORD_BIKE, EC_WORD_OVER, EC_WORD_ANY, EC_WORD_TRAIN, EC_WORD_EXCL}, @@ -907,8 +907,8 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, .unused = 0, .speechBefore = {EC_WORD_SOME, EC_WORD_THINGS, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_DO, EC_WORD_ALONE}, - .speechWin = {EC_WORD_YOU, EC_WORD_WIN, EC_WORD_AS, EC_WORD_A, EC_WORD_GROUP, 0xFFFF}, - .speechLose = {EC_WORD_WE, EC_WORD_COULDN_T, EC_WORD_WIN, EC_WORD_TOGETHER, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_YOU, EC_WORD_WIN, EC_WORD_AS, EC_WORD_A, EC_WORD_GROUP, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_WE, EC_WORD_COULDN_T, EC_WORD_WIN, EC_WORD_TOGETHER, EC_WORD_QUES, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_MAYBE, EC_WORD_I, EC_WORD_NEED, EC_WORD_A, EC_WORD_BOY, EC_WORD_FRIEND}, .mons = { @@ -1086,7 +1086,7 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .speechBefore = {EC_WORD_LET_S, EC_MOVE2(WRAP), EC_WORD_THINGS, EC_WORD_UP, EC_WORD_HERE, EC_WORD_HEY_QUES}, .speechWin = {EC_WORD_WOULD, EC_WORD_YOU, EC_WORD_LIKE, EC_WORD_TO, EC_WORD_GO_HOME, EC_WORD_QUES}, .speechLose = {EC_WORD_I, EC_WORD_WILL, EC_WORD_MAKE, EC_WORD_YOU, EC_WORD_SORRY, EC_WORD_FRIEND}, - .speechAfter = {EC_WORD_HAVEN_T, EC_WORD_YOU, EC_WORD_DONE, EC_WORD_ENOUGH, EC_WORD_QUES, 0xFFFF}, + .speechAfter = {EC_WORD_HAVEN_T, EC_WORD_YOU, EC_WORD_DONE, EC_WORD_ENOUGH, EC_WORD_QUES, EC_EMPTY_WORD}, .mons = { [0] = @@ -1229,7 +1229,7 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .facilityClass = FACILITY_CLASS_PKMN_BREEDER_F, .unused = 0, .speechBefore = {EC_WORD_I_AM, EC_WORD_THE, EC_WORD_STRONG, EC_WORD_BEAUTY, EC_WORD_AROUND, EC_WORD_HERE}, - .speechWin = {EC_WORD_I_AM, EC_WORD_STRONG, EC_WORD_THAT_S, EC_WORD_WHY, EC_WORD_EXCL, 0xFFFF}, + .speechWin = {EC_WORD_I_AM, EC_WORD_STRONG, EC_WORD_THAT_S, EC_WORD_WHY, EC_WORD_EXCL, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I_AM, EC_WORD_TIRED, EC_WORD_TODAY, EC_WORD_THAT_S, EC_WORD_WHY, EC_WORD_EXCL}, .speechAfter = {EC_WORD_WHY, EC_WORD_YES, EC_WORD_I_AM, EC_WORD_ANGRY, EC_WORD_THANK_YOU, EC_WORD_EXCL}, .mons = @@ -1244,12 +1244,12 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .attackEV = 252, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xCB, .nickname = _("SKITTY"), @@ -1404,8 +1404,8 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .name = _("KEENAN"), .facilityClass = FACILITY_CLASS_PSYCHIC_M, .unused = 0, - .speechBefore = {EC_WORD_YOU, EC_WORD_LOOK, EC_WORD_SO, EC_WORD_HURRIED, 0xFFFF, 0xFFFF}, - .speechWin = {EC_WORD_TOO, EC_WORD_BAD, 0xFFFF, EC_WORD_TIME, EC_WORD_IS, EC_WORD_UP}, + .speechBefore = {EC_WORD_YOU, EC_WORD_LOOK, EC_WORD_SO, EC_WORD_HURRIED, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_TOO, EC_WORD_BAD, EC_EMPTY_WORD, EC_WORD_TIME, EC_WORD_IS, EC_WORD_UP}, .speechLose = {EC_WORD_DOES, EC_WORD_THE, EC_WORD_TIME, EC_WORD_WORRY, EC_WORD_YOU, EC_WORD_QUES}, .speechAfter = {EC_WORD_YOU, EC_WORD_DON_T, EC_WORD_HAVE, EC_WORD_TIME, EC_WORD_TO, EC_WORD_CHAT}, .mons = @@ -1547,7 +1547,7 @@ static const struct TrHillFloor sDataTagNormal_Floors[] = .unused = 0, .speechBefore = {EC_WORD_IT_S, EC_WORD_HOT, EC_WORD_ELLIPSIS, EC_WORD_WHAT, EC_WORD_A, EC_WORD_STENCH}, .speechWin = {EC_WORD_I, EC_WORD_REALLY, EC_WORD_LIKE, EC_WORD_AN, EC_WORD_OFFENSIVE, EC_WORD_STENCH}, - .speechLose = {EC_WORD_I, EC_MOVE2(COVET), EC_WORD_ANY, EC_WORD_STRONG, EC_WORD_STENCH, 0xFFFF}, + .speechLose = {EC_WORD_I, EC_MOVE2(COVET), EC_WORD_ANY, EC_WORD_STRONG, EC_WORD_STENCH, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_MY, EC_WORD_SENSE, EC_WORD_OF, EC_WORD_SMELL, EC_WORD_ISN_T, EC_WORD_NORMAL}, .mons = { @@ -1731,8 +1731,8 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .unused = 0, .speechBefore = {EC_WORD_GOOD, EC_WORD_CHILDREN, EC_WORD_WILL, EC_WORD_GET, EC_WORD_A, EC_MOVE2(PRESENT)}, .speechWin = {EC_WORD_THANK_YOU, EC_WORD_MY, EC_WORD_VICTORY, EC_WORD_IS, EC_WORD_YOUR, EC_MOVE2(PRESENT)}, - .speechLose = {EC_WORD_THAT_WAS, EC_WORD_MY, EC_MOVE2(PRESENT), EC_WORD_TO, EC_WORD_YOU, 0xFFFF}, - .speechAfter = {EC_WORD_WELL_THEN, EC_WORD_CONGRATS, EC_WORD_MY, EC_WORD_FRIEND, 0xFFFF, 0xFFFF}, + .speechLose = {EC_WORD_THAT_WAS, EC_WORD_MY, EC_MOVE2(PRESENT), EC_WORD_TO, EC_WORD_YOU, EC_EMPTY_WORD}, + .speechAfter = {EC_WORD_WELL_THEN, EC_WORD_CONGRATS, EC_WORD_MY, EC_WORD_FRIEND, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = { [0] = @@ -1870,7 +1870,7 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .unused = 0, .speechBefore = {EC_WORD_CAN, EC_WORD_YOU, EC_WORD_SENSE, EC_WORD_ME, EC_MOVE(FOCUS_ENERGY), EC_WORD_QUES}, .speechWin = {EC_WORD_THAT_S, EC_WORD_ABOUT, EC_WORD_RIGHT, EC_WORD_I, EC_WORD_WOULD, EC_WORD_THINK}, - .speechLose = {EC_WORD_THINGS, EC_WORD_DON_T, EC_WORD_ALWAYS, EC_WORD_WORK, EC_WORD_OUT, 0xFFFF}, + .speechLose = {EC_WORD_THINGS, EC_WORD_DON_T, EC_WORD_ALWAYS, EC_WORD_WORK, EC_WORD_OUT, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_I_AM, EC_WORD_FEELING, EC_WORD_LONESOME, EC_WORD_AND, EC_WORD_SAD, EC_WORD_NOW}, .mons = { @@ -2040,7 +2040,7 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .facilityClass = FACILITY_CLASS_PARASOL_LADY, .unused = 0, .speechBefore = {EC_WORD_HI, EC_WORD_ARE, EC_WORD_YOU, EC_WORD_FEELING, EC_WORD_UPBEAT, EC_WORD_QUES}, - .speechWin = {EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_FEELING, EC_WORD_WELL, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_AREN_T, EC_WORD_YOU, EC_WORD_FEELING, EC_WORD_WELL, EC_WORD_QUES, EC_EMPTY_WORD}, .speechLose = {EC_WORD_I, EC_WORD_CAN, EC_WORD_SEE, EC_WORD_YOU_RE, EC_WORD_FEELING, EC_WORD_GREAT}, .speechAfter = {EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_LOOK, EC_WORD_READY, EC_WORD_TO, EC_WORD_HUSTLE}, .mons = @@ -2380,8 +2380,8 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .facilityClass = FACILITY_CLASS_RICH_BOY, .unused = 0, .speechBefore = {EC_WORD_GET, EC_WORD_READY, EC_WORD_FOR, EC_WORD_AN, EC_WORD_AWESOME, EC_WORD_TIME}, - .speechWin = {EC_WORD_HEY, EC_WORD_HEY, EC_WORD_EXCL, EC_WORD_WHAT_S_UP_QUES, 0xFFFF, 0xFFFF}, - .speechLose = {EC_WORD_AWW, EC_WORD_COULDN_T, EC_WORD_YOU, EC_WORD_LET_ME_WIN, EC_WORD_QUES, 0xFFFF}, + .speechWin = {EC_WORD_HEY, EC_WORD_HEY, EC_WORD_EXCL, EC_WORD_WHAT_S_UP_QUES, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechLose = {EC_WORD_AWW, EC_WORD_COULDN_T, EC_WORD_YOU, EC_WORD_LET_ME_WIN, EC_WORD_QUES, EC_EMPTY_WORD}, .speechAfter = {EC_WORD_DID, EC_WORD_YOU, EC_WORD_SEE, EC_WORD_MY, EC_WORD_SKILL, EC_WORD_QUES}, .mons = { @@ -2717,11 +2717,11 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .spAttackEV = 255, .otId = TRAINER_HILL_OTID, .hpIV = 30, - .attackIV = 31, + .attackIV = MAX_PER_STAT_IVS, .defenseIV = 30, - .speedIV = 31, + .speedIV = MAX_PER_STAT_IVS, .spAttackIV = 30, - .spDefenseIV = 31, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x202, .nickname = _("UNOWN"), @@ -2738,11 +2738,11 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .spAttackEV = 255, .otId = TRAINER_HILL_OTID, .hpIV = 30, - .attackIV = 31, - .defenseIV = 31, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, .speedIV = 30, .spAttackIV = 30, - .spDefenseIV = 31, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x10001, .nickname = _("UNOWN"), @@ -2840,10 +2840,10 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .name = _("FRANCISCO"), .facilityClass = FACILITY_CLASS_POKEFAN_M, .unused = 0, - .speechBefore = {EC_WORD_I, EC_WORD_STUDY, EC_WORD_EVERY, EC_WORD_DAY, EC_WORD_TOO, 0xFFFF}, - .speechWin = {EC_WORD_SO, EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_YOU, EC_WORD_LOSE, 0xFFFF}, + .speechBefore = {EC_WORD_I, EC_WORD_STUDY, EC_WORD_EVERY, EC_WORD_DAY, EC_WORD_TOO, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_SO, EC_WORD_THAT_S, EC_WORD_HOW, EC_WORD_YOU, EC_WORD_LOSE, EC_EMPTY_WORD}, .speechLose = {EC_WORD_NO, EC_WORD_WONDER, EC_WORD_I, EC_WORD_COULDN_T, EC_WORD_BEAT, EC_WORD_YOU}, - .speechAfter = {EC_WORD_YES, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_THANK_YOU, 0xFFFF, 0xFFFF}, + .speechAfter = {EC_WORD_YES, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_THANK_YOU, EC_EMPTY_WORD, EC_EMPTY_WORD}, .mons = { [0] = @@ -2921,11 +2921,11 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .spAttackEV = 255, .otId = TRAINER_HILL_OTID, .hpIV = 30, - .attackIV = 31, + .attackIV = MAX_PER_STAT_IVS, .defenseIV = 30, .speedIV = 30, .spAttackIV = 30, - .spDefenseIV = 31, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x302, .nickname = _("UNOWN"), @@ -2941,10 +2941,10 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .hpEV = 255, .attackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, + .hpIV = MAX_PER_STAT_IVS, .attackIV = 30, - .defenseIV = 31, - .speedIV = 31, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, .spAttackIV = 30, .spDefenseIV = 30, .abilityNum = 0, @@ -2962,12 +2962,12 @@ static const struct TrHillFloor sDataTagVariety_Floors[] = { .hpEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, .defenseIV = 30, .speedIV = 30, - .spAttackIV = 31, - .spDefenseIV = 31, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x301, .nickname = _("UNOWN"), @@ -3023,10 +3023,10 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .name = _("MEREDITH"), .facilityClass = FACILITY_CLASS_PKMN_RANGER_F, .unused = 0, - .speechBefore = {EC_WORD_UM, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_I, EC_WORD_ELLIPSIS, 0xFFFF}, - .speechWin = {EC_WORD_OH, EC_WORD_EXCL, 0xFFFF, EC_WORD_UM, EC_WORD_ELLIPSIS, EC_WORD_YAY}, - .speechLose = {EC_WORD_UM, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_WAAAH, EC_WORD_ELLIPSIS, 0xFFFF}, - .speechAfter = {EC_WORD_UM, EC_WORD_ELLIPSIS, 0xFFFF, EC_WORD_I_AM, EC_WORD_SAD, EC_WORD_ELLIPSIS}, + .speechBefore = {EC_WORD_UM, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, + .speechWin = {EC_WORD_OH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_UM, EC_WORD_ELLIPSIS, EC_WORD_YAY}, + .speechLose = {EC_WORD_UM, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_WAAAH, EC_WORD_ELLIPSIS, EC_EMPTY_WORD}, + .speechAfter = {EC_WORD_UM, EC_WORD_ELLIPSIS, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_SAD, EC_WORD_ELLIPSIS}, .mons = { [0] = @@ -3820,12 +3820,12 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x32, .nickname = _("SMOOCHUM"), @@ -3842,12 +3842,12 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xC8, .nickname = _("AZURILL"), @@ -3864,12 +3864,12 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x0, .nickname = _("ELEKID"), @@ -3886,12 +3886,12 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .attackEV = 252, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x0, .nickname = _("CLEFFA"), @@ -3908,12 +3908,12 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .defenseEV = 130, .spDefenseEV = 130, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x84, .nickname = _("WYNAUT"), @@ -3930,12 +3930,12 @@ static const struct TrHillFloor sDataTagUnique_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xF, .nickname = _("MAGBY"), @@ -4319,12 +4319,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .defenseEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x35, .nickname = _("SNORLAX"), @@ -4341,12 +4341,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("MILTANK"), @@ -4363,12 +4363,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spAttackEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x7F, .nickname = _("URSARING"), @@ -4385,12 +4385,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spDefenseEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x80, .nickname = _("SLAKING"), @@ -4407,12 +4407,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("KANGASKHAN"), @@ -4429,12 +4429,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x80, .nickname = _("ZANGOOSE"), @@ -4464,12 +4464,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 110, .spAttackEV = 200, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0xF, .nickname = _("SLOWKING"), @@ -4486,12 +4486,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x28, .nickname = _("ESPEON"), @@ -4508,12 +4508,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0xF, .nickname = _("STARMIE"), @@ -4530,12 +4530,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xF, .nickname = _("GENGAR"), @@ -4552,12 +4552,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xF, .nickname = _("GARDEVOIR"), @@ -4574,12 +4574,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xF, .nickname = _("ALAKAZAM"), @@ -4641,12 +4641,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("SWELLOW"), @@ -4663,12 +4663,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("MACHAMP"), @@ -4685,12 +4685,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("URSARING"), @@ -4707,12 +4707,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x80, .nickname = _("KINGLER"), @@ -4729,12 +4729,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .defenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x80, .nickname = _("TYRANITAR"), @@ -4751,12 +4751,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x80, .nickname = _("DRAGONITE"), @@ -4786,12 +4786,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xA, .nickname = _("JOLTEON"), @@ -4808,12 +4808,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xA, .nickname = _("ALAKAZAM"), @@ -4830,12 +4830,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0xA, .nickname = _("STARMIE"), @@ -4852,12 +4852,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x82, .nickname = _("DUSCLOPS"), @@ -4874,12 +4874,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xD2, .nickname = _("NINETALES"), @@ -4896,12 +4896,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x85, .nickname = _("BANETTE"), @@ -4948,8 +4948,8 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .unused = 0, .speechBefore = {EC_WORD_OH_DEAR, EC_WORD_THIS, EC_WORD_MATCH, EC_WORD_IS, EC_WORD_FOR, EC_WORD_YOU}, .speechWin = {EC_WORD_OH_DEAR, EC_WORD_DID, EC_WORD_YOU, EC_WORD_SEE, EC_WORD_THAT, EC_WORD_QUES}, - .speechLose = {EC_WORD_OH_DEAR, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, 0xFFFF, 0xFFFF}, - .speechAfter = {EC_WORD_IS, EC_WORD_YOUR, EC_WORD_GRANDMOTHER, EC_WORD_STRONG, EC_WORD_QUES, 0xFFFF}, + .speechLose = {EC_WORD_OH_DEAR, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SORRY, EC_EMPTY_WORD, EC_EMPTY_WORD}, + .speechAfter = {EC_WORD_IS, EC_WORD_YOUR, EC_WORD_GRANDMOTHER, EC_WORD_STRONG, EC_WORD_QUES, EC_EMPTY_WORD}, .mons = { [0] = @@ -4963,12 +4963,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 130, .spDefenseEV = 130, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x94, .nickname = _("WOBBUFFET"), @@ -4985,12 +4985,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 130, .spDefenseEV = 130, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x85, .nickname = _("EXPLOUD"), @@ -5007,12 +5007,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 130, .spDefenseEV = 130, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x0, .nickname = _("CROBAT"), @@ -5029,12 +5029,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 252, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0xD, .nickname = _("DUGTRIO"), @@ -5051,12 +5051,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 252, .spAttackEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x5, .nickname = _("ELECTRODE"), @@ -5073,12 +5073,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spDefenseEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x14, .nickname = _("GENGAR"), @@ -5094,7 +5094,7 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speechBefore = {EC_WORD_OH_DEAR, EC_WORD_I, EC_WORD_WILL, EC_WORD_WIN, EC_WORD_FOR, EC_WORD_YOU}, .speechWin = {EC_WORD_OH_DEAR, EC_WORD_WE, EC_WORD_HAVE, EC_WORD_A, EC_WORD_PARTY, EC_WORD_LATER}, .speechLose = {EC_WORD_OH_DEAR, EC_WORD_I_AM, EC_WORD_SORRY, EC_WORD_TO, EC_WORD_DISAPPOINT, EC_WORD_YOU}, - .speechAfter = {EC_WORD_IS, EC_WORD_YOUR, EC_WORD_GRANDFATHER, EC_WORD_COOL, EC_WORD_QUES, 0xFFFF}, + .speechAfter = {EC_WORD_IS, EC_WORD_YOUR, EC_WORD_GRANDFATHER, EC_WORD_COOL, EC_WORD_QUES, EC_EMPTY_WORD}, .mons = { [0] = @@ -5108,12 +5108,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 130, .spDefenseEV = 130, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x82, .nickname = _("LAPRAS"), @@ -5130,12 +5130,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 6, .speedEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x8A, .nickname = _("ABSOL"), @@ -5152,12 +5152,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .spAttackEV = 6, .spDefenseEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x0, .nickname = _("ALTARIA"), @@ -5174,12 +5174,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 252, .spAttackEV = 6, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x14, .nickname = _("DEWGONG"), @@ -5196,12 +5196,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .spAttackEV = 6, .spDefenseEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0x14, .nickname = _("POLITOED"), @@ -5218,12 +5218,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 6, .spDefenseEV = 252, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0x17, .nickname = _("MAROWAK"), @@ -5271,7 +5271,7 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speechBefore = {EC_WORD_WAAAH, EC_WORD_THIS, EC_WORD_IS, EC_WORD_SO, EC_WORD_EXCITING, EC_WORD_EXCL}, .speechWin = {EC_WORD_WAAAH, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_HAPPY, EC_WORD_I, EC_WORD_WON}, .speechLose = {EC_WORD_WAAAH, EC_WORD_I_AM, EC_WORD_SO, EC_WORD_SAD, EC_WORD_I, EC_WORD_LOST}, - .speechAfter = {EC_WORD_WAAAH, EC_WORD_EXCL, 0xFFFF, EC_WORD_GO, EC_WORD_AWAY, EC_WORD_EXCL}, + .speechAfter = {EC_WORD_WAAAH, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_GO, EC_WORD_AWAY, EC_WORD_EXCL}, .mons = { [0] = @@ -5285,12 +5285,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 200, .spDefenseEV = 200, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("FORRETRESS"), @@ -5306,12 +5306,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 1, .personality = 0xC, .nickname = _("ELECTRODE"), @@ -5327,12 +5327,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x7F, .nickname = _("EXEGGUTOR"), @@ -5349,12 +5349,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 200, .spDefenseEV = 200, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x93, .nickname = _("DUSCLOPS"), @@ -5370,12 +5370,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0xF, .nickname = _("NINETALES"), @@ -5391,12 +5391,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .hpEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x96, .nickname = _("BANETTE"), @@ -5410,7 +5410,7 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .facilityClass = FACILITY_CLASS_PKMN_RANGER_M, .unused = 0, .speechBefore = {EC_WORD_WAHAHAHA, EC_WORD_YOU, EC_WORD_CAN_T, EC_WORD_STOP, EC_WORD_ME, EC_WORD_EXCL}, - .speechWin = {EC_WORD_WOWEE, EC_WORD_EXCL, 0xFFFF, EC_WORD_I_AM, EC_WORD_AWESOME, EC_WORD_COOL}, + .speechWin = {EC_WORD_WOWEE, EC_WORD_EXCL, EC_EMPTY_WORD, EC_WORD_I_AM, EC_WORD_AWESOME, EC_WORD_COOL}, .speechLose = {EC_WORD_I_AM, EC_WORD_NOT, EC_WORD_COOL, EC_WORD_AT, EC_WORD_ALL, EC_WORD_EXCL}, .speechAfter = {EC_WORD_HEHEHE, EC_WORD_THAT_WAS, EC_WORD_AN, EC_WORD_AWESOME, EC_WORD_BATTLE, EC_WORD_EXCL}, .mons = @@ -5425,12 +5425,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x95, .nickname = _("SALAMENCE"), @@ -5446,12 +5446,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .speedEV = 255, .spAttackEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x8C, .nickname = _("GENGAR"), @@ -5467,12 +5467,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 255, .speedEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("GYARADOS"), @@ -5488,12 +5488,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .attackEV = 255, .speedEV = 255, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x3, .nickname = _("GENGAR"), @@ -5510,12 +5510,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 200, .spDefenseEV = 200, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x14, .nickname = _("DUSCLOPS"), @@ -5532,12 +5532,12 @@ static const struct TrHillFloor sDataTagExpert_Floors[] = { .defenseEV = 180, .spDefenseEV = 150, .otId = TRAINER_HILL_OTID, - .hpIV = 31, - .attackIV = 31, - .defenseIV = 31, - .speedIV = 31, - .spAttackIV = 31, - .spDefenseIV = 31, + .hpIV = MAX_PER_STAT_IVS, + .attackIV = MAX_PER_STAT_IVS, + .defenseIV = MAX_PER_STAT_IVS, + .speedIV = MAX_PER_STAT_IVS, + .spAttackIV = MAX_PER_STAT_IVS, + .spDefenseIV = MAX_PER_STAT_IVS, .abilityNum = 0, .personality = 0x85, .nickname = _("MISDREAVUS"), diff --git a/src/data/contest_opponents.h b/src/data/contest_opponents.h index 127457bbe..b5466904b 100644 --- a/src/data/contest_opponents.h +++ b/src/data/contest_opponents.h @@ -138,7 +138,7 @@ const struct ContestWinner gDefaultContestWinners[] = { - { + [CONTEST_WINNER_HALL_1 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_ELECTRIKE, @@ -147,7 +147,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("EZRA"), .contestRank = CONTEST_RANK_NORMAL }, - { + [CONTEST_WINNER_HALL_2 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_TROPIUS, @@ -156,7 +156,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("ALLAN"), .contestRank = CONTEST_RANK_HYPER }, - { + [CONTEST_WINNER_HALL_3 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_XATU, @@ -165,7 +165,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("JULIET"), .contestRank = CONTEST_RANK_NORMAL }, - { + [CONTEST_WINNER_HALL_4 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_PLUSLE, @@ -174,7 +174,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("BAILY"), .contestRank = CONTEST_RANK_MASTER }, - { + [CONTEST_WINNER_HALL_5 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_SHUPPET, @@ -183,7 +183,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("MELANY"), .contestRank = CONTEST_RANK_SUPER }, - { + [CONTEST_WINNER_HALL_6 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_ZANGOOSE, @@ -192,7 +192,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("HANA"), .contestRank = CONTEST_RANK_HYPER }, - { + [CONTEST_WINNER_HALL_UNUSED_1 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_LOUDRED, @@ -201,7 +201,7 @@ const struct ContestWinner gDefaultContestWinners[] = .trainerName = _("BRYANT"), .contestRank = CONTEST_RANK_HYPER }, - { + [CONTEST_WINNER_HALL_UNUSED_2 - 1] = { .personality = 0, .trainerId = 0xFFFF, .species = SPECIES_DELCATTY, diff --git a/src/data/credits.h b/src/data/credits.h new file mode 100644 index 000000000..3ae2b1d3b --- /dev/null +++ b/src/data/credits.h @@ -0,0 +1,787 @@ +enum +{ + PAGE_TITLE, + PAGE_DIRECTOR, + PAGE_ART_DIRECTOR, + PAGE_WORLD_DIRECTOR, + PAGE_LEAD_PROGRAMMER, + PAGE_PROGRAMMERS_1, + PAGE_PROGRAMMERS_2, + PAGE_PROGRAMMERS_3, + PAGE_PROGRAMMERS_4, + PAGE_GRAPHIC_DESIGNERS_1, + PAGE_GRAPHIC_DESIGNERS_2, + PAGE_GRAPHIC_DESIGNERS_3, + PAGE_MUSIC_COMPOSITION, + PAGE_SOUND_EFFECTS, + PAGE_GAME_DESIGNERS_1, + PAGE_GAME_DESIGNERS_2, + PAGE_GAME_DESIGNERS_3, + PAGE_SCENARIO_PLOT, + PAGE_SCENARIO, + PAGE_SCRIPT_DESIGNERS, + PAGE_MAP_DESIGNERS, + PAGE_BATTLE_FRONTIER_DATA, + PAGE_PARAMETRIC_DESIGNERS, + PAGE_POKEDEX_TEXT, + PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_1, + PAGE_PKMN_DESIGNERS_1, + PAGE_PKMN_DESIGNERS_2, + PAGE_PKMN_DESIGNERS_3, + PAGE_PKMN_DESIGNERS_4, + PAGE_SUPPORT_PROGRAMMERS, + PAGE_NCL_PRODUCT_TESTING, + PAGE_PACKAGE_AND_MANUAL, + PAGE_SPECIAL_THANKS_1, + PAGE_SPECIAL_THANKS_2, + PAGE_SPECIAL_THANKS_3, + PAGE_SPECIAL_THANKS_4, + PAGE_INFORMATION_SUPERVISORS, + PAGE_ARTWORK_1, + PAGE_ARTWORK_2, + PAGE_ARTWORK_3, + PAGE_COORDINATORS, + PAGE_ENGLISH_VERSION, + PAGE_TRANSLATOR, + PAGE_TEXT_EDITOR, + PAGE_NCL_COORDINATOR, + PAGE_PROGRAMMERS_5, + PAGE_GRAPHIC_DESIGNER, + PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_2, + PAGE_NOA_TESTING, + PAGE_BRAILLE_CODE_CHECK_1, + PAGE_BRAILLE_CODE_CHECK_2, + PAGE_SPECIAL_THANKS_5, + PAGE_TASK_MANAGERS, + PAGE_PRODUCERS, + PAGE_EXECUTIVE_DIRECTOR, + PAGE_EXECUTIVE_PRODUCERS_1, + PAGE_EXECUTIVE_PRODUCERS_2, + PAGE_COUNT +}; + +#define ENTRIES_PER_PAGE 5 + +static const u8 sCreditsText_EmptyString[] = _(""); +static const u8 sCreditsText_PkmnEmeraldVersion[] = _("POKéMON EMERALD VERSION"); +static const u8 sCreditsText_Credits[] = _("Credits"); +static const u8 sCreditsText_ExecutiveDirector[] = _("Executive Director"); +static const u8 sCreditsText_Director[] = _("Director"); +static const u8 sCreditsText_ArtDirector[] = _("Art Director"); +static const u8 sCreditsText_BattleDirector[] = _("Battle Director"); +static const u8 sCreditsText_MainProgrammer[] = _("Main Programmer"); +static const u8 sCreditsText_BattleSystemPgrms[] = _("Battle System Programmers"); +static const u8 sCreditsText_FieldSystemPgrms[] = _("Field System Programmer"); +static const u8 sCreditsText_Programmers[] = _("Programmers"); +static const u8 sCreditsText_MainGraphicDesigner[] = _("Main Graphic Designer"); +static const u8 sCreditsText_GraphicDesigners[] = _("Graphic Designers"); +static const u8 sCreditsText_PkmnDesigners[] = _("POKéMON Designers"); +static const u8 sCreditsText_MusicComposition[] = _("Music Composition"); +static const u8 sCreditsText_SoundEffectsAndPkmnVoices[] = _("Sound Effects & POKéMON Voices"); +static const u8 sCreditsText_GameDesigners[] = _("Game Designers"); +static const u8 sCreditsText_ScenarioPlot[] = _("Scenario Plot"); +static const u8 sCreditsText_Scenario[] = _("Scenario"); +static const u8 sCreditsText_ScriptDesigners[] = _("Script Designers"); +static const u8 sCreditsText_MapDesigners[] = _("Map Designers"); +static const u8 sCreditsText_MapDataDesigners[] = _("Map Data Designers"); +static const u8 sCreditsText_ParametricDesigners[] = _("Parametric Designers"); +static const u8 sCreditsText_PokedexText[] = _("POKéDEX Text"); +static const u8 sCreditsText_EnvAndToolPgrms[] = _("Environment & Tool Programmers"); +static const u8 sCreditsText_NCLProductTesting[] = _("NCL Product Testing"); +static const u8 sCreditsText_SpecialThanks[] = _("Special Thanks"); +static const u8 sCreditsText_Coordinators[] = _("Coordinators"); +static const u8 sCreditsText_Producers[] = _("Producers"); +static const u8 sCreditsText_ExecProducers[] = _("Executive Producers"); +static const u8 sCreditsText_InfoSupervisors[] = _("Information Supervisors"); +static const u8 sCreditsText_TaskManagers[] = _("Task Managers"); +static const u8 sCreditsText_BrailleCodeCheck[] = _("Braille Code Check"); +static const u8 sCreditsText_WorldDirector[] = _("World Director"); +static const u8 sCreditsText_BattleFrontierData[] = _("Battle Frontier Data"); +static const u8 sCreditsText_SupportProgrammers[] = _("Support Programmers"); +static const u8 sCreditsText_Artwork[] = _("Artwork"); +static const u8 sCreditsText_LeadProgrammer[] = _("Lead Programmer"); +static const u8 sCreditsText_LeadGraphicArtist[] = _("Lead Graphic Artist"); +static const u8 sCreditsText_SatoshiTajiri[] = _("Satoshi Tajiri"); +static const u8 sCreditsText_JunichiMasuda[] = _("Junichi Masuda"); +static const u8 sCreditsText_KenSugimori[] = _("Ken Sugimori"); +static const u8 sCreditsText_ShigekiMorimoto[] = _("Shigeki Morimoto"); +static const u8 sCreditsText_TetsuyaWatanabe[] = _("Tetsuya Watanabe"); +static const u8 sCreditsText_HisashiSogabe[] = _("Hisashi Sogabe"); +static const u8 sCreditsText_SosukeTamada[] = _("Sosuke Tamada"); +static const u8 sCreditsText_AkitoMori[] = _("Akito Mori"); +static const u8 sCreditsText_KeitaKagaya[] = _("Keita Kagaya"); +static const u8 sCreditsText_YoshinoriMatsuda[] = _("Yoshinori Matsuda"); +static const u8 sCreditsText_HiroyukiNakamura[] = _("Hiroyuki Nakamura"); +static const u8 sCreditsText_MasaoTaya[] = _("Masao Taya"); +static const u8 sCreditsText_SatoshiNohara[] = _("Satoshi Nohara"); +static const u8 sCreditsText_TomomichiOhta[] = _("Tomomichi Ohta"); +static const u8 sCreditsText_MiyukiIwasawa[] = _("Miyuki Iwasawa"); +static const u8 sCreditsText_TakenoriOhta[] = _("Takenori Ohta"); +static const u8 sCreditsText_HironobuYoshida[] = _("Hironobu Yoshida"); +static const u8 sCreditsText_MotofumiFujiwara[] = _("Motofumi Fujiwara"); +static const u8 sCreditsText_SatoshiOhta[] = _("Satoshi Ohta"); +static const u8 sCreditsText_AsukaIwashita[] = _("Asuka Iwashita"); +static const u8 sCreditsText_AimiTomita[] = _("Aimi Tomita"); +static const u8 sCreditsText_TakaoUnno[] = _("Takao Unno"); +static const u8 sCreditsText_KanakoEo[] = _("Kanako Eo"); +static const u8 sCreditsText_JunOkutani[] = _("Jun Okutani"); +static const u8 sCreditsText_AtsukoNishida[] = _("Atsuko Nishida"); +static const u8 sCreditsText_MuneoSaito[] = _("Muneo Saito"); +static const u8 sCreditsText_RenaYoshikawa[] = _("Rena Yoshikawa"); +static const u8 sCreditsText_GoIchinose[] = _("Go Ichinose"); +static const u8 sCreditsText_MorikazuAoki[] = _("Morikazu Aoki"); +static const u8 sCreditsText_KojiNishino[] = _("Koji Nishino"); +static const u8 sCreditsText_KenjiMatsushima[] = _("Kenji Matsushima"); +static const u8 sCreditsText_TetsujiOhta[] = _("Tetsuji Ohta"); +static const u8 sCreditsText_HitomiSato[] = _("Hitomi Sato"); +static const u8 sCreditsText_TakeshiKawachimaru[] = _("Takeshi Kawachimaru"); +static const u8 sCreditsText_TeruyukiShimoyamada[] = _("Teruyuki Shimoyamada"); +static const u8 sCreditsText_ShigeruOhmori[] = _("Shigeru Ohmori"); +static const u8 sCreditsText_TadashiTakahashi[] = _("Tadashi Takahashi"); +static const u8 sCreditsText_ToshinobuMatsumiya[] = _("Toshinobu Matsumiya"); +static const u8 sCreditsText_AkihitoTomisawa[] = _("Akihito Tomisawa"); +static const u8 sCreditsText_HirokiEnomoto[] = _("Hiroki Enomoto"); +static const u8 sCreditsText_KazuyukiTerada[] = _("Kazuyuki Terada"); +static const u8 sCreditsText_YuriSakurai[] = _("Yuri Sakurai"); +static const u8 sCreditsText_HiromiSagawa[] = _("Hiromi Sagawa"); +static const u8 sCreditsText_KenjiTominaga[] = _("Kenji Tominaga"); +static const u8 sCreditsText_YoshioTajiri[] = _("Yoshio Tajiri"); +static const u8 sCreditsText_TeikoSasaki[] = _("Teiko Sasaki"); +static const u8 sCreditsText_SachikoHamano[] = _("Sachiko Hamano"); +static const u8 sCreditsText_ChieMatsumiya[] = _("Chie Matsumiya"); +static const u8 sCreditsText_AkikoShinozaki[] = _("Akiko Shinozaki"); +static const u8 sCreditsText_AstukoFujii[] = _("Astuko Fujii"); +static const u8 sCreditsText_NozomuSaito[] = _("Nozomu Saito"); +static const u8 sCreditsText_KenkichiToyama[] = _("Kenkichi Toyama"); +static const u8 sCreditsText_SuguruNakatsui[] = _("Suguru Nakatsui"); +static const u8 sCreditsText_YumiFunasaka[] = _("Yumi Funasaka"); +static const u8 sCreditsText_NaokoYanase[] = _("Naoko Yanase"); +static const u8 sCreditsText_NCLSuperMarioClub[] = _("NCL Super Mario Club"); +static const u8 sCreditsText_AtsushiTada[] = _("Atsushi Tada"); +static const u8 sCreditsText_TakahiroOhnishi[] = _("Takahiro Ohnishi"); +static const u8 sCreditsText_NorihideOkamura[] = _("Norihide Okamura"); +static const u8 sCreditsText_HiroNakamura[] = _("Hiro Nakamura"); +static const u8 sCreditsText_HiroyukiUesugi[] = _("Hiroyuki Uesugi"); +static const u8 sCreditsText_TerukiMurakawa[] = _("Teruki Murakawa"); +static const u8 sCreditsText_AkiraKinashi[] = _("Akira Kinashi"); +static const u8 sCreditsText_MichikoTakizawa[] = _("Michiko Takizawa"); +static const u8 sCreditsText_MakikoTakada[] = _("Makiko Takada"); +static const u8 sCreditsText_TakanaoKondo[] = _("Takanao Kondo"); +static const u8 sCreditsText_AiMashima[] = _("Ai Mashima"); +static const u8 sCreditsText_GakujiNomoto[] = _("Gakuji Nomoto"); +static const u8 sCreditsText_TakehiroIzushi[] = _("Takehiro Izushi"); +static const u8 sCreditsText_HitoshiYamagami[] = _("Hitoshi Yamagami"); +static const u8 sCreditsText_KyokoWatanabe[] = _("Kyoko Watanabe"); +static const u8 sCreditsText_TakaoNakano[] = _("Takao Nakano"); +static const u8 sCreditsText_HiroyukiJinnai[] = _("Hiroyuki Jinnai"); +static const u8 sCreditsText_HiroakiTsuru[] = _("Hiroaki Tsuru"); +static const u8 sCreditsText_TsunekazIshihara[] = _("Tsunekaz Ishihara"); +static const u8 sCreditsText_SatoruIwata[] = _("Satoru Iwata"); +static const u8 sCreditsText_KazuyaSuyama[] = _("Kazuya Suyama"); +static const u8 sCreditsText_SatoshiMitsuhara[] = _("Satoshi Mitsuhara"); +static const u8 sCreditsText_JapanBrailleLibrary[] = _("Japan Braille Library"); +static const u8 sCreditsText_TomotakaKomura[] = _("Tomotaka Komura"); +static const u8 sCreditsText_MikikoOhhashi[] = _("Mikiko Ohhashi"); +static const u8 sCreditsText_DaisukeHoshino[] = _("Daisuke Hoshino"); +static const u8 sCreditsText_KenjiroIto[] = _("Kenjiro Ito"); +static const u8 sCreditsText_RuiKawaguchi[] = _("Rui Kawaguchi"); +static const u8 sCreditsText_ShunsukeKohori[] = _("Shunsuke Kohori"); +static const u8 sCreditsText_SachikoNakamichi[] = _("Sachiko Nakamichi"); +static const u8 sCreditsText_FujikoNomura[] = _("Fujiko Nomura"); +static const u8 sCreditsText_KazukiYoshihara[] = _("Kazuki Yoshihara"); +static const u8 sCreditsText_RetsujiNomoto[] = _("Retsuji Nomoto"); +static const u8 sCreditsText_AzusaTajima[] = _("Azusa Tajima"); +static const u8 sCreditsText_ShusakuEgami[] = _("Shusaku Egami"); +static const u8 sCreditsText_PackageAndManual[] = _("Package & Manual Illustration"); +static const u8 sCreditsText_EnglishVersion[] = _("English Version Coordinators"); +static const u8 sCreditsText_Translator[] = _("Translator"); +static const u8 sCreditsText_TextEditor[] = _("Text Editor"); +static const u8 sCreditsText_NCLCoordinator[] = _("NCL Coordinator"); +static const u8 sCreditsText_GraphicDesigner[] = _("Graphic Designer"); +static const u8 sCreditsText_NOAProductTesting[] = _("NOA Product Testing"); +static const u8 sCreditsText_HideyukiNakajima[] = _("Hideyuki Nakajima"); +static const u8 sCreditsText_HidenoriSaeki[] = _("Hidenori Saeki"); +static const u8 sCreditsText_YokoWatanabe[] = _("Yoko Watanabe"); +static const u8 sCreditsText_SakaeKimura[] = _("Sakae Kimura"); +static const u8 sCreditsText_ChiakiShinkai[] = _("Chiaki Shinkai"); +static const u8 sCreditsText_SethMcMahill[] = _("Seth McMahill"); +static const u8 sCreditsText_NobOgasawara[] = _("Nob Ogasawara"); +static const u8 sCreditsText_TeresaLillygren[] = _("Teresa Lillygren"); +static const u8 sCreditsText_KimikoNakamichi[] = _("Kimiko Nakamichi"); +static const u8 sCreditsText_SouichiYamamoto[] = _("Souichi Yamamoto"); +static const u8 sCreditsText_YuichiroIto[] = _("Yuichiro Ito"); +static const u8 sCreditsText_ThomasHertzog[] = _("Thomas Hertzog"); +static const u8 sCreditsText_MikaKurosawa[] = _("Mika Kurosawa"); +static const u8 sCreditsText_NationalFederationBlind[] = _("National Federation of the Blind"); +static const u8 sCreditsText_PatriciaAMaurer[] = _("Patricia A. Maurer"); +static const u8 sCreditsText_EuropeanBlindUnion[] = _("European Blind Union"); +static const u8 sCreditsText_AustralianBrailleAuthority[] = _("Australian Braille Authority"); +static const u8 sCreditsText_RoyalNewZealandFederationBlind[] = _("Royal New Zealand Federation for the Blind"); +static const u8 sCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima"); +static const u8 sCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow"); +static const u8 sCreditsText_ShellieDow[] = _("Shellie Dow"); +static const u8 sCreditsText_ErikJohnson[] = _("Erik Johnson"); +static const struct CreditsEntry sCreditsEntry_EmptyString[] = { 0, FALSE, sCreditsText_EmptyString}; +static const struct CreditsEntry sCreditsEntry_PkmnEmeraldVersion[] = { 7, TRUE, sCreditsText_PkmnEmeraldVersion}; +static const struct CreditsEntry sCreditsEntry_Credits[] = {11, TRUE, sCreditsText_Credits}; +static const struct CreditsEntry sCreditsEntry_ExecutiveDirector[] = { 8, TRUE, sCreditsText_ExecutiveDirector}; +static const struct CreditsEntry sCreditsEntry_Director[] = {12, TRUE, sCreditsText_Director}; +static const struct CreditsEntry sCreditsEntry_ArtDirector[] = {10, TRUE, sCreditsText_ArtDirector}; +static const struct CreditsEntry sCreditsEntry_BattleDirector[] = {10, TRUE, sCreditsText_BattleDirector}; +static const struct CreditsEntry sCreditsEntry_MainProgrammer[] = {10, TRUE, sCreditsText_MainProgrammer}; +static const struct CreditsEntry sCreditsEntry_BattleSystemPgrms[] = { 8, TRUE, sCreditsText_BattleSystemPgrms}; +static const struct CreditsEntry sCreditsEntry_FieldSystemPgrms[] = { 7, TRUE, sCreditsText_FieldSystemPgrms}; +static const struct CreditsEntry sCreditsEntry_Programmers[] = {12, TRUE, sCreditsText_Programmers}; +static const struct CreditsEntry sCreditsEntry_MainGraphicDesigner[] = { 7, TRUE, sCreditsText_MainGraphicDesigner}; +static const struct CreditsEntry sCreditsEntry_GraphicDesigners[] = { 9, TRUE, sCreditsText_GraphicDesigners}; +static const struct CreditsEntry sCreditsEntry_PkmnDesigners[] = {10, TRUE, sCreditsText_PkmnDesigners}; +static const struct CreditsEntry sCreditsEntry_MusicComposition[] = {13, TRUE, sCreditsText_MusicComposition}; +static const struct CreditsEntry sCreditsEntry_SoundEffectsAndPkmnVoices[] = { 4, TRUE, sCreditsText_SoundEffectsAndPkmnVoices}; +static const struct CreditsEntry sCreditsEntry_GameDesigners[] = {11, TRUE, sCreditsText_GameDesigners}; +static const struct CreditsEntry sCreditsEntry_ScenarioPlot[] = {11, TRUE, sCreditsText_ScenarioPlot}; +static const struct CreditsEntry sCreditsEntry_Scenario[] = {13, TRUE, sCreditsText_Scenario}; +static const struct CreditsEntry sCreditsEntry_ScriptDesigners[] = {10, TRUE, sCreditsText_ScriptDesigners}; +static const struct CreditsEntry sCreditsEntry_MapDesigners[] = {11, TRUE, sCreditsText_MapDesigners}; +static const struct CreditsEntry sCreditsEntry_MapDataDesigners[] = { 9, TRUE, sCreditsText_MapDataDesigners}; +static const struct CreditsEntry sCreditsEntry_ParametricDesigners[] = { 9, TRUE, sCreditsText_ParametricDesigners}; +static const struct CreditsEntry sCreditsEntry_PokedexText[] = {11, TRUE, sCreditsText_PokedexText}; +static const struct CreditsEntry sCreditsEntry_EnvAndToolPgrms[] = { 6, TRUE, sCreditsText_EnvAndToolPgrms}; +static const struct CreditsEntry sCreditsEntry_NCLProductTesting[] = {11, TRUE, sCreditsText_NCLProductTesting}; +static const struct CreditsEntry sCreditsEntry_SpecialThanks[] = {10, TRUE, sCreditsText_SpecialThanks}; +static const struct CreditsEntry sCreditsEntry_Coordinators[] = {11, TRUE, sCreditsText_Coordinators}; +static const struct CreditsEntry sCreditsEntry_Producers[] = {11, TRUE, sCreditsText_Producers}; +static const struct CreditsEntry sCreditsEntry_ExecProducers[] = { 7, TRUE, sCreditsText_ExecProducers}; +static const struct CreditsEntry sCreditsEntry_InfoSupervisors[] = {10, TRUE, sCreditsText_InfoSupervisors}; +static const struct CreditsEntry sCreditsEntry_TaskManagers[] = { 8, TRUE, sCreditsText_TaskManagers}; +static const struct CreditsEntry sCreditsEntry_BrailleCodeCheck[] = {10, TRUE, sCreditsText_BrailleCodeCheck}; +static const struct CreditsEntry sCreditsEntry_WorldDirector[] = {10, TRUE, sCreditsText_WorldDirector}; +static const struct CreditsEntry sCreditsEntry_BattleFrontierData[] = { 8, TRUE, sCreditsText_BattleFrontierData}; +static const struct CreditsEntry sCreditsEntry_SupportProgrammers[] = {10, TRUE, sCreditsText_SupportProgrammers}; +static const struct CreditsEntry sCreditsEntry_Artwork[] = {12, TRUE, sCreditsText_Artwork}; +static const struct CreditsEntry sCreditsEntry_LeadProgrammer[] = {10, TRUE, sCreditsText_LeadProgrammer}; +static const struct CreditsEntry sCreditsEntry_LeadGraphicArtist[] = { 9, TRUE, sCreditsText_LeadGraphicArtist}; +static const struct CreditsEntry sCreditsEntry_SatoshiTajiri[] = {11, FALSE, sCreditsText_SatoshiTajiri}; +static const struct CreditsEntry sCreditsEntry_JunichiMasuda[] = {11, FALSE, sCreditsText_JunichiMasuda}; +static const struct CreditsEntry sCreditsEntry_KenSugimori[] = {11, FALSE, sCreditsText_KenSugimori}; +static const struct CreditsEntry sCreditsEntry_ShigekiMorimoto[] = {11, FALSE, sCreditsText_ShigekiMorimoto}; +static const struct CreditsEntry sCreditsEntry_TetsuyaWatanabe[] = {11, FALSE, sCreditsText_TetsuyaWatanabe}; +static const struct CreditsEntry sCreditsEntry_HisashiSogabe[] = {11, FALSE, sCreditsText_HisashiSogabe}; +static const struct CreditsEntry sCreditsEntry_SosukeTamada[] = {11, FALSE, sCreditsText_SosukeTamada}; +static const struct CreditsEntry sCreditsEntry_AkitoMori[] = {11, FALSE, sCreditsText_AkitoMori}; +static const struct CreditsEntry sCreditsEntry_KeitaKagaya[] = {11, FALSE, sCreditsText_KeitaKagaya}; +static const struct CreditsEntry sCreditsEntry_YoshinoriMatsuda[] = {11, FALSE, sCreditsText_YoshinoriMatsuda}; +static const struct CreditsEntry sCreditsEntry_HiroyukiNakamura[] = {11, FALSE, sCreditsText_HiroyukiNakamura}; +static const struct CreditsEntry sCreditsEntry_MasaoTaya[] = {11, FALSE, sCreditsText_MasaoTaya}; +static const struct CreditsEntry sCreditsEntry_SatoshiNohara[] = {11, FALSE, sCreditsText_SatoshiNohara}; +static const struct CreditsEntry sCreditsEntry_TomomichiOhta[] = {11, FALSE, sCreditsText_TomomichiOhta}; +static const struct CreditsEntry sCreditsEntry_MiyukiIwasawa[] = {11, FALSE, sCreditsText_MiyukiIwasawa}; +static const struct CreditsEntry sCreditsEntry_TakenoriOhta[] = {11, FALSE, sCreditsText_TakenoriOhta}; +static const struct CreditsEntry sCreditsEntry_HironobuYoshida[] = {11, FALSE, sCreditsText_HironobuYoshida}; +static const struct CreditsEntry sCreditsEntry_MotofumiFujiwara[] = {11, FALSE, sCreditsText_MotofumiFujiwara}; +static const struct CreditsEntry sCreditsEntry_SatoshiOhta[] = {11, FALSE, sCreditsText_SatoshiOhta}; +static const struct CreditsEntry sCreditsEntry_AsukaIwashita[] = {11, FALSE, sCreditsText_AsukaIwashita}; +static const struct CreditsEntry sCreditsEntry_AimiTomita[] = {11, FALSE, sCreditsText_AimiTomita}; +static const struct CreditsEntry sCreditsEntry_TakaoUnno[] = {11, FALSE, sCreditsText_TakaoUnno}; +static const struct CreditsEntry sCreditsEntry_KanakoEo[] = {11, FALSE, sCreditsText_KanakoEo}; +static const struct CreditsEntry sCreditsEntry_JunOkutani[] = {11, FALSE, sCreditsText_JunOkutani}; +static const struct CreditsEntry sCreditsEntry_AtsukoNishida[] = {11, FALSE, sCreditsText_AtsukoNishida}; +static const struct CreditsEntry sCreditsEntry_MuneoSaito[] = {11, FALSE, sCreditsText_MuneoSaito}; +static const struct CreditsEntry sCreditsEntry_RenaYoshikawa[] = {11, FALSE, sCreditsText_RenaYoshikawa}; +static const struct CreditsEntry sCreditsEntry_GoIchinose[] = {11, FALSE, sCreditsText_GoIchinose}; +static const struct CreditsEntry sCreditsEntry_MorikazuAoki[] = {11, FALSE, sCreditsText_MorikazuAoki}; +static const struct CreditsEntry sCreditsEntry_KojiNishino[] = {11, FALSE, sCreditsText_KojiNishino}; +static const struct CreditsEntry sCreditsEntry_KenjiMatsushima[] = {11, FALSE, sCreditsText_KenjiMatsushima}; +static const struct CreditsEntry sCreditsEntry_TetsujiOhta[] = {11, FALSE, sCreditsText_TetsujiOhta}; +static const struct CreditsEntry sCreditsEntry_HitomiSato[] = {11, FALSE, sCreditsText_HitomiSato}; +static const struct CreditsEntry sCreditsEntry_TakeshiKawachimaru[] = {11, FALSE, sCreditsText_TakeshiKawachimaru}; +static const struct CreditsEntry sCreditsEntry_TeruyukiShimoyamada[] = {11, FALSE, sCreditsText_TeruyukiShimoyamada}; +static const struct CreditsEntry sCreditsEntry_ShigeruOhmori[] = {11, FALSE, sCreditsText_ShigeruOhmori}; +static const struct CreditsEntry sCreditsEntry_TadashiTakahashi[] = {11, FALSE, sCreditsText_TadashiTakahashi}; +static const struct CreditsEntry sCreditsEntry_ToshinobuMatsumiya[] = {11, FALSE, sCreditsText_ToshinobuMatsumiya}; +static const struct CreditsEntry sCreditsEntry_AkihitoTomisawa[] = {11, FALSE, sCreditsText_AkihitoTomisawa}; +static const struct CreditsEntry sCreditsEntry_HirokiEnomoto[] = {11, FALSE, sCreditsText_HirokiEnomoto}; +static const struct CreditsEntry sCreditsEntry_KazuyukiTerada[] = {11, FALSE, sCreditsText_KazuyukiTerada}; +static const struct CreditsEntry sCreditsEntry_YuriSakurai[] = {11, FALSE, sCreditsText_YuriSakurai}; +static const struct CreditsEntry sCreditsEntry_HiromiSagawa[] = {11, FALSE, sCreditsText_HiromiSagawa}; +static const struct CreditsEntry sCreditsEntry_KenjiTominaga[] = {11, FALSE, sCreditsText_KenjiTominaga}; +static const struct CreditsEntry sCreditsEntry_YoshioTajiri[] = {11, FALSE, sCreditsText_YoshioTajiri}; +static const struct CreditsEntry sCreditsEntry_TeikoSasaki[] = {11, FALSE, sCreditsText_TeikoSasaki}; +static const struct CreditsEntry sCreditsEntry_SachikoHamano[] = {11, FALSE, sCreditsText_SachikoHamano}; +static const struct CreditsEntry sCreditsEntry_ChieMatsumiya[] = {11, FALSE, sCreditsText_ChieMatsumiya}; +static const struct CreditsEntry sCreditsEntry_AkikoShinozaki[] = {11, FALSE, sCreditsText_AkikoShinozaki}; +static const struct CreditsEntry sCreditsEntry_AstukoFujii[] = {11, FALSE, sCreditsText_AstukoFujii}; +static const struct CreditsEntry sCreditsEntry_NozomuSaito[] = {11, FALSE, sCreditsText_NozomuSaito}; +static const struct CreditsEntry sCreditsEntry_KenkichiToyama[] = {11, FALSE, sCreditsText_KenkichiToyama}; +static const struct CreditsEntry sCreditsEntry_SuguruNakatsui[] = {11, FALSE, sCreditsText_SuguruNakatsui}; +static const struct CreditsEntry sCreditsEntry_YumiFunasaka[] = {11, FALSE, sCreditsText_YumiFunasaka}; +static const struct CreditsEntry sCreditsEntry_NaokoYanase[] = {11, FALSE, sCreditsText_NaokoYanase}; +static const struct CreditsEntry sCreditsEntry_NCLSuperMarioClub[] = {11, FALSE, sCreditsText_NCLSuperMarioClub}; +static const struct CreditsEntry sCreditsEntry_AtsushiTada[] = {11, FALSE, sCreditsText_AtsushiTada}; +static const struct CreditsEntry sCreditsEntry_TakahiroOhnishi[] = {11, FALSE, sCreditsText_TakahiroOhnishi}; +static const struct CreditsEntry sCreditsEntry_NorihideOkamura[] = {11, FALSE, sCreditsText_NorihideOkamura}; +static const struct CreditsEntry sCreditsEntry_HiroNakamura[] = {11, FALSE, sCreditsText_HiroNakamura}; +static const struct CreditsEntry sCreditsEntry_HiroyukiUesugi[] = {11, FALSE, sCreditsText_HiroyukiUesugi}; +static const struct CreditsEntry sCreditsEntry_TerukiMurakawa[] = {11, FALSE, sCreditsText_TerukiMurakawa}; +static const struct CreditsEntry sCreditsEntry_AkiraKinashi[] = {11, FALSE, sCreditsText_AkiraKinashi}; +static const struct CreditsEntry sCreditsEntry_MichikoTakizawa[] = {11, FALSE, sCreditsText_MichikoTakizawa}; +static const struct CreditsEntry sCreditsEntry_MakikoTakada[] = {11, FALSE, sCreditsText_MakikoTakada}; +static const struct CreditsEntry sCreditsEntry_TakanaoKondo[] = {11, FALSE, sCreditsText_TakanaoKondo}; +static const struct CreditsEntry sCreditsEntry_AiMashima[] = {11, FALSE, sCreditsText_AiMashima}; +static const struct CreditsEntry sCreditsEntry_GakujiNomoto[] = {11, FALSE, sCreditsText_GakujiNomoto}; +static const struct CreditsEntry sCreditsEntry_TakehiroIzushi[] = {11, FALSE, sCreditsText_TakehiroIzushi}; +static const struct CreditsEntry sCreditsEntry_HitoshiYamagami[] = {11, FALSE, sCreditsText_HitoshiYamagami}; +static const struct CreditsEntry sCreditsEntry_KyokoWatanabe[] = {11, FALSE, sCreditsText_KyokoWatanabe}; +static const struct CreditsEntry sCreditsEntry_TakaoNakano[] = {11, FALSE, sCreditsText_TakaoNakano}; +static const struct CreditsEntry sCreditsEntry_HiroyukiJinnai[] = {11, FALSE, sCreditsText_HiroyukiJinnai}; +static const struct CreditsEntry sCreditsEntry_HiroakiTsuru[] = {11, FALSE, sCreditsText_HiroakiTsuru}; +static const struct CreditsEntry sCreditsEntry_TsunekazIshihara[] = {11, FALSE, sCreditsText_TsunekazIshihara}; +static const struct CreditsEntry sCreditsEntry_SatoruIwata[] = {11, FALSE, sCreditsText_SatoruIwata}; +static const struct CreditsEntry sCreditsEntry_KazuyaSuyama[] = {11, FALSE, sCreditsText_KazuyaSuyama}; +static const struct CreditsEntry sCreditsEntry_SatoshiMitsuhara[] = {11, FALSE, sCreditsText_SatoshiMitsuhara}; +static const struct CreditsEntry sCreditsEntry_JapanBrailleLibrary[] = { 9, FALSE, sCreditsText_JapanBrailleLibrary}; +static const struct CreditsEntry sCreditsEntry_TomotakaKomura[] = {11, FALSE, sCreditsText_TomotakaKomura}; +static const struct CreditsEntry sCreditsEntry_MikikoOhhashi[] = {11, FALSE, sCreditsText_MikikoOhhashi}; +static const struct CreditsEntry sCreditsEntry_DaisukeHoshino[] = {11, FALSE, sCreditsText_DaisukeHoshino}; +static const struct CreditsEntry sCreditsEntry_KenjiroIto[] = {11, FALSE, sCreditsText_KenjiroIto}; +static const struct CreditsEntry sCreditsEntry_RuiKawaguchi[] = {11, FALSE, sCreditsText_RuiKawaguchi}; +static const struct CreditsEntry sCreditsEntry_ShunsukeKohori[] = {11, FALSE, sCreditsText_ShunsukeKohori}; +static const struct CreditsEntry sCreditsEntry_SachikoNakamichi[] = {11, FALSE, sCreditsText_SachikoNakamichi}; +static const struct CreditsEntry sCreditsEntry_FujikoNomura[] = {11, FALSE, sCreditsText_FujikoNomura}; +static const struct CreditsEntry sCreditsEntry_KazukiYoshihara[] = {11, FALSE, sCreditsText_KazukiYoshihara}; +static const struct CreditsEntry sCreditsEntry_RetsujiNomoto[] = {11, FALSE, sCreditsText_RetsujiNomoto}; +static const struct CreditsEntry sCreditsEntry_AzusaTajima[] = {11, FALSE, sCreditsText_AzusaTajima}; +static const struct CreditsEntry sCreditsEntry_ShusakuEgami[] = {11, FALSE, sCreditsText_ShusakuEgami}; +static const struct CreditsEntry sCreditsEntry_PackageAndManual[] = { 0, TRUE, sCreditsText_PackageAndManual}; +static const struct CreditsEntry sCreditsEntry_EnglishVersion[] = { 0, TRUE, sCreditsText_EnglishVersion}; +static const struct CreditsEntry sCreditsEntry_Translator[] = { 0, TRUE, sCreditsText_Translator}; +static const struct CreditsEntry sCreditsEntry_TextEditor[] = { 0, TRUE, sCreditsText_TextEditor}; +static const struct CreditsEntry sCreditsEntry_NCLCoordinator[] = { 0, TRUE, sCreditsText_NCLCoordinator}; +static const struct CreditsEntry sCreditsEntry_GraphicDesigner[] = { 0, TRUE, sCreditsText_GraphicDesigner}; +static const struct CreditsEntry sCreditsEntry_NOAProductTesting[] = { 0, TRUE, sCreditsText_NOAProductTesting}; +static const struct CreditsEntry sCreditsEntry_HideyukiNakajima[] = { 0, FALSE, sCreditsText_HideyukiNakajima}; +static const struct CreditsEntry sCreditsEntry_HidenoriSaeki[] = { 0, FALSE, sCreditsText_HidenoriSaeki}; +static const struct CreditsEntry sCreditsEntry_YokoWatanabe[] = { 0, FALSE, sCreditsText_YokoWatanabe}; +static const struct CreditsEntry sCreditsEntry_SakaeKimura[] = { 0, FALSE, sCreditsText_SakaeKimura}; +static const struct CreditsEntry sCreditsEntry_ChiakiShinkai[] = { 0, FALSE, sCreditsText_ChiakiShinkai}; +static const struct CreditsEntry sCreditsEntry_SethMcMahill[] = { 0, FALSE, sCreditsText_SethMcMahill}; +static const struct CreditsEntry sCreditsEntry_NobOgasawara[] = { 0, FALSE, sCreditsText_NobOgasawara}; +static const struct CreditsEntry sCreditsEntry_TeresaLillygren[] = { 0, FALSE, sCreditsText_TeresaLillygren}; +static const struct CreditsEntry sCreditsEntry_KimikoNakamichi[] = { 0, FALSE, sCreditsText_KimikoNakamichi}; +static const struct CreditsEntry sCreditsEntry_SouichiYamamoto[] = { 0, FALSE, sCreditsText_SouichiYamamoto}; +static const struct CreditsEntry sCreditsEntry_YuichiroIto[] = { 0, FALSE, sCreditsText_YuichiroIto}; +static const struct CreditsEntry sCreditsEntry_ThomasHertzog[] = { 0, FALSE, sCreditsText_ThomasHertzog}; +static const struct CreditsEntry sCreditsEntry_MikaKurosawa[] = { 0, FALSE, sCreditsText_MikaKurosawa}; +static const struct CreditsEntry sCreditsEntry_NationalFederationBlind[] = { 0, FALSE, sCreditsText_NationalFederationBlind}; +static const struct CreditsEntry sCreditsEntry_PatriciaAMaurer[] = { 0, FALSE, sCreditsText_PatriciaAMaurer}; +static const struct CreditsEntry sCreditsEntry_EuropeanBlindUnion[] = { 0, FALSE, sCreditsText_EuropeanBlindUnion}; +static const struct CreditsEntry sCreditsEntry_AustralianBrailleAuthority[] = { 0, FALSE, sCreditsText_AustralianBrailleAuthority}; +static const struct CreditsEntry sCreditsEntry_RoyalNewZealandFederationBlind[] = { 0, FALSE, sCreditsText_RoyalNewZealandFederationBlind}; +static const struct CreditsEntry sCreditsEntry_MotoyasuTojima[] = { 0, FALSE, sCreditsText_MotoyasuTojima}; +static const struct CreditsEntry sCreditsEntry_NicolaPrattBarlow[] = { 0, FALSE, sCreditsText_NicolaPrattBarlow}; +static const struct CreditsEntry sCreditsEntry_ShellieDow[] = { 0, FALSE, sCreditsText_ShellieDow}; +static const struct CreditsEntry sCreditsEntry_ErikJohnson[] = { 0, FALSE, sCreditsText_ErikJohnson}; + +#define _ sCreditsEntry_EmptyString +static const struct CreditsEntry *const sCreditsEntryPointerTable[PAGE_COUNT][ENTRIES_PER_PAGE] = +{ + [PAGE_TITLE] = { + _, + sCreditsEntry_PkmnEmeraldVersion, + sCreditsEntry_Credits, + _, + _ + }, + [PAGE_DIRECTOR] = { + _, + sCreditsEntry_Director, + sCreditsEntry_ShigekiMorimoto, + _, + _, + }, + [PAGE_ART_DIRECTOR] = { + _, + sCreditsEntry_ArtDirector, + sCreditsEntry_KenSugimori, + _, + _, + }, + [PAGE_WORLD_DIRECTOR] = { + _, + sCreditsEntry_WorldDirector, + sCreditsEntry_JunichiMasuda, + _, + _, + }, + [PAGE_LEAD_PROGRAMMER] = { + sCreditsEntry_LeadProgrammer, + sCreditsEntry_HisashiSogabe, + sCreditsEntry_LeadGraphicArtist, + sCreditsEntry_MotofumiFujiwara, + _, + }, + [PAGE_PROGRAMMERS_1] = { + sCreditsEntry_Programmers, + sCreditsEntry_HisashiSogabe, + sCreditsEntry_TomomichiOhta, + sCreditsEntry_NozomuSaito, + sCreditsEntry_EmptyString, + }, + [PAGE_PROGRAMMERS_2] = { + sCreditsEntry_Programmers, + sCreditsEntry_AkitoMori, + sCreditsEntry_HiroyukiNakamura, + sCreditsEntry_MasaoTaya, + _, + }, + [PAGE_PROGRAMMERS_3] = { + sCreditsEntry_Programmers, + sCreditsEntry_SatoshiNohara, + sCreditsEntry_MiyukiIwasawa, + sCreditsEntry_YoshinoriMatsuda, + sCreditsEntry_KeitaKagaya, + }, + [PAGE_PROGRAMMERS_4] = { + sCreditsEntry_Programmers, + sCreditsEntry_TetsuyaWatanabe, + sCreditsEntry_SosukeTamada, + sCreditsEntry_TakenoriOhta, + _, + }, + [PAGE_GRAPHIC_DESIGNERS_1] = { + _, + sCreditsEntry_GraphicDesigners, + sCreditsEntry_MotofumiFujiwara, + sCreditsEntry_SatoshiOhta, + _, + }, + [PAGE_GRAPHIC_DESIGNERS_2] = { + sCreditsEntry_GraphicDesigners, + sCreditsEntry_KenkichiToyama, + sCreditsEntry_AsukaIwashita, + sCreditsEntry_TakaoUnno, + _, + }, + [PAGE_GRAPHIC_DESIGNERS_3] = { + sCreditsEntry_GraphicDesigners, + sCreditsEntry_KenSugimori, + sCreditsEntry_HironobuYoshida, + sCreditsEntry_AimiTomita, + sCreditsEntry_KanakoEo, + }, + [PAGE_MUSIC_COMPOSITION] = { + sCreditsEntry_MusicComposition, + sCreditsEntry_GoIchinose, + sCreditsEntry_JunichiMasuda, + sCreditsEntry_MorikazuAoki, + sCreditsEntry_HitomiSato, + }, + [PAGE_SOUND_EFFECTS] = { + _, + sCreditsEntry_SoundEffectsAndPkmnVoices, + sCreditsEntry_GoIchinose, + sCreditsEntry_MorikazuAoki, + _, + }, + [PAGE_GAME_DESIGNERS_1] = { + sCreditsEntry_GameDesigners, + sCreditsEntry_ShigekiMorimoto, + sCreditsEntry_TeruyukiShimoyamada, + sCreditsEntry_TakeshiKawachimaru, + sCreditsEntry_AkihitoTomisawa, + }, + [PAGE_GAME_DESIGNERS_2] = { + sCreditsEntry_GameDesigners, + sCreditsEntry_SuguruNakatsui, + sCreditsEntry_TetsujiOhta, + sCreditsEntry_HitomiSato, + sCreditsEntry_KenjiMatsushima, + }, + [PAGE_GAME_DESIGNERS_3] = { + sCreditsEntry_GameDesigners, + sCreditsEntry_JunichiMasuda, + sCreditsEntry_KojiNishino, + sCreditsEntry_ShigeruOhmori, + sCreditsEntry_TadashiTakahashi, + }, + [PAGE_SCENARIO_PLOT] = { + sCreditsEntry_ScenarioPlot, + sCreditsEntry_AkihitoTomisawa, + sCreditsEntry_JunichiMasuda, + sCreditsEntry_KojiNishino, + _, + }, + [PAGE_SCENARIO] = { + sCreditsEntry_Scenario, + sCreditsEntry_AkihitoTomisawa, + sCreditsEntry_HitomiSato, + sCreditsEntry_ToshinobuMatsumiya, + _, + }, + [PAGE_SCRIPT_DESIGNERS] = { + sCreditsEntry_ScriptDesigners, + sCreditsEntry_TomomichiOhta, + sCreditsEntry_SatoshiNohara, + _, + _, + }, + [PAGE_MAP_DESIGNERS] = { + sCreditsEntry_MapDesigners, + sCreditsEntry_SuguruNakatsui, + sCreditsEntry_TeruyukiShimoyamada, + sCreditsEntry_ShigeruOhmori, + sCreditsEntry_TetsujiOhta, + }, + [PAGE_BATTLE_FRONTIER_DATA] = { + _, + sCreditsEntry_BattleFrontierData, + sCreditsEntry_TetsujiOhta, + _, + _, + }, + [PAGE_PARAMETRIC_DESIGNERS] = { + sCreditsEntry_ParametricDesigners, + sCreditsEntry_TeruyukiShimoyamada, + sCreditsEntry_ShigekiMorimoto, + sCreditsEntry_TetsujiOhta, + sCreditsEntry_KojiNishino, + }, + [PAGE_POKEDEX_TEXT] = { + _, + sCreditsEntry_PokedexText, + sCreditsEntry_KenjiMatsushima, + _, + _, + }, + [PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_1] = { + sCreditsEntry_EnvAndToolPgrms, + sCreditsEntry_HisashiSogabe, + sCreditsEntry_SosukeTamada, + sCreditsEntry_HiroyukiNakamura, + sCreditsEntry_AkitoMori, + }, + [PAGE_PKMN_DESIGNERS_1] = { + sCreditsEntry_PkmnDesigners, + sCreditsEntry_KenSugimori, + sCreditsEntry_MotofumiFujiwara, + sCreditsEntry_ShigekiMorimoto, + _, + }, + [PAGE_PKMN_DESIGNERS_2] = { + sCreditsEntry_PkmnDesigners, + sCreditsEntry_HironobuYoshida, + sCreditsEntry_SatoshiOhta, + sCreditsEntry_AsukaIwashita, + _, + }, + [PAGE_PKMN_DESIGNERS_3] = { + sCreditsEntry_PkmnDesigners, + sCreditsEntry_TakaoUnno, + sCreditsEntry_KanakoEo, + sCreditsEntry_AimiTomita, + _, + }, + [PAGE_PKMN_DESIGNERS_4] = { + sCreditsEntry_PkmnDesigners, + sCreditsEntry_AtsukoNishida, + sCreditsEntry_MuneoSaito, + sCreditsEntry_RenaYoshikawa, + sCreditsEntry_JunOkutani, + }, + [PAGE_SUPPORT_PROGRAMMERS] = { + _, + sCreditsEntry_SupportProgrammers, + sCreditsEntry_SatoshiMitsuhara, + sCreditsEntry_DaisukeHoshino, + _, + }, + [PAGE_NCL_PRODUCT_TESTING] = { + _, + sCreditsEntry_NCLProductTesting, + sCreditsEntry_NCLSuperMarioClub, + _, + _, + }, + [PAGE_PACKAGE_AND_MANUAL] = { + _, + sCreditsEntry_PackageAndManual, + sCreditsEntry_KenSugimori, + _, + _, + }, + [PAGE_SPECIAL_THANKS_1] = { + _, + sCreditsEntry_SpecialThanks, + sCreditsEntry_KenjiTominaga, + sCreditsEntry_HirokiEnomoto, + _, + }, + [PAGE_SPECIAL_THANKS_2] = { + sCreditsEntry_SpecialThanks, + sCreditsEntry_KazuyaSuyama, + sCreditsEntry_KenjiroIto, + sCreditsEntry_MichikoTakizawa, + sCreditsEntry_MakikoTakada, + }, + [PAGE_SPECIAL_THANKS_3] = { + sCreditsEntry_SpecialThanks, + sCreditsEntry_MikikoOhhashi, + sCreditsEntry_TakanaoKondo, + sCreditsEntry_RuiKawaguchi, + _, + }, + [PAGE_SPECIAL_THANKS_4] = { + sCreditsEntry_SpecialThanks, + sCreditsEntry_TakahiroOhnishi, + sCreditsEntry_NorihideOkamura, + sCreditsEntry_ShunsukeKohori, + _, + }, + [PAGE_INFORMATION_SUPERVISORS] = { + sCreditsEntry_InfoSupervisors, + sCreditsEntry_KazuyukiTerada, + sCreditsEntry_YuriSakurai, + sCreditsEntry_YumiFunasaka, + sCreditsEntry_NaokoYanase, + }, + [PAGE_ARTWORK_1] = { + _, + sCreditsEntry_Artwork, + sCreditsEntry_SachikoNakamichi, + sCreditsEntry_FujikoNomura, + _, + }, + [PAGE_ARTWORK_2] = { + _, + sCreditsEntry_Artwork, + sCreditsEntry_HideyukiNakajima, + sCreditsEntry_HidenoriSaeki, + _, + }, + [PAGE_ARTWORK_3] = { + sCreditsEntry_Artwork, + sCreditsEntry_YokoWatanabe, + sCreditsEntry_SakaeKimura, + sCreditsEntry_ChiakiShinkai, + _, + }, + [PAGE_COORDINATORS] = { + sCreditsEntry_Coordinators, + sCreditsEntry_KazukiYoshihara, + sCreditsEntry_AkiraKinashi, + sCreditsEntry_RetsujiNomoto, + _, + }, + [PAGE_ENGLISH_VERSION] = { + _, + sCreditsEntry_EnglishVersion, + sCreditsEntry_HiroNakamura, + sCreditsEntry_SethMcMahill, + _, + }, + [PAGE_TRANSLATOR] = { + _, + sCreditsEntry_Translator, + sCreditsEntry_NobOgasawara, + _, + _, + }, + [PAGE_TEXT_EDITOR] = { + _, + sCreditsEntry_TextEditor, + sCreditsEntry_TeresaLillygren, + _, + _, + }, + [PAGE_NCL_COORDINATOR] = { + _, + sCreditsEntry_NCLCoordinator, + sCreditsEntry_KimikoNakamichi, + _, + _, + }, + [PAGE_PROGRAMMERS_5] = { + sCreditsEntry_Programmers, + sCreditsEntry_TerukiMurakawa, + sCreditsEntry_SouichiYamamoto, + sCreditsEntry_YuichiroIto, + sCreditsEntry_AkiraKinashi, + }, + [PAGE_GRAPHIC_DESIGNER] = { + _, + sCreditsEntry_GraphicDesigner, + sCreditsEntry_AkiraKinashi, + _, + _, + }, + [PAGE_ENVIRONMENT_AND_TOOL_PROGRAMS_2] = { + sCreditsEntry_EnvAndToolPgrms, + sCreditsEntry_TerukiMurakawa, + sCreditsEntry_SouichiYamamoto, + sCreditsEntry_KimikoNakamichi, + _, + }, + [PAGE_NOA_TESTING] = { + sCreditsEntry_NOAProductTesting, + sCreditsEntry_ThomasHertzog, + sCreditsEntry_ErikJohnson, + sCreditsEntry_MikaKurosawa, + _, + }, + [PAGE_BRAILLE_CODE_CHECK_1] = { + sCreditsEntry_BrailleCodeCheck, + sCreditsEntry_NationalFederationBlind, + sCreditsEntry_PatriciaAMaurer, + sCreditsEntry_JapanBrailleLibrary, + sCreditsEntry_EuropeanBlindUnion, + }, + [PAGE_BRAILLE_CODE_CHECK_2] = { + _, + sCreditsEntry_BrailleCodeCheck, + sCreditsEntry_AustralianBrailleAuthority, + sCreditsEntry_RoyalNewZealandFederationBlind, + _, + }, + [PAGE_SPECIAL_THANKS_5] = { + sCreditsEntry_SpecialThanks, + sCreditsEntry_HiroyukiUesugi, + sCreditsEntry_MotoyasuTojima, + sCreditsEntry_NicolaPrattBarlow, + sCreditsEntry_ShellieDow, + }, + [PAGE_TASK_MANAGERS] = { + _, + sCreditsEntry_TaskManagers, + sCreditsEntry_AzusaTajima, + sCreditsEntry_ShusakuEgami, + _, + }, + [PAGE_PRODUCERS] = { + sCreditsEntry_Producers, + sCreditsEntry_HiroyukiJinnai, + sCreditsEntry_HitoshiYamagami, + sCreditsEntry_GakujiNomoto, + sCreditsEntry_HiroakiTsuru, + }, + [PAGE_EXECUTIVE_DIRECTOR] = { + _, + sCreditsEntry_ExecutiveDirector, + sCreditsEntry_SatoshiTajiri, + _, + _, + }, + [PAGE_EXECUTIVE_PRODUCERS_1] = { + _, + sCreditsEntry_ExecProducers, + sCreditsEntry_SatoruIwata, + _, + _, + }, + [PAGE_EXECUTIVE_PRODUCERS_2] = { + _, + sCreditsEntry_ExecProducers, + sCreditsEntry_TsunekazIshihara, + _, + _, + }, +}; +#undef _ diff --git a/src/data/decoration/header.h b/src/data/decoration/header.h index 55458c7a3..c57498828 100644 --- a/src/data/decoration/header.h +++ b/src/data/decoration/header.h @@ -1,1091 +1,1454 @@ -const struct Decoration gDecorations[] = { - { - DECOR_NONE, - _("SMALL DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_DESK, - 0, - DecorDesc_SMALL_DESK, - DecorGfx_SMALL_DESK - }, { - DECOR_SMALL_DESK, - _("SMALL DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_DESK, - 3000, - DecorDesc_SMALL_DESK, - DecorGfx_SMALL_DESK - }, { - DECOR_POKEMON_DESK, - _("POKéMON DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_DESK, - 3000, - DecorDesc_POKEMON_DESK, - DecorGfx_POKEMON_DESK - }, { - DECOR_HEAVY_DESK, - _("HEAVY DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x2, - DECORCAT_DESK, - 6000, - DecorDesc_HEAVY_DESK, - DecorGfx_HEAVY_DESK - }, { - DECOR_RAGGED_DESK, - _("RAGGED DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x2, - DECORCAT_DESK, - 6000, - DecorDesc_RAGGED_DESK, - DecorGfx_RAGGED_DESK - }, { - DECOR_COMFORT_DESK, - _("COMFORT DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x2, - DECORCAT_DESK, - 6000, - DecorDesc_COMFORT_DESK, - DecorGfx_COMFORT_DESK - }, { - DECOR_PRETTY_DESK, - _("PRETTY DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x3, - DECORCAT_DESK, - 9000, - DecorDesc_PRETTY_DESK, - DecorGfx_PRETTY_DESK - }, { - DECOR_BRICK_DESK, - _("BRICK DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x3, - DECORCAT_DESK, - 9000, - DecorDesc_BRICK_DESK, - DecorGfx_BRICK_DESK - }, { - DECOR_CAMP_DESK, - _("CAMP DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x3, - DECORCAT_DESK, - 9000, - DecorDesc_CAMP_DESK, - DecorGfx_CAMP_DESK - }, { - DECOR_HARD_DESK, - _("HARD DESK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_3x3, - DECORCAT_DESK, - 9000, - DecorDesc_HARD_DESK, - DecorGfx_HARD_DESK - }, { - DECOR_SMALL_CHAIR, - _("SMALL CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_SMALL_CHAIR, - DecorGfx_SMALL_CHAIR - }, { - DECOR_POKEMON_CHAIR, - _("POKéMON CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_POKEMON_CHAIR, - DecorGfx_POKEMON_CHAIR - }, { - DECOR_HEAVY_CHAIR, - _("HEAVY CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_HEAVY_CHAIR, - DecorGfx_HEAVY_CHAIR - }, { - DECOR_PRETTY_CHAIR, - _("PRETTY CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_PRETTY_CHAIR, - DecorGfx_PRETTY_CHAIR - }, { - DECOR_COMFORT_CHAIR, - _("COMFORT CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_COMFORT_CHAIR, - DecorGfx_COMFORT_CHAIR - }, { - DECOR_RAGGED_CHAIR, - _("RAGGED CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_RAGGED_CHAIR, - DecorGfx_RAGGED_CHAIR - }, { - DECOR_BRICK_CHAIR, - _("BRICK CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_BRICK_CHAIR, - DecorGfx_BRICK_CHAIR - }, { - DECOR_CAMP_CHAIR, - _("CAMP CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_CAMP_CHAIR, - DecorGfx_CAMP_CHAIR - }, { - DECOR_HARD_CHAIR, - _("HARD CHAIR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_CHAIR, - 2000, - DecorDesc_HARD_CHAIR, - DecorGfx_HARD_CHAIR - }, { - DECOR_RED_PLANT, - _("RED PLANT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_PLANT, - 3000, - DecorDesc_RED_PLANT, - DecorGfx_RED_PLANT - }, { - DECOR_TROPICAL_PLANT, - _("TROPICAL PLANT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_PLANT, - 3000, - DecorDesc_TROPICAL_PLANT, - DecorGfx_TROPICAL_PLANT - }, { - DECOR_PRETTY_FLOWERS, - _("PRETTY FLOWERS"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_PLANT, - 3000, - DecorDesc_PRETTY_FLOWERS, - DecorGfx_PRETTY_FLOWERS - }, { - DECOR_COLORFUL_PLANT, - _("COLORFUL PLANT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_2x2, - DECORCAT_PLANT, - 5000, - DecorDesc_COLORFUL_PLANT, - DecorGfx_COLORFUL_PLANT - }, { - DECOR_BIG_PLANT, - _("BIG PLANT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_2x2, - DECORCAT_PLANT, - 5000, - DecorDesc_BIG_PLANT, - DecorGfx_BIG_PLANT - }, { - DECOR_GORGEOUS_PLANT, - _("GORGEOUS PLANT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_2x2, - DECORCAT_PLANT, - 5000, - DecorDesc_GORGEOUS_PLANT, - DecorGfx_GORGEOUS_PLANT - }, { - DECOR_RED_BRICK, - _("RED BRICK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 500, - DecorDesc_RED_BRICK, - DecorGfx_RED_BRICK - }, { - DECOR_YELLOW_BRICK, - _("YELLOW BRICK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 500, - DecorDesc_YELLOW_BRICK, - DecorGfx_YELLOW_BRICK - }, { - DECOR_BLUE_BRICK, - _("BLUE BRICK"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 500, - DecorDesc_BLUE_BRICK, - DecorGfx_BLUE_BRICK - }, { - DECOR_RED_BALLOON, - _("RED BALLOON"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 500, - DecorDesc_RED_BALLOON, - DecorGfx_RED_BALLOON - }, { - DECOR_BLUE_BALLOON, - _("BLUE BALLOON"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 500, - DecorDesc_BLUE_BALLOON, - DecorGfx_BLUE_BALLOON - }, { - DECOR_YELLOW_BALLOON, - _("YELLOW BALLOON"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 500, - DecorDesc_YELLOW_BALLOON, - DecorGfx_YELLOW_BALLOON - }, { - DECOR_RED_TENT, - _("RED TENT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_ORNAMENT, - 10000, - DecorDesc_RED_TENT, - DecorGfx_RED_TENT - }, { - DECOR_BLUE_TENT, - _("BLUE TENT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_ORNAMENT, - 10000, - DecorDesc_BLUE_TENT, - DecorGfx_BLUE_TENT - }, { - DECOR_SOLID_BOARD, - _("SOLID BOARD"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 3000, - DecorDesc_SOLID_BOARD, - DecorGfx_SOLID_BOARD - }, { - DECOR_SLIDE, - _("SLIDE"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_2x4, - DECORCAT_ORNAMENT, - 8000, - DecorDesc_SLIDE, - DecorGfx_SLIDE - }, { - DECOR_FENCE_LENGTH, - _("FENCE LENGTH"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 500, - DecorDesc_FENCE_LENGTH, - DecorGfx_FENCE_LENGTH - }, { - DECOR_FENCE_WIDTH, - _("FENCE WIDTH"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 500, - DecorDesc_FENCE_WIDTH, - DecorGfx_FENCE_WIDTH - }, { - DECOR_TIRE, - _("TIRE"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_2x2, - DECORCAT_ORNAMENT, - 800, - DecorDesc_TIRE, - DecorGfx_TIRE - }, { - DECOR_STAND, - _("STAND"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_4x2, - DECORCAT_ORNAMENT, - 7000, - DecorDesc_STAND, - DecorGfx_STAND - }, { - DECOR_MUD_BALL, - _("MUD BALL"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 200, - DecorDesc_MUD_BALL, - DecorGfx_MUD_BALL - }, { - DECOR_BREAKABLE_DOOR, - _("BREAKABLE DOOR"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 3000, - DecorDesc_BREAKABLE_DOOR, - DecorGfx_BREAKABLE_DOOR - }, { - DECOR_SAND_ORNAMENT, - _("SAND ORNAMENT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 3000, - DecorDesc_SAND_ORNAMENT, - DecorGfx_SAND_ORNAMENT - }, { - DECOR_SILVER_SHIELD, - _("SILVER SHIELD"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 0, - DecorDesc_SILVER_SHIELD, - DecorGfx_SILVER_SHIELD - }, { - DECOR_GOLD_SHIELD, - _("GOLD SHIELD"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 0, - DecorDesc_GOLD_SHIELD, - DecorGfx_GOLD_SHIELD - }, { - DECOR_GLASS_ORNAMENT, - _("GLASS ORNAMENT"), - DECORPERM_BEHIND_FLOOR, - DECORSHAPE_1x2, - DECORCAT_ORNAMENT, - 0, - DecorDesc_GLASS_ORNAMENT, - DecorGfx_GLASS_ORNAMENT - }, { - DECOR_TV, - _("TV"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 3000, - DecorDesc_TV, - DecorGfx_TV - }, { - DECOR_ROUND_TV, - _("ROUND TV"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 4000, - DecorDesc_ROUND_TV, - DecorGfx_ROUND_TV - }, { - DECOR_CUTE_TV, - _("CUTE TV"), - DECORPERM_SOLID_FLOOR, - DECORSHAPE_1x1, - DECORCAT_ORNAMENT, - 4000, - DecorDesc_CUTE_TV, - DecorGfx_CUTE_TV - }, { - DECOR_GLITTER_MAT, - _("GLITTER MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 2000, - DecorDesc_GLITTER_MAT, - DecorGfx_GLITTER_MAT - }, { - DECOR_JUMP_MAT, - _("JUMP MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 2000, - DecorDesc_JUMP_MAT, - DecorGfx_JUMP_MAT - }, { - DECOR_SPIN_MAT, - _("SPIN MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 2000, - DecorDesc_SPIN_MAT, - DecorGfx_SPIN_MAT - }, { - DECOR_C_LOW_NOTE_MAT, - _("C Low NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_C_LOW_NOTE_MAT, - DecorGfx_C_LOW_NOTE_MAT - }, { - DECOR_D_NOTE_MAT, - _("D NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_D_NOTE_MAT, - DecorGfx_D_NOTE_MAT - }, { - DECOR_E_NOTE_MAT, - _("E NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_E_NOTE_MAT, - DecorGfx_E_NOTE_MAT - }, { - DECOR_F_NOTE_MAT, - _("F NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_F_NOTE_MAT, - DecorGfx_F_NOTE_MAT - }, { - DECOR_G_NOTE_MAT, - _("G NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_G_NOTE_MAT, - DecorGfx_G_NOTE_MAT - }, { - DECOR_A_NOTE_MAT, - _("A NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_A_NOTE_MAT, - DecorGfx_A_NOTE_MAT - }, { - DECOR_B_NOTE_MAT, - _("B NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_B_NOTE_MAT, - DecorGfx_B_NOTE_MAT - }, { - DECOR_C_HIGH_NOTE_MAT, - _("C High NOTE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_1x1, - DECORCAT_MAT, - 500, - DecorDesc_C_HIGH_NOTE_MAT, - DecorGfx_C_HIGH_NOTE_MAT - }, { - DECOR_SURF_MAT, - _("SURF MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_SURF_MAT, - DecorGfx_SURF_MAT - }, { - DECOR_THUNDER_MAT, - _("THUNDER MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_THUNDER_MAT, - DecorGfx_THUNDER_MAT - }, { - DECOR_FIRE_BLAST_MAT, - _("FIRE BLAST MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_FIRE_BLAST_MAT, - DecorGfx_FIRE_BLAST_MAT - }, { - DECOR_POWDER_SNOW_MAT, - _("POWDER SNOW MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_POWDER_SNOW_MAT, - DecorGfx_POWDER_SNOW_MAT - }, { - DECOR_ATTRACT_MAT, - _("ATTRACT MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_ATTRACT_MAT, - DecorGfx_ATTRACT_MAT - }, { - DECOR_FISSURE_MAT, - _("FISSURE MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_FISSURE_MAT, - DecorGfx_FISSURE_MAT - }, { - DECOR_SPIKES_MAT, - _("SPIKES MAT"), - DECORPERM_PASS_FLOOR, - DECORSHAPE_3x3, - DECORCAT_MAT, - 4000, - DecorDesc_SPIKES_MAT, - DecorGfx_SPIKES_MAT - }, { - DECOR_BALL_POSTER, - _("BALL POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_1x1, - DECORCAT_POSTER, - 1000, - DecorDesc_BALL_POSTER, - DecorGfx_BALL_POSTER - }, { - DECOR_GREEN_POSTER, - _("GREEN POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_1x1, - DECORCAT_POSTER, - 1000, - DecorDesc_GREEN_POSTER, - DecorGfx_GREEN_POSTER - }, { - DECOR_RED_POSTER, - _("RED POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_1x1, - DECORCAT_POSTER, - 1000, - DecorDesc_RED_POSTER, - DecorGfx_RED_POSTER - }, { - DECOR_BLUE_POSTER, - _("BLUE POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_1x1, - DECORCAT_POSTER, - 1000, - DecorDesc_BLUE_POSTER, - DecorGfx_BLUE_POSTER - }, { - DECOR_CUTE_POSTER, - _("CUTE POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_1x1, - DECORCAT_POSTER, - 1000, - DecorDesc_CUTE_POSTER, - DecorGfx_CUTE_POSTER - }, { - DECOR_PIKA_POSTER, - _("PIKA POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_2x1, - DECORCAT_POSTER, - 1500, - DecorDesc_PIKA_POSTER, - DecorGfx_PIKA_POSTER - }, { - DECOR_LONG_POSTER, - _("LONG POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_2x1, - DECORCAT_POSTER, - 1500, - DecorDesc_LONG_POSTER, - DecorGfx_LONG_POSTER - }, { - DECOR_SEA_POSTER, - _("SEA POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_2x1, - DECORCAT_POSTER, - 1500, - DecorDesc_SEA_POSTER, - DecorGfx_SEA_POSTER - }, { - DECOR_SKY_POSTER, - _("SKY POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_2x1, - DECORCAT_POSTER, - 1500, - DecorDesc_SKY_POSTER, - DecorGfx_SKY_POSTER - }, { - DECOR_KISS_POSTER, - _("KISS POSTER"), - DECORPERM_NA_WALL, - DECORSHAPE_2x1, - DECORCAT_POSTER, - 1500, - DecorDesc_KISS_POSTER, - DecorGfx_KISS_POSTER - }, { - DECOR_PICHU_DOLL, - _("PICHU DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_PICHU_DOLL, - DecorGfx_PICHU_DOLL - }, { - DECOR_PIKACHU_DOLL, - _("PIKACHU DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_PIKACHU_DOLL, - DecorGfx_PIKACHU_DOLL - }, { - DECOR_MARILL_DOLL, - _("MARILL DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_MARILL_DOLL, - DecorGfx_MARILL_DOLL - }, { - DECOR_TOGEPI_DOLL, - _("TOGEPI DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_TOGEPI_DOLL, - DecorGfx_TOGEPI_DOLL - }, { - DECOR_CYNDAQUIL_DOLL, - _("CYNDAQUIL DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_CYNDAQUIL_DOLL, - DecorGfx_CYNDAQUIL_DOLL - }, { - DECOR_CHIKORITA_DOLL, - _("CHIKORITA DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_CHIKORITA_DOLL, - DecorGfx_CHIKORITA_DOLL - }, { - DECOR_TOTODILE_DOLL, - _("TOTODILE DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_TOTODILE_DOLL, - DecorGfx_TOTODILE_DOLL - }, { - DECOR_JIGGLYPUFF_DOLL, - _("JIGGLYPUFF DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_JIGGLYPUFF_DOLL, - DecorGfx_JIGGLYPUFF_DOLL - }, { - DECOR_MEOWTH_DOLL, - _("MEOWTH DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_MEOWTH_DOLL, - DecorGfx_MEOWTH_DOLL - }, { - DECOR_CLEFAIRY_DOLL, - _("CLEFAIRY DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_CLEFAIRY_DOLL, - DecorGfx_CLEFAIRY_DOLL - }, { - DECOR_DITTO_DOLL, - _("DITTO DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_DITTO_DOLL, - DecorGfx_DITTO_DOLL - }, { - DECOR_SMOOCHUM_DOLL, - _("SMOOCHUM DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_SMOOCHUM_DOLL, - DecorGfx_SMOOCHUM_DOLL - }, { - DECOR_TREECKO_DOLL, - _("TREECKO DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_TREECKO_DOLL, - DecorGfx_TREECKO_DOLL - }, { - DECOR_TORCHIC_DOLL, - _("TORCHIC DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_TORCHIC_DOLL, - DecorGfx_TORCHIC_DOLL - }, { - DECOR_MUDKIP_DOLL, - _("MUDKIP DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_MUDKIP_DOLL, - DecorGfx_MUDKIP_DOLL - }, { - DECOR_DUSKULL_DOLL, - _("DUSKULL DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_DUSKULL_DOLL, - DecorGfx_DUSKULL_DOLL - }, { - DECOR_WYNAUT_DOLL, - _("WYNAUT DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_WYNAUT_DOLL, - DecorGfx_WYNAUT_DOLL - }, { - DECOR_BALTOY_DOLL, - _("BALTOY DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_BALTOY_DOLL, - DecorGfx_BALTOY_DOLL - }, { - DECOR_KECLEON_DOLL, - _("KECLEON DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_KECLEON_DOLL, - DecorGfx_KECLEON_DOLL - }, { - DECOR_AZURILL_DOLL, - _("AZURILL DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_AZURILL_DOLL, - DecorGfx_AZURILL_DOLL - }, { - DECOR_SKITTY_DOLL, - _("SKITTY DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_SKITTY_DOLL, - DecorGfx_SKITTY_DOLL - }, { - DECOR_SWABLU_DOLL, - _("SWABLU DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_SWABLU_DOLL, - DecorGfx_SWABLU_DOLL - }, { - DECOR_GULPIN_DOLL, - _("GULPIN DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_GULPIN_DOLL, - DecorGfx_GULPIN_DOLL - }, { - DECOR_LOTAD_DOLL, - _("LOTAD DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_LOTAD_DOLL, - DecorGfx_LOTAD_DOLL - }, { - DECOR_SEEDOT_DOLL, - _("SEEDOT DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_DOLL, - 3000, - DecorDesc_SEEDOT_DOLL, - DecorGfx_SEEDOT_DOLL - }, { - DECOR_PIKA_CUSHION, - _("PIKA CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_PIKA_CUSHION, - DecorGfx_PIKA_CUSHION - }, { - DECOR_ROUND_CUSHION, - _("ROUND CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_ROUND_CUSHION, - DecorGfx_ROUND_CUSHION - }, { - DECOR_KISS_CUSHION, - _("KISS CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_KISS_CUSHION, - DecorGfx_KISS_CUSHION - }, { - DECOR_ZIGZAG_CUSHION, - _("ZIGZAG CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_ZIGZAG_CUSHION, - DecorGfx_ZIGZAG_CUSHION - }, { - DECOR_SPIN_CUSHION, - _("SPIN CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_SPIN_CUSHION, - DecorGfx_SPIN_CUSHION - }, { - DECOR_DIAMOND_CUSHION, - _("DIAMOND CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_DIAMOND_CUSHION, - DecorGfx_DIAMOND_CUSHION - }, { - DECOR_BALL_CUSHION, - _("BALL CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_BALL_CUSHION, - DecorGfx_BALL_CUSHION - }, { - DECOR_GRASS_CUSHION, - _("GRASS CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_GRASS_CUSHION, - DecorGfx_GRASS_CUSHION - }, { - DECOR_FIRE_CUSHION, - _("FIRE CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_FIRE_CUSHION, - DecorGfx_FIRE_CUSHION - }, { - DECOR_WATER_CUSHION, - _("WATER CUSHION"), - DECORPERM_SPRITE, - DECORSHAPE_1x1, - DECORCAT_CUSHION, - 2000, - DecorDesc_WATER_CUSHION, - DecorGfx_WATER_CUSHION - }, { - DECOR_SNORLAX_DOLL, - _("SNORLAX DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_SNORLAX_DOLL, - DecorGfx_SNORLAX_DOLL - }, { - DECOR_RHYDON_DOLL, - _("RHYDON DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_RHYDON_DOLL, - DecorGfx_RHYDON_DOLL - }, { - DECOR_LAPRAS_DOLL, - _("LAPRAS DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_LAPRAS_DOLL, - DecorGfx_LAPRAS_DOLL - }, { - DECOR_VENUSAUR_DOLL, - _("VENUSAUR DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_VENUSAUR_DOLL, - DecorGfx_VENUSAUR_DOLL - }, { - DECOR_CHARIZARD_DOLL, - _("CHARIZARD DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_CHARIZARD_DOLL, - DecorGfx_CHARIZARD_DOLL - }, { - DECOR_BLASTOISE_DOLL, - _("BLASTOISE DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_BLASTOISE_DOLL, - DecorGfx_BLASTOISE_DOLL - }, { - DECOR_WAILMER_DOLL, - _("WAILMER DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_WAILMER_DOLL, - DecorGfx_WAILMER_DOLL - }, { - DECOR_REGIROCK_DOLL, - _("REGIROCK DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_REGIROCK_DOLL, - DecorGfx_REGIROCK_DOLL - }, { - DECOR_REGICE_DOLL, - _("REGICE DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_REGICE_DOLL, - DecorGfx_REGICE_DOLL - }, { - DECOR_REGISTEEL_DOLL, - _("REGISTEEL DOLL"), - DECORPERM_SPRITE, - DECORSHAPE_1x2, - DECORCAT_DOLL, - 10000, - DecorDesc_REGISTEEL_DOLL, - DecorGfx_REGISTEEL_DOLL} +const struct Decoration gDecorations[] = +{ + [DECOR_NONE] = + { + .id = DECOR_NONE, + .name = _("SMALL DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DESK, + .price = 0, + .description = DecorDesc_SMALL_DESK, + .tiles = DecorGfx_SMALL_DESK, + }, + + [DECOR_SMALL_DESK] = + { + .id = DECOR_SMALL_DESK, + .name = _("SMALL DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DESK, + .price = 3000, + .description = DecorDesc_SMALL_DESK, + .tiles = DecorGfx_SMALL_DESK, + }, + + [DECOR_POKEMON_DESK] = + { + .id = DECOR_POKEMON_DESK, + .name = _("POKéMON DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DESK, + .price = 3000, + .description = DecorDesc_POKEMON_DESK, + .tiles = DecorGfx_POKEMON_DESK, + }, + + [DECOR_HEAVY_DESK] = + { + .id = DECOR_HEAVY_DESK, + .name = _("HEAVY DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x2, + .category = DECORCAT_DESK, + .price = 6000, + .description = DecorDesc_HEAVY_DESK, + .tiles = DecorGfx_HEAVY_DESK, + }, + + [DECOR_RAGGED_DESK] = + { + .id = DECOR_RAGGED_DESK, + .name = _("RAGGED DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x2, + .category = DECORCAT_DESK, + .price = 6000, + .description = DecorDesc_RAGGED_DESK, + .tiles = DecorGfx_RAGGED_DESK, + }, + + [DECOR_COMFORT_DESK] = + { + .id = DECOR_COMFORT_DESK, + .name = _("COMFORT DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x2, + .category = DECORCAT_DESK, + .price = 6000, + .description = DecorDesc_COMFORT_DESK, + .tiles = DecorGfx_COMFORT_DESK, + }, + + [DECOR_PRETTY_DESK] = + { + .id = DECOR_PRETTY_DESK, + .name = _("PRETTY DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_PRETTY_DESK, + .tiles = DecorGfx_PRETTY_DESK, + }, + + [DECOR_BRICK_DESK] = + { + .id = DECOR_BRICK_DESK, + .name = _("BRICK DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_BRICK_DESK, + .tiles = DecorGfx_BRICK_DESK, + }, + + [DECOR_CAMP_DESK] = + { + .id = DECOR_CAMP_DESK, + .name = _("CAMP DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_CAMP_DESK, + .tiles = DecorGfx_CAMP_DESK, + }, + + [DECOR_HARD_DESK] = + { + .id = DECOR_HARD_DESK, + .name = _("HARD DESK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_HARD_DESK, + .tiles = DecorGfx_HARD_DESK, + }, + + [DECOR_SMALL_CHAIR] = + { + .id = DECOR_SMALL_CHAIR, + .name = _("SMALL CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_SMALL_CHAIR, + .tiles = DecorGfx_SMALL_CHAIR, + }, + + [DECOR_POKEMON_CHAIR] = + { + .id = DECOR_POKEMON_CHAIR, + .name = _("POKéMON CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_POKEMON_CHAIR, + .tiles = DecorGfx_POKEMON_CHAIR, + }, + + [DECOR_HEAVY_CHAIR] = + { + .id = DECOR_HEAVY_CHAIR, + .name = _("HEAVY CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_HEAVY_CHAIR, + .tiles = DecorGfx_HEAVY_CHAIR, + }, + + [DECOR_PRETTY_CHAIR] = + { + .id = DECOR_PRETTY_CHAIR, + .name = _("PRETTY CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_PRETTY_CHAIR, + .tiles = DecorGfx_PRETTY_CHAIR, + }, + + [DECOR_COMFORT_CHAIR] = + { + .id = DECOR_COMFORT_CHAIR, + .name = _("COMFORT CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_COMFORT_CHAIR, + .tiles = DecorGfx_COMFORT_CHAIR, + }, + + [DECOR_RAGGED_CHAIR] = + { + .id = DECOR_RAGGED_CHAIR, + .name = _("RAGGED CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_RAGGED_CHAIR, + .tiles = DecorGfx_RAGGED_CHAIR, + }, + + [DECOR_BRICK_CHAIR] = + { + .id = DECOR_BRICK_CHAIR, + .name = _("BRICK CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_BRICK_CHAIR, + .tiles = DecorGfx_BRICK_CHAIR, + }, + + [DECOR_CAMP_CHAIR] = + { + .id = DECOR_CAMP_CHAIR, + .name = _("CAMP CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_CAMP_CHAIR, + .tiles = DecorGfx_CAMP_CHAIR, + }, + + [DECOR_HARD_CHAIR] = + { + .id = DECOR_HARD_CHAIR, + .name = _("HARD CHAIR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_HARD_CHAIR, + .tiles = DecorGfx_HARD_CHAIR, + }, + + [DECOR_RED_PLANT] = + { + .id = DECOR_RED_PLANT, + .name = _("RED PLANT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_PLANT, + .price = 3000, + .description = DecorDesc_RED_PLANT, + .tiles = DecorGfx_RED_PLANT, + }, + + [DECOR_TROPICAL_PLANT] = + { + .id = DECOR_TROPICAL_PLANT, + .name = _("TROPICAL PLANT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_PLANT, + .price = 3000, + .description = DecorDesc_TROPICAL_PLANT, + .tiles = DecorGfx_TROPICAL_PLANT, + }, + + [DECOR_PRETTY_FLOWERS] = + { + .id = DECOR_PRETTY_FLOWERS, + .name = _("PRETTY FLOWERS"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_PLANT, + .price = 3000, + .description = DecorDesc_PRETTY_FLOWERS, + .tiles = DecorGfx_PRETTY_FLOWERS, + }, + + [DECOR_COLORFUL_PLANT] = + { + .id = DECOR_COLORFUL_PLANT, + .name = _("COLORFUL PLANT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_PLANT, + .price = 5000, + .description = DecorDesc_COLORFUL_PLANT, + .tiles = DecorGfx_COLORFUL_PLANT, + }, + + [DECOR_BIG_PLANT] = + { + .id = DECOR_BIG_PLANT, + .name = _("BIG PLANT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_PLANT, + .price = 5000, + .description = DecorDesc_BIG_PLANT, + .tiles = DecorGfx_BIG_PLANT, + }, + + [DECOR_GORGEOUS_PLANT] = + { + .id = DECOR_GORGEOUS_PLANT, + .name = _("GORGEOUS PLANT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_PLANT, + .price = 5000, + .description = DecorDesc_GORGEOUS_PLANT, + .tiles = DecorGfx_GORGEOUS_PLANT, + }, + + [DECOR_RED_BRICK] = + { + .id = DECOR_RED_BRICK, + .name = _("RED BRICK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_RED_BRICK, + .tiles = DecorGfx_RED_BRICK, + }, + + [DECOR_YELLOW_BRICK] = + { + .id = DECOR_YELLOW_BRICK, + .name = _("YELLOW BRICK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_YELLOW_BRICK, + .tiles = DecorGfx_YELLOW_BRICK, + }, + + [DECOR_BLUE_BRICK] = + { + .id = DECOR_BLUE_BRICK, + .name = _("BLUE BRICK"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_BLUE_BRICK, + .tiles = DecorGfx_BLUE_BRICK, + }, + + [DECOR_RED_BALLOON] = + { + .id = DECOR_RED_BALLOON, + .name = _("RED BALLOON"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_RED_BALLOON, + .tiles = DecorGfx_RED_BALLOON, + }, + + [DECOR_BLUE_BALLOON] = + { + .id = DECOR_BLUE_BALLOON, + .name = _("BLUE BALLOON"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_BLUE_BALLOON, + .tiles = DecorGfx_BLUE_BALLOON, + }, + + [DECOR_YELLOW_BALLOON] = + { + .id = DECOR_YELLOW_BALLOON, + .name = _("YELLOW BALLOON"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_YELLOW_BALLOON, + .tiles = DecorGfx_YELLOW_BALLOON, + }, + + [DECOR_RED_TENT] = + { + .id = DECOR_RED_TENT, + .name = _("RED TENT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_ORNAMENT, + .price = 10000, + .description = DecorDesc_RED_TENT, + .tiles = DecorGfx_RED_TENT, + }, + + [DECOR_BLUE_TENT] = + { + .id = DECOR_BLUE_TENT, + .name = _("BLUE TENT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_ORNAMENT, + .price = 10000, + .description = DecorDesc_BLUE_TENT, + .tiles = DecorGfx_BLUE_TENT, + }, + + [DECOR_SOLID_BOARD] = + { + .id = DECOR_SOLID_BOARD, + .name = _("SOLID BOARD"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_SOLID_BOARD, + .tiles = DecorGfx_SOLID_BOARD, + }, + + [DECOR_SLIDE] = + { + .id = DECOR_SLIDE, + .name = _("SLIDE"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_2x4, + .category = DECORCAT_ORNAMENT, + .price = 8000, + .description = DecorDesc_SLIDE, + .tiles = DecorGfx_SLIDE, + }, + + [DECOR_FENCE_LENGTH] = + { + .id = DECOR_FENCE_LENGTH, + .name = _("FENCE LENGTH"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_FENCE_LENGTH, + .tiles = DecorGfx_FENCE_LENGTH, + }, + + [DECOR_FENCE_WIDTH] = + { + .id = DECOR_FENCE_WIDTH, + .name = _("FENCE WIDTH"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_FENCE_WIDTH, + .tiles = DecorGfx_FENCE_WIDTH, + }, + + [DECOR_TIRE] = + { + .id = DECOR_TIRE, + .name = _("TIRE"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_ORNAMENT, + .price = 800, + .description = DecorDesc_TIRE, + .tiles = DecorGfx_TIRE, + }, + + [DECOR_STAND] = + { + .id = DECOR_STAND, + .name = _("STAND"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_4x2, + .category = DECORCAT_ORNAMENT, + .price = 7000, + .description = DecorDesc_STAND, + .tiles = DecorGfx_STAND, + }, + + [DECOR_MUD_BALL] = + { + .id = DECOR_MUD_BALL, + .name = _("MUD BALL"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 200, + .description = DecorDesc_MUD_BALL, + .tiles = DecorGfx_MUD_BALL, + }, + + [DECOR_BREAKABLE_DOOR] = + { + .id = DECOR_BREAKABLE_DOOR, + .name = _("BREAKABLE DOOR"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_BREAKABLE_DOOR, + .tiles = DecorGfx_BREAKABLE_DOOR, + }, + + [DECOR_SAND_ORNAMENT] = + { + .id = DECOR_SAND_ORNAMENT, + .name = _("SAND ORNAMENT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_SAND_ORNAMENT, + .tiles = DecorGfx_SAND_ORNAMENT, + }, + + [DECOR_SILVER_SHIELD] = + { + .id = DECOR_SILVER_SHIELD, + .name = _("SILVER SHIELD"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 0, + .description = DecorDesc_SILVER_SHIELD, + .tiles = DecorGfx_SILVER_SHIELD, + }, + + [DECOR_GOLD_SHIELD] = + { + .id = DECOR_GOLD_SHIELD, + .name = _("GOLD SHIELD"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 0, + .description = DecorDesc_GOLD_SHIELD, + .tiles = DecorGfx_GOLD_SHIELD, + }, + + [DECOR_GLASS_ORNAMENT] = + { + .id = DECOR_GLASS_ORNAMENT, + .name = _("GLASS ORNAMENT"), + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 0, + .description = DecorDesc_GLASS_ORNAMENT, + .tiles = DecorGfx_GLASS_ORNAMENT, + }, + + [DECOR_TV] = + { + .id = DECOR_TV, + .name = _("TV"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_TV, + .tiles = DecorGfx_TV, + }, + + [DECOR_ROUND_TV] = + { + .id = DECOR_ROUND_TV, + .name = _("ROUND TV"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 4000, + .description = DecorDesc_ROUND_TV, + .tiles = DecorGfx_ROUND_TV, + }, + + [DECOR_CUTE_TV] = + { + .id = DECOR_CUTE_TV, + .name = _("CUTE TV"), + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 4000, + .description = DecorDesc_CUTE_TV, + .tiles = DecorGfx_CUTE_TV, + }, + + [DECOR_GLITTER_MAT] = + { + .id = DECOR_GLITTER_MAT, + .name = _("GLITTER MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 2000, + .description = DecorDesc_GLITTER_MAT, + .tiles = DecorGfx_GLITTER_MAT, + }, + + [DECOR_JUMP_MAT] = + { + .id = DECOR_JUMP_MAT, + .name = _("JUMP MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 2000, + .description = DecorDesc_JUMP_MAT, + .tiles = DecorGfx_JUMP_MAT, + }, + + [DECOR_SPIN_MAT] = + { + .id = DECOR_SPIN_MAT, + .name = _("SPIN MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 2000, + .description = DecorDesc_SPIN_MAT, + .tiles = DecorGfx_SPIN_MAT, + }, + + [DECOR_C_LOW_NOTE_MAT] = + { + .id = DECOR_C_LOW_NOTE_MAT, + .name = _("C Low NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_C_LOW_NOTE_MAT, + .tiles = DecorGfx_C_LOW_NOTE_MAT, + }, + + [DECOR_D_NOTE_MAT] = + { + .id = DECOR_D_NOTE_MAT, + .name = _("D NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_D_NOTE_MAT, + .tiles = DecorGfx_D_NOTE_MAT, + }, + + [DECOR_E_NOTE_MAT] = + { + .id = DECOR_E_NOTE_MAT, + .name = _("E NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_E_NOTE_MAT, + .tiles = DecorGfx_E_NOTE_MAT, + }, + + [DECOR_F_NOTE_MAT] = + { + .id = DECOR_F_NOTE_MAT, + .name = _("F NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_F_NOTE_MAT, + .tiles = DecorGfx_F_NOTE_MAT, + }, + + [DECOR_G_NOTE_MAT] = + { + .id = DECOR_G_NOTE_MAT, + .name = _("G NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_G_NOTE_MAT, + .tiles = DecorGfx_G_NOTE_MAT, + }, + + [DECOR_A_NOTE_MAT] = + { + .id = DECOR_A_NOTE_MAT, + .name = _("A NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_A_NOTE_MAT, + .tiles = DecorGfx_A_NOTE_MAT, + }, + + [DECOR_B_NOTE_MAT] = + { + .id = DECOR_B_NOTE_MAT, + .name = _("B NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_B_NOTE_MAT, + .tiles = DecorGfx_B_NOTE_MAT, + }, + + [DECOR_C_HIGH_NOTE_MAT] = + { + .id = DECOR_C_HIGH_NOTE_MAT, + .name = _("C High NOTE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_C_HIGH_NOTE_MAT, + .tiles = DecorGfx_C_HIGH_NOTE_MAT, + }, + + [DECOR_SURF_MAT] = + { + .id = DECOR_SURF_MAT, + .name = _("SURF MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_SURF_MAT, + .tiles = DecorGfx_SURF_MAT, + }, + + [DECOR_THUNDER_MAT] = + { + .id = DECOR_THUNDER_MAT, + .name = _("THUNDER MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_THUNDER_MAT, + .tiles = DecorGfx_THUNDER_MAT, + }, + + [DECOR_FIRE_BLAST_MAT] = + { + .id = DECOR_FIRE_BLAST_MAT, + .name = _("FIRE BLAST MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_FIRE_BLAST_MAT, + .tiles = DecorGfx_FIRE_BLAST_MAT, + }, + + [DECOR_POWDER_SNOW_MAT] = + { + .id = DECOR_POWDER_SNOW_MAT, + .name = _("POWDER SNOW MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_POWDER_SNOW_MAT, + .tiles = DecorGfx_POWDER_SNOW_MAT, + }, + + [DECOR_ATTRACT_MAT] = + { + .id = DECOR_ATTRACT_MAT, + .name = _("ATTRACT MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_ATTRACT_MAT, + .tiles = DecorGfx_ATTRACT_MAT, + }, + + [DECOR_FISSURE_MAT] = + { + .id = DECOR_FISSURE_MAT, + .name = _("FISSURE MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_FISSURE_MAT, + .tiles = DecorGfx_FISSURE_MAT, + }, + + [DECOR_SPIKES_MAT] = + { + .id = DECOR_SPIKES_MAT, + .name = _("SPIKES MAT"), + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_SPIKES_MAT, + .tiles = DecorGfx_SPIKES_MAT, + }, + + [DECOR_BALL_POSTER] = + { + .id = DECOR_BALL_POSTER, + .name = _("BALL POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_BALL_POSTER, + .tiles = DecorGfx_BALL_POSTER, + }, + + [DECOR_GREEN_POSTER] = + { + .id = DECOR_GREEN_POSTER, + .name = _("GREEN POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_GREEN_POSTER, + .tiles = DecorGfx_GREEN_POSTER, + }, + + [DECOR_RED_POSTER] = + { + .id = DECOR_RED_POSTER, + .name = _("RED POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_RED_POSTER, + .tiles = DecorGfx_RED_POSTER, + }, + + [DECOR_BLUE_POSTER] = + { + .id = DECOR_BLUE_POSTER, + .name = _("BLUE POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_BLUE_POSTER, + .tiles = DecorGfx_BLUE_POSTER, + }, + + [DECOR_CUTE_POSTER] = + { + .id = DECOR_CUTE_POSTER, + .name = _("CUTE POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_CUTE_POSTER, + .tiles = DecorGfx_CUTE_POSTER, + }, + + [DECOR_PIKA_POSTER] = + { + .id = DECOR_PIKA_POSTER, + .name = _("PIKA POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_PIKA_POSTER, + .tiles = DecorGfx_PIKA_POSTER, + }, + + [DECOR_LONG_POSTER] = + { + .id = DECOR_LONG_POSTER, + .name = _("LONG POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_LONG_POSTER, + .tiles = DecorGfx_LONG_POSTER, + }, + + [DECOR_SEA_POSTER] = + { + .id = DECOR_SEA_POSTER, + .name = _("SEA POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_SEA_POSTER, + .tiles = DecorGfx_SEA_POSTER, + }, + + [DECOR_SKY_POSTER] = + { + .id = DECOR_SKY_POSTER, + .name = _("SKY POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_SKY_POSTER, + .tiles = DecorGfx_SKY_POSTER, + }, + + [DECOR_KISS_POSTER] = + { + .id = DECOR_KISS_POSTER, + .name = _("KISS POSTER"), + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_KISS_POSTER, + .tiles = DecorGfx_KISS_POSTER, + }, + + [DECOR_PICHU_DOLL] = + { + .id = DECOR_PICHU_DOLL, + .name = _("PICHU DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_PICHU_DOLL, + .tiles = DecorGfx_PICHU_DOLL, + }, + + [DECOR_PIKACHU_DOLL] = + { + .id = DECOR_PIKACHU_DOLL, + .name = _("PIKACHU DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_PIKACHU_DOLL, + .tiles = DecorGfx_PIKACHU_DOLL, + }, + + [DECOR_MARILL_DOLL] = + { + .id = DECOR_MARILL_DOLL, + .name = _("MARILL DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_MARILL_DOLL, + .tiles = DecorGfx_MARILL_DOLL, + }, + + [DECOR_TOGEPI_DOLL] = + { + .id = DECOR_TOGEPI_DOLL, + .name = _("TOGEPI DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TOGEPI_DOLL, + .tiles = DecorGfx_TOGEPI_DOLL, + }, + + [DECOR_CYNDAQUIL_DOLL] = + { + .id = DECOR_CYNDAQUIL_DOLL, + .name = _("CYNDAQUIL DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_CYNDAQUIL_DOLL, + .tiles = DecorGfx_CYNDAQUIL_DOLL, + }, + + [DECOR_CHIKORITA_DOLL] = + { + .id = DECOR_CHIKORITA_DOLL, + .name = _("CHIKORITA DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_CHIKORITA_DOLL, + .tiles = DecorGfx_CHIKORITA_DOLL, + }, + + [DECOR_TOTODILE_DOLL] = + { + .id = DECOR_TOTODILE_DOLL, + .name = _("TOTODILE DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TOTODILE_DOLL, + .tiles = DecorGfx_TOTODILE_DOLL, + }, + + [DECOR_JIGGLYPUFF_DOLL] = + { + .id = DECOR_JIGGLYPUFF_DOLL, + .name = _("JIGGLYPUFF DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_JIGGLYPUFF_DOLL, + .tiles = DecorGfx_JIGGLYPUFF_DOLL, + }, + + [DECOR_MEOWTH_DOLL] = + { + .id = DECOR_MEOWTH_DOLL, + .name = _("MEOWTH DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_MEOWTH_DOLL, + .tiles = DecorGfx_MEOWTH_DOLL, + }, + + [DECOR_CLEFAIRY_DOLL] = + { + .id = DECOR_CLEFAIRY_DOLL, + .name = _("CLEFAIRY DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_CLEFAIRY_DOLL, + .tiles = DecorGfx_CLEFAIRY_DOLL, + }, + + [DECOR_DITTO_DOLL] = + { + .id = DECOR_DITTO_DOLL, + .name = _("DITTO DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_DITTO_DOLL, + .tiles = DecorGfx_DITTO_DOLL, + }, + + [DECOR_SMOOCHUM_DOLL] = + { + .id = DECOR_SMOOCHUM_DOLL, + .name = _("SMOOCHUM DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SMOOCHUM_DOLL, + .tiles = DecorGfx_SMOOCHUM_DOLL, + }, + + [DECOR_TREECKO_DOLL] = + { + .id = DECOR_TREECKO_DOLL, + .name = _("TREECKO DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TREECKO_DOLL, + .tiles = DecorGfx_TREECKO_DOLL, + }, + + [DECOR_TORCHIC_DOLL] = + { + .id = DECOR_TORCHIC_DOLL, + .name = _("TORCHIC DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TORCHIC_DOLL, + .tiles = DecorGfx_TORCHIC_DOLL, + }, + + [DECOR_MUDKIP_DOLL] = + { + .id = DECOR_MUDKIP_DOLL, + .name = _("MUDKIP DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_MUDKIP_DOLL, + .tiles = DecorGfx_MUDKIP_DOLL, + }, + + [DECOR_DUSKULL_DOLL] = + { + .id = DECOR_DUSKULL_DOLL, + .name = _("DUSKULL DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_DUSKULL_DOLL, + .tiles = DecorGfx_DUSKULL_DOLL, + }, + + [DECOR_WYNAUT_DOLL] = + { + .id = DECOR_WYNAUT_DOLL, + .name = _("WYNAUT DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_WYNAUT_DOLL, + .tiles = DecorGfx_WYNAUT_DOLL, + }, + + [DECOR_BALTOY_DOLL] = + { + .id = DECOR_BALTOY_DOLL, + .name = _("BALTOY DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_BALTOY_DOLL, + .tiles = DecorGfx_BALTOY_DOLL, + }, + + [DECOR_KECLEON_DOLL] = + { + .id = DECOR_KECLEON_DOLL, + .name = _("KECLEON DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_KECLEON_DOLL, + .tiles = DecorGfx_KECLEON_DOLL, + }, + + [DECOR_AZURILL_DOLL] = + { + .id = DECOR_AZURILL_DOLL, + .name = _("AZURILL DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_AZURILL_DOLL, + .tiles = DecorGfx_AZURILL_DOLL, + }, + + [DECOR_SKITTY_DOLL] = + { + .id = DECOR_SKITTY_DOLL, + .name = _("SKITTY DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SKITTY_DOLL, + .tiles = DecorGfx_SKITTY_DOLL, + }, + + [DECOR_SWABLU_DOLL] = + { + .id = DECOR_SWABLU_DOLL, + .name = _("SWABLU DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SWABLU_DOLL, + .tiles = DecorGfx_SWABLU_DOLL, + }, + + [DECOR_GULPIN_DOLL] = + { + .id = DECOR_GULPIN_DOLL, + .name = _("GULPIN DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_GULPIN_DOLL, + .tiles = DecorGfx_GULPIN_DOLL, + }, + + [DECOR_LOTAD_DOLL] = + { + .id = DECOR_LOTAD_DOLL, + .name = _("LOTAD DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_LOTAD_DOLL, + .tiles = DecorGfx_LOTAD_DOLL, + }, + + [DECOR_SEEDOT_DOLL] = + { + .id = DECOR_SEEDOT_DOLL, + .name = _("SEEDOT DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SEEDOT_DOLL, + .tiles = DecorGfx_SEEDOT_DOLL, + }, + + [DECOR_PIKA_CUSHION] = + { + .id = DECOR_PIKA_CUSHION, + .name = _("PIKA CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_PIKA_CUSHION, + .tiles = DecorGfx_PIKA_CUSHION, + }, + + [DECOR_ROUND_CUSHION] = + { + .id = DECOR_ROUND_CUSHION, + .name = _("ROUND CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_ROUND_CUSHION, + .tiles = DecorGfx_ROUND_CUSHION, + }, + + [DECOR_KISS_CUSHION] = + { + .id = DECOR_KISS_CUSHION, + .name = _("KISS CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_KISS_CUSHION, + .tiles = DecorGfx_KISS_CUSHION, + }, + + [DECOR_ZIGZAG_CUSHION] = + { + .id = DECOR_ZIGZAG_CUSHION, + .name = _("ZIGZAG CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_ZIGZAG_CUSHION, + .tiles = DecorGfx_ZIGZAG_CUSHION, + }, + + [DECOR_SPIN_CUSHION] = + { + .id = DECOR_SPIN_CUSHION, + .name = _("SPIN CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_SPIN_CUSHION, + .tiles = DecorGfx_SPIN_CUSHION, + }, + + [DECOR_DIAMOND_CUSHION] = + { + .id = DECOR_DIAMOND_CUSHION, + .name = _("DIAMOND CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_DIAMOND_CUSHION, + .tiles = DecorGfx_DIAMOND_CUSHION, + }, + + [DECOR_BALL_CUSHION] = + { + .id = DECOR_BALL_CUSHION, + .name = _("BALL CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_BALL_CUSHION, + .tiles = DecorGfx_BALL_CUSHION, + }, + + [DECOR_GRASS_CUSHION] = + { + .id = DECOR_GRASS_CUSHION, + .name = _("GRASS CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_GRASS_CUSHION, + .tiles = DecorGfx_GRASS_CUSHION, + }, + + [DECOR_FIRE_CUSHION] = + { + .id = DECOR_FIRE_CUSHION, + .name = _("FIRE CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_FIRE_CUSHION, + .tiles = DecorGfx_FIRE_CUSHION, + }, + + [DECOR_WATER_CUSHION] = + { + .id = DECOR_WATER_CUSHION, + .name = _("WATER CUSHION"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_WATER_CUSHION, + .tiles = DecorGfx_WATER_CUSHION, + }, + + [DECOR_SNORLAX_DOLL] = + { + .id = DECOR_SNORLAX_DOLL, + .name = _("SNORLAX DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_SNORLAX_DOLL, + .tiles = DecorGfx_SNORLAX_DOLL, + }, + + [DECOR_RHYDON_DOLL] = + { + .id = DECOR_RHYDON_DOLL, + .name = _("RHYDON DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_RHYDON_DOLL, + .tiles = DecorGfx_RHYDON_DOLL, + }, + + [DECOR_LAPRAS_DOLL] = + { + .id = DECOR_LAPRAS_DOLL, + .name = _("LAPRAS DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_LAPRAS_DOLL, + .tiles = DecorGfx_LAPRAS_DOLL, + }, + + [DECOR_VENUSAUR_DOLL] = + { + .id = DECOR_VENUSAUR_DOLL, + .name = _("VENUSAUR DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_VENUSAUR_DOLL, + .tiles = DecorGfx_VENUSAUR_DOLL, + }, + + [DECOR_CHARIZARD_DOLL] = + { + .id = DECOR_CHARIZARD_DOLL, + .name = _("CHARIZARD DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_CHARIZARD_DOLL, + .tiles = DecorGfx_CHARIZARD_DOLL, + }, + + [DECOR_BLASTOISE_DOLL] = + { + .id = DECOR_BLASTOISE_DOLL, + .name = _("BLASTOISE DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_BLASTOISE_DOLL, + .tiles = DecorGfx_BLASTOISE_DOLL, + }, + + [DECOR_WAILMER_DOLL] = + { + .id = DECOR_WAILMER_DOLL, + .name = _("WAILMER DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_WAILMER_DOLL, + .tiles = DecorGfx_WAILMER_DOLL, + }, + + [DECOR_REGIROCK_DOLL] = + { + .id = DECOR_REGIROCK_DOLL, + .name = _("REGIROCK DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_REGIROCK_DOLL, + .tiles = DecorGfx_REGIROCK_DOLL, + }, + + [DECOR_REGICE_DOLL] = + { + .id = DECOR_REGICE_DOLL, + .name = _("REGICE DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_REGICE_DOLL, + .tiles = DecorGfx_REGICE_DOLL, + }, + + [DECOR_REGISTEEL_DOLL] = + { + .id = DECOR_REGISTEEL_DOLL, + .name = _("REGISTEEL DOLL"), + .permission = DECORPERM_SPRITE, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_REGISTEEL_DOLL, + .tiles = DecorGfx_REGISTEEL_DOLL, + } }; diff --git a/src/data/decoration/tilemaps.h b/src/data/decoration/tilemaps.h index 12fe31dc0..eebb3acb2 100644 --- a/src/data/decoration/tilemaps.h +++ b/src/data/decoration/tilemaps.h @@ -1,37 +1,37 @@ -const u8 Unknown_085A6FB0[] = { +static const u8 sDecorTilemap_1x1_Tiles[] = { 0x00, 0x01, 0x02, 0x03 }; -const u8 Unknown_085A6FB4[] = { +static const u8 sDecorTilemap_3x1_Tiles[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d }; -const u8 Unknown_085A6FC0[] = { +static const u8 sDecorTilemap_2x2_Tiles[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; -const u8 Unknown_085A6FD0[] = { +static const u8 sDecorTilemap_1x3_Tiles[] = { 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x0d, 0x10, 0x11, 0x14, 0x15 }; -const u8 Unknown_085A6FDC[] = { +static const u8 sDecorTilemap_2x1_Tiles[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; -const u8 Unknown_085A6FE4[] = { +static const u8 sDecorTilemap_4x2_Tiles[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }; -const u8 Unknown_085A7004[] = { +static const u8 sDecorTilemap_3x3_Tiles[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, @@ -40,60 +40,60 @@ const u8 Unknown_085A7004[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d }; -const u8 Unknown_085A7028[] = { +static const u8 sDecorTilemap_3x2_Tiles[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d }; -const u8 Unknown_085A7040[] = { +static const u8 sDecorTilemap_1x1_Y[] = { 0x00, 0x00, 0x00, 0x00 }; -const u8 Unknown_085A7044[] = { +static const u8 sDecorTilemap_2x1_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01 }; -const u8 Unknown_085A704C[] = { +static const u8 sDecorTilemap_3x1_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02 }; -const u8 Unknown_085A7058[] = { +static const u8 sDecorTilemap_4x2_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07 }; -const u8 Unknown_085A7078[] = { +static const u8 sDecorTilemap_2x2_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03 }; -const u8 Unknown_085A7088[] = { +static const u8 sDecorTilemap_1x2_Y[] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01 }; -const u8 Unknown_085A7090[] = { +static const u8 sDecorTilemap_1x3_Y[] = { 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02 }; -const u8 Unknown_085A709C[] = { +static const u8 sDecorTilemap_2x4_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07 }; -const u8 Unknown_085A70BC[] = { +static const u8 sDecorTilemap_3x3_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, @@ -102,60 +102,60 @@ const u8 Unknown_085A70BC[] = { 0x06, 0x06, 0x07, 0x07, 0x08, 0x08 }; -const u8 Unknown_085A70E0[] = { +static const u8 sDecorTilemap_3x2_Y[] = { 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05 }; -const u8 Unknown_085A70F8[] = { +static const u8 sDecorTilemap_1x1_X[] = { 0x04, 0x05, 0x06, 0x07 }; -const u8 Unknown_085A70FC[] = { +static const u8 sDecorTilemap_2x1_X[] = { 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07 }; -const u8 Unknown_085A7104[] = { +static const u8 sDecorTilemap_3x1_X[] = { 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07 }; -const u8 Unknown_085A7110[] = { +static const u8 sDecorTilemap_4x2_X[] = { 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07 }; -const u8 Unknown_085A7130[] = { +static const u8 sDecorTilemap_2x2_X[] = { 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07 }; -const u8 Unknown_085A7140[] = { +static const u8 sDecorTilemap_1x2_X[] = { 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07 }; -const u8 Unknown_085A7148[] = { +static const u8 sDecorTilemap_1x3_X[] = { 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07, 0x04, 0x05, 0x06, 0x07 }; -const u8 Unknown_085A7154[] = { +static const u8 sDecorTilemap_2x4_X[] = { 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07 }; -const u8 Unknown_085A7174[] = { +static const u8 sDecorTilemap_3x3_X[] = { 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, @@ -164,67 +164,78 @@ const u8 Unknown_085A7174[] = { 0x06, 0x07, 0x06, 0x07, 0x06, 0x07 }; -const u8 Unknown_085A7198[] = { +static const u8 sDecorTilemap_3x2_X[] = { 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x04, 0x05, 0x04, 0x05, 0x04, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07 }; -const struct { +#define DECORSIZE(width, height)((width) * (height) * 4) + +static const struct { const u8 *tiles; const u8 *y; const u8 *x; u8 size; -} gUnknown_085A71B0[] = { - { - Unknown_085A6FB0, - Unknown_085A7040, - Unknown_085A70F8, - 0x04 - }, { - Unknown_085A6FDC, - Unknown_085A7044, - Unknown_085A70FC, - 0x08 - }, { - Unknown_085A6FB4, - Unknown_085A704C, - Unknown_085A7104, - 0x0c - }, { - Unknown_085A6FE4, - Unknown_085A7058, - Unknown_085A7110, - 0x20 - }, { - Unknown_085A6FC0, - Unknown_085A7078, - Unknown_085A7130, - 0x10 - }, { - Unknown_085A6FDC, - Unknown_085A7088, - Unknown_085A7140, - 0x08 - }, { - Unknown_085A6FD0, - Unknown_085A7090, - Unknown_085A7148, - 0x0c - }, { - Unknown_085A6FE4, - Unknown_085A709C, - Unknown_085A7154, - 0x20 - }, { - Unknown_085A7004, - Unknown_085A70BC, - Unknown_085A7174, - 0x24 - }, { - Unknown_085A7028, - Unknown_085A70E0, - Unknown_085A7198, - 0x18 +} sDecorTilemaps[] = { + [DECORSHAPE_1x1] = { + .tiles = sDecorTilemap_1x1_Tiles, + .y = sDecorTilemap_1x1_Y, + .x = sDecorTilemap_1x1_X, + .size = DECORSIZE(1, 1) + }, + [DECORSHAPE_2x1] = { + .tiles = sDecorTilemap_2x1_Tiles, + .y = sDecorTilemap_2x1_Y, + .x = sDecorTilemap_2x1_X, + .size = DECORSIZE(2, 1) + }, + [DECORSHAPE_3x1] = { + .tiles = sDecorTilemap_3x1_Tiles, + .y = sDecorTilemap_3x1_Y, + .x = sDecorTilemap_3x1_X, + .size = DECORSIZE(3, 1) + }, + [DECORSHAPE_4x2] = { + .tiles = sDecorTilemap_4x2_Tiles, + .y = sDecorTilemap_4x2_Y, + .x = sDecorTilemap_4x2_X, + .size = DECORSIZE(4, 2) + }, + [DECORSHAPE_2x2] = { + .tiles = sDecorTilemap_2x2_Tiles, + .y = sDecorTilemap_2x2_Y, + .x = sDecorTilemap_2x2_X, + .size = DECORSIZE(2, 2) + }, + [DECORSHAPE_1x2] = { + .tiles = sDecorTilemap_2x1_Tiles, + .y = sDecorTilemap_1x2_Y, + .x = sDecorTilemap_1x2_X, + .size = DECORSIZE(1, 2) + }, + [DECORSHAPE_1x3] = { + .tiles = sDecorTilemap_1x3_Tiles, + .y = sDecorTilemap_1x3_Y, + .x = sDecorTilemap_1x3_X, + .size = DECORSIZE(1, 3) + }, + [DECORSHAPE_2x4] = { + .tiles = sDecorTilemap_4x2_Tiles, + .y = sDecorTilemap_2x4_Y, + .x = sDecorTilemap_2x4_X, + .size = DECORSIZE(2, 4) + }, + [DECORSHAPE_3x3] = { + .tiles = sDecorTilemap_3x3_Tiles, + .y = sDecorTilemap_3x3_Y, + .x = sDecorTilemap_3x3_X, + .size = DECORSIZE(3, 3) + }, + [DECORSHAPE_3x2] = { + .tiles = sDecorTilemap_3x2_Tiles, + .y = sDecorTilemap_3x2_Y, + .x = sDecorTilemap_3x2_X, + .size = DECORSIZE(3, 2) }}; diff --git a/src/data/decoration/tiles.h b/src/data/decoration/tiles.h index de5c43575..1b25da3d4 100644 --- a/src/data/decoration/tiles.h +++ b/src/data/decoration/tiles.h @@ -1,4 +1,4 @@ -#define DECOR_TILE(name) (METATILE_SecretBase_##name - 0x200) +#define DECOR_TILE(name) (METATILE_SecretBase_##name - NUM_TILES_IN_PRIMARY) const u16 DecorGfx_SMALL_DESK[] = { DECOR_TILE(SmallDesk) diff --git a/src/data/easy_chat/easy_chat_groups.h b/src/data/easy_chat/easy_chat_groups.h index df114d980..a89f228fe 100755 --- a/src/data/easy_chat/easy_chat_groups.h +++ b/src/data/easy_chat/easy_chat_groups.h @@ -26,112 +26,112 @@ const struct EasyChatGroup gEasyChatGroups[] = { { .wordData = {.valueList = gEasyChatGroup_Pokemon}, - .numWords = 202, - .numEnabledWords = 202, + .numWords = ARRAY_COUNT(gEasyChatGroup_Pokemon), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Pokemon), }, { .wordData = {.words = gEasyChatGroup_Trainer}, - .numWords = 27, - .numEnabledWords = 21, + .numWords = ARRAY_COUNT(gEasyChatGroup_Trainer), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Trainer) - 6, // Excludes Red, Green, Flame, Gold, Leaf, and Silver }, { .wordData = {.words = gEasyChatGroup_Status}, - .numWords = 109, - .numEnabledWords = 109, + .numWords = ARRAY_COUNT(gEasyChatGroup_Status), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Status), }, { .wordData = {.words = gEasyChatGroup_Battle}, - .numWords = 63, - .numEnabledWords = 63, + .numWords = ARRAY_COUNT(gEasyChatGroup_Battle), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Battle), }, { .wordData = {.words = gEasyChatGroup_Greetings}, - .numWords = 42, - .numEnabledWords = 42, + .numWords = ARRAY_COUNT(gEasyChatGroup_Greetings), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Greetings), }, { .wordData = {.words = gEasyChatGroup_People}, - .numWords = 75, - .numEnabledWords = 75, + .numWords = ARRAY_COUNT(gEasyChatGroup_People), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_People), }, { .wordData = {.words = gEasyChatGroup_Voices}, - .numWords = 63, - .numEnabledWords = 63, + .numWords = ARRAY_COUNT(gEasyChatGroup_Voices), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Voices), }, { .wordData = {.words = gEasyChatGroup_Speech}, - .numWords = 60, - .numEnabledWords = 60, + .numWords = ARRAY_COUNT(gEasyChatGroup_Speech), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Speech), }, { .wordData = {.words = gEasyChatGroup_Endings}, - .numWords = 69, - .numEnabledWords = 69, + .numWords = ARRAY_COUNT(gEasyChatGroup_Endings), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Endings), }, { .wordData = {.words = gEasyChatGroup_Feelings}, - .numWords = 69, - .numEnabledWords = 69, + .numWords = ARRAY_COUNT(gEasyChatGroup_Feelings), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Feelings), }, { .wordData = {.words = gEasyChatGroup_Conditions}, - .numWords = 69, - .numEnabledWords = 69, + .numWords = ARRAY_COUNT(gEasyChatGroup_Conditions), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Conditions), }, { .wordData = {.words = gEasyChatGroup_Actions}, - .numWords = 78, - .numEnabledWords = 78, + .numWords = ARRAY_COUNT(gEasyChatGroup_Actions), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Actions), }, { .wordData = {.words = gEasyChatGroup_Lifestyle}, - .numWords = 45, - .numEnabledWords = 45, + .numWords = ARRAY_COUNT(gEasyChatGroup_Lifestyle), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Lifestyle), }, { .wordData = {.words = gEasyChatGroup_Hobbies}, - .numWords = 54, - .numEnabledWords = 54, + .numWords = ARRAY_COUNT(gEasyChatGroup_Hobbies), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Hobbies), }, { .wordData = {.words = gEasyChatGroup_Time}, - .numWords = 45, - .numEnabledWords = 45, + .numWords = ARRAY_COUNT(gEasyChatGroup_Time), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Time), }, { .wordData = {.words = gEasyChatGroup_Misc}, - .numWords = 42, - .numEnabledWords = 42, + .numWords = ARRAY_COUNT(gEasyChatGroup_Misc), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Misc), }, { .wordData = {.words = gEasyChatGroup_Adjectives}, - .numWords = 36, - .numEnabledWords = 36, + .numWords = ARRAY_COUNT(gEasyChatGroup_Adjectives), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Adjectives), }, { .wordData = {.words = gEasyChatGroup_Events}, - .numWords = 29, - .numEnabledWords = 29, + .numWords = ARRAY_COUNT(gEasyChatGroup_Events), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Events), }, { .wordData = {.valueList = gEasyChatGroup_Move1}, - .numWords = 154, - .numEnabledWords = 154, + .numWords = ARRAY_COUNT(gEasyChatGroup_Move1), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Move1), }, { .wordData = {.valueList = gEasyChatGroup_Move2}, - .numWords = 200, - .numEnabledWords = 200, + .numWords = ARRAY_COUNT(gEasyChatGroup_Move2), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Move2), }, { .wordData = {.words = gEasyChatGroup_TrendySaying}, - .numWords = 33, - .numEnabledWords = 33, + .numWords = ARRAY_COUNT(gEasyChatGroup_TrendySaying), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_TrendySaying), }, { .wordData = {.valueList = gEasyChatGroup_Pokemon2}, - .numWords = 251, - .numEnabledWords = 251, + .numWords = ARRAY_COUNT(gEasyChatGroup_Pokemon2), + .numEnabledWords = ARRAY_COUNT(gEasyChatGroup_Pokemon2), }, }; diff --git a/src/data/easy_chat/easy_chat_words_by_letter.h b/src/data/easy_chat/easy_chat_words_by_letter.h index 927b9db2f..a56e3184f 100755 --- a/src/data/easy_chat/easy_chat_words_by_letter.h +++ b/src/data/easy_chat/easy_chat_words_by_letter.h @@ -1,6 +1,8 @@ #include "easy_chat.h" #include "constants/easy_chat.h" +#define DOUBLE_SPECIES_NAME EC_EMPTY_WORD, 2, + const u16 gEasyChatWordsByLetter_Others[] = { EC_WORD_EXCL, EC_WORD_EXCL_EXCL, @@ -21,9 +23,9 @@ const u16 gEasyChatWordsByLetter_A[] = { EC_WORD_A_TINY_BIT, EC_WORD_ABOUT, EC_WORD_ABOVE, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(ABRA), - EC_POKEMON2(ABRA), + EC_POKEMON_NATIONAL(ABRA), EC_WORD_ABSENT, EC_POKEMON(ABSOL), EC_WORD_ABSOLUTELY, @@ -36,7 +38,7 @@ const u16 gEasyChatWordsByLetter_A[] = { EC_WORD_ADVENTURE, EC_MOVE2(AERIAL_ACE), EC_MOVE(AEROBLAST), - EC_POKEMON2(AERODACTYL), + EC_POKEMON_NATIONAL(AERODACTYL), EC_WORD_AFTER, EC_WORD_AGE, EC_POKEMON(AGGRON), @@ -44,13 +46,13 @@ const u16 gEasyChatWordsByLetter_A[] = { EC_WORD_AGREE, EC_WORD_AHAHA, EC_WORD_AIM, - EC_POKEMON2(AIPOM), + EC_POKEMON_NATIONAL(AIPOM), EC_MOVE(AIR_CUTTER), EC_WORD_AIR_LOCK, EC_WORD_AIYEEH, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(ALAKAZAM), - EC_POKEMON2(ALAKAZAM), + EC_POKEMON_NATIONAL(ALAKAZAM), EC_WORD_ALL, EC_WORD_ALL_RIGHT, EC_WORD_ALLOW, @@ -65,7 +67,7 @@ const u16 gEasyChatWordsByLetter_A[] = { EC_WORD_ALWAYS, EC_WORD_AM, EC_MOVE2(AMNESIA), - EC_POKEMON2(AMPHAROS), + EC_POKEMON_NATIONAL(AMPHAROS), EC_WORD_AMUSING, EC_WORD_AN, EC_MOVE(ANCIENT_POWER), @@ -85,19 +87,19 @@ const u16 gEasyChatWordsByLetter_A[] = { EC_WORD_APPEARS, EC_WORD_APPRECIATE, EC_WORD_APPROVED, - EC_POKEMON2(ARBOK), - EC_POKEMON2(ARCANINE), + EC_POKEMON_NATIONAL(ARBOK), + EC_POKEMON_NATIONAL(ARCANINE), EC_WORD_ARE, EC_WORD_AREN_T, EC_WORD_ARENA_TRAP, - EC_POKEMON2(ARIADOS), + EC_POKEMON_NATIONAL(ARIADOS), EC_MOVE2(ARM_THRUST), EC_POKEMON(ARMALDO), EC_MOVE(AROMATHERAPY), EC_POKEMON(ARON), EC_WORD_AROUND, EC_WORD_ARRGH, - EC_POKEMON2(ARTICUNO), + EC_POKEMON_NATIONAL(ARTICUNO), EC_WORD_AS, EC_WORD_AS_IF, EC_WORD_AS_MUCH_AS, @@ -114,9 +116,9 @@ const u16 gEasyChatWordsByLetter_A[] = { EC_WORD_AWFUL, EC_WORD_AWFULLY, EC_WORD_AWW, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(AZUMARILL), - EC_POKEMON2(AZUMARILL), + EC_POKEMON_NATIONAL(AZUMARILL), EC_POKEMON(AZURILL), }; @@ -141,7 +143,7 @@ const u16 gEasyChatWordsByLetter_B[] = { EC_WORD_BATTLE_ARMOR, EC_WORD_BATTLE_ROOM, EC_WORD_BATTLE_TOWER, - EC_POKEMON2(BAYLEEF), + EC_POKEMON_NATIONAL(BAYLEEF), EC_WORD_BE, EC_WORD_BEAT, EC_MOVE2(BEAT_UP), @@ -149,17 +151,17 @@ const u16 gEasyChatWordsByLetter_B[] = { EC_WORD_BEAUTIFUL, EC_WORD_BEAUTY, EC_WORD_BECOMES, - EC_POKEMON2(BEEDRILL), + EC_POKEMON_NATIONAL(BEEDRILL), EC_WORD_BEEN, EC_WORD_BEFORE, EC_WORD_BEGINNING, EC_WORD_BEING, EC_POKEMON(BELDUM), EC_WORD_BELIEVE, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(BELLOSSOM), - EC_POKEMON2(BELLOSSOM), - EC_POKEMON2(BELLSPROUT), + EC_POKEMON_NATIONAL(BELLOSSOM), + EC_POKEMON_NATIONAL(BELLSPROUT), EC_MOVE2(BELLY_DRUM), EC_WORD_BELONGS_TO, EC_WORD_BELOW, @@ -173,12 +175,12 @@ const u16 gEasyChatWordsByLetter_B[] = { EC_MOVE(BIND), EC_MOVE(BITE), EC_MOVE2(BLAST_BURN), - EC_POKEMON2(BLASTOISE), + EC_POKEMON_NATIONAL(BLASTOISE), EC_WORD_BLAZE, EC_MOVE2(BLAZE_KICK), EC_POKEMON(BLAZIKEN), EC_WORD_BLEND, - EC_POKEMON2(BLISSEY), + EC_POKEMON_NATIONAL(BLISSEY), EC_MOVE2(BLIZZARD), EC_MOVE2(BLOCK), EC_WORD_BOARD, @@ -199,12 +201,12 @@ const u16 gEasyChatWordsByLetter_B[] = { EC_MOVE(BUBBLE), EC_MOVE2(BUBBLE_BEAM), EC_WORD_BUG, - EC_POKEMON2(BULBASAUR), + EC_POKEMON_NATIONAL(BULBASAUR), EC_MOVE2(BULK_UP), EC_MOVE2(BULLET_SEED), EC_WORD_BUSY, EC_WORD_BUT, - EC_POKEMON2(BUTTERFREE), + EC_POKEMON_NATIONAL(BUTTERFREE), EC_WORD_BYE_BYE, }; @@ -229,27 +231,27 @@ const u16 gEasyChatWordsByLetter_C[] = { EC_POKEMON(CASCOON), EC_WORD_CASE, EC_POKEMON(CASTFORM), - EC_POKEMON2(CATERPIE), + EC_POKEMON_NATIONAL(CATERPIE), EC_WORD_CAUSE, - EC_POKEMON2(CELEBI), + EC_POKEMON_NATIONAL(CELEBI), EC_WORD_CENTER, EC_WORD_CHALLENGE, EC_WORD_CHANGE, EC_WORD_CHANNEL, - EC_POKEMON2(CHANSEY), + EC_POKEMON_NATIONAL(CHANSEY), EC_MOVE(CHARGE), - EC_POKEMON2(CHARIZARD), + EC_POKEMON_NATIONAL(CHARIZARD), EC_MOVE(CHARM), - EC_POKEMON2(CHARMANDER), - EC_POKEMON2(CHARMELEON), + EC_POKEMON_NATIONAL(CHARMANDER), + EC_POKEMON_NATIONAL(CHARMELEON), EC_WORD_CHAT, - EC_POKEMON2(CHIKORITA), + EC_POKEMON_NATIONAL(CHIKORITA), EC_WORD_CHILD_S_PLAY, EC_WORD_CHILDREN, EC_POKEMON(CHIMECHO), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(CHINCHOU), - EC_POKEMON2(CHINCHOU), + EC_POKEMON_NATIONAL(CHINCHOU), EC_WORD_CHLOROPHYLL, EC_WORD_CHOICE, EC_WORD_CHOOSE, @@ -259,12 +261,12 @@ const u16 gEasyChatWordsByLetter_C[] = { EC_WORD_CLASS, EC_POKEMON(CLAYDOL), EC_WORD_CLEAR_BODY, - EC_POKEMON2(CLEFABLE), - EC_POKEMON2(CLEFAIRY), - EC_POKEMON2(CLEFFA), + EC_POKEMON_NATIONAL(CLEFABLE), + EC_POKEMON_NATIONAL(CLEFAIRY), + EC_POKEMON_NATIONAL(CLEFFA), EC_WORD_CLOSE, EC_WORD_CLOUD_NINE, - EC_POKEMON2(CLOYSTER), + EC_POKEMON_NATIONAL(CLOYSTER), EC_WORD_COLD, EC_WORD_COLLECT, EC_WORD_COLLECTION, @@ -293,9 +295,9 @@ const u16 gEasyChatWordsByLetter_C[] = { EC_WORD_COOLNESS, EC_POKEMON(CORPHISH), EC_WORD_CORRECT, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(CORSOLA), - EC_POKEMON2(CORSOLA), + EC_POKEMON_NATIONAL(CORSOLA), EC_MOVE(COSMIC_POWER), EC_MOVE2(COTTON_SPORE), EC_WORD_COULD, @@ -308,23 +310,23 @@ const u16 gEasyChatWordsByLetter_C[] = { EC_POKEMON(CRADILY), EC_POKEMON(CRAWDAUNT), EC_WORD_CRIES, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(CROBAT), - EC_POKEMON2(CROBAT), - EC_POKEMON2(CROCONAW), + EC_POKEMON_NATIONAL(CROBAT), + EC_POKEMON_NATIONAL(CROCONAW), EC_MOVE(CROSS_CHOP), EC_MOVE(CRUNCH), EC_WORD_CRUSH, EC_MOVE2(CRUSH_CLAW), EC_WORD_CRY, - EC_POKEMON2(CUBONE), + EC_POKEMON_NATIONAL(CUBONE), EC_WORD_CURRENT, EC_MOVE2(CURSE), EC_MOVE(CUT), EC_WORD_CUTE, EC_WORD_CUTE_CHARM, EC_WORD_CUTENESS, - EC_POKEMON2(CYNDAQUIL), + EC_POKEMON_NATIONAL(CYNDAQUIL), }; const u16 gEasyChatWordsByLetter_D[] = { @@ -345,7 +347,7 @@ const u16 gEasyChatWordsByLetter_D[] = { EC_WORD_DEFEATED, EC_MOVE2(DEFENSE_CURL), EC_POKEMON(DELCATTY), - EC_POKEMON2(DELIBIRD), + EC_POKEMON_NATIONAL(DELIBIRD), EC_POKEMON(DEOXYS), EC_WORD_DEPT_STORE, EC_WORD_DESIGN, @@ -353,14 +355,14 @@ const u16 gEasyChatWordsByLetter_D[] = { EC_MOVE2(DESTINY_BOND), EC_WORD_DESTROYED, EC_MOVE2(DETECT), - EC_POKEMON2(DEWGONG), + EC_POKEMON_NATIONAL(DEWGONG), EC_WORD_DID, EC_WORD_DIDN_T, EC_WORD_DIET, EC_WORD_DIFFERENT, EC_MOVE(DIG), EC_WORD_DIGITAL, - EC_POKEMON2(DIGLETT), + EC_POKEMON_NATIONAL(DIGLETT), EC_WORD_DIRECT, EC_MOVE(DISABLE), EC_WORD_DISAPPEAR, @@ -370,24 +372,24 @@ const u16 gEasyChatWordsByLetter_D[] = { EC_WORD_DISASTER, EC_WORD_DISLIKE, EC_WORD_DISLIKES, - EC_POKEMON2(DITTO), + EC_POKEMON_NATIONAL(DITTO), EC_MOVE2(DIVE), EC_MOVE2(DIZZY_PUNCH), EC_WORD_DO, EC_WORD_DOCILE, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(DODRIO), - EC_POKEMON2(DODRIO), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(DODRIO), + DOUBLE_SPECIES_NAME EC_POKEMON(DODUO), - EC_POKEMON2(DODUO), + EC_POKEMON_NATIONAL(DODUO), EC_WORD_DOES, EC_WORD_DOESN_T, EC_WORD_DON_T, EC_WORD_DONE, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(DONPHAN), - EC_POKEMON2(DONPHAN), + EC_POKEMON_NATIONAL(DONPHAN), EC_MOVE2(DOOM_DESIRE), EC_MOVE2(DOUBLE_KICK), EC_MOVE(DOUBLE_TEAM), @@ -399,10 +401,10 @@ const u16 gEasyChatWordsByLetter_D[] = { EC_MOVE2(DRAGON_CLAW), EC_MOVE2(DRAGON_DANCE), EC_MOVE2(DRAGON_RAGE), - EC_POKEMON2(DRAGONAIR), + EC_POKEMON_NATIONAL(DRAGONAIR), EC_MOVE2(DRAGON_BREATH), - EC_POKEMON2(DRAGONITE), - EC_POKEMON2(DRATINI), + EC_POKEMON_NATIONAL(DRAGONITE), + EC_POKEMON_NATIONAL(DRATINI), EC_WORD_DREAM, EC_MOVE2(DREAM_EATER), EC_MOVE2(DRILL_PECK), @@ -411,10 +413,10 @@ const u16 gEasyChatWordsByLetter_D[] = { EC_WORD_DRIZZLE, EC_WORD_DROOLING, EC_WORD_DROUGHT, - EC_POKEMON2(DROWZEE), + EC_POKEMON_NATIONAL(DROWZEE), EC_WORD_DUDE, - EC_POKEMON2(DUGTRIO), - EC_POKEMON2(DUNSPARCE), + EC_POKEMON_NATIONAL(DUGTRIO), + EC_POKEMON_NATIONAL(DUNSPARCE), EC_POKEMON(DUSCLOPS), EC_POKEMON(DUSKULL), EC_POKEMON(DUSTOX), @@ -429,20 +431,20 @@ const u16 gEasyChatWordsByLetter_E[] = { EC_WORD_EAT, EC_WORD_EATS, EC_WORD_EEK, - EC_POKEMON2(EEVEE), + EC_POKEMON_NATIONAL(EEVEE), EC_WORD_EFFECT_SPORE, EC_WORD_EGG, EC_MOVE2(EGG_BOMB), EC_WORD_EH_QUES, EC_WORD_EHEHE, - EC_POKEMON2(EKANS), - EC_POKEMON2(ELECTABUZZ), + EC_POKEMON_NATIONAL(EKANS), + EC_POKEMON_NATIONAL(ELECTABUZZ), EC_WORD_ELECTRIC, EC_POKEMON(ELECTRIKE), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(ELECTRODE), - EC_POKEMON2(ELECTRODE), - EC_POKEMON2(ELEKID), + EC_POKEMON_NATIONAL(ELECTRODE), + EC_POKEMON_NATIONAL(ELEKID), EC_WORD_ELSE, EC_MOVE2(EMBER), EC_WORD_EMERALD, @@ -454,11 +456,11 @@ const u16 gEasyChatWordsByLetter_E[] = { EC_WORD_ENJOY, EC_WORD_ENJOYS, EC_WORD_ENOUGH, - EC_POKEMON2(ENTEI), + EC_POKEMON_NATIONAL(ENTEI), EC_WORD_ENTERTAINING, EC_MOVE2(ERUPTION), EC_WORD_ESCAPE, - EC_POKEMON2(ESPEON), + EC_POKEMON_NATIONAL(ESPEON), EC_WORD_EVEN_SO, EC_WORD_EVENT, EC_WORD_EVENTS, @@ -472,8 +474,8 @@ const u16 gEasyChatWordsByLetter_E[] = { EC_WORD_EXCITING, EC_WORD_EXCUSE, EC_WORD_EXCUSE_ME, - EC_POKEMON2(EXEGGCUTE), - EC_POKEMON2(EXEGGUTOR), + EC_POKEMON_NATIONAL(EXEGGCUTE), + EC_POKEMON_NATIONAL(EXEGGUTOR), EC_WORD_EXISTS, EC_WORD_EXPENSIVE, EC_MOVE2(EXPLOSION), @@ -495,16 +497,16 @@ const u16 gEasyChatWordsByLetter_F[] = { EC_WORD_FAMILY, EC_WORD_FANTASTIC, EC_WORD_FAR, - EC_POKEMON2(FARFETCHD), + EC_POKEMON_NATIONAL(FARFETCHD), EC_WORD_FASHION, EC_WORD_FAST, EC_WORD_FATHER, EC_WORD_FEAR, - EC_POKEMON2(FEAROW), + EC_POKEMON_NATIONAL(FEAROW), EC_MOVE2(FEATHER_DANCE), EC_POKEMON(FEEBAS), EC_WORD_FEELING, - EC_POKEMON2(FERALIGATR), + EC_POKEMON_NATIONAL(FERALIGATR), EC_WORD_FESTIVAL, EC_WORD_FEVER, EC_WORD_FIERY, @@ -520,13 +522,13 @@ const u16 gEasyChatWordsByLetter_F[] = { EC_MOVE2(FIRE_SPIN), EC_WORD_FISHING, EC_MOVE(FISSURE), - EC_POKEMON2(FLAAFFY), + EC_POKEMON_NATIONAL(FLAAFFY), EC_MOVE(FLAIL), EC_WORD_FLAME, EC_WORD_FLAME_BODY, EC_MOVE(FLAME_WHEEL), EC_MOVE(FLAMETHROWER), - EC_POKEMON2(FLAREON), + EC_POKEMON_NATIONAL(FLAREON), EC_MOVE2(FLASH), EC_WORD_FLASH_FIRE, EC_WORD_FLATTEN, @@ -547,7 +549,7 @@ const u16 gEasyChatWordsByLetter_F[] = { EC_WORD_FORGET, EC_WORD_FORGETS, EC_WORD_FORGIVE, - EC_POKEMON2(FORRETRESS), + EC_POKEMON_NATIONAL(FORRETRESS), EC_MOVE2(FRENZY_PLANT), EC_WORD_FRIDAY, EC_WORD_FRIEND, @@ -558,7 +560,7 @@ const u16 gEasyChatWordsByLetter_F[] = { EC_WORD_FUFUFU, EC_WORD_FULL, EC_WORD_FUNNY, - EC_POKEMON2(FURRET), + EC_POKEMON_NATIONAL(FURRET), EC_MOVE2(FURY_ATTACK), EC_MOVE2(FURY_CUTTER), EC_MOVE2(FURY_SWIPES), @@ -568,12 +570,12 @@ const u16 gEasyChatWordsByLetter_F[] = { const u16 gEasyChatWordsByLetter_G[] = { EC_WORD_GAME, EC_POKEMON(GARDEVOIR), - EC_POKEMON2(GASTLY), - EC_POKEMON2(GENGAR), + EC_POKEMON_NATIONAL(GASTLY), + EC_POKEMON_NATIONAL(GENGAR), EC_WORD_GENIUS, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GEODUDE), - EC_POKEMON2(GEODUDE), + EC_POKEMON_NATIONAL(GEODUDE), EC_WORD_GET, EC_WORD_GETS, EC_WORD_GHOST, @@ -581,9 +583,9 @@ const u16 gEasyChatWordsByLetter_G[] = { EC_MOVE(GIGA_DRAIN), EC_WORD_GIGGLE, EC_WORD_GIMME, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GIRAFARIG), - EC_POKEMON2(GIRAFARIG), + EC_POKEMON_NATIONAL(GIRAFARIG), EC_WORD_GIRL, EC_WORD_GIVE, EC_WORD_GIVE_ME, @@ -591,29 +593,29 @@ const u16 gEasyChatWordsByLetter_G[] = { EC_WORD_GIVES, EC_POKEMON(GLALIE), EC_MOVE2(GLARE), - EC_POKEMON2(GLIGAR), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(GLIGAR), + DOUBLE_SPECIES_NAME EC_POKEMON(GLOOM), - EC_POKEMON2(GLOOM), + EC_POKEMON_NATIONAL(GLOOM), EC_WORD_GO, EC_WORD_GO_AHEAD, EC_WORD_GO_EASY, EC_WORD_GO_HOME, EC_WORD_GOES, EC_WORD_GOING, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GOLBAT), - EC_POKEMON2(GOLBAT), + EC_POKEMON_NATIONAL(GOLBAT), EC_WORD_GOLD, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GOLDEEN), - EC_POKEMON2(GOLDEEN), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(GOLDEEN), + DOUBLE_SPECIES_NAME EC_POKEMON(GOLDUCK), - EC_POKEMON2(GOLDUCK), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(GOLDUCK), + DOUBLE_SPECIES_NAME EC_POKEMON(GOLEM), - EC_POKEMON2(GOLEM), + EC_POKEMON_NATIONAL(GOLEM), EC_WORD_GOOD, EC_WORD_GOOD_BYE, EC_POKEMON(GOREBYSS), @@ -621,25 +623,25 @@ const u16 gEasyChatWordsByLetter_G[] = { EC_WORD_GOTCHA, EC_WORD_GOURMET, EC_WORD_GRAAAH, - EC_POKEMON2(GRANBULL), + EC_POKEMON_NATIONAL(GRANBULL), EC_WORD_GRANDFATHER, EC_WORD_GRANDMOTHER, EC_WORD_GRASS, EC_MOVE(GRASS_WHISTLE), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GRAVELER), - EC_POKEMON2(GRAVELER), + EC_POKEMON_NATIONAL(GRAVELER), EC_WORD_GREAT, EC_WORD_GREEN, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GRIMER), - EC_POKEMON2(GRIMER), + EC_POKEMON_NATIONAL(GRIMER), EC_POKEMON(GROUDON), EC_WORD_GROUND, EC_WORD_GROUP, EC_POKEMON(GROVYLE), EC_MOVE2(GROWL), - EC_POKEMON2(GROWLITHE), + EC_POKEMON_NATIONAL(GROWLITHE), EC_MOVE(GROWTH), EC_MOVE(GRUDGE), EC_POKEMON(GRUMPIG), @@ -651,9 +653,9 @@ const u16 gEasyChatWordsByLetter_G[] = { EC_WORD_GUTSY, EC_WORD_GWAH, EC_WORD_GWAHAHAHA, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(GYARADOS), - EC_POKEMON2(GYARADOS), + EC_POKEMON_NATIONAL(GYARADOS), }; const u16 gEasyChatWordsByLetter_H[] = { @@ -671,7 +673,7 @@ const u16 gEasyChatWordsByLetter_H[] = { EC_POKEMON(HARIYAMA), EC_WORD_HAS, EC_WORD_HASSLE, - EC_POKEMON2(HAUNTER), + EC_POKEMON_NATIONAL(HAUNTER), EC_WORD_HAVE, EC_WORD_HAVEN_T, EC_MOVE(HAZE), @@ -691,9 +693,9 @@ const u16 gEasyChatWordsByLetter_H[] = { EC_WORD_HELLO, EC_MOVE2(HELPING_HAND), EC_WORD_HER, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(HERACROSS), - EC_POKEMON2(HERACROSS), + EC_POKEMON_NATIONAL(HERACROSS), EC_WORD_HERE, EC_WORD_HERE_GOES, EC_WORD_HERE_I_COME, @@ -714,28 +716,28 @@ const u16 gEasyChatWordsByLetter_H[] = { EC_WORD_HIP_AND, EC_WORD_HIS, EC_WORD_HIT, - EC_POKEMON2(HITMONCHAN), - EC_POKEMON2(HITMONLEE), - EC_POKEMON2(HITMONTOP), + EC_POKEMON_NATIONAL(HITMONCHAN), + EC_POKEMON_NATIONAL(HITMONLEE), + EC_POKEMON_NATIONAL(HITMONTOP), EC_WORD_HIYAH, EC_WORD_HMM, - EC_POKEMON2(HO_OH), + EC_POKEMON_NATIONAL(HO_OH), EC_WORD_HOBBY, EC_WORD_HOHOHO, EC_WORD_HOLIDAY, EC_WORD_HOME, EC_WORD_HOO_HAH, - EC_POKEMON2(HOOTHOOT), + EC_POKEMON_NATIONAL(HOOTHOOT), EC_WORD_HOPELESS, - EC_POKEMON2(HOPPIP), + EC_POKEMON_NATIONAL(HOPPIP), EC_MOVE2(HORN_ATTACK), EC_MOVE2(HORN_DRILL), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(HORSEA), - EC_POKEMON2(HORSEA), + EC_POKEMON_NATIONAL(HORSEA), EC_WORD_HOT, - EC_POKEMON2(HOUNDOOM), - EC_POKEMON2(HOUNDOUR), + EC_POKEMON_NATIONAL(HOUNDOOM), + EC_POKEMON_NATIONAL(HOUNDOUR), EC_WORD_HOW, EC_WORD_HOW_DO, EC_WORD_HOWEVER, @@ -754,7 +756,7 @@ const u16 gEasyChatWordsByLetter_H[] = { EC_WORD_HYPER_CUTTER, EC_MOVE2(HYPER_FANG), EC_MOVE2(HYPER_VOICE), - EC_POKEMON2(HYPNO), + EC_POKEMON_NATIONAL(HYPNO), EC_MOVE(HYPNOSIS), }; @@ -775,9 +777,9 @@ const u16 gEasyChatWordsByLetter_I[] = { EC_WORD_IF, EC_WORD_IF_I_LOSE, EC_WORD_IF_I_WIN, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(IGGLYBUFF), - EC_POKEMON2(IGGLYBUFF), + EC_POKEMON_NATIONAL(IGGLYBUFF), EC_WORD_IGNORANT, EC_WORD_ILLUMINATE, EC_POKEMON(ILLUMISE), @@ -805,32 +807,32 @@ const u16 gEasyChatWordsByLetter_I[] = { EC_WORD_IT, EC_WORD_IT_S, EC_WORD_ITEM, - EC_POKEMON2(IVYSAUR), + EC_POKEMON_NATIONAL(IVYSAUR), }; const u16 gEasyChatWordsByLetter_J[] = { - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(JIGGLYPUFF), - EC_POKEMON2(JIGGLYPUFF), + EC_POKEMON_NATIONAL(JIGGLYPUFF), EC_POKEMON(JIRACHI), EC_WORD_JOKING, - EC_POKEMON2(JOLTEON), + EC_POKEMON_NATIONAL(JOLTEON), EC_WORD_JOY, EC_WORD_JUDGE, EC_MOVE2(JUMP_KICK), - EC_POKEMON2(JUMPLUFF), + EC_POKEMON_NATIONAL(JUMPLUFF), EC_WORD_JUST, - EC_POKEMON2(JYNX), + EC_POKEMON_NATIONAL(JYNX), }; const u16 gEasyChatWordsByLetter_K[] = { - EC_POKEMON2(KABUTO), - EC_POKEMON2(KABUTOPS), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(KABUTO), + EC_POKEMON_NATIONAL(KABUTOPS), + DOUBLE_SPECIES_NAME EC_POKEMON(KADABRA), - EC_POKEMON2(KADABRA), - EC_POKEMON2(KAKUNA), - EC_POKEMON2(KANGASKHAN), + EC_POKEMON_NATIONAL(KADABRA), + EC_POKEMON_NATIONAL(KAKUNA), + EC_POKEMON_NATIONAL(KANGASKHAN), EC_MOVE(KARATE_CHOP), EC_POKEMON(KECLEON), EC_WORD_KEEN_EYE, @@ -839,19 +841,19 @@ const u16 gEasyChatWordsByLetter_K[] = { EC_WORD_KIND, EC_WORD_KINDERGARTEN, EC_MOVE(KINESIS), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(KINGDRA), - EC_POKEMON2(KINGDRA), - EC_POKEMON2(KINGLER), + EC_POKEMON_NATIONAL(KINGDRA), + EC_POKEMON_NATIONAL(KINGLER), EC_POKEMON(KIRLIA), EC_MOVE2(KNOCK_OFF), EC_WORD_KNOCKOUT, EC_WORD_KNOW, EC_WORD_KNOWS, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(KOFFING), - EC_POKEMON2(KOFFING), - EC_POKEMON2(KRABBY), + EC_POKEMON_NATIONAL(KOFFING), + EC_POKEMON_NATIONAL(KRABBY), EC_WORD_KTHX_BYE, EC_POKEMON(KYOGRE), }; @@ -862,11 +864,11 @@ const u16 gEasyChatWordsByLetter_L[] = { EC_WORD_LADY, EC_POKEMON(LAIRON), EC_WORD_LALALA, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(LANTURN), - EC_POKEMON2(LANTURN), - EC_POKEMON2(LAPRAS), - EC_POKEMON2(LARVITAR), + EC_POKEMON_NATIONAL(LANTURN), + EC_POKEMON_NATIONAL(LAPRAS), + EC_POKEMON_NATIONAL(LARVITAR), EC_WORD_LAST, EC_WORD_LATE, EC_WORD_LATER, @@ -879,8 +881,8 @@ const u16 gEasyChatWordsByLetter_L[] = { EC_WORD_LEAF, EC_MOVE2(LEAF_BLADE), EC_WORD_LEARN, - EC_POKEMON2(LEDIAN), - EC_POKEMON2(LEDYBA), + EC_POKEMON_NATIONAL(LEDIAN), + EC_POKEMON_NATIONAL(LEDYBA), EC_MOVE(LEECH_LIFE), EC_MOVE2(LEECH_SEED), EC_MOVE2(LEER), @@ -894,7 +896,7 @@ const u16 gEasyChatWordsByLetter_L[] = { EC_WORD_LEVEL, EC_WORD_LEVITATE, EC_MOVE(LICK), - EC_POKEMON2(LICKITUNG), + EC_POKEMON_NATIONAL(LICKITUNG), EC_WORD_LIE, EC_WORD_LIFE, EC_MOVE2(LIGHT_SCREEN), @@ -933,7 +935,7 @@ const u16 gEasyChatWordsByLetter_L[] = { EC_MOVE(LOW_KICK), EC_WORD_LOWS, EC_POKEMON(LUDICOLO), - EC_POKEMON2(LUGIA), + EC_POKEMON_NATIONAL(LUGIA), EC_WORD_LUKEWARM, EC_POKEMON(LUNATONE), EC_MOVE2(LUSTER_PURGE), @@ -942,35 +944,35 @@ const u16 gEasyChatWordsByLetter_L[] = { const u16 gEasyChatWordsByLetter_M[] = { EC_MOVE2(MACH_PUNCH), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(MACHAMP), - EC_POKEMON2(MACHAMP), + EC_POKEMON_NATIONAL(MACHAMP), EC_WORD_MACHINE, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(MACHOKE), - EC_POKEMON2(MACHOKE), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(MACHOKE), + DOUBLE_SPECIES_NAME EC_POKEMON(MACHOP), - EC_POKEMON2(MACHOP), + EC_POKEMON_NATIONAL(MACHOP), EC_WORD_MAGAZINE, - EC_POKEMON2(MAGBY), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(MAGBY), + DOUBLE_SPECIES_NAME EC_POKEMON(MAGCARGO), - EC_POKEMON2(MAGCARGO), + EC_POKEMON_NATIONAL(MAGCARGO), EC_MOVE2(MAGIC_COAT), EC_MOVE2(MAGICAL_LEAF), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(MAGIKARP), - EC_POKEMON2(MAGIKARP), + EC_POKEMON_NATIONAL(MAGIKARP), EC_WORD_MAGMA_ARMOR, - EC_POKEMON2(MAGMAR), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(MAGMAR), + DOUBLE_SPECIES_NAME EC_POKEMON(MAGNEMITE), - EC_POKEMON2(MAGNEMITE), + EC_POKEMON_NATIONAL(MAGNEMITE), EC_WORD_MAGNET_PULL, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(MAGNETON), - EC_POKEMON2(MAGNETON), + EC_POKEMON_NATIONAL(MAGNETON), EC_MOVE2(MAGNITUDE), EC_WORD_MAIL, EC_WORD_MAKE, @@ -978,13 +980,13 @@ const u16 gEasyChatWordsByLetter_M[] = { EC_POKEMON(MAKUHITA), EC_WORD_MAN, EC_POKEMON(MANECTRIC), - EC_POKEMON2(MANKEY), - EC_POKEMON2(MANTINE), - EC_POKEMON2(MAREEP), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(MANKEY), + EC_POKEMON_NATIONAL(MANTINE), + EC_POKEMON_NATIONAL(MAREEP), + DOUBLE_SPECIES_NAME EC_POKEMON(MARILL), - EC_POKEMON2(MARILL), - EC_POKEMON2(MAROWAK), + EC_POKEMON_NATIONAL(MARILL), + EC_POKEMON_NATIONAL(MAROWAK), EC_POKEMON(MARSHTOMP), EC_WORD_MARVEL_SCALE, EC_POKEMON(MASQUERAIN), @@ -1008,23 +1010,23 @@ const u16 gEasyChatWordsByLetter_M[] = { EC_MOVE2(MEGA_KICK), EC_MOVE2(MEGA_PUNCH), EC_MOVE2(MEGAHORN), - EC_POKEMON2(MEGANIUM), + EC_POKEMON_NATIONAL(MEGANIUM), EC_MOVE(MEMENTO), - EC_POKEMON2(MEOWTH), + EC_POKEMON_NATIONAL(MEOWTH), EC_WORD_MESSAGE, EC_POKEMON(METAGROSS), EC_MOVE2(METAL_CLAW), EC_MOVE(METAL_SOUND), EC_POKEMON(METANG), - EC_POKEMON2(METAPOD), + EC_POKEMON_NATIONAL(METAPOD), EC_MOVE(METEOR_MASH), EC_MOVE2(METRONOME), - EC_POKEMON2(MEW), - EC_POKEMON2(MEWTWO), + EC_POKEMON_NATIONAL(MEW), + EC_POKEMON_NATIONAL(MEWTWO), EC_POKEMON(MIGHTYENA), EC_MOVE2(MILK_DRINK), EC_POKEMON(MILOTIC), - EC_POKEMON2(MILTANK), + EC_POKEMON_NATIONAL(MILTANK), EC_MOVE2(MIMIC), EC_MOVE(MIND_READER), EC_MOVE2(MINIMIZE), @@ -1032,7 +1034,7 @@ const u16 gEasyChatWordsByLetter_M[] = { EC_WORD_MINUS, EC_MOVE2(MIRROR_COAT), EC_MOVE(MIRROR_MOVE), - EC_POKEMON2(MISDREAVUS), + EC_POKEMON_NATIONAL(MISDREAVUS), EC_WORD_MISHEARD, EC_WORD_MISS, EC_MOVE(MIST), @@ -1041,7 +1043,7 @@ const u16 gEasyChatWordsByLetter_M[] = { EC_WORD_MMM, EC_WORD_MODE, EC_WORD_MODERN, - EC_POKEMON2(MOLTRES), + EC_POKEMON_NATIONAL(MOLTRES), EC_WORD_MOMENTUM, EC_WORD_MONDAY, EC_WORD_MONEY, @@ -1055,7 +1057,7 @@ const u16 gEasyChatWordsByLetter_M[] = { EC_WORD_MOVE, EC_WORD_MOVIE, EC_WORD_MR, - EC_POKEMON2(MR_MIME), + EC_POKEMON_NATIONAL(MR_MIME), EC_WORD_MRS, EC_WORD_MUCH, EC_WORD_MUCH_OBLIGED, @@ -1065,10 +1067,10 @@ const u16 gEasyChatWordsByLetter_M[] = { EC_MOVE2(MUDDY_WATER), EC_POKEMON(MUDKIP), EC_WORD_MUFUFU, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(MUK), - EC_POKEMON2(MUK), - EC_POKEMON2(MURKROW), + EC_POKEMON_NATIONAL(MUK), + EC_POKEMON_NATIONAL(MURKROW), EC_WORD_MUSIC, EC_WORD_MUST_BE, EC_WORD_MY, @@ -1079,9 +1081,9 @@ const u16 gEasyChatWordsByLetter_M[] = { const u16 gEasyChatWordsByLetter_N[] = { EC_WORD_NAME, EC_WORD_NAP, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(NATU), - EC_POKEMON2(NATU), + EC_POKEMON_NATIONAL(NATU), EC_WORD_NATURAL, EC_WORD_NATURAL_CURE, EC_WORD_NATURALLY, @@ -1097,26 +1099,26 @@ const u16 gEasyChatWordsByLetter_N[] = { EC_WORD_NEWS, EC_WORD_NEXT, EC_WORD_NICE, - EC_POKEMON2(NIDOKING), - EC_POKEMON2(NIDOQUEEN), - EC_POKEMON2(NIDORAN_F), - EC_POKEMON2(NIDORAN_M), - EC_POKEMON2(NIDORINA), - EC_POKEMON2(NIDORINO), + EC_POKEMON_NATIONAL(NIDOKING), + EC_POKEMON_NATIONAL(NIDOQUEEN), + EC_POKEMON_NATIONAL(NIDORAN_F), + EC_POKEMON_NATIONAL(NIDORAN_M), + EC_POKEMON_NATIONAL(NIDORINA), + EC_POKEMON_NATIONAL(NIDORINO), EC_WORD_NIGHT, EC_MOVE2(NIGHT_SHADE), EC_MOVE(NIGHTMARE), EC_WORD_NIGHTTIME, EC_POKEMON(NINCADA), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(NINETALES), - EC_POKEMON2(NINETALES), + EC_POKEMON_NATIONAL(NINETALES), EC_POKEMON(NINJASK), EC_WORD_NITWIT, EC_WORD_NO, EC_WORD_NO_MATCH, EC_WORD_NO_1, - EC_POKEMON2(NOCTOWL), + EC_POKEMON_NATIONAL(NOCTOWL), EC_WORD_NOISY, EC_WORD_NON_STOP, EC_WORD_NONE, @@ -1134,10 +1136,10 @@ const u16 gEasyChatWordsByLetter_N[] = { const u16 gEasyChatWordsByLetter_O[] = { EC_WORD_OBLIVIOUS, EC_MOVE(OCTAZOOKA), - EC_POKEMON2(OCTILLERY), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(OCTILLERY), + DOUBLE_SPECIES_NAME EC_POKEMON(ODDISH), - EC_POKEMON2(ODDISH), + EC_POKEMON_NATIONAL(ODDISH), EC_MOVE(ODOR_SLEUTH), EC_WORD_OF, EC_WORD_OFF, @@ -1153,11 +1155,11 @@ const u16 gEasyChatWordsByLetter_O[] = { EC_WORD_OKAY, EC_WORD_OLD, EC_WORD_OLDEN, - EC_POKEMON2(OMANYTE), - EC_POKEMON2(OMASTAR), + EC_POKEMON_NATIONAL(OMANYTE), + EC_POKEMON_NATIONAL(OMASTAR), EC_WORD_ON, EC_WORD_ONCE, - EC_POKEMON2(ONIX), + EC_POKEMON_NATIONAL(ONIX), EC_WORD_ONLY, EC_WORD_OOPS, EC_WORD_OPPONENT, @@ -1179,8 +1181,8 @@ const u16 gEasyChatWordsByLetter_O[] = { const u16 gEasyChatWordsByLetter_P[] = { EC_MOVE(PAIN_SPLIT), - EC_POKEMON2(PARAS), - EC_POKEMON2(PARASECT), + EC_POKEMON_NATIONAL(PARAS), + EC_POKEMON_NATIONAL(PARASECT), EC_WORD_PARDON, EC_WORD_PARENT, EC_WORD_PARTNER, @@ -1193,29 +1195,29 @@ const u16 gEasyChatWordsByLetter_P[] = { EC_WORD_PERFECT, EC_WORD_PERFECTION, EC_MOVE2(PERISH_SONG), - EC_POKEMON2(PERSIAN), + EC_POKEMON_NATIONAL(PERSIAN), EC_WORD_PERSON, EC_MOVE2(PETAL_DANCE), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(PHANPY), - EC_POKEMON2(PHANPY), + EC_POKEMON_NATIONAL(PHANPY), EC_WORD_PHONE, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(PICHU), - EC_POKEMON2(PICHU), + EC_POKEMON_NATIONAL(PICHU), EC_WORD_PICKUP, - EC_POKEMON2(PIDGEOT), - EC_POKEMON2(PIDGEOTTO), - EC_POKEMON2(PIDGEY), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(PIDGEOT), + EC_POKEMON_NATIONAL(PIDGEOTTO), + EC_POKEMON_NATIONAL(PIDGEY), + DOUBLE_SPECIES_NAME EC_POKEMON(PIKACHU), - EC_POKEMON2(PIKACHU), - EC_POKEMON2(PILOSWINE), + EC_POKEMON_NATIONAL(PIKACHU), + EC_POKEMON_NATIONAL(PILOSWINE), EC_MOVE2(PIN_MISSILE), - EC_POKEMON2(PINECO), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(PINECO), + DOUBLE_SPECIES_NAME EC_POKEMON(PINSIR), - EC_POKEMON2(PINSIR), + EC_POKEMON_NATIONAL(PINSIR), EC_WORD_PKRS, EC_WORD_PLACE, EC_WORD_PLANS, @@ -1238,15 +1240,15 @@ const u16 gEasyChatWordsByLetter_P[] = { EC_WORD_POKEDEX, EC_WORD_POKEMON, EC_WORD_POKENAV, - EC_POKEMON2(POLITOED), - EC_POKEMON2(POLIWAG), - EC_POKEMON2(POLIWHIRL), - EC_POKEMON2(POLIWRATH), - EC_POKEMON2(PONYTA), + EC_POKEMON_NATIONAL(POLITOED), + EC_POKEMON_NATIONAL(POLIWAG), + EC_POKEMON_NATIONAL(POLIWHIRL), + EC_POKEMON_NATIONAL(POLIWRATH), + EC_POKEMON_NATIONAL(PONYTA), EC_POKEMON(POOCHYENA), EC_WORD_POPULAR, - EC_POKEMON2(PORYGON), - EC_POKEMON2(PORYGON2), + EC_POKEMON_NATIONAL(PORYGON), + EC_POKEMON_NATIONAL(PORYGON2), EC_MOVE2(POUND), EC_MOVE(POWDER_SNOW), EC_WORD_POWER, @@ -1256,52 +1258,52 @@ const u16 gEasyChatWordsByLetter_P[] = { EC_WORD_PRESSURE, EC_WORD_PRETEND, EC_WORD_PRETTY, - EC_POKEMON2(PRIMEAPE), + EC_POKEMON_NATIONAL(PRIMEAPE), EC_WORD_PROBABLY, EC_WORD_PROMISE, EC_MOVE2(PROTECT), EC_MOVE(PSYBEAM), EC_MOVE(PSYCH_UP), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_WORD_PSYCHIC, EC_MOVE(PSYCHIC), EC_MOVE(PSYCHO_BOOST), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(PSYDUCK), - EC_POKEMON2(PSYDUCK), + EC_POKEMON_NATIONAL(PSYDUCK), EC_MOVE(PSYWAVE), - EC_POKEMON2(PUPITAR), + EC_POKEMON_NATIONAL(PUPITAR), EC_WORD_PURE_POWER, EC_MOVE(PURSUIT), EC_WORD_PUSHOVER, }; const u16 gEasyChatWordsByLetter_Q[] = { - EC_POKEMON2(QUAGSIRE), + EC_POKEMON_NATIONAL(QUAGSIRE), EC_WORD_QUESTION, EC_MOVE2(QUICK_ATTACK), - EC_POKEMON2(QUILAVA), + EC_POKEMON_NATIONAL(QUILAVA), EC_WORD_QUITE, - EC_POKEMON2(QWILFISH), + EC_POKEMON_NATIONAL(QWILFISH), }; const u16 gEasyChatWordsByLetter_R[] = { EC_WORD_RADIO, EC_MOVE(RAGE), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(RAICHU), - EC_POKEMON2(RAICHU), - EC_POKEMON2(RAIKOU), + EC_POKEMON_NATIONAL(RAICHU), + EC_POKEMON_NATIONAL(RAIKOU), EC_MOVE(RAIN_DANCE), EC_WORD_RAIN_DISH, EC_POKEMON(RALTS), EC_WORD_RANK, EC_MOVE(RAPID_SPIN), - EC_POKEMON2(RAPIDASH), + EC_POKEMON_NATIONAL(RAPIDASH), EC_WORD_RARE, EC_WORD_RATHER, - EC_POKEMON2(RATICATE), - EC_POKEMON2(RATTATA), + EC_POKEMON_NATIONAL(RATICATE), + EC_POKEMON_NATIONAL(RATTATA), EC_POKEMON(RAYQUAZA), EC_MOVE2(RAZOR_LEAF), EC_MOVE(RAZOR_WIND), @@ -1323,19 +1325,19 @@ const u16 gEasyChatWordsByLetter_R[] = { EC_WORD_REJECT, EC_WORD_RELEASE, EC_POKEMON(RELICANTH), - EC_POKEMON2(REMORAID), + EC_POKEMON_NATIONAL(REMORAID), EC_WORD_RENTAL, EC_MOVE2(REST), EC_WORD_RESUSCITATE, EC_MOVE(RETURN), EC_MOVE2(REVENGE), EC_MOVE(REVERSAL), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(RHYDON), - EC_POKEMON2(RHYDON), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(RHYDON), + DOUBLE_SPECIES_NAME EC_POKEMON(RHYHORN), - EC_POKEMON2(RHYHORN), + EC_POKEMON_NATIONAL(RHYHORN), EC_WORD_RIBBON, EC_WORD_RICKETY, EC_WORD_RIGHT, @@ -1377,12 +1379,12 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_MOVE(SAND_TOMB), EC_WORD_SAND_VEIL, EC_MOVE(SAND_ATTACK), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(SANDSHREW), - EC_POKEMON2(SANDSHREW), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(SANDSHREW), + DOUBLE_SPECIES_NAME EC_POKEMON(SANDSLASH), - EC_POKEMON2(SANDSLASH), + EC_POKEMON_NATIONAL(SANDSLASH), EC_MOVE(SANDSTORM), EC_WORD_SAPPHIRE, EC_WORD_SATISFIED, @@ -1393,16 +1395,16 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_WORD_SCATTER, EC_POKEMON(SCEPTILE), EC_WORD_SCHOOL, - EC_POKEMON2(SCIZOR), + EC_POKEMON_NATIONAL(SCIZOR), EC_MOVE2(SCRATCH), EC_MOVE(SCREECH), - EC_POKEMON2(SCYTHER), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(SCYTHER), + DOUBLE_SPECIES_NAME EC_POKEMON(SEADRA), - EC_POKEMON2(SEADRA), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(SEADRA), + DOUBLE_SPECIES_NAME EC_POKEMON(SEAKING), - EC_POKEMON2(SEAKING), + EC_POKEMON_NATIONAL(SEAKING), EC_POKEMON(SEALEO), EC_WORD_SEARCH, EC_WORD_SECRET, @@ -1412,13 +1414,13 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_WORD_SEE_YA, EC_POKEMON(SEEDOT), EC_WORD_SEEK, - EC_POKEMON2(SEEL), + EC_POKEMON_NATIONAL(SEEL), EC_WORD_SEEMS, EC_WORD_SEES, EC_MOVE2(SEISMIC_TOSS), EC_MOVE(SELF_DESTRUCT), EC_WORD_SENSE, - EC_POKEMON2(SENTRET), + EC_POKEMON_NATIONAL(SENTRET), EC_WORD_SERENE_GRACE, EC_WORD_SERIOUS, EC_WORD_SERIOUSLY, @@ -1441,7 +1443,7 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_MOVE(SHEER_COLD), EC_POKEMON(SHELGON), EC_WORD_SHELL_ARMOR, - EC_POKEMON2(SHELLDER), + EC_POKEMON_NATIONAL(SHELLDER), EC_WORD_SHIELD_DUST, EC_POKEMON(SHIFTRY), EC_WORD_SHINE, @@ -1452,7 +1454,7 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_WORD_SHOW, EC_WORD_SHREDDED, EC_POKEMON(SHROOMISH), - EC_POKEMON2(SHUCKLE), + EC_POKEMON_NATIONAL(SHUCKLE), EC_POKEMON(SHUPPET), EC_WORD_SIBLINGS, EC_WORD_SIGH, @@ -1466,14 +1468,14 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_MOVE(SING), EC_WORD_SINK, EC_WORD_SISTER, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(SKARMORY), - EC_POKEMON2(SKARMORY), + EC_POKEMON_NATIONAL(SKARMORY), EC_MOVE(SKETCH), EC_WORD_SKILL, EC_MOVE(SKILL_SWAP), EC_WORD_SKILLED, - EC_POKEMON2(SKIPLOOM), + EC_POKEMON_NATIONAL(SKIPLOOM), EC_POKEMON(SKITTY), EC_MOVE2(SKULL_BASH), EC_MOVE(SKY_ATTACK), @@ -1489,34 +1491,34 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_WORD_SLEPT, EC_WORD_SLIDE, EC_WORD_SLIMY, - EC_POKEMON2(SLOWBRO), - EC_POKEMON2(SLOWKING), - EC_POKEMON2(SLOWPOKE), + EC_POKEMON_NATIONAL(SLOWBRO), + EC_POKEMON_NATIONAL(SLOWKING), + EC_POKEMON_NATIONAL(SLOWPOKE), EC_MOVE2(SLUDGE), EC_MOVE2(SLUDGE_BOMB), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(SLUGMA), - EC_POKEMON2(SLUGMA), + EC_POKEMON_NATIONAL(SLUGMA), EC_WORD_SMACK, EC_WORD_SMALL, EC_WORD_SMART, EC_WORD_SMARTNESS, - EC_POKEMON2(SMEARGLE), + EC_POKEMON_NATIONAL(SMEARGLE), EC_WORD_SMELL, EC_WORD_SMELL_YA, EC_MOVE(SMELLING_SALT), EC_WORD_SMITE, EC_MOVE(SMOG), EC_MOVE(SMOKESCREEN), - EC_POKEMON2(SMOOCHUM), + EC_POKEMON_NATIONAL(SMOOCHUM), EC_WORD_SMOOTH, EC_MOVE2(SNATCH), - EC_POKEMON2(SNEASEL), + EC_POKEMON_NATIONAL(SNEASEL), EC_MOVE(SNORE), - EC_POKEMON2(SNORLAX), + EC_POKEMON_NATIONAL(SNORLAX), EC_WORD_SNORT, EC_POKEMON(SNORUNT), - EC_POKEMON2(SNUBBULL), + EC_POKEMON_NATIONAL(SNUBBULL), EC_WORD_SO, EC_MOVE2(SOFT_BOILED), EC_WORD_SOFTWARE, @@ -1536,14 +1538,14 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_WORD_SOUNDPROOF, EC_WORD_SP_ABILITY, EC_MOVE(SPARK), - EC_POKEMON2(SPEAROW), + EC_POKEMON_NATIONAL(SPEAROW), EC_WORD_SPECTATOR, EC_WORD_SPEED_BOOST, EC_POKEMON(SPHEAL), EC_MOVE(SPIDER_WEB), EC_MOVE2(SPIKE_CANNON), EC_MOVE2(SPIKES), - EC_POKEMON2(SPINARAK), + EC_POKEMON_NATIONAL(SPINARAK), EC_POKEMON(SPINDA), EC_WORD_SPIRALING, EC_WORD_SPIRIT, @@ -1554,21 +1556,21 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_MOVE(SPORE), EC_WORD_SPORTS, EC_WORD_SPRING, - EC_POKEMON2(SQUIRTLE), + EC_POKEMON_NATIONAL(SQUIRTLE), EC_WORD_STAGE, - EC_POKEMON2(STANTLER), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(STANTLER), + DOUBLE_SPECIES_NAME EC_POKEMON(STARMIE), - EC_POKEMON2(STARMIE), + EC_POKEMON_NATIONAL(STARMIE), EC_WORD_START, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(STARYU), - EC_POKEMON2(STARYU), + EC_POKEMON_NATIONAL(STARYU), EC_WORD_STATIC, EC_WORD_STAY_AT_HOME, EC_WORD_STEEL, EC_MOVE2(STEEL_WING), - EC_POKEMON2(STEELIX), + EC_POKEMON_NATIONAL(STEELIX), EC_WORD_STENCH, EC_WORD_STICKY_HOLD, EC_MOVE2(STOCKPILE), @@ -1588,12 +1590,12 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_MOVE(SUBMISSION), EC_MOVE2(SUBSTITUTE), EC_WORD_SUCTION_CUPS, - EC_POKEMON2(SUDOWOODO), - EC_POKEMON2(SUICUNE), + EC_POKEMON_NATIONAL(SUDOWOODO), + EC_POKEMON_NATIONAL(SUICUNE), EC_WORD_SUMMER, EC_WORD_SUNDAY, - EC_POKEMON2(SUNFLORA), - EC_POKEMON2(SUNKERN), + EC_POKEMON_NATIONAL(SUNFLORA), + EC_POKEMON_NATIONAL(SUNKERN), EC_MOVE2(SUNNY_DAY), EC_WORD_SUPER, EC_MOVE(SUPER_FANG), @@ -1615,7 +1617,7 @@ const u16 gEasyChatWordsByLetter_S[] = { EC_POKEMON(SWELLOW), EC_MOVE(SWIFT), EC_WORD_SWIFT_SWIM, - EC_POKEMON2(SWINUB), + EC_POKEMON_NATIONAL(SWINUB), EC_MOVE2(SWORDS_DANCE), EC_WORD_SYNCHRONIZE, EC_MOVE(SYNTHESIS), @@ -1633,24 +1635,24 @@ const u16 gEasyChatWordsByLetter_T[] = { EC_WORD_TALENT, EC_WORD_TALK, EC_WORD_TALKING, - EC_POKEMON2(TANGELA), + EC_POKEMON_NATIONAL(TANGELA), EC_WORD_TASTY, EC_MOVE2(TAUNT), - EC_POKEMON2(TAUROS), + EC_POKEMON_NATIONAL(TAUROS), EC_WORD_TCH, EC_WORD_TEACH, EC_WORD_TEACHER, EC_WORD_TEACHES, - EC_POKEMON2(TEDDIURSA), + EC_POKEMON_NATIONAL(TEDDIURSA), EC_MOVE2(TEETER_DANCE), EC_MOVE2(TELEPORT), EC_WORD_TELEVISION, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(TENTACOOL), - EC_POKEMON2(TENTACOOL), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(TENTACOOL), + DOUBLE_SPECIES_NAME EC_POKEMON(TENTACRUEL), - EC_POKEMON2(TENTACRUEL), + EC_POKEMON_NATIONAL(TENTACRUEL), EC_WORD_TERRIBLE, EC_WORD_TEST, EC_WORD_THAN, @@ -1704,9 +1706,9 @@ const u16 gEasyChatWordsByLetter_T[] = { EC_WORD_TO_US, EC_WORD_TO_WHOM, EC_WORD_TODAY, - EC_POKEMON2(TOGEPI), + EC_POKEMON_NATIONAL(TOGEPI), EC_WORD_TOGETHER, - EC_POKEMON2(TOGETIC), + EC_POKEMON_NATIONAL(TOGETIC), EC_WORD_TOMORROW, EC_WORD_TOO, EC_WORD_TOO_LATE, @@ -1718,7 +1720,7 @@ const u16 gEasyChatWordsByLetter_T[] = { EC_MOVE(TORMENT), EC_WORD_TORRENT, EC_WORD_TOTALLY, - EC_POKEMON2(TOTODILE), + EC_POKEMON_NATIONAL(TOTODILE), EC_WORD_TOUGH, EC_WORD_TOUGHNESS, EC_WORD_TOURNAMENT, @@ -1751,9 +1753,9 @@ const u16 gEasyChatWordsByLetter_T[] = { EC_WORD_TWIRLING, EC_MOVE2(TWISTER), EC_WORD_TYPE, - EC_POKEMON2(TYPHLOSION), - EC_POKEMON2(TYRANITAR), - EC_POKEMON2(TYROGUE), + EC_POKEMON_NATIONAL(TYPHLOSION), + EC_POKEMON_NATIONAL(TYRANITAR), + EC_POKEMON_NATIONAL(TYROGUE), }; const u16 gEasyChatWordsByLetter_U[] = { @@ -1761,7 +1763,7 @@ const u16 gEasyChatWordsByLetter_U[] = { EC_WORD_UH_HUH, EC_WORD_UH_OH, EC_WORD_UM, - EC_POKEMON2(UMBREON), + EC_POKEMON_NATIONAL(UMBREON), EC_WORD_UNAVOIDABLE, EC_WORD_UNBELIEVABLE, EC_WORD_UNCLE, @@ -1769,14 +1771,14 @@ const u16 gEasyChatWordsByLetter_U[] = { EC_WORD_UNDERSTANDS, EC_WORD_UNDERSTOOD, EC_WORD_UNION, - EC_POKEMON2(UNOWN), + EC_POKEMON_NATIONAL(UNOWN), EC_WORD_UNTIL, EC_WORD_UP, EC_WORD_UPBEAT, EC_MOVE(UPROAR), EC_WORD_UPSIDE_DOWN, EC_WORD_URGH, - EC_POKEMON2(URSARING), + EC_POKEMON_NATIONAL(URSARING), EC_WORD_USE, EC_WORD_USELESS, EC_WORD_USES, @@ -1785,35 +1787,35 @@ const u16 gEasyChatWordsByLetter_U[] = { const u16 gEasyChatWordsByLetter_V[] = { EC_WORD_VACATION, - EC_POKEMON2(VAPOREON), - EC_POKEMON2(VENOMOTH), - EC_POKEMON2(VENONAT), - EC_POKEMON2(VENUSAUR), + EC_POKEMON_NATIONAL(VAPOREON), + EC_POKEMON_NATIONAL(VENOMOTH), + EC_POKEMON_NATIONAL(VENONAT), + EC_POKEMON_NATIONAL(VENUSAUR), EC_WORD_VERSION, EC_WORD_VERSUS, EC_WORD_VERY, EC_POKEMON(VIBRAVA), EC_MOVE2(VICE_GRIP), EC_WORD_VICTORY, - EC_POKEMON2(VICTREEBEL), + EC_POKEMON_NATIONAL(VICTREEBEL), EC_WORD_VIEWING, EC_POKEMON(VIGOROTH), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(VILEPLUME), - EC_POKEMON2(VILEPLUME), + EC_POKEMON_NATIONAL(VILEPLUME), EC_MOVE2(VINE_WHIP), EC_WORD_VITAL_SPIRIT, EC_MOVE(VITAL_THROW), EC_POKEMON(VOLBEAT), EC_WORD_VOLT_ABSORB, EC_MOVE2(VOLT_TACKLE), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(VOLTORB), - EC_POKEMON2(VOLTORB), + EC_POKEMON_NATIONAL(VOLTORB), EC_WORD_VORACIOUS, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(VULPIX), - EC_POKEMON2(VULPIX), + EC_POKEMON_NATIONAL(VULPIX), }; const u16 gEasyChatWordsByLetter_W[] = { @@ -1832,7 +1834,7 @@ const u16 gEasyChatWordsByLetter_W[] = { EC_WORD_WANNABE, EC_WORD_WANT, EC_WORD_WANTS, - EC_POKEMON2(WARTORTLE), + EC_POKEMON_NATIONAL(WARTORTLE), EC_WORD_WAS, EC_WORD_WASN_T, EC_WORD_WATER, @@ -1851,12 +1853,12 @@ const u16 gEasyChatWordsByLetter_W[] = { EC_WORD_WEAKENED, EC_MOVE(WEATHER_BALL), EC_WORD_WEDNESDAY, - EC_POKEMON2(WEEDLE), + EC_POKEMON_NATIONAL(WEEDLE), EC_WORD_WEEK, - EC_POKEMON2(WEEPINBELL), - -1, 2, // Doubled pokemon species name + EC_POKEMON_NATIONAL(WEEPINBELL), + DOUBLE_SPECIES_NAME EC_POKEMON(WEEZING), - EC_POKEMON2(WEEZING), + EC_POKEMON_NATIONAL(WEEZING), EC_WORD_WEIRD, EC_WORD_WELCOME, EC_WORD_WELL, @@ -1883,9 +1885,9 @@ const u16 gEasyChatWordsByLetter_W[] = { EC_WORD_WHOM, EC_WORD_WHOSE, EC_WORD_WHY, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(WIGGLYTUFF), - EC_POKEMON2(WIGGLYTUFF), + EC_POKEMON_NATIONAL(WIGGLYTUFF), EC_WORD_WILD, EC_WORD_WILL, EC_WORD_WILL_BE_HERE, @@ -1903,15 +1905,15 @@ const u16 gEasyChatWordsByLetter_W[] = { EC_MOVE(WITHDRAW), EC_WORD_WITHOUT, EC_WORD_WOBBLY, - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(WOBBUFFET), - EC_POKEMON2(WOBBUFFET), + EC_POKEMON_NATIONAL(WOBBUFFET), EC_WORD_WOMAN, EC_WORD_WON, EC_WORD_WON_T, EC_WORD_WONDER, EC_WORD_WONDER_GUARD, - EC_POKEMON2(WOOPER), + EC_POKEMON_NATIONAL(WOOPER), EC_WORD_WORD, EC_WORD_WORK, EC_WORD_WORKING, @@ -1928,14 +1930,14 @@ const u16 gEasyChatWordsByLetter_W[] = { }; const u16 gEasyChatWordsByLetter_X[] = { - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(XATU), - EC_POKEMON2(XATU), + EC_POKEMON_NATIONAL(XATU), }; const u16 gEasyChatWordsByLetter_Y[] = { EC_WORD_YAHOO, - EC_POKEMON2(YANMA), + EC_POKEMON_NATIONAL(YANMA), EC_MOVE(YAWN), EC_WORD_YAY, EC_WORD_YEAH, @@ -1958,59 +1960,59 @@ const u16 gEasyChatWordsByLetter_Y[] = { const u16 gEasyChatWordsByLetter_Z[] = { EC_POKEMON(ZANGOOSE), EC_MOVE2(ZAP_CANNON), - EC_POKEMON2(ZAPDOS), + EC_POKEMON_NATIONAL(ZAPDOS), EC_POKEMON(ZIGZAGOON), - -1, 2, // Doubled pokemon species name + DOUBLE_SPECIES_NAME EC_POKEMON(ZUBAT), - EC_POKEMON2(ZUBAT), + EC_POKEMON_NATIONAL(ZUBAT), }; const u16 gEasyChatWordsByLetter_UnusedJapaneseHi[] = { - EC_POKEMON2(CLEFFA), + EC_POKEMON_NATIONAL(CLEFFA), EC_WORD_AIYEEH, - EC_POKEMON2(WEEDLE), + EC_POKEMON_NATIONAL(WEEDLE), EC_WORD_HERO, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(PIKACHU), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(PIKACHU), EC_POKEMON(PIKACHU), EC_MOVE2(LIGHT_SCREEN), EC_WORD_SHINE, EC_WORD_LOW, - EC_POKEMON2(CLEFABLE), + EC_POKEMON_NATIONAL(CLEFABLE), EC_WORD_FLYING, - EC_POKEMON2(PIDGEOT), - EC_POKEMON2(PIDGEOTTO), + EC_POKEMON_NATIONAL(PIDGEOT), + EC_POKEMON_NATIONAL(PIDGEOTTO), EC_WORD_LEFT, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(PICHU), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(PICHU), EC_POKEMON(PICHU), EC_MOVE2(SCRATCH), EC_WORD_SURPRISE, EC_MOVE2(HYPER_FANG), - EC_POKEMON2(CLEFAIRY), + EC_POKEMON_NATIONAL(CLEFAIRY), EC_WORD_DROUGHT, EC_WORD_HIDDEN, EC_WORD_PERSON, EC_WORD_AWFUL, - EC_POKEMON2(CHARMANDER), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(STARYU), + EC_POKEMON_NATIONAL(CHARMANDER), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(STARYU), EC_POKEMON(STARYU), EC_WORD_ALONE, - EC_POKEMON2(CYNDAQUIL), + EC_POKEMON_NATIONAL(CYNDAQUIL), EC_MOVE2(EMBER), EC_POKEMON(VIBRAVA), EC_WORD_BORED, - EC_POKEMON2(SUNKERN), + EC_POKEMON_NATIONAL(SUNKERN), EC_WORD_SECRET, EC_WORD_SECRET_BASE, EC_MOVE2(SECRET_POWER), - EC_POKEMON2(TEDDIURSA), + EC_POKEMON_NATIONAL(TEDDIURSA), EC_WORD_HIYAH, EC_MOVE2(DIZZY_PUNCH), EC_WORD_LIGHTNINGROD, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(VOLTORB), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(VOLTORB), EC_POKEMON(VOLTORB), EC_WORD_DAYTIME, EC_MOVE2(BULK_UP), @@ -2021,42 +2023,42 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseHi[] = { const u16 gEasyChatWordsByLetter_UnusedJapaneseFu[] = { EC_WORD_FIGHT, - EC_POKEMON2(MOLTRES), + EC_POKEMON_NATIONAL(MOLTRES), EC_WORD_FASHION, EC_WORD_FEAR, EC_WORD_FEVER, EC_MOVE2(IMPRISON), - EC_POKEMON2(FLAREON), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(ALAKAZAM), + EC_POKEMON_NATIONAL(FLAREON), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(ALAKAZAM), EC_POKEMON(ALAKAZAM), - EC_POKEMON2(MAGMAR), + EC_POKEMON_NATIONAL(MAGMAR), EC_POKEMON(GRUMPIG), EC_MOVE2(FEATHER_DANCE), - EC_POKEMON2(FORRETRESS), + EC_POKEMON_NATIONAL(FORRETRESS), EC_MOVE2(WHIRLWIND), EC_WORD_COMPOUNDEYES, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(WIGGLYTUFF), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(WIGGLYTUFF), EC_POKEMON(WIGGLYTUFF), EC_MOVE2(BEAT_UP), EC_WORD_MYSTERY, - EC_POKEMON2(IVYSAUR), - EC_POKEMON2(BULBASAUR), + EC_POKEMON_NATIONAL(IVYSAUR), + EC_POKEMON_NATIONAL(BULBASAUR), EC_WORD_MARVEL_SCALE, EC_WORD_WONDER_GUARD, - EC_POKEMON2(VENUSAUR), + EC_POKEMON_NATIONAL(VENUSAUR), EC_WORD_LACKS, EC_WORD_RESUSCITATE, EC_WORD_SMACK, EC_WORD_FUFUFU, - EC_POKEMON2(AERODACTYL), + EC_POKEMON_NATIONAL(AERODACTYL), EC_WORD_WIMPY, - EC_POKEMON2(MAGBY), + EC_POKEMON_NATIONAL(MAGBY), EC_WORD_LOL, EC_MOVE2(BLIZZARD), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(IGGLYBUFF), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(IGGLYBUFF), EC_POKEMON(IGGLYBUFF), EC_WORD_SNORT, EC_MOVE2(STOMP), @@ -2067,17 +2069,17 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseFu[] = { EC_WORD_PLUS, EC_MOVE2(BLAST_BURN), EC_POKEMON(PLUSLE), - EC_POKEMON2(UMBREON), + EC_POKEMON_NATIONAL(UMBREON), EC_MOVE2(FLASH), EC_WORD_WOBBLY, EC_MOVE2(TEETER_DANCE), EC_WORD_PRETEND, - EC_POKEMON2(ARTICUNO), + EC_POKEMON_NATIONAL(ARTICUNO), EC_WORD_WANNABE, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(JIGGLYPUFF), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(JIGGLYPUFF), EC_POKEMON(JIGGLYPUFF), - EC_POKEMON2(SNUBBULL), + EC_POKEMON_NATIONAL(SNUBBULL), EC_WORD_SHAKY, EC_MOVE2(CRUSH_CLAW), EC_MOVE2(BLAZE_KICK), @@ -2093,29 +2095,29 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseHe[] = { EC_WORD_HEY, EC_POKEMON(CORPHISH), EC_WORD_BABY, - EC_POKEMON2(BAYLEEF), + EC_POKEMON_NATIONAL(BAYLEEF), EC_WORD_BEST, EC_WORD_LOUSY, EC_WORD_HEHEHE, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(GRIMER), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(GRIMER), EC_POKEMON(GRIMER), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(MUK), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(MUK), EC_POKEMON(MUK), EC_WORD_LIQUID_OOZE, EC_MOVE2(SLUDGE), EC_MOVE2(SLUDGE_BOMB), EC_MOVE2(GLARE), EC_WORD_HEH, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(HERACROSS), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(HERACROSS), EC_POKEMON(HERACROSS), EC_POKEMON(PELIPPER), - EC_POKEMON2(HOUNDOOM), - EC_POKEMON2(PERSIAN), + EC_POKEMON_NATIONAL(HOUNDOOM), + EC_POKEMON_NATIONAL(PERSIAN), EC_WORD_RIPPED, - EC_POKEMON2(LICKITUNG), + EC_POKEMON_NATIONAL(LICKITUNG), EC_WORD_STUDY, EC_WORD_COLOR_CHANGE, EC_MOVE2(TRANSFORM), @@ -2124,7 +2126,7 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseHe[] = { const u16 gEasyChatWordsByLetter_UnusedJapaneseHo[] = { EC_MOVE2(POISON_TAIL), EC_WORD_POINTS, - EC_POKEMON2(HO_OH), + EC_POKEMON_NATIONAL(HO_OH), EC_WORD_SOUNDPROOF, EC_WORD_ADVENTURE, EC_WORD_EFFECT_SPORE, @@ -2133,7 +2135,7 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseHo[] = { EC_POKEMON(WAILMER), EC_WORD_DUDE, EC_WORD_BOARD, - EC_POKEMON2(HOOTHOOT), + EC_POKEMON_NATIONAL(HOOTHOOT), EC_POKEMON(SALAMENCE), EC_WORD_BALL, EC_MOVE2(BONE_RUSH), @@ -2154,21 +2156,21 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseHo[] = { EC_POKEMON(AGGRON), EC_MOVE2(TAIL_GLOW), EC_POKEMON(POOCHYENA), - EC_POKEMON2(PIDGEY), + EC_POKEMON_NATIONAL(PIDGEY), EC_WORD_AS_MUCH_AS, - EC_POKEMON2(PONYTA), + EC_POKEMON_NATIONAL(PONYTA), EC_MOVE2(BONE_CLUB), EC_MOVE2(BONEMERANG), EC_WORD_FIRE, EC_MOVE2(FIRE_SPIN), EC_WORD_FLAME_BODY, EC_MOVE2(FIRE_PUNCH), - EC_POKEMON2(SKIPLOOM), + EC_POKEMON_NATIONAL(SKIPLOOM), EC_WORD_HOHOHO, EC_WORD_PRAISE, EC_WORD_UH_HUH, - EC_POKEMON2(PORYGON), - EC_POKEMON2(PORYGON2), + EC_POKEMON_NATIONAL(PORYGON), + EC_POKEMON_NATIONAL(PORYGON2), EC_MOVE2(VOLT_TACKLE), EC_WORD_POKEBLOCK, EC_MOVE2(PERISH_SONG), @@ -2189,16 +2191,16 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMa[] = { EC_WORD_OWN_TEMPO, EC_MOVE2(WRAP), EC_MOVE2(SPIKES), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(MAGCARGO), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(MAGCARGO), EC_POKEMON(MAGCARGO), EC_MOVE2(MAGNITUDE), EC_POKEMON(MAKUHITA), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(SLUGMA), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(SLUGMA), EC_POKEMON(SLUGMA), EC_WORD_MAGMA_ARMOR, - EC_POKEMON2(QUILAVA), + EC_POKEMON_NATIONAL(QUILAVA), EC_WORD_OVERDO, EC_WORD_LOSS, EC_WORD_IF_I_LOSE, @@ -2214,9 +2216,9 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMa[] = { EC_WORD_INCREASING, EC_WORD_TOO, EC_WORD_LIKE, - EC_POKEMON2(BELLSPROUT), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(WEEZING), + EC_POKEMON_NATIONAL(BELLSPROUT), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(WEEZING), EC_POKEMON(WEEZING), EC_WORD_SMELL, EC_WORD_YET, @@ -2231,23 +2233,23 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMa[] = { EC_WORD_GUARD, EC_MOVE2(PROTECT), EC_POKEMON(CASCOON), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(MARILL), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(MARILL), EC_POKEMON(MARILL), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(AZUMARILL), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(AZUMARILL), EC_POKEMON(AZUMARILL), EC_MOVE2(DEFENSE_CURL), EC_WORD_AS_IF, EC_POKEMON(SWALOT), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(ELECTRODE), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(ELECTRODE), EC_POKEMON(ELECTRODE), EC_MOVE2(ROLLING_KICK), EC_WORD_COMICS, - EC_POKEMON2(MANKEY), + EC_POKEMON_NATIONAL(MANKEY), EC_WORD_SATISFIED, - EC_POKEMON2(MANTINE), + EC_POKEMON_NATIONAL(MANTINE), }; const u16 gEasyChatWordsByLetter_UnusedJapaneseMi[] = { @@ -2272,16 +2274,16 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMi[] = { EC_WORD_LOOKS, EC_WORD_REJECT, EC_WORD_ACCEPT, - EC_POKEMON2(DRATINI), + EC_POKEMON_NATIONAL(DRATINI), EC_MOVE2(FALSE_SWIPE), EC_MOVE2(FORESIGHT), - EC_POKEMON2(MEW), - EC_POKEMON2(MEWTWO), + EC_POKEMON_NATIONAL(MEW), + EC_POKEMON_NATIONAL(MEWTWO), EC_MOVE2(MIRROR_COAT), EC_MOVE2(FUTURE_SIGHT), EC_WORD_SEES, EC_MOVE2(MILK_DRINK), - EC_POKEMON2(MILTANK), + EC_POKEMON_NATIONAL(MILTANK), EC_POKEMON(MILOTIC), EC_WORD_WE, EC_WORD_BEEN, @@ -2292,13 +2294,13 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMi[] = { const u16 gEasyChatWordsByLetter_UnusedJapaneseMu[] = { EC_WORD_MOOD, - EC_POKEMON2(MISDREAVUS), + EC_POKEMON_NATIONAL(MISDREAVUS), EC_WORD_OLDEN, EC_WORD_ARRGH, EC_WORD_BUG, EC_WORD_SWARM, EC_WORD_RATHER, - EC_POKEMON2(SMOOCHUM), + EC_POKEMON_NATIONAL(SMOOCHUM), EC_WORD_INVINCIBLE, EC_WORD_HEART, EC_WORD_MUFUFU, @@ -2311,23 +2313,23 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMe[] = { EC_MOVE2(MEGA_DRAIN), EC_MOVE2(MEGA_KICK), EC_MOVE2(MEGA_PUNCH), - EC_POKEMON2(MEGANIUM), + EC_POKEMON_NATIONAL(MEGANIUM), EC_MOVE2(MEGAHORN), EC_WORD_SEEK, EC_MOVE2(HIDDEN_POWER), EC_WORD_RARE, EC_POKEMON(METAGROSS), - EC_POKEMON2(DITTO), + EC_POKEMON_NATIONAL(DITTO), EC_MOVE2(METAL_CLAW), EC_POKEMON(METANG), EC_WORD_DESTROYED, EC_WORD_MESSAGE, EC_WORD_AWFULLY, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(TENTACOOL), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(TENTACOOL), EC_POKEMON(TENTACOOL), EC_WORD_FIERY, - EC_POKEMON2(MAREEP), + EC_POKEMON_NATIONAL(MAREEP), EC_MOVE2(ATTRACT), EC_WORD_CUTE_CHARM, EC_WORD_IMMUNITY, @@ -2340,7 +2342,7 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMo[] = { EC_WORD_MODE, EC_WORD_OLD, EC_WORD_THURSDAY, - EC_POKEMON2(FLAAFFY), + EC_POKEMON_NATIONAL(FLAAFFY), EC_WORD_LISTENING, EC_WORD_OWN, EC_WORD_MORE, @@ -2351,9 +2353,9 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseMo[] = { EC_WORD_PATTERN, EC_WORD_FLASH_FIRE, EC_WORD_RECEIVED, - EC_POKEMON2(VENOMOTH), + EC_POKEMON_NATIONAL(VENOMOTH), EC_WORD_DOESN_T, - EC_POKEMON2(TANGELA), + EC_POKEMON_NATIONAL(TANGELA), }; const u16 gEasyChatWordsByLetter_UnusedJapaneseYa[] = { @@ -2368,19 +2370,19 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseYa[] = { EC_WORD_FINALLY, EC_WORD_ANY, EC_WORD_YAHOO, - EC_POKEMON2(SLOWKING), - EC_POKEMON2(SLOWBRO), + EC_POKEMON_NATIONAL(SLOWKING), + EC_POKEMON_NATIONAL(SLOWBRO), EC_MOVE2(LEECH_SEED), - EC_POKEMON2(SLOWPOKE), + EC_POKEMON_NATIONAL(SLOWPOKE), EC_WORD_DANGER, - EC_POKEMON2(MURKROW), + EC_POKEMON_NATIONAL(MURKROW), EC_POKEMON(SABLEYE), EC_WORD_DEFEATED, EC_WORD_BEAT, EC_WORD_VITAL_SPIRIT, EC_POKEMON(VIGOROTH), EC_WORD_YOUNG, - EC_POKEMON2(YANMA), + EC_POKEMON_NATIONAL(YANMA), }; const u16 gEasyChatWordsByLetter_UnusedJapaneseYu[] = { @@ -2393,8 +2395,8 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseYu[] = { EC_WORD_ALLOW, EC_WORD_FORGET, EC_POKEMON(CRADILY), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(KADABRA), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(KADABRA), EC_POKEMON(KADABRA), }; @@ -2406,7 +2408,7 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseYo[] = { EC_WORD_KINDERGARTEN, EC_WORD_CHLOROPHYLL, EC_WORD_AFTER, - EC_POKEMON2(LARVITAR), + EC_POKEMON_NATIONAL(LARVITAR), EC_WORD_OH_KAY, EC_WORD_BEFORE, EC_WORD_GREAT, @@ -2422,7 +2424,7 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseYo[] = { EC_WORD_EASY, EC_WORD_INSTEAD, EC_WORD_NIGHT, - EC_POKEMON2(NOCTOWL), + EC_POKEMON_NATIONAL(NOCTOWL), EC_WORD_COUNT_ON, EC_WORD_WEAK, EC_WORD_TOO_WEAK, @@ -2430,10 +2432,10 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseYo[] = { }; const u16 gEasyChatWordsByLetter_UnusedJapaneseRa[] = { - EC_POKEMON2(RAIKOU), + EC_POKEMON_NATIONAL(RAIKOU), EC_WORD_WEEK, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(RAICHU), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(RAICHU), EC_POKEMON(RAICHU), EC_WORD_RIVAL, EC_WORD_LIFE, @@ -2445,31 +2447,31 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseRa[] = { EC_WORD_SEEMS, EC_WORD_RADIO, EC_MOVE2(LUSTER_PURGE), - EC_POKEMON2(CHANSEY), - EC_POKEMON2(RATICATE), + EC_POKEMON_NATIONAL(CHANSEY), + EC_POKEMON_NATIONAL(RATICATE), EC_POKEMON(LATIAS), EC_POKEMON(LATIOS), EC_POKEMON(LUVDISC), - EC_POKEMON2(LAPRAS), + EC_POKEMON_NATIONAL(LAPRAS), EC_WORD_LOVEY_DOVEY, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(VILEPLUME), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(VILEPLUME), EC_POKEMON(VILEPLUME), EC_WORD_LALALA, EC_POKEMON(RALTS), EC_WORD_FORGETS, EC_WORD_APPEARS, EC_WORD_RANK, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(LANTURN), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(LANTURN), EC_POKEMON(LANTURN), }; const u16 gEasyChatWordsByLetter_UnusedJapaneseRi[] = { EC_WORD_LEADER, EC_MOVE2(LEAF_BLADE), - EC_POKEMON2(CHARMELEON), - EC_POKEMON2(CHARIZARD), + EC_POKEMON_NATIONAL(CHARMELEON), + EC_POKEMON_NATIONAL(CHARIZARD), EC_MOVE2(RECYCLE), EC_MOVE2(REFLECT), EC_MOVE2(REFRESH), @@ -2481,15 +2483,15 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseRi[] = { EC_MOVE2(DRAGON_DANCE), EC_WORD_VACATION, EC_POKEMON(LILEEP), - EC_POKEMON2(URSARING), + EC_POKEMON_NATIONAL(URSARING), EC_WORD_SHIELD_DUST, }; const u16 gEasyChatWordsByLetter_UnusedJapaneseRu[] = { - EC_POKEMON2(JYNX), + EC_POKEMON_NATIONAL(JYNX), EC_WORD_ROOM, EC_WORD_RULE, - EC_POKEMON2(LUGIA), + EC_POKEMON_NATIONAL(LUGIA), EC_WORD_LOOK, EC_POKEMON(LUNATONE), EC_WORD_RUBY, @@ -2500,8 +2502,8 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseRu[] = { }; const u16 gEasyChatWordsByLetter_UnusedJapaneseRe[] = { - -1, 2, // Doubled pokemon species name - EC_POKEMON2(MAGNETON), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(MAGNETON), EC_POKEMON(MAGNETON), EC_MOVE2(ICE_PUNCH), EC_MOVE2(ICE_BEAM), @@ -2510,8 +2512,8 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseRe[] = { EC_POKEMON(REGIROCK), EC_POKEMON(RAYQUAZA), EC_WORD_UGLY, - EC_POKEMON2(LEDIAN), - EC_POKEMON2(LEDYBA), + EC_POKEMON_NATIONAL(LEDIAN), + EC_POKEMON_NATIONAL(LEDYBA), EC_WORD_FANTASTIC, EC_WORD_LEVEL, EC_MOVE2(FURY_CUTTER), @@ -2521,8 +2523,8 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseRe[] = { const u16 gEasyChatWordsByLetter_UnusedJapaneseRo[] = { EC_MOVE2(SKULL_BASH), - -1, 2, // Doubled pokemon species name - EC_POKEMON2(VULPIX), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(VULPIX), EC_POKEMON(VULPIX), EC_POKEMON(ROSELIA), EC_MOVE2(LOCK_ON), @@ -2553,198 +2555,198 @@ const u16 gEasyChatWordsByLetter_UnusedJapaneseWa[] = { EC_WORD_HERS, EC_WORD_SHE_IS, EC_WORD_SOME, - EC_POKEMON2(JUMPLUFF), + EC_POKEMON_NATIONAL(JUMPLUFF), EC_MOVE2(COTTON_SPORE), EC_WORD_GWAH, - EC_POKEMON2(TOTODILE), + EC_POKEMON_NATIONAL(TOTODILE), EC_WORD_WAHAHAHA, EC_WORD_ANYWHERE, EC_MOVE2(STRUGGLE), EC_WORD_BADLY, - -1, 2, // Doubled pokemon species name - EC_POKEMON2(MACHOP), + DOUBLE_SPECIES_NAME + EC_POKEMON_NATIONAL(MACHOP), EC_POKEMON(MACHOP), }; -const struct EasyChatWordsByLetter gEasyChatWordsByLetterPointers[] = { +const struct EasyChatWordsByLetter gEasyChatWordsByLetterPointers[EC_NUM_ALPHABET_GROUPS + 18] = { // 18 unused JP groups { .words = gEasyChatWordsByLetter_Others, - .numWords = 10, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_Others), }, { .words = gEasyChatWordsByLetter_A, - .numWords = 106, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_A), }, { .words = gEasyChatWordsByLetter_B, - .numWords = 86, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_B), }, { .words = gEasyChatWordsByLetter_C, - .numWords = 119, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_C), }, { .words = gEasyChatWordsByLetter_D, - .numWords = 94, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_D), }, { .words = gEasyChatWordsByLetter_E, - .numWords = 59, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_E), }, { .words = gEasyChatWordsByLetter_F, - .numWords = 80, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_F), }, { .words = gEasyChatWordsByLetter_G, - .numWords = 98, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_G), }, { .words = gEasyChatWordsByLetter_H, - .numWords = 101, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_H), }, { .words = gEasyChatWordsByLetter_I, - .numWords = 48, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_I), }, { .words = gEasyChatWordsByLetter_J, - .numWords = 13, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_J), }, { .words = gEasyChatWordsByLetter_K, - .numWords = 33, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_K), }, { .words = gEasyChatWordsByLetter_L, - .numWords = 82, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_L), }, { .words = gEasyChatWordsByLetter_M, - .numWords = 142, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_M), }, { .words = gEasyChatWordsByLetter_N, - .numWords = 54, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_N), }, { .words = gEasyChatWordsByLetter_O, - .numWords = 44, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_O), }, { .words = gEasyChatWordsByLetter_P, - .numWords = 102, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_P), }, { .words = gEasyChatWordsByLetter_Q, - .numWords = 6, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_Q), }, { .words = gEasyChatWordsByLetter_R, - .numWords = 80, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_R), }, { .words = gEasyChatWordsByLetter_S, - .numWords = 262, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_S), }, { .words = gEasyChatWordsByLetter_T, - .numWords = 133, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_T), }, { .words = gEasyChatWordsByLetter_U, - .numWords = 24, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_U), }, { .words = gEasyChatWordsByLetter_V, - .numWords = 33, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_V), }, { .words = gEasyChatWordsByLetter_W, - .numWords = 111, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_W), }, { .words = gEasyChatWordsByLetter_X, - .numWords = 4, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_X), }, { .words = gEasyChatWordsByLetter_Y, - .numWords = 19, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_Y), }, { .words = gEasyChatWordsByLetter_Z, - .numWords = 8, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_Z), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseHi, - .numWords = 55, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseHi), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseFu, - .numWords = 71, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseFu), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseHe, - .numWords = 32, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseHe), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseHo, - .numWords = 55, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseHo), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseMa, - .numWords = 74, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseMa), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseMi, - .numWords = 37, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseMi), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseMu, - .numWords = 12, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseMu), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseMe, - .numWords = 26, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseMe), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseMo, - .numWords = 20, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseMo), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseYa, - .numWords = 24, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseYa), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseYu, - .numWords = 13, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseYu), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseYo, - .numWords = 28, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseYo), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseRa, - .numWords = 36, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseRa), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseRi, - .numWords = 17, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseRi), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseRu, - .numWords = 11, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseRu), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseRe, - .numWords = 18, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseRe), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseRo, - .numWords = 10, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseRo), }, { .words = gEasyChatWordsByLetter_UnusedJapaneseWa, - .numWords = 33, + .numWords = ARRAY_COUNT(gEasyChatWordsByLetter_UnusedJapaneseWa), }, }; diff --git a/src/data/field_effects/field_effect_objects.h b/src/data/field_effects/field_effect_objects.h index 4fc3ecff6..54145efbc 100755 --- a/src/data/field_effects/field_effect_objects.h +++ b/src/data/field_effects/field_effect_objects.h @@ -1263,16 +1263,16 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle = { const struct SpritePalette gSpritePalette_SmallSparkle = {gFieldEffectPal_SmallSparkle, FLDEFF_PAL_TAG_SMALL_SPARKLE}; -static const union AnimCmd sAnim_Rayquaza[] = { +static const union AnimCmd sAnim_RayquazaSpotlightEffect[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; -static const union AnimCmd *const sAnimTable_Rayquaza[] = { - sAnim_Rayquaza, +static const union AnimCmd *const sAnimTable_RayquazaSpotlightEffect[] = { + sAnim_RayquazaSpotlightEffect, }; -const struct SpriteFrameImage sPicTable_Rayquaza[] = { +const struct SpriteFrameImage sPicTable_RayquazaSpotlightEffect[] = { overworld_frame(gObjectEventPic_Rayquaza, 4, 4, 0), }; @@ -1280,8 +1280,8 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = { .tileTag = 0xFFFF, .paletteTag = 0xFFFF, .oam = &gObjectEventBaseOam_32x32, - .anims = sAnimTable_Rayquaza, - .images = sPicTable_Rayquaza, + .anims = sAnimTable_RayquazaSpotlightEffect, + .images = sPicTable_RayquazaSpotlightEffect, .affineAnims = gDummySpriteAffineAnimTable, .callback = UpdateRayquazaSpotlightEffect, }; diff --git a/src/data/graphics/intro_scene.h b/src/data/graphics/intro_scene.h index ea67c7b0d..cb7706c9a 100644 --- a/src/data/graphics/intro_scene.h +++ b/src/data/graphics/intro_scene.h @@ -1,48 +1,47 @@ -const u16 gIntro1GameFreakTextFadePal[] = INCBIN_U16("graphics/intro/intro1_text.gbapal"); // game freak text blue fade -const u16 gIntro2BrendanNoTurnPal[] = INCBIN_U16("graphics/intro/intro2_brendan_noturn.gbapal"); -const u16 gIntro3BgPal[] = INCBIN_U16("graphics/intro/intro3.gbapal"); -const u16 gIntro2VolbeatPal[] = INCBIN_U16("graphics/intro/intro2_volbeat.gbapal"); -const u16 gIntro2TorchicPal[] = INCBIN_U16("graphics/intro/intro2_torchic.gbapal"); -const u16 gIntro2ManectricPal[] = INCBIN_U16("graphics/intro/intro2_manectric.gbapal"); -const u16 gIntro2FlygonPal[] = INCBIN_U16("graphics/intro/intro2_flygon.gbapal"); +const u16 gIntroGameFreakTextFade_Pal[] = INCBIN_U16("graphics/intro/scene_1/text.gbapal"); // game freak text blue fade +const u16 gIntroPlayer_Pal[] = INCBIN_U16("graphics/intro/scene_2/player.gbapal"); +const u16 gIntro3Bg_Pal[] = INCBIN_U16("graphics/intro/scene_3/bg.gbapal"); +const u16 gIntroVolbeat_Pal[] = INCBIN_U16("graphics/intro/scene_2/volbeat.gbapal"); +const u16 gIntroTorchic_Pal[] = INCBIN_U16("graphics/intro/scene_2/torchic.gbapal"); +const u16 gIntroManectric_Pal[] = INCBIN_U16("graphics/intro/scene_2/manectric.gbapal"); +const u16 gIntroFlygon_Pal[] = INCBIN_U16("graphics/intro/scene_2/flygon.gbapal"); -const u32 gIntro2VolbeatGfx[] = INCBIN_U32("graphics/intro/intro2_volbeat.4bpp.lz"); -const u32 gIntro2TorchicGfx[] = INCBIN_U32("graphics/intro/intro2_torchic.4bpp.lz"); -const u32 gIntro2ManectricGfx[] = INCBIN_U32("graphics/intro/intro2_manectric.4bpp.lz"); -const u32 gIntro2FlygonGfx[] = INCBIN_U32("graphics/intro/intro2_flygon.4bpp.lz"); -const u32 gIntro2BrendanNoTurnGfx[] = INCBIN_U32("graphics/intro/intro2_brendan_noturn.4bpp.lz"); -const u32 gIntro2MayNoTurnGfx[] = INCBIN_U32("graphics/intro/intro2_may_noturn.4bpp.lz"); +const u32 gIntroVolbeat_Gfx[] = INCBIN_U32("graphics/intro/scene_2/volbeat.4bpp.lz"); +const u32 gIntroTorchic_Gfx[] = INCBIN_U32("graphics/intro/scene_2/torchic.4bpp.lz"); +const u32 gIntroManectric_Gfx[] = INCBIN_U32("graphics/intro/scene_2/manectric.4bpp.lz"); +const u32 gIntroFlygon_Gfx[] = INCBIN_U32("graphics/intro/scene_2/flygon.4bpp.lz"); +const u32 gIntroBrendan_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan.4bpp.lz"); +const u32 gIntroMay_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may.4bpp.lz"); -const u32 gIntro3GroudonGfx[] = INCBIN_U32("graphics/intro/intro3_groudon.8bpp.lz"); -const u32 gIntro3GroudonTilemap[] = INCBIN_U32("graphics/intro/intro3_groudon.bin.lz"); +const u32 gIntroGroudon_Gfx[] = INCBIN_U32("graphics/intro/scene_3/groudon.8bpp.lz"); +const u32 gIntroGroudon_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon.bin.lz"); -const u32 gIntro3KyogreGfx[] = INCBIN_U32("graphics/intro/intro3_kyogre.8bpp.lz"); -const u32 gIntro3KyogreTilemap[] = INCBIN_U32("graphics/intro/intro3_kyogre.bin.lz"); +const u32 gIntroKyogre_Gfx[] = INCBIN_U32("graphics/intro/scene_3/kyogre.8bpp.lz"); +const u32 gIntroKyogre_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre.bin.lz"); -const u32 gIntro3LegendBgGfx[] = INCBIN_U32("graphics/intro/legend_bg.4bpp.lz"); // groudon/kyogre/bg +const u32 gIntroLegendBg_Gfx[] = INCBIN_U32("graphics/intro/scene_3/legend_bg.4bpp.lz"); // groudon/kyogre bg +const u32 gIntroGroudonBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/groudon_bg.bin.lz"); +const u32 gIntroKyogreBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/kyogre_bg.bin.lz"); -const u32 gIntro3GroudonBgTilemap[] = INCBIN_U32("graphics/intro/legend_bg1.bin.lz"); -const u32 gIntro3KyogreBgTilemap[] = INCBIN_U32("graphics/intro/legend_bg2.bin.lz"); +const u32 gIntroClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/clouds.4bpp.lz"); +const u32 gIntroCloudsLeft_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_left.bin.lz"); +const u32 gIntroCloudsRight_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_right.bin.lz"); +const u32 gIntroCloudsSun_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/clouds_sun.bin.lz"); -const u32 gIntro3CloudsGfx[] = INCBIN_U32("graphics/intro/intro3_clouds.4bpp.lz"); -const u32 gIntro3Clouds1Tilemap[] = INCBIN_U32("graphics/intro/intro3_clouds1.bin.lz"); -const u32 gIntro3Clouds2Tilemap[] = INCBIN_U32("graphics/intro/intro3_clouds2.bin.lz"); -const u32 gIntro3Clouds3Tilemap[] = INCBIN_U32("graphics/intro/intro3_clouds3.bin.lz"); +const u32 gIntroLightning_Gfx[] = INCBIN_U32("graphics/intro/scene_3/lightning.4bpp.lz"); +const u16 gIntroLightning_Pal[] = INCBIN_U16("graphics/intro/scene_3/lightning.gbapal"); -const u32 gIntro3LightningGfx[] = INCBIN_U32("graphics/intro/intro3_lightning.4bpp.lz"); -const u16 gIntro3LightningPal[] = INCBIN_U16("graphics/intro/intro3_lightning.gbapal"); +const u32 gIntroRayquaza_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.4bpp.lz"); +const u32 gIntroRayquaza_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza.bin.lz"); -const u32 gIntro3RayquazaGfx[] = INCBIN_U32("graphics/intro/intro3_rayquaza.4bpp.lz"); -const u32 gIntro3RayquazaTilemap[] = INCBIN_U32("graphics/intro/intro3_rayquaza.bin.lz"); +const u32 gIntroUnused1_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_1.bin.lz"); +const u32 gIntroUnused2_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/unused_2.bin.lz"); -const u32 gUnknown_D8C374[] = INCBIN_U32("graphics/unknown/unknown_D8C374.bin.lz"); -const u32 gUnknown_D8C5C4[] = INCBIN_U32("graphics/unknown/unknown_D8C5C4.bin.lz"); +const u32 gIntroRayquazaClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.4bpp.lz"); +const u32 gIntroRayquazaClouds_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/rayquaza_clouds.bin.lz"); -const u32 gIntro3Clouds2Gfx[] = INCBIN_U32("graphics/intro/intro3_clouds2.4bpp.lz"); //clouds 2, during the rayquaza flash -const u32 gIntro3Clouds4Tilemap[] = INCBIN_U32("graphics/intro/intro3_clouds4.bin.lz"); +const u32 gIntroBubbles_Gfx[] = INCBIN_U32("graphics/intro/scene_3/bubbles.4bpp.lz"); +const u16 gIntroBubbles_Pal[] = INCBIN_U16("graphics/intro/scene_3/bubbles.gbapal"); -const u32 gIntro2BubblesGfx[] = INCBIN_U32("graphics/intro/intro2_bubbles.4bpp.lz"); -const u16 gIntro2BubblesPal[] = INCBIN_U16("graphics/intro/intro2_bubbles.gbapal"); - -const u32 gIntro1FlygonGfx[] = INCBIN_U32("graphics/intro/intro1_flygon.4bpp.lz"); -const u32 gIntro1SparkleGfx[] = INCBIN_U32("graphics/intro/intro1_sparkle.4bpp.lz"); +const u32 gIntroFlygonSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_1/flygon.4bpp.lz"); +const u32 gIntroSparkle_Gfx[] = INCBIN_U32("graphics/intro/scene_1/sparkle.4bpp.lz"); diff --git a/src/data/items.h b/src/data/items.h index 30beb5352..fc7792186 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -7,9 +7,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Pokeballs @@ -21,10 +20,10 @@ const struct Item gItems[] = .price = 0, .description = sMasterBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 0, - .battleUsage = 2, + .type = ITEM_MASTER_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 0, + .secondaryId = ITEM_MASTER_BALL - FIRST_BALL, }, [ITEM_ULTRA_BALL] = @@ -34,10 +33,10 @@ const struct Item gItems[] = .price = 1200, .description = sUltraBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 1, - .battleUsage = 2, + .type = ITEM_ULTRA_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 1, + .secondaryId = ITEM_ULTRA_BALL - FIRST_BALL, }, [ITEM_GREAT_BALL] = @@ -47,10 +46,10 @@ const struct Item gItems[] = .price = 600, .description = sGreatBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 2, - .battleUsage = 2, + .type = ITEM_GREAT_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 2, + .secondaryId = ITEM_GREAT_BALL - FIRST_BALL, }, [ITEM_POKE_BALL] = @@ -60,10 +59,10 @@ const struct Item gItems[] = .price = 200, .description = sPokeBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 3, - .battleUsage = 2, + .type = ITEM_POKE_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 3, + .secondaryId = ITEM_POKE_BALL - FIRST_BALL, }, [ITEM_SAFARI_BALL] = @@ -73,10 +72,10 @@ const struct Item gItems[] = .price = 0, .description = sSafariBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 4, - .battleUsage = 2, + .type = ITEM_SAFARI_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 4, + .secondaryId = ITEM_SAFARI_BALL - FIRST_BALL, }, [ITEM_NET_BALL] = @@ -86,10 +85,10 @@ const struct Item gItems[] = .price = 1000, .description = sNetBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 5, - .battleUsage = 2, + .type = ITEM_NET_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 5, + .secondaryId = ITEM_NET_BALL - FIRST_BALL, }, [ITEM_DIVE_BALL] = @@ -99,10 +98,10 @@ const struct Item gItems[] = .price = 1000, .description = sDiveBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 6, - .battleUsage = 2, + .type = ITEM_DIVE_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 6, + .secondaryId = ITEM_DIVE_BALL - FIRST_BALL, }, [ITEM_NEST_BALL] = @@ -112,10 +111,10 @@ const struct Item gItems[] = .price = 1000, .description = sNestBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 7, - .battleUsage = 2, + .type = ITEM_NEST_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 7, + .secondaryId = ITEM_NEST_BALL - FIRST_BALL, }, [ITEM_REPEAT_BALL] = @@ -125,10 +124,10 @@ const struct Item gItems[] = .price = 1000, .description = sRepeatBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 8, - .battleUsage = 2, + .type = ITEM_REPEAT_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 8, + .secondaryId = ITEM_REPEAT_BALL - FIRST_BALL, }, [ITEM_TIMER_BALL] = @@ -138,10 +137,10 @@ const struct Item gItems[] = .price = 1000, .description = sTimerBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 9, - .battleUsage = 2, + .type = ITEM_TIMER_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 9, + .secondaryId = ITEM_TIMER_BALL - FIRST_BALL, }, [ITEM_LUXURY_BALL] = @@ -151,10 +150,10 @@ const struct Item gItems[] = .price = 1000, .description = sLuxuryBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 10, - .battleUsage = 2, + .type = ITEM_LUXURY_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 10, + .secondaryId = ITEM_LUXURY_BALL - FIRST_BALL, }, [ITEM_PREMIER_BALL] = @@ -164,10 +163,10 @@ const struct Item gItems[] = .price = 200, .description = sPremierBallDesc, .pocket = POCKET_POKE_BALLS, - .type = 11, - .battleUsage = 2, + .type = ITEM_PREMIER_BALL - FIRST_BALL, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_PokeBall, - .secondaryId = 11, + .secondaryId = ITEM_PREMIER_BALL - FIRST_BALL, }, // Medicine @@ -180,11 +179,10 @@ const struct Item gItems[] = .holdEffectParam = 20, .description = sPotionDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_ANTIDOTE] = @@ -194,11 +192,10 @@ const struct Item gItems[] = .price = 100, .description = sAntidoteDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_BURN_HEAL] = @@ -208,11 +205,10 @@ const struct Item gItems[] = .price = 250, .description = sBurnHealDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_ICE_HEAL] = @@ -222,11 +218,10 @@ const struct Item gItems[] = .price = 250, .description = sIceHealDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_AWAKENING] = @@ -236,11 +231,10 @@ const struct Item gItems[] = .price = 250, .description = sAwakeningDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_PARALYZE_HEAL] = @@ -250,11 +244,10 @@ const struct Item gItems[] = .price = 200, .description = sParalyzeHealDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_FULL_RESTORE] = @@ -265,11 +258,10 @@ const struct Item gItems[] = .holdEffectParam = 255, .description = sFullRestoreDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_MAX_POTION] = @@ -280,11 +272,10 @@ const struct Item gItems[] = .holdEffectParam = 255, .description = sMaxPotionDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_HYPER_POTION] = @@ -295,11 +286,10 @@ const struct Item gItems[] = .holdEffectParam = 200, .description = sHyperPotionDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_SUPER_POTION] = @@ -310,11 +300,10 @@ const struct Item gItems[] = .holdEffectParam = 50, .description = sSuperPotionDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_FULL_HEAL] = @@ -324,11 +313,10 @@ const struct Item gItems[] = .price = 600, .description = sFullHealDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_REVIVE] = @@ -338,11 +326,10 @@ const struct Item gItems[] = .price = 1500, .description = sReviveDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_MAX_REVIVE] = @@ -352,11 +339,10 @@ const struct Item gItems[] = .price = 4000, .description = sMaxReviveDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_FRESH_WATER] = @@ -367,11 +353,10 @@ const struct Item gItems[] = .holdEffectParam = 50, .description = sFreshWaterDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_SODA_POP] = @@ -382,11 +367,10 @@ const struct Item gItems[] = .holdEffectParam = 60, .description = sSodaPopDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_LEMONADE] = @@ -397,11 +381,10 @@ const struct Item gItems[] = .holdEffectParam = 80, .description = sLemonadeDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_MOOMOO_MILK] = @@ -412,11 +395,10 @@ const struct Item gItems[] = .holdEffectParam = 100, .description = sMoomooMilkDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_ENERGY_POWDER] = @@ -426,11 +408,10 @@ const struct Item gItems[] = .price = 500, .description = sEnergyPowderDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_ENERGY_ROOT] = @@ -440,11 +421,10 @@ const struct Item gItems[] = .price = 800, .description = sEnergyRootDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_HEAL_POWDER] = @@ -454,11 +434,10 @@ const struct Item gItems[] = .price = 450, .description = sHealPowderDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_REVIVAL_HERB] = @@ -468,11 +447,10 @@ const struct Item gItems[] = .price = 2800, .description = sRevivalHerbDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_ETHER] = @@ -483,11 +461,10 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sEtherDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_PPRecovery, - .secondaryId = 0, }, [ITEM_MAX_ETHER] = @@ -498,11 +475,10 @@ const struct Item gItems[] = .holdEffectParam = 255, .description = sMaxEtherDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_PPRecovery, - .secondaryId = 0, }, [ITEM_ELIXIR] = @@ -513,11 +489,10 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sElixirDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_PPRecovery, - .secondaryId = 0, }, [ITEM_MAX_ELIXIR] = @@ -528,11 +503,10 @@ const struct Item gItems[] = .holdEffectParam = 255, .description = sMaxElixirDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_PPRecovery, - .secondaryId = 0, }, [ITEM_LAVA_COOKIE] = @@ -542,11 +516,10 @@ const struct Item gItems[] = .price = 200, .description = sLavaCookieDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_BLUE_FLUTE] = @@ -556,11 +529,10 @@ const struct Item gItems[] = .price = 100, .description = sBlueFluteDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_YELLOW_FLUTE] = @@ -570,11 +542,10 @@ const struct Item gItems[] = .price = 200, .description = sYellowFluteDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_RED_FLUTE] = @@ -584,11 +555,10 @@ const struct Item gItems[] = .price = 300, .description = sRedFluteDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_BLACK_FLUTE] = @@ -599,9 +569,8 @@ const struct Item gItems[] = .holdEffectParam = 50, .description = sBlackFluteDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, - .secondaryId = 0, }, [ITEM_WHITE_FLUTE] = @@ -612,9 +581,8 @@ const struct Item gItems[] = .holdEffectParam = 150, .description = sWhiteFluteDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_BlackWhiteFlute, - .secondaryId = 0, }, [ITEM_BERRY_JUICE] = @@ -626,11 +594,10 @@ const struct Item gItems[] = .holdEffectParam = 20, .description = sBerryJuiceDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_SACRED_ASH] = @@ -640,9 +607,8 @@ const struct Item gItems[] = .price = 200, .description = sSacredAshDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_SacredAsh, - .secondaryId = 0, }, // Collectibles @@ -654,9 +620,8 @@ const struct Item gItems[] = .price = 20, .description = sShoalSaltDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SHOAL_SHELL] = @@ -666,9 +631,8 @@ const struct Item gItems[] = .price = 20, .description = sShoalShellDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_RED_SHARD] = @@ -678,9 +642,8 @@ const struct Item gItems[] = .price = 200, .description = sRedShardDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BLUE_SHARD] = @@ -690,9 +653,8 @@ const struct Item gItems[] = .price = 200, .description = sBlueShardDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_YELLOW_SHARD] = @@ -702,9 +664,8 @@ const struct Item gItems[] = .price = 200, .description = sYellowShardDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_GREEN_SHARD] = @@ -714,9 +675,8 @@ const struct Item gItems[] = .price = 200, .description = sGreenShardDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_034] = @@ -726,9 +686,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_035] = @@ -738,9 +697,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_036] = @@ -750,9 +708,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_037] = @@ -762,9 +719,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_038] = @@ -774,9 +730,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_039] = @@ -786,9 +741,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_03A] = @@ -798,9 +752,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_03B] = @@ -810,9 +763,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_03C] = @@ -822,9 +774,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_03D] = @@ -834,9 +785,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_03E] = @@ -846,9 +796,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Vitamins @@ -860,9 +809,8 @@ const struct Item gItems[] = .price = 9800, .description = sHPUpDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .secondaryId = 0, }, [ITEM_PROTEIN] = @@ -872,9 +820,8 @@ const struct Item gItems[] = .price = 9800, .description = sProteinDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .secondaryId = 0, }, [ITEM_IRON] = @@ -884,9 +831,8 @@ const struct Item gItems[] = .price = 9800, .description = sIronDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .secondaryId = 0, }, [ITEM_CARBOS] = @@ -896,9 +842,8 @@ const struct Item gItems[] = .price = 9800, .description = sCarbosDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .secondaryId = 0, }, [ITEM_CALCIUM] = @@ -908,9 +853,8 @@ const struct Item gItems[] = .price = 9800, .description = sCalciumDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .secondaryId = 0, }, [ITEM_RARE_CANDY] = @@ -920,9 +864,8 @@ const struct Item gItems[] = .price = 4800, .description = sRareCandyDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_RareCandy, - .secondaryId = 0, }, [ITEM_PP_UP] = @@ -932,9 +875,8 @@ const struct Item gItems[] = .price = 9800, .description = sPPUpDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPUp, - .secondaryId = 0, }, [ITEM_ZINC] = @@ -944,9 +886,8 @@ const struct Item gItems[] = .price = 9800, .description = sZincDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .secondaryId = 0, }, [ITEM_PP_MAX] = @@ -956,9 +897,8 @@ const struct Item gItems[] = .price = 9800, .description = sPPMaxDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPUp, - .secondaryId = 0, }, [ITEM_048] = @@ -968,9 +908,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Battle items @@ -982,11 +921,10 @@ const struct Item gItems[] = .price = 700, .description = sGuardSpecDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_DIRE_HIT] = @@ -996,11 +934,10 @@ const struct Item gItems[] = .price = 650, .description = sDireHitDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_X_ATTACK] = @@ -1010,11 +947,10 @@ const struct Item gItems[] = .price = 500, .description = sXAttackDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_X_DEFEND] = @@ -1024,11 +960,10 @@ const struct Item gItems[] = .price = 550, .description = sXDefendDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_X_SPEED] = @@ -1038,11 +973,10 @@ const struct Item gItems[] = .price = 350, .description = sXSpeedDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_X_ACCURACY] = @@ -1052,11 +986,10 @@ const struct Item gItems[] = .price = 950, .description = sXAccuracyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_X_SPECIAL] = @@ -1066,11 +999,10 @@ const struct Item gItems[] = .price = 350, .description = sXSpecialDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_StatIncrease, - .secondaryId = 0, }, [ITEM_POKE_DOLL] = @@ -1080,11 +1012,10 @@ const struct Item gItems[] = .price = 1000, .description = sPokeDollDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_Escape, - .secondaryId = 0, }, [ITEM_FLUFFY_TAIL] = @@ -1094,11 +1025,10 @@ const struct Item gItems[] = .price = 1000, .description = sFluffyTailDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 2, + .battleUsage = ITEM_B_USE_OTHER, .battleUseFunc = ItemUseInBattle_Escape, - .secondaryId = 0, }, [ITEM_052] = @@ -1108,9 +1038,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Field items @@ -1123,9 +1052,8 @@ const struct Item gItems[] = .holdEffectParam = 200, .description = sSuperRepelDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, - .secondaryId = 0, }, [ITEM_MAX_REPEL] = @@ -1136,9 +1064,8 @@ const struct Item gItems[] = .holdEffectParam = 250, .description = sMaxRepelDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, - .secondaryId = 0, }, [ITEM_ESCAPE_ROPE] = @@ -1148,9 +1075,8 @@ const struct Item gItems[] = .price = 550, .description = sEscapeRopeDesc, .pocket = POCKET_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_EscapeRope, - .secondaryId = 0, }, [ITEM_REPEL] = @@ -1161,9 +1087,8 @@ const struct Item gItems[] = .holdEffectParam = 100, .description = sRepelDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_Repel, - .secondaryId = 0, }, [ITEM_057] = @@ -1173,9 +1098,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_058] = @@ -1185,9 +1109,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_059] = @@ -1197,9 +1120,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_05A] = @@ -1209,9 +1131,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_05B] = @@ -1221,9 +1142,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_05C] = @@ -1233,9 +1153,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Evolution stones @@ -1247,9 +1166,8 @@ const struct Item gItems[] = .price = 2100, .description = sSunStoneDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, - .secondaryId = 0, }, [ITEM_MOON_STONE] = @@ -1259,9 +1177,8 @@ const struct Item gItems[] = .price = 0, .description = sMoonStoneDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, - .secondaryId = 0, }, [ITEM_FIRE_STONE] = @@ -1271,9 +1188,8 @@ const struct Item gItems[] = .price = 2100, .description = sFireStoneDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, - .secondaryId = 0, }, [ITEM_THUNDER_STONE] = @@ -1283,9 +1199,8 @@ const struct Item gItems[] = .price = 2100, .description = sThunderStoneDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, - .secondaryId = 0, }, [ITEM_WATER_STONE] = @@ -1295,9 +1210,8 @@ const struct Item gItems[] = .price = 2100, .description = sWaterStoneDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, - .secondaryId = 0, }, [ITEM_LEAF_STONE] = @@ -1307,9 +1221,8 @@ const struct Item gItems[] = .price = 2100, .description = sLeafStoneDesc, .pocket = POCKET_ITEMS, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_EvolutionStone, - .secondaryId = 0, }, [ITEM_063] = @@ -1319,9 +1232,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_064] = @@ -1331,9 +1243,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_065] = @@ -1343,9 +1254,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_066] = @@ -1355,9 +1265,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Valuable items @@ -1369,9 +1278,8 @@ const struct Item gItems[] = .price = 500, .description = sTinyMushroomDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BIG_MUSHROOM] = @@ -1381,9 +1289,8 @@ const struct Item gItems[] = .price = 5000, .description = sBigMushroomDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_069] = @@ -1393,9 +1300,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_PEARL] = @@ -1405,9 +1311,8 @@ const struct Item gItems[] = .price = 1400, .description = sPearlDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BIG_PEARL] = @@ -1417,9 +1322,8 @@ const struct Item gItems[] = .price = 7500, .description = sBigPearlDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_STARDUST] = @@ -1429,9 +1333,8 @@ const struct Item gItems[] = .price = 2000, .description = sStardustDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_STAR_PIECE] = @@ -1441,9 +1344,8 @@ const struct Item gItems[] = .price = 9800, .description = sStarPieceDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_NUGGET] = @@ -1453,9 +1355,8 @@ const struct Item gItems[] = .price = 10000, .description = sNuggetDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_HEART_SCALE] = @@ -1465,9 +1366,8 @@ const struct Item gItems[] = .price = 100, .description = sHeartScaleDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_070] = @@ -1477,9 +1377,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_071] = @@ -1489,9 +1388,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_072] = @@ -1501,9 +1399,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_073] = @@ -1513,9 +1410,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_074] = @@ -1525,9 +1421,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_075] = @@ -1537,9 +1432,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_076] = @@ -1549,9 +1443,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_077] = @@ -1561,9 +1454,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_078] = @@ -1573,9 +1465,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Mail @@ -1586,9 +1477,9 @@ const struct Item gItems[] = .price = 50, .description = sOrangeMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 0, + .secondaryId = ITEM_TO_MAIL(ITEM_ORANGE_MAIL), }, [ITEM_HARBOR_MAIL] = @@ -1598,9 +1489,9 @@ const struct Item gItems[] = .price = 50, .description = sHarborMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 1, + .secondaryId = ITEM_TO_MAIL(ITEM_HARBOR_MAIL), }, [ITEM_GLITTER_MAIL] = @@ -1610,9 +1501,9 @@ const struct Item gItems[] = .price = 50, .description = sGlitterMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 2, + .secondaryId = ITEM_TO_MAIL(ITEM_GLITTER_MAIL), }, [ITEM_MECH_MAIL] = @@ -1622,9 +1513,9 @@ const struct Item gItems[] = .price = 50, .description = sMechMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 3, + .secondaryId = ITEM_TO_MAIL(ITEM_MECH_MAIL), }, [ITEM_WOOD_MAIL] = @@ -1634,9 +1525,9 @@ const struct Item gItems[] = .price = 50, .description = sWoodMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 4, + .secondaryId = ITEM_TO_MAIL(ITEM_WOOD_MAIL), }, [ITEM_WAVE_MAIL] = @@ -1646,9 +1537,9 @@ const struct Item gItems[] = .price = 50, .description = sWaveMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 5, + .secondaryId = ITEM_TO_MAIL(ITEM_WAVE_MAIL), }, [ITEM_BEAD_MAIL] = @@ -1658,9 +1549,9 @@ const struct Item gItems[] = .price = 50, .description = sBeadMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 6, + .secondaryId = ITEM_TO_MAIL(ITEM_BEAD_MAIL), }, [ITEM_SHADOW_MAIL] = @@ -1670,9 +1561,9 @@ const struct Item gItems[] = .price = 50, .description = sShadowMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 7, + .secondaryId = ITEM_TO_MAIL(ITEM_SHADOW_MAIL), }, [ITEM_TROPIC_MAIL] = @@ -1682,9 +1573,9 @@ const struct Item gItems[] = .price = 50, .description = sTropicMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 8, + .secondaryId = ITEM_TO_MAIL(ITEM_TROPIC_MAIL), }, [ITEM_DREAM_MAIL] = @@ -1694,9 +1585,9 @@ const struct Item gItems[] = .price = 50, .description = sDreamMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 9, + .secondaryId = ITEM_TO_MAIL(ITEM_DREAM_MAIL), }, [ITEM_FAB_MAIL] = @@ -1706,9 +1597,9 @@ const struct Item gItems[] = .price = 50, .description = sFabMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 10, + .secondaryId = ITEM_TO_MAIL(ITEM_FAB_MAIL), }, [ITEM_RETRO_MAIL] = @@ -1718,9 +1609,9 @@ const struct Item gItems[] = .price = 0, .description = sRetroMailDesc, .pocket = POCKET_ITEMS, - .type = 0, + .type = ITEM_USE_MAIL, .fieldUseFunc = ItemUseOutOfBattle_Mail, - .secondaryId = 11, + .secondaryId = ITEM_TO_MAIL(ITEM_RETRO_MAIL), }, // Berries @@ -1733,11 +1624,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_PAR, .description = sCheriBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_CHESTO_BERRY] = @@ -1748,11 +1638,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_SLP, .description = sChestoBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_PECHA_BERRY] = @@ -1763,11 +1652,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_PSN, .description = sPechaBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_RAWST_BERRY] = @@ -1778,11 +1666,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_BRN, .description = sRawstBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_ASPEAR_BERRY] = @@ -1793,11 +1680,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_FRZ, .description = sAspearBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_LEPPA_BERRY] = @@ -1809,11 +1695,10 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sLeppaBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_PPRecovery, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_PPRecovery, - .secondaryId = 0, }, [ITEM_ORAN_BERRY] = @@ -1825,11 +1710,10 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sOranBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_PERSIM_BERRY] = @@ -1840,11 +1724,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_CONFUSION, .description = sPersimBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_LUM_BERRY] = @@ -1855,11 +1738,10 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_STATUS, .description = sLumBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_SITRUS_BERRY] = @@ -1871,11 +1753,10 @@ const struct Item gItems[] = .holdEffectParam = 30, .description = sSitrusBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_Medicine, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_Medicine, - .secondaryId = 0, }, [ITEM_FIGY_BERRY] = @@ -1887,9 +1768,8 @@ const struct Item gItems[] = .holdEffectParam = 8, .description = sFigyBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_WIKI_BERRY] = @@ -1901,9 +1781,8 @@ const struct Item gItems[] = .holdEffectParam = 8, .description = sWikiBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MAGO_BERRY] = @@ -1915,9 +1794,8 @@ const struct Item gItems[] = .holdEffectParam = 8, .description = sMagoBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_AGUAV_BERRY] = @@ -1929,9 +1807,8 @@ const struct Item gItems[] = .holdEffectParam = 8, .description = sAguavBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_IAPAPA_BERRY] = @@ -1943,9 +1820,8 @@ const struct Item gItems[] = .holdEffectParam = 8, .description = sIapapaBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_RAZZ_BERRY] = @@ -1955,9 +1831,8 @@ const struct Item gItems[] = .price = 20, .description = sRazzBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BLUK_BERRY] = @@ -1967,9 +1842,8 @@ const struct Item gItems[] = .price = 20, .description = sBlukBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_NANAB_BERRY] = @@ -1979,9 +1853,8 @@ const struct Item gItems[] = .price = 20, .description = sNanabBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_WEPEAR_BERRY] = @@ -1991,9 +1864,8 @@ const struct Item gItems[] = .price = 20, .description = sWepearBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_PINAP_BERRY] = @@ -2003,9 +1875,8 @@ const struct Item gItems[] = .price = 20, .description = sPinapBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_POMEG_BERRY] = @@ -2015,9 +1886,8 @@ const struct Item gItems[] = .price = 20, .description = sPomegBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ReduceEV, - .secondaryId = 0, }, [ITEM_KELPSY_BERRY] = @@ -2027,9 +1897,8 @@ const struct Item gItems[] = .price = 20, .description = sKelpsyBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ReduceEV, - .secondaryId = 0, }, [ITEM_QUALOT_BERRY] = @@ -2039,9 +1908,8 @@ const struct Item gItems[] = .price = 20, .description = sQualotBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ReduceEV, - .secondaryId = 0, }, [ITEM_HONDEW_BERRY] = @@ -2051,9 +1919,8 @@ const struct Item gItems[] = .price = 20, .description = sHondewBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ReduceEV, - .secondaryId = 0, }, [ITEM_GREPA_BERRY] = @@ -2063,9 +1930,8 @@ const struct Item gItems[] = .price = 20, .description = sGrepaBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ReduceEV, - .secondaryId = 0, }, [ITEM_TAMATO_BERRY] = @@ -2075,9 +1941,8 @@ const struct Item gItems[] = .price = 20, .description = sTamatoBerryDesc, .pocket = POCKET_BERRIES, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_ReduceEV, - .secondaryId = 0, }, [ITEM_CORNN_BERRY] = @@ -2087,9 +1952,8 @@ const struct Item gItems[] = .price = 20, .description = sCornnBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MAGOST_BERRY] = @@ -2099,9 +1963,8 @@ const struct Item gItems[] = .price = 20, .description = sMagostBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_RABUTA_BERRY] = @@ -2111,9 +1974,8 @@ const struct Item gItems[] = .price = 20, .description = sRabutaBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_NOMEL_BERRY] = @@ -2123,9 +1985,8 @@ const struct Item gItems[] = .price = 20, .description = sNomelBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SPELON_BERRY] = @@ -2135,9 +1996,8 @@ const struct Item gItems[] = .price = 20, .description = sSpelonBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_PAMTRE_BERRY] = @@ -2147,9 +2007,8 @@ const struct Item gItems[] = .price = 20, .description = sPamtreBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_WATMEL_BERRY] = @@ -2159,9 +2018,8 @@ const struct Item gItems[] = .price = 20, .description = sWatmelBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DURIN_BERRY] = @@ -2171,9 +2029,8 @@ const struct Item gItems[] = .price = 20, .description = sDurinBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BELUE_BERRY] = @@ -2183,9 +2040,8 @@ const struct Item gItems[] = .price = 20, .description = sBelueBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LIECHI_BERRY] = @@ -2197,9 +2053,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sLiechiBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_GANLON_BERRY] = @@ -2211,9 +2066,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sGanlonBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SALAC_BERRY] = @@ -2225,9 +2079,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sSalacBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_PETAYA_BERRY] = @@ -2239,9 +2092,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sPetayaBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_APICOT_BERRY] = @@ -2253,9 +2105,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sApicotBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LANSAT_BERRY] = @@ -2267,9 +2118,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sLansatBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_STARF_BERRY] = @@ -2281,9 +2131,8 @@ const struct Item gItems[] = .holdEffectParam = 4, .description = sStarfBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ENIGMA_BERRY] = @@ -2293,11 +2142,10 @@ const struct Item gItems[] = .price = 20, .description = sEnigmaBerryDesc, .pocket = POCKET_BERRIES, - .type = 4, + .type = ITEM_USE_BAG_MENU, // Type handled by ItemUseOutOfBattle_EnigmaBerry .fieldUseFunc = ItemUseOutOfBattle_EnigmaBerry, - .battleUsage = 1, + .battleUsage = ITEM_B_USE_MEDICINE, .battleUseFunc = ItemUseInBattle_EnigmaBerry, - .secondaryId = 0, }, [ITEM_0B0] = @@ -2307,9 +2155,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0B1] = @@ -2319,9 +2166,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0B2] = @@ -2331,9 +2177,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Hold items @@ -2347,9 +2192,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sBrightPowderDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_WHITE_HERB] = @@ -2360,9 +2204,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_RESTORE_STATS, .description = sWhiteHerbDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MACHO_BRACE] = @@ -2373,9 +2216,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_MACHO_BRACE, .description = sMachoBraceDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_EXP_SHARE] = @@ -2386,9 +2228,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_EXP_SHARE, .description = sExpShareDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_QUICK_CLAW] = @@ -2400,9 +2241,8 @@ const struct Item gItems[] = .holdEffectParam = 20, .description = sQuickClawDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SOOTHE_BELL] = @@ -2410,12 +2250,11 @@ const struct Item gItems[] = .name = _("SOOTHE BELL"), .itemId = ITEM_SOOTHE_BELL, .price = 100, - .holdEffect = HOLD_EFFECT_HAPPINESS_UP, + .holdEffect = HOLD_EFFECT_FRIENDSHIP_UP, .description = sSootheBellDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MENTAL_HERB] = @@ -2426,9 +2265,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CURE_ATTRACT, .description = sMentalHerbDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_CHOICE_BAND] = @@ -2439,9 +2277,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CHOICE_BAND, .description = sChoiceBandDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_KINGS_ROCK] = @@ -2453,9 +2290,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sKingsRockDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SILVER_POWDER] = @@ -2467,9 +2303,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sSilverPowderDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_AMULET_COIN] = @@ -2481,9 +2316,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sAmuletCoinDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_CLEANSE_TAG] = @@ -2494,9 +2328,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_REPEL, .description = sCleanseTagDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SOUL_DEW] = @@ -2507,9 +2340,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_SOUL_DEW, .description = sSoulDewDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DEEP_SEA_TOOTH] = @@ -2520,9 +2352,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_DEEP_SEA_TOOTH, .description = sDeepSeaToothDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DEEP_SEA_SCALE] = @@ -2533,9 +2364,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_DEEP_SEA_SCALE, .description = sDeepSeaScaleDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SMOKE_BALL] = @@ -2546,9 +2376,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_CAN_ALWAYS_RUN, .description = sSmokeBallDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_EVERSTONE] = @@ -2559,9 +2388,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_PREVENT_EVOLVE, .description = sEverstoneDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_FOCUS_BAND] = @@ -2573,9 +2401,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sFocusBandDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LUCKY_EGG] = @@ -2586,9 +2413,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_LUCKY_EGG, .description = sLuckyEggDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SCOPE_LENS] = @@ -2599,9 +2425,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_SCOPE_LENS, .description = sScopeLensDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_METAL_COAT] = @@ -2613,9 +2438,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sMetalCoatDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LEFTOVERS] = @@ -2627,9 +2451,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sLeftoversDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DRAGON_SCALE] = @@ -2641,9 +2464,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sDragonScaleDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LIGHT_BALL] = @@ -2654,9 +2476,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_LIGHT_BALL, .description = sLightBallDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SOFT_SAND] = @@ -2668,9 +2489,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sSoftSandDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_HARD_STONE] = @@ -2682,9 +2502,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sHardStoneDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MIRACLE_SEED] = @@ -2696,9 +2515,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sMiracleSeedDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BLACK_GLASSES] = @@ -2710,9 +2528,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sBlackGlassesDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BLACK_BELT] = @@ -2724,9 +2541,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sBlackBeltDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MAGNET] = @@ -2738,9 +2554,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sMagnetDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MYSTIC_WATER] = @@ -2752,9 +2567,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sMysticWaterDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SHARP_BEAK] = @@ -2766,9 +2580,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sSharpBeakDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_POISON_BARB] = @@ -2780,9 +2593,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sPoisonBarbDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_NEVER_MELT_ICE] = @@ -2794,9 +2606,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sNeverMeltIceDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SPELL_TAG] = @@ -2808,9 +2619,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sSpellTagDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_TWISTED_SPOON] = @@ -2822,9 +2632,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sTwistedSpoonDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_CHARCOAL] = @@ -2836,9 +2645,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sCharcoalDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DRAGON_FANG] = @@ -2850,9 +2658,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sDragonFangDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SILK_SCARF] = @@ -2864,9 +2671,8 @@ const struct Item gItems[] = .holdEffectParam = 10, .description = sSilkScarfDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_UP_GRADE] = @@ -2877,9 +2683,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_UP_GRADE, .description = sUpGradeDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SHELL_BELL] = @@ -2891,9 +2696,8 @@ const struct Item gItems[] = .holdEffectParam = 8, .description = sShellBellDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SEA_INCENSE] = @@ -2905,9 +2709,8 @@ const struct Item gItems[] = .holdEffectParam = 5, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LAX_INCENSE] = @@ -2919,9 +2722,8 @@ const struct Item gItems[] = .holdEffectParam = 5, .description = sLaxIncenseDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LUCKY_PUNCH] = @@ -2932,9 +2734,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_LUCKY_PUNCH, .description = sLuckyPunchDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_METAL_POWDER] = @@ -2945,9 +2746,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_METAL_POWDER, .description = sMetalPowderDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_THICK_CLUB] = @@ -2958,9 +2758,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_THICK_CLUB, .description = sThickClubDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_STICK] = @@ -2971,9 +2770,8 @@ const struct Item gItems[] = .holdEffect = HOLD_EFFECT_STICK, .description = sStickDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E2] = @@ -2983,9 +2781,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E3] = @@ -2995,9 +2792,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E4] = @@ -3007,9 +2803,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E5] = @@ -3019,9 +2814,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E6] = @@ -3031,9 +2825,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E7] = @@ -3043,9 +2836,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E8] = @@ -3055,9 +2847,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0E9] = @@ -3067,9 +2858,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0EA] = @@ -3079,9 +2869,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0EB] = @@ -3091,9 +2880,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0EC] = @@ -3103,9 +2891,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0ED] = @@ -3115,9 +2902,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0EE] = @@ -3127,9 +2913,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0EF] = @@ -3139,9 +2924,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F0] = @@ -3151,9 +2935,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F1] = @@ -3163,9 +2946,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F2] = @@ -3175,9 +2957,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F3] = @@ -3187,9 +2968,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F4] = @@ -3199,9 +2979,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F5] = @@ -3211,9 +2990,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F6] = @@ -3223,9 +3001,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F7] = @@ -3235,9 +3012,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F8] = @@ -3247,9 +3023,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0F9] = @@ -3259,9 +3034,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0FA] = @@ -3271,9 +3045,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0FB] = @@ -3283,9 +3056,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0FC] = @@ -3295,9 +3067,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_0FD] = @@ -3307,9 +3078,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_RED_SCARF] = @@ -3319,9 +3089,8 @@ const struct Item gItems[] = .price = 100, .description = sRedScarfDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BLUE_SCARF] = @@ -3331,9 +3100,8 @@ const struct Item gItems[] = .price = 100, .description = sBlueScarfDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_PINK_SCARF] = @@ -3343,9 +3111,8 @@ const struct Item gItems[] = .price = 100, .description = sPinkScarfDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_GREEN_SCARF] = @@ -3355,9 +3122,8 @@ const struct Item gItems[] = .price = 100, .description = sGreenScarfDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_YELLOW_SCARF] = @@ -3367,9 +3133,8 @@ const struct Item gItems[] = .price = 100, .description = sYellowScarfDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Key items @@ -3383,9 +3148,9 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Bike, - .secondaryId = 0, + .secondaryId = MACH_BIKE, }, [ITEM_COIN_CASE] = @@ -3396,9 +3161,8 @@ const struct Item gItems[] = .description = sCoinCaseDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CoinCase, - .secondaryId = 0, }, [ITEM_ITEMFINDER] = @@ -3410,9 +3174,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Itemfinder, - .secondaryId = 0, }, [ITEM_OLD_ROD] = @@ -3424,7 +3187,7 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Rod, .secondaryId = OLD_ROD, }, @@ -3438,7 +3201,7 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Rod, .secondaryId = GOOD_ROD, }, @@ -3452,7 +3215,7 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Rod, .secondaryId = SUPER_ROD, }, @@ -3465,9 +3228,8 @@ const struct Item gItems[] = .description = sSSTicketDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_CONTEST_PASS] = @@ -3478,9 +3240,8 @@ const struct Item gItems[] = .description = sContestPassDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_10B] = @@ -3490,9 +3251,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_WAILMER_PAIL] = @@ -3503,9 +3263,8 @@ const struct Item gItems[] = .description = sWailmerPailDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_WailmerPail, - .secondaryId = 0, }, [ITEM_DEVON_GOODS] = @@ -3516,9 +3275,8 @@ const struct Item gItems[] = .description = sDevonGoodsDesc, .importance = 2, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SOOT_SACK] = @@ -3529,9 +3287,8 @@ const struct Item gItems[] = .description = sSootSackDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BASEMENT_KEY] = @@ -3542,9 +3299,8 @@ const struct Item gItems[] = .description = sBasementKeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ACRO_BIKE] = @@ -3556,9 +3312,9 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_Bike, - .secondaryId = 1, + .secondaryId = ACRO_BIKE, }, [ITEM_POKEBLOCK_CASE] = @@ -3570,9 +3326,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 3, + .type = ITEM_USE_PBLOCK_CASE, .fieldUseFunc = ItemUseOutOfBattle_PokeblockCase, - .secondaryId = 0, }, [ITEM_LETTER] = @@ -3583,9 +3338,8 @@ const struct Item gItems[] = .description = sLetterDesc, .importance = 2, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_EON_TICKET] = @@ -3596,7 +3350,7 @@ const struct Item gItems[] = .description = sEonTicketDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, .secondaryId = 1, }, @@ -3609,9 +3363,8 @@ const struct Item gItems[] = .description = sRedOrbDesc, .importance = 2, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BLUE_ORB] = @@ -3622,9 +3375,8 @@ const struct Item gItems[] = .description = sBlueOrbDesc, .importance = 2, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SCANNER] = @@ -3635,9 +3387,8 @@ const struct Item gItems[] = .description = sScannerDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_GO_GOGGLES] = @@ -3648,9 +3399,8 @@ const struct Item gItems[] = .description = sGoGogglesDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_METEORITE] = @@ -3661,9 +3411,8 @@ const struct Item gItems[] = .description = sMeteoriteDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ROOM_1_KEY] = @@ -3674,9 +3423,8 @@ const struct Item gItems[] = .description = sRoom1KeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ROOM_2_KEY] = @@ -3687,9 +3435,8 @@ const struct Item gItems[] = .description = sRoom2KeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ROOM_4_KEY] = @@ -3700,9 +3447,8 @@ const struct Item gItems[] = .description = sRoom4KeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ROOM_6_KEY] = @@ -3713,9 +3459,8 @@ const struct Item gItems[] = .description = sRoom6KeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_STORAGE_KEY] = @@ -3726,9 +3471,8 @@ const struct Item gItems[] = .description = sStorageKeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_ROOT_FOSSIL] = @@ -3739,9 +3483,8 @@ const struct Item gItems[] = .description = sRootFossilDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_CLAW_FOSSIL] = @@ -3752,9 +3495,8 @@ const struct Item gItems[] = .description = sClawFossilDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DEVON_SCOPE] = @@ -3765,9 +3507,8 @@ const struct Item gItems[] = .description = sDevonScopeDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // TMs/HMs @@ -3779,9 +3520,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM01Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM02_DRAGON_CLAW] = @@ -3791,9 +3531,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM02Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM03_WATER_PULSE] = @@ -3803,9 +3542,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM03Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM04_CALM_MIND] = @@ -3815,9 +3553,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM04Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM05_ROAR] = @@ -3827,9 +3564,8 @@ const struct Item gItems[] = .price = 1000, .description = sTM05Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM06_TOXIC] = @@ -3839,9 +3575,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM06Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM07_HAIL] = @@ -3851,9 +3586,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM07Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM08_BULK_UP] = @@ -3863,9 +3597,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM08Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM09_BULLET_SEED] = @@ -3875,9 +3608,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM09Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM10_HIDDEN_POWER] = @@ -3887,9 +3619,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM10Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM11_SUNNY_DAY] = @@ -3899,9 +3630,8 @@ const struct Item gItems[] = .price = 2000, .description = sTM11Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM12_TAUNT] = @@ -3911,9 +3641,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM12Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM13_ICE_BEAM] = @@ -3923,9 +3652,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM13Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM14_BLIZZARD] = @@ -3935,9 +3663,8 @@ const struct Item gItems[] = .price = 5500, .description = sTM14Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM15_HYPER_BEAM] = @@ -3947,9 +3674,8 @@ const struct Item gItems[] = .price = 7500, .description = sTM15Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM16_LIGHT_SCREEN] = @@ -3959,9 +3685,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM16Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM17_PROTECT] = @@ -3971,9 +3696,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM17Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM18_RAIN_DANCE] = @@ -3983,9 +3707,8 @@ const struct Item gItems[] = .price = 2000, .description = sTM18Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM19_GIGA_DRAIN] = @@ -3995,9 +3718,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM19Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM20_SAFEGUARD] = @@ -4007,9 +3729,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM20Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM21_FRUSTRATION] = @@ -4019,9 +3740,8 @@ const struct Item gItems[] = .price = 1000, .description = sTM21Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM22_SOLARBEAM] = @@ -4031,9 +3751,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM22Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM23_IRON_TAIL] = @@ -4043,9 +3762,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM23Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM24_THUNDERBOLT] = @@ -4055,9 +3773,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM24Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM25_THUNDER] = @@ -4067,9 +3784,8 @@ const struct Item gItems[] = .price = 5500, .description = sTM25Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM26_EARTHQUAKE] = @@ -4079,9 +3795,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM26Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM27_RETURN] = @@ -4091,9 +3806,8 @@ const struct Item gItems[] = .price = 1000, .description = sTM27Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM28_DIG] = @@ -4103,9 +3817,8 @@ const struct Item gItems[] = .price = 2000, .description = sTM28Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM29_PSYCHIC] = @@ -4115,9 +3828,8 @@ const struct Item gItems[] = .price = 2000, .description = sTM29Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM30_SHADOW_BALL] = @@ -4127,9 +3839,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM30Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM31_BRICK_BREAK] = @@ -4139,9 +3850,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM31Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM32_DOUBLE_TEAM] = @@ -4151,9 +3861,8 @@ const struct Item gItems[] = .price = 2000, .description = sTM32Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM33_REFLECT] = @@ -4163,9 +3872,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM33Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM34_SHOCK_WAVE] = @@ -4175,9 +3883,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM34Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM35_FLAMETHROWER] = @@ -4187,9 +3894,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM35Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM36_SLUDGE_BOMB] = @@ -4199,9 +3905,8 @@ const struct Item gItems[] = .price = 1000, .description = sTM36Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM37_SANDSTORM] = @@ -4211,9 +3916,8 @@ const struct Item gItems[] = .price = 2000, .description = sTM37Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM38_FIRE_BLAST] = @@ -4223,9 +3927,8 @@ const struct Item gItems[] = .price = 5500, .description = sTM38Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM39_ROCK_TOMB] = @@ -4235,9 +3938,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM39Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM40_AERIAL_ACE] = @@ -4247,9 +3949,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM40Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM41_TORMENT] = @@ -4259,9 +3960,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM41Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM42_FACADE] = @@ -4271,9 +3971,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM42Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM43_SECRET_POWER] = @@ -4283,9 +3982,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM43Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM44_REST] = @@ -4295,9 +3993,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM44Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM45_ATTRACT] = @@ -4307,9 +4004,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM45Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM46_THIEF] = @@ -4319,9 +4015,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM46Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM47_STEEL_WING] = @@ -4331,9 +4026,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM47Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM48_SKILL_SWAP] = @@ -4343,9 +4037,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM48Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM49_SNATCH] = @@ -4355,9 +4048,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM49Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_TM50_OVERHEAT] = @@ -4367,9 +4059,8 @@ const struct Item gItems[] = .price = 3000, .description = sTM50Desc, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM01_CUT] = @@ -4380,9 +4071,8 @@ const struct Item gItems[] = .description = sHM01Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM02_FLY] = @@ -4393,9 +4083,8 @@ const struct Item gItems[] = .description = sHM02Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM03_SURF] = @@ -4406,9 +4095,8 @@ const struct Item gItems[] = .description = sHM03Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM04_STRENGTH] = @@ -4419,9 +4107,8 @@ const struct Item gItems[] = .description = sHM04Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM05_FLASH] = @@ -4432,9 +4119,8 @@ const struct Item gItems[] = .description = sHM05Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM06_ROCK_SMASH] = @@ -4445,9 +4131,8 @@ const struct Item gItems[] = .description = sHM06Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM07_WATERFALL] = @@ -4458,9 +4143,8 @@ const struct Item gItems[] = .description = sHM07Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_HM08_DIVE] = @@ -4471,9 +4155,8 @@ const struct Item gItems[] = .description = sHM08Desc, .importance = 1, .pocket = POCKET_TM_HM, - .type = 1, + .type = ITEM_USE_PARTY_MENU, .fieldUseFunc = ItemUseOutOfBattle_TMHM, - .secondaryId = 0, }, [ITEM_15B] = @@ -4483,9 +4166,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_15C] = @@ -4495,9 +4177,8 @@ const struct Item gItems[] = .price = 0, .description = sDummyDesc, .pocket = POCKET_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // FireRed/LeafGreen key items @@ -4510,9 +4191,8 @@ const struct Item gItems[] = .description = sOaksParcelDesc, .importance = 2, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_POKE_FLUTE] = @@ -4523,9 +4203,8 @@ const struct Item gItems[] = .description = sPokeFluteDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SECRET_KEY] = @@ -4536,9 +4215,8 @@ const struct Item gItems[] = .description = sSecretKeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BIKE_VOUCHER] = @@ -4549,9 +4227,8 @@ const struct Item gItems[] = .description = sBikeVoucherDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_GOLD_TEETH] = @@ -4562,9 +4239,8 @@ const struct Item gItems[] = .description = sGoldTeethDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_OLD_AMBER] = @@ -4575,9 +4251,8 @@ const struct Item gItems[] = .description = sOldAmberDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_CARD_KEY] = @@ -4588,9 +4263,8 @@ const struct Item gItems[] = .description = sCardKeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_LIFT_KEY] = @@ -4601,9 +4275,8 @@ const struct Item gItems[] = .description = sLiftKeyDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_HELIX_FOSSIL] = @@ -4614,9 +4287,8 @@ const struct Item gItems[] = .description = sHelixFossilDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_DOME_FOSSIL] = @@ -4627,9 +4299,8 @@ const struct Item gItems[] = .description = sDomeFossilDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SILPH_SCOPE] = @@ -4640,9 +4311,8 @@ const struct Item gItems[] = .description = sSilphScopeDesc, .importance = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BICYCLE] = @@ -4654,9 +4324,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_TOWN_MAP] = @@ -4668,9 +4337,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_VS_SEEKER] = @@ -4682,9 +4350,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_FAME_CHECKER] = @@ -4696,9 +4363,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_TM_CASE] = @@ -4710,9 +4376,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_BERRY_POUCH] = @@ -4724,9 +4389,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_TEACHY_TV] = @@ -4738,9 +4402,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 2, + .type = ITEM_USE_FIELD, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_TRI_PASS] = @@ -4752,9 +4415,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_RAINBOW_PASS] = @@ -4766,9 +4428,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_TEA] = @@ -4780,9 +4441,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_MYSTIC_TICKET] = @@ -4794,9 +4454,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_AURORA_TICKET] = @@ -4808,9 +4467,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_POWDER_JAR] = @@ -4822,9 +4480,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_PowderJar, - .secondaryId = 0, }, [ITEM_RUBY] = @@ -4836,9 +4493,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_SAPPHIRE] = @@ -4850,9 +4506,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, // Emerald-specific key items @@ -4866,9 +4521,8 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, [ITEM_OLD_SEA_MAP] = @@ -4880,8 +4534,7 @@ const struct Item gItems[] = .importance = 1, .unk19 = 1, .pocket = POCKET_KEY_ITEMS, - .type = 4, + .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, - .secondaryId = 0, }, }; diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h index 37bae7e95..818a5fd5f 100644 --- a/src/data/lilycove_lady.h +++ b/src/data/lilycove_lady.h @@ -53,7 +53,7 @@ static const u16 sQuizLadyQuestion3[] = EC_WORD_POKEMON, EC_WORD_EVOLVE, EC_WORD_QUES, - 0xFFFF, + EC_EMPTY_WORD, EC_WORD_LEVEL, EC_WORD_INSOMNIA, EC_WORD_CUTE_CHARM @@ -92,7 +92,7 @@ static const u16 sQuizLadyQuestion6[] = EC_WORD_STOP, EC_MOVE2(CONFUSION), EC_WORD_QUES, - 0xFFFF, + EC_EMPTY_WORD, EC_WORD_ILLUMINATE, EC_WORD_OWN_TEMPO, EC_WORD_SWIFT_SWIM @@ -118,7 +118,7 @@ static const u16 sQuizLadyQuestion8[] = EC_MOVE2(BLOCK), EC_WORD_ESCAPE, EC_WORD_QUES, - 0xFFFF, + EC_EMPTY_WORD, EC_WORD_RUN_AWAY, EC_WORD_SHADOW_TAG, EC_WORD_WONDER_GUARD @@ -131,7 +131,7 @@ static const u16 sQuizLadyQuestion9[] = EC_WORD_STOP, EC_WORD_POISON, EC_WORD_QUES, - 0xFFFF, + EC_EMPTY_WORD, EC_WORD_GUTS, EC_WORD_IMMUNITY, EC_WORD_SHED_SKIN @@ -144,7 +144,7 @@ static const u16 sQuizLadyQuestion10[] = EC_WORD_WITH, EC_WORD_CENTER, EC_WORD_QUES, - 0xFFFF, + EC_EMPTY_WORD, EC_WORD_POKEDEX, EC_WORD_POKEMON, EC_WORD_POKENAV @@ -157,7 +157,7 @@ static const u16 sQuizLadyQuestion11[] = EC_WORD_YOUR, EC_WORD_POKEMON, EC_WORD_QUES, - 0xFFFF, + EC_EMPTY_WORD, EC_WORD_PC, EC_WORD_DEPT_STORE, EC_WORD_TELEVISION @@ -199,7 +199,7 @@ static const u16 sQuizLadyQuestion14[] = EC_WORD_QUES, EC_WORD_ICE, EC_WORD_GROUND, - 0xFFFF + EC_EMPTY_WORD }; static const u16 sQuizLadyQuestion15[] = @@ -212,7 +212,7 @@ static const u16 sQuizLadyQuestion15[] = EC_WORD_QUES, EC_WORD_PSYCHIC, EC_WORD_FIGHTING, - 0xFFFF + EC_EMPTY_WORD }; static const u16 sQuizLadyQuestion16[] = @@ -225,7 +225,7 @@ static const u16 sQuizLadyQuestion16[] = EC_WORD_QUES, EC_WORD_NORMAL, EC_WORD_DARK, - 0xFFFF + EC_EMPTY_WORD }; static const u16 *const sQuizLadyQuizQuestions[] = diff --git a/src/data/object_events/berry_tree_graphics_tables.h b/src/data/object_events/berry_tree_graphics_tables.h index d558b583f..390c82f95 100755 --- a/src/data/object_events/berry_tree_graphics_tables.h +++ b/src/data/object_events/berry_tree_graphics_tables.h @@ -1,4 +1,4 @@ -const struct SpriteFrameImage gObjectEventPicTable_PechaBerryTree[] = { +static const struct SpriteFrameImage sPicTable_PechaBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -12,7 +12,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PechaBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Pecha[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_KelpsyBerryTree[] = { +static const struct SpriteFrameImage sPicTable_KelpsyBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -26,7 +26,7 @@ const struct SpriteFrameImage gObjectEventPicTable_KelpsyBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Kelpsy[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_WepearBerryTree[] = { +static const struct SpriteFrameImage sPicTable_WepearBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -40,7 +40,7 @@ const struct SpriteFrameImage gObjectEventPicTable_WepearBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Wepear[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_IapapaBerryTree[] = { +static const struct SpriteFrameImage sPicTable_IapapaBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -54,7 +54,7 @@ const struct SpriteFrameImage gObjectEventPicTable_IapapaBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Iapapa[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_CheriBerryTree[] = { +static const struct SpriteFrameImage sPicTable_CheriBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -68,7 +68,7 @@ const struct SpriteFrameImage gObjectEventPicTable_CheriBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Cheri[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_FigyBerryTree[] = { +static const struct SpriteFrameImage sPicTable_FigyBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -82,7 +82,7 @@ const struct SpriteFrameImage gObjectEventPicTable_FigyBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Figy[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_MagoBerryTree[] = { +static const struct SpriteFrameImage sPicTable_MagoBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -96,7 +96,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MagoBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Mago[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_LumBerryTree[] = { +static const struct SpriteFrameImage sPicTable_LumBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -110,7 +110,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LumBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Lum[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_RazzBerryTree[] = { +static const struct SpriteFrameImage sPicTable_RazzBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -124,7 +124,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RazzBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Razz[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_GrepaBerryTree[] = { +static const struct SpriteFrameImage sPicTable_GrepaBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -138,7 +138,7 @@ const struct SpriteFrameImage gObjectEventPicTable_GrepaBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Grepa[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_RabutaBerryTree[] = { +static const struct SpriteFrameImage sPicTable_RabutaBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -152,7 +152,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RabutaBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Rabuta[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_NomelBerryTree[] = { +static const struct SpriteFrameImage sPicTable_NomelBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -166,7 +166,7 @@ const struct SpriteFrameImage gObjectEventPicTable_NomelBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Nomel[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_LeppaBerryTree[] = { +static const struct SpriteFrameImage sPicTable_LeppaBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -180,7 +180,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LeppaBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Leppa[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_LiechiBerryTree[] = { +static const struct SpriteFrameImage sPicTable_LiechiBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -194,7 +194,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LiechiBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Liechi[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_HondewBerryTree[] = { +static const struct SpriteFrameImage sPicTable_HondewBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -208,7 +208,7 @@ const struct SpriteFrameImage gObjectEventPicTable_HondewBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Hondew[] = {3, 4, 5, 5, 5}; -const struct SpriteFrameImage gObjectEventPicTable_AguavBerryTree[] = { +static const struct SpriteFrameImage sPicTable_AguavBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -222,7 +222,7 @@ const struct SpriteFrameImage gObjectEventPicTable_AguavBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Aguav[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_WikiBerryTree[] = { +static const struct SpriteFrameImage sPicTable_WikiBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -236,7 +236,7 @@ const struct SpriteFrameImage gObjectEventPicTable_WikiBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Wiki[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_PomegBerryTree[] = { +static const struct SpriteFrameImage sPicTable_PomegBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -250,7 +250,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PomegBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Pomeg[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_RawstBerryTree[] = { +static const struct SpriteFrameImage sPicTable_RawstBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -264,7 +264,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RawstBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Rawst[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_SpelonBerryTree[] = { +static const struct SpriteFrameImage sPicTable_SpelonBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -278,7 +278,7 @@ const struct SpriteFrameImage gObjectEventPicTable_SpelonBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Spelon[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_ChestoBerryTree[] = { +static const struct SpriteFrameImage sPicTable_ChestoBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -292,7 +292,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ChestoBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Chesto[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_OranBerryTree[] = { +static const struct SpriteFrameImage sPicTable_OranBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -306,7 +306,7 @@ const struct SpriteFrameImage gObjectEventPicTable_OranBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Oran[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_PersimBerryTree[] = { +static const struct SpriteFrameImage sPicTable_PersimBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -320,7 +320,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PersimBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Persim[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_SitrusBerryTree[] = { +static const struct SpriteFrameImage sPicTable_SitrusBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -334,7 +334,7 @@ const struct SpriteFrameImage gObjectEventPicTable_SitrusBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Sitrus[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_AspearBerryTree[] = { +static const struct SpriteFrameImage sPicTable_AspearBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -348,7 +348,7 @@ const struct SpriteFrameImage gObjectEventPicTable_AspearBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Aspear[] = {3, 4, 3, 3, 3}; -const struct SpriteFrameImage gObjectEventPicTable_PamtreBerryTree[] = { +static const struct SpriteFrameImage sPicTable_PamtreBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -362,7 +362,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PamtreBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Pamtre[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_CornnBerryTree[] = { +static const struct SpriteFrameImage sPicTable_CornnBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -376,7 +376,7 @@ const struct SpriteFrameImage gObjectEventPicTable_CornnBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Cornn[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_LansatBerryTree[] = { +static const struct SpriteFrameImage sPicTable_LansatBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -390,7 +390,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LansatBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Lansat[] = {3, 4, 2, 2, 2}; -const struct SpriteFrameImage gObjectEventPicTable_DurinBerryTree[] = { +static const struct SpriteFrameImage sPicTable_DurinBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -404,7 +404,7 @@ const struct SpriteFrameImage gObjectEventPicTable_DurinBerryTree[] = { const u8 gBerryTreePaletteSlotTable_Durin[] = {3, 4, 4, 4, 4}; -const struct SpriteFrameImage gObjectEventPicTable_TamatoBerryTree[] = { +static const struct SpriteFrameImage sPicTable_TamatoBerryTree[] = { overworld_frame(gObjectEventPic_BerryTreeDirtPile, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 0), overworld_frame(gObjectEventPic_BerryTreeSprout, 2, 2, 1), @@ -423,49 +423,49 @@ const u8 gDeadBerryTreeObjectEventGraphicsIdTable[] = {OBJ_EVENT_GFX_BERRY_TREE_ const u8 gBerryTreeObjectEventGraphicsIdTable[] = {OBJ_EVENT_GFX_BERRY_TREE_EARLY_STAGES, OBJ_EVENT_GFX_BERRY_TREE_EARLY_STAGES, OBJ_EVENT_GFX_BERRY_TREE_LATE_STAGES, OBJ_EVENT_GFX_BERRY_TREE_LATE_STAGES, OBJ_EVENT_GFX_BERRY_TREE_LATE_STAGES}; const struct SpriteFrameImage *const gBerryTreePicTablePointers[] = { - [ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_CheriBerryTree, - [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_ChestoBerryTree, - [ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_PechaBerryTree, - [ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_RawstBerryTree, - [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_AspearBerryTree, - [ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_LeppaBerryTree, - [ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_OranBerryTree, - [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_PersimBerryTree, - [ITEM_LUM_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_LumBerryTree, - [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_SitrusBerryTree, - [ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_FigyBerryTree, - [ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_WikiBerryTree, - [ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_MagoBerryTree, - [ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_AguavBerryTree, - [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_IapapaBerryTree, - [ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_RazzBerryTree, - [ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_RazzBerryTree, - [ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_MagoBerryTree, - [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_WepearBerryTree, - [ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_IapapaBerryTree, - [ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_PomegBerryTree, - [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_KelpsyBerryTree, - [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_WepearBerryTree, - [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_HondewBerryTree, - [ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_GrepaBerryTree, - [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_TamatoBerryTree, - [ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_CornnBerryTree, - [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_PomegBerryTree, - [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_RabutaBerryTree, - [ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_NomelBerryTree, - [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_SpelonBerryTree, - [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_PamtreBerryTree, - [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_RabutaBerryTree, - [ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_DurinBerryTree, - [ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_HondewBerryTree, - [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_LiechiBerryTree, - [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_HondewBerryTree, - [ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_AguavBerryTree, - [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_PomegBerryTree, - [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_GrepaBerryTree, - [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_LansatBerryTree, - [ITEM_STARF_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_CornnBerryTree, - [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = gObjectEventPicTable_DurinBerryTree, + [ITEM_CHERI_BERRY - FIRST_BERRY_INDEX] = sPicTable_CheriBerryTree, + [ITEM_CHESTO_BERRY - FIRST_BERRY_INDEX] = sPicTable_ChestoBerryTree, + [ITEM_PECHA_BERRY - FIRST_BERRY_INDEX] = sPicTable_PechaBerryTree, + [ITEM_RAWST_BERRY - FIRST_BERRY_INDEX] = sPicTable_RawstBerryTree, + [ITEM_ASPEAR_BERRY - FIRST_BERRY_INDEX] = sPicTable_AspearBerryTree, + [ITEM_LEPPA_BERRY - FIRST_BERRY_INDEX] = sPicTable_LeppaBerryTree, + [ITEM_ORAN_BERRY - FIRST_BERRY_INDEX] = sPicTable_OranBerryTree, + [ITEM_PERSIM_BERRY - FIRST_BERRY_INDEX] = sPicTable_PersimBerryTree, + [ITEM_LUM_BERRY - FIRST_BERRY_INDEX] = sPicTable_LumBerryTree, + [ITEM_SITRUS_BERRY - FIRST_BERRY_INDEX] = sPicTable_SitrusBerryTree, + [ITEM_FIGY_BERRY - FIRST_BERRY_INDEX] = sPicTable_FigyBerryTree, + [ITEM_WIKI_BERRY - FIRST_BERRY_INDEX] = sPicTable_WikiBerryTree, + [ITEM_MAGO_BERRY - FIRST_BERRY_INDEX] = sPicTable_MagoBerryTree, + [ITEM_AGUAV_BERRY - FIRST_BERRY_INDEX] = sPicTable_AguavBerryTree, + [ITEM_IAPAPA_BERRY - FIRST_BERRY_INDEX] = sPicTable_IapapaBerryTree, + [ITEM_RAZZ_BERRY - FIRST_BERRY_INDEX] = sPicTable_RazzBerryTree, + [ITEM_BLUK_BERRY - FIRST_BERRY_INDEX] = sPicTable_RazzBerryTree, + [ITEM_NANAB_BERRY - FIRST_BERRY_INDEX] = sPicTable_MagoBerryTree, + [ITEM_WEPEAR_BERRY - FIRST_BERRY_INDEX] = sPicTable_WepearBerryTree, + [ITEM_PINAP_BERRY - FIRST_BERRY_INDEX] = sPicTable_IapapaBerryTree, + [ITEM_POMEG_BERRY - FIRST_BERRY_INDEX] = sPicTable_PomegBerryTree, + [ITEM_KELPSY_BERRY - FIRST_BERRY_INDEX] = sPicTable_KelpsyBerryTree, + [ITEM_QUALOT_BERRY - FIRST_BERRY_INDEX] = sPicTable_WepearBerryTree, + [ITEM_HONDEW_BERRY - FIRST_BERRY_INDEX] = sPicTable_HondewBerryTree, + [ITEM_GREPA_BERRY - FIRST_BERRY_INDEX] = sPicTable_GrepaBerryTree, + [ITEM_TAMATO_BERRY - FIRST_BERRY_INDEX] = sPicTable_TamatoBerryTree, + [ITEM_CORNN_BERRY - FIRST_BERRY_INDEX] = sPicTable_CornnBerryTree, + [ITEM_MAGOST_BERRY - FIRST_BERRY_INDEX] = sPicTable_PomegBerryTree, + [ITEM_RABUTA_BERRY - FIRST_BERRY_INDEX] = sPicTable_RabutaBerryTree, + [ITEM_NOMEL_BERRY - FIRST_BERRY_INDEX] = sPicTable_NomelBerryTree, + [ITEM_SPELON_BERRY - FIRST_BERRY_INDEX] = sPicTable_SpelonBerryTree, + [ITEM_PAMTRE_BERRY - FIRST_BERRY_INDEX] = sPicTable_PamtreBerryTree, + [ITEM_WATMEL_BERRY - FIRST_BERRY_INDEX] = sPicTable_RabutaBerryTree, + [ITEM_DURIN_BERRY - FIRST_BERRY_INDEX] = sPicTable_DurinBerryTree, + [ITEM_BELUE_BERRY - FIRST_BERRY_INDEX] = sPicTable_HondewBerryTree, + [ITEM_LIECHI_BERRY - FIRST_BERRY_INDEX] = sPicTable_LiechiBerryTree, + [ITEM_GANLON_BERRY - FIRST_BERRY_INDEX] = sPicTable_HondewBerryTree, + [ITEM_SALAC_BERRY - FIRST_BERRY_INDEX] = sPicTable_AguavBerryTree, + [ITEM_PETAYA_BERRY - FIRST_BERRY_INDEX] = sPicTable_PomegBerryTree, + [ITEM_APICOT_BERRY - FIRST_BERRY_INDEX] = sPicTable_GrepaBerryTree, + [ITEM_LANSAT_BERRY - FIRST_BERRY_INDEX] = sPicTable_LansatBerryTree, + [ITEM_STARF_BERRY - FIRST_BERRY_INDEX] = sPicTable_CornnBerryTree, + [ITEM_ENIGMA_BERRY - FIRST_BERRY_INDEX] = sPicTable_DurinBerryTree, }; const u8 *const gBerryTreePaletteSlotTablePointers[] = { diff --git a/src/data/object_events/movement_action_func_tables.h b/src/data/object_events/movement_action_func_tables.h index 8cf7d1699..4df07be0d 100755 --- a/src/data/object_events/movement_action_func_tables.h +++ b/src/data/object_events/movement_action_func_tables.h @@ -252,7 +252,7 @@ u8 MovementAction_AcroEndWheelieMoveRight_Step0(struct ObjectEvent *, struct Spr u8 MovementAction_AcroEndWheelieMoveRight_Step1(struct ObjectEvent *, struct Sprite *); u8 MovementAction_Levitate_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementAction_StopLevitate_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementAction_DestroyExtraTaskIfAtTop_Step0(struct ObjectEvent *, struct Sprite *); +u8 MovementAction_StopLevitateAtTop_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *, struct Sprite *); u8 MovementAction_Finish(struct ObjectEvent *, struct Sprite *); u8 MovementAction_FreeAndUnlockAnim_Step0(struct ObjectEvent *, struct Sprite *); @@ -416,7 +416,7 @@ u8 (*const gMovementActionFuncs_WalkLeftAffine[])(struct ObjectEvent *, struct S u8 (*const gMovementActionFuncs_WalkRightAffine[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_Levitate[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_StopLevitate[])(struct ObjectEvent *, struct Sprite *); -u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct ObjectEvent *, struct Sprite *); +u8 (*const gMovementActionFuncs_StopLevitateAtTop[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_Figure8[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FlyUp[])(struct ObjectEvent *, struct Sprite *); u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *); @@ -576,7 +576,7 @@ u8 (*const *const gMovementActionFuncs[])(struct ObjectEvent *, struct Sprite *) [MOVEMENT_ACTION_WALK_RIGHT_AFFINE] = gMovementActionFuncs_WalkRightAffine, [MOVEMENT_ACTION_LEVITATE] = gMovementActionFuncs_Levitate, [MOVEMENT_ACTION_STOP_LEVITATE] = gMovementActionFuncs_StopLevitate, - [MOVEMENT_ACTION_DESTROY_EXTRA_TASK_IF_AT_TOP] = gMovementActionFuncs_DestroyExtraTaskIfAtTop, + [MOVEMENT_ACTION_STOP_LEVITATE_AT_TOP] = gMovementActionFuncs_StopLevitateAtTop, [MOVEMENT_ACTION_FIGURE_8] = gMovementActionFuncs_Figure8, [MOVEMENT_ACTION_FLY_UP] = gMovementActionFuncs_FlyUp, [MOVEMENT_ACTION_FLY_DOWN] = gMovementActionFuncs_FlyDown, @@ -602,7 +602,7 @@ u8 (*const gMovementActionFuncs_FaceRight[])(struct ObjectEvent *, struct Sprite MovementAction_PauseSpriteAnim, }; -u8 (*const gUnknown_0850DEE8[])(u8) = { +static u8 (*const sDirectionAnimFuncsBySpeed[])(u8) = { GetMoveDirectionAnimNum, GetMoveDirectionFastAnimNum, GetMoveDirectionFastAnimNum, @@ -706,8 +706,8 @@ u8 (*const gMovementActionFuncs_WalkNormalRight[])(struct ObjectEvent *, struct MovementAction_PauseSpriteAnim, }; -const s16 gUnknown_0850DFBC[] = {0, 1, 1}; -const s16 gUnknown_0850DFC2[] = {0, 0, 1}; +static const s16 sJumpInitDisplacements[] = {0, 1, 1}; +static const s16 sJumpDisplacements[] = {0, 0, 1}; u8 (*const gMovementActionFuncs_Jump2Down[])(struct ObjectEvent *, struct Sprite *) = { MovementAction_Jump2Down_Step0, @@ -1507,7 +1507,7 @@ u8 (*const gMovementActionFuncs_StopLevitate[])(struct ObjectEvent *, struct Spr MovementAction_Finish, }; -u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct ObjectEvent *, struct Sprite *) = { - MovementAction_DestroyExtraTaskIfAtTop_Step0, +u8 (*const gMovementActionFuncs_StopLevitateAtTop[])(struct ObjectEvent *, struct Sprite *) = { + MovementAction_StopLevitateAtTop_Step0, MovementAction_Finish, }; diff --git a/src/data/object_events/movement_type_func_tables.h b/src/data/object_events/movement_type_func_tables.h index 7d149a628..f4890d684 100755 --- a/src/data/object_events/movement_type_func_tables.h +++ b/src/data/object_events/movement_type_func_tables.h @@ -63,11 +63,11 @@ u8 (*const gMovementTypeFuncs_FaceDirection[])(struct ObjectEvent *, struct Spri }; u8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct ObjectEvent *, struct Sprite *) = { - MovementType_BerryTreeGrowth_Step0, - MovementType_BerryTreeGrowth_Step1, - MovementType_BerryTreeGrowth_Step2, - MovementType_BerryTreeGrowth_Step3, - MovementType_BerryTreeGrowth_Step4, + MovementType_BerryTreeGrowth_Normal, + MovementType_BerryTreeGrowth_Move, + MovementType_BerryTreeGrowth_SparkleStart, + MovementType_BerryTreeGrowth_Sparkle, + MovementType_BerryTreeGrowth_SparkleEnd, }; u8 (*const gMovementTypeFuncs_FaceDownAndUp[])(struct ObjectEvent *, struct Sprite *) = { @@ -407,8 +407,8 @@ u8 (*const gMovementTypeFuncs_CopyPlayerInGrass[])(struct ObjectEvent *, struct MovementType_CopyPlayer_Step2, }; -u8 (*const gMovementTypeFuncs_Hidden[])(struct ObjectEvent *, struct Sprite *) = { - MovementType_Hidden_Step0, +u8 (*const gMovementTypeFuncs_Buried[])(struct ObjectEvent *, struct Sprite *) = { + MovementType_Buried_Step0, }; u8 (*const gMovementTypeFuncs_WalkInPlace[])(struct ObjectEvent *, struct Sprite *) = { diff --git a/src/data/object_events/object_event_anims.h b/src/data/object_events/object_event_anims.h index b319c2845..93f402258 100755 --- a/src/data/object_events/object_event_anims.h +++ b/src/data/object_events/object_event_anims.h @@ -1,4 +1,4 @@ -const union AnimCmd gObjectEventImageAnim_StayStill[] = +static const union AnimCmd sAnim_StayStill[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(0, 8), @@ -7,31 +7,31 @@ const union AnimCmd gObjectEventImageAnim_StayStill[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpFaceSouth[] = +static const union AnimCmd sAnim_QuintyPlumpFaceSouth[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpFaceNorth[] = +static const union AnimCmd sAnim_QuintyPlumpFaceNorth[] = { ANIMCMD_FRAME(1, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpFaceWest[] = +static const union AnimCmd sAnim_QuintyPlumpFaceWest[] = { ANIMCMD_FRAME(2, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpFaceEast[] = +static const union AnimCmd sAnim_QuintyPlumpFaceEast[] = { ANIMCMD_FRAME(2, 16, .hFlip = TRUE), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoSouth[] = +static const union AnimCmd sAnim_QuintyPlumpGoSouth[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(0, 8), @@ -40,7 +40,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoNorth[] = +static const union AnimCmd sAnim_QuintyPlumpGoNorth[] = { ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(1, 8), @@ -49,7 +49,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoWest[] = +static const union AnimCmd sAnim_QuintyPlumpGoWest[] = { ANIMCMD_FRAME(5, 8), ANIMCMD_FRAME(2, 8), @@ -58,7 +58,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoEast[] = +static const union AnimCmd sAnim_QuintyPlumpGoEast[] = { ANIMCMD_FRAME(5, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), @@ -67,7 +67,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastSouth[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastSouth[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), @@ -76,7 +76,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastNorth[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastNorth[] = { ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(1, 4), @@ -85,7 +85,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastWest[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastWest[] = { ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(2, 4), @@ -94,7 +94,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastEast[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastEast[] = { ANIMCMD_FRAME(5, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), @@ -103,7 +103,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterSouth[] = +static const union AnimCmd sAnim_QuintyPlumpGoFasterSouth[] = { ANIMCMD_FRAME(3, 2), ANIMCMD_FRAME(0, 2), @@ -112,7 +112,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterNorth[] = +static const union AnimCmd sAnim_QuintyPlumpGoFasterNorth[] = { ANIMCMD_FRAME(4, 2), ANIMCMD_FRAME(1, 2), @@ -121,7 +121,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterWest[] = +static const union AnimCmd sAnim_QuintyPlumpGoFasterWest[] = { ANIMCMD_FRAME(5, 2), ANIMCMD_FRAME(2, 2), @@ -130,7 +130,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterEast[] = +static const union AnimCmd sAnim_QuintyPlumpGoFasterEast[] = { ANIMCMD_FRAME(5, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), @@ -139,7 +139,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFasterEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestSouth[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastestSouth[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(0, 1), @@ -148,7 +148,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestNorth[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastestNorth[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_FRAME(1, 1), @@ -157,7 +157,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestWest[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastestWest[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_FRAME(2, 1), @@ -166,7 +166,7 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestEast[] = +static const union AnimCmd sAnim_QuintyPlumpGoFastestEast[] = { ANIMCMD_FRAME(5, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), @@ -175,31 +175,31 @@ const union AnimCmd gObjectEventImageAnim_QuintyPlumpGoFastestEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_FaceSouth[] = +static const union AnimCmd sAnim_FaceSouth[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_FaceNorth[] = +static const union AnimCmd sAnim_FaceNorth[] = { ANIMCMD_FRAME(1, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_FaceWest[] = +static const union AnimCmd sAnim_FaceWest[] = { ANIMCMD_FRAME(2, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_FaceEast[] = +static const union AnimCmd sAnim_FaceEast[] = { ANIMCMD_FRAME(2, 16, .hFlip = TRUE), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoSouth[] = +static const union AnimCmd sAnim_GoSouth[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(0, 8), @@ -208,7 +208,7 @@ const union AnimCmd gObjectEventImageAnim_GoSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoNorth[] = +static const union AnimCmd sAnim_GoNorth[] = { ANIMCMD_FRAME(5, 8), ANIMCMD_FRAME(1, 8), @@ -217,7 +217,7 @@ const union AnimCmd gObjectEventImageAnim_GoNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoWest[] = +static const union AnimCmd sAnim_GoWest[] = { ANIMCMD_FRAME(7, 8), ANIMCMD_FRAME(2, 8), @@ -226,7 +226,7 @@ const union AnimCmd gObjectEventImageAnim_GoWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoEast[] = +static const union AnimCmd sAnim_GoEast[] = { ANIMCMD_FRAME(7, 8, .hFlip = TRUE), ANIMCMD_FRAME(2, 8, .hFlip = TRUE), @@ -235,7 +235,7 @@ const union AnimCmd gObjectEventImageAnim_GoEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastSouth[] = +static const union AnimCmd sAnim_GoFastSouth[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(0, 4), @@ -244,7 +244,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastNorth[] = +static const union AnimCmd sAnim_GoFastNorth[] = { ANIMCMD_FRAME(5, 4), ANIMCMD_FRAME(1, 4), @@ -253,7 +253,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastWest[] = +static const union AnimCmd sAnim_GoFastWest[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(2, 4), @@ -262,7 +262,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastEast[] = +static const union AnimCmd sAnim_GoFastEast[] = { ANIMCMD_FRAME(7, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), @@ -271,7 +271,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFasterSouth[] = +static const union AnimCmd sAnim_GoFasterSouth[] = { ANIMCMD_FRAME(3, 2), ANIMCMD_FRAME(0, 2), @@ -280,7 +280,7 @@ const union AnimCmd gObjectEventImageAnim_GoFasterSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFasterNorth[] = +static const union AnimCmd sAnim_GoFasterNorth[] = { ANIMCMD_FRAME(5, 2), ANIMCMD_FRAME(1, 2), @@ -289,7 +289,7 @@ const union AnimCmd gObjectEventImageAnim_GoFasterNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFasterWest[] = +static const union AnimCmd sAnim_GoFasterWest[] = { ANIMCMD_FRAME(7, 2), ANIMCMD_FRAME(2, 2), @@ -298,7 +298,7 @@ const union AnimCmd gObjectEventImageAnim_GoFasterWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFasterEast[] = +static const union AnimCmd sAnim_GoFasterEast[] = { ANIMCMD_FRAME(7, 2, .hFlip = TRUE), ANIMCMD_FRAME(2, 2, .hFlip = TRUE), @@ -307,7 +307,7 @@ const union AnimCmd gObjectEventImageAnim_GoFasterEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastestSouth[] = +static const union AnimCmd sAnim_GoFastestSouth[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_FRAME(0, 1), @@ -316,7 +316,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastestSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastestNorth[] = +static const union AnimCmd sAnim_GoFastestNorth[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_FRAME(1, 1), @@ -325,7 +325,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastestNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastestWest[] = +static const union AnimCmd sAnim_GoFastestWest[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_FRAME(2, 1), @@ -334,7 +334,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastestWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GoFastestEast[] = +static const union AnimCmd sAnim_GoFastestEast[] = { ANIMCMD_FRAME(7, 1, .hFlip = TRUE), ANIMCMD_FRAME(2, 1, .hFlip = TRUE), @@ -343,7 +343,7 @@ const union AnimCmd gObjectEventImageAnim_GoFastestEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_RunSouth[] = +static const union AnimCmd sAnim_RunSouth[] = { ANIMCMD_FRAME(12, 5), ANIMCMD_FRAME(9, 3), @@ -352,7 +352,7 @@ const union AnimCmd gObjectEventImageAnim_RunSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_RunNorth[] = +static const union AnimCmd sAnim_RunNorth[] = { ANIMCMD_FRAME(14, 5), ANIMCMD_FRAME(10, 3), @@ -361,7 +361,7 @@ const union AnimCmd gObjectEventImageAnim_RunNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_RunWest[] = +static const union AnimCmd sAnim_RunWest[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(11, 3), @@ -370,7 +370,7 @@ const union AnimCmd gObjectEventImageAnim_RunWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_RunEast[] = +static const union AnimCmd sAnim_RunEast[] = { ANIMCMD_FRAME(16, 5, .hFlip = TRUE), ANIMCMD_FRAME(11, 3, .hFlip = TRUE), @@ -379,7 +379,7 @@ const union AnimCmd gObjectEventImageAnim_RunEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_FieldMove[] = +static const union AnimCmd sAnim_FieldMove[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), @@ -389,143 +389,143 @@ const union AnimCmd gObjectEventImageAnim_FieldMove[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_GetOnOffSurfBlobSouth[] = +static const union AnimCmd sAnim_GetOnOffSurfBlobSouth[] = { ANIMCMD_FRAME(9, 32), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GetOnOffSurfBlobNorth[] = +static const union AnimCmd sAnim_GetOnOffSurfBlobNorth[] = { ANIMCMD_FRAME(10, 32), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GetOnOffSurfBlobWest[] = +static const union AnimCmd sAnim_GetOnOffSurfBlobWest[] = { ANIMCMD_FRAME(11, 32), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_GetOnOffSurfBlobEast[] = +static const union AnimCmd sAnim_GetOnOffSurfBlobEast[] = { ANIMCMD_FRAME(11, 32, .hFlip = TRUE), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyBackWheelSouth[] = +static const union AnimCmd sAnim_BunnyHoppyBackWheelSouth[] = { ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(10, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyBackWheelNorth[] = +static const union AnimCmd sAnim_BunnyHoppyBackWheelNorth[] = { ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(14, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyBackWheelWest[] = +static const union AnimCmd sAnim_BunnyHoppyBackWheelWest[] = { ANIMCMD_FRAME(17, 4), ANIMCMD_FRAME(18, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyBackWheelEast[] = +static const union AnimCmd sAnim_BunnyHoppyBackWheelEast[] = { ANIMCMD_FRAME(17, 4, .hFlip = TRUE), ANIMCMD_FRAME(18, 4, .hFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyFrontWheelSouth[] = +static const union AnimCmd sAnim_BunnyHoppyFrontWheelSouth[] = { ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyFrontWheelNorth[] = +static const union AnimCmd sAnim_BunnyHoppyFrontWheelNorth[] = { ANIMCMD_FRAME(15, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyFrontWheelWest[] = +static const union AnimCmd sAnim_BunnyHoppyFrontWheelWest[] = { ANIMCMD_FRAME(19, 4), ANIMCMD_FRAME(20, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BunnyHoppyFrontWheelEast[] = +static const union AnimCmd sAnim_BunnyHoppyFrontWheelEast[] = { ANIMCMD_FRAME(19, 4, .hFlip = TRUE), ANIMCMD_FRAME(20, 4, .hFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieBackWheelSouth[] = +static const union AnimCmd sAnim_StandingWheelieBackWheelSouth[] = { ANIMCMD_FRAME(9, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieBackWheelNorth[] = +static const union AnimCmd sAnim_StandingWheelieBackWheelNorth[] = { ANIMCMD_FRAME(13, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieBackWheelWest[] = +static const union AnimCmd sAnim_StandingWheelieBackWheelWest[] = { ANIMCMD_FRAME(17, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieBackWheelEast[] = +static const union AnimCmd sAnim_StandingWheelieBackWheelEast[] = { ANIMCMD_FRAME(17, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieFrontWheelSouth[] = +static const union AnimCmd sAnim_StandingWheelieFrontWheelSouth[] = { ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieFrontWheelNorth[] = +static const union AnimCmd sAnim_StandingWheelieFrontWheelNorth[] = { ANIMCMD_FRAME(15, 4), ANIMCMD_FRAME(1, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieFrontWheelWest[] = +static const union AnimCmd sAnim_StandingWheelieFrontWheelWest[] = { ANIMCMD_FRAME(19, 4), ANIMCMD_FRAME(2, 4), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_StandingWheelieFrontWheelEast[] = +static const union AnimCmd sAnim_StandingWheelieFrontWheelEast[] = { ANIMCMD_FRAME(19, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_MovingWheelieSouth[] = +static const union AnimCmd sAnim_MovingWheelieSouth[] = { ANIMCMD_FRAME(21, 4), ANIMCMD_FRAME(10, 4), @@ -534,7 +534,7 @@ const union AnimCmd gObjectEventImageAnim_MovingWheelieSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_MovingWheelieNorth[] = +static const union AnimCmd sAnim_MovingWheelieNorth[] = { ANIMCMD_FRAME(23, 4), ANIMCMD_FRAME(14, 4), @@ -543,7 +543,7 @@ const union AnimCmd gObjectEventImageAnim_MovingWheelieNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_MovingWheelieWest[] = +static const union AnimCmd sAnim_MovingWheelieWest[] = { ANIMCMD_FRAME(25, 4), ANIMCMD_FRAME(18, 4), @@ -552,7 +552,7 @@ const union AnimCmd gObjectEventImageAnim_MovingWheelieWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_MovingWheelieEast[] = +static const union AnimCmd sAnim_MovingWheelieEast[] = { ANIMCMD_FRAME(25, 4, .hFlip = TRUE), ANIMCMD_FRAME(18, 4, .hFlip = TRUE), @@ -561,27 +561,27 @@ const union AnimCmd gObjectEventImageAnim_MovingWheelieEast[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_BerryTreeStage0[] = +static const union AnimCmd sAnim_BerryTreeStage0[] = { ANIMCMD_FRAME(0, 32), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BerryTreeStage1[] = +static const union AnimCmd sAnim_BerryTreeStage1[] = { ANIMCMD_FRAME(1, 32), ANIMCMD_FRAME(2, 32), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BerryTreeStage2[] = +static const union AnimCmd sAnim_BerryTreeStage2[] = { ANIMCMD_FRAME(3, 48), ANIMCMD_FRAME(4, 48), ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BerryTreeStage3[] = +static const union AnimCmd sAnim_BerryTreeStage3[] = { ANIMCMD_FRAME(5, 32), ANIMCMD_FRAME(5, 32), @@ -590,7 +590,7 @@ const union AnimCmd gObjectEventImageAnim_BerryTreeStage3[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_BerryTreeStage4[] = +static const union AnimCmd sAnim_BerryTreeStage4[] = { ANIMCMD_FRAME(7, 48), ANIMCMD_FRAME(7, 48), @@ -599,7 +599,7 @@ const union AnimCmd gObjectEventImageAnim_BerryTreeStage4[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_NurseBow[] = +static const union AnimCmd sAnim_NurseBow[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(9, 32), @@ -607,7 +607,7 @@ const union AnimCmd gObjectEventImageAnim_NurseBow[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_RockBreak[] = +static const union AnimCmd sAnim_RockBreak[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(1, 8), @@ -616,7 +616,7 @@ const union AnimCmd gObjectEventImageAnim_RockBreak[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_TreeCut[] = +static const union AnimCmd sAnim_TreeCut[] = { ANIMCMD_FRAME(0, 6), ANIMCMD_FRAME(1, 6), @@ -625,7 +625,7 @@ const union AnimCmd gObjectEventImageAnim_TreeCut[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_TakeOutRodSouth[] = +static const union AnimCmd sAnim_TakeOutRodSouth[] = { ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(9, 4), @@ -634,7 +634,7 @@ const union AnimCmd gObjectEventImageAnim_TakeOutRodSouth[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_TakeOutRodNorth[] = +static const union AnimCmd sAnim_TakeOutRodNorth[] = { ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(5, 4), @@ -643,7 +643,7 @@ const union AnimCmd gObjectEventImageAnim_TakeOutRodNorth[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_TakeOutRodWest[] = +static const union AnimCmd sAnim_TakeOutRodWest[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(1, 4), @@ -652,7 +652,7 @@ const union AnimCmd gObjectEventImageAnim_TakeOutRodWest[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_TakeOutRodEast[] = +static const union AnimCmd sAnim_TakeOutRodEast[] = { ANIMCMD_FRAME(0, 4, .hFlip = TRUE), ANIMCMD_FRAME(1, 4, .hFlip = TRUE), @@ -661,7 +661,7 @@ const union AnimCmd gObjectEventImageAnim_TakeOutRodEast[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_PutAwayRodSouth[] = +static const union AnimCmd sAnim_PutAwayRodSouth[] = { ANIMCMD_FRAME(11, 4), ANIMCMD_FRAME(10, 6), @@ -670,7 +670,7 @@ const union AnimCmd gObjectEventImageAnim_PutAwayRodSouth[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_PutAwayRodNorth[] = +static const union AnimCmd sAnim_PutAwayRodNorth[] = { ANIMCMD_FRAME(7, 4), ANIMCMD_FRAME(6, 6), @@ -679,7 +679,7 @@ const union AnimCmd gObjectEventImageAnim_PutAwayRodNorth[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_PutAwayRodWest[] = +static const union AnimCmd sAnim_PutAwayRodWest[] = { ANIMCMD_FRAME(3, 4), ANIMCMD_FRAME(2, 4), @@ -688,7 +688,7 @@ const union AnimCmd gObjectEventImageAnim_PutAwayRodWest[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_PutAwayRodEast[] = +static const union AnimCmd sAnim_PutAwayRodEast[] = { ANIMCMD_FRAME(3, 4, .hFlip = TRUE), ANIMCMD_FRAME(2, 4, .hFlip = TRUE), @@ -697,7 +697,7 @@ const union AnimCmd gObjectEventImageAnim_PutAwayRodEast[] = ANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_HookedPokemonSouth[] = +static const union AnimCmd sAnim_HookedPokemonSouth[] = { ANIMCMD_FRAME(10, 6), ANIMCMD_FRAME(11, 6), @@ -706,7 +706,7 @@ const union AnimCmd gObjectEventImageAnim_HookedPokemonSouth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_HookedPokemonNorth[] = +static const union AnimCmd sAnim_HookedPokemonNorth[] = { ANIMCMD_FRAME(6, 6), ANIMCMD_FRAME(7, 6), @@ -715,7 +715,7 @@ const union AnimCmd gObjectEventImageAnim_HookedPokemonNorth[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_HookedPokemonWest[] = +static const union AnimCmd sAnim_HookedPokemonWest[] = { ANIMCMD_FRAME(2, 6), ANIMCMD_FRAME(3, 6), @@ -724,7 +724,7 @@ const union AnimCmd gObjectEventImageAnim_HookedPokemonWest[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_HookedPokemonEast[] = +static const union AnimCmd sAnim_HookedPokemonEast[] = { ANIMCMD_FRAME(2, 6, .hFlip = TRUE), ANIMCMD_FRAME(3, 6, .hFlip = TRUE), @@ -733,7 +733,7 @@ const union AnimCmd gObjectEventImageAnim_HookedPokemonEast[] = ANIMCMD_JUMP(0), }; -const union AffineAnimCmd gObjectEventRotScalAnim_8508FD8[] = +static const union AffineAnimCmd sAffineAnim_KyogreGroudon_GoSouthStart[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), @@ -743,7 +743,7 @@ const union AffineAnimCmd gObjectEventRotScalAnim_8508FD8[] = AFFINEANIMCMD_JUMP(0), }; -const union AffineAnimCmd gObjectEventRotScalAnim_8509008[] = +static const union AffineAnimCmd sAffineAnim_KyogreGroudon_GoSouth[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), @@ -754,33 +754,33 @@ const union AffineAnimCmd gObjectEventRotScalAnim_8509008[] = AFFINEANIMCMD_JUMP(0), }; -const union AffineAnimCmd gObjectEventRotScalAnim_8509040[] = +static const union AffineAnimCmd sAffineAnim_KyogreGroudon_AttackEast[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 10, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gObjectEventRotScalAnim_8509050[] = +static const union AffineAnimCmd sAffineAnim_KyogreGroudon_AttackWest[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 10, 0), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gObjectEventRotScalAnim_8509060[] = +static const union AffineAnimCmd sAffineAnim_KyogreGroudon_DipEast[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1), AFFINEANIMCMD_LOOP(8), AFFINEANIMCMD_END, }; -const union AffineAnimCmd gObjectEventRotScalAnim_8509078[] = +static const union AffineAnimCmd sAffineAnim_KyogreGroudon_DipWest[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), AFFINEANIMCMD_LOOP(8), AFFINEANIMCMD_END, }; -const union AnimCmd gObjectEventImageAnim_HoOhFlapWings[] = +static const union AnimCmd sAnim_HoOhFlapWings[] = { ANIMCMD_FRAME(3, 8), ANIMCMD_FRAME(4, 8), @@ -789,383 +789,389 @@ const union AnimCmd gObjectEventImageAnim_HoOhFlapWings[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_HoOhStayStill[] = +static const union AnimCmd sAnim_HoOhStayStill[] = { ANIMCMD_FRAME(3, 16), ANIMCMD_JUMP(0), }; -const union AnimCmd *const gObjectEventImageAnimTable_Inanimate[] = { - gObjectEventImageAnim_StayStill, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_QuintyPlump[] = { - gObjectEventImageAnim_QuintyPlumpFaceSouth, - gObjectEventImageAnim_QuintyPlumpFaceNorth, - gObjectEventImageAnim_QuintyPlumpFaceWest, - gObjectEventImageAnim_QuintyPlumpFaceEast, - gObjectEventImageAnim_QuintyPlumpGoSouth, - gObjectEventImageAnim_QuintyPlumpGoNorth, - gObjectEventImageAnim_QuintyPlumpGoWest, - gObjectEventImageAnim_QuintyPlumpGoEast, - gObjectEventImageAnim_QuintyPlumpGoFastSouth, - gObjectEventImageAnim_QuintyPlumpGoFastNorth, - gObjectEventImageAnim_QuintyPlumpGoFastWest, - gObjectEventImageAnim_QuintyPlumpGoFastEast, - gObjectEventImageAnim_QuintyPlumpGoFasterSouth, - gObjectEventImageAnim_QuintyPlumpGoFasterNorth, - gObjectEventImageAnim_QuintyPlumpGoFasterWest, - gObjectEventImageAnim_QuintyPlumpGoFasterEast, - gObjectEventImageAnim_QuintyPlumpGoFastestSouth, - gObjectEventImageAnim_QuintyPlumpGoFastestNorth, - gObjectEventImageAnim_QuintyPlumpGoFastestWest, - gObjectEventImageAnim_QuintyPlumpGoFastestEast, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_Standard[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_GoSouth, - gObjectEventImageAnim_GoNorth, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastNorth, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterNorth, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestNorth, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_HoOh[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_HoOhFlapWings, - gObjectEventImageAnim_HoOhStayStill, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastNorth, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterNorth, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestNorth, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_Groudon3[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_GoSouth, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestEast, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, -}; - -const union AnimCmd gObjectEventImageAnim_85091F0[] = +static const union AnimCmd *const sAnimTable_Inanimate[] = { + sAnim_StayStill, +}; + +static const union AnimCmd *const sAnimTable_QuintyPlump[] = { + sAnim_QuintyPlumpFaceSouth, + sAnim_QuintyPlumpFaceNorth, + sAnim_QuintyPlumpFaceWest, + sAnim_QuintyPlumpFaceEast, + sAnim_QuintyPlumpGoSouth, + sAnim_QuintyPlumpGoNorth, + sAnim_QuintyPlumpGoWest, + sAnim_QuintyPlumpGoEast, + sAnim_QuintyPlumpGoFastSouth, + sAnim_QuintyPlumpGoFastNorth, + sAnim_QuintyPlumpGoFastWest, + sAnim_QuintyPlumpGoFastEast, + sAnim_QuintyPlumpGoFasterSouth, + sAnim_QuintyPlumpGoFasterNorth, + sAnim_QuintyPlumpGoFasterWest, + sAnim_QuintyPlumpGoFasterEast, + sAnim_QuintyPlumpGoFastestSouth, + sAnim_QuintyPlumpGoFastestNorth, + sAnim_QuintyPlumpGoFastestWest, + sAnim_QuintyPlumpGoFastestEast, +}; + +static const union AnimCmd *const sAnimTable_Standard[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_GoSouth, + sAnim_GoNorth, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastNorth, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterNorth, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestNorth, + sAnim_GoFastestWest, + sAnim_GoFastestEast, +}; + +static const union AnimCmd *const sAnimTable_HoOh[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_HoOhFlapWings, + sAnim_HoOhStayStill, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastNorth, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterNorth, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestNorth, + sAnim_GoFastestWest, + sAnim_GoFastestEast, +}; + +static const union AnimCmd *const sAnimTable_GroudonSide[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_GoSouth, + sAnim_GoEast, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastEast, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterEast, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestEast, + sAnim_GoFastestWest, + sAnim_GoFastestEast, +}; + +static const union AnimCmd sAnim_RayquazaCoiledAwake[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_85091F8[] = +static const union AnimCmd sAnim_RayquazaFlyUp[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509200[] = +static const union AnimCmd sAnim_RayquazaCoiledAsleep[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509208[] = +static const union AnimCmd sAnim_RayquazaCoiledMouthOpen[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509210[] = +static const union AnimCmd sAnim_RayquazaNormal[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509218[] = +// Identical to sAnim_RayquazaCoiledAsleep +static const union AnimCmd sAnim_RayquazaFaceSouth[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509220[] = +// Identical to sAnim_RayquazaCoiledAsleep +static const union AnimCmd sAnim_RayquazaFaceNorth[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509228[] = +// Identical to sAnim_RayquazaCoiledAsleep +static const union AnimCmd sAnim_RayquazaFaceWest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd gObjectEventImageAnim_8509230[] = +// Identical to sAnim_RayquazaNormal +static const union AnimCmd sAnim_RayquazaFaceEast[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_JUMP(0), }; -const union AnimCmd *const gObjectEventImageAnimTable_Rayquaza2[] = { - gObjectEventImageAnim_8509218, - gObjectEventImageAnim_8509220, - gObjectEventImageAnim_8509228, - gObjectEventImageAnim_8509230, - gObjectEventImageAnim_8509200, - gObjectEventImageAnim_85091F8, - gObjectEventImageAnim_8509208, - gObjectEventImageAnim_8509210, - gObjectEventImageAnim_8509200, - gObjectEventImageAnim_85091F8, - gObjectEventImageAnim_85091F0, - gObjectEventImageAnim_8509210, - gObjectEventImageAnim_8509200, - gObjectEventImageAnim_85091F8, - gObjectEventImageAnim_8509208, - gObjectEventImageAnim_8509210, - gObjectEventImageAnim_8509200, - gObjectEventImageAnim_85091F8, - gObjectEventImageAnim_8509208, - gObjectEventImageAnim_8509210, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_BrendanMayNormal[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_GoSouth, - gObjectEventImageAnim_GoNorth, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastNorth, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterNorth, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestNorth, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, - gObjectEventImageAnim_RunSouth, - gObjectEventImageAnim_RunNorth, - gObjectEventImageAnim_RunWest, - gObjectEventImageAnim_RunEast, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_AcroBike[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_GoSouth, - gObjectEventImageAnim_GoNorth, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastNorth, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterNorth, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestNorth, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, - gObjectEventImageAnim_BunnyHoppyBackWheelSouth, - gObjectEventImageAnim_BunnyHoppyBackWheelNorth, - gObjectEventImageAnim_BunnyHoppyBackWheelWest, - gObjectEventImageAnim_BunnyHoppyBackWheelEast, - gObjectEventImageAnim_BunnyHoppyFrontWheelSouth, - gObjectEventImageAnim_BunnyHoppyFrontWheelNorth, - gObjectEventImageAnim_BunnyHoppyFrontWheelWest, - gObjectEventImageAnim_BunnyHoppyFrontWheelEast, - gObjectEventImageAnim_StandingWheelieBackWheelSouth, - gObjectEventImageAnim_StandingWheelieBackWheelNorth, - gObjectEventImageAnim_StandingWheelieBackWheelWest, - gObjectEventImageAnim_StandingWheelieBackWheelEast, - gObjectEventImageAnim_StandingWheelieFrontWheelSouth, - gObjectEventImageAnim_StandingWheelieFrontWheelNorth, - gObjectEventImageAnim_StandingWheelieFrontWheelWest, - gObjectEventImageAnim_StandingWheelieFrontWheelEast, - gObjectEventImageAnim_MovingWheelieSouth, - gObjectEventImageAnim_MovingWheelieNorth, - gObjectEventImageAnim_MovingWheelieWest, - gObjectEventImageAnim_MovingWheelieEast, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_Surfing[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_GoSouth, - gObjectEventImageAnim_GoNorth, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastNorth, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterNorth, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestNorth, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, - gObjectEventImageAnim_GetOnOffSurfBlobSouth, - gObjectEventImageAnim_GetOnOffSurfBlobNorth, - gObjectEventImageAnim_GetOnOffSurfBlobWest, - gObjectEventImageAnim_GetOnOffSurfBlobEast, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_Nurse[] = { - gObjectEventImageAnim_FaceSouth, - gObjectEventImageAnim_FaceNorth, - gObjectEventImageAnim_FaceWest, - gObjectEventImageAnim_FaceEast, - gObjectEventImageAnim_GoSouth, - gObjectEventImageAnim_GoNorth, - gObjectEventImageAnim_GoWest, - gObjectEventImageAnim_GoEast, - gObjectEventImageAnim_GoFastSouth, - gObjectEventImageAnim_GoFastNorth, - gObjectEventImageAnim_GoFastWest, - gObjectEventImageAnim_GoFastEast, - gObjectEventImageAnim_GoFasterSouth, - gObjectEventImageAnim_GoFasterNorth, - gObjectEventImageAnim_GoFasterWest, - gObjectEventImageAnim_GoFasterEast, - gObjectEventImageAnim_GoFastestSouth, - gObjectEventImageAnim_GoFastestNorth, - gObjectEventImageAnim_GoFastestWest, - gObjectEventImageAnim_GoFastestEast, - gObjectEventImageAnim_NurseBow, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_FieldMove[] = { - gObjectEventImageAnim_FieldMove, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_BerryTree[] = { - gObjectEventImageAnim_BerryTreeStage0, - gObjectEventImageAnim_BerryTreeStage1, - gObjectEventImageAnim_BerryTreeStage2, - gObjectEventImageAnim_BerryTreeStage3, - gObjectEventImageAnim_BerryTreeStage4, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_BreakableRock[] = { - gObjectEventImageAnim_StayStill, - gObjectEventImageAnim_RockBreak, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_CuttableTree[] = { - gObjectEventImageAnim_StayStill, - gObjectEventImageAnim_TreeCut, -}; - -const union AnimCmd *const gObjectEventImageAnimTable_Fishing[] = { - gObjectEventImageAnim_TakeOutRodSouth, - gObjectEventImageAnim_TakeOutRodNorth, - gObjectEventImageAnim_TakeOutRodWest, - gObjectEventImageAnim_TakeOutRodEast, - gObjectEventImageAnim_PutAwayRodSouth, - gObjectEventImageAnim_PutAwayRodNorth, - gObjectEventImageAnim_PutAwayRodWest, - gObjectEventImageAnim_PutAwayRodEast, - gObjectEventImageAnim_HookedPokemonSouth, - gObjectEventImageAnim_HookedPokemonNorth, - gObjectEventImageAnim_HookedPokemonWest, - gObjectEventImageAnim_HookedPokemonEast, -}; - -const union AffineAnimCmd *const gObjectEventRotScalAnimTable_KyogreGroudon[] = { - gObjectEventRotScalAnim_8508FD8, - gObjectEventRotScalAnim_8509008, - gObjectEventRotScalAnim_8509050, - gObjectEventRotScalAnim_8509040, - gObjectEventRotScalAnim_8509078, - gObjectEventRotScalAnim_8509060, -}; - -const struct UnkStruct_085094AC gUnknown_085094AC[] = { +// Though they correspond to facing/walking movements, Rayquaza doesn't have +// equivalent images aside from flying up. Its other frames aside from the 'normal' +// frame are for the sequence where it awakens on Sky Pillar. +// The corresponding facing/walking movements are commented alongside +static const union AnimCmd *const sAnimTable_Rayquaza[] = { + sAnim_RayquazaFaceSouth, // Face South + sAnim_RayquazaFaceNorth, // Face North + sAnim_RayquazaFaceWest, // Face West + sAnim_RayquazaFaceEast, // Face East + sAnim_RayquazaCoiledAsleep, // Go South + sAnim_RayquazaFlyUp, // Go North + sAnim_RayquazaCoiledMouthOpen, // Go West + sAnim_RayquazaNormal, // Go East + sAnim_RayquazaCoiledAsleep, // Go fast South + sAnim_RayquazaFlyUp, // Go fast North + sAnim_RayquazaCoiledAwake, // Go fast West + sAnim_RayquazaNormal, // Go fast East + sAnim_RayquazaCoiledAsleep, // Go faster South + sAnim_RayquazaFlyUp, // Go faster North + sAnim_RayquazaCoiledMouthOpen, // Go faster West + sAnim_RayquazaNormal, // Go faster East + sAnim_RayquazaCoiledAsleep, // Go fastest South + sAnim_RayquazaFlyUp, // Go fastest North + sAnim_RayquazaCoiledMouthOpen, // Go fastest West + sAnim_RayquazaNormal, // Go fastest East +}; + +static const union AnimCmd *const sAnimTable_BrendanMayNormal[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_GoSouth, + sAnim_GoNorth, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastNorth, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterNorth, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestNorth, + sAnim_GoFastestWest, + sAnim_GoFastestEast, + sAnim_RunSouth, + sAnim_RunNorth, + sAnim_RunWest, + sAnim_RunEast, +}; + +static const union AnimCmd *const sAnimTable_AcroBike[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_GoSouth, + sAnim_GoNorth, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastNorth, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterNorth, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestNorth, + sAnim_GoFastestWest, + sAnim_GoFastestEast, + sAnim_BunnyHoppyBackWheelSouth, + sAnim_BunnyHoppyBackWheelNorth, + sAnim_BunnyHoppyBackWheelWest, + sAnim_BunnyHoppyBackWheelEast, + sAnim_BunnyHoppyFrontWheelSouth, + sAnim_BunnyHoppyFrontWheelNorth, + sAnim_BunnyHoppyFrontWheelWest, + sAnim_BunnyHoppyFrontWheelEast, + sAnim_StandingWheelieBackWheelSouth, + sAnim_StandingWheelieBackWheelNorth, + sAnim_StandingWheelieBackWheelWest, + sAnim_StandingWheelieBackWheelEast, + sAnim_StandingWheelieFrontWheelSouth, + sAnim_StandingWheelieFrontWheelNorth, + sAnim_StandingWheelieFrontWheelWest, + sAnim_StandingWheelieFrontWheelEast, + sAnim_MovingWheelieSouth, + sAnim_MovingWheelieNorth, + sAnim_MovingWheelieWest, + sAnim_MovingWheelieEast, +}; + +static const union AnimCmd *const sAnimTable_Surfing[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_GoSouth, + sAnim_GoNorth, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastNorth, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterNorth, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestNorth, + sAnim_GoFastestWest, + sAnim_GoFastestEast, + sAnim_GetOnOffSurfBlobSouth, + sAnim_GetOnOffSurfBlobNorth, + sAnim_GetOnOffSurfBlobWest, + sAnim_GetOnOffSurfBlobEast, +}; + +static const union AnimCmd *const sAnimTable_Nurse[] = { + sAnim_FaceSouth, + sAnim_FaceNorth, + sAnim_FaceWest, + sAnim_FaceEast, + sAnim_GoSouth, + sAnim_GoNorth, + sAnim_GoWest, + sAnim_GoEast, + sAnim_GoFastSouth, + sAnim_GoFastNorth, + sAnim_GoFastWest, + sAnim_GoFastEast, + sAnim_GoFasterSouth, + sAnim_GoFasterNorth, + sAnim_GoFasterWest, + sAnim_GoFasterEast, + sAnim_GoFastestSouth, + sAnim_GoFastestNorth, + sAnim_GoFastestWest, + sAnim_GoFastestEast, + sAnim_NurseBow, +}; + +static const union AnimCmd *const sAnimTable_FieldMove[] = { + sAnim_FieldMove, +}; + +static const union AnimCmd *const sAnimTable_BerryTree[] = { + sAnim_BerryTreeStage0, + sAnim_BerryTreeStage1, + sAnim_BerryTreeStage2, + sAnim_BerryTreeStage3, + sAnim_BerryTreeStage4, +}; + +static const union AnimCmd *const sAnimTable_BreakableRock[] = { + sAnim_StayStill, + sAnim_RockBreak, +}; + +static const union AnimCmd *const sAnimTable_CuttableTree[] = { + sAnim_StayStill, + sAnim_TreeCut, +}; + +static const union AnimCmd *const sAnimTable_Fishing[] = { + sAnim_TakeOutRodSouth, + sAnim_TakeOutRodNorth, + sAnim_TakeOutRodWest, + sAnim_TakeOutRodEast, + sAnim_PutAwayRodSouth, + sAnim_PutAwayRodNorth, + sAnim_PutAwayRodWest, + sAnim_PutAwayRodEast, + sAnim_HookedPokemonSouth, + sAnim_HookedPokemonNorth, + sAnim_HookedPokemonWest, + sAnim_HookedPokemonEast, +}; + +static const union AffineAnimCmd *const sAffineAnimTable_KyogreGroudon[] = { + sAffineAnim_KyogreGroudon_GoSouthStart, // Used by Kyogre/Groudon when awakened + sAffineAnim_KyogreGroudon_GoSouth, // Used by Kyogre/Groudon when awakened + sAffineAnim_KyogreGroudon_AttackWest, // Used by Kyogre during Sootopolis fight + sAffineAnim_KyogreGroudon_AttackEast, // Unused + sAffineAnim_KyogreGroudon_DipWest, // Unused + sAffineAnim_KyogreGroudon_DipEast, // Unused +}; + +// For animations with alternating steps +static const struct StepAnimTable sStepAnimTables[] = { { - .anims = gObjectEventImageAnimTable_QuintyPlump, + .anims = sAnimTable_QuintyPlump, .animPos = {1, 3, 0, 2}, }, { - .anims = gObjectEventImageAnimTable_Standard, + .anims = sAnimTable_Standard, .animPos = {1, 3, 0, 2}, }, { - .anims = gObjectEventImageAnimTable_BrendanMayNormal, + .anims = sAnimTable_BrendanMayNormal, .animPos = {1, 3, 0, 2}, }, { - .anims = gObjectEventImageAnimTable_AcroBike, + .anims = sAnimTable_AcroBike, .animPos = {1, 3, 0, 2}, }, { - .anims = gObjectEventImageAnimTable_Surfing, + .anims = sAnimTable_Surfing, .animPos = {1, 3, 0, 2}, }, { - .anims = gObjectEventImageAnimTable_Nurse, + .anims = sAnimTable_Nurse, .animPos = {1, 3, 0, 2}, }, { - .anims = gObjectEventImageAnimTable_Fishing, + .anims = sAnimTable_Fishing, .animPos = {1, 3, 0, 2}, }, - { - NULL, - {0, 0, 0, 0}, - }, + {}, }; diff --git a/src/data/object_events/object_event_graphics_info.h b/src/data/object_events/object_event_graphics_info.h index c6c78dca9..ddc6a1cad 100755 --- a/src/data/object_events/object_event_graphics_info.h +++ b/src/data/object_events/object_event_graphics_info.h @@ -1,245 +1,245 @@ -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BrendanMayNormal, gObjectEventPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_AcroBike, gObjectEventPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanSurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Surfing, gObjectEventPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_FieldMove, gObjectEventPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_QuintyPlump = {0xFFFF, OBJ_EVENT_PAL_TAG_QUINTY_PLUMP, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_L, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_QuintyPlump, gObjectEventPicTable_QuintyPlump, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NinjaBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_NinjaBoy, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Twin, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Boy1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Boy2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LittleBoy, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleGirl = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LittleGirl, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Boy3, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Girl3, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RichBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RichBoy, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Woman1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FatMan = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_FatMan, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokefanF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_PokefanF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Man1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Woman2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ExpertM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_ExpertM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ExpertF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_ExpertF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Man2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Woman3, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokefanM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_PokefanM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman4 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Woman4, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cook = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Cook, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkReceptionist = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LinkReceptionist, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_OldMan, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldWoman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_OldWoman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Camper = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Camper, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Picnicker = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Picnicker, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Man3, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman5 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Woman5, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Youngster = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Youngster, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BugCatcher = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_BugCatcher, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_PsychicM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SchoolKidM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_SchoolKidM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Maniac = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Maniac, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HexManiac = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_HexManiac, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_64x64, gObjectEventSpriteOamTables_64x64, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RayquazaStill, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_SwimmerM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_SwimmerF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BlackBelt = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_BlackBelt, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Beauty = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Beauty, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Scientist1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lass = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Lass, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Gentleman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Gentleman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sailor = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Sailor, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fisherman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Fisherman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RunningTriathleteM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RunningTriathleteM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RunningTriathleteF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RunningTriathleteF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_TuberF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_TuberM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hiker = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Hiker, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CyclingTriathleteM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_AcroBike, gObjectEventPicTable_CyclingTriathleteM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CyclingTriathleteF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_AcroBike, gObjectEventPicTable_CyclingTriathleteF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nurse = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Nurse, gObjectEventPicTable_Nurse, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ItemBall = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_ItemBall, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTree = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, NULL, gObjectEventImageAnimTable_BerryTree, gObjectEventPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTreeEarlyStages = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_BerryTree, gObjectEventPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTreeLateStages = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BerryTree, gObjectEventPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ProfBirch = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_ProfBirch, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man4 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Man4, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man5 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Man5, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ReporterM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_ReporterM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ReporterF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_ReporterF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bard = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hipster = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Trader = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Storyteller = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giddy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedNatuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_UnusedNatuDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMagnemiteDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_UnusedMagnemiteDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedSquirtleDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_UnusedSquirtleDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedWooperDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_UnusedWooperDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedPikachuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_UnusedPikachuDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedPorygon2Doll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_UnusedPorygon2Doll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CuttableTree = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_CuttableTree, gObjectEventPicTable_CuttableTree, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MartEmployee = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MartEmployee, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RooftopSaleWoman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RooftopSaleWoman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Teala = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Teala, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BreakableRock = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_BreakableRock, gObjectEventPicTable_BreakableRock, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PushableBoulder = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_PushableBoulder, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MrBrineysBoat = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MrBrineysBoat, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BrendanMayNormal, gObjectEventPicTable_MayNormal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MayMachBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_AcroBike, gObjectEventPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MaySurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Surfing, gObjectEventPicTable_MaySurfing, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_FieldMove, gObjectEventPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Truck = {0xFFFF, OBJ_EVENT_PAL_TAG_TRUCK, OBJ_EVENT_PAL_TAG_NONE, 1152, 48, 48, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_48x48, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_Truck, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_VigorothCarryingBox = {0xFFFF, OBJ_EVENT_PAL_TAG_VIGOROTH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_VigorothCarryingBox, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_VigorothFacingAway = {0xFFFF, OBJ_EVENT_PAL_TAG_VIGOROTH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_VigorothFacingAway, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirchsBag = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BirchsBag, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EnemyZigzagoon = {0xFFFF, OBJ_EVENT_PAL_TAG_ZIGZAGOON, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_EnemyZigzagoon, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poochyena = {0xFFFF, OBJ_EVENT_PAL_TAG_POOCHYENA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Poochyena, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Artist = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Artist, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BrendanMayNormal, gObjectEventPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_AcroBike, gObjectEventPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanSurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Surfing, gObjectEventPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_FieldMove, gObjectEventPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BrendanMayNormal, gObjectEventPicTable_MayNormal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MayMachBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_AcroBike, gObjectEventPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMaySurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Surfing, gObjectEventPicTable_MaySurfing, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_FieldMove, gObjectEventPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cameraman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Cameraman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanUnderwater = {0xFFFF, OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_BrendanUnderwater, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayUnderwater = {0xFFFF, OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MayUnderwater, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MovingBox = {0xFFFF, OBJ_EVENT_PAL_TAG_MOVING_BOX, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 10, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_MovingBox, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableCar = {0xFFFF, OBJ_EVENT_PAL_TAG_CABLE_CAR, OBJ_EVENT_PAL_TAG_NONE, 2048, 64, 64, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_64x64, gObjectEventSpriteOamTables_64x64, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_CableCar, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Scientist2, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DevonEmployee = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_DevonEmployee, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AquaMemberM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_AquaMemberM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AquaMemberF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_AquaMemberF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MagmaMemberM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MagmaMemberM, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MagmaMemberF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MagmaMemberF, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sidney = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Sidney, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Phoebe = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Phoebe, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Glacia = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Glacia, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Drake = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Drake, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Roxanne = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Roxanne, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brawly = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Brawly, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wattson = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Wattson, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Flannery = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Flannery, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Norman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Norman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Winona = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Winona, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Liza = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Liza, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tate = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Tate, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wallace = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Wallace, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Steven = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Steven, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wally = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Wally, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireLittleBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RubySapphireLittleBoy, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanFishing = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Fishing, gObjectEventPicTable_BrendanFishing, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayFishing = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Fishing, gObjectEventPicTable_MayFishing, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HotSpringsOldWoman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_HotSpringsOldWoman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SSTidal = {0xFFFF, OBJ_EVENT_PAL_TAG_SSTIDAL, OBJ_EVENT_PAL_TAG_NONE, 1920, 96, 40, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_8x8, gObjectEventSpriteOamTables_96x40, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_SSTidal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SubmarineShadow = {0xFFFF, OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, OBJ_EVENT_PAL_TAG_NONE, 1408, 88, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_8x8, gObjectEventSpriteOamTables_88x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_SubmarineShadow, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PichuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_PichuDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PikachuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_PikachuDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MarillDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_MarillDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TogepiDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_TogepiDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CyndaquilDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_CyndaquilDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ChikoritaDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_ChikoritaDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TotodileDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_TotodileDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_JigglypuffDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_JigglypuffDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MeowthDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_MeowthDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ClefairyDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_ClefairyDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DittoDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_DittoDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SmoochumDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_SmoochumDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TreeckoDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_TreeckoDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TorchicDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_TorchicDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MudkipDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_MudkipDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DuskullDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_DuskullDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WynautDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_WynautDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BaltoyDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BaltoyDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KecleonDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_KecleonDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AzurillDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_AzurillDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SkittyDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_SkittyDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwabluDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_SwabluDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GulpinDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_GulpinDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LotadDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_LotadDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SeedotDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_SeedotDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PikaCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_PikaCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RoundCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_RoundCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KissCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_KissCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ZigzagCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_ZigzagCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SpinCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_SpinCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DiamondCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_DiamondCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BallCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GrassCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_GrassCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FireCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_FireCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WaterCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_WaterCushion, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigSnorlaxDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigSnorlaxDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRhydonDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigRhydonDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigLaprasDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigLaprasDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigVenusaurDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigVenusaurDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigCharizardDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigCharizardDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigBlastoiseDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigBlastoiseDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigWailmerDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigWailmerDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRegirockDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigRegirockDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRegiceDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigRegiceDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRegisteelDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BigRegisteelDoll, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latias = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latios = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GameboyKid = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_GameboyKid, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ContestJudge = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_ContestJudge, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanWatering = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_BrendanWatering, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayWatering = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MayWatering, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanDecorating = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BrendanDecorating, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayDecorating = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_MayDecorating, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Archie = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Archie, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Maxie = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Maxie, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kyogre1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_KyogreFront, gObjectEventRotScalAnimTable_KyogreGroudon}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Groudon1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_GroudonFront, gObjectEventRotScalAnimTable_KyogreGroudon}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kyogre3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_KyogreSide, gObjectEventRotScalAnimTable_KyogreGroudon}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Groudon3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Groudon3, gObjectEventPicTable_GroudonSide, gObjectEventRotScalAnimTable_KyogreGroudon}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_Fossil, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Regirock = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Regi, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Regice = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Regi, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Registeel = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Regi, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Skitty = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Skitty, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kecleon = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Kecleon, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kyogre2 = {0xFFFF, OBJ_EVENT_PAL_TAG_KYOGRE, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_KyogreFront, gObjectEventRotScalAnimTable_KyogreGroudon}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Groudon2 = {0xFFFF, OBJ_EVENT_PAL_TAG_GROUDON, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_GroudonFront, gObjectEventRotScalAnimTable_KyogreGroudon}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_64x64, gObjectEventSpriteOamTables_64x64, gObjectEventImageAnimTable_Rayquaza2, gObjectEventPicTable_Rayquaza, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zigzagoon = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Zigzagoon, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Pikachu, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Azumarill = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Azumarill, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wingull = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Wingull, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KecleonBridgeShadow = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 128, 16, 16, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Kecleon, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMSwimming = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_TuberMSwimming, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Azurill = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, gObjectEventSpriteOamTables_16x16, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Azurill, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mom = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Mom, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkBrendan = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BrendanMayNormal, gObjectEventPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkMay = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_BrendanMayNormal, gObjectEventPicTable_MayNormal, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juan = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Juan, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Scott, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MysteryEventDeliveryman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_MysteryEventDeliveryman, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Statue = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_Statue, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kirlia = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_S, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Kirlia, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Dusclops = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Dusclops, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnionRoomAttendant = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_UnionRoomAttendant, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Red = {0xFFFF, OBJ_EVENT_PAL_TAG_RED_LEAF, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Red, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Leaf = {0xFFFF, OBJ_EVENT_PAL_TAG_RED_LEAF, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Leaf, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sudowoodo = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Sudowoodo, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mew = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Mew, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Deoxys = {0xFFFF, OBJ_EVENT_PAL_TAG_DEOXYS, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Deoxys, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirthIslandStone = {0xFFFF, OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Inanimate, gObjectEventPicTable_BirthIslandStone, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Anabel = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Anabel, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tucker = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Tucker, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Greta = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Greta, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spenser = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Spenser, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Noland = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Noland, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lucy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Lucy, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brandon = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Brandon, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireBrendan = {0xFFFF, OBJ_EVENT_PAL_TAG_RS_BRENDAN, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RubySapphireBrendan, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireMay = {0xFFFF, OBJ_EVENT_PAL_TAG_RS_MAY, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, gObjectEventSpriteOamTables_16x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_RubySapphireMay, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = {0xFFFF, OBJ_EVENT_PAL_TAG_LUGIA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_Standard, gObjectEventPicTable_Lugia, gDummySpriteAffineAnimTable}; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = {0xFFFF, OBJ_EVENT_PAL_TAG_HO_OH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, gObjectEventSpriteOamTables_32x32, gObjectEventImageAnimTable_HoOh, gObjectEventPicTable_HoOh, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BrendanMayNormal, sPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_AcroBike, sPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanSurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Surfing, sPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_FieldMove, sPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_QuintyPlump = {0xFFFF, OBJ_EVENT_PAL_TAG_QUINTY_PLUMP, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_L, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_QuintyPlump, sPicTable_QuintyPlump, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_NinjaBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_NinjaBoy, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Twin = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Twin, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Boy1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Girl1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Boy2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Girl2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_LittleBoy, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LittleGirl = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_LittleGirl, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Boy3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Boy3, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Girl3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Girl3, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RichBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RichBoy, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Woman1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FatMan = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_FatMan, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokefanF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_PokefanF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Man1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Woman2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ExpertM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_ExpertM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ExpertF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_ExpertF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Man2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Woman3, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PokefanM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_PokefanM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman4 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Woman4, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cook = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Cook, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkReceptionist = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_LinkReceptionist, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldMan = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_OldMan, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_OldWoman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_OldWoman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Camper = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Camper, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Picnicker = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Picnicker, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man3 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Man3, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Woman5 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Woman5, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Youngster = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Youngster, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BugCatcher = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_BugCatcher, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_PsychicM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SchoolKidM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_SchoolKidM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Maniac = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Maniac, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HexManiac = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_HexManiac, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RayquazaStill = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_64x64, sOamTables_64x64, sAnimTable_Standard, sPicTable_RayquazaStill, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_SwimmerM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_SwimmerF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BlackBelt = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_BlackBelt, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Beauty = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Beauty, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Scientist1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lass = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Lass, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Gentleman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Gentleman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sailor = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Sailor, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fisherman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Fisherman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RunningTriathleteM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RunningTriathleteM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RunningTriathleteF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RunningTriathleteF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_TuberF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_TuberM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hiker = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Hiker, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CyclingTriathleteM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_AcroBike, sPicTable_CyclingTriathleteM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CyclingTriathleteF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_AcroBike, sPicTable_CyclingTriathleteF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Nurse = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Nurse, sPicTable_Nurse, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ItemBall = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_ItemBall, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTree = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, NULL, sAnimTable_BerryTree, sPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTreeEarlyStages = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_BerryTree, sPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BerryTreeLateStages = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BerryTree, sPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ProfBirch = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_ProfBirch, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man4 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Man4, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Man5 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Man5, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ReporterM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_ReporterM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ReporterF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_ReporterF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Bard = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Hipster = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Trader = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Storyteller = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Giddy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan1 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMauvilleOldMan2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedNatuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedNatuDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedMagnemiteDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedMagnemiteDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedSquirtleDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedSquirtleDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedWooperDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedWooperDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedPikachuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedPikachuDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnusedPorygon2Doll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_UnusedPorygon2Doll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CuttableTree = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_CuttableTree, sPicTable_CuttableTree, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MartEmployee = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MartEmployee, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RooftopSaleWoman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RooftopSaleWoman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Teala = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Teala, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BreakableRock = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_BreakableRock, sPicTable_BreakableRock, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PushableBoulder = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_PushableBoulder, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MrBrineysBoat = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_MrBrineysBoat, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BrendanMayNormal, sPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_MayMachBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_AcroBike, sPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MaySurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Surfing, sPicTable_MaySurfing, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_FieldMove, sPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Truck = {0xFFFF, OBJ_EVENT_PAL_TAG_TRUCK, OBJ_EVENT_PAL_TAG_NONE, 1152, 48, 48, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_48x48, sAnimTable_Inanimate, sPicTable_Truck, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_VigorothCarryingBox = {0xFFFF, OBJ_EVENT_PAL_TAG_VIGOROTH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_VigorothCarryingBox, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_VigorothFacingAway = {0xFFFF, OBJ_EVENT_PAL_TAG_VIGOROTH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_VigorothFacingAway, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirchsBag = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_BirchsBag, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_EnemyZigzagoon = {0xFFFF, OBJ_EVENT_PAL_TAG_ZIGZAGOON, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_EnemyZigzagoon, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poochyena = {0xFFFF, OBJ_EVENT_PAL_TAG_POOCHYENA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_Poochyena, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Artist = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Artist, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BrendanMayNormal, sPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_AcroBike, sPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanSurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Surfing, sPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalBrendanFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_FieldMove, sPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayNormal = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BrendanMayNormal, sPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayMachBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_MayMachBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayAcroBike = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_AcroBike, sPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMaySurfing = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Surfing, sPicTable_MaySurfing, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RivalMayFieldMove = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_FieldMove, sPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Cameraman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Cameraman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanUnderwater = {0xFFFF, OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_BrendanUnderwater, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayUnderwater = {0xFFFF, OBJ_EVENT_PAL_TAG_PLAYER_UNDERWATER, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_MayUnderwater, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MovingBox = {0xFFFF, OBJ_EVENT_PAL_TAG_MOVING_BOX, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 10, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_MovingBox, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CableCar = {0xFFFF, OBJ_EVENT_PAL_TAG_CABLE_CAR, OBJ_EVENT_PAL_TAG_NONE, 2048, 64, 64, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_64x64, sOamTables_64x64, sAnimTable_Inanimate, sPicTable_CableCar, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scientist2 = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Scientist2, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DevonEmployee = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_DevonEmployee, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AquaMemberM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_AquaMemberM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AquaMemberF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_AquaMemberF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MagmaMemberM = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MagmaMemberM, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MagmaMemberF = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MagmaMemberF, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sidney = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Sidney, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Phoebe = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Phoebe, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Glacia = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Glacia, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Drake = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Drake, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Roxanne = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Roxanne, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brawly = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Brawly, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wattson = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Wattson, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Flannery = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Flannery, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Norman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Norman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Winona = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Winona, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Liza = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Liza, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tate = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Tate, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wallace = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Wallace, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Steven = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Steven, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wally = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Wally, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireLittleBoy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_RubySapphireLittleBoy, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanFishing = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Fishing, sPicTable_BrendanFishing, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayFishing = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Fishing, sPicTable_MayFishing, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HotSpringsOldWoman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_HotSpringsOldWoman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SSTidal = {0xFFFF, OBJ_EVENT_PAL_TAG_SSTIDAL, OBJ_EVENT_PAL_TAG_NONE, 1920, 96, 40, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_8x8, sOamTables_96x40, sAnimTable_Standard, sPicTable_SSTidal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SubmarineShadow = {0xFFFF, OBJ_EVENT_PAL_TAG_SUBMARINE_SHADOW, OBJ_EVENT_PAL_TAG_NONE, 1408, 88, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_8x8, sOamTables_88x32, sAnimTable_Standard, sPicTable_SubmarineShadow, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PichuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_PichuDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PikachuDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_PikachuDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MarillDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_MarillDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TogepiDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_TogepiDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_CyndaquilDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_CyndaquilDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ChikoritaDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_ChikoritaDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TotodileDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_TotodileDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_JigglypuffDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_JigglypuffDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MeowthDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_MeowthDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ClefairyDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_ClefairyDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DittoDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_DittoDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SmoochumDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_SmoochumDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TreeckoDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_TreeckoDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TorchicDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_TorchicDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MudkipDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_MudkipDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DuskullDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_DuskullDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WynautDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_WynautDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BaltoyDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_BaltoyDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KecleonDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_KecleonDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_AzurillDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_AzurillDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SkittyDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_SkittyDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwabluDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_SwabluDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GulpinDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_GulpinDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LotadDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_LotadDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SeedotDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_SeedotDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PikaCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_PikaCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RoundCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_RoundCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KissCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_KissCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ZigzagCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_ZigzagCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SpinCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_SpinCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_DiamondCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_DiamondCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BallCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_BallCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GrassCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_GrassCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_FireCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_FireCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_WaterCushion = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_WaterCushion, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigSnorlaxDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigSnorlaxDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRhydonDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigRhydonDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigLaprasDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigLaprasDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigVenusaurDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigVenusaurDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigCharizardDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigCharizardDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigBlastoiseDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigBlastoiseDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigWailmerDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigWailmerDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRegirockDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigRegirockDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRegiceDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigRegiceDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BigRegisteelDoll = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BigRegisteelDoll, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latias = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Latios = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GameboyKid = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_GameboyKid, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_ContestJudge = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_ContestJudge, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanWatering = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_BrendanWatering, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayWatering = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_MayWatering, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanDecorating = {0xFFFF, OBJ_EVENT_PAL_TAG_BRENDAN, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Inanimate, sPicTable_BrendanDecorating, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayDecorating = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Inanimate, sPicTable_MayDecorating, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Archie = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Archie, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Maxie = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Maxie, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KyogreFront = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_KyogreFront, sAffineAnimTable_KyogreGroudon}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GroudonFront = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_GroudonFront, sAffineAnimTable_KyogreGroudon}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KyogreSide = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_KyogreSide, sAffineAnimTable_KyogreGroudon}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GroudonSide = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_GroudonSide, sPicTable_GroudonSide, sAffineAnimTable_KyogreGroudon}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Inanimate, sPicTable_Fossil, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Regirock = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Regice = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Registeel = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Skitty = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Skitty, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kecleon = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Kecleon, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KyogreAsleep = {0xFFFF, OBJ_EVENT_PAL_TAG_KYOGRE, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_KyogreFront, sAffineAnimTable_KyogreGroudon}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GroudonAsleep = {0xFFFF, OBJ_EVENT_PAL_TAG_GROUDON, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_GroudonFront, sAffineAnimTable_KyogreGroudon}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gObjectEventBaseOam_64x64, sOamTables_64x64, sAnimTable_Rayquaza, sPicTable_Rayquaza, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zigzagoon = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Zigzagoon, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Pikachu, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Azumarill = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Azumarill, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Wingull = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Wingull, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KecleonBridgeShadow = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 128, 16, 16, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Kecleon, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_TuberMSwimming = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_2, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_TuberMSwimming, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Azurill = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x16, sOamTables_16x16, sAnimTable_Standard, sPicTable_Azurill, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mom = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Mom, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkBrendan = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BrendanMayNormal, sPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkMay = {0xFFFF, OBJ_EVENT_PAL_TAG_MAY, OBJ_EVENT_PAL_TAG_BRIDGE_REFLECTION, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_BrendanMayNormal, sPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juan = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Juan, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Scott, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MysteryEventDeliveryman = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_MysteryEventDeliveryman, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Statue = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Inanimate, sPicTable_Statue, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kirlia = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_S, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Kirlia, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Dusclops = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Dusclops, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_UnionRoomAttendant = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_UnionRoomAttendant, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Red = {0xFFFF, OBJ_EVENT_PAL_TAG_RED_LEAF, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Red, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Leaf = {0xFFFF, OBJ_EVENT_PAL_TAG_RED_LEAF, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Leaf, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Sudowoodo = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Sudowoodo, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Mew = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Mew, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Deoxys = {0xFFFF, OBJ_EVENT_PAL_TAG_DEOXYS, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_Deoxys, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BirthIslandStone = {0xFFFF, OBJ_EVENT_PAL_TAG_BIRTH_ISLAND_STONE, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Inanimate, sPicTable_BirthIslandStone, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Anabel = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Anabel, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Tucker = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Tucker, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Greta = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Greta, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Spenser = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_1, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Spenser, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Noland = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Noland, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lucy = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_4, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Lucy, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Brandon = {0xFFFF, OBJ_EVENT_PAL_TAG_NPC_3, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_Brandon, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireBrendan = {0xFFFF, OBJ_EVENT_PAL_TAG_RS_BRENDAN, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RubySapphireBrendan, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RubySapphireMay = {0xFFFF, OBJ_EVENT_PAL_TAG_RS_MAY, OBJ_EVENT_PAL_TAG_NONE, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_16x32, sOamTables_16x32, sAnimTable_Standard, sPicTable_RubySapphireMay, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Lugia = {0xFFFF, OBJ_EVENT_PAL_TAG_LUGIA, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_Standard, sPicTable_Lugia, gDummySpriteAffineAnimTable}; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HoOh = {0xFFFF, OBJ_EVENT_PAL_TAG_HO_OH, OBJ_EVENT_PAL_TAG_NONE, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gObjectEventBaseOam_32x32, sOamTables_32x32, sAnimTable_HoOh, sPicTable_HoOh, gDummySpriteAffineAnimTable}; diff --git a/src/data/object_events/object_event_graphics_info_pointers.h b/src/data/object_events/object_event_graphics_info_pointers.h index 0ca70fa33..1c94919a7 100755 --- a/src/data/object_events/object_event_graphics_info_pointers.h +++ b/src/data/object_events/object_event_graphics_info_pointers.h @@ -39,7 +39,7 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_PsychicM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SchoolKidM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Maniac; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_HexManiac; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza1; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_RayquazaStill; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerM; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_SwimmerF; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BlackBelt; @@ -195,17 +195,17 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_BrendanDecorating; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MayDecorating; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Archie; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Maxie; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kyogre1; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Groudon1; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KyogreFront; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GroudonFront; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Fossil; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Regirock; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Regice; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Registeel; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Skitty; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kecleon; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kyogre2; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Groudon2; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza2; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KyogreAsleep; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GroudonAsleep; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Rayquaza; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Zigzagoon; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Pikachu; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Azumarill; @@ -219,8 +219,8 @@ const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_LinkMay; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Juan; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Scott; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Poochyena; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kyogre3; -const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Groudon3; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_KyogreSide; +const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_GroudonSide; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_MysteryEventDeliveryman; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Statue; const struct ObjectEventGraphicsInfo gObjectEventGraphicsInfo_Kirlia; @@ -288,7 +288,7 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_SCHOOL_KID_M] = &gObjectEventGraphicsInfo_SchoolKidM, [OBJ_EVENT_GFX_MANIAC] = &gObjectEventGraphicsInfo_Maniac, [OBJ_EVENT_GFX_HEX_MANIAC] = &gObjectEventGraphicsInfo_HexManiac, - [OBJ_EVENT_GFX_RAYQUAZA_1] = &gObjectEventGraphicsInfo_Rayquaza1, + [OBJ_EVENT_GFX_RAYQUAZA_STILL] = &gObjectEventGraphicsInfo_RayquazaStill, [OBJ_EVENT_GFX_SWIMMER_M] = &gObjectEventGraphicsInfo_SwimmerM, [OBJ_EVENT_GFX_SWIMMER_F] = &gObjectEventGraphicsInfo_SwimmerF, [OBJ_EVENT_GFX_BLACK_BELT] = &gObjectEventGraphicsInfo_BlackBelt, @@ -444,17 +444,17 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_MAY_DECORATING] = &gObjectEventGraphicsInfo_MayDecorating, [OBJ_EVENT_GFX_ARCHIE] = &gObjectEventGraphicsInfo_Archie, [OBJ_EVENT_GFX_MAXIE] = &gObjectEventGraphicsInfo_Maxie, - [OBJ_EVENT_GFX_KYOGRE_1] = &gObjectEventGraphicsInfo_Kyogre1, - [OBJ_EVENT_GFX_GROUDON_1] = &gObjectEventGraphicsInfo_Groudon1, + [OBJ_EVENT_GFX_KYOGRE_FRONT] = &gObjectEventGraphicsInfo_KyogreFront, + [OBJ_EVENT_GFX_GROUDON_FRONT] = &gObjectEventGraphicsInfo_GroudonFront, [OBJ_EVENT_GFX_FOSSIL] = &gObjectEventGraphicsInfo_Fossil, [OBJ_EVENT_GFX_REGIROCK] = &gObjectEventGraphicsInfo_Regirock, [OBJ_EVENT_GFX_REGICE] = &gObjectEventGraphicsInfo_Regice, [OBJ_EVENT_GFX_REGISTEEL] = &gObjectEventGraphicsInfo_Registeel, [OBJ_EVENT_GFX_SKITTY] = &gObjectEventGraphicsInfo_Skitty, [OBJ_EVENT_GFX_KECLEON] = &gObjectEventGraphicsInfo_Kecleon, - [OBJ_EVENT_GFX_KYOGRE_2] = &gObjectEventGraphicsInfo_Kyogre2, - [OBJ_EVENT_GFX_GROUDON_2] = &gObjectEventGraphicsInfo_Groudon2, - [OBJ_EVENT_GFX_RAYQUAZA_2] = &gObjectEventGraphicsInfo_Rayquaza2, + [OBJ_EVENT_GFX_KYOGRE_ASLEEP] = &gObjectEventGraphicsInfo_KyogreAsleep, + [OBJ_EVENT_GFX_GROUDON_ASLEEP] = &gObjectEventGraphicsInfo_GroudonAsleep, + [OBJ_EVENT_GFX_RAYQUAZA] = &gObjectEventGraphicsInfo_Rayquaza, [OBJ_EVENT_GFX_ZIGZAGOON_2] = &gObjectEventGraphicsInfo_Zigzagoon, [OBJ_EVENT_GFX_PIKACHU] = &gObjectEventGraphicsInfo_Pikachu, [OBJ_EVENT_GFX_AZUMARILL] = &gObjectEventGraphicsInfo_Azumarill, @@ -468,8 +468,8 @@ const struct ObjectEventGraphicsInfo *const gObjectEventGraphicsInfoPointers[NUM [OBJ_EVENT_GFX_JUAN] = &gObjectEventGraphicsInfo_Juan, [OBJ_EVENT_GFX_SCOTT] = &gObjectEventGraphicsInfo_Scott, [OBJ_EVENT_GFX_POOCHYENA] = &gObjectEventGraphicsInfo_Poochyena, - [OBJ_EVENT_GFX_KYOGRE_3] = &gObjectEventGraphicsInfo_Kyogre3, - [OBJ_EVENT_GFX_GROUDON_3] = &gObjectEventGraphicsInfo_Groudon3, + [OBJ_EVENT_GFX_KYOGRE_SIDE] = &gObjectEventGraphicsInfo_KyogreSide, + [OBJ_EVENT_GFX_GROUDON_SIDE] = &gObjectEventGraphicsInfo_GroudonSide, [OBJ_EVENT_GFX_MYSTERY_GIFT_MAN] = &gObjectEventGraphicsInfo_MysteryEventDeliveryman, [OBJ_EVENT_GFX_TRICK_HOUSE_STATUE] = &gObjectEventGraphicsInfo_Statue, [OBJ_EVENT_GFX_KIRLIA] = &gObjectEventGraphicsInfo_Kirlia, diff --git a/src/data/object_events/object_event_pic_tables.h b/src/data/object_events/object_event_pic_tables.h index 9cfdca7c1..1b8c9c727 100755 --- a/src/data/object_events/object_event_pic_tables.h +++ b/src/data/object_events/object_event_pic_tables.h @@ -1,4 +1,4 @@ -const struct SpriteFrameImage gObjectEventPicTable_BrendanNormal[] = { +static const struct SpriteFrameImage sPicTable_BrendanNormal[] = { overworld_frame(gObjectEventPic_BrendanNormal, 2, 4, 0), overworld_frame(gObjectEventPic_BrendanNormal, 2, 4, 1), overworld_frame(gObjectEventPic_BrendanNormal, 2, 4, 2), @@ -19,7 +19,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanNormal[] = { overworld_frame(gObjectEventPic_BrendanRunning, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanMachBike[] = { +static const struct SpriteFrameImage sPicTable_BrendanMachBike[] = { overworld_frame(gObjectEventPic_BrendanMachBike, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanMachBike, 4, 4, 1), overworld_frame(gObjectEventPic_BrendanMachBike, 4, 4, 2), @@ -31,7 +31,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanMachBike[] = { overworld_frame(gObjectEventPic_BrendanMachBike, 4, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanAcroBike[] = { +static const struct SpriteFrameImage sPicTable_BrendanAcroBike[] = { overworld_frame(gObjectEventPic_BrendanAcroBike, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanAcroBike, 4, 4, 1), overworld_frame(gObjectEventPic_BrendanAcroBike, 4, 4, 2), @@ -61,7 +61,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanAcroBike[] = { overworld_frame(gObjectEventPic_BrendanAcroBike, 4, 4, 26), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanSurfing[] = { +static const struct SpriteFrameImage sPicTable_BrendanSurfing[] = { overworld_frame(gObjectEventPic_BrendanSurfing, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanSurfing, 4, 4, 2), overworld_frame(gObjectEventPic_BrendanSurfing, 4, 4, 4), @@ -76,7 +76,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanSurfing[] = { overworld_frame(gObjectEventPic_BrendanSurfing, 4, 4, 5), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanUnderwater[] = { +static const struct SpriteFrameImage sPicTable_BrendanUnderwater[] = { overworld_frame(gObjectEventPic_BrendanUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_BrendanUnderwater, 4, 4, 2), @@ -88,7 +88,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanUnderwater[] = { overworld_frame(gObjectEventPic_BrendanUnderwater, 4, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanFieldMove[] = { +static const struct SpriteFrameImage sPicTable_BrendanFieldMove[] = { overworld_frame(gObjectEventPic_BrendanFieldMove, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanFieldMove, 4, 4, 1), overworld_frame(gObjectEventPic_BrendanFieldMove, 4, 4, 2), @@ -96,7 +96,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanFieldMove[] = { overworld_frame(gObjectEventPic_BrendanFieldMove, 4, 4, 4), }; -const struct SpriteFrameImage gObjectEventPicTable_QuintyPlump[] = { +static const struct SpriteFrameImage sPicTable_QuintyPlump[] = { overworld_frame(gObjectEventPic_QuintyPlump, 4, 4, 0), overworld_frame(gObjectEventPic_QuintyPlump, 4, 4, 1), overworld_frame(gObjectEventPic_QuintyPlump, 4, 4, 2), @@ -106,7 +106,7 @@ const struct SpriteFrameImage gObjectEventPicTable_QuintyPlump[] = { overworld_frame(gObjectEventPic_QuintyPlump, 4, 4, 6), }; -const struct SpriteFrameImage gObjectEventPicTable_NinjaBoy[] = { +static const struct SpriteFrameImage sPicTable_NinjaBoy[] = { overworld_frame(gObjectEventPic_NinjaBoy, 2, 2, 0), overworld_frame(gObjectEventPic_NinjaBoy, 2, 2, 1), overworld_frame(gObjectEventPic_NinjaBoy, 2, 2, 2), @@ -118,7 +118,7 @@ const struct SpriteFrameImage gObjectEventPicTable_NinjaBoy[] = { overworld_frame(gObjectEventPic_NinjaBoy, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Twin[] = { +static const struct SpriteFrameImage sPicTable_Twin[] = { overworld_frame(gObjectEventPic_Twin, 2, 4, 0), overworld_frame(gObjectEventPic_Twin, 2, 4, 1), overworld_frame(gObjectEventPic_Twin, 2, 4, 2), @@ -130,7 +130,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Twin[] = { overworld_frame(gObjectEventPic_Twin, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Boy1[] = { +static const struct SpriteFrameImage sPicTable_Boy1[] = { overworld_frame(gObjectEventPic_Boy1, 2, 4, 0), overworld_frame(gObjectEventPic_Boy1, 2, 4, 1), overworld_frame(gObjectEventPic_Boy1, 2, 4, 2), @@ -142,7 +142,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Boy1[] = { overworld_frame(gObjectEventPic_Boy1, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Girl1[] = { +static const struct SpriteFrameImage sPicTable_Girl1[] = { overworld_frame(gObjectEventPic_Girl1, 2, 4, 0), overworld_frame(gObjectEventPic_Girl1, 2, 4, 1), overworld_frame(gObjectEventPic_Girl1, 2, 4, 2), @@ -154,7 +154,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Girl1[] = { overworld_frame(gObjectEventPic_Girl1, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Boy2[] = { +static const struct SpriteFrameImage sPicTable_Boy2[] = { overworld_frame(gObjectEventPic_Boy2, 2, 4, 0), overworld_frame(gObjectEventPic_Boy2, 2, 4, 1), overworld_frame(gObjectEventPic_Boy2, 2, 4, 2), @@ -166,7 +166,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Boy2[] = { overworld_frame(gObjectEventPic_Boy2, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Girl2[] = { +static const struct SpriteFrameImage sPicTable_Girl2[] = { overworld_frame(gObjectEventPic_Girl2, 2, 4, 0), overworld_frame(gObjectEventPic_Girl2, 2, 4, 1), overworld_frame(gObjectEventPic_Girl2, 2, 4, 2), @@ -178,7 +178,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Girl2[] = { overworld_frame(gObjectEventPic_Girl2, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_LittleBoy[] = { +static const struct SpriteFrameImage sPicTable_LittleBoy[] = { overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 0), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 1), overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 2), @@ -190,7 +190,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LittleBoy[] = { overworld_frame(gObjectEventPic_LittleBoy, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_LittleGirl[] = { +static const struct SpriteFrameImage sPicTable_LittleGirl[] = { overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 0), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 1), overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 2), @@ -202,7 +202,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LittleGirl[] = { overworld_frame(gObjectEventPic_LittleGirl, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Boy3[] = { +static const struct SpriteFrameImage sPicTable_Boy3[] = { overworld_frame(gObjectEventPic_Boy3, 2, 4, 0), overworld_frame(gObjectEventPic_Boy3, 2, 4, 1), overworld_frame(gObjectEventPic_Boy3, 2, 4, 2), @@ -214,7 +214,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Boy3[] = { overworld_frame(gObjectEventPic_Boy3, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Girl3[] = { +static const struct SpriteFrameImage sPicTable_Girl3[] = { overworld_frame(gObjectEventPic_Girl3, 2, 4, 0), overworld_frame(gObjectEventPic_Girl3, 2, 4, 1), overworld_frame(gObjectEventPic_Girl3, 2, 4, 2), @@ -226,7 +226,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Girl3[] = { overworld_frame(gObjectEventPic_Girl3, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_RichBoy[] = { +static const struct SpriteFrameImage sPicTable_RichBoy[] = { overworld_frame(gObjectEventPic_RichBoy, 2, 4, 0), overworld_frame(gObjectEventPic_RichBoy, 2, 4, 1), overworld_frame(gObjectEventPic_RichBoy, 2, 4, 2), @@ -238,7 +238,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RichBoy[] = { overworld_frame(gObjectEventPic_RichBoy, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Woman1[] = { +static const struct SpriteFrameImage sPicTable_Woman1[] = { overworld_frame(gObjectEventPic_Woman1, 2, 4, 0), overworld_frame(gObjectEventPic_Woman1, 2, 4, 1), overworld_frame(gObjectEventPic_Woman1, 2, 4, 2), @@ -250,7 +250,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Woman1[] = { overworld_frame(gObjectEventPic_Woman1, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_FatMan[] = { +static const struct SpriteFrameImage sPicTable_FatMan[] = { overworld_frame(gObjectEventPic_FatMan, 2, 4, 0), overworld_frame(gObjectEventPic_FatMan, 2, 4, 1), overworld_frame(gObjectEventPic_FatMan, 2, 4, 2), @@ -262,7 +262,7 @@ const struct SpriteFrameImage gObjectEventPicTable_FatMan[] = { overworld_frame(gObjectEventPic_FatMan, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_PokefanF[] = { +static const struct SpriteFrameImage sPicTable_PokefanF[] = { overworld_frame(gObjectEventPic_PokefanF, 2, 4, 0), overworld_frame(gObjectEventPic_PokefanF, 2, 4, 1), overworld_frame(gObjectEventPic_PokefanF, 2, 4, 2), @@ -274,7 +274,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PokefanF[] = { overworld_frame(gObjectEventPic_PokefanF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Man1[] = { +static const struct SpriteFrameImage sPicTable_Man1[] = { overworld_frame(gObjectEventPic_Man1, 2, 4, 0), overworld_frame(gObjectEventPic_Man1, 2, 4, 1), overworld_frame(gObjectEventPic_Man1, 2, 4, 2), @@ -286,7 +286,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Man1[] = { overworld_frame(gObjectEventPic_Man1, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Woman2[] = { +static const struct SpriteFrameImage sPicTable_Woman2[] = { overworld_frame(gObjectEventPic_Woman2, 2, 4, 0), overworld_frame(gObjectEventPic_Woman2, 2, 4, 1), overworld_frame(gObjectEventPic_Woman2, 2, 4, 2), @@ -298,7 +298,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Woman2[] = { overworld_frame(gObjectEventPic_Woman2, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_ExpertM[] = { +static const struct SpriteFrameImage sPicTable_ExpertM[] = { overworld_frame(gObjectEventPic_ExpertM, 2, 4, 0), overworld_frame(gObjectEventPic_ExpertM, 2, 4, 1), overworld_frame(gObjectEventPic_ExpertM, 2, 4, 2), @@ -310,7 +310,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ExpertM[] = { overworld_frame(gObjectEventPic_ExpertM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_ExpertF[] = { +static const struct SpriteFrameImage sPicTable_ExpertF[] = { overworld_frame(gObjectEventPic_ExpertF, 2, 4, 0), overworld_frame(gObjectEventPic_ExpertF, 2, 4, 1), overworld_frame(gObjectEventPic_ExpertF, 2, 4, 2), @@ -322,7 +322,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ExpertF[] = { overworld_frame(gObjectEventPic_ExpertF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Man2[] = { +static const struct SpriteFrameImage sPicTable_Man2[] = { overworld_frame(gObjectEventPic_Man2, 2, 4, 0), overworld_frame(gObjectEventPic_Man2, 2, 4, 1), overworld_frame(gObjectEventPic_Man2, 2, 4, 2), @@ -334,7 +334,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Man2[] = { overworld_frame(gObjectEventPic_Man2, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Woman3[] = { +static const struct SpriteFrameImage sPicTable_Woman3[] = { overworld_frame(gObjectEventPic_Woman3, 2, 4, 0), overworld_frame(gObjectEventPic_Woman3, 2, 4, 1), overworld_frame(gObjectEventPic_Woman3, 2, 4, 2), @@ -346,7 +346,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Woman3[] = { overworld_frame(gObjectEventPic_Woman3, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_PokefanM[] = { +static const struct SpriteFrameImage sPicTable_PokefanM[] = { overworld_frame(gObjectEventPic_PokefanM, 2, 4, 0), overworld_frame(gObjectEventPic_PokefanM, 2, 4, 1), overworld_frame(gObjectEventPic_PokefanM, 2, 4, 2), @@ -358,7 +358,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PokefanM[] = { overworld_frame(gObjectEventPic_PokefanM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Woman4[] = { +static const struct SpriteFrameImage sPicTable_Woman4[] = { overworld_frame(gObjectEventPic_Woman4, 2, 4, 0), overworld_frame(gObjectEventPic_Woman4, 2, 4, 1), overworld_frame(gObjectEventPic_Woman4, 2, 4, 2), @@ -370,7 +370,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Woman4[] = { overworld_frame(gObjectEventPic_Woman4, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Cook[] = { +static const struct SpriteFrameImage sPicTable_Cook[] = { overworld_frame(gObjectEventPic_Cook, 2, 4, 0), overworld_frame(gObjectEventPic_Cook, 2, 4, 1), overworld_frame(gObjectEventPic_Cook, 2, 4, 2), @@ -382,7 +382,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Cook[] = { overworld_frame(gObjectEventPic_Cook, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_LinkReceptionist[] = { +static const struct SpriteFrameImage sPicTable_LinkReceptionist[] = { overworld_frame(gObjectEventPic_LinkReceptionist, 2, 4, 0), overworld_frame(gObjectEventPic_LinkReceptionist, 2, 4, 1), overworld_frame(gObjectEventPic_LinkReceptionist, 2, 4, 2), @@ -394,7 +394,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LinkReceptionist[] = { overworld_frame(gObjectEventPic_LinkReceptionist, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_OldMan[] = { +static const struct SpriteFrameImage sPicTable_OldMan[] = { overworld_frame(gObjectEventPic_OldMan, 2, 4, 0), overworld_frame(gObjectEventPic_OldMan, 2, 4, 1), overworld_frame(gObjectEventPic_OldMan, 2, 4, 2), @@ -406,7 +406,7 @@ const struct SpriteFrameImage gObjectEventPicTable_OldMan[] = { overworld_frame(gObjectEventPic_OldMan, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_OldWoman[] = { +static const struct SpriteFrameImage sPicTable_OldWoman[] = { overworld_frame(gObjectEventPic_OldWoman, 2, 4, 0), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 1), overworld_frame(gObjectEventPic_OldWoman, 2, 4, 2), @@ -418,7 +418,7 @@ const struct SpriteFrameImage gObjectEventPicTable_OldWoman[] = { overworld_frame(gObjectEventPic_OldWoman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Camper[] = { +static const struct SpriteFrameImage sPicTable_Camper[] = { overworld_frame(gObjectEventPic_Camper, 2, 4, 0), overworld_frame(gObjectEventPic_Camper, 2, 4, 1), overworld_frame(gObjectEventPic_Camper, 2, 4, 2), @@ -430,7 +430,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Camper[] = { overworld_frame(gObjectEventPic_Camper, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Picnicker[] = { +static const struct SpriteFrameImage sPicTable_Picnicker[] = { overworld_frame(gObjectEventPic_Picnicker, 2, 4, 0), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 1), overworld_frame(gObjectEventPic_Picnicker, 2, 4, 2), @@ -442,7 +442,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Picnicker[] = { overworld_frame(gObjectEventPic_Picnicker, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Man3[] = { +static const struct SpriteFrameImage sPicTable_Man3[] = { overworld_frame(gObjectEventPic_Man3, 2, 4, 0), overworld_frame(gObjectEventPic_Man3, 2, 4, 1), overworld_frame(gObjectEventPic_Man3, 2, 4, 2), @@ -454,7 +454,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Man3[] = { overworld_frame(gObjectEventPic_Man3, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Woman5[] = { +static const struct SpriteFrameImage sPicTable_Woman5[] = { overworld_frame(gObjectEventPic_Woman5, 2, 4, 0), overworld_frame(gObjectEventPic_Woman5, 2, 4, 1), overworld_frame(gObjectEventPic_Woman5, 2, 4, 2), @@ -466,7 +466,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Woman5[] = { overworld_frame(gObjectEventPic_Woman5, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Youngster[] = { +static const struct SpriteFrameImage sPicTable_Youngster[] = { overworld_frame(gObjectEventPic_Youngster, 2, 4, 0), overworld_frame(gObjectEventPic_Youngster, 2, 4, 1), overworld_frame(gObjectEventPic_Youngster, 2, 4, 2), @@ -478,7 +478,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Youngster[] = { overworld_frame(gObjectEventPic_Youngster, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BugCatcher[] = { +static const struct SpriteFrameImage sPicTable_BugCatcher[] = { overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 0), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 1), overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 2), @@ -490,7 +490,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BugCatcher[] = { overworld_frame(gObjectEventPic_BugCatcher, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_PsychicM[] = { +static const struct SpriteFrameImage sPicTable_PsychicM[] = { overworld_frame(gObjectEventPic_PsychicM, 2, 4, 0), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 1), overworld_frame(gObjectEventPic_PsychicM, 2, 4, 2), @@ -502,7 +502,7 @@ const struct SpriteFrameImage gObjectEventPicTable_PsychicM[] = { overworld_frame(gObjectEventPic_PsychicM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_SchoolKidM[] = { +static const struct SpriteFrameImage sPicTable_SchoolKidM[] = { overworld_frame(gObjectEventPic_SchoolKidM, 2, 4, 0), overworld_frame(gObjectEventPic_SchoolKidM, 2, 4, 1), overworld_frame(gObjectEventPic_SchoolKidM, 2, 4, 2), @@ -514,7 +514,7 @@ const struct SpriteFrameImage gObjectEventPicTable_SchoolKidM[] = { overworld_frame(gObjectEventPic_SchoolKidM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Maniac[] = { +static const struct SpriteFrameImage sPicTable_Maniac[] = { overworld_frame(gObjectEventPic_Maniac, 2, 4, 0), overworld_frame(gObjectEventPic_Maniac, 2, 4, 1), overworld_frame(gObjectEventPic_Maniac, 2, 4, 2), @@ -526,7 +526,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Maniac[] = { overworld_frame(gObjectEventPic_Maniac, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_HexManiac[] = { +static const struct SpriteFrameImage sPicTable_HexManiac[] = { overworld_frame(gObjectEventPic_HexManiac, 2, 4, 0), overworld_frame(gObjectEventPic_HexManiac, 2, 4, 1), overworld_frame(gObjectEventPic_HexManiac, 2, 4, 2), @@ -538,7 +538,7 @@ const struct SpriteFrameImage gObjectEventPicTable_HexManiac[] = { overworld_frame(gObjectEventPic_HexManiac, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_SwimmerM[] = { +static const struct SpriteFrameImage sPicTable_SwimmerM[] = { overworld_frame(gObjectEventPic_SwimmerM, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerM, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerM, 2, 4, 2), @@ -550,7 +550,7 @@ const struct SpriteFrameImage gObjectEventPicTable_SwimmerM[] = { overworld_frame(gObjectEventPic_SwimmerM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_SwimmerF[] = { +static const struct SpriteFrameImage sPicTable_SwimmerF[] = { overworld_frame(gObjectEventPic_SwimmerF, 2, 4, 0), overworld_frame(gObjectEventPic_SwimmerF, 2, 4, 1), overworld_frame(gObjectEventPic_SwimmerF, 2, 4, 2), @@ -562,7 +562,7 @@ const struct SpriteFrameImage gObjectEventPicTable_SwimmerF[] = { overworld_frame(gObjectEventPic_SwimmerF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BlackBelt[] = { +static const struct SpriteFrameImage sPicTable_BlackBelt[] = { overworld_frame(gObjectEventPic_BlackBelt, 2, 4, 0), overworld_frame(gObjectEventPic_BlackBelt, 2, 4, 1), overworld_frame(gObjectEventPic_BlackBelt, 2, 4, 2), @@ -574,7 +574,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BlackBelt[] = { overworld_frame(gObjectEventPic_BlackBelt, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Beauty[] = { +static const struct SpriteFrameImage sPicTable_Beauty[] = { overworld_frame(gObjectEventPic_Beauty, 2, 4, 0), overworld_frame(gObjectEventPic_Beauty, 2, 4, 1), overworld_frame(gObjectEventPic_Beauty, 2, 4, 2), @@ -586,7 +586,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Beauty[] = { overworld_frame(gObjectEventPic_Beauty, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Scientist1[] = { +static const struct SpriteFrameImage sPicTable_Scientist1[] = { overworld_frame(gObjectEventPic_Scientist1, 2, 4, 0), overworld_frame(gObjectEventPic_Scientist1, 2, 4, 1), overworld_frame(gObjectEventPic_Scientist1, 2, 4, 2), @@ -598,7 +598,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Scientist1[] = { overworld_frame(gObjectEventPic_Scientist1, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Lass[] = { +static const struct SpriteFrameImage sPicTable_Lass[] = { overworld_frame(gObjectEventPic_Lass, 2, 4, 0), overworld_frame(gObjectEventPic_Lass, 2, 4, 1), overworld_frame(gObjectEventPic_Lass, 2, 4, 2), @@ -610,7 +610,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Lass[] = { overworld_frame(gObjectEventPic_Lass, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Gentleman[] = { +static const struct SpriteFrameImage sPicTable_Gentleman[] = { overworld_frame(gObjectEventPic_Gentleman, 2, 4, 0), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 1), overworld_frame(gObjectEventPic_Gentleman, 2, 4, 2), @@ -622,7 +622,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Gentleman[] = { overworld_frame(gObjectEventPic_Gentleman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Sailor[] = { +static const struct SpriteFrameImage sPicTable_Sailor[] = { overworld_frame(gObjectEventPic_Sailor, 2, 4, 0), overworld_frame(gObjectEventPic_Sailor, 2, 4, 1), overworld_frame(gObjectEventPic_Sailor, 2, 4, 2), @@ -634,7 +634,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Sailor[] = { overworld_frame(gObjectEventPic_Sailor, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Fisherman[] = { +static const struct SpriteFrameImage sPicTable_Fisherman[] = { overworld_frame(gObjectEventPic_Fisherman, 2, 4, 0), overworld_frame(gObjectEventPic_Fisherman, 2, 4, 1), overworld_frame(gObjectEventPic_Fisherman, 2, 4, 2), @@ -646,7 +646,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Fisherman[] = { overworld_frame(gObjectEventPic_Fisherman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_RunningTriathleteM[] = { +static const struct SpriteFrameImage sPicTable_RunningTriathleteM[] = { overworld_frame(gObjectEventPic_RunningTriathleteM, 2, 4, 0), overworld_frame(gObjectEventPic_RunningTriathleteM, 2, 4, 1), overworld_frame(gObjectEventPic_RunningTriathleteM, 2, 4, 2), @@ -658,7 +658,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RunningTriathleteM[] = { overworld_frame(gObjectEventPic_RunningTriathleteM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_RunningTriathleteF[] = { +static const struct SpriteFrameImage sPicTable_RunningTriathleteF[] = { overworld_frame(gObjectEventPic_RunningTriathleteF, 2, 4, 0), overworld_frame(gObjectEventPic_RunningTriathleteF, 2, 4, 1), overworld_frame(gObjectEventPic_RunningTriathleteF, 2, 4, 2), @@ -670,7 +670,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RunningTriathleteF[] = { overworld_frame(gObjectEventPic_RunningTriathleteF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_TuberF[] = { +static const struct SpriteFrameImage sPicTable_TuberF[] = { overworld_frame(gObjectEventPic_TuberF, 2, 2, 0), overworld_frame(gObjectEventPic_TuberF, 2, 2, 1), overworld_frame(gObjectEventPic_TuberF, 2, 2, 2), @@ -682,7 +682,7 @@ const struct SpriteFrameImage gObjectEventPicTable_TuberF[] = { overworld_frame(gObjectEventPic_TuberF, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_TuberM[] = { +static const struct SpriteFrameImage sPicTable_TuberM[] = { overworld_frame(gObjectEventPic_TuberM, 2, 2, 0), overworld_frame(gObjectEventPic_TuberM, 2, 2, 1), overworld_frame(gObjectEventPic_TuberM, 2, 2, 2), @@ -694,7 +694,7 @@ const struct SpriteFrameImage gObjectEventPicTable_TuberM[] = { overworld_frame(gObjectEventPic_TuberM, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Hiker[] = { +static const struct SpriteFrameImage sPicTable_Hiker[] = { overworld_frame(gObjectEventPic_Hiker, 2, 4, 0), overworld_frame(gObjectEventPic_Hiker, 2, 4, 1), overworld_frame(gObjectEventPic_Hiker, 2, 4, 2), @@ -706,7 +706,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Hiker[] = { overworld_frame(gObjectEventPic_Hiker, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_CyclingTriathleteM[] = { +static const struct SpriteFrameImage sPicTable_CyclingTriathleteM[] = { overworld_frame(gObjectEventPic_CyclingTriathleteM, 4, 4, 0), overworld_frame(gObjectEventPic_CyclingTriathleteM, 4, 4, 1), overworld_frame(gObjectEventPic_CyclingTriathleteM, 4, 4, 2), @@ -718,7 +718,7 @@ const struct SpriteFrameImage gObjectEventPicTable_CyclingTriathleteM[] = { overworld_frame(gObjectEventPic_CyclingTriathleteM, 4, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_CyclingTriathleteF[] = { +static const struct SpriteFrameImage sPicTable_CyclingTriathleteF[] = { overworld_frame(gObjectEventPic_CyclingTriathleteF, 4, 4, 0), overworld_frame(gObjectEventPic_CyclingTriathleteF, 4, 4, 1), overworld_frame(gObjectEventPic_CyclingTriathleteF, 4, 4, 2), @@ -730,7 +730,7 @@ const struct SpriteFrameImage gObjectEventPicTable_CyclingTriathleteF[] = { overworld_frame(gObjectEventPic_CyclingTriathleteF, 4, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Nurse[] = { +static const struct SpriteFrameImage sPicTable_Nurse[] = { overworld_frame(gObjectEventPic_Nurse, 2, 4, 0), overworld_frame(gObjectEventPic_Nurse, 2, 4, 1), overworld_frame(gObjectEventPic_Nurse, 2, 4, 2), @@ -743,11 +743,11 @@ const struct SpriteFrameImage gObjectEventPicTable_Nurse[] = { overworld_frame(gObjectEventPic_Nurse, 2, 4, 3), }; -const struct SpriteFrameImage gObjectEventPicTable_ItemBall[] = { +static const struct SpriteFrameImage sPicTable_ItemBall[] = { obj_frame_tiles(gObjectEventPic_ItemBall), }; -const struct SpriteFrameImage gObjectEventPicTable_ProfBirch[] = { +static const struct SpriteFrameImage sPicTable_ProfBirch[] = { overworld_frame(gObjectEventPic_ProfBirch, 2, 4, 0), overworld_frame(gObjectEventPic_ProfBirch, 2, 4, 1), overworld_frame(gObjectEventPic_ProfBirch, 2, 4, 2), @@ -759,7 +759,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ProfBirch[] = { overworld_frame(gObjectEventPic_ProfBirch, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Man4[] = { +static const struct SpriteFrameImage sPicTable_Man4[] = { overworld_frame(gObjectEventPic_Man4, 2, 4, 0), overworld_frame(gObjectEventPic_Man4, 2, 4, 1), overworld_frame(gObjectEventPic_Man4, 2, 4, 2), @@ -771,7 +771,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Man4[] = { overworld_frame(gObjectEventPic_Man4, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Man5[] = { +static const struct SpriteFrameImage sPicTable_Man5[] = { overworld_frame(gObjectEventPic_Man5, 2, 4, 0), overworld_frame(gObjectEventPic_Man5, 2, 4, 1), overworld_frame(gObjectEventPic_Man5, 2, 4, 2), @@ -783,7 +783,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Man5[] = { overworld_frame(gObjectEventPic_Man5, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_ReporterM[] = { +static const struct SpriteFrameImage sPicTable_ReporterM[] = { overworld_frame(gObjectEventPic_ReporterM, 2, 4, 0), overworld_frame(gObjectEventPic_ReporterM, 2, 4, 1), overworld_frame(gObjectEventPic_ReporterM, 2, 4, 2), @@ -795,7 +795,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ReporterM[] = { overworld_frame(gObjectEventPic_ReporterM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_ReporterF[] = { +static const struct SpriteFrameImage sPicTable_ReporterF[] = { overworld_frame(gObjectEventPic_ReporterF, 2, 4, 0), overworld_frame(gObjectEventPic_ReporterF, 2, 4, 1), overworld_frame(gObjectEventPic_ReporterF, 2, 4, 2), @@ -807,7 +807,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ReporterF[] = { overworld_frame(gObjectEventPic_ReporterF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MauvilleOldMan1[] = { +static const struct SpriteFrameImage sPicTable_MauvilleOldMan1[] = { overworld_frame(gObjectEventPic_MauvilleOldMan1, 2, 4, 0), overworld_frame(gObjectEventPic_MauvilleOldMan1, 2, 4, 1), overworld_frame(gObjectEventPic_MauvilleOldMan1, 2, 4, 2), @@ -819,7 +819,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MauvilleOldMan1[] = { overworld_frame(gObjectEventPic_MauvilleOldMan1, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MauvilleOldMan2[] = { +static const struct SpriteFrameImage sPicTable_MauvilleOldMan2[] = { overworld_frame(gObjectEventPic_MauvilleOldMan2, 2, 4, 0), overworld_frame(gObjectEventPic_MauvilleOldMan2, 2, 4, 1), overworld_frame(gObjectEventPic_MauvilleOldMan2, 2, 4, 2), @@ -831,38 +831,38 @@ const struct SpriteFrameImage gObjectEventPicTable_MauvilleOldMan2[] = { overworld_frame(gObjectEventPic_MauvilleOldMan2, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_UnusedNatuDoll[] = { +static const struct SpriteFrameImage sPicTable_UnusedNatuDoll[] = { obj_frame_tiles(gObjectEventPic_UnusedNatuDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_UnusedMagnemiteDoll[] = { +static const struct SpriteFrameImage sPicTable_UnusedMagnemiteDoll[] = { obj_frame_tiles(gObjectEventPic_UnusedMagnemiteDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_UnusedSquirtleDoll[] = { +static const struct SpriteFrameImage sPicTable_UnusedSquirtleDoll[] = { obj_frame_tiles(gObjectEventPic_UnusedSquirtleDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_UnusedWooperDoll[] = { +static const struct SpriteFrameImage sPicTable_UnusedWooperDoll[] = { obj_frame_tiles(gObjectEventPic_UnusedWooperDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_UnusedPikachuDoll[] = { +static const struct SpriteFrameImage sPicTable_UnusedPikachuDoll[] = { obj_frame_tiles(gObjectEventPic_UnusedPikachuDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_UnusedPorygon2Doll[] = { +static const struct SpriteFrameImage sPicTable_UnusedPorygon2Doll[] = { obj_frame_tiles(gObjectEventPic_UnusedPorygon2Doll), }; -const struct SpriteFrameImage gObjectEventPicTable_CuttableTree[] = { +static const struct SpriteFrameImage sPicTable_CuttableTree[] = { overworld_frame(gObjectEventPic_CuttableTree, 2, 2, 0), overworld_frame(gObjectEventPic_CuttableTree, 2, 2, 1), overworld_frame(gObjectEventPic_CuttableTree, 2, 2, 2), overworld_frame(gObjectEventPic_CuttableTree, 2, 2, 3), }; -const struct SpriteFrameImage gObjectEventPicTable_MartEmployee[] = { +static const struct SpriteFrameImage sPicTable_MartEmployee[] = { overworld_frame(gObjectEventPic_MartEmployee, 2, 4, 0), overworld_frame(gObjectEventPic_MartEmployee, 2, 4, 1), overworld_frame(gObjectEventPic_MartEmployee, 2, 4, 2), @@ -874,7 +874,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MartEmployee[] = { overworld_frame(gObjectEventPic_MartEmployee, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_RooftopSaleWoman[] = { +static const struct SpriteFrameImage sPicTable_RooftopSaleWoman[] = { overworld_frame(gObjectEventPic_RooftopSaleWoman, 2, 4, 0), overworld_frame(gObjectEventPic_RooftopSaleWoman, 2, 4, 1), overworld_frame(gObjectEventPic_RooftopSaleWoman, 2, 4, 2), @@ -886,7 +886,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RooftopSaleWoman[] = { overworld_frame(gObjectEventPic_RooftopSaleWoman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Teala[] = { +static const struct SpriteFrameImage sPicTable_Teala[] = { overworld_frame(gObjectEventPic_Teala, 2, 4, 0), overworld_frame(gObjectEventPic_Teala, 2, 4, 1), overworld_frame(gObjectEventPic_Teala, 2, 4, 2), @@ -898,18 +898,18 @@ const struct SpriteFrameImage gObjectEventPicTable_Teala[] = { overworld_frame(gObjectEventPic_Teala, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BreakableRock[] = { +static const struct SpriteFrameImage sPicTable_BreakableRock[] = { overworld_frame(gObjectEventPic_BreakableRock, 2, 2, 0), overworld_frame(gObjectEventPic_BreakableRock, 2, 2, 1), overworld_frame(gObjectEventPic_BreakableRock, 2, 2, 2), overworld_frame(gObjectEventPic_BreakableRock, 2, 2, 3), }; -const struct SpriteFrameImage gObjectEventPicTable_PushableBoulder[] = { +static const struct SpriteFrameImage sPicTable_PushableBoulder[] = { obj_frame_tiles(gObjectEventPic_PushableBoulder), }; -const struct SpriteFrameImage gObjectEventPicTable_MrBrineysBoat[] = { +static const struct SpriteFrameImage sPicTable_MrBrineysBoat[] = { overworld_frame(gObjectEventPic_MrBrineysBoat, 4, 4, 0), overworld_frame(gObjectEventPic_MrBrineysBoat, 4, 4, 1), overworld_frame(gObjectEventPic_MrBrineysBoat, 4, 4, 2), @@ -921,11 +921,11 @@ const struct SpriteFrameImage gObjectEventPicTable_MrBrineysBoat[] = { overworld_frame(gObjectEventPic_MrBrineysBoat, 4, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Truck[] = { +static const struct SpriteFrameImage sPicTable_Truck[] = { obj_frame_tiles(gObjectEventPic_Truck), }; -const struct SpriteFrameImage gObjectEventPicTable_VigorothCarryingBox[] = { +static const struct SpriteFrameImage sPicTable_VigorothCarryingBox[] = { overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 0), overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 0), overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 0), @@ -937,7 +937,7 @@ const struct SpriteFrameImage gObjectEventPicTable_VigorothCarryingBox[] = { overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_VigorothFacingAway[] = { +static const struct SpriteFrameImage sPicTable_VigorothFacingAway[] = { overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 3), overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 3), overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 3), @@ -949,11 +949,11 @@ const struct SpriteFrameImage gObjectEventPicTable_VigorothFacingAway[] = { overworld_frame(gObjectEventPic_Vigoroth, 4, 4, 4), }; -const struct SpriteFrameImage gObjectEventPicTable_BirchsBag[] = { +static const struct SpriteFrameImage sPicTable_BirchsBag[] = { obj_frame_tiles(gObjectEventPic_BirchsBag), }; -const struct SpriteFrameImage gObjectEventPicTable_EnemyZigzagoon[] = { +static const struct SpriteFrameImage sPicTable_EnemyZigzagoon[] = { overworld_frame(gObjectEventPic_EnemyZigzagoon, 4, 4, 0), overworld_frame(gObjectEventPic_EnemyZigzagoon, 4, 4, 1), overworld_frame(gObjectEventPic_EnemyZigzagoon, 4, 4, 2), @@ -965,7 +965,7 @@ const struct SpriteFrameImage gObjectEventPicTable_EnemyZigzagoon[] = { overworld_frame(gObjectEventPic_EnemyZigzagoon, 4, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Poochyena[] = { +static const struct SpriteFrameImage sPicTable_Poochyena[] = { overworld_frame(gObjectEventPic_Poochyena, 4, 4, 0), overworld_frame(gObjectEventPic_Poochyena, 4, 4, 1), overworld_frame(gObjectEventPic_Poochyena, 4, 4, 2), @@ -977,7 +977,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Poochyena[] = { overworld_frame(gObjectEventPic_Poochyena, 4, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Artist[] = { +static const struct SpriteFrameImage sPicTable_Artist[] = { overworld_frame(gObjectEventPic_Artist, 2, 4, 0), overworld_frame(gObjectEventPic_Artist, 2, 4, 1), overworld_frame(gObjectEventPic_Artist, 2, 4, 2), @@ -989,7 +989,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Artist[] = { overworld_frame(gObjectEventPic_Artist, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MayNormal[] = { +static const struct SpriteFrameImage sPicTable_MayNormal[] = { overworld_frame(gObjectEventPic_MayNormal, 2, 4, 0), overworld_frame(gObjectEventPic_MayNormal, 2, 4, 1), overworld_frame(gObjectEventPic_MayNormal, 2, 4, 2), @@ -1010,7 +1010,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MayNormal[] = { overworld_frame(gObjectEventPic_MayRunning, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MayMachBike[] = { +static const struct SpriteFrameImage sPicTable_MayMachBike[] = { overworld_frame(gObjectEventPic_MayMachBike, 4, 4, 0), overworld_frame(gObjectEventPic_MayMachBike, 4, 4, 1), overworld_frame(gObjectEventPic_MayMachBike, 4, 4, 2), @@ -1022,7 +1022,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MayMachBike[] = { overworld_frame(gObjectEventPic_MayMachBike, 4, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MayAcroBike[] = { +static const struct SpriteFrameImage sPicTable_MayAcroBike[] = { overworld_frame(gObjectEventPic_MayAcroBike, 4, 4, 0), overworld_frame(gObjectEventPic_MayAcroBike, 4, 4, 1), overworld_frame(gObjectEventPic_MayAcroBike, 4, 4, 2), @@ -1052,7 +1052,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MayAcroBike[] = { overworld_frame(gObjectEventPic_MayAcroBike, 4, 4, 26), }; -const struct SpriteFrameImage gObjectEventPicTable_MaySurfing[] = { +static const struct SpriteFrameImage sPicTable_MaySurfing[] = { overworld_frame(gObjectEventPic_MaySurfing, 4, 4, 0), overworld_frame(gObjectEventPic_MaySurfing, 4, 4, 2), overworld_frame(gObjectEventPic_MaySurfing, 4, 4, 4), @@ -1067,7 +1067,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MaySurfing[] = { overworld_frame(gObjectEventPic_MaySurfing, 4, 4, 5), }; -const struct SpriteFrameImage gObjectEventPicTable_MayUnderwater[] = { +static const struct SpriteFrameImage sPicTable_MayUnderwater[] = { overworld_frame(gObjectEventPic_MayUnderwater, 4, 4, 0), overworld_frame(gObjectEventPic_MayUnderwater, 4, 4, 1), overworld_frame(gObjectEventPic_MayUnderwater, 4, 4, 2), @@ -1079,7 +1079,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MayUnderwater[] = { overworld_frame(gObjectEventPic_MayUnderwater, 4, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_MayFieldMove[] = { +static const struct SpriteFrameImage sPicTable_MayFieldMove[] = { overworld_frame(gObjectEventPic_MayFieldMove, 4, 4, 0), overworld_frame(gObjectEventPic_MayFieldMove, 4, 4, 1), overworld_frame(gObjectEventPic_MayFieldMove, 4, 4, 2), @@ -1087,7 +1087,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MayFieldMove[] = { overworld_frame(gObjectEventPic_MayFieldMove, 4, 4, 4), }; -const struct SpriteFrameImage gObjectEventPicTable_Cameraman[] = { +static const struct SpriteFrameImage sPicTable_Cameraman[] = { overworld_frame(gObjectEventPic_Cameraman, 2, 4, 0), overworld_frame(gObjectEventPic_Cameraman, 2, 4, 1), overworld_frame(gObjectEventPic_Cameraman, 2, 4, 2), @@ -1099,15 +1099,15 @@ const struct SpriteFrameImage gObjectEventPicTable_Cameraman[] = { overworld_frame(gObjectEventPic_Cameraman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MovingBox[] = { +static const struct SpriteFrameImage sPicTable_MovingBox[] = { obj_frame_tiles(gObjectEventPic_MovingBox), }; -const struct SpriteFrameImage gObjectEventPicTable_CableCar[] = { +static const struct SpriteFrameImage sPicTable_CableCar[] = { obj_frame_tiles(gObjectEventPic_CableCar), }; -const struct SpriteFrameImage gObjectEventPicTable_Scientist2[] = { +static const struct SpriteFrameImage sPicTable_Scientist2[] = { overworld_frame(gObjectEventPic_Scientist2, 2, 4, 0), overworld_frame(gObjectEventPic_Scientist2, 2, 4, 1), overworld_frame(gObjectEventPic_Scientist2, 2, 4, 2), @@ -1119,7 +1119,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Scientist2[] = { overworld_frame(gObjectEventPic_Scientist2, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_DevonEmployee[] = { +static const struct SpriteFrameImage sPicTable_DevonEmployee[] = { overworld_frame(gObjectEventPic_DevonEmployee, 2, 4, 0), overworld_frame(gObjectEventPic_DevonEmployee, 2, 4, 1), overworld_frame(gObjectEventPic_DevonEmployee, 2, 4, 2), @@ -1131,7 +1131,7 @@ const struct SpriteFrameImage gObjectEventPicTable_DevonEmployee[] = { overworld_frame(gObjectEventPic_DevonEmployee, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_AquaMemberM[] = { +static const struct SpriteFrameImage sPicTable_AquaMemberM[] = { overworld_frame(gObjectEventPic_AquaMemberM, 2, 4, 0), overworld_frame(gObjectEventPic_AquaMemberM, 2, 4, 1), overworld_frame(gObjectEventPic_AquaMemberM, 2, 4, 2), @@ -1143,7 +1143,7 @@ const struct SpriteFrameImage gObjectEventPicTable_AquaMemberM[] = { overworld_frame(gObjectEventPic_AquaMemberM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_AquaMemberF[] = { +static const struct SpriteFrameImage sPicTable_AquaMemberF[] = { overworld_frame(gObjectEventPic_AquaMemberF, 2, 4, 0), overworld_frame(gObjectEventPic_AquaMemberF, 2, 4, 1), overworld_frame(gObjectEventPic_AquaMemberF, 2, 4, 2), @@ -1155,7 +1155,7 @@ const struct SpriteFrameImage gObjectEventPicTable_AquaMemberF[] = { overworld_frame(gObjectEventPic_AquaMemberF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MagmaMemberM[] = { +static const struct SpriteFrameImage sPicTable_MagmaMemberM[] = { overworld_frame(gObjectEventPic_MagmaMemberM, 2, 4, 0), overworld_frame(gObjectEventPic_MagmaMemberM, 2, 4, 1), overworld_frame(gObjectEventPic_MagmaMemberM, 2, 4, 2), @@ -1167,7 +1167,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MagmaMemberM[] = { overworld_frame(gObjectEventPic_MagmaMemberM, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MagmaMemberF[] = { +static const struct SpriteFrameImage sPicTable_MagmaMemberF[] = { overworld_frame(gObjectEventPic_MagmaMemberF, 2, 4, 0), overworld_frame(gObjectEventPic_MagmaMemberF, 2, 4, 1), overworld_frame(gObjectEventPic_MagmaMemberF, 2, 4, 2), @@ -1179,7 +1179,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MagmaMemberF[] = { overworld_frame(gObjectEventPic_MagmaMemberF, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Sidney[] = { +static const struct SpriteFrameImage sPicTable_Sidney[] = { overworld_frame(gObjectEventPic_Sidney, 2, 4, 0), overworld_frame(gObjectEventPic_Sidney, 2, 4, 1), overworld_frame(gObjectEventPic_Sidney, 2, 4, 2), @@ -1191,7 +1191,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Sidney[] = { overworld_frame(gObjectEventPic_Sidney, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Phoebe[] = { +static const struct SpriteFrameImage sPicTable_Phoebe[] = { overworld_frame(gObjectEventPic_Phoebe, 2, 4, 0), overworld_frame(gObjectEventPic_Phoebe, 2, 4, 1), overworld_frame(gObjectEventPic_Phoebe, 2, 4, 2), @@ -1203,7 +1203,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Phoebe[] = { overworld_frame(gObjectEventPic_Phoebe, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Glacia[] = { +static const struct SpriteFrameImage sPicTable_Glacia[] = { overworld_frame(gObjectEventPic_Glacia, 2, 4, 0), overworld_frame(gObjectEventPic_Glacia, 2, 4, 1), overworld_frame(gObjectEventPic_Glacia, 2, 4, 2), @@ -1215,7 +1215,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Glacia[] = { overworld_frame(gObjectEventPic_Glacia, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Drake[] = { +static const struct SpriteFrameImage sPicTable_Drake[] = { overworld_frame(gObjectEventPic_Drake, 2, 4, 0), overworld_frame(gObjectEventPic_Drake, 2, 4, 1), overworld_frame(gObjectEventPic_Drake, 2, 4, 2), @@ -1227,7 +1227,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Drake[] = { overworld_frame(gObjectEventPic_Drake, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Roxanne[] = { +static const struct SpriteFrameImage sPicTable_Roxanne[] = { overworld_frame(gObjectEventPic_Roxanne, 2, 4, 0), overworld_frame(gObjectEventPic_Roxanne, 2, 4, 1), overworld_frame(gObjectEventPic_Roxanne, 2, 4, 2), @@ -1239,7 +1239,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Roxanne[] = { overworld_frame(gObjectEventPic_Roxanne, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Brawly[] = { +static const struct SpriteFrameImage sPicTable_Brawly[] = { overworld_frame(gObjectEventPic_Brawly, 2, 4, 0), overworld_frame(gObjectEventPic_Brawly, 2, 4, 1), overworld_frame(gObjectEventPic_Brawly, 2, 4, 2), @@ -1251,7 +1251,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Brawly[] = { overworld_frame(gObjectEventPic_Brawly, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Wattson[] = { +static const struct SpriteFrameImage sPicTable_Wattson[] = { overworld_frame(gObjectEventPic_Wattson, 2, 4, 0), overworld_frame(gObjectEventPic_Wattson, 2, 4, 1), overworld_frame(gObjectEventPic_Wattson, 2, 4, 2), @@ -1263,7 +1263,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Wattson[] = { overworld_frame(gObjectEventPic_Wattson, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Flannery[] = { +static const struct SpriteFrameImage sPicTable_Flannery[] = { overworld_frame(gObjectEventPic_Flannery, 2, 4, 0), overworld_frame(gObjectEventPic_Flannery, 2, 4, 1), overworld_frame(gObjectEventPic_Flannery, 2, 4, 2), @@ -1275,7 +1275,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Flannery[] = { overworld_frame(gObjectEventPic_Flannery, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Norman[] = { +static const struct SpriteFrameImage sPicTable_Norman[] = { overworld_frame(gObjectEventPic_Norman, 2, 4, 0), overworld_frame(gObjectEventPic_Norman, 2, 4, 1), overworld_frame(gObjectEventPic_Norman, 2, 4, 2), @@ -1287,7 +1287,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Norman[] = { overworld_frame(gObjectEventPic_Norman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Winona[] = { +static const struct SpriteFrameImage sPicTable_Winona[] = { overworld_frame(gObjectEventPic_Winona, 2, 4, 0), overworld_frame(gObjectEventPic_Winona, 2, 4, 1), overworld_frame(gObjectEventPic_Winona, 2, 4, 2), @@ -1299,7 +1299,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Winona[] = { overworld_frame(gObjectEventPic_Winona, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Liza[] = { +static const struct SpriteFrameImage sPicTable_Liza[] = { overworld_frame(gObjectEventPic_Liza, 2, 4, 0), overworld_frame(gObjectEventPic_Liza, 2, 4, 1), overworld_frame(gObjectEventPic_Liza, 2, 4, 2), @@ -1311,7 +1311,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Liza[] = { overworld_frame(gObjectEventPic_Liza, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Tate[] = { +static const struct SpriteFrameImage sPicTable_Tate[] = { overworld_frame(gObjectEventPic_Tate, 2, 4, 0), overworld_frame(gObjectEventPic_Tate, 2, 4, 1), overworld_frame(gObjectEventPic_Tate, 2, 4, 2), @@ -1323,7 +1323,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Tate[] = { overworld_frame(gObjectEventPic_Tate, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Wallace[] = { +static const struct SpriteFrameImage sPicTable_Wallace[] = { overworld_frame(gObjectEventPic_Wallace, 2, 4, 0), overworld_frame(gObjectEventPic_Wallace, 2, 4, 1), overworld_frame(gObjectEventPic_Wallace, 2, 4, 2), @@ -1335,7 +1335,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Wallace[] = { overworld_frame(gObjectEventPic_Wallace, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Steven[] = { +static const struct SpriteFrameImage sPicTable_Steven[] = { overworld_frame(gObjectEventPic_Steven, 2, 4, 0), overworld_frame(gObjectEventPic_Steven, 2, 4, 1), overworld_frame(gObjectEventPic_Steven, 2, 4, 2), @@ -1347,7 +1347,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Steven[] = { overworld_frame(gObjectEventPic_Steven, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Wally[] = { +static const struct SpriteFrameImage sPicTable_Wally[] = { overworld_frame(gObjectEventPic_Wally, 2, 4, 0), overworld_frame(gObjectEventPic_Wally, 2, 4, 1), overworld_frame(gObjectEventPic_Wally, 2, 4, 2), @@ -1359,7 +1359,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Wally[] = { overworld_frame(gObjectEventPic_Wally, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_RubySapphireLittleBoy[] = { +static const struct SpriteFrameImage sPicTable_RubySapphireLittleBoy[] = { overworld_frame(gObjectEventPic_RubySapphireLittleBoy, 2, 2, 0), overworld_frame(gObjectEventPic_RubySapphireLittleBoy, 2, 2, 1), overworld_frame(gObjectEventPic_RubySapphireLittleBoy, 2, 2, 2), @@ -1371,7 +1371,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RubySapphireLittleBoy[] = { overworld_frame(gObjectEventPic_RubySapphireLittleBoy, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanFishing[] = { +static const struct SpriteFrameImage sPicTable_BrendanFishing[] = { overworld_frame(gObjectEventPic_BrendanFishing, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanFishing, 4, 4, 1), overworld_frame(gObjectEventPic_BrendanFishing, 4, 4, 2), @@ -1386,7 +1386,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanFishing[] = { overworld_frame(gObjectEventPic_BrendanFishing, 4, 4, 11), }; -const struct SpriteFrameImage gObjectEventPicTable_MayFishing[] = { +static const struct SpriteFrameImage sPicTable_MayFishing[] = { overworld_frame(gObjectEventPic_MayFishing, 4, 4, 0), overworld_frame(gObjectEventPic_MayFishing, 4, 4, 1), overworld_frame(gObjectEventPic_MayFishing, 4, 4, 2), @@ -1401,7 +1401,7 @@ const struct SpriteFrameImage gObjectEventPicTable_MayFishing[] = { overworld_frame(gObjectEventPic_MayFishing, 4, 4, 11), }; -const struct SpriteFrameImage gObjectEventPicTable_HotSpringsOldWoman[] = { +static const struct SpriteFrameImage sPicTable_HotSpringsOldWoman[] = { overworld_frame(gObjectEventPic_HotSpringsOldWoman, 2, 4, 0), overworld_frame(gObjectEventPic_HotSpringsOldWoman, 2, 4, 1), overworld_frame(gObjectEventPic_HotSpringsOldWoman, 2, 4, 2), @@ -1413,7 +1413,7 @@ const struct SpriteFrameImage gObjectEventPicTable_HotSpringsOldWoman[] = { overworld_frame(gObjectEventPic_HotSpringsOldWoman, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_SSTidal[] = { +static const struct SpriteFrameImage sPicTable_SSTidal[] = { obj_frame_tiles(gObjectEventPic_SSTidal), obj_frame_tiles(gObjectEventPic_SSTidal), obj_frame_tiles(gObjectEventPic_SSTidal), @@ -1425,7 +1425,7 @@ const struct SpriteFrameImage gObjectEventPicTable_SSTidal[] = { obj_frame_tiles(gObjectEventPic_SSTidal), }; -const struct SpriteFrameImage gObjectEventPicTable_SubmarineShadow[] = { +static const struct SpriteFrameImage sPicTable_SubmarineShadow[] = { obj_frame_tiles(gObjectEventPic_SubmarineShadow), obj_frame_tiles(gObjectEventPic_SubmarineShadow), obj_frame_tiles(gObjectEventPic_SubmarineShadow), @@ -1437,187 +1437,187 @@ const struct SpriteFrameImage gObjectEventPicTable_SubmarineShadow[] = { obj_frame_tiles(gObjectEventPic_SubmarineShadow), }; -const struct SpriteFrameImage gObjectEventPicTable_PichuDoll[] = { +static const struct SpriteFrameImage sPicTable_PichuDoll[] = { obj_frame_tiles(gObjectEventPic_PichuDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_PikachuDoll[] = { +static const struct SpriteFrameImage sPicTable_PikachuDoll[] = { obj_frame_tiles(gObjectEventPic_PikachuDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_MarillDoll[] = { +static const struct SpriteFrameImage sPicTable_MarillDoll[] = { obj_frame_tiles(gObjectEventPic_MarillDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_TogepiDoll[] = { +static const struct SpriteFrameImage sPicTable_TogepiDoll[] = { obj_frame_tiles(gObjectEventPic_TogepiDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_CyndaquilDoll[] = { +static const struct SpriteFrameImage sPicTable_CyndaquilDoll[] = { obj_frame_tiles(gObjectEventPic_CyndaquilDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_ChikoritaDoll[] = { +static const struct SpriteFrameImage sPicTable_ChikoritaDoll[] = { obj_frame_tiles(gObjectEventPic_ChikoritaDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_TotodileDoll[] = { +static const struct SpriteFrameImage sPicTable_TotodileDoll[] = { obj_frame_tiles(gObjectEventPic_TotodileDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_JigglypuffDoll[] = { +static const struct SpriteFrameImage sPicTable_JigglypuffDoll[] = { obj_frame_tiles(gObjectEventPic_JigglypuffDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_MeowthDoll[] = { +static const struct SpriteFrameImage sPicTable_MeowthDoll[] = { obj_frame_tiles(gObjectEventPic_MeowthDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_ClefairyDoll[] = { +static const struct SpriteFrameImage sPicTable_ClefairyDoll[] = { obj_frame_tiles(gObjectEventPic_ClefairyDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_DittoDoll[] = { +static const struct SpriteFrameImage sPicTable_DittoDoll[] = { obj_frame_tiles(gObjectEventPic_DittoDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_SmoochumDoll[] = { +static const struct SpriteFrameImage sPicTable_SmoochumDoll[] = { obj_frame_tiles(gObjectEventPic_SmoochumDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_TreeckoDoll[] = { +static const struct SpriteFrameImage sPicTable_TreeckoDoll[] = { obj_frame_tiles(gObjectEventPic_TreeckoDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_TorchicDoll[] = { +static const struct SpriteFrameImage sPicTable_TorchicDoll[] = { obj_frame_tiles(gObjectEventPic_TorchicDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_MudkipDoll[] = { +static const struct SpriteFrameImage sPicTable_MudkipDoll[] = { obj_frame_tiles(gObjectEventPic_MudkipDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_DuskullDoll[] = { +static const struct SpriteFrameImage sPicTable_DuskullDoll[] = { obj_frame_tiles(gObjectEventPic_DuskullDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_WynautDoll[] = { +static const struct SpriteFrameImage sPicTable_WynautDoll[] = { obj_frame_tiles(gObjectEventPic_WynautDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BaltoyDoll[] = { +static const struct SpriteFrameImage sPicTable_BaltoyDoll[] = { obj_frame_tiles(gObjectEventPic_BaltoyDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_KecleonDoll[] = { +static const struct SpriteFrameImage sPicTable_KecleonDoll[] = { obj_frame_tiles(gObjectEventPic_KecleonDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_AzurillDoll[] = { +static const struct SpriteFrameImage sPicTable_AzurillDoll[] = { obj_frame_tiles(gObjectEventPic_AzurillDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_SkittyDoll[] = { +static const struct SpriteFrameImage sPicTable_SkittyDoll[] = { obj_frame_tiles(gObjectEventPic_SkittyDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_SwabluDoll[] = { +static const struct SpriteFrameImage sPicTable_SwabluDoll[] = { obj_frame_tiles(gObjectEventPic_SwabluDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_GulpinDoll[] = { +static const struct SpriteFrameImage sPicTable_GulpinDoll[] = { obj_frame_tiles(gObjectEventPic_GulpinDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_LotadDoll[] = { +static const struct SpriteFrameImage sPicTable_LotadDoll[] = { obj_frame_tiles(gObjectEventPic_LotadDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_SeedotDoll[] = { +static const struct SpriteFrameImage sPicTable_SeedotDoll[] = { obj_frame_tiles(gObjectEventPic_SeedotDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_PikaCushion[] = { +static const struct SpriteFrameImage sPicTable_PikaCushion[] = { obj_frame_tiles(gObjectEventPic_PikaCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_RoundCushion[] = { +static const struct SpriteFrameImage sPicTable_RoundCushion[] = { obj_frame_tiles(gObjectEventPic_RoundCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_KissCushion[] = { +static const struct SpriteFrameImage sPicTable_KissCushion[] = { obj_frame_tiles(gObjectEventPic_KissCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_ZigzagCushion[] = { +static const struct SpriteFrameImage sPicTable_ZigzagCushion[] = { obj_frame_tiles(gObjectEventPic_ZigzagCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_SpinCushion[] = { +static const struct SpriteFrameImage sPicTable_SpinCushion[] = { obj_frame_tiles(gObjectEventPic_SpinCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_DiamondCushion[] = { +static const struct SpriteFrameImage sPicTable_DiamondCushion[] = { obj_frame_tiles(gObjectEventPic_DiamondCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_BallCushion[] = { +static const struct SpriteFrameImage sPicTable_BallCushion[] = { obj_frame_tiles(gObjectEventPic_BallCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_GrassCushion[] = { +static const struct SpriteFrameImage sPicTable_GrassCushion[] = { obj_frame_tiles(gObjectEventPic_GrassCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_FireCushion[] = { +static const struct SpriteFrameImage sPicTable_FireCushion[] = { obj_frame_tiles(gObjectEventPic_FireCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_WaterCushion[] = { +static const struct SpriteFrameImage sPicTable_WaterCushion[] = { obj_frame_tiles(gObjectEventPic_WaterCushion), }; -const struct SpriteFrameImage gObjectEventPicTable_BigSnorlaxDoll[] = { +static const struct SpriteFrameImage sPicTable_BigSnorlaxDoll[] = { obj_frame_tiles(gObjectEventPic_BigSnorlaxDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigRhydonDoll[] = { +static const struct SpriteFrameImage sPicTable_BigRhydonDoll[] = { obj_frame_tiles(gObjectEventPic_BigRhydonDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigLaprasDoll[] = { +static const struct SpriteFrameImage sPicTable_BigLaprasDoll[] = { obj_frame_tiles(gObjectEventPic_BigLaprasDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigVenusaurDoll[] = { +static const struct SpriteFrameImage sPicTable_BigVenusaurDoll[] = { obj_frame_tiles(gObjectEventPic_BigVenusaurDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigCharizardDoll[] = { +static const struct SpriteFrameImage sPicTable_BigCharizardDoll[] = { obj_frame_tiles(gObjectEventPic_BigCharizardDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigBlastoiseDoll[] = { +static const struct SpriteFrameImage sPicTable_BigBlastoiseDoll[] = { obj_frame_tiles(gObjectEventPic_BigBlastoiseDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigWailmerDoll[] = { +static const struct SpriteFrameImage sPicTable_BigWailmerDoll[] = { obj_frame_tiles(gObjectEventPic_BigWailmerDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigRegirockDoll[] = { +static const struct SpriteFrameImage sPicTable_BigRegirockDoll[] = { obj_frame_tiles(gObjectEventPic_BigRegirockDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigRegiceDoll[] = { +static const struct SpriteFrameImage sPicTable_BigRegiceDoll[] = { obj_frame_tiles(gObjectEventPic_BigRegiceDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_BigRegisteelDoll[] = { +static const struct SpriteFrameImage sPicTable_BigRegisteelDoll[] = { obj_frame_tiles(gObjectEventPic_BigRegisteelDoll), }; -const struct SpriteFrameImage gObjectEventPicTable_LatiasLatios[] = { +static const struct SpriteFrameImage sPicTable_LatiasLatios[] = { overworld_frame(gObjectEventPic_LatiasLatios, 4, 4, 0), overworld_frame(gObjectEventPic_LatiasLatios, 4, 4, 0), overworld_frame(gObjectEventPic_LatiasLatios, 4, 4, 0), @@ -1629,7 +1629,7 @@ const struct SpriteFrameImage gObjectEventPicTable_LatiasLatios[] = { overworld_frame(gObjectEventPic_LatiasLatios, 4, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_GameboyKid[] = { +static const struct SpriteFrameImage sPicTable_GameboyKid[] = { overworld_frame(gObjectEventPic_GameboyKid, 2, 4, 0), overworld_frame(gObjectEventPic_GameboyKid, 2, 4, 1), overworld_frame(gObjectEventPic_GameboyKid, 2, 4, 2), @@ -1641,7 +1641,7 @@ const struct SpriteFrameImage gObjectEventPicTable_GameboyKid[] = { overworld_frame(gObjectEventPic_GameboyKid, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_ContestJudge[] = { +static const struct SpriteFrameImage sPicTable_ContestJudge[] = { overworld_frame(gObjectEventPic_ContestJudge, 2, 4, 0), overworld_frame(gObjectEventPic_ContestJudge, 2, 4, 1), overworld_frame(gObjectEventPic_ContestJudge, 2, 4, 2), @@ -1653,7 +1653,7 @@ const struct SpriteFrameImage gObjectEventPicTable_ContestJudge[] = { overworld_frame(gObjectEventPic_ContestJudge, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanWatering[] = { +static const struct SpriteFrameImage sPicTable_BrendanWatering[] = { overworld_frame(gObjectEventPic_BrendanWatering, 4, 4, 0), overworld_frame(gObjectEventPic_BrendanWatering, 4, 4, 2), overworld_frame(gObjectEventPic_BrendanWatering, 4, 4, 4), @@ -1665,7 +1665,7 @@ const struct SpriteFrameImage gObjectEventPicTable_BrendanWatering[] = { overworld_frame(gObjectEventPic_BrendanWatering, 4, 4, 5), }; -const struct SpriteFrameImage gObjectEventPicTable_MayWatering[] = { +static const struct SpriteFrameImage sPicTable_MayWatering[] = { overworld_frame(gObjectEventPic_MayWatering, 4, 4, 0), overworld_frame(gObjectEventPic_MayWatering, 4, 4, 2), overworld_frame(gObjectEventPic_MayWatering, 4, 4, 4), @@ -1677,15 +1677,15 @@ const struct SpriteFrameImage gObjectEventPicTable_MayWatering[] = { overworld_frame(gObjectEventPic_MayWatering, 4, 4, 5), }; -const struct SpriteFrameImage gObjectEventPicTable_BrendanDecorating[] = { +static const struct SpriteFrameImage sPicTable_BrendanDecorating[] = { obj_frame_tiles(gObjectEventPic_BrendanDecorating), }; -const struct SpriteFrameImage gObjectEventPicTable_MayDecorating[] = { +static const struct SpriteFrameImage sPicTable_MayDecorating[] = { obj_frame_tiles(gObjectEventPic_MayDecorating), }; -const struct SpriteFrameImage gObjectEventPicTable_Archie[] = { +static const struct SpriteFrameImage sPicTable_Archie[] = { overworld_frame(gObjectEventPic_Archie, 2, 4, 0), overworld_frame(gObjectEventPic_Archie, 2, 4, 1), overworld_frame(gObjectEventPic_Archie, 2, 4, 2), @@ -1697,7 +1697,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Archie[] = { overworld_frame(gObjectEventPic_Archie, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Maxie[] = { +static const struct SpriteFrameImage sPicTable_Maxie[] = { overworld_frame(gObjectEventPic_Maxie, 2, 4, 0), overworld_frame(gObjectEventPic_Maxie, 2, 4, 1), overworld_frame(gObjectEventPic_Maxie, 2, 4, 2), @@ -1709,7 +1709,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Maxie[] = { overworld_frame(gObjectEventPic_Maxie, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_KyogreFront[] = { +static const struct SpriteFrameImage sPicTable_KyogreFront[] = { overworld_frame(gObjectEventPic_Kyogre, 4, 4, 0), overworld_frame(gObjectEventPic_Kyogre, 4, 4, 0), overworld_frame(gObjectEventPic_Kyogre, 4, 4, 0), @@ -1721,7 +1721,7 @@ const struct SpriteFrameImage gObjectEventPicTable_KyogreFront[] = { overworld_frame(gObjectEventPic_Kyogre, 4, 4, 1), }; -const struct SpriteFrameImage gObjectEventPicTable_GroudonFront[] = { +static const struct SpriteFrameImage sPicTable_GroudonFront[] = { overworld_frame(gObjectEventPic_Groudon, 4, 4, 0), overworld_frame(gObjectEventPic_Groudon, 4, 4, 0), overworld_frame(gObjectEventPic_Groudon, 4, 4, 0), @@ -1733,7 +1733,7 @@ const struct SpriteFrameImage gObjectEventPicTable_GroudonFront[] = { overworld_frame(gObjectEventPic_Groudon, 4, 4, 1), }; -const struct SpriteFrameImage gObjectEventPicTable_KyogreSide[] = { +static const struct SpriteFrameImage sPicTable_KyogreSide[] = { overworld_frame(gObjectEventPic_Kyogre, 4, 4, 2), overworld_frame(gObjectEventPic_Kyogre, 4, 4, 2), overworld_frame(gObjectEventPic_Kyogre, 4, 4, 2), @@ -1745,7 +1745,7 @@ const struct SpriteFrameImage gObjectEventPicTable_KyogreSide[] = { overworld_frame(gObjectEventPic_Kyogre, 4, 4, 3), }; -const struct SpriteFrameImage gObjectEventPicTable_GroudonSide[] = { +static const struct SpriteFrameImage sPicTable_GroudonSide[] = { overworld_frame(gObjectEventPic_Groudon, 4, 4, 2), overworld_frame(gObjectEventPic_Groudon, 4, 4, 2), overworld_frame(gObjectEventPic_Groudon, 4, 4, 2), @@ -1757,11 +1757,11 @@ const struct SpriteFrameImage gObjectEventPicTable_GroudonSide[] = { overworld_frame(gObjectEventPic_Groudon, 4, 4, 3), }; -const struct SpriteFrameImage gObjectEventPicTable_Fossil[] = { +static const struct SpriteFrameImage sPicTable_Fossil[] = { obj_frame_tiles(gObjectEventPic_Fossil), }; -const struct SpriteFrameImage gObjectEventPicTable_Regi[] = { +static const struct SpriteFrameImage sPicTable_Regi[] = { obj_frame_tiles(gObjectEventPic_Regi), obj_frame_tiles(gObjectEventPic_Regi), obj_frame_tiles(gObjectEventPic_Regi), @@ -1773,7 +1773,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Regi[] = { obj_frame_tiles(gObjectEventPic_Regi), }; -const struct SpriteFrameImage gObjectEventPicTable_Skitty[] = { +static const struct SpriteFrameImage sPicTable_Skitty[] = { overworld_frame(gObjectEventPic_Skitty, 2, 2, 0), overworld_frame(gObjectEventPic_Skitty, 2, 2, 1), overworld_frame(gObjectEventPic_Skitty, 2, 2, 2), @@ -1785,7 +1785,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Skitty[] = { overworld_frame(gObjectEventPic_Skitty, 2, 2, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Kecleon[] = { +static const struct SpriteFrameImage sPicTable_Kecleon[] = { overworld_frame(gObjectEventPic_Kecleon, 2, 2, 0), overworld_frame(gObjectEventPic_Kecleon, 2, 2, 1), overworld_frame(gObjectEventPic_Kecleon, 2, 2, 2), @@ -1797,7 +1797,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Kecleon[] = { overworld_frame(gObjectEventPic_Kecleon, 2, 2, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Rayquaza[] = { +static const struct SpriteFrameImage sPicTable_Rayquaza[] = { overworld_frame(gObjectEventPic_Rayquaza, 8, 8, 0), overworld_frame(gObjectEventPic_Rayquaza, 8, 8, 1), overworld_frame(gObjectEventPic_Rayquaza, 8, 8, 2), @@ -1805,7 +1805,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Rayquaza[] = { overworld_frame(gObjectEventPic_Rayquaza, 8, 8, 4), }; -const struct SpriteFrameImage gObjectEventPicTable_RayquazaStill[] = { +static const struct SpriteFrameImage sPicTable_RayquazaStill[] = { obj_frame_tiles(gObjectEventPic_RayquazaStill), obj_frame_tiles(gObjectEventPic_RayquazaStill), obj_frame_tiles(gObjectEventPic_RayquazaStill), @@ -1817,7 +1817,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RayquazaStill[] = { obj_frame_tiles(gObjectEventPic_RayquazaStill), }; -const struct SpriteFrameImage gObjectEventPicTable_Zigzagoon[] = { +static const struct SpriteFrameImage sPicTable_Zigzagoon[] = { overworld_frame(gObjectEventPic_Zigzagoon, 2, 2, 0), overworld_frame(gObjectEventPic_Zigzagoon, 2, 2, 1), overworld_frame(gObjectEventPic_Zigzagoon, 2, 2, 2), @@ -1829,7 +1829,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Zigzagoon[] = { overworld_frame(gObjectEventPic_Zigzagoon, 2, 2, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Pikachu[] = { +static const struct SpriteFrameImage sPicTable_Pikachu[] = { overworld_frame(gObjectEventPic_Pikachu, 2, 2, 0), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 1), overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2), @@ -1841,7 +1841,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Pikachu[] = { overworld_frame(gObjectEventPic_Pikachu, 2, 2, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Azumarill[] = { +static const struct SpriteFrameImage sPicTable_Azumarill[] = { overworld_frame(gObjectEventPic_Azumarill, 2, 2, 0), overworld_frame(gObjectEventPic_Azumarill, 2, 2, 1), overworld_frame(gObjectEventPic_Azumarill, 2, 2, 2), @@ -1853,7 +1853,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Azumarill[] = { overworld_frame(gObjectEventPic_Azumarill, 2, 2, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Wingull[] = { +static const struct SpriteFrameImage sPicTable_Wingull[] = { overworld_frame(gObjectEventPic_Wingull, 2, 2, 0), overworld_frame(gObjectEventPic_Wingull, 2, 2, 2), overworld_frame(gObjectEventPic_Wingull, 2, 2, 4), @@ -1865,7 +1865,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Wingull[] = { overworld_frame(gObjectEventPic_Wingull, 2, 2, 5), }; -const struct SpriteFrameImage gObjectEventPicTable_TuberMSwimming[] = { +static const struct SpriteFrameImage sPicTable_TuberMSwimming[] = { overworld_frame(gObjectEventPic_TuberMSwimming, 2, 2, 0), overworld_frame(gObjectEventPic_TuberMSwimming, 2, 2, 1), overworld_frame(gObjectEventPic_TuberMSwimming, 2, 2, 2), @@ -1877,7 +1877,7 @@ const struct SpriteFrameImage gObjectEventPicTable_TuberMSwimming[] = { overworld_frame(gObjectEventPic_TuberMSwimming, 2, 2, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Azurill[] = { +static const struct SpriteFrameImage sPicTable_Azurill[] = { overworld_frame(gObjectEventPic_Azurill, 2, 2, 0), overworld_frame(gObjectEventPic_Azurill, 2, 2, 1), overworld_frame(gObjectEventPic_Azurill, 2, 2, 2), @@ -1889,7 +1889,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Azurill[] = { overworld_frame(gObjectEventPic_Azurill, 2, 2, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Mom[] = { +static const struct SpriteFrameImage sPicTable_Mom[] = { overworld_frame(gObjectEventPic_Mom, 2, 4, 0), overworld_frame(gObjectEventPic_Mom, 2, 4, 1), overworld_frame(gObjectEventPic_Mom, 2, 4, 2), @@ -1901,7 +1901,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Mom[] = { overworld_frame(gObjectEventPic_Mom, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Scott[] = { +static const struct SpriteFrameImage sPicTable_Scott[] = { overworld_frame(gObjectEventPic_Scott, 2, 4, 0), overworld_frame(gObjectEventPic_Scott, 2, 4, 1), overworld_frame(gObjectEventPic_Scott, 2, 4, 2), @@ -1913,7 +1913,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Scott[] = { overworld_frame(gObjectEventPic_Scott, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Juan[] = { +static const struct SpriteFrameImage sPicTable_Juan[] = { overworld_frame(gObjectEventPic_Juan, 2, 4, 0), overworld_frame(gObjectEventPic_Juan, 2, 4, 1), overworld_frame(gObjectEventPic_Juan, 2, 4, 2), @@ -1925,7 +1925,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Juan[] = { overworld_frame(gObjectEventPic_Juan, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_MysteryEventDeliveryman[] = { +static const struct SpriteFrameImage sPicTable_MysteryEventDeliveryman[] = { overworld_frame(gObjectEventPic_MysteryEventDeliveryman, 2, 4, 0), overworld_frame(gObjectEventPic_MysteryEventDeliveryman, 2, 4, 1), overworld_frame(gObjectEventPic_MysteryEventDeliveryman, 2, 4, 2), @@ -1937,11 +1937,11 @@ const struct SpriteFrameImage gObjectEventPicTable_MysteryEventDeliveryman[] = { overworld_frame(gObjectEventPic_MysteryEventDeliveryman, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Statue[] = { +static const struct SpriteFrameImage sPicTable_Statue[] = { obj_frame_tiles(gObjectEventPic_Statue), }; -const struct SpriteFrameImage gObjectEventPicTable_Dusclops[] = { +static const struct SpriteFrameImage sPicTable_Dusclops[] = { overworld_frame(gObjectEventPic_Dusclops, 2, 4, 0), overworld_frame(gObjectEventPic_Dusclops, 2, 4, 1), overworld_frame(gObjectEventPic_Dusclops, 2, 4, 2), @@ -1953,7 +1953,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Dusclops[] = { overworld_frame(gObjectEventPic_Dusclops, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Kirlia[] = { +static const struct SpriteFrameImage sPicTable_Kirlia[] = { overworld_frame(gObjectEventPic_Kirlia, 2, 4, 0), overworld_frame(gObjectEventPic_Kirlia, 2, 4, 1), overworld_frame(gObjectEventPic_Kirlia, 2, 4, 2), @@ -1965,7 +1965,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Kirlia[] = { overworld_frame(gObjectEventPic_Kirlia, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_UnionRoomAttendant[] = { +static const struct SpriteFrameImage sPicTable_UnionRoomAttendant[] = { overworld_frame(gObjectEventPic_UnionRoomAttendant, 2, 4, 0), overworld_frame(gObjectEventPic_UnionRoomAttendant, 2, 4, 1), overworld_frame(gObjectEventPic_UnionRoomAttendant, 2, 4, 2), @@ -1977,7 +1977,7 @@ const struct SpriteFrameImage gObjectEventPicTable_UnionRoomAttendant[] = { overworld_frame(gObjectEventPic_UnionRoomAttendant, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Sudowoodo[] = { +static const struct SpriteFrameImage sPicTable_Sudowoodo[] = { overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 0), overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 1), @@ -1989,7 +1989,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Sudowoodo[] = { overworld_frame(gObjectEventPic_Sudowoodo, 2, 4, 2), }; -const struct SpriteFrameImage gObjectEventPicTable_Mew[] = { +static const struct SpriteFrameImage sPicTable_Mew[] = { overworld_frame(gObjectEventPic_Mew, 2, 4, 0), overworld_frame(gObjectEventPic_Mew, 2, 4, 1), overworld_frame(gObjectEventPic_Mew, 2, 4, 2), @@ -2001,7 +2001,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Mew[] = { overworld_frame(gObjectEventPic_Mew, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Red[] = { +static const struct SpriteFrameImage sPicTable_Red[] = { overworld_frame(gObjectEventPic_Red, 2, 4, 0), overworld_frame(gObjectEventPic_Red, 2, 4, 1), overworld_frame(gObjectEventPic_Red, 2, 4, 2), @@ -2013,7 +2013,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Red[] = { overworld_frame(gObjectEventPic_Red, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Leaf[] = { +static const struct SpriteFrameImage sPicTable_Leaf[] = { overworld_frame(gObjectEventPic_Leaf, 2, 4, 0), overworld_frame(gObjectEventPic_Leaf, 2, 4, 1), overworld_frame(gObjectEventPic_Leaf, 2, 4, 2), @@ -2025,7 +2025,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Leaf[] = { overworld_frame(gObjectEventPic_Leaf, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Deoxys[] = { +static const struct SpriteFrameImage sPicTable_Deoxys[] = { overworld_frame(gObjectEventPic_Deoxys, 4, 4, 0), overworld_frame(gObjectEventPic_Deoxys, 4, 4, 0), overworld_frame(gObjectEventPic_Deoxys, 4, 4, 0), @@ -2037,11 +2037,11 @@ const struct SpriteFrameImage gObjectEventPicTable_Deoxys[] = { overworld_frame(gObjectEventPic_Deoxys, 4, 4, 0), }; -const struct SpriteFrameImage gObjectEventPicTable_BirthIslandStone[] = { +static const struct SpriteFrameImage sPicTable_BirthIslandStone[] = { obj_frame_tiles(gObjectEventPic_BirthIslandStone), }; -const struct SpriteFrameImage gObjectEventPicTable_Anabel[] = { +static const struct SpriteFrameImage sPicTable_Anabel[] = { overworld_frame(gObjectEventPic_Anabel, 2, 4, 0), overworld_frame(gObjectEventPic_Anabel, 2, 4, 1), overworld_frame(gObjectEventPic_Anabel, 2, 4, 2), @@ -2053,7 +2053,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Anabel[] = { overworld_frame(gObjectEventPic_Anabel, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Tucker[] = { +static const struct SpriteFrameImage sPicTable_Tucker[] = { overworld_frame(gObjectEventPic_Tucker, 2, 4, 0), overworld_frame(gObjectEventPic_Tucker, 2, 4, 1), overworld_frame(gObjectEventPic_Tucker, 2, 4, 2), @@ -2065,7 +2065,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Tucker[] = { overworld_frame(gObjectEventPic_Tucker, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Spenser[] = { +static const struct SpriteFrameImage sPicTable_Spenser[] = { overworld_frame(gObjectEventPic_Spenser, 2, 4, 0), overworld_frame(gObjectEventPic_Spenser, 2, 4, 1), overworld_frame(gObjectEventPic_Spenser, 2, 4, 2), @@ -2077,7 +2077,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Spenser[] = { overworld_frame(gObjectEventPic_Spenser, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Greta[] = { +static const struct SpriteFrameImage sPicTable_Greta[] = { overworld_frame(gObjectEventPic_Greta, 2, 4, 0), overworld_frame(gObjectEventPic_Greta, 2, 4, 1), overworld_frame(gObjectEventPic_Greta, 2, 4, 2), @@ -2089,7 +2089,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Greta[] = { overworld_frame(gObjectEventPic_Greta, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Noland[] = { +static const struct SpriteFrameImage sPicTable_Noland[] = { overworld_frame(gObjectEventPic_Noland, 2, 4, 0), overworld_frame(gObjectEventPic_Noland, 2, 4, 1), overworld_frame(gObjectEventPic_Noland, 2, 4, 2), @@ -2101,7 +2101,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Noland[] = { overworld_frame(gObjectEventPic_Noland, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Lucy[] = { +static const struct SpriteFrameImage sPicTable_Lucy[] = { overworld_frame(gObjectEventPic_Lucy, 2, 4, 0), overworld_frame(gObjectEventPic_Lucy, 2, 4, 1), overworld_frame(gObjectEventPic_Lucy, 2, 4, 2), @@ -2113,7 +2113,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Lucy[] = { overworld_frame(gObjectEventPic_Lucy, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Brandon[] = { +static const struct SpriteFrameImage sPicTable_Brandon[] = { overworld_frame(gObjectEventPic_Brandon, 2, 4, 0), overworld_frame(gObjectEventPic_Brandon, 2, 4, 1), overworld_frame(gObjectEventPic_Brandon, 2, 4, 2), @@ -2125,7 +2125,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Brandon[] = { overworld_frame(gObjectEventPic_Brandon, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_Lugia[] = { +static const struct SpriteFrameImage sPicTable_Lugia[] = { overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), overworld_frame(gObjectEventPic_Lugia, 4, 4, 0), @@ -2137,7 +2137,7 @@ const struct SpriteFrameImage gObjectEventPicTable_Lugia[] = { overworld_frame(gObjectEventPic_Lugia, 4, 4, 1), }; -const struct SpriteFrameImage gObjectEventPicTable_HoOh[] = { +static const struct SpriteFrameImage sPicTable_HoOh[] = { overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), overworld_frame(gObjectEventPic_HoOh, 4, 4, 0), @@ -2149,7 +2149,7 @@ const struct SpriteFrameImage gObjectEventPicTable_HoOh[] = { overworld_frame(gObjectEventPic_HoOh, 4, 4, 1), }; -const struct SpriteFrameImage gObjectEventPicTable_RubySapphireBrendan[] = { +static const struct SpriteFrameImage sPicTable_RubySapphireBrendan[] = { overworld_frame(gObjectEventPic_RubySapphireBrendanNormal, 2, 4, 0), overworld_frame(gObjectEventPic_RubySapphireBrendanNormal, 2, 4, 1), overworld_frame(gObjectEventPic_RubySapphireBrendanNormal, 2, 4, 2), @@ -2161,7 +2161,7 @@ const struct SpriteFrameImage gObjectEventPicTable_RubySapphireBrendan[] = { overworld_frame(gObjectEventPic_RubySapphireBrendanNormal, 2, 4, 8), }; -const struct SpriteFrameImage gObjectEventPicTable_RubySapphireMay[] = { +static const struct SpriteFrameImage sPicTable_RubySapphireMay[] = { overworld_frame(gObjectEventPic_RubySapphireMayNormal, 2, 4, 0), overworld_frame(gObjectEventPic_RubySapphireMayNormal, 2, 4, 1), overworld_frame(gObjectEventPic_RubySapphireMayNormal, 2, 4, 2), diff --git a/src/data/object_events/object_event_subsprites.h b/src/data/object_events/object_event_subsprites.h index 63df1f777..0d55c2df2 100755 --- a/src/data/object_events/object_event_subsprites.h +++ b/src/data/object_events/object_event_subsprites.h @@ -1,4 +1,4 @@ -const struct Subsprite gObjectEventSpriteOamTable_16x16_0[] = { +static const struct Subsprite sOamTable_16x16_0[] = { { .x = -8, .y = -8, @@ -9,7 +9,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x16_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x16_1[] = { +static const struct Subsprite sOamTable_16x16_1[] = { { .x = -8, .y = -8, @@ -20,7 +20,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x16_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x16_2[] = { +static const struct Subsprite sOamTable_16x16_2[] = { { .x = -8, .y = -8, @@ -39,7 +39,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x16_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x16_3[] = { +static const struct Subsprite sOamTable_16x16_3[] = { { .x = -8, .y = -8, @@ -58,7 +58,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x16_3[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x16_4[] = { +static const struct Subsprite sOamTable_16x16_4[] = { { .x = -8, .y = -8, @@ -77,16 +77,16 @@ const struct Subsprite gObjectEventSpriteOamTable_16x16_4[] = { } }; -const struct SubspriteTable gObjectEventSpriteOamTables_16x16[] = { +static const struct SubspriteTable sOamTables_16x16[] = { {0, NULL}, - {1, gObjectEventSpriteOamTable_16x16_0}, - {1, gObjectEventSpriteOamTable_16x16_1}, - {2, gObjectEventSpriteOamTable_16x16_2}, - {2, gObjectEventSpriteOamTable_16x16_3}, - {2, gObjectEventSpriteOamTable_16x16_4} + {1, sOamTable_16x16_0}, + {1, sOamTable_16x16_1}, + {2, sOamTable_16x16_2}, + {2, sOamTable_16x16_3}, + {2, sOamTable_16x16_4} }; -const struct Subsprite gObjectEventSpriteOamTable_16x32_0[] = { +static const struct Subsprite sOamTable_16x32_0[] = { { .x = -8, .y = -16, @@ -97,7 +97,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x32_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x32_1[] = { +static const struct Subsprite sOamTable_16x32_1[] = { { .x = -8, .y = -16, @@ -108,7 +108,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x32_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x32_2[] = { +static const struct Subsprite sOamTable_16x32_2[] = { { .x = -8, .y = -16, @@ -135,7 +135,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x32_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x32_3[] = { +static const struct Subsprite sOamTable_16x32_3[] = { { .x = -8, .y = -16, @@ -154,7 +154,7 @@ const struct Subsprite gObjectEventSpriteOamTable_16x32_3[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_16x32_4[] = { +static const struct Subsprite sOamTable_16x32_4[] = { { .x = -8, .y = -16, @@ -173,16 +173,16 @@ const struct Subsprite gObjectEventSpriteOamTable_16x32_4[] = { } }; -const struct SubspriteTable gObjectEventSpriteOamTables_16x32[] = { +static const struct SubspriteTable sOamTables_16x32[] = { {0, NULL}, - {1, gObjectEventSpriteOamTable_16x32_0}, - {1, gObjectEventSpriteOamTable_16x32_1}, - {3, gObjectEventSpriteOamTable_16x32_2}, - {2, gObjectEventSpriteOamTable_16x32_3}, - {2, gObjectEventSpriteOamTable_16x32_4} + {1, sOamTable_16x32_0}, + {1, sOamTable_16x32_1}, + {3, sOamTable_16x32_2}, + {2, sOamTable_16x32_3}, + {2, sOamTable_16x32_4} }; -const struct Subsprite gObjectEventSpriteOamTable_32x32_0[] = { +static const struct Subsprite sOamTable_32x32_0[] = { { .x = -16, .y = -16, @@ -193,7 +193,7 @@ const struct Subsprite gObjectEventSpriteOamTable_32x32_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_32x32_1[] = { +static const struct Subsprite sOamTable_32x32_1[] = { { .x = -16, .y = -16, @@ -204,7 +204,7 @@ const struct Subsprite gObjectEventSpriteOamTable_32x32_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_32x32_2[] = { +static const struct Subsprite sOamTable_32x32_2[] = { { .x = -16, .y = -16, @@ -231,7 +231,7 @@ const struct Subsprite gObjectEventSpriteOamTable_32x32_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_32x32_3[] = { +static const struct Subsprite sOamTable_32x32_3[] = { { .x = -16, .y = -16, @@ -250,7 +250,7 @@ const struct Subsprite gObjectEventSpriteOamTable_32x32_3[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_32x32_4[] = { +static const struct Subsprite sOamTable_32x32_4[] = { { .x = -16, .y = -16, @@ -269,16 +269,16 @@ const struct Subsprite gObjectEventSpriteOamTable_32x32_4[] = { } }; -const struct SubspriteTable gObjectEventSpriteOamTables_32x32[] = { +static const struct SubspriteTable sOamTables_32x32[] = { {0, NULL}, - {1, gObjectEventSpriteOamTable_32x32_0}, - {1, gObjectEventSpriteOamTable_32x32_1}, - {3, gObjectEventSpriteOamTable_32x32_2}, - {2, gObjectEventSpriteOamTable_32x32_3}, - {2, gObjectEventSpriteOamTable_32x32_4} + {1, sOamTable_32x32_0}, + {1, sOamTable_32x32_1}, + {3, sOamTable_32x32_2}, + {2, sOamTable_32x32_3}, + {2, sOamTable_32x32_4} }; -const struct Subsprite gObjectEventSpriteOamTable_48x48[] = { +static const struct Subsprite sOamTable_48x48[] = { { .x = -24, .y = -24, @@ -377,16 +377,16 @@ const struct Subsprite gObjectEventSpriteOamTable_48x48[] = { } }; -const struct SubspriteTable gObjectEventSpriteOamTables_48x48[] = { - {12, gObjectEventSpriteOamTable_48x48}, - {12, gObjectEventSpriteOamTable_48x48}, - {12, gObjectEventSpriteOamTable_48x48}, - {12, gObjectEventSpriteOamTable_48x48}, - {12, gObjectEventSpriteOamTable_48x48}, - {12, gObjectEventSpriteOamTable_48x48} +static const struct SubspriteTable sOamTables_48x48[] = { + {12, sOamTable_48x48}, + {12, sOamTable_48x48}, + {12, sOamTable_48x48}, + {12, sOamTable_48x48}, + {12, sOamTable_48x48}, + {12, sOamTable_48x48} }; -const struct Subsprite gObjectEventSpriteOamTable_64x32_0[] = { +static const struct Subsprite sOamTable_64x32_0[] = { { .x = -32, .y = -16, @@ -397,7 +397,7 @@ const struct Subsprite gObjectEventSpriteOamTable_64x32_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_64x32_1[] = { +static const struct Subsprite sOamTable_64x32_1[] = { { .x = -32, .y = -16, @@ -408,7 +408,7 @@ const struct Subsprite gObjectEventSpriteOamTable_64x32_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_64x32_2[] = { +static const struct Subsprite sOamTable_64x32_2[] = { { .x = -32, .y = -16, @@ -419,7 +419,7 @@ const struct Subsprite gObjectEventSpriteOamTable_64x32_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_64x32_3[] = { +static const struct Subsprite sOamTable_64x32_3[] = { { .x = -32, .y = -16, @@ -431,16 +431,16 @@ const struct Subsprite gObjectEventSpriteOamTable_64x32_3[] = { }; // Unused -const struct SubspriteTable gObjectEventSpriteOamTables_64x32[] = { +static const struct SubspriteTable sOamTables_64x32[] = { {0, NULL}, - {1, gObjectEventSpriteOamTable_64x32_0}, - {1, gObjectEventSpriteOamTable_64x32_1}, - {1, gObjectEventSpriteOamTable_64x32_2}, - {1, gObjectEventSpriteOamTable_64x32_3}, - {1, gObjectEventSpriteOamTable_64x32_3} + {1, sOamTable_64x32_0}, + {1, sOamTable_64x32_1}, + {1, sOamTable_64x32_2}, + {1, sOamTable_64x32_3}, + {1, sOamTable_64x32_3} }; -const struct Subsprite gObjectEventSpriteOamTable_64x64_0[] = { +static const struct Subsprite sOamTable_64x64_0[] = { { .x = -32, .y = -32, @@ -451,7 +451,7 @@ const struct Subsprite gObjectEventSpriteOamTable_64x64_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_64x64_1[] = { +static const struct Subsprite sOamTable_64x64_1[] = { { .x = -32, .y = -32, @@ -462,7 +462,7 @@ const struct Subsprite gObjectEventSpriteOamTable_64x64_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_64x64_2[] = { +static const struct Subsprite sOamTable_64x64_2[] = { { .x = -32, .y = -32, @@ -473,7 +473,7 @@ const struct Subsprite gObjectEventSpriteOamTable_64x64_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_64x64_3[] = { +static const struct Subsprite sOamTable_64x64_3[] = { { .x = -32, .y = -32, @@ -484,16 +484,16 @@ const struct Subsprite gObjectEventSpriteOamTable_64x64_3[] = { } }; -const struct SubspriteTable gObjectEventSpriteOamTables_64x64[] = { +static const struct SubspriteTable sOamTables_64x64[] = { {0, NULL}, - {1, gObjectEventSpriteOamTable_64x64_0}, - {1, gObjectEventSpriteOamTable_64x64_1}, - {1, gObjectEventSpriteOamTable_64x64_2}, - {1, gObjectEventSpriteOamTable_64x64_3}, - {1, gObjectEventSpriteOamTable_64x64_3} + {1, sOamTable_64x64_0}, + {1, sOamTable_64x64_1}, + {1, sOamTable_64x64_2}, + {1, sOamTable_64x64_3}, + {1, sOamTable_64x64_3} }; -const struct Subsprite gObjectEventSpriteOamTable_96x40_0[] = { +static const struct Subsprite sOamTable_96x40_0[] = { { .x = -48, .y = -20, @@ -616,7 +616,7 @@ const struct Subsprite gObjectEventSpriteOamTable_96x40_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_96x40_1[] = { +static const struct Subsprite sOamTable_96x40_1[] = { { .x = -48, .y = -20, @@ -739,7 +739,7 @@ const struct Subsprite gObjectEventSpriteOamTable_96x40_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_96x40_2[] = { +static const struct Subsprite sOamTable_96x40_2[] = { { .x = -48, .y = -20, @@ -862,7 +862,7 @@ const struct Subsprite gObjectEventSpriteOamTable_96x40_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_96x40_3[] = { +static const struct Subsprite sOamTable_96x40_3[] = { { .x = -48, .y = -20, @@ -986,16 +986,16 @@ const struct Subsprite gObjectEventSpriteOamTable_96x40_3[] = { }; // Used by SS Tidal -const struct SubspriteTable gObjectEventSpriteOamTables_96x40[] = { - {15, gObjectEventSpriteOamTable_96x40_0}, - {15, gObjectEventSpriteOamTable_96x40_0}, - {15, gObjectEventSpriteOamTable_96x40_1}, - {15, gObjectEventSpriteOamTable_96x40_2}, - {15, gObjectEventSpriteOamTable_96x40_3}, - {15, gObjectEventSpriteOamTable_96x40_3} +static const struct SubspriteTable sOamTables_96x40[] = { + {15, sOamTable_96x40_0}, + {15, sOamTable_96x40_0}, + {15, sOamTable_96x40_1}, + {15, sOamTable_96x40_2}, + {15, sOamTable_96x40_3}, + {15, sOamTable_96x40_3} }; -const struct Subsprite gObjectEventSpriteOamTable_88x32_0[] = { +static const struct Subsprite sOamTable_88x32_0[] = { { .x = -48, .y = -20, @@ -1126,7 +1126,7 @@ const struct Subsprite gObjectEventSpriteOamTable_88x32_0[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_88x32_1[] = { +static const struct Subsprite sOamTable_88x32_1[] = { { .x = -48, .y = -20, @@ -1257,7 +1257,7 @@ const struct Subsprite gObjectEventSpriteOamTable_88x32_1[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_88x32_2[] = { +static const struct Subsprite sOamTable_88x32_2[] = { { .x = -48, .y = -20, @@ -1388,7 +1388,7 @@ const struct Subsprite gObjectEventSpriteOamTable_88x32_2[] = { } }; -const struct Subsprite gObjectEventSpriteOamTable_88x32_3[] = { +static const struct Subsprite sOamTable_88x32_3[] = { { .x = -48, .y = -20, @@ -1520,11 +1520,11 @@ const struct Subsprite gObjectEventSpriteOamTable_88x32_3[] = { }; // Used by Submarine Shadow -const struct SubspriteTable gObjectEventSpriteOamTables_88x32[] = { - {16, gObjectEventSpriteOamTable_88x32_0}, - {16, gObjectEventSpriteOamTable_88x32_0}, - {16, gObjectEventSpriteOamTable_88x32_1}, - {16, gObjectEventSpriteOamTable_88x32_2}, - {16, gObjectEventSpriteOamTable_88x32_3}, - {16, gObjectEventSpriteOamTable_88x32_3} +static const struct SubspriteTable sOamTables_88x32[] = { + {16, sOamTable_88x32_0}, + {16, sOamTable_88x32_0}, + {16, sOamTable_88x32_1}, + {16, sOamTable_88x32_2}, + {16, sOamTable_88x32_3}, + {16, sOamTable_88x32_3} }; diff --git a/src/data/party_menu.h b/src/data/party_menu.h index 3c3a3e1ce..570ef738e 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -118,12 +118,12 @@ static const u32 sCancelButton_Tilemap[] = INCBIN_U32("graphics/interface/party_ // Text colors for BG, FG, and Shadow in that order static const u8 sFontColorTable[][3] = { - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GREY, TEXT_COLOR_DARK_GREY}, // Default + {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_DARK_GRAY}, // Default {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_GREEN}, // Unused {TEXT_COLOR_TRANSPARENT, TEXT_DYNAMIC_COLOR_2, TEXT_DYNAMIC_COLOR_3}, // Gender symbol - {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}, // Selection actions + {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, // Selection actions {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, // Field moves - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}, // Unused + {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, // Unused }; static const struct WindowTemplate sSinglePartyMenuWindowTemplate[] = @@ -543,7 +543,7 @@ static const struct WindowTemplate sLevelUpStatsWindowTemplate = .baseBlock = 0x2E9, }; -static const struct WindowTemplate sUnusedWindowTemplate_08615978 = +static const struct WindowTemplate sUnusedWindowTemplate1 = { .bg = 2, .tilemapLeft = 2, @@ -554,7 +554,7 @@ static const struct WindowTemplate sUnusedWindowTemplate_08615978 = .baseBlock = 0x1DF, }; -static const struct WindowTemplate sUnusedWindowTemplate_08615980 = +static const struct WindowTemplate sUnusedWindowTemplate2 = { .bg = 2, .tilemapLeft = 0, @@ -669,7 +669,7 @@ static const u8 *const sDescriptionStringTable[] = [PARTYBOX_DESC_DONT_HAVE] = gText_DontHave, }; -static const u16 sUnused_08615B94[] = +static const u16 sUnusedData[] = { 0x0108, 0x0151, 0x0160, 0x015b, 0x002e, 0x005c, 0x0102, 0x0153, 0x014b, 0x00ed, 0x00f1, 0x010d, 0x003a, 0x003b, 0x003f, 0x0071, 0x00b6, 0x00f0, 0x00ca, 0x00db, 0x00da, 0x004c, 0x00e7, 0x0055, 0x0057, 0x0059, 0x00d8, 0x005b, 0x005e, 0x00f7, 0x0118, 0x0068, @@ -1194,62 +1194,62 @@ static const u8 *const sUnused_StatStrings[] = static const u16 sTMHMMoves[] = { - MOVE_FOCUS_PUNCH, - MOVE_DRAGON_CLAW, - MOVE_WATER_PULSE, - MOVE_CALM_MIND, - MOVE_ROAR, - MOVE_TOXIC, - MOVE_HAIL, - MOVE_BULK_UP, - MOVE_BULLET_SEED, - MOVE_HIDDEN_POWER, - MOVE_SUNNY_DAY, - MOVE_TAUNT, - MOVE_ICE_BEAM, - MOVE_BLIZZARD, - MOVE_HYPER_BEAM, - MOVE_LIGHT_SCREEN, - MOVE_PROTECT, - MOVE_RAIN_DANCE, - MOVE_GIGA_DRAIN, - MOVE_SAFEGUARD, - MOVE_FRUSTRATION, - MOVE_SOLAR_BEAM, - MOVE_IRON_TAIL, - MOVE_THUNDERBOLT, - MOVE_THUNDER, - MOVE_EARTHQUAKE, - MOVE_RETURN, - MOVE_DIG, - MOVE_PSYCHIC, - MOVE_SHADOW_BALL, - MOVE_BRICK_BREAK, - MOVE_DOUBLE_TEAM, - MOVE_REFLECT, - MOVE_SHOCK_WAVE, - MOVE_FLAMETHROWER, - MOVE_SLUDGE_BOMB, - MOVE_SANDSTORM, - MOVE_FIRE_BLAST, - MOVE_ROCK_TOMB, - MOVE_AERIAL_ACE, - MOVE_TORMENT, - MOVE_FACADE, - MOVE_SECRET_POWER, - MOVE_REST, - MOVE_ATTRACT, - MOVE_THIEF, - MOVE_STEEL_WING, - MOVE_SKILL_SWAP, - MOVE_SNATCH, - MOVE_OVERHEAT, - MOVE_CUT, - MOVE_FLY, - MOVE_SURF, - MOVE_STRENGTH, - MOVE_FLASH, - MOVE_ROCK_SMASH, - MOVE_WATERFALL, - MOVE_DIVE, + [ITEM_TM01 - ITEM_TM01] = MOVE_FOCUS_PUNCH, + [ITEM_TM02 - ITEM_TM01] = MOVE_DRAGON_CLAW, + [ITEM_TM03 - ITEM_TM01] = MOVE_WATER_PULSE, + [ITEM_TM04 - ITEM_TM01] = MOVE_CALM_MIND, + [ITEM_TM05 - ITEM_TM01] = MOVE_ROAR, + [ITEM_TM06 - ITEM_TM01] = MOVE_TOXIC, + [ITEM_TM07 - ITEM_TM01] = MOVE_HAIL, + [ITEM_TM08 - ITEM_TM01] = MOVE_BULK_UP, + [ITEM_TM09 - ITEM_TM01] = MOVE_BULLET_SEED, + [ITEM_TM10 - ITEM_TM01] = MOVE_HIDDEN_POWER, + [ITEM_TM11 - ITEM_TM01] = MOVE_SUNNY_DAY, + [ITEM_TM12 - ITEM_TM01] = MOVE_TAUNT, + [ITEM_TM13 - ITEM_TM01] = MOVE_ICE_BEAM, + [ITEM_TM14 - ITEM_TM01] = MOVE_BLIZZARD, + [ITEM_TM15 - ITEM_TM01] = MOVE_HYPER_BEAM, + [ITEM_TM16 - ITEM_TM01] = MOVE_LIGHT_SCREEN, + [ITEM_TM17 - ITEM_TM01] = MOVE_PROTECT, + [ITEM_TM18 - ITEM_TM01] = MOVE_RAIN_DANCE, + [ITEM_TM19 - ITEM_TM01] = MOVE_GIGA_DRAIN, + [ITEM_TM20 - ITEM_TM01] = MOVE_SAFEGUARD, + [ITEM_TM21 - ITEM_TM01] = MOVE_FRUSTRATION, + [ITEM_TM22 - ITEM_TM01] = MOVE_SOLAR_BEAM, + [ITEM_TM23 - ITEM_TM01] = MOVE_IRON_TAIL, + [ITEM_TM24 - ITEM_TM01] = MOVE_THUNDERBOLT, + [ITEM_TM25 - ITEM_TM01] = MOVE_THUNDER, + [ITEM_TM26 - ITEM_TM01] = MOVE_EARTHQUAKE, + [ITEM_TM27 - ITEM_TM01] = MOVE_RETURN, + [ITEM_TM28 - ITEM_TM01] = MOVE_DIG, + [ITEM_TM29 - ITEM_TM01] = MOVE_PSYCHIC, + [ITEM_TM30 - ITEM_TM01] = MOVE_SHADOW_BALL, + [ITEM_TM31 - ITEM_TM01] = MOVE_BRICK_BREAK, + [ITEM_TM32 - ITEM_TM01] = MOVE_DOUBLE_TEAM, + [ITEM_TM33 - ITEM_TM01] = MOVE_REFLECT, + [ITEM_TM34 - ITEM_TM01] = MOVE_SHOCK_WAVE, + [ITEM_TM35 - ITEM_TM01] = MOVE_FLAMETHROWER, + [ITEM_TM36 - ITEM_TM01] = MOVE_SLUDGE_BOMB, + [ITEM_TM37 - ITEM_TM01] = MOVE_SANDSTORM, + [ITEM_TM38 - ITEM_TM01] = MOVE_FIRE_BLAST, + [ITEM_TM39 - ITEM_TM01] = MOVE_ROCK_TOMB, + [ITEM_TM40 - ITEM_TM01] = MOVE_AERIAL_ACE, + [ITEM_TM41 - ITEM_TM01] = MOVE_TORMENT, + [ITEM_TM42 - ITEM_TM01] = MOVE_FACADE, + [ITEM_TM43 - ITEM_TM01] = MOVE_SECRET_POWER, + [ITEM_TM44 - ITEM_TM01] = MOVE_REST, + [ITEM_TM45 - ITEM_TM01] = MOVE_ATTRACT, + [ITEM_TM46 - ITEM_TM01] = MOVE_THIEF, + [ITEM_TM47 - ITEM_TM01] = MOVE_STEEL_WING, + [ITEM_TM48 - ITEM_TM01] = MOVE_SKILL_SWAP, + [ITEM_TM49 - ITEM_TM01] = MOVE_SNATCH, + [ITEM_TM50 - ITEM_TM01] = MOVE_OVERHEAT, + [ITEM_HM01 - ITEM_TM01] = MOVE_CUT, + [ITEM_HM02 - ITEM_TM01] = MOVE_FLY, + [ITEM_HM03 - ITEM_TM01] = MOVE_SURF, + [ITEM_HM04 - ITEM_TM01] = MOVE_STRENGTH, + [ITEM_HM05 - ITEM_TM01] = MOVE_FLASH, + [ITEM_HM06 - ITEM_TM01] = MOVE_ROCK_SMASH, + [ITEM_HM07 - ITEM_TM01] = MOVE_WATERFALL, + [ITEM_HM08 - ITEM_TM01] = MOVE_DIVE, }; diff --git a/src/data/pointillism_points.h b/src/data/pointillism_points.h new file mode 100644 index 000000000..708f5c02e --- /dev/null +++ b/src/data/pointillism_points.h @@ -0,0 +1,3210 @@ +#define GET_POINT_OFFSET_DL(bits) (((bits) >> 0) & 1) +#define GET_POINT_COLOR_TYPE(bits) (((bits) >> 1) & 3) +#define GET_POINT_DELTA(bits) (((bits) >> 3) & 7) + +#define PT(x, y, delta, colorType, offsetDownLeft) x, y, (delta << 3) | (colorType << 1) | offsetDownLeft + +static const u8 sPointillismPoints[][3] = { + PT( 0, 29, 3, 2, FALSE), + PT(14, 30, 3, 1, TRUE), + PT( 0, 1, 6, 1, FALSE), + PT(46, 30, 6, 3, TRUE), + PT(10, 34, 3, 3, TRUE), + PT( 5, 38, 5, 3, FALSE), + PT(18, 23, 3, 3, FALSE), + PT(26, 3, 2, 0, TRUE), + PT( 5, 17, 3, 0, FALSE), + PT( 5, 39, 5, 3, TRUE), + PT(26, 63, 2, 1, FALSE), + PT(34, 63, 2, 3, FALSE), + PT(43, 47, 5, 3, FALSE), + PT(17, 2, 5, 2, TRUE), + PT(35, 13, 5, 0, FALSE), + PT(23, 12, 3, 0, TRUE), + PT(47, 14, 2, 1, TRUE), + PT(48, 24, 4, 0, FALSE), + PT(45, 40, 4, 1, FALSE), + PT( 1, 3, 3, 0, TRUE), + PT(14, 42, 5, 1, TRUE), + PT(34, 21, 4, 2, TRUE), + PT(34, 10, 4, 3, FALSE), + PT(57, 6, 4, 1, TRUE), + PT(22, 7, 5, 3, TRUE), + PT(34, 58, 3, 1, TRUE), + PT(59, 54, 6, 2, TRUE), + PT(10, 43, 4, 2, FALSE), + PT(54, 9, 2, 1, FALSE), + PT(28, 47, 4, 1, TRUE), + PT(46, 56, 5, 2, FALSE), + PT( 5, 42, 4, 0, FALSE), + PT( 7, 20, 6, 1, FALSE), + PT(49, 8, 2, 3, TRUE), + PT(26, 36, 5, 2, TRUE), + PT(34, 10, 2, 3, FALSE), + PT(27, 38, 5, 1, TRUE), + PT(41, 22, 2, 0, TRUE), + PT(53, 8, 2, 2, FALSE), + PT(30, 8, 2, 2, FALSE), + PT( 5, 49, 2, 2, FALSE), + PT(56, 49, 2, 3, TRUE), + PT(52, 51, 2, 1, FALSE), + PT(17, 9, 3, 3, TRUE), + PT(40, 61, 6, 1, FALSE), + PT(53, 3, 3, 3, FALSE), + PT(60, 43, 5, 3, FALSE), + PT(16, 1, 2, 3, TRUE), + PT( 3, 62, 4, 1, FALSE), + PT(23, 24, 6, 2, FALSE), + PT( 8, 41, 3, 0, TRUE), + PT( 3, 36, 5, 0, FALSE), + PT(61, 51, 5, 3, TRUE), + PT(49, 36, 3, 0, TRUE), + PT(27, 24, 4, 3, FALSE), + PT( 7, 13, 4, 2, TRUE), + PT(45, 63, 2, 1, FALSE), + PT(47, 21, 4, 2, TRUE), + PT(41, 15, 2, 1, FALSE), + PT( 7, 44, 2, 1, FALSE), + PT(44, 11, 4, 3, FALSE), + PT(18, 26, 2, 3, FALSE), + PT( 0, 11, 5, 3, TRUE), + PT(22, 53, 4, 2, FALSE), + PT(31, 28, 4, 1, FALSE), + PT(41, 51, 4, 3, TRUE), + PT(59, 48, 2, 3, TRUE), + PT(17, 6, 6, 2, TRUE), + PT(62, 49, 5, 3, TRUE), + PT(17, 58, 4, 2, TRUE), + PT(42, 2, 3, 0, TRUE), + PT(51, 24, 6, 2, TRUE), + PT(42, 32, 4, 0, TRUE), + PT(46, 50, 3, 1, TRUE), + PT(59, 31, 4, 1, TRUE), + PT(57, 41, 5, 1, FALSE), + PT(46, 49, 5, 0, TRUE), + PT(42, 14, 5, 2, TRUE), + PT(45, 0, 3, 3, TRUE), + PT(56, 40, 3, 1, TRUE), + PT(20, 59, 5, 1, TRUE), + PT(46, 4, 4, 3, FALSE), + PT(54, 48, 2, 0, TRUE), + PT(59, 33, 5, 2, TRUE), + PT(43, 63, 3, 1, TRUE), + PT(32, 19, 6, 0, TRUE), + PT(51, 12, 6, 0, FALSE), + PT(34, 43, 5, 1, TRUE), + PT(22, 2, 3, 3, FALSE), + PT(28, 18, 3, 2, FALSE), + PT(15, 60, 6, 3, FALSE), + PT(56, 16, 5, 2, TRUE), + PT(24, 47, 5, 2, TRUE), + PT(53, 59, 2, 0, TRUE), + PT(55, 49, 2, 1, TRUE), + PT(19, 61, 5, 3, TRUE), + PT(30, 44, 6, 1, TRUE), + PT(46, 55, 2, 1, FALSE), + PT(60, 31, 6, 1, TRUE), + PT(50, 42, 4, 3, TRUE), + PT(13, 59, 3, 2, FALSE), + PT(53, 42, 4, 3, TRUE), + PT( 9, 61, 4, 3, TRUE), + PT(18, 11, 3, 0, FALSE), + PT(12, 21, 3, 2, TRUE), + PT(32, 1, 3, 2, FALSE), + PT( 8, 59, 3, 2, FALSE), + PT(18, 55, 6, 1, TRUE), + PT(21, 3, 5, 2, FALSE), + PT(42, 59, 6, 0, TRUE), + PT(15, 4, 6, 2, TRUE), + PT( 8, 23, 6, 1, TRUE), + PT(56, 61, 5, 1, FALSE), + PT(47, 53, 2, 3, FALSE), + PT(16, 53, 2, 3, FALSE), + PT(35, 19, 5, 2, FALSE), + PT(47, 6, 4, 0, FALSE), + PT(39, 58, 4, 2, FALSE), + PT( 0, 28, 5, 1, FALSE), + PT( 3, 57, 3, 2, TRUE), + PT(40, 7, 3, 1, FALSE), + PT(32, 10, 6, 3, TRUE), + PT( 7, 53, 5, 2, TRUE), + PT(21, 47, 5, 2, FALSE), + PT(16, 44, 4, 1, TRUE), + PT(63, 41, 2, 2, FALSE), + PT(42, 33, 6, 3, FALSE), + PT(52, 26, 5, 2, FALSE), + PT(28, 61, 6, 1, TRUE), + PT(56, 43, 4, 1, FALSE), + PT(53, 40, 3, 3, TRUE), + PT(61, 15, 3, 2, FALSE), + PT(30, 62, 3, 1, TRUE), + PT(12, 62, 3, 3, TRUE), + PT(43, 49, 5, 2, FALSE), + PT(50, 57, 2, 0, TRUE), + PT( 5, 9, 2, 0, TRUE), + PT( 4, 56, 5, 1, FALSE), + PT(50, 0, 2, 3, FALSE), + PT(19, 11, 6, 0, TRUE), + PT(52, 42, 2, 1, TRUE), + PT(44, 34, 4, 0, TRUE), + PT(57, 47, 2, 2, TRUE), + PT(55, 40, 3, 3, FALSE), + PT( 7, 59, 5, 2, TRUE), + PT(17, 3, 5, 0, FALSE), + PT(45, 48, 3, 3, FALSE), + PT(49, 17, 2, 0, TRUE), + PT(35, 1, 3, 3, FALSE), + PT(61, 49, 6, 2, FALSE), + PT(28, 2, 6, 2, FALSE), + PT(33, 14, 4, 2, TRUE), + PT(61, 7, 2, 3, TRUE), + PT(51, 21, 2, 0, FALSE), + PT(41, 50, 6, 1, FALSE), + PT(24, 31, 6, 0, FALSE), + PT(45, 59, 6, 0, FALSE), + PT(39, 62, 2, 3, FALSE), + PT(49, 21, 2, 1, FALSE), + PT(48, 37, 2, 3, TRUE), + PT(51, 6, 6, 2, FALSE), + PT( 0, 41, 3, 0, FALSE), + PT(60, 3, 2, 1, FALSE), + PT(44, 12, 2, 0, TRUE), + PT( 9, 48, 6, 0, FALSE), + PT(16, 14, 2, 0, TRUE), + PT(39, 22, 3, 1, TRUE), + PT(12, 59, 5, 3, FALSE), + PT(43, 51, 3, 3, FALSE), + PT(19, 45, 5, 2, TRUE), + PT(17, 36, 5, 0, TRUE), + PT(52, 62, 5, 1, TRUE), + PT(36, 30, 4, 0, TRUE), + PT(39, 26, 5, 2, TRUE), + PT( 4, 57, 2, 3, FALSE), + PT(62, 51, 4, 3, FALSE), + PT(27, 46, 4, 2, TRUE), + PT(12, 6, 3, 0, TRUE), + PT(37, 25, 3, 0, FALSE), + PT(29, 51, 6, 1, TRUE), + PT(29, 40, 5, 2, TRUE), + PT(28, 16, 5, 1, FALSE), + PT(31, 53, 3, 3, FALSE), + PT(52, 2, 2, 0, FALSE), + PT(43, 58, 2, 2, FALSE), + PT(13, 11, 2, 2, TRUE), + PT(12, 44, 2, 0, FALSE), + PT(55, 58, 3, 0, TRUE), + PT( 6, 19, 2, 3, TRUE), + PT(36, 16, 4, 2, TRUE), + PT(36, 4, 3, 3, FALSE), + PT( 0, 53, 6, 2, FALSE), + PT(58, 0, 6, 3, TRUE), + PT(60, 7, 3, 1, FALSE), + PT(43, 40, 6, 3, FALSE), + PT(52, 57, 5, 3, TRUE), + PT(40, 9, 3, 3, TRUE), + PT(56, 49, 6, 0, FALSE), + PT(22, 37, 6, 0, TRUE), + PT(24, 40, 6, 0, TRUE), + PT(24, 12, 4, 1, FALSE), + PT( 6, 57, 5, 2, TRUE), + PT(61, 32, 4, 2, FALSE), + PT(46, 39, 4, 0, TRUE), + PT(62, 24, 3, 0, FALSE), + PT(21, 60, 4, 2, FALSE), + PT( 6, 27, 4, 3, FALSE), + PT(21, 14, 4, 1, FALSE), + PT(10, 13, 3, 3, TRUE), + PT(24, 22, 6, 2, FALSE), + PT(16, 40, 4, 0, TRUE), + PT(32, 17, 2, 0, TRUE), + PT(54, 50, 2, 2, TRUE), + PT(59, 46, 4, 2, FALSE), + PT(31, 45, 2, 1, FALSE), + PT(54, 46, 4, 0, FALSE), + PT(11, 23, 6, 1, TRUE), + PT(38, 3, 3, 3, TRUE), + PT( 8, 25, 6, 0, TRUE), + PT(42, 24, 4, 2, TRUE), + PT(53, 45, 5, 2, TRUE), + PT(48, 56, 3, 0, FALSE), + PT(28, 37, 2, 2, FALSE), + PT(28, 34, 5, 0, FALSE), + PT( 8, 35, 4, 0, TRUE), + PT(38, 30, 6, 0, FALSE), + PT(25, 15, 2, 2, TRUE), + PT(16, 47, 4, 1, FALSE), + PT(18, 2, 4, 2, TRUE), + PT(60, 1, 3, 2, TRUE), + PT(14, 20, 3, 0, FALSE), + PT(13, 24, 2, 3, TRUE), + PT(34, 11, 6, 0, TRUE), + PT(19, 52, 4, 0, TRUE), + PT(15, 45, 6, 3, FALSE), + PT(57, 31, 4, 2, TRUE), + PT(24, 16, 3, 3, TRUE), + PT(45, 32, 4, 0, FALSE), + PT(25, 11, 6, 0, TRUE), + PT(51, 19, 2, 2, FALSE), + PT(46, 17, 4, 0, TRUE), + PT(45, 10, 6, 3, TRUE), + PT( 7, 21, 3, 1, TRUE), + PT(50, 4, 6, 1, FALSE), + PT( 6, 24, 3, 1, TRUE), + PT(19, 36, 2, 1, FALSE), + PT(54, 34, 2, 3, FALSE), + PT(29, 41, 3, 2, FALSE), + PT(53, 23, 4, 0, TRUE), + PT(54, 23, 5, 1, TRUE), + PT(53, 50, 3, 0, TRUE), + PT(42, 15, 5, 3, FALSE), + PT(16, 0, 6, 2, FALSE), + PT( 2, 14, 5, 0, FALSE), + PT(49, 50, 6, 1, FALSE), + PT(59, 5, 4, 0, FALSE), + PT(54, 38, 2, 1, FALSE), + PT(52, 6, 6, 2, FALSE), + PT(30, 49, 6, 1, FALSE), + PT(53, 5, 6, 2, FALSE), + PT(30, 19, 2, 2, TRUE), + PT(21, 20, 5, 2, FALSE), + PT(41, 28, 3, 0, FALSE), + PT(36, 36, 2, 1, FALSE), + PT(34, 41, 3, 0, FALSE), + PT(52, 54, 6, 0, FALSE), + PT(30, 1, 4, 1, TRUE), + PT(12, 60, 4, 2, FALSE), + PT(10, 61, 2, 3, FALSE), + PT(39, 30, 4, 1, TRUE), + PT(21, 2, 2, 1, FALSE), + PT(17, 25, 5, 1, FALSE), + PT(29, 49, 2, 2, TRUE), + PT( 3, 59, 5, 1, FALSE), + PT(33, 25, 5, 2, FALSE), + PT(10, 35, 2, 0, TRUE), + PT(37, 17, 3, 1, FALSE), + PT(26, 10, 6, 2, FALSE), + PT(59, 11, 6, 1, TRUE), + PT(33, 11, 6, 3, TRUE), + PT( 1, 49, 5, 0, FALSE), + PT(53, 29, 4, 3, TRUE), + PT(44, 48, 6, 0, TRUE), + PT(46, 57, 5, 2, TRUE), + PT(48, 5, 5, 2, FALSE), + PT(18, 42, 5, 1, TRUE), + PT(57, 34, 4, 0, FALSE), + PT(21, 52, 3, 2, FALSE), + PT(28, 1, 2, 2, TRUE), + PT(32, 22, 4, 1, FALSE), + PT(19, 4, 3, 0, FALSE), + PT(30, 19, 2, 0, FALSE), + PT(37, 51, 2, 2, TRUE), + PT(57, 3, 6, 0, TRUE), + PT(63, 54, 3, 0, FALSE), + PT(20, 35, 2, 0, FALSE), + PT(47, 30, 3, 3, TRUE), + PT(31, 23, 5, 2, FALSE), + PT( 2, 22, 6, 0, TRUE), + PT(32, 24, 6, 0, FALSE), + PT(46, 24, 6, 3, TRUE), + PT(59, 14, 6, 0, FALSE), + PT(16, 57, 4, 2, FALSE), + PT(38, 57, 3, 3, FALSE), + PT(48, 38, 5, 3, FALSE), + PT(18, 1, 2, 2, FALSE), + PT(55, 42, 5, 3, FALSE), + PT(33, 6, 3, 2, TRUE), + PT(42, 22, 6, 1, FALSE), + PT( 9, 56, 3, 2, FALSE), + PT( 7, 34, 2, 3, TRUE), + PT(59, 45, 2, 2, TRUE), + PT( 7, 30, 5, 3, FALSE), + PT(27, 46, 3, 2, TRUE), + PT( 4, 9, 6, 0, FALSE), + PT(48, 45, 6, 3, TRUE), + PT(45, 52, 4, 2, FALSE), + PT(24, 36, 4, 2, TRUE), + PT(14, 45, 4, 3, FALSE), + PT(35, 10, 2, 3, FALSE), + PT(18, 45, 2, 0, TRUE), + PT(33, 40, 5, 3, FALSE), + PT(15, 1, 4, 0, TRUE), + PT( 1, 49, 2, 1, FALSE), + PT(63, 27, 3, 3, FALSE), + PT(33, 37, 5, 1, TRUE), + PT(38, 24, 2, 1, TRUE), + PT(21, 45, 6, 2, FALSE), + PT(35, 33, 6, 3, FALSE), + PT(14, 46, 3, 2, FALSE), + PT(20, 34, 3, 2, FALSE), + PT(44, 11, 5, 0, FALSE), + PT(26, 24, 4, 0, TRUE), + PT(33, 7, 3, 1, FALSE), + PT(36, 38, 5, 0, TRUE), + PT(43, 10, 6, 2, FALSE), + PT(62, 39, 6, 1, TRUE), + PT(18, 52, 3, 1, TRUE), + PT(31, 1, 5, 1, FALSE), + PT(46, 6, 4, 1, TRUE), + PT(47, 31, 2, 2, FALSE), + PT(24, 6, 4, 3, FALSE), + PT(49, 31, 5, 1, TRUE), + PT(34, 38, 5, 3, FALSE), + PT(30, 21, 2, 3, FALSE), + PT(32, 34, 5, 0, FALSE), + PT(21, 55, 2, 1, FALSE), + PT(37, 4, 5, 2, FALSE), + PT(31, 4, 5, 3, FALSE), + PT(12, 19, 3, 0, FALSE), + PT( 7, 11, 6, 3, FALSE), + PT(29, 28, 5, 1, FALSE), + PT(48, 34, 3, 2, FALSE), + PT(46, 18, 5, 3, TRUE), + PT(43, 33, 3, 3, FALSE), + PT(22, 56, 6, 0, FALSE), + PT( 4, 2, 2, 3, FALSE), + PT( 5, 20, 4, 0, FALSE), + PT(56, 60, 6, 1, TRUE), + PT(33, 27, 5, 3, TRUE), + PT(20, 42, 4, 3, TRUE), + PT(56, 20, 3, 1, TRUE), + PT(43, 31, 5, 1, TRUE), + PT(41, 43, 4, 2, TRUE), + PT(39, 54, 4, 0, TRUE), + PT(17, 34, 3, 1, TRUE), + PT(41, 3, 3, 1, TRUE), + PT(24, 36, 5, 0, FALSE), + PT(33, 45, 6, 3, FALSE), + PT(60, 44, 4, 2, FALSE), + PT(51, 23, 3, 3, TRUE), + PT(42, 58, 4, 0, TRUE), + PT(10, 35, 6, 3, TRUE), + PT( 0, 11, 4, 0, TRUE), + PT(17, 56, 3, 0, TRUE), + PT(15, 14, 3, 2, FALSE), + PT(31, 15, 6, 3, TRUE), + PT(60, 16, 6, 3, TRUE), + PT(56, 49, 6, 2, TRUE), + PT( 7, 21, 5, 0, FALSE), + PT(30, 46, 3, 0, TRUE), + PT(38, 16, 6, 1, TRUE), + PT(61, 53, 5, 3, TRUE), + PT(58, 4, 6, 2, FALSE), + PT(13, 24, 3, 1, FALSE), + PT( 1, 45, 2, 2, TRUE), + PT(61, 26, 2, 3, TRUE), + PT(23, 63, 6, 1, FALSE), + PT(11, 33, 2, 0, TRUE), + PT(30, 38, 5, 1, TRUE), + PT(13, 25, 4, 2, FALSE), + PT(46, 4, 3, 1, TRUE), + PT(27, 51, 4, 0, FALSE), + PT(21, 33, 3, 2, TRUE), + PT(31, 4, 4, 0, TRUE), + PT(15, 18, 3, 3, TRUE), + PT(45, 42, 6, 1, FALSE), + PT( 3, 55, 3, 3, TRUE), + PT(53, 7, 4, 3, TRUE), + PT(36, 31, 6, 0, TRUE), + PT(47, 48, 2, 2, TRUE), + PT( 6, 0, 4, 2, FALSE), + PT(11, 34, 3, 1, FALSE), + PT(12, 59, 5, 0, TRUE), + PT(20, 26, 2, 3, TRUE), + PT(55, 32, 4, 2, TRUE), + PT(63, 38, 6, 3, TRUE), + PT(58, 62, 2, 0, FALSE), + PT(34, 4, 2, 0, TRUE), + PT(40, 18, 3, 2, FALSE), + PT( 3, 46, 5, 3, FALSE), + PT(14, 56, 5, 0, FALSE), + PT( 1, 41, 4, 1, FALSE), + PT(30, 51, 3, 0, TRUE), + PT( 6, 33, 4, 3, TRUE), + PT(51, 25, 3, 1, FALSE), + PT( 2, 5, 2, 3, TRUE), + PT(17, 17, 5, 2, FALSE), + PT(31, 38, 3, 3, FALSE), + PT(57, 31, 5, 0, FALSE), + PT(46, 47, 2, 1, FALSE), + PT(34, 52, 2, 1, TRUE), + PT(59, 38, 5, 3, TRUE), + PT(52, 0, 2, 2, FALSE), + PT(16, 49, 2, 0, TRUE), + PT(29, 45, 5, 1, FALSE), + PT( 8, 8, 6, 3, TRUE), + PT(21, 24, 6, 2, FALSE), + PT( 4, 43, 4, 2, FALSE), + PT(47, 30, 4, 3, TRUE), + PT(34, 42, 4, 2, FALSE), + PT( 7, 20, 4, 2, TRUE), + PT( 1, 39, 3, 0, TRUE), + PT(41, 10, 5, 0, TRUE), + PT(61, 28, 5, 3, TRUE), + PT(13, 31, 3, 2, FALSE), + PT(36, 61, 6, 1, FALSE), + PT(54, 29, 4, 2, FALSE), + PT(20, 33, 2, 3, FALSE), + PT(26, 13, 5, 0, TRUE), + PT(63, 43, 5, 1, FALSE), + PT(26, 62, 6, 2, TRUE), + PT(17, 40, 3, 0, FALSE), + PT(50, 5, 2, 2, TRUE), + PT(33, 46, 6, 2, FALSE), + PT(45, 20, 5, 1, FALSE), + PT(60, 8, 6, 3, TRUE), + PT(63, 52, 3, 3, FALSE), + PT(39, 36, 3, 2, FALSE), + PT(22, 22, 6, 1, TRUE), + PT(41, 59, 3, 0, TRUE), + PT(54, 47, 3, 2, FALSE), + PT( 3, 37, 5, 2, FALSE), + PT(11, 22, 6, 3, FALSE), + PT(28, 29, 3, 1, TRUE), + PT(44, 39, 3, 1, TRUE), + PT(11, 31, 5, 1, TRUE), + PT( 8, 16, 4, 3, TRUE), + PT(63, 37, 5, 3, TRUE), + PT(51, 19, 3, 3, TRUE), + PT( 4, 49, 6, 3, TRUE), + PT(14, 47, 2, 1, FALSE), + PT( 8, 35, 4, 0, FALSE), + PT(58, 26, 3, 3, FALSE), + PT(47, 11, 3, 3, TRUE), + PT(30, 32, 3, 0, TRUE), + PT(35, 59, 2, 2, FALSE), + PT(37, 0, 4, 3, TRUE), + PT(20, 4, 4, 2, TRUE), + PT(54, 26, 5, 1, TRUE), + PT(39, 33, 2, 2, TRUE), + PT(40, 19, 5, 2, FALSE), + PT(14, 60, 6, 2, TRUE), + PT(12, 45, 5, 1, TRUE), + PT(55, 22, 2, 2, TRUE), + PT(41, 21, 3, 2, TRUE), + PT(23, 52, 6, 3, FALSE), + PT( 9, 10, 6, 0, TRUE), + PT(55, 34, 5, 0, FALSE), + PT(23, 43, 6, 2, TRUE), + PT(20, 43, 2, 1, FALSE), + PT( 8, 19, 3, 3, TRUE), + PT(49, 19, 5, 0, FALSE), + PT( 6, 7, 6, 2, TRUE), + PT(35, 58, 5, 0, TRUE), + PT(15, 36, 5, 3, FALSE), + PT( 7, 53, 4, 3, FALSE), + PT(14, 18, 2, 2, TRUE), + PT(35, 51, 5, 2, FALSE), + PT(14, 33, 4, 3, FALSE), + PT(28, 18, 4, 2, TRUE), + PT(35, 29, 5, 3, TRUE), + PT( 4, 53, 6, 1, TRUE), + PT(22, 1, 4, 2, FALSE), + PT(61, 44, 5, 3, FALSE), + PT(53, 10, 4, 2, TRUE), + PT(17, 19, 4, 2, TRUE), + PT(27, 27, 2, 2, TRUE), + PT(21, 57, 2, 0, FALSE), + PT(11, 53, 4, 2, FALSE), + PT(58, 39, 6, 0, FALSE), + PT(46, 47, 2, 2, TRUE), + PT(16, 31, 6, 2, TRUE), + PT(27, 40, 6, 2, TRUE), + PT(38, 48, 6, 3, TRUE), + PT(52, 55, 5, 1, TRUE), + PT(15, 48, 5, 0, TRUE), + PT(46, 63, 5, 1, TRUE), + PT(56, 52, 5, 1, TRUE), + PT(43, 47, 4, 2, TRUE), + PT(13, 40, 5, 1, FALSE), + PT(51, 24, 2, 0, FALSE), + PT(33, 18, 2, 0, TRUE), + PT(31, 34, 6, 2, FALSE), + PT(17, 37, 4, 1, TRUE), + PT(33, 63, 2, 0, TRUE), + PT(38, 39, 4, 2, TRUE), + PT(40, 54, 2, 1, FALSE), + PT(21, 38, 6, 1, FALSE), + PT(17, 24, 4, 2, FALSE), + PT(50, 37, 6, 3, TRUE), + PT(39, 58, 6, 1, TRUE), + PT(53, 7, 3, 2, FALSE), + PT(26, 14, 5, 1, FALSE), + PT(30, 47, 3, 3, TRUE), + PT( 0, 46, 4, 0, TRUE), + PT(27, 60, 2, 2, FALSE), + PT(47, 58, 5, 3, TRUE), + PT(62, 56, 2, 2, TRUE), + PT(26, 19, 5, 3, TRUE), + PT(41, 13, 5, 3, TRUE), + PT(55, 23, 3, 0, FALSE), + PT(48, 28, 6, 2, TRUE), + PT(21, 52, 2, 2, FALSE), + PT(40, 17, 5, 2, FALSE), + PT(44, 37, 5, 1, FALSE), + PT(32, 63, 5, 0, FALSE), + PT(12, 52, 3, 1, TRUE), + PT(48, 46, 4, 2, TRUE), + PT(55, 28, 4, 2, FALSE), + PT(31, 37, 4, 3, FALSE), + PT(12, 25, 6, 2, FALSE), + PT(24, 16, 6, 2, TRUE), + PT(10, 19, 2, 0, TRUE), + PT(37, 19, 4, 0, FALSE), + PT(19, 25, 2, 0, TRUE), + PT(32, 40, 3, 2, TRUE), + PT(62, 48, 3, 1, TRUE), + PT(35, 36, 4, 0, TRUE), + PT(13, 35, 4, 1, TRUE), + PT(29, 40, 5, 3, FALSE), + PT(45, 18, 3, 3, TRUE), + PT(14, 46, 5, 1, TRUE), + PT(11, 49, 6, 1, FALSE), + PT(36, 60, 5, 2, FALSE), + PT(19, 60, 2, 1, FALSE), + PT(40, 22, 5, 1, FALSE), + PT( 5, 12, 6, 1, FALSE), + PT(57, 11, 6, 1, FALSE), + PT(33, 4, 2, 2, FALSE), + PT(16, 49, 6, 1, FALSE), + PT(18, 31, 4, 1, TRUE), + PT(57, 46, 5, 3, FALSE), + PT(34, 61, 4, 3, TRUE), + PT(12, 30, 3, 0, FALSE), + PT(37, 0, 2, 3, TRUE), + PT( 6, 49, 2, 2, FALSE), + PT(19, 33, 3, 1, FALSE), + PT(20, 32, 6, 2, TRUE), + PT(10, 59, 4, 2, TRUE), + PT(51, 8, 5, 0, FALSE), + PT(61, 2, 6, 1, TRUE), + PT(35, 0, 2, 1, TRUE), + PT(34, 33, 5, 0, FALSE), + PT(48, 20, 5, 3, FALSE), + PT(20, 50, 6, 3, FALSE), + PT(57, 35, 3, 3, FALSE), + PT(28, 17, 6, 0, FALSE), + PT(55, 22, 6, 0, FALSE), + PT(21, 49, 3, 3, TRUE), + PT(52, 40, 5, 2, FALSE), + PT(53, 5, 5, 0, TRUE), + PT(55, 51, 5, 1, FALSE), + PT(28, 23, 5, 3, FALSE), + PT(16, 6, 2, 3, FALSE), + PT(50, 31, 5, 3, TRUE), + PT( 0, 41, 3, 3, FALSE), + PT( 4, 1, 2, 3, FALSE), + PT(59, 35, 3, 3, FALSE), + PT(27, 52, 5, 1, FALSE), + PT(48, 17, 5, 1, TRUE), + PT( 3, 0, 3, 3, TRUE), + PT(29, 55, 3, 1, FALSE), + PT(58, 24, 4, 2, TRUE), + PT(28, 22, 5, 2, FALSE), + PT( 4, 63, 6, 1, TRUE), + PT(38, 35, 5, 2, TRUE), + PT(21, 44, 4, 3, TRUE), + PT( 2, 53, 4, 3, TRUE), + PT( 7, 53, 6, 1, TRUE), + PT(26, 12, 2, 0, FALSE), + PT(40, 38, 5, 2, FALSE), + PT(47, 54, 2, 3, FALSE), + PT(55, 11, 4, 3, TRUE), + PT(27, 61, 3, 0, FALSE), + PT(39, 31, 4, 0, FALSE), + PT(43, 42, 6, 1, TRUE), + PT(11, 15, 4, 0, FALSE), + PT(53, 60, 5, 3, TRUE), + PT(51, 33, 2, 2, TRUE), + PT(45, 38, 6, 2, FALSE), + PT(31, 26, 4, 0, TRUE), + PT(47, 44, 5, 1, FALSE), + PT(26, 50, 3, 1, FALSE), + PT(59, 63, 4, 0, TRUE), + PT(19, 63, 2, 1, TRUE), + PT(15, 36, 4, 1, FALSE), + PT(20, 27, 2, 0, FALSE), + PT(33, 6, 5, 0, FALSE), + PT(37, 52, 2, 0, FALSE), + PT(46, 14, 2, 2, FALSE), + PT(60, 62, 4, 2, TRUE), + PT(22, 6, 6, 0, FALSE), + PT(11, 4, 3, 3, TRUE), + PT(62, 2, 4, 2, FALSE), + PT(12, 23, 4, 2, TRUE), + PT(43, 60, 5, 2, TRUE), + PT(21, 54, 6, 1, TRUE), + PT(24, 35, 5, 1, FALSE), + PT(29, 16, 5, 1, FALSE), + PT(53, 23, 5, 0, FALSE), + PT( 0, 55, 4, 2, FALSE), + PT(10, 59, 2, 2, TRUE), + PT(29, 11, 3, 3, TRUE), + PT(60, 49, 4, 2, TRUE), + PT(29, 15, 3, 2, TRUE), + PT(32, 19, 6, 2, FALSE), + PT(17, 43, 5, 3, FALSE), + PT(35, 12, 5, 3, FALSE), + PT(36, 2, 2, 2, FALSE), + PT(49, 22, 3, 0, TRUE), + PT(14, 35, 6, 2, TRUE), + PT(26, 16, 2, 3, FALSE), + PT(20, 4, 3, 0, TRUE), + PT(45, 39, 6, 3, TRUE), + PT(51, 2, 6, 0, TRUE), + PT( 2, 4, 2, 3, FALSE), + PT(13, 34, 4, 2, TRUE), + PT(37, 0, 2, 3, FALSE), + PT(42, 63, 4, 3, FALSE), + PT(32, 12, 2, 1, FALSE), + PT(47, 46, 6, 2, TRUE), + PT(27, 13, 4, 1, FALSE), + PT(30, 1, 6, 2, FALSE), + PT( 5, 34, 4, 0, TRUE), + PT(52, 42, 6, 1, FALSE), + PT(11, 9, 3, 2, TRUE), + PT(63, 50, 5, 3, TRUE), + PT(61, 24, 5, 2, TRUE), + PT(11, 56, 6, 3, FALSE), + PT(57, 23, 5, 0, FALSE), + PT(52, 4, 4, 2, FALSE), + PT(54, 14, 5, 1, FALSE), + PT(56, 1, 2, 2, FALSE), + PT(60, 36, 4, 1, FALSE), + PT(33, 3, 3, 0, FALSE), + PT(50, 47, 2, 1, FALSE), + PT(41, 36, 6, 0, TRUE), + PT(10, 59, 2, 1, FALSE), + PT(26, 28, 4, 0, FALSE), + PT(48, 49, 3, 1, TRUE), + PT(26, 33, 2, 0, FALSE), + PT( 5, 41, 2, 0, FALSE), + PT(38, 45, 2, 1, TRUE), + PT(22, 12, 3, 2, TRUE), + PT(43, 6, 3, 1, TRUE), + PT( 6, 18, 2, 2, FALSE), + PT(56, 15, 6, 2, TRUE), + PT(35, 58, 5, 2, FALSE), + PT( 0, 25, 6, 1, TRUE), + PT(41, 20, 5, 2, TRUE), + PT(42, 33, 5, 0, TRUE), + PT(20, 49, 2, 2, FALSE), + PT(26, 6, 3, 3, FALSE), + PT(24, 27, 5, 0, FALSE), + PT(59, 22, 5, 0, TRUE), + PT(21, 30, 2, 1, FALSE), + PT(52, 10, 2, 2, FALSE), + PT(27, 5, 4, 3, TRUE), + PT(11, 1, 4, 3, FALSE), + PT(42, 34, 6, 2, TRUE), + PT(33, 32, 3, 0, FALSE), + PT(32, 55, 2, 3, TRUE), + PT(20, 31, 2, 0, TRUE), + PT(29, 17, 4, 2, TRUE), + PT(36, 43, 5, 3, TRUE), + PT( 7, 63, 3, 3, TRUE), + PT(44, 37, 4, 2, TRUE), + PT(42, 41, 3, 0, FALSE), + PT(17, 36, 5, 0, FALSE), + PT(49, 44, 5, 1, FALSE), + PT(57, 11, 4, 3, FALSE), + PT(40, 16, 4, 3, FALSE), + PT(34, 6, 2, 3, FALSE), + PT( 9, 44, 2, 1, TRUE), + PT(52, 25, 2, 2, TRUE), + PT(58, 18, 4, 0, TRUE), + PT(29, 56, 4, 1, TRUE), + PT(18, 37, 4, 2, FALSE), + PT(33, 48, 2, 1, FALSE), + PT(55, 26, 2, 1, FALSE), + PT(36, 59, 4, 2, TRUE), + PT(50, 21, 4, 1, TRUE), + PT(13, 26, 2, 0, FALSE), + PT(22, 46, 4, 3, FALSE), + PT(29, 20, 2, 3, FALSE), + PT(62, 46, 3, 3, TRUE), + PT(10, 22, 2, 0, FALSE), + PT(29, 48, 5, 1, TRUE), + PT( 4, 58, 3, 0, TRUE), + PT( 8, 45, 5, 3, FALSE), + PT(40, 30, 6, 1, TRUE), + PT(10, 18, 5, 3, FALSE), + PT(13, 3, 5, 3, TRUE), + PT(38, 58, 3, 3, FALSE), + PT(53, 59, 5, 1, FALSE), + PT( 3, 26, 3, 0, FALSE), + PT(63, 11, 4, 3, TRUE), + PT( 4, 5, 6, 2, FALSE), + PT(54, 11, 4, 3, TRUE), + PT(59, 23, 2, 0, TRUE), + PT(13, 39, 4, 3, FALSE), + PT(44, 31, 4, 0, FALSE), + PT(38, 16, 4, 0, FALSE), + PT(37, 35, 5, 2, TRUE), + PT(55, 9, 2, 1, TRUE), + PT(20, 23, 5, 2, TRUE), + PT(46, 61, 4, 1, TRUE), + PT(29, 26, 3, 3, TRUE), + PT(33, 51, 5, 3, FALSE), + PT(40, 23, 2, 1, TRUE), + PT(38, 60, 6, 3, FALSE), + PT(20, 26, 6, 1, TRUE), + PT(50, 32, 5, 1, TRUE), + PT(25, 62, 4, 0, FALSE), + PT(12, 2, 5, 2, TRUE), + PT(60, 60, 5, 1, FALSE), + PT(48, 48, 5, 0, FALSE), + PT(37, 63, 3, 3, FALSE), + PT( 3, 23, 3, 3, FALSE), + PT(53, 17, 3, 2, FALSE), + PT(27, 20, 5, 1, FALSE), + PT(40, 58, 4, 1, TRUE), + PT(14, 31, 2, 1, FALSE), + PT(54, 33, 4, 0, FALSE), + PT( 7, 59, 2, 0, FALSE), + PT(35, 25, 6, 2, FALSE), + PT(13, 46, 3, 0, FALSE), + PT(63, 32, 4, 2, TRUE), + PT(62, 59, 2, 2, TRUE), + PT(11, 46, 2, 1, FALSE), + PT(55, 11, 4, 1, TRUE), + PT(61, 50, 3, 3, TRUE), + PT(22, 3, 4, 3, TRUE), + PT(20, 12, 4, 0, TRUE), + PT(24, 3, 6, 0, FALSE), + PT(62, 33, 2, 1, TRUE), + PT(15, 0, 6, 1, FALSE), + PT(63, 35, 2, 3, FALSE), + PT(14, 49, 3, 2, TRUE), + PT(24, 28, 3, 2, TRUE), + PT(48, 14, 3, 3, FALSE), + PT(33, 32, 4, 1, TRUE), + PT(63, 12, 3, 3, FALSE), + PT(20, 51, 4, 1, FALSE), + PT(34, 33, 2, 2, TRUE), + PT(54, 5, 3, 3, FALSE), + PT(29, 49, 2, 2, FALSE), + PT(32, 17, 6, 3, TRUE), + PT(13, 51, 3, 0, TRUE), + PT(37, 5, 6, 3, FALSE), + PT(30, 49, 4, 0, FALSE), + PT(53, 58, 5, 3, TRUE), + PT(50, 47, 6, 0, FALSE), + PT(20, 35, 5, 2, TRUE), + PT(53, 30, 5, 0, TRUE), + PT( 5, 5, 3, 1, TRUE), + PT( 9, 31, 4, 3, FALSE), + PT(47, 11, 2, 2, TRUE), + PT(21, 17, 2, 1, TRUE), + PT(41, 27, 3, 0, FALSE), + PT(28, 19, 6, 2, TRUE), + PT(52, 49, 4, 1, TRUE), + PT(39, 63, 5, 3, TRUE), + PT( 9, 48, 3, 0, TRUE), + PT(35, 18, 6, 2, FALSE), + PT( 2, 42, 4, 0, TRUE), + PT( 9, 60, 3, 2, TRUE), + PT(12, 2, 2, 0, FALSE), + PT(34, 5, 2, 3, TRUE), + PT(34, 8, 3, 1, TRUE), + PT(10, 15, 2, 2, TRUE), + PT( 2, 17, 2, 1, TRUE), + PT( 1, 33, 4, 1, FALSE), + PT(22, 57, 6, 1, TRUE), + PT(36, 56, 6, 2, FALSE), + PT(15, 30, 5, 1, TRUE), + PT(43, 21, 2, 2, TRUE), + PT(32, 34, 5, 3, FALSE), + PT(58, 63, 6, 0, TRUE), + PT(26, 39, 5, 1, TRUE), + PT(41, 52, 2, 2, FALSE), + PT(22, 57, 5, 3, TRUE), + PT(19, 62, 2, 3, FALSE), + PT(54, 33, 6, 0, FALSE), + PT( 0, 36, 5, 1, TRUE), + PT(36, 33, 6, 0, FALSE), + PT(21, 49, 2, 1, TRUE), + PT(16, 55, 4, 2, FALSE), + PT( 8, 7, 4, 1, TRUE), + PT(33, 9, 4, 2, TRUE), + PT( 5, 60, 6, 1, FALSE), + PT(25, 3, 4, 2, TRUE), + PT(15, 41, 5, 1, TRUE), + PT(22, 7, 2, 1, TRUE), + PT(62, 61, 4, 2, TRUE), + PT(54, 11, 5, 0, FALSE), + PT(46, 43, 2, 3, FALSE), + PT(12, 49, 2, 0, TRUE), + PT(48, 19, 5, 2, TRUE), + PT(38, 62, 6, 3, TRUE), + PT(41, 47, 5, 3, FALSE), + PT(21, 61, 2, 3, TRUE), + PT(28, 46, 4, 0, TRUE), + PT(51, 47, 2, 0, FALSE), + PT(13, 5, 3, 2, TRUE), + PT(28, 26, 2, 1, FALSE), + PT(14, 24, 6, 3, TRUE), + PT(27, 17, 2, 2, FALSE), + PT( 6, 20, 4, 0, TRUE), + PT(49, 14, 4, 3, TRUE), + PT(26, 3, 2, 0, FALSE), + PT( 0, 52, 6, 0, TRUE), + PT(63, 11, 3, 2, TRUE), + PT(15, 18, 3, 3, TRUE), + PT(26, 21, 2, 0, FALSE), + PT(15, 0, 4, 2, FALSE), + PT(62, 10, 5, 1, FALSE), + PT(48, 43, 4, 2, FALSE), + PT(38, 49, 2, 0, FALSE), + PT(45, 47, 5, 3, TRUE), + PT(63, 12, 2, 1, TRUE), + PT(18, 11, 2, 3, FALSE), + PT(21, 7, 3, 3, TRUE), + PT(40, 16, 6, 1, FALSE), + PT(15, 23, 2, 2, TRUE), + PT(11, 39, 6, 1, TRUE), + PT(52, 29, 2, 0, FALSE), + PT(28, 58, 2, 1, FALSE), + PT(44, 39, 6, 3, TRUE), + PT(10, 26, 6, 1, FALSE), + PT( 5, 31, 4, 0, TRUE), + PT(36, 13, 3, 3, TRUE), + PT(28, 23, 4, 2, FALSE), + PT(47, 59, 6, 1, FALSE), + PT(59, 37, 2, 0, FALSE), + PT( 3, 47, 4, 0, TRUE), + PT(12, 16, 4, 1, TRUE), + PT(14, 58, 5, 2, FALSE), + PT(51, 3, 5, 2, FALSE), + PT(18, 6, 3, 2, FALSE), + PT(42, 55, 6, 0, FALSE), + PT(63, 1, 3, 3, FALSE), + PT(53, 22, 6, 3, TRUE), + PT(44, 50, 6, 2, TRUE), + PT( 5, 17, 4, 1, FALSE), + PT(41, 9, 4, 0, FALSE), + PT(43, 13, 3, 3, TRUE), + PT(24, 13, 4, 0, FALSE), + PT(35, 57, 2, 3, FALSE), + PT(15, 58, 3, 0, FALSE), + PT(33, 53, 5, 1, TRUE), + PT(54, 38, 5, 1, TRUE), + PT(35, 5, 5, 3, TRUE), + PT(27, 8, 2, 3, TRUE), + PT(62, 9, 2, 3, FALSE), + PT(45, 58, 6, 3, TRUE), + PT(21, 53, 6, 2, TRUE), + PT(41, 10, 2, 1, FALSE), + PT( 2, 57, 3, 3, TRUE), + PT(20, 52, 6, 1, TRUE), + PT(23, 29, 3, 0, FALSE), + PT(22, 29, 3, 1, FALSE), + PT( 1, 57, 4, 1, FALSE), + PT(30, 39, 6, 3, FALSE), + PT(50, 20, 4, 3, FALSE), + PT(10, 57, 6, 3, FALSE), + PT(31, 13, 3, 3, FALSE), + PT(11, 10, 3, 0, TRUE), + PT(53, 29, 6, 2, FALSE), + PT( 3, 18, 2, 3, FALSE), + PT(12, 19, 5, 3, FALSE), + PT(12, 52, 3, 3, FALSE), + PT(16, 20, 3, 3, FALSE), + PT(35, 50, 4, 3, TRUE), + PT( 2, 16, 5, 0, TRUE), + PT(53, 24, 6, 1, TRUE), + PT(51, 29, 3, 1, FALSE), + PT(60, 21, 4, 1, TRUE), + PT(62, 63, 4, 1, FALSE), + PT(42, 2, 5, 2, FALSE), + PT(40, 10, 5, 3, TRUE), + PT(26, 6, 6, 2, TRUE), + PT(60, 23, 5, 1, TRUE), + PT( 3, 18, 2, 3, TRUE), + PT(47, 10, 4, 3, FALSE), + PT(18, 56, 2, 0, TRUE), + PT(54, 27, 4, 1, TRUE), + PT( 1, 57, 6, 2, TRUE), + PT(25, 25, 2, 3, TRUE), + PT( 9, 40, 4, 1, FALSE), + PT(30, 39, 5, 2, FALSE), + PT(53, 51, 5, 2, FALSE), + PT(39, 37, 6, 0, TRUE), + PT( 6, 49, 5, 2, TRUE), + PT(26, 57, 5, 0, FALSE), + PT(45, 4, 3, 3, FALSE), + PT(36, 62, 3, 2, FALSE), + PT(60, 48, 3, 1, TRUE), + PT(63, 62, 6, 3, TRUE), + PT(34, 54, 2, 0, TRUE), + PT( 0, 1, 3, 2, FALSE), + PT(18, 26, 2, 0, FALSE), + PT(18, 30, 5, 2, FALSE), + PT(31, 18, 5, 1, FALSE), + PT(47, 6, 3, 0, TRUE), + PT(53, 26, 3, 0, FALSE), + PT(59, 9, 6, 3, FALSE), + PT(52, 29, 2, 1, TRUE), + PT( 2, 7, 2, 0, FALSE), + PT(32, 47, 3, 2, TRUE), + PT(11, 3, 6, 1, TRUE), + PT(28, 22, 6, 0, TRUE), + PT( 5, 19, 3, 1, TRUE), + PT(41, 6, 2, 1, TRUE), + PT(48, 45, 6, 3, FALSE), + PT(42, 45, 5, 2, FALSE), + PT(25, 52, 3, 2, FALSE), + PT(15, 21, 2, 1, FALSE), + PT(54, 21, 5, 2, FALSE), + PT(58, 6, 3, 2, FALSE), + PT(18, 29, 4, 3, FALSE), + PT( 3, 56, 3, 2, TRUE), + PT( 1, 1, 5, 2, TRUE), + PT(23, 46, 2, 0, FALSE), + PT(20, 23, 3, 2, FALSE), + PT(52, 15, 5, 0, FALSE), + PT( 9, 55, 3, 1, TRUE), + PT(40, 29, 4, 3, FALSE), + PT(41, 45, 6, 3, FALSE), + PT(30, 23, 5, 0, FALSE), + PT(21, 15, 3, 2, FALSE), + PT(32, 45, 2, 0, FALSE), + PT(39, 22, 5, 3, FALSE), + PT(20, 9, 2, 1, FALSE), + PT(59, 61, 4, 0, TRUE), + PT(37, 26, 5, 2, FALSE), + PT( 0, 34, 6, 3, FALSE), + PT(13, 48, 2, 0, FALSE), + PT(23, 25, 3, 1, TRUE), + PT( 0, 59, 4, 0, TRUE), + PT(42, 40, 6, 2, FALSE), + PT(45, 15, 2, 3, FALSE), + PT(10, 48, 5, 0, FALSE), + PT( 6, 0, 4, 2, TRUE), + PT(49, 46, 5, 1, FALSE), + PT(20, 51, 5, 0, FALSE), + PT(54, 16, 5, 3, FALSE), + PT( 5, 46, 3, 0, TRUE), + PT(25, 26, 2, 2, TRUE), + PT(44, 20, 2, 3, TRUE), + PT(55, 15, 2, 1, TRUE), + PT(50, 23, 3, 1, TRUE), + PT(57, 24, 6, 1, FALSE), + PT(46, 50, 3, 3, FALSE), + PT(36, 29, 6, 0, TRUE), + PT(18, 29, 5, 1, TRUE), + PT(20, 12, 4, 3, TRUE), + PT(54, 46, 6, 1, FALSE), + PT( 6, 10, 3, 1, FALSE), + PT(40, 40, 4, 0, FALSE), + PT(58, 58, 2, 3, TRUE), + PT( 8, 39, 6, 3, FALSE), + PT(24, 26, 2, 0, FALSE), + PT(30, 38, 3, 1, TRUE), + PT(31, 51, 3, 3, TRUE), + PT(33, 23, 5, 3, TRUE), + PT( 1, 8, 4, 0, FALSE), + PT(53, 3, 3, 0, TRUE), + PT(59, 2, 4, 0, FALSE), + PT( 2, 45, 4, 1, TRUE), + PT(14, 23, 6, 1, FALSE), + PT(49, 41, 2, 0, TRUE), + PT(34, 23, 4, 1, FALSE), + PT(58, 44, 4, 1, TRUE), + PT(52, 32, 3, 0, FALSE), + PT( 0, 58, 4, 1, FALSE), + PT(37, 51, 4, 0, TRUE), + PT(51, 4, 4, 3, TRUE), + PT( 4, 24, 6, 1, FALSE), + PT(44, 12, 5, 3, TRUE), + PT(40, 20, 5, 2, FALSE), + PT(63, 48, 5, 1, TRUE), + PT(48, 33, 3, 2, TRUE), + PT( 1, 37, 6, 1, FALSE), + PT( 5, 35, 6, 2, FALSE), + PT(36, 16, 6, 0, FALSE), + PT(61, 20, 3, 1, TRUE), + PT(63, 56, 5, 3, TRUE), + PT(34, 27, 6, 1, FALSE), + PT(37, 7, 6, 3, TRUE), + PT(10, 12, 3, 2, TRUE), + PT( 3, 30, 3, 1, FALSE), + PT(15, 60, 2, 1, FALSE), + PT(17, 24, 3, 2, TRUE), + PT( 0, 53, 5, 3, TRUE), + PT(50, 24, 2, 2, FALSE), + PT(35, 48, 3, 1, TRUE), + PT(17, 61, 2, 1, FALSE), + PT(26, 22, 6, 2, TRUE), + PT(40, 5, 4, 2, FALSE), + PT(23, 61, 6, 3, TRUE), + PT(46, 9, 5, 3, FALSE), + PT(24, 29, 2, 3, TRUE), + PT(32, 31, 3, 0, FALSE), + PT(35, 44, 5, 3, TRUE), + PT(32, 63, 2, 3, FALSE), + PT(63, 41, 5, 3, FALSE), + PT(35, 59, 5, 0, TRUE), + PT(24, 57, 2, 1, TRUE), + PT(30, 50, 6, 2, TRUE), + PT(20, 29, 5, 1, FALSE), + PT(53, 1, 3, 2, TRUE), + PT(62, 59, 3, 3, FALSE), + PT(34, 30, 2, 3, FALSE), + PT(24, 34, 2, 1, FALSE), + PT(62, 41, 6, 1, TRUE), + PT(47, 20, 3, 0, TRUE), + PT(59, 7, 2, 2, TRUE), + PT( 6, 61, 5, 0, TRUE), + PT(53, 55, 4, 1, TRUE), + PT(52, 29, 5, 2, TRUE), + PT(24, 18, 3, 1, TRUE), + PT(11, 19, 4, 2, FALSE), + PT(19, 56, 3, 2, FALSE), + PT(31, 11, 3, 1, TRUE), + PT(19, 33, 3, 2, FALSE), + PT( 6, 57, 6, 1, FALSE), + PT(55, 61, 4, 3, FALSE), + PT(41, 38, 2, 2, TRUE), + PT(60, 51, 4, 3, TRUE), + PT( 0, 1, 5, 3, FALSE), + PT(21, 24, 6, 0, TRUE), + PT(13, 44, 2, 1, TRUE), + PT(39, 59, 4, 0, FALSE), + PT(45, 1, 4, 3, FALSE), + PT(35, 21, 6, 0, FALSE), + PT(36, 0, 2, 3, TRUE), + PT(55, 63, 6, 1, TRUE), + PT(37, 36, 6, 0, TRUE), + PT( 6, 59, 6, 3, TRUE), + PT( 3, 24, 3, 1, FALSE), + PT(44, 52, 2, 2, FALSE), + PT(29, 54, 3, 0, FALSE), + PT(58, 4, 4, 1, TRUE), + PT(18, 38, 2, 2, TRUE), + PT(43, 25, 3, 1, FALSE), + PT(41, 44, 6, 3, FALSE), + PT( 1, 25, 3, 2, TRUE), + PT(47, 6, 5, 1, TRUE), + PT(12, 18, 4, 3, FALSE), + PT(54, 50, 3, 2, TRUE), + PT(13, 18, 5, 0, FALSE), + PT( 3, 40, 2, 1, TRUE), + PT(41, 6, 2, 3, TRUE), + PT( 3, 56, 4, 0, TRUE), + PT(48, 44, 2, 0, FALSE), + PT(34, 0, 5, 0, FALSE), + PT(36, 59, 3, 2, FALSE), + PT(32, 62, 2, 1, TRUE), + PT( 2, 12, 3, 0, TRUE), + PT(41, 44, 3, 1, FALSE), + PT(57, 48, 4, 1, FALSE), + PT(42, 31, 4, 1, FALSE), + PT(20, 52, 5, 2, FALSE), + PT(20, 37, 3, 1, TRUE), + PT( 6, 59, 2, 2, TRUE), + PT( 6, 28, 2, 1, TRUE), + PT(21, 3, 3, 0, FALSE), + PT(30, 42, 3, 1, TRUE), + PT(23, 37, 5, 3, TRUE), + PT(28, 41, 5, 3, FALSE), + PT( 2, 50, 3, 3, FALSE), + PT(29, 40, 6, 2, TRUE), + PT(54, 3, 6, 2, FALSE), + PT(22, 61, 5, 1, FALSE), + PT(18, 13, 2, 1, TRUE), + PT(29, 45, 4, 0, TRUE), + PT(50, 23, 5, 3, FALSE), + PT(26, 21, 4, 3, FALSE), + PT(34, 47, 2, 2, TRUE), + PT(60, 14, 4, 0, FALSE), + PT(47, 39, 2, 1, TRUE), + PT( 4, 9, 6, 1, FALSE), + PT(30, 1, 6, 2, FALSE), + PT( 6, 22, 3, 3, FALSE), + PT(46, 27, 3, 2, FALSE), + PT(40, 19, 5, 1, FALSE), + PT(48, 52, 2, 1, FALSE), + PT(18, 50, 3, 0, FALSE), + PT(29, 29, 6, 2, TRUE), + PT( 7, 28, 2, 3, FALSE), + PT(45, 61, 6, 2, TRUE), + PT(28, 27, 4, 2, FALSE), + PT(33, 45, 3, 3, FALSE), + PT(16, 9, 2, 2, FALSE), + PT(61, 17, 2, 1, FALSE), + PT(37, 2, 4, 3, FALSE), + PT(35, 2, 3, 0, TRUE), + PT(25, 5, 2, 2, FALSE), + PT(11, 33, 3, 1, FALSE), + PT( 9, 2, 5, 2, FALSE), + PT(24, 40, 5, 2, TRUE), + PT(30, 16, 2, 1, FALSE), + PT(46, 24, 5, 3, FALSE), + PT(31, 2, 5, 2, FALSE), + PT(20, 23, 4, 2, FALSE), + PT(57, 8, 6, 1, FALSE), + PT(22, 20, 4, 1, FALSE), + PT(22, 40, 4, 0, TRUE), + PT(17, 16, 5, 2, FALSE), + PT(35, 54, 5, 1, TRUE), + PT(57, 33, 4, 3, FALSE), + PT(14, 6, 5, 2, TRUE), + PT(60, 62, 4, 3, FALSE), + PT(42, 27, 3, 3, TRUE), + PT( 0, 60, 6, 1, TRUE), + PT(53, 63, 2, 2, FALSE), + PT( 0, 11, 2, 0, FALSE), + PT(52, 60, 2, 3, TRUE), + PT(45, 7, 3, 3, TRUE), + PT(36, 57, 4, 3, TRUE), + PT(22, 0, 3, 2, TRUE), + PT(51, 43, 3, 3, FALSE), + PT(15, 8, 6, 0, TRUE), + PT(58, 9, 2, 1, TRUE), + PT(12, 33, 3, 2, FALSE), + PT(42, 23, 6, 2, FALSE), + PT(41, 39, 2, 0, FALSE), + PT(55, 27, 3, 0, FALSE), + PT(21, 8, 5, 3, TRUE), + PT(31, 22, 2, 1, FALSE), + PT(31, 40, 6, 2, FALSE), + PT(28, 32, 4, 1, FALSE), + PT(18, 1, 2, 1, FALSE), + PT(33, 49, 2, 0, FALSE), + PT(34, 38, 3, 3, FALSE), + PT( 1, 61, 2, 0, TRUE), + PT(30, 39, 4, 2, TRUE), + PT(61, 48, 4, 2, FALSE), + PT(29, 17, 4, 1, FALSE), + PT(54, 48, 2, 3, FALSE), + PT(31, 62, 5, 1, FALSE), + PT(60, 39, 3, 1, TRUE), + PT(31, 41, 2, 0, FALSE), + PT(30, 5, 5, 1, FALSE), + PT(10, 16, 2, 2, FALSE), + PT(31, 0, 5, 3, FALSE), + PT(11, 59, 3, 0, FALSE), + PT(10, 57, 6, 0, FALSE), + PT(55, 11, 3, 3, TRUE), + PT(29, 10, 5, 0, TRUE), + PT(62, 28, 6, 1, TRUE), + PT(19, 46, 5, 0, FALSE), + PT(39, 27, 3, 3, FALSE), + PT(29, 2, 3, 2, FALSE), + PT( 1, 37, 2, 2, FALSE), + PT(58, 16, 3, 2, FALSE), + PT(18, 5, 5, 1, FALSE), + PT(48, 32, 4, 3, FALSE), + PT(47, 46, 5, 3, FALSE), + PT( 3, 7, 4, 2, FALSE), + PT(54, 4, 5, 1, TRUE), + PT(17, 37, 5, 2, TRUE), + PT(40, 14, 5, 3, FALSE), + PT(15, 29, 2, 2, TRUE), + PT(28, 40, 6, 0, FALSE), + PT(31, 35, 4, 3, FALSE), + PT(54, 18, 6, 3, TRUE), + PT(58, 49, 2, 0, FALSE), + PT(44, 44, 5, 3, TRUE), + PT(26, 13, 2, 2, TRUE), + PT(63, 60, 6, 1, FALSE), + PT(53, 28, 2, 3, FALSE), + PT(51, 22, 5, 0, FALSE), + PT(29, 63, 4, 0, TRUE), + PT(44, 62, 5, 1, TRUE), + PT(36, 35, 5, 3, TRUE), + PT(50, 21, 5, 1, FALSE), + PT(27, 16, 6, 2, TRUE), + PT(24, 55, 2, 0, FALSE), + PT(59, 30, 2, 0, TRUE), + PT(43, 22, 4, 2, FALSE), + PT(29, 22, 4, 3, FALSE), + PT(60, 45, 2, 0, TRUE), + PT(21, 40, 5, 0, FALSE), + PT(39, 39, 4, 3, TRUE), + PT(59, 58, 2, 3, FALSE), + PT(26, 12, 3, 1, FALSE), + PT(21, 8, 4, 2, TRUE), + PT(11, 16, 4, 1, FALSE), + PT(26, 62, 2, 3, TRUE), + PT(40, 31, 3, 3, FALSE), + PT( 1, 30, 3, 3, FALSE), + PT(28, 47, 2, 0, FALSE), + PT(37, 11, 6, 2, FALSE), + PT(62, 12, 3, 1, FALSE), + PT(27, 16, 5, 1, FALSE), + PT(15, 20, 2, 3, TRUE), + PT(15, 63, 2, 3, TRUE), + PT( 3, 21, 3, 3, TRUE), + PT( 2, 54, 2, 3, TRUE), + PT(21, 29, 3, 0, FALSE), + PT( 8, 54, 2, 0, FALSE), + PT(20, 13, 5, 1, TRUE), + PT(10, 5, 3, 2, TRUE), + PT(38, 18, 3, 3, FALSE), + PT(62, 24, 3, 0, TRUE), + PT(54, 24, 6, 3, TRUE), + PT(23, 57, 5, 3, FALSE), + PT(13, 4, 3, 0, TRUE), + PT(22, 34, 2, 2, TRUE), + PT(62, 38, 3, 3, TRUE), + PT( 0, 6, 2, 3, TRUE), + PT(51, 34, 3, 2, TRUE), + PT(43, 57, 5, 1, TRUE), + PT(62, 49, 3, 2, FALSE), + PT(34, 63, 2, 1, TRUE), + PT(48, 28, 6, 0, TRUE), + PT( 7, 43, 2, 2, FALSE), + PT(50, 53, 3, 3, FALSE), + PT( 2, 7, 4, 0, FALSE), + PT(15, 59, 2, 0, TRUE), + PT(32, 7, 2, 1, FALSE), + PT(42, 48, 3, 2, TRUE), + PT(40, 56, 6, 3, FALSE), + PT(32, 1, 2, 3, TRUE), + PT(21, 32, 4, 0, TRUE), + PT(58, 27, 3, 3, FALSE), + PT(56, 18, 4, 2, FALSE), + PT( 3, 62, 3, 3, TRUE), + PT(41, 29, 2, 1, TRUE), + PT(32, 39, 3, 0, TRUE), + PT(18, 37, 4, 0, FALSE), + PT(50, 51, 5, 1, TRUE), + PT(63, 5, 6, 0, TRUE), + PT(53, 60, 5, 2, TRUE), + PT(45, 2, 5, 3, FALSE), + PT(16, 42, 2, 3, FALSE), + PT(23, 8, 6, 0, TRUE), + PT(23, 46, 5, 1, TRUE), + PT(48, 30, 2, 2, TRUE), + PT(49, 21, 4, 3, FALSE), + PT( 8, 16, 6, 1, TRUE), + PT(21, 1, 4, 3, TRUE), + PT(18, 7, 5, 3, TRUE), + PT(41, 39, 6, 2, FALSE), + PT(63, 8, 6, 0, TRUE), + PT(28, 32, 3, 1, FALSE), + PT(51, 12, 2, 1, TRUE), + PT(24, 49, 4, 2, FALSE), + PT(55, 45, 5, 3, FALSE), + PT(33, 24, 4, 2, FALSE), + PT(58, 39, 6, 0, TRUE), + PT(53, 62, 6, 0, FALSE), + PT(58, 20, 6, 1, TRUE), + PT(15, 26, 5, 2, TRUE), + PT(48, 46, 2, 0, TRUE), + PT(26, 49, 3, 2, TRUE), + PT(23, 60, 3, 0, FALSE), + PT(51, 49, 4, 1, TRUE), + PT(29, 57, 5, 2, TRUE), + PT(16, 29, 5, 3, TRUE), + PT(36, 21, 3, 2, FALSE), + PT(37, 1, 5, 1, TRUE), + PT(34, 22, 5, 3, FALSE), + PT(27, 37, 6, 2, TRUE), + PT(55, 16, 4, 3, FALSE), + PT(57, 1, 6, 3, FALSE), + PT(23, 43, 2, 2, FALSE), + PT( 9, 22, 2, 3, TRUE), + PT(32, 40, 4, 1, TRUE), + PT(38, 58, 4, 3, FALSE), + PT(39, 42, 4, 2, FALSE), + PT(54, 2, 5, 2, FALSE), + PT(41, 48, 6, 2, TRUE), + PT(54, 1, 3, 3, TRUE), + PT(40, 59, 3, 2, TRUE), + PT(35, 30, 5, 2, TRUE), + PT(17, 30, 5, 2, FALSE), + PT(47, 50, 3, 0, TRUE), + PT(63, 38, 6, 0, TRUE), + PT(56, 30, 2, 3, TRUE), + PT( 5, 24, 5, 3, FALSE), + PT( 0, 46, 2, 1, FALSE), + PT(52, 63, 6, 2, FALSE), + PT(22, 16, 5, 0, TRUE), + PT(32, 61, 6, 3, FALSE), + PT(47, 22, 4, 2, TRUE), + PT(18, 23, 2, 0, FALSE), + PT(33, 55, 6, 2, TRUE), + PT(37, 55, 5, 2, TRUE), + PT( 1, 8, 4, 3, TRUE), + PT( 3, 31, 5, 0, TRUE), + PT(13, 42, 2, 3, FALSE), + PT(58, 63, 6, 1, TRUE), + PT(43, 25, 3, 2, TRUE), + PT(42, 31, 5, 0, TRUE), + PT(40, 44, 2, 0, FALSE), + PT(40, 48, 2, 0, FALSE), + PT(57, 20, 3, 1, TRUE), + PT( 0, 24, 4, 0, TRUE), + PT(40, 12, 6, 3, TRUE), + PT(17, 16, 2, 0, TRUE), + PT(60, 51, 6, 1, FALSE), + PT(51, 54, 3, 1, FALSE), + PT(54, 0, 3, 2, FALSE), + PT(49, 27, 3, 2, TRUE), + PT(56, 29, 2, 0, FALSE), + PT(60, 57, 4, 3, TRUE), + PT(58, 63, 2, 2, FALSE), + PT(25, 18, 2, 2, FALSE), + PT(13, 31, 3, 0, FALSE), + PT( 0, 37, 3, 0, FALSE), + PT(40, 28, 6, 1, FALSE), + PT(39, 3, 3, 1, FALSE), + PT(38, 45, 5, 1, FALSE), + PT(41, 40, 4, 3, TRUE), + PT(10, 42, 3, 0, FALSE), + PT(10, 26, 6, 0, FALSE), + PT(32, 26, 5, 3, FALSE), + PT( 6, 11, 3, 2, TRUE), + PT(15, 12, 3, 2, FALSE), + PT(53, 40, 3, 2, FALSE), + PT(61, 22, 4, 1, TRUE), + PT(33, 28, 6, 0, TRUE), + PT(20, 28, 5, 3, FALSE), + PT(34, 50, 6, 2, TRUE), + PT( 9, 41, 6, 0, FALSE), + PT(32, 26, 2, 0, FALSE), + PT(49, 63, 5, 2, FALSE), + PT(10, 61, 6, 3, TRUE), + PT(11, 46, 5, 2, TRUE), + PT(31, 34, 6, 0, TRUE), + PT( 6, 7, 5, 0, TRUE), + PT(34, 23, 5, 2, TRUE), + PT(48, 17, 3, 0, FALSE), + PT(12, 25, 2, 2, TRUE), + PT( 7, 10, 6, 2, FALSE), + PT(24, 41, 4, 3, TRUE), + PT(51, 12, 6, 0, FALSE), + PT( 3, 26, 6, 3, TRUE), + PT( 6, 1, 5, 2, TRUE), + PT(15, 59, 5, 1, TRUE), + PT(17, 31, 6, 3, TRUE), + PT(43, 33, 6, 3, FALSE), + PT(63, 35, 2, 3, TRUE), + PT(23, 7, 5, 1, TRUE), + PT(43, 14, 6, 0, FALSE), + PT(17, 57, 3, 2, TRUE), + PT(41, 3, 6, 1, TRUE), + PT(48, 3, 5, 3, TRUE), + PT(60, 32, 4, 3, FALSE), + PT( 3, 34, 2, 2, FALSE), + PT(58, 40, 6, 2, TRUE), + PT( 1, 40, 5, 1, TRUE), + PT(62, 21, 3, 0, FALSE), + PT(48, 7, 2, 3, TRUE), + PT(59, 44, 6, 0, FALSE), + PT(21, 7, 5, 2, FALSE), + PT(23, 39, 3, 2, TRUE), + PT(63, 30, 6, 1, TRUE), + PT(13, 23, 2, 0, FALSE), + PT(21, 14, 6, 0, FALSE), + PT( 9, 5, 6, 0, FALSE), + PT(45, 32, 2, 2, TRUE), + PT(60, 61, 6, 0, FALSE), + PT(12, 23, 3, 2, FALSE), + PT(26, 13, 4, 2, TRUE), + PT(43, 43, 5, 1, FALSE), + PT( 2, 22, 5, 2, TRUE), + PT(23, 49, 2, 3, TRUE), + PT( 0, 8, 2, 1, TRUE), + PT(55, 53, 4, 0, TRUE), + PT(30, 28, 3, 3, TRUE), + PT(43, 50, 3, 2, FALSE), + PT(16, 42, 2, 3, FALSE), + PT(58, 51, 6, 0, TRUE), + PT(23, 43, 5, 1, FALSE), + PT(12, 61, 2, 0, TRUE), + PT(40, 10, 6, 0, FALSE), + PT(35, 10, 4, 3, FALSE), + PT(10, 20, 4, 2, FALSE), + PT(11, 15, 6, 0, FALSE), + PT(27, 30, 5, 0, TRUE), + PT( 2, 53, 5, 0, FALSE), + PT(59, 2, 2, 2, FALSE), + PT( 0, 15, 6, 2, TRUE), + PT(28, 60, 5, 3, FALSE), + PT(40, 56, 3, 0, TRUE), + PT(27, 17, 2, 1, FALSE), + PT( 9, 22, 2, 0, FALSE), + PT(46, 13, 4, 0, FALSE), + PT(61, 4, 6, 1, FALSE), + PT(22, 44, 4, 2, TRUE), + PT( 2, 61, 3, 0, FALSE), + PT(11, 19, 3, 2, FALSE), + PT(34, 42, 3, 2, FALSE), + PT(32, 39, 4, 1, FALSE), + PT( 5, 38, 4, 1, FALSE), + PT(18, 29, 5, 2, FALSE), + PT( 8, 5, 5, 3, FALSE), + PT(63, 28, 2, 3, TRUE), + PT(36, 13, 6, 1, TRUE), + PT(54, 8, 4, 2, FALSE), + PT(16, 34, 5, 0, TRUE), + PT(28, 10, 2, 0, TRUE), + PT(37, 15, 2, 0, FALSE), + PT(36, 56, 5, 3, TRUE), + PT(37, 50, 3, 3, FALSE), + PT( 6, 42, 5, 0, TRUE), + PT(62, 58, 5, 0, FALSE), + PT(52, 23, 6, 1, TRUE), + PT(24, 51, 2, 3, TRUE), + PT( 7, 20, 3, 3, TRUE), + PT(17, 23, 4, 0, FALSE), + PT(19, 14, 2, 2, FALSE), + PT(59, 28, 2, 1, FALSE), + PT(42, 19, 6, 3, TRUE), + PT(42, 53, 6, 1, FALSE), + PT(48, 2, 4, 2, TRUE), + PT( 0, 7, 3, 3, TRUE), + PT(12, 4, 5, 2, FALSE), + PT(55, 55, 6, 0, FALSE), + PT(37, 18, 4, 2, TRUE), + PT(18, 34, 4, 0, TRUE), + PT(34, 53, 6, 1, TRUE), + PT( 7, 32, 5, 2, TRUE), + PT(39, 14, 6, 0, FALSE), + PT(52, 25, 3, 1, FALSE), + PT(10, 60, 4, 2, TRUE), + PT( 7, 29, 5, 1, TRUE), + PT(49, 58, 2, 1, FALSE), + PT(26, 61, 6, 3, TRUE), + PT(22, 21, 2, 3, FALSE), + PT(57, 19, 2, 2, TRUE), + PT(45, 3, 5, 3, FALSE), + PT( 6, 57, 5, 2, FALSE), + PT(22, 0, 2, 1, TRUE), + PT(53, 42, 6, 2, TRUE), + PT(36, 1, 3, 0, FALSE), + PT(36, 55, 5, 0, FALSE), + PT(37, 27, 6, 2, FALSE), + PT(37, 25, 2, 3, TRUE), + PT(39, 47, 3, 1, TRUE), + PT(39, 13, 2, 0, FALSE), + PT(54, 60, 6, 0, FALSE), + PT(60, 51, 4, 1, TRUE), + PT(62, 39, 3, 3, FALSE), + PT(37, 45, 5, 0, TRUE), + PT(31, 18, 4, 0, TRUE), + PT(55, 50, 3, 3, TRUE), + PT(17, 33, 6, 2, TRUE), + PT(48, 12, 3, 0, TRUE), + PT(37, 61, 4, 3, FALSE), + PT(23, 2, 3, 2, TRUE), + PT(20, 46, 2, 0, TRUE), + PT(56, 19, 6, 0, FALSE), + PT(10, 43, 4, 0, FALSE), + PT(30, 16, 2, 2, TRUE), + PT(55, 48, 5, 3, FALSE), + PT(30, 4, 5, 2, FALSE), + PT(20, 52, 3, 0, TRUE), + PT( 8, 20, 3, 0, FALSE), + PT(14, 28, 6, 0, FALSE), + PT(26, 46, 3, 1, TRUE), + PT(31, 57, 6, 0, TRUE), + PT(12, 28, 5, 0, FALSE), + PT(62, 51, 4, 1, TRUE), + PT(15, 19, 2, 3, FALSE), + PT(37, 57, 5, 3, TRUE), + PT(20, 27, 3, 1, FALSE), + PT(40, 62, 4, 0, TRUE), + PT(45, 25, 2, 0, TRUE), + PT(12, 52, 6, 1, FALSE), + PT(57, 49, 3, 0, TRUE), + PT(26, 8, 6, 2, FALSE), + PT( 9, 47, 2, 0, TRUE), + PT(48, 4, 3, 2, FALSE), + PT( 2, 59, 3, 1, TRUE), + PT(51, 33, 6, 1, TRUE), + PT(56, 2, 3, 1, FALSE), + PT(49, 56, 6, 1, FALSE), + PT(31, 29, 2, 3, FALSE), + PT(23, 16, 3, 1, TRUE), + PT(50, 32, 2, 3, TRUE), + PT( 0, 51, 2, 1, FALSE), + PT(33, 15, 4, 3, TRUE), + PT(20, 25, 4, 3, TRUE), + PT(36, 44, 6, 3, TRUE), + PT(37, 5, 5, 3, TRUE), + PT(61, 37, 2, 0, TRUE), + PT(18, 48, 3, 1, FALSE), + PT(22, 3, 3, 1, FALSE), + PT(20, 9, 2, 1, TRUE), + PT( 2, 35, 4, 1, FALSE), + PT( 1, 60, 2, 0, FALSE), + PT(63, 45, 4, 1, TRUE), + PT(49, 63, 4, 1, TRUE), + PT(23, 0, 6, 1, TRUE), + PT(63, 15, 5, 3, TRUE), + PT(38, 7, 2, 2, TRUE), + PT(33, 43, 5, 1, FALSE), + PT(56, 57, 3, 3, FALSE), + PT( 9, 37, 5, 1, TRUE), + PT(59, 48, 4, 2, TRUE), + PT(18, 45, 2, 1, TRUE), + PT(50, 25, 5, 0, FALSE), + PT(36, 28, 5, 2, TRUE), + PT(53, 50, 4, 3, FALSE), + PT(13, 35, 3, 3, FALSE), + PT(29, 7, 4, 0, TRUE), + PT(11, 52, 2, 3, TRUE), + PT(45, 50, 6, 1, FALSE), + PT(58, 60, 6, 2, TRUE), + PT(26, 16, 6, 1, TRUE), + PT(26, 7, 4, 1, FALSE), + PT(59, 27, 5, 1, FALSE), + PT(51, 31, 4, 3, FALSE), + PT(14, 53, 3, 1, FALSE), + PT(59, 10, 3, 2, FALSE), + PT(17, 7, 2, 0, TRUE), + PT(13, 60, 5, 2, TRUE), + PT(30, 55, 5, 0, TRUE), + PT(17, 5, 2, 1, FALSE), + PT(21, 47, 3, 2, FALSE), + PT(36, 49, 2, 3, FALSE), + PT(43, 33, 3, 1, TRUE), + PT(35, 16, 6, 0, TRUE), + PT( 2, 20, 5, 0, TRUE), + PT(38, 32, 2, 3, FALSE), + PT(16, 23, 2, 0, FALSE), + PT(11, 15, 6, 1, TRUE), + PT( 1, 46, 2, 2, FALSE), + PT(33, 14, 6, 3, TRUE), + PT(26, 29, 5, 3, TRUE), + PT(30, 48, 4, 2, FALSE), + PT( 4, 20, 5, 2, TRUE), + PT(17, 0, 6, 0, FALSE), + PT( 8, 42, 3, 2, TRUE), + PT(29, 34, 4, 0, TRUE), + PT(36, 44, 6, 3, TRUE), + PT(36, 17, 2, 1, FALSE), + PT( 4, 46, 5, 0, FALSE), + PT(29, 24, 4, 1, TRUE), + PT(60, 22, 2, 3, FALSE), + PT(16, 23, 6, 0, TRUE), + PT(32, 33, 2, 1, FALSE), + PT(51, 62, 6, 2, FALSE), + PT( 6, 19, 2, 1, TRUE), + PT(23, 56, 5, 1, TRUE), + PT(20, 13, 2, 2, TRUE), + PT(36, 59, 5, 1, TRUE), + PT(52, 59, 3, 3, FALSE), + PT(24, 7, 6, 2, FALSE), + PT(55, 29, 3, 3, TRUE), + PT(11, 41, 4, 0, FALSE), + PT(18, 30, 3, 2, TRUE), + PT(26, 36, 4, 2, FALSE), + PT(61, 40, 4, 2, FALSE), + PT(11, 18, 6, 1, TRUE), + PT(27, 58, 4, 1, FALSE), + PT(20, 19, 5, 1, FALSE), + PT(49, 56, 2, 2, TRUE), + PT(55, 43, 5, 3, FALSE), + PT(25, 30, 5, 2, FALSE), + PT(63, 27, 5, 1, FALSE), + PT(51, 31, 6, 1, TRUE), + PT(63, 21, 5, 0, TRUE), + PT( 1, 30, 3, 0, FALSE), + PT(31, 34, 3, 0, TRUE), + PT(51, 60, 6, 2, FALSE), + PT(30, 18, 4, 1, FALSE), + PT(13, 55, 5, 2, FALSE), + PT(15, 8, 6, 0, TRUE), + PT(46, 9, 6, 3, FALSE), + PT( 1, 5, 3, 3, FALSE), + PT(28, 4, 3, 3, FALSE), + PT(12, 1, 3, 2, FALSE), + PT(41, 40, 5, 3, TRUE), + PT(57, 45, 2, 2, FALSE), + PT( 9, 34, 6, 3, FALSE), + PT( 4, 55, 6, 3, TRUE), + PT(45, 47, 6, 2, TRUE), + PT(36, 35, 3, 1, TRUE), + PT( 8, 32, 6, 1, FALSE), + PT(32, 31, 6, 2, FALSE), + PT( 2, 49, 3, 0, TRUE), + PT(24, 19, 6, 3, FALSE), + PT( 6, 43, 3, 3, FALSE), + PT(14, 27, 2, 0, FALSE), + PT(47, 14, 3, 2, FALSE), + PT(17, 56, 2, 1, TRUE), + PT( 1, 55, 3, 0, TRUE), + PT(20, 17, 4, 3, FALSE), + PT(49, 61, 6, 1, TRUE), + PT(29, 27, 6, 2, FALSE), + PT(37, 49, 5, 3, TRUE), + PT(17, 10, 5, 3, TRUE), + PT(57, 23, 3, 1, TRUE), + PT( 5, 14, 2, 1, TRUE), + PT(41, 37, 4, 1, FALSE), + PT(21, 13, 4, 0, FALSE), + PT(43, 39, 4, 0, TRUE), + PT(62, 36, 4, 3, TRUE), + PT(42, 43, 2, 3, FALSE), + PT(36, 61, 2, 2, TRUE), + PT(21, 48, 6, 0, TRUE), + PT(15, 51, 4, 2, FALSE), + PT( 6, 22, 2, 1, TRUE), + PT( 6, 49, 2, 0, FALSE), + PT(46, 63, 2, 0, FALSE), + PT( 5, 13, 5, 3, TRUE), + PT(60, 31, 3, 0, TRUE), + PT(18, 19, 4, 2, FALSE), + PT(15, 51, 6, 3, FALSE), + PT(21, 59, 6, 1, TRUE), + PT( 3, 15, 5, 1, FALSE), + PT(59, 60, 5, 2, FALSE), + PT(54, 9, 5, 0, TRUE), + PT(17, 59, 4, 3, TRUE), + PT(40, 43, 6, 0, TRUE), + PT(26, 14, 5, 3, TRUE), + PT(57, 44, 6, 0, TRUE), + PT(14, 60, 6, 2, TRUE), + PT(44, 36, 6, 1, TRUE), + PT(61, 17, 5, 1, TRUE), + PT( 7, 60, 6, 3, TRUE), + PT(20, 24, 2, 1, TRUE), + PT(29, 63, 5, 3, FALSE), + PT(48, 18, 4, 2, TRUE), + PT(38, 29, 2, 0, TRUE), + PT( 7, 17, 3, 3, FALSE), + PT(52, 1, 2, 0, TRUE), + PT(11, 57, 4, 0, TRUE), + PT(41, 2, 5, 0, TRUE), + PT(21, 16, 3, 1, FALSE), + PT(48, 31, 6, 2, TRUE), + PT(60, 43, 5, 1, FALSE), + PT(48, 59, 6, 3, FALSE), + PT(32, 26, 4, 1, TRUE), + PT(50, 36, 5, 1, TRUE), + PT(21, 32, 3, 2, FALSE), + PT(37, 61, 6, 3, FALSE), + PT(45, 20, 6, 0, TRUE), + PT(24, 35, 2, 3, TRUE), + PT(24, 5, 2, 1, TRUE), + PT(52, 48, 6, 3, TRUE), + PT(14, 57, 4, 1, TRUE), + PT(29, 31, 2, 3, TRUE), + PT( 1, 21, 5, 3, TRUE), + PT(11, 62, 3, 1, TRUE), + PT(13, 25, 5, 3, FALSE), + PT(49, 56, 3, 2, FALSE), + PT(21, 52, 2, 2, TRUE), + PT(19, 25, 5, 0, TRUE), + PT(25, 20, 4, 3, TRUE), + PT(21, 24, 4, 1, TRUE), + PT(41, 12, 4, 3, TRUE), + PT(45, 14, 2, 3, TRUE), + PT(52, 24, 2, 0, FALSE), + PT(59, 30, 5, 0, TRUE), + PT(52, 44, 4, 1, FALSE), + PT(49, 8, 2, 1, TRUE), + PT(29, 24, 3, 1, FALSE), + PT(28, 11, 5, 1, FALSE), + PT(25, 30, 3, 1, FALSE), + PT(35, 39, 2, 3, TRUE), + PT(59, 14, 6, 3, TRUE), + PT(25, 43, 2, 3, FALSE), + PT(47, 8, 4, 0, TRUE), + PT(55, 2, 4, 0, FALSE), + PT(11, 50, 6, 0, FALSE), + PT(22, 5, 6, 0, FALSE), + PT(19, 5, 3, 1, FALSE), + PT( 7, 57, 3, 0, TRUE), + PT(12, 59, 5, 1, FALSE), + PT(21, 5, 6, 0, FALSE), + PT(48, 5, 3, 0, TRUE), + PT(19, 0, 2, 1, FALSE), + PT(39, 22, 5, 1, FALSE), + PT(15, 40, 4, 3, TRUE), + PT(12, 35, 5, 3, TRUE), + PT(57, 40, 5, 1, FALSE), + PT(36, 37, 3, 3, TRUE), + PT(24, 41, 2, 2, FALSE), + PT(22, 5, 3, 1, FALSE), + PT(53, 47, 4, 3, FALSE), + PT(10, 58, 5, 0, TRUE), + PT(52, 44, 6, 3, FALSE), + PT(46, 58, 2, 2, TRUE), + PT(26, 10, 5, 2, TRUE), + PT(22, 20, 5, 3, FALSE), + PT(53, 40, 5, 1, FALSE), + PT(53, 15, 2, 0, TRUE), + PT(17, 50, 3, 0, TRUE), + PT(32, 26, 5, 0, FALSE), + PT(23, 26, 5, 0, FALSE), + PT(22, 51, 4, 2, TRUE), + PT(19, 44, 5, 0, TRUE), + PT( 9, 22, 6, 1, TRUE), + PT(29, 39, 4, 3, FALSE), + PT(21, 12, 5, 3, TRUE), + PT(34, 28, 3, 0, TRUE), + PT(41, 51, 2, 0, FALSE), + PT(45, 17, 3, 1, TRUE), + PT(22, 25, 5, 3, FALSE), + PT(13, 12, 5, 0, FALSE), + PT(55, 58, 6, 2, FALSE), + PT(42, 29, 6, 3, TRUE), + PT(48, 10, 6, 3, FALSE), + PT(36, 57, 3, 1, TRUE), + PT(57, 10, 6, 1, FALSE), + PT(17, 3, 5, 2, TRUE), + PT(50, 29, 6, 0, FALSE), + PT(56, 30, 4, 3, TRUE), + PT(46, 23, 3, 0, FALSE), + PT(22, 23, 5, 1, FALSE), + PT(54, 59, 6, 0, TRUE), + PT(23, 4, 3, 0, TRUE), + PT(58, 37, 5, 2, TRUE), + PT( 0, 54, 4, 3, TRUE), + PT(37, 18, 6, 1, TRUE), + PT( 6, 10, 2, 2, FALSE), + PT(17, 5, 5, 3, TRUE), + PT( 3, 53, 5, 3, TRUE), + PT(11, 52, 5, 0, TRUE), + PT( 0, 49, 2, 1, TRUE), + PT(39, 15, 3, 2, FALSE), + PT(29, 6, 5, 2, TRUE), + PT(28, 48, 4, 3, TRUE), + PT(47, 42, 4, 3, TRUE), + PT(22, 32, 6, 0, TRUE), + PT(51, 43, 5, 1, TRUE), + PT( 5, 48, 6, 3, FALSE), + PT(41, 35, 6, 2, TRUE), + PT(16, 22, 5, 3, TRUE), + PT(45, 32, 5, 0, TRUE), + PT(55, 19, 4, 2, FALSE), + PT(45, 14, 4, 2, TRUE), + PT( 8, 10, 3, 0, FALSE), + PT(15, 3, 3, 1, TRUE), + PT(49, 12, 6, 3, TRUE), + PT(30, 52, 6, 0, TRUE), + PT(27, 14, 4, 2, TRUE), + PT(26, 7, 6, 2, FALSE), + PT(13, 60, 6, 1, TRUE), + PT( 0, 58, 6, 3, FALSE), + PT( 4, 39, 2, 1, FALSE), + PT(35, 24, 4, 2, FALSE), + PT(13, 11, 3, 0, FALSE), + PT(49, 50, 6, 3, TRUE), + PT( 0, 13, 4, 0, TRUE), + PT(50, 16, 2, 1, FALSE), + PT(38, 13, 3, 0, TRUE), + PT(41, 36, 5, 1, TRUE), + PT(61, 33, 3, 3, TRUE), + PT(30, 27, 5, 0, FALSE), + PT(13, 18, 5, 0, FALSE), + PT(53, 30, 4, 1, TRUE), + PT(10, 46, 4, 1, FALSE), + PT(39, 39, 6, 2, TRUE), + PT( 1, 14, 4, 0, FALSE), + PT(49, 57, 5, 0, TRUE), + PT(59, 36, 6, 3, FALSE), + PT(20, 16, 6, 1, TRUE), + PT(24, 44, 4, 3, FALSE), + PT( 4, 45, 2, 2, TRUE), + PT(26, 17, 6, 3, TRUE), + PT(15, 11, 2, 2, FALSE), + PT(14, 44, 5, 2, FALSE), + PT(33, 23, 5, 2, FALSE), + PT(22, 33, 6, 2, TRUE), + PT(62, 16, 2, 0, FALSE), + PT(10, 5, 3, 3, FALSE), + PT(59, 9, 2, 1, TRUE), + PT(38, 24, 3, 3, FALSE), + PT(35, 12, 3, 1, FALSE), + PT(51, 55, 3, 3, TRUE), + PT( 9, 18, 6, 2, TRUE), + PT(61, 13, 2, 2, TRUE), + PT(54, 6, 4, 2, FALSE), + PT(51, 48, 5, 0, TRUE), + PT(59, 15, 5, 0, FALSE), + PT(52, 42, 5, 2, FALSE), + PT( 2, 18, 6, 2, TRUE), + PT( 9, 34, 6, 0, TRUE), + PT(59, 49, 3, 2, FALSE), + PT(51, 34, 4, 3, TRUE), + PT(61, 52, 2, 2, TRUE), + PT(20, 34, 5, 0, FALSE), + PT(40, 16, 3, 3, FALSE), + PT(33, 49, 2, 0, FALSE), + PT(45, 22, 4, 0, TRUE), + PT(30, 5, 6, 1, TRUE), + PT(15, 48, 6, 0, TRUE), + PT(14, 26, 6, 2, TRUE), + PT(56, 46, 5, 0, FALSE), + PT(38, 55, 3, 3, FALSE), + PT(43, 19, 6, 1, TRUE), + PT(31, 30, 6, 3, TRUE), + PT(10, 40, 4, 2, FALSE), + PT(50, 28, 3, 1, FALSE), + PT(31, 63, 3, 0, TRUE), + PT(57, 57, 5, 0, TRUE), + PT(44, 27, 2, 2, FALSE), + PT(21, 42, 2, 3, TRUE), + PT(50, 15, 4, 0, TRUE), + PT(48, 33, 3, 0, FALSE), + PT(35, 42, 4, 3, TRUE), + PT(61, 7, 2, 0, FALSE), + PT(11, 63, 5, 3, TRUE), + PT(49, 2, 5, 3, FALSE), + PT( 8, 57, 5, 3, TRUE), + PT(63, 32, 3, 0, FALSE), + PT(45, 52, 2, 0, TRUE), + PT(46, 52, 2, 0, FALSE), + PT(38, 18, 4, 1, TRUE), + PT(37, 10, 6, 3, TRUE), + PT(52, 9, 4, 2, TRUE), + PT(10, 62, 2, 3, FALSE), + PT(26, 23, 2, 0, TRUE), + PT(56, 28, 4, 0, FALSE), + PT(17, 33, 4, 3, FALSE), + PT( 5, 15, 3, 0, FALSE), + PT(38, 43, 6, 1, FALSE), + PT(10, 12, 2, 3, FALSE), + PT( 3, 41, 3, 2, TRUE), + PT(41, 59, 4, 1, TRUE), + PT(22, 27, 5, 0, TRUE), + PT( 7, 9, 2, 3, TRUE), + PT(23, 44, 3, 2, FALSE), + PT(53, 51, 6, 0, FALSE), + PT(23, 18, 3, 3, FALSE), + PT(61, 26, 5, 1, TRUE), + PT(33, 29, 2, 0, FALSE), + PT(10, 8, 2, 3, TRUE), + PT(20, 60, 6, 3, FALSE), + PT(40, 54, 6, 3, FALSE), + PT(59, 32, 3, 1, TRUE), + PT(19, 34, 3, 2, TRUE), + PT(19, 58, 2, 2, TRUE), + PT( 2, 35, 5, 2, FALSE), + PT(62, 25, 2, 2, FALSE), + PT(57, 60, 3, 1, FALSE), + PT(16, 8, 3, 3, FALSE), + PT(10, 19, 5, 0, TRUE), + PT(63, 56, 5, 2, FALSE), + PT( 7, 35, 3, 3, TRUE), + PT(25, 42, 4, 2, FALSE), + PT(20, 60, 3, 3, TRUE), + PT(13, 4, 6, 3, TRUE), + PT(26, 47, 5, 0, FALSE), + PT(42, 29, 3, 3, FALSE), + PT(17, 55, 5, 0, TRUE), + PT(40, 39, 2, 1, FALSE), + PT(13, 0, 4, 3, FALSE), + PT(10, 60, 4, 3, FALSE), + PT(31, 28, 6, 1, TRUE), + PT( 4, 58, 5, 2, FALSE), + PT(36, 61, 5, 1, TRUE), + PT(38, 49, 5, 3, TRUE), + PT(19, 28, 4, 0, TRUE), + PT(62, 18, 4, 1, TRUE), + PT(54, 10, 3, 1, FALSE), + PT(45, 30, 3, 0, TRUE), + PT( 5, 31, 3, 1, TRUE), + PT(30, 10, 3, 3, TRUE), + PT(32, 8, 4, 2, FALSE), + PT(44, 12, 6, 1, TRUE), + PT(29, 31, 2, 0, TRUE), + PT(14, 18, 2, 0, FALSE), + PT(39, 18, 3, 0, TRUE), + PT(42, 19, 6, 0, TRUE), + PT(28, 4, 6, 0, FALSE), + PT(26, 56, 3, 3, TRUE), + PT(44, 53, 4, 2, TRUE), + PT( 7, 11, 6, 1, TRUE), + PT(45, 2, 3, 1, FALSE), + PT(42, 53, 6, 2, TRUE), + PT(22, 47, 2, 2, FALSE), + PT(17, 49, 6, 1, TRUE), + PT(44, 49, 3, 3, FALSE), + PT(60, 58, 4, 3, TRUE), + PT(60, 43, 2, 1, FALSE), + PT(39, 29, 2, 1, FALSE), + PT(54, 44, 5, 1, TRUE), + PT(37, 59, 6, 2, TRUE), + PT(18, 61, 4, 3, TRUE), + PT(19, 35, 3, 0, TRUE), + PT(51, 44, 4, 3, FALSE), + PT( 9, 60, 2, 1, FALSE), + PT(21, 26, 4, 1, TRUE), + PT(33, 7, 3, 1, FALSE), + PT(34, 37, 4, 0, FALSE), + PT(25, 27, 5, 2, FALSE), + PT(58, 25, 6, 2, TRUE), + PT( 5, 38, 3, 2, TRUE), + PT(35, 34, 4, 2, TRUE), + PT(14, 30, 2, 0, TRUE), + PT(19, 48, 2, 1, FALSE), + PT(44, 34, 4, 2, TRUE), + PT(10, 29, 3, 0, FALSE), + PT(35, 62, 3, 2, TRUE), + PT( 2, 40, 4, 2, TRUE), + PT(33, 14, 4, 0, FALSE), + PT(33, 34, 6, 3, TRUE), + PT(24, 51, 4, 3, TRUE), + PT(35, 35, 6, 0, TRUE), + PT(36, 26, 3, 1, FALSE), + PT(62, 37, 4, 2, FALSE), + PT(36, 1, 3, 0, FALSE), + PT(52, 16, 4, 1, FALSE), + PT( 7, 0, 6, 3, TRUE), + PT( 6, 32, 4, 0, FALSE), + PT(58, 2, 5, 1, TRUE), + PT( 7, 44, 5, 2, FALSE), + PT( 9, 47, 5, 1, FALSE), + PT( 1, 50, 5, 2, FALSE), + PT( 0, 53, 2, 1, TRUE), + PT(43, 60, 3, 3, TRUE), + PT(54, 55, 3, 3, FALSE), + PT(32, 53, 3, 2, TRUE), + PT(12, 7, 6, 1, TRUE), + PT(22, 8, 2, 1, FALSE), + PT(63, 54, 2, 0, TRUE), + PT(11, 31, 5, 2, TRUE), + PT(33, 32, 6, 1, TRUE), + PT(23, 26, 5, 3, FALSE), + PT(22, 1, 5, 3, TRUE), + PT(47, 28, 6, 2, FALSE), + PT(41, 49, 5, 3, FALSE), + PT(59, 56, 6, 0, TRUE), + PT(13, 22, 2, 1, FALSE), + PT( 7, 41, 4, 2, FALSE), + PT(51, 60, 6, 2, FALSE), + PT(62, 30, 3, 0, FALSE), + PT(48, 2, 6, 2, FALSE), + PT(42, 52, 3, 1, TRUE), + PT(46, 35, 3, 0, FALSE), + PT(52, 0, 3, 3, TRUE), + PT(32, 14, 5, 0, FALSE), + PT(21, 51, 6, 3, TRUE), + PT(39, 53, 4, 1, TRUE), + PT(55, 62, 2, 0, TRUE), + PT(50, 46, 6, 3, FALSE), + PT(58, 2, 5, 1, TRUE), + PT( 0, 54, 3, 2, TRUE), + PT(19, 41, 2, 3, FALSE), + PT( 8, 43, 6, 3, TRUE), + PT( 8, 2, 4, 3, TRUE), + PT(50, 45, 6, 2, FALSE), + PT(48, 54, 5, 0, TRUE), + PT(46, 16, 2, 1, FALSE), + PT(60, 46, 5, 1, FALSE), + PT( 4, 51, 6, 0, FALSE), + PT(63, 1, 4, 1, FALSE), + PT(55, 20, 3, 2, TRUE), + PT(39, 0, 5, 3, TRUE), + PT(12, 57, 4, 3, FALSE), + PT(39, 4, 4, 0, TRUE), + PT(25, 8, 3, 2, TRUE), + PT( 1, 4, 3, 3, FALSE), + PT(39, 27, 5, 1, TRUE), + PT(49, 23, 3, 3, TRUE), + PT( 7, 1, 5, 2, TRUE), + PT(46, 59, 3, 3, TRUE), + PT(52, 36, 6, 0, TRUE), + PT(50, 43, 4, 2, FALSE), + PT(14, 7, 3, 3, FALSE), + PT(15, 51, 2, 0, FALSE), + PT(22, 33, 6, 1, FALSE), + PT(57, 2, 3, 1, FALSE), + PT(51, 61, 4, 1, FALSE), + PT(12, 37, 3, 1, FALSE), + PT(41, 41, 5, 0, FALSE), + PT(58, 50, 4, 3, FALSE), + PT(11, 19, 4, 1, FALSE), + PT(31, 15, 3, 2, FALSE), + PT( 4, 44, 4, 0, FALSE), + PT(57, 26, 3, 1, TRUE), + PT(26, 42, 3, 3, TRUE), + PT(36, 19, 3, 1, FALSE), + PT(49, 59, 6, 1, TRUE), + PT(57, 35, 5, 0, FALSE), + PT(49, 7, 6, 0, TRUE), + PT(31, 16, 4, 0, FALSE), + PT(41, 23, 6, 1, FALSE), + PT(38, 59, 5, 2, TRUE), + PT( 2, 60, 3, 2, FALSE), + PT(14, 0, 4, 0, FALSE), + PT(20, 62, 6, 3, TRUE), + PT( 1, 15, 5, 2, TRUE), + PT( 6, 18, 4, 3, TRUE), + PT(48, 19, 3, 0, TRUE), + PT( 0, 51, 5, 1, FALSE), + PT(12, 7, 4, 3, TRUE), + PT(17, 58, 3, 2, FALSE), + PT(21, 10, 2, 1, TRUE), + PT(31, 13, 5, 1, FALSE), + PT(55, 7, 5, 1, FALSE), + PT(52, 53, 6, 2, FALSE), + PT(40, 22, 4, 3, TRUE), + PT( 6, 2, 6, 3, FALSE), + PT( 9, 35, 6, 0, FALSE), + PT(20, 2, 5, 0, FALSE), + PT(57, 50, 6, 2, FALSE), + PT(36, 53, 2, 1, FALSE), + PT(18, 34, 4, 3, FALSE), + PT( 9, 7, 6, 1, TRUE), + PT(15, 62, 3, 3, FALSE), + PT( 0, 60, 6, 1, TRUE), + PT(16, 55, 2, 2, FALSE), + PT(58, 3, 4, 2, TRUE), + PT(45, 30, 4, 2, FALSE), + PT(54, 54, 4, 3, FALSE), + PT(31, 60, 3, 1, FALSE), + PT(55, 51, 4, 2, TRUE), + PT(35, 19, 3, 3, TRUE), + PT(51, 13, 2, 1, TRUE), + PT(37, 48, 3, 3, FALSE), + PT(23, 3, 3, 0, FALSE), + PT(24, 24, 2, 2, FALSE), + PT(48, 7, 4, 1, FALSE), + PT(62, 51, 4, 0, TRUE), + PT(20, 55, 2, 3, FALSE), + PT(22, 0, 2, 1, FALSE), + PT(44, 18, 5, 3, TRUE), + PT(37, 63, 3, 3, FALSE), + PT(36, 25, 2, 3, FALSE), + PT(22, 15, 6, 2, TRUE), + PT(45, 16, 2, 0, TRUE), + PT(36, 42, 5, 0, FALSE), + PT(25, 37, 5, 3, FALSE), + PT(12, 22, 3, 3, TRUE), + PT(56, 33, 6, 3, FALSE), + PT(61, 26, 5, 3, TRUE), + PT(59, 50, 2, 1, FALSE), + PT(54, 19, 5, 0, TRUE), + PT(14, 48, 6, 0, TRUE), + PT(25, 7, 5, 3, TRUE), + PT(37, 35, 5, 0, FALSE), + PT(32, 8, 5, 0, TRUE), + PT(42, 0, 6, 0, FALSE), + PT(48, 56, 4, 1, TRUE), + PT(30, 15, 3, 3, TRUE), + PT(59, 27, 6, 0, FALSE), + PT(58, 55, 5, 3, TRUE), + PT(57, 55, 6, 2, TRUE), + PT(57, 45, 5, 3, TRUE), + PT(31, 46, 3, 3, FALSE), + PT(26, 43, 3, 3, FALSE), + PT(20, 23, 4, 0, FALSE), + PT(47, 3, 2, 0, TRUE), + PT(29, 0, 6, 0, FALSE), + PT(23, 43, 3, 2, TRUE), + PT(53, 40, 4, 2, TRUE), + PT(59, 15, 2, 0, TRUE), + PT( 9, 4, 5, 3, FALSE), + PT(35, 17, 3, 3, FALSE), + PT(19, 55, 3, 3, FALSE), + PT(55, 55, 3, 3, FALSE), + PT( 7, 1, 6, 1, FALSE), + PT(20, 6, 6, 1, FALSE), + PT(17, 12, 5, 3, FALSE), + PT(54, 46, 4, 2, FALSE), + PT(21, 42, 3, 2, FALSE), + PT(34, 21, 6, 2, FALSE), + PT(44, 30, 6, 2, TRUE), + PT(34, 39, 6, 1, TRUE), + PT(25, 63, 5, 2, TRUE), + PT(33, 51, 2, 2, TRUE), + PT(38, 26, 2, 0, TRUE), + PT(22, 62, 2, 1, FALSE), + PT(43, 36, 2, 2, TRUE), + PT(60, 15, 5, 2, TRUE), + PT(49, 21, 6, 3, FALSE), + PT(63, 36, 3, 2, TRUE), + PT(37, 1, 6, 3, TRUE), + PT(51, 22, 3, 1, FALSE), + PT(31, 14, 2, 0, FALSE), + PT(47, 11, 2, 1, FALSE), + PT(42, 26, 4, 2, TRUE), + PT(23, 10, 6, 2, TRUE), + PT( 9, 40, 6, 2, TRUE), + PT( 2, 19, 6, 3, FALSE), + PT(52, 47, 2, 3, TRUE), + PT( 3, 4, 6, 0, TRUE), + PT(62, 38, 2, 0, TRUE), + PT(53, 51, 6, 0, TRUE), + PT(34, 23, 4, 1, TRUE), + PT(29, 5, 5, 1, TRUE), + PT(46, 39, 4, 0, FALSE), + PT( 3, 43, 3, 2, TRUE), + PT( 1, 25, 3, 3, FALSE), + PT(14, 5, 3, 0, FALSE), + PT(22, 37, 2, 3, TRUE), + PT( 2, 40, 3, 0, FALSE), + PT(25, 11, 4, 2, FALSE), + PT(62, 53, 2, 3, FALSE), + PT(46, 41, 4, 2, TRUE), + PT(62, 56, 3, 3, FALSE), + PT(58, 47, 2, 1, FALSE), + PT(20, 23, 5, 2, TRUE), + PT(17, 18, 6, 0, FALSE), + PT(21, 49, 3, 0, FALSE), + PT( 8, 11, 5, 0, TRUE), + PT(45, 0, 6, 1, TRUE), + PT(44, 6, 3, 1, FALSE), + PT(20, 28, 5, 3, FALSE), + PT( 4, 8, 2, 1, FALSE), + PT(27, 43, 5, 2, TRUE), + PT(42, 55, 6, 1, TRUE), + PT(16, 39, 5, 2, FALSE), + PT(29, 14, 6, 2, FALSE), + PT(32, 2, 2, 1, FALSE), + PT(30, 26, 5, 3, FALSE), + PT( 7, 11, 2, 0, FALSE), + PT(54, 30, 6, 1, TRUE), + PT(43, 40, 3, 1, TRUE), + PT(49, 37, 3, 3, TRUE), + PT(56, 58, 5, 3, TRUE), + PT(57, 48, 5, 3, TRUE), + PT(18, 9, 2, 2, FALSE), + PT(14, 8, 3, 0, TRUE), + PT( 0, 13, 5, 2, FALSE), + PT(27, 14, 6, 2, FALSE), + PT(17, 37, 2, 2, TRUE), + PT(12, 45, 4, 3, FALSE), + PT(54, 44, 2, 3, FALSE), + PT(49, 49, 5, 2, FALSE), + PT( 3, 26, 2, 3, FALSE), + PT(28, 50, 2, 2, FALSE), + PT(10, 62, 6, 3, FALSE), + PT(51, 27, 4, 3, TRUE), + PT(31, 50, 3, 0, FALSE), + PT(51, 38, 6, 1, TRUE), + PT(26, 19, 3, 1, FALSE), + PT(15, 52, 3, 2, FALSE), + PT(53, 44, 5, 3, TRUE), + PT(56, 3, 3, 0, FALSE), + PT(21, 15, 4, 3, TRUE), + PT(49, 41, 4, 0, FALSE), + PT(40, 14, 5, 0, FALSE), + PT(49, 44, 5, 3, FALSE), + PT(21, 25, 3, 1, TRUE), + PT(16, 3, 5, 3, TRUE), + PT(46, 42, 6, 1, FALSE), + PT(42, 39, 3, 1, TRUE), + PT(54, 4, 3, 3, FALSE), + PT(59, 4, 4, 0, TRUE), + PT( 7, 47, 3, 0, TRUE), + PT(39, 29, 3, 2, TRUE), + PT(60, 61, 5, 3, FALSE), + PT(37, 8, 6, 1, FALSE), + PT(59, 52, 5, 1, FALSE), + PT(12, 16, 2, 1, TRUE), + PT(37, 53, 3, 1, FALSE), + PT(47, 25, 5, 0, FALSE), + PT(23, 0, 5, 1, TRUE), + PT(10, 28, 2, 3, TRUE), + PT(10, 17, 3, 1, TRUE), + PT(53, 19, 6, 3, TRUE), + PT(41, 28, 5, 0, FALSE), + PT(12, 49, 6, 2, TRUE), + PT(60, 16, 3, 1, FALSE), + PT(27, 58, 5, 2, TRUE), + PT(58, 28, 3, 0, FALSE), + PT(34, 16, 5, 2, TRUE), + PT(28, 60, 2, 1, FALSE), + PT(23, 24, 5, 1, FALSE), + PT(11, 43, 5, 3, TRUE), + PT(45, 4, 5, 3, FALSE), + PT(60, 19, 4, 1, TRUE), + PT( 1, 28, 5, 3, FALSE), + PT(20, 22, 4, 1, FALSE), + PT(12, 36, 2, 1, TRUE), + PT(53, 55, 6, 2, FALSE), + PT(27, 48, 3, 3, FALSE), + PT(58, 28, 4, 0, FALSE), + PT( 6, 6, 6, 3, FALSE), + PT( 9, 21, 3, 1, FALSE), + PT(27, 26, 4, 3, TRUE), + PT(15, 51, 6, 2, TRUE), + PT(55, 6, 4, 1, TRUE), + PT(58, 18, 3, 2, TRUE), + PT( 0, 22, 5, 0, TRUE), + PT(14, 29, 6, 2, TRUE), + PT(63, 56, 2, 3, FALSE), + PT(42, 60, 6, 2, FALSE), + PT(19, 50, 2, 0, FALSE), + PT(23, 44, 6, 3, TRUE), + PT(41, 42, 3, 3, FALSE), + PT(53, 47, 5, 2, TRUE), + PT(60, 42, 2, 0, TRUE), + PT(40, 19, 4, 0, TRUE), + PT(25, 30, 6, 2, FALSE), + PT(12, 6, 5, 2, TRUE), + PT( 9, 4, 3, 2, FALSE), + PT(29, 47, 4, 3, FALSE), + PT(57, 7, 2, 3, FALSE), + PT(20, 4, 5, 2, TRUE), + PT(58, 47, 5, 3, FALSE), + PT(41, 21, 6, 2, TRUE), + PT(36, 2, 6, 3, FALSE), + PT(63, 2, 3, 1, FALSE), + PT(15, 24, 4, 2, FALSE), + PT(22, 29, 3, 0, TRUE), + PT(20, 22, 2, 0, FALSE), + PT(41, 27, 2, 1, TRUE), + PT(21, 14, 3, 0, TRUE), + PT(58, 46, 5, 1, TRUE), + PT( 8, 48, 2, 2, TRUE), + PT(53, 22, 6, 0, FALSE), + PT(46, 24, 6, 2, TRUE), + PT(59, 11, 3, 2, FALSE), + PT(58, 24, 2, 1, TRUE), + PT(41, 19, 3, 3, FALSE), + PT(32, 19, 4, 3, TRUE), + PT( 4, 29, 6, 2, FALSE), + PT( 0, 56, 3, 0, TRUE), + PT( 8, 57, 6, 1, FALSE), + PT(32, 16, 4, 3, FALSE), + PT( 8, 2, 5, 0, FALSE), + PT(63, 15, 2, 3, FALSE), + PT(48, 31, 3, 0, TRUE), + PT(32, 45, 2, 0, FALSE), + PT(56, 23, 3, 2, FALSE), + PT(24, 49, 4, 3, TRUE), + PT(51, 56, 6, 0, FALSE), + PT(22, 51, 4, 1, TRUE), + PT( 0, 1, 6, 3, FALSE), + PT(13, 2, 4, 1, TRUE), + PT(57, 4, 3, 3, TRUE), + PT(14, 48, 4, 2, FALSE), + PT( 6, 1, 5, 2, FALSE), + PT(52, 51, 6, 2, TRUE), + PT(22, 52, 5, 3, FALSE), + PT(50, 22, 4, 2, FALSE), + PT(38, 57, 6, 2, FALSE), + PT(31, 60, 3, 2, TRUE), + PT(40, 29, 6, 3, TRUE), + PT(23, 21, 5, 1, TRUE), + PT(39, 57, 6, 0, FALSE), + PT(11, 27, 3, 0, FALSE), + PT(53, 32, 5, 2, TRUE), + PT(11, 53, 3, 2, FALSE), + PT( 3, 14, 4, 0, TRUE), + PT( 6, 12, 4, 0, FALSE), + PT( 2, 24, 6, 2, FALSE), + PT(30, 54, 5, 2, TRUE), + PT(22, 12, 3, 0, TRUE), + PT(37, 9, 5, 2, FALSE), + PT(55, 5, 5, 3, FALSE), + PT(46, 43, 5, 2, FALSE), + PT(36, 26, 2, 2, FALSE), + PT(39, 4, 2, 0, FALSE), + PT(50, 56, 6, 1, TRUE), + PT(55, 21, 6, 2, TRUE), + PT(17, 63, 3, 2, TRUE), + PT(35, 35, 3, 3, TRUE), + PT(41, 63, 3, 2, TRUE), + PT(26, 60, 5, 1, TRUE), + PT(27, 44, 5, 2, FALSE), + PT(56, 59, 6, 3, FALSE), + PT( 4, 19, 6, 1, TRUE), + PT(44, 20, 2, 1, FALSE), + PT(26, 9, 3, 1, TRUE), + PT(54, 17, 4, 2, FALSE), + PT(58, 63, 2, 0, TRUE), + PT( 1, 14, 5, 1, TRUE), + PT(59, 3, 5, 1, FALSE), + PT( 8, 13, 5, 1, TRUE), + PT(43, 19, 4, 3, TRUE), + PT(58, 60, 3, 2, FALSE), + PT(58, 21, 5, 1, FALSE), + PT(36, 0, 2, 3, TRUE), + PT(62, 10, 2, 2, TRUE), + PT(12, 41, 5, 2, TRUE), + PT(31, 21, 6, 0, FALSE), + PT(53, 24, 3, 0, TRUE), + PT(61, 55, 6, 3, TRUE), + PT(18, 56, 3, 1, TRUE), + PT(59, 2, 4, 0, FALSE), + PT( 8, 33, 3, 0, TRUE), + PT(46, 54, 3, 2, TRUE), + PT(21, 61, 4, 2, FALSE), + PT(34, 12, 4, 3, TRUE), + PT(54, 63, 6, 1, TRUE), + PT(51, 18, 2, 0, TRUE), + PT(26, 25, 3, 3, TRUE), + PT(43, 36, 2, 1, FALSE), + PT(17, 42, 3, 0, FALSE), + PT(37, 50, 5, 1, FALSE), + PT(44, 26, 2, 1, FALSE), + PT(38, 6, 2, 0, FALSE), + PT(17, 41, 6, 1, TRUE), + PT(44, 9, 2, 2, FALSE), + PT(43, 18, 5, 1, TRUE), + PT(29, 3, 4, 2, FALSE), + PT( 0, 18, 2, 2, TRUE), + PT(34, 61, 4, 3, FALSE), + PT(21, 55, 3, 1, FALSE), + PT(15, 18, 6, 3, TRUE), + PT(36, 1, 3, 0, FALSE), + PT(42, 23, 2, 1, TRUE), + PT(20, 59, 5, 0, TRUE), + PT(42, 25, 6, 1, FALSE), + PT(45, 23, 2, 3, TRUE), + PT(11, 44, 6, 1, TRUE), + PT( 7, 45, 6, 2, FALSE), + PT( 7, 56, 3, 2, TRUE), + PT(31, 54, 4, 1, FALSE), + PT(17, 10, 2, 3, TRUE), + PT(20, 17, 2, 1, TRUE), + PT(42, 23, 4, 2, TRUE), + PT( 1, 58, 3, 2, FALSE), + PT(38, 39, 6, 0, FALSE), + PT(45, 59, 6, 2, TRUE), + PT(58, 48, 6, 2, FALSE), + PT( 6, 58, 3, 2, FALSE), + PT(45, 5, 2, 1, TRUE), + PT(33, 50, 2, 1, FALSE), + PT(62, 30, 5, 2, FALSE), + PT(58, 63, 5, 2, TRUE), + PT(32, 42, 6, 2, FALSE), + PT(38, 3, 3, 1, FALSE), + PT(25, 39, 5, 3, FALSE), + PT(49, 4, 4, 3, FALSE), + PT(42, 63, 6, 0, FALSE), + PT(37, 35, 5, 1, FALSE), + PT( 8, 8, 6, 2, TRUE), + PT(44, 48, 3, 3, FALSE), + PT( 8, 5, 3, 0, FALSE), + PT( 6, 9, 5, 2, TRUE), + PT(25, 0, 4, 3, TRUE), + PT(13, 16, 3, 0, TRUE), + PT(28, 0, 2, 1, TRUE), + PT(61, 11, 4, 2, FALSE), + PT(46, 31, 2, 3, FALSE), + PT(61, 24, 6, 2, FALSE), + PT(18, 30, 2, 2, TRUE), + PT(21, 57, 4, 2, TRUE), + PT(51, 15, 2, 3, TRUE), + PT(26, 28, 3, 1, TRUE), + PT(55, 41, 3, 1, TRUE), + PT(59, 56, 2, 1, FALSE), + PT(29, 34, 6, 2, FALSE), + PT(38, 10, 6, 0, TRUE), + PT(22, 45, 2, 1, TRUE), + PT(13, 32, 4, 3, TRUE), + PT(36, 29, 2, 3, FALSE), + PT(46, 43, 3, 0, FALSE), + PT(22, 42, 3, 1, TRUE), + PT(36, 23, 6, 3, FALSE), + PT( 2, 5, 5, 1, TRUE), + PT(55, 26, 2, 3, TRUE), + PT(17, 61, 5, 2, FALSE), + PT(30, 47, 4, 1, FALSE), + PT(44, 41, 3, 1, FALSE), + PT(47, 4, 4, 2, TRUE), + PT(54, 12, 6, 2, TRUE), + PT(48, 62, 2, 1, FALSE), + PT(17, 48, 6, 3, TRUE), + PT(18, 33, 5, 3, FALSE), + PT(33, 48, 2, 3, TRUE), + PT(44, 61, 4, 2, FALSE), + PT(17, 35, 2, 2, FALSE), + PT(26, 50, 2, 3, TRUE), + PT(57, 39, 3, 0, FALSE), + PT(15, 36, 3, 0, TRUE), + PT( 0, 61, 6, 3, TRUE), + PT(44, 60, 3, 2, FALSE), + PT(11, 57, 4, 1, TRUE), + PT(14, 4, 3, 3, TRUE), + PT(28, 49, 2, 2, FALSE), + PT( 0, 4, 2, 2, TRUE), + PT(38, 42, 5, 1, FALSE), + PT(32, 37, 5, 1, FALSE), + PT(11, 60, 6, 1, TRUE), + PT(17, 11, 5, 3, FALSE), + PT(55, 34, 5, 3, FALSE), + PT(14, 34, 4, 3, FALSE), + PT(24, 45, 4, 3, TRUE), + PT( 6, 12, 3, 2, FALSE), + PT(38, 24, 5, 3, TRUE), + PT(58, 1, 5, 1, FALSE), + PT(47, 49, 6, 2, FALSE), + PT(31, 52, 3, 1, FALSE), + PT(49, 5, 2, 0, FALSE), + PT(46, 23, 6, 2, FALSE), + PT(24, 34, 4, 1, TRUE), + PT(35, 33, 6, 1, FALSE), + PT( 7, 8, 4, 1, FALSE), + PT(38, 28, 4, 1, FALSE), + PT(49, 18, 5, 3, TRUE), + PT( 8, 31, 2, 0, FALSE), + PT(39, 21, 5, 1, FALSE), + PT(31, 11, 4, 3, FALSE), + PT(47, 20, 6, 2, TRUE), + PT(36, 31, 4, 3, FALSE), + PT(59, 35, 6, 1, TRUE), + PT(32, 62, 5, 2, TRUE), + PT(23, 12, 2, 2, TRUE), + PT(19, 57, 3, 1, FALSE), + PT(48, 20, 4, 2, TRUE), + PT( 9, 7, 2, 3, TRUE), + PT(56, 56, 3, 3, TRUE), + PT(41, 36, 4, 3, TRUE), + PT(23, 39, 5, 0, FALSE), + PT(27, 18, 5, 1, FALSE), + PT(43, 61, 5, 2, TRUE), + PT(25, 52, 3, 2, FALSE), + PT( 1, 29, 2, 0, FALSE), + PT( 8, 57, 2, 0, TRUE), + PT(14, 54, 3, 1, TRUE), + PT(38, 19, 2, 0, FALSE), + PT(22, 40, 3, 3, FALSE), + PT(60, 40, 2, 3, TRUE), + PT(62, 57, 6, 2, FALSE), + PT(10, 3, 5, 3, FALSE), + PT(55, 26, 2, 1, TRUE), + PT(43, 51, 4, 3, FALSE), + PT(19, 44, 4, 0, TRUE), + PT(37, 20, 2, 0, FALSE), + PT(22, 11, 6, 2, TRUE), + PT(29, 53, 6, 1, TRUE), + PT(33, 8, 6, 1, TRUE), + PT(40, 33, 3, 1, FALSE), + PT(18, 12, 3, 1, TRUE), + PT(54, 42, 3, 0, TRUE), + PT(44, 43, 4, 1, TRUE), + PT( 1, 15, 4, 3, FALSE), + PT(23, 12, 3, 0, FALSE), + PT( 9, 15, 2, 0, TRUE), + PT(43, 36, 3, 2, FALSE), + PT( 9, 9, 2, 2, TRUE), + PT(54, 8, 2, 1, TRUE), + PT(32, 57, 4, 0, TRUE), + PT( 0, 58, 3, 3, TRUE), + PT(43, 54, 6, 0, TRUE), + PT( 2, 55, 2, 1, TRUE), + PT( 4, 52, 6, 2, TRUE), + PT(55, 61, 3, 1, FALSE), + PT(23, 61, 2, 1, TRUE), + PT(43, 54, 5, 3, TRUE), + PT(19, 30, 2, 1, TRUE), + PT(62, 17, 6, 1, TRUE), + PT(39, 58, 5, 2, TRUE), + PT(30, 49, 3, 1, FALSE), + PT( 3, 3, 5, 2, TRUE), + PT(37, 55, 3, 3, TRUE), + PT(17, 1, 4, 1, FALSE), + PT(28, 18, 2, 3, TRUE), + PT(48, 58, 6, 0, FALSE), + PT(23, 29, 5, 0, TRUE), + PT(14, 19, 4, 3, TRUE), + PT(26, 46, 4, 2, FALSE), + PT(45, 0, 3, 2, FALSE), + PT(23, 40, 3, 2, TRUE), + PT( 9, 31, 5, 3, FALSE), + PT(26, 45, 4, 3, FALSE), + PT(10, 19, 6, 1, FALSE), + PT(62, 0, 4, 3, TRUE), + PT(11, 59, 6, 0, FALSE), + PT( 8, 58, 5, 2, TRUE), + PT(34, 18, 3, 3, FALSE), + PT(52, 29, 5, 1, TRUE), + PT(38, 34, 6, 2, TRUE), + PT(23, 44, 2, 3, TRUE), + PT(41, 19, 5, 2, TRUE), + PT(45, 16, 2, 0, FALSE), + PT(32, 49, 4, 1, TRUE), + PT(30, 51, 3, 0, FALSE), + PT(51, 6, 5, 2, TRUE), + PT(38, 20, 4, 3, TRUE), + PT(34, 29, 5, 1, FALSE), + PT(45, 6, 3, 0, FALSE), + PT( 7, 9, 5, 3, FALSE), + PT(33, 21, 5, 3, FALSE), + PT(33, 56, 4, 1, TRUE), + PT(53, 11, 6, 2, FALSE), + PT(36, 11, 4, 1, FALSE), + PT(30, 1, 2, 3, TRUE), + PT(11, 36, 2, 0, TRUE), + PT(23, 7, 4, 0, FALSE), + PT(20, 37, 6, 1, FALSE), + PT(26, 14, 5, 3, TRUE), + PT(53, 23, 3, 3, TRUE), + PT(12, 8, 4, 0, TRUE), + PT(48, 53, 3, 3, TRUE), + PT(12, 11, 4, 0, FALSE), + PT( 4, 16, 2, 0, TRUE), + PT(53, 17, 3, 3, FALSE), + PT(51, 61, 2, 3, FALSE), + PT(30, 43, 3, 2, TRUE), + PT(26, 25, 2, 0, FALSE), + PT( 4, 6, 4, 1, FALSE), + PT( 3, 61, 4, 2, FALSE), + PT(42, 14, 6, 2, TRUE), + PT( 3, 62, 2, 3, TRUE), + PT(11, 24, 6, 3, FALSE), + PT(61, 13, 4, 3, FALSE), + PT(53, 18, 4, 0, FALSE), + PT(31, 13, 2, 3, FALSE), + PT(35, 50, 3, 1, FALSE), + PT( 0, 61, 4, 3, FALSE), + PT(48, 25, 6, 3, FALSE), + PT(18, 14, 4, 1, TRUE), + PT( 1, 35, 5, 0, FALSE), + PT(59, 49, 2, 0, TRUE), + PT(45, 28, 6, 3, FALSE), + PT(42, 5, 2, 3, FALSE), + PT(20, 14, 6, 0, FALSE), + PT(58, 55, 3, 0, TRUE), + PT(31, 48, 4, 2, TRUE), + PT(16, 38, 5, 3, TRUE), + PT(34, 17, 3, 3, TRUE), + PT(46, 43, 3, 3, FALSE), + PT(22, 22, 4, 0, TRUE), + PT(50, 24, 6, 2, TRUE), + PT(35, 50, 3, 1, FALSE), + PT(61, 13, 3, 0, TRUE), + PT(57, 9, 4, 1, TRUE), + PT(48, 46, 4, 2, FALSE), + PT(30, 15, 4, 2, FALSE), + PT( 9, 33, 6, 0, TRUE), + PT( 5, 3, 2, 0, TRUE), + PT( 5, 34, 5, 1, FALSE), + PT( 3, 7, 6, 3, TRUE), + PT( 4, 8, 2, 1, TRUE), + PT( 5, 16, 6, 2, FALSE), + PT(55, 20, 5, 0, TRUE), + PT(10, 36, 6, 1, FALSE), + PT(52, 30, 3, 1, TRUE), + PT(18, 23, 5, 3, FALSE), + PT( 1, 2, 2, 1, TRUE), + PT(10, 12, 2, 0, TRUE), + PT( 2, 20, 2, 1, TRUE), + PT(13, 37, 4, 1, TRUE), + PT( 0, 7, 3, 1, FALSE), + PT(28, 40, 6, 2, TRUE), + PT( 8, 14, 5, 2, FALSE), + PT(27, 60, 2, 2, TRUE), + PT(28, 25, 3, 2, TRUE), + PT(50, 19, 3, 1, FALSE), + PT(28, 0, 6, 3, TRUE), + PT(34, 27, 6, 2, TRUE), + PT(57, 62, 2, 2, FALSE), + PT(50, 6, 6, 0, TRUE), + PT(23, 5, 5, 1, TRUE), + PT( 1, 15, 4, 0, FALSE), + PT(30, 15, 6, 2, FALSE), + PT(24, 3, 3, 3, TRUE), + PT(43, 0, 2, 2, FALSE), + PT(21, 58, 6, 0, FALSE), + PT(37, 48, 4, 0, TRUE), + PT(11, 0, 6, 3, TRUE), + PT(36, 55, 3, 2, TRUE), + PT(41, 33, 2, 3, FALSE), + PT(36, 15, 5, 2, FALSE), + PT(62, 21, 6, 3, FALSE), + PT(60, 45, 4, 1, TRUE), + PT(61, 60, 2, 3, TRUE), + PT(26, 28, 2, 1, TRUE), + PT(10, 41, 4, 1, FALSE), + PT(37, 63, 4, 3, FALSE), + PT(59, 57, 5, 3, TRUE), + PT(29, 8, 2, 3, FALSE), + PT(11, 25, 2, 2, FALSE), + PT(18, 1, 5, 2, FALSE), + PT(53, 17, 5, 1, FALSE), + PT( 2, 0, 2, 1, TRUE), + PT(57, 42, 6, 2, TRUE), + PT( 7, 26, 2, 0, TRUE), + PT(36, 14, 3, 3, FALSE), + PT(14, 44, 2, 2, TRUE), + PT( 8, 49, 3, 1, TRUE), + PT(33, 29, 4, 3, FALSE), + PT(29, 28, 5, 1, FALSE), + PT(29, 36, 2, 1, TRUE), + PT( 1, 0, 3, 0, FALSE), + PT(40, 42, 6, 3, TRUE), + PT(21, 15, 2, 1, TRUE), + PT(16, 50, 6, 3, FALSE), + PT(34, 19, 6, 0, TRUE), + PT(19, 5, 3, 3, FALSE), + PT(23, 53, 6, 2, TRUE), + PT(59, 14, 4, 2, FALSE), + PT(53, 58, 3, 2, TRUE), + PT(27, 54, 3, 1, TRUE), + PT( 3, 29, 4, 2, FALSE), + PT(15, 22, 6, 0, FALSE), + PT(45, 9, 4, 2, TRUE), + PT( 5, 33, 2, 1, TRUE), + PT(10, 39, 6, 3, FALSE), + PT( 4, 13, 3, 2, FALSE), + PT( 6, 62, 4, 0, TRUE), + PT(42, 39, 6, 1, TRUE), + PT(40, 14, 2, 2, TRUE), + PT(11, 23, 3, 2, TRUE), + PT(29, 50, 5, 2, TRUE), + PT( 8, 61, 5, 0, TRUE), + PT(33, 50, 2, 3, TRUE), + PT(51, 49, 4, 1, FALSE), + PT(14, 3, 4, 0, TRUE), + PT(13, 11, 2, 3, FALSE), + PT(62, 42, 5, 3, FALSE), + PT(25, 54, 5, 1, FALSE), + PT(13, 0, 2, 2, FALSE), + PT(34, 7, 6, 3, FALSE), + PT(10, 9, 2, 2, TRUE), + PT(20, 16, 4, 1, FALSE), + PT( 7, 22, 5, 2, FALSE), + PT(54, 19, 2, 2, TRUE), + PT( 9, 47, 3, 1, TRUE), + PT(32, 59, 5, 3, FALSE), + PT(58, 58, 2, 3, FALSE), + PT(13, 21, 5, 1, FALSE), + PT(57, 19, 5, 1, TRUE), + PT(11, 1, 5, 1, FALSE), + PT(19, 23, 3, 3, FALSE), + PT( 8, 23, 3, 3, FALSE), + PT(12, 15, 6, 2, FALSE), + PT(31, 49, 2, 1, FALSE), + PT( 7, 58, 3, 2, TRUE), + PT(53, 30, 2, 1, FALSE), + PT(36, 44, 2, 2, TRUE), + PT(14, 33, 3, 0, TRUE), + PT(52, 59, 6, 1, TRUE), + PT(25, 15, 5, 0, FALSE), + PT(16, 47, 5, 3, FALSE), + PT(35, 39, 6, 0, TRUE), + PT(57, 46, 3, 0, FALSE), + PT(60, 63, 4, 2, FALSE), + PT( 7, 35, 6, 0, FALSE), + PT(40, 19, 6, 2, TRUE), + PT(19, 10, 2, 0, FALSE), + PT(53, 25, 6, 1, TRUE), + PT(35, 40, 5, 0, TRUE), + PT(19, 47, 3, 1, FALSE), + PT(58, 25, 2, 2, FALSE), + PT(55, 54, 4, 3, FALSE), + PT(32, 59, 2, 2, TRUE), + PT(55, 57, 2, 0, FALSE), + PT(60, 33, 6, 2, FALSE), + PT(28, 56, 6, 0, FALSE), + PT(21, 7, 4, 3, FALSE), + PT(39, 33, 3, 0, TRUE), + PT(24, 17, 4, 1, TRUE), + PT(48, 40, 6, 3, TRUE), + PT(50, 45, 3, 3, TRUE), + PT(44, 63, 6, 0, FALSE), + PT(29, 47, 4, 3, FALSE), + PT( 1, 17, 3, 2, FALSE), + PT(59, 15, 2, 1, FALSE), + PT(42, 23, 4, 3, TRUE), + PT( 5, 0, 3, 1, TRUE), + PT(37, 28, 6, 1, FALSE), + PT( 4, 34, 5, 2, TRUE), + PT(16, 15, 4, 2, TRUE), + PT(13, 57, 6, 0, FALSE), + PT(11, 46, 4, 3, TRUE), + PT(45, 52, 2, 2, TRUE), + PT(62, 48, 6, 3, FALSE), + PT(22, 38, 5, 1, FALSE), + PT( 5, 63, 5, 1, TRUE), + PT(32, 59, 5, 3, FALSE), + PT(59, 28, 5, 3, TRUE), + PT( 1, 24, 2, 3, FALSE), + PT(22, 61, 2, 0, FALSE), + PT(10, 31, 3, 0, FALSE), + PT(23, 15, 4, 1, FALSE), + PT( 6, 19, 2, 0, TRUE), + PT(56, 33, 2, 3, TRUE), + PT(23, 10, 6, 3, TRUE), + PT(28, 25, 6, 0, FALSE), + PT(22, 56, 6, 0, TRUE), + PT(48, 16, 6, 3, FALSE), + PT(49, 47, 4, 3, FALSE), + PT(60, 27, 4, 1, TRUE), + PT(51, 47, 3, 0, TRUE), + PT(22, 53, 4, 2, TRUE), + PT(58, 24, 3, 3, TRUE), + PT(55, 1, 3, 3, FALSE), + PT(13, 24, 2, 1, FALSE), + PT(31, 28, 3, 1, TRUE), + PT( 7, 52, 5, 2, TRUE), + PT(11, 63, 6, 1, TRUE), + PT(30, 52, 3, 2, TRUE), + PT(44, 19, 5, 2, FALSE), + PT(32, 32, 2, 1, TRUE), + PT(32, 15, 6, 0, TRUE), + PT( 8, 15, 4, 2, FALSE), + PT(24, 61, 3, 2, FALSE), + PT(54, 52, 4, 3, TRUE), + PT(51, 42, 4, 2, TRUE), + PT(45, 48, 4, 3, FALSE), + PT(61, 55, 4, 3, FALSE), + PT(37, 17, 2, 0, TRUE), + PT( 3, 5, 3, 0, FALSE), + PT(16, 4, 5, 0, TRUE), + PT( 7, 46, 6, 3, FALSE), + PT(42, 41, 2, 2, TRUE), + PT(58, 14, 6, 1, TRUE), + PT(42, 6, 5, 0, TRUE), + PT(61, 1, 5, 0, TRUE), + PT(39, 14, 2, 3, FALSE), + PT(29, 40, 3, 1, TRUE), + PT(16, 51, 5, 1, TRUE), + PT(12, 20, 3, 2, TRUE), + PT(21, 63, 4, 2, TRUE), + PT(55, 35, 3, 3, FALSE), + PT( 4, 44, 3, 2, FALSE), + PT(21, 52, 5, 1, FALSE), + PT( 9, 47, 2, 2, TRUE), + PT( 2, 63, 2, 2, FALSE), + PT(25, 44, 6, 1, TRUE), + PT(57, 50, 4, 0, FALSE), + PT(42, 24, 6, 1, FALSE), + PT(23, 35, 4, 0, TRUE), + PT(11, 45, 4, 2, TRUE), + PT(36, 58, 5, 2, TRUE), + PT(49, 63, 6, 2, FALSE), + PT(24, 25, 4, 2, FALSE), + PT(30, 21, 3, 1, FALSE), + PT(23, 51, 5, 1, TRUE), + PT(35, 9, 4, 3, FALSE), + PT(27, 13, 2, 2, TRUE), + PT(54, 38, 5, 0, FALSE), + PT(58, 28, 2, 2, FALSE), + PT(12, 62, 2, 0, FALSE), + PT(24, 6, 6, 2, TRUE), + PT(55, 38, 6, 3, FALSE), + PT(33, 38, 2, 3, TRUE), + PT(61, 28, 5, 2, FALSE), + PT(22, 37, 3, 2, TRUE), + PT(30, 11, 3, 3, FALSE), + PT(29, 13, 6, 1, FALSE), + PT( 8, 31, 3, 1, TRUE), + PT(18, 28, 2, 1, FALSE), + PT(32, 42, 5, 0, FALSE), + PT( 6, 59, 6, 2, TRUE), + PT(57, 14, 3, 3, FALSE), + PT(49, 48, 5, 0, FALSE), + PT( 2, 33, 2, 2, FALSE), + PT( 6, 30, 5, 0, TRUE), + PT(22, 9, 3, 2, FALSE), + PT(39, 50, 5, 2, TRUE), + PT(57, 3, 4, 3, TRUE), + PT(41, 9, 3, 3, FALSE), + PT(27, 17, 3, 2, FALSE), + PT(40, 58, 5, 2, FALSE), + PT( 3, 3, 3, 0, FALSE), + PT(35, 9, 5, 3, TRUE), + PT(48, 23, 4, 1, TRUE), + PT(15, 37, 6, 1, TRUE), + PT( 6, 36, 6, 3, TRUE), + PT(34, 9, 6, 1, TRUE), + PT(44, 9, 5, 1, FALSE), + PT(12, 18, 5, 1, FALSE), + PT(40, 32, 2, 0, FALSE), + PT(21, 41, 6, 1, TRUE), + PT(15, 26, 2, 1, TRUE), + PT(19, 24, 6, 3, FALSE), + PT(46, 22, 2, 1, TRUE), + PT(60, 26, 2, 2, TRUE), + PT(58, 17, 6, 1, FALSE), + PT( 2, 10, 5, 2, FALSE), + PT(25, 57, 2, 0, TRUE), + PT(49, 62, 3, 2, TRUE), + PT(50, 20, 6, 1, FALSE), + PT(18, 46, 6, 2, FALSE), + PT(62, 54, 4, 1, TRUE), + PT(55, 62, 2, 2, TRUE), + PT(21, 53, 6, 2, FALSE), + PT( 1, 58, 5, 2, FALSE), + PT(38, 37, 4, 1, FALSE), + PT( 1, 43, 6, 3, TRUE), + PT(28, 61, 6, 1, TRUE), + PT(62, 16, 3, 2, FALSE), + PT(38, 51, 3, 0, TRUE), + PT( 5, 25, 2, 3, TRUE), + PT(18, 56, 3, 2, FALSE), + PT(21, 60, 6, 1, FALSE), + PT(63, 15, 6, 3, TRUE), + PT( 2, 57, 6, 1, FALSE), + PT(19, 0, 3, 2, TRUE), + PT(29, 44, 2, 0, FALSE), + PT(57, 19, 6, 0, TRUE), + PT(15, 55, 3, 0, TRUE), + PT( 9, 13, 5, 1, FALSE), + PT(32, 47, 6, 1, FALSE), + PT(59, 52, 4, 1, FALSE), + PT(38, 20, 2, 0, FALSE), + PT(36, 61, 4, 1, FALSE), + PT(11, 49, 4, 1, TRUE), + PT(47, 45, 5, 1, FALSE), + PT(48, 4, 6, 2, TRUE), + PT(25, 32, 5, 1, FALSE), + PT(22, 54, 6, 3, TRUE), + PT(20, 40, 6, 3, TRUE), + PT(17, 11, 4, 3, TRUE), + PT(29, 6, 5, 0, TRUE), + PT(53, 22, 5, 3, FALSE), + PT(36, 46, 5, 0, TRUE), + PT(54, 20, 5, 1, FALSE), + PT(33, 12, 3, 3, TRUE), + PT(63, 57, 3, 0, TRUE), + PT(39, 16, 5, 1, FALSE), + PT(30, 18, 6, 2, FALSE), + PT(16, 36, 6, 2, FALSE), + PT(29, 19, 3, 2, TRUE), + PT(23, 22, 6, 3, TRUE), + PT(39, 27, 4, 3, TRUE), + PT( 7, 36, 4, 0, TRUE), + PT(55, 33, 2, 0, TRUE), + PT(55, 40, 4, 2, FALSE), + PT(25, 2, 3, 2, FALSE), + PT(20, 18, 3, 2, TRUE), + PT(27, 36, 5, 3, FALSE), + PT(46, 58, 2, 2, TRUE), + PT(55, 52, 4, 0, TRUE), + PT(51, 45, 5, 0, TRUE), + PT(47, 30, 6, 2, FALSE), + PT(41, 60, 2, 1, FALSE), + PT( 5, 21, 4, 0, FALSE), + PT( 5, 62, 3, 0, TRUE), + PT(24, 11, 6, 0, FALSE), + PT(47, 2, 4, 3, TRUE), + PT(20, 28, 6, 2, FALSE), + PT(18, 32, 6, 0, FALSE), + PT(43, 34, 3, 1, TRUE), + PT( 6, 49, 5, 0, FALSE), + PT(21, 45, 2, 1, FALSE), + PT( 1, 14, 2, 1, TRUE), + PT(19, 12, 5, 0, FALSE), + PT( 7, 42, 2, 2, FALSE), + PT(29, 54, 2, 2, FALSE), + PT(21, 43, 4, 3, FALSE), + PT( 3, 37, 2, 2, TRUE), + PT(62, 59, 4, 0, FALSE), + PT(53, 12, 4, 2, TRUE), + PT(43, 22, 6, 2, TRUE), + PT(30, 49, 5, 2, FALSE), + PT( 6, 3, 5, 0, TRUE), + PT(36, 7, 3, 3, TRUE), + PT(50, 47, 3, 0, TRUE), + PT(37, 33, 6, 0, TRUE), + PT(34, 38, 3, 2, TRUE), + PT( 0, 27, 3, 0, FALSE), + PT(42, 36, 6, 0, TRUE), + PT(32, 6, 5, 3, TRUE), + PT(30, 50, 4, 3, FALSE), + PT(50, 57, 2, 1, FALSE), + PT(32, 1, 3, 0, TRUE), + PT(15, 21, 2, 2, TRUE), + PT(39, 16, 5, 3, FALSE), + PT( 9, 37, 3, 0, TRUE), + PT(41, 55, 6, 0, FALSE), + PT(19, 28, 3, 2, TRUE), + PT(41, 45, 4, 3, FALSE), + PT( 2, 26, 2, 3, FALSE), + PT(29, 43, 3, 2, FALSE), + PT(24, 4, 6, 2, FALSE), + PT(40, 42, 4, 0, TRUE), + PT(21, 27, 5, 3, FALSE), + PT(22, 1, 2, 0, FALSE), + PT( 5, 9, 2, 2, FALSE), + PT(34, 3, 4, 1, FALSE), + PT( 2, 27, 6, 2, FALSE), + PT(41, 42, 4, 1, TRUE), + PT(38, 54, 2, 1, TRUE), + PT(35, 61, 3, 1, FALSE), + PT(29, 16, 4, 2, FALSE), + PT(37, 43, 6, 3, TRUE), + PT(25, 36, 4, 3, FALSE), + PT(40, 19, 2, 3, FALSE), + PT(23, 20, 3, 0, TRUE), + PT(11, 47, 4, 2, TRUE), + PT(55, 52, 6, 3, TRUE), + PT(57, 33, 3, 1, TRUE), + PT(15, 61, 5, 2, TRUE), + PT(13, 16, 4, 0, FALSE), + PT( 5, 11, 5, 2, TRUE), + PT( 1, 18, 4, 2, FALSE), + PT(24, 61, 6, 1, FALSE), + PT( 9, 33, 4, 3, FALSE), + PT(26, 14, 3, 3, TRUE), + PT(48, 6, 3, 3, TRUE), + PT(11, 60, 5, 0, TRUE), + PT( 7, 62, 4, 3, TRUE), + PT(19, 30, 3, 1, FALSE), + PT(19, 7, 4, 1, TRUE), + PT(16, 52, 3, 3, FALSE), + PT(50, 23, 4, 1, TRUE), + PT(53, 22, 6, 0, TRUE), + PT(50, 46, 3, 1, TRUE), + PT(40, 14, 4, 1, FALSE), + PT(20, 58, 4, 1, TRUE), + PT(34, 3, 5, 0, TRUE), + PT(42, 16, 4, 0, FALSE), + PT(62, 60, 4, 3, TRUE), + PT(22, 32, 2, 1, FALSE), + PT(63, 36, 6, 0, TRUE), + PT(13, 46, 6, 1, FALSE), + PT(47, 23, 5, 2, TRUE), + PT(54, 59, 2, 3, TRUE), + PT(36, 35, 3, 0, FALSE), + PT(55, 29, 2, 1, TRUE), + PT(23, 58, 3, 1, FALSE), + PT(10, 61, 3, 3, FALSE), + PT( 5, 18, 2, 3, FALSE), + PT(51, 50, 4, 2, TRUE), + PT(29, 31, 5, 0, TRUE), + PT(52, 44, 4, 3, FALSE), + PT(32, 41, 6, 2, TRUE), + PT(14, 50, 2, 3, TRUE), + PT( 1, 57, 5, 2, TRUE), + PT(39, 36, 4, 1, TRUE), + PT(40, 63, 3, 0, FALSE), + PT(57, 56, 4, 2, TRUE), + PT(35, 17, 2, 0, TRUE), + PT(25, 44, 5, 0, TRUE), + PT(48, 8, 5, 0, FALSE), + PT(37, 39, 3, 2, TRUE), + PT(23, 37, 4, 0, TRUE), + PT( 9, 61, 2, 3, FALSE), + PT(27, 15, 5, 2, FALSE), + PT(27, 18, 4, 1, FALSE), + PT(40, 62, 4, 3, FALSE), + PT(52, 16, 3, 1, TRUE), + PT( 2, 52, 2, 2, TRUE), + PT(26, 41, 3, 0, TRUE), + PT(41, 17, 6, 0, TRUE), + PT(18, 39, 2, 3, TRUE), + PT(39, 39, 5, 3, TRUE), + PT(52, 39, 4, 2, FALSE), + PT( 3, 25, 6, 3, FALSE), + PT(23, 29, 6, 1, TRUE), + PT(25, 37, 3, 1, FALSE), + PT(43, 57, 2, 1, TRUE), + PT(59, 51, 3, 2, TRUE), + PT(39, 49, 6, 2, FALSE), + PT(40, 51, 6, 3, TRUE), + PT( 9, 48, 3, 1, TRUE), + PT( 3, 58, 4, 3, TRUE), + PT(25, 17, 3, 3, TRUE), + PT(11, 26, 6, 2, FALSE), + PT(61, 42, 2, 2, TRUE), + PT( 4, 36, 6, 3, FALSE), + PT(48, 35, 6, 0, FALSE), + PT(15, 34, 3, 1, TRUE), + PT(61, 61, 4, 2, FALSE), + PT(41, 29, 2, 1, FALSE), + PT(22, 25, 5, 3, FALSE), + PT( 3, 18, 2, 3, TRUE), + PT(24, 37, 6, 1, TRUE), + PT(47, 35, 3, 1, FALSE), + PT(26, 53, 4, 3, TRUE), + PT(33, 38, 3, 0, TRUE), + PT(27, 48, 3, 0, FALSE), + PT(43, 34, 5, 2, TRUE), + PT(44, 26, 6, 2, FALSE), + PT(62, 18, 3, 0, TRUE), + PT(40, 39, 2, 2, TRUE), + PT(27, 17, 2, 1, FALSE), + PT(23, 21, 2, 0, FALSE), + PT(52, 55, 4, 2, TRUE), + PT(18, 63, 2, 2, TRUE), + PT(49, 13, 6, 3, TRUE), + PT(62, 42, 5, 2, TRUE), + PT(15, 36, 4, 2, FALSE), + PT(60, 63, 3, 3, TRUE), + PT(29, 52, 2, 3, TRUE), + PT(26, 35, 3, 3, TRUE), + PT(55, 15, 2, 0, FALSE), + PT(50, 52, 6, 2, TRUE), + PT(25, 5, 4, 1, FALSE), + PT(51, 22, 6, 2, FALSE), + PT(30, 20, 3, 3, FALSE), + PT( 8, 19, 5, 0, TRUE), + PT(58, 55, 6, 0, FALSE), + PT(29, 54, 2, 2, TRUE), + PT(41, 46, 3, 2, TRUE), + PT(50, 46, 4, 1, TRUE), + PT(53, 23, 3, 2, FALSE), + PT(54, 29, 2, 1, TRUE), + PT(35, 52, 6, 2, FALSE), + PT(36, 26, 6, 3, TRUE), + PT(47, 38, 5, 3, FALSE), + PT(30, 23, 3, 1, FALSE), + PT(31, 21, 3, 3, TRUE), + PT(43, 31, 3, 0, TRUE), + PT(10, 51, 3, 1, FALSE), + PT(53, 49, 4, 2, FALSE), + PT(45, 23, 5, 2, FALSE), + PT(12, 33, 6, 3, FALSE), + PT(44, 53, 6, 2, TRUE), + PT(27, 3, 4, 3, TRUE), + PT( 1, 13, 3, 2, TRUE), + PT(28, 14, 2, 0, TRUE), + PT(17, 43, 2, 0, FALSE), + PT(37, 59, 4, 0, FALSE), + PT(31, 23, 3, 0, TRUE), + PT(32, 8, 6, 3, FALSE), + PT(19, 56, 3, 0, TRUE), + PT(27, 43, 4, 2, FALSE), + PT(11, 31, 5, 0, TRUE), + PT(39, 21, 5, 2, FALSE), + PT(55, 57, 2, 0, FALSE), + PT(58, 21, 5, 3, FALSE), + PT(47, 17, 6, 3, FALSE), + PT(36, 4, 4, 0, FALSE), + PT(59, 42, 6, 2, TRUE), + PT(39, 53, 6, 2, FALSE), + PT(13, 27, 4, 0, FALSE), + PT(16, 34, 6, 3, TRUE), + PT(31, 56, 4, 3, TRUE), + PT(49, 15, 5, 0, FALSE), + PT(40, 37, 2, 2, TRUE), + PT( 0, 29, 4, 2, TRUE), + PT(49, 40, 5, 0, FALSE), + PT(11, 58, 3, 2, TRUE), + PT(45, 19, 3, 1, TRUE), + PT( 3, 55, 5, 3, FALSE), + PT(29, 40, 3, 0, TRUE), + PT( 8, 45, 4, 1, FALSE), + PT(39, 57, 6, 1, FALSE), + PT(63, 47, 3, 2, TRUE), + PT(51, 52, 5, 0, FALSE), + PT(24, 8, 6, 0, TRUE), + PT(35, 31, 2, 1, TRUE), + PT(13, 44, 4, 1, TRUE), + PT(58, 45, 3, 1, FALSE), + PT( 2, 37, 2, 1, TRUE), + PT(32, 54, 6, 2, FALSE), + PT(18, 43, 5, 2, TRUE), + PT(53, 53, 6, 2, FALSE), + PT(35, 32, 4, 0, TRUE), + PT(58, 25, 3, 1, TRUE), + PT(31, 43, 3, 0, TRUE), + PT(53, 14, 3, 0, TRUE), + PT(38, 36, 6, 3, TRUE), + PT(24, 8, 2, 0, FALSE), + PT(12, 22, 5, 2, TRUE), + PT(31, 52, 4, 0, TRUE), + PT( 5, 56, 3, 0, TRUE), + PT(20, 33, 4, 2, FALSE), + PT(17, 49, 2, 2, FALSE), + PT(62, 56, 5, 0, TRUE), + PT(63, 8, 4, 2, TRUE), + PT(42, 31, 4, 2, TRUE), + PT(37, 6, 5, 0, FALSE), + PT(11, 30, 2, 2, FALSE), + PT(26, 56, 4, 1, FALSE), + PT(36, 24, 5, 0, TRUE), + PT(26, 17, 4, 0, FALSE), + PT(59, 58, 3, 3, FALSE), + PT(28, 38, 3, 1, FALSE), + PT( 5, 50, 3, 0, TRUE), + PT(57, 42, 6, 0, TRUE), + PT( 9, 7, 4, 2, TRUE), + PT( 5, 62, 2, 3, FALSE), + PT(52, 38, 2, 2, FALSE), + PT(27, 50, 4, 3, FALSE), + PT( 5, 8, 6, 3, TRUE), + PT(15, 3, 4, 0, FALSE), + PT(42, 57, 6, 0, TRUE), + PT( 8, 1, 3, 3, FALSE), + PT(29, 35, 6, 0, TRUE), + PT(40, 27, 5, 0, FALSE), + PT(30, 55, 2, 2, FALSE), + PT(19, 14, 5, 0, FALSE), + PT(42, 59, 6, 3, TRUE), + PT(47, 28, 5, 0, FALSE), + PT(48, 48, 3, 1, FALSE), + PT(54, 31, 2, 3, FALSE), + PT(62, 13, 2, 2, TRUE), + PT(46, 22, 3, 0, FALSE), + PT(21, 55, 4, 0, FALSE), + PT(42, 51, 6, 0, FALSE), + PT(43, 14, 4, 2, TRUE), + PT(24, 32, 2, 3, FALSE), + PT( 2, 25, 4, 2, TRUE), + PT(10, 46, 6, 0, FALSE), + PT(22, 3, 2, 0, TRUE), + PT( 4, 39, 4, 2, TRUE), + PT(27, 28, 4, 0, TRUE), + PT(41, 4, 4, 3, TRUE), + PT(61, 32, 3, 3, FALSE), + PT(40, 51, 6, 0, TRUE), + PT(30, 57, 2, 0, FALSE), + PT(49, 41, 3, 3, FALSE), + PT( 6, 37, 5, 0, FALSE), + PT(25, 59, 2, 1, FALSE), + PT(11, 27, 3, 2, FALSE), + PT(62, 55, 4, 0, FALSE), + PT(10, 55, 6, 1, TRUE), + PT( 2, 44, 4, 2, TRUE), + PT(21, 24, 2, 2, FALSE), + PT(59, 32, 3, 2, FALSE), + PT(34, 59, 3, 2, FALSE), + PT(36, 52, 6, 2, TRUE), + PT(15, 47, 6, 0, TRUE), + PT(59, 23, 6, 2, TRUE), + PT(48, 57, 6, 3, TRUE), + PT(13, 21, 2, 0, TRUE), + PT(16, 3, 3, 3, FALSE), + PT(26, 57, 6, 1, TRUE), + PT(47, 46, 5, 0, FALSE), + PT(28, 40, 6, 3, FALSE), + PT(40, 24, 3, 3, TRUE), + PT(21, 1, 6, 0, FALSE), + PT(62, 50, 5, 0, FALSE), + PT(52, 47, 4, 1, TRUE), + PT( 7, 12, 6, 3, FALSE), + PT(40, 44, 6, 2, FALSE), + PT(42, 12, 3, 3, TRUE), + PT(63, 32, 2, 1, TRUE), + PT(43, 23, 4, 3, TRUE), + PT(40, 41, 5, 1, FALSE), + PT(60, 19, 6, 3, FALSE), + PT(38, 45, 5, 1, FALSE), + PT(10, 6, 3, 3, FALSE), + PT(32, 4, 3, 1, FALSE), + PT( 2, 7, 6, 2, TRUE), + PT(14, 24, 6, 0, FALSE), + PT( 0, 52, 6, 2, FALSE), + PT(47, 20, 6, 3, TRUE), + PT(33, 48, 3, 3, TRUE), + PT(21, 55, 3, 1, TRUE), + PT(58, 11, 6, 1, FALSE), + PT(34, 34, 4, 0, TRUE), + PT(27, 53, 4, 1, TRUE), + PT(13, 3, 3, 2, FALSE), + PT(35, 59, 2, 1, TRUE), + PT(14, 29, 3, 3, TRUE), + PT(29, 63, 5, 3, FALSE), + PT(57, 39, 5, 3, FALSE), + PT(15, 56, 4, 0, FALSE), + PT(49, 60, 6, 2, TRUE), + PT(11, 15, 5, 3, FALSE), + PT( 6, 6, 5, 0, FALSE), + PT(37, 57, 4, 1, TRUE), + PT(10, 50, 2, 2, TRUE), + PT(15, 29, 4, 2, TRUE), + PT(12, 13, 6, 2, FALSE), + PT(18, 46, 4, 0, TRUE), + PT(54, 24, 3, 3, TRUE), + PT(31, 52, 3, 1, TRUE), + PT( 5, 58, 6, 3, FALSE), + PT(43, 1, 2, 3, TRUE), + PT(14, 22, 5, 1, TRUE), + PT(14, 11, 4, 3, FALSE), + PT(13, 45, 2, 0, FALSE), + PT(33, 17, 4, 3, TRUE), + PT(61, 19, 6, 1, FALSE), + PT(21, 37, 5, 1, FALSE), + PT(27, 45, 6, 2, TRUE), + PT(44, 43, 4, 3, FALSE), + PT(38, 31, 4, 0, FALSE), + PT(34, 43, 2, 1, FALSE), + PT(63, 61, 4, 3, TRUE), + PT(48, 10, 6, 3, FALSE), + PT(53, 31, 2, 3, TRUE), + PT(33, 8, 5, 0, TRUE), + PT(29, 32, 6, 1, TRUE), + PT(52, 17, 2, 3, FALSE), + PT( 5, 56, 5, 2, TRUE), +}; + +#undef PT diff --git a/src/data/pokemon/item_effects.h b/src/data/pokemon/item_effects.h index 1ed721e44..00872a9b2 100644 --- a/src/data/pokemon/item_effects.h +++ b/src/data/pokemon/item_effects.h @@ -1,6 +1,6 @@ const u8 gItemEffect_Potion[7] = { [4] = ITEM4_HEAL_HP, - [6] = 20, + [6] = 20, // Amount of HP to recover }; const u8 gItemEffect_Antidote[6] = { @@ -26,22 +26,22 @@ const u8 gItemEffect_ParalyzeHeal[6] = { const u8 gItemEffect_FullRestore[7] = { [3] = ITEM3_STATUS_ALL, [4] = ITEM4_HEAL_HP, - [6] = ITEM6_HEAL_FULL, + [6] = ITEM6_HEAL_HP_FULL, }; const u8 gItemEffect_MaxPotion[7] = { [4] = ITEM4_HEAL_HP, - [6] = ITEM6_HEAL_FULL, + [6] = ITEM6_HEAL_HP_FULL, }; const u8 gItemEffect_HyperPotion[7] = { [4] = ITEM4_HEAL_HP, - [6] = 200, + [6] = 200, // Amount of HP to recover }; const u8 gItemEffect_SuperPotion[7] = { [4] = ITEM4_HEAL_HP, - [6] = 50, + [6] = 50, // Amount of HP to recover }; const u8 gItemEffect_FullHeal[6] = { @@ -50,87 +50,87 @@ const u8 gItemEffect_FullHeal[6] = { const u8 gItemEffect_Revive[7] = { [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, - [6] = ITEM6_HEAL_HALF, + [6] = ITEM6_HEAL_HP_HALF, }; const u8 gItemEffect_MaxRevive[7] = { [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, - [6] = ITEM6_HEAL_FULL, + [6] = ITEM6_HEAL_HP_FULL, }; const u8 gItemEffect_FreshWater[7] = { [4] = ITEM4_HEAL_HP, - [6] = 50, + [6] = 50, // Amount of HP to recover }; const u8 gItemEffect_SodaPop[7] = { [4] = ITEM4_HEAL_HP, - [6] = 60, + [6] = 60, // Amount of HP to recover }; const u8 gItemEffect_Lemonade[7] = { [4] = ITEM4_HEAL_HP, - [6] = 80, + [6] = 80, // Amount of HP to recover }; const u8 gItemEffect_MoomooMilk[7] = { [4] = ITEM4_HEAL_HP, - [6] = 100, + [6] = 100, // Amount of HP to recover }; const u8 gItemEffect_EnergyPowder[10] = { [4] = ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = 50, - [7] = -5, - [8] = -5, - [9] = -10, + [6] = 50, // Amount of HP to recover + [7] = -5, // Friendship change, low + [8] = -5, // Friendship change, mid + [9] = -10, // Friendship change, high }; const u8 gItemEffect_EnergyRoot[10] = { [4] = ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = 200, - [7] = -10, - [8] = -10, - [9] = -15, + [6] = 200, // Amount of HP to recover + [7] = -10, // Friendship change, low + [8] = -10, // Friendship change, mid + [9] = -15, // Friendship change, high }; const u8 gItemEffect_HealPowder[9] = { [3] = ITEM3_STATUS_ALL, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = -5, - [7] = -5, - [8] = -10, + [6] = -5, // Friendship change, low + [7] = -5, // Friendship change, mid + [8] = -10, // Friendship change, high }; const u8 gItemEffect_RevivalHerb[10] = { [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = ITEM6_HEAL_FULL, - [7] = -15, - [8] = -15, - [9] = -20, + [6] = ITEM6_HEAL_HP_FULL, + [7] = -15, // Friendship change, low + [8] = -15, // Friendship change, mid + [9] = -20, // Friendship change, high }; const u8 gItemEffect_Ether[7] = { - [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL, + [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP, [6] = 10, }; const u8 gItemEffect_MaxEther[7] = { - [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL, - [6] = 0x7F, + [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP, + [6] = ITEM6_HEAL_PP_FULL, }; const u8 gItemEffect_Elixir[7] = { - [4] = ITEM4_HEAL_PP_ALL, - [6] = 10, + [4] = ITEM4_HEAL_PP, + [6] = 10, // Amount of PP to recover }; const u8 gItemEffect_MaxElixir[7] = { - [4] = ITEM4_HEAL_PP_ALL, - [6] = 0x7F, + [4] = ITEM4_HEAL_PP, + [6] = ITEM6_HEAL_PP_FULL, }; const u8 gItemEffect_LavaCookie[6] = { @@ -151,137 +151,125 @@ const u8 gItemEffect_RedFlute[6] = { const u8 gItemEffect_BerryJuice[7] = { [4] = ITEM4_HEAL_HP, - [6] = 20, + [6] = 20, // Amount of HP to recover }; const u8 gItemEffect_SacredAsh[7] = { [0] = ITEM0_SACRED_ASH, [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, - [6] = ITEM6_HEAL_FULL, + [6] = ITEM6_HEAL_HP_FULL, }; +#define VITAMIN_FRIENDSHIP_CHANGE(i) \ + [(i) + 0] = 5, /* Friendship change, low */ \ + [(i) + 1] = 3, /* Friendship change, mid */ \ + [(i) + 2] = 2 /* Friendship change, high */ + const u8 gItemEffect_HPUp[10] = { [4] = ITEM4_EV_HP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = 10, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_ADD_EV, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_Protein[10] = { [4] = ITEM4_EV_ATK, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = 10, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_ADD_EV, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_Iron[10] = { [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL, - [6] = 10, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_ADD_EV, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_Carbos[10] = { [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL, - [6] = 10, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_ADD_EV, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_Calcium[10] = { [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL, - [6] = 10, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_ADD_EV, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_RareCandy[10] = { [3] = ITEM3_LEVEL_UP, [4] = ITEM4_REVIVE | ITEM4_HEAL_HP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = ITEM6_HEAL_LVL_UP, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_HEAL_HP_LVL_UP, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_PPUp[9] = { [4] = ITEM4_PP_UP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = 5, - [7] = 3, - [8] = 2, + VITAMIN_FRIENDSHIP_CHANGE(6), }; const u8 gItemEffect_Zinc[10] = { [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL, - [6] = 10, - [7] = 5, - [8] = 3, - [9] = 2, + [6] = ITEM6_ADD_EV, + VITAMIN_FRIENDSHIP_CHANGE(7), }; const u8 gItemEffect_PPMax[9] = { [5] = ITEM5_PP_MAX | ITEM5_FRIENDSHIP_ALL, - [6] = 5, - [7] = 3, - [8] = 2, + VITAMIN_FRIENDSHIP_CHANGE(6), }; +#define STAT_BOOST_FRIENDSHIP_CHANGE \ + [6] = 1, /* Friendship change, low */ \ + [7] = 1 /* Friendship change, mid */ + const u8 gItemEffect_GuardSpec[8] = { [3] = ITEM3_GUARD_SPEC, [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; +// The first item effect value for the stat boost items +// only uses the least significant bit of its full mask. +// The full constant is commented next to it + const u8 gItemEffect_DireHit[8] = { - [0] = 2 << 4, + [0] = 1 << 5, // ITEM0_DIRE_HIT [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XAttack[8] = { - [0] = 1, + [0] = 1, // ITEM0_X_ATTACK [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XDefend[8] = { - [1] = 1 << 4, + [1] = 1 << 4, /// ITEM1_X_DEFEND [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpeed[8] = { - [1] = 1, + [1] = 1, // ITEM1_X_SPEED [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XAccuracy[8] = { - [2] = 1 << 4, + [2] = 1 << 4, // ITEM2_X_ACCURACY [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_XSpecial[8] = { - [2] = 1, + [2] = 1, // ITEM2_X_SPATK [5] = ITEM5_FRIENDSHIP_LOW | ITEM5_FRIENDSHIP_MID, - [6] = 1, - [7] = 1, + STAT_BOOST_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_SunStone[6] = { @@ -329,13 +317,13 @@ const u8 gItemEffect_AspearBerry[6] = { }; const u8 gItemEffect_LeppaBerry[7] = { - [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP_ALL, - [6] = 10, + [4] = ITEM4_HEAL_PP_ONE | ITEM4_HEAL_PP, + [6] = 10, // Amount of PP to recover }; const u8 gItemEffect_OranBerry[7] = { [4] = ITEM4_HEAL_HP, - [6] = 10, + [6] = 10, // Amount of HP to recover }; const u8 gItemEffect_PersimBerry[6] = { @@ -348,129 +336,122 @@ const u8 gItemEffect_LumBerry[6] = { const u8 gItemEffect_SitrusBerry[7] = { [4] = ITEM4_HEAL_HP, - [6] = 30, + [6] = 30, // Amount of HP to recover }; +#define EV_BERRY_FRIENDSHIP_CHANGE \ + [7] = 10, /* Friendship change, low */ \ + [8] = 5, /* Friendship change, mid */ \ + [9] = 2 /* Friendship change, high */ + const u8 gItemEffect_PomegBerry[10] = { [4] = ITEM4_EV_HP, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = -10, - [7] = 10, - [8] = 5, - [9] = 2, + [6] = ITEM6_SUBTRACT_EV, + EV_BERRY_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_KelpsyBerry[10] = { [4] = ITEM4_EV_ATK, [5] = ITEM5_FRIENDSHIP_ALL, - [6] = -10, - [7] = 10, - [8] = 5, - [9] = 2, + [6] = ITEM6_SUBTRACT_EV, + EV_BERRY_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_QualotBerry[10] = { [5] = ITEM5_EV_DEF | ITEM5_FRIENDSHIP_ALL, - [6] = -10, - [7] = 10, - [8] = 5, - [9] = 2, + [6] = ITEM6_SUBTRACT_EV, + EV_BERRY_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_HondewBerry[10] = { [5] = ITEM5_EV_SPATK | ITEM5_FRIENDSHIP_ALL, - [6] = -10, - [7] = 10, - [8] = 5, - [9] = 2, + [6] = ITEM6_SUBTRACT_EV, + EV_BERRY_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_GrepaBerry[10] = { [5] = ITEM5_EV_SPDEF | ITEM5_FRIENDSHIP_ALL, - [6] = -10, - [7] = 10, - [8] = 5, - [9] = 2, + [6] = ITEM6_SUBTRACT_EV, + EV_BERRY_FRIENDSHIP_CHANGE, }; const u8 gItemEffect_TamatoBerry[10] = { [5] = ITEM5_EV_SPEED | ITEM5_FRIENDSHIP_ALL, - [6] = -10, - [7] = 10, - [8] = 5, - [9] = 2, + [6] = ITEM6_SUBTRACT_EV, + EV_BERRY_FRIENDSHIP_CHANGE, }; const u8 *const gItemEffectTable[] = { - [ITEM_POTION - ITEM_POTION] = gItemEffect_Potion, - [ITEM_ANTIDOTE - ITEM_POTION] = gItemEffect_Antidote, - [ITEM_BURN_HEAL - ITEM_POTION] = gItemEffect_BurnHeal, - [ITEM_ICE_HEAL - ITEM_POTION] = gItemEffect_IceHeal, - [ITEM_AWAKENING - ITEM_POTION] = gItemEffect_Awakening, + [ITEM_POTION - ITEM_POTION] = gItemEffect_Potion, + [ITEM_ANTIDOTE - ITEM_POTION] = gItemEffect_Antidote, + [ITEM_BURN_HEAL - ITEM_POTION] = gItemEffect_BurnHeal, + [ITEM_ICE_HEAL - ITEM_POTION] = gItemEffect_IceHeal, + [ITEM_AWAKENING - ITEM_POTION] = gItemEffect_Awakening, [ITEM_PARALYZE_HEAL - ITEM_POTION] = gItemEffect_ParalyzeHeal, - [ITEM_FULL_RESTORE - ITEM_POTION] = gItemEffect_FullRestore, - [ITEM_MAX_POTION - ITEM_POTION] = gItemEffect_MaxPotion, - [ITEM_HYPER_POTION - ITEM_POTION] = gItemEffect_HyperPotion, - [ITEM_SUPER_POTION - ITEM_POTION] = gItemEffect_SuperPotion, - [ITEM_FULL_HEAL - ITEM_POTION] = gItemEffect_FullHeal, - [ITEM_REVIVE - ITEM_POTION] = gItemEffect_Revive, - [ITEM_MAX_REVIVE - ITEM_POTION] = gItemEffect_MaxRevive, - [ITEM_FRESH_WATER - ITEM_POTION] = gItemEffect_FreshWater, - [ITEM_SODA_POP - ITEM_POTION] = gItemEffect_SodaPop, - [ITEM_LEMONADE - ITEM_POTION] = gItemEffect_Lemonade, - [ITEM_MOOMOO_MILK - ITEM_POTION] = gItemEffect_MoomooMilk, + [ITEM_FULL_RESTORE - ITEM_POTION] = gItemEffect_FullRestore, + [ITEM_MAX_POTION - ITEM_POTION] = gItemEffect_MaxPotion, + [ITEM_HYPER_POTION - ITEM_POTION] = gItemEffect_HyperPotion, + [ITEM_SUPER_POTION - ITEM_POTION] = gItemEffect_SuperPotion, + [ITEM_FULL_HEAL - ITEM_POTION] = gItemEffect_FullHeal, + [ITEM_REVIVE - ITEM_POTION] = gItemEffect_Revive, + [ITEM_MAX_REVIVE - ITEM_POTION] = gItemEffect_MaxRevive, + [ITEM_FRESH_WATER - ITEM_POTION] = gItemEffect_FreshWater, + [ITEM_SODA_POP - ITEM_POTION] = gItemEffect_SodaPop, + [ITEM_LEMONADE - ITEM_POTION] = gItemEffect_Lemonade, + [ITEM_MOOMOO_MILK - ITEM_POTION] = gItemEffect_MoomooMilk, [ITEM_ENERGY_POWDER - ITEM_POTION] = gItemEffect_EnergyPowder, - [ITEM_ENERGY_ROOT - ITEM_POTION] = gItemEffect_EnergyRoot, - [ITEM_HEAL_POWDER - ITEM_POTION] = gItemEffect_HealPowder, - [ITEM_REVIVAL_HERB - ITEM_POTION] = gItemEffect_RevivalHerb, - [ITEM_ETHER - ITEM_POTION] = gItemEffect_Ether, - [ITEM_MAX_ETHER - ITEM_POTION] = gItemEffect_MaxEther, - [ITEM_ELIXIR - ITEM_POTION] = gItemEffect_Elixir, - [ITEM_MAX_ELIXIR - ITEM_POTION] = gItemEffect_MaxElixir, - [ITEM_LAVA_COOKIE - ITEM_POTION] = gItemEffect_LavaCookie, - [ITEM_BLUE_FLUTE - ITEM_POTION] = gItemEffect_BlueFlute, - [ITEM_YELLOW_FLUTE - ITEM_POTION] = gItemEffect_YellowFlute, - [ITEM_RED_FLUTE - ITEM_POTION] = gItemEffect_RedFlute, - [ITEM_BERRY_JUICE - ITEM_POTION] = gItemEffect_BerryJuice, - [ITEM_SACRED_ASH - ITEM_POTION] = gItemEffect_SacredAsh, - [ITEM_HP_UP - ITEM_POTION] = gItemEffect_HPUp, - [ITEM_PROTEIN - ITEM_POTION] = gItemEffect_Protein, - [ITEM_IRON - ITEM_POTION] = gItemEffect_Iron, - [ITEM_CARBOS - ITEM_POTION] = gItemEffect_Carbos, - [ITEM_CALCIUM - ITEM_POTION] = gItemEffect_Calcium, - [ITEM_RARE_CANDY - ITEM_POTION] = gItemEffect_RareCandy, - [ITEM_PP_UP - ITEM_POTION] = gItemEffect_PPUp, - [ITEM_ZINC - ITEM_POTION] = gItemEffect_Zinc, - [ITEM_PP_MAX - ITEM_POTION] = gItemEffect_PPMax, - [ITEM_GUARD_SPEC - ITEM_POTION] = gItemEffect_GuardSpec, - [ITEM_DIRE_HIT - ITEM_POTION] = gItemEffect_DireHit, - [ITEM_X_ATTACK - ITEM_POTION] = gItemEffect_XAttack, - [ITEM_X_DEFEND - ITEM_POTION] = gItemEffect_XDefend, - [ITEM_X_SPEED - ITEM_POTION] = gItemEffect_XSpeed, - [ITEM_X_ACCURACY - ITEM_POTION] = gItemEffect_XAccuracy, - [ITEM_X_SPECIAL - ITEM_POTION] = gItemEffect_XSpecial, - [ITEM_SUN_STONE - ITEM_POTION] = gItemEffect_SunStone, - [ITEM_MOON_STONE - ITEM_POTION] = gItemEffect_MoonStone, - [ITEM_FIRE_STONE - ITEM_POTION] = gItemEffect_FireStone, + [ITEM_ENERGY_ROOT - ITEM_POTION] = gItemEffect_EnergyRoot, + [ITEM_HEAL_POWDER - ITEM_POTION] = gItemEffect_HealPowder, + [ITEM_REVIVAL_HERB - ITEM_POTION] = gItemEffect_RevivalHerb, + [ITEM_ETHER - ITEM_POTION] = gItemEffect_Ether, + [ITEM_MAX_ETHER - ITEM_POTION] = gItemEffect_MaxEther, + [ITEM_ELIXIR - ITEM_POTION] = gItemEffect_Elixir, + [ITEM_MAX_ELIXIR - ITEM_POTION] = gItemEffect_MaxElixir, + [ITEM_LAVA_COOKIE - ITEM_POTION] = gItemEffect_LavaCookie, + [ITEM_BLUE_FLUTE - ITEM_POTION] = gItemEffect_BlueFlute, + [ITEM_YELLOW_FLUTE - ITEM_POTION] = gItemEffect_YellowFlute, + [ITEM_RED_FLUTE - ITEM_POTION] = gItemEffect_RedFlute, + [ITEM_BERRY_JUICE - ITEM_POTION] = gItemEffect_BerryJuice, + [ITEM_SACRED_ASH - ITEM_POTION] = gItemEffect_SacredAsh, + [ITEM_HP_UP - ITEM_POTION] = gItemEffect_HPUp, + [ITEM_PROTEIN - ITEM_POTION] = gItemEffect_Protein, + [ITEM_IRON - ITEM_POTION] = gItemEffect_Iron, + [ITEM_CARBOS - ITEM_POTION] = gItemEffect_Carbos, + [ITEM_CALCIUM - ITEM_POTION] = gItemEffect_Calcium, + [ITEM_RARE_CANDY - ITEM_POTION] = gItemEffect_RareCandy, + [ITEM_PP_UP - ITEM_POTION] = gItemEffect_PPUp, + [ITEM_ZINC - ITEM_POTION] = gItemEffect_Zinc, + [ITEM_PP_MAX - ITEM_POTION] = gItemEffect_PPMax, + [ITEM_GUARD_SPEC - ITEM_POTION] = gItemEffect_GuardSpec, + [ITEM_DIRE_HIT - ITEM_POTION] = gItemEffect_DireHit, + [ITEM_X_ATTACK - ITEM_POTION] = gItemEffect_XAttack, + [ITEM_X_DEFEND - ITEM_POTION] = gItemEffect_XDefend, + [ITEM_X_SPEED - ITEM_POTION] = gItemEffect_XSpeed, + [ITEM_X_ACCURACY - ITEM_POTION] = gItemEffect_XAccuracy, + [ITEM_X_SPECIAL - ITEM_POTION] = gItemEffect_XSpecial, + [ITEM_SUN_STONE - ITEM_POTION] = gItemEffect_SunStone, + [ITEM_MOON_STONE - ITEM_POTION] = gItemEffect_MoonStone, + [ITEM_FIRE_STONE - ITEM_POTION] = gItemEffect_FireStone, [ITEM_THUNDER_STONE - ITEM_POTION] = gItemEffect_ThunderStone, - [ITEM_WATER_STONE - ITEM_POTION] = gItemEffect_WaterStone, - [ITEM_LEAF_STONE - ITEM_POTION] = gItemEffect_LeafStone, - [ITEM_CHERI_BERRY - ITEM_POTION] = gItemEffect_CheriBerry, - [ITEM_CHESTO_BERRY - ITEM_POTION] = gItemEffect_ChestoBerry, - [ITEM_PECHA_BERRY - ITEM_POTION] = gItemEffect_PechaBerry, - [ITEM_RAWST_BERRY - ITEM_POTION] = gItemEffect_RawstBerry, - [ITEM_ASPEAR_BERRY - ITEM_POTION] = gItemEffect_AspearBerry, - [ITEM_LEPPA_BERRY - ITEM_POTION] = gItemEffect_LeppaBerry, - [ITEM_ORAN_BERRY - ITEM_POTION] = gItemEffect_OranBerry, - [ITEM_PERSIM_BERRY - ITEM_POTION] = gItemEffect_PersimBerry, - [ITEM_LUM_BERRY - ITEM_POTION] = gItemEffect_LumBerry, - [ITEM_SITRUS_BERRY - ITEM_POTION] = gItemEffect_SitrusBerry, - [ITEM_POMEG_BERRY - ITEM_POTION] = gItemEffect_PomegBerry, - [ITEM_KELPSY_BERRY - ITEM_POTION] = gItemEffect_KelpsyBerry, - [ITEM_QUALOT_BERRY - ITEM_POTION] = gItemEffect_QualotBerry, - [ITEM_HONDEW_BERRY - ITEM_POTION] = gItemEffect_HondewBerry, - [ITEM_GREPA_BERRY - ITEM_POTION] = gItemEffect_GrepaBerry, - [ITEM_TAMATO_BERRY - ITEM_POTION] = gItemEffect_TamatoBerry, - [LAST_BERRY_INDEX - ITEM_POTION] = NULL + [ITEM_WATER_STONE - ITEM_POTION] = gItemEffect_WaterStone, + [ITEM_LEAF_STONE - ITEM_POTION] = gItemEffect_LeafStone, + [ITEM_CHERI_BERRY - ITEM_POTION] = gItemEffect_CheriBerry, + [ITEM_CHESTO_BERRY - ITEM_POTION] = gItemEffect_ChestoBerry, + [ITEM_PECHA_BERRY - ITEM_POTION] = gItemEffect_PechaBerry, + [ITEM_RAWST_BERRY - ITEM_POTION] = gItemEffect_RawstBerry, + [ITEM_ASPEAR_BERRY - ITEM_POTION] = gItemEffect_AspearBerry, + [ITEM_LEPPA_BERRY - ITEM_POTION] = gItemEffect_LeppaBerry, + [ITEM_ORAN_BERRY - ITEM_POTION] = gItemEffect_OranBerry, + [ITEM_PERSIM_BERRY - ITEM_POTION] = gItemEffect_PersimBerry, + [ITEM_LUM_BERRY - ITEM_POTION] = gItemEffect_LumBerry, + [ITEM_SITRUS_BERRY - ITEM_POTION] = gItemEffect_SitrusBerry, + [ITEM_POMEG_BERRY - ITEM_POTION] = gItemEffect_PomegBerry, + [ITEM_KELPSY_BERRY - ITEM_POTION] = gItemEffect_KelpsyBerry, + [ITEM_QUALOT_BERRY - ITEM_POTION] = gItemEffect_QualotBerry, + [ITEM_HONDEW_BERRY - ITEM_POTION] = gItemEffect_HondewBerry, + [ITEM_GREPA_BERRY - ITEM_POTION] = gItemEffect_GrepaBerry, + [ITEM_TAMATO_BERRY - ITEM_POTION] = gItemEffect_TamatoBerry, + [LAST_BERRY_INDEX - ITEM_POTION] = NULL }; diff --git a/src/data/pokemon_graphics/unknown_table.h b/src/data/pokemon_graphics/unknown_table.h new file mode 100644 index 000000000..737b79c1b --- /dev/null +++ b/src/data/pokemon_graphics/unknown_table.h @@ -0,0 +1,444 @@ +// Unknown and unused +static const u32 sUnused[] = +{ + [SPECIES_NONE] = 0x888, + [SPECIES_BULBASAUR] = 0x888, + [SPECIES_IVYSAUR] = 0x888, + [SPECIES_VENUSAUR] = 0x888, + [SPECIES_CHARMANDER] = 0x88, + [SPECIES_CHARMELEON] = 0x888, + [SPECIES_CHARIZARD] = 0x888, + [SPECIES_SQUIRTLE] = 0x886, + [SPECIES_WARTORTLE] = 0x888, + [SPECIES_BLASTOISE] = 0x886, + [SPECIES_CATERPIE] = 0x888, + [SPECIES_METAPOD] = 0x888, + [SPECIES_BUTTERFREE] = 0x888, + [SPECIES_WEEDLE] = 0x888, + [SPECIES_KAKUNA] = 0x888, + [SPECIES_BEEDRILL] = 0x888, + [SPECIES_PIDGEY] = 0x886, + [SPECIES_PIDGEOTTO] = 0x888, + [SPECIES_PIDGEOT] = 0x888, + [SPECIES_RATTATA] = 0x888, + [SPECIES_RATICATE] = 0x888, + [SPECIES_SPEAROW] = 0x888, + [SPECIES_FEAROW] = 0x886, + [SPECIES_EKANS] = 0x886, + [SPECIES_ARBOK] = 0x888, + [SPECIES_PIKACHU] = 0x88, + [SPECIES_RAICHU] = 0x88, + [SPECIES_SANDSHREW] = 0x88, + [SPECIES_SANDSLASH] = 0x88, + [SPECIES_NIDORAN_F] = 0x888, + [SPECIES_NIDORINA] = 0x886, + [SPECIES_NIDOQUEEN] = 0x888, + [SPECIES_NIDORAN_M] = 0x888, + [SPECIES_NIDORINO] = 0x888, + [SPECIES_NIDOKING] = 0x886, + [SPECIES_CLEFAIRY] = 0x886, + [SPECIES_CLEFABLE] = 0x888, + [SPECIES_VULPIX] = 0x88, + [SPECIES_NINETALES] = 0x88, + [SPECIES_JIGGLYPUFF] = 0x88, + [SPECIES_WIGGLYTUFF] = 0x88, + [SPECIES_ZUBAT] = 0x886, + [SPECIES_GOLBAT] = 0x886, + [SPECIES_ODDISH] = 0x88, + [SPECIES_GLOOM] = 0x886, + [SPECIES_VILEPLUME] = 0x886, + [SPECIES_PARAS] = 0x888, + [SPECIES_PARASECT] = 0x888, + [SPECIES_VENONAT] = 0x888, + [SPECIES_VENOMOTH] = 0x888, + [SPECIES_DIGLETT] = 0x888, + [SPECIES_DUGTRIO] = 0x888, + [SPECIES_MEOWTH] = 0x886, + [SPECIES_PERSIAN] = 0x888, + [SPECIES_PSYDUCK] = 0x88, + [SPECIES_GOLDUCK] = 0x88, + [SPECIES_MANKEY] = 0x888, + [SPECIES_PRIMEAPE] = 0x888, + [SPECIES_GROWLITHE] = 0x888, + [SPECIES_ARCANINE] = 0x886, + [SPECIES_POLIWAG] = 0x888, + [SPECIES_POLIWHIRL] = 0x888, + [SPECIES_POLIWRATH] = 0x888, + [SPECIES_ABRA] = 0x886, + [SPECIES_KADABRA] = 0x886, + [SPECIES_ALAKAZAM] = 0x886, + [SPECIES_MACHOP] = 0x886, + [SPECIES_MACHOKE] = 0x886, + [SPECIES_MACHAMP] = 0x886, + [SPECIES_BELLSPROUT] = 0x886, + [SPECIES_WEEPINBELL] = 0x888, + [SPECIES_VICTREEBEL] = 0x888, + [SPECIES_TENTACOOL] = 0x886, + [SPECIES_TENTACRUEL] = 0x886, + [SPECIES_GEODUDE] = 0x886, + [SPECIES_GRAVELER] = 0x886, + [SPECIES_GOLEM] = 0x886, + [SPECIES_PONYTA] = 0x888, + [SPECIES_RAPIDASH] = 0x888, + [SPECIES_SLOWPOKE] = 0x888, + [SPECIES_SLOWBRO] = 0x888, + [SPECIES_MAGNEMITE] = 0x886, + [SPECIES_MAGNETON] = 0x886, + [SPECIES_FARFETCHD] = 0x888, + [SPECIES_DODUO] = 0x886, + [SPECIES_DODRIO] = 0x886, + [SPECIES_SEEL] = 0x888, + [SPECIES_DEWGONG] = 0x888, + [SPECIES_GRIMER] = 0x88, + [SPECIES_MUK] = 0x88, + [SPECIES_SHELLDER] = 0x888, + [SPECIES_CLOYSTER] = 0x888, + [SPECIES_GASTLY] = 0x888, + [SPECIES_HAUNTER] = 0x888, + [SPECIES_GENGAR] = 0x888, + [SPECIES_ONIX] = 0x888, + [SPECIES_DROWZEE] = 0x888, + [SPECIES_HYPNO] = 0x888, + [SPECIES_KRABBY] = 0x888, + [SPECIES_KINGLER] = 0x888, + [SPECIES_VOLTORB] = 0x886, + [SPECIES_ELECTRODE] = 0x886, + [SPECIES_EXEGGCUTE] = 0x888, + [SPECIES_EXEGGUTOR] = 0x888, + [SPECIES_CUBONE] = 0x888, + [SPECIES_MAROWAK] = 0x888, + [SPECIES_HITMONLEE] = 0x88, + [SPECIES_HITMONCHAN] = 0x886, + [SPECIES_LICKITUNG] = 0x888, + [SPECIES_KOFFING] = 0x88, + [SPECIES_WEEZING] = 0x88, + [SPECIES_RHYHORN] = 0x88, + [SPECIES_RHYDON] = 0x88, + [SPECIES_CHANSEY] = 0x888, + [SPECIES_TANGELA] = 0x886, + [SPECIES_KANGASKHAN] = 0x888, + [SPECIES_HORSEA] = 0x88, + [SPECIES_SEADRA] = 0x88, + [SPECIES_GOLDEEN] = 0x886, + [SPECIES_SEAKING] = 0x886, + [SPECIES_STARYU] = 0x88, + [SPECIES_STARMIE] = 0x88, + [SPECIES_MR_MIME] = 0x888, + [SPECIES_SCYTHER] = 0x886, + [SPECIES_JYNX] = 0x886, + [SPECIES_ELECTABUZZ] = 0x888, + [SPECIES_MAGMAR] = 0x888, + [SPECIES_PINSIR] = 0x88, + [SPECIES_TAUROS] = 0x888, + [SPECIES_MAGIKARP] = 0x886, + [SPECIES_GYARADOS] = 0x886, + [SPECIES_LAPRAS] = 0x888, + [SPECIES_DITTO] = 0x886, + [SPECIES_EEVEE] = 0x888, + [SPECIES_VAPOREON] = 0x888, + [SPECIES_JOLTEON] = 0x886, + [SPECIES_FLAREON] = 0x888, + [SPECIES_PORYGON] = 0x888, + [SPECIES_OMANYTE] = 0x888, + [SPECIES_OMASTAR] = 0x888, + [SPECIES_KABUTO] = 0x888, + [SPECIES_KABUTOPS] = 0x888, + [SPECIES_AERODACTYL] = 0x888, + [SPECIES_SNORLAX] = 0x888, + [SPECIES_ARTICUNO] = 0x888, + [SPECIES_ZAPDOS] = 0x888, + [SPECIES_MOLTRES] = 0x888, + [SPECIES_DRATINI] = 0x888, + [SPECIES_DRAGONAIR] = 0x888, + [SPECIES_DRAGONITE] = 0x888, + [SPECIES_MEWTWO] = 0x88, + [SPECIES_MEW] = 0x888, + [SPECIES_CHIKORITA] = 0x888, + [SPECIES_BAYLEEF] = 0x888, + [SPECIES_MEGANIUM] = 0x888, + [SPECIES_CYNDAQUIL] = 0x888, + [SPECIES_QUILAVA] = 0x88, + [SPECIES_TYPHLOSION] = 0x888, + [SPECIES_TOTODILE] = 0x888, + [SPECIES_CROCONAW] = 0x886, + [SPECIES_FERALIGATR] = 0x886, + [SPECIES_SENTRET] = 0x888, + [SPECIES_FURRET] = 0x888, + [SPECIES_HOOTHOOT] = 0x888, + [SPECIES_NOCTOWL] = 0x888, + [SPECIES_LEDYBA] = 0x888, + [SPECIES_LEDIAN] = 0x888, + [SPECIES_SPINARAK] = 0x886, + [SPECIES_ARIADOS] = 0x888, + [SPECIES_CROBAT] = 0x886, + [SPECIES_CHINCHOU] = 0x88, + [SPECIES_LANTURN] = 0x88, + [SPECIES_PICHU] = 0x88, + [SPECIES_CLEFFA] = 0x888, + [SPECIES_IGGLYBUFF] = 0x88, + [SPECIES_TOGEPI] = 0x888, + [SPECIES_TOGETIC] = 0x888, + [SPECIES_NATU] = 0x88, + [SPECIES_XATU] = 0x88, + [SPECIES_MAREEP] = 0x888, + [SPECIES_FLAAFFY] = 0x886, + [SPECIES_AMPHAROS] = 0x888, + [SPECIES_BELLOSSOM] = 0x886, + [SPECIES_MARILL] = 0x886, + [SPECIES_AZUMARILL] = 0x886, + [SPECIES_SUDOWOODO] = 0x888, + [SPECIES_POLITOED] = 0x888, + [SPECIES_HOPPIP] = 0x888, + [SPECIES_SKIPLOOM] = 0x88, + [SPECIES_JUMPLUFF] = 0x888, + [SPECIES_AIPOM] = 0x888, + [SPECIES_SUNKERN] = 0x888, + [SPECIES_SUNFLORA] = 0x88, + [SPECIES_YANMA] = 0x888, + [SPECIES_WOOPER] = 0x888, + [SPECIES_QUAGSIRE] = 0x888, + [SPECIES_ESPEON] = 0x888, + [SPECIES_UMBREON] = 0x888, + [SPECIES_MURKROW] = 0x888, + [SPECIES_SLOWKING] = 0x888, + [SPECIES_MISDREAVUS] = 0x888, + [SPECIES_UNOWN] = 0x888, + [SPECIES_WOBBUFFET] = 0x88, + [SPECIES_GIRAFARIG] = 0x88, + [SPECIES_PINECO] = 0x886, + [SPECIES_FORRETRESS] = 0x888, + [SPECIES_DUNSPARCE] = 0x888, + [SPECIES_GLIGAR] = 0x888, + [SPECIES_STEELIX] = 0x888, + [SPECIES_SNUBBULL] = 0x888, + [SPECIES_GRANBULL] = 0x888, + [SPECIES_QWILFISH] = 0x888, + [SPECIES_SCIZOR] = 0x888, + [SPECIES_SHUCKLE] = 0x888, + [SPECIES_HERACROSS] = 0x88, + [SPECIES_SNEASEL] = 0x888, + [SPECIES_TEDDIURSA] = 0x886, + [SPECIES_URSARING] = 0x888, + [SPECIES_SLUGMA] = 0x88, + [SPECIES_MAGCARGO] = 0x88, + [SPECIES_SWINUB] = 0x888, + [SPECIES_PILOSWINE] = 0x888, + [SPECIES_CORSOLA] = 0x88, + [SPECIES_REMORAID] = 0x888, + [SPECIES_OCTILLERY] = 0x888, + [SPECIES_DELIBIRD] = 0x888, + [SPECIES_MANTINE] = 0x888, + [SPECIES_SKARMORY] = 0x88, + [SPECIES_HOUNDOUR] = 0x888, + [SPECIES_HOUNDOOM] = 0x888, + [SPECIES_KINGDRA] = 0x88, + [SPECIES_PHANPY] = 0x88, + [SPECIES_DONPHAN] = 0x88, + [SPECIES_PORYGON2] = 0x888, + [SPECIES_STANTLER] = 0x88, + [SPECIES_SMEARGLE] = 0x888, + [SPECIES_TYROGUE] = 0x888, + [SPECIES_HITMONTOP] = 0x888, + [SPECIES_SMOOCHUM] = 0x888, + [SPECIES_ELEKID] = 0x888, + [SPECIES_MAGBY] = 0x888, + [SPECIES_MILTANK] = 0x888, + [SPECIES_BLISSEY] = 0x888, + [SPECIES_RAIKOU] = 0x888, + [SPECIES_ENTEI] = 0x888, + [SPECIES_SUICUNE] = 0x888, + [SPECIES_LARVITAR] = 0x888, + [SPECIES_PUPITAR] = 0x888, + [SPECIES_TYRANITAR] = 0x888, + [SPECIES_LUGIA] = 0x886, + [SPECIES_HO_OH] = 0x888, + [SPECIES_CELEBI] = 0x888, + [SPECIES_OLD_UNOWN_B] = 0x888, + [SPECIES_OLD_UNOWN_C] = 0x888, + [SPECIES_OLD_UNOWN_D] = 0x888, + [SPECIES_OLD_UNOWN_E] = 0x888, + [SPECIES_OLD_UNOWN_F] = 0x888, + [SPECIES_OLD_UNOWN_G] = 0x888, + [SPECIES_OLD_UNOWN_H] = 0x888, + [SPECIES_OLD_UNOWN_I] = 0x888, + [SPECIES_OLD_UNOWN_J] = 0x888, + [SPECIES_OLD_UNOWN_K] = 0x888, + [SPECIES_OLD_UNOWN_L] = 0x888, + [SPECIES_OLD_UNOWN_M] = 0x888, + [SPECIES_OLD_UNOWN_N] = 0x888, + [SPECIES_OLD_UNOWN_O] = 0x888, + [SPECIES_OLD_UNOWN_P] = 0x888, + [SPECIES_OLD_UNOWN_Q] = 0x888, + [SPECIES_OLD_UNOWN_R] = 0x888, + [SPECIES_OLD_UNOWN_S] = 0x888, + [SPECIES_OLD_UNOWN_T] = 0x888, + [SPECIES_OLD_UNOWN_U] = 0x888, + [SPECIES_OLD_UNOWN_V] = 0x888, + [SPECIES_OLD_UNOWN_W] = 0x888, + [SPECIES_OLD_UNOWN_X] = 0x888, + [SPECIES_OLD_UNOWN_Y] = 0x888, + [SPECIES_OLD_UNOWN_Z] = 0x888, + [SPECIES_TREECKO] = 0x886, + [SPECIES_GROVYLE] = 0x886, + [SPECIES_SCEPTILE] = 0x886, + [SPECIES_TORCHIC] = 0x88, + [SPECIES_COMBUSKEN] = 0x88, + [SPECIES_BLAZIKEN] = 0x88, + [SPECIES_MUDKIP] = 0x886, + [SPECIES_MARSHTOMP] = 0x88, + [SPECIES_SWAMPERT] = 0x886, + [SPECIES_POOCHYENA] = 0x886, + [SPECIES_MIGHTYENA] = 0x886, + [SPECIES_ZIGZAGOON] = 0x88, + [SPECIES_LINOONE] = 0x886, + [SPECIES_WURMPLE] = 0x88, + [SPECIES_SILCOON] = 0x88, + [SPECIES_BEAUTIFLY] = 0x88, + [SPECIES_CASCOON] = 0x88, + [SPECIES_DUSTOX] = 0x88, + [SPECIES_LOTAD] = 0x886, + [SPECIES_LOMBRE] = 0x886, + [SPECIES_LUDICOLO] = 0x886, + [SPECIES_SEEDOT] = 0x888, + [SPECIES_NUZLEAF] = 0x888, + [SPECIES_SHIFTRY] = 0x886, + [SPECIES_NINCADA] = 0x886, + [SPECIES_NINJASK] = 0x886, + [SPECIES_SHEDINJA] = 0x886, + [SPECIES_TAILLOW] = 0x88, + [SPECIES_SWELLOW] = 0x88, + [SPECIES_SHROOMISH] = 0x886, + [SPECIES_BRELOOM] = 0x886, + [SPECIES_SPINDA] = 0x1882, + [SPECIES_WINGULL] = 0x88, + [SPECIES_PELIPPER] = 0x88, + [SPECIES_SURSKIT] = 0x88, + [SPECIES_MASQUERAIN] = 0x88, + [SPECIES_WAILMER] = 0x886, + [SPECIES_WAILORD] = 0x886, + [SPECIES_SKITTY] = 0x886, + [SPECIES_DELCATTY] = 0x88, + [SPECIES_KECLEON] = 0x88, + [SPECIES_BALTOY] = 0x88, + [SPECIES_CLAYDOL] = 0x88, + [SPECIES_NOSEPASS] = 0x886, + [SPECIES_TORKOAL] = 0x88, + [SPECIES_SABLEYE] = 0x886, + [SPECIES_BARBOACH] = 0x88, + [SPECIES_WHISCASH] = 0x88, + [SPECIES_LUVDISC] = 0x88, + [SPECIES_CORPHISH] = 0x88, + [SPECIES_CRAWDAUNT] = 0x88, + [SPECIES_FEEBAS] = 0x88, + [SPECIES_MILOTIC] = 0x88, + [SPECIES_CARVANHA] = 0x886, + [SPECIES_SHARPEDO] = 0x886, + [SPECIES_TRAPINCH] = 0x88, + [SPECIES_VIBRAVA] = 0x88, + [SPECIES_FLYGON] = 0x88, + [SPECIES_MAKUHITA] = 0x886, + [SPECIES_HARIYAMA] = 0x886, + [SPECIES_ELECTRIKE] = 0x88, + [SPECIES_MANECTRIC] = 0x88, + [SPECIES_NUMEL] = 0x88, + [SPECIES_CAMERUPT] = 0x88, + [SPECIES_SPHEAL] = 0x88, + [SPECIES_SEALEO] = 0x88, + [SPECIES_WALREIN] = 0x88, + [SPECIES_CACNEA] = 0x88, + [SPECIES_CACTURNE] = 0x88, + [SPECIES_SNORUNT] = 0x88, + [SPECIES_GLALIE] = 0x88, + [SPECIES_LUNATONE] = 0x88, + [SPECIES_SOLROCK] = 0x88, + [SPECIES_AZURILL] = 0x886, + [SPECIES_SPOINK] = 0x88, + [SPECIES_GRUMPIG] = 0x88, + [SPECIES_PLUSLE] = 0x886, + [SPECIES_MINUN] = 0x886, + [SPECIES_MAWILE] = 0x886, + [SPECIES_MEDITITE] = 0x886, + [SPECIES_MEDICHAM] = 0x886, + [SPECIES_SWABLU] = 0x88, + [SPECIES_ALTARIA] = 0x88, + [SPECIES_WYNAUT] = 0x88, + [SPECIES_DUSKULL] = 0x88, + [SPECIES_DUSCLOPS] = 0x88, + [SPECIES_ROSELIA] = 0x886, + [SPECIES_SLAKOTH] = 0x886, + [SPECIES_VIGOROTH] = 0x886, + [SPECIES_SLAKING] = 0x886, + [SPECIES_GULPIN] = 0x88, + [SPECIES_SWALOT] = 0x886, + [SPECIES_TROPIUS] = 0x88, + [SPECIES_WHISMUR] = 0x886, + [SPECIES_LOUDRED] = 0x886, + [SPECIES_EXPLOUD] = 0x886, + [SPECIES_CLAMPERL] = 0x88, + [SPECIES_HUNTAIL] = 0x88, + [SPECIES_GOREBYSS] = 0x88, + [SPECIES_ABSOL] = 0x88, + [SPECIES_SHUPPET] = 0x88, + [SPECIES_BANETTE] = 0x88, + [SPECIES_SEVIPER] = 0x88, + [SPECIES_ZANGOOSE] = 0x88, + [SPECIES_RELICANTH] = 0x88, + [SPECIES_ARON] = 0x886, + [SPECIES_LAIRON] = 0x886, + [SPECIES_AGGRON] = 0x886, + [SPECIES_CASTFORM] = 0x888, + [SPECIES_VOLBEAT] = 0x886, + [SPECIES_ILLUMISE] = 0x886, + [SPECIES_LILEEP] = 0x88, + [SPECIES_CRADILY] = 0x88, + [SPECIES_ANORITH] = 0x88, + [SPECIES_ARMALDO] = 0x88, + [SPECIES_RALTS] = 0x886, + [SPECIES_KIRLIA] = 0x886, + [SPECIES_GARDEVOIR] = 0x88, + [SPECIES_BAGON] = 0x88, + [SPECIES_SHELGON] = 0x88, + [SPECIES_SALAMENCE] = 0x88, + [SPECIES_BELDUM] = 0x88, + [SPECIES_METANG] = 0x88, + [SPECIES_METAGROSS] = 0x88, + [SPECIES_REGIROCK] = 0x88, + [SPECIES_REGICE] = 0x88, + [SPECIES_REGISTEEL] = 0x88, + [SPECIES_KYOGRE] = 0x88, + [SPECIES_GROUDON] = 0x88, + [SPECIES_RAYQUAZA] = 0x88, + [SPECIES_LATIAS] = 0x88, + [SPECIES_LATIOS] = 0x88, + [SPECIES_JIRACHI] = 0x88, + [SPECIES_DEOXYS] = 0x88, + [SPECIES_CHIMECHO] = 0x88, + [SPECIES_EGG] = 0x88, + [SPECIES_UNOWN_B] = 0x888, + [SPECIES_UNOWN_C] = 0x888, + [SPECIES_UNOWN_D] = 0x888, + [SPECIES_UNOWN_E] = 0x888, + [SPECIES_UNOWN_F] = 0x888, + [SPECIES_UNOWN_G] = 0x888, + [SPECIES_UNOWN_H] = 0x888, + [SPECIES_UNOWN_I] = 0x888, + [SPECIES_UNOWN_J] = 0x888, + [SPECIES_UNOWN_K] = 0x888, + [SPECIES_UNOWN_L] = 0x888, + [SPECIES_UNOWN_M] = 0x888, + [SPECIES_UNOWN_N] = 0x888, + [SPECIES_UNOWN_O] = 0x888, + [SPECIES_UNOWN_P] = 0x888, + [SPECIES_UNOWN_Q] = 0x888, + [SPECIES_UNOWN_R] = 0x888, + [SPECIES_UNOWN_S] = 0x888, + [SPECIES_UNOWN_T] = 0x888, + [SPECIES_UNOWN_U] = 0x888, + [SPECIES_UNOWN_V] = 0x888, + [SPECIES_UNOWN_W] = 0x888, + [SPECIES_UNOWN_X] = 0x888, + [SPECIES_UNOWN_Y] = 0x888, + [SPECIES_UNOWN_Z] = 0x888, + [SPECIES_UNOWN_EMARK] = 0x888, + [SPECIES_UNOWN_QMARK] = 0x888, +}; 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/data/trade.h b/src/data/trade.h index b9350863b..752971c11 100644 --- a/src/data/trade.h +++ b/src/data/trade.h @@ -1,3 +1,17 @@ +#define GFXTAG_MENU_TEXT 200 // Used as a base tag in CB2_CreateTradeMenu and CB2_ReturnToTradeMenu +#define GFXTAG_CURSOR 300 +#define GFXTAG_LINK_MON_GLOW 5550 +#define GFXTAG_LINK_MON_SHADOW 5552 +#define GFXTAG_CABLE_END 5554 +#define GFXTAG_GBA_SCREEN 5556 +#define GFXTAG_POKEBALL 5557 + +#define PALTAG_CURSOR 2345 +#define PALTAG_MENU_TEXT 4925 +#define PALTAG_LINK_MON 5551 +#define PALTAG_GBA 5555 +#define PALTAG_POKEBALL 5558 + // Exists unused in RS as well static const u32 sUnusedStructSizes[] = { @@ -15,7 +29,7 @@ static const u16 sTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_ static const u8 sTradeStripesBG2Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg2_map.bin"); static const u8 sTradeStripesBG3Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg3_map.bin"); static const u8 sText_EmptyString[] = _(""); -static const u8 sText_UnusedTextFormat[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GREY}"); +static const u8 sText_UnusedTextFormat[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GRAY}"); const u8 gText_MaleSymbol4[] = _("♂"); const u8 gText_FemaleSymbol4[] = _("♀"); const u8 gText_GenderlessSymbol[] = _(""); @@ -25,7 +39,7 @@ static const u8 sText_Slash[] = _("/"); static const u8 sText_Lv[] = _("Lv. "); static const u8 sText_ThreeDashes[] = _("---"); static const u8 sText_FourQuestionMarks[] = _("????"); -static const u8 sText_832DAE4[] = _(""); +static const u8 sText_UnusedEmpty[] = _(""); static const u8 sText_IsThisTradeOkay[] = _("Is this trade okay?"); static const u8 sText_Cancel[] = _("CANCEL"); static const u8 sText_ChooseAPkmn[] = _("Choose a POKéMON."); @@ -35,10 +49,10 @@ static const u8 sText_CancelTrade[] = _("Cancel trade?"); static const u8 sJPText_PressBButtonToQuit[] = _("Bボタン で もどります"); static const u8 sText_Summary2[] = _("SUMMARY"); static const u8 sText_Trade2[] = _("TRADE"); -static const u8 sText_CommunicationStandby[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}Communication standby…\nPlease wait."); -static const u8 sText_TheTradeHasBeenCanceled[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}The trade has\nbeen canceled."); +static const u8 sText_CommunicationStandby[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}Communication standby…\nPlease wait."); +static const u8 sText_TheTradeHasBeenCanceled[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}The trade has\nbeen canceled."); static const u8 sText_OnlyPkmnForBattle[] = _("That's your only\nPOKéMON for battle."); -static const u8 sText_WaitingForYourFriend[] = _("{COLOR DARK_GREY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GREY}Waiting for your friend\nto finish…"); +static const u8 sText_WaitingForYourFriend[] = _("{COLOR DARK_GRAY}{HIGHLIGHT WHITE}{SHADOW LIGHT_GRAY}Waiting for your friend\nto finish…"); static const u8 sText_YourFriendWantsToTrade[] = _("Your friend wants\nto trade POKéMON."); static const struct OamData sTradeOamData_32x16 = @@ -48,107 +62,113 @@ static const struct OamData sTradeOamData_32x16 = .priority = 1 }; -static const struct OamData sTradeOamData_64x32 = +static const struct OamData sOamData_Cursor = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; -static const union AnimCmd gSpriteAnim_832DC24[] = +static const union AnimCmd sAnim_Cursor_Normal[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_832DC2C[] = +static const union AnimCmd sAnim_Cursor_OnCancel[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_832DC34[] = +enum { + CURSOR_ANIM_NORMAL, + CURSOR_ANIM_ON_CANCEL, +}; + +static const union AnimCmd *const sAnims_Cursor[] = { - gSpriteAnim_832DC24, - gSpriteAnim_832DC2C + [CURSOR_ANIM_NORMAL] = sAnim_Cursor_Normal, + [CURSOR_ANIM_ON_CANCEL] = sAnim_Cursor_OnCancel }; -static const struct SpriteSheet sTradeButtonsSpriteSheet = +static const struct SpriteSheet sCursor_SpriteSheet = { - .data = gTradeButtons_Gfx, + .data = gTradeCursor_Gfx, .size = 0x800, - .tag = 300 + .tag = GFXTAG_CURSOR }; -static const struct SpritePalette gUnknown_0832DC44 = +static const struct SpritePalette sCursor_SpritePalette = { - .data = gUnknown_08DDB444, - .tag = 2345 + .data = gTradeCursor_Pal, + .tag = PALTAG_CURSOR }; -static const union AnimCmd gSpriteAnim_832DC4C[] = +static const union AnimCmd sAnim_MenuText_0[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_832DC54[] = +static const union AnimCmd sAnim_MenuText_1[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_832DC5C[] = +static const union AnimCmd sAnim_MenuText_2[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_832DC64[] = +static const union AnimCmd sAnim_MenuText_3[] = { ANIMCMD_FRAME(24, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_832DC6C[] = +static const union AnimCmd sAnim_MenuText_4[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_832DC74[] = +static const union AnimCmd sAnim_MenuText_5[] = { ANIMCMD_FRAME(40, 5), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_832DC7C[] = +// These anims are not used +static const union AnimCmd *const sAnims_MenuText[] = { - gSpriteAnim_832DC4C, - gSpriteAnim_832DC54, - gSpriteAnim_832DC5C, - gSpriteAnim_832DC64, - gSpriteAnim_832DC6C, - gSpriteAnim_832DC74 + sAnim_MenuText_0, + sAnim_MenuText_1, + sAnim_MenuText_2, + sAnim_MenuText_3, + sAnim_MenuText_4, + sAnim_MenuText_5 }; -static const struct SpriteTemplate gSpriteTemplate_832DC94 = +static const struct SpriteTemplate sSpriteTemplate_Cursor = { - .tileTag = 300, - .paletteTag = 2345, - .oam = &sTradeOamData_64x32, - .anims = gSpriteAnimTable_832DC34, + .tileTag = GFXTAG_CURSOR, + .paletteTag = PALTAG_CURSOR, + .oam = &sOamData_Cursor, + .anims = sAnims_Cursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate gSpriteTemplate_832DCAC = +static const struct SpriteTemplate sSpriteTemplate_MenuText = { - .tileTag = 200, - .paletteTag = 4925, + .tileTag = GFXTAG_MENU_TEXT, + .paletteTag = PALTAG_MENU_TEXT, .oam = &sTradeOamData_32x16, - .anims = gSpriteAnimTable_832DC7C, + .anims = sAnims_MenuText, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, @@ -158,7 +178,7 @@ static const u16 TradeScreenTextPalette[] = INCBIN_U16("graphics/trade/text.gbap static const struct SpritePalette gSpritePalette_TradeScreenText = { .data = TradeScreenTextPalette, - .tag = 4925 + .tag = PALTAG_MENU_TEXT }; // This is used to determine the next mon to select when the D-Pad is @@ -337,26 +357,26 @@ static const u8 sTradeMonBoxCoords[][2][2] = }, }; -static const u8 sUnref_0832DE6E[] = -{ - 0x00, 0x0e, - 0x0f, 0x1d, - 0x03, 0x05, - 0x03, 0x07, - 0x12, 0x05, - 0x12, 0x07, - 0x08, 0x07, - 0x16, 0x0c, - 0x08, 0x07, - 0x16, 0x0c, - 0x06, 0x07, - 0x18, 0x0c, - 0x06, 0x07, - 0x18, 0x0c, - 0x08, 0x07, - 0x16, 0x0c, - 0x07, 0x07, - 0x17, 0x0c +static const u8 sUnusedCoords[][2] = +{ + { 0, 14}, + {15, 29}, + { 3, 5}, + { 3, 7}, + {18, 5}, + {18, 7}, + { 8, 7}, + {22, 12}, + { 8, 7}, + {22, 12}, + { 6, 7}, + {24, 12}, + { 6, 7}, + {24, 12}, + { 8, 7}, + {22, 12}, + { 7, 7}, + {23, 12} }; static const u8 *const sTradeActionTexts[] = @@ -392,7 +412,7 @@ static const u8 sTradeTextColors[] = { TEXT_COLOR_TRANSPARENT, //bg color TEXT_COLOR_WHITE, //fg color - TEXT_COLOR_DARK_GREY //shadow color + TEXT_COLOR_DARK_GRAY //shadow color }; static const struct BgTemplate sTradeMenuBgTemplates[] = @@ -620,42 +640,42 @@ static const u8 sTradeMenuPartyMonBoxDimensions[3][2] = [TRADE_PARTNER] = {19, 3} }; -static const u16 sTradePal_PokeBall[] = INCBIN_U16("graphics/trade/pokeball.gbapal"); -static const u8 sTradeGfx_PokeBall[] = INCBIN_U8("graphics/trade/pokeball.4bpp"); -static const u8 sTradeGfx_PokeBallSymbol[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); // unused? -static const u16 sTradeTilemap_Cable[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); +static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/trade/pokeball.gbapal"); +static const u8 sPokeball_Gfx[] = INCBIN_U8("graphics/trade/pokeball.4bpp"); +static const u8 sPokeballSymbol_Gfx[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); // unused +static const u16 sCrossingHighlightCable_Tilemap[] = INCBIN_U16("graphics/trade/crossing_highlight_cable.bin"); static const u16 sTradeTilemap_PokeBallSymbol[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); // unused? -static const u16 sUnref_083308C0[] = INCBIN_U16("graphics/trade/unknown_3308C0.gbapal"); -static const u16 sTradePal_Gba[] = INCBIN_U16("graphics/trade/gba.gbapal"); -static const u16 sTradePal_ShadowUnused[] = INCBIN_U16("graphics/trade/shadow.gbapal"); -static const u16 sTradePal_BlackUnused[] = INCBIN_U16("graphics/trade/black.gbapal"); -static const u16 sTradePal_Misc[] = INCBIN_U16("graphics/trade/misc.gbapal"); -static const u8 sTradeGfx_Glow1[] = INCBIN_U8("graphics/trade/glow1.4bpp"); -static const u8 sTradeGfx_Glow2[] = INCBIN_U8("graphics/trade/glow2.4bpp"); -static const u8 sTradeGfx_CableEnd[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); -static const u8 sTradeGfx_GbaScreen[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); -const u16 gUnknown_08331F60[] = INCBIN_U16("graphics/trade/shadow_map.bin"); -static const u8 sTradeAffine_Gba[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); -static const u8 sFiller_08335760[64] = {}; -static const u8 sTradeAffineMap_GbaCable[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); -static const u8 sTradeAffineMap_GbaWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); -static const u16 sTradeTilemap_GbaWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); -static const u16 sTradeTilemap_GbaCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); -static const u32 gUnknown_083379A0[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz"); //some wireless tilemap -static const u16 sTradePal_WirelessSignalSend[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); -static const u16 sTradePal_WirelessSignalReceive[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); -static const u16 sTradePal_Black[] = INCBIN_U16("graphics/trade/black.gbapal"); -static const u32 sTradeGfx_WirelessSignal[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); -static const u32 sTradeTilemap_WirelessSignal[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); - -static const struct OamData sTradeOamData_16x16 = +static const u16 sUnusedPal1[] = INCBIN_U16("graphics/trade/unused1.gbapal"); +static const u16 sGba_Pal[] = INCBIN_U16("graphics/trade/gba.gbapal"); +static const u16 sUnusedPal2[] = INCBIN_U16("graphics/trade/unused2.gbapal"); +static const u16 sWirelessSignalNone_Pal_Unused[] = INCBIN_U16("graphics/trade/wireless_signal_none.gbapal"); +static const u16 sLinkMon_Pal[] = INCBIN_U16("graphics/trade/link_mon.gbapal"); +static const u8 sLinkMonGlow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_glow.4bpp"); +static const u8 sLinkMonShadow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_shadow.4bpp"); +static const u8 sCableEnd_Gfx[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); +static const u8 sGbaScreen_Gfx[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); +const u16 gTradePlatform_Tilemap[] = INCBIN_U16("graphics/trade/platform.bin"); +static const u8 sGbaAffine_Gfx[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); // Only the gfx for when the GBA is zooming in/out +static const u8 sEmptyGfx[64] = {}; +static const u8 sGbaCable_AffineTilemap[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); +static const u8 sGbaWireless_AffineTilemap[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); +static const u16 sGbaWireless_Tilemap[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); +static const u16 sGbaCable_Tilemap[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); +static const u32 sCrossingHighlightWireless_Tilemap[] = INCBIN_U32("graphics/trade/crossing_highlight_wireless.bin.lz"); +static const u16 sWirelessSignalSend_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); +static const u16 sWirelessSignalRecv_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); +static const u16 sWirelessSignalNone_Pal[] = INCBIN_U16("graphics/trade/wireless_signal_none.gbapal"); +static const u32 sWirelessSignal_Gfx[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); +static const u32 sWirelessSignal_Tilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); + +static const struct OamData sOamData_Pokeball = { .affineMode = ST_OAM_AFFINE_NORMAL, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16) }; -static const union AnimCmd gSpriteAnim_8338C4C[] = +static const union AnimCmd sAnim_Pokeball_SpinOnce[] = { ANIMCMD_FRAME( 0, 3), ANIMCMD_FRAME( 4, 3), @@ -674,7 +694,7 @@ static const union AnimCmd gSpriteAnim_8338C4C[] = ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8338C88[] = +static const union AnimCmd sAnim_Pokeball_SpinTwice[] = { ANIMCMD_FRAME( 0, 3), ANIMCMD_FRAME( 4, 3), @@ -693,25 +713,25 @@ static const union AnimCmd gSpriteAnim_8338C88[] = ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8338C88[] = +static const union AnimCmd *const sAnims_Pokeball[] = { - gSpriteAnim_8338C4C, - gSpriteAnim_8338C88 + sAnim_Pokeball_SpinOnce, + sAnim_Pokeball_SpinTwice }; -static const union AffineAnimCmd gSpriteAffineAnim_8338CCC[] = +static const union AffineAnimCmd sAffineAnim_Pokeball_Normal[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gSpriteAffineAnim_8338CDC[] = +static const union AffineAnimCmd sAffineAnim_Pokeball_Squish[] = { AFFINEANIMCMD_FRAME(-8, 0, 0, 20), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gSpriteAffineAnim_8338CEC[] = +static const union AffineAnimCmd sAffineAnim_Pokeball_Unsquish[] = { AFFINEANIMCMD_FRAME(0x60, 0x100, 0, 0), AFFINEANIMCMD_FRAME( 0, 0, 0, 5), @@ -719,38 +739,38 @@ static const union AffineAnimCmd gSpriteAffineAnim_8338CEC[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D0C[] = +static const union AffineAnimCmd *const sAffineAnims_Pokeball[] = { - gSpriteAffineAnim_8338CCC, - gSpriteAffineAnim_8338CDC, - gSpriteAffineAnim_8338CEC + sAffineAnim_Pokeball_Normal, + sAffineAnim_Pokeball_Squish, + sAffineAnim_Pokeball_Unsquish }; static const struct SpriteSheet sPokeBallSpriteSheet = { - .data = sTradeGfx_PokeBall, + .data = sPokeball_Gfx, .size = 0x600, - .tag = 5557 + .tag = GFXTAG_POKEBALL }; static const struct SpritePalette sPokeBallSpritePalette = { - .data = sTradePal_PokeBall, - .tag = 5558 + .data = sPokeball_Pal, + .tag = PALTAG_POKEBALL }; -static const struct SpriteTemplate gSpriteTemplate_8338D28 = +static const struct SpriteTemplate sSpriteTemplate_Pokeball = { - .tileTag = 5557, - .paletteTag = 5558, - .oam = &sTradeOamData_16x16, - .anims = gSpriteAnimTable_8338C88, + .tileTag = GFXTAG_POKEBALL, + .paletteTag = PALTAG_POKEBALL, + .oam = &sOamData_Pokeball, + .anims = sAnims_Pokeball, .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8338D0C, - .callback = sub_807E55C + .affineAnims = sAffineAnims_Pokeball, + .callback = SpriteCB_BouncingPokeball }; -static const struct OamData sTradeOamData_32x32 = +static const struct OamData sOamData_LinkMonGlow = { .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, @@ -759,146 +779,151 @@ static const struct OamData sTradeOamData_32x32 = .priority = 1 }; -static const union AnimCmd gSpriteAnim_8338D48[] = +static const union AnimCmd sAnim_LinkMonGlow[] = { - ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), // ? The graphic is a perfect circle, no need to flip ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8338D50[] = +static const union AnimCmd *const sAnims_LinkMonGlow[] = { - gSpriteAnim_8338D48 + sAnim_LinkMonGlow }; -static const union AffineAnimCmd gSpriteAffineAnim_8338D54[] = +static const union AffineAnimCmd sAffineAnim_LinkMonGlow[] = { AFFINEANIMCMD_FRAME(-10, -10, 0, 5), AFFINEANIMCMD_FRAME(10, 10, 0, 5), AFFINEANIMCMD_JUMP(0) }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338D6C[] = +static const union AffineAnimCmd *const sAffineAnims_LinkMonGlow[] = { - gSpriteAffineAnim_8338D54 + sAffineAnim_LinkMonGlow }; -static const struct SpriteSheet sGlow1SpriteSheet = +static const struct SpriteSheet sSpriteSheet_LinkMonGlow = { - .data = sTradeGfx_Glow1, + .data = sLinkMonGlow_Gfx, .size = 0x200, - .tag = 5550 + .tag = GFXTAG_LINK_MON_GLOW }; -static const struct SpritePalette sMiscTradeSpritePalette = +static const struct SpritePalette sSpritePalette_LinkMon = { - .data = sTradePal_Misc, - .tag = 5551 + .data = sLinkMon_Pal, + .tag = PALTAG_LINK_MON }; -static const struct SpritePalette sGbaSpritePalette = +static const struct SpritePalette sSpritePalette_Gba = { - .data = sTradePal_Gba, - .tag = 5555 + .data = sGba_Pal, + .tag = PALTAG_GBA }; -static const struct SpriteTemplate gUnknown_08338D88 = +static const struct SpriteTemplate sSpriteTemplate_LinkMonGlow = { - .tileTag = 5550, - .paletteTag = 5551, - .oam = &sTradeOamData_32x32, - .anims = gSpriteAnimTable_8338D50, + .tileTag = GFXTAG_LINK_MON_GLOW, + .paletteTag = PALTAG_LINK_MON, + .oam = &sOamData_LinkMonGlow, + .anims = sAnims_LinkMonGlow, .images = NULL, - .affineAnims = gSpriteAffineAnimTable_8338D6C, - .callback = sub_807AA28 + .affineAnims = sAffineAnims_LinkMonGlow, + .callback = SpriteCB_LinkMonGlow }; -static const struct OamData sTradeOamData_16x32 = +static const struct OamData sOamData_LinkMonShadow = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 1 }; -static const union AnimCmd gSpriteAnim_8338DA8[] = +static const union AnimCmd sAnim_LinkMonShadow_Big[] = { ANIMCMD_FRAME(0, 5, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8338DB0[] = +static const union AnimCmd sAnim_LinkMonShadow_Small[] = { ANIMCMD_FRAME(8, 5, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8338DB8[] = +enum { + ANIM_LINKMON_BIG, + ANIM_LINKMON_SMALL, +}; + +static const union AnimCmd *const sAnims_LinkMonShadow[] = { - gSpriteAnim_8338DA8, - gSpriteAnim_8338DB0 + [ANIM_LINKMON_BIG] = sAnim_LinkMonShadow_Big, + [ANIM_LINKMON_SMALL] = sAnim_LinkMonShadow_Small }; -static const struct SpriteSheet sGlow2SpriteSheet = +static const struct SpriteSheet sSpriteSheet_LinkMonShadow = { - .data = sTradeGfx_Glow2, + .data = sLinkMonShadow_Gfx, .size = 0x300, - .tag = 5552 + .tag = GFXTAG_LINK_MON_SHADOW }; -static const struct SpriteTemplate sGlowBallSpriteTemplate = +static const struct SpriteTemplate sSpriteTemplate_LinkMonShadow = { - .tileTag = 5552, - .paletteTag = 5551, - .oam = &sTradeOamData_16x32, - .anims = gSpriteAnimTable_8338DB8, + .tileTag = GFXTAG_LINK_MON_SHADOW, + .paletteTag = PALTAG_LINK_MON, + .oam = &sOamData_LinkMonShadow, + .anims = sAnims_LinkMonShadow, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807AA7C + .callback = SpriteCB_LinkMonShadow }; -static const struct OamData sTradeOamData_16x32_2 = +static const struct OamData sOamData_CableEnd = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 1 }; -static const union AnimCmd gSpriteAnim_8338DE8[] = +static const union AnimCmd sAnim_CableEnd[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8338DF0[] = +static const union AnimCmd *const sAnims_CableEnd[] = { - gSpriteAnim_8338DE8 + sAnim_CableEnd }; -static const struct SpriteSheet sCableEndSpriteSheet = +static const struct SpriteSheet sSpriteSheet_CableEnd = { - .data = sTradeGfx_CableEnd, + .data = sCableEnd_Gfx, .size = 0x100, - .tag = 5554 + .tag = GFXTAG_CABLE_END }; -static const struct SpriteTemplate gSpriteTemplate_8338DFC = +static const struct SpriteTemplate sSpriteTemplate_CableEnd = { - .tileTag = 5554, - .paletteTag = 5555, - .oam = &sTradeOamData_16x32_2, - .anims = gSpriteAnimTable_8338DF0, + .tileTag = GFXTAG_CABLE_END, + .paletteTag = PALTAG_GBA, + .oam = &sOamData_CableEnd, + .anims = sAnims_CableEnd, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807AABC + .callback = SpriteCB_CableEndSending }; -static const struct OamData sTradeOamData_64x32_2 = +static const struct OamData sOamData_GbaScreen = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; -static const union AnimCmd gSpriteAnim_8338E1C[] = +static const union AnimCmd sAnim_GbaScreen_Long[] = { ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), @@ -911,7 +936,7 @@ static const union AnimCmd gSpriteAnim_8338E1C[] = ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8338E40[] = +static const union AnimCmd sAnim_GbaScreen_Short[] = { ANIMCMD_FRAME( 0, 2, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 2, .vFlip = TRUE, .hFlip = TRUE), @@ -924,56 +949,56 @@ static const union AnimCmd gSpriteAnim_8338E40[] = ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8338E64[] = +static const union AnimCmd *const sAnims_GbaScreen_Long[] = { - gSpriteAnim_8338E1C + sAnim_GbaScreen_Long }; -static const union AnimCmd *const gSpriteAnimTable_8338E68[] = +static const union AnimCmd *const sAnims_GbaScreen_Short[] = { - gSpriteAnim_8338E40 + sAnim_GbaScreen_Short }; -static const struct SpriteSheet sGbaScreenSpriteSheet = +static const struct SpriteSheet sSpriteSheet_GbaScreen = { - .data = sTradeGfx_GbaScreen, + .data = sGbaScreen_Gfx, .size = 0x1000, - .tag = 5556 + .tag = GFXTAG_GBA_SCREEN }; -static const struct SpriteTemplate gSpriteTemplate_8338E74 = +static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Long = { - .tileTag = 5556, - .paletteTag = 5555, - .oam = &sTradeOamData_64x32_2, - .anims = gSpriteAnimTable_8338E64, + .tileTag = GFXTAG_GBA_SCREEN, + .paletteTag = PALTAG_GBA, + .oam = &sOamData_GbaScreen, + .anims = sAnims_GbaScreen_Long, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807AB04 + .callback = SpriteCB_GbaScreen }; -static const struct SpriteTemplate gSpriteTemplate_8338E8C = +static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Short = { - .tileTag = 5556, - .paletteTag = 5555, - .oam = &sTradeOamData_64x32_2, - .anims = gSpriteAnimTable_8338E68, + .tileTag = GFXTAG_GBA_SCREEN, + .paletteTag = PALTAG_GBA, + .oam = &sOamData_GbaScreen, + .anims = sAnims_GbaScreen_Short, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_807AB04 + .callback = SpriteCB_GbaScreen }; -static const u16 gUnknown_08338EA4[] = INCBIN_U16("graphics/trade/unknown_338EA4.gbapal"); +static const u16 sLinkMonShadow_Pal[] = INCBIN_U16("graphics/trade/link_mon_shadow.gbapal"); -static const union AffineAnimCmd gSpriteAffineAnim_8338EBC[] = +static const union AffineAnimCmd sAffineAnim_CrossingMonPic[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_JUMP(0) }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_8338ECC[] = +static const union AffineAnimCmd *const sAffineAnims_CrossingMonPics[] = { - gSpriteAffineAnim_8338EBC + sAffineAnim_CrossingMonPic }; static const struct InGameTrade sIngameTrades[] = @@ -1070,7 +1095,7 @@ static const u16 sIngameTradeMail[][MAIL_WORDS_COUNT + 1] = EC_WORD_THANK_YOU, EC_WORD_FOR, EC_POKEMON(SKITTY), - EC_POKEMON2(MEOWTH), + EC_POKEMON_NATIONAL(MEOWTH), EC_WORD_CRIES, EC_WORD_IN, EC_WORD_A, @@ -1146,69 +1171,54 @@ static const struct BgTemplate sTradeSequenceBgTemplates[] = static const s8 sTradeBallVerticalVelocityTable[] = { - 0, 0, 1, 0, - 1, 0, 1, 1, - 1, 1, 2, 2, - 2, 2, 3, 3, - 3, 3, 4, 4, - 4, 4, -4, -4, - -4, -3, -3, -3, - -3, -2, -2, -2, - -2, -1, -1, -1, - -1, 0, -1, 0, - -1, 0, 0, 0, - 0, 0, 1, 0, - 1, 0, 1, 1, - 1, 1, 2, 2, - 2, 2, 3, 3, - 3, 3, 4, 4, - 4, 4, -4, -3, - -3, -2, -2, -1, - -1, -1, 0, -1, - 0, 0, 0, 0, - 0, 0, 1, 0, - 1, 1, 1, 2, - 2, 3, 3, 4, - -4, -3, -2, -1, - -1, -1, 0, 0, - 0, 0, 1, 0, - 1, 1, 2, 3 + 0, 0, 1, 0, 1, 0, 1, 1, 1, + 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, -4, -4, -4, -3, -3, + -3, -3, -2, -2, -2, -2, -1, -1, -1, + -1, 0, -1, 0, -1, 0, 0, 0, 0, + 0, 1, 0, 1, 0, 1, 1, 1, 1, + 2, 2, 2, 2, 3, 3, 3, 3, 4, + 4, 4, 4, -4, -3, -3, -2, -2, -1, + -1, -1, 0, -1, 0, 0, 0, 0, 0, + 0, 1, 0, 1, 1, 1, 2, 2, 3, + 3, 4, -4, -3, -2, -1, -1, -1, 0, + 0, 0, 0, 1, 0, 1, 1, 2, 3 }; static const u8 sWirelessSignalTiming[][2] = { - {0, 1}, - {1, 1}, - {2, 1}, - {3, 1}, - {4, 1}, - {5, 2}, - {6, 2}, - {7, 2}, - {8, 2}, - {9, 2}, - {10, 3}, - {11, 3}, - {12, 3}, - {13, 4}, - {14, 5}, - {15, 2}, - {0, 1}, - {1, 1}, - {2, 1}, - {3, 1}, - {4, 1}, - {5, 2}, - {6, 2}, - {7, 2}, - {8, 2}, - {9, 2}, - {10, 3}, - {11, 3}, - {12, 3}, - {13, 4}, - {14, 5}, - {16, 1}, - {16, 255}, - {0, 0} + { 0, 1}, + { 1, 1}, + { 2, 1}, + { 3, 1}, + { 4, 1}, + { 5, 2}, + { 6, 2}, + { 7, 2}, + { 8, 2}, + { 9, 2}, + {10, 3}, + {11, 3}, + {12, 3}, + {13, 4}, + {14, 5}, + {15, 2}, + { 0, 1}, + { 1, 1}, + { 2, 1}, + { 3, 1}, + { 4, 1}, + { 5, 2}, + { 6, 2}, + { 7, 2}, + { 8, 2}, + { 9, 2}, + {10, 3}, + {11, 3}, + {12, 3}, + {13, 4}, + {14, 5}, + {16, 1}, + {16, -1}, + {} }; diff --git a/src/data/wallpapers.h b/src/data/wallpapers.h new file mode 100644 index 000000000..64c61fe2d --- /dev/null +++ b/src/data/wallpapers.h @@ -0,0 +1,393 @@ +enum { + WALLPAPER_FOREST, + WALLPAPER_CITY, + WALLPAPER_DESERT, + WALLPAPER_SAVANNA, + WALLPAPER_CRAG, + WALLPAPER_VOLCANO, + WALLPAPER_SNOW, + WALLPAPER_CAVE, + WALLPAPER_BEACH, + WALLPAPER_SEAFLOOR, + WALLPAPER_RIVER, + WALLPAPER_SKY, + WALLPAPER_POLKADOT, + WALLPAPER_POKECENTER, + WALLPAPER_MACHINE, + WALLPAPER_PLAIN, + WALLPAPER_FRIENDS, // The one received as a gift from Walda's parents. + WALLPAPER_COUNT +}; +#define MAX_DEFAULT_WALLPAPER WALLPAPER_SAVANNA + +static const u16 sWallpaperPalettes_Forest[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_City[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/city/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/city/bg.gbapal"), +}; +static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Desert[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Savanna[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Crag[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Volcano[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Snow[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Cave[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Beach[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Seafloor[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_River[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/river/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/river/bg.gbapal"), +}; +static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.lz"); +static const u16 sWallpaperPalettes_Sky[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_PolkaDot[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/polkadot/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/polkadot/bg.gbapal"), +}; +static const u32 sWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/polkadot/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Pokecenter[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Machine[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/machine/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/machine/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/machine/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Plain[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/plain/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/plain/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/plain/tilemap.bin.lz"); + +// 12x18 tilemap +static const u32 sWallpaperTilemap_Unused[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/unused.bin"); + +// Shadow color, text color +static const u16 sBoxTitleColors[WALLPAPER_COUNT][2] = +{ + [WALLPAPER_FOREST] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_CITY] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_DESERT] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_SAVANNA] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_CRAG] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_VOLCANO] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_SNOW] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_CAVE] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_BEACH] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_SEAFLOOR] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_RIVER] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_SKY] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_POLKADOT] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_POKECENTER] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_MACHINE] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_PLAIN] = {RGB(7, 7, 7), RGB_WHITE}, + [WALLPAPER_FRIENDS] = {RGB(7, 7, 7), RGB_WHITE} +}; + +#define WALLPAPER_ENTRY(name) {sWallpaperTiles_##name, sWallpaperTilemap_##name, sWallpaperPalettes_##name[0]} +// A few wallpapers are not defined in this file +#define WALLPAPER_ENTRY_G(name) {gWallpaperTiles_##name, gWallpaperTilemap_##name, gWallpaperPalettes_##name[0]} + +static const struct Wallpaper sWallpapers[WALLPAPER_COUNT - 1] = +{ + [WALLPAPER_FOREST] = WALLPAPER_ENTRY(Forest), + [WALLPAPER_CITY] = WALLPAPER_ENTRY(City), + [WALLPAPER_DESERT] = WALLPAPER_ENTRY(Desert), + [WALLPAPER_SAVANNA] = WALLPAPER_ENTRY(Savanna), + [WALLPAPER_CRAG] = WALLPAPER_ENTRY(Crag), + [WALLPAPER_VOLCANO] = WALLPAPER_ENTRY(Volcano), + [WALLPAPER_SNOW] = WALLPAPER_ENTRY(Snow), + [WALLPAPER_CAVE] = WALLPAPER_ENTRY(Cave), + [WALLPAPER_BEACH] = WALLPAPER_ENTRY(Beach), + [WALLPAPER_SEAFLOOR] = WALLPAPER_ENTRY(Seafloor), + [WALLPAPER_RIVER] = WALLPAPER_ENTRY(River), + [WALLPAPER_SKY] = WALLPAPER_ENTRY(Sky), + [WALLPAPER_POLKADOT] = WALLPAPER_ENTRY(PolkaDot), + [WALLPAPER_POKECENTER] = WALLPAPER_ENTRY(Pokecenter), + [WALLPAPER_MACHINE] = WALLPAPER_ENTRY(Machine), + [WALLPAPER_PLAIN] = WALLPAPER_ENTRY(Plain), +}; + +static const u8 sArrow_Gfx[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); + +static const u16 sWallpaperPalettes_Zigzagoon[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/zigzagoon/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/zigzagoon/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Screen[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/screen/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/screen/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Diagonal[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/diagonal/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/diagonal/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Block[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/block/bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/block/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/block/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Pokecenter2[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter2/bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter2/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter2/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Frame[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/frame/bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/frame/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/frame/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Blank[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame1.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/zigzagoon/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/blank/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Circles[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/circles/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/circles/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Azumarill[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/azumarill/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/azumarill/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Pikachu[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/pikachu/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pikachu/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Legendary[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/legendary/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/legendary/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Dusclops[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/dusclops/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/dusclops/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Ludicolo[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/ludicolo/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ludicolo/tilemap.bin.lz"); + +static const u16 sWallpaperPalettes_Whiscash[][16] = +{ + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/whiscash/bg.gbapal"), +}; +static const u32 sWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tiles.4bpp.lz"); +static const u32 sWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/whiscash/tilemap.bin.lz"); + +static const u32 sWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/aqua.4bpp.lz"); +static const u32 sWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/heart.4bpp.lz"); +static const u32 sWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/five_star.4bpp.lz"); +static const u32 sWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/brick.4bpp.lz"); +static const u32 sWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_star.4bpp.lz"); +static const u32 sWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/asterisk.4bpp.lz"); +static const u32 sWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/dot.4bpp.lz"); +static const u32 sWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/line_circle.4bpp.lz"); +static const u32 sWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pokeball.4bpp.lz"); +static const u32 sWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/maze.4bpp.lz"); +static const u32 sWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/footprint.4bpp.lz"); +static const u32 sWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/big_asterisk.4bpp.lz"); +static const u32 sWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/circle.4bpp.lz"); +static const u32 sWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/koffing.4bpp.lz"); +static const u32 sWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/ribbon.4bpp.lz"); +static const u32 sWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/four_circles.4bpp.lz"); +static const u32 sWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/lotad.4bpp.lz"); +static const u32 sWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/crystal.4bpp.lz"); +static const u32 sWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/pichu.4bpp.lz"); +static const u32 sWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/diglett.4bpp.lz"); +static const u32 sWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/luvdisc.4bpp.lz"); +static const u32 sWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/star_in_circle.4bpp.lz"); +static const u32 sWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/spinda.4bpp.lz"); +static const u32 sWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/latis.4bpp.lz"); +static const u32 sWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/minun.4bpp.lz"); +static const u32 sWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/togepi.4bpp.lz"); +static const u32 sWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/magma.4bpp.lz"); + +static const struct Wallpaper sWaldaWallpapers[] = +{ + WALLPAPER_ENTRY(Zigzagoon), + WALLPAPER_ENTRY(Screen), + WALLPAPER_ENTRY_G(Horizontal), + WALLPAPER_ENTRY(Diagonal), + WALLPAPER_ENTRY(Block), + WALLPAPER_ENTRY_G(Ribbon), + WALLPAPER_ENTRY(Pokecenter2), + WALLPAPER_ENTRY(Frame), + WALLPAPER_ENTRY(Blank), + WALLPAPER_ENTRY(Circles), + WALLPAPER_ENTRY(Azumarill), + WALLPAPER_ENTRY(Pikachu), + WALLPAPER_ENTRY(Legendary), + WALLPAPER_ENTRY(Dusclops), + WALLPAPER_ENTRY(Ludicolo), + WALLPAPER_ENTRY(Whiscash), +}; + +static const u32 *const sWaldaWallpaperIcons[] = +{ + sWallpaperIcon_Aqua, + sWallpaperIcon_Heart, + sWallpaperIcon_FiveStar, + sWallpaperIcon_Brick, + sWallpaperIcon_FourStar, + sWallpaperIcon_Asterisk, + sWallpaperIcon_Dot, + gWallpaperIcon_Cross, + sWallpaperIcon_LineCircle, + sWallpaperIcon_PokeBall, + sWallpaperIcon_Maze, + sWallpaperIcon_Footprint, + sWallpaperIcon_BigAsterisk, + sWallpaperIcon_Circle, + sWallpaperIcon_Koffing, + sWallpaperIcon_Ribbon, + gWallpaperIcon_Bolt, + sWallpaperIcon_FourCircles, + sWallpaperIcon_Lotad, + sWallpaperIcon_Crystal, + sWallpaperIcon_Pichu, + sWallpaperIcon_Diglett, + sWallpaperIcon_Luvdisc, + sWallpaperIcon_StarInCircle, + sWallpaperIcon_Spinda, + sWallpaperIcon_Latis, + gWallpaperIcon_Plusle, + sWallpaperIcon_Minun, + sWallpaperIcon_Togepi, + sWallpaperIcon_Magma, +}; diff --git a/src/daycare.c b/src/daycare.c index 511fa0551..34b864981 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -24,7 +24,7 @@ #include "constants/region_map_sections.h" // this file's functions -static void ClearDaycareMonMail(struct DayCareMail *mail); +static void ClearDaycareMonMail(struct DaycareMail *mail); static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare *daycare); static u8 GetDaycareCompatibilityScore(struct DayCare *daycare); static void DaycarePrintMonInfo(u8 windowId, s32 daycareSlotId, u8 y); @@ -120,7 +120,7 @@ u8 CountPokemonInDaycare(struct DayCare *daycare) return count; } -void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDayCareMail *daycareMail) +void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDaycareMail *daycareMail) { u8 i; u8 numDaycareMons = 0; @@ -131,13 +131,9 @@ void InitDaycareMailRecordMixing(struct DayCare *daycare, struct RecordMixingDay { numDaycareMons++; if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_HELD_ITEM) == ITEM_NONE) - { daycareMail->holdsItem[i] = FALSE; - } else - { daycareMail->holdsItem[i] = TRUE; - } } else { @@ -154,7 +150,7 @@ static s8 Daycare_FindEmptySpot(struct DayCare *daycare) for (i = 0; i < DAYCARE_MON_COUNT; i++) { - if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) == 0) + if (GetBoxMonData(&daycare->mons[i].mon, MON_DATA_SPECIES) == SPECIES_NONE) return i; } @@ -170,7 +166,7 @@ static void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycar StringCopy(daycareMon->mail.OT_name, gSaveBlock2Ptr->playerName); GetMonNickname2(mon, daycareMon->mail.monName); StripExtCtrlCodes(daycareMon->mail.monName); - daycareMon->mail.gameLanguage = LANGUAGE_ENGLISH; + daycareMon->mail.gameLanguage = GAME_LANGUAGE; daycareMon->mail.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE); mailId = GetMonData(mon, MON_DATA_MAIL); daycareMon->mail.message = gSaveBlock1Ptr->mail[mailId]; @@ -349,7 +345,7 @@ u8 GetNumLevelsGainedFromDaycare(void) return 0; } -static void ClearDaycareMonMail(struct DayCareMail *mail) +static void ClearDaycareMonMail(struct DaycareMail *mail) { s32 i; @@ -838,7 +834,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) u8 metLocation; u8 isEgg; - CreateMon(mon, species, EGG_HATCH_LEVEL, 32, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; @@ -865,7 +861,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare * u8 language; personality = daycare->offspringPersonality; - CreateMon(mon, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0); + CreateMon(mon, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; @@ -894,8 +890,8 @@ static bool8 TryProduceOrHatchEgg(struct DayCare *daycare) // Check if an egg should be produced if (daycare->offspringPersonality == 0 && validEggs == DAYCARE_MON_COUNT && (daycare->mons[1].steps & 0xFF) == 0xFF) { - u8 compatability = GetDaycareCompatibilityScore(daycare); - if (compatability > (Random() * 100u) / USHRT_MAX) + u8 compatibility = GetDaycareCompatibilityScore(daycare); + if (compatibility > (Random() * 100u) / USHRT_MAX) TriggerPendingDaycareEgg(); } @@ -1050,7 +1046,7 @@ static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) if (trainerIds[0] == trainerIds[1]) return PARENTS_LOW_COMPATIBILITY; - return PARENTS_MED_COMPATABILITY; + return PARENTS_MED_COMPATIBILITY; } // neither parent is Ditto else @@ -1065,14 +1061,14 @@ static u8 GetDaycareCompatibilityScore(struct DayCare *daycare) if (species[0] == species[1]) { if (trainerIds[0] == trainerIds[1]) - return PARENTS_MED_COMPATABILITY; // same species, same trainer + return PARENTS_MED_COMPATIBILITY; // same species, same trainer - return PARENTS_MAX_COMPATABILITY; // same species, different trainers + return PARENTS_MAX_COMPATIBILITY; // same species, different trainers } else { if (trainerIds[0] != trainerIds[1]) - return PARENTS_MED_COMPATABILITY; // different species, different trainers + return PARENTS_MED_COMPATIBILITY; // different species, different trainers return PARENTS_LOW_COMPATIBILITY; // different species, same trainer } @@ -1095,9 +1091,9 @@ void SetDaycareCompatibilityString(void) whichString = 3; if (relationshipScore == PARENTS_LOW_COMPATIBILITY) whichString = 2; - if (relationshipScore == PARENTS_MED_COMPATABILITY) + if (relationshipScore == PARENTS_MED_COMPATIBILITY) whichString = 1; - if (relationshipScore == PARENTS_MAX_COMPATABILITY) + if (relationshipScore == PARENTS_MAX_COMPATIBILITY) whichString = 0; StringCopy(gStringVar4, sCompatibilityMessages[whichString]); diff --git a/src/decompress.c b/src/decompress.c index 007753303..a65f38c2d 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -86,7 +86,7 @@ void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 { if (species == SPECIES_UNOWN) { - u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; + u16 i = GET_UNOWN_LETTER(personality); // The other Unowns are separate from Unown A. if (i == 0) @@ -308,7 +308,7 @@ void LoadSpecialPokePic_2(const struct CompressedSpriteSheet *src, void *dest, s { if (species == SPECIES_UNOWN) { - u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; + u16 i = GET_UNOWN_LETTER(personality); // The other Unowns are separate from Unown A. if (i == 0) @@ -366,7 +366,7 @@ void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src { if (species == SPECIES_UNOWN) { - u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; + u16 i = GET_UNOWN_LETTER(personality); // The other Unowns are separate from Unown A. if (i == 0) @@ -390,5 +390,5 @@ void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src static void DuplicateDeoxysTiles(void *pointer, s32 species) { if (species == SPECIES_DEOXYS) - CpuCopy32(pointer + 0x800, pointer, 0x800); + CpuCopy32(pointer + MON_PIC_SIZE, pointer, MON_PIC_SIZE); } diff --git a/src/decoration.c b/src/decoration.c index 74dbacdf9..6b6cf21e8 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -113,7 +113,7 @@ EWRAM_DATA static u16 sDecorationsCursorPos = 0; EWRAM_DATA static u16 sDecorationsScrollOffset = 0; EWRAM_DATA u8 gCurDecorationIndex = 0; EWRAM_DATA static u8 sCurDecorationCategory = DECORCAT_DESK; -EWRAM_DATA static u32 filler_0203a174[2] = {}; +EWRAM_DATA static u32 sFiller[2] = {}; EWRAM_DATA static struct DecorationPCContext sDecorationContext = {}; EWRAM_DATA static u8 sDecorMenuWindowIds[WINDOW_COUNT] = {}; EWRAM_DATA static struct DecorationItemsMenu *sDecorationItemsMenu = NULL; @@ -925,7 +925,7 @@ static void DecorationItemsMenu_PrintDecorationInUse(u8 windowId, s32 itemIndex, static void AddDecorationItemsScrollIndicators(void) { - if (sDecorationItemsMenu->scrollIndicatorsTaskId == 0xFF) + if (sDecorationItemsMenu->scrollIndicatorsTaskId == TASK_NONE) { sDecorationItemsMenu->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized( SCROLL_ARROW_UP, @@ -941,10 +941,10 @@ static void AddDecorationItemsScrollIndicators(void) static void RemoveDecorationItemsScrollIndicators(void) { - if (sDecorationItemsMenu->scrollIndicatorsTaskId != 0xFF) + if (sDecorationItemsMenu->scrollIndicatorsTaskId != TASK_NONE) { RemoveScrollIndicatorArrowPair(sDecorationItemsMenu->scrollIndicatorsTaskId); - sDecorationItemsMenu->scrollIndicatorsTaskId = 0xFF; + sDecorationItemsMenu->scrollIndicatorsTaskId = TASK_NONE; } } @@ -960,7 +960,7 @@ static void InitDecorationItemsWindow(u8 taskId) AddDecorationWindow(WINDOW_DECORATION_CATEGORY_ITEMS); ShowDecorationCategorySummaryWindow(sCurDecorationCategory); sDecorationItemsMenu = AllocZeroed(sizeof(*sDecorationItemsMenu)); - sDecorationItemsMenu->scrollIndicatorsTaskId = 0xFF; + sDecorationItemsMenu->scrollIndicatorsTaskId = TASK_NONE; InitDecorationItemsMenuLimits(); InitDecorationItemsMenuScrollAndCursor(); InitDecorationItemsMenuScrollAndCursor2(); @@ -1210,7 +1210,7 @@ static void ShowDecorationOnMap_(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, for (i = 0; i < decWidth; i++) { x = mapX + i; - behavior = GetBehaviorByMetatileId(0x200 + gDecorations[decoration].tiles[j * decWidth + i]); + behavior = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + gDecorations[decoration].tiles[j * decWidth + i]); if (MetatileBehavior_IsSecretBaseImpassable(behavior) == TRUE || (gDecorations[decoration].permission != DECORPERM_PASS_FLOOR && (behavior >> METATILE_ELEVATION_SHIFT))) impassableFlag = METATILE_COLLISION_MASK; else @@ -1224,9 +1224,9 @@ static void ShowDecorationOnMap_(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, elevation = GetDecorationElevation(gDecorations[decoration].id, j * decWidth + i); if (elevation != 0xFFFF) - MapGridSetMetatileEntryAt(x, y, (gDecorations[decoration].tiles[j * decWidth + i] + (0x200 | overlapsWall)) | impassableFlag | elevation); + MapGridSetMetatileEntryAt(x, y, (gDecorations[decoration].tiles[j * decWidth + i] + (NUM_TILES_IN_PRIMARY | overlapsWall)) | impassableFlag | elevation); else - MapGridSetMetatileIdAt(x, y, (gDecorations[decoration].tiles[j * decWidth + i] + (0x200 | overlapsWall)) | impassableFlag); + MapGridSetMetatileIdAt(x, y, (gDecorations[decoration].tiles[j * decWidth + i] + (NUM_TILES_IN_PRIMARY | overlapsWall)) | impassableFlag); } } } @@ -1524,7 +1524,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { curX = gTasks[taskId].tCursorX + j; behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); - behaviorBy = GetBehaviorByMetatileId(0x200 + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ELEVATION_MASK; + behaviorBy = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ELEVATION_MASK; if (!IsFloorOrBoardAndHole(behaviorAt, decoration)) return FALSE; @@ -1545,7 +1545,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { curX = gTasks[taskId].tCursorX + j; behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); - behaviorBy = GetBehaviorByMetatileId(0x200 + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ELEVATION_MASK; + behaviorBy = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + decoration->tiles[(mapY - 1 - i) * mapX + j]) & METATILE_ELEVATION_MASK; if (!MetatileBehavior_IsNormal(behaviorAt) && !IsNonBlockNonElevated(behaviorAt, behaviorBy)) return FALSE; @@ -1562,7 +1562,7 @@ static bool8 CanPlaceDecoration(u8 taskId, const struct Decoration *decoration) { curX = gTasks[taskId].tCursorX + j; behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); - behaviorBy = GetBehaviorByMetatileId(0x200 + decoration->tiles[j]) & METATILE_ELEVATION_MASK; + behaviorBy = GetBehaviorByMetatileId(NUM_TILES_IN_PRIMARY + decoration->tiles[j]) & METATILE_ELEVATION_MASK; if (!MetatileBehavior_IsNormal(behaviorAt) && !MetatileBehavior_IsSecretBaseNorthWall(behaviorAt)) return FALSE; @@ -1652,7 +1652,7 @@ static void PlaceDecoration(u8 taskId) gSprites[sDecor_CameraSpriteObjectIdx1].pos1.y += 2; if (gMapHeader.regionMapSectionId == MAPSEC_SECRET_BASE) - TV_PutSecretBaseVisitOnTheAir(); + TryPutSecretBaseVisitOnAir(); CancelDecorating_(taskId); } @@ -1971,9 +1971,9 @@ static void SetDecorSelectionMetatiles(struct PlaceDecorationGraphicsDataBuffer u8 shape; shape = data->decoration->shape; - for (i = 0; i < gUnknown_085A71B0[shape].size; i++) + for (i = 0; i < sDecorTilemaps[shape].size; i++) { - data->tiles[gUnknown_085A71B0[shape].tiles[i]] = GetMetatile(data->decoration->tiles[gUnknown_085A71B0[shape].y[i]] * 8 + gUnknown_085A71B0[shape].x[i]); + data->tiles[sDecorTilemaps[shape].tiles[i]] = GetMetatile(data->decoration->tiles[sDecorTilemaps[shape].y[i]] * 8 + sDecorTilemaps[shape].x[i]); } } @@ -2260,7 +2260,7 @@ static void Task_PutAwayDecoration(u8 taskId) StringExpandPlaceholders(gStringVar4, gText_DecorationReturnedToPC); DisplayItemMessageOnField(taskId, gStringVar4, ContinuePuttingAwayDecorationsPrompt); if (gMapHeader.regionMapSectionId == MAPSEC_SECRET_BASE) - TV_PutSecretBaseVisitOnTheAir(); + TryPutSecretBaseVisitOnAir(); } break; } diff --git a/src/dewford_trend.c b/src/dewford_trend.c index 5c7e50f16..09a8d2afe 100644 --- a/src/dewford_trend.c +++ b/src/dewford_trend.c @@ -10,311 +10,388 @@ #include "string_util.h" #include "constants/easy_chat.h" -// static functions -static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c); -static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c); -static void sub_8122B28(struct EasyChatPair *s); -static bool8 SB1ContainsWords(u16 *a); -static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2); -static s16 GetEqualEasyChatPairIndex(struct EasyChatPair *s, struct EasyChatPair *a, u16 b); - -// text +/* + ## Overview ## + This file handles the "Dewford Trend", a pair of Easy Chat words + repeated by NPCs around Dewford Hall. + + The NPC outside Dewford Hall will ask what the player thinks of the + current trendy phrase, and the player may submit a new pair of words. + If the NPC thinks the submitted phrase is "trendier" than the + current one (see TrySetTrendyPhrase), it becomes the new phrase. + + ## struct DewfordTrend ## + Information about a Dewford trend is stored in a struct DewfordTrend. + In addition to the two easy chat words that make up the trend's phrase, + each trend has a few randomly generated values associated with it. + - rand: + This is a 16 bit value generated once when the phrase is created. + It's used in calculations for Feebas tiles, Slot Machines, and Match Call. + - trendiness / maxTrendiness: + Initialized as a random value between 30-127 inclusive. This is used to + compare how trendy one phrase is vs another. If a submitted phrase is + less trendy than the current one it won't be accepted. If the trend is + "boring" (see below) it will lose trendiness over time until it reaches 0, + at which point it will stop being boring and gain trendiness until it + reaches maxTrendiness (then it becomes boring again and the cycle repeats). + - gainingTrendiness: + This is a flag that determines whether a phrase should be gaining or losing + trendiness. An NPC in Dewford Hall will comment on whether the current phrase + is "boring" or not, and if it is gaining trendiness (or if it is still trendier + than the last phrase) it is not boring. This field will always be TRUE for any + new phrase submitted after the 1st submission. + + ## Saving trends ## + Each time a potential trendy phrase is submitted, it is saved in gSaveBlock1Ptr->dewfordTrends[]. + Up to SAVED_TRENDS_COUNT (5) trends may be saved at one time. The trends in this array are kept + in sorted order from most trendy to least trendy. The current trendy phrase is always at + gSaveBlock1Ptr->dewfordTrends[0]. If the player mixes records with another player, their own + trends are replaced with their mixing partner's, unless the phrase is the same, in which case + the version with a higher trendiness value is used (see ReceiveDewfordTrendData). + + ## TV Show ## + If a submitted phrase is only trendier than 1 or none of the saved trends, it may trigger a + TV Show called Trend Watcher (see TryPutTrendWatcherOnAir) that, ironically, spends the + show talking about how the submitted phrase was not trendy. + +*/ + +enum { + SORT_MODE_NORMAL, + SORT_MODE_MAX_FIRST, + SORT_MODE_FULL, +}; + +static void SortTrends(struct DewfordTrend *, u16, u8); +static bool8 CompareTrends(struct DewfordTrend *, struct DewfordTrend *, u8); +static void SeedTrendRng(struct DewfordTrend *); +static bool8 IsPhraseInSavedTrends(u16 *); +static bool8 IsEasyChatPairEqual(u16 *, u16 *); +static s16 GetSavedTrendIndex(struct DewfordTrend *, struct DewfordTrend *, u16); + void InitDewfordTrend(void) { u16 i; - for (i = 0; i < 5; i++) + for (i = 0; i < SAVED_TRENDS_COUNT; i++) { - gSaveBlock1Ptr->easyChatPairs[i].words[0] = GetRandomEasyChatWordFromGroup(EC_GROUP_CONDITIONS); + gSaveBlock1Ptr->dewfordTrends[i].words[0] = GetRandomEasyChatWordFromGroup(EC_GROUP_CONDITIONS); if (Random() & 1) - gSaveBlock1Ptr->easyChatPairs[i].words[1] = GetRandomEasyChatWordFromGroup(EC_GROUP_LIFESTYLE); + gSaveBlock1Ptr->dewfordTrends[i].words[1] = GetRandomEasyChatWordFromGroup(EC_GROUP_LIFESTYLE); else - gSaveBlock1Ptr->easyChatPairs[i].words[1] = GetRandomEasyChatWordFromGroup(EC_GROUP_HOBBIES); + gSaveBlock1Ptr->dewfordTrends[i].words[1] = GetRandomEasyChatWordFromGroup(EC_GROUP_HOBBIES); - gSaveBlock1Ptr->easyChatPairs[i].unk1_6 = Random() & 1; - sub_8122B28(&(gSaveBlock1Ptr->easyChatPairs[i])); + gSaveBlock1Ptr->dewfordTrends[i].gainingTrendiness = Random() & 1; + SeedTrendRng(&(gSaveBlock1Ptr->dewfordTrends[i])); } - sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0); + SortTrends(gSaveBlock1Ptr->dewfordTrends, SAVED_TRENDS_COUNT, SORT_MODE_NORMAL); } -void UpdateDewfordTrendPerDay(u16 a) +void UpdateDewfordTrendPerDay(u16 days) { u16 i; - if (a != 0) + if (days != 0) { - u32 sp0 = a * 5; + u32 clockRand = days * 5; - for (i = 0; i < 5; i++) + for (i = 0; i < SAVED_TRENDS_COUNT; i++) { - u32 r4; - u32 r2 = sp0; - struct EasyChatPair *r5 = &(gSaveBlock1Ptr->easyChatPairs[i]); + u32 trendiness; + u32 rand = clockRand; + struct DewfordTrend *trend = &gSaveBlock1Ptr->dewfordTrends[i]; - if (r5->unk1_6 == 0) + if (!trend->gainingTrendiness) { - if (r5->unk0_0 >= (u16)r2) + // This trend is "boring" + // Lose trendiness until it becomes 0 + if (trend->trendiness >= (u16)rand) { - r5->unk0_0 -= r2; - if (r5->unk0_0 == 0) - r5->unk1_6 = 1; + trend->trendiness -= rand; + if (trend->trendiness == 0) + trend->gainingTrendiness = TRUE; continue; } - r2 -= r5->unk0_0; - r5->unk0_0 = 0; - r5->unk1_6 = 1; + rand -= trend->trendiness; + trend->trendiness = 0; + trend->gainingTrendiness = TRUE; } - r4 = r5->unk0_0 + r2; - if ((u16)r4 > r5->unk0_7) + + trendiness = trend->trendiness + rand; + if ((u16)trendiness > trend->maxTrendiness) { - u32 sp4 = r4 % r5->unk0_7; - r4 = r4 / r5->unk0_7; + // Reached limit, reset trendiness + u32 newTrendiness = trendiness % trend->maxTrendiness; + trendiness = trendiness / trend->maxTrendiness; - r5->unk1_6 = r4 ^ 1; - if (r5->unk1_6) - r5->unk0_0 = sp4; + trend->gainingTrendiness = trendiness ^ 1; + if (trend->gainingTrendiness) + trend->trendiness = newTrendiness; else - r5->unk0_0 = r5->unk0_7 - sp4; + trend->trendiness = trend->maxTrendiness - newTrendiness; } else { - r5->unk0_0 = r4; + // Increase trendiness + trend->trendiness = trendiness; - if (r5->unk0_0 == r5->unk0_7) - r5->unk1_6 = 0; + // Trend has reached its max, becoming "boring" and start losing trendiness + if (trend->trendiness == trend->maxTrendiness) + trend->gainingTrendiness = FALSE; } } - sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0); + SortTrends(gSaveBlock1Ptr->dewfordTrends, SAVED_TRENDS_COUNT, SORT_MODE_NORMAL); } } - -bool8 sub_81226D8(u16 *a) +// Returns TRUE if the current trendy phrase was successfully changed to the given phrase +// Returns FALSE otherwise +// Regardless of whether or not the current trendy phrase was changed, the submitted +// phrase is always saved in gSaveBlock1Ptr->dewfordTrends +bool8 TrySetTrendyPhrase(u16 *phrase) { - struct EasyChatPair s = {0}; + struct DewfordTrend trend = {0}; u16 i; - if (!SB1ContainsWords(a)) + if (!IsPhraseInSavedTrends(phrase)) { - if (!FlagGet(FLAG_SYS_POPWORD_INPUT)) + if (!FlagGet(FLAG_SYS_CHANGED_DEWFORD_TREND)) { - FlagSet(FLAG_SYS_POPWORD_INPUT); + FlagSet(FLAG_SYS_CHANGED_DEWFORD_TREND); + + // Make sure player couldn't have received this phrase by mixing records if (!FlagGet(FLAG_SYS_MIX_RECORD)) { - gSaveBlock1Ptr->easyChatPairs[0].words[0] = a[0]; - gSaveBlock1Ptr->easyChatPairs[0].words[1] = a[1]; + // This is the first time submitting a phrase + // No need to check saved phrases or reset rng, just set the new words + gSaveBlock1Ptr->dewfordTrends[0].words[0] = phrase[0]; + gSaveBlock1Ptr->dewfordTrends[0].words[1] = phrase[1]; return TRUE; } } - s.words[0] = a[0]; - s.words[1] = a[1]; - s.unk1_6 = 1; - sub_8122B28(&s); + // Initialize DewfordTrend using given phrase + trend.words[0] = phrase[0]; + trend.words[1] = phrase[1]; + trend.gainingTrendiness = TRUE; + SeedTrendRng(&trend); - for (i = 0; i < 5; i++) + for (i = 0; i < SAVED_TRENDS_COUNT; i++) { - if (sub_8122A58(&s, &(gSaveBlock1Ptr->easyChatPairs[i]), 0)) + if (CompareTrends(&trend, &(gSaveBlock1Ptr->dewfordTrends[i]), SORT_MODE_NORMAL)) { - u16 r3 = 4; - - while (r3 > i) + // New trend is "trendier" than dewfordTrend[i] + // Shift other trends back to insert new trend + u16 j = SAVED_TRENDS_COUNT - 1; + while (j > i) { - gSaveBlock1Ptr->easyChatPairs[r3] = gSaveBlock1Ptr->easyChatPairs[r3 - 1]; - r3--; + gSaveBlock1Ptr->dewfordTrends[j] = gSaveBlock1Ptr->dewfordTrends[j - 1]; + j--; } - gSaveBlock1Ptr->easyChatPairs[i] = s; - if(i == 4) - sub_80EDC60(a); + gSaveBlock1Ptr->dewfordTrends[i] = trend; + + if (i == SAVED_TRENDS_COUNT - 1) + TryPutTrendWatcherOnAir(phrase); + + // If i is 0, the given phrase is the new current phrase return (i == 0); } } - gSaveBlock1Ptr->easyChatPairs[4] = s; - sub_80EDC60(a); + + // New trend is less "trendy" than all other saved trends, put it in last + gSaveBlock1Ptr->dewfordTrends[SAVED_TRENDS_COUNT - 1] = trend; + TryPutTrendWatcherOnAir(phrase); } return FALSE; } -static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c) +static void SortTrends(struct DewfordTrend *trends, u16 numTrends, u8 mode) { - u16 h; - - for (h = 0; h < b; h++) + u16 i; + for (i = 0; i < numTrends; i++) { - u16 i; - - for (i = h + 1; i < b; i++) + u16 j; + for (j = i + 1; j < numTrends; j++) { - if (sub_8122A58(&s[i], &s[h], c)) + if (CompareTrends(&trends[j], &trends[i], mode)) { - struct EasyChatPair temp; - - temp = s[i]; - s[i] = s[h]; - s[h] = temp; + struct DewfordTrend temp; + SWAP(trends[j], trends[i], temp); } } } } -void ReceiveEasyChatPairsData(struct EasyChatPair *a, size_t size, u8 unused) +#define SAVED_TRENDS_SIZE (sizeof(struct DewfordTrend) * SAVED_TRENDS_COUNT) +#define BUFFER_SIZE (SAVED_TRENDS_SIZE * MAX_LINK_PLAYERS > 0x100 ? SAVED_TRENDS_SIZE * MAX_LINK_PLAYERS : 0x100) // More space was allocated than needed + +void ReceiveDewfordTrendData(struct DewfordTrend *linkedTrends, size_t size, u8 unused) { - u16 i, j, r3, players; - struct EasyChatPair *buffer1, *buffer2, *src, *dst, *foo_of_buffer2; + u16 i, j, numTrends, players; + struct DewfordTrend *linkedTrendsBuffer, *savedTrendsBuffer, *src, *dst, *temp; - buffer1 = Alloc(0x100); - if(buffer1 != NULL) + // Exit if alloc fails + if (!(linkedTrendsBuffer = Alloc(BUFFER_SIZE))) + return; + + // Exit if alloc fails + if (!(savedTrendsBuffer = Alloc(BUFFER_SIZE))) { - buffer2 = Alloc(0x100); - if(buffer2 == NULL) - { - Free(buffer1); - } - else + Free(linkedTrendsBuffer); + return; + } + + // Buffer the new trends being received via Record Mixing + players = GetLinkPlayerCount(); + for (i = 0; i < players; i++) + memcpy(&linkedTrendsBuffer[i * SAVED_TRENDS_COUNT], (u8 *)linkedTrends + i * size, SAVED_TRENDS_SIZE); + + // Determine which of the received trends should be saved. + // savedTrendsBuffer starts empty, and when finished will contain + // which of the linked trends to save in the saveblock. + src = linkedTrendsBuffer; + dst = savedTrendsBuffer; + numTrends = 0; + for (i = 0; i < players; i++) + { + for (j = 0; j < SAVED_TRENDS_COUNT; j++) { - players = GetLinkPlayerCount(); - for (i = 0; i < players; i++) - memcpy(&(buffer1[i * 5]), (u8 *)a + i * size, 40); - src = buffer1; - dst = buffer2; - r3 = 0; - for (i = 0; i < players; i++) + s16 idx = GetSavedTrendIndex(savedTrendsBuffer, src, numTrends); + if (idx < 0) { - for (j = 0; j < 5; j++) + // This phrase is not a currently saved trend, save it + *(dst++) = *src; + numTrends++; + } + else + { + // This phrase already exists as a saved phrase + // Only overwrrite it if it's "trendier" + temp = &savedTrendsBuffer[idx]; + if (temp->trendiness < src->trendiness) { - s16 foo = GetEqualEasyChatPairIndex(buffer2, src, r3); - if (foo < 0) - { - *(dst++) = *src; - r3++; - } - else - { - foo_of_buffer2 = (struct EasyChatPair *)((u32)buffer2 + (foo * 8)); //required to do this to reverse the order of register operands in add ASM statement - if (foo_of_buffer2->unk0_0 < src->unk0_0) - { - *foo_of_buffer2 = *src; - } - } - src++; + *temp = *src; } } - sub_8122804(buffer2, r3, 2); - src = buffer2; - dst = gSaveBlock1Ptr->easyChatPairs; - for (i = 0; i < 5; i++) - *(dst++) = *(src++); - Free(buffer1); - Free(buffer2); + src++; } } + SortTrends(savedTrendsBuffer, numTrends, SORT_MODE_FULL); + + // Overwrite current saved trends with new saved trends + src = savedTrendsBuffer; + dst = gSaveBlock1Ptr->dewfordTrends; + for (i = 0; i < SAVED_TRENDS_COUNT; i++) + *(dst++) = *(src++); + + Free(linkedTrendsBuffer); + Free(savedTrendsBuffer); } void BufferTrendyPhraseString(void) { - struct EasyChatPair *s = &gSaveBlock1Ptr->easyChatPairs[gSpecialVar_0x8004]; - - ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1); + struct DewfordTrend *trend = &gSaveBlock1Ptr->dewfordTrends[gSpecialVar_0x8004]; + ConvertEasyChatWordsToString(gStringVar1, trend->words, 2, 1); } -void TrendyPhraseIsOld(void) +// Returns TRUE if the current trendy phrase is "boring", FALSE otherwise +// This only influences the comment of an NPC inside the Dewford Town Hall +void IsTrendyPhraseBoring(void) { - u16 result = 0; + bool16 result = FALSE; do { - if (gSaveBlock1Ptr->easyChatPairs[0].unk0_0 - gSaveBlock1Ptr->easyChatPairs[1].unk0_0 > 1) + if (gSaveBlock1Ptr->dewfordTrends[0].trendiness - gSaveBlock1Ptr->dewfordTrends[1].trendiness > 1) break; - if (gSaveBlock1Ptr->easyChatPairs[0].unk1_6) + if (gSaveBlock1Ptr->dewfordTrends[0].gainingTrendiness) break; - if (!gSaveBlock1Ptr->easyChatPairs[1].unk1_6) + if (!gSaveBlock1Ptr->dewfordTrends[1].gainingTrendiness) break; - result = 1; + result = TRUE; } while (0); gSpecialVar_Result = result; } +// A painting hangs on the wall of the Dewford Hall +// When interacted with it says "{trendy phrase}'S {name} is the title" +// {name} is one of 8 pre-set words, depending on the current phrase +// See DewfordTown_Hall_EventScript_Painting void GetDewfordHallPaintingNameIndex(void) { - gSpecialVar_Result = (gSaveBlock1Ptr->easyChatPairs[0].words[0] + gSaveBlock1Ptr->easyChatPairs[0].words[1]) & 7; + gSpecialVar_Result = (gSaveBlock1Ptr->dewfordTrends[0].words[0] + gSaveBlock1Ptr->dewfordTrends[0].words[1]) & 7; } -static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c) +// Returns TRUE if a > b (a is "trendier" than b), FALSE if a < b (b is "trendier" than a) +// How one trend is compared to the other depends on the mode +// In SORT_MODE_FULL if the trends are equal then TRUE is always returned, otherwise TRUE or FALSE is returned randomly +static bool8 CompareTrends(struct DewfordTrend *a, struct DewfordTrend *b, u8 mode) { - switch (c) + switch (mode) { - case 0: - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; + case SORT_MODE_NORMAL: + if (a->trendiness > b->trendiness) return TRUE; + if (a->trendiness < b->trendiness) return FALSE; + + if (a->maxTrendiness > b->maxTrendiness) return TRUE; + if (a->maxTrendiness < b->maxTrendiness) return FALSE; break; - case 1: - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; + case SORT_MODE_MAX_FIRST: // Unused + if (a->maxTrendiness > b->maxTrendiness) return TRUE; + if (a->maxTrendiness < b->maxTrendiness) return FALSE; + + if (a->trendiness > b->trendiness) return TRUE; + if (a->trendiness < b->trendiness) return FALSE; break; - case 2: - if (a->unk0_0 > b->unk0_0) - return 1; - if (a->unk0_0 < b->unk0_0) - return 0; - if (a->unk0_7 > b->unk0_7) - return 1; - if (a->unk0_7 < b->unk0_7) - return 0; - if (a->unk2 > b->unk2) - return 1; - if (a->unk2 < b->unk2) - return 0; - if (a->words[0] > b->words[0]) - return 1; - if (a->words[0] < b->words[0]) - return 0; - if (a->words[1] > b->words[1]) - return 1; - if (a->words[1] < b->words[1]) - return 0; - return 1; + case SORT_MODE_FULL: + if (a->trendiness > b->trendiness) return TRUE; + if (a->trendiness < b->trendiness) return FALSE; + + if (a->maxTrendiness > b->maxTrendiness) return TRUE; + if (a->maxTrendiness < b->maxTrendiness) return FALSE; + + if (a->rand > b->rand) return TRUE; + if (a->rand < b->rand) return FALSE; + + if (a->words[0] > b->words[0]) return TRUE; + if (a->words[0] < b->words[0]) return FALSE; + + if (a->words[1] > b->words[1]) return TRUE; + if (a->words[1] < b->words[1]) return FALSE; + return TRUE; } + + // Invalid mode given, or trends are equal in SORT_MODE_NORMAL or SORT_MODE_MAX_FIRST + // Randomly pick one of the phrases return Random() & 1; } -static void sub_8122B28(struct EasyChatPair *s) +static void SeedTrendRng(struct DewfordTrend *trend) { - u16 r4; + u16 rand; - r4 = Random() % 98; - if (r4 > 50) + rand = Random() % 98; + if (rand > 50) { - r4 = Random() % 98; - if (r4 > 80) - r4 = Random() % 98; + rand = Random() % 98; + if (rand > 80) + rand = Random() % 98; } - s->unk0_7 = r4 + 30; - s->unk0_0 = (Random() % (r4 + 1)) + 30; - s->unk2 = Random(); + trend->maxTrendiness = rand + 30; + trend->trendiness = (Random() % (rand + 1)) + 30; + trend->rand = Random(); } -static bool8 SB1ContainsWords(u16 *a) +static bool8 IsPhraseInSavedTrends(u16 *phrase) { u16 i; - for (i = 0; i < 5; i++) + for (i = 0; i < SAVED_TRENDS_COUNT; i++) { - if (IsEasyChatPairEqual(a, gSaveBlock1Ptr->easyChatPairs[i].words) != 0) + if (IsEasyChatPairEqual(phrase, gSaveBlock1Ptr->dewfordTrends[i].words)) return TRUE; } return FALSE; @@ -332,15 +409,14 @@ static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2) return TRUE; } -static s16 GetEqualEasyChatPairIndex(struct EasyChatPair*s, struct EasyChatPair *a, u16 b) +static s16 GetSavedTrendIndex(struct DewfordTrend *savedTrends, struct DewfordTrend *trend, u16 numSaved) { s16 i; - - for (i = 0; i < b; i++) + for (i = 0; i < numSaved; i++) { - if (IsEasyChatPairEqual(a->words, s->words)) + if (IsEasyChatPairEqual(trend->words, savedTrends->words)) return i; - s++; + savedTrends++; } return -1; } diff --git a/src/diploma.c b/src/diploma.c index f243d09f9..dca0912e3 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -51,18 +51,18 @@ void CB2_ShowDiploma(void) { SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG3CNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG2CNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG1CNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG0CNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG3HOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG2HOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG2VOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG1VOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG0HOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG0VOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG3CNT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); // why doesn't this one use the dma manager either? DmaFill16(3, 0, VRAM, VRAM_SIZE); DmaFill32(3, 0, OAM, OAM_SIZE); @@ -84,7 +84,7 @@ void CB2_ShowDiploma(void) CopyBgTilemapBufferToVram(1); DisplayDiplomaText(); BlendPalettes(-1, 16, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); EnableInterrupts(1); SetVBlankCallback(VBlankCB); SetMainCallback2(MainCB2); @@ -109,7 +109,7 @@ static void Task_DiplomaWaitForKeyPress(u8 taskId) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_DiplomaFadeOut; } } @@ -121,7 +121,7 @@ static void Task_DiplomaFadeOut(u8 taskId) Free(sDiplomaTilemapPtr); FreeAllWindowBuffers(); DestroyTask(taskId); - SetMainCallback2(sub_80861E8); + SetMainCallback2(CB2_ReturnToFieldFadeFromBlack); } } @@ -129,12 +129,12 @@ static void DisplayDiplomaText(void) { if (HasAllMons()) { - SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_BG0_ON); + SetGpuReg(REG_OFFSET_BG1HOFS, DISPLAY_WIDTH + 16); StringCopy(gStringVar1, gText_DexNational); } else { - SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); StringCopy(gStringVar1, gText_DexHoenn); } StringExpandPlaceholders(gStringVar4, gText_PokedexDiploma); @@ -168,14 +168,14 @@ static const struct BgTemplate sDiplomaBgTemplates[2] = static void InitDiplomaBg(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sDiplomaBgTemplates, 2); + InitBgsFromTemplates(0, sDiplomaBgTemplates, ARRAY_COUNT(sDiplomaBgTemplates)); SetBgTilemapBuffer(1, sDiplomaTilemapPtr); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); ShowBg(1); - SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BLDALPHA, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BLDY, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); } static const struct WindowTemplate sDiplomaWinTemplates[2] = diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index 66eacc5f9..d766da607 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -25,301 +25,459 @@ #include "constants/items.h" #include "constants/songs.h" -struct DodrioSubstruct_0160 -{ - /*0x0000 : 0x3000*/ u16 ALIGNED(4) tilemapBuffers[3][BG_SCREEN_SIZE]; - /*0x3000 : 0x3160*/ bool32 finished; - /*0x3004 : 0x3164*/ u8 ALIGNED(4) unk3004; - /*0x3008 : 0x3168*/ u8 ALIGNED(4) unk3008[10]; - /*0x3014 : 0x3174*/ u8 ALIGNED(4) state; - /*0x3018 : 0x3178*/ u8 ALIGNED(4) unk3018; - /*0x301C : 0x317C*/ u16 ALIGNED(4) unk301C; - /*0x3020 : 0x3180*/ u8 ALIGNED(4) unk3020; - /*0x3024 : 0x3184*/ u8 ALIGNED(4) unk3024; - /*0x3024 : 0x3184*/ void (*unk3028)(void); +// Note that in this file 'Dodrio Berry Picking' is often +// shortened to DodrioGame or just Game for convenience + +#define MAX_SCORE 999990 +#define MAX_BERRIES 9999 + +// The minimum score needed to receive a prize +#define PRIZE_SCORE 3000 + +// Difficulty increases as berries are eaten. The rate of new berries increases and the types of berries changes +// When the max difficulty is reached it starts again from the beginning +#define NUM_DIFFICULTIES 7 + +#define MAX_FALL_DIST 10 // The number of times a berry needs to fall before hitting the ground +#define EAT_FALL_DIST 7 // The number of times a berry needs to fall to be available to eat + +enum { + BG_INTERFACE, + BG_TREE_LEFT, + BG_TREE_RIGHT, + BG_SCENERY +}; + +enum { + FUNC_INTRO, + FUNC_INIT_COUNTDOWN, + FUNC_COUNTDOWN, + FUNC_WAIT_START, + FUNC_PLAY_GAME, + FUNC_INIT_RESULTS, + FUNC_RESULTS, + FUNC_ASK_PLAY_AGAIN, + FUNC_END_LINK, + FUNC_EXIT, + FUNC_RESET_GAME, + FUNC_WAIT_END_GAME, +}; + +enum { + GFXFUNC_LOAD, + GFXFUNC_SHOW_NAMES, + GFXFUNC_SHOW_RESULTS, + GFXFUNC_MSG_PLAY_AGAIN, + GFXFUNC_MSG_SAVING, + GFXFUNC_MSG_COMM_STANDBY, + GFXFUNC_ERASE_MSG, + GFXFUNC_MSG_PLAYER_DROPPED, + GFXFUNC_STOP, + GFXFUNC_IDLE, +}; + +enum { + PACKET_READY_START = 1, + PACKET_GAME_STATE, + PACKET_PICK_STATE, + PACKET_READY_END, +}; + +enum { + PLAY_AGAIN_NONE, + PLAY_AGAIN_YES, + PLAY_AGAIN_NO, + PLAY_AGAIN_DROPPED = 5, +}; + +enum { + PICK_NONE, // Dodrio standing still + PICK_RIGHT, // Dodrio reaching right + PICK_MIDDLE, // Dodrio reaching up + PICK_LEFT, // Dodrio reaching left + PICK_DISABLED, // Dodrio down after game over +}; + +enum { + BERRY_BLUE, + BERRY_GREEN, + BERRY_GOLD, + BERRY_MISSED, + BERRY_PRIZE, + BERRY_IN_ROW, + NUM_BERRY_IDS +}; + +#define NUM_BERRY_TYPES 4 // Blue, Green, Gold, and 'missed' + + // Eaten anim comes after the normal & missed versions of other berries +#define ANIM_EATEN (BERRY_MISSED * 2) + +enum { + BERRYSTATE_NONE, + BERRYSTATE_PICKED, // Berry has been picked by a Dodrio, replaced with blue hit sprite (still falling) + BERRYSTATE_EATEN, // Berry has been eaten (after being picked), berry is gone now + BERRYSTATE_SQUISHED, // Berry has hit the ground +}; + +enum { + INPUTSTATE_NONE, + INPUTSTATE_TRY_PICK, + INPUTSTATE_PICKED, + INPUTSTATE_ATE_BERRY, + INPUTSTATE_BAD_MISS, +}; + +// Colors for status bar squares +// Colored gray when a berry is missed +// Flash red when few yellow squares remain +enum { + STATUS_YELLOW, + STATUS_GRAY, + STATUS_RED, +}; + +#define NUM_STATUS_SQUARES 10 + +// Berries fall in predefined columns. +// A total of 10 are available, though fewer will be used with < 5 players +// The 11th column is a repeat of the 1st column wrapped around, so only +// the values 0-9 are unique 'valid' columns +#define NUM_BERRY_COLUMNS 11 + +#define GFXTAG_DODRIO 0 +#define GFXTAG_STATUS 1 +#define GFXTAG_BERRIES 2 +#define GFXTAG_CLOUD 5 +#define GFXTAG_COUNTDOWN 7 + +#define PALTAG_DODRIO_NORMAL 0 +#define PALTAG_DODRIO_SHINY 1 +#define PALTAG_STATUS 2 +#define PALTAG_BERRIES 3 +#define PALTAG_CLOUD 6 +#define PALTAG_COUNTDOWN 8 + +#define NUM_CLOUDS 2 + +#define PLAYER_NONE 0xFF + +struct DodrioGame_Gfx +{ + u16 ALIGNED(4) tilemapBuffers[3][BG_SCREEN_SIZE]; + bool32 finished; + u8 ALIGNED(4) taskId; + u8 ALIGNED(4) windowIds[MAX_RFU_PLAYERS + 5]; // The latter 5 are never used + u8 ALIGNED(4) state; + u8 ALIGNED(4) loadState; + u16 ALIGNED(4) timer; + u8 ALIGNED(4) cursorSelection; + u8 ALIGNED(4) playAgainState; + void (*func)(void); }; // size = 0x302C -struct DodrioStruct_2022CF4 +struct StatusBar { - u8 filler_00[0xc]; - u8 unkC[10]; - s16 unk16[10]; - u16 unk2A[10]; - u16 unk3E; + u8 unused[12]; + bool8 entered[NUM_STATUS_SQUARES]; + s16 yChange[NUM_STATUS_SQUARES]; + u16 spriteIds[NUM_STATUS_SQUARES]; + u16 flashTimer; }; // size = 0x40 -struct DodrioSubstruct_31A0_14 +struct DodrioGame_Berries { - u8 unk0[11]; - u8 unkB[11]; + u8 ids[NUM_BERRY_COLUMNS]; + u8 fallDist[NUM_BERRY_COLUMNS]; }; -struct DodrioSubstruct_31A0_2C +struct DodrioGame_PlayerCommData { - u8 unk0; - u8 ALIGNED(4) unk4; - u8 ALIGNED(4) unk8; + u8 pickState; + bool8 ALIGNED(4) ateBerry; + bool8 ALIGNED(4) missedBerry; }; -struct DodrioSubstruct_31A0 +struct DodrioGame_Player { - u8 name[0x10]; - u32 unk10; - struct DodrioSubstruct_31A0_14 unk14; - struct DodrioSubstruct_31A0_2C unk2C; - u8 filler_35[4]; + u8 name[16]; + bool32 receivedGameStatePacket; // Never read + struct DodrioGame_Berries berries; + struct DodrioGame_PlayerCommData comm; + u32 unused; }; // size = 0x3C -struct DodrioSubstruct_318C +// Because Dodrio is required for this minigame, +// the only relevant information about the selected +// Pokémon is whether or not it's shiny +struct DodrioGame_MonInfo { bool8 isShiny; }; -struct DodrioSubstruct_3308 +struct DodrioGame_ScoreResults { - u8 unk0; - u32 unk4; + u8 ranking; + u32 score; }; -struct DodrioStruct -{ - /*0x0000*/ void (*savedCallback)(void); - /*0x0004*/ u8 ALIGNED(4) unk04; - /*0x0008*/ u8 ALIGNED(4) unk08; - /*0x000C*/ u8 ALIGNED(4) unk0C; - /*0x0010*/ u8 ALIGNED(4) unk10; - /*0x0014*/ u8 ALIGNED(4) unk14; - /*0x0018*/ u8 ALIGNED(4) unk18; - /*0x001C*/ u8 ALIGNED(4) unk1C; - /*0x0020*/ u8 ALIGNED(4) unk20; - /*0x0024*/ u8 ALIGNED(4) unk24; +struct DodrioGame +{ + /*0x0000*/ void (*exitCallback)(void); + /*0x0004*/ u8 ALIGNED(4) taskId; + /*0x0008*/ u8 ALIGNED(4) playersReceived; + /*0x000C*/ u8 ALIGNED(4) startState; + /*0x0010*/ u8 ALIGNED(4) state; + /*0x0014*/ u8 ALIGNED(4) timer; + /*0x0018*/ u8 ALIGNED(4) funcId; + /*0x001C*/ u8 ALIGNED(4) prevFuncId; // Set, never read + /*0x0020*/ bool8 ALIGNED(4) isLeader; + /*0x0024*/ u8 ALIGNED(4) numPlayers; /*0x0028*/ u8 ALIGNED(4) multiplayerId; - /*0x0029*/ u8 filler_0029[7]; - /*0x0030*/ u8 ALIGNED(4) unk30; - /*0x0034*/ u8 ALIGNED(4) unk34[5]; - /*0x003C*/ u8 ALIGNED(4) unk3C; - /*0x0040*/ u8 ALIGNED(4) unk40; - /*0x0044*/ u8 ALIGNED(4) unk44; - /*0x0048*/ u8 ALIGNED(4) unk48; - /*0x004A*/ u16 unk4A[5][6]; - /*0x0086*/ u16 unk86[5]; - /*0x0090*/ u8 ALIGNED(4) unk90[5]; - /*0x0098*/ u8 ALIGNED(4) unk98[4]; - /*0x009C*/ u8 ALIGNED(4) unk9C[11]; - /*0x00A8*/ u8 ALIGNED(4) unkA8[5]; - /*0x00B0*/ u8 ALIGNED(4) unkB0[5]; - /*0x00B8*/ u8 ALIGNED(4) unkB8[11]; - /*0x00C4*/ u8 ALIGNED(4) unkC4[11]; - /*0x00D0*/ u8 ALIGNED(4) unkD0[11]; - /*0x00DC*/ u8 ALIGNED(4) unkDC[11]; - /*0x00E8*/ u8 ALIGNED(4) unkE8[11]; - /*0x00F4*/ u8 ALIGNED(4) unkF4[11][2]; - /*0x010C*/ u8 ALIGNED(4) unk10C[5]; - /*0x0112*/ u16 unk112; - /*0x0114*/ u16 unk114; - /*0x0118*/ u32 unk118; - /*0x011C*/ u32 unk11C; - /*0x0120*/ u32 unk120; - /*0x0124*/ u8 ALIGNED(4) unk124; - /*0x0128*/ u8 ALIGNED(4) unk128; - /*0x012C*/ u32 unk12C; - /*0x0130*/ u32 unk130[5]; - /*0x0144*/ u8 ALIGNED(4) unk144; - /*0x0148*/ u8 ALIGNED(4) unk148[11]; - /*0x0154*/ u8 ALIGNED(4) unk154; - /*0x0158*/ u8 ALIGNED(4) unk158[5]; - /*0x0160*/ struct DodrioSubstruct_0160 unk160; - /*0x318C*/ struct DodrioSubstruct_318C unk318C[5]; - /*0x31A0*/ struct DodrioSubstruct_31A0 unk31A0[5]; - /*0x32CC*/ struct DodrioSubstruct_31A0 unk32CC; - /*0x3308*/ struct DodrioSubstruct_3308 unk3308[5]; + /*0x0029*/ u8 unused1[7]; + /*0x0030*/ u8 ALIGNED(4) countdownEndDelay; + /*0x0034*/ u8 ALIGNED(4) posToPlayerId[MAX_RFU_PLAYERS]; + /*0x003C*/ u8 ALIGNED(4) unused2; // Set to 0, never read + /*0x0040*/ u8 ALIGNED(4) numGraySquares; + /*0x0044*/ u8 ALIGNED(4) berryColStart; + /*0x0048*/ u8 ALIGNED(4) berryColEnd; + /*0x004A*/ u16 berryResults[MAX_RFU_PLAYERS][NUM_BERRY_IDS]; + /*0x0086*/ u16 berriesEaten[MAX_RFU_PLAYERS]; + /*0x0090*/ u8 ALIGNED(4) difficulty[MAX_RFU_PLAYERS]; + /*0x0098*/ u8 ALIGNED(4) pickStateQueue[4]; + /*0x009C*/ u8 ALIGNED(4) eatTimer[NUM_BERRY_COLUMNS]; + /*0x00A8*/ u8 ALIGNED(4) inputState[MAX_RFU_PLAYERS]; + /*0x00B0*/ u8 ALIGNED(4) inputDelay[MAX_RFU_PLAYERS]; + /*0x00B8*/ u8 ALIGNED(4) berryEatenBy[NUM_BERRY_COLUMNS]; + /*0x00C4*/ u8 ALIGNED(4) berryState[NUM_BERRY_COLUMNS]; + /*0x00D0*/ u8 ALIGNED(4) fallTimer[NUM_BERRY_COLUMNS]; + /*0x00DC*/ u8 ALIGNED(4) newBerryTimer[NUM_BERRY_COLUMNS]; + /*0x00E8*/ u8 ALIGNED(4) prevBerryIds[NUM_BERRY_COLUMNS]; + /*0x00F4*/ u8 ALIGNED(4) playersAttemptingPick[NUM_BERRY_COLUMNS][2]; + /*0x010C*/ u8 ALIGNED(4) playAgainStates[MAX_RFU_PLAYERS]; + /*0x0112*/ u16 berriesPickedInRow; + /*0x0114*/ u16 maxBerriesPickedInRow; + /*0x0118*/ bool32 startCountdown; // Never read + /*0x011C*/ bool32 startGame; + /*0x0120*/ bool32 berriesFalling; + /*0x0124*/ u8 ALIGNED(4) clearRecvCmdTimer; + /*0x0128*/ bool8 ALIGNED(4) clearRecvCmds; + /*0x012C*/ bool32 allReadyToEnd; + /*0x0130*/ bool32 readyToEnd[MAX_RFU_PLAYERS]; + /*0x0144*/ bool8 ALIGNED(4) playingPickSound; + /*0x0148*/ bool8 ALIGNED(4) playingSquishSound[NUM_BERRY_COLUMNS]; + /*0x0154*/ u8 ALIGNED(4) endSoundState; + /*0x0158*/ bool8 ALIGNED(4) readyToStart[MAX_RFU_PLAYERS]; + /*0x0160*/ struct DodrioGame_Gfx gfx; + /*0x318C*/ struct DodrioGame_MonInfo monInfo[MAX_RFU_PLAYERS]; + /*0x31A0*/ struct DodrioGame_Player players[MAX_RFU_PLAYERS]; + /*0x32CC*/ struct DodrioGame_Player player; + /*0x3308*/ struct DodrioGame_ScoreResults scoreResults[MAX_RFU_PLAYERS]; }; // size = 0x3330 -EWRAM_DATA static struct DodrioStruct * gUnknown_02022C98 = NULL; -EWRAM_DATA static u16 *gUnknown_02022C9C[5] = {NULL}; -EWRAM_DATA static u16 *gUnknown_02022CB0[2] = {NULL}; -EWRAM_DATA static u16 *gUnknown_02022CB8[11] = {NULL}; -EWRAM_DATA static u16 *gUnknown_02022CE4[4] = {NULL}; -EWRAM_DATA static struct DodrioStruct_2022CF4 *gUnknown_02022CF4 = NULL; -EWRAM_DATA static struct DodrioSubstruct_0160 *gUnknown_02022CF8 = NULL; - -static bool32 gUnknown_03000DB0; - -static void sub_8024A1C(void); -static void sub_8024A30(struct DodrioStruct *); -static void sub_8024BC8(u8 taskId); -static void sub_8024DBC(void); -static void sub_8024E00(void); -static void sub_8024E38(void); -static void sub_8024F10(void); -static void sub_8024F38(void); -static void sub_8024FFC(void); -static void sub_80250D4(void); -static void sub_8025158(void); -static void sub_8025198(void); -static void sub_8025230(void); -static void sub_8025324(void); -static void sub_8025470(void); -static void sub_8025644(void); -static void sub_80256AC(void); -static void sub_8025758(void); -static void sub_802589C(u8 taskId); -static void sub_8025910(u8 taskId); -static void sub_8025D04(void); -static void sub_8025D50(void); -static void sub_8025E0C(void); -static void sub_8025ED8(void); -static void sub_8025F48(void); -static void sub_8026044(void); -static void sub_80261CC(void); -static void sub_80261E4(void); -static void sub_80261F8(struct DodrioSubstruct_318C *, struct Pokemon *); -static void sub_802620C(TaskFunc, u8); -static void sub_802621C(TaskFunc); -static void sub_8026240(u8); -static bool32 sub_8026264(void); -static void sub_80262C0(void); -static bool32 sub_8026634(u8, u8, u8); -static void sub_802671C(void); -static void sub_8026AF4(void); -static void sub_8026B28(void); -static void sub_8026B5C(u8, u8*, u8*); -static bool32 sub_8026BB8(void); -static void sub_8026C28(void); -static bool32 sub_8026C50(void); -static bool32 sub_8026C90(void); -static void sub_8026D1C(u8); -static u8 sub_8026D8C(u8); -static u8 sub_8026DB0(u8, u8); -static void sub_8026F1C(u8, u8, u8); -static void sub_8027234(bool32 arg0); -static void sub_80272A4(void); -static void sub_80272E8(void); -static void sub_80273F0(void); -static void sub_802749C(void); -static u8 sub_8027518(u8); -static void sub_8027554(void); -static void sub_8027608(void); -static u32 sub_8027748(void); -static void sub_8027DD0(u32 arg0); -static void sub_8027E30(struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 arg6, u32 arg7, u32 arg8); -static u32 sub_8028164(u32 unused, struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 *arg6, u32 *arg7, u32 *arg8); -static void sub_80282EC(u8); -static u32 sub_8028318(u32 arg0, u8 *arg1); -static void sub_8028350(u32 arg0); -static u32 sub_8028374(u32 arg0); -static void sub_80283A8(void); -static void sub_8028408(struct DodrioSubstruct_318C *arg0, u8 arg1, u8 id, u8 arg3); -static void sub_80284CC(u8); -static void sub_8028504(u8); -static void sub_8028614(u8 count); -static void sub_802868C(bool8 invisible, u8 count); -static void sub_8028734(void); -static void sub_80287E4(void); -static void sub_80289E8(bool8 invisible); -static void sub_80286E4(void); -static bool32 sub_8028828(void); -static void sub_8028A34(void); -static void sub_8028A88(void); -static void sub_8028B80(void); -static void sub_8028D44(void); -static void sub_8028DFC(void); -static void sub_8028E4C(void); -static void sub_8028E84(void); -static void sub_8028EC8(bool8 invisible); -static void sub_8028FCC(void); -static void sub_802903C(void); -static void sub_8029274(struct DodrioSubstruct_0160 *PTR); -static void sub_80292E0(u8); -static bool32 sub_802A770(void); -static u8 sub_802A794(void); -static void sub_8028BF8(u8 id, bool8 invisible); -static void sub_8028C30(bool8 invisible); -static void sub_8028CA4(u16 id, u8 frameNum); -static void sub_8028C7C(u8 id, u8 y); -static void sub_80286B4(u8 id, u8 frameNum); -static u8 sub_8026E70(u8 arg0, u8 arg1); -static void sub_80288D4(u8 arg0); -static u32 sub_8027DFC(u32 arg0); -static u32 IncrementWithLimit(u32 arg0, u32 arg1); -static u32 Min(u32 arg0, u32 arg1); -static u32 sub_80276C0(u8 arg0); -static void Task_ShowDodrioBerryPickingRecords(u8 taskId); -static void sub_8029314(u8 taskId); -static void sub_8027BEC(u8 windowId, s32 width); -static void nullsub_15(struct Sprite *sprite); -static void sub_80284A8(struct Sprite *sprite); -static u32 sub_802853C(struct Sprite *sprite); -static u32 sub_80285AC(struct Sprite *sprite); -static s16 sub_8028F14(u8 arg0, u8 arg1); -static void sub_8028654(bool8 invisible, u8 id); -static void sub_8029338(void); -static bool32 sub_802A8E8(void); -static void sub_802A7A8(void); -static void sub_802A72C(void (*func)(void)); -static void (*sub_802A75C(void))(void); -static void sub_8029338(void); -static void sub_8029440(void); -static void sub_802988C(void); -static void sub_802A010(void); -static void sub_802A380(void); -static void sub_802A454(void); -static void sub_802A534(void); -static void sub_802A588(void); -static void sub_802A6FC(void); -static void nullsub_16(void); - -// const rom data -static const u8 gUnknown_082F449C[5][5][11] = -{ - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, +EWRAM_DATA static struct DodrioGame * sGame = NULL; +EWRAM_DATA static u16 * sDodrioSpriteIds[MAX_RFU_PLAYERS] = {NULL}; +EWRAM_DATA static u16 * sCloudSpriteIds[NUM_CLOUDS] = {NULL}; +EWRAM_DATA static u16 * sBerrySpriteIds[NUM_BERRY_COLUMNS] = {NULL}; +EWRAM_DATA static u16 * sBerryIconSpriteIds[NUM_BERRY_TYPES] = {NULL}; +EWRAM_DATA static struct StatusBar * sStatusBar = NULL; +EWRAM_DATA static struct DodrioGame_Gfx * sGfx = NULL; + +static bool32 sExitingGame; + +static void ResetTasksAndSprites(void); +static void InitDodrioGame(struct DodrioGame *); +static void Task_StartDodrioGame(u8); +static void DoGameIntro(void); +static void InitCountdown(void); +static void DoCountdown(void); +static void WaitGameStart(void); +static void PlayGame_Leader(void); +static void PlayGame_Member(void); +static void WaitEndGame_Leader(void); +static void WaitEndGame_Member(void); +static void InitResults_Leader(void); +static void InitResults_Member(void); +static void DoResults(void); +static void AskPlayAgain(void); +static void EndLink(void); +static void ExitGame(void); +static void ResetGame(void); +static void Task_NewGameIntro(u8); +static void Task_CommunicateMonInfo(u8); +static void RecvLinkData_Leader(void); +static void SendLinkData_Leader(void); +static void RecvLinkData_Member(void); +static void SendLinkData_Member(void); +static void HandleSound_Leader(void); +static void HandleSound_Member(void); +static void CB2_DodrioGame(void); +static void VBlankCB_DodrioGame(void); +static void InitMonInfo(struct DodrioGame_MonInfo *, struct Pokemon *); +static void CreateTask_(TaskFunc, u8); +static void CreateDodrioGameTask(TaskFunc); +static void SetGameFunc(u8); +static bool32 SlideTreeBordersOut(void); +static void InitFirstWaveOfBerries(void); +static bool32 TryPickBerry(u8, u8, u8); +static void UpdateFallingBerries(void); +static void UpdateGame_Leader(void); +static void UpdateGame_Member(void); +static void GetActiveBerryColumns(u8, u8*, u8*); +static bool32 AllPlayersReadyToStart(void); +static void ResetReadyToStart(void); +static bool32 ReadyToEndGame_Leader(void); +static bool32 ReadyToEndGame_Member(void); +static void TryIncrementDifficulty(u8); +static u8 GetPlayerIdAtColumn(u8); +static u8 GetNewBerryId(u8, u8); +static void IncrementBerryResult(u8, u8, u8); +static void UpdateBerriesPickedInRow(bool32); +static void SetMaxBerriesPickedInRow(void); +static void ResetForPlayAgainPrompt(void); +static void SetRandomPrize(void); +static void TryUpdateRecords(void); +static u8 UpdatePickStateQueue(u8); +static void HandleWaitPlayAgainInput(void); +static void ResetPickState(void); +static u32 GetHighestScore(void); +static void SendPacket_ReadyToStart(bool32); +static void SendPacket_GameState(struct DodrioGame_Player *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + u8 , bool32 , bool32 ); +static bool32 RecvPacket_GameState(u32, + struct DodrioGame_Player *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + struct DodrioGame_PlayerCommData *, + u8 *, bool32 *, bool32 *); +static void SendPacket_PickState(u8); +static bool32 RecvPacket_PickState(u32, u8 *); +static void SendPacket_ReadyToEnd(bool32); +static bool32 RecvPacket_ReadyToEnd(u32); +static void LoadDodrioGfx(void); +static void CreateDodrioSprite(struct DodrioGame_MonInfo *, u8, u8, u8); +static void StartDodrioMissedAnim(u8); +static void StartDodrioIntroAnim(u8); +static void FreeDodrioSprites(u8); +static void SetAllDodrioInvisibility(bool8, u8); +static void CreateStatusBarSprites(void); +static void FreeStatusBar(void); +static void SetStatusBarInvisibility(bool8); +static void InitStatusBarPos(void); +static bool32 DoStatusBarIntro(void); +static void LoadBerryGfx(void); +static void CreateBerrySprites(void); +static void FreeBerrySprites(void); +static void CreateCloudSprites(void); +static void ResetCloudPos(void); +static void StartCloudMovement(void); +static void FreeCloudSprites(void); +static void SetCloudInvisibility(bool8); +static void ResetBerryAndStatusBarSprites(void); +static void ResetGfxState(void); +static void InitGameGfx(struct DodrioGame_Gfx *); +static void SetGfxFuncById(u8); +static bool32 IsGfxFuncActive(void); +static u8 GetPlayAgainState(void); +static void SetBerryInvisibility(u8, bool8); +static void SetBerryIconsInvisibility(bool8); +static void SetBerryAnim(u16, u8); +static void SetBerryYPos(u8, u8); +static void SetDodrioAnim(u8, u8); +static u8 GetNewBerryIdByDifficulty(u8, u8); +static void UpdateStatusBarAnim(u8); +static u32 RecvPacket_ReadyToStart(u32); +static u32 IncrementWithLimit(u32, u32); +static u32 Min(u32, u32); +static u32 GetScore(u8); +static void Task_ShowDodrioBerryPickingRecords(u8); +static void Task_TryRunGfxFunc(u8); +static void PrintRecordsText(u8, s32); +static void SpriteCB_Status(struct Sprite *); +static void SpriteCB_Dodrio(struct Sprite *); +static u32 DoDodrioMissedAnim(struct Sprite *); +static u32 DoDodrioIntroAnim(struct Sprite *); +static s16 GetDodrioXPos(u8, u8); +static void SetDodrioInvisibility(bool8, u8); +static void LoadGfx(void); +static bool32 LoadBgGfx(void); +static void InitBgs(void); +static void SetGfxFunc(void (*func)(void)); +static void (*GetGfxFunc(void))(void); +static void ShowNames(void); +static void ShowResults(void); +static void Msg_WantToPlayAgain(void); +static void Msg_SavingDontTurnOff(void); +static void Msg_CommunicationStandby(void); +static void EraseMessage(void); +static void Msg_SomeoneDroppedOut(void); +static void StopGfxFuncs(void); +static void GfxIdle(void); + +// For each player, the array is a list of all the columns starting with the column to their left +// Only the range of active columns is read from the array (dependent on the number of players), +// so the arrays are spaced such that the numbers in the center are where the data that's read starts and end. +static const u8 sActiveColumnMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = +{ + { // 1 player (never used), columns 4-6. + // Sometimes read to get default order regardless of the current number of players + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, }, - { - {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, - {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, + { // 2 players (never used), columns 3-6 + {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, + {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, - {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, - {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, + { // 3 players, columns 2-7 + {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, + {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, + {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, - {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, - {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, - {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, + { // 4 players, columns 1-8 + {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, + {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, + {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, + {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, }, - { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, - {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, - {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}, - {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}, - {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8}, + { // 5 players, all columns (0-9) + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, + { 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 }, + { 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4 }, + { 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 }, + { 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8 }, }, }; -static const u8 gUknnown_082F45AF[5][5][3] = +// A table for which falling berry column corresponds to which Dodrio head for each player +// The numbers in each array are the column number for each head, {left, middle, right} +// Dependent on the number of players +static const u8 sDodrioHeadToColumnMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = { - { + { // 1 player (never used) {4, 5, 6}, }, - { + { // 2 players (never used) {3, 4, 5}, {5, 6, 3}, }, - { + { // 3 players {4, 5, 6}, {6, 7, 2}, {2, 3, 4}, }, - { + { // 4 players {3, 4, 5}, {5, 6, 7}, {7, 8, 1}, {1, 2, 3}, }, - { + { // 5 players {4, 5, 6}, {6, 7, 8}, {8, 9, 0}, @@ -328,27 +486,29 @@ static const u8 gUknnown_082F45AF[5][5][3] = }, }; -static const u8 gUnknown_082F45FA[5][5][3] = +// A table of player ids and their neighbor, dependent on the total number of players +// {L, M, R}, where M is the player in question, L is their neighbor to the left, and R is their neighbor to the right +static const u8 sDodrioNeighborMap[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = { - { + { // 1 player (never used) {1, 0, 1}, }, - { + { // 2 players (never used) {1, 0, 1}, {0, 1, 0}, }, - { + { // 3 players {2, 0, 1}, {0, 1, 2}, {1, 2, 0}, }, - { + { // 4 players {3, 0, 1}, {0, 1, 2}, {1, 2, 3}, {2, 3, 0}, }, - { + { // 5 players {4, 0, 1}, {0, 1, 2}, {1, 2, 3}, @@ -357,208 +517,259 @@ static const u8 gUnknown_082F45FA[5][5][3] = }, }; +#define __ 9 // No player at this column. This may go out of bounds if this is returned + +// Takes the number of players and a column and returns the player id at that column. +// Note that the assignment is somewhat arbitrary as players share neighboring columns. ALIGNED(4) -static const u8 gUnknown_082F4648[5][11] = +static const u8 sPlayerIdAtColumn[MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = { - {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9}, - {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9}, - {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9}, - {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9}, - {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, + {__, __, __, __, 1, 1, 1, __, __, __, __}, // 1 player + {__, __, __, 0, 0, 1, 1, 0, __, __, __}, // 2 players + {__, __, 2, 2, 0, 0, 1, 1, 1, __, __}, // 3 players + {__, 3, 3, 0, 0, 1, 1, 2, 2, 3, __}, // 4 players + { 3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, // 5 players }; -static const u8 gUnknown_082F467F[5][5] = +#undef __ + +// Each array contains the columns that belong solely to one player, dependent on the number of players +// When determing how difficult the berries in a column should be, the highest +// difficulty of the players sharing that column is used. +// This table is used to skip that check, and instead automatically use the +// difficulty of the only player who can use the column. +static const u8 sUnsharedColumns[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = { {5}, {4, 6}, {3, 5, 7}, {2, 4, 6, 8}, - {1, 3, 5, 6, 9}, +#ifndef BUGFIX + {1, 3, 5, 6, 9}, // BUG: Column 6 is shared, 7 is not. As a result, the player in column 7 will have their difficulty influenced by their neighbors +#else + {1, 3, 5, 7, 9}, +#endif }; // Duplicate and unused gfx. Feel free to remove. -static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.gbapal", - "graphics/link_games/dodrioberry_bg2.gbapal", - "graphics/link_games/dodrioberry_pkmn.gbapal", - "graphics/link_games/dodrioberry_shiny.gbapal", - "graphics/link_games/dodrioberry_status.gbapal", - "graphics/link_games/dodrioberry_berrysprites.gbapal", - "graphics/link_games/dodrioberry_berrysprites.4bpp.lz", - "graphics/link_games/dodrioberry_platform.gbapal", - "graphics/link_games/dodrioberry_bg1.4bpp.lz", - "graphics/link_games/dodrioberry_bg2.4bpp.lz", - "graphics/link_games/dodrioberry_status.4bpp.lz", - "graphics/link_games/dodrioberry_platform.4bpp.lz", - "graphics/link_games/dodrioberry_pkmn.4bpp.lz", - "graphics/link_games/dodrioberry_bg1.bin.lz", - "graphics/link_games/dodrioberry_bg2right.bin.lz", - "graphics/link_games/dodrioberry_bg2left.bin.lz"); - - -static const u8 gUnknown_082F7A88[][3] = -{ - {40, 24, 13}, - {32, 19, 10}, - {22, 13, 7}, +static const u32 sDuplicateGfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.gbapal", + "graphics/dodrio_berry_picking/tree_border.gbapal", + "graphics/dodrio_berry_picking/dodrio.gbapal", + "graphics/dodrio_berry_picking/shiny.gbapal", + "graphics/dodrio_berry_picking/status.gbapal", + "graphics/dodrio_berry_picking/berries.gbapal", + "graphics/dodrio_berry_picking/berries.4bpp.lz", + "graphics/dodrio_berry_picking/cloud.gbapal", + "graphics/dodrio_berry_picking/bg.4bpp.lz", + "graphics/dodrio_berry_picking/tree_border.4bpp.lz", + "graphics/dodrio_berry_picking/status.4bpp.lz", + "graphics/dodrio_berry_picking/cloud.4bpp.lz", + "graphics/dodrio_berry_picking/dodrio.4bpp.lz", + "graphics/dodrio_berry_picking/bg.bin.lz", + "graphics/dodrio_berry_picking/tree_border_right.bin.lz", + "graphics/dodrio_berry_picking/tree_border_left.bin.lz"); + + +static const u8 sBerryFallDelays[][3] = +{ + { [BERRY_BLUE] = 40, [BERRY_GREEN] = 24, [BERRY_GOLD] = 13 }, + { [BERRY_BLUE] = 32, [BERRY_GREEN] = 19, [BERRY_GOLD] = 10 }, + { [BERRY_BLUE] = 22, [BERRY_GREEN] = 13, [BERRY_GOLD] = 7 }, }; +// How far the outer tree borders should slide to reveal the game screen. +// Dependent on how many players are playing. +// Curiously the 2-player screen is narrower than the 1-player, though neither +// gets used as there's a 3 player minimum ALIGNED(4) -static const u8 gUnknown_082F7A94[] = {8, 5, 8, 11, 15}; +static const u8 sTreeBorderXPos[MAX_RFU_PLAYERS] = {8, 5, 8, 11, 15}; +// The number of berries eaten needed to progress to the next difficulty ALIGNED(4) -static const u8 gUnknown_082F7A9C[] = {5, 10, 20, 30, 50, 70, 100}; +static const u8 sDifficultyThresholds[NUM_DIFFICULTIES] = {5, 10, 20, 30, 50, 70, 100}; ALIGNED(4) -static const u8 gUnknown_082F7AA4[][10] = -{ - {15, 16, 17, 18, 19, 19, 18, 17, 16, 15}, - {20, 21, 22, 23, 24, 25, 26, 27, 28, 29}, - {30, 31, 32, 33, 34, 34, 33, 32, 31, 30}, +static const u8 sPrizeBerryIds[][10] = +{ + { // Possible prizes with 3 players + ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1, + ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1, + ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1, + ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1, + ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1, + ITEM_TO_BERRY(ITEM_PINAP_BERRY) - 1, + ITEM_TO_BERRY(ITEM_WEPEAR_BERRY) - 1, + ITEM_TO_BERRY(ITEM_NANAB_BERRY) - 1, + ITEM_TO_BERRY(ITEM_BLUK_BERRY) - 1, + ITEM_TO_BERRY(ITEM_RAZZ_BERRY) - 1 + }, + { // Possible prizes with 4 players + ITEM_TO_BERRY(ITEM_POMEG_BERRY) - 1, + ITEM_TO_BERRY(ITEM_KELPSY_BERRY) - 1, + ITEM_TO_BERRY(ITEM_QUALOT_BERRY) - 1, + ITEM_TO_BERRY(ITEM_HONDEW_BERRY) - 1, + ITEM_TO_BERRY(ITEM_GREPA_BERRY) - 1, + ITEM_TO_BERRY(ITEM_TAMATO_BERRY) - 1, + ITEM_TO_BERRY(ITEM_CORNN_BERRY) - 1, + ITEM_TO_BERRY(ITEM_MAGOST_BERRY) - 1, + ITEM_TO_BERRY(ITEM_RABUTA_BERRY) - 1, + ITEM_TO_BERRY(ITEM_NOMEL_BERRY) - 1 + }, + { // Possible prizes with 5 players + ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1, + ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1, + ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1, + ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1, + ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1, + ITEM_TO_BERRY(ITEM_BELUE_BERRY) - 1, + ITEM_TO_BERRY(ITEM_DURIN_BERRY) - 1, + ITEM_TO_BERRY(ITEM_WATMEL_BERRY) - 1, + ITEM_TO_BERRY(ITEM_PAMTRE_BERRY) - 1, + ITEM_TO_BERRY(ITEM_SPELON_BERRY) - 1 + }, }; -static void (*const gUnknown_082F7AC4[])(void) = -{ - sub_8024DBC, - sub_8024E00, - sub_8024E38, - sub_8024F10, - sub_8024F38, - sub_8025198, - sub_8025324, - sub_8025470, - sub_8025644, - sub_80256AC, - sub_8025758, - sub_80250D4 +static void (*const sLeaderFuncs[])(void) = +{ + [FUNC_INTRO] = DoGameIntro, + [FUNC_INIT_COUNTDOWN] = InitCountdown, + [FUNC_COUNTDOWN] = DoCountdown, + [FUNC_WAIT_START] = WaitGameStart, + [FUNC_PLAY_GAME] = PlayGame_Leader, + [FUNC_INIT_RESULTS] = InitResults_Leader, + [FUNC_RESULTS] = DoResults, + [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain, + [FUNC_END_LINK] = EndLink, + [FUNC_EXIT] = ExitGame, + [FUNC_RESET_GAME] = ResetGame, + [FUNC_WAIT_END_GAME] = WaitEndGame_Leader }; -static void (*const gUnknown_082F7AF4[])(void) = -{ - sub_8024DBC, - sub_8024E00, - sub_8024E38, - sub_8024F10, - sub_8024FFC, - sub_8025230, - sub_8025324, - sub_8025470, - sub_8025644, - sub_80256AC, - sub_8025758, - sub_8025158 +static void (*const sMemberFuncs[])(void) = +{ + [FUNC_INTRO] = DoGameIntro, + [FUNC_INIT_COUNTDOWN] = InitCountdown, + [FUNC_COUNTDOWN] = DoCountdown, + [FUNC_WAIT_START] = WaitGameStart, + [FUNC_PLAY_GAME] = PlayGame_Member, + [FUNC_INIT_RESULTS] = InitResults_Member, + [FUNC_RESULTS] = DoResults, + [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain, + [FUNC_END_LINK] = EndLink, + [FUNC_EXIT] = ExitGame, + [FUNC_RESET_GAME] = ResetGame, + [FUNC_WAIT_END_GAME] = WaitEndGame_Member }; -// code -void StartDodrioBerryPicking(u16 a0, void (*callback)(void)) +void StartDodrioBerryPicking(u16 partyId, void (*exitCallback)(void)) { - gUnknown_03000DB0 = FALSE; + sExitingGame = FALSE; - if (gReceivedRemoteLinkPlayers != 0 && (gUnknown_02022C98 = AllocZeroed(sizeof(*gUnknown_02022C98))) != NULL) + if (gReceivedRemoteLinkPlayers != 0 && (sGame = AllocZeroed(sizeof(*sGame)))) { - sub_8024A1C(); - sub_8024A30(gUnknown_02022C98); - gUnknown_02022C98->savedCallback = callback; - gUnknown_02022C98->multiplayerId = GetMultiplayerId(); - gUnknown_02022C98->unk32CC = gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId]; - sub_80261F8(&gUnknown_02022C98->unk318C[gUnknown_02022C98->multiplayerId], &gPlayerParty[a0]); - CreateTask(sub_8024BC8, 1); - SetMainCallback2(sub_80261CC); - sub_80273F0(); - sub_8026B5C(gUnknown_02022C98->unk24, &gUnknown_02022C98->unk44, &gUnknown_02022C98->unk48); + ResetTasksAndSprites(); + InitDodrioGame(sGame); + sGame->exitCallback = exitCallback; + sGame->multiplayerId = GetMultiplayerId(); + sGame->player = sGame->players[sGame->multiplayerId]; + InitMonInfo(&sGame->monInfo[sGame->multiplayerId], &gPlayerParty[partyId]); + CreateTask(Task_StartDodrioGame, 1); + SetMainCallback2(CB2_DodrioGame); + SetRandomPrize(); + GetActiveBerryColumns(sGame->numPlayers, &sGame->berryColStart, &sGame->berryColEnd); StopMapMusic(); PlayNewMapMusic(MUS_RG_BERRY_PICK); } else { - SetMainCallback2(callback); + // Exit - Alloc failed, or players not connected + SetMainCallback2(exitCallback); return; } } -static void sub_8024A1C(void) +static void ResetTasksAndSprites(void) { ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); } -static void sub_8024A30(struct DodrioStruct * data) +static void InitDodrioGame(struct DodrioGame * game) { u8 i; - data->unk0C = 0; - data->unk10 = 0; - data->unk14 = 0; - data->unk18 = 0; - data->unk1C = 0; - data->unk11C = 0; - data->unk120 = 0; - data->unk30 = 0; - data->unk40 = 0; - data->unk3C = 0; - data->unk12C = 0; - - for (i = 0; i < 4; i++) - { - data->unk98[i] = 0; + game->startState = 0; + game->state = 0; + game->timer = 0; + game->funcId = FUNC_INTRO; + game->prevFuncId = FUNC_INTRO; + game->startGame = FALSE; + game->berriesFalling = FALSE; + game->countdownEndDelay = 0; + game->numGraySquares = 0; + game->unused2 = 0; + game->allReadyToEnd = FALSE; + + for (i = 0; i < ARRAY_COUNT(game->pickStateQueue); i++) + game->pickStateQueue[i] = PICK_NONE; + + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + game->inputState[i] = INPUTSTATE_NONE; + game->inputDelay[i] = 0; + game->berryResults[i][BERRY_BLUE] = 0; + game->berryResults[i][BERRY_GREEN] = 0; + game->berryResults[i][BERRY_GOLD] = 0; + game->berryResults[i][BERRY_MISSED] = 0; + game->berryResults[i][BERRY_IN_ROW] = 0; + game->playAgainStates[i] = PLAY_AGAIN_NONE; + game->readyToEnd[i] = FALSE; } - for (i = 0; i < 5; i++) - { - data->unkA8[i] = 0; - data->unkB0[i] = 0; - data->unk4A[i][0] = 0; - data->unk4A[i][1] = 0; - data->unk4A[i][2] = 0; - data->unk4A[i][3] = 0; - data->unk4A[i][5] = 0; - data->unk10C[i] = 0; - data->unk130[i] = 0; - } - - for (i = 0; i < 11; i++) + for (i = 0; i < NUM_BERRY_COLUMNS; i++) { - data->unkD0[i] = 0; - data->unkDC[i] = 0; - data->unkC4[i] = 0; - data->unkF4[i][0] = 0xFF; - data->unkF4[i][1] = 0xFF; + game->fallTimer[i] = 0; + game->newBerryTimer[i] = 0; + game->berryState[i] = BERRYSTATE_NONE; + game->playersAttemptingPick[i][0] = PLAYER_NONE; + game->playersAttemptingPick[i][1] = PLAYER_NONE; } - data->unk20 = GetMultiplayerId() == 0 ? 1 : 0; - data->unk24 = GetLinkPlayerCount(); - data->unk34[0] = GetMultiplayerId(); - for (i = 1; i < data->unk24; i++) + game->isLeader = GetMultiplayerId() == 0 ? TRUE : FALSE; + game->numPlayers = GetLinkPlayerCount(); + game->posToPlayerId[0] = GetMultiplayerId(); + for (i = 1; i < game->numPlayers; i++) { - data->unk34[i] = data->unk34[i - 1] + 1; - if (data->unk34[i] > data->unk24 - 1) - data->unk34[i] %= data->unk24; + game->posToPlayerId[i] = game->posToPlayerId[i - 1] + 1; + if (game->posToPlayerId[i] > game->numPlayers - 1) + game->posToPlayerId[i] %= game->numPlayers; } } -static void sub_8024BC8(u8 taskId) +static void Task_StartDodrioGame(u8 taskId) { - u8 r4, r5; + u8 i, numPlayers; - switch (gUnknown_02022C98->unk0C) + switch (sGame->startState) { case 0: SetVBlankCallback(NULL); - sub_802620C(sub_8025910, 4); - gUnknown_02022C98->unk0C++; + CreateTask_(Task_CommunicateMonInfo, 4); + sGame->startState++; break; case 1: - if (!FuncIsActiveTask(sub_8025910)) + if (!FuncIsActiveTask(Task_CommunicateMonInfo)) { - sub_8029274(&gUnknown_02022C98->unk160); - gUnknown_02022C98->unk0C++; + InitGameGfx(&sGame->gfx); + sGame->startState++; } break; case 2: - if (!sub_802A770()) + if (!IsGfxFuncActive()) { Rfu_SetLinkStandbyCallback(); - gUnknown_02022C98->unk0C++; + sGame->startState++; } break; case 3: @@ -569,267 +780,261 @@ static void sub_8024BC8(u8 taskId) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } - gUnknown_02022C98->unk0C++; + sGame->startState++; } break; case 4: - r5 = gUnknown_02022C98->unk24; - sub_80283A8(); - for (r4 = 0; r4 < r5; r4++) - { - sub_8028408(&gUnknown_02022C98->unk318C[gUnknown_02022C98->unk34[r4]], r4, gUnknown_02022C98->unk34[r4], gUnknown_02022C98->unk24); - } - sub_802868C(FALSE, gUnknown_02022C98->unk24); - gUnknown_02022C98->unk0C++; + numPlayers = sGame->numPlayers; + LoadDodrioGfx(); + for (i = 0; i < numPlayers; i++) + CreateDodrioSprite(&sGame->monInfo[sGame->posToPlayerId[i]], i, sGame->posToPlayerId[i], sGame->numPlayers); + + SetAllDodrioInvisibility(FALSE, sGame->numPlayers); + sGame->startState++; break; case 5: - sub_8028A34(); - sub_8028A88(); - sub_8028D44(); - sub_8028734(); - gUnknown_02022C98->unk0C++; + LoadBerryGfx(); + CreateBerrySprites(); + CreateCloudSprites(); + CreateStatusBarSprites(); + sGame->startState++; break; case 6: - BlendPalettes(0xFFFFFFFF, 0x10, 0x00); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - SetVBlankCallback(sub_80261E4); - gUnknown_02022C98->unk0C++; + BlendPalettes(PALETTES_ALL, 0x10, 0x00); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0); + SetVBlankCallback(VBlankCB_DodrioGame); + sGame->startState++; break; case 7: UpdatePaletteFade(); if (!gPaletteFade.active) - { - gUnknown_02022C98->unk0C++; - } + sGame->startState++; break; default: DestroyTask(taskId); - sub_802621C(sub_802589C); + CreateDodrioGameTask(Task_NewGameIntro); break; } } -static void sub_8024D4C(u8 taskId) +static void Task_DodrioGame_Leader(u8 taskId) { - sub_8025D04(); - gUnknown_082F7AC4[gUnknown_02022C98->unk18](); - if (!gUnknown_03000DB0) - { - sub_8026AF4(); - } - sub_8025D50(); + RecvLinkData_Leader(); + sLeaderFuncs[sGame->funcId](); + if (!sExitingGame) + UpdateGame_Leader(); + + SendLinkData_Leader(); } -static void sub_8024D84(u8 taskId) +static void Task_DodrioGame_Member(u8 taskId) { - sub_8025E0C(); - gUnknown_082F7AF4[gUnknown_02022C98->unk18](); - if (!gUnknown_03000DB0) - { - sub_8026B28(); - } - sub_8025ED8(); + RecvLinkData_Member(); + sMemberFuncs[sGame->funcId](); + if (!sExitingGame) + UpdateGame_Member(); + + SendLinkData_Member(); } -static void sub_8024DBC(void) +static void DoGameIntro(void) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - sub_8028504(1); - sub_80292E0(1); - gUnknown_02022C98->unk10++; + StartDodrioIntroAnim(1); + SetGfxFuncById(GFXFUNC_SHOW_NAMES); + sGame->state++; break; case 1: - if (!sub_802A770()) - sub_8026240(1); + if (!IsGfxFuncActive()) + SetGameFunc(FUNC_INIT_COUNTDOWN); break; } } -static void sub_8024E00(void) +static void InitCountdown(void) { - if (gUnknown_02022C98->unk10 == 0) + switch (sGame->state) { - sub_80262C0(); - gUnknown_02022C98->unk10++; - } - else - { - gUnknown_02022C98->unk118 = 1; - sub_8026240(2); + case 0: + InitFirstWaveOfBerries(); + sGame->state++; + break; + default: + sGame->startCountdown = TRUE; + SetGameFunc(FUNC_COUNTDOWN); + break; } } -static void sub_8024E38(void) +static void DoCountdown(void) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - StartMinigameCountdown(7, 8, 120, 80, 0); - gUnknown_02022C98->unk10++; + StartMinigameCountdown(GFXTAG_COUNTDOWN, PALTAG_COUNTDOWN, 120, 80, 0); + sGame->state++; break; case 1: Rfu_SetLinkStandbyCallback(); - gUnknown_02022C98->unk10++; + sGame->state++; break; case 2: if (IsLinkTaskFinished()) { - gUnknown_02022C98->unk10++; - gUnknown_02022C98->unk30 = 0; + sGame->state++; + sGame->countdownEndDelay = 0; } break; case 3: if (!IsMinigameCountdownRunning()) - { - gUnknown_02022C98->unk10++; - } + sGame->state++; break; case 4: - if (++gUnknown_02022C98->unk30 > 5) + if (++sGame->countdownEndDelay > 5) { Rfu_SetLinkStandbyCallback(); - gUnknown_02022C98->unk10++; + sGame->state++; } break; case 5: if (IsLinkTaskFinished()) - { - sub_8026240(3); - } + SetGameFunc(FUNC_WAIT_START); break; } } -static void sub_8024F10(void) +static void WaitGameStart(void) { - if (gUnknown_02022C98->unk10 == 0) + switch (sGame->state) { - if (gUnknown_02022C98->unk11C != 0) - { - sub_8026240(4); - } + case 0: + if (sGame->startGame) + SetGameFunc(FUNC_PLAY_GAME); + break; } } -static void sub_8024F38(void) +static void PlayGame_Leader(void) { - if (gUnknown_02022C98->unk10 == 0) + switch (sGame->state) { - if (gUnknown_02022C98->unk40 < 10) + case 0: + if (sGame->numGraySquares < NUM_STATUS_SQUARES) { - if (gUnknown_02022C98->unkA8[0] == 0) + if (sGame->inputState[0] == INPUTSTATE_NONE) { if (JOY_NEW(DPAD_UP)) { - if (gUnknown_02022C98->unk31A0[0].unk2C.unk0 == 0) + if (sGame->players[0].comm.pickState == PICK_NONE) { - gUnknown_02022C98->unk31A0[0].unk2C.unk4 = 0; - gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(2); + sGame->players[0].comm.ateBerry = FALSE; + sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_MIDDLE); } } else if (JOY_NEW(DPAD_RIGHT)) { - if (gUnknown_02022C98->unk31A0[0].unk2C.unk0 == 0) + if (sGame->players[0].comm.pickState == PICK_NONE) { - gUnknown_02022C98->unk31A0[0].unk2C.unk4 = 0; - gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(1); + sGame->players[0].comm.ateBerry = FALSE; + sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_RIGHT); } } else if (JOY_NEW(DPAD_LEFT)) { - if (gUnknown_02022C98->unk31A0[0].unk2C.unk0 == 0) + if (sGame->players[0].comm.pickState == PICK_NONE) { - gUnknown_02022C98->unk31A0[0].unk2C.unk4 = 0; - gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(3); + sGame->players[0].comm.ateBerry = FALSE; + sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_LEFT); } } else { - gUnknown_02022C98->unk31A0[0].unk2C.unk0 = sub_8027518(0); + sGame->players[0].comm.pickState = UpdatePickStateQueue(PICK_NONE); } } } else { - sub_8026240(11); + SetGameFunc(FUNC_WAIT_END_GAME); } - sub_802671C(); - sub_8025F48(); + UpdateFallingBerries(); + HandleSound_Leader(); + break; } } -static void sub_8024FFC(void) +static void PlayGame_Member(void) { - if (gUnknown_02022C98->unk40 < 10) + if (sGame->numGraySquares < NUM_STATUS_SQUARES) { if (JOY_NEW(DPAD_UP)) { - if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0) + if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { - gUnknown_02022C98->unk32CC.unk2C.unk0 = 2; + sGame->player.comm.pickState = PICK_MIDDLE; } } else if (JOY_NEW(DPAD_RIGHT)) { - if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0) + if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { - gUnknown_02022C98->unk32CC.unk2C.unk0 = 1; + sGame->player.comm.pickState = PICK_RIGHT; } } else if (JOY_NEW(DPAD_LEFT)) { - if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0) + if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { - gUnknown_02022C98->unk32CC.unk2C.unk0 = 3; + sGame->player.comm.pickState = PICK_LEFT; } } else { - gUnknown_02022C98->unk32CC.unk2C.unk0 = 0; + sGame->player.comm.pickState = PICK_NONE; } } else { - sub_8026240(11); + SetGameFunc(FUNC_WAIT_END_GAME); } - sub_8026044(); + HandleSound_Member(); } -static void sub_80250D4(void) +static void WaitEndGame_Leader(void) { u8 i; - sub_802671C(); - sub_8025F48(); - if (sub_8026C50() == 1) + UpdateFallingBerries(); + HandleSound_Leader(); + if (ReadyToEndGame_Leader() == TRUE) { - sub_80272A4(); - sub_8026240(5); + SetMaxBerriesPickedInRow(); + SetGameFunc(FUNC_INIT_RESULTS); } else { - gUnknown_02022C98->unk12C = 1; - for (i = 1; i < gUnknown_02022C98->unk24; i++) + sGame->allReadyToEnd = TRUE; + for (i = 1; i < sGame->numPlayers; i++) { - if (gUnknown_02022C98->unk130[i] != 1) + if (sGame->readyToEnd[i] != TRUE) { - gUnknown_02022C98->unk12C = 0; + sGame->allReadyToEnd = FALSE; break; } } } } -static void sub_8025158(void) +static void WaitEndGame_Member(void) { - sub_8026044(); - if (sub_8026C90() == 1) - sub_8026240(5); + HandleSound_Member(); + if (ReadyToEndGame_Member() == TRUE) + SetGameFunc(FUNC_INIT_RESULTS); } -static bool32 sub_8025170(void) +static bool32 AllLinkBlocksReceived(void) { u8 recvStatus = GetBlockReceivedStatus(); u8 playerFlags = GetLinkPlayerCountAsBitFlags(); @@ -844,317 +1049,306 @@ static bool32 sub_8025170(void) } } -static void sub_8025198(void) +static void InitResults_Leader(void) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - if (SendBlock(0, gUnknown_02022C98->unk4A, sizeof(gUnknown_02022C98->unk4A))) + if (SendBlock(0, sGame->berryResults, sizeof(sGame->berryResults))) { - gUnknown_02022C98->unk08 = 0; - gUnknown_02022C98->unk10++; + sGame->playersReceived = 0; + sGame->state++; } break; case 1: if (IsLinkTaskFinished()) { - gUnknown_02022C98->unk10++; + sGame->state++; } break; case 2: - if (sub_8025170()) + if (AllLinkBlocksReceived()) { - gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24; + sGame->playersReceived = sGame->numPlayers; } - if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) + if (sGame->playersReceived >= sGame->numPlayers) { - gUnknown_02022C98->unk14++; - gUnknown_02022C98->unk10++; + sGame->timer++; + sGame->state++; } break; default: if (WaitFanfare(TRUE)) { - sub_8026240(6); + SetGameFunc(FUNC_RESULTS); FadeOutAndPlayNewMapMusic(MUS_RG_VICTORY_WILD, 4); } break; } } -static void sub_8025230(void) +static void InitResults_Member(void) { u8 i; - switch (gUnknown_02022C98->unk10) { + switch (sGame->state) { case 0: - if (SendBlock(0, gUnknown_02022C98->unk4A[gUnknown_02022C98->unk14], - sizeof(gUnknown_02022C98->unk4A))) { - gUnknown_02022C98->unk08 = 0; - gUnknown_02022C98->unk10++; + if (SendBlock(0, sGame->berryResults[sGame->timer], sizeof(sGame->berryResults))) { + sGame->playersReceived = 0; + sGame->state++; } break; case 1: if (IsLinkTaskFinished()) { - gUnknown_02022C98->unk10++; + sGame->state++; } break; case 2: - if (sub_8025170()) { - for (i = 0; i < gUnknown_02022C98->unk24; i++) { - memcpy(gUnknown_02022C98->unk4A, gBlockRecvBuffer, sizeof(gUnknown_02022C98->unk4A)); - gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24; + if (AllLinkBlocksReceived()) { + for (i = 0; i < sGame->numPlayers; i++) { + memcpy(sGame->berryResults, gBlockRecvBuffer, sizeof(sGame->berryResults)); + sGame->playersReceived = sGame->numPlayers; } } - if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) { - gUnknown_02022C98->unk14++; - gUnknown_02022C98->unk10++; + if (sGame->playersReceived >= sGame->numPlayers) { + sGame->timer++; + sGame->state++; } break; default: if (WaitFanfare(TRUE)) { - gUnknown_02022C98->unk114 = gUnknown_02022C98->unk4A[gUnknown_02022C98->multiplayerId][5]; - sub_8026240(6); + sGame->maxBerriesPickedInRow = sGame->berryResults[sGame->multiplayerId][BERRY_IN_ROW]; + SetGameFunc(FUNC_RESULTS); FadeOutAndPlayNewMapMusic(MUS_RG_VICTORY_WILD, 4); } break; } } -static void sub_8025324(void) +static void DoResults(void) { - u8 sp00 = 1; + u8 playAgainState = PLAY_AGAIN_YES; u8 i; - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - sub_802749C(); - sub_80289E8(TRUE); - sub_8028DFC(); - sub_8028EC8(TRUE); - sub_80292E0(2); - gUnknown_02022C98->unk10++; + TryUpdateRecords(); + SetStatusBarInvisibility(TRUE); + ResetCloudPos(); + SetCloudInvisibility(TRUE); + SetGfxFuncById(GFXFUNC_SHOW_RESULTS); + sGame->state++; break; case 1: - if (!sub_802A770()) + if (!IsGfxFuncActive()) { - sub_80292E0(5); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_MSG_COMM_STANDBY); + sGame->state++; } break; case 2: - sp00 = sub_802A794(); - if (SendBlock(0, &sp00, sizeof(sp00))) - { - gUnknown_02022C98->unk10++; - } + playAgainState = GetPlayAgainState(); + if (SendBlock(0, &playAgainState, sizeof(playAgainState))) + sGame->state++; break; case 3: if (IsLinkTaskFinished()) { - gUnknown_02022C98->unk10++; - gUnknown_02022C98->unk08 = 0; + sGame->state++; + sGame->playersReceived = 0; } break; case 4: - if (sub_8025170()) + if (AllLinkBlocksReceived()) { - for (i = 0; i < gUnknown_02022C98->unk24; i++) + for (i = 0; i < sGame->numPlayers; i++) { - *(gUnknown_02022C98->unk10C + i) = *(u8 *)gBlockRecvBuffer[i]; - gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24; + *(&sGame->playAgainStates[i]) = *(u8 *)gBlockRecvBuffer[i]; + sGame->playersReceived = sGame->numPlayers; } } - if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) { - if (++gUnknown_02022C98->unk14 >= 120) + if (sGame->playersReceived >= sGame->numPlayers) + { + if (++sGame->timer >= 120) { - sub_80292E0(6); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_ERASE_MSG); + sGame->state++; } } break; default: - if (!sub_802A770()) - { - sub_8026240(7); - } + if (!IsGfxFuncActive()) + SetGameFunc(FUNC_ASK_PLAY_AGAIN); break; } } -static void sub_8025470(void) +static void AskPlayAgain(void) { - u8 sp0; + u8 playAgainState; u8 i; - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - if (sub_8027748() >= 3000) + if (GetHighestScore() >= PRIZE_SCORE) { - sub_80292E0(4); + SetGfxFuncById(GFXFUNC_MSG_SAVING); } - gUnknown_02022C98->unk10++; + sGame->state++; break; case 1: - if (!sub_802A770()) + if (!IsGfxFuncActive()) { - sub_80292E0(3); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_MSG_PLAY_AGAIN); + sGame->state++; } break; case 2: - sub_8028FCC(); - sub_80272E8(); - gUnknown_02022C98->unk10++; + ResetBerryAndStatusBarSprites(); + ResetForPlayAgainPrompt(); + sGame->state++; break; case 3: - if ((sp0 = sub_802A794()) != 0) + if ((playAgainState = GetPlayAgainState()) != PLAY_AGAIN_NONE) { - gUnknown_02022C98->unk10++; + sGame->state++; } break; case 4: - if (!sub_802A770()) + if (!IsGfxFuncActive()) { - sub_80292E0(5); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_MSG_COMM_STANDBY); + sGame->state++; } break; case 5: - sp0 = sub_802A794(); - if (SendBlock(0, &sp0, sizeof(sp0))) + playAgainState = GetPlayAgainState(); + if (SendBlock(0, &playAgainState, sizeof(playAgainState))) { - gUnknown_02022C98->unk08 = 0; - gUnknown_02022C98->unk10++; + sGame->playersReceived = 0; + sGame->state++; } break; case 6: if (IsLinkTaskFinished()) - { - gUnknown_02022C98->unk10++; - } + sGame->state++; break; case 7: - if (sub_8025170()) + if (AllLinkBlocksReceived()) { - for (i = 0; i < gUnknown_02022C98->unk24; i++) + for (i = 0; i < sGame->numPlayers; i++) { - *(gUnknown_02022C98->unk10C + i) = *(u8 *)gBlockRecvBuffer[i]; - gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24; + *(&sGame->playAgainStates[i]) = *(u8 *)gBlockRecvBuffer[i]; + sGame->playersReceived = sGame->numPlayers; } } - if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) { - if (++gUnknown_02022C98->unk14 >= 120) + if (sGame->playersReceived >= sGame->numPlayers) + { + if (++sGame->timer >= 120) { - sub_8027608(); - sub_80292E0(6); - gUnknown_02022C98->unk10++; + ResetPickState(); + SetGfxFuncById(GFXFUNC_ERASE_MSG); + sGame->state++; } } else { - sub_8027554(); + HandleWaitPlayAgainInput(); } break; default: - if (!sub_802A770()) + if (!IsGfxFuncActive()) { - for (i = 0; i < gUnknown_02022C98->unk24; i++) + for (i = 0; i < sGame->numPlayers; i++) { - if (gUnknown_02022C98->unk10C[i] == 2) + if (sGame->playAgainStates[i] == PLAY_AGAIN_NO) { - sub_8026240(8); + SetGameFunc(FUNC_END_LINK); return; } } - sub_8026240(10); + SetGameFunc(FUNC_RESET_GAME); } break; } } -static void sub_8025644(void) +static void EndLink(void) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: SetCloseLinkCallback(); - sub_80292E0(7); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_MSG_PLAYER_DROPPED); + sGame->state++; break; case 1: - if (!sub_802A770()) - { - gUnknown_02022C98->unk10++; - } + if (!IsGfxFuncActive()) + sGame->state++; break; case 2: - if (sub_802A794() == 5) - { - gUnknown_02022C98->unk10++; - } + if (GetPlayAgainState() == PLAY_AGAIN_DROPPED) + sGame->state++; break; default: if (gReceivedRemoteLinkPlayers == 0) { - sub_8026240(9); + SetGameFunc(FUNC_EXIT); } break; } } -static void sub_80256AC(void) +static void ExitGame(void) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gUnknown_02022C98->unk10++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); + sGame->state++; break; case 1: UpdatePaletteFade(); if (!gPaletteFade.active) - { - gUnknown_02022C98->unk10++; - } + sGame->state++; break; case 2: - sub_8028B80(); - sub_80287E4(); - sub_8028614(gUnknown_02022C98->unk24); - sub_8028E84(); - gUnknown_03000DB0 = TRUE; - sub_80292E0(8); - gUnknown_02022C98->unk10++; + FreeBerrySprites(); + FreeStatusBar(); + FreeDodrioSprites(sGame->numPlayers); + FreeCloudSprites(); + sExitingGame = TRUE; + SetGfxFuncById(GFXFUNC_STOP); + sGame->state++; break; default: - if (!sub_802A770()) + if (!IsGfxFuncActive()) { - SetMainCallback2(gUnknown_02022C98->savedCallback); - DestroyTask(gUnknown_02022C98->unk04); - Free(gUnknown_02022C98); + SetMainCallback2(sGame->exitCallback); + DestroyTask(sGame->taskId); + Free(sGame); FreeAllWindowBuffers(); } break; } } -static void sub_8025758(void) +static void ResetGame(void) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - sub_80292E0(9); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_IDLE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); + sGame->state++; break; case 1: UpdatePaletteFade(); if (!gPaletteFade.active) { - gUnknown_02022C98->unk10++; + sGame->state++; } break; case 2: @@ -1166,383 +1360,427 @@ static void sub_8025758(void) ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); - gUnknown_02022C98->unk10++; + sGame->state++; break; case 3: StopMapMusic(); - gUnknown_02022C98->unk10++; + sGame->state++; break; case 4: PlayNewMapMusic(MUS_RG_BERRY_PICK); - sub_8028E4C(); - gUnknown_02022C98->unk10++; + StartCloudMovement(); + sGame->state++; break; case 5: - BlendPalettes(0xFFFFFFFF, 16, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - gUnknown_02022C98->unk10++; + BlendPalettes(PALETTES_ALL, 16, 0); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0); + sGame->state++; break; case 6: UpdatePaletteFade(); if (!gPaletteFade.active) - { - gUnknown_02022C98->unk10++; - } + sGame->state++; break; default: - DestroyTask(gUnknown_02022C98->unk04); - sub_802621C(sub_802589C); - sub_802903C(); - sub_8024A30(gUnknown_02022C98); + DestroyTask(sGame->taskId); + CreateDodrioGameTask(Task_NewGameIntro); + ResetGfxState(); + InitDodrioGame(sGame); if (gReceivedRemoteLinkPlayers == 0) - { - gUnknown_02022C98->unk24 = 1; - } - sub_80273F0(); - sub_8028EC8(FALSE); + sGame->numPlayers = 1; + + SetRandomPrize(); + SetCloudInvisibility(FALSE); break; } } -static void sub_802589C(u8 taskId) +static void Task_NewGameIntro(u8 taskId) { - switch (gUnknown_02022C98->unk10) + switch (sGame->state) { case 0: - if (sub_8026264() == 1) - { - gUnknown_02022C98->unk10++; - } + if (SlideTreeBordersOut() == TRUE) + sGame->state++; break; case 1: - sub_80286E4(); - gUnknown_02022C98->unk10++; + InitStatusBarPos(); + sGame->state++; break; case 2: - if (sub_8028828() == TRUE) - { - gUnknown_02022C98->unk10++; - } + if (DoStatusBarIntro() == TRUE) + sGame->state++; break; default: - if (gUnknown_02022C98->unk20 != 0) - { - sub_802621C(sub_8024D4C); - } + if (sGame->isLeader) + CreateDodrioGameTask(Task_DodrioGame_Leader); else - { - sub_802621C(sub_8024D84); - } + CreateDodrioGameTask(Task_DodrioGame_Member); + DestroyTask(taskId); break; } } -static void sub_8025910(u8 taskId) +#define tState data[0] + +static void Task_CommunicateMonInfo(u8 taskId) { s16 * data = gTasks[taskId].data; u8 i; - switch (data[0]) + switch (tState) { case 0: - if (SendBlock(0, &gUnknown_02022C98->unk318C[gUnknown_02022C98->multiplayerId].isShiny, sizeof(gUnknown_02022C98->unk318C[gUnknown_02022C98->multiplayerId].isShiny))) + if (SendBlock(0, &sGame->monInfo[sGame->multiplayerId].isShiny, sizeof(sGame->monInfo[sGame->multiplayerId].isShiny))) { - gUnknown_02022C98->unk08 = 0; - data[0]++; + sGame->playersReceived = 0; + tState++; } break; case 1: if (IsLinkTaskFinished()) - { - data[0]++; - } + tState++; break; case 2: - if (sub_8025170()) + if (AllLinkBlocksReceived()) { - for (i = 0; i < gUnknown_02022C98->unk24; i++) + for (i = 0; i < sGame->numPlayers; i++) { - *(u8 *)&gUnknown_02022C98->unk318C[i] = *(u8 *)gBlockRecvBuffer[i]; - gUnknown_02022C98->unk08 = gUnknown_02022C98->unk24; + *(u8 *)&sGame->monInfo[i] = *(u8 *)gBlockRecvBuffer[i]; + sGame->playersReceived = sGame->numPlayers; } } - if (gUnknown_02022C98->unk08 >= gUnknown_02022C98->unk24) + if (sGame->playersReceived >= sGame->numPlayers) { DestroyTask(taskId); - sub_80292E0(6); - gUnknown_02022C98->unk10++; + SetGfxFuncById(GFXFUNC_ERASE_MSG); + sGame->state++; } break; } } -static void sub_80259FC(void) +#undef tState + +static void RecvLinkData_Gameplay(void) { u8 i; - u8 r7 = gUnknown_02022C98->unk24; - - gUnknown_02022C98->unk31A0[0].unk10 = sub_8028164(0, &gUnknown_02022C98->unk31A0[0], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C); - gUnknown_02022C98->unk128 = 1; - - for (i = 1; i < r7; i++) - { - if ( gUnknown_02022C98->unkA8[i] == 0 - && sub_8028318(i, &gUnknown_02022C98->unk31A0[i].unk2C.unk0) == 0) + u8 numPlayers = sGame->numPlayers; + + sGame->players[0].receivedGameStatePacket = RecvPacket_GameState(0, + &sGame->players[0], + &sGame->players[0].comm, + &sGame->players[1].comm, + &sGame->players[2].comm, + &sGame->players[3].comm, + &sGame->players[4].comm, + &sGame->numGraySquares, + &sGame->berriesFalling, + &sGame->allReadyToEnd); + sGame->clearRecvCmds = TRUE; + + for (i = 1; i < numPlayers; i++) + { + if (sGame->inputState[i] == INPUTSTATE_NONE && !RecvPacket_PickState(i, &sGame->players[i].comm.pickState)) { - gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0; - gUnknown_02022C98->unk128 = 0; + sGame->players[i].comm.pickState = PICK_NONE; + sGame->clearRecvCmds = FALSE; } } - if (++gUnknown_02022C98->unk124 >= 60) + if (++sGame->clearRecvCmdTimer >= 60) { - if (gUnknown_02022C98->unk128 != 0) + if (sGame->clearRecvCmds) { - sub_8011AC8(); - gUnknown_02022C98->unk124 = 0; + ClearRecvCommands(); + sGame->clearRecvCmdTimer = 0; } - else if (gUnknown_02022C98->unk124 > 70) + else if (sGame->clearRecvCmdTimer > 70) { - sub_8011AC8(); - gUnknown_02022C98->unk124 = 0; + ClearRecvCommands(); + sGame->clearRecvCmdTimer = 0; } } - for (i = 0; i < r7; i++) + for (i = 0; i < numPlayers; i++) { - if ( gUnknown_02022C98->unk31A0[i].unk2C.unk0 != 0 - && gUnknown_02022C98->unkA8[i] == 0) + if (sGame->players[i].comm.pickState != PICK_NONE && sGame->inputState[i] == INPUTSTATE_NONE) { - gUnknown_02022C98->unkA8[i] = 1; + sGame->inputState[i] = INPUTSTATE_TRY_PICK; } - switch (gUnknown_02022C98->unkA8[i]) + switch (sGame->inputState[i]) { - case 0: + case INPUTSTATE_NONE: default: break; - case 1 ... 3: - if (++gUnknown_02022C98->unkB0[i] >= 6) + case INPUTSTATE_TRY_PICK: + case INPUTSTATE_PICKED: + case INPUTSTATE_ATE_BERRY: + if (++sGame->inputDelay[i] >= 6) { - gUnknown_02022C98->unkB0[i] = 0; - gUnknown_02022C98->unkA8[i] = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk4 = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk8 = 0; + sGame->inputDelay[i] = 0; + sGame->inputState[i] = INPUTSTATE_NONE; + sGame->players[i].comm.pickState = PICK_NONE; + sGame->players[i].comm.ateBerry = FALSE; + sGame->players[i].comm.missedBerry = FALSE; } break; - case 4: - if (++gUnknown_02022C98->unkB0[i] >= 40) + case INPUTSTATE_BAD_MISS: + // Tried to pick with no berry in range, long delay until next input + if (++sGame->inputDelay[i] >= 40) { - gUnknown_02022C98->unkB0[i] = 0; - gUnknown_02022C98->unkA8[i] = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk4 = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk8 = 0; + sGame->inputDelay[i] = 0; + sGame->inputState[i] = INPUTSTATE_NONE; + sGame->players[i].comm.pickState = PICK_NONE; + sGame->players[i].comm.ateBerry = FALSE; + sGame->players[i].comm.missedBerry = FALSE; } break; } } } -static void sub_8025C0C(void) +static void RecvLinkData_ReadyToEnd(void) { u8 i; - u8 r6 = gUnknown_02022C98->unk24; - - gUnknown_02022C98->unk31A0[0].unk10 = sub_8028164(0, &gUnknown_02022C98->unk31A0[0], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C); - gUnknown_02022C98->unk128 = 1; - - for (i = 1; i < r6; i++) - { - if (sub_8028374(i) != 0) + u8 numPlayers = sGame->numPlayers; + + sGame->players[0].receivedGameStatePacket = RecvPacket_GameState(0, + &sGame->players[0], + &sGame->players[0].comm, + &sGame->players[1].comm, + &sGame->players[2].comm, + &sGame->players[3].comm, + &sGame->players[4].comm, + &sGame->numGraySquares, + &sGame->berriesFalling, + &sGame->allReadyToEnd); + sGame->clearRecvCmds = TRUE; + + for (i = 1; i < numPlayers; i++) + { + if (RecvPacket_ReadyToEnd(i)) { - gUnknown_02022C98->unk130[i] = 1; - gUnknown_02022C98->unk128 = 0; + sGame->readyToEnd[i] = TRUE; + sGame->clearRecvCmds = FALSE; } } - if (++gUnknown_02022C98->unk124 >= 60) + if (++sGame->clearRecvCmdTimer >= 60) { - if (gUnknown_02022C98->unk128 != 0) + if (sGame->clearRecvCmds) { - sub_8011AC8(); - gUnknown_02022C98->unk124 = 0; + ClearRecvCommands(); + sGame->clearRecvCmdTimer = 0; } - else if (gUnknown_02022C98->unk124 > 70) + else if (sGame->clearRecvCmdTimer > 70) { - sub_8011AC8(); - gUnknown_02022C98->unk124 = 0; + ClearRecvCommands(); + sGame->clearRecvCmdTimer = 0; } } } -static void sub_8025D04(void) +static void RecvLinkData_Leader(void) { - switch (gUnknown_02022C98->unk18) + switch (sGame->funcId) { - case 3: - if (sub_8026BB8() == TRUE) + case FUNC_WAIT_START: + if (AllPlayersReadyToStart() == TRUE) { - sub_8026C28(); - gUnknown_02022C98->unk11C = 1; + ResetReadyToStart(); + sGame->startGame = TRUE; } break; - case 4: - sub_80259FC(); + case FUNC_PLAY_GAME: + RecvLinkData_Gameplay(); break; - case 11: - sub_8025C0C(); + case FUNC_WAIT_END_GAME: + RecvLinkData_ReadyToEnd(); break; } } -static void sub_8025D50(void) -{ - switch (gUnknown_02022C98->unk18) - { - case 4: - sub_8027E30(&gUnknown_02022C98->unk32CC, &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, gUnknown_02022C98->unk40, gUnknown_02022C98->unk120, gUnknown_02022C98->unk12C); - break; - case 11: - sub_8027E30(&gUnknown_02022C98->unk32CC, &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, gUnknown_02022C98->unk40, gUnknown_02022C98->unk120, gUnknown_02022C98->unk12C); +static void SendLinkData_Leader(void) +{ + switch (sGame->funcId) + { + case FUNC_PLAY_GAME: + SendPacket_GameState(&sGame->player, + &sGame->players[0].comm, + &sGame->players[1].comm, + &sGame->players[2].comm, + &sGame->players[3].comm, + &sGame->players[4].comm, + sGame->numGraySquares, + sGame->berriesFalling, + sGame->allReadyToEnd); + break; + case FUNC_WAIT_END_GAME: + SendPacket_GameState(&sGame->player, + &sGame->players[0].comm, + &sGame->players[1].comm, + &sGame->players[2].comm, + &sGame->players[3].comm, + &sGame->players[4].comm, + sGame->numGraySquares, + sGame->berriesFalling, + sGame->allReadyToEnd); break; } } -static void sub_8025E0C(void) -{ - switch (gUnknown_02022C98->unk18) - { - case 4: - sub_8028164(gUnknown_02022C98->multiplayerId, &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C); - break; - case 11: - sub_8028164(gUnknown_02022C98->multiplayerId, &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId], &gUnknown_02022C98->unk31A0[0].unk2C, &gUnknown_02022C98->unk31A0[1].unk2C, &gUnknown_02022C98->unk31A0[2].unk2C, &gUnknown_02022C98->unk31A0[3].unk2C, &gUnknown_02022C98->unk31A0[4].unk2C, &gUnknown_02022C98->unk40, &gUnknown_02022C98->unk120, &gUnknown_02022C98->unk12C); +static void RecvLinkData_Member(void) +{ + switch (sGame->funcId) + { + case FUNC_PLAY_GAME: + RecvPacket_GameState(sGame->multiplayerId, + &sGame->players[sGame->multiplayerId], + &sGame->players[0].comm, + &sGame->players[1].comm, + &sGame->players[2].comm, + &sGame->players[3].comm, + &sGame->players[4].comm, + &sGame->numGraySquares, + &sGame->berriesFalling, + &sGame->allReadyToEnd); + break; + case FUNC_WAIT_END_GAME: + RecvPacket_GameState(sGame->multiplayerId, + &sGame->players[sGame->multiplayerId], + &sGame->players[0].comm, + &sGame->players[1].comm, + &sGame->players[2].comm, + &sGame->players[3].comm, + &sGame->players[4].comm, + &sGame->numGraySquares, + &sGame->berriesFalling, + &sGame->allReadyToEnd); break; } } -static void sub_8025ED8(void) +static void SendLinkData_Member(void) { - switch (gUnknown_02022C98->unk18) + switch (sGame->funcId) { - case 3: - sub_8027DD0(1); - gUnknown_02022C98->unk11C = 1; + case FUNC_WAIT_START: + SendPacket_ReadyToStart(TRUE); + sGame->startGame = TRUE; break; - case 4: - if (gUnknown_02022C98->unk32CC.unk2C.unk0 != 0) + case FUNC_PLAY_GAME: + if (sGame->player.comm.pickState != PICK_NONE) { - sub_80282EC(gUnknown_02022C98->unk32CC.unk2C.unk0); + SendPacket_PickState(sGame->player.comm.pickState); } break; - case 11: - if (gUnknown_02022C98->unk120 == 0 && gUnknown_02022C98->unk12C == 0) - { - sub_8028350(1); - } + case FUNC_WAIT_END_GAME: + if (!sGame->berriesFalling && !sGame->allReadyToEnd) + SendPacket_ReadyToEnd(TRUE); break; } } -static void sub_8025F48(void) +static void HandleSound_Leader(void) { - if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0) + if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { if (!IsSEPlaying()) - { - gUnknown_02022C98->unk144 = 0; - } + sGame->playingPickSound = FALSE; } - else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk4 == 1) + else if (sGame->players[sGame->multiplayerId].comm.ateBerry == TRUE) { - if (gUnknown_02022C98->unk144 == 0) + if (!sGame->playingPickSound) { m4aSongNumStop(SE_SUCCESS); PlaySE(SE_SUCCESS); - gUnknown_02022C98->unk144 = 1; + sGame->playingPickSound = TRUE; } } - else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk8 == 1) + else if (sGame->players[sGame->multiplayerId].comm.missedBerry == TRUE) { - if (gUnknown_02022C98->unk144 == 0 && !IsSEPlaying()) + if (!sGame->playingPickSound && !IsSEPlaying()) { PlaySE(SE_BOO); - sub_80284CC(1); - gUnknown_02022C98->unk144 = 1; + StartDodrioMissedAnim(1); + sGame->playingPickSound = TRUE; } } - if (gUnknown_02022C98->unk154 == 0 && gUnknown_02022C98->unk40 >= 10) + if (sGame->endSoundState == 0 && sGame->numGraySquares >= NUM_STATUS_SQUARES) { + // Ready to play game over sound StopMapMusic(); - gUnknown_02022C98->unk154 = 1; + sGame->endSoundState = 1; } - else if (gUnknown_02022C98->unk154 == 1) + else if (sGame->endSoundState == 1) { - PlayFanfareByFanfareNum(11); // MUS_TOO_BAD - gUnknown_02022C98->unk154 = 2; + // Play game over sound + PlayFanfareByFanfareNum(FANFARE_TOO_BAD); + sGame->endSoundState = 2; } } -static void sub_8026044(void) +static void HandleSound_Member(void) { - u8 r8 = gUnknown_02022C98->unk44; - u8 r7 = gUnknown_02022C98->unk48; - u8 r4; - if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 == 0) + u8 berryStart = sGame->berryColStart; + u8 berryEnd = sGame->berryColEnd; + u8 i; + if (sGame->players[sGame->multiplayerId].comm.pickState == PICK_NONE) { - if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk4 != 1 && gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk8 != 1) - { - gUnknown_02022C98->unk144 = 0; - } + if (sGame->players[sGame->multiplayerId].comm.ateBerry != TRUE + && sGame->players[sGame->multiplayerId].comm.missedBerry != TRUE) + sGame->playingPickSound = 0; } - else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk4 == 1) + else if (sGame->players[sGame->multiplayerId].comm.ateBerry == TRUE) { - if (gUnknown_02022C98->unk144 == 0) + if (!sGame->playingPickSound) { m4aSongNumStop(SE_SUCCESS); PlaySE(SE_SUCCESS); - gUnknown_02022C98->unk144 = 1; + sGame->playingPickSound = TRUE; } } - else if (gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk8 == 1) + else if (sGame->players[sGame->multiplayerId].comm.missedBerry == TRUE) { - if (gUnknown_02022C98->unk144 == 0 && !IsSEPlaying()) + if (!sGame->playingPickSound && !IsSEPlaying()) { PlaySE(SE_BOO); - sub_80284CC(1); - gUnknown_02022C98->unk144 = 1; + StartDodrioMissedAnim(1); + sGame->playingPickSound = TRUE; } } - for (r4 = r8; r4 < r7; r4++) + for (i = berryStart; i < berryEnd; i++) { - struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk14; - if (ptr->unkB[r4] >= 10) + struct DodrioGame_Berries * berries = &sGame->players[sGame->multiplayerId].berries; + if (berries->fallDist[i] >= MAX_FALL_DIST) { - if (gUnknown_02022C98->unk148[r4] == 0) + if (!sGame->playingSquishSound[i]) { - PlaySE(SE_BALLOON_RED + ptr->unk0[r4]); - gUnknown_02022C98->unk148[r4] = 1; + PlaySE(SE_BALLOON_RED + berries->ids[i]); + sGame->playingSquishSound[i] = TRUE; } } else { - gUnknown_02022C98->unk148[r4] = 0; + sGame->playingSquishSound[i] = FALSE; } } - if (gUnknown_02022C98->unk154 == 0 && gUnknown_02022C98->unk40 >= 10) + if (sGame->endSoundState == 0 && sGame->numGraySquares >= NUM_STATUS_SQUARES) { + // Ready to play game over sound StopMapMusic(); - gUnknown_02022C98->unk154 = 1; + sGame->endSoundState = 1; } - else if (gUnknown_02022C98->unk154 == 1) + else if (sGame->endSoundState == 1) { - PlayFanfareByFanfareNum(11); // MUS_TOO_BAD - gUnknown_02022C98->unk154 = 2; + // Play game over sound + PlayFanfareByFanfareNum(FANFARE_TOO_BAD); + sGame->endSoundState = 2; } } -static void sub_80261CC(void) +static void CB2_DodrioGame(void) { RunTasks(); AnimateSprites(); @@ -1550,53 +1788,55 @@ static void sub_80261CC(void) UpdatePaletteFade(); } -static void sub_80261E4(void) +static void VBlankCB_DodrioGame(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } -static void sub_80261F8(struct DodrioSubstruct_318C * a0, struct Pokemon * a1) +static void InitMonInfo(struct DodrioGame_MonInfo * monInfo, struct Pokemon * mon) { - a0->isShiny = IsMonShiny(a1); + monInfo->isShiny = IsMonShiny(mon); } -static void sub_802620C(TaskFunc func, u8 priority) +static void CreateTask_(TaskFunc func, u8 priority) { CreateTask(func, priority); } -static void sub_802621C(TaskFunc func) +static void CreateDodrioGameTask(TaskFunc func) { - gUnknown_02022C98->unk04 = CreateTask(func, 1); - gUnknown_02022C98->unk10 = 0; - gUnknown_02022C98->unk0C = 0; - gUnknown_02022C98->unk14 = 0; + sGame->taskId = CreateTask(func, 1); + sGame->state = 0; + sGame->startState = 0; + sGame->timer = 0; } -static void sub_8026240(u8 a0) +static void SetGameFunc(u8 funcId) { - gUnknown_02022C98->unk1C = gUnknown_02022C98->unk18; - gUnknown_02022C98->unk18 = a0; - gUnknown_02022C98->unk10 = 0; - gUnknown_02022C98->unk14 = 0; + sGame->prevFuncId = sGame->funcId; + sGame->funcId = funcId; + sGame->state = 0; + sGame->timer = 0; } -static bool32 sub_8026264(void) +static bool32 SlideTreeBordersOut(void) { - u8 r2 = gUnknown_02022C98->unk14 / 4; - gUnknown_02022C98->unk14++; - if (r2 != 0 && gUnknown_02022C98->unk14 % 4 == 0) + u8 x = sGame->timer / 4; + sGame->timer++; + if (x != 0 && sGame->timer % 4 == 0) { - if (r2 < gUnknown_082F7A94[gUnknown_02022C98->unk24 - 1]) + if (x < sTreeBorderXPos[sGame->numPlayers - 1]) { - SetGpuReg(REG_OFFSET_BG1HOFS, (r2 * 8)); - SetGpuReg(REG_OFFSET_BG2HOFS, -(r2 * 8)); + // Update position + SetGpuReg(REG_OFFSET_BG1HOFS, (x * 8)); // BG_TREE_LEFT + SetGpuReg(REG_OFFSET_BG2HOFS, -(x * 8)); // BG_TREE_RIGHT return FALSE; } else { + // Animation finished return TRUE; } } @@ -1606,413 +1846,452 @@ static bool32 sub_8026264(void) } } -static void sub_80262C0(void) +static void InitFirstWaveOfBerries(void) { u8 i; - u8 start = gUnknown_02022C98->unk44; - u8 finish = gUnknown_02022C98->unk48; + u8 berryStart = sGame->berryColStart; + u8 berryEnd = sGame->berryColEnd; - for (i = start; i < finish; i++) + for (i = berryStart; i < berryEnd; i++) { - struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk32CC.unk14; - ptr->unkB[i] = (i % 2 == 0) ? 1 : 0; - ptr->unk0[i] = 0; + struct DodrioGame_Berries * berries = &sGame->player.berries; + berries->fallDist[i] = (i % 2 == 0) ? 1 : 0; + berries->ids[i] = BERRY_BLUE; } } -static void sub_8026324(void) +// This function checks every berry and resolves if it should be eaten or not. +// It's run in a loop that handles moving each individual berry, which means +// that every time any berry moves, every single berry is checked. +static void HandlePickBerries(void) { - u8 sp0 = gUnknown_02022C98->unk44; - u8 sp4 = gUnknown_02022C98->unk48; - u8 sp8 = gUnknown_02022C98->unk24; - u8 i, j, k, r5; + u8 berryStart = sGame->berryColStart; + u8 berryEnd = sGame->berryColEnd; + u8 numPlayers = sGame->numPlayers; + u8 i, j, k, column; - if (gUnknown_02022C98->unk40 >= 10) + // Game is already over + if (sGame->numGraySquares >= NUM_STATUS_SQUARES) return; - for (i = 0; i < sp8; i++) + for (i = 0; i < numPlayers; i++) { - u8 *ptr = &gUnknown_02022C98->unk31A0[i].unk2C.unk0; - if (*ptr != 0 && gUnknown_02022C98->unkA8[i] == 1) + u8 *pickState = &sGame->players[i].comm.pickState; + if (*pickState != PICK_NONE && sGame->inputState[i] == INPUTSTATE_TRY_PICK) { - for (j = sp0; j < sp4; j++) + // Player is attempting to pick a berry + for (j = berryStart; j < berryEnd; j++) { - r5 = gUnknown_082F449C[0][0][j]; - if (gUnknown_02022C98->unkF4[r5][0] == i || gUnknown_02022C98->unkF4[r5][1] == i) + column = sActiveColumnMap[0][0][j]; + + // Attempt has already been checked + if (sGame->playersAttemptingPick[column][0] == i + || sGame->playersAttemptingPick[column][1] == i) break; - if (sub_8026634(i, *ptr, r5) == TRUE) + + // Check berry pick attempt + if (TryPickBerry(i, *pickState, column) == TRUE) { - for (k = 0; k < 2; k++) + // Attempt was successful + for (k = 0; k < ARRAY_COUNT(sGame->playersAttemptingPick[0]); k++) { - if (gUnknown_02022C98->unkF4[r5][k] == 0xFF) + if (sGame->playersAttemptingPick[column][k] == PLAYER_NONE) { - gUnknown_02022C98->unkF4[r5][k] = i; - gUnknown_02022C98->unkA8[i] = 2; - gUnknown_02022C98->unkC4[r5] = 1; + sGame->playersAttemptingPick[column][k] = i; + sGame->inputState[i] = INPUTSTATE_PICKED; + sGame->berryState[column] = BERRYSTATE_PICKED; break; } } break; } - if (gUnknown_02022C98->unk31A0[i].unk2C.unk8 == 1) + if (sGame->players[i].comm.missedBerry == TRUE) break; } } } - for (j = sp0; j < sp4; j++) + for (j = berryStart; j < berryEnd; j++) { - u8 id = 0xFF; - r5 = gUnknown_082F449C[0][0][j]; - if (gUnknown_02022C98->unkC4[r5] == 1) + u8 playerIdMissed = PLAYER_NONE; + column = sActiveColumnMap[0][0][j]; + if (sGame->berryState[column] == BERRYSTATE_PICKED) { - s32 r2; - u8 r4, r3 = gUnknown_02022C98->unk90[sub_8026D8C(r5)] / 7; - if (r3 >= ARRAY_COUNT(gUnknown_082F7A88) - 1) - r3 = ARRAY_COUNT(gUnknown_082F7A88) - 1; + s32 delayRemaining; + u8 playerIdPicked, delayStage = sGame->difficulty[GetPlayerIdAtColumn(column)] / NUM_DIFFICULTIES; + if (delayStage >= ARRAY_COUNT(sBerryFallDelays) - 1) + delayStage = ARRAY_COUNT(sBerryFallDelays) - 1; - r2 = gUnknown_082F7A88[r3][gUnknown_02022C98->unk31A0[0].unk14.unk0[r5]] - gUnknown_02022C98->unkD0[r5]; - if (r2 < 6) - gUnknown_02022C98->unk9C[r5] += r2; + delayRemaining = sBerryFallDelays[delayStage][sGame->players[0].berries.ids[column]] - sGame->fallTimer[column]; + if (delayRemaining < 6) + sGame->eatTimer[column] += delayRemaining; - if (++gUnknown_02022C98->unk9C[r5] >= 6) + if (++sGame->eatTimer[column] >= 6) { - gUnknown_02022C98->unk9C[r5] = 0; - if (gUnknown_02022C98->unkF4[r5][0] == 0xFF && gUnknown_02022C98->unkF4[r5][1] == 0xFF) + sGame->eatTimer[column] = 0; + + if (sGame->playersAttemptingPick[column][0] == PLAYER_NONE + && sGame->playersAttemptingPick[column][1] == PLAYER_NONE) { + // No players attempting to pick this berry continue; } - else if (gUnknown_02022C98->unkF4[r5][0] != 0xFF && gUnknown_02022C98->unkF4[r5][1] == 0xFF) + else if (sGame->playersAttemptingPick[column][0] != PLAYER_NONE + && sGame->playersAttemptingPick[column][1] == PLAYER_NONE) { - r4 = gUnknown_02022C98->unkF4[r5][0]; + // One player attempting to pick this berry + playerIdPicked = sGame->playersAttemptingPick[column][0]; } else { - u8 unk0 = gUnknown_02022C98->unkF4[r5][0]; - i = gUnknown_02022C98->unkF4[r5][1]; // Have to re-use the variable to match. + // Two players attempting to pick this berry + // Randomly give it to one of them + u8 playerId1 = sGame->playersAttemptingPick[column][0]; + i = sGame->playersAttemptingPick[column][1]; // playerId2. Have to re-use the variable to match. if (!(Random() & 1)) { - r4 = unk0; - id = i; + playerIdPicked = playerId1; + playerIdMissed = i; } else { - r4 = i; - id = unk0; + playerIdPicked = i; + playerIdMissed = playerId1; } } - gUnknown_02022C98->unk32CC.unk14.unkB[r5] = 7; - gUnknown_02022C98->unkC4[r5] = 2; - gUnknown_02022C98->unkA8[r4] = 3; - gUnknown_02022C98->unkB8[r5] = r4; - gUnknown_02022C98->unk31A0[r4].unk2C.unk4 = 1; - gUnknown_02022C98->unk31A0[id].unk2C.unk8 = 1; - gUnknown_02022C98->unk86[r4]++; - sub_8026F1C(0, r5, r4); - sub_8027234(TRUE); - sub_8026D1C(r4); - gUnknown_02022C98->unkE8[r5] = gUnknown_02022C98->unk32CC.unk14.unk0[r5]; - gUnknown_02022C98->unk32CC.unk14.unk0[r5] = 3; - gUnknown_02022C98->unkF4[r5][0] = 0xFF; - gUnknown_02022C98->unkF4[r5][1] = 0xFF; + + // Eat berry + sGame->player.berries.fallDist[column] = EAT_FALL_DIST; + sGame->berryState[column] = BERRYSTATE_EATEN; + sGame->inputState[playerIdPicked] = INPUTSTATE_ATE_BERRY; + sGame->berryEatenBy[column] = playerIdPicked; + sGame->players[playerIdPicked].comm.ateBerry = TRUE; +#ifdef UBFIX + if (playerIdMissed != PLAYER_NONE) +#endif + sGame->players[playerIdMissed].comm.missedBerry = TRUE; // UB: playerIdMissed can be PLAYER_NONE here, which is out of bounds + + sGame->berriesEaten[playerIdPicked]++; + IncrementBerryResult(0, column, playerIdPicked); + UpdateBerriesPickedInRow(TRUE); + TryIncrementDifficulty(playerIdPicked); + sGame->prevBerryIds[column] = sGame->player.berries.ids[column]; + sGame->player.berries.ids[column] = BERRY_MISSED; // Just to clear berry id, wasn't actually missed + sGame->playersAttemptingPick[column][0] = PLAYER_NONE; + sGame->playersAttemptingPick[column][1] = PLAYER_NONE; } } } } -static bool32 sub_8026634(u8 a0, u8 a1, u8 a2) +static bool32 TryPickBerry(u8 playerId, u8 pickState, u8 column) { - s32 r7 = 0; - u8 r5 = gUnknown_02022C98->unk24 - 1; - struct DodrioSubstruct_31A0_14 * ptr = &gUnknown_02022C98->unk32CC.unk14; + s32 pick = 0; + u8 numPlayersIdx = sGame->numPlayers - 1; + struct DodrioGame_Berries * berries = &sGame->player.berries; - switch (a1) + switch (pickState) { - case 3: + case PICK_LEFT: default: - r7 = 0; + pick = 0; break; - case 2: - r7 = 1; + case PICK_MIDDLE: + pick = 1; break; - case 1: - r7 = 2; + case PICK_RIGHT: + pick = 2; break; } - if (ptr->unkB[a2] == 6 || ptr->unkB[a2] == 7) + + // Check if berry is within range to be picked + if (berries->fallDist[column] == EAT_FALL_DIST - 1 || berries->fallDist[column] == EAT_FALL_DIST) { - if (a2 == gUknnown_082F45AF[r5][a0][r7]) + // Check if this berry is the one the player is trying to pick + if (column == sDodrioHeadToColumnMap[numPlayersIdx][playerId][pick]) { - if (gUnknown_02022C98->unkC4[a2] == 1 || gUnknown_02022C98->unkC4[a2] == 2) + // Check if berry has been picked/eaten by another player + if (sGame->berryState[column] == BERRYSTATE_PICKED || sGame->berryState[column] == BERRYSTATE_EATEN) { - gUnknown_02022C98->unk31A0[a0].unk2C.unk8 = 1; + // Missed berry, picked by someone else + sGame->players[playerId].comm.missedBerry = TRUE; return FALSE; } else { + // Successfully picked berry return TRUE; } } } else { - if (a2 == gUknnown_082F45AF[r5][a0][r7]) + // Check if this berry is the one the player is trying to pick + if (column == sDodrioHeadToColumnMap[numPlayersIdx][playerId][pick]) { - gUnknown_02022C98->unkA8[a0] = 4; - gUnknown_02022C98->unk31A0[a0].unk2C.unk8 = 1; + // Missed berry, out of range + sGame->inputState[playerId] = INPUTSTATE_BAD_MISS; + sGame->players[playerId].comm.missedBerry = TRUE; } } return FALSE; } -static void sub_802671C(void) +static void UpdateFallingBerries(void) { - u8 r1 = gUnknown_02022C98->unk44; - u8 r9 = gUnknown_02022C98->unk48; - u8 r3 = 0; - u8 r10 = 0; + u8 berryStart = sGame->berryColStart; + u8 berryEnd = sGame->berryColEnd; + u8 delayStage = 0; + u8 otherBerryMissed = 0; u8 i; - u8 r2; - struct DodrioStruct *ptr; - gUnknown_02022C98->unk120 = 0; + sGame->berriesFalling = FALSE; - for (i = r1; i < r9 - 1; i++) + for (i = berryStart; i < berryEnd - 1; i++) { - ptr = gUnknown_02022C98; + struct DodrioGame *game = sGame; - if (gUnknown_02022C98->unkC4[i] == 0 || gUnknown_02022C98->unkC4[i] == 1) + if (sGame->berryState[i] == BERRYSTATE_NONE || sGame->berryState[i] == BERRYSTATE_PICKED) { - gUnknown_02022C98->unk120 = 1; - if (ptr->unk32CC.unk14.unkB[i] >= 10) + sGame->berriesFalling = TRUE; + + if (game->player.berries.fallDist[i] >= MAX_FALL_DIST) { - ptr->unk32CC.unk14.unkB[i] = 10; - gUnknown_02022C98->unkC4[i] = 3; - if (gUnknown_02022C98->unk148[i] == 0) + // Berry hit the ground + game->player.berries.fallDist[i] = MAX_FALL_DIST; + sGame->berryState[i] = BERRYSTATE_SQUISHED; + if (!sGame->playingSquishSound[i]) { - gUnknown_02022C98->unk148[i] = 1; - PlaySE(SE_BALLOON_RED + ptr->unk32CC.unk14.unk0[i]); + sGame->playingSquishSound[i] = TRUE; + PlaySE(SE_BALLOON_RED + game->player.berries.ids[i]); } - if (gUnknown_02022C98->unk40 < 10 || r10 == 1) + if (sGame->numGraySquares < NUM_STATUS_SQUARES || otherBerryMissed == TRUE) { - r10 = 1; - gUnknown_02022C98->unk148[i] = 0; - if (gUnknown_02022C98->unk40 < 10) - { - gUnknown_02022C98->unk40++; - } - sub_8026F1C(3, i, 0); - sub_8027234(FALSE); + otherBerryMissed = TRUE; + sGame->playingSquishSound[i] = FALSE; + if (sGame->numGraySquares < NUM_STATUS_SQUARES) + sGame->numGraySquares++; + + IncrementBerryResult(BERRY_MISSED, i, 0); + UpdateBerriesPickedInRow(FALSE); } } else { - r3 = gUnknown_02022C98->unk90[sub_8026D8C(i)] / 7; - if (r3 >= 2) - { - r3 = 2; - } - r2 = gUnknown_082F7A88[r3][ptr->unk32CC.unk14.unk0[i]]; - if (++gUnknown_02022C98->unkD0[i] >= r2) + // Berry is still falling + u8 delay; + delayStage = sGame->difficulty[GetPlayerIdAtColumn(i)] / NUM_DIFFICULTIES; + if (delayStage >= ARRAY_COUNT(sBerryFallDelays) - 1) + delayStage = ARRAY_COUNT(sBerryFallDelays) - 1; + + delay = sBerryFallDelays[delayStage][game->player.berries.ids[i]]; + if (++sGame->fallTimer[i] >= delay) { - ptr->unk32CC.unk14.unkB[i]++; - gUnknown_02022C98->unkD0[i] = 0; + game->player.berries.fallDist[i]++; + sGame->fallTimer[i] = 0; } - sub_8026324(); + HandlePickBerries(); } } - else if (gUnknown_02022C98->unkC4[i] == 2) + else if (sGame->berryState[i] == BERRYSTATE_EATEN) { - gUnknown_02022C98->unk120 = 1; - if (++gUnknown_02022C98->unkDC[i] >= 20) + // Berry has been eaten, wait and create a new berry + sGame->berriesFalling = TRUE; + if (++sGame->newBerryTimer[i] >= 20) { - gUnknown_02022C98->unk31A0[gUnknown_02022C98->unkB8[i]].unk2C.unk4 = 0; - gUnknown_02022C98->unkDC[i] = 0; - gUnknown_02022C98->unkD0[i] = 0; - gUnknown_02022C98->unkC4[i] = 0; - ptr->unk32CC.unk14.unkB[i] = 1; - ptr->unk32CC.unk14.unk0[i] = sub_8026DB0(sub_8026D8C(i), i); + sGame->players[sGame->berryEatenBy[i]].comm.ateBerry = FALSE; + sGame->newBerryTimer[i] = 0; + sGame->fallTimer[i] = 0; + sGame->berryState[i] = BERRYSTATE_NONE; + game->player.berries.fallDist[i] = 1; + game->player.berries.ids[i] = GetNewBerryId(GetPlayerIdAtColumn(i), i); } } - else if (gUnknown_02022C98->unkC4[i] == 3) + else if (sGame->berryState[i] == BERRYSTATE_SQUISHED) { - if (++gUnknown_02022C98->unkDC[i] >= 20) + // Berry has already hit the ground, wait and create a new berry + if (++sGame->newBerryTimer[i] >= 20) { - if (gUnknown_02022C98->unk40 < 10) + if (sGame->numGraySquares < NUM_STATUS_SQUARES) { - gUnknown_02022C98->unkDC[i] = 0; - gUnknown_02022C98->unkD0[i] = 0; - gUnknown_02022C98->unkC4[i] = 0; - ptr->unk32CC.unk14.unkB[i] = 1; - gUnknown_02022C98->unkE8[i] = ptr->unk32CC.unk14.unk0[i]; - ptr->unk32CC.unk14.unk0[i] = sub_8026DB0(sub_8026D8C(i), i); + sGame->newBerryTimer[i] = 0; + sGame->fallTimer[i] = 0; + sGame->berryState[i] = BERRYSTATE_NONE; + game->player.berries.fallDist[i] = 1; + sGame->prevBerryIds[i] = game->player.berries.ids[i]; + game->player.berries.ids[i] = GetNewBerryId(GetPlayerIdAtColumn(i), i); } } } } } -static void sub_8026988(void) +static void UpdateBerrySprites(void) { - u8 i, first, count; + u8 i; + u8 berryStart = sGame->berryColStart; + u8 berryEnd = sGame->berryColEnd; - first = gUnknown_02022C98->unk44; - count = gUnknown_02022C98->unk48; - for (i = first; i < count; i++) + for (i = berryStart; i < berryEnd; i++) { - struct DodrioSubstruct_31A0 *ptr = &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId]; - u8 var = gUnknown_082F449C[gUnknown_02022C98->unk24 - 1][gUnknown_02022C98->multiplayerId][i]; + struct DodrioGame_Player *player = &sGame->players[sGame->multiplayerId]; + u8 column = sActiveColumnMap[sGame->numPlayers - 1][sGame->multiplayerId][i]; - if (ptr->unk14.unkB[var] != 0) - sub_8028BF8(i, FALSE); + if (player->berries.fallDist[column] != 0) + SetBerryInvisibility(i, FALSE); else - sub_8028BF8(i, TRUE); + SetBerryInvisibility(i, TRUE); - if (ptr->unk14.unkB[var] > 9) + if (player->berries.fallDist[column] >= MAX_FALL_DIST) { - sub_8028CA4(i, ptr->unk14.unk0[var] + 3); - sub_8028C7C(i, ptr->unk14.unkB[var] * 2 - 1); + // Berry was missed, set squished anim + SetBerryAnim(i, player->berries.ids[column] + BERRY_MISSED); + SetBerryYPos(i, player->berries.fallDist[column] * 2 - 1); } - else if (ptr->unk14.unk0[var] == 3) + else if (player->berries.ids[column] == 3) { - ptr->unk14.unkB[var] = 7; - sub_8028CA4(i, 6); - sub_8028C7C(i, ptr->unk14.unkB[var] * 2 - 1); + // Berry was picked, set eaten anim + player->berries.fallDist[column] = EAT_FALL_DIST; + SetBerryAnim(i, ANIM_EATEN); + SetBerryYPos(i, player->berries.fallDist[column] * 2 - 1); } else { - sub_8028CA4(i, ptr->unk14.unk0[var]); - sub_8028C7C(i, ptr->unk14.unkB[var] * 2); + // Berry is still falling + SetBerryAnim(i, player->berries.ids[column]); + SetBerryYPos(i, player->berries.fallDist[column] * 2); } } } -static void sub_8026A88(void) +static void UpdateAllDodrioAnims(void) { - u8 i, count; + u8 i, numPlayers; - count = gUnknown_02022C98->unk24; - for (i = 0; i < count; i++) + numPlayers = sGame->numPlayers; + for (i = 0; i < numPlayers; i++) { - struct DodrioSubstruct_31A0 *ptr = &gUnknown_02022C98->unk31A0[i]; - sub_80286B4(i, ptr->unk2C.unk0); + struct DodrioGame_Player *player = &sGame->players[i]; + SetDodrioAnim(i, player->comm.pickState); } } -static void sub_8026AC8(void) +static void SetAllDodrioDisabled(void) { - u8 i, count; + u8 i, numPlayers; - count = gUnknown_02022C98->unk24; - for (i = 0; i < count; i++) - sub_80286B4(i, 4); + numPlayers = sGame->numPlayers; + for (i = 0; i < numPlayers; i++) + SetDodrioAnim(i, PICK_DISABLED); } -static void sub_8026AF4(void) +static void UpdateGame_Leader(void) { - sub_8026988(); - if (gUnknown_02022C98->unk40 > 9) - sub_8026AC8(); + UpdateBerrySprites(); + if (sGame->numGraySquares >= NUM_STATUS_SQUARES) + SetAllDodrioDisabled(); else - sub_8026A88(); + UpdateAllDodrioAnims(); - sub_80288D4(gUnknown_02022C98->unk40); + UpdateStatusBarAnim(sGame->numGraySquares); } -// This function is literally the same as the one above...Why? -static void sub_8026B28(void) +// Identical to UpdateGame_Leader +static void UpdateGame_Member(void) { - sub_8026988(); - if (gUnknown_02022C98->unk40 > 9) - sub_8026AC8(); + UpdateBerrySprites(); + if (sGame->numGraySquares >= NUM_STATUS_SQUARES) + SetAllDodrioDisabled(); else - sub_8026A88(); + UpdateAllDodrioAnims(); - sub_80288D4(gUnknown_02022C98->unk40); + UpdateStatusBarAnim(sGame->numGraySquares); } -static void sub_8026B5C(u8 arg0, u8 *arg1, u8 *arg2) +static void GetActiveBerryColumns(u8 numPlayers, u8 *start, u8 *end) { - switch (arg0) + switch (numPlayers) { case 1: - *arg1 = 4, *arg2 = 7; + *start = 4, *end = 7; break; case 2: - *arg1 = 3, *arg2 = 8; + *start = 3, *end = 8; break; case 3: - *arg1 = 2, *arg2 = 9; + *start = 2, *end = 9; break; case 4: - *arg1 = 1, *arg2 = 10; + *start = 1, *end = 10; break; case 5: - *arg1 = 0, *arg2 = 11; + *start = 0, *end = 11; break; } } -static bool32 sub_8026BB8(void) +static bool32 AllPlayersReadyToStart(void) { - u8 i, count; + u8 i, numPlayers; - count = gUnknown_02022C98->unk24; - for (i = 1; i < count; i++) + numPlayers = sGame->numPlayers; + for (i = 1; i < numPlayers; i++) { - if (gUnknown_02022C98->unk158[i] == 0) - gUnknown_02022C98->unk158[i] = sub_8027DFC(i); + if (sGame->readyToStart[i] == FALSE) + sGame->readyToStart[i] = RecvPacket_ReadyToStart(i); } - // This loop won't ever run, the seemingly poitnless assingment below is to make the compiler - // generate code for it. - count = count; - for (; i < count; i++) + numPlayers = numPlayers; // Needed to force compiler to keep loop below + +#ifdef BUGFIX + i = 1; // i isn't reset, loop below never runs. As a result, game can begin before all players ready +#endif + for (; i < numPlayers; i++) { - if (gUnknown_02022C98->unk158[i] == 0) + if (sGame->readyToStart[i] == FALSE) return FALSE; } return TRUE; } -static void sub_8026C28(void) +static void ResetReadyToStart(void) { u8 i; - for (i = 0; i < 5; i++) - gUnknown_02022C98->unk158[i] = 0; + for (i = 0; i < MAX_RFU_PLAYERS; i++) + sGame->readyToStart[i] = FALSE; } -static bool32 sub_8026C50(void) +static bool32 ReadyToEndGame_Leader(void) { - if (gUnknown_02022C98->unk40 > 9 && gUnknown_02022C98->unk120 == 0) + if (sGame->numGraySquares >= NUM_STATUS_SQUARES && !sGame->berriesFalling) { - gUnknown_02022C98->unk40 = 10; - if (gUnknown_02022C98->unk12C != 0) + sGame->numGraySquares = NUM_STATUS_SQUARES; + if (sGame->allReadyToEnd) return TRUE; } return FALSE; } -static bool32 sub_8026C90(void) +static bool32 ReadyToEndGame_Member(void) { - u8 i, first, count; + u8 i, berryStart, berryEnd; - if (gUnknown_02022C98->unk40 > 9) + if (sGame->numGraySquares >= NUM_STATUS_SQUARES) { - first = gUnknown_02022C98->unk44; - count = gUnknown_02022C98->unk48; - gUnknown_02022C98->unk40 = 10; - if (gUnknown_02022C98->unk12C != 0) + berryStart = sGame->berryColStart; + berryEnd = sGame->berryColEnd; + sGame->numGraySquares = NUM_STATUS_SQUARES; + if (sGame->allReadyToEnd) { - for (i = first; i < count; i++) + for (i = berryStart; i < berryEnd; i++) { - struct DodrioSubstruct_31A0 *ptr = &gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId]; - u8 var = gUnknown_082F449C[gUnknown_02022C98->unk24 - 1][gUnknown_02022C98->multiplayerId][i]; + struct DodrioGame_Player *player = &sGame->players[sGame->multiplayerId]; + u8 column = sActiveColumnMap[sGame->numPlayers - 1][sGame->multiplayerId][i]; - if (ptr->unk14.unkB[var] != 10) + if (player->berries.fallDist[column] != MAX_FALL_DIST) return FALSE; } return TRUE; @@ -2022,222 +2301,230 @@ static bool32 sub_8026C90(void) return FALSE; } -static void sub_8026D1C(u8 arg0) +static void TryIncrementDifficulty(u8 playerId) { - u8 var = gUnknown_082F7A9C[gUnknown_02022C98->unk90[arg0] % 7] + (gUnknown_02022C98->unk90[arg0] / 7) * 100; - if (gUnknown_02022C98->unk86[arg0] >= var) - gUnknown_02022C98->unk90[arg0]++; + u8 threshold = sDifficultyThresholds[sGame->difficulty[playerId] % NUM_DIFFICULTIES] + (sGame->difficulty[playerId] / NUM_DIFFICULTIES) * 100; + if (sGame->berriesEaten[playerId] >= threshold) + sGame->difficulty[playerId]++; } -static u8 sub_8026D8C(u8 arg0) +static u8 GetPlayerIdAtColumn(u8 column) { - return gUnknown_082F4648[gUnknown_02022C98->unk24 - 1][arg0]; + return sPlayerIdAtColumn[sGame->numPlayers - 1][column]; } -static u8 sub_8026DB0(u8 arg0, u8 arg1) +// Get a berry id for when a new falling berry is created. +// What type of berry it is depends on the current difficulty +// level of players who can pick berries from that column. +static u8 GetNewBerryId(u8 playerId, u8 column) { - u8 i, var3; - u8 count = gUnknown_02022C98->unk24 - 1; - u8 var0 = gUnknown_082F45FA[count][arg0][0]; - u8 var1 = gUnknown_082F45FA[count][arg0][1]; - u8 var2 = gUnknown_082F45FA[count][arg0][2]; + u8 i, highestDifficulty; + u8 numPlayersIdx = sGame->numPlayers - 1; + u8 leftPlayer = sDodrioNeighborMap[numPlayersIdx][playerId][0]; + u8 middlePlayer = sDodrioNeighborMap[numPlayersIdx][playerId][1]; + u8 rightPlayer = sDodrioNeighborMap[numPlayersIdx][playerId][2]; - for (i = 0; gUnknown_082F467F[count][i] != 0; i++) + for (i = 0; sUnsharedColumns[numPlayersIdx][i] != 0; i++) { - if (arg1 == gUnknown_082F467F[count][i]) - return sub_8026E70(gUnknown_02022C98->unk90[var1], arg1); + // If only one player can use this column, just use their difficulty + if (column == sUnsharedColumns[numPlayersIdx][i]) + return GetNewBerryIdByDifficulty(sGame->difficulty[middlePlayer], column); } - // Gets the highest of the three. - if (gUnknown_02022C98->unk90[var0] > gUnknown_02022C98->unk90[var1]) - var3 = gUnknown_02022C98->unk90[var0]; + // This column is shared, get the highest difficulty of adjacent players + if (sGame->difficulty[leftPlayer] > sGame->difficulty[middlePlayer]) + highestDifficulty = sGame->difficulty[leftPlayer]; else - var3 = gUnknown_02022C98->unk90[var1]; + highestDifficulty = sGame->difficulty[middlePlayer]; - if (gUnknown_02022C98->unk90[var2] > var3) - var3 = gUnknown_02022C98->unk90[var2]; + if (sGame->difficulty[rightPlayer] > highestDifficulty) + highestDifficulty = sGame->difficulty[rightPlayer]; - return sub_8026E70(var3, arg1); + return GetNewBerryIdByDifficulty(highestDifficulty, column); } -static u8 sub_8026E70(u8 arg0, u8 arg1) +// The berry types cycle through different distributions depending on the difficulty +static u8 GetNewBerryIdByDifficulty(u8 difficulty, u8 column) { - u8 var = gUnknown_02022C98->unkE8[arg1]; - switch (arg0 % 7) + u8 prevBerryId = sGame->prevBerryIds[column]; + switch (difficulty % NUM_DIFFICULTIES) { - default: return 0; - case 0: return 0; - case 1: return 1; - case 2: return 2; + default: return BERRY_BLUE; + case 0: return BERRY_BLUE; + case 1: return BERRY_GREEN; + case 2: return BERRY_GOLD; case 3: - if (var == 0) - return 1; + if (prevBerryId == BERRY_BLUE) + return BERRY_GREEN; else - return 0; + return BERRY_BLUE; case 4: - if (var == 0) - return 2; + if (prevBerryId == BERRY_BLUE) + return BERRY_GOLD; else - return 0; + return BERRY_BLUE; case 5: - if (var == 2) - return 1; + if (prevBerryId == BERRY_GOLD) + return BERRY_GREEN; else - return 2; + return BERRY_GOLD; case 6: - if (var == 0) - return 1; - else if (var == 1) - return 2; + if (prevBerryId == BERRY_BLUE) + return BERRY_GREEN; + else if (prevBerryId == BERRY_GREEN) + return BERRY_GOLD; else - return 0; + return BERRY_BLUE; } } -static bool32 sub_8026EEC(u16 arg0[5][6]) +static bool32 IsTotalBerriesMissedOver10(u16 berryResults[MAX_RFU_PLAYERS][NUM_BERRY_IDS]) { - int sum, i; - for (sum = 0, i = 0; i < GetLinkPlayerCount(); sum += arg0[i][3], i++) + int missed = 0, i = 0; + for (; i < GetLinkPlayerCount(); missed += berryResults[i][BERRY_MISSED], i++) ; - if (sum >= 11) + if (missed > 10) return TRUE; else return FALSE; } -static void sub_8026F1C(u8 arg0, u8 arg1, u8 arg2) +// Despite being set up to take a berry id as an argument, this +// function is only ever given BERRY_BLUE or BERRY_MISSED. +// It reads the actual berry id (if necessary) from ids +static void IncrementBerryResult(u8 berryIdArg, u8 column, u8 playerId) { - u8 var; - u8 count = gUnknown_02022C98->unk24; - switch (arg0) + u8 berryId; + u8 numPlayers = sGame->numPlayers; + switch (berryIdArg) { - case 0: - case 1: - case 2: - var = gUnknown_02022C98->unk31A0[0].unk14.unk0[arg1]; - gUnknown_02022C98->unk4A[arg2][var] = IncrementWithLimit(gUnknown_02022C98->unk4A[arg2][var], 20000); + case BERRY_BLUE: + case BERRY_GREEN: + case BERRY_GOLD: + berryId = sGame->players[0].berries.ids[column]; + sGame->berryResults[playerId][berryId] = IncrementWithLimit(sGame->berryResults[playerId][berryId], 20000); break; - case 3: - if (sub_8026EEC(gUnknown_02022C98->unk4A)) + case BERRY_MISSED: + if (IsTotalBerriesMissedOver10(sGame->berryResults)) break; - switch (count) + switch (numPlayers) { case 5: - switch (arg1) + switch (column) { case 0: - gUnknown_02022C98->unk4A[2][3]++; - gUnknown_02022C98->unk4A[3][3]++; + sGame->berryResults[2][BERRY_MISSED]++; + sGame->berryResults[3][BERRY_MISSED]++; break; case 1: - gUnknown_02022C98->unk4A[3][3]++; + sGame->berryResults[3][BERRY_MISSED]++; break; case 2: - gUnknown_02022C98->unk4A[3][3]++; - gUnknown_02022C98->unk4A[4][3]++; + sGame->berryResults[3][BERRY_MISSED]++; + sGame->berryResults[4][BERRY_MISSED]++; break; case 3: - gUnknown_02022C98->unk4A[4][3]++; + sGame->berryResults[4][BERRY_MISSED]++; break; case 4: - gUnknown_02022C98->unk4A[4][3]++; - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[4][BERRY_MISSED]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 5: - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 6: - gUnknown_02022C98->unk4A[0][3]++; - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[0][BERRY_MISSED]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 7: - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 8: - gUnknown_02022C98->unk4A[1][3]++; - gUnknown_02022C98->unk4A[2][3]++; + sGame->berryResults[1][BERRY_MISSED]++; + sGame->berryResults[2][BERRY_MISSED]++; break; case 9: - gUnknown_02022C98->unk4A[2][3]++; + sGame->berryResults[2][BERRY_MISSED]++; break; } break; case 4: - switch (arg1) + switch (column) { case 1: - gUnknown_02022C98->unk4A[2][3]++; - gUnknown_02022C98->unk4A[3][3]++; + sGame->berryResults[2][BERRY_MISSED]++; + sGame->berryResults[3][BERRY_MISSED]++; break; case 2: - gUnknown_02022C98->unk4A[3][3]++; + sGame->berryResults[3][BERRY_MISSED]++; break; case 3: - gUnknown_02022C98->unk4A[3][3]++; - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[3][BERRY_MISSED]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 4: - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 5: - gUnknown_02022C98->unk4A[0][3]++; - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[0][BERRY_MISSED]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 6: - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 7: - gUnknown_02022C98->unk4A[1][3]++; - gUnknown_02022C98->unk4A[2][3]++; + sGame->berryResults[1][BERRY_MISSED]++; + sGame->berryResults[2][BERRY_MISSED]++; break; case 8: - gUnknown_02022C98->unk4A[2][3]++; + sGame->berryResults[2][BERRY_MISSED]++; break; } break; case 3: - switch (arg1) + switch (column) { case 2: - gUnknown_02022C98->unk4A[1][3]++; - gUnknown_02022C98->unk4A[2][3]++; + sGame->berryResults[1][BERRY_MISSED]++; + sGame->berryResults[2][BERRY_MISSED]++; break; case 3: - gUnknown_02022C98->unk4A[2][3]++; + sGame->berryResults[2][BERRY_MISSED]++; break; case 4: - gUnknown_02022C98->unk4A[2][3]++; - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[2][BERRY_MISSED]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 5: - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 6: - gUnknown_02022C98->unk4A[0][3]++; - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[0][BERRY_MISSED]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 7: - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[1][BERRY_MISSED]++; break; } break; case 2: - switch (arg1) + switch (column) { case 3: - gUnknown_02022C98->unk4A[0][3]++; - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[0][BERRY_MISSED]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 4: - gUnknown_02022C98->unk4A[0][3]++; + sGame->berryResults[0][BERRY_MISSED]++; break; case 5: - gUnknown_02022C98->unk4A[0][3]++; - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[0][BERRY_MISSED]++; + sGame->berryResults[1][BERRY_MISSED]++; break; case 6: - gUnknown_02022C98->unk4A[1][3]++; + sGame->berryResults[1][BERRY_MISSED]++; break; } break; @@ -2246,317 +2533,352 @@ static void sub_8026F1C(u8 arg0, u8 arg1, u8 arg2) } } -static void sub_8027234(bool32 arg0) +static void UpdateBerriesPickedInRow(bool32 picked) { - if (gUnknown_02022C98->unk24 != 5) + // The 'berries picked in row' stat is only + // counted for games with all 5 players + if (sGame->numPlayers != MAX_RFU_PLAYERS) return; - if (arg0 == TRUE) + if (picked == TRUE) { - if (++gUnknown_02022C98->unk112 > gUnknown_02022C98->unk114) - gUnknown_02022C98->unk114 = gUnknown_02022C98->unk112; - if (gUnknown_02022C98->unk112 > 9999) - gUnknown_02022C98->unk112 = 9999; + if (++sGame->berriesPickedInRow > sGame->maxBerriesPickedInRow) + sGame->maxBerriesPickedInRow = sGame->berriesPickedInRow; + if (sGame->berriesPickedInRow > MAX_BERRIES) + sGame->berriesPickedInRow = MAX_BERRIES; } - else + else // missed { - if (gUnknown_02022C98->unk112 > gUnknown_02022C98->unk114) - gUnknown_02022C98->unk114 = gUnknown_02022C98->unk112; - gUnknown_02022C98->unk112 = 0; + if (sGame->berriesPickedInRow > sGame->maxBerriesPickedInRow) + sGame->maxBerriesPickedInRow = sGame->berriesPickedInRow; + sGame->berriesPickedInRow = 0; } } -static void sub_80272A4(void) +static void SetMaxBerriesPickedInRow(void) { u8 i; - for (i = 0; i < gUnknown_02022C98->unk24; i++) - gUnknown_02022C98->unk4A[i][5] = gUnknown_02022C98->unk114; + for (i = 0; i < sGame->numPlayers; i++) + sGame->berryResults[i][BERRY_IN_ROW] = sGame->maxBerriesPickedInRow; } -static void sub_80272E8(void) +static void ResetForPlayAgainPrompt(void) { u8 i, j; - for (i = 0; i < 5; i++) - { - for (j = 0; j < 11; j++) - gUnknown_02022C98->unk31A0[i].unk14.unkB[j] = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk0 = 0; - gUnknown_02022C98->unk31A0[i].unk2C.unk4 = 0; - gUnknown_02022C98->unk90[i] = 0; - gUnknown_02022C98->unk86[i] = 0; - gUnknown_02022C98->unk3308[i].unk0 = 0; - gUnknown_02022C98->unk3308[i].unk4 = 0; - gUnknown_02022C98->unk4A[i][0] = 0; - gUnknown_02022C98->unk4A[i][1] = 0; - gUnknown_02022C98->unk4A[i][2] = 0; - gUnknown_02022C98->unk4A[i][3] = 0; - gUnknown_02022C98->unk4A[i][4] = 0; - gUnknown_02022C98->unk4A[i][5] = 0; + for (i = 0; i < MAX_RFU_PLAYERS; i++) + { + for (j = 0; j < NUM_BERRY_COLUMNS; j++) + sGame->players[i].berries.fallDist[j] = 0; + sGame->players[i].comm.pickState = PICK_NONE; + sGame->players[i].comm.ateBerry = FALSE; + sGame->difficulty[i] = 0; + sGame->berriesEaten[i] = 0; + sGame->scoreResults[i].ranking = 0; + sGame->scoreResults[i].score = 0; + sGame->berryResults[i][BERRY_BLUE] = 0; + sGame->berryResults[i][BERRY_GREEN] = 0; + sGame->berryResults[i][BERRY_GOLD] = 0; + sGame->berryResults[i][BERRY_MISSED] = 0; + sGame->berryResults[i][BERRY_PRIZE] = 0; + sGame->berryResults[i][BERRY_IN_ROW] = 0; } - gUnknown_02022C98->unk154 = 0; - gUnknown_02022C98->unk112 = 0; - gUnknown_02022C98->unk40 = 0; - sub_8026A88(); - sub_8026988(); -} - -static const s16 gUnknown_082F7B24[] = {10, 30, 50, 50}; + sGame->endSoundState = 0; + sGame->berriesPickedInRow = 0; + sGame->numGraySquares = 0; + UpdateAllDodrioAnims(); + UpdateBerrySprites(); +} + +static const s16 sBerryScoreMultipliers[] = { + [BERRY_BLUE] = 10, + [BERRY_GREEN] = 30, + [BERRY_GOLD] = 50, + [BERRY_MISSED] = 50 // Subtracted +}; -static void sub_80273F0(void) +static void SetRandomPrize(void) { - u8 i, var = 0, var2 = 0; + u8 i, prizeSet = 0, prizeIdx = 0; - switch (gUnknown_02022C98->unk24) + switch (sGame->numPlayers) { - case 4: var = 1; break; - case 5: var = 2; break; + case 4: prizeSet = 1; break; + case 5: prizeSet = 2; break; } - var2 = Random() % 10; - for (i = 0; i < 5; i++) - gUnknown_02022C98->unk4A[i][4] = gUnknown_082F7AA4[var][var2]; + prizeIdx = Random() % ARRAY_COUNT(sPrizeBerryIds[0]); + for (i = 0; i < MAX_RFU_PLAYERS; i++) + sGame->berryResults[i][BERRY_PRIZE] = sPrizeBerryIds[prizeSet][prizeIdx]; } -static u32 sub_802745C(u8 arg0) +static u32 GetBerriesPicked(u8 playerId) { - u32 sum = gUnknown_02022C98->unk4A[arg0][0] - + gUnknown_02022C98->unk4A[arg0][1] - + gUnknown_02022C98->unk4A[arg0][2]; - return min(sum, 9999); + u32 sum = sGame->berryResults[playerId][BERRY_BLUE] + + sGame->berryResults[playerId][BERRY_GREEN] + + sGame->berryResults[playerId][BERRY_GOLD]; + return min(sum, MAX_BERRIES); } -static void sub_802749C(void) +static void TryUpdateRecords(void) { - u32 berriesPicked = Min(sub_802745C(gUnknown_02022C98->multiplayerId), 9999); - u32 score = Min(sub_80276C0(gUnknown_02022C98->multiplayerId), 999990); + u32 berriesPicked = Min(GetBerriesPicked(sGame->multiplayerId), MAX_BERRIES); // Min here is redundant + u32 score = Min(GetScore(sGame->multiplayerId), MAX_SCORE); if (gSaveBlock2Ptr->berryPick.bestScore < score) gSaveBlock2Ptr->berryPick.bestScore = score; if (gSaveBlock2Ptr->berryPick.berriesPicked < berriesPicked) gSaveBlock2Ptr->berryPick.berriesPicked = berriesPicked; - if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < gUnknown_02022C98->unk114) - gSaveBlock2Ptr->berryPick.berriesPickedInRow = gUnknown_02022C98->unk114; + if (gSaveBlock2Ptr->berryPick.berriesPickedInRow < sGame->maxBerriesPickedInRow) + gSaveBlock2Ptr->berryPick.berriesPickedInRow = sGame->maxBerriesPickedInRow; } -static u8 sub_8027518(u8 arg0) +// Enqueue the given state, and dequeue and return +// the state that should be used next +static u8 UpdatePickStateQueue(u8 pickState) { - u8 i, saved; + u8 i, nextState; - saved = gUnknown_02022C98->unk98[3]; - for (i = 3; i != 0; i--) - gUnknown_02022C98->unk98[i] = gUnknown_02022C98->unk98[i - 1]; - gUnknown_02022C98->unk98[0] = arg0; - return saved; + nextState = sGame->pickStateQueue[ARRAY_COUNT(sGame->pickStateQueue) - 1]; + for (i = ARRAY_COUNT(sGame->pickStateQueue) - 1; i != 0; i--) + sGame->pickStateQueue[i] = sGame->pickStateQueue[i - 1]; + sGame->pickStateQueue[0] = pickState; + return nextState; } -static void sub_8027554(void) +// The player may extend their Dodrio's heads while they wait for +// other players to respond to the "Play again?" prompt +static void HandleWaitPlayAgainInput(void) { - if (gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] == 0) + if (sGame->inputDelay[sGame->multiplayerId] == 0) { if (JOY_NEW(DPAD_UP)) { - gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 2; - gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] = 6; + sGame->players[sGame->multiplayerId].comm.pickState = PICK_MIDDLE; + sGame->inputDelay[sGame->multiplayerId] = 6; PlaySE(SE_M_CHARM); } else if (JOY_NEW(DPAD_LEFT)) { - gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 3; - gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] = 6; + sGame->players[sGame->multiplayerId].comm.pickState = PICK_LEFT; + sGame->inputDelay[sGame->multiplayerId] = 6; PlaySE(SE_M_CHARM); } else if (JOY_NEW(DPAD_RIGHT)) { - gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 1; - gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId] = 6; + sGame->players[sGame->multiplayerId].comm.pickState = PICK_RIGHT; + sGame->inputDelay[sGame->multiplayerId] = 6; PlaySE(SE_M_CHARM); } else { - gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 0; + sGame->players[sGame->multiplayerId].comm.pickState = PICK_NONE; } } else { - gUnknown_02022C98->unkB0[gUnknown_02022C98->multiplayerId]--; + sGame->inputDelay[sGame->multiplayerId]--; } } -static void sub_8027608(void) +static void ResetPickState(void) { - gUnknown_02022C98->unk31A0[gUnknown_02022C98->multiplayerId].unk2C.unk0 = 0; + sGame->players[sGame->multiplayerId].comm.pickState = PICK_NONE; } -static u16 sub_802762C(void) +static u16 GetPrizeItemId(void) { - return gUnknown_02022C98->unk4A[gUnknown_02022C98->multiplayerId][4] + FIRST_BERRY_INDEX; + return sGame->berryResults[sGame->multiplayerId][BERRY_PRIZE] + FIRST_BERRY_INDEX; } -static u8 sub_8027650(void) +static u8 GetNumPlayers(void) { - return gUnknown_02022C98->unk24; + return sGame->numPlayers; } -static u8 *sub_8027660(u8 id) +static u8 *GetPlayerName(u8 id) { if (gReceivedRemoteLinkPlayers) return gLinkPlayers[id].name; else - return gUnknown_02022C98->unk31A0[id].name; + return sGame->players[id].name; } -static u16 sub_80276A0(u8 arg0, u8 arg1) +static u16 GetBerryResult(u8 playerId, u8 berryId) { - return gUnknown_02022C98->unk4A[arg0][arg1]; + return sGame->berryResults[playerId][berryId]; } -static u32 sub_80276C0(u8 arg0) +static u32 GetScore(u8 playerId) { u8 i; - u32 var, sum = 0; + u32 scoreLost, score = 0; + + // Sum up points for berries picked + for (i = 0; i < BERRY_MISSED; i++) + score += sGame->berryResults[playerId][i] * sBerryScoreMultipliers[i]; - for (i = 0; i < 3; i++) - sum += gUnknown_02022C98->unk4A[arg0][i] * gUnknown_082F7B24[i]; + // Get points lost for berries missed + scoreLost = sGame->berryResults[playerId][BERRY_MISSED] * sBerryScoreMultipliers[BERRY_MISSED]; - var = gUnknown_02022C98->unk4A[arg0][3] * gUnknown_082F7B24[3]; - if (sum <= var) + if (score <= scoreLost) return 0; else - return sum - var; + return score - scoreLost; } -static u32 sub_8027748(void) +static u32 GetHighestScore(void) { - u8 i, count = gUnknown_02022C98->unk24; - u32 maxVar = sub_80276C0(0); + u8 i, numPlayers = sGame->numPlayers; + u32 maxScore = GetScore(0); - for (i = 1; i < count; i++) + for (i = 1; i < numPlayers; i++) { - u32 var = sub_80276C0(i); - if (var > maxVar) - maxVar = var; + u32 score = GetScore(i); + if (score > maxScore) + maxScore = score; } - return Min(maxVar, 999990); + return Min(maxScore, MAX_SCORE); } -static u32 sub_802778C(u8 arg0) +static u32 GetHighestBerryResult(u8 berryId) { - u8 i, count = gUnknown_02022C98->unk24; - u16 maxVar = gUnknown_02022C98->unk4A[0][arg0]; + u8 i, numPlayers = sGame->numPlayers; + u16 maxScore = sGame->berryResults[0][berryId]; - for (i = 0; i < count; i++) + for (i = 0; i < numPlayers; i++) { - u16 var = gUnknown_02022C98->unk4A[i][arg0]; - if (var > maxVar) - maxVar = var; + u16 score = sGame->berryResults[i][berryId]; + if (score > maxScore) + maxScore = score; } - return maxVar; + return maxScore; } -static u32 sub_80277D0(u8 arg0) +static u32 GetScoreByRanking(u8 ranking) { - u32 vals[5], temp; - s16 r6 = TRUE; - u8 i, count = gUnknown_02022C98->unk24; + u32 scores[MAX_RFU_PLAYERS], temp; + s16 unsorted = TRUE; + u8 i; + u8 numPlayers = sGame->numPlayers; - for (i = 0; i < count; i++) - vals[i] = temp = sub_80276C0(i); + for (i = 0; i < numPlayers; i++) + scores[i] = temp = GetScore(i); - while (r6) + // Sort the scores in the array highest to lowest + while (unsorted) { - r6 = FALSE; - for (i = 0; i < count - 1; i++) + unsorted = FALSE; + for (i = 0; i < numPlayers - 1; i++) { - if (vals[i] < vals[i + 1]) + if (scores[i] < scores[i + 1]) { - SWAP(vals[i], vals[i + 1], temp); - r6 = TRUE; + SWAP(scores[i], scores[i + 1], temp); + unsorted = TRUE; } } } - return vals[arg0]; + return scores[ranking]; } -static u32 sub_802784C(void) +static u32 SetScoreResults(void) { - u8 i, r10 = 0, r8 = 0, r9 = 0, count = gUnknown_02022C98->unk24; + u8 i, ranking = 0, nextRanking = 0, playersRanked = 0; + u8 numPlayers = sGame->numPlayers; - // Function called two times for some reason. - sub_8027748(); - if (sub_8027748() == 0) + GetHighestScore(); // Useless call + + if (GetHighestScore() == 0) { - for (i = 0; i < count; i++) + // No one scored any points, put everyone in last place with a score of 0. + // Presumably this was supposed to then return, as the assignments in this + // loop are then overwritten by the rest of the function + for (i = 0; i < numPlayers; i++) { - gUnknown_02022C98->unk3308[i].unk0 = 4; - gUnknown_02022C98->unk3308[i].unk4 = 0; + sGame->scoreResults[i].ranking = MAX_RFU_PLAYERS - 1; + sGame->scoreResults[i].score = 0; } } - for (i = 0; i < count; i++) - gUnknown_02022C98->unk3308[i].unk4 = Min(sub_80276C0(i), 999990); + // Set scores + for (i = 0; i < numPlayers; i++) + sGame->scoreResults[i].score = Min(GetScore(i), MAX_SCORE); + // Set rankings do { - u32 r6 = sub_80277D0(r10); - u8 r3 = r8; - for (i = 0; i < count; i++) + u32 score = GetScoreByRanking(ranking); + u8 curRanking = nextRanking; + + // Find all players with the score for this ranking. + // Increment nextRanking but not curRanking to allow + // for ties + for (i = 0; i < numPlayers; i++) { - if (r6 == gUnknown_02022C98->unk3308[i].unk4) + if (score == sGame->scoreResults[i].score) { - gUnknown_02022C98->unk3308[i].unk0 = r3; - r8++; - r9++; + sGame->scoreResults[i].ranking = curRanking; + nextRanking++; + playersRanked++; } } - r10 = r8; - } while (r9 < count); + ranking = nextRanking; + } while (playersRanked < numPlayers); return 0; } -static void sub_802793C(struct DodrioSubstruct_3308 *dst, u8 id) +static void GetScoreResults(struct DodrioGame_ScoreResults *dst, u8 playerId) { - *dst = gUnknown_02022C98->unk3308[id]; + *dst = sGame->scoreResults[playerId]; } -// Unused function -static u8 sub_802795C(u8 arg0) +// Unused +// Returns where the specified player's score ranks, 0 being first (highest score) +static u8 GetScoreRanking(u8 playerId) { - u8 i, ret = 0, count = gUnknown_02022C98->unk24; - u32 var, vars[5] = {0}; + u8 i, ranking = 0; + u8 numPlayers = sGame->numPlayers; + u32 playersScore; + u32 scores[MAX_RFU_PLAYERS] = {0}; - for (i = 0; i < count; i++) - vars[i] = sub_80276C0(i); + for (i = 0; i < numPlayers; i++) + scores[i] = GetScore(i); - var = vars[arg0]; - for (i = 0; i < 5; i++) + playersScore = scores[playerId]; + for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (i != arg0 && var < vars[i]) - ret++; + if (i != playerId && playersScore < scores[i]) + ranking++; } - return ret; + return ranking; } -static u8 sub_80279C8(void) +enum { + PRIZE_RECEIVED, + PRIZE_FILLED_BAG, + PRIZE_NO_ROOM, + NO_PRIZE, +}; + +static u8 TryGivePrize(void) { - u8 multiplayerId = gUnknown_02022C98->multiplayerId; - u16 itemId = sub_802762C(); + u8 multiplayerId = sGame->multiplayerId; + u16 itemId = GetPrizeItemId(); - if (sub_80276C0(multiplayerId) != sub_8027748()) - return 3; + if (GetScore(multiplayerId) != GetHighestScore()) + return NO_PRIZE; if (!CheckBagHasSpace(itemId, 1)) - return 2; + return PRIZE_NO_ROOM; AddBagItem(itemId, 1); if (!CheckBagHasSpace(itemId, 1)) - return 1; - return 0; + return PRIZE_FILLED_BAG; + return PRIZE_RECEIVED; } -// Really? What next, u32 Add(u32 a)return a+1;? static u32 IncrementWithLimit(u32 a, u32 max) { if (a < max) @@ -2565,7 +2887,6 @@ static u32 IncrementWithLimit(u32 a, u32 max) return max; } -// Gamefreak pls, min(a, b) ((a) < (b) ? (a) : (b)) is a well-known macro static u32 Min(u32 a, u32 b) { if (a < b) @@ -2574,9 +2895,9 @@ static u32 Min(u32 a, u32 b) return b; } -static u8 sub_8027A48(u8 id) +static u8 GetPlayerIdByPos(u8 id) { - return gUnknown_02022C98->unk34[id]; + return sGame->posToPlayerId[id]; } void IsDodrioInParty(void) @@ -2595,14 +2916,15 @@ void IsDodrioInParty(void) gSpecialVar_Result = FALSE; } +#define NUM_RECORD_TYPES 3 + void ShowDodrioBerryPickingRecords(void) { u8 taskId = CreateTask(Task_ShowDodrioBerryPickingRecords, 0); Task_ShowDodrioBerryPickingRecords(taskId); } -// Data related to printing saved results. -static const struct WindowTemplate gUnknown_082F7B2C = +static const struct WindowTemplate sWindowTemplates_Records = { .bg = 0, .tilemapLeft = 5, @@ -2613,12 +2935,14 @@ static const struct WindowTemplate gUnknown_082F7B2C = .baseBlock = 0x1, }; -static const u8 *const gUnknown_082F7B34[3] = {gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers}; -static const u8 gUnknown_082F7B40[] = {4, 7, 4}; - +static const u8 *const sRecordsTexts[NUM_RECORD_TYPES] = {gText_BerriesPicked, gText_BestScore, gText_BerriesInRowFivePlayers}; +static const u8 sRecordNumMaxDigits[NUM_RECORD_TYPES] = {4, 7, 4}; ALIGNED(4) -static const u8 gUnknown_082F7B44[][2] = {{25}, {41}, {57}}; -static const u8 gUnknown_082F7B4A[][2] = {{25}, {41}, {73}}; +static const u8 sRecordTextYCoords[NUM_RECORD_TYPES][2] = {{25}, {41}, {57}}; +static const u8 sRecordNumYCoords[NUM_RECORD_TYPES][2] = {{25}, {41}, {73}}; + +#define tState data[0] +#define tWindowId data[1] static void Task_ShowDodrioBerryPickingRecords(u8 taskId) { @@ -2626,14 +2950,14 @@ static void Task_ShowDodrioBerryPickingRecords(u8 taskId) s32 i, width, widthCurr; s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - window = gUnknown_082F7B2C; + window = sWindowTemplates_Records; width = GetStringWidth(1, gText_BerryPickingRecords, 0); - for (i = 0; i < ARRAY_COUNT(gUnknown_082F7B34); i++) + for (i = 0; i < ARRAY_COUNT(sRecordsTexts); i++) { - widthCurr = GetStringWidth(1, gUnknown_082F7B34[i], 0) + 50; + widthCurr = GetStringWidth(1, sRecordsTexts[i], 0) + 50; if (widthCurr > width) width = widthCurr; } @@ -2642,27 +2966,27 @@ static void Task_ShowDodrioBerryPickingRecords(u8 taskId) width++; window.tilemapLeft = (30 - width) / 2; window.width = width; - data[1] = AddWindow(&window); - sub_8027BEC(data[1], width); - CopyWindowToVram(data[1], 3); - data[0]++; + tWindowId = AddWindow(&window); + PrintRecordsText(tWindowId, width); + CopyWindowToVram(tWindowId, 3); + tState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) - data[0]++; + tState++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) { - rbox_fill_rectangle(data[1]); - CopyWindowToVram(data[1], 1); - data[0]++; + rbox_fill_rectangle(tWindowId); + CopyWindowToVram(tWindowId, 1); + tState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - RemoveWindow(data[1]); + RemoveWindow(tWindowId); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -2670,44 +2994,72 @@ static void Task_ShowDodrioBerryPickingRecords(u8 taskId) } } -static void sub_8027BEC(u8 windowId, s32 width) +#undef tState +#undef tWindowId + +static void PrintRecordsText(u8 windowId, s32 width) { s32 i, x, numWidth; - s32 results[3]; - results[0] = gSaveBlock2Ptr->berryPick.berriesPicked; - results[1] = gSaveBlock2Ptr->berryPick.bestScore; - results[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow; + s32 recordNums[NUM_RECORD_TYPES]; + recordNums[0] = gSaveBlock2Ptr->berryPick.berriesPicked; + recordNums[1] = gSaveBlock2Ptr->berryPick.bestScore; + recordNums[2] = gSaveBlock2Ptr->berryPick.berriesPickedInRow; LoadUserWindowBorderGfx_(windowId, 0x21D, 0xD0); DrawTextBorderOuter(windowId, 0x21D, 0xD); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); AddTextPrinterParameterized(windowId, 1, gText_BerryPickingRecords, GetStringCenterAlignXOffset(1, gText_BerryPickingRecords, width * 8), 1, TEXT_SPEED_FF, NULL); - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_RECORD_TYPES; i++) { - ConvertIntToDecimalStringN(gStringVar1, results[i], STR_CONV_MODE_LEFT_ALIGN, gUnknown_082F7B40[i]); + ConvertIntToDecimalStringN(gStringVar1, recordNums[i], STR_CONV_MODE_LEFT_ALIGN, sRecordNumMaxDigits[i]); numWidth = GetStringWidth(1, gStringVar1, -1); - AddTextPrinterParameterized(windowId, 1, gUnknown_082F7B34[i], 0, gUnknown_082F7B44[i][0], TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(windowId, 1, sRecordsTexts[i], 0, sRecordTextYCoords[i][0], TEXT_SPEED_FF, NULL); x = (width * 8) - numWidth; - AddTextPrinterParameterized(windowId, 1, gStringVar1, x, gUnknown_082F7B4A[i][0], TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(windowId, 1, gStringVar1, x, sRecordNumYCoords[i][0], TEXT_SPEED_FF, NULL); } PutWindowTilemap(windowId); } // Debug functions? -static const u16 gUnknown_082F7B50[][4] = -{ - {9999, 0, 90, 9999}, - {9999, 9999, 70, 9999}, - {9999, 0, 9999, 0}, - {9999, 9999, 60, 0}, - {9999, 9999, 9999, 0}, +static const u16 sDebug_BerryResults[MAX_RFU_PLAYERS][4] = +{ + { + [BERRY_BLUE] = MAX_BERRIES, + [BERRY_GREEN] = 0, + [BERRY_GOLD] = 90, + [BERRY_MISSED] = MAX_BERRIES + }, + { + [BERRY_BLUE] = MAX_BERRIES, + [BERRY_GREEN] = MAX_BERRIES, + [BERRY_GOLD] = 70, + [BERRY_MISSED] = MAX_BERRIES + }, + { + [BERRY_BLUE] = MAX_BERRIES, + [BERRY_GREEN] = 0, + [BERRY_GOLD] = MAX_BERRIES, + [BERRY_MISSED] = 0 + }, + { + [BERRY_BLUE] = MAX_BERRIES, + [BERRY_GREEN] = MAX_BERRIES, + [BERRY_GOLD] = 60, + [BERRY_MISSED] = 0 + }, + { + [BERRY_BLUE] = MAX_BERRIES, + [BERRY_GREEN] = MAX_BERRIES, + [BERRY_GOLD] = MAX_BERRIES, + [BERRY_MISSED] = 0 + }, }; static const u8 sJPText_Vowels[] = _("あいうえおかき"); static const u8 sText_ABCDEFG[] = _("ABCDEFG"); static const u8 sText_0123456[] = _("0123456"); -static const u8 *const sPlaceholderPlayerNames[] = +static const u8 *const sDebug_PlayerNames[] = { sJPText_Vowels, sJPText_Vowels, @@ -2716,277 +3068,293 @@ static const u8 *const sPlaceholderPlayerNames[] = sText_0123456 }; -static void sub_8027D20(void) +static void Debug_UpdateNumPlayers(void) { - gUnknown_02022C98->unk24 = GetLinkPlayerCount(); + sGame->numPlayers = GetLinkPlayerCount(); } -static void sub_8027D38(void) +static void Debug_SetPlayerNamesAndResults(void) { u8 i, playerId; - for (playerId = gUnknown_02022C98->unk24; playerId < ARRAY_COUNT(sPlaceholderPlayerNames); playerId++) - StringCopy(gLinkPlayers[playerId].name, sPlaceholderPlayerNames[playerId]); + for (playerId = sGame->numPlayers; playerId < ARRAY_COUNT(sDebug_PlayerNames); playerId++) + StringCopy(gLinkPlayers[playerId].name, sDebug_PlayerNames[playerId]); - gUnknown_02022C98->unk24 = 5; - for (i = 0; i < 4; i++) + sGame->numPlayers = MAX_RFU_PLAYERS; + for (i = 0; i < NUM_BERRY_TYPES; i++) { - for (playerId = 0; playerId < gUnknown_02022C98->unk24; playerId++) - gUnknown_02022C98->unk4A[playerId][i] = gUnknown_082F7B50[playerId][i]; + for (playerId = 0; playerId < sGame->numPlayers; playerId++) + sGame->berryResults[playerId][i] = sDebug_BerryResults[playerId][i]; } } -struct UnkPacket1 +struct ReadyToStartPacket { u8 id; - u8 ALIGNED(4) unk4; + bool8 ALIGNED(4) ready; }; -static void sub_8027DD0(u32 arg0) +static void SendPacket_ReadyToStart(bool32 ready) { - struct UnkPacket1 packet; - packet.id = 1; - packet.unk4 = arg0; + struct ReadyToStartPacket packet; + packet.id = PACKET_READY_START; + packet.ready = ready; Rfu_SendPacket(&packet); } -static u32 sub_8027DFC(u32 arg0) +static u32 RecvPacket_ReadyToStart(u32 playerId) { - struct UnkPacket1 *packet; + struct ReadyToStartPacket *packet; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) - return 0; + return FALSE; - packet = (void *)&gRecvCmds[arg0][1]; - if (packet->id == 1) - return packet->unk4; + packet = (void *)&gRecvCmds[playerId][1]; + if (packet->id == PACKET_READY_START) + return packet->ready; - return 0; + return FALSE; } -struct UnkPacket2 +struct GameStatePacket { u8 id; - u8 unk1_0:4; - u8 unk1_1:4; - u16 unk2_0:4; - u16 unk2_1:4; - u16 unk3_0:4; - u16 unk3_1:4; - u16 unk4_0:4; - u16 unk4_1:4; - u16 unk5_0:4; - u16 unk5_1:4; - u16 unk6_0:2; - u16 unk6_1:2; - u16 unk6_2:2; - u16 unk6_3:2; - u16 unk7_0:2; - u16 unk7_1:2; - u16 unk7_2:2; - u16 unk7_3:2; - u8 unk8_0:2; - u8 unk8_1:2; - u8 unk8_2:2; - u8 unk8_3:2; - u8 unk9_0:2; - u8 unk9_1:2; - u8 unk9_2:2; - u8 unk9_3:1; - u8 unk9_4:1; - u8 unkA_0:1; - u8 unkA_1:1; - u8 unkA_2:1; - u8 unkA_3:5; - u8 unkB_0:1; - u8 unkB_1:1; - u8 unkB_2:1; - u8 unkB_3:1; - u8 unkB_4:1; - u8 unkB_5:1; - u8 unkB_6:1; + u8 fallDist_Col0:4; + u8 fallDist_Col1:4; + u16 fallDist_Col2:4; + u16 fallDist_Col3:4; + u16 fallDist_Col4:4; + u16 fallDist_Col5:4; + u16 fallDist_Col6:4; + u16 fallDist_Col7:4; + u16 fallDist_Col8:4; + u16 fallDist_Col9:4; + u16 berryId_Col0:2; + u16 berryId_Col1:2; + u16 berryId_Col2:2; + u16 berryId_Col3:2; + u16 berryId_Col4:2; + u16 berryId_Col5:2; + u16 berryId_Col6:2; + u16 berryId_Col7:2; + u8 berryId_Col8:2; + u8 berryId_Col9:2; + u8 pickState_Player1:2; + u8 pickState_Player2:2; + u8 pickState_Player3:2; + u8 pickState_Player4:2; + u8 pickState_Player5:2; + bool8 ateBerry_Player1:1; + bool8 ateBerry_Player2:1; + bool8 ateBerry_Player3:1; + bool8 ateBerry_Player4:1; + bool8 ateBerry_Player5:1; + u8 numGraySquares:5; + bool8 allReadyToEnd:1; + bool8 berriesFalling:1; + bool8 missedBerry_Player1:1; + bool8 missedBerry_Player2:1; + bool8 missedBerry_Player3:1; + bool8 missedBerry_Player4:1; + bool8 missedBerry_Player5:1; }; -static void sub_8027E30(struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 arg6, u32 arg7, u32 arg8) -{ - struct UnkPacket2 packet; - struct DodrioSubstruct_31A0_14 *ptr = &arg0->unk14; - - packet.id = 2; - packet.unk1_0 = ptr->unkB[0]; - packet.unk1_1 = ptr->unkB[1]; - packet.unk2_0 = ptr->unkB[2]; - packet.unk2_1 = ptr->unkB[3]; - packet.unk3_0 = ptr->unkB[4]; - packet.unk3_1 = ptr->unkB[5]; - packet.unk4_0 = ptr->unkB[6]; - packet.unk4_1 = ptr->unkB[7]; - packet.unk5_0 = ptr->unkB[8]; - packet.unk5_1 = ptr->unkB[9]; - - packet.unk6_0 = ptr->unk0[0]; - packet.unk6_1 = ptr->unk0[1]; - packet.unk6_2 = ptr->unk0[2]; - packet.unk6_3 = ptr->unk0[3]; - packet.unk7_0 = ptr->unk0[4]; - packet.unk7_1 = ptr->unk0[5]; - packet.unk7_2 = ptr->unk0[6]; - packet.unk7_3 = ptr->unk0[7]; - packet.unk8_0 = ptr->unk0[8]; - packet.unk8_1 = ptr->unk0[9]; - - packet.unk8_2 = arg1->unk0; - packet.unk8_3 = arg2->unk0; - packet.unk9_0 = arg3->unk0; - packet.unk9_1 = arg4->unk0; - packet.unk9_2 = arg5->unk0; - - packet.unk9_3 = arg1->unk4; - packet.unk9_4 = arg2->unk4; - packet.unkA_0 = arg3->unk4; - packet.unkA_1 = arg4->unk4; - packet.unkA_2 = arg5->unk4; - - packet.unkB_2 = arg1->unk8; - packet.unkB_3 = arg2->unk8; - packet.unkB_4 = arg3->unk8; - packet.unkB_5 = arg4->unk8; - packet.unkB_6 = arg5->unk8; - - packet.unkA_3 = arg6; - packet.unkB_1 = arg7; - packet.unkB_0 = arg8; +static void SendPacket_GameState(struct DodrioGame_Player *player, + struct DodrioGame_PlayerCommData *player1, + struct DodrioGame_PlayerCommData *player2, + struct DodrioGame_PlayerCommData *player3, + struct DodrioGame_PlayerCommData *player4, + struct DodrioGame_PlayerCommData *player5, + u8 numGraySquares, + bool32 berriesFalling, + bool32 allReadyToEnd) +{ + struct GameStatePacket packet; + struct DodrioGame_Berries *berries = &player->berries; + + packet.id = PACKET_GAME_STATE; + packet.fallDist_Col0 = berries->fallDist[0]; + packet.fallDist_Col1 = berries->fallDist[1]; + packet.fallDist_Col2 = berries->fallDist[2]; + packet.fallDist_Col3 = berries->fallDist[3]; + packet.fallDist_Col4 = berries->fallDist[4]; + packet.fallDist_Col5 = berries->fallDist[5]; + packet.fallDist_Col6 = berries->fallDist[6]; + packet.fallDist_Col7 = berries->fallDist[7]; + packet.fallDist_Col8 = berries->fallDist[8]; + packet.fallDist_Col9 = berries->fallDist[9]; + + packet.berryId_Col0 = berries->ids[0]; + packet.berryId_Col1 = berries->ids[1]; + packet.berryId_Col2 = berries->ids[2]; + packet.berryId_Col3 = berries->ids[3]; + packet.berryId_Col4 = berries->ids[4]; + packet.berryId_Col5 = berries->ids[5]; + packet.berryId_Col6 = berries->ids[6]; + packet.berryId_Col7 = berries->ids[7]; + packet.berryId_Col8 = berries->ids[8]; + packet.berryId_Col9 = berries->ids[9]; + + packet.pickState_Player1 = player1->pickState; + packet.pickState_Player2 = player2->pickState; + packet.pickState_Player3 = player3->pickState; + packet.pickState_Player4 = player4->pickState; + packet.pickState_Player5 = player5->pickState; + + packet.ateBerry_Player1 = player1->ateBerry; + packet.ateBerry_Player2 = player2->ateBerry; + packet.ateBerry_Player3 = player3->ateBerry; + packet.ateBerry_Player4 = player4->ateBerry; + packet.ateBerry_Player5 = player5->ateBerry; + + packet.missedBerry_Player1 = player1->missedBerry; + packet.missedBerry_Player2 = player2->missedBerry; + packet.missedBerry_Player3 = player3->missedBerry; + packet.missedBerry_Player4 = player4->missedBerry; + packet.missedBerry_Player5 = player5->missedBerry; + + packet.numGraySquares = numGraySquares; + packet.berriesFalling = berriesFalling; + packet.allReadyToEnd = allReadyToEnd; Rfu_SendPacket(&packet); } -static u32 sub_8028164(u32 unused, struct DodrioSubstruct_31A0 *arg0, struct DodrioSubstruct_31A0_2C *arg1, struct DodrioSubstruct_31A0_2C *arg2, struct DodrioSubstruct_31A0_2C *arg3, struct DodrioSubstruct_31A0_2C *arg4, struct DodrioSubstruct_31A0_2C *arg5, u8 *arg6, u32 *arg7, u32 *arg8) +static bool32 RecvPacket_GameState(u32 playerId, + struct DodrioGame_Player *player, + struct DodrioGame_PlayerCommData *player1, + struct DodrioGame_PlayerCommData *player2, + struct DodrioGame_PlayerCommData *player3, + struct DodrioGame_PlayerCommData *player4, + struct DodrioGame_PlayerCommData *player5, + u8 *numGraySquares, + bool32 *berriesFalling, + bool32 *allReadyToEnd) { - struct UnkPacket2 *packet; - struct DodrioSubstruct_31A0_14 *ptr = &arg0->unk14; + struct GameStatePacket *packet; + struct DodrioGame_Berries *berries = &player->berries; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) - return 0; + return FALSE; packet = (void *)&gRecvCmds[0][1]; - if (packet->id == 2) - { - ptr->unkB[0] = packet->unk1_0; - ptr->unkB[1] = packet->unk1_1; - ptr->unkB[2] = packet->unk2_0; - ptr->unkB[3] = packet->unk2_1; - ptr->unkB[4] = packet->unk3_0; - ptr->unkB[5] = packet->unk3_1; - ptr->unkB[6] = packet->unk4_0; - ptr->unkB[7] = packet->unk4_1; - ptr->unkB[8] = packet->unk5_0; - ptr->unkB[9] = packet->unk5_1; - ptr->unkB[10] = packet->unk1_0; - - ptr->unk0[0] = packet->unk6_0; - ptr->unk0[1] = packet->unk6_1; - ptr->unk0[2] = packet->unk6_2; - ptr->unk0[3] = packet->unk6_3; - ptr->unk0[4] = packet->unk7_0; - ptr->unk0[5] = packet->unk7_1; - ptr->unk0[6] = packet->unk7_2; - ptr->unk0[7] = packet->unk7_3; - ptr->unk0[8] = packet->unk8_0; - ptr->unk0[9] = packet->unk8_1; - ptr->unk0[10] = packet->unk6_0; - - arg1->unk0 = packet->unk8_2; - arg1->unk4 = packet->unk9_3; - arg1->unk8 = packet->unkB_2; - - arg2->unk0 = packet->unk8_3; - arg2->unk4 = packet->unk9_4; - arg2->unk8 = packet->unkB_3; - - arg3->unk0 = packet->unk9_0; - arg3->unk4 = packet->unkA_0; - arg3->unk8 = packet->unkB_4; - - arg4->unk0 = packet->unk9_1; - arg4->unk4 = packet->unkA_1; - arg4->unk8 = packet->unkB_5; - - arg5->unk0 = packet->unk9_2; - arg5->unk4 = packet->unkA_2; - arg5->unk8 = packet->unkB_6; - - *arg6 = packet->unkA_3; - *arg7 = packet->unkB_1; - *arg8 = packet->unkB_0; - return 1; + if (packet->id == PACKET_GAME_STATE) + { + berries->fallDist[0] = packet->fallDist_Col0; + berries->fallDist[1] = packet->fallDist_Col1; + berries->fallDist[2] = packet->fallDist_Col2; + berries->fallDist[3] = packet->fallDist_Col3; + berries->fallDist[4] = packet->fallDist_Col4; + berries->fallDist[5] = packet->fallDist_Col5; + berries->fallDist[6] = packet->fallDist_Col6; + berries->fallDist[7] = packet->fallDist_Col7; + berries->fallDist[8] = packet->fallDist_Col8; + berries->fallDist[9] = packet->fallDist_Col9; + berries->fallDist[10] = packet->fallDist_Col0; + + berries->ids[0] = packet->berryId_Col0; + berries->ids[1] = packet->berryId_Col1; + berries->ids[2] = packet->berryId_Col2; + berries->ids[3] = packet->berryId_Col3; + berries->ids[4] = packet->berryId_Col4; + berries->ids[5] = packet->berryId_Col5; + berries->ids[6] = packet->berryId_Col6; + berries->ids[7] = packet->berryId_Col7; + berries->ids[8] = packet->berryId_Col8; + berries->ids[9] = packet->berryId_Col9; + berries->ids[10] = packet->berryId_Col0; + + player1->pickState = packet->pickState_Player1; + player1->ateBerry = packet->ateBerry_Player1; + player1->missedBerry = packet->missedBerry_Player1; + + player2->pickState = packet->pickState_Player2; + player2->ateBerry = packet->ateBerry_Player2; + player2->missedBerry = packet->missedBerry_Player2; + + player3->pickState = packet->pickState_Player3; + player3->ateBerry = packet->ateBerry_Player3; + player3->missedBerry = packet->missedBerry_Player3; + + player4->pickState = packet->pickState_Player4; + player4->ateBerry = packet->ateBerry_Player4; + player4->missedBerry = packet->missedBerry_Player4; + + player5->pickState = packet->pickState_Player5; + player5->ateBerry = packet->ateBerry_Player5; + player5->missedBerry = packet->missedBerry_Player5; + + *numGraySquares = packet->numGraySquares; + *berriesFalling = packet->berriesFalling; + *allReadyToEnd = packet->allReadyToEnd; + return TRUE; } - return 0; + return FALSE; } -struct UnkPacket3 +struct PickStatePacket { u8 id; - u8 ALIGNED(4) unk4; + u8 ALIGNED(4) pickState; }; -static void sub_80282EC(u8 arg0) +static void SendPacket_PickState(u8 pickState) { - struct UnkPacket3 packet; - packet.id = 3; - packet.unk4 = arg0; + struct PickStatePacket packet; + packet.id = PACKET_PICK_STATE; + packet.pickState = pickState; Rfu_SendPacket(&packet); } -static u32 sub_8028318(u32 arg0, u8 *arg1) +static bool32 RecvPacket_PickState(u32 playerId, u8 *pickState) { - struct UnkPacket3 *packet; + struct PickStatePacket *packet; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) - return 0; + return FALSE; - packet = (void *)&gRecvCmds[arg0][1]; - if (packet->id == 3) + packet = (void *)&gRecvCmds[playerId][1]; + if (packet->id == PACKET_PICK_STATE) { - *arg1 = packet->unk4; - return 1; + *pickState = packet->pickState; + return TRUE; } - return 0; + return FALSE; } -struct UnkPacket4 +struct ReadyToEndPacket { u8 id; - u32 unk4; + bool32 ready; }; -static void sub_8028350(u32 arg0) +static void SendPacket_ReadyToEnd(bool32 ready) { - struct UnkPacket4 packet; - packet.id = 4; - packet.unk4 = arg0; + struct ReadyToEndPacket packet; + packet.id = PACKET_READY_END; + packet.ready = ready; Rfu_SendPacket(&packet); } -static u32 sub_8028374(u32 arg0) +static bool32 RecvPacket_ReadyToEnd(u32 playerId) { - struct UnkPacket4 *packet; + struct ReadyToEndPacket *packet; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) - return 0; + return FALSE; - packet = (void *)&gRecvCmds[arg0][1]; - if (packet->id == 4) - return packet->unk4; + packet = (void *)&gRecvCmds[playerId][1]; + if (packet->id == PACKET_READY_END) + return packet->ready; - return 0; + return FALSE; } -// Large chunk of data -static const struct BgTemplate gUnknown_082F7BA4[] = +static const struct BgTemplate sBgTemplates[] = { { - .bg = 0, + .bg = BG_INTERFACE, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, @@ -2995,7 +3363,7 @@ static const struct BgTemplate gUnknown_082F7BA4[] = .baseTile = 0 }, { - .bg = 1, + .bg = BG_TREE_LEFT, .charBaseIndex = 2, .mapBaseIndex = 12, .screenSize = 1, @@ -3004,7 +3372,7 @@ static const struct BgTemplate gUnknown_082F7BA4[] = .baseTile = 0 }, { - .bg = 2, + .bg = BG_TREE_RIGHT, .charBaseIndex = 2, .mapBaseIndex = 14, .screenSize = 1, @@ -3013,7 +3381,7 @@ static const struct BgTemplate gUnknown_082F7BA4[] = .baseTile = 0 }, { - .bg = 3, + .bg = BG_SCENERY, .charBaseIndex = 3, .mapBaseIndex = 31, .screenSize = 0, @@ -3023,13 +3391,12 @@ static const struct BgTemplate gUnknown_082F7BA4[] = }, }; -// Unknown unreferenced data, feel free to remove. -static const u32 sUnused[] = {255, 0}; +static const struct WindowTemplate sWindowTemplate_Dummy = DUMMY_WIN_TEMPLATE; -static const struct WindowTemplate gUnknown_082F7BBC[] = +static const struct WindowTemplate sWindowTemplates_Results[] = { { - .bg = 0, + .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 1, .width = 28, @@ -3038,7 +3405,7 @@ static const struct WindowTemplate gUnknown_082F7BBC[] = .baseBlock = 0x13, }, { - .bg = 0, + .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 5, .width = 28, @@ -3047,9 +3414,10 @@ static const struct WindowTemplate gUnknown_082F7BBC[] = .baseBlock = 0x4B, } }; -static const struct WindowTemplate gUnknown_082F7BCC = + +static const struct WindowTemplate sWindowTemplate_Prize = { - .bg = 0, + .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 5, .width = 28, @@ -3057,10 +3425,16 @@ static const struct WindowTemplate gUnknown_082F7BCC = .paletteNum = 13, .baseBlock = 0x4B, }; -static const struct WindowTemplate gUnknown_082F7BD4[] = + +enum { + WIN_PLAY_AGAIN, + WIN_YES_NO, +}; + +static const struct WindowTemplate sWindowTemplates_PlayAgain[] = { - { - .bg = 0, + [WIN_PLAY_AGAIN] = { + .bg = BG_INTERFACE, .tilemapLeft = 1, .tilemapTop = 8, .width = 19, @@ -3068,8 +3442,8 @@ static const struct WindowTemplate gUnknown_082F7BD4[] = .paletteNum = 13, .baseBlock = 0x13, }, - { - .bg = 0, + [WIN_YES_NO] = { + .bg = BG_INTERFACE, .tilemapLeft = 22, .tilemapTop = 7, .width = 6, @@ -3078,9 +3452,10 @@ static const struct WindowTemplate gUnknown_082F7BD4[] = .baseBlock = 0x4C, } }; -static const struct WindowTemplate gUnknown_082F7BE4 = + +static const struct WindowTemplate sWindowTemplate_DroppedOut = { - .bg = 0, + .bg = BG_INTERFACE, .tilemapLeft = 4, .tilemapTop = 6, .width = 22, @@ -3088,9 +3463,10 @@ static const struct WindowTemplate gUnknown_082F7BE4 = .paletteNum = 13, .baseBlock = 0x13, }; -static const struct WindowTemplate gUnknown_082F7BEC = + +static const struct WindowTemplate sWindowTemplate_CommStandby = { - .bg = 0, + .bg = BG_INTERFACE, .tilemapLeft = 5, .tilemapTop = 8, .width = 19, @@ -3099,42 +3475,135 @@ static const struct WindowTemplate gUnknown_082F7BEC = .baseBlock = 0x13, }; -// This is an unused copy of the tables from the top of the file. Feel free to remove. -static const u8 sDuplicateArray[] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0, 0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 2, 9, - 0, 0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0, 0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0, 0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0, 0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0, 0, 7, - 8, 1, 2, 3, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0, - 1, 2, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 4, 5, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 5, 5, 6, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 6, 7, 2, 2, 3, 4, 0, 0, 0, 0, 0, 0, - 3, 4, 5, 5, 6, 7, 7, 8, 1, 1, 2, 3, 0, 0, 0, 4, 5, 6, 6, 7, 8, 8, 9, 0, 0, 1, 2, 2, 3, 4, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 1, - 2, 1, 2, 3, 2, 3, 0, 0, 0, 0, 4, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, 4, 3, 4, 0, 0, 0, 0, 9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9, 9, - 9, 9, 0, 0, 1, 1, 0, 9, 9, 9, 9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9, 9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9, 3, 3, 4, 4, 0, 0, 1, 1, - 2, 2, 3, 5, 0, 0, 0, 0, 4, 6, 0, 0, 0, 3, 5, 7, 0, 0, 2, 4, 6, 8, 0, 1, 3, 5, 6, 9 +// Unused duplicate of sActiveColumnMap +static const u8 sActiveColumnMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = +{ + { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 3, 8, 9, 0}, + {0, 1, 2, 5, 6, 3, 4, 5, 8, 9, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 7, 2, 9, 0}, + {0, 1, 4, 5, 6, 7, 2, 3, 4, 9, 0}, + {0, 1, 6, 7, 2, 3, 4, 5, 6, 9, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 1, 0}, + {0, 3, 4, 5, 6, 7, 8, 1, 2, 3, 0}, + {0, 5, 6, 7, 8, 1, 2, 3, 4, 5, 0}, + {0, 7, 8, 1, 2, 3, 4, 5, 6, 7, 0}, + }, + { + {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, + {2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2}, + {4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4}, + {6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6}, + {8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8}, + }, +}; + +// Unused duplicate of sDodrioHeadToColumnMap +static const u8 sDodrioHeadToColumnMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = +{ + { + {4, 5, 6}, + }, + { + {3, 4, 5}, + {5, 6, 3}, + }, + { + {4, 5, 6}, + {6, 7, 2}, + {2, 3, 4}, + }, + { + {3, 4, 5}, + {5, 6, 7}, + {7, 8, 1}, + {1, 2, 3}, + }, + { + {4, 5, 6}, + {6, 7, 8}, + {8, 9, 0}, + {0, 1, 2}, + {2, 3, 4}, + }, +}; + +// Unused duplicate of sDodrioNeighborMap +static const u8 sDodrioNeighborMap_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS][3] = +{ + { + {1, 0, 1}, + }, + { + {1, 0, 1}, + {0, 1, 0}, + }, + { + {2, 0, 1}, + {0, 1, 2}, + {1, 2, 0}, + }, + { + {3, 0, 1}, + {0, 1, 2}, + {1, 2, 3}, + {2, 3, 0}, + }, + { + {4, 0, 1}, + {0, 1, 2}, + {1, 2, 3}, + {2, 3, 4}, + {3, 4, 0}, + }, +}; + +// Unused duplicate of sPlayerIdAtColumn +ALIGNED(4) +static const u8 sPlayerIdAtColumn_Duplicate[MAX_RFU_PLAYERS][NUM_BERRY_COLUMNS] = +{ + {9, 9, 9, 9, 1, 1, 1, 9, 9, 9, 9}, + {9, 9, 9, 0, 0, 1, 1, 0, 9, 9, 9}, + {9, 9, 2, 2, 0, 0, 1, 1, 1, 9, 9}, + {9, 3, 3, 0, 0, 1, 1, 2, 2, 3, 9}, + {3, 3, 4, 4, 0, 0, 1, 1, 2, 2, 3}, }; -static const u16 gDodrioBerryBgPal1[] = INCBIN_U16("graphics/link_games/dodrioberry_bg1.gbapal", - "graphics/link_games/dodrioberry_bg2.gbapal"); -static const u16 gDodrioBerryPkmnPal[] = INCBIN_U16("graphics/link_games/dodrioberry_pkmn.gbapal"); -static const u16 gDodrioBerryShinyPal[] = INCBIN_U16("graphics/link_games/dodrioberry_shiny.gbapal"); -static const u16 gDodrioBerryStatusPal[] = INCBIN_U16("graphics/link_games/dodrioberry_status.gbapal"); -static const u16 gDodrioBerrySpritesPal[] = INCBIN_U16("graphics/link_games/dodrioberry_berrysprites.gbapal"); -static const u32 gDodrioBerrySpritesGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_berrysprites.4bpp.lz"); -static const u16 gDodrioBerryPlatformPal[] = INCBIN_U16("graphics/link_games/dodrioberry_platform.gbapal"); -static const u32 gDodrioBerryBgGfx1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.4bpp.lz"); -static const u32 gDodrioBerryBgGfx2[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2.4bpp.lz"); -static const u32 gDodrioBerryStatusGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_status.4bpp.lz"); -static const u32 gDodrioBerryPlatformGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_platform.4bpp.lz"); -static const u32 gDodrioBerryPkmnGfx[] = INCBIN_U32("graphics/link_games/dodrioberry_pkmn.4bpp.lz"); -static const u32 gDodrioBerryBgTilemap1[] = INCBIN_U32("graphics/link_games/dodrioberry_bg1.bin.lz"); -static const u32 gDodrioBerryBgTilemap2Right[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2right.bin.lz"); -static const u32 gDodrioBerryBgTilemap2Left[] = INCBIN_U32("graphics/link_games/dodrioberry_bg2left.bin.lz"); - -static const struct OamData sOamData_82FB1E0 = +// Unused duplicate of sUnsharedColumns +static const u8 sUnsharedColumns_Duplicate[MAX_RFU_PLAYERS][MAX_RFU_PLAYERS] = +{ + {5}, + {4, 6}, + {3, 5, 7}, + {2, 4, 6, 8}, + {1, 3, 5, 6, 9}, +}; + +static const u16 sBg_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/bg.gbapal", + "graphics/dodrio_berry_picking/tree_border.gbapal"); +static const u16 sDodrioNormal_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/dodrio.gbapal"); +static const u16 sDodrioShiny_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/shiny.gbapal"); +static const u16 sStatus_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/status.gbapal"); +static const u16 sBerries_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/berries.gbapal"); +static const u32 sBerries_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/berries.4bpp.lz"); +static const u16 sCloud_Pal[] = INCBIN_U16("graphics/dodrio_berry_picking/cloud.gbapal"); +static const u32 sBg_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.4bpp.lz"); +static const u32 sTreeBorder_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border.4bpp.lz"); +static const u32 sStatus_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/status.4bpp.lz"); +static const u32 sCloud_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/cloud.4bpp.lz"); +static const u32 sDodrio_Gfx[] = INCBIN_U32("graphics/dodrio_berry_picking/dodrio.4bpp.lz"); +static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/bg.bin.lz"); +static const u32 sTreeBorderRight_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_right.bin.lz"); +static const u32 sTreeBorderLeft_Tilemap[] = INCBIN_U32("graphics/dodrio_berry_picking/tree_border_left.bin.lz"); + +static const struct OamData sOamData_Dodrio = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -3151,7 +3620,8 @@ static const struct OamData sOamData_82FB1E0 = .affineParam = 0 }; -static const struct OamData sOamData_82FB1E8 = +// Used by the status bar and the results screen berry icons +static const struct OamData sOamData_16x16_Priority0 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -3168,7 +3638,7 @@ static const struct OamData sOamData_82FB1E8 = .affineParam = 0 }; -static const struct OamData sOamData_82FB1F0 = +static const struct OamData sOamData_Berry = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -3185,7 +3655,7 @@ static const struct OamData sOamData_82FB1F0 = .affineParam = 0 }; -static const struct OamData sOamData_82FB1F8 = +static const struct OamData sOamData_Cloud = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -3202,533 +3672,589 @@ static const struct OamData sOamData_82FB1F8 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_82FB200[] = +static const union AnimCmd sAnim_Dodrio_Normal[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB208[] = +static const union AnimCmd sAnim_Dodrio_PickRight[] = { ANIMCMD_FRAME(64, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB210[] = +static const union AnimCmd sAnim_Dodrio_PickMiddle[] = { ANIMCMD_FRAME(128, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB218[] = +static const union AnimCmd sAnim_Dodrio_PickLeft[] = { ANIMCMD_FRAME(192, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB220[] = +static const union AnimCmd sAnim_Dodrio_Down[] = { ANIMCMD_FRAME(256, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_82FB228[] = +static const union AnimCmd *const sAnims_Dodrio[] = { - sSpriteAnim_82FB200, - sSpriteAnim_82FB208, - sSpriteAnim_82FB210, - sSpriteAnim_82FB218, - sSpriteAnim_82FB220 + [PICK_NONE] = sAnim_Dodrio_Normal, + [PICK_RIGHT] = sAnim_Dodrio_PickRight, + [PICK_MIDDLE] = sAnim_Dodrio_PickMiddle, + [PICK_LEFT] = sAnim_Dodrio_PickLeft, + [PICK_DISABLED] = sAnim_Dodrio_Down, + // There is an unused 6th frame of Dodrio's graphic }; -static const union AnimCmd sSpriteAnim_82FB23C[] = +static const union AnimCmd sAnims_StatusBar_Yellow[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB244[] = +static const union AnimCmd sAnims_StatusBar_Gray[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB24C[] = +static const union AnimCmd sAnims_StatusBar_Red[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_82FB254[] = +static const union AnimCmd *const sAnims_StatusBar[] = { - sSpriteAnim_82FB23C, - sSpriteAnim_82FB244, - sSpriteAnim_82FB24C + [STATUS_YELLOW] = sAnims_StatusBar_Yellow, + [STATUS_GRAY] = sAnims_StatusBar_Gray, + [STATUS_RED] = sAnims_StatusBar_Red }; -static const union AnimCmd sSpriteAnim_82FB260[] = +static const union AnimCmd sAnim_Berry_Blue[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB268[] = +static const union AnimCmd sAnim_Berry_Green[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB270[] = +static const union AnimCmd sAnim_Berry_Gold[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB278[] = +static const union AnimCmd sAnim_Berry_BlueSquished[] = { ANIMCMD_FRAME(12, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB280[] = +static const union AnimCmd sAnim_Berry_GreenSquished[] = { ANIMCMD_FRAME(16, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB288[] = +static const union AnimCmd sAnim_Berry_GoldSquished[] = { ANIMCMD_FRAME(20, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB290[] = +static const union AnimCmd sAnim_Berry_Eaten[] = { ANIMCMD_FRAME(24, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB298[] = +static const union AnimCmd sAnim_Berry_Empty1[] = { ANIMCMD_FRAME(28, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_82FB2A0[] = +static const union AnimCmd sAnim_Berry_Empty2[] = { ANIMCMD_FRAME(32, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_82FB2A8[] = -{ - sSpriteAnim_82FB260, - sSpriteAnim_82FB268, - sSpriteAnim_82FB270, - sSpriteAnim_82FB278, - sSpriteAnim_82FB280, - sSpriteAnim_82FB288, - sSpriteAnim_82FB290, - sSpriteAnim_82FB298, - sSpriteAnim_82FB2A0 +static const union AnimCmd *const sAnims_Berry[] = +{ + [BERRY_BLUE] = sAnim_Berry_Blue, + [BERRY_GREEN] = sAnim_Berry_Green, + [BERRY_GOLD] = sAnim_Berry_Gold, + + [BERRY_BLUE + BERRY_MISSED] = sAnim_Berry_BlueSquished, + [BERRY_GREEN + BERRY_MISSED] = sAnim_Berry_GreenSquished, + [BERRY_GOLD + BERRY_MISSED] = sAnim_Berry_GoldSquished, + + [ANIM_EATEN] = sAnim_Berry_Eaten, + + sAnim_Berry_Empty1, + sAnim_Berry_Empty2 }; -static const union AnimCmd sSpriteAnim_82FB2CC[] = +static const union AnimCmd sAnim_Cloud[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_82FB2D4[] = +static const union AnimCmd *const sAnims_Cloud[] = { - sSpriteAnim_82FB2CC + sAnim_Cloud }; -static void sub_80283A8(void) +static void LoadDodrioGfx(void) { void *ptr = AllocZeroed(0x3000); - struct SpritePalette pal1 = {gDodrioBerryPkmnPal, 0}; - struct SpritePalette pal2 = {gDodrioBerryShinyPal, 1}; + struct SpritePalette normal = {sDodrioNormal_Pal, PALTAG_DODRIO_NORMAL}; + struct SpritePalette shiny = {sDodrioShiny_Pal, PALTAG_DODRIO_SHINY}; - LZ77UnCompWram(gDodrioBerryPkmnGfx, ptr); - // This check should be one line up. - if (ptr != NULL) + LZ77UnCompWram(sDodrio_Gfx, ptr); + if (ptr) { - struct SpriteSheet sheet = {ptr, 0x3000, 0}; + struct SpriteSheet sheet = {ptr, 0x3000, GFXTAG_DODRIO}; LoadSpriteSheet(&sheet); Free(ptr); } - LoadSpritePalette(&pal1); - LoadSpritePalette(&pal2); + LoadSpritePalette(&normal); + LoadSpritePalette(&shiny); } -static void sub_8028408(struct DodrioSubstruct_318C *arg0, u8 arg1, u8 id, u8 arg3) +static void CreateDodrioSprite(struct DodrioGame_MonInfo * monInfo, u8 playerId, u8 id, u8 numPlayers) { - struct SpriteTemplate sprTemplate = + struct SpriteTemplate template = { - .tileTag = 0, - .paletteTag = arg0->isShiny, - .oam = &sOamData_82FB1E0, - .anims = sSpriteAnimTable_82FB228, + .tileTag = GFXTAG_DODRIO, + .paletteTag = monInfo->isShiny, // PALTAG_DODRIO_NORMAL / PALTAG_DODRIO_SHINY + .oam = &sOamData_Dodrio, + .anims = sAnims_Dodrio, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80284A8, + .callback = SpriteCB_Dodrio, }; - gUnknown_02022C9C[id] = AllocZeroed(4); - *gUnknown_02022C9C[id] = CreateSprite(&sprTemplate, sub_8028F14(arg1, arg3), 136, 3); - sub_8028654(TRUE, id); + sDodrioSpriteIds[id] = AllocZeroed(4); + *sDodrioSpriteIds[id] = CreateSprite(&template, GetDodrioXPos(playerId, numPlayers), 136, 3); + SetDodrioInvisibility(TRUE, id); } -static void sub_80284A8(struct Sprite *sprite) +#define sState data[0] +#define sTimer data[1] +#define sUnused1 data[2] +#define sUnused2 data[3] +#define sUnused3 data[4] + +static void SpriteCB_Dodrio(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: break; case 1: - sub_802853C(sprite); + DoDodrioMissedAnim(sprite); break; case 2: - sub_80285AC(sprite); + DoDodrioIntroAnim(sprite); break; } } -static void sub_80284CC(u8 unused) +static void StartDodrioMissedAnim(u8 unused) { - struct Sprite *sprite = &gSprites[*gUnknown_02022C9C[GetMultiplayerId()]]; - sprite->data[0] = 1; - sprite->data[1] = 0; - sprite->data[2] = 0; - sprite->data[3] = 0; - sprite->data[4] = 0; + struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[GetMultiplayerId()]]; + sprite->sState = 1; + sprite->sTimer = 0; + sprite->sUnused1 = 0; + sprite->sUnused2 = 0; + sprite->sUnused3 = 0; } -static void sub_8028504(u8 unused) +static void StartDodrioIntroAnim(u8 unused) { - struct Sprite *sprite = &gSprites[*gUnknown_02022C9C[GetMultiplayerId()]]; - sprite->data[0] = 2; - sprite->data[1] = 0; - sprite->data[2] = 0; - sprite->data[3] = 0; - sprite->data[4] = 0; + struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[GetMultiplayerId()]]; + sprite->sState = 2; + sprite->sTimer = 0; + sprite->sUnused1 = 0; + sprite->sUnused2 = 0; + sprite->sUnused3 = 0; } -static u32 sub_802853C(struct Sprite *sprite) +// Do animation where Dodrio shakes horizontally after reaching for a berry and missing +static u32 DoDodrioMissedAnim(struct Sprite *sprite) { - s8 var; - u8 mod = (++sprite->data[1] / 2) % 4; + s8 x; + u8 state = (++sprite->sTimer / 2) % 4; - if (sprite->data[1] >= 3) + if (sprite->sTimer >= 3) { - switch (mod) + switch (state) { default: - var = 1; + x = 1; break; case 1: case 2: - var = -1; + x = -1; break; } - sprite->pos1.x += var; - if (++sprite->data[1] >= 40) + sprite->pos1.x += x; + if (++sprite->sTimer >= 40) { - sprite->data[0] = 0; - sprite->pos1.x = sub_8028F14(0, sub_8027650()); + sprite->sState = 0; + sprite->pos1.x = GetDodrioXPos(0, GetNumPlayers()); } } return 0; } -static u32 sub_80285AC(struct Sprite *sprite) +// Does the intro animation where the player's Dodrio +// cycles through extending each head twice +#define FRAMES_PER_STATE 13 +#define NUM_INTRO_PICK_STATES PICK_DISABLED // Cycle through 'Normal' and each head, but exclude the Disabled state + +static u32 DoDodrioIntroAnim(struct Sprite *sprite) { - u8 mod = (++sprite->data[1] / 13) % 4; + u8 pickState = (++sprite->sTimer / FRAMES_PER_STATE) % NUM_INTRO_PICK_STATES; - if (sprite->data[1] % 13 == 0 && mod != 0) + // Play a sound effect at the start of each head extension + if (sprite->sTimer % FRAMES_PER_STATE == 0 && pickState != PICK_NONE) PlaySE(SE_M_CHARM); - if (sprite->data[1] >= 104) + + if (sprite->sTimer >= FRAMES_PER_STATE * NUM_INTRO_PICK_STATES * 2) { - sprite->data[0] = 0; - mod = 0; + // End animation + sprite->sState = 0; + pickState = PICK_NONE; } - sub_80286B4(GetMultiplayerId(), mod); + SetDodrioAnim(GetMultiplayerId(), pickState); return 0; } -static void sub_8028614(u8 count) +#undef sState +#undef sTimer +#undef sUnused1 +#undef sUnused2 +#undef sUnused3 + +static void FreeDodrioSprites(u8 numPlayers) { u8 i; - for (i = 0; i < count; i++) + for (i = 0; i < numPlayers; i++) { - struct Sprite *sprite = &gSprites[*gUnknown_02022C9C[i]]; - if (sprite != NULL) + struct Sprite *sprite = &gSprites[*sDodrioSpriteIds[i]]; + if (sprite) DestroySpriteAndFreeResources(sprite); - // Memory should be freed here but is not. +#ifdef BUGFIX + FREE_AND_SET_NULL(sDodrioSpriteIds[i]); // Memory should be freed here but is not. +#endif } } -static void sub_8028654(bool8 invisible, u8 id) +static void SetDodrioInvisibility(bool8 invisible, u8 id) { - gSprites[*gUnknown_02022C9C[id]].invisible = invisible; + gSprites[*sDodrioSpriteIds[id]].invisible = invisible; } -static void sub_802868C(bool8 invisible, u8 count) +static void SetAllDodrioInvisibility(bool8 invisible, u8 count) { u8 i; for (i = 0; i < count; i++) - sub_8028654(invisible, i); + SetDodrioInvisibility(invisible, i); } -static void sub_80286B4(u8 id, u8 frameNum) +static void SetDodrioAnim(u8 id, u8 pickState) { - StartSpriteAnim(&gSprites[*gUnknown_02022C9C[id]], frameNum); + StartSpriteAnim(&gSprites[*sDodrioSpriteIds[id]], pickState); } -static void nullsub_15(struct Sprite *sprite) +static void SpriteCB_Status(struct Sprite *sprite) { } -static void sub_80286E4(void) +static void InitStatusBarPos(void) { u8 i; - for (i = 0; i < 10; i++) + for (i = 0; i < NUM_STATUS_SQUARES; i++) { - struct Sprite *sprite = &gSprites[gUnknown_02022CF4->unk2A[i]]; + struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]]; sprite->pos1.x = (i * 16) + 48; sprite->pos1.y = -8 - (i * 8); - gUnknown_02022CF4->unkC[i] = 0; + sStatusBar->entered[i] = FALSE; } } -static void sub_8028734(void) +static void CreateStatusBarSprites(void) { u8 i; void *ptr = AllocZeroed(0x180); - struct SpritePalette spPal = {gDodrioBerryStatusPal, 2}; + struct SpritePalette pal = {sStatus_Pal, PALTAG_STATUS}; - LZ77UnCompWram(gDodrioBerryStatusGfx, ptr); + LZ77UnCompWram(sStatus_Gfx, ptr); // This check should be one line up. - if (ptr != NULL) + if (ptr) { - struct SpriteSheet spSheet = {ptr, 0x180, 1}; - struct SpriteTemplate spTemplate = + struct SpriteSheet sheet = {ptr, 0x180, GFXTAG_STATUS}; + struct SpriteTemplate template = { - .tileTag = 1, - .paletteTag = 2, - .oam = &sOamData_82FB1E8, - .anims = sSpriteAnimTable_82FB254, + .tileTag = GFXTAG_STATUS, + .paletteTag = PALTAG_STATUS, + .oam = &sOamData_16x16_Priority0, + .anims = sAnims_StatusBar, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_15, + .callback = SpriteCB_Status, }; - gUnknown_02022CF4 = AllocZeroed(sizeof(*gUnknown_02022CF4)); - LoadSpriteSheet(&spSheet); - LoadSpritePalette(&spPal); - for (i = 0; i < 10; i++) - gUnknown_02022CF4->unk2A[i] = CreateSprite(&spTemplate, (i * 16) + 48, -8 - (i * 8), 0); + sStatusBar = AllocZeroed(sizeof(*sStatusBar)); + LoadSpriteSheet(&sheet); + LoadSpritePalette(&pal); + for (i = 0; i < NUM_STATUS_SQUARES; i++) + sStatusBar->spriteIds[i] = CreateSprite(&template, (i * 16) + 48, -8 - (i * 8), 0); } Free(ptr); } -static void sub_80287E4(void) +static void FreeStatusBar(void) { u8 i; - for (i = 0; i < 10; i++) + for (i = 0; i < NUM_STATUS_SQUARES; i++) { - struct Sprite *sprite = &gSprites[gUnknown_02022CF4->unk2A[i]]; - if (sprite != NULL) + struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]]; + if (sprite) DestroySpriteAndFreeResources(sprite); } - FREE_AND_SET_NULL(gUnknown_02022CF4); + FREE_AND_SET_NULL(sStatusBar); } -static bool32 sub_8028828(void) +// Progress an animation where each square of the +// status bar drops down into view, bounces up, +// then settles into position. +// Returns TRUE if the animation is complete +static bool32 DoStatusBarIntro(void) { u8 i; - bool32 r3 = FALSE; - for (i = 0; i < 10; i++) + bool32 animActive = FALSE; + for (i = 0; i < NUM_STATUS_SQUARES; i++) { - struct Sprite *sprite = &gSprites[gUnknown_02022CF4->unk2A[i]]; - gUnknown_02022CF4->unk16[i] = 2; - if (gUnknown_02022CF4->unkC[i] != 0 && sprite->pos1.y == 8) + struct Sprite *sprite = &gSprites[sStatusBar->spriteIds[i]]; + sStatusBar->yChange[i] = 2; + if (sStatusBar->entered[i] && sprite->pos1.y == 8) continue; - r3 = TRUE; + + animActive = TRUE; if (sprite->pos1.y == 8) { - if (gUnknown_02022CF4->unkC[i] != 0) + if (sStatusBar->entered[i]) continue; - gUnknown_02022CF4->unkC[i] = 1; - gUnknown_02022CF4->unk16[i] = -16; + + // Square has entered screen, play click + // sound and reverse direction + sStatusBar->entered[i] = TRUE; + sStatusBar->yChange[i] = -16; PlaySE(SE_CLICK); } - sprite->pos1.y += gUnknown_02022CF4->unk16[i]; + sprite->pos1.y += sStatusBar->yChange[i]; } - if (r3) + if (animActive) return FALSE; else return TRUE; } -static void sub_80288D4(u8 arg0) +// The status bar at the top changes color depending on the game performance. +// The squares start out yellow. For every berry missed, a square is colored gray. +// If there are 4 or fewer yellow squares left they also flash red +static void UpdateStatusBarAnim(u8 numEmpty) { u8 i; - if (arg0 > 10) + if (numEmpty > NUM_STATUS_SQUARES) { - for (i = 0; i < 10; i++) - StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 1); + // All squares gray + for (i = 0; i < NUM_STATUS_SQUARES; i++) + StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_GRAY); } else { - for (i = 0; i < 10 - arg0; i++) + // At least 1 square is yellow + for (i = 0; i < NUM_STATUS_SQUARES - numEmpty; i++) { - if (arg0 > 6) + if (numEmpty > 6) { - gUnknown_02022CF4->unk3E += arg0 - 6; - if (gUnknown_02022CF4->unk3E > 30) - gUnknown_02022CF4->unk3E = 0; - else if (gUnknown_02022CF4->unk3E > 10) - StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 2); + // Flash the yellow squares red + // The flash cycles faster the fewer yellow squares remain + sStatusBar->flashTimer += numEmpty - 6; + if (sStatusBar->flashTimer > 30) + sStatusBar->flashTimer = 0; + else if (sStatusBar->flashTimer > 10) + StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_RED); else - StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 0); + StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_YELLOW); } else { - StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 0); + // Set yellow squares, no flash + StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_YELLOW); } } - for (; i < 10; i++) - StartSpriteAnim(&gSprites[gUnknown_02022CF4->unk2A[i]], 1); + + // Set remaining squares gray + for (; i < NUM_STATUS_SQUARES; i++) + StartSpriteAnim(&gSprites[sStatusBar->spriteIds[i]], STATUS_GRAY); } } -static void sub_80289E8(bool8 invisible) +static void SetStatusBarInvisibility(bool8 invisible) { u8 i; - for (i = 0; i < 10; i++) - gSprites[gUnknown_02022CF4->unk2A[i]].invisible = invisible; -} - -// Unknown unused data, feel free to remove. -static const u8 sUnused2[] = {0xD4, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0xFB, 0x0, 0x0}; + for (i = 0; i < NUM_STATUS_SQUARES; i++) + gSprites[sStatusBar->spriteIds[i]].invisible = invisible; +} + +static const u8 sUnusedSounds[] = { + SE_M_CHARM, + SE_NOTE_C, + SE_NOTE_D, + SE_NOTE_E, + SE_NOTE_F, + SE_NOTE_G, + SE_NOTE_A, + SE_NOTE_B, + SE_NOTE_C_HIGH, + SE_RG_CARD_OPEN +}; -static void sub_8028A34(void) +static void LoadBerryGfx(void) { void *ptr = AllocZeroed(0x480); - struct SpritePalette sprPal = {gDodrioBerrySpritesPal, 3}; + struct SpritePalette pal = {sBerries_Pal, PALTAG_BERRIES}; - LZ77UnCompWram(gDodrioBerrySpritesGfx, ptr); - if (ptr != NULL) + LZ77UnCompWram(sBerries_Gfx, ptr); + if (ptr) { - struct SpriteSheet sprSheet = {ptr, 0x480, 2}; - LoadSpriteSheet(&sprSheet); + struct SpriteSheet sheet = {ptr, 0x480, GFXTAG_BERRIES}; + LoadSpriteSheet(&sheet); } - LoadSpritePalette(&sprPal); + LoadSpritePalette(&pal); Free(ptr); } -static const s16 gUnknown_082FB31C[] = {88, 128, 168, 208}; +static const s16 sBerryIconXCoords[] = {88, 128, 168, 208}; -static void sub_8028A88(void) +static void CreateBerrySprites(void) { u8 i; s16 x; - struct SpriteTemplate sprTemplate1 = + struct SpriteTemplate berry = { - .tileTag = 2, - .paletteTag = 3, - .oam = &sOamData_82FB1F0, - .anims = sSpriteAnimTable_82FB2A8, + .tileTag = GFXTAG_BERRIES, + .paletteTag = PALTAG_BERRIES, + .oam = &sOamData_Berry, + .anims = sAnims_Berry, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; - struct SpriteTemplate sprTemplate2 = + struct SpriteTemplate berryIcon = { - .tileTag = 2, - .paletteTag = 3, - .oam = &sOamData_82FB1E8, - .anims = sSpriteAnimTable_82FB2A8, + .tileTag = GFXTAG_BERRIES, + .paletteTag = PALTAG_BERRIES, + .oam = &sOamData_16x16_Priority0, + .anims = sAnims_Berry, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; - for (i = 0; i < 11; i++) + // Create berry sprites that fall during gameplay + for (i = 0; i < NUM_BERRY_COLUMNS; i++) { - gUnknown_02022CB8[i] = AllocZeroed(4); + sBerrySpriteIds[i] = AllocZeroed(4); x = i * 16; - *gUnknown_02022CB8[i] = CreateSprite(&sprTemplate1, x + (i * 8), 8, 1); - sub_8028BF8(i, TRUE); + *sBerrySpriteIds[i] = CreateSprite(&berry, x + (i * 8), 8, 1); + SetBerryInvisibility(i, TRUE); } - for (i = 0; i < 4; i++) + + // Create berry icon sprites for results screen + for (i = 0; i < NUM_BERRY_TYPES; i++) { - gUnknown_02022CE4[i] = AllocZeroed(4); - if (i == 3) - *gUnknown_02022CE4[i] = CreateSprite(&sprTemplate2, gUnknown_082FB31C[i], 49, 0); + sBerryIconSpriteIds[i] = AllocZeroed(4); + if (i == BERRY_MISSED) + *sBerryIconSpriteIds[i] = CreateSprite(&berryIcon, sBerryIconXCoords[i], 49, 0); else - *gUnknown_02022CE4[i] = CreateSprite(&sprTemplate2, gUnknown_082FB31C[i], 52, 0); - StartSpriteAnim(&gSprites[*gUnknown_02022CE4[i]], i); + *sBerryIconSpriteIds[i] = CreateSprite(&berryIcon, sBerryIconXCoords[i], 52, 0); + StartSpriteAnim(&gSprites[*sBerryIconSpriteIds[i]], i); } - - sub_8028C30(TRUE); + SetBerryIconsInvisibility(TRUE); } -static void sub_8028B80(void) +static void FreeBerrySprites(void) { struct Sprite *sprite; u8 i; - for (i = 0; i < 11; i++) + for (i = 0; i < NUM_BERRY_COLUMNS; i++) { - sprite = &gSprites[*gUnknown_02022CB8[i]]; - if (sprite != NULL) + sprite = &gSprites[*sBerrySpriteIds[i]]; + if (sprite) DestroySprite(sprite); - FREE_AND_SET_NULL(gUnknown_02022CB8[i]); + FREE_AND_SET_NULL(sBerrySpriteIds[i]); } - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_BERRY_TYPES; i++) { - sprite = &gSprites[*gUnknown_02022CE4[i]]; - if (sprite != NULL) + sprite = &gSprites[*sBerryIconSpriteIds[i]]; + if (sprite) DestroySprite(sprite); - FREE_AND_SET_NULL(gUnknown_02022CE4[i]); + FREE_AND_SET_NULL(sBerryIconSpriteIds[i]); } } -static void sub_8028BF8(u8 id, bool8 invisible) +static void SetBerryInvisibility(u8 id, bool8 invisible) { - gSprites[*gUnknown_02022CB8[id]].invisible = invisible; + gSprites[*sBerrySpriteIds[id]].invisible = invisible; } -static void sub_8028C30(bool8 invisible) +static void SetBerryIconsInvisibility(bool8 invisible) { u8 i; - for (i = 0; i < 4; i++) - gSprites[*gUnknown_02022CE4[i]].invisible = invisible; + for (i = 0; i < NUM_BERRY_TYPES; i++) + gSprites[*sBerryIconSpriteIds[i]].invisible = invisible; } -static void sub_8028C7C(u8 id, u8 y) +static void SetBerryYPos(u8 id, u8 y) { - gSprites[*gUnknown_02022CB8[id]].pos1.y = y * 8; + gSprites[*sBerrySpriteIds[id]].pos1.y = y * 8; } -static void sub_8028CA4(u16 id, u8 frameNum) +static void SetBerryAnim(u16 id, u8 animNum) { - StartSpriteAnim(&gSprites[*gUnknown_02022CB8[id]], frameNum); + StartSpriteAnim(&gSprites[*sBerrySpriteIds[id]], animNum); } // Unused -static void sub_8028CD0(u8 spriteId) +static void UnusedSetSpritePos(u8 spriteId) { gSprites[spriteId].pos1.x = 20 * spriteId + 50; gSprites[spriteId].pos1.y = 50; @@ -3736,125 +4262,129 @@ static void sub_8028CD0(u8 spriteId) // Gamefreak made a mistake there and goes out of bounds for the data array as it holds 8 elements // in turn overwriting sprite's subpriority and subsprites fields. -#if defined(NONMATCHING) || MODERN - #define sKeepPosX data[1] +#ifdef UBFIX + #define sFrozen data[1] #else - #define sKeepPosX data[10] -#endif // NONMATCHING + #define sFrozen data[10] +#endif // UBFIX -static void sub_8028CF4(struct Sprite *sprite) +static void SpriteCB_Cloud(struct Sprite *sprite) { u8 i; - static const u8 array[] = {30, 20}; + static const u8 moveDelays[] = {30, 20}; - if (sprite->sKeepPosX != TRUE) + if (sprite->sFrozen != TRUE) { - for (i = 0; i < 2; i++) + for (i = 0; i < NUM_CLOUDS; i++) { - if (++gUnknown_02022CB0[i][1] > array[i]) + if (++sCloudSpriteIds[i][1] > moveDelays[i]) { sprite->pos1.x--; - gUnknown_02022CB0[i][1] = 0; + sCloudSpriteIds[i][1] = 0; } } } } -static const s16 gUnknown_082FB356[][2] = {{230, 55}, {30, 74}}; +static const s16 sCloudStartCoords[NUM_CLOUDS][2] = +{ + {230, 55}, + { 30, 74} +}; -static void sub_8028D44(void) +static void CreateCloudSprites(void) { u8 i; void *ptr = AllocZeroed(0x400); - struct SpritePalette sprPal = {gDodrioBerryPlatformPal, 6}; + struct SpritePalette pal = {sCloud_Pal, PALTAG_CLOUD}; - LZ77UnCompWram(gDodrioBerryPlatformGfx, ptr); - if (ptr != NULL) + LZ77UnCompWram(sCloud_Gfx, ptr); + if (ptr) { - struct SpriteSheet sprSheet = {ptr, 0x400, 5}; - struct SpriteTemplate sprTemplate = + struct SpriteSheet sheet = {ptr, 0x400, GFXTAG_CLOUD}; + struct SpriteTemplate template = { - .tileTag = 5, - .paletteTag = 6, - .oam = &sOamData_82FB1F8, - .anims = sSpriteAnimTable_82FB2D4, + .tileTag = GFXTAG_CLOUD, + .paletteTag = PALTAG_CLOUD, + .oam = &sOamData_Cloud, + .anims = sAnims_Cloud, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8028CF4, + .callback = SpriteCB_Cloud, }; - LoadSpriteSheet(&sprSheet); - LoadSpritePalette(&sprPal); - for (i = 0; i < 2; i++) + LoadSpriteSheet(&sheet); + LoadSpritePalette(&pal); + for (i = 0; i < NUM_CLOUDS; i++) { - gUnknown_02022CB0[i] = AllocZeroed(4); - *gUnknown_02022CB0[i] = CreateSprite(&sprTemplate, gUnknown_082FB356[i][0], gUnknown_082FB356[i][1], 4); + sCloudSpriteIds[i] = AllocZeroed(4); + *sCloudSpriteIds[i] = CreateSprite(&template, sCloudStartCoords[i][0], sCloudStartCoords[i][1], 4); } } Free(ptr); } -static void sub_8028DFC(void) +static void ResetCloudPos(void) { u8 i; - for (i = 0; i < 2; i++) + for (i = 0; i < NUM_CLOUDS; i++) { - struct Sprite *sprite = &gSprites[*gUnknown_02022CB0[i]]; - sprite->sKeepPosX = TRUE; - sprite->pos1.x = gUnknown_082FB356[i][0]; - sprite->pos1.y = gUnknown_082FB356[i][1]; + struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]]; + sprite->sFrozen = TRUE; + sprite->pos1.x = sCloudStartCoords[i][0]; + sprite->pos1.y = sCloudStartCoords[i][1]; } } -static void sub_8028E4C(void) +static void StartCloudMovement(void) { u8 i; - for (i = 0; i < 2; i++) + for (i = 0; i < NUM_CLOUDS; i++) { - struct Sprite *sprite = &gSprites[*gUnknown_02022CB0[i]]; - sprite->sKeepPosX = FALSE; + struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]]; + sprite->sFrozen = FALSE; } } -static void sub_8028E84(void) +static void FreeCloudSprites(void) { u8 i; - for (i = 0; i < 2; i++) + for (i = 0; i < NUM_CLOUDS; i++) { - struct Sprite *sprite = &gSprites[*gUnknown_02022CB0[i]]; + struct Sprite *sprite = &gSprites[*sCloudSpriteIds[i]]; if (sprite) DestroySprite(sprite); - FREE_AND_SET_NULL(gUnknown_02022CB0[i]); + FREE_AND_SET_NULL(sCloudSpriteIds[i]); } } -static void sub_8028EC8(bool8 invisible) +static void SetCloudInvisibility(bool8 invisible) { u8 i; - for (i = 0; i < 2; i++) - gSprites[*gUnknown_02022CB0[i]].invisible = invisible; + for (i = 0; i < NUM_CLOUDS; i++) + gSprites[*sCloudSpriteIds[i]].invisible = invisible; } -#undef sKeepPosX +#undef sFrozen -static s16 sub_8028F14(u8 arg0, u8 arg1) +static s16 GetDodrioXPos(u8 playerId, u8 numPlayers) { s16 x = 0; - switch (arg1) + switch (numPlayers) { case 1: x = 15; break; case 2: - switch (arg0) + switch (playerId) { case 0: x = 12; break; case 1: x = 18; break; } break; case 3: - switch (arg0) + switch (playerId) { case 0: x = 15; break; case 1: x = 21; break; @@ -3862,7 +4392,7 @@ static s16 sub_8028F14(u8 arg0, u8 arg1) } break; case 4: - switch (arg0) + switch (playerId) { case 0: x = 12; break; case 1: x = 18; break; @@ -3871,7 +4401,7 @@ static s16 sub_8028F14(u8 arg0, u8 arg1) } break; case 5: - switch (arg0) + switch (playerId) { case 0: x = 15; break; case 1: x = 21; break; @@ -3885,78 +4415,79 @@ static s16 sub_8028F14(u8 arg0, u8 arg1) return x * 8; } -static void sub_8028FCC(void) +static void ResetBerryAndStatusBarSprites(void) { u8 i; - for (i = 0; i < 11; i++) + for (i = 0; i < NUM_BERRY_COLUMNS; i++) { - sub_8028BF8(i, TRUE); - sub_8028C7C(i, 1); + SetBerryInvisibility(i, TRUE); + SetBerryYPos(i, 1); } - sub_80289E8(FALSE); + SetStatusBarInvisibility(FALSE); } -static void sub_8028FF8(u8 frameId) +static void LoadWindowFrameGfx(u8 frameId) { - LoadBgTiles(0, GetWindowFrameTilesPal(frameId)->tiles, 0x120, 1); + LoadBgTiles(BG_INTERFACE, GetWindowFrameTilesPal(frameId)->tiles, 0x120, 1); LoadPalette(GetWindowFrameTilesPal(frameId)->pal, 0xA0, 0x20); } -static void sub_802902C(void) +static void LoadUserWindowFrameGfx(void) { LoadUserWindowBorderGfx_(0, 0xA, 0xB0); } -static void sub_802903C(void) +static void ResetGfxState(void) { - gUnknown_02022CF8->finished = FALSE; - gUnknown_02022CF8->state = 0; - gUnknown_02022CF8->unk3018 = 0; - gUnknown_02022CF8->unk3020 = 0; - gUnknown_02022CF8->unk3024 = 0; + sGfx->finished = FALSE; + sGfx->state = 0; + sGfx->loadState = 0; + sGfx->cursorSelection = 0; + sGfx->playAgainState = PLAY_AGAIN_NONE; } -static void sub_8029074(const struct WindowTemplate *winTempl) +static void DrawYesNoMessageWindow(const struct WindowTemplate *template) { - u8 pal = 0xA; + u8 pal = 10; - FillBgTilemapBufferRect(0, 1, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal); - FillBgTilemapBufferRect(0, 2, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal); - FillBgTilemapBufferRect(0, 3, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal); - FillBgTilemapBufferRect(0, 4, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal); - FillBgTilemapBufferRect(0, 6, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal); - FillBgTilemapBufferRect(0, 7, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal); - FillBgTilemapBufferRect(0, 8, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal); - FillBgTilemapBufferRect(0, 9, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 1, template->tilemapLeft - 1, template->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 2, template->tilemapLeft, template->tilemapTop - 1, template->width, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 3, template->tilemapLeft + template->width, template->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 4, template->tilemapLeft - 1, template->tilemapTop, 1, template->height, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 6, template->tilemapLeft + template->width, template->tilemapTop, 1, template->height, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 7, template->tilemapLeft - 1, template->tilemapTop + template->height, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 8, template->tilemapLeft, template->tilemapTop + template->height, template->width, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 9, template->tilemapLeft + template->width, template->tilemapTop + template->height, 1, 1, pal); } -static void sub_8029174(const struct WindowTemplate *winTempl) +static void DrawMessageWindow(const struct WindowTemplate *template) { - u8 pal = 0xB; + u8 pal = 11; - FillBgTilemapBufferRect(0, 10, winTempl->tilemapLeft - 1, winTempl->tilemapTop - 1, 1, 1, pal); - FillBgTilemapBufferRect(0, 11, winTempl->tilemapLeft, winTempl->tilemapTop - 1, winTempl->width, 1, pal); - FillBgTilemapBufferRect(0, 12, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop - 1, 1, 1, pal); - FillBgTilemapBufferRect(0, 13, winTempl->tilemapLeft - 1, winTempl->tilemapTop, 1, winTempl->height, pal); - FillBgTilemapBufferRect(0, 15, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop, 1, winTempl->height, pal); - FillBgTilemapBufferRect(0, 16, winTempl->tilemapLeft - 1, winTempl->tilemapTop + winTempl->height, 1, 1, pal); - FillBgTilemapBufferRect(0, 17, winTempl->tilemapLeft, winTempl->tilemapTop + winTempl->height, winTempl->width, 1, pal); - FillBgTilemapBufferRect(0, 18, winTempl->tilemapLeft + winTempl->width, winTempl->tilemapTop + winTempl->height, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 10, template->tilemapLeft - 1, template->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 11, template->tilemapLeft, template->tilemapTop - 1, template->width, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 12, template->tilemapLeft + template->width, template->tilemapTop - 1, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 13, template->tilemapLeft - 1, template->tilemapTop, 1, template->height, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 15, template->tilemapLeft + template->width, template->tilemapTop, 1, template->height, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 16, template->tilemapLeft - 1, template->tilemapTop + template->height, 1, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 17, template->tilemapLeft, template->tilemapTop + template->height, template->width, 1, pal); + FillBgTilemapBufferRect(BG_INTERFACE, 18, template->tilemapLeft + template->width, template->tilemapTop + template->height, 1, 1, pal); } -static void sub_8029274(struct DodrioSubstruct_0160 *ptr) +static void InitGameGfx(struct DodrioGame_Gfx *ptr) { - gUnknown_02022CF8 = ptr; - gUnknown_02022CF8->finished = FALSE; - gUnknown_02022CF8->state = 0; - gUnknown_02022CF8->unk3018 = 0; - gUnknown_02022CF8->unk3020 = 0; - gUnknown_02022CF8->unk3024 = 0; - gUnknown_02022CF8->unk3004 = CreateTask(sub_8029314, 3); - sub_802A72C(sub_8029338); + sGfx = ptr; + sGfx->finished = FALSE; + sGfx->state = 0; + sGfx->loadState = 0; + sGfx->cursorSelection = 0; + sGfx->playAgainState = PLAY_AGAIN_NONE; + sGfx->taskId = CreateTask(Task_TryRunGfxFunc, 3); + SetGfxFunc(LoadGfx); } -static void sub_80292D4(void) +// Unused +static void FreeAllWindowBuffers_(void) { FreeAllWindowBuffers(); } @@ -3968,30 +4499,37 @@ struct WinCoords u8 top; }; +enum { + COLORID_GRAY, + COLORID_RED, + COLORID_BLUE, + COLORID_GREEN, // Unused +}; + static const u8 sTextColorTable[][3] = { - {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}, - {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, - {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, - {TEXT_COLOR_WHITE, TEXT_COLOR_GREEN, TEXT_COLOR_LIGHT_GREEN}, + [COLORID_GRAY] = {TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, + [COLORID_RED] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, + [COLORID_BLUE] = {TEXT_COLOR_WHITE, TEXT_COLOR_BLUE, TEXT_COLOR_LIGHT_BLUE}, + [COLORID_GREEN] = {TEXT_COLOR_WHITE, TEXT_COLOR_GREEN, TEXT_COLOR_LIGHT_GREEN}, }; -static const struct WinCoords gUnknown_082FB38C[] = {{12, 6}}; -static const struct WinCoords gUnknown_082FB390[] = {{9, 10}, {15, 6}}; -static const struct WinCoords gUnknown_082FB398[] = {{12, 6}, {18, 10}, {6, 10}}; -static const struct WinCoords gUnknown_082FB3A4[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}}; -static const struct WinCoords gUnknown_082FB3B4[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}}; +static const struct WinCoords sNameWindowCoords_1Player[] = {{12, 6}}; +static const struct WinCoords sNameWindowCoords_2Players[] = {{9, 10}, {15, 6}}; +static const struct WinCoords sNameWindowCoords_3Players[] = {{12, 6}, {18, 10}, {6, 10}}; +static const struct WinCoords sNameWindowCoords_4Players[] = {{9, 10}, {15, 6}, {21, 10}, {3, 6}}; +static const struct WinCoords sNameWindowCoords_5Players[] = {{12, 6}, {18, 10}, {23, 6}, {1, 6}, {6, 10}}; -static const struct WinCoords *const gUnknown_082FB3C8[] = +static const struct WinCoords *const sNameWindowCoords[MAX_RFU_PLAYERS] = { - gUnknown_082FB38C, - gUnknown_082FB390, - gUnknown_082FB398, - gUnknown_082FB3A4, - gUnknown_082FB3B4, + sNameWindowCoords_1Player, + sNameWindowCoords_2Players, + sNameWindowCoords_3Players, + sNameWindowCoords_4Players, + sNameWindowCoords_5Players, }; -static const u8 *const gUnknown_082FB3DC[] = +static const u8 *const sRankingTexts[MAX_RFU_PLAYERS] = { gText_1Colon, gText_2Colon, @@ -4000,625 +4538,640 @@ static const u8 *const gUnknown_082FB3DC[] = gText_5Colon, }; -static const u16 gUnknown_082FB3F0[] = {92, 132, 172, 212}; -static const u16 gUnknown_082FB3F8[] = {33, 49, 65, 81, 97}; -static const u16 gUnknown_082FB402[] = {17, 33, 49, 65, 81}; +static const u16 sResultsXCoords[] = {92, 132, 172, 212}; +static const u16 sResultsYCoords[] = {33, 49, 65, 81, 97}; +static const u16 sRankingYCoords[] = {17, 33, 49, 65, 81}; struct { u8 id; void (*func)(void); -} const gUnknown_082FB40C[] = -{ - {0, sub_8029338}, - {1, sub_8029440}, - {2, sub_802988C}, - {3, sub_802A010}, - {4, sub_802A380}, - {5, sub_802A454}, - {6, sub_802A534}, - {7, sub_802A588}, - {8, sub_802A6FC}, - {9, nullsub_16}, +} const sGfxFuncs[] = +{ + {GFXFUNC_LOAD, LoadGfx}, // Element not used, LoadGfx is passed directly to SetGfxFunc + {GFXFUNC_SHOW_NAMES, ShowNames}, + {GFXFUNC_SHOW_RESULTS, ShowResults}, + {GFXFUNC_MSG_PLAY_AGAIN, Msg_WantToPlayAgain}, + {GFXFUNC_MSG_SAVING, Msg_SavingDontTurnOff}, + {GFXFUNC_MSG_COMM_STANDBY, Msg_CommunicationStandby}, + {GFXFUNC_ERASE_MSG, EraseMessage}, + {GFXFUNC_MSG_PLAYER_DROPPED, Msg_SomeoneDroppedOut}, + {GFXFUNC_STOP, StopGfxFuncs}, + {GFXFUNC_IDLE, GfxIdle}, }; -static void sub_80292E0(u8 arg0) +static void SetGfxFuncById(u8 funcId) { u8 i; - for (i = 0; i < 10; i++) + for (i = 0; i < ARRAY_COUNT(sGfxFuncs); i++) { - if (gUnknown_082FB40C[i].id == arg0) - sub_802A72C(gUnknown_082FB40C[i].func); + if (sGfxFuncs[i].id == funcId) + SetGfxFunc(sGfxFuncs[i].func); } } -static void sub_8029314(u8 taskId) +static void Task_TryRunGfxFunc(u8 taskId) { - if (!gUnknown_02022CF8->finished) - sub_802A75C()(); + // Continue calling function until it + // has reached its finished state. + // Another will not be called until + // readied by SetGfxFunc + if (!sGfx->finished) + GetGfxFunc()(); } -static void sub_8029338(void) +static void LoadGfx(void) { - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: - sub_802A7A8(); - gUnknown_02022CF8->state++; + InitBgs(); + sGfx->state++; break; case 1: - if (sub_802A8E8() == TRUE) - gUnknown_02022CF8->state++; + if (LoadBgGfx() == TRUE) + sGfx->state++; break; case 2: - CopyToBgTilemapBuffer(3, gDodrioBerryBgTilemap1, 0, 0); - CopyToBgTilemapBuffer(1, gDodrioBerryBgTilemap2Left, 0, 0); - CopyToBgTilemapBuffer(2, gDodrioBerryBgTilemap2Right, 0, 0); - CopyBgTilemapBufferToVram(3); - CopyBgTilemapBufferToVram(1); - CopyBgTilemapBufferToVram(2); - gUnknown_02022CF8->state++; + CopyToBgTilemapBuffer(BG_SCENERY, sBg_Tilemap, 0, 0); + CopyToBgTilemapBuffer(BG_TREE_LEFT, sTreeBorderLeft_Tilemap, 0, 0); + CopyToBgTilemapBuffer(BG_TREE_RIGHT, sTreeBorderRight_Tilemap, 0, 0); + CopyBgTilemapBufferToVram(BG_SCENERY); + CopyBgTilemapBufferToVram(BG_TREE_LEFT); + CopyBgTilemapBufferToVram(BG_TREE_RIGHT); + sGfx->state++; break; case 3: - ShowBg(0); - ShowBg(3); - ShowBg(1); - ShowBg(2); - gUnknown_02022CF8->state++; + ShowBg(BG_INTERFACE); + ShowBg(BG_SCENERY); + ShowBg(BG_TREE_LEFT); + ShowBg(BG_TREE_RIGHT); + sGfx->state++; break; case 4: - sub_8028FF8(gSaveBlock2Ptr->optionsWindowFrameType); - sub_802902C(); - gUnknown_02022CF8->state++; + LoadWindowFrameGfx(gSaveBlock2Ptr->optionsWindowFrameType); + LoadUserWindowFrameGfx(); + sGfx->state++; break; default: - gUnknown_02022CF8->finished = TRUE; + sGfx->finished = TRUE; break; } } -static void sub_8029440(void) +static void ShowNames(void) { - u8 i, playersCount, id, colorsId, *name; + u8 i, numPlayers, playerId, colorsId, *name; u32 left; struct WindowTemplate window; - const struct WinCoords *ptr; + const struct WinCoords *coords; - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: - playersCount = sub_8027650(); - ptr = gUnknown_082FB3C8[playersCount - 1]; - window.bg = 0; + numPlayers = GetNumPlayers(); + coords = sNameWindowCoords[numPlayers - 1]; + window.bg = BG_INTERFACE; window.width = 7; window.height = 2; - window.paletteNum = 0xD; + window.paletteNum = 13; window.baseBlock = 0x13; - for (i = 0; i < playersCount; ptr++, i++) + for (i = 0; i < numPlayers; coords++, i++) { - colorsId = 0; - id = sub_8027A48(i); - left = (56 - GetStringWidth(1, sub_8027660(id), -1)) / 2u; - window.tilemapLeft = ptr->left; - window.tilemapTop = ptr->top; - gUnknown_02022CF8->unk3008[i] = AddWindow(&window); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[i]); - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[i], PIXEL_FILL(1)); - if (id == GetMultiplayerId()) - colorsId = 2; - name = sub_8027660(id); - AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[i], 1, left, 1, sTextColorTable[colorsId], -1, name); - CopyWindowToVram(gUnknown_02022CF8->unk3008[i], 2); + colorsId = COLORID_GRAY; + playerId = GetPlayerIdByPos(i); + left = (56 - GetStringWidth(1, GetPlayerName(playerId), -1)) / 2u; + window.tilemapLeft = coords->left; + window.tilemapTop = coords->top; + sGfx->windowIds[i] = AddWindow(&window); + ClearWindowTilemap(sGfx->windowIds[i]); + FillWindowPixelBuffer(sGfx->windowIds[i], PIXEL_FILL(1)); + if (playerId == GetMultiplayerId()) + colorsId = COLORID_BLUE; + name = GetPlayerName(playerId); + AddTextPrinterParameterized3(sGfx->windowIds[i], 1, left, 1, sTextColorTable[colorsId], -1, name); + CopyWindowToVram(sGfx->windowIds[i], 2); window.baseBlock += 0xE; - sub_8029174(&window); + DrawMessageWindow(&window); } - gUnknown_02022CF8->state++; + sGfx->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - playersCount = sub_8027650(); - for (i = 0; i < playersCount; i++) - PutWindowTilemap(gUnknown_02022CF8->unk3008[i]); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->state++; + numPlayers = GetNumPlayers(); + for (i = 0; i < numPlayers; i++) + PutWindowTilemap(sGfx->windowIds[i]); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->state++; } break; default: - if (++gUnknown_02022CF8->state > 180) + if (++sGfx->state > 180) { - playersCount = sub_8027650(); - for (i = 0; i < playersCount; i++) + numPlayers = GetNumPlayers(); + for (i = 0; i < numPlayers; i++) { - ClearWindowTilemap(gUnknown_02022CF8->unk3008[i]); - RemoveWindow(gUnknown_02022CF8->unk3008[i]); + ClearWindowTilemap(sGfx->windowIds[i]); + RemoveWindow(sGfx->windowIds[i]); } - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->finished = TRUE; + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->finished = TRUE; } break; } } -static void sub_80296A8(u8 playersCount_) +static void PrintRankedScores(u8 numPlayers_) { - u8 i, r8 = 0, r6 = 0; - u8 playersCount = playersCount_; // Pointless variable, I know, but it's needed to match. + u8 i, ranking = 0, rankedPlayers = 0; + u8 numPlayers = numPlayers_; // Needed to match u8 *name; u32 x, numWidth; u8 numString[32]; - u8 array[5] = {0, 1, 2, 3, 4}; - struct DodrioSubstruct_3308 temp, structArray[5]; + u8 playersByRanking[MAX_RFU_PLAYERS] = {0, 1, 2, 3, 4}; + struct DodrioGame_ScoreResults temp, scoreResults[MAX_RFU_PLAYERS]; - for (i = 0; i < playersCount; i++) + // Get all players scores and rankings + for (i = 0; i < numPlayers; i++) { - array[i] = i; - sub_802793C(&temp, i); - structArray[i] = temp; + playersByRanking[i] = i; + GetScoreResults(&temp, i); + scoreResults[i] = temp; } - if (sub_8027748() != 0) + // Sort player ids by ranking + if (GetHighestScore() != 0) { do { - for (i = 0; i < playersCount; i++) + for (i = 0; i < numPlayers; i++) { - if (structArray[i].unk0 == r8) + if (scoreResults[i].ranking == ranking) { - array[r6] = i; - r6++; + playersByRanking[rankedPlayers] = i; + rankedPlayers++; } } - r8 = r6; - } while (r6 < playersCount); + ranking = rankedPlayers; + } while (rankedPlayers < numPlayers); } - for (i = 0; i < playersCount; i++) + // Put any player with a score of 0 at lowest ranking + for (i = 0; i < numPlayers; i++) { - if (structArray[i].unk4 == 0) - structArray[i].unk0 = playersCount - 1; + if (scoreResults[i].score == 0) + scoreResults[i].ranking = numPlayers - 1; } + // Print text x = 216 - GetStringWidth(1, gText_SpacePoints, 0); - for (i = 0; i < playersCount; i++) + for (i = 0; i < numPlayers; i++) { - u8 colorsId = 0; - u8 id = array[i]; - u32 points = structArray[id].unk4; + u8 colorsId = COLORID_GRAY; + u8 playerId = playersByRanking[i]; + u32 points = scoreResults[playerId].score; - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gUnknown_082FB3DC[structArray[id].unk0], 8, gUnknown_082FB402[i], -1, NULL); - if (id == GetMultiplayerId()) - colorsId = 2; - name = sub_8027660(id); - AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[1], 1, 28, gUnknown_082FB402[i], sTextColorTable[colorsId], -1, name); + AddTextPrinterParameterized(sGfx->windowIds[1], 1, sRankingTexts[scoreResults[playerId].ranking], 8, sRankingYCoords[i], -1, NULL); + if (playerId == GetMultiplayerId()) + colorsId = COLORID_BLUE; + name = GetPlayerName(playerId); + AddTextPrinterParameterized3(sGfx->windowIds[1], 1, 28, sRankingYCoords[i], sTextColorTable[colorsId], -1, name); ConvertIntToDecimalStringN(numString, points, STR_CONV_MODE_LEFT_ALIGN, 7); numWidth = GetStringWidth(1, numString, -1); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, numString, x - numWidth, gUnknown_082FB402[i], -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_SpacePoints, x, gUnknown_082FB402[i], -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[1], 1, numString, x - numWidth, sRankingYCoords[i], -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[1], 1, gText_SpacePoints, x, sRankingYCoords[i], -1, NULL); } } -static void sub_802988C(void) +static void ShowResults(void) { - u8 i, j, itemGiveRet, playersCount = sub_8027650(); + u8 i, j, prizeState, numPlayers = GetNumPlayers(); u8 *name; u32 strWidth, x; - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: - sub_802784C(); - gUnknown_02022CF8->unk301C = 0; - gUnknown_02022CF8->state++; + SetScoreResults(); + sGfx->timer = 0; + sGfx->state++; break; case 1: - gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BBC[0]); - gUnknown_02022CF8->unk3008[1] = AddWindow(&gUnknown_082F7BBC[1]); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]); - sub_8029174(&gUnknown_082F7BBC[0]); - sub_8029174(&gUnknown_082F7BBC[1]); - gUnknown_02022CF8->state++; + sGfx->windowIds[0] = AddWindow(&sWindowTemplates_Results[0]); + sGfx->windowIds[1] = AddWindow(&sWindowTemplates_Results[1]); + ClearWindowTilemap(sGfx->windowIds[0]); + ClearWindowTilemap(sGfx->windowIds[1]); + DrawMessageWindow(&sWindowTemplates_Results[0]); + DrawMessageWindow(&sWindowTemplates_Results[1]); + sGfx->state++; break; case 2: - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1)); - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1)); strWidth = GetStringWidth(1, gText_BerryPickingResults, -1); x = (224 - strWidth) / 2; - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_BerryPickingResults, x, 1, -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_10P30P50P50P, 68, 17, -1, NULL); - for (i = 0; i < playersCount; i++) + AddTextPrinterParameterized(sGfx->windowIds[0], 1, gText_BerryPickingResults, x, 1, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[1], 1, gText_10P30P50P50P, 68, 17, -1, NULL); + for (i = 0; i < numPlayers; i++) { - u8 colorsId = 0; + u8 colorsId = COLORID_GRAY; if (i == GetMultiplayerId()) - colorsId = 2; + colorsId = COLORID_BLUE; - name = sub_8027660(i); - AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[1], 1, 0, gUnknown_082FB3F8[i], sTextColorTable[colorsId], -1, name); + name = GetPlayerName(i); + AddTextPrinterParameterized3(sGfx->windowIds[1], 1, 0, sResultsYCoords[i], sTextColorTable[colorsId], -1, name); for (j = 0; j < 4; j++) { u32 width; - u16 result1 = Min(sub_80276A0(i, j), 9999); - u16 result2 = Min(sub_802778C(j), 9999); + u16 berriesPicked = Min(GetBerryResult(i, j), MAX_BERRIES); + u16 maxBerriesPicked = Min(GetHighestBerryResult(j), MAX_BERRIES); - ConvertIntToDecimalStringN(gStringVar4, result1, STR_CONV_MODE_LEFT_ALIGN, 4); + ConvertIntToDecimalStringN(gStringVar4, berriesPicked, STR_CONV_MODE_LEFT_ALIGN, 4); width = GetStringWidth(1, gStringVar4, -1); - if (result2 == result1 && result2 != 0) - AddTextPrinterParameterized3(gUnknown_02022CF8->unk3008[1], 1, gUnknown_082FB3F0[j] - width, gUnknown_082FB3F8[i], sTextColorTable[1], -1, gStringVar4); + + // If player got the most of a berry type, highlight their number in red + if (maxBerriesPicked == berriesPicked && maxBerriesPicked != 0) + AddTextPrinterParameterized3(sGfx->windowIds[1], 1, sResultsXCoords[j] - width, sResultsYCoords[i], sTextColorTable[COLORID_RED], -1, gStringVar4); else - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gStringVar4, gUnknown_082FB3F0[j] - width, gUnknown_082FB3F8[i], -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[1], 1, gStringVar4, sResultsXCoords[j] - width, sResultsYCoords[i], -1, NULL); } } - CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2); - CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2); - gUnknown_02022CF8->state++; + CopyWindowToVram(sGfx->windowIds[0], 2); + CopyWindowToVram(sGfx->windowIds[1], 2); + sGfx->state++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022CF8->unk3008[0]); - PutWindowTilemap(gUnknown_02022CF8->unk3008[1]); + PutWindowTilemap(sGfx->windowIds[0]); + PutWindowTilemap(sGfx->windowIds[1]); } - CopyBgTilemapBufferToVram(0); - sub_8028C30(FALSE); - gUnknown_02022CF8->state++; + CopyBgTilemapBufferToVram(BG_INTERFACE); + SetBerryIconsInvisibility(FALSE); + sGfx->state++; break; case 4: - if (++gUnknown_02022CF8->unk301C >= 30 && JOY_NEW(A_BUTTON)) + if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON)) { - gUnknown_02022CF8->unk301C = 0; + sGfx->timer = 0; PlaySE(SE_SELECT); - sub_8028C30(TRUE); - gUnknown_02022CF8->state++; + SetBerryIconsInvisibility(TRUE); + sGfx->state++; } break; case 5: - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1)); - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1)); strWidth = GetStringWidth(1, gText_AnnouncingRankings, -1); x = (224 - strWidth) / 2; - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_AnnouncingRankings, x, 1, -1, NULL); - gUnknown_02022CF8->state++; + AddTextPrinterParameterized(sGfx->windowIds[0], 1, gText_AnnouncingRankings, x, 1, -1, NULL); + sGfx->state++; break; case 6: - sub_80296A8(playersCount); - CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2); - CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2); - gUnknown_02022CF8->state++; + PrintRankedScores(numPlayers); + CopyWindowToVram(sGfx->windowIds[0], 2); + CopyWindowToVram(sGfx->windowIds[1], 2); + sGfx->state++; break; case 7: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022CF8->unk3008[0]); - PutWindowTilemap(gUnknown_02022CF8->unk3008[1]); + PutWindowTilemap(sGfx->windowIds[0]); + PutWindowTilemap(sGfx->windowIds[1]); } - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->state++; + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->state++; break; case 8: - if (++gUnknown_02022CF8->unk301C >= 30 && JOY_NEW(A_BUTTON)) + if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON)) { - gUnknown_02022CF8->unk301C = 0; + sGfx->timer = 0; PlaySE(SE_SELECT); - if (sub_8027748() < 3000) + if (GetHighestScore() < PRIZE_SCORE) { - gUnknown_02022CF8->state = 127; + sGfx->state = 127; // Skip to end, past giving prize } else { StopMapMusic(); - gUnknown_02022CF8->state++; + sGfx->state++; } - FillBgTilemapBufferRect_Palette0(0, 0, 0, 5, 30, 15); - RemoveWindow(gUnknown_02022CF8->unk3008[1]); - gUnknown_02022CF8->unk3008[1] = AddWindow(&gUnknown_082F7BCC); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]); - sub_8029174(&gUnknown_082F7BCC); + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 5, 30, 15); + RemoveWindow(sGfx->windowIds[1]); + sGfx->windowIds[1] = AddWindow(&sWindowTemplate_Prize); + ClearWindowTilemap(sGfx->windowIds[1]); + DrawMessageWindow(&sWindowTemplate_Prize); } break; case 9: PlayNewMapMusic(MUS_LEVEL_UP); - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1)); - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[1], PIXEL_FILL(1)); strWidth = GetStringWidth(1, gText_AnnouncingPrizes, -1); x = (224 - strWidth) / 2; - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_AnnouncingPrizes, x, 1, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[0], 1, gText_AnnouncingPrizes, x, 1, -1, NULL); DynamicPlaceholderTextUtil_Reset(); - CopyItemName(sub_802762C(), gStringVar1); + CopyItemName(GetPrizeItemId(), gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_FirstPlacePrize); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gStringVar4, 0, 1, -1, NULL); - itemGiveRet = sub_80279C8(); - if (itemGiveRet != 0 && itemGiveRet != 3) + AddTextPrinterParameterized(sGfx->windowIds[1], 1, gStringVar4, 0, 1, -1, NULL); + prizeState = TryGivePrize(); + if (prizeState != PRIZE_RECEIVED && prizeState != NO_PRIZE) { DynamicPlaceholderTextUtil_Reset(); - CopyItemName(sub_802762C(), gStringVar1); + CopyItemName(GetPrizeItemId(), gStringVar1); DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); - if (itemGiveRet == 2) + if (prizeState == PRIZE_NO_ROOM) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_CantHoldAnyMore); - else if (itemGiveRet == 1) + else if (prizeState == PRIZE_FILLED_BAG) DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_FilledStorageSpace); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gStringVar4, 0, 41, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[1], 1, gStringVar4, 0, 41, -1, NULL); } - CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2); - CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2); - gUnknown_02022CF8->state++; + CopyWindowToVram(sGfx->windowIds[0], 2); + CopyWindowToVram(sGfx->windowIds[1], 2); + sGfx->state++; break; case 10: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022CF8->unk3008[0]); - PutWindowTilemap(gUnknown_02022CF8->unk3008[1]); + PutWindowTilemap(sGfx->windowIds[0]); + PutWindowTilemap(sGfx->windowIds[1]); } - CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(BG_INTERFACE); FadeOutAndFadeInNewMapMusic(MUS_RG_VICTORY_WILD, 20, 10); - gUnknown_02022CF8->state++; + sGfx->state++; break; case 11: - if (++gUnknown_02022CF8->unk301C >= 30 && JOY_NEW(A_BUTTON)) + if (++sGfx->timer >= 30 && JOY_NEW(A_BUTTON)) { - gUnknown_02022CF8->unk301C = 0; + sGfx->timer = 0; PlaySE(SE_SELECT); - gUnknown_02022CF8->state++; + sGfx->state++; } break; default: - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]); - RemoveWindow(gUnknown_02022CF8->unk3008[0]); - RemoveWindow(gUnknown_02022CF8->unk3008[1]); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->finished = TRUE; + ClearWindowTilemap(sGfx->windowIds[0]); + ClearWindowTilemap(sGfx->windowIds[1]); + RemoveWindow(sGfx->windowIds[0]); + RemoveWindow(sGfx->windowIds[1]); + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->finished = TRUE; break; } } -static void sub_802A010(void) +static void Msg_WantToPlayAgain(void) { u8 y; - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: - gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BD4[0]); - gUnknown_02022CF8->unk3008[1] = AddWindow(&gUnknown_082F7BD4[1]); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]); - sub_8029174(&gUnknown_082F7BD4[0]); - sub_8029074(&gUnknown_082F7BD4[1]); - gUnknown_02022CF8->state++; - gUnknown_02022CF8->unk3020 = 0; - gUnknown_02022CF8->unk3024 = 0; + // Create windows + sGfx->windowIds[WIN_PLAY_AGAIN] = AddWindow(&sWindowTemplates_PlayAgain[WIN_PLAY_AGAIN]); + sGfx->windowIds[WIN_YES_NO] = AddWindow(&sWindowTemplates_PlayAgain[WIN_YES_NO]); + ClearWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]); + ClearWindowTilemap(sGfx->windowIds[WIN_YES_NO]); + DrawMessageWindow(&sWindowTemplates_PlayAgain[WIN_PLAY_AGAIN]); + DrawYesNoMessageWindow(&sWindowTemplates_PlayAgain[WIN_YES_NO]); + sGfx->state++; + sGfx->cursorSelection = PLAY_AGAIN_NONE; + sGfx->playAgainState = PLAY_AGAIN_NONE; break; case 1: - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1)); - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1)); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_WantToPlayAgain, 0, 5, -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_Yes, 8, 1, -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_No, 8, 17, -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_SelectorArrow2, 0, 1, -1, NULL); - CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2); - CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 2); - gUnknown_02022CF8->state++; + // Print text + FillWindowPixelBuffer(sGfx->windowIds[WIN_PLAY_AGAIN], PIXEL_FILL(1)); + FillWindowPixelBuffer(sGfx->windowIds[WIN_YES_NO], PIXEL_FILL(1)); + AddTextPrinterParameterized(sGfx->windowIds[WIN_PLAY_AGAIN], 1, gText_WantToPlayAgain, 0, 5, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], 1, gText_Yes, 8, 1, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], 1, gText_No, 8, 17, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], 1, gText_SelectorArrow2, 0, 1, -1, NULL); + CopyWindowToVram(sGfx->windowIds[WIN_PLAY_AGAIN], 2); + CopyWindowToVram(sGfx->windowIds[WIN_YES_NO], 2); + sGfx->state++; break; case 2: + // Draw windows if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022CF8->unk3008[0]); - PutWindowTilemap(gUnknown_02022CF8->unk3008[1]); + PutWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]); + PutWindowTilemap(sGfx->windowIds[WIN_YES_NO]); } - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->state++; + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->state++; break; case 3: - y = gUnknown_02022CF8->unk3020; - if (y == 0) - y = 1; - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[1], PIXEL_FILL(1)); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_Yes, 8, 1, -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_No, 8, 17, -1, NULL); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[1], 1, gText_SelectorArrow2, 0, ((y - 1) * 16) + 1, -1, NULL); - CopyWindowToVram(gUnknown_02022CF8->unk3008[1], 3); + // Handle input + y = sGfx->cursorSelection; + if (y == PLAY_AGAIN_NONE) + y = PLAY_AGAIN_YES; + FillWindowPixelBuffer(sGfx->windowIds[WIN_YES_NO], PIXEL_FILL(1)); + AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], 1, gText_Yes, 8, 1, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], 1, gText_No, 8, 17, -1, NULL); + AddTextPrinterParameterized(sGfx->windowIds[WIN_YES_NO], 1, gText_SelectorArrow2, 0, ((y - 1) * 16) + 1, -1, NULL); + CopyWindowToVram(sGfx->windowIds[WIN_YES_NO], 3); + // Increment state only if A or B button have been pressed. if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if (gUnknown_02022CF8->unk3020 == 0) - gUnknown_02022CF8->unk3020 = 1; - gUnknown_02022CF8->state++; + if (sGfx->cursorSelection == PLAY_AGAIN_NONE) + sGfx->cursorSelection = PLAY_AGAIN_YES; + sGfx->state++; } else if (JOY_NEW(DPAD_UP | DPAD_DOWN)) { PlaySE(SE_SELECT); - switch (gUnknown_02022CF8->unk3020) + switch (sGfx->cursorSelection) { - case 0: - gUnknown_02022CF8->unk3020 = 2; + case PLAY_AGAIN_NONE: + sGfx->cursorSelection = PLAY_AGAIN_NO; break; - case 1: - gUnknown_02022CF8->unk3020 = 2; + case PLAY_AGAIN_YES: + sGfx->cursorSelection = PLAY_AGAIN_NO; break; - case 2: - gUnknown_02022CF8->unk3020 = 1; + case PLAY_AGAIN_NO: + sGfx->cursorSelection = PLAY_AGAIN_YES; break; } } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - gUnknown_02022CF8->unk3020 = 2; - gUnknown_02022CF8->state++; + sGfx->cursorSelection = PLAY_AGAIN_NO; + sGfx->state++; } break; default: - gUnknown_02022CF8->unk3024 = gUnknown_02022CF8->unk3020; - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[1]); - RemoveWindow(gUnknown_02022CF8->unk3008[0]); - RemoveWindow(gUnknown_02022CF8->unk3008[1]); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->finished = TRUE; + sGfx->playAgainState = sGfx->cursorSelection; + ClearWindowTilemap(sGfx->windowIds[WIN_PLAY_AGAIN]); + ClearWindowTilemap(sGfx->windowIds[WIN_YES_NO]); + RemoveWindow(sGfx->windowIds[WIN_PLAY_AGAIN]); + RemoveWindow(sGfx->windowIds[WIN_YES_NO]); + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->finished = TRUE; break; } } -static void sub_802A380(void) +static void Msg_SavingDontTurnOff(void) { - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: DrawDialogueFrame(0, FALSE); AddTextPrinterParameterized2(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3); - gUnknown_02022CF8->state++; + sGfx->state++; break; case 1: CopyWindowToVram(0, 3); - gUnknown_02022CF8->state++; + sGfx->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { CreateTask(Task_LinkSave, 0); - gUnknown_02022CF8->state++; + sGfx->state++; } break; case 3: if (!FuncIsActiveTask(Task_LinkSave)) - gUnknown_02022CF8->state++; + sGfx->state++; break; default: - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->finished = TRUE; + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->finished = TRUE; break; } } -static void sub_802A454(void) +static void Msg_CommunicationStandby(void) { - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: - gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BEC); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - sub_8029174(&gUnknown_082F7BEC); - gUnknown_02022CF8->state++; + sGfx->windowIds[0] = AddWindow(&sWindowTemplate_CommStandby); + ClearWindowTilemap(sGfx->windowIds[0]); + DrawMessageWindow(&sWindowTemplate_CommStandby); + sGfx->state++; break; case 1: - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1)); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_CommunicationStandby3, 0, 5, -1, NULL); - CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2); - gUnknown_02022CF8->state++; + FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); + AddTextPrinterParameterized(sGfx->windowIds[0], 1, gText_CommunicationStandby3, 0, 5, -1, NULL); + CopyWindowToVram(sGfx->windowIds[0], 2); + sGfx->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) - PutWindowTilemap(gUnknown_02022CF8->unk3008[0]); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->state++; + PutWindowTilemap(sGfx->windowIds[0]); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->state++; break; default: - gUnknown_02022CF8->finished = TRUE; + sGfx->finished = TRUE; break; } } -static void sub_802A534(void) +static void EraseMessage(void) { - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - RemoveWindow(gUnknown_02022CF8->unk3008[0]); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->finished = TRUE; + ClearWindowTilemap(sGfx->windowIds[0]); + RemoveWindow(sGfx->windowIds[0]); + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->finished = TRUE; } -static void sub_802A588(void) +static void Msg_SomeoneDroppedOut(void) { - switch (gUnknown_02022CF8->state) + switch (sGfx->state) { case 0: - gUnknown_02022CF8->unk3008[0] = AddWindow(&gUnknown_082F7BE4); - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - sub_8029174(&gUnknown_082F7BE4); - gUnknown_02022CF8->state++; - gUnknown_02022CF8->unk301C = 0; - gUnknown_02022CF8->unk3020 = 0; - gUnknown_02022CF8->unk3024 = 0; + sGfx->windowIds[0] = AddWindow(&sWindowTemplate_DroppedOut); + ClearWindowTilemap(sGfx->windowIds[0]); + DrawMessageWindow(&sWindowTemplate_DroppedOut); + sGfx->state++; + sGfx->timer = 0; + sGfx->cursorSelection = 0; + sGfx->playAgainState = PLAY_AGAIN_NONE; break; case 1: - FillWindowPixelBuffer(gUnknown_02022CF8->unk3008[0], PIXEL_FILL(1)); - AddTextPrinterParameterized(gUnknown_02022CF8->unk3008[0], 1, gText_SomeoneDroppedOut, 0, 5, -1, NULL); - CopyWindowToVram(gUnknown_02022CF8->unk3008[0], 2); - gUnknown_02022CF8->state++; + FillWindowPixelBuffer(sGfx->windowIds[0], PIXEL_FILL(1)); + AddTextPrinterParameterized(sGfx->windowIds[0], 1, gText_SomeoneDroppedOut, 0, 5, -1, NULL); + CopyWindowToVram(sGfx->windowIds[0], 2); + sGfx->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) - PutWindowTilemap(gUnknown_02022CF8->unk3008[0]); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->state++; + PutWindowTilemap(sGfx->windowIds[0]); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->state++; break; case 3: - if (++gUnknown_02022CF8->unk301C >= 120) - gUnknown_02022CF8->state++; + if (++sGfx->timer >= 120) + sGfx->state++; break; default: - gUnknown_02022CF8->unk3024 = 5; - ClearWindowTilemap(gUnknown_02022CF8->unk3008[0]); - RemoveWindow(gUnknown_02022CF8->unk3008[0]); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - CopyBgTilemapBufferToVram(0); - gUnknown_02022CF8->finished = TRUE; + sGfx->playAgainState = PLAY_AGAIN_DROPPED; + ClearWindowTilemap(sGfx->windowIds[0]); + RemoveWindow(sGfx->windowIds[0]); + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 30, 20); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sGfx->finished = TRUE; break; } } -static void sub_802A6FC(void) +static void StopGfxFuncs(void) { - DestroyTask(gUnknown_02022CF8->unk3004); - gUnknown_02022CF8->finished = TRUE; + DestroyTask(sGfx->taskId); + sGfx->finished = TRUE; } -static void nullsub_16(void) +static void GfxIdle(void) { } -static void sub_802A72C(void (*func)(void)) +static void SetGfxFunc(void (*func)(void)) { - gUnknown_02022CF8->state = 0; - gUnknown_02022CF8->finished = FALSE; - gUnknown_02022CF8->unk3028 = func; + sGfx->state = 0; + sGfx->finished = FALSE; + sGfx->func = func; } -static void (*sub_802A75C(void))(void) +static void (*GetGfxFunc(void))(void) { - return gUnknown_02022CF8->unk3028; + return sGfx->func; } -static bool32 sub_802A770(void) +static bool32 IsGfxFuncActive(void) { - if (gUnknown_02022CF8->finished == TRUE) + if (sGfx->finished == TRUE) return FALSE; else return TRUE; } -static u8 sub_802A794(void) +static u8 GetPlayAgainState(void) { - return gUnknown_02022CF8->unk3024; + return sGfx->playAgainState; } -static void sub_802A7A8(void) +static void InitBgs(void) { DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3,(void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_082F7BA4, ARRAY_COUNT(gUnknown_082F7BA4)); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -4630,26 +5183,26 @@ static void sub_802A7A8(void) InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); - SetBgTilemapBuffer(3, gUnknown_02022CF8->tilemapBuffers[0]); - SetBgTilemapBuffer(1, gUnknown_02022CF8->tilemapBuffers[1]); - SetBgTilemapBuffer(2, gUnknown_02022CF8->tilemapBuffers[2]); + SetBgTilemapBuffer(BG_SCENERY, sGfx->tilemapBuffers[0]); + SetBgTilemapBuffer(BG_TREE_LEFT, sGfx->tilemapBuffers[1]); + SetBgTilemapBuffer(BG_TREE_RIGHT, sGfx->tilemapBuffers[2]); } -static bool32 sub_802A8E8(void) +static bool32 LoadBgGfx(void) { - switch (gUnknown_02022CF8->unk3018) + switch (sGfx->loadState) { case 0: - LoadPalette(gDodrioBerryBgPal1, 0, sizeof(gDodrioBerryBgPal1)); + LoadPalette(sBg_Pal, 0, sizeof(sBg_Pal)); break; case 1: ResetTempTileDataBuffers(); break; case 2: - DecompressAndCopyTileDataToVram(3, gDodrioBerryBgGfx1, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Gfx, 0, 0, 0); break; case 3: - DecompressAndCopyTileDataToVram(1, gDodrioBerryBgGfx2, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_TREE_LEFT, sTreeBorder_Gfx, 0, 0, 0); break; case 4: if (FreeTempTileDataBuffersIfPossible() == TRUE) @@ -4659,10 +5212,10 @@ static bool32 sub_802A8E8(void) LoadPalette(GetTextWindowPalette(3), 0xD0, 0x20); break; default: - gUnknown_02022CF8->unk3018 = 0; + sGfx->loadState = 0; return TRUE; } - gUnknown_02022CF8->unk3018++; + sGfx->loadState++; return FALSE; } diff --git a/src/easy_chat.c b/src/easy_chat.c index 2590eea1a..753c2df76 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -34,228 +34,382 @@ #include "constants/songs.h" #include "constants/rgb.h" -#define EZCHAT_TASK_STATE 0 -#define EZCHAT_TASK_TYPE 1 -#define EZCHAT_TASK_WORDS 2 -#define EZCHAT_TASK_MAINCALLBACK 4 -#define EZCHAT_TASK_UNK06 6 -#define EZCHAT_TASK_SIZE 7 - static EWRAM_DATA struct EasyChatScreen *sEasyChatScreen = NULL; -static EWRAM_DATA struct Unk203A11C *sUnknown_0203A11C = NULL; -static EWRAM_DATA struct Unk203A120 *sUnknown_0203A120 = NULL; - -static void sub_811A2C0(u8); -static void MainCallback_EasyChatScreen(void); -static bool8 sub_811A428(u8); -static void sub_811A2FC(u8); -static void sub_811A4D0(MainCallback); -static bool32 sub_811A88C(u16); -static void sub_811A8A4(u16); -static bool8 EasyChat_AllocateResources(u8, u16 *, u8); -static void EasyChat_FreeResources(void); -static u16 sub_811AAAC(void); -static u16 sub_811AB68(void); -static u16 sub_811ACDC(void); -static u16 sub_811AE44(void); -static u16 sub_811AF00(void); -static u16 sub_811AF8C(void); -static u16 sub_811AFEC(void); -static u16 sub_811B040(void); -static u16 sub_811B08C(void); -static u16 sub_811B0BC(void); -static u16 sub_811B0E8(void); -static u16 sub_811B0F8(void); -static u16 sub_811B150(void); -static u16 sub_811B1B4(void); +static EWRAM_DATA struct EasyChatScreenControl *sScreenControl = NULL; +static EWRAM_DATA struct EasyChatScreenWordData *sWordData = NULL; + +static void Task_InitEasyChatScreen(u8); +static void CB2_EasyChatScreen(void); +static bool8 InitEasyChatScreen(u8); +static void Task_EasyChatScreen(u8); +static void ExitEasyChatScreen(MainCallback); +static bool32 IsFuncIdForQuizLadyScreen(u16); +static void EnterQuizLadyScreen(u16); +static bool8 InitEasyChatScreenStruct(u8, u16 *, u8); +static void FreeEasyChatScreenStruct(void); +static u16 HandleEasyChatInput(void); +static u16 HandleEasyChatInput_Phrase(void); +static u16 HandleEasyChatInput_MainScreenButtons(void); +static u16 HandleEasyChatInput_Keyboard(void); +static u16 HandleEasyChatInput_WordSelect(void); +static u16 HandleEasyChatInput_ExitPrompt(void); +static u16 HandleEasyChatInput_ConfirmWordsYesNo(void); +static u16 HandleEasyChatInput_DeleteAllYesNo(void); +static u16 HandleEasyChatInput_QuizQuestion(void); +static u16 HandleEasyChatInput_WaitForMsg(void); +static u16 HandleEasyChatInput_StartConfirmLyrics(void); +static u16 HandleEasyChatInput_ConfirmLyricsYesNo(void); +static u16 StartConfirmExitPrompt(void); +static u16 TryConfirmWords(void); static u8 GetEasyChatScreenFrameId(void); static u8 GetEachChatScreenTemplateId(u8); -static void sub_811BDF0(u8 *); -static void sub_811BF78(void); -static bool8 sub_811BF8C(void); -static bool8 sub_811BFA4(void); -static void sub_811C13C(void); -static void sub_811C158(u16); -static bool8 sub_811C170(void); -static bool8 sub_811F28C(void); -static void sub_811F2B8(void); -static u8 sub_811F3AC(void); +static void GetQuizTitle(u8 *); +static void ClearUnusedField(void); +static bool8 InitEasyChatScreenControl(void); +static bool8 LoadEasyChatScreen(void); +static void FreeEasyChatScreenControl(void); +static void StartEasyChatFunction(u16); +static bool8 RunEasyChatFunction(void); +static bool8 InitEasyChatScreenWordData(void); +static void FreeEasyChatScreenWordData(void); +static u8 GetNumUnlockedEasyChatGroups(void); static int FooterHasFourOptions(void); -static int sub_811B184(void); -static int sub_811B264(void); -static int sub_811B32C(void); -static int sub_811B2B0(void); -static int sub_811B33C(void); -static int sub_811B368(void); -static u16 sub_811B528(int); -static u16 sub_811B794(u32); -static int sub_811B394(void); -static u8 sub_811B2A4(void); -static void sub_811B3E4(void); -static void sub_811BE9C(void); -static int sub_811B4EC(void); -static void sub_811B418(void); -static void sub_811B454(void); -static int sub_811BD64(void); -static int sub_811BDB0(void); -static int sub_811BD2C(void); -static int sub_811BCF4(void); -static u16 sub_811B8E8(void); -static u8 sub_811F3B8(u8); -static void sub_811F548(int, u16); -static int sub_811B908(void); -static u16 sub_811F5B0(void); -static void sub_811B488(u16); -static u16 sub_811B940(void); -static u16 sub_811F578(u16); -static int sub_811BF88(int); -static u16 sub_811B8C8(void); -static int sub_811B568(u32); -static int sub_811B634(u32); -static int sub_811B6C4(u32); -static void sub_811B978(void); -static void sub_811B744(void); -static u8 sub_811B9C8(void); -static void sub_811B768(void); -static u8 sub_811B960(u8); -static void sub_811B9A0(void); -static u8 sub_811BA1C(void); +static int DoDeleteAllButton(void); +static int DoQuizButton(void); +static int ExitKeyboardToMainScreen(void); +static int SelectKeyboardGroup(void); +static int StartSwitchKeyboardMode(void); +static int DeleteSelectedWord(void); +static u16 MoveKeyboardCursor(int); +static u16 MoveWordSelectCursor(u32); +static int SelectNewWord(void); +static u8 GetEasyChatBackupState(void); +static void SaveCurrentPhrase(void); +static void SetSpecialEasyChatResult(void); +static bool32 GetEasyChatCompleted(void); +static void ResetCurrentPhrase(void); +static void ResetCurrentPhraseToSaved(void); +static int IsQuizQuestionEmpty(void); +static int IsQuizAnswerEmpty(void); +static bool32 IsCurrentPhraseFull(void); +static bool32 IsCurrentPhraseEmpty(void); +static u16 GetSelectedGroupIndex(void); +static u8 GetUnlockedEasyChatGroupId(u8); +static void SetSelectedWordGroup(bool32, u16); +static int GetSelectedAlphabetGroupId(void); +static u16 GetNumWordsInSelectedGroup(void); +static void SetSelectedWord(u16); +static u16 GetSelectedWordIndex(void); +static u16 GetWordFromSelectedGroup(u16); +static bool32 DummyWordCheck(int); +static u16 GetWordIndexToReplace(void); +static int MoveKeyboardCursor_GroupNames(u32); +static int MoveKeyboardCursor_Alphabet(u32); +static int MoveKeyboardCursor_ButtonWindow(u32); +static void ReduceToValidKeyboardColumn(void); +static void SetKeyboardCursorInButtonWindow(void); +static bool8 IsSelectedKeyboardIndexInvalid(void); +static void SetKeyboardCursorToLastColumn(void); +static u8 GetLastAlphabetColumn(u8); +static void ReduceToValidWordSelectColumn(void); +static bool8 IsSelectedWordIndexInvalid(void); static int DidPlayerInputMysteryGiftPhrase(void); static u16 DidPlayerInputABerryMasterWifePhrase(void); -static bool8 sub_811CE94(void); -static void sub_811CF64(void); -static void sub_811CF04(void); -static void sub_811D60C(void); -static void sub_811D424(u16 *); -static void sub_811D230(void); -static void sub_811E948(void); -static void sub_811CFCC(void); -static void sub_811D0BC(void); -static void sub_811D2C8(void); -static void sub_811D684(void); -static void sub_811DE90(void); -static void sub_811DEC4(void); -static void sub_811DF28(struct Sprite *); -static void sub_811DE5C(u8, u8, u8, u8); -static void sub_811E5D4(void); -static void sub_811E720(void); -static void sub_811E828(void); -static bool8 sub_811C2D4(void); -static bool8 sub_811C30C(void); -static bool8 sub_811C3E4(void); -static bool8 sub_811C48C(void); -static bool8 sub_811C404(void); -static bool8 sub_811C448(void); -static bool8 sub_811C4D0(void); -static bool8 sub_811C518(void); -static bool8 sub_811C554(void); -static bool8 sub_811C620(void); -static bool8 sub_811C830(void); -static bool8 sub_811C8F0(void); -static bool8 sub_811C99C(void); -static bool8 sub_811CA5C(void); -static bool8 sub_811C780(void); -static bool8 sub_811C78C(void); -static bool8 sub_811C7D4(void); -static bool8 sub_811CB18(void); -static bool8 sub_811CB98(void); -static bool8 sub_811CB24(void); -static bool8 sub_811CC90(void); -static bool8 sub_811CC08(void); -static bool8 sub_811C6C0(void); -static bool8 sub_811CD14(void); -static bool8 sub_811CD54(void); -static bool8 sub_811CD94(void); -static bool8 sub_811CDD4(void); -static bool8 sub_811CE14(void); -static bool8 sub_811CE54(void); -static void sub_811DF60(u8, u8); +static bool8 InitEasyChatScreenControl_(void); +static void LoadEasyChatPalettes(void); +static void InitEasyChatBgs(void); +static void AdjustBgTilemapForFooter(void); +static void BufferFrameTilemap(u16 *); +static void AddPhraseWindow(void); +static void AddMainScreenButtonWindow(void); +static void PrintTitle(void); +static void PrintInitialInstructions(void); +static void PrintCurrentPhrase(void); +static void DrawLowerWindow(void); +static void LoadEasyChatGfx(void); +static void CreateMainCursorSprite(void); +static void SpriteCB_Cursor(struct Sprite *); +static void SetWindowDimensions(u8, u8, u8, u8); +static void CreateScrollIndicatorSprites(void); +static void CreateStartSelectButtonSprites(void); +static void TryAddInterviewObjectEvents(void); +static bool8 ReprintPhrase(void); +static bool8 UpdateMainCursor(void); +static bool8 UpdateMainCursorOnButtons(void); +static bool8 ShowConfirmDeleteAllPrompt(void); +static bool8 ShowConfirmExitPrompt(void); +static bool8 ShowConfirmPrompt(void); +static bool8 ClosePrompt(void); +static bool8 ClosePromptAfterDeleteAll(void); +static bool8 OpenKeyboard(void); +static bool8 CloseKeyboard(void); +static bool8 OpenWordSelect(void); +static bool8 CloseWordSelect(void); +static bool8 ShowConfirmLyricsPrompt(void); +static bool8 ReturnToKeyboard(void); +static bool8 UpdateKeyboardCursor(void); +static bool8 GroupNamesScrollDown(void); +static bool8 GroupNamesScrollUp(void); +static bool8 UpdateWordSelectCursor(void); +static bool8 WordSelectScrollUp(void); +static bool8 WordSelectScrollDown(void); +static bool8 WordSelectPageScrollUp(void); +static bool8 WordSelectPageScrollDown(void); +static bool8 SwitchKeyboardMode(void); +static bool8 ShowCreateQuizMsg(void); +static bool8 ShowSelectAnswerMsg(void); +static bool8 ShowSongTooShortMsg(void); +static bool8 ShowCantDeleteLyricsMsg(void); +static bool8 ShowCombineTwoWordsMsg(void); +static bool8 ShowCantExitMsg(void); +static void SetMainCursorPos(u8, u8); static int GetFooterOptionXOffset(int); -static void sub_811DF90(void); -static void sub_811D104(u8); -static void sub_811D214(u8); -static void sub_811DFB0(void); -static void sub_811D6D4(void); -static void sub_811D9CC(int); -static void sub_811E3AC(void); -static bool8 sub_811E418(void); -static void sub_811DFC8(void); -static void sub_811E6E0(int); -static bool8 sub_811DAA4(void); -static void sub_811E64C(void); -static void sub_811E050(void); -static void sub_811E4AC(void); -static void sub_811E6B0(void); -static void sub_811E55C(void); -static bool8 sub_811E4D0(void); -static bool8 sub_811E5B8(void); -static void sub_811E578(void); -static void sub_811E088(void); -static void sub_811DDAC(s16, u8); -static bool8 sub_811DE10(void); -static void sub_811D9B4(void); -static void sub_811D698(u32); -static void sub_811E288(void); -static void sub_811E794(void); -static void sub_811E380(void); -static void sub_811E7F8(void); -static void sub_811E30C(void); -static void sub_811D7A4(void); -static void sub_811D7C8(void); -static int sub_811DE48(void); -static void sub_811D7EC(void); -static void sub_811D830(void); -static void sub_811D058(u8, u8, const u8 *, u8, u8, u8, u8, u8, u8); -static void sub_811DD84(void); -static void sub_811D6F4(void); -static void PrintEasyChatKeyboardText(void); -static void sub_811D794(void); +static void StopMainCursorAnim(void); +static void PrintEasyChatStdMessage(u8); +static void CreateEasyChatYesNoMenu(u8); +static void StartMainCursorAnim(void); +static void PrintKeyboardText(void); +static void InitLowerWindowAnim(int); +static void CreateSideWindowSprites(void); +static bool8 ShowSideWindow(void); +static void CreateRectangleCursorSprites(void); +static void SetScrollIndicatorXPos(bool32); +static bool8 UpdateLowerWindowAnim(void); +static void UpdateScrollIndicatorsVisibility(void); +static void DestroyRectangleCursorSprites(void); +static void HideModeWindow(void); +static void HideScrollIndicators(void); +static void SetModeWindowToTransition(void); +static bool8 DestroySideWindowSprites(void); +static bool8 IsModeWindowAnimActive(void); +static void UpdateModeWindowAnim(void); +static void UpdateRectangleCursorPos(void); +static void InitLowerWindowScroll(s16, u8); +static bool8 UpdateLowerWindowScroll(void); +static void ClearWordSelectWindow(void); +static void InitLowerWindowText(u32); +static void CreateWordSelectCursorSprite(void); +static void UpdateStartSelectButtonsVisibility(void); +static void DestroyWordSelectCursorSprite(void); +static void HideStartSelectButtons(void); +static void UpdateWordSelectCursorPos(void); +static void PrintWordSelectNextRowDown(void); +static void PrintWordSelectNextRowUp(void); +static int GetLowerWindowScrollOffset(void); +static void PrintWordSelectRowsPageDown(void); +static void PrintWordSelectRowsPageUp(void); +static void PrintEasyChatTextWithColors(u8, u8, const u8 *, u8, u8, u8, u8, u8, u8); +static void ResetLowerWindowScroll(void); +static void PrintKeyboardGroupNames(void); +static void PrintKeyboardAlphabet(void); +static void PrintInitialWordSelectText(void); static const u8 *GetEasyChatWordGroupName(u8); -static void sub_811D864(u8, u8); -static void sub_811D950(u8, u8); -static void sub_811DADC(u8); -static void sub_811DC28(int, int, int, int); -static void sub_811E0EC(s8, s8); -static void sub_811E1A4(s8, s8); -static void sub_811E2DC(struct Sprite *); -static void sub_811E34C(u8, u8); +static void PrintWordSelectText(u8, u8); +static void EraseWordSelectRows(u8, u8); +static void DrawLowerWindowFrame(u8); +static void BufferLowerWindowFrame(int, int, int, int); +static void SetRectangleCursorPos_GroupMode(s8, s8); +static void SetRectangleCursorPos_AlphabetMode(s8, s8); +static void SpriteCB_WordSelectCursor(struct Sprite *); +static void SetWordSelectCursorPos(u8, u8); static bool8 EasyChatIsNationalPokedexEnabled(void); static u16 GetRandomUnlockedEasyChatPokemon(void); -static void sub_811F2D4(void); -static void sub_811F46C(void); +static void SetUnlockedEasyChatGroups(void); +static void SetUnlockedWordsByAlphabet(void); static u8 *CopyEasyChatWordPadded(u8 *, u16, u16); -static u8 sub_811F860(u16); -static u16 sub_811F5C4(u16); -static u16 sub_811F6B8(u16); -static bool8 sub_811F764(u16, u8); -static int sub_811F838(u16); +static u8 IsEasyChatWordUnlocked(u16); +static u16 SetSelectedWordGroup_GroupMode(u16); +static u16 SetSelectedWordGroup_AlphabetMode(u16); +static bool8 IsEasyChatIndexAndGroupUnlocked(u16, u8); +static int IsRestrictedWordSpecies(u16); static void DoQuizAnswerEasyChatScreen(void); static void DoQuizQuestionEasyChatScreen(void); static void DoQuizSetAnswerEasyChatScreen(void); static void DoQuizSetQuestionEasyChatScreen(void); -struct Unk8597530 -{ - u16 word; - MainCallback callback; +#define PALTAG_TRIANGLE_CURSOR 0 +#define PALTAG_RECTANGLE_CURSOR 1 +#define PALTAG_MISC_UI 2 +#define PALTAG_RS_INTERVIEW_FRAME 3 + +#define GFXTAG_TRIANGLE_CURSOR 0 +#define GFXTAG_RECTANGLE_CURSOR 1 +#define GFXTAG_SCROLL_INDICATOR 2 +#define GFXTAG_START_SELECT_BUTTONS 3 +#define GFXTAG_MODE_WINDOW 4 +#define GFXTAG_RS_INTERVIEW_FRAME 5 +#define GFXTAG_BUTTON_WINDOW 6 + +// State values for sEasyChatScreen->inputState +// Control which input handler to use in HandleEasyChatInput +enum { + INPUTSTATE_PHRASE, + INPUTSTATE_MAIN_SCREEN_BUTTONS, + INPUTSTATE_KEYBOARD, + INPUTSTATE_WORD_SELECT, + INPUTSTATE_EXIT_PROMPT, + INPUTSTATE_DELETE_ALL_YES_NO, + INPUTSTATE_CONFIRM_WORDS_YES_NO, + INPUTSTATE_QUIZ_QUESTION, + INPUTSTATE_WAIT_FOR_MSG, + INPUTSTATE_START_CONFIRM_LYRICS, + INPUTSTATE_CONFIRM_LYRICS_YES_NO, +}; + +// Task states for the 'main' task, Task_EasyChatScreen +enum { + MAINSTATE_FADE_IN, + MAINSTATE_HANDLE_INPUT, + MAINSTATE_RUN_FUNC, + MAINSTATE_TO_QUIZ_LADY, + MAINSTATE_EXIT, + MAINSTATE_WAIT_FADE_IN, +}; + +// IDs provided to PrintEasyChatStdMessage to print a standard message +enum { + MSG_INSTRUCTIONS, + MSG_CONFIRM_DELETE, + MSG_CONFIRM_EXIT, + MSG_CONFIRM, + MSG_CREATE_QUIZ, + MSG_SELECT_ANSWER, + MSG_SONG_TOO_SHORT, + MSG_CANT_DELETE_LYRICS, + MSG_COMBINE_TWO_WORDS, + MSG_CANT_QUIT, +}; + +// IDs for supplementary Easy Chat functions +// Returned by the input handler functions, and run +// in the main task (MAINSTATE_RUN_FUNC) +enum { + ECFUNC_NONE, + ECFUNC_REPRINT_PHRASE, + ECFUNC_UPDATE_MAIN_CURSOR, + ECFUNC_UPDATE_MAIN_CURSOR_ON_BUTTONS, + ECFUNC_PROMPT_DELETE_ALL, + ECFUNC_PROMPT_EXIT, + ECFUNC_PROMPT_CONFIRM, + ECFUNC_CLOSE_PROMPT, + ECFUNC_CLOSE_PROMPT_AFTER_DELETE, + ECFUNC_OPEN_KEYBOARD, + ECFUNC_CLOSE_KEYBOARD, + ECFUNC_OPEN_WORD_SELECT, + ECFUNC_CLOSE_WORD_SELECT, + ECFUNC_PROMPT_CONFIRM_LYRICS, + ECFUNC_RETURN_TO_KEYBOARD, + ECFUNC_UPDATE_KEYBOARD_CURSOR, + ECFUNC_GROUP_NAMES_SCROLL_DOWN, + ECFUNC_GROUP_NAMES_SCROLL_UP, + ECFUNC_UPDATE_WORD_SELECT_CURSOR, + ECFUNC_WORD_SELECT_SCROLL_UP, + ECFUNC_WORD_SELECT_SCROLL_DOWN, + ECFUNC_WORD_SELECT_PAGE_UP, + ECFUNC_WORD_SELECT_PAGE_DOWN, + ECFUNC_SWITCH_KEYBOARD_MODE, + ECFUNC_EXIT, + ECFUNC_QUIZ_QUESTION, + ECFUNC_QUIZ_ANSWER, + ECFUNC_SET_QUIZ_QUESTION, + ECFUNC_SET_QUIZ_ANSWER, + ECFUNC_MSG_CREATE_QUIZ, + ECFUNC_MSG_SELECT_ANSWER, + ECFUNC_MSG_SONG_TOO_SHORT, + ECFUNC_MSG_CANT_DELETE_LYRICS, + ECFUNC_MSG_COMBINE_TWO_WORDS, + ECFUNC_MSG_CANT_EXIT, +}; + +// IDs for InitLowerWindowText +enum { + TEXT_GROUPS, + TEXT_ALPHABET, + TEXT_WORD_SELECT, +}; + +#define NUM_ALPHABET_ROWS 4 +#define NUM_GROUP_NAME_ROWS 4 +#define NUM_WORD_SELECT_ROWS 4 +#define NUM_BUTTON_ROWS 3 + +#define NUM_ALPHABET_COLUMNS 7 +#define NUM_GROUP_NAME_COLUMNS 2 +#define NUM_WORD_SELECT_COLUMNS 2 + +enum { + FRAMEID_GENERAL_2x2, + FRAMEID_GENERAL_2x3, + FRAMEID_MAIL, + FRAMEID_COMBINE_TWO_WORDS, + FRAMEID_INTERVIEW_SHOW_PERSON, + FRAMEID_INTERVIEW, + FRAMEID_QUIZ_ANSWER, + FRAMEID_QUIZ_QUESTION, + FRAMEID_QUIZ_SET_QUESTION, +}; + +// IDs for the footer row of buttons on the main screen +enum { + FOOTER_NORMAL, + FOOTER_QUIZ, + FOOTER_ANSWER, + NUM_FOOTER_TYPES }; -// Lilycove Quiz Lady -static const struct Unk8597530 sUnknown_08597530[] = { +enum { + INPUT_RIGHT, + INPUT_LEFT, + INPUT_UP, + INPUT_DOWN, + INPUT_START, + INPUT_SELECT, +}; + +// Types of animations for the lower window (keyboard/word select), given to InitLowerWindowAnim +enum { + WINANIM_OPEN_KEYBOARD, + WINANIM_CLOSE_KEYBOARD, + WINANIM_OPEN_WORD_SELECT, + WINANIM_CLOSE_WORD_SELECT, + WINANIM_RETURN_TO_KEYBOARD, + WINANIM_KEYBOARD_SWITCH_OUT, + WINANIM_KEYBOARD_SWITCH_IN, +}; + +// Values for text frame tilemap +#define FRAME_OFFSET_ORANGE 0x1000 // Orange frame, for phrase text +#define FRAME_OFFSET_GREEN 0x4000 // Green frame, for keyboard/word select + +#define FRAME_TILE_TRANSPARENT 0x0 +#define FRAME_TILE_TOP_L_CORNER 0x1 +#define FRAME_TILE_TOP_EDGE 0x2 +#define FRAME_TILE_TOP_R_CORNER 0x3 +#define FRAME_TILE_L_EDGE 0x5 +#define FRAME_TILE_R_EDGE 0x7 +#define FRAME_TILE_BOTTOM_L_CORNER 0x9 +#define FRAME_TILE_BOTTOM_EDGE 0xA +#define FRAME_TILE_BOTTOM_R_CORNER 0xB + +struct +{ + u16 funcId; + MainCallback callback; +} static const sQuizLadyEasyChatScreens[] = { { - .word = 26, + .funcId = ECFUNC_QUIZ_ANSWER, .callback = DoQuizAnswerEasyChatScreen, }, { - .word = 25, + .funcId = ECFUNC_QUIZ_QUESTION, .callback = DoQuizQuestionEasyChatScreen, }, { - .word = 28, + .funcId = ECFUNC_SET_QUIZ_ANSWER, .callback = DoQuizSetAnswerEasyChatScreen, }, { - .word = 27, + .funcId = ECFUNC_SET_QUIZ_QUESTION, .callback = DoQuizSetQuestionEasyChatScreen, }, }; @@ -265,7 +419,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_PROFILE, .numColumns = 2, .numRows = 2, - .frameId = 0, + .frameId = FRAMEID_GENERAL_2x2, .fourFooterOptions = FALSE, .titleText = gText_Profile, .instructionsText1 = gText_CombineFourWordsOrPhrases, @@ -277,7 +431,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_BATTLE_START, .numColumns = 2, .numRows = 3, - .frameId = 1, + .frameId = FRAMEID_GENERAL_2x3, .fourFooterOptions = FALSE, .titleText = gText_AtTheBattlesStart, .instructionsText1 = gText_CombineSixWordsOrPhrases, @@ -289,7 +443,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_BATTLE_WON, .numColumns = 2, .numRows = 3, - .frameId = 1, + .frameId = FRAMEID_GENERAL_2x3, .fourFooterOptions = FALSE, .titleText = gText_UponWinningABattle, .instructionsText1 = gText_CombineSixWordsOrPhrases, @@ -301,7 +455,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_BATTLE_LOST, .numColumns = 2, .numRows = 3, - .frameId = 1, + .frameId = FRAMEID_GENERAL_2x3, .fourFooterOptions = FALSE, .titleText = gText_UponLosingABattle, .instructionsText1 = gText_CombineSixWordsOrPhrases, @@ -313,7 +467,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_MAIL, .numColumns = 2, .numRows = 5, - .frameId = 2, + .frameId = FRAMEID_MAIL, .fourFooterOptions = FALSE, .titleText = NULL, .instructionsText1 = gText_CombineNineWordsOrPhrases, @@ -325,7 +479,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_INTERVIEW, .numColumns = 2, .numRows = 2, - .frameId = 5, + .frameId = FRAMEID_INTERVIEW, .fourFooterOptions = FALSE, .titleText = gText_Interview, .instructionsText1 = gText_CombineFourWordsOrPhrases, @@ -337,7 +491,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_BARD_SONG, .numColumns = 2, .numRows = 3, - .frameId = 1, + .frameId = FRAMEID_GENERAL_2x3, .fourFooterOptions = FALSE, .titleText = gText_TheBardsSong, .instructionsText1 = gText_ChangeJustOneWordOrPhrase, @@ -349,7 +503,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_FAN_CLUB, .numColumns = 1, .numRows = 1, - .frameId = 4, + .frameId = FRAMEID_INTERVIEW_SHOW_PERSON, .fourFooterOptions = FALSE, .titleText = gText_Interview, .instructionsText1 = gText_FindWordsThatDescribeYour, @@ -361,7 +515,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_TRENDY_PHRASE, .numColumns = 2, .numRows = 1, - .frameId = 3, + .frameId = FRAMEID_COMBINE_TWO_WORDS, .fourFooterOptions = FALSE, .titleText = gText_WhatsHipAndHappening, .instructionsText1 = gText_CombineTwoWordsOrPhrases, @@ -373,7 +527,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_QUIZ_QUESTION, .numColumns = 2, .numRows = 5, - .frameId = 7, + .frameId = FRAMEID_QUIZ_QUESTION, .fourFooterOptions = TRUE, .titleText = NULL, .instructionsText1 = gText_AfterYouHaveReadTheQuiz, @@ -385,7 +539,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_QUIZ_ANSWER, .numColumns = 1, .numRows = 1, - .frameId = 6, + .frameId = FRAMEID_QUIZ_ANSWER, .fourFooterOptions = TRUE, .titleText = gText_TheQuizAnswerIs, .instructionsText1 = gText_OutOfTheListedChoices, @@ -397,7 +551,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_QUIZ_SET_QUESTION, .numColumns = 2, .numRows = 5, - .frameId = 8, + .frameId = FRAMEID_QUIZ_SET_QUESTION, .fourFooterOptions = TRUE, .titleText = NULL, .instructionsText1 = gText_CombineNineWordsOrPhrases, @@ -409,7 +563,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_QUIZ_SET_ANSWER, .numColumns = 1, .numRows = 1, - .frameId = 6, + .frameId = FRAMEID_QUIZ_ANSWER, .fourFooterOptions = TRUE, .titleText = gText_TheQuizAnswerIs, .instructionsText1 = gText_PickAWordOrPhraseAnd, @@ -421,7 +575,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_BARD_SONG, .numColumns = 2, .numRows = 3, - .frameId = 1, + .frameId = FRAMEID_GENERAL_2x3, .fourFooterOptions = FALSE, .titleText = gText_TheBardsSong, .instructionsText1 = gText_ChangeJustOneWordOrPhrase, @@ -433,7 +587,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_APPRENTICE, .numColumns = 2, .numRows = 3, - .frameId = 1, + .frameId = FRAMEID_GENERAL_2x3, .fourFooterOptions = FALSE, .titleText = gText_ApprenticesPhrase, .instructionsText1 = gText_FindWordsWhichFit, @@ -445,7 +599,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_GOOD_SAYING, .numColumns = 2, .numRows = 1, - .frameId = 3, + .frameId = FRAMEID_COMBINE_TWO_WORDS, .fourFooterOptions = FALSE, .titleText = gText_GoodSaying, .instructionsText1 = gText_CombineTwoWordsOrPhrases2, @@ -457,7 +611,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_GABBY_AND_TY, .numColumns = 1, .numRows = 1, - .frameId = 4, + .frameId = FRAMEID_INTERVIEW_SHOW_PERSON, .fourFooterOptions = FALSE, .titleText = gText_Interview, .instructionsText1 = gText_FindWordsThatDescribeYour, @@ -469,7 +623,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_BATTLE_TOWER_INTERVIEW, .numColumns = 1, .numRows = 1, - .frameId = 4, + .frameId = FRAMEID_INTERVIEW_SHOW_PERSON, .fourFooterOptions = FALSE, .titleText = gText_Interview, .instructionsText1 = gText_FindWordsThatDescribeYour, @@ -481,7 +635,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_CONTEST_INTERVIEW, .numColumns = 1, .numRows = 1, - .frameId = 4, + .frameId = FRAMEID_INTERVIEW_SHOW_PERSON, .fourFooterOptions = FALSE, .titleText = gText_Interview, .instructionsText1 = gText_FindWordsThatDescribeYour, @@ -493,7 +647,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_FAN_QUESTION, .numColumns = 1, .numRows = 1, - .frameId = 4, + .frameId = FRAMEID_INTERVIEW_SHOW_PERSON, .fourFooterOptions = FALSE, .titleText = gText_FansQuestion, .instructionsText1 = gText_FindWordsWhichFit, @@ -505,7 +659,7 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { .type = EASY_CHAT_TYPE_QUESTIONNAIRE, .numColumns = 2, .numRows = 2, - .frameId = 0, + .frameId = FRAMEID_GENERAL_2x2, .fourFooterOptions = FALSE, .titleText = gText_Questionnaire, .instructionsText1 = gText_CombineFourWordsOrPhrases, @@ -515,14 +669,17 @@ static const struct EasyChatScreenTemplate sEasyChatScreenTemplates[] = { }, }; -static const u8 sUnknown_08597748[][7] = { +// IDs are used indirectly as indexes into gEasyChatWordsByLetterPointers +// 0 is 'Others', 1-26 are the letters A-Z +// This array maps the group IDs to the alphabet keyboard +static const u8 sAlphabetGroupIdMap[NUM_ALPHABET_ROWS][NUM_ALPHABET_COLUMNS] = { { 1, 2, 3, 4, 5, 6, 0}, { 7, 8, 9, 10, 11, 12, 0}, {13, 14, 15, 16, 17, 18, 19}, {20, 21, 22, 23, 24, 25, 26}, }; -static const u16 sMysteryGiftPhrase[] = { +static const u16 sMysteryGiftPhrase[NUM_QUESTIONNAIRE_WORDS] = { EC_WORD_LINK, EC_WORD_TOGETHER, EC_WORD_WITH, @@ -537,81 +694,84 @@ static const u16 sBerryMasterWifePhrases[][2] = { [PHRASE_SUPER_HUSTLE - 1] = {EC_WORD_SUPER, EC_WORD_HUSTLE}, }; -static const u16 sEasyChatTriangleCursorPalette[] = INCBIN_U16("graphics/easy_chat/triangle_cursor.gbapal"); -static const u32 sEasyChatTriangleCursorGfx[] = INCBIN_U32("graphics/easy_chat/triangle_cursor.4bpp"); -static const u32 sEasyChatScrollIndicatorGfx[] = INCBIN_U32("graphics/easy_chat/scroll_indicator.4bpp"); -static const u32 sEasyChatStartSelectButtonsGfx[] = INCBIN_U32("graphics/easy_chat/start_select_buttons.4bpp"); -static const u16 sUnknown_085979C0[] = INCBIN_U16("graphics/misc/interview_frame.gbapal"); -static const u32 sUnknown_085979E0[] = INCBIN_U32("graphics/misc/interview_frame.4bpp.lz"); -static const u16 sUnknown_08597B14[] = INCBIN_U16("graphics/misc/interview_frame_orange.gbapal"); -static const u16 sUnknown_08597B34[] = INCBIN_U16("graphics/misc/interview_frame_green.gbapal"); -static const u32 sUnknown_08597B54[] = INCBIN_U32("graphics/misc/interview_frame_2.4bpp.lz"); -static const u16 sUnknown_08597C1C[] = INCBIN_U16("graphics/misc/8597C1C.gbapal"); -static const u16 sUnknown_08597C24[] = INCBIN_U16("graphics/misc/8597C24.gbapal"); +static const u16 sTriangleCursor_Pal[] = INCBIN_U16("graphics/easy_chat/triangle_cursor.gbapal"); +static const u32 sTriangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/triangle_cursor.4bpp"); +static const u32 sScrollIndicator_Gfx[] = INCBIN_U32("graphics/easy_chat/scroll_indicator.4bpp"); +static const u32 sStartSelectButtons_Gfx[] = INCBIN_U32("graphics/easy_chat/start_select_buttons.4bpp"); +// In Ruby/Sapphire Easy Chat screens had a black background, and when the player & interviewer were present +// on screen the interview_frame gfx was shown behind them. +// In Emerald all Easy Chat screens have a filled background, so these gfx go unused +static const u16 sRSInterviewFrame_Pal[] = INCBIN_U16("graphics/easy_chat/interview_frame.gbapal"); +static const u32 sRSInterviewFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/interview_frame.4bpp.lz"); +static const u16 sTextInputFrameOrange_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_orange.gbapal"); +static const u16 sTextInputFrameGreen_Pal[] = INCBIN_U16("graphics/easy_chat/text_input_frame_green.gbapal"); +static const u32 sTextInputFrame_Gfx[] = INCBIN_U32("graphics/easy_chat/text_input_frame.4bpp.lz"); +static const u16 sTitleText_Pal[] = INCBIN_U16("graphics/easy_chat/title_text.gbapal"); +static const u16 sText_Pal[] = INCBIN_U16("graphics/easy_chat/text.gbapal"); static const struct EasyChatPhraseFrameDimensions sPhraseFrameDimensions[] = { - { + [FRAMEID_GENERAL_2x2] = { .left = 3, .top = 4, .width = 24, .height = 4, - .footerId = 0, + .footerId = FOOTER_NORMAL, }, - { + [FRAMEID_GENERAL_2x3] = { .left = 3, .top = 3, .width = 24, .height = 6, - .footerId = 0, + .footerId = FOOTER_NORMAL, }, - { + [FRAMEID_MAIL] = { .left = 3, .top = 0, .width = 24, .height = 10, - .footerId = 0, + .footerId = FOOTER_NORMAL, }, - { + [FRAMEID_COMBINE_TWO_WORDS] = { .left = 3, .top = 5, .width = 24, .height = 2, - .footerId = 0, + .footerId = FOOTER_NORMAL, }, - { + [FRAMEID_INTERVIEW_SHOW_PERSON] = { .left = 16, .top = 5, .width = 12, .height = 2, - .footerId = 0, + .footerId = FOOTER_NORMAL, }, - { + [FRAMEID_INTERVIEW] = { .left = 3, .top = 4, .width = 24, .height = 4, - .footerId = 0, + .footerId = FOOTER_NORMAL, }, - { + [FRAMEID_QUIZ_ANSWER] = { .left = 9, .top = 4, .width = 12, .height = 2, - .footerId = 1, + .footerId = FOOTER_QUIZ, }, - { + [FRAMEID_QUIZ_QUESTION] = { .left = 5, .top = 3, - .width = 0x14, + .width = 20, .height = 10, - .footerId = 3, + .footerId = NUM_FOOTER_TYPES, }, - { + [FRAMEID_QUIZ_SET_QUESTION] = { .left = 3, .top = 0, .width = 24, .height = 10, - .footerId = 2, + .footerId = FOOTER_ANSWER, }, }; @@ -685,7 +845,7 @@ static const struct WindowTemplate sEasyChatWindowTemplates[] = { DUMMY_WIN_TEMPLATE, }; -static const struct WindowTemplate sEasyChatYesNoWindowTemplate = { +static const struct WindowTemplate sEasyChatYesNoWindowTemplate = { .bg = 0, .tilemapLeft = 22, .tilemapTop = 9, @@ -697,7 +857,7 @@ static const struct WindowTemplate sEasyChatYesNoWindowTemplate = { static const u8 sText_Clear17[] = _("{CLEAR 17}"); -static const u8 *const sEasyChatKeyboardText[] = +static const u8 *const sEasyChatKeyboardAlphabet[NUM_ALPHABET_ROWS] = { gText_EasyChatKeyboard_ABCDEFothers, gText_EasyChatKeyboard_GHIJKL, @@ -705,71 +865,71 @@ static const u8 *const sEasyChatKeyboardText[] = gText_EasyChatKeyboard_TUVWXYZ, }; -static const struct SpriteSheet sEasyChatSpriteSheets[] = { +static const struct SpriteSheet sSpriteSheets[] = { { - .data = sEasyChatTriangleCursorGfx, - .size = 0x0020, - .tag = 0 + .data = sTriangleCursor_Gfx, + .size = 0x20, + .tag = GFXTAG_TRIANGLE_CURSOR }, { - .data = sEasyChatScrollIndicatorGfx, - .size = 0x0100, - .tag = 2 + .data = sScrollIndicator_Gfx, + .size = 0x100, + .tag = GFXTAG_SCROLL_INDICATOR }, { - .data = sEasyChatStartSelectButtonsGfx, - .size = 0x0100, - .tag = 3 + .data = sStartSelectButtons_Gfx, + .size = 0x100, + .tag = GFXTAG_START_SELECT_BUTTONS }, {0} }; -static const struct SpritePalette sEasyChatSpritePalettes[] = { +static const struct SpritePalette sSpritePalettes[] = { { - .data = sEasyChatTriangleCursorPalette, - .tag = 0, + .data = sTriangleCursor_Pal, + .tag = PALTAG_TRIANGLE_CURSOR, }, { - .data = gEasyChatCursor_Pal, - .tag = 1, + .data = gEasyChatRectangleCursor_Pal, + .tag = PALTAG_RECTANGLE_CURSOR, }, { - .data = gEasyChatRightWindow_Pal, - .tag = 2, + .data = gEasyChatButtonWindow_Pal, + .tag = PALTAG_MISC_UI, // The palette is generated from the button window but used for various parts of the UI }, { - .data = sUnknown_085979C0, - .tag = 3, + .data = sRSInterviewFrame_Pal, + .tag = PALTAG_RS_INTERVIEW_FRAME, }, {0} }; -static const struct CompressedSpriteSheet sUnknown_08597CE8[] = { +static const struct CompressedSpriteSheet sCompressedSpriteSheets[] = { { - .data = sUnknown_085979E0, - .size = 0x0800, - .tag = 5, + .data = sRSInterviewFrame_Gfx, + .size = 0x800, + .tag = GFXTAG_RS_INTERVIEW_FRAME, }, { - .data = gEasyChatCursor_Gfx, + .data = gEasyChatRectangleCursor_Gfx, .size = 0x1000, - .tag = 1, + .tag = GFXTAG_RECTANGLE_CURSOR, }, { - .data = gEasyChatRightWindow_Gfx, - .size = 0x0800, - .tag = 6, + .data = gEasyChatButtonWindow_Gfx, + .size = 0x800, + .tag = GFXTAG_BUTTON_WINDOW, }, { .data = gEasyChatMode_Gfx, .size = 0x1000, - .tag = 4, + .tag = GFXTAG_MODE_WINDOW, }, }; -static const u8 sUnknown_08597D08[] = {0, 12, 24, 56, 68, 80, 92}; +static const u8 sAlphabetKeyboardColumnOffsets[NUM_ALPHABET_COLUMNS] = {0, 12, 24, 56, 68, 80, 92}; -static const struct OamData sOamData_8597D10 = { +static const struct OamData sOamData_TriangleCursor = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -785,17 +945,17 @@ static const struct OamData sOamData_8597D10 = { .affineParam = 0, }; -static const struct SpriteTemplate sUnknown_08597D18 = { - .tileTag = 0, - .paletteTag = 0, - .oam = &sOamData_8597D10, +static const struct SpriteTemplate sSpriteTemplate_TriangleCursor = { + .tileTag = PALTAG_TRIANGLE_CURSOR, + .paletteTag = GFXTAG_TRIANGLE_CURSOR, + .oam = &sOamData_TriangleCursor, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_811DF28, + .callback = SpriteCB_Cursor, }; -static const struct OamData sUnknown_08597D30 = { +static const struct OamData sOamData_RectangleCursor = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -811,44 +971,52 @@ static const struct OamData sUnknown_08597D30 = { .affineParam = 0, }; -static const union AnimCmd sUnknown_08597D38[] = { +static const union AnimCmd sAnim_RectangleCursor_OnGroup[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597D40[] = { +static const union AnimCmd sAnim_RectangleCursor_OnButton[] = { ANIMCMD_FRAME(32, 0), ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597D48[] = { +static const union AnimCmd sAnim_RectangleCursor_OnOthers[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597D50[] = { +static const union AnimCmd sAnim_RectangleCursor_OnLetter[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END, }; -static const union AnimCmd *const sUnknown_08597D58[] = { - sUnknown_08597D38, - sUnknown_08597D40, - sUnknown_08597D48, - sUnknown_08597D50, +// Each anim changes the width of the rectangle cursor to fit what it should be selecting +enum { + RECTCURSOR_ANIM_ON_GROUP, + RECTCURSOR_ANIM_ON_BUTTON, + RECTCURSOR_ANIM_ON_OTHERS, + RECTCURSOR_ANIM_ON_LETTER, }; -static const struct SpriteTemplate sUnknown_08597D68 = { - .tileTag = 1, - .paletteTag = 1, - .oam = &sUnknown_08597D30, - .anims = sUnknown_08597D58, +static const union AnimCmd *const sAnims_RectangleCursor[] = { + [RECTCURSOR_ANIM_ON_GROUP] = sAnim_RectangleCursor_OnGroup, + [RECTCURSOR_ANIM_ON_BUTTON] = sAnim_RectangleCursor_OnButton, + [RECTCURSOR_ANIM_ON_OTHERS] = sAnim_RectangleCursor_OnOthers, + [RECTCURSOR_ANIM_ON_LETTER] = sAnim_RectangleCursor_OnLetter, +}; + +static const struct SpriteTemplate sSpriteTemplate_RectangleCursor = { + .tileTag = GFXTAG_RECTANGLE_CURSOR, + .paletteTag = PALTAG_RECTANGLE_CURSOR, + .oam = &sOamData_RectangleCursor, + .anims = sAnims_RectangleCursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_811DF28, + .callback = SpriteCB_Cursor, }; -static const struct OamData sUnknown_08597D80 = { +static const struct OamData sOamData_ModeWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -864,53 +1032,61 @@ static const struct OamData sUnknown_08597D80 = { .affineParam = 0, }; -static const union AnimCmd sUnknown_08597D88[] = { +static const union AnimCmd sAnim_ModeWindow_Hidden[] = { ANIMCMD_FRAME(96, 0), ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597D90[] = { - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(32, 4), +static const union AnimCmd sAnim_ModeWindow_ToGroup[] = { + ANIMCMD_FRAME(64, 4), // Transition frame + ANIMCMD_FRAME(32, 4), // 'Group' frame ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597D9C[] = { - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(0, 4), +static const union AnimCmd sAnim_ModeWindow_ToAlphabet[] = { + ANIMCMD_FRAME(64, 4), // Transition frame + ANIMCMD_FRAME(0, 4), // 'A-Z' frame ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597DA8[] = { - ANIMCMD_FRAME(64, 4), - ANIMCMD_FRAME(96, 0), +static const union AnimCmd sAnim_ModeWindow_ToHidden[] = { + ANIMCMD_FRAME(64, 4), // Transition frame + ANIMCMD_FRAME(96, 0), // Hidden frame ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597DB4[] = { +static const union AnimCmd sAnim_ModeWindow_Transition[] = { ANIMCMD_FRAME(64, 4), ANIMCMD_END, }; -static const union AnimCmd *const sUnknown_08597DBC[] = { - sUnknown_08597D88, - sUnknown_08597D90, - sUnknown_08597D9C, - sUnknown_08597DA8, - sUnknown_08597DB4, +enum { + MODEWINDOW_ANIM_HIDDEN, + MODEWINDOW_ANIM_TO_GROUP, + MODEWINDOW_ANIM_TO_ALPHABET, + MODEWINDOW_ANIM_TO_HIDDEN, + MODEWINDOW_ANIM_TRANSITION, +}; + +static const union AnimCmd *const sAnims_ModeWindow[] = { + [MODEWINDOW_ANIM_HIDDEN] = sAnim_ModeWindow_Hidden, + [MODEWINDOW_ANIM_TO_GROUP] = sAnim_ModeWindow_ToGroup, + [MODEWINDOW_ANIM_TO_ALPHABET] = sAnim_ModeWindow_ToAlphabet, + [MODEWINDOW_ANIM_TO_HIDDEN] = sAnim_ModeWindow_ToHidden, + [MODEWINDOW_ANIM_TRANSITION] = sAnim_ModeWindow_Transition, }; -static const struct SpriteTemplate sUnknown_08597DD0 = { - .tileTag = 4, - .paletteTag = 2, - .oam = &sUnknown_08597D80, - .anims = sUnknown_08597DBC, +static const struct SpriteTemplate sSpriteTemplate_ModeWindow = { + .tileTag = GFXTAG_MODE_WINDOW, + .paletteTag = PALTAG_MISC_UI, + .oam = &sOamData_ModeWindow, + .anims = sAnims_ModeWindow, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct OamData sUnknown_08597DE8 = { +static const struct OamData sOamData_ButtonWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -926,17 +1102,17 @@ static const struct OamData sUnknown_08597DE8 = { .affineParam = 0, }; -static const struct SpriteTemplate sUnknown_08597DF0 = { - .tileTag = 6, - .paletteTag = 2, - .oam = &sUnknown_08597DE8, +static const struct SpriteTemplate sSpriteTemplate_ButtonWindow = { + .tileTag = GFXTAG_BUTTON_WINDOW, + .paletteTag = PALTAG_MISC_UI, + .oam = &sOamData_ButtonWindow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct OamData sUnknown_08597E08 = { +static const struct OamData sOamData_StartSelectButton = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -952,7 +1128,7 @@ static const struct OamData sUnknown_08597E08 = { .affineParam = 0, }; -static const struct OamData gUnknown_08597E10 = { +static const struct OamData sOamData_ScrollIndicator = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, @@ -968,89 +1144,90 @@ static const struct OamData gUnknown_08597E10 = { .affineParam = 0, }; -static const union AnimCmd sUnknown_08597E18[] = { +static const union AnimCmd sAnim_Frame0[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END, }; -static const union AnimCmd sUnknown_08597E20[] = { +static const union AnimCmd sAnim_Frame1[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END, }; -static const union AnimCmd *const sUnknown_08597E28[] = { - sUnknown_08597E18, - sUnknown_08597E20, +// Frame0 is Start button, Frame1 is Select button, both are identical for the scroll indicators +static const union AnimCmd *const sAnims_TwoFrame[] = { + sAnim_Frame0, + sAnim_Frame1, }; -static const struct SpriteTemplate sUnknown_08597E30 = { - .tileTag = 3, - .paletteTag = 2, - .oam = &sUnknown_08597E08, - .anims = sUnknown_08597E28, +static const struct SpriteTemplate sSpriteTemplate_StartSelectButton = { + .tileTag = GFXTAG_START_SELECT_BUTTONS, + .paletteTag = PALTAG_MISC_UI, + .oam = &sOamData_StartSelectButton, + .anims = sAnims_TwoFrame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate sUnknown_08597E48 = { - .tileTag = 2, - .paletteTag = 2, - .oam = &gUnknown_08597E10, - .anims = sUnknown_08597E28, +static const struct SpriteTemplate sSpriteTemplate_ScrollIndicator = { + .tileTag = GFXTAG_SCROLL_INDICATOR, + .paletteTag = PALTAG_MISC_UI, + .oam = &sOamData_ScrollIndicator, + .anims = sAnims_TwoFrame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const u8 sFooterOptionXOffsets[][4] = { - {16, 111, 196, 0}, - {16, 78, 130, 160}, - {16, 80, 134, 170}, +static const u8 sFooterOptionXOffsets[NUM_FOOTER_TYPES][4] = { + [FOOTER_NORMAL] = {16, 111, 196, 0}, + [FOOTER_QUIZ] = {16, 78, 130, 160}, + [FOOTER_ANSWER] = {16, 80, 134, 170}, }; -static const u8 *const sFooterTextOptions[][4] = { - {gText_DelAll, gText_Cancel5, gText_Ok2, NULL}, - {gText_DelAll, gText_Cancel5, gText_Ok2, gText_Quiz}, - {gText_DelAll, gText_Cancel5, gText_Ok2, gText_Answer}, +static const u8 *const sFooterTextOptions[NUM_FOOTER_TYPES][4] = { + [FOOTER_NORMAL] = {gText_DelAll, gText_Cancel5, gText_Ok2, NULL}, + [FOOTER_QUIZ] = {gText_DelAll, gText_Cancel5, gText_Ok2, gText_Quiz}, + [FOOTER_ANSWER] = {gText_DelAll, gText_Cancel5, gText_Ok2, gText_Answer}, }; #include "data/easy_chat/easy_chat_groups.h" #include "data/easy_chat/easy_chat_words_by_letter.h" -const u8 *const gEasyChatGroupNamePointers[] = { - [EC_GROUP_POKEMON] = gEasyChatGroupName_Pokemon, - [EC_GROUP_TRAINER] = gEasyChatGroupName_Trainer, - [EC_GROUP_STATUS] = gEasyChatGroupName_Status, - [EC_GROUP_BATTLE] = gEasyChatGroupName_Battle, - [EC_GROUP_GREETINGS] = gEasyChatGroupName_Greetings, - [EC_GROUP_PEOPLE] = gEasyChatGroupName_People, - [EC_GROUP_VOICES] = gEasyChatGroupName_Voices, - [EC_GROUP_SPEECH] = gEasyChatGroupName_Speech, - [EC_GROUP_ENDINGS] = gEasyChatGroupName_Endings, - [EC_GROUP_FEELINGS] = gEasyChatGroupName_Feelings, - [EC_GROUP_CONDITIONS] = gEasyChatGroupName_Conditions, - [EC_GROUP_ACTIONS] = gEasyChatGroupName_Actions, - [EC_GROUP_LIFESTYLE] = gEasyChatGroupName_Lifestyle, - [EC_GROUP_HOBBIES] = gEasyChatGroupName_Hobbies, - [EC_GROUP_TIME] = gEasyChatGroupName_Time, - [EC_GROUP_MISC] = gEasyChatGroupName_Misc, - [EC_GROUP_ADJECTIVES] = gEasyChatGroupName_Adjectives, - [EC_GROUP_EVENTS] = gEasyChatGroupName_Events, - [EC_GROUP_MOVE_1] = gEasyChatGroupName_Move1, - [EC_GROUP_MOVE_2] = gEasyChatGroupName_Move2, - [EC_GROUP_TRENDY_SAYING] = gEasyChatGroupName_TrendySaying, - [EC_GROUP_POKEMON_2] = gEasyChatGroupName_Pokemon2, +static const u8 *const sEasyChatGroupNamePointers[EC_NUM_GROUPS] = { + [EC_GROUP_POKEMON] = gEasyChatGroupName_Pokemon, + [EC_GROUP_TRAINER] = gEasyChatGroupName_Trainer, + [EC_GROUP_STATUS] = gEasyChatGroupName_Status, + [EC_GROUP_BATTLE] = gEasyChatGroupName_Battle, + [EC_GROUP_GREETINGS] = gEasyChatGroupName_Greetings, + [EC_GROUP_PEOPLE] = gEasyChatGroupName_People, + [EC_GROUP_VOICES] = gEasyChatGroupName_Voices, + [EC_GROUP_SPEECH] = gEasyChatGroupName_Speech, + [EC_GROUP_ENDINGS] = gEasyChatGroupName_Endings, + [EC_GROUP_FEELINGS] = gEasyChatGroupName_Feelings, + [EC_GROUP_CONDITIONS] = gEasyChatGroupName_Conditions, + [EC_GROUP_ACTIONS] = gEasyChatGroupName_Actions, + [EC_GROUP_LIFESTYLE] = gEasyChatGroupName_Lifestyle, + [EC_GROUP_HOBBIES] = gEasyChatGroupName_Hobbies, + [EC_GROUP_TIME] = gEasyChatGroupName_Time, + [EC_GROUP_MISC] = gEasyChatGroupName_Misc, + [EC_GROUP_ADJECTIVES] = gEasyChatGroupName_Adjectives, + [EC_GROUP_EVENTS] = gEasyChatGroupName_Events, + [EC_GROUP_MOVE_1] = gEasyChatGroupName_Move1, + [EC_GROUP_MOVE_2] = gEasyChatGroupName_Move2, + [EC_GROUP_TRENDY_SAYING] = gEasyChatGroupName_TrendySaying, + [EC_GROUP_POKEMON_NATIONAL] = gEasyChatGroupName_Pokemon2, }; -static const u16 sDefaultProfileWords[] = { +static const u16 sDefaultProfileWords[EASY_CHAT_BATTLE_WORDS_COUNT - 2] = { EC_WORD_I_AM, EC_WORD_A, EC_WORD_POKEMON, EC_WORD_FRIEND, }; -static const u16 sDefaultBattleStartWords[] = { +static const u16 sDefaultBattleStartWords[EASY_CHAT_BATTLE_WORDS_COUNT] = { EC_WORD_ARE, EC_WORD_YOU, EC_WORD_READY, @@ -1059,7 +1236,7 @@ static const u16 sDefaultBattleStartWords[] = { EC_WORD_EXCL, }; -static const u16 sUnknown_0859E640[] = { +static const u16 sDefaultBattleWonWords[EASY_CHAT_BATTLE_WORDS_COUNT] = { EC_WORD_YAY, EC_WORD_YAY, EC_WORD_EXCL_EXCL, @@ -1068,7 +1245,7 @@ static const u16 sUnknown_0859E640[] = { EC_WORD_EXCL_EXCL, }; -static const u16 sUnknown_0859E64C[] = { +static const u16 sDefaultBattleLostWords[EASY_CHAT_BATTLE_WORDS_COUNT] = { EC_WORD_TOO, EC_WORD_BAD, EC_WORD_ELLIPSIS, @@ -1077,24 +1254,40 @@ static const u16 sUnknown_0859E64C[] = { EC_WORD_ELLIPSIS, }; -static const u16 sUnknown_0859E658[] = { +static const u16 sRestrictedWordSpecies[] = { SPECIES_DEOXYS, }; -void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback, u8 displayedPersonType) + +// In addition to the task defines below, these two elements +// have their indexes used explicitly because they are 4-byte +// pointers, and occupy the next data element as well. +// SetWordTaskArg/GetWordTaskArg use these defines to +// read the pointer from the two elements +#define TASKIDX_WORDS 2 +#define TASKIDX_EXIT_CALLBACK 4 + +#define tState data[0] +#define tType data[1] +#define tWords data[TASKIDX_WORDS] // Occupies 2 and 3 +#define tExitCallback data[TASKIDX_EXIT_CALLBACK] // Occupies 4 and 5 +#define tFuncId data[6] +#define tPersonType data[7] + +void DoEasyChatScreen(u8 type, u16 *words, MainCallback exitCallback, u8 displayedPersonType) { u8 taskId; ResetTasks(); - taskId = CreateTask(sub_811A2C0, 0); - gTasks[taskId].data[EZCHAT_TASK_TYPE] = type; - gTasks[taskId].data[EZCHAT_TASK_SIZE] = displayedPersonType; - SetWordTaskArg(taskId, EZCHAT_TASK_WORDS, (u32)words); - SetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK, (u32)callback); - SetMainCallback2(MainCallback_EasyChatScreen); + taskId = CreateTask(Task_InitEasyChatScreen, 0); + gTasks[taskId].tType = type; + gTasks[taskId].tPersonType = displayedPersonType; + SetWordTaskArg(taskId, TASKIDX_WORDS, (u32)words); + SetWordTaskArg(taskId, TASKIDX_EXIT_CALLBACK, (u32)exitCallback); + SetMainCallback2(CB2_EasyChatScreen); } -static void MainCallback_EasyChatScreen(void) +static void CB2_EasyChatScreen(void) { RunTasks(); AnimateSprites(); @@ -1102,94 +1295,97 @@ static void MainCallback_EasyChatScreen(void) UpdatePaletteFade(); } -static void VBlankCallback_EasyChatScreen(void) +static void VBlankCB_EasyChatScreen(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } -static void sub_811A2A4(u8 taskId, TaskFunc taskFunc) +static void StartEasyChatScreen(u8 taskId, TaskFunc taskFunc) { gTasks[taskId].func = taskFunc; - gTasks[taskId].data[EZCHAT_TASK_STATE] = 0; + gTasks[taskId].tState = MAINSTATE_FADE_IN; } -static void sub_811A2C0(u8 taskId) +static void Task_InitEasyChatScreen(u8 taskId) { if (!IsUpdateLinkStateCBActive()) { - while (sub_811A428(taskId)); + while (InitEasyChatScreen(taskId)); } else { - if (sub_811A428(taskId) == TRUE) - { + if (InitEasyChatScreen(taskId) == TRUE) return; - } } - sub_811A2A4(taskId, sub_811A2FC); + StartEasyChatScreen(taskId, Task_EasyChatScreen); } -static void sub_811A2FC(u8 taskId) +// After loading, this is the 'main' Easy Chat task +static void Task_EasyChatScreen(u8 taskId) { - u16 v0; + u16 funcId; s16 *data; data = gTasks[taskId].data; - switch (data[EZCHAT_TASK_STATE]) + switch (tState) { - case 0: - SetVBlankCallback(VBlankCallback_EasyChatScreen); - BlendPalettes(0xFFFFFFFF, 16, 0); - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - data[EZCHAT_TASK_STATE] = 5; + case MAINSTATE_FADE_IN: + SetVBlankCallback(VBlankCB_EasyChatScreen); + BlendPalettes(PALETTES_ALL, 16, 0); + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); + tState = MAINSTATE_WAIT_FADE_IN; break; - case 1: - v0 = sub_811AAAC(); - if (sub_811A88C(v0)) + case MAINSTATE_HANDLE_INPUT: + funcId = HandleEasyChatInput(); + if (IsFuncIdForQuizLadyScreen(funcId)) { - BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK); - data[EZCHAT_TASK_STATE] = 3; - data[EZCHAT_TASK_UNK06] = v0; + // Fade to Quiz Lady screen + BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); + tState = MAINSTATE_TO_QUIZ_LADY; + tFuncId = funcId; } - else if (v0 == 0x18) + else if (funcId == ECFUNC_EXIT) { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - data[EZCHAT_TASK_STATE] = 4; + // Fade and exit Easy Chat + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); + tState = MAINSTATE_EXIT; } - else if (v0 != 0) + else if (funcId != ECFUNC_NONE) { PlaySE(SE_SELECT); - sub_811C158(v0); - data[EZCHAT_TASK_STATE] ++; + StartEasyChatFunction(funcId); + tState++; // MAINSTATE_RUN_FUNC } break; - case 2: - if (!sub_811C170()) - data[EZCHAT_TASK_STATE] = 1; + case MAINSTATE_RUN_FUNC: + if (!RunEasyChatFunction()) + tState = MAINSTATE_HANDLE_INPUT; break; - case 3: + case MAINSTATE_TO_QUIZ_LADY: if (!gPaletteFade.active) - sub_811A8A4(data[EZCHAT_TASK_UNK06]); + EnterQuizLadyScreen(tFuncId); break; - case 4: + case MAINSTATE_EXIT: if (!gPaletteFade.active) - sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); + ExitEasyChatScreen((MainCallback)GetWordTaskArg(taskId, TASKIDX_EXIT_CALLBACK)); break; - case 5: + case MAINSTATE_WAIT_FADE_IN: if (!gPaletteFade.active) - data[EZCHAT_TASK_STATE] = 1; + tState = MAINSTATE_HANDLE_INPUT; break; } } -static bool8 sub_811A428(u8 taskId) +// Returns TRUE if still initializing, FALSE when finished +// If an allocation fails it will switch to the exit callback +static bool8 InitEasyChatScreen(u8 taskId) { s16 *data; data = gTasks[taskId].data; - switch (data[EZCHAT_TASK_STATE]) + switch (tState) { case 0: SetVBlankCallback(NULL); @@ -1198,25 +1394,28 @@ static bool8 sub_811A428(u8 taskId) ResetPaletteFade(); break; case 1: - if (!sub_811F28C()) + if (!InitEasyChatScreenWordData()) { - sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); + // Alloc failed, exit + ExitEasyChatScreen((MainCallback)GetWordTaskArg(taskId, TASKIDX_EXIT_CALLBACK)); } break; case 2: - if (!EasyChat_AllocateResources(data[EZCHAT_TASK_TYPE], (u16 *)GetWordTaskArg(taskId, EZCHAT_TASK_WORDS), data[EZCHAT_TASK_SIZE])) + if (!InitEasyChatScreenStruct(tType, (u16 *)GetWordTaskArg(taskId, TASKIDX_WORDS), tPersonType)) { - sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); + // Alloc failed, exit + ExitEasyChatScreen((MainCallback)GetWordTaskArg(taskId, TASKIDX_EXIT_CALLBACK)); } break; case 3: - if (!sub_811BF8C()) + if (!InitEasyChatScreenControl()) { - sub_811A4D0((MainCallback)GetWordTaskArg(taskId, EZCHAT_TASK_MAINCALLBACK)); + // Alloc failed, exit + ExitEasyChatScreen((MainCallback)GetWordTaskArg(taskId, TASKIDX_EXIT_CALLBACK)); } break; case 4: - if (sub_811BFA4()) + if (LoadEasyChatScreen()) { return TRUE; } @@ -1224,15 +1423,15 @@ static bool8 sub_811A428(u8 taskId) default: return FALSE; } - data[EZCHAT_TASK_STATE] ++; + tState++; return TRUE; } -static void sub_811A4D0(MainCallback callback) +static void ExitEasyChatScreen(MainCallback callback) { - sub_811C13C(); - EasyChat_FreeResources(); - sub_811F2B8(); + FreeEasyChatScreenControl(); + FreeEasyChatScreenStruct(); + FreeEasyChatScreenWordData(); FreeAllWindowBuffers(); SetMainCallback2(callback); } @@ -1275,18 +1474,18 @@ void ShowEasyChatScreen(void) words = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanclubOpinions.words[gSpecialVar_0x8006]; displayedPersonType = EASY_CHAT_PERSON_REPORTER_FEMALE; break; - case EASY_CHAT_TYPE_UNK_8: - words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].unkShow04.words; + case EASY_CHAT_TYPE_DUMMY_SHOW: + words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].dummy.words; displayedPersonType = EASY_CHAT_PERSON_REPORTER_MALE; break; case EASY_CHAT_TYPE_TRENDY_PHRASE: words = (u16 *)gStringVar3; - words[0] = gSaveBlock1Ptr->easyChatPairs[0].words[0]; - words[1] = gSaveBlock1Ptr->easyChatPairs[0].words[1]; + words[0] = gSaveBlock1Ptr->dewfordTrends[0].words[0]; + words[1] = gSaveBlock1Ptr->dewfordTrends[0].words[1]; break; case EASY_CHAT_TYPE_GABBY_AND_TY: words = gSaveBlock1Ptr->gabbyAndTyData.quote; - *words = -1; + *words = EC_EMPTY_WORD; displayedPersonType = EASY_CHAT_PERSON_REPORTER_FEMALE; break; case EASY_CHAT_TYPE_CONTEST_INTERVIEW: @@ -1303,7 +1502,7 @@ void ShowEasyChatScreen(void) break; case EASY_CHAT_TYPE_FAN_QUESTION: words = gSaveBlock1Ptr->tvShows[gSpecialVar_0x8005].fanClubSpecial.words; - words[0] = -1; + words[0] = EC_EMPTY_WORD; displayedPersonType = EASY_CHAT_PERSON_BOY; break; case EASY_CHAT_TYPE_QUIZ_ANSWER: @@ -1321,7 +1520,7 @@ void ShowEasyChatScreen(void) words = gSaveBlock2Ptr->apprentices[0].speechWon; break; case EASY_CHAT_TYPE_QUESTIONNAIRE: - words = sub_801B058(); + words = GetQuestionnaireWordsPtr(); break; default: return; @@ -1345,7 +1544,7 @@ static void CB2_QuizLadyQuestion(void) if (!gPaletteFade.active) { lilycoveLady = &gSaveBlock1Ptr->lilycoveLady; - lilycoveLady->quiz.playerAnswer = -1; + lilycoveLady->quiz.playerAnswer = EC_EMPTY_WORD; CleanupOverworldWindowsAndTilemaps(); DoQuizQuestionEasyChatScreen(); } @@ -1359,30 +1558,30 @@ void QuizLadyShowQuizQuestion(void) SetMainCallback2(CB2_QuizLadyQuestion); } -static int sub_811A868(u16 word) +static int GetQuizLadyScreenByFuncId(u16 funcId) { int i; - for (i = 0; i < ARRAY_COUNT(sUnknown_08597530); i ++) + for (i = 0; i < ARRAY_COUNT(sQuizLadyEasyChatScreens); i ++) { - if (word == sUnknown_08597530[i].word) + if (funcId == sQuizLadyEasyChatScreens[i].funcId) return i; } return -1; } -static bool32 sub_811A88C(u16 word) +static bool32 IsFuncIdForQuizLadyScreen(u16 funcId) { - return sub_811A868(word) == -1 ? FALSE : TRUE; + return GetQuizLadyScreenByFuncId(funcId) == -1 ? FALSE : TRUE; } -static void sub_811A8A4(u16 word) +static void EnterQuizLadyScreen(u16 funcId) { int i; - i = sub_811A868(word); + i = GetQuizLadyScreenByFuncId(funcId); ResetTasks(); - sub_811A4D0(sUnknown_08597530[i].callback); + ExitEasyChatScreen(sQuizLadyEasyChatScreens[i].callback); } static void DoQuizAnswerEasyChatScreen(void) @@ -1418,7 +1617,7 @@ static void DoQuizSetQuestionEasyChatScreen(void) EASY_CHAT_PERSON_DISPLAY_NONE); } -static bool8 EasyChat_AllocateResources(u8 type, u16 *words, u8 displayedPersonType) +static bool8 InitEasyChatScreenStruct(u8 type, u16 *words, u8 displayedPersonType) { u8 templateId; int i; @@ -1428,116 +1627,121 @@ static bool8 EasyChat_AllocateResources(u8 type, u16 *words, u8 displayedPersonT return FALSE; sEasyChatScreen->type = type; - sEasyChatScreen->words = words; + sEasyChatScreen->savedPhrase = words; sEasyChatScreen->mainCursorColumn = 0; sEasyChatScreen->mainCursorRow = 0; - sEasyChatScreen->unk_09 = 0; + sEasyChatScreen->inAlphabetMode = FALSE; sEasyChatScreen->displayedPersonType = displayedPersonType; - sEasyChatScreen->unk_13 = 0; + sEasyChatScreen->unused = 0; templateId = GetEachChatScreenTemplateId(type); if (type == EASY_CHAT_TYPE_QUIZ_QUESTION) { - sub_811BDF0(sEasyChatScreen->unk_14); - sEasyChatScreen->titleText = sEasyChatScreen->unk_14; - sEasyChatScreen->state = 7; + GetQuizTitle(sEasyChatScreen->quizTitle); + sEasyChatScreen->titleText = sEasyChatScreen->quizTitle; + sEasyChatScreen->inputState = INPUTSTATE_QUIZ_QUESTION; } else { - sEasyChatScreen->state = 0; + sEasyChatScreen->inputState = INPUTSTATE_PHRASE; sEasyChatScreen->titleText = sEasyChatScreenTemplates[templateId].titleText; } sEasyChatScreen->numColumns = sEasyChatScreenTemplates[templateId].numColumns; sEasyChatScreen->numRows = sEasyChatScreenTemplates[templateId].numRows; - sEasyChatScreen->unk_07 = sEasyChatScreen->numColumns * sEasyChatScreen->numRows; + sEasyChatScreen->maxWords = sEasyChatScreen->numColumns * sEasyChatScreen->numRows; sEasyChatScreen->templateId = templateId; - if (sEasyChatScreen->unk_07 > 9) - sEasyChatScreen->unk_07 = 9; + if (sEasyChatScreen->maxWords > ARRAY_COUNT(sEasyChatScreen->currentPhrase)) + sEasyChatScreen->maxWords = ARRAY_COUNT(sEasyChatScreen->currentPhrase); if (words != NULL) { - CpuCopy16(words, sEasyChatScreen->ecWordBuffer, sEasyChatScreen->unk_07 * sizeof(u16)); + // Phrase starts with words filled in, copy to current phrase + CpuCopy16(words, sEasyChatScreen->currentPhrase, sEasyChatScreen->maxWords * sizeof(u16)); } else { - for (i = 0; i < sEasyChatScreen->unk_07; i ++) - sEasyChatScreen->ecWordBuffer[i] = -1; + // Phrase starts with no words, fill with empty words and save + for (i = 0; i < sEasyChatScreen->maxWords; i ++) + sEasyChatScreen->currentPhrase[i] = EC_EMPTY_WORD; - sEasyChatScreen->words = sEasyChatScreen->ecWordBuffer; + sEasyChatScreen->savedPhrase = sEasyChatScreen->currentPhrase; } - sEasyChatScreen->unk_0d = (sub_811F3AC() - 1) / 2 + 1; + sEasyChatScreen->keyboardLastRow = (GetNumUnlockedEasyChatGroups() - 1) / 2 + 1; return TRUE; } -static void EasyChat_FreeResources(void) +static void FreeEasyChatScreenStruct(void) { if (sEasyChatScreen != NULL) FREE_AND_SET_NULL(sEasyChatScreen); } -static u16 sub_811AAAC(void) -{ - switch (sEasyChatScreen->state) - { - case 0: - return sub_811AB68(); - case 1: - return sub_811ACDC(); - case 2: - return sub_811AE44(); - case 3: - return sub_811AF00(); - case 4: - return sub_811AF8C(); - case 5: - return sub_811B040(); - case 6: - return sub_811AFEC(); - case 7: - return sub_811B08C(); - case 8: - return sub_811B0BC(); - case 9: - return sub_811B0E8(); - case 10: - return sub_811B0F8(); - } - return 0; -} - -bool32 sub_811AB44(void) +// Returns the function ID of the action to take as a result of player's input. +// If no action is needed, returns ECFUNC_NONE +static u16 HandleEasyChatInput(void) +{ + switch (sEasyChatScreen->inputState) + { + case INPUTSTATE_PHRASE: + return HandleEasyChatInput_Phrase(); + case INPUTSTATE_MAIN_SCREEN_BUTTONS: + return HandleEasyChatInput_MainScreenButtons(); + case INPUTSTATE_KEYBOARD: + return HandleEasyChatInput_Keyboard(); + case INPUTSTATE_WORD_SELECT: + return HandleEasyChatInput_WordSelect(); + case INPUTSTATE_EXIT_PROMPT: + return HandleEasyChatInput_ExitPrompt(); + case INPUTSTATE_DELETE_ALL_YES_NO: + return HandleEasyChatInput_DeleteAllYesNo(); + case INPUTSTATE_CONFIRM_WORDS_YES_NO: + return HandleEasyChatInput_ConfirmWordsYesNo(); + case INPUTSTATE_QUIZ_QUESTION: + return HandleEasyChatInput_QuizQuestion(); + case INPUTSTATE_WAIT_FOR_MSG: + return HandleEasyChatInput_WaitForMsg(); + case INPUTSTATE_START_CONFIRM_LYRICS: + return HandleEasyChatInput_StartConfirmLyrics(); + case INPUTSTATE_CONFIRM_LYRICS_YES_NO: + return HandleEasyChatInput_ConfirmLyricsYesNo(); + } + return ECFUNC_NONE; +} + +static bool32 IsCurrentFrame2x5(void) { switch (GetEasyChatScreenFrameId()) { - case 2: - case 7: - case 8: + case FRAMEID_MAIL: + case FRAMEID_QUIZ_QUESTION: + case FRAMEID_QUIZ_SET_QUESTION: return TRUE; } return FALSE; } -static u16 sub_811AB68(void) +// Handles main screen input while cursor is on a word in the phrase +static u16 HandleEasyChatInput_Phrase(void) { do { if (JOY_NEW(A_BUTTON)) { - sub_811BF78(); - sEasyChatScreen->state = 2; - sEasyChatScreen->unk_0a = 0; - sEasyChatScreen->unk_0b = 0; - sEasyChatScreen->unk_0c = 0; - return 9; + ClearUnusedField(); + sEasyChatScreen->inputState = INPUTSTATE_KEYBOARD; + sEasyChatScreen->keyboardColumn = 0; + sEasyChatScreen->keyboardRow = 0; + sEasyChatScreen->keyboardScrollOffset = 0; + return ECFUNC_OPEN_KEYBOARD; } else if (JOY_NEW(B_BUTTON)) { - return sub_811B150(); + return StartConfirmExitPrompt(); } else if (JOY_NEW(START_BUTTON)) { - return sub_811B1B4(); + return TryConfirmWords(); } else if (JOY_NEW(DPAD_UP)) { @@ -1560,37 +1764,42 @@ static u16 sub_811AB68(void) break; } - return 0; + return ECFUNC_NONE; } while (0); + // Handle D-Pad input + + // Wrap row if (sEasyChatScreen->mainCursorRow < 0) sEasyChatScreen->mainCursorRow = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows; - if (sEasyChatScreen->mainCursorRow > sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows) sEasyChatScreen->mainCursorRow = 0; if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows) { + // Moved onto bottom row (buttons) if (sEasyChatScreen->mainCursorColumn > 2) sEasyChatScreen->mainCursorColumn = 2; - sEasyChatScreen->state = 1; - return 3; + sEasyChatScreen->inputState = INPUTSTATE_MAIN_SCREEN_BUTTONS; + return ECFUNC_UPDATE_MAIN_CURSOR_ON_BUTTONS; } + // Wrap column if (sEasyChatScreen->mainCursorColumn < 0) sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1; - if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns) sEasyChatScreen->mainCursorColumn = 0; - if (sub_811AB44() && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4) + // All 2x5 phrases are only 9 words long, exclude the bottom right (10th) position + if (IsCurrentFrame2x5() && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4) sEasyChatScreen->mainCursorColumn = 0; - return 2; + return ECFUNC_UPDATE_MAIN_CURSOR; } -static u16 sub_811ACDC(void) +// Handles main screen input while cursor is below the phrase on one of the buttons, e.g. Del. All or Cancel +static u16 HandleEasyChatInput_MainScreenButtons(void) { do { @@ -1598,24 +1807,24 @@ static u16 sub_811ACDC(void) { switch (sEasyChatScreen->mainCursorColumn) { - case 0: - return sub_811B184(); - case 1: - return sub_811B150(); - case 2: - return sub_811B1B4(); - case 3: - return sub_811B264(); + case 0: // Del. All button + return DoDeleteAllButton(); + case 1: // Cancel button + return StartConfirmExitPrompt(); + case 2: // OK button + return TryConfirmWords(); + case 3: // Quiz/Answer button + return DoQuizButton(); } } if (JOY_NEW(B_BUTTON)) { - return sub_811B150(); + return StartConfirmExitPrompt(); } else if (JOY_NEW(START_BUTTON)) { - return sub_811B1B4(); + return TryConfirmWords(); } else if (JOY_NEW(DPAD_UP)) { @@ -1638,7 +1847,7 @@ static u16 sub_811ACDC(void) break; } - return 0; + return ECFUNC_NONE; } while (0); if (sEasyChatScreen->mainCursorRow == sEasyChatScreenTemplates[sEasyChatScreen->templateId].numRows) @@ -1650,790 +1859,803 @@ static u16 sub_811ACDC(void) if (sEasyChatScreen->mainCursorColumn >= numFooterColumns) sEasyChatScreen->mainCursorColumn = 0; - return 3; + return ECFUNC_UPDATE_MAIN_CURSOR_ON_BUTTONS; } if (sEasyChatScreen->mainCursorColumn >= sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns) sEasyChatScreen->mainCursorColumn = sEasyChatScreenTemplates[sEasyChatScreen->templateId].numColumns - 1; - if (sub_811AB44() && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4) + // All 2x5 phrases are only 9 words long, exclude the bottom right (10th) position + if (IsCurrentFrame2x5() && sEasyChatScreen->mainCursorColumn == 1 && sEasyChatScreen->mainCursorRow == 4) sEasyChatScreen->mainCursorColumn = 0; - sEasyChatScreen->state = 0; - return 2; + sEasyChatScreen->inputState = INPUTSTATE_PHRASE; + return ECFUNC_UPDATE_MAIN_CURSOR; } -static u16 sub_811AE44(void) +static u16 HandleEasyChatInput_Keyboard(void) { if (JOY_NEW(B_BUTTON)) - return sub_811B32C(); + return ExitKeyboardToMainScreen(); if (JOY_NEW(A_BUTTON)) { - if (sEasyChatScreen->unk_0a != -1) - return sub_811B2B0(); + if (sEasyChatScreen->keyboardColumn != -1) + return SelectKeyboardGroup(); - switch (sEasyChatScreen->unk_0b) + // Cursor is in button window + switch (sEasyChatScreen->keyboardRow) { - case 0: - return sub_811B33C(); - case 1: - return sub_811B368(); - case 2: - return sub_811B32C(); + case 0: // Mode button + return StartSwitchKeyboardMode(); + case 1: // Delete button + return DeleteSelectedWord(); + case 2: // Cancel button + return ExitKeyboardToMainScreen(); } } if (JOY_NEW(SELECT_BUTTON)) - return sub_811B33C(); + return StartSwitchKeyboardMode(); if (JOY_REPEAT(DPAD_UP)) - return sub_811B528(2); + return MoveKeyboardCursor(INPUT_UP); if (JOY_REPEAT(DPAD_DOWN)) - return sub_811B528(3); + return MoveKeyboardCursor(INPUT_DOWN); if (JOY_REPEAT(DPAD_LEFT)) - return sub_811B528(1); + return MoveKeyboardCursor(INPUT_LEFT); if (JOY_REPEAT(DPAD_RIGHT)) - return sub_811B528(0); + return MoveKeyboardCursor(INPUT_RIGHT); - return 0; + return ECFUNC_NONE; } -static u16 sub_811AF00(void) +// Input handling for the lower window after a word group has been selected +static u16 HandleEasyChatInput_WordSelect(void) { if (JOY_NEW(B_BUTTON)) { - sEasyChatScreen->state = 2; - return 14; + sEasyChatScreen->inputState = INPUTSTATE_KEYBOARD; + return ECFUNC_RETURN_TO_KEYBOARD; } if (JOY_NEW(A_BUTTON)) - return sub_811B394(); + return SelectNewWord(); if (JOY_NEW(START_BUTTON)) - return sub_811B794(4); + return MoveWordSelectCursor(INPUT_START); if (JOY_NEW(SELECT_BUTTON)) - return sub_811B794(5); + return MoveWordSelectCursor(INPUT_SELECT); if (JOY_REPEAT(DPAD_UP)) - return sub_811B794(2); + return MoveWordSelectCursor(INPUT_UP); if (JOY_REPEAT(DPAD_DOWN)) - return sub_811B794(3); + return MoveWordSelectCursor(INPUT_DOWN); if (JOY_REPEAT(DPAD_LEFT)) - return sub_811B794(1); + return MoveWordSelectCursor(INPUT_LEFT); if (JOY_REPEAT(DPAD_RIGHT)) - return sub_811B794(0); + return MoveWordSelectCursor(INPUT_RIGHT); - return 0; + return ECFUNC_NONE; } -static u16 sub_811AF8C(void) +static u16 HandleEasyChatInput_ExitPrompt(void) { - u8 var0; - switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case MENU_B_PRESSED: // B Button - case 1: // No - sEasyChatScreen->state = sub_811B2A4(); - return 7; - case 0: // Yes + case MENU_B_PRESSED: + case 1: // No (Continue) + sEasyChatScreen->inputState = GetEasyChatBackupState(); + return ECFUNC_CLOSE_PROMPT; + case 0: // Yes (Exit) gSpecialVar_Result = 0; - var0 = sEasyChatScreen->type - EASY_CHAT_TYPE_QUIZ_SET_QUESTION; - if (var0 < 2) - sub_811B3E4(); + if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_QUESTION + || sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_ANSWER) + SaveCurrentPhrase(); - return 24; + return ECFUNC_EXIT; default: - return 0; + return ECFUNC_NONE; } } -static u16 sub_811AFEC(void) +static u16 HandleEasyChatInput_ConfirmWordsYesNo(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case MENU_B_PRESSED: // B Button + case MENU_B_PRESSED: case 1: // No - sEasyChatScreen->state = sub_811B2A4(); - return 7; + sEasyChatScreen->inputState = GetEasyChatBackupState(); + return ECFUNC_CLOSE_PROMPT; case 0: // Yes - sub_811BE9C(); - gSpecialVar_Result = sub_811B4EC(); - sub_811B3E4(); - return 24; + SetSpecialEasyChatResult(); + gSpecialVar_Result = GetEasyChatCompleted(); + SaveCurrentPhrase(); + return ECFUNC_EXIT; default: - return 0; + return ECFUNC_NONE; } } -static u16 sub_811B040(void) +static u16 HandleEasyChatInput_DeleteAllYesNo(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case MENU_B_PRESSED: // B Button + case MENU_B_PRESSED: case 1: // No - sEasyChatScreen->state = 1; - return 7; + sEasyChatScreen->inputState = INPUTSTATE_MAIN_SCREEN_BUTTONS; + return ECFUNC_CLOSE_PROMPT; case 0: // Yes - sub_811B418(); - sEasyChatScreen->state = 1; - return 8; + ResetCurrentPhrase(); + sEasyChatScreen->inputState = INPUTSTATE_MAIN_SCREEN_BUTTONS; + return ECFUNC_CLOSE_PROMPT_AFTER_DELETE; default: - return 0; + return ECFUNC_NONE; } } -static u16 sub_811B08C(void) +static u16 HandleEasyChatInput_QuizQuestion(void) { if (JOY_NEW(A_BUTTON)) - return 26; + return ECFUNC_QUIZ_ANSWER; if (JOY_NEW(B_BUTTON)) - return sub_811B150(); + return StartConfirmExitPrompt(); - return 0; + return ECFUNC_NONE; } -static u16 sub_811B0BC(void) +// A message has been printed. Wait for player to +// press A or B, then return to previous state +static u16 HandleEasyChatInput_WaitForMsg(void) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - sEasyChatScreen->state = sub_811B2A4(); - return 7; + sEasyChatScreen->inputState = GetEasyChatBackupState(); + return ECFUNC_CLOSE_PROMPT; } - return 0; + return ECFUNC_NONE; } -static u16 sub_811B0E8(void) +// Odd, could have been skipped. Just passes to HandleEasyChatInput_ConfirmLyricsYesNo +static u16 HandleEasyChatInput_StartConfirmLyrics(void) { - sEasyChatScreen->state = 10; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_LYRICS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } -static u16 sub_811B0F8(void) +static u16 HandleEasyChatInput_ConfirmLyricsYesNo(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case MENU_B_PRESSED: // B Button + case MENU_B_PRESSED: case 1: // No - sub_811B454(); - sEasyChatScreen->stateBackup = 0; - sEasyChatScreen->state = 8; - return 31; + ResetCurrentPhraseToSaved(); + sEasyChatScreen->inputStateBackup = INPUTSTATE_PHRASE; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_SONG_TOO_SHORT; case 0: // Yes - gSpecialVar_Result = sub_811B4EC(); - sub_811B3E4(); - return 24; + gSpecialVar_Result = GetEasyChatCompleted(); + SaveCurrentPhrase(); + return ECFUNC_EXIT; default: - return 0; + return ECFUNC_NONE; } } -static u16 sub_811B150(void) +static u16 StartConfirmExitPrompt(void) { if (sEasyChatScreen->type == EASY_CHAT_TYPE_APPRENTICE || sEasyChatScreen->type == EASY_CHAT_TYPE_CONTEST_INTERVIEW) { - sEasyChatScreen->stateBackup = sEasyChatScreen->state; - sEasyChatScreen->state = 8; - return 34; + sEasyChatScreen->inputStateBackup = sEasyChatScreen->inputState; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_CANT_EXIT; } else { - sEasyChatScreen->stateBackup = sEasyChatScreen->state; - sEasyChatScreen->state = 4; - return 5; + sEasyChatScreen->inputStateBackup = sEasyChatScreen->inputState; + sEasyChatScreen->inputState = INPUTSTATE_EXIT_PROMPT; + return ECFUNC_PROMPT_EXIT; } } -static int sub_811B184(void) +static int DoDeleteAllButton(void) { - sEasyChatScreen->stateBackup = sEasyChatScreen->state; + sEasyChatScreen->inputStateBackup = sEasyChatScreen->inputState; if (sEasyChatScreen->type != EASY_CHAT_TYPE_BARD_SONG) { - sEasyChatScreen->state = 5; - return 4; + // Show Delete yes/no + sEasyChatScreen->inputState = INPUTSTATE_DELETE_ALL_YES_NO; + return ECFUNC_PROMPT_DELETE_ALL; } else { - sEasyChatScreen->stateBackup = sEasyChatScreen->state; - sEasyChatScreen->state = 8; - return 32; + // Cannot delete lyrics when setting Bard's song + sEasyChatScreen->inputStateBackup = sEasyChatScreen->inputState; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_CANT_DELETE_LYRICS; } } -static u16 sub_811B1B4(void) +static u16 TryConfirmWords(void) { - sEasyChatScreen->stateBackup = sEasyChatScreen->state; + sEasyChatScreen->inputStateBackup = sEasyChatScreen->inputState; if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_QUESTION) { - if (sub_811BD64()) + if (IsQuizQuestionEmpty()) { - sEasyChatScreen->state = 8; - return 29; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_CREATE_QUIZ; } - if (sub_811BDB0()) + if (IsQuizAnswerEmpty()) { - sEasyChatScreen->state = 8; - return 30; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_SELECT_ANSWER; } - sEasyChatScreen->state = 6; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_WORDS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } else if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_ANSWER) { - if (sub_811BDB0()) + if (IsQuizAnswerEmpty()) { - sEasyChatScreen->state = 8; - return 30; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_SELECT_ANSWER; } - if (sub_811BD64()) + if (IsQuizQuestionEmpty()) { - sEasyChatScreen->state = 8; - return 29; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_CREATE_QUIZ; } - sEasyChatScreen->state = 6; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_WORDS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } else if (sEasyChatScreen->type == EASY_CHAT_TYPE_TRENDY_PHRASE || sEasyChatScreen->type == EASY_CHAT_TYPE_GOOD_SAYING) { - if (!sub_811BD2C()) + if (!IsCurrentPhraseFull()) { - sEasyChatScreen->state = 8; - return 33; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_COMBINE_TWO_WORDS; } - sEasyChatScreen->state = 6; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_WORDS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } else if (sEasyChatScreen->type == EASY_CHAT_TYPE_APPRENTICE || sEasyChatScreen->type == EASY_CHAT_TYPE_CONTEST_INTERVIEW) { - if (sub_811BCF4()) + if (IsCurrentPhraseEmpty()) { - sEasyChatScreen->state = 8; - return 34; + sEasyChatScreen->inputState = INPUTSTATE_WAIT_FOR_MSG; + return ECFUNC_MSG_CANT_EXIT; } - sEasyChatScreen->state = 6; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_WORDS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } else if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUESTIONNAIRE) { - sEasyChatScreen->state = 6; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_WORDS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } else { - if (sub_811BCF4() == 1 || !sub_811B4EC()) + if (IsCurrentPhraseEmpty() == TRUE || !GetEasyChatCompleted()) { - sEasyChatScreen->state = 4; - return 5; + sEasyChatScreen->inputState = INPUTSTATE_EXIT_PROMPT; + return ECFUNC_PROMPT_EXIT; } - sEasyChatScreen->state = 6; - return 6; + sEasyChatScreen->inputState = INPUTSTATE_CONFIRM_WORDS_YES_NO; + return ECFUNC_PROMPT_CONFIRM; } } -static int sub_811B264(void) +static int DoQuizButton(void) { - sEasyChatScreen->stateBackup = sEasyChatScreen->state; + sEasyChatScreen->inputStateBackup = sEasyChatScreen->inputState; switch (sEasyChatScreen->type) { case EASY_CHAT_TYPE_QUIZ_ANSWER: - return 25; + return ECFUNC_QUIZ_QUESTION; case EASY_CHAT_TYPE_QUIZ_SET_QUESTION: - sub_811B3E4(); - return 28; + SaveCurrentPhrase(); + return ECFUNC_SET_QUIZ_ANSWER; case EASY_CHAT_TYPE_QUIZ_SET_ANSWER: - sub_811B3E4(); - return 27; + SaveCurrentPhrase(); + return ECFUNC_SET_QUIZ_QUESTION; default: - return 0; + return ECFUNC_NONE; } } -static u8 sub_811B2A4(void) +static u8 GetEasyChatBackupState(void) { - return sEasyChatScreen->stateBackup; + return sEasyChatScreen->inputStateBackup; } -static int sub_811B2B0(void) +static int SelectKeyboardGroup(void) { - u16 var1; + u16 numWords; - if (sEasyChatScreen->unk_09 == 0) + if (!sEasyChatScreen->inAlphabetMode) { - u8 groupId = sub_811F3B8(sub_811B8E8()); - sub_811F548(0, groupId); + u8 groupId = GetUnlockedEasyChatGroupId(GetSelectedGroupIndex()); + SetSelectedWordGroup(FALSE, groupId); } else { - sub_811F548(1, sub_811B908()); + SetSelectedWordGroup(TRUE, GetSelectedAlphabetGroupId()); } - var1 = sub_811F5B0(); - if (var1 == 0) - return 0; + numWords = GetNumWordsInSelectedGroup(); + if (numWords == 0) + return ECFUNC_NONE; - sEasyChatScreen->unk_0f = (var1 - 1) / 2; - sEasyChatScreen->unk_0e = 0; - sEasyChatScreen->unk_10 = 0; - sEasyChatScreen->unk_11 = 0; - sEasyChatScreen->state = 3; - return 11; + sEasyChatScreen->wordSelectLastRow = (numWords - 1) / 2; + sEasyChatScreen->wordSelectScrollOffset = 0; + sEasyChatScreen->wordSelectColumn = 0; + sEasyChatScreen->wordSelectRow = 0; + sEasyChatScreen->inputState = INPUTSTATE_WORD_SELECT; + return ECFUNC_OPEN_WORD_SELECT; } -static int sub_811B32C(void) +static int ExitKeyboardToMainScreen(void) { - sEasyChatScreen->state = 0; - return 10; + sEasyChatScreen->inputState = INPUTSTATE_PHRASE; + return ECFUNC_CLOSE_KEYBOARD; } -static int sub_811B33C(void) +static int StartSwitchKeyboardMode(void) { - sEasyChatScreen->unk_0a = 0; - sEasyChatScreen->unk_0b = 0; - sEasyChatScreen->unk_0c = 0; - if (!sEasyChatScreen->unk_09) - sEasyChatScreen->unk_09 = 1; + sEasyChatScreen->keyboardColumn = 0; + sEasyChatScreen->keyboardRow = 0; + sEasyChatScreen->keyboardScrollOffset = 0; + if (!sEasyChatScreen->inAlphabetMode) + sEasyChatScreen->inAlphabetMode = TRUE; else - sEasyChatScreen->unk_09 = 0; + sEasyChatScreen->inAlphabetMode = FALSE; - return 23; + return ECFUNC_SWITCH_KEYBOARD_MODE; } -static int sub_811B368(void) +static int DeleteSelectedWord(void) { if (sEasyChatScreen->type == EASY_CHAT_TYPE_BARD_SONG) { PlaySE(SE_FAILURE); - return 0; + return ECFUNC_NONE; } else { - sub_811B488(0xFFFF); - return 1; + SetSelectedWord(EC_EMPTY_WORD); + return ECFUNC_REPRINT_PHRASE; } } -static int sub_811B394(void) +static int SelectNewWord(void) { - u16 easyChatWord = sub_811F578(sub_811B940()); - if (sub_811BF88(easyChatWord)) + u16 easyChatWord = GetWordFromSelectedGroup(GetSelectedWordIndex()); + if (DummyWordCheck(easyChatWord)) { + // Never reached. Would disallow selecting certain words PlaySE(SE_FAILURE); - return 0; + return ECFUNC_NONE; } else { - sub_811B488(easyChatWord); + SetSelectedWord(easyChatWord); if (sEasyChatScreen->type != EASY_CHAT_TYPE_BARD_SONG) { - sEasyChatScreen->state = 0; - return 12; + sEasyChatScreen->inputState = INPUTSTATE_PHRASE; + return ECFUNC_CLOSE_WORD_SELECT; } else { - sEasyChatScreen->state = 9; - return 13; + sEasyChatScreen->inputState = INPUTSTATE_START_CONFIRM_LYRICS; + return ECFUNC_PROMPT_CONFIRM_LYRICS; } } } -static void sub_811B3E4(void) +static void SaveCurrentPhrase(void) { int i; - for (i = 0; i < sEasyChatScreen->unk_07; i++) - sEasyChatScreen->words[i] = sEasyChatScreen->ecWordBuffer[i]; + for (i = 0; i < sEasyChatScreen->maxWords; i++) + sEasyChatScreen->savedPhrase[i] = sEasyChatScreen->currentPhrase[i]; } -static void sub_811B418(void) +static void ResetCurrentPhrase(void) { int i; - for (i = 0; i < sEasyChatScreen->unk_07; i++) - sEasyChatScreen->ecWordBuffer[i] = 0xFFFF; + for (i = 0; i < sEasyChatScreen->maxWords; i++) + sEasyChatScreen->currentPhrase[i] = EC_EMPTY_WORD; } -static void sub_811B454(void) +static void ResetCurrentPhraseToSaved(void) { int i; - for (i = 0; i < sEasyChatScreen->unk_07; i++) - sEasyChatScreen->ecWordBuffer[i] = sEasyChatScreen->words[i]; + for (i = 0; i < sEasyChatScreen->maxWords; i++) + sEasyChatScreen->currentPhrase[i] = sEasyChatScreen->savedPhrase[i]; } -static void sub_811B488(u16 easyChatWord) +static void SetSelectedWord(u16 easyChatWord) { - u16 index = sub_811B8C8(); - sEasyChatScreen->ecWordBuffer[index] = easyChatWord; + u16 index = GetWordIndexToReplace(); + sEasyChatScreen->currentPhrase[index] = easyChatWord; } -static u8 sub_811B4AC(void) +// Compare current phrase to the original saved phrase +static bool8 DidPhraseChange(void) { u16 i; - for (i = 0; i < sEasyChatScreen->unk_07; i++) + for (i = 0; i < sEasyChatScreen->maxWords; i++) { - if (sEasyChatScreen->ecWordBuffer[i] != sEasyChatScreen->words[i]) - return 1; + if (sEasyChatScreen->currentPhrase[i] != sEasyChatScreen->savedPhrase[i]) + return TRUE; } - return 0; + return FALSE; } -static int sub_811B4EC(void) +// 'Completed' if the phrase was changed, or in the case of making a quiz, the question and answer were filled out +static bool32 GetEasyChatCompleted(void) { - u8 var0 = sEasyChatScreen->type - EASY_CHAT_TYPE_QUIZ_SET_QUESTION; - if (var0 < 2) + if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_QUESTION + || sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_ANSWER) { - if (sub_811BD64()) - return 0; + if (IsQuizQuestionEmpty()) + return FALSE; - if (sub_811BDB0()) - return 0; + if (IsQuizAnswerEmpty()) + return FALSE; - return 1; + return TRUE; } else { - return sub_811B4AC(); + return DidPhraseChange(); } } -static u16 sub_811B528(int arg0) +static u16 MoveKeyboardCursor(int input) { - if (sEasyChatScreen->unk_0a != -1) + if (sEasyChatScreen->keyboardColumn != -1) { - if (sEasyChatScreen->unk_09 == 0) - return sub_811B568(arg0); + if (!sEasyChatScreen->inAlphabetMode) + return MoveKeyboardCursor_GroupNames(input); else - return sub_811B634(arg0); + return MoveKeyboardCursor_Alphabet(input); } else { - return sub_811B6C4(arg0); + return MoveKeyboardCursor_ButtonWindow(input); } } -static int sub_811B568(u32 arg0) +static int MoveKeyboardCursor_GroupNames(u32 input) { - switch (arg0) + switch (input) { - case 2: - if (sEasyChatScreen->unk_0b != -sEasyChatScreen->unk_0c) + case INPUT_UP: + if (sEasyChatScreen->keyboardRow != -sEasyChatScreen->keyboardScrollOffset) { - if (sEasyChatScreen->unk_0b) + if (sEasyChatScreen->keyboardRow) { - sEasyChatScreen->unk_0b--; - return 15; + sEasyChatScreen->keyboardRow--; + return ECFUNC_UPDATE_KEYBOARD_CURSOR; } else { - sEasyChatScreen->unk_0c--; - return 17; + sEasyChatScreen->keyboardScrollOffset--; + return ECFUNC_GROUP_NAMES_SCROLL_UP; } } break; - case 3: - if (sEasyChatScreen->unk_0b + sEasyChatScreen->unk_0c < sEasyChatScreen->unk_0d - 1) + case INPUT_DOWN: + if (sEasyChatScreen->keyboardRow + sEasyChatScreen->keyboardScrollOffset < sEasyChatScreen->keyboardLastRow - 1) { - int var0; - if (sEasyChatScreen->unk_0b < 3) + int funcId; + if (sEasyChatScreen->keyboardRow < NUM_GROUP_NAME_ROWS - 1) { - sEasyChatScreen->unk_0b++; - var0 = 15; + sEasyChatScreen->keyboardRow++; + funcId = ECFUNC_UPDATE_KEYBOARD_CURSOR; } else { - sEasyChatScreen->unk_0c++; - var0 = 16; + sEasyChatScreen->keyboardScrollOffset++; + funcId = ECFUNC_GROUP_NAMES_SCROLL_DOWN; } - sub_811B978(); - return var0; + ReduceToValidKeyboardColumn(); + return funcId; } break; - case 1: - if (sEasyChatScreen->unk_0a) - sEasyChatScreen->unk_0a--; + case INPUT_LEFT: + if (sEasyChatScreen->keyboardColumn) + sEasyChatScreen->keyboardColumn--; else - sub_811B744(); + SetKeyboardCursorInButtonWindow(); - return 15; - case 0: - if (sEasyChatScreen->unk_0a < 1) + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_RIGHT: + if (sEasyChatScreen->keyboardColumn < 1) { - sEasyChatScreen->unk_0a++; - if (sub_811B9C8()) - sub_811B744(); + sEasyChatScreen->keyboardColumn++; + if (IsSelectedKeyboardIndexInvalid()) + SetKeyboardCursorInButtonWindow(); } else { - sub_811B744(); + SetKeyboardCursorInButtonWindow(); } - return 15; + return ECFUNC_UPDATE_KEYBOARD_CURSOR; } - return 0; + return ECFUNC_NONE; } -static int sub_811B634(u32 arg0) +static int MoveKeyboardCursor_Alphabet(u32 input) { - switch (arg0) + switch (input) { - case 2: - if (sEasyChatScreen->unk_0b > 0) - sEasyChatScreen->unk_0b--; + case INPUT_UP: + if (sEasyChatScreen->keyboardRow > 0) + sEasyChatScreen->keyboardRow--; else - sEasyChatScreen->unk_0b = 3; + sEasyChatScreen->keyboardRow = NUM_ALPHABET_ROWS - 1; - sub_811B978(); - return 15; - case 3: - if (sEasyChatScreen->unk_0b < 3) - sEasyChatScreen->unk_0b++; + ReduceToValidKeyboardColumn(); + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_DOWN: + if (sEasyChatScreen->keyboardRow < NUM_ALPHABET_ROWS - 1) + sEasyChatScreen->keyboardRow++; else - sEasyChatScreen->unk_0b = 0; + sEasyChatScreen->keyboardRow = 0; - sub_811B978(); - return 15; - case 0: - sEasyChatScreen->unk_0a++; - if (sub_811B9C8()) - sub_811B744(); + ReduceToValidKeyboardColumn(); + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_RIGHT: + sEasyChatScreen->keyboardColumn++; + if (IsSelectedKeyboardIndexInvalid()) + SetKeyboardCursorInButtonWindow(); - return 15; - case 1: - sEasyChatScreen->unk_0a--; - if (sEasyChatScreen->unk_0a < 0) - sub_811B744(); + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_LEFT: + sEasyChatScreen->keyboardColumn--; + if (sEasyChatScreen->keyboardColumn < 0) + SetKeyboardCursorInButtonWindow(); - return 15; + return ECFUNC_UPDATE_KEYBOARD_CURSOR; } - return 0; + return ECFUNC_NONE; } -static int sub_811B6C4(u32 arg0) +static int MoveKeyboardCursor_ButtonWindow(u32 input) { - switch (arg0) + switch (input) { - case 2: - if (sEasyChatScreen->unk_0b) - sEasyChatScreen->unk_0b--; + case INPUT_UP: + if (sEasyChatScreen->keyboardRow) + sEasyChatScreen->keyboardRow--; else - sEasyChatScreen->unk_0b = 2; + sEasyChatScreen->keyboardRow = NUM_BUTTON_ROWS - 1; - return 15; - case 3: - if (sEasyChatScreen->unk_0b < 2) - sEasyChatScreen->unk_0b++; + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_DOWN: + if (sEasyChatScreen->keyboardRow < NUM_BUTTON_ROWS - 1) + sEasyChatScreen->keyboardRow++; else - sEasyChatScreen->unk_0b = 0; + sEasyChatScreen->keyboardRow = 0; - return 15; - case 1: - sEasyChatScreen->unk_0b++; - sub_811B768(); - return 15; - case 0: - sEasyChatScreen->unk_0a = 0; - sEasyChatScreen->unk_0b++; - return 15; + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_LEFT: + sEasyChatScreen->keyboardRow++; + SetKeyboardCursorToLastColumn(); + return ECFUNC_UPDATE_KEYBOARD_CURSOR; + case INPUT_RIGHT: + sEasyChatScreen->keyboardColumn = 0; + sEasyChatScreen->keyboardRow++; + return ECFUNC_UPDATE_KEYBOARD_CURSOR; } - return 0; + return ECFUNC_NONE; } -static void sub_811B744(void) +static void SetKeyboardCursorInButtonWindow(void) { - sEasyChatScreen->unk_0a = 0xFF; - if (sEasyChatScreen->unk_0b) - sEasyChatScreen->unk_0b--; + sEasyChatScreen->keyboardColumn = -1; + if (sEasyChatScreen->keyboardRow) + sEasyChatScreen->keyboardRow--; } -static void sub_811B768(void) +static void SetKeyboardCursorToLastColumn(void) { - if (sEasyChatScreen->unk_09 == 0) + if (!sEasyChatScreen->inAlphabetMode) { - sEasyChatScreen->unk_0a = 1; - sub_811B978(); + sEasyChatScreen->keyboardColumn = 1; + ReduceToValidKeyboardColumn(); } else { - sEasyChatScreen->unk_0a = sub_811B960(sEasyChatScreen->unk_0b); + sEasyChatScreen->keyboardColumn = GetLastAlphabetColumn(sEasyChatScreen->keyboardRow); } } -static u16 sub_811B794(u32 arg0) +static u16 MoveWordSelectCursor(u32 input) { - u16 result; - switch (arg0) + u16 funcId; + switch (input) { - case 2: - if (sEasyChatScreen->unk_11 + sEasyChatScreen->unk_0e > 0) + case INPUT_UP: + if (sEasyChatScreen->wordSelectRow + sEasyChatScreen->wordSelectScrollOffset > 0) { - if (sEasyChatScreen->unk_11 > 0) + if (sEasyChatScreen->wordSelectRow > 0) { - sEasyChatScreen->unk_11--; - result = 18; + sEasyChatScreen->wordSelectRow--; + funcId = ECFUNC_UPDATE_WORD_SELECT_CURSOR; } else { - sEasyChatScreen->unk_0e--; - result = 19; + sEasyChatScreen->wordSelectScrollOffset--; + funcId = ECFUNC_WORD_SELECT_SCROLL_UP; } - sub_811B9A0(); - return result; + ReduceToValidWordSelectColumn(); + return funcId; } break; - case 3: - if (sEasyChatScreen->unk_11 + sEasyChatScreen->unk_0e < sEasyChatScreen->unk_0f) + case INPUT_DOWN: + if (sEasyChatScreen->wordSelectRow + sEasyChatScreen->wordSelectScrollOffset < sEasyChatScreen->wordSelectLastRow) { - if (sEasyChatScreen->unk_11 < 3) + if (sEasyChatScreen->wordSelectRow < NUM_WORD_SELECT_ROWS - 1) { - sEasyChatScreen->unk_11++; - result = 18; + sEasyChatScreen->wordSelectRow++; + funcId = ECFUNC_UPDATE_WORD_SELECT_CURSOR; } else { - sEasyChatScreen->unk_0e++; - result = 20; + sEasyChatScreen->wordSelectScrollOffset++; + funcId = ECFUNC_WORD_SELECT_SCROLL_DOWN; } - sub_811B9A0(); - return result; + ReduceToValidWordSelectColumn(); + return funcId; } break; - case 1: - if (sEasyChatScreen->unk_10 > 0) - sEasyChatScreen->unk_10--; + case INPUT_LEFT: + if (sEasyChatScreen->wordSelectColumn > 0) + sEasyChatScreen->wordSelectColumn--; else - sEasyChatScreen->unk_10 = 1; + sEasyChatScreen->wordSelectColumn = 1; - sub_811B9A0(); - return 18; - case 0: - if (sEasyChatScreen->unk_10 < 1) + ReduceToValidWordSelectColumn(); + return ECFUNC_UPDATE_WORD_SELECT_CURSOR; + case INPUT_RIGHT: + if (sEasyChatScreen->wordSelectColumn < 1) { - sEasyChatScreen->unk_10++; - if (sub_811BA1C()) - sEasyChatScreen->unk_10 = 0; + sEasyChatScreen->wordSelectColumn++; + if (IsSelectedWordIndexInvalid()) + sEasyChatScreen->wordSelectColumn = 0; } else { - sEasyChatScreen->unk_10 = 0; + sEasyChatScreen->wordSelectColumn = 0; } - return 18; - case 4: - if (sEasyChatScreen->unk_0e) + return ECFUNC_UPDATE_WORD_SELECT_CURSOR; + case INPUT_START: + // Page scroll up + if (sEasyChatScreen->wordSelectScrollOffset) { - if (sEasyChatScreen->unk_0e > 3) - sEasyChatScreen->unk_0e -= 4; + if (sEasyChatScreen->wordSelectScrollOffset >= NUM_WORD_SELECT_ROWS) + sEasyChatScreen->wordSelectScrollOffset -= NUM_WORD_SELECT_ROWS; else - sEasyChatScreen->unk_0e = 0; + sEasyChatScreen->wordSelectScrollOffset = 0; - return 21; + return ECFUNC_WORD_SELECT_PAGE_UP; } break; - case 5: - if (sEasyChatScreen->unk_0e <= sEasyChatScreen->unk_0f - 4) + case INPUT_SELECT: + // Page scroll down + if (sEasyChatScreen->wordSelectScrollOffset <= sEasyChatScreen->wordSelectLastRow - NUM_WORD_SELECT_ROWS) { - sEasyChatScreen->unk_0e += 4; - if (sEasyChatScreen->unk_0e > sEasyChatScreen->unk_0f - 3) - sEasyChatScreen->unk_0e = sEasyChatScreen->unk_0f + 0xFD; + sEasyChatScreen->wordSelectScrollOffset += NUM_WORD_SELECT_ROWS; + if (sEasyChatScreen->wordSelectScrollOffset > sEasyChatScreen->wordSelectLastRow - NUM_WORD_SELECT_ROWS + 1) + sEasyChatScreen->wordSelectScrollOffset = sEasyChatScreen->wordSelectLastRow - NUM_WORD_SELECT_ROWS + 1; - sub_811B9A0(); - return 22; + ReduceToValidWordSelectColumn(); + return ECFUNC_WORD_SELECT_PAGE_DOWN; } break; } - return 0; + return ECFUNC_NONE; } -static u16 sub_811B8C8(void) +static u16 GetWordIndexToReplace(void) { return (sEasyChatScreen->mainCursorRow * sEasyChatScreen->numColumns) + sEasyChatScreen->mainCursorColumn; } -static u16 sub_811B8E8(void) +static u16 GetSelectedGroupIndex(void) { - return 2 * (sEasyChatScreen->unk_0b + sEasyChatScreen->unk_0c) + sEasyChatScreen->unk_0a; + return NUM_GROUP_NAME_COLUMNS * (sEasyChatScreen->keyboardRow + sEasyChatScreen->keyboardScrollOffset) + sEasyChatScreen->keyboardColumn; } -static int sub_811B908(void) +static int GetSelectedAlphabetGroupId(void) { - int var0 = (u8)sEasyChatScreen->unk_0a < 7 ? sEasyChatScreen->unk_0a : 0; - int var1 = (u8)sEasyChatScreen->unk_0b < 4 ? sEasyChatScreen->unk_0b : 0; - return sUnknown_08597748[var1][var0]; + int column = (u8)sEasyChatScreen->keyboardColumn < NUM_ALPHABET_COLUMNS ? sEasyChatScreen->keyboardColumn : 0; + int row = (u8)sEasyChatScreen->keyboardRow < NUM_ALPHABET_ROWS ? sEasyChatScreen->keyboardRow : 0; + return sAlphabetGroupIdMap[row][column]; } -static u16 sub_811B940(void) +static u16 GetSelectedWordIndex(void) { - return 2 * (sEasyChatScreen->unk_11 + sEasyChatScreen->unk_0e) + sEasyChatScreen->unk_10; + return NUM_WORD_SELECT_COLUMNS * (sEasyChatScreen->wordSelectRow + sEasyChatScreen->wordSelectScrollOffset) + sEasyChatScreen->wordSelectColumn; } -static u8 sub_811B960(u8 arg0) +// Get the index of the last column in the alphabet keyboard, depending on current row +static u8 GetLastAlphabetColumn(u8 row) { - switch (arg0) + switch (row) { case 0: default: - return 6; + return NUM_ALPHABET_COLUMNS - 1; case 1: - return 5; + return NUM_ALPHABET_COLUMNS - 2; // At 6 letters, only the 2nd row (index 1) has less than the max columns + // The 3rd and 4th row have 7 letters, the 1st row has 6 letters and 'Others' } } -static void sub_811B978(void) +static void ReduceToValidKeyboardColumn(void) { - while (sub_811B9C8()) + while (IsSelectedKeyboardIndexInvalid()) { - if (sEasyChatScreen->unk_0a) - sEasyChatScreen->unk_0a--; + if (sEasyChatScreen->keyboardColumn) + sEasyChatScreen->keyboardColumn--; else break; } } -static void sub_811B9A0(void) +static void ReduceToValidWordSelectColumn(void) { - while (sub_811BA1C()) + while (IsSelectedWordIndexInvalid()) { - if (sEasyChatScreen->unk_10) - sEasyChatScreen->unk_10--; + if (sEasyChatScreen->wordSelectColumn) + sEasyChatScreen->wordSelectColumn--; else break; } } -static u8 sub_811B9C8(void) +static bool8 IsSelectedKeyboardIndexInvalid(void) { - if (sEasyChatScreen->unk_09 == 0) - return sub_811B8E8() >= sub_811F3AC() ? 1 : 0; + if (!sEasyChatScreen->inAlphabetMode) + return GetSelectedGroupIndex() >= GetNumUnlockedEasyChatGroups() ? TRUE : FALSE; else - return sEasyChatScreen->unk_0a > sub_811B960(sEasyChatScreen->unk_0b) ? 1 : 0; + return sEasyChatScreen->keyboardColumn > GetLastAlphabetColumn(sEasyChatScreen->keyboardRow) ? TRUE : FALSE; } -static u8 sub_811BA1C(void) +static bool8 IsSelectedWordIndexInvalid(void) { - return sub_811B940() >= sub_811F5B0() ? 1 : 0; + return GetSelectedWordIndex() >= GetNumWordsInSelectedGroup() ? TRUE : FALSE; } static int FooterHasFourOptions(void) @@ -2456,9 +2678,9 @@ const u8 *GetTitleText(void) return sEasyChatScreen->titleText; } -static u16 *GetEasyChatWordBuffer(void) +static u16 *GetCurrentPhrase(void) { - return sEasyChatScreen->ecWordBuffer; + return sEasyChatScreen->currentPhrase; } static u8 GetNumRows(void) @@ -2493,7 +2715,7 @@ static void GetEasyChatConfirmText(const u8 **str1, const u8 **str2) *str2 = sEasyChatScreenTemplates[sEasyChatScreen->templateId].confirmText2; } -static void sub_811BB40(const u8 **str1, const u8 **str2) +static void GetEasyChatConfirmExitText(const u8 **str1, const u8 **str2) { switch (sEasyChatScreen->type) { @@ -2520,75 +2742,75 @@ static void GetEasyChatConfirmDeletionText(const u8 **str1, const u8 **str2) *str2 = gText_BeDeletedThatOkay; } -void sub_811BB9C(u8 *arg0, u8 *arg1) +static void GetKeyboardCursorColAndRow(u8 *column, u8 *row) { - *arg0 = sEasyChatScreen->unk_0a; - *arg1 = sEasyChatScreen->unk_0b; + *column = sEasyChatScreen->keyboardColumn; + *row = sEasyChatScreen->keyboardRow; } -u8 sub_811BBB0(void) +static bool8 GetInAlphabetMode(void) { - return sEasyChatScreen->unk_09; + return sEasyChatScreen->inAlphabetMode; } -u8 sub_811BBBC(void) +static u8 GetKeyboardScrollOffset(void) { - return sEasyChatScreen->unk_0c; + return sEasyChatScreen->keyboardScrollOffset; } -void sub_811BBC8(u8 *arg0, u8 *arg1) +static void GetWordSelectColAndRow(u8 *column, u8 *row) { - *arg0 = sEasyChatScreen->unk_10; - *arg1 = sEasyChatScreen->unk_11; + *column = sEasyChatScreen->wordSelectColumn; + *row = sEasyChatScreen->wordSelectRow; } -u8 sub_811BBDC(void) +static u8 GetWordSelectScrollOffset(void) { - return sEasyChatScreen->unk_0e; + return sEasyChatScreen->wordSelectScrollOffset; } -u8 sub_811BBE8(void) +static u8 GetWordSelectLastRow(void) { - return sEasyChatScreen->unk_0f; + return sEasyChatScreen->wordSelectLastRow; } -static u8 unref_sub_811BBF4(void) +static u8 UnusedDummy(void) { - return 0; + return FALSE; } -int sub_811BBF8(void) +static bool32 CanScrollUp(void) { - switch (sEasyChatScreen->state) + switch (sEasyChatScreen->inputState) { - case 2: - if (sEasyChatScreen->unk_09 == 0 && sEasyChatScreen->unk_0c) - return 1; + case INPUTSTATE_KEYBOARD: + if (!sEasyChatScreen->inAlphabetMode && sEasyChatScreen->keyboardScrollOffset) + return TRUE; break; - case 3: - if (sEasyChatScreen->unk_0e) - return 1; + case INPUTSTATE_WORD_SELECT: + if (sEasyChatScreen->wordSelectScrollOffset) + return TRUE; break; } - return 0; + return FALSE; } -int sub_811BC2C(void) +static bool32 CanScrollDown(void) { - switch (sEasyChatScreen->state) + switch (sEasyChatScreen->inputState) { - case 2: - if (sEasyChatScreen->unk_09 == 0 && sEasyChatScreen->unk_0c + 4 <= sEasyChatScreen->unk_0d - 1) - return 1; + case INPUTSTATE_KEYBOARD: + if (!sEasyChatScreen->inAlphabetMode && sEasyChatScreen->keyboardScrollOffset + NUM_GROUP_NAME_ROWS <= sEasyChatScreen->keyboardLastRow - 1) + return TRUE; break; - case 3: - if (sEasyChatScreen->unk_0e + 4 <= sEasyChatScreen->unk_0f) - return 1; + case INPUTSTATE_WORD_SELECT: + if (sEasyChatScreen->wordSelectScrollOffset + NUM_WORD_SELECT_ROWS <= sEasyChatScreen->wordSelectLastRow) + return TRUE; break; } - return 0; + return FALSE; } static int FooterHasFourOptions_(void) @@ -2602,7 +2824,7 @@ static bool8 IsPhraseDifferentThanPlayerInput(const u16 *phrase, u8 phraseLength for (i = 0; i < phraseLength; i++) { - if (phrase[i] != sEasyChatScreen->ecWordBuffer[i]) + if (phrase[i] != sEasyChatScreen->currentPhrase[i]) return TRUE; } @@ -2627,65 +2849,67 @@ static u8 GetEachChatScreenTemplateId(u8 type) return 0; } -static int sub_811BCF4(void) +static bool32 IsCurrentPhraseEmpty(void) { int i; - for (i = 0; i < sEasyChatScreen->unk_07; i++) + for (i = 0; i < sEasyChatScreen->maxWords; i++) { - if (sEasyChatScreen->ecWordBuffer[i] != 0xFFFF) - return 0; + if (sEasyChatScreen->currentPhrase[i] != EC_EMPTY_WORD) + return FALSE; } - return 1; + return TRUE; } -static int sub_811BD2C(void) +static bool32 IsCurrentPhraseFull(void) { int i; - for (i = 0; i < sEasyChatScreen->unk_07; i++) + for (i = 0; i < sEasyChatScreen->maxWords; i++) { - if (sEasyChatScreen->ecWordBuffer[i] == 0xFFFF) - return 0; + if (sEasyChatScreen->currentPhrase[i] == EC_EMPTY_WORD) + return FALSE; } - return 1; + return TRUE; } -static int sub_811BD64(void) +static int IsQuizQuestionEmpty(void) { int i; struct SaveBlock1 *saveBlock1; if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_QUESTION) - return sub_811BCF4(); + return IsCurrentPhraseEmpty(); saveBlock1 = gSaveBlock1Ptr; for (i = 0; i < QUIZ_QUESTION_LEN; i++) { - if (saveBlock1->lilycoveLady.quiz.question[i] != 0xFFFF) - return 0; + if (saveBlock1->lilycoveLady.quiz.question[i] != EC_EMPTY_WORD) + return FALSE; } - return 1; + return TRUE; } -static int sub_811BDB0(void) +static int IsQuizAnswerEmpty(void) { struct LilycoveLadyQuiz *quiz; if (sEasyChatScreen->type == EASY_CHAT_TYPE_QUIZ_SET_ANSWER) - return sub_811BCF4(); + return IsCurrentPhraseEmpty(); quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; - return quiz->correctAnswer == 0xFFFF ? 1 : 0; + return quiz->correctAnswer == EC_EMPTY_WORD ? TRUE : FALSE; } -static void sub_811BDF0(u8 *arg0) +static void GetQuizTitle(u8 *dst) { u8 name[32]; struct SaveBlock1 *saveBlock1 = gSaveBlock1Ptr; DynamicPlaceholderTextUtil_Reset(); + + // Buffer author's name if (StringLength(saveBlock1->lilycoveLady.quiz.playerName) != 0) { TVShowConvertInternationalString(name, saveBlock1->lilycoveLady.quiz.playerName, saveBlock1->lilycoveLady.quiz.language); @@ -2696,32 +2920,33 @@ static void sub_811BDF0(u8 *arg0) DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gText_Lady); } - DynamicPlaceholderTextUtil_ExpandPlaceholders(arg0, gText_F700sQuiz); + // "<author>'s Quiz" + DynamicPlaceholderTextUtil_ExpandPlaceholders(dst, gText_F700sQuiz); } -static void sub_811BE54(void) +static void BufferCurrentPhraseToStringVar2(void) { int i; - u16 *ecWord; + u16 *phrase; u8 *str; - ecWord = sEasyChatScreen->ecWordBuffer; + phrase = sEasyChatScreen->currentPhrase; str = gStringVar2; i = 0; - while (i < sEasyChatScreen->unk_07) + while (i < sEasyChatScreen->maxWords) { - str = CopyEasyChatWordPadded(str, *ecWord, 0); + str = CopyEasyChatWordPadded(str, *phrase, 0); *str = 0; str++; - ecWord++; + phrase++; i++; } str--; - str[0] = 0xFF; + str[0] = EOS; } -static void sub_811BE9C(void) +static void SetSpecialEasyChatResult(void) { switch (sEasyChatScreen->type) { @@ -2735,8 +2960,8 @@ static void sub_811BE9C(void) gSpecialVar_0x8004 = 0; break; case EASY_CHAT_TYPE_TRENDY_PHRASE: - sub_811BE54(); - gSpecialVar_0x8004 = sub_81226D8(sEasyChatScreen->ecWordBuffer); + BufferCurrentPhraseToStringVar2(); + gSpecialVar_0x8004 = TrySetTrendyPhrase(sEasyChatScreen->currentPhrase); break; case EASY_CHAT_TYPE_GOOD_SAYING: gSpecialVar_0x8004 = DidPlayerInputABerryMasterWifePhrase(); @@ -2761,62 +2986,62 @@ static u16 DidPlayerInputABerryMasterWifePhrase(void) return 0; } -static void sub_811BF78(void) +static void ClearUnusedField(void) { - sEasyChatScreen->unk_13 = 0; + sEasyChatScreen->unused = 0; } -static int sub_811BF88(int easyChatWord) +static bool32 DummyWordCheck(int easyChatWord) { - return 0; + return FALSE; } -static bool8 sub_811BF8C(void) +static bool8 InitEasyChatScreenControl(void) { - if (!sub_811CE94()) - return 0; + if (!InitEasyChatScreenControl_()) + return FALSE; else - return 1; + return TRUE; } -static bool8 sub_811BFA4(void) +static bool8 LoadEasyChatScreen(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sEasyChatBgTemplates, ARRAY_COUNT(sEasyChatBgTemplates)); - SetBgTilemapBuffer(3, sUnknown_0203A11C->unkB00); - SetBgTilemapBuffer(1, sUnknown_0203A11C->unk300); + SetBgTilemapBuffer(3, sScreenControl->bg3TilemapBuffer); + SetBgTilemapBuffer(1, sScreenControl->bg1TilemapBuffer); InitWindows(sEasyChatWindowTemplates); DeactivateAllTextPrinters(); - sub_811CF64(); - sub_811CF04(); + LoadEasyChatPalettes(); + InitEasyChatBgs(); CpuFastFill(0, (void *)OAM, OAM_SIZE); break; case 1: DecompressAndLoadBgGfxUsingHeap(3, gEasyChatWindow_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(3, gEasyChatWindow_Tilemap, 0, 0); - sub_811D60C(); - sub_811D424(sUnknown_0203A11C->unk300); - sub_811D230(); - sub_811E948(); + AdjustBgTilemapForFooter(); + BufferFrameTilemap(sScreenControl->bg1TilemapBuffer); + AddPhraseWindow(); + AddMainScreenButtonWindow(); CopyBgTilemapBufferToVram(3); break; case 2: - DecompressAndLoadBgGfxUsingHeap(1, sUnknown_08597B54, 0, 0, 0); + DecompressAndLoadBgGfxUsingHeap(1, sTextInputFrame_Gfx, 0, 0, 0); CopyBgTilemapBufferToVram(1); break; case 3: - sub_811CFCC(); - sub_811D0BC(); - sub_811D2C8(); - sub_811D684(); + PrintTitle(); + PrintInitialInstructions(); + PrintCurrentPhrase(); + DrawLowerWindow(); break; case 4: - sub_811DE90(); + LoadEasyChatGfx(); if (GetEasyChatScreenType() != EASY_CHAT_TYPE_QUIZ_QUESTION) - sub_811DEC4(); + CreateMainCursorSprite(); break; case 5: if (IsDma3ManagerBusyWithBgCopy()) @@ -2825,7 +3050,7 @@ static bool8 sub_811BFA4(void) } else { - sub_811DE5C(0, 0, 0, 0); + SetWindowDimensions(0, 0, 0, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 @@ -2836,82 +3061,84 @@ static bool8 sub_811BFA4(void) ShowBg(1); ShowBg(2); ShowBg(0); - sub_811E5D4(); - sub_811E720(); - sub_811E828(); + CreateScrollIndicatorSprites(); + CreateStartSelectButtonSprites(); + TryAddInterviewObjectEvents(); } break; default: return FALSE; } - sUnknown_0203A11C->unk0++; + sScreenControl->funcState++; return TRUE; } -static void sub_811C13C(void) -{ - if (sUnknown_0203A11C) - FREE_AND_SET_NULL(sUnknown_0203A11C); -} - -static void sub_811C158(u16 arg0) -{ - sUnknown_0203A11C->unk4 = arg0; - sUnknown_0203A11C->unk0 = 0; - sub_811C170(); -} - -static bool8 sub_811C170(void) -{ - switch (sUnknown_0203A11C->unk4) - { - case 0: return FALSE; - case 1: return sub_811C2D4(); - case 2: return sub_811C30C(); - case 3: return sub_811C3E4(); - case 4: return sub_811C48C(); - case 5: return sub_811C404(); - case 6: return sub_811C448(); - case 7: return sub_811C4D0(); - case 8: return sub_811C518(); - case 9: return sub_811C554(); - case 10: return sub_811C620(); - case 11: return sub_811C830(); - case 12: return sub_811C8F0(); - case 13: return sub_811C99C(); - case 14: return sub_811CA5C(); - case 15: return sub_811C780(); - case 16: return sub_811C78C(); - case 17: return sub_811C7D4(); - case 18: return sub_811CB18(); - case 19: return sub_811CB98(); - case 20: return sub_811CB24(); - case 21: return sub_811CC90(); - case 22: return sub_811CC08(); - case 23: return sub_811C6C0(); - case 24: return FALSE; - case 25: return FALSE; - case 26: return FALSE; - case 27: return FALSE; - case 28: return FALSE; - case 29: return sub_811CD14(); - case 30: return sub_811CD54(); - case 31: return sub_811CD94(); - case 32: return sub_811CDD4(); - case 33: return sub_811CE14(); - case 34: return sub_811CE54(); - default: return FALSE; - } -} - -static bool8 sub_811C2D4(void) -{ - switch (sUnknown_0203A11C->unk0) +static void FreeEasyChatScreenControl(void) +{ + if (sScreenControl) + FREE_AND_SET_NULL(sScreenControl); +} + +static void StartEasyChatFunction(u16 funcId) +{ + sScreenControl->currentFuncId = funcId; + sScreenControl->funcState = 0; + RunEasyChatFunction(); +} + +// Returns FALSE when called function has finished +static bool8 RunEasyChatFunction(void) +{ + switch (sScreenControl->currentFuncId) + { + case ECFUNC_NONE: return FALSE; + case ECFUNC_REPRINT_PHRASE: return ReprintPhrase(); + case ECFUNC_UPDATE_MAIN_CURSOR: return UpdateMainCursor(); + case ECFUNC_UPDATE_MAIN_CURSOR_ON_BUTTONS: return UpdateMainCursorOnButtons(); + case ECFUNC_PROMPT_DELETE_ALL: return ShowConfirmDeleteAllPrompt(); + case ECFUNC_PROMPT_EXIT: return ShowConfirmExitPrompt(); + case ECFUNC_PROMPT_CONFIRM: return ShowConfirmPrompt(); + case ECFUNC_CLOSE_PROMPT: return ClosePrompt(); + case ECFUNC_CLOSE_PROMPT_AFTER_DELETE: return ClosePromptAfterDeleteAll(); + case ECFUNC_OPEN_KEYBOARD: return OpenKeyboard(); + case ECFUNC_CLOSE_KEYBOARD: return CloseKeyboard(); + case ECFUNC_OPEN_WORD_SELECT: return OpenWordSelect(); + case ECFUNC_CLOSE_WORD_SELECT: return CloseWordSelect(); + case ECFUNC_PROMPT_CONFIRM_LYRICS: return ShowConfirmLyricsPrompt(); + case ECFUNC_RETURN_TO_KEYBOARD: return ReturnToKeyboard(); + case ECFUNC_UPDATE_KEYBOARD_CURSOR: return UpdateKeyboardCursor(); + case ECFUNC_GROUP_NAMES_SCROLL_DOWN: return GroupNamesScrollDown(); + case ECFUNC_GROUP_NAMES_SCROLL_UP: return GroupNamesScrollUp(); + case ECFUNC_UPDATE_WORD_SELECT_CURSOR: return UpdateWordSelectCursor(); + case ECFUNC_WORD_SELECT_SCROLL_UP: return WordSelectScrollUp(); + case ECFUNC_WORD_SELECT_SCROLL_DOWN: return WordSelectScrollDown(); + case ECFUNC_WORD_SELECT_PAGE_UP: return WordSelectPageScrollUp(); + case ECFUNC_WORD_SELECT_PAGE_DOWN: return WordSelectPageScrollDown(); + case ECFUNC_SWITCH_KEYBOARD_MODE: return SwitchKeyboardMode(); + case ECFUNC_EXIT: return FALSE; + case ECFUNC_QUIZ_QUESTION: return FALSE; // The 4 quiz functions + case ECFUNC_QUIZ_ANSWER: return FALSE; // 'finish' automatically + case ECFUNC_SET_QUIZ_QUESTION: return FALSE; // because they switch to a + case ECFUNC_SET_QUIZ_ANSWER: return FALSE; // callback in sQuizLadyEasyChatScreens + case ECFUNC_MSG_CREATE_QUIZ: return ShowCreateQuizMsg(); + case ECFUNC_MSG_SELECT_ANSWER: return ShowSelectAnswerMsg(); + case ECFUNC_MSG_SONG_TOO_SHORT: return ShowSongTooShortMsg(); + case ECFUNC_MSG_CANT_DELETE_LYRICS: return ShowCantDeleteLyricsMsg(); + case ECFUNC_MSG_COMBINE_TWO_WORDS: return ShowCombineTwoWordsMsg(); + case ECFUNC_MSG_CANT_EXIT: return ShowCantExitMsg(); + default: return FALSE; + } +} + +// Only used to update the current phrase after a word deletion +static bool8 ReprintPhrase(void) +{ + switch (sScreenControl->funcState) { case 0: - sub_811D2C8(); - sUnknown_0203A11C->unk0++; + PrintCurrentPhrase(); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -2920,29 +3147,29 @@ static bool8 sub_811C2D4(void) return TRUE; } -static bool8 sub_811C30C(void) +static bool8 UpdateMainCursor(void) { u8 i; - u16 *ecWordBuffer; + u16 *currentPhrase; u16 *ecWord; u8 frameId; u8 cursorColumn, cursorRow, numColumns; - s16 var1; + s16 x; int stringWidth; int trueStringWidth; - u8 var2; + u8 y; u8 str[64]; - ecWordBuffer = GetEasyChatWordBuffer(); + currentPhrase = GetCurrentPhrase(); frameId = GetEasyChatScreenFrameId(); cursorColumn = GetMainCursorColumn(); cursorRow = GetMainCursorRow(); numColumns = GetNumColumns(); - ecWord = &ecWordBuffer[cursorRow * numColumns]; - var1 = 8 * sPhraseFrameDimensions[frameId].left + 13; + ecWord = ¤tPhrase[cursorRow * numColumns]; + x = 8 * sPhraseFrameDimensions[frameId].left + 13; for (i = 0; i < cursorColumn; i++) { - if (*ecWord == 0xFFFF) + if (*ecWord == EC_EMPTY_WORD) { stringWidth = 72; } @@ -2953,31 +3180,31 @@ static bool8 sub_811C30C(void) } trueStringWidth = stringWidth + 17; - var1 += trueStringWidth; + x += trueStringWidth; ecWord++; } - var2 = 8 * (sPhraseFrameDimensions[frameId].top + cursorRow * 2); - sub_811DF60(var1, var2 + 8); + y = 8 * (sPhraseFrameDimensions[frameId].top + cursorRow * 2); + SetMainCursorPos(x, y + 8); return FALSE; } -static bool8 sub_811C3E4(void) +static bool8 UpdateMainCursorOnButtons(void) { u8 xOffset = GetFooterOptionXOffset(GetMainCursorColumn()); - sub_811DF60(xOffset, 96); + SetMainCursorPos(xOffset, 96); return FALSE; } -static bool8 sub_811C404(void) +static bool8 ShowConfirmExitPrompt(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(2); - sub_811D214(1); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_CONFIRM_EXIT); + CreateEasyChatYesNoMenu(1); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -2986,15 +3213,15 @@ static bool8 sub_811C404(void) return TRUE; } -static bool8 sub_811C448(void) +static bool8 ShowConfirmPrompt(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(3); - sub_811D214(0); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_CONFIRM); + CreateEasyChatYesNoMenu(0); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3003,15 +3230,15 @@ static bool8 sub_811C448(void) return TRUE; } -static bool8 sub_811C48C(void) +static bool8 ShowConfirmDeleteAllPrompt(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(1); - sub_811D214(1); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_CONFIRM_DELETE); + CreateEasyChatYesNoMenu(1); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3020,16 +3247,16 @@ static bool8 sub_811C48C(void) return TRUE; } -static bool8 sub_811C4D0(void) +static bool8 ClosePrompt(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DFB0(); - sub_811D104(0); - sub_811D2C8(); + StartMainCursorAnim(); + PrintEasyChatStdMessage(MSG_INSTRUCTIONS); + PrintCurrentPhrase(); ShowBg(0); - sUnknown_0203A11C->unk0++; + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3038,15 +3265,15 @@ static bool8 sub_811C4D0(void) return TRUE; } -static bool8 sub_811C518(void) +static bool8 ClosePromptAfterDeleteAll(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DFB0(); - sub_811D104(0); - sub_811D2C8(); - sUnknown_0203A11C->unk0++; + StartMainCursorAnim(); + PrintEasyChatStdMessage(MSG_INSTRUCTIONS); + PrintCurrentPhrase(); + sScreenControl->funcState++; // Fall through case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3055,42 +3282,42 @@ static bool8 sub_811C518(void) return TRUE; } -static bool8 sub_811C554(void) +static bool8 OpenKeyboard(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); + StopMainCursorAnim(); HideBg(0); - sub_811DE5C(0, 0, 0, 0); - sub_811D6D4(); - sUnknown_0203A11C->unk0++; + SetWindowDimensions(0, 0, 0, 0); + PrintKeyboardText(); + sScreenControl->funcState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811D9CC(0); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_OPEN_KEYBOARD); + sScreenControl->funcState++; } break; case 2: - if (!IsDma3ManagerBusyWithBgCopy() && !sub_811DAA4()) - sUnknown_0203A11C->unk0++; + if (!IsDma3ManagerBusyWithBgCopy() && !UpdateLowerWindowAnim()) + sScreenControl->funcState++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811E3AC(); - sUnknown_0203A11C->unk0++; + CreateSideWindowSprites(); + sScreenControl->funcState++; } break; case 4: - if (!sub_811E418()) + if (!ShowSideWindow()) { - sub_811DFC8(); - sub_811E6E0(0); - sub_811E64C(); - sUnknown_0203A11C->unk0++; + CreateRectangleCursorSprites(); + SetScrollIndicatorXPos(FALSE); + UpdateScrollIndicatorsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3101,33 +3328,33 @@ static bool8 sub_811C554(void) return TRUE; } -static bool8 sub_811C620(void) +static bool8 CloseKeyboard(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811E050(); - sub_811E4AC(); - sub_811E6B0(); - sUnknown_0203A11C->unk0++; + DestroyRectangleCursorSprites(); + HideModeWindow(); + HideScrollIndicators(); + sScreenControl->funcState++; break; case 1: - if (sub_811E4D0() == TRUE) + if (DestroySideWindowSprites() == TRUE) break; - sub_811D9CC(1); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_CLOSE_KEYBOARD); + sScreenControl->funcState++; // Fall through case 2: - if (!sub_811DAA4()) - sUnknown_0203A11C->unk0++; + if (!UpdateLowerWindowAnim()) + sScreenControl->funcState++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811DFB0(); + StartMainCursorAnim(); ShowBg(0); - sUnknown_0203A11C->unk0++; + sScreenControl->funcState++; } break; case 4: @@ -3137,38 +3364,38 @@ static bool8 sub_811C620(void) return TRUE; } -static bool8 sub_811C6C0(void) +static bool8 SwitchKeyboardMode(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811E050(); - sub_811E6B0(); - sub_811E55C(); - sub_811D9CC(5); - sUnknown_0203A11C->unk0++; + DestroyRectangleCursorSprites(); + HideScrollIndicators(); + SetModeWindowToTransition(); + InitLowerWindowAnim(WINANIM_KEYBOARD_SWITCH_OUT); + sScreenControl->funcState++; break; case 1: - if (!sub_811DAA4() && !sub_811E5B8()) + if (!UpdateLowerWindowAnim() && !IsModeWindowAnimActive()) { - sub_811D6D4(); - sUnknown_0203A11C->unk0++; + PrintKeyboardText(); + sScreenControl->funcState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811D9CC(6); - sub_811E578(); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_KEYBOARD_SWITCH_IN); + UpdateModeWindowAnim(); + sScreenControl->funcState++; } break; case 3: - if (!sub_811DAA4() && !sub_811E5B8()) + if (!UpdateLowerWindowAnim() && !IsModeWindowAnimActive()) { - sub_811E64C(); - sub_811DFC8(); - sUnknown_0203A11C->unk0++; + UpdateScrollIndicatorsVisibility(); + CreateRectangleCursorSprites(); + sScreenControl->funcState++; return FALSE; } break; @@ -3179,25 +3406,25 @@ static bool8 sub_811C6C0(void) return TRUE; } -static bool8 sub_811C780(void) +static bool8 UpdateKeyboardCursor(void) { - sub_811E088(); + UpdateRectangleCursorPos(); return FALSE; } -static bool8 sub_811C78C(void) +static bool8 GroupNamesScrollDown(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DDAC(1, 4); - sUnknown_0203A11C->unk0++; + InitLowerWindowScroll(1, 4); + sScreenControl->funcState++; // Fall through case 1: - if (!sub_811DE10()) + if (!UpdateLowerWindowScroll()) { - sub_811E088(); - sub_811E64C(); + UpdateRectangleCursorPos(); + UpdateScrollIndicatorsVisibility(); return FALSE; } break; @@ -3206,19 +3433,19 @@ static bool8 sub_811C78C(void) return TRUE; } -static bool8 sub_811C7D4(void) +static bool8 GroupNamesScrollUp(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DDAC(-1, 4); - sUnknown_0203A11C->unk0++; + InitLowerWindowScroll(-1, 4); + sScreenControl->funcState++; // Fall through case 1: - if (!sub_811DE10()) + if (!UpdateLowerWindowScroll()) { - sub_811E64C(); - sUnknown_0203A11C->unk0++; + UpdateScrollIndicatorsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3229,45 +3456,45 @@ static bool8 sub_811C7D4(void) return TRUE; } -static bool8 sub_811C830(void) +static bool8 OpenWordSelect(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811E050(); - sub_811E4AC(); - sub_811E6B0(); - sUnknown_0203A11C->unk0++; + DestroyRectangleCursorSprites(); + HideModeWindow(); + HideScrollIndicators(); + sScreenControl->funcState++; break; case 1: - if (!sub_811E4D0()) + if (!DestroySideWindowSprites()) { - sub_811D9B4(); - sUnknown_0203A11C->unk0++; + ClearWordSelectWindow(); + sScreenControl->funcState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811D9CC(2); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_OPEN_WORD_SELECT); + sScreenControl->funcState++; } break; case 3: - if (!sub_811DAA4()) + if (!UpdateLowerWindowAnim()) { - sub_811D698(2); - sUnknown_0203A11C->unk0++; + InitLowerWindowText(TEXT_WORD_SELECT); + sScreenControl->funcState++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811E288(); - sub_811E6E0(1); - sub_811E64C(); - sub_811E794(); - sUnknown_0203A11C->unk0++; + CreateWordSelectCursorSprite(); + SetScrollIndicatorXPos(TRUE); + UpdateScrollIndicatorsVisibility(); + UpdateStartSelectButtonsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3278,40 +3505,40 @@ static bool8 sub_811C830(void) return TRUE; } -static bool8 sub_811C8F0(void) +static bool8 CloseWordSelect(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811D2C8(); - sUnknown_0203A11C->unk0++; + PrintCurrentPhrase(); + sScreenControl->funcState++; break; case 1: - sub_811E380(); - sub_811E6B0(); - sub_811E7F8(); - sub_811D9B4(); - sUnknown_0203A11C->unk0++; + DestroyWordSelectCursorSprite(); + HideScrollIndicators(); + HideStartSelectButtons(); + ClearWordSelectWindow(); + sScreenControl->funcState++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811D9CC(3); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_CLOSE_WORD_SELECT); + sScreenControl->funcState++; } break; case 3: - if (!sub_811DAA4()) + if (!UpdateLowerWindowAnim()) { ShowBg(0); - sUnknown_0203A11C->unk0++; + sScreenControl->funcState++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811DFB0(); - sUnknown_0203A11C->unk0++; + StartMainCursorAnim(); + sScreenControl->funcState++; return FALSE; } break; @@ -3322,47 +3549,47 @@ static bool8 sub_811C8F0(void) return TRUE; } -static bool8 sub_811C99C(void) +static bool8 ShowConfirmLyricsPrompt(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811D2C8(); - sUnknown_0203A11C->unk0++; + PrintCurrentPhrase(); + sScreenControl->funcState++; break; case 1: - sub_811E380(); - sub_811E6B0(); - sub_811E7F8(); - sub_811D9B4(); - sUnknown_0203A11C->unk0++; + DestroyWordSelectCursorSprite(); + HideScrollIndicators(); + HideStartSelectButtons(); + ClearWordSelectWindow(); + sScreenControl->funcState++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811D9CC(3); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_CLOSE_WORD_SELECT); + sScreenControl->funcState++; } break; case 3: - if (!sub_811DAA4()) + if (!UpdateLowerWindowAnim()) { - sub_811D104(3); - sUnknown_0203A11C->unk0++; + PrintEasyChatStdMessage(MSG_CONFIRM); + sScreenControl->funcState++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) { ShowBg(0); - sUnknown_0203A11C->unk0++; + sScreenControl->funcState++; } break; case 5: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811DFB0(); - sUnknown_0203A11C->unk0++; + StartMainCursorAnim(); + sScreenControl->funcState++; return FALSE; } break; @@ -3373,45 +3600,45 @@ static bool8 sub_811C99C(void) return TRUE; } -static bool8 sub_811CA5C(void) +static bool8 ReturnToKeyboard(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811E380(); - sub_811E6B0(); - sub_811E7F8(); - sub_811D9B4(); - sUnknown_0203A11C->unk0++; + DestroyWordSelectCursorSprite(); + HideScrollIndicators(); + HideStartSelectButtons(); + ClearWordSelectWindow(); + sScreenControl->funcState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811D9CC(4); - sUnknown_0203A11C->unk0++; + InitLowerWindowAnim(WINANIM_RETURN_TO_KEYBOARD); + sScreenControl->funcState++; } break; case 2: - if (!sub_811DAA4()) + if (!UpdateLowerWindowAnim()) { - sub_811D6D4(); - sUnknown_0203A11C->unk0++; + PrintKeyboardText(); + sScreenControl->funcState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811E3AC(); - sUnknown_0203A11C->unk0++; + CreateSideWindowSprites(); + sScreenControl->funcState++; } break; case 4: - if (!sub_811E418()) + if (!ShowSideWindow()) { - sub_811DFC8(); - sub_811E6E0(0); - sub_811E64C(); - sUnknown_0203A11C->unk0++; + CreateRectangleCursorSprites(); + SetScrollIndicatorXPos(FALSE); + UpdateScrollIndicatorsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3420,34 +3647,34 @@ static bool8 sub_811CA5C(void) return TRUE; } -static bool8 sub_811CB18(void) +static bool8 UpdateWordSelectCursor(void) { - sub_811E30C(); + UpdateWordSelectCursorPos(); return FALSE; } -static bool8 sub_811CB24(void) +static bool8 WordSelectScrollDown(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811D7A4(); - sUnknown_0203A11C->unk0++; + PrintWordSelectNextRowDown(); + sScreenControl->funcState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811DDAC(1, 4); - sUnknown_0203A11C->unk0++; + InitLowerWindowScroll(1, 4); + sScreenControl->funcState++; } break; case 2: - if (!sub_811DE10()) + if (!UpdateLowerWindowScroll()) { - sub_811E30C(); - sub_811E64C(); - sub_811E794(); - sUnknown_0203A11C->unk0++; + UpdateWordSelectCursorPos(); + UpdateScrollIndicatorsVisibility(); + UpdateStartSelectButtonsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3458,27 +3685,27 @@ static bool8 sub_811CB24(void) return TRUE; } -static bool8 sub_811CB98(void) +static bool8 WordSelectScrollUp(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811D7C8(); - sUnknown_0203A11C->unk0++; + PrintWordSelectNextRowUp(); + sScreenControl->funcState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_811DDAC(-1, 4); - sUnknown_0203A11C->unk0++; + InitLowerWindowScroll(-1, 4); + sScreenControl->funcState++; } break; case 2: - if (!sub_811DE10()) + if (!UpdateLowerWindowScroll()) { - sub_811E64C(); - sub_811E794(); - sUnknown_0203A11C->unk0++; + UpdateScrollIndicatorsVisibility(); + UpdateStartSelectButtonsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3489,29 +3716,29 @@ static bool8 sub_811CB98(void) return TRUE; } -static bool8 sub_811CC08(void) +static bool8 WordSelectPageScrollDown(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811D7EC(); - sUnknown_0203A11C->unk0++; + PrintWordSelectRowsPageDown(); + sScreenControl->funcState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - s16 var0 = sub_811BBDC() - sub_811DE48(); - sub_811DDAC(var0, 8); - sUnknown_0203A11C->unk0++; + s16 scrollChange = GetWordSelectScrollOffset() - GetLowerWindowScrollOffset(); + InitLowerWindowScroll(scrollChange, 8); + sScreenControl->funcState++; } break; case 2: - if (!sub_811DE10()) + if (!UpdateLowerWindowScroll()) { - sub_811E30C(); - sub_811E64C(); - sub_811E794(); - sUnknown_0203A11C->unk0++; + UpdateWordSelectCursorPos(); + UpdateScrollIndicatorsVisibility(); + UpdateStartSelectButtonsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3522,28 +3749,28 @@ static bool8 sub_811CC08(void) return TRUE; } -static bool8 sub_811CC90(void) +static bool8 WordSelectPageScrollUp(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811D830(); - sUnknown_0203A11C->unk0++; + PrintWordSelectRowsPageUp(); + sScreenControl->funcState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - s16 var0 = sub_811BBDC() - sub_811DE48(); - sub_811DDAC(var0, 8); - sUnknown_0203A11C->unk0++; + s16 scrollChange = GetWordSelectScrollOffset() - GetLowerWindowScrollOffset(); + InitLowerWindowScroll(scrollChange, 8); + sScreenControl->funcState++; } break; case 2: - if (!sub_811DE10()) + if (!UpdateLowerWindowScroll()) { - sub_811E64C(); - sub_811E794(); - sUnknown_0203A11C->unk0++; + UpdateScrollIndicatorsVisibility(); + UpdateStartSelectButtonsVisibility(); + sScreenControl->funcState++; return FALSE; } break; @@ -3554,14 +3781,14 @@ static bool8 sub_811CC90(void) return TRUE; } -static bool8 sub_811CD14(void) +static bool8 ShowCreateQuizMsg(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(4); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_CREATE_QUIZ); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3570,14 +3797,14 @@ static bool8 sub_811CD14(void) return TRUE; } -static bool8 sub_811CD54(void) +static bool8 ShowSelectAnswerMsg(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(5); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_SELECT_ANSWER); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3586,14 +3813,14 @@ static bool8 sub_811CD54(void) return TRUE; } -static bool8 sub_811CD94(void) +static bool8 ShowSongTooShortMsg(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(6); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_SONG_TOO_SHORT); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3602,14 +3829,14 @@ static bool8 sub_811CD94(void) return TRUE; } -static bool8 sub_811CDD4(void) +static bool8 ShowCantDeleteLyricsMsg(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(7); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_CANT_DELETE_LYRICS); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3618,14 +3845,14 @@ static bool8 sub_811CDD4(void) return TRUE; } -static bool8 sub_811CE14(void) +static bool8 ShowCombineTwoWordsMsg(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(8); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_COMBINE_TWO_WORDS); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3634,14 +3861,14 @@ static bool8 sub_811CE14(void) return TRUE; } -static bool8 sub_811CE54(void) +static bool8 ShowCantExitMsg(void) { - switch (sUnknown_0203A11C->unk0) + switch (sScreenControl->funcState) { case 0: - sub_811DF90(); - sub_811D104(9); - sUnknown_0203A11C->unk0++; + StopMainCursorAnim(); + PrintEasyChatStdMessage(MSG_CANT_QUIT); + sScreenControl->funcState++; break; case 1: return IsDma3ManagerBusyWithBgCopy(); @@ -3650,28 +3877,28 @@ static bool8 sub_811CE54(void) return TRUE; } -static bool8 sub_811CE94(void) +static bool8 InitEasyChatScreenControl_(void) { - sUnknown_0203A11C = Alloc(sizeof(*sUnknown_0203A11C)); - if (!sUnknown_0203A11C) + sScreenControl = Alloc(sizeof(*sScreenControl)); + if (!sScreenControl) return FALSE; - sUnknown_0203A11C->unk0 = 0; - sUnknown_0203A11C->unk2D8 = NULL; - sUnknown_0203A11C->unk2DC = NULL; - sUnknown_0203A11C->unk2E0 = NULL; - sUnknown_0203A11C->unk2E4 = NULL; - sUnknown_0203A11C->unk2E8 = NULL; - sUnknown_0203A11C->unk2EC = NULL; - sUnknown_0203A11C->unk2F0 = NULL; - sUnknown_0203A11C->unk2F4 = NULL; - sUnknown_0203A11C->unk2F8 = NULL; - sUnknown_0203A11C->unk2FC = NULL; - sUnknown_0203A11C->unkA = FooterHasFourOptions_(); + sScreenControl->funcState = 0; + sScreenControl->mainCursorSprite = NULL; + sScreenControl->rectangleCursorSpriteRight = NULL; + sScreenControl->rectangleCursorSpriteLeft = NULL; + sScreenControl->wordSelectCursorSprite = NULL; + sScreenControl->buttonWindowSprite = NULL; + sScreenControl->modeWindowSprite = NULL; + sScreenControl->scrollIndicatorUpSprite = NULL; + sScreenControl->scrollIndicatorDownSprite = NULL; + sScreenControl->startButtonSprite = NULL; + sScreenControl->selectButtonSprite = NULL; + sScreenControl->fourFooterOptions = FooterHasFourOptions_(); return TRUE; } -static void sub_811CF04(void) +static void InitEasyChatBgs(void) { ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); @@ -3684,19 +3911,19 @@ static void sub_811CF04(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); } -static void sub_811CF64(void) +static void LoadEasyChatPalettes(void) { ResetPaletteFade(); LoadPalette(gEasyChatMode_Pal, 0, 32); - LoadPalette(sUnknown_08597B14, 1 * 16, 32); - LoadPalette(sUnknown_08597B34, 4 * 16, 32); - LoadPalette(sUnknown_08597C1C, 10 * 16, 8); - LoadPalette(sUnknown_08597C24, 11 * 16, 12); - LoadPalette(sUnknown_08597C24, 15 * 16, 12); - LoadPalette(sUnknown_08597C24, 3 * 16, 12); + LoadPalette(sTextInputFrameOrange_Pal, 1 * 16, 32); + LoadPalette(sTextInputFrameGreen_Pal, 4 * 16, 32); + LoadPalette(sTitleText_Pal, 10 * 16, 8); + LoadPalette(sText_Pal, 11 * 16, 12); + LoadPalette(sText_Pal, 15 * 16, 12); + LoadPalette(sText_Pal, 3 * 16, 12); } -static void sub_811CFCC(void) +static void PrintTitle(void) { int xOffset; const u8 *titleText = GetTitleText(); @@ -3705,17 +3932,17 @@ static void sub_811CFCC(void) xOffset = GetStringCenterAlignXOffset(1, titleText, 144); FillWindowPixelBuffer(0, PIXEL_FILL(0)); - sub_811D058(0, 1, titleText, xOffset, 1, 0xFF, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + PrintEasyChatTextWithColors(0, 1, titleText, xOffset, 1, TEXT_SPEED_FF, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); PutWindowTilemap(0); CopyWindowToVram(0, 3); } -void sub_811D028(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) +static void PrintEasyChatText(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)) { AddTextPrinterParameterized(windowId, fontId, str, x, y, speed, callback); } -static void sub_811D058(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 bg, u8 fg, u8 shadow) +static void PrintEasyChatTextWithColors(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, u8 bg, u8 fg, u8 shadow) { u8 color[3]; color[0] = bg; @@ -3724,51 +3951,51 @@ static void sub_811D058(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, AddTextPrinterParameterized3(windowId, fontId, left, top, color, speed, str); } -static void sub_811D0BC(void) +static void PrintInitialInstructions(void) { FillBgTilemapBufferRect(0, 0, 0, 0, 32, 20, 17); LoadUserWindowBorderGfx(1, 1, 0xE0); DrawTextBorderOuter(1, 1, 14); - sub_811D104(0); + PrintEasyChatStdMessage(MSG_INSTRUCTIONS); PutWindowTilemap(1); CopyBgTilemapBufferToVram(0); } -static void sub_811D104(u8 arg0) +static void PrintEasyChatStdMessage(u8 msgId) { const u8 *text2 = NULL; const u8 *text1 = NULL; - switch (arg0) + switch (msgId) { - case 0: + case MSG_INSTRUCTIONS: GetEasyChatInstructionsText(&text1, &text2); break; - case 2: - sub_811BB40(&text1, &text2); + case MSG_CONFIRM_EXIT: + GetEasyChatConfirmExitText(&text1, &text2); break; - case 3: + case MSG_CONFIRM: GetEasyChatConfirmText(&text1, &text2); break; - case 1: + case MSG_CONFIRM_DELETE: GetEasyChatConfirmDeletionText(&text1, &text2); break; - case 4: + case MSG_CREATE_QUIZ: text1 = gText_CreateAQuiz; break; - case 5: + case MSG_SELECT_ANSWER: text1 = gText_SelectTheAnswer; break; - case 6: + case MSG_SONG_TOO_SHORT: text1 = gText_OnlyOnePhrase; text2 = gText_OriginalSongWillBeUsed; break; - case 7: + case MSG_CANT_DELETE_LYRICS: text1 = gText_LyricsCantBeDeleted; break; - case 8: + case MSG_COMBINE_TWO_WORDS: text1 = gText_CombineTwoWordsOrPhrases3; break; - case 9: + case MSG_CANT_QUIT: text1 = gText_YouCannotQuitHere; text2 = gText_SectionMustBeCompleted; break; @@ -3776,20 +4003,20 @@ static void sub_811D104(u8 arg0) FillWindowPixelBuffer(1, PIXEL_FILL(1)); if (text1) - sub_811D028(1, 1, text1, 0, 1, 0xFF, 0); + PrintEasyChatText(1, 1, text1, 0, 1, TEXT_SPEED_FF, 0); if (text2) - sub_811D028(1, 1, text2, 0, 17, 0xFF, 0); + PrintEasyChatText(1, 1, text2, 0, 17, TEXT_SPEED_FF, 0); CopyWindowToVram(1, 3); } -static void sub_811D214(u8 initialCursorPos) +static void CreateEasyChatYesNoMenu(u8 initialCursorPos) { CreateYesNoMenu(&sEasyChatYesNoWindowTemplate, 1, 14, initialCursorPos); } -static void sub_811D230(void) +static void AddPhraseWindow(void) { u8 frameId; struct WindowTemplate template; @@ -3802,49 +4029,50 @@ static void sub_811D230(void) template.height = sPhraseFrameDimensions[frameId].height; template.paletteNum = 11; template.baseBlock = 0x6C; - sUnknown_0203A11C->windowId = AddWindow(&template); - PutWindowTilemap(sUnknown_0203A11C->windowId); + sScreenControl->windowId = AddWindow(&template); + PutWindowTilemap(sScreenControl->windowId); } -static void sub_811D2C8(void) +static void PrintCurrentPhrase(void) { - u8 spC[4]; - u16 *ecWord; + u8 strClear[4]; + u16 *currentPhrase; u8 numColumns, numRows; u8 *str; int frameId; - int var1; + bool32 isQuizQuestion; int i, j, k; - ecWord = GetEasyChatWordBuffer(); + currentPhrase = GetCurrentPhrase(); numColumns = GetNumColumns(); numRows = GetNumRows(); frameId = GetEasyChatScreenFrameId(); - var1 = 0; - if (frameId == 7) - var1 = 1; - FillWindowPixelBuffer(sUnknown_0203A11C->windowId, PIXEL_FILL(1)); + isQuizQuestion = FALSE; + if (frameId == FRAMEID_QUIZ_QUESTION) + isQuizQuestion = TRUE; + + FillWindowPixelBuffer(sScreenControl->windowId, PIXEL_FILL(1)); for (i = 0; i < numRows; i++) { - memcpy(spC, sText_Clear17, sizeof(sText_Clear17)); - if (var1) - spC[2] = 6; + memcpy(strClear, sText_Clear17, sizeof(sText_Clear17)); + if (isQuizQuestion) + strClear[2] = 6; - str = sUnknown_0203A11C->unkB; - sUnknown_0203A11C->unkB[0] = EOS; - str = StringAppend(str, spC); + str = sScreenControl->phrasePrintBuffer; + sScreenControl->phrasePrintBuffer[0] = EOS; + str = StringAppend(str, strClear); for (j = 0; j < numColumns; j++) { - if (*ecWord != 0xFFFF) + if (*currentPhrase != EC_EMPTY_WORD) { - str = CopyEasyChatWord(str, *ecWord); - ecWord++; + str = CopyEasyChatWord(str, *currentPhrase); + currentPhrase++; } else { - ecWord++; - if (!var1) + currentPhrase++; + if (!isQuizQuestion) { str = WriteColorChangeControlCode(str, 0, 4); for (k = 0; k < 12; k++) @@ -3857,25 +4085,27 @@ static void sub_811D2C8(void) } } - if (var1) - spC[2] = 3; + if (isQuizQuestion) + strClear[2] = 3; - str = StringAppend(str, spC); - if (frameId == 2 || frameId == 7 || frameId == 8) + str = StringAppend(str, strClear); + + if (frameId == FRAMEID_MAIL || frameId == FRAMEID_QUIZ_QUESTION || frameId == FRAMEID_QUIZ_SET_QUESTION) { + // Is 2x5 frame, end on 9th word if (j == 0 && i == 4) break; } } *str = EOS; - sub_811D028(sUnknown_0203A11C->windowId, 1, sUnknown_0203A11C->unkB, 0, i * 16 + 1, 0xFF, 0); + PrintEasyChatText(sScreenControl->windowId, 1, sScreenControl->phrasePrintBuffer, 0, i * 16 + 1, TEXT_SPEED_FF, 0); } - CopyWindowToVram(sUnknown_0203A11C->windowId, 3); + CopyWindowToVram(sScreenControl->windowId, 3); } -static void sub_811D424(u16 *tilemap) +static void BufferFrameTilemap(u16 *tilemap) { u8 frameId; int right, bottom; @@ -3883,19 +4113,22 @@ static void sub_811D424(u16 *tilemap) frameId = GetEasyChatScreenFrameId(); CpuFastFill(0, tilemap, BG_SCREEN_SIZE); - if (frameId == 2 || frameId == 8) + if (frameId == FRAMEID_MAIL || frameId == FRAMEID_QUIZ_SET_QUESTION) { + // These frames fill the screen, no need to draw top/bottom edges right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width; bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height; + + // Draw middle section for (y = sPhraseFrameDimensions[frameId].top; y < bottom; y++) { x = sPhraseFrameDimensions[frameId].left - 1; - tilemap[y * 32 + x] = 0x1005; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_L_EDGE; x++; for (; x < right; x++) - tilemap[y * 32 + x] = 0x1000; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_TRANSPARENT; - tilemap[y* 32 + x] = 0x1007; + tilemap[y* 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_R_EDGE; } } else @@ -3904,35 +4137,40 @@ static void sub_811D424(u16 *tilemap) x = sPhraseFrameDimensions[frameId].left - 1; right = sPhraseFrameDimensions[frameId].left + sPhraseFrameDimensions[frameId].width; bottom = sPhraseFrameDimensions[frameId].top + sPhraseFrameDimensions[frameId].height; - tilemap[y * 32 + x] = 0x1001; + + // Draw top edge + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_TOP_L_CORNER; x++; for (; x < right; x++) - tilemap[y * 32 + x] = 0x1002; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_TOP_EDGE; - tilemap[y * 32 + x] = 0x1003; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_TOP_R_CORNER; y++; + + // Draw middle section for (; y < bottom; y++) { x = sPhraseFrameDimensions[frameId].left - 1; - tilemap[y * 32 + x] = 0x1005; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_L_EDGE; x++; for (; x < right; x++) - tilemap[y * 32 + x] = 0x1000; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_TRANSPARENT; - tilemap[y* 32 + x] = 0x1007; + tilemap[y* 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_R_EDGE; } + // Draw bottom edge x = sPhraseFrameDimensions[frameId].left - 1; - tilemap[y * 32 + x] = 0x1009; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_BOTTOM_L_CORNER; x++; for (; x < right; x++) - tilemap[y * 32 + x] = 0x100A; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_BOTTOM_EDGE; - tilemap[y * 32 + x] = 0x100B; + tilemap[y * 32 + x] = FRAME_OFFSET_ORANGE + FRAME_TILE_BOTTOM_R_CORNER; } } -static void sub_811D60C(void) +static void AdjustBgTilemapForFooter(void) { u8 frameId; u16 *tilemap; @@ -3941,55 +4179,55 @@ static void sub_811D60C(void) frameId = GetEasyChatScreenFrameId(); switch (sPhraseFrameDimensions[frameId].footerId) { - case 2: + case FOOTER_ANSWER: tilemap += 0x2A0; CopyToBgTilemapBufferRect(3, tilemap, 0, 11, 32, 2); break; - case 1: + case FOOTER_QUIZ: tilemap += 0x300; CopyToBgTilemapBufferRect(3, tilemap, 0, 11, 32, 2); break; - case 3: + case NUM_FOOTER_TYPES: CopyToBgTilemapBufferRect(3, tilemap, 0, 10, 32, 4); break; } } -static void sub_811D684(void) +static void DrawLowerWindow(void) { PutWindowTilemap(2); CopyBgTilemapBufferToVram(2); } -static void sub_811D698(u32 arg0) +static void InitLowerWindowText(u32 whichText) { - sub_811DD84(); + ResetLowerWindowScroll(); FillWindowPixelBuffer(2, PIXEL_FILL(1)); - switch (arg0) + switch (whichText) { - case 0: - sub_811D6F4(); + case TEXT_GROUPS: + PrintKeyboardGroupNames(); break; - case 1: - PrintEasyChatKeyboardText(); + case TEXT_ALPHABET: + PrintKeyboardAlphabet(); break; - case 2: - sub_811D794(); + case TEXT_WORD_SELECT: + PrintInitialWordSelectText(); break; } CopyWindowToVram(2, 2); } -static void sub_811D6D4(void) +static void PrintKeyboardText(void) { - if (!sub_811BBB0()) - sub_811D698(0); + if (!GetInAlphabetMode()) + InitLowerWindowText(TEXT_GROUPS); else - sub_811D698(1); + InitLowerWindowText(TEXT_ALPHABET); } -static void sub_811D6F4(void) +static void PrintKeyboardGroupNames(void) { int i; int x, y; @@ -4000,98 +4238,99 @@ static void sub_811D6F4(void) { for (x = 0; x < 2; x++) { - u8 groupId = sub_811F3B8(i++); + u8 groupId = GetUnlockedEasyChatGroupId(i++); if (groupId == EC_NUM_GROUPS) { - sub_811DDAC(sub_811BBBC(), 0); + InitLowerWindowScroll(GetKeyboardScrollOffset(), 0); return; } - sub_811D028(2, 1, GetEasyChatWordGroupName(groupId), x * 84 + 10, y, 0xFF, NULL); + PrintEasyChatText(2, 1, GetEasyChatWordGroupName(groupId), x * 84 + 10, y, TEXT_SPEED_FF, NULL); } y += 16; } } -static void PrintEasyChatKeyboardText(void) +static void PrintKeyboardAlphabet(void) { u32 i; - for (i = 0; i < ARRAY_COUNT(sEasyChatKeyboardText); i++) - sub_811D028(2, 1, sEasyChatKeyboardText[i], 10, 97 + i * 16, 0xFF, NULL); + for (i = 0; i < ARRAY_COUNT(sEasyChatKeyboardAlphabet); i++) + PrintEasyChatText(2, 1, sEasyChatKeyboardAlphabet[i], 10, 97 + i * 16, TEXT_SPEED_FF, NULL); } -static void sub_811D794(void) +static void PrintInitialWordSelectText(void) { - sub_811D864(0, 4); + PrintWordSelectText(0, NUM_WORD_SELECT_ROWS); } -static void sub_811D7A4(void) +static void PrintWordSelectNextRowDown(void) { - u8 var0 = sub_811BBDC() + 3; - sub_811D950(var0, 1); - sub_811D864(var0, 1); + u8 wordScroll = GetWordSelectScrollOffset() + NUM_WORD_SELECT_ROWS - 1; + EraseWordSelectRows(wordScroll, 1); + PrintWordSelectText(wordScroll, 1); } -static void sub_811D7C8(void) +static void PrintWordSelectNextRowUp(void) { - u8 var0 = sub_811BBDC(); - sub_811D950(var0, 1); - sub_811D864(var0, 1); + u8 wordScroll = GetWordSelectScrollOffset(); + EraseWordSelectRows(wordScroll, 1); + PrintWordSelectText(wordScroll, 1); } -static void sub_811D7EC(void) +static void PrintWordSelectRowsPageDown(void) { - u8 var0 = sub_811BBDC(); - u8 var1 = var0 + 4; - u8 var2 = sub_811BBE8() + 1; - if (var1 > var2) - var1 = var2; + u8 wordScroll = GetWordSelectScrollOffset(); + u8 maxScroll = wordScroll + NUM_WORD_SELECT_ROWS; + u8 maxRows = GetWordSelectLastRow() + 1; + if (maxScroll > maxRows) + maxScroll = maxRows; - if (var0 < var1) + if (wordScroll < maxScroll) { - u8 var3 = var1 - var0; - sub_811D950(var0, var3); - sub_811D864(var0, var3); + u8 numRows = maxScroll - wordScroll; + EraseWordSelectRows(wordScroll, numRows); + PrintWordSelectText(wordScroll, numRows); } } -static void sub_811D830(void) +static void PrintWordSelectRowsPageUp(void) { - u8 var0 = sub_811BBDC(); - u8 var1 = sub_811DE48(); - if (var0 < var1) + u8 wordScroll = GetWordSelectScrollOffset(); + u8 windowScroll = GetLowerWindowScrollOffset(); + if (wordScroll < windowScroll) { - u8 var2 = var1 - var0; - sub_811D950(var0, var2); - sub_811D864(var0, var2); + u8 numRows = windowScroll - wordScroll; + EraseWordSelectRows(wordScroll, numRows); + PrintWordSelectText(wordScroll, numRows); } } -static void sub_811D864(u8 arg0, u8 arg1) +// Print the easy chat words available for selection in +// the currently selected group and at the given offset and row +static void PrintWordSelectText(u8 scrollOffset, u8 numRows) { int i, j; u16 easyChatWord; - u8 *str; int y; - int var0; + int wordIndex; - var0 = arg0 * 2; - y = (arg0 * 16 + 96) & 0xFF; + wordIndex = scrollOffset * NUM_WORD_SELECT_COLUMNS; + y = (scrollOffset * 16 + 96) & 0xFF; y++; - for (i = 0; i < arg1; i++) + for (i = 0; i < numRows; i++) { for (j = 0; j < 2; j++) { - easyChatWord = sub_811F578(var0++); - if (easyChatWord != 0xFFFF) + easyChatWord = GetWordFromSelectedGroup(wordIndex++); + if (easyChatWord != EC_EMPTY_WORD) { - CopyEasyChatWordPadded(sUnknown_0203A11C->unkCC, easyChatWord, 0); - if (!sub_811BF88(easyChatWord)) - sub_811D028(2, 1, sUnknown_0203A11C->unkCC, (j * 13 + 3) * 8, y, 0xFF, NULL); - else - sub_811D058(2, 1, sUnknown_0203A11C->unkCC, (j * 13 + 3) * 8, y, 0xFF, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_LIGHT_GREY); + CopyEasyChatWordPadded(sScreenControl->wordSelectPrintBuffer, easyChatWord, 0); + if (!DummyWordCheck(easyChatWord)) + PrintEasyChatText(2, 1, sScreenControl->wordSelectPrintBuffer, (j * 13 + 3) * 8, y, TEXT_SPEED_FF, NULL); + else // Never reached + PrintEasyChatTextWithColors(2, 1, sScreenControl->wordSelectPrintBuffer, (j * 13 + 3) * 8, y, TEXT_SPEED_FF, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_RED, TEXT_COLOR_LIGHT_GRAY); } } @@ -4101,16 +4340,17 @@ static void sub_811D864(u8 arg0, u8 arg1) CopyWindowToVram(2, 2); } -static void sub_811D950(u8 arg0, u8 arg1) +static void EraseWordSelectRows(u8 scrollOffset, u8 numRows) { int y; int var0; int var1; int var2; - y = (arg0 * 16 + 96) & 0xFF; - var2 = arg1 * 16; + y = (scrollOffset * 16 + 96) & 0xFF; + var2 = numRows * 16; var0 = y + var2; + if (var0 > 255) { var1 = var0 - 256; @@ -4126,191 +4366,209 @@ static void sub_811D950(u8 arg0, u8 arg1) FillWindowPixelRect(2, PIXEL_FILL(1), 0, 0, 224, var1); } -static void sub_811D9B4(void) +static void ClearWordSelectWindow(void) { FillWindowPixelBuffer(2, PIXEL_FILL(1)); CopyWindowToVram(2, 2); } -static void sub_811D9CC(int arg0) +static void InitLowerWindowAnim(int winAnimType) { - switch (arg0) + switch (winAnimType) { - case 0: - sUnknown_0203A11C->unk6 = 0; - sUnknown_0203A11C->unk7 = 10; + case WINANIM_OPEN_KEYBOARD: + sScreenControl->curWindowAnimState = 0; + sScreenControl->destWindowAnimState = 10; break; - case 1: - sUnknown_0203A11C->unk6 = 9; - sUnknown_0203A11C->unk7 = 0; + case WINANIM_CLOSE_KEYBOARD: + sScreenControl->curWindowAnimState = 9; + sScreenControl->destWindowAnimState = 0; break; - case 2: - sUnknown_0203A11C->unk6 = 11; - sUnknown_0203A11C->unk7 = 17; + case WINANIM_OPEN_WORD_SELECT: + sScreenControl->curWindowAnimState = 11; + sScreenControl->destWindowAnimState = 17; break; - case 3: - sUnknown_0203A11C->unk6 = 17; - sUnknown_0203A11C->unk7 = 0; + case WINANIM_CLOSE_WORD_SELECT: + sScreenControl->curWindowAnimState = 17; + sScreenControl->destWindowAnimState = 0; break; - case 4: - sUnknown_0203A11C->unk6 = 17; - sUnknown_0203A11C->unk7 = 10; + case WINANIM_RETURN_TO_KEYBOARD: + sScreenControl->curWindowAnimState = 17; + sScreenControl->destWindowAnimState = 10; break; - case 5: - sUnknown_0203A11C->unk6 = 18; - sUnknown_0203A11C->unk7 = 22; + case WINANIM_KEYBOARD_SWITCH_OUT: + sScreenControl->curWindowAnimState = 18; + sScreenControl->destWindowAnimState = 22; break; - case 6: - sUnknown_0203A11C->unk6 = 22; - sUnknown_0203A11C->unk7 = 18; + case WINANIM_KEYBOARD_SWITCH_IN: + sScreenControl->curWindowAnimState = 22; + sScreenControl->destWindowAnimState = 18; break; } - sUnknown_0203A11C->unk8 = sUnknown_0203A11C->unk6 < sUnknown_0203A11C->unk7 ? 1 : -1; + sScreenControl->windowAnimStateDir = sScreenControl->curWindowAnimState < sScreenControl->destWindowAnimState ? 1 : -1; } -static bool8 sub_811DAA4(void) +// Returns FALSE if the anim is finished +static bool8 UpdateLowerWindowAnim(void) { - u8 var0, var1; - if (sUnknown_0203A11C->unk6 == sUnknown_0203A11C->unk7) + u8 curState, destState; + if (sScreenControl->curWindowAnimState == sScreenControl->destWindowAnimState) return FALSE; - sUnknown_0203A11C->unk6 += sUnknown_0203A11C->unk8; - sub_811DADC(sUnknown_0203A11C->unk6); - var0 = sUnknown_0203A11C->unk6; - var1 = sUnknown_0203A11C->unk7; - return (var0 ^ var1) > 0; + sScreenControl->curWindowAnimState += sScreenControl->windowAnimStateDir; + DrawLowerWindowFrame(sScreenControl->curWindowAnimState); + curState = sScreenControl->curWindowAnimState; + destState = sScreenControl->destWindowAnimState; + return (curState ^ destState) > 0; } -static void sub_811DADC(u8 arg0) +// States in this function are used incrementally with differing start/end cases +// to draw the lower window and create the appearance that it's opening/closing/animating. +// See InitLowerWindowAnim +static void DrawLowerWindowFrame(u8 type) { FillBgTilemapBufferRect_Palette0(1, 0, 0, 10, 30, 10); - switch (arg0) + switch (type) { - case 0: + case 0: // Closed break; case 1: - sub_811DC28(11, 14, 3, 2); + BufferLowerWindowFrame(11, 14, 3, 2); break; case 2: - sub_811DC28(9, 14, 7, 2); + BufferLowerWindowFrame(9, 14, 7, 2); break; case 3: - sub_811DC28(7, 14, 11, 2); + BufferLowerWindowFrame(7, 14, 11, 2); break; case 4: - sub_811DC28(5, 14, 15, 2); + BufferLowerWindowFrame(5, 14, 15, 2); break; case 5: - sub_811DC28(3, 14, 19, 2); + BufferLowerWindowFrame(3, 14, 19, 2); break; case 6: - sub_811DC28(1, 14, 23, 2); + BufferLowerWindowFrame(1, 14, 23, 2); + break; + case 7: + BufferLowerWindowFrame(1, 13, 23, 4); + break; + case 8: + BufferLowerWindowFrame(1, 12, 23, 6); + break; + case 9: + BufferLowerWindowFrame(1, 11, 23, 8); + break; + case 10: + BufferLowerWindowFrame(1, 10, 23, 10); break; case 11: - sub_811DC28(1, 10, 24, 10); + BufferLowerWindowFrame(1, 10, 24, 10); break; case 12: - sub_811DC28(1, 10, 25, 10); + BufferLowerWindowFrame(1, 10, 25, 10); break; case 13: - sub_811DC28(1, 10, 26, 10); + BufferLowerWindowFrame(1, 10, 26, 10); break; case 14: - sub_811DC28(1, 10, 27, 10); + BufferLowerWindowFrame(1, 10, 27, 10); break; case 15: - sub_811DC28(1, 10, 28, 10); + BufferLowerWindowFrame(1, 10, 28, 10); break; case 16: - sub_811DC28(1, 10, 29, 10); + BufferLowerWindowFrame(1, 10, 29, 10); break; case 17: - sub_811DC28(0, 10, 30, 10); + BufferLowerWindowFrame(0, 10, 30, 10); break; - case 10: case 18: - sub_811DC28(1, 10, 23, 10); + BufferLowerWindowFrame(1, 10, 23, 10); break; - case 9: case 19: - sub_811DC28(1, 11, 23, 8); + BufferLowerWindowFrame(1, 11, 23, 8); break; - case 8: case 20: - sub_811DC28(1, 12, 23, 6); + BufferLowerWindowFrame(1, 12, 23, 6); break; - case 7: case 21: - sub_811DC28(1, 13, 23, 4); + BufferLowerWindowFrame(1, 13, 23, 4); break; case 22: - sub_811DC28(1, 14, 23, 2); + BufferLowerWindowFrame(1, 14, 23, 2); break; } CopyBgTilemapBufferToVram(1); } -static void sub_811DC28(int left, int top, int width, int height) +static void BufferLowerWindowFrame(int left, int top, int width, int height) { u16 *tilemap; int right; int bottom; int x, y; - tilemap = sUnknown_0203A11C->unk300; + tilemap = sScreenControl->bg1TilemapBuffer; right = left + width - 1; bottom = top + height - 1; x = left; y = top; - tilemap[y * 32 + x] = 0x4001; + + // Draw top edge + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_TOP_L_CORNER; x++; for (; x < right; x++) - tilemap[y * 32 + x] = 0x4002; + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_TOP_EDGE; - tilemap[y * 32 + x] = 0x4003; + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_TOP_R_CORNER; y++; + + // Draw middle section for (; y < bottom; y++) { - tilemap[y * 32 + left] = 0x4005; + tilemap[y * 32 + left] = FRAME_OFFSET_GREEN + FRAME_TILE_L_EDGE; x = left + 1; for (; x < right; x++) - tilemap[y * 32 + x] = 0x4000; + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_TRANSPARENT; - tilemap[y * 32 + x] = 0x4007; + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_R_EDGE; } - tilemap[y * 32 + left] = 0x4009; + // Draw bottom edge + tilemap[y * 32 + left] = FRAME_OFFSET_GREEN + FRAME_TILE_BOTTOM_L_CORNER; x = left + 1; for (; x < right; x++) - tilemap[y * 32 + x] = 0x400A; + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_BOTTOM_EDGE; - tilemap[y * 32 + x] = 0x400B; - sub_811DE5C((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8); + tilemap[y * 32 + x] = FRAME_OFFSET_GREEN + FRAME_TILE_BOTTOM_R_CORNER; + + SetWindowDimensions((left + 1) * 8, (top + 1) * 8, (width - 2) * 8, (height - 2) * 8); } -static void sub_811DD84(void) +static void ResetLowerWindowScroll(void) { ChangeBgY(2, 0x800, 0); - sUnknown_0203A11C->unk2CE = 0; + sScreenControl->scrollOffset = 0; } -static void sub_811DDAC(s16 arg0, u8 arg1) +static void InitLowerWindowScroll(s16 scrollChange, u8 speed) { int bgY; - s16 var0; + s16 yChange; bgY = GetBgY(2); - sUnknown_0203A11C->unk2CE += arg0; - var0 = arg0 * 16; - bgY += var0 << 8; - if (arg1) + sScreenControl->scrollOffset += scrollChange; + yChange = scrollChange * 16; + bgY += yChange * 256; + if (speed) { - sUnknown_0203A11C->unk2D0 = bgY; - sUnknown_0203A11C->unk2D4 = arg1 * 256; - if (var0 < 0) - sUnknown_0203A11C->unk2D4 = -sUnknown_0203A11C->unk2D4; + sScreenControl->scrollDest = bgY; + sScreenControl->scrollSpeed = speed * 256; + if (yChange < 0) + sScreenControl->scrollSpeed = -sScreenControl->scrollSpeed; } else { @@ -4318,28 +4576,28 @@ static void sub_811DDAC(s16 arg0, u8 arg1) } } -static bool8 sub_811DE10(void) +static bool8 UpdateLowerWindowScroll(void) { int bgY; bgY = GetBgY(2); - if (bgY == sUnknown_0203A11C->unk2D0) + if (bgY == sScreenControl->scrollDest) { return FALSE; } else { - ChangeBgY(2, sUnknown_0203A11C->unk2D4, 1); + ChangeBgY(2, sScreenControl->scrollSpeed, 1); return TRUE; } } -static int sub_811DE48(void) +static int GetLowerWindowScrollOffset(void) { - return sUnknown_0203A11C->unk2CE; + return sScreenControl->scrollOffset; } -static void sub_811DE5C(u8 left, u8 top, u8 width, u8 height) +static void SetWindowDimensions(u8 left, u8 top, u8 width, u8 height) { u16 horizontalDimensions = WIN_RANGE(left, left + width); u16 verticalDimensions = WIN_RANGE(top, top + height); @@ -4347,244 +4605,258 @@ static void sub_811DE5C(u8 left, u8 top, u8 width, u8 height) SetGpuReg(REG_OFFSET_WIN0V, verticalDimensions); } -static void sub_811DE90(void) +static void LoadEasyChatGfx(void) { u32 i; - LoadSpriteSheets(sEasyChatSpriteSheets); - LoadSpritePalettes(sEasyChatSpritePalettes); - for (i = 0; i < ARRAY_COUNT(sUnknown_08597CE8); i++) - LoadCompressedSpriteSheet(&sUnknown_08597CE8[i]); + LoadSpriteSheets(sSpriteSheets); + LoadSpritePalettes(sSpritePalettes); + for (i = 0; i < ARRAY_COUNT(sCompressedSpriteSheets); i++) + LoadCompressedSpriteSheet(&sCompressedSpriteSheets[i]); } -static void sub_811DEC4(void) +#define sDelayTimer data[0] +#define sAnimateCursor data[1] + +static void CreateMainCursorSprite(void) { u8 frameId = GetEasyChatScreenFrameId(); int x = sPhraseFrameDimensions[frameId].left * 8 + 13; int y = sPhraseFrameDimensions[frameId].top * 8 + 8; - u8 spriteId = CreateSprite(&sUnknown_08597D18, x, y, 2); - sUnknown_0203A11C->unk2D8 = &gSprites[spriteId]; - gSprites[spriteId].data[1] = 1; + u8 spriteId = CreateSprite(&sSpriteTemplate_TriangleCursor, x, y, 2); + sScreenControl->mainCursorSprite = &gSprites[spriteId]; + gSprites[spriteId].sAnimateCursor = TRUE; } -static void sub_811DF28(struct Sprite *sprite) +static void SpriteCB_Cursor(struct Sprite *sprite) { - if (sprite->data[1]) + if (sprite->sAnimateCursor) { - if (++sprite->data[0] > 2) + if (++sprite->sDelayTimer > 2) { - sprite->data[0] = 0; + sprite->sDelayTimer = 0; if (++sprite->pos2.x > 0) sprite->pos2.x = -6; } } } -static void sub_811DF60(u8 x, u8 y) +static void SetMainCursorPos(u8 x, u8 y) { - sUnknown_0203A11C->unk2D8->pos1.x = x; - sUnknown_0203A11C->unk2D8->pos1.y = y; - sUnknown_0203A11C->unk2D8->pos2.x = 0; - sUnknown_0203A11C->unk2D8->data[0] = 0; + sScreenControl->mainCursorSprite->pos1.x = x; + sScreenControl->mainCursorSprite->pos1.y = y; + sScreenControl->mainCursorSprite->pos2.x = 0; + sScreenControl->mainCursorSprite->sDelayTimer = 0; } -static void sub_811DF90(void) +static void StopMainCursorAnim(void) { - sUnknown_0203A11C->unk2D8->data[0] = 0; - sUnknown_0203A11C->unk2D8->data[1] = 0; - sUnknown_0203A11C->unk2D8->pos2.x = 0; + sScreenControl->mainCursorSprite->sDelayTimer = 0; + sScreenControl->mainCursorSprite->sAnimateCursor = FALSE; + sScreenControl->mainCursorSprite->pos2.x = 0; } -static void sub_811DFB0(void) +static void StartMainCursorAnim(void) { - sUnknown_0203A11C->unk2D8->data[1] = 1; + sScreenControl->mainCursorSprite->sAnimateCursor = TRUE; } -static void sub_811DFC8(void) +static void CreateRectangleCursorSprites(void) { - u8 spriteId = CreateSprite(&sUnknown_08597D68, 0, 0, 3); - sUnknown_0203A11C->unk2DC = &gSprites[spriteId]; - sUnknown_0203A11C->unk2DC->pos2.x = 32; + u8 spriteId = CreateSprite(&sSpriteTemplate_RectangleCursor, 0, 0, 3); + sScreenControl->rectangleCursorSpriteRight = &gSprites[spriteId]; + sScreenControl->rectangleCursorSpriteRight->pos2.x = 32; - spriteId = CreateSprite(&sUnknown_08597D68, 0, 0, 3); - sUnknown_0203A11C->unk2E0 = &gSprites[spriteId]; - sUnknown_0203A11C->unk2E0->pos2.x = -32; + spriteId = CreateSprite(&sSpriteTemplate_RectangleCursor, 0, 0, 3); + sScreenControl->rectangleCursorSpriteLeft = &gSprites[spriteId]; + sScreenControl->rectangleCursorSpriteLeft->pos2.x = -32; - sUnknown_0203A11C->unk2DC->hFlip = 1; - sub_811E088(); + sScreenControl->rectangleCursorSpriteRight->hFlip = TRUE; + UpdateRectangleCursorPos(); } -static void sub_811E050(void) +static void DestroyRectangleCursorSprites(void) { - DestroySprite(sUnknown_0203A11C->unk2DC); - sUnknown_0203A11C->unk2DC = NULL; - DestroySprite(sUnknown_0203A11C->unk2E0); - sUnknown_0203A11C->unk2E0 = NULL; + DestroySprite(sScreenControl->rectangleCursorSpriteRight); + sScreenControl->rectangleCursorSpriteRight = NULL; + DestroySprite(sScreenControl->rectangleCursorSpriteLeft); + sScreenControl->rectangleCursorSpriteLeft = NULL; } -static void sub_811E088(void) +static void UpdateRectangleCursorPos(void) { - u8 var0; - u8 var1; + s8 column; + s8 row; - if (sUnknown_0203A11C->unk2DC && sUnknown_0203A11C->unk2E0) + if (sScreenControl->rectangleCursorSpriteRight + && sScreenControl->rectangleCursorSpriteLeft) { - sub_811BB9C(&var0, &var1); - if (!sub_811BBB0()) - sub_811E0EC(var0, var1); + GetKeyboardCursorColAndRow(&column, &row); + if (!GetInAlphabetMode()) + SetRectangleCursorPos_GroupMode(column, row); else - sub_811E1A4(var0, var1); + SetRectangleCursorPos_AlphabetMode(column, row); } } -static void sub_811E0EC(s8 arg0, s8 arg1) +static void SetRectangleCursorPos_GroupMode(s8 column, s8 row) { - if (arg0 != -1) + if (column != -1) { - StartSpriteAnim(sUnknown_0203A11C->unk2DC, 0); - sUnknown_0203A11C->unk2DC->pos1.x = arg0 * 84 + 58; - sUnknown_0203A11C->unk2DC->pos1.y = arg1 * 16 + 96; + // In group name window + StartSpriteAnim(sScreenControl->rectangleCursorSpriteRight, RECTCURSOR_ANIM_ON_GROUP); + sScreenControl->rectangleCursorSpriteRight->pos1.x = column * 84 + 58; + sScreenControl->rectangleCursorSpriteRight->pos1.y = row * 16 + 96; - StartSpriteAnim(sUnknown_0203A11C->unk2E0, 0); - sUnknown_0203A11C->unk2E0->pos1.x = arg0 * 84 + 58; - sUnknown_0203A11C->unk2E0->pos1.y = arg1 * 16 + 96; + StartSpriteAnim(sScreenControl->rectangleCursorSpriteLeft, RECTCURSOR_ANIM_ON_GROUP); + sScreenControl->rectangleCursorSpriteLeft->pos1.x = column * 84 + 58; + sScreenControl->rectangleCursorSpriteLeft->pos1.y = row * 16 + 96; } else { - StartSpriteAnim(sUnknown_0203A11C->unk2DC, 1); - sUnknown_0203A11C->unk2DC->pos1.x = 216; - sUnknown_0203A11C->unk2DC->pos1.y = arg1 * 16 + 112; + // In button window + StartSpriteAnim(sScreenControl->rectangleCursorSpriteRight, RECTCURSOR_ANIM_ON_BUTTON); + sScreenControl->rectangleCursorSpriteRight->pos1.x = 216; + sScreenControl->rectangleCursorSpriteRight->pos1.y = row * 16 + 112; - StartSpriteAnim(sUnknown_0203A11C->unk2E0, 1); - sUnknown_0203A11C->unk2E0->pos1.x = 216; - sUnknown_0203A11C->unk2E0->pos1.y = arg1 * 16 + 112; + StartSpriteAnim(sScreenControl->rectangleCursorSpriteLeft, RECTCURSOR_ANIM_ON_BUTTON); + sScreenControl->rectangleCursorSpriteLeft->pos1.x = 216; + sScreenControl->rectangleCursorSpriteLeft->pos1.y = row * 16 + 112; } } -static void sub_811E1A4(s8 arg0, s8 arg1) +static void SetRectangleCursorPos_AlphabetMode(s8 column, s8 row) { int anim; int x, y; - if (arg0 != -1) + if (column != -1) { - y = arg1 * 16 + 96; + y = row * 16 + 96; x = 32; - if (arg0 == 6 && arg1 == 0) + if (column == NUM_ALPHABET_COLUMNS - 1 && row == 0) { + // Cursor is on 'Others' x = 158; - anim = 2; + anim = RECTCURSOR_ANIM_ON_OTHERS; } else { - x += sUnknown_08597D08[arg0 < ARRAY_COUNT(sUnknown_08597D08) ? arg0 : 0]; - anim = 3; + // Cursor is on a letter + x += sAlphabetKeyboardColumnOffsets[(u8)column < NUM_ALPHABET_COLUMNS ? column : 0]; + anim = RECTCURSOR_ANIM_ON_LETTER; } - StartSpriteAnim(sUnknown_0203A11C->unk2DC, anim); - sUnknown_0203A11C->unk2DC->pos1.x = x; - sUnknown_0203A11C->unk2DC->pos1.y = y; + StartSpriteAnim(sScreenControl->rectangleCursorSpriteRight, anim); + sScreenControl->rectangleCursorSpriteRight->pos1.x = x; + sScreenControl->rectangleCursorSpriteRight->pos1.y = y; - StartSpriteAnim(sUnknown_0203A11C->unk2E0, anim); - sUnknown_0203A11C->unk2E0->pos1.x = x; - sUnknown_0203A11C->unk2E0->pos1.y = y; + StartSpriteAnim(sScreenControl->rectangleCursorSpriteLeft, anim); + sScreenControl->rectangleCursorSpriteLeft->pos1.x = x; + sScreenControl->rectangleCursorSpriteLeft->pos1.y = y; } else { - StartSpriteAnim(sUnknown_0203A11C->unk2DC, 1); - sUnknown_0203A11C->unk2DC->pos1.x = 216; - sUnknown_0203A11C->unk2DC->pos1.y = arg1 * 16 + 112; + // In button window + StartSpriteAnim(sScreenControl->rectangleCursorSpriteRight, RECTCURSOR_ANIM_ON_BUTTON); + sScreenControl->rectangleCursorSpriteRight->pos1.x = 216; + sScreenControl->rectangleCursorSpriteRight->pos1.y = row * 16 + 112; - StartSpriteAnim(sUnknown_0203A11C->unk2E0, 1); - sUnknown_0203A11C->unk2E0->pos1.x = 216; - sUnknown_0203A11C->unk2E0->pos1.y = arg1 * 16 + 112; + StartSpriteAnim(sScreenControl->rectangleCursorSpriteLeft, RECTCURSOR_ANIM_ON_BUTTON); + sScreenControl->rectangleCursorSpriteLeft->pos1.x = 216; + sScreenControl->rectangleCursorSpriteLeft->pos1.y = row * 16 + 112; } } -static void sub_811E288(void) +// Cursor for selecting a new word +// Identical in appearance to the 'main' cursor +static void CreateWordSelectCursorSprite(void) { - u8 spriteId = CreateSprite(&sUnknown_08597D18, 0, 0, 4); - sUnknown_0203A11C->unk2E4 = &gSprites[spriteId]; - sUnknown_0203A11C->unk2E4->callback = sub_811E2DC; - sUnknown_0203A11C->unk2E4->oam.priority = 2; - sub_811E30C(); + u8 spriteId = CreateSprite(&sSpriteTemplate_TriangleCursor, 0, 0, 4); + sScreenControl->wordSelectCursorSprite = &gSprites[spriteId]; + sScreenControl->wordSelectCursorSprite->callback = SpriteCB_WordSelectCursor; + sScreenControl->wordSelectCursorSprite->oam.priority = 2; + UpdateWordSelectCursorPos(); } -static void sub_811E2DC(struct Sprite *sprite) +static void SpriteCB_WordSelectCursor(struct Sprite *sprite) { - if (++sprite->data[0] > 2) + if (++sprite->sDelayTimer > 2) { - sprite->data[0] = 0; + sprite->sDelayTimer = 0; if (++sprite->pos2.x > 0) sprite->pos2.x = -6; } } -static void sub_811E30C(void) +static void UpdateWordSelectCursorPos(void) { - s8 var0, var1, x, y; + s8 column, row, x, y; - sub_811BBC8(&var0, &var1); - x = var0 * 13; + GetWordSelectColAndRow(&column, &row); + x = column * 13; x = x * 8 + 28; - y = var1 * 16 + 96; - sub_811E34C(x, y); + y = row * 16 + 96; + SetWordSelectCursorPos(x, y); } -static void sub_811E34C(u8 x, u8 y) +static void SetWordSelectCursorPos(u8 x, u8 y) { - if (sUnknown_0203A11C->unk2E4) + if (sScreenControl->wordSelectCursorSprite) { - sUnknown_0203A11C->unk2E4->pos1.x = x; - sUnknown_0203A11C->unk2E4->pos1.y = y; - sUnknown_0203A11C->unk2E4->pos2.x = 0; - sUnknown_0203A11C->unk2E4->data[0] = 0; + sScreenControl->wordSelectCursorSprite->pos1.x = x; + sScreenControl->wordSelectCursorSprite->pos1.y = y; + sScreenControl->wordSelectCursorSprite->pos2.x = 0; + sScreenControl->wordSelectCursorSprite->sDelayTimer = 0; } } -static void sub_811E380(void) +static void DestroyWordSelectCursorSprite(void) { - if (sUnknown_0203A11C->unk2E4) + if (sScreenControl->wordSelectCursorSprite) { - DestroySprite(sUnknown_0203A11C->unk2E4); - sUnknown_0203A11C->unk2E4 = NULL; + DestroySprite(sScreenControl->wordSelectCursorSprite); + sScreenControl->wordSelectCursorSprite = NULL; } } -static void sub_811E3AC(void) +static void CreateSideWindowSprites(void) { - u8 spriteId = CreateSprite(&sUnknown_08597DF0, 208, 128, 6); - sUnknown_0203A11C->unk2E8 = &gSprites[spriteId]; - sUnknown_0203A11C->unk2E8->pos2.x = -64; + u8 spriteId = CreateSprite(&sSpriteTemplate_ButtonWindow, 208, 128, 6); + sScreenControl->buttonWindowSprite = &gSprites[spriteId]; + sScreenControl->buttonWindowSprite->pos2.x = -64; - spriteId = CreateSprite(&sUnknown_08597DD0, 208, 80, 5); - sUnknown_0203A11C->unk2EC = &gSprites[spriteId]; - sUnknown_0203A11C->unk9 = 0; + spriteId = CreateSprite(&sSpriteTemplate_ModeWindow, 208, 80, 5); + sScreenControl->modeWindowSprite = &gSprites[spriteId]; + sScreenControl->modeWindowState = 0; } -static bool8 sub_811E418(void) +static bool8 ShowSideWindow(void) { - switch (sUnknown_0203A11C->unk9) + switch (sScreenControl->modeWindowState) { default: return FALSE; case 0: - sUnknown_0203A11C->unk2E8->pos2.x += 8; - if (sUnknown_0203A11C->unk2E8->pos2.x >= 0) + // Slide button window on + sScreenControl->buttonWindowSprite->pos2.x += 8; + if (sScreenControl->buttonWindowSprite->pos2.x >= 0) { - sUnknown_0203A11C->unk2E8->pos2.x = 0; - if (!sub_811BBB0()) - StartSpriteAnim(sUnknown_0203A11C->unk2EC, 1); + sScreenControl->buttonWindowSprite->pos2.x = 0; + + // Set mode window anim + if (!GetInAlphabetMode()) + StartSpriteAnim(sScreenControl->modeWindowSprite, MODEWINDOW_ANIM_TO_GROUP); else - StartSpriteAnim(sUnknown_0203A11C->unk2EC, 2); + StartSpriteAnim(sScreenControl->modeWindowSprite, MODEWINDOW_ANIM_TO_ALPHABET); - sUnknown_0203A11C->unk9++; + sScreenControl->modeWindowState++; } break; case 1: - if (sUnknown_0203A11C->unk2EC->animEnded) + if (sScreenControl->modeWindowSprite->animEnded) { - sUnknown_0203A11C->unk9 = 2; + sScreenControl->modeWindowState = 2; return FALSE; } } @@ -4592,31 +4864,31 @@ static bool8 sub_811E418(void) return TRUE; } -static void sub_811E4AC(void) +static void HideModeWindow(void) { - sUnknown_0203A11C->unk9 = 0; - StartSpriteAnim(sUnknown_0203A11C->unk2EC, 3); + sScreenControl->modeWindowState = 0; + StartSpriteAnim(sScreenControl->modeWindowSprite, MODEWINDOW_ANIM_TO_HIDDEN); } -static bool8 sub_811E4D0(void) +static bool8 DestroySideWindowSprites(void) { - switch (sUnknown_0203A11C->unk9) + switch (sScreenControl->modeWindowState) { default: return FALSE; case 0: - if (sUnknown_0203A11C->unk2EC->animEnded) - sUnknown_0203A11C->unk9 = 1; + if (sScreenControl->modeWindowSprite->animEnded) + sScreenControl->modeWindowState = 1; break; case 1: - sUnknown_0203A11C->unk2E8->pos2.x -= 8; - if (sUnknown_0203A11C->unk2E8->pos2.x <= -64) + sScreenControl->buttonWindowSprite->pos2.x -= 8; + if (sScreenControl->buttonWindowSprite->pos2.x <= -64) { - DestroySprite(sUnknown_0203A11C->unk2EC); - DestroySprite(sUnknown_0203A11C->unk2E8); - sUnknown_0203A11C->unk2EC = NULL; - sUnknown_0203A11C->unk2E8 = NULL; - sUnknown_0203A11C->unk9++; + DestroySprite(sScreenControl->modeWindowSprite); + DestroySprite(sScreenControl->buttonWindowSprite); + sScreenControl->modeWindowSprite = NULL; + sScreenControl->buttonWindowSprite = NULL; + sScreenControl->modeWindowState++; return FALSE; } } @@ -4624,95 +4896,98 @@ static bool8 sub_811E4D0(void) return TRUE; } -static void sub_811E55C(void) +static void SetModeWindowToTransition(void) { - StartSpriteAnim(sUnknown_0203A11C->unk2EC, 4); + StartSpriteAnim(sScreenControl->modeWindowSprite, MODEWINDOW_ANIM_TRANSITION); } -static void sub_811E578(void) +static void UpdateModeWindowAnim(void) { - if (!sub_811BBB0()) - StartSpriteAnim(sUnknown_0203A11C->unk2EC, 1); + if (!GetInAlphabetMode()) + StartSpriteAnim(sScreenControl->modeWindowSprite, MODEWINDOW_ANIM_TO_GROUP); else - StartSpriteAnim(sUnknown_0203A11C->unk2EC, 2); + StartSpriteAnim(sScreenControl->modeWindowSprite, MODEWINDOW_ANIM_TO_ALPHABET); } -static bool8 sub_811E5B8(void) +static bool8 IsModeWindowAnimActive(void) { - return !sUnknown_0203A11C->unk2EC->animEnded; + return !sScreenControl->modeWindowSprite->animEnded; } -static void sub_811E5D4(void) +static void CreateScrollIndicatorSprites(void) { - u8 spriteId = CreateSprite(&sUnknown_08597E48, 96, 80, 0); + u8 spriteId = CreateSprite(&sSpriteTemplate_ScrollIndicator, 96, 80, 0); if (spriteId != MAX_SPRITES) - sUnknown_0203A11C->unk2F0 = &gSprites[spriteId]; + sScreenControl->scrollIndicatorUpSprite = &gSprites[spriteId]; - spriteId = CreateSprite(&sUnknown_08597E48, 96, 156, 0); + spriteId = CreateSprite(&sSpriteTemplate_ScrollIndicator, 96, 156, 0); if (spriteId != MAX_SPRITES) { - sUnknown_0203A11C->unk2F4 = &gSprites[spriteId]; - sUnknown_0203A11C->unk2F4->vFlip = 1; + sScreenControl->scrollIndicatorDownSprite = &gSprites[spriteId]; + sScreenControl->scrollIndicatorDownSprite->vFlip = TRUE; } - sub_811E6B0(); + HideScrollIndicators(); } -static void sub_811E64C(void) +static void UpdateScrollIndicatorsVisibility(void) { - sUnknown_0203A11C->unk2F0->invisible = !sub_811BBF8(); - sUnknown_0203A11C->unk2F4->invisible = !sub_811BC2C(); + sScreenControl->scrollIndicatorUpSprite->invisible = !CanScrollUp(); + sScreenControl->scrollIndicatorDownSprite->invisible = !CanScrollDown(); } -static void sub_811E6B0(void) +static void HideScrollIndicators(void) { - sUnknown_0203A11C->unk2F0->invisible = 1; - sUnknown_0203A11C->unk2F4->invisible = 1; + sScreenControl->scrollIndicatorUpSprite->invisible = TRUE; + sScreenControl->scrollIndicatorDownSprite->invisible = TRUE; } -static void sub_811E6E0(int arg0) +static void SetScrollIndicatorXPos(bool32 inWordSelect) { - if (!arg0) + if (!inWordSelect) { - sUnknown_0203A11C->unk2F0->pos1.x = 96; - sUnknown_0203A11C->unk2F4->pos1.x = 96; + // Keyboard (only relevant for group mode, can't scroll in alphabet mode) + sScreenControl->scrollIndicatorUpSprite->pos1.x = 96; + sScreenControl->scrollIndicatorDownSprite->pos1.x = 96; } else { - sUnknown_0203A11C->unk2F0->pos1.x = 120; - sUnknown_0203A11C->unk2F4->pos1.x = 120; + // Word select + sScreenControl->scrollIndicatorUpSprite->pos1.x = 120; + sScreenControl->scrollIndicatorDownSprite->pos1.x = 120; } } -static void sub_811E720(void) +// The Start/Select buttons are used as page scroll indicators +static void CreateStartSelectButtonSprites(void) { - u8 spriteId = CreateSprite(&sUnknown_08597E30, 220, 84, 1); + u8 spriteId = CreateSprite(&sSpriteTemplate_StartSelectButton, 220, 84, 1); if (spriteId != MAX_SPRITES) - sUnknown_0203A11C->unk2F8 = &gSprites[spriteId]; + sScreenControl->startButtonSprite = &gSprites[spriteId]; - spriteId = CreateSprite(&sUnknown_08597E30, 220, 156, 1); + spriteId = CreateSprite(&sSpriteTemplate_StartSelectButton, 220, 156, 1); if (spriteId != MAX_SPRITES) { - sUnknown_0203A11C->unk2FC = &gSprites[spriteId]; - StartSpriteAnim(sUnknown_0203A11C->unk2FC, 1); + sScreenControl->selectButtonSprite = &gSprites[spriteId]; + StartSpriteAnim(sScreenControl->selectButtonSprite, 1); } - sub_811E7F8(); + HideStartSelectButtons(); } -static void sub_811E794(void) +static void UpdateStartSelectButtonsVisibility(void) { - sUnknown_0203A11C->unk2F8->invisible = !sub_811BBF8(); - sUnknown_0203A11C->unk2FC->invisible = !sub_811BC2C(); + sScreenControl->startButtonSprite->invisible = !CanScrollUp(); + sScreenControl->selectButtonSprite->invisible = !CanScrollDown(); } -static void sub_811E7F8(void) +static void HideStartSelectButtons(void) { - sUnknown_0203A11C->unk2F8->invisible = 1; - sUnknown_0203A11C->unk2FC->invisible = 1; + sScreenControl->startButtonSprite->invisible = TRUE; + sScreenControl->selectButtonSprite->invisible = TRUE; } -static void sub_811E828(void) +static void TryAddInterviewObjectEvents(void) { int graphicsId; u8 spriteId; @@ -4732,9 +5007,10 @@ static void sub_811E828(void) return; } - if (GetEasyChatScreenFrameId() != 4) + if (GetEasyChatScreenFrameId() != FRAMEID_INTERVIEW_SHOW_PERSON) return; + // Add object for reporter/interviewing fan (facing left) spriteId = AddPseudoObjectEvent(graphicsId, SpriteCallbackDummy, 76, 40, 0); if (spriteId != MAX_SPRITES) { @@ -4742,6 +5018,7 @@ static void sub_811E828(void) StartSpriteAnim(&gSprites[spriteId], 2); } + // Add object for player (facing right) spriteId = AddPseudoObjectEvent( gSaveBlock2Ptr->playerGender == MALE ? OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL : OBJ_EVENT_GFX_RIVAL_MAY_NORMAL, SpriteCallbackDummy, @@ -4761,33 +5038,33 @@ int GetFooterIndex(void) u8 frameId = GetEasyChatScreenFrameId(); switch (sPhraseFrameDimensions[frameId].footerId) { - case 1: - return 1; - case 2: - return 2; - case 0: - return 0; + case FOOTER_QUIZ: + return FOOTER_QUIZ; + case FOOTER_ANSWER: + return FOOTER_ANSWER; + case FOOTER_NORMAL: + return FOOTER_NORMAL; default: - return 3; + return NUM_FOOTER_TYPES; } } static int GetFooterOptionXOffset(int option) { int footerIndex = GetFooterIndex(); - if (footerIndex < 3) + if (footerIndex < NUM_FOOTER_TYPES) return sFooterOptionXOffsets[footerIndex][option] + 4; else return 0; } -static void sub_811E948(void) +static void AddMainScreenButtonWindow(void) { int i; u16 windowId; struct WindowTemplate template; - int footerId = GetFooterIndex(); - if (footerId == 3) + int footerIndex = GetFooterIndex(); + if (footerIndex == NUM_FOOTER_TYPES) return; template.bg = 3; @@ -4799,13 +5076,13 @@ static void sub_811E948(void) template.baseBlock = 0x34; windowId = AddWindow(&template); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); - for (i = 0; i < 4; i++) + for (i = 0; i < (int)ARRAY_COUNT(sFooterTextOptions[0]); i++) { - const u8 *str = sFooterTextOptions[footerId][i]; + const u8 *str = sFooterTextOptions[footerIndex][i]; if (str) { - int x = sFooterOptionXOffsets[footerId][i]; - sub_811D028(windowId, 1, str, x, 1, 0, NULL); + int x = sFooterOptionXOffsets[footerIndex][i]; + PrintEasyChatText(windowId, 1, str, x, 1, 0, NULL); } } @@ -4822,7 +5099,7 @@ static bool8 IsEasyChatGroupUnlocked(u8 groupId) case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: return FlagGet(FLAG_SYS_GAME_CLEAR); - case EC_GROUP_POKEMON_2: + case EC_GROUP_POKEMON_NATIONAL: return EasyChatIsNationalPokedexEnabled(); default: return TRUE; @@ -4840,14 +5117,14 @@ u16 EasyChat_GetNumWordsInGroup(u8 groupId) return 0; } -bool8 sub_811EAA4(u16 easyChatWord) +static bool8 IsEasyChatWordInvalid(u16 easyChatWord) { u16 i; u8 groupId; u32 index; u16 numWords; const u16 *list; - if (easyChatWord == 0xFFFF) + if (easyChatWord == EC_EMPTY_WORD) return FALSE; groupId = EC_GROUP(easyChatWord); @@ -4859,7 +5136,7 @@ bool8 sub_811EAA4(u16 easyChatWord) switch (groupId) { case EC_GROUP_POKEMON: - case EC_GROUP_POKEMON_2: + case EC_GROUP_POKEMON_NATIONAL: case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: list = gEasyChatGroups[groupId].wordData.valueList; @@ -4869,15 +5146,15 @@ bool8 sub_811EAA4(u16 easyChatWord) return FALSE; } return TRUE; - default: - if (index >= numWords) - return TRUE; - else - return FALSE; } + + if (index >= numWords) + return TRUE; + else + return FALSE; } -bool8 ECWord_CheckIfOutsideOfValidRange(u16 easyChatWord) +bool8 IsBardWordInvalid(u16 easyChatWord) { int numWordsInGroup; u8 groupId = EC_GROUP(easyChatWord); @@ -4888,12 +5165,12 @@ bool8 ECWord_CheckIfOutsideOfValidRange(u16 easyChatWord) switch (groupId) { case EC_GROUP_POKEMON: - case EC_GROUP_POKEMON_2: - numWordsInGroup = gNumSpeciesNames; + case EC_GROUP_POKEMON_NATIONAL: + numWordsInGroup = gNumBardWords_Species; break; case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: - numWordsInGroup = gUnknown_085FA1D4; + numWordsInGroup = gNumBardWords_Moves; break; default: numWordsInGroup = gEasyChatGroups[groupId].numWords; @@ -4906,12 +5183,12 @@ bool8 ECWord_CheckIfOutsideOfValidRange(u16 easyChatWord) return FALSE; } -const u8 *GetEasyChatWord(u8 groupId, u16 index) +static const u8 *GetEasyChatWord(u8 groupId, u16 index) { switch (groupId) { case EC_GROUP_POKEMON: - case EC_GROUP_POKEMON_2: + case EC_GROUP_POKEMON_NATIONAL: return gSpeciesNames[index]; case EC_GROUP_MOVE_1: case EC_GROUP_MOVE_2: @@ -4924,11 +5201,11 @@ const u8 *GetEasyChatWord(u8 groupId, u16 index) u8 *CopyEasyChatWord(u8 *dest, u16 easyChatWord) { u8 *resultStr; - if (sub_811EAA4(easyChatWord)) + if (IsEasyChatWordInvalid(easyChatWord)) { resultStr = StringCopy(dest, gText_ThreeQuestionMarks); } - else if (easyChatWord != 0xFFFF) + else if (easyChatWord != EC_EMPTY_WORD) { u16 index = EC_INDEX(easyChatWord); u8 groupId = EC_GROUP(easyChatWord); @@ -4953,7 +5230,7 @@ u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows for (j = 0; j < numColumns; j++) { dest = CopyEasyChatWord(dest, *src); - if (*src != 0xFFFF) + if (*src != EC_EMPTY_WORD) { *dest = CHAR_SPACE; dest++; @@ -4972,26 +5249,26 @@ u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows return dest; } -u8 *unref_sub_811EC98(u8 *dest, const u16 *src, u16 columns, u16 rows) +static u8 *UnusedConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows) { u16 i, j, k; u16 numColumns; - int var0, var1; + int notEmpty, lineNumber; numColumns = columns; - var1 = 0; + lineNumber = 0; columns--; for (i = 0; i < rows; i++) { - const u16 *var2 = src; - var0 = 0; + const u16 *str = src; + notEmpty = FALSE; for (j = 0; j < numColumns; j++) { - if (var2[j] != 0xFFFF) - var0 = 1; + if (str[j] != EC_EMPTY_WORD) + notEmpty = TRUE; } - if (!var0) + if (!notEmpty) { src += numColumns; continue; @@ -5000,7 +5277,7 @@ u8 *unref_sub_811EC98(u8 *dest, const u16 *src, u16 columns, u16 rows) for (k = 0; k < columns; k++) { dest = CopyEasyChatWord(dest, *src); - if (*src != 0xFFFF) + if (*src != EC_EMPTY_WORD) { *dest = CHAR_SPACE; dest++; @@ -5010,13 +5287,13 @@ u8 *unref_sub_811EC98(u8 *dest, const u16 *src, u16 columns, u16 rows) } dest = CopyEasyChatWord(dest, *(src++)); - if (var1 == 0) + if (lineNumber == 0) *dest = CHAR_NEWLINE; else *dest = CHAR_PROMPT_SCROLL; dest++; - var1++; + lineNumber++; } dest--; @@ -5026,10 +5303,10 @@ u8 *unref_sub_811EC98(u8 *dest, const u16 *src, u16 columns, u16 rows) static u16 GetEasyChatWordStringLength(u16 easyChatWord) { - if (easyChatWord == 0xFFFF) + if (easyChatWord == EC_EMPTY_WORD) return 0; - if (sub_811EAA4(easyChatWord)) + if (IsEasyChatWordInvalid(easyChatWord)) { return StringLength(gText_ThreeQuestionMarks); } @@ -5062,7 +5339,7 @@ u16 GetRandomEasyChatWordFromGroup(u16 groupId) { u16 index = Random() % gEasyChatGroups[groupId].numWords; if (groupId == EC_GROUP_POKEMON - || groupId == EC_GROUP_POKEMON_2 + || groupId == EC_GROUP_POKEMON_NATIONAL || groupId == EC_GROUP_MOVE_1 || groupId == EC_GROUP_MOVE_2) { @@ -5075,7 +5352,7 @@ u16 GetRandomEasyChatWordFromGroup(u16 groupId) u16 GetRandomEasyChatWordFromUnlockedGroup(u16 groupId) { if (!IsEasyChatGroupUnlocked(groupId)) - return 0xFFFF; + return EC_EMPTY_WORD; if (groupId == EC_GROUP_POKEMON) return GetRandomUnlockedEasyChatPokemon(); @@ -5170,7 +5447,7 @@ u16 GetNewHipsterPhraseToTeach(void) u16 additionalPhraseId; u8 numAdditionalPhrasesUnlocked = GetNumAdditionalPhrasesUnlocked(); if (numAdditionalPhrasesUnlocked == NUM_ADDITIONAL_PHRASES) - return 0xFFFF; + return EC_EMPTY_WORD; additionalPhraseId = Random() % (NUM_ADDITIONAL_PHRASES - numAdditionalPhrasesUnlocked); for (i = 0; i < NUM_ADDITIONAL_PHRASES; i++) @@ -5189,7 +5466,7 @@ u16 GetNewHipsterPhraseToTeach(void) } } - return 0xFFFF; + return EC_EMPTY_WORD; } // Unused @@ -5198,7 +5475,7 @@ u16 GetRandomTaughtHipsterPhrase(void) u16 i; u16 additionalPhraseId = GetNumAdditionalPhrasesUnlocked(); if (additionalPhraseId == 0) - return 0xFFFF; + return EC_EMPTY_WORD; additionalPhraseId = Random() % additionalPhraseId; for (i = 0; i < NUM_ADDITIONAL_PHRASES; i++) @@ -5212,7 +5489,7 @@ u16 GetRandomTaughtHipsterPhrase(void) } } - return 0xFFFF; + return EC_EMPTY_WORD; } static bool8 EasyChatIsNationalPokedexEnabled(void) @@ -5227,7 +5504,7 @@ static u16 GetRandomUnlockedEasyChatPokemon(void) const u16 *species; u16 index = EasyChat_GetNumWordsInGroup(EC_GROUP_POKEMON); if (index == 0) - return 0xFFFF; + return EC_EMPTY_WORD; index = Random() % index; species = gEasyChatGroups[EC_GROUP_POKEMON].wordData.valueList; @@ -5246,29 +5523,29 @@ static u16 GetRandomUnlockedEasyChatPokemon(void) species++; } - return 0xFFFF; + return EC_EMPTY_WORD; } void InitEasyChatPhrases(void) { u16 i, j; - for (i = 0; i < 4; i++) + for (i = 0; i < ARRAY_COUNT(sDefaultProfileWords); i++) gSaveBlock1Ptr->easyChatProfile[i] = sDefaultProfileWords[i]; - for (i = 0; i < 6; i++) + for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) gSaveBlock1Ptr->easyChatBattleStart[i] = sDefaultBattleStartWords[i]; - for (i = 0; i < 6; i++) - gSaveBlock1Ptr->easyChatBattleWon[i] = sUnknown_0859E640[i]; + for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) + gSaveBlock1Ptr->easyChatBattleWon[i] = sDefaultBattleWonWords[i]; - for (i = 0; i < 6; i++) - gSaveBlock1Ptr->easyChatBattleLost[i] = sUnknown_0859E64C[i]; + for (i = 0; i < EASY_CHAT_BATTLE_WORDS_COUNT; i++) + gSaveBlock1Ptr->easyChatBattleLost[i] = sDefaultBattleLostWords[i]; for (i = 0; i < MAIL_COUNT; i++) { for (j = 0; j < MAIL_WORDS_COUNT; j++) - gSaveBlock1Ptr->mail[i].words[j] = 0xFFFF; + gSaveBlock1Ptr->mail[i].words[j] = EC_EMPTY_WORD; } #ifndef UBFIX @@ -5284,65 +5561,67 @@ void InitEasyChatPhrases(void) #endif } -static bool8 sub_811F28C(void) +static bool8 InitEasyChatScreenWordData(void) { - sUnknown_0203A120 = Alloc(sizeof(*sUnknown_0203A120)); - if (!sUnknown_0203A120) + sWordData = Alloc(sizeof(*sWordData)); + if (!sWordData) return FALSE; - sub_811F2D4(); - sub_811F46C(); + SetUnlockedEasyChatGroups(); + SetUnlockedWordsByAlphabet(); return TRUE; } -static void sub_811F2B8(void) +static void FreeEasyChatScreenWordData(void) { - if (sUnknown_0203A120) - FREE_AND_SET_NULL(sUnknown_0203A120); + if (sWordData) + FREE_AND_SET_NULL(sWordData); } -static void sub_811F2D4(void) +static void SetUnlockedEasyChatGroups(void) { int i; - sUnknown_0203A120->unk0 = 0; + sWordData->numUnlockedGroups = 0; if (GetNationalPokedexCount(FLAG_GET_SEEN)) - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = EC_GROUP_POKEMON; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_POKEMON; + // These groups are unlocked automatically for (i = EC_GROUP_TRAINER; i <= EC_GROUP_ADJECTIVES; i++) - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = i; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = i; if (FlagGet(FLAG_SYS_GAME_CLEAR)) { - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = EC_GROUP_EVENTS; - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = EC_GROUP_MOVE_1; - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = EC_GROUP_MOVE_2; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_EVENTS; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_MOVE_1; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_MOVE_2; } if (FlagGet(FLAG_SYS_HIPSTER_MEET)) - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = EC_GROUP_TRENDY_SAYING; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_TRENDY_SAYING; if (IsNationalPokedexEnabled()) - sUnknown_0203A120->unk2[sUnknown_0203A120->unk0++] = EC_GROUP_POKEMON_2; + sWordData->unlockedGroupIds[sWordData->numUnlockedGroups++] = EC_GROUP_POKEMON_NATIONAL; } -static u8 sub_811F3AC(void) +static u8 GetNumUnlockedEasyChatGroups(void) { - return sUnknown_0203A120->unk0; + return sWordData->numUnlockedGroups; } -static u8 sub_811F3B8(u8 index) +static u8 GetUnlockedEasyChatGroupId(u8 index) { - if (index >= sUnknown_0203A120->unk0) + if (index >= sWordData->numUnlockedGroups) return EC_NUM_GROUPS; else - return sUnknown_0203A120->unk2[index]; + return sWordData->unlockedGroupIds[index]; } -u8 *unref_sub_811F3E0(u8 *dest, u8 groupId, u16 totalChars) +// Unused +static u8 *BufferEasyChatWordGroupName(u8 *dest, u8 groupId, u16 totalChars) { u16 i; - u8 *str = StringCopy(dest, gEasyChatGroupNamePointers[groupId]); + u8 *str = StringCopy(dest, sEasyChatGroupNamePointers[groupId]); for (i = str - dest; i < totalChars; i++) { *str = CHAR_SPACE; @@ -5355,7 +5634,7 @@ u8 *unref_sub_811F3E0(u8 *dest, u8 groupId, u16 totalChars) static const u8 *GetEasyChatWordGroupName(u8 groupId) { - return gEasyChatGroupNamePointers[groupId]; + return sEasyChatGroupNamePointers[groupId]; } static u8 *CopyEasyChatWordPadded(u8 *dest, u16 easyChatWord, u16 totalChars) @@ -5372,7 +5651,7 @@ static u8 *CopyEasyChatWordPadded(u8 *dest, u16 easyChatWord, u16 totalChars) return str; } -static void sub_811F46C(void) +static void SetUnlockedWordsByAlphabet(void) { int i, j, k; int numWords; @@ -5380,15 +5659,15 @@ static void sub_811F46C(void) u16 numToProcess; int index; - for (i = 0; i < 27; i++) + for (i = 0; i < EC_NUM_ALPHABET_GROUPS; i++) { numWords = gEasyChatWordsByLetterPointers[i].numWords; words = gEasyChatWordsByLetterPointers[i].words; - sUnknown_0203A120->unk2E[i] = 0; + sWordData->numUnlockedAlphabetWords[i] = 0; index = 0; for (j = 0; j < numWords; j++) { - if (*words == 0xFFFF) + if (*words == EC_EMPTY_WORD) { words++; numToProcess = *words; @@ -5402,10 +5681,10 @@ static void sub_811F46C(void) for (k = 0; k < numToProcess; k++) { - if (sub_811F860(words[k])) + if (IsEasyChatWordUnlocked(words[k])) { - sUnknown_0203A120->unk64[i][index++] = words[k]; - sUnknown_0203A120->unk2E[i]++; + sWordData->unlockedAlphabetWords[i][index++] = words[k]; + sWordData->numUnlockedAlphabetWords[i]++; break; } } @@ -5415,28 +5694,28 @@ static void sub_811F46C(void) } } -static void sub_811F548(int arg0, u16 groupId) +static void SetSelectedWordGroup(bool32 inAlphabetMode, u16 groupId) { - if (!arg0) - sUnknown_0203A120->unk3BA0 = sub_811F5C4(groupId); + if (!inAlphabetMode) + sWordData->numSelectedGroupWords = SetSelectedWordGroup_GroupMode(groupId); else - sUnknown_0203A120->unk3BA0 = sub_811F6B8(groupId); + sWordData->numSelectedGroupWords = SetSelectedWordGroup_AlphabetMode(groupId); } -static u16 sub_811F578(u16 arg0) +static u16 GetWordFromSelectedGroup(u16 index) { - if (arg0 >= sUnknown_0203A120->unk3BA0) - return 0xFFFF; + if (index >= sWordData->numSelectedGroupWords) + return EC_EMPTY_WORD; else - return sUnknown_0203A120->unk3984[arg0]; + return sWordData->selectedGroupWords[index]; } -static u16 sub_811F5B0(void) +static u16 GetNumWordsInSelectedGroup(void) { - return sUnknown_0203A120->unk3BA0; + return sWordData->numSelectedGroupWords; } -static u16 sub_811F5C4(u16 groupId) +static u16 SetSelectedWordGroup_GroupMode(u16 groupId) { u32 i; int totalWords; @@ -5444,14 +5723,14 @@ static u16 sub_811F5C4(u16 groupId) const struct EasyChatWordInfo *wordInfo; u16 numWords = gEasyChatGroups[groupId].numWords; - if (groupId == EC_GROUP_POKEMON || groupId == EC_GROUP_POKEMON_2 + if (groupId == EC_GROUP_POKEMON || groupId == EC_GROUP_POKEMON_NATIONAL || groupId == EC_GROUP_MOVE_1 || groupId == EC_GROUP_MOVE_2) { list = gEasyChatGroups[groupId].wordData.valueList; for (i = 0, totalWords = 0; i < numWords; i++) { - if (sub_811F764(list[i], groupId)) - sUnknown_0203A120->unk3984[totalWords++] = EC_WORD(groupId, list[i]); + if (IsEasyChatIndexAndGroupUnlocked(list[i], groupId)) + sWordData->selectedGroupWords[totalWords++] = EC_WORD(groupId, list[i]); } return totalWords; @@ -5462,45 +5741,45 @@ static u16 sub_811F5C4(u16 groupId) for (i = 0, totalWords = 0; i < numWords; i++) { u16 alphabeticalOrder = wordInfo[i].alphabeticalOrder; - if (sub_811F764(alphabeticalOrder, groupId)) - sUnknown_0203A120->unk3984[totalWords++] = EC_WORD(groupId, alphabeticalOrder); + if (IsEasyChatIndexAndGroupUnlocked(alphabeticalOrder, groupId)) + sWordData->selectedGroupWords[totalWords++] = EC_WORD(groupId, alphabeticalOrder); } return totalWords; } } -static u16 sub_811F6B8(u16 alphabeticalGroup) +static u16 SetSelectedWordGroup_AlphabetMode(u16 groupId) { u16 i; u16 totalWords; - for (i = 0, totalWords = 0; i < sUnknown_0203A120->unk2E[alphabeticalGroup]; i++) - sUnknown_0203A120->unk3984[totalWords++] = sUnknown_0203A120->unk64[alphabeticalGroup][i]; + for (i = 0, totalWords = 0; i < sWordData->numUnlockedAlphabetWords[groupId]; i++) + sWordData->selectedGroupWords[totalWords++] = sWordData->unlockedAlphabetWords[groupId][i]; return totalWords; } -static bool8 sub_811F72C(u8 arg0) +static bool8 IsEasyChatGroupUnlocked2(u8 groupId) { int i; - for (i = 0; i < sUnknown_0203A120->unk0; i++) + for (i = 0; i < sWordData->numUnlockedGroups; i++) { - if (sUnknown_0203A120->unk2[i] == arg0) + if (sWordData->unlockedGroupIds[i] == groupId) return TRUE; } return FALSE; } -static bool8 sub_811F764(u16 wordIndex, u8 groupId) +static bool8 IsEasyChatIndexAndGroupUnlocked(u16 wordIndex, u8 groupId) { switch (groupId) { case EC_GROUP_POKEMON: return GetSetPokedexFlag(SpeciesToNationalPokedexNum(wordIndex), FLAG_GET_SEEN); - case EC_GROUP_POKEMON_2: - if (sub_811F838(wordIndex)) + case EC_GROUP_POKEMON_NATIONAL: + if (IsRestrictedWordSpecies(wordIndex)) GetSetPokedexFlag(SpeciesToNationalPokedexNum(wordIndex), FLAG_GET_SEEN); return TRUE; case EC_GROUP_MOVE_1: @@ -5513,50 +5792,52 @@ static bool8 sub_811F764(u16 wordIndex, u8 groupId) } } -static int sub_811F838(u16 species) +// Pokémon words in EC_GROUP_POKEMON_NATIONAL are always allowed (assuming the group is unlocked) +// unless they are in this group. If they are in this group (just Deoxys), they must also have been seen. +static int IsRestrictedWordSpecies(u16 species) { u32 i; - for (i = 0; i < ARRAY_COUNT(sUnknown_0859E658); i++) + for (i = 0; i < ARRAY_COUNT(sRestrictedWordSpecies); i++) { - if (sUnknown_0859E658[i] == species) + if (sRestrictedWordSpecies[i] == species) return TRUE; } return FALSE; } -static u8 sub_811F860(u16 easyChatWord) +static u8 IsEasyChatWordUnlocked(u16 easyChatWord) { u8 groupId = EC_GROUP(easyChatWord); u32 index = EC_INDEX(easyChatWord); - if (!sub_811F72C(groupId)) + if (!IsEasyChatGroupUnlocked2(groupId)) return FALSE; else - return sub_811F764(index, groupId); + return IsEasyChatIndexAndGroupUnlocked(index, groupId); } void InitializeEasyChatWordArray(u16 *words, u16 length) { u16 i; - for (i = length - 1; i != 0xFFFF; i--) - *(words++) = 0xFFFF; + for (i = length - 1; i != EC_EMPTY_WORD; i--) + *(words++) = EC_EMPTY_WORD; } -void sub_811F8BC(void) +void InitQuestionnaireWords(void) { int i; - u16 *words = sub_801B058(); - for (i = 0; i < 4; i++) - words[i] = 0xFFFF; + u16 *words = GetQuestionnaireWordsPtr(); + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) + words[i] = EC_EMPTY_WORD; } -bool32 sub_811F8D8(int easyChatWord) +bool32 IsEasyChatAnswerUnlocked(int easyChatWord) { int groupId = EC_GROUP(easyChatWord); - int mask = 0x7F; + int mask = EC_MASK_GROUP; int index = EC_INDEX(easyChatWord); if (!IsEasyChatGroupUnlocked(groupId & mask)) return FALSE; else - return sub_811F764(index, groupId & mask); + return IsEasyChatIndexAndGroupUnlocked(index, groupId & mask); } diff --git a/src/egg_hatch.c b/src/egg_hatch.c index f90441b68..576e5c0d9 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -54,7 +54,7 @@ struct EggHatchData u8 textColor[3]; }; -extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle +extern const u32 gTradePlatform_Tilemap[]; extern const u8 gText_HatchedFromEgg[]; extern const u8 gText_NicknameHatchPrompt[]; @@ -297,7 +297,7 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) { u16 species; u32 personality, pokerus; - u8 i, friendship, language, gameMet, markings, obedience; + u8 i, friendship, language, gameMet, markings, isEventLegal; u16 moves[MAX_MON_MOVES]; u32 ivs[NUM_STATS]; @@ -320,9 +320,9 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) gameMet = GetMonData(egg, MON_DATA_MET_GAME); markings = GetMonData(egg, MON_DATA_MARKINGS); pokerus = GetMonData(egg, MON_DATA_POKERUS); - obedience = GetMonData(egg, MON_DATA_OBEDIENCE); + isEventLegal = GetMonData(egg, MON_DATA_EVENT_LEGAL); - CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0); + CreateMon(temp, species, EGG_HATCH_LEVEL, USE_RANDOM_IVS, TRUE, personality, OT_ID_PLAYER_ID, 0); for (i = 0; i < MAX_MON_MOVES; i++) { @@ -342,7 +342,7 @@ static void CreateHatchedMon(struct Pokemon *egg, struct Pokemon *temp) friendship = 120; SetMonData(temp, MON_DATA_FRIENDSHIP, &friendship); SetMonData(temp, MON_DATA_POKERUS, &pokerus); - SetMonData(temp, MON_DATA_OBEDIENCE, &obedience); + SetMonData(temp, MON_DATA_EVENT_LEGAL, &isEventLegal); *egg = *temp; } @@ -546,7 +546,7 @@ static void CB2_EggHatch_0(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); LoadPalette(gTradeGba2_Pal, 0x10, 0xA0); LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0); - CopyToBgTilemapBuffer(1, gUnknown_08331F60, 0x1000, 0); + CopyToBgTilemapBuffer(1, gTradePlatform_Tilemap, 0x1000, 0); CopyBgTilemapBufferToVram(1); gMain.state++; break; @@ -584,6 +584,9 @@ static void Task_EggHatchPlayBGM(u8 taskID) PlayBGM(MUS_EVOLUTION); DestroyTask(taskID); // UB: task is destroyed, yet the value is incremented + #ifdef UBFIX + return; + #endif } gTasks[taskID].data[0]++; } @@ -597,7 +600,7 @@ static void CB2_EggHatch_1(void) switch (sEggHatchData->CB2_state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5); ShowBg(0); ShowBg(1); @@ -680,7 +683,7 @@ static void CB2_EggHatch_1(void) } break; case 11: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); sEggHatchData->CB2_state++; break; case 12: @@ -790,7 +793,7 @@ static void SpriteCB_Egg_4(struct Sprite* sprite) { s16 i; if (sprite->data[0] == 0) - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 0x10, RGB_WHITEALPHA); if (sprite->data[0] < 4u) { for (i = 0; i <= 3; i++) @@ -811,10 +814,10 @@ static void SpriteCB_Egg_5(struct Sprite* sprite) if (sprite->data[0] == 0) { gSprites[sEggHatchData->pokeSpriteID].invisible = FALSE; - StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1); + StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], BATTLER_AFFINE_EMERGE); } if (sprite->data[0] == 8) - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_WHITEALPHA); if (sprite->data[0] <= 9) gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1; if (sprite->data[0] > 40) diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c index 944d1d728..eef2a15d8 100755 --- a/src/ereader_helpers.c +++ b/src/ereader_helpers.c @@ -14,34 +14,64 @@ #include "constants/trainers.h" #include "constants/moves.h" #include "constants/items.h" +#include "constants/trainer_hill.h" + +enum { + EREADER_XFR_STATE_INIT = 0, + EREADER_XFR_STATE_HANDSHAKE, + EREADER_XFR_STATE_START, + EREADER_XFR_STATE_TRANSFER, + EREADER_XFR_STATE_TRANSFER_DONE, + EREADER_XFR_STATE_CHECKSUM, + EREADER_XFR_STATE_DONE +}; + +#define EREADER_XFER_EXE 1 +#define EREADER_XFER_CHK 2 +#define EREADER_XFER_SHIFT 0 +#define EREADER_XFER_MASK 3 + +#define EREADER_CANCEL_TIMEOUT 1 +#define EREADER_CANCEL_KEY 2 +#define EREADER_CANCEL_MASK 0xC +#define EREADER_CANCEL_SHIFT 2 -struct Unknown030012C8 +#define EREADER_CHECKSUM_OK 1 +#define EREADER_CHECKSUM_ERR 2 +#define EREADER_CHECKSUM_MASK 0x30 +#define EREADER_CHECKSUM_SHIFT 4 + +struct SendRecvMgr { - u8 unk0[8]; - u32 *unk8; - int unkC; - int unk10; - int unk14; + bool8 isParent; + u8 state; // EREADER_XFR_STATE_* + u8 xferState; // EREADER_XFER_* + u8 checksumResult; // EREADER_CHECKSUM_* + u8 cancellationReason; // EREADER_CANCEL_* + u32 *data; // Payload source or destination + int cursor; // Index of the next word + int size; // Last word index + int checksum; }; -static void sub_81D4170(void); -static u16 sub_81D3EE8(u8); -static void sub_81D413C(void); -static void sub_81D414C(void); -static void sub_81D3F1C(u32, u32*, u32*); -static void sub_81D3F68(void); - -static struct Unknown030012C8 gUnknown_030012C8; -static u16 gUnknown_030012E0; -static u16 gUnknown_030012E2; -static u16 gUnknown_030012E4; -static u16 gUnknown_030012E6; -static u32 gUnknown_030012E8; -static u16 gUnknown_030012EC; -static u16 gUnknown_030012EE; -static u16 gUnknown_030012F0; -static u16 gUnknown_030012F2; -static u16 gUnknown_030012F4; +static void GetKeyInput(void); +static u16 DetermineSendRecvState(u8); +static void EnableSio(void); +static void DisableTm3(void); +static void SetUpTransferManager(size_t, const void *, void *); +static void StartTm3(void); + +static struct SendRecvMgr sSendRecvMgr; +static u16 sJoyNewOrRepeated; +static u16 sJoyNew; +static u16 sSendRecvStatus; +static u16 sCounter1; +static u32 sCounter2; +static u16 sSavedIme; +static u16 sSavedIe; +static u16 sSavedTm3Cnt; +static u16 sSavedSioCnt; +static u16 sSavedRCnt; static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = { [0] = { @@ -134,10 +164,10 @@ static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = { .name = __("ハルヒト$$$$ "), .facilityClass = FACILITY_CLASS_CAMPER, .unused = 0x1, - .speechBefore = { EC_MOVE2(BOUNCE), EC_WORD_AS_MUCH_AS, 0xFFFF, EC_WORD_THEY_RE, EC_WORD_STRONG, EC_WORD_EXCL }, - .speechWin = { EC_MOVE(FLY), EC_WORD_AS_MUCH_AS, 0xFFFF, EC_WORD_THEY_RE, EC_WORD_HAPPY, EC_WORD_EXCL }, - .speechLose = { EC_MOVE2(MINIMIZE), EC_WORD_AS_MUCH_AS, 0xFFFF, EC_WORD_THEY_RE, EC_WORD_SAD, EC_WORD_EXCL }, - .speechAfter = { EC_MOVE(BITE), EC_WORD_AS_MUCH_AS, 0xFFFF, EC_WORD_THEY_RE, EC_WORD_ANGRY, EC_WORD_EXCL }, + .speechBefore = { EC_MOVE2(BOUNCE), EC_WORD_AS_MUCH_AS, EC_EMPTY_WORD, EC_WORD_THEY_RE, EC_WORD_STRONG, EC_WORD_EXCL }, + .speechWin = { EC_MOVE(FLY), EC_WORD_AS_MUCH_AS, EC_EMPTY_WORD, EC_WORD_THEY_RE, EC_WORD_HAPPY, EC_WORD_EXCL }, + .speechLose = { EC_MOVE2(MINIMIZE), EC_WORD_AS_MUCH_AS, EC_EMPTY_WORD, EC_WORD_THEY_RE, EC_WORD_SAD, EC_WORD_EXCL }, + .speechAfter = { EC_MOVE(BITE), EC_WORD_AS_MUCH_AS, EC_EMPTY_WORD, EC_WORD_THEY_RE, EC_WORD_ANGRY, EC_WORD_EXCL }, .mons = { [0] = NULL_BATTLE_TOWER_POKEMON, [1] = NULL_BATTLE_TOWER_POKEMON, @@ -223,7 +253,7 @@ static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = { .speechBefore = { EC_WORD_SHINE, EC_WORD_POKEMON, EC_WORD_RELEASE, EC_WORD_WAS, EC_MOVE2(FRUSTRATION), EC_WORD_WITHOUT }, .speechWin = { EC_WORD_SHINE, EC_WORD_POKEMON, EC_WORD_TO_HER, EC_MOVE2(PRESENT), EC_WORD_KNOWS, EC_WORD_WITHOUT }, .speechLose = { EC_WORD_THAT, EC_WORD_ABOVE, EC_WORD_LOST, EC_WORD_STORES, EC_WORD_JOKING, EC_WORD_ELLIPSIS_ELLIPSIS_ELLIPSIS }, - .speechAfter = { EC_WORD_ENTERTAINING, EC_WORD_NONE, EC_WORD_HEY_QUES, EC_WORD_ALMOST, EC_WORD_EXCL, 0xFFFF }, + .speechAfter = { EC_WORD_ENTERTAINING, EC_WORD_NONE, EC_WORD_HEY_QUES, EC_WORD_ALMOST, EC_WORD_EXCL, EC_EMPTY_WORD }, .mons = { [0] = NULL_BATTLE_TOWER_POKEMON, [1] = NULL_BATTLE_TOWER_POKEMON, @@ -307,7 +337,7 @@ static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = { .facilityClass = FACILITY_CLASS_GENTLEMAN, .unused = 0x1, .speechBefore = { EC_WORD_SHE_WAS, EC_WORD_NO_1, EC_WORD_STRONG, EC_WORD_UNCLE, EC_WORD_THERE, EC_WORD_EXCL }, - .speechWin = { EC_WORD_HAHAHA, EC_WORD_TEACHER, EC_WORD_BECOMES, EC_WORD_GIVE, EC_WORD_IS_IT_QUES, 0xFFFF }, + .speechWin = { EC_WORD_HAHAHA, EC_WORD_TEACHER, EC_WORD_BECOMES, EC_WORD_GIVE, EC_WORD_IS_IT_QUES, EC_EMPTY_WORD }, .speechLose = { EC_WORD_OUTSIDE, EC_WORD_UNCLE, EC_WORD_SURPRISE, EC_WORD_THESE, EC_WORD_HEY_QUES, EC_WORD_ELLIPSIS_EXCL }, .speechAfter = { EC_WORD_HE_S, EC_WORD_NO_1, EC_WORD_STRONG, EC_WORD_CHILDREN, EC_WORD_CAN_T, EC_WORD_EXCL_EXCL }, .mons = { @@ -390,217 +420,217 @@ static const struct TrainerHillTrainer sTrainerHillTrainerTemplates_JP[] = { }, }; -static u8 sub_81D38D4(void) +static u8 GetTrainerHillUnkVal(void) { return (gSaveBlock1Ptr->trainerHill.unused + 1) % 256; } -static bool32 Struct_EReaderTrainerHillTrainer_ValidateChecksum(struct EReaderTrainerHillTrainer *arg0) +static bool32 ValidateTrainerChecksum(struct EReaderTrainerHillTrainer * hillTrainer) { - int checksum = CalcByteArraySum((u8 *)arg0, 0x270); - if (checksum != arg0->checksum) + int checksum = CalcByteArraySum((u8 *)hillTrainer, offsetof(typeof(*hillTrainer), checksum)); + if (checksum != hillTrainer->checksum) return FALSE; return TRUE; } -bool8 EReader_IsReceivedDataValid(struct EReaderTrainerHillSet *buffer) +bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet * hillSet) { u32 i; u32 checksum; - int var0 = buffer->count; - if (var0 < 1 || var0 > 8) + int numTrainers = hillSet->numTrainers; + + // Validate number of trainers + if (numTrainers < 1 || numTrainers > NUM_TRAINER_HILL_TRAINERS) return FALSE; - for (i = 0; i < var0; i++) + // Validate trainers + for (i = 0; i < numTrainers; i++) { - if (!Struct_EReaderTrainerHillTrainer_ValidateChecksum(&buffer->unk_8[i])) + if (!ValidateTrainerChecksum(&hillSet->trainers[i])) return FALSE; } - checksum = CalcByteArraySum((u8 *)buffer->unk_8, var0 * sizeof(struct EReaderTrainerHillTrainer)); - if (checksum != buffer->checksum) + // Validate checksum + checksum = CalcByteArraySum((u8 *)hillSet->trainers, numTrainers * sizeof(struct EReaderTrainerHillTrainer)); + if (checksum != hillSet->checksum) return FALSE; return TRUE; } -static bool32 TrainerHill_VerifyChecksum(struct EReaderTrainerHillSet *buffer) +static bool32 ValidateTrainerHillChecksum(struct EReaderTrainerHillSet *hillSet) { u32 checksum; - int var0 = buffer->count; - if (var0 < 1 || var0 > 8) + int numTrainers = hillSet->numTrainers; + if (numTrainers < 1 || numTrainers > NUM_TRAINER_HILL_TRAINERS) return FALSE; - checksum = CalcByteArraySum((u8 *)buffer->unk_8, sizeof(struct EReaderTrainerHillSet) - offsetof(struct EReaderTrainerHillSet, unk_8)); - if (checksum != buffer->checksum) + checksum = CalcByteArraySum((u8 *)hillSet->trainers, sizeof(struct EReaderTrainerHillSet) - offsetof(struct EReaderTrainerHillSet, trainers)); + if (checksum != hillSet->checksum) return FALSE; return TRUE; } -static bool32 TryWriteTrainerHill_r(struct EReaderTrainerHillSet *ttdata, struct TrHillTag *buffer2) +static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet * hillSet, struct TrHillTag * hillTag) { int i; - AGB_ASSERT_EX(ttdata->dummy == 0, "cereader_tool.c", 450); - AGB_ASSERT_EX(ttdata->id == 0, "cereader_tool.c", 452); + AGB_ASSERT_EX(hillSet->dummy == 0, "cereader_tool.c", 450); + AGB_ASSERT_EX(hillSet->id == 0, "cereader_tool.c", 452); - memset(buffer2, 0, 0x1000); - buffer2->numTrainers = ttdata->count; - buffer2->unused1 = sub_81D38D4(); - buffer2->numFloors = (ttdata->count + 1) / 2; + memset(hillTag, 0, SECTOR_SIZE); + hillTag->numTrainers = hillSet->numTrainers; + hillTag->unused1 = GetTrainerHillUnkVal(); + hillTag->numFloors = (hillSet->numTrainers + 1) / TRAINER_HILL_TRAINERS_PER_FLOOR; - for (i = 0; i < ttdata->count; i++) + for (i = 0; i < hillSet->numTrainers; i++) { if (!(i & 1)) { - buffer2->floors[i / 2].trainerNum1 = ttdata->unk_8[i].unk0; - buffer2->floors[i / 2].display = ttdata->unk_8[i].unk14C; - buffer2->floors[i / 2].trainers[0] = ttdata->unk_8[i].unk4; + hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainerNum1 = hillSet->trainers[i].trainerNum; + hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].display = hillSet->trainers[i].display; + hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[0] = hillSet->trainers[i].trainer; } else { - buffer2->floors[i / 2].trainerNum2 = ttdata->unk_8[i].unk0; - buffer2->floors[i / 2].trainers[1] = ttdata->unk_8[i].unk4; + hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainerNum2 = hillSet->trainers[i].trainerNum; + hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[1] = hillSet->trainers[i].trainer; } } if (i & 1) { - buffer2->floors[i / 2].trainers[1] = sTrainerHillTrainerTemplates_JP[i / 2]; + hillTag->floors[i / TRAINER_HILL_TRAINERS_PER_FLOOR].trainers[1] = sTrainerHillTrainerTemplates_JP[i / TRAINER_HILL_TRAINERS_PER_FLOOR]; } - buffer2->checksum = CalcByteArraySum((u8 *)buffer2->floors, 4 * sizeof(struct TrHillFloor)); - if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)buffer2) != SAVE_STATUS_OK) + hillTag->checksum = CalcByteArraySum((u8 *)hillTag->floors, NUM_TRAINER_HILL_FLOORS * sizeof(struct TrHillFloor)); + if (TryWriteSpecialSaveSection(SECTOR_ID_TRAINER_HILL, (u8 *)hillTag) != SAVE_STATUS_OK) return FALSE; return TRUE; } -bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *arg0) +bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet * hillSet) { - void *var0 = AllocZeroed(0x1000); - bool32 result = TryWriteTrainerHill_r(arg0, var0); - Free(var0); + void *buffer = AllocZeroed(SECTOR_SIZE); + bool32 result = TryWriteTrainerHill_Internal(hillSet, buffer); + Free(buffer); return result; } -static bool32 TryReadTrainerHill_r(struct EReaderTrainerHillSet *dst, u8 *buffer) +static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet * dest, u8 * buffer) { if (TryReadSpecialSaveSection(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK) return FALSE; - memcpy(dst, buffer, sizeof(struct EReaderTrainerHillSet)); - if (!TrainerHill_VerifyChecksum(dst)) + memcpy(dest, buffer, sizeof(struct EReaderTrainerHillSet)); + if (!ValidateTrainerHillChecksum(dest)) return FALSE; return TRUE; } -static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet *arg0) +static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet * hillSet) { - u8 *var0 = AllocZeroed(0x1000); - bool32 result = TryReadTrainerHill_r(arg0, var0); - Free(var0); + u8 *buffer = AllocZeroed(SECTOR_SIZE); + bool32 result = TryReadTrainerHill_Internal(hillSet, buffer); + Free(buffer); return result; } bool32 ReadTrainerHillAndValidate(void) { - struct EReaderTrainerHillSet *var0 = AllocZeroed(0x1000); - bool32 result = TryReadTrainerHill(var0); - Free(var0); + struct EReaderTrainerHillSet *hillSet = AllocZeroed(SECTOR_SIZE); + bool32 result = TryReadTrainerHill(hillSet); + Free(hillSet); return result; } -int EReader_Send(int arg0, u32 *arg1) +int EReader_Send(int size, const void * src) { int result; - u16 var0; - int var1; + int sendStatus; EReaderHelper_SaveRegsState(); while (1) { - sub_81D4170(); - if (gUnknown_030012E2 & 2) + GetKeyInput(); + if (sJoyNew & B_BUTTON) gShouldAdvanceLinkState = 2; - var1 = EReaderHandleTransfer(1, arg0, arg1, NULL); - gUnknown_030012E4 = var1; - if ((gUnknown_030012E4 & 0x13) == 0x10) + sendStatus = EReaderHandleTransfer(1, size, src, NULL); + sSendRecvStatus = sendStatus; + if ((sSendRecvStatus & 0x13) == 0x10) { result = 0; break; } - - if (gUnknown_030012E4 & 0x8) + else if (sSendRecvStatus & 0x8) { result = 1; break; } - - var0 = gUnknown_030012E4 & 0x4; - if (var0) + else if (sSendRecvStatus & 0x4) { result = 2; break; } - - gShouldAdvanceLinkState = var0; - VBlankIntrWait(); + else + { + gShouldAdvanceLinkState = 0; + VBlankIntrWait(); + } } - CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8)); + CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); EReaderHelper_RestoreRegsState(); return result; } -int EReader_Recv(u32 *arg0) +int EReader_Recv(void * dest) { int result; - u16 var0; - int var1; + int recvStatus; EReaderHelper_SaveRegsState(); while (1) { - sub_81D4170(); - if (gUnknown_030012E2 & 2) + GetKeyInput(); + if (sJoyNew & B_BUTTON) gShouldAdvanceLinkState = 2; - var1 = EReaderHandleTransfer(0, 0, NULL, arg0); - gUnknown_030012E4 = var1; - if ((gUnknown_030012E4 & 0x13) == 0x10) + recvStatus = EReaderHandleTransfer(0, 0, NULL, dest); + sSendRecvStatus = recvStatus; + if ((sSendRecvStatus & 0x13) == 0x10) { result = 0; break; } - - if (gUnknown_030012E4 & 0x8) + else if (sSendRecvStatus & 0x8) { result = 1; break; } - - var0 = gUnknown_030012E4 & 0x4; - if (var0) + else if (sSendRecvStatus & 0x4) { result = 2; break; } - - gShouldAdvanceLinkState = var0; - VBlankIntrWait(); + else + { + gShouldAdvanceLinkState = 0; + VBlankIntrWait(); + } } - CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8)); + CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); EReaderHelper_RestoreRegsState(); return result; } -static void sub_81D3C7C(void) +static void CloseSerial(void) { REG_IME = 0; REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); @@ -610,7 +640,7 @@ static void sub_81D3C7C(void) REG_IF = INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL; } -static void sub_81D3CBC(void) +static void OpenSerialMulti(void) { REG_IME = 0; REG_IE &= ~(INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); @@ -622,273 +652,271 @@ static void sub_81D3CBC(void) REG_IE |= INTR_FLAG_SERIAL; REG_IME = 1; - if (!gUnknown_030012C8.unk0[1]) - CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8)); + if (sSendRecvMgr.state == 0) + CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); } -static void sub_81D3D34(void) +static void OpenSerial32(void) { REG_RCNT = 0; REG_SIOCNT = SIO_32BIT_MODE | SIO_INTR_ENABLE; REG_SIOCNT |= SIO_MULTI_SD; gShouldAdvanceLinkState = 0; - gUnknown_030012E6 = 0; - gUnknown_030012E8 = 0; + sCounter1 = 0; + sCounter2 = 0; } -int EReaderHandleTransfer(u8 arg0, u32 arg1, u32 *arg2, u32 *arg3) +int EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBuffer) { - switch (gUnknown_030012C8.unk0[1]) + switch (sSendRecvMgr.state) { - case 0: - sub_81D3CBC(); - gUnknown_030012C8.unk0[2] = 1; - gUnknown_030012C8.unk0[1] = 1; + case EREADER_XFR_STATE_INIT: + OpenSerialMulti(); + sSendRecvMgr.xferState = EREADER_XFER_EXE; + sSendRecvMgr.state = EREADER_XFR_STATE_HANDSHAKE; break; - case 1: - if (sub_81D3EE8(arg0)) - sub_81D413C(); + case EREADER_XFR_STATE_HANDSHAKE: + if (DetermineSendRecvState(mode)) + EnableSio(); if (gShouldAdvanceLinkState == 2) { - gUnknown_030012C8.unk0[4] = 2; - gUnknown_030012C8.unk0[1] = 6; + sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY; + sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } break; - case 2: - sub_81D3D34(); - sub_81D3F1C(arg1, arg2, arg3); - gUnknown_030012C8.unk0[1] = 3; + case EREADER_XFR_STATE_START: + OpenSerial32(); + SetUpTransferManager(size, data, recvBuffer); + sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER; // fall through - case 3: + case EREADER_XFR_STATE_TRANSFER: if (gShouldAdvanceLinkState == 2) { - gUnknown_030012C8.unk0[4] = 2; - gUnknown_030012C8.unk0[1] = 6; + sSendRecvMgr.cancellationReason = EREADER_CANCEL_KEY; + sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } else { - gUnknown_030012E6++; - gUnknown_030012E8++; - if (!gUnknown_030012C8.unk0[0] && gUnknown_030012E8 > 60) + sCounter1++; + sCounter2++; + if (!sSendRecvMgr.isParent && sCounter2 > 60) { - gUnknown_030012C8.unk0[4] = 1; - gUnknown_030012C8.unk0[1] = 6; + sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT; + sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } - if (gUnknown_030012C8.unk0[2] != 2) + if (sSendRecvMgr.xferState != EREADER_XFER_CHK) { - if (gUnknown_030012C8.unk0[0] && gUnknown_030012E6 > 2) + if (sSendRecvMgr.isParent && sCounter1 > 2) { - sub_81D413C(); - gUnknown_030012C8.unk0[2] = 2; + EnableSio(); + sSendRecvMgr.xferState = EREADER_XFER_CHK; } else { - sub_81D413C(); - gUnknown_030012C8.unk0[2] = 2; + EnableSio(); + sSendRecvMgr.xferState = EREADER_XFER_CHK; } } } break; - case 4: - sub_81D3CBC(); - gUnknown_030012C8.unk0[1] = 5; + case EREADER_XFR_STATE_TRANSFER_DONE: + OpenSerialMulti(); + sSendRecvMgr.state = EREADER_XFR_STATE_CHECKSUM; break; - case 5: - if (gUnknown_030012C8.unk0[0] == 1 && gUnknown_030012E6 > 2) - sub_81D413C(); + case EREADER_XFR_STATE_CHECKSUM: + if (sSendRecvMgr.isParent == TRUE && sCounter1 > 2) + EnableSio(); - if (++gUnknown_030012E6 > 60) + if (++sCounter1 > 60) { - gUnknown_030012C8.unk0[4] = 1; - gUnknown_030012C8.unk0[1] = 6; + sSendRecvMgr.cancellationReason = EREADER_CANCEL_TIMEOUT; + sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } break; - case 6: - if (gUnknown_030012C8.unk0[2]) + case EREADER_XFR_STATE_DONE: + if (sSendRecvMgr.xferState) { - sub_81D3C7C(); - gUnknown_030012C8.unk0[2] = 0; + CloseSerial(); + sSendRecvMgr.xferState = 0; } break; } - return gUnknown_030012C8.unk0[2] | (gUnknown_030012C8.unk0[4] << 2) | (gUnknown_030012C8.unk0[3] << 4); + return (sSendRecvMgr.xferState << EREADER_XFER_SHIFT) + | (sSendRecvMgr.cancellationReason << EREADER_CANCEL_SHIFT) + | (sSendRecvMgr.checksumResult << EREADER_CHECKSUM_SHIFT); } -static u16 sub_81D3EE8(u8 arg0) +static u16 DetermineSendRecvState(u8 mode) { - u16 terminal = (*(vu32 *)REG_ADDR_SIOCNT) & (SIO_MULTI_SI | SIO_MULTI_SD); - if (terminal == SIO_MULTI_SD && arg0) - { - gUnknown_030012C8.unk0[0] = 1; - return 1; - } + bool16 resp; + if ((*(vu32 *)REG_ADDR_SIOCNT & (SIO_MULTI_SI | SIO_MULTI_SD)) == SIO_MULTI_SD && mode) + resp = sSendRecvMgr.isParent = TRUE; else - { - gUnknown_030012C8.unk0[0] = 0; - return 0; - } + resp = sSendRecvMgr.isParent = FALSE; + return resp; } -static void sub_81D3F1C(u32 arg0, u32 *arg1, u32 *arg2) +static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer) { - if (gUnknown_030012C8.unk0[0]) + if (sSendRecvMgr.isParent) { REG_SIOCNT |= SIO_38400_BPS; - gUnknown_030012C8.unk8 = arg1; - REG_SIODATA32 = arg0; - gUnknown_030012C8.unk10 = arg0 / 4 + 1; - sub_81D3F68(); + sSendRecvMgr.data = (void *)data; + REG_SIODATA32 = size; + sSendRecvMgr.size = size / 4 + 1; + StartTm3(); } else { REG_SIOCNT = REG_SIOCNT; - gUnknown_030012C8.unk8 = arg2; + sSendRecvMgr.data = recvBuffer; } } -static void sub_81D3F68(void) +static void StartTm3(void) { - REG_TM3CNT_L = 0xFDA7; + REG_TM3CNT_L = -601; REG_TM3CNT_H = TIMER_INTR_ENABLE; REG_IME = 0; REG_IE |= INTR_FLAG_TIMER3; REG_IME = 1; } -void sub_81D3F9C(void) +void EReaderHelper_Timer3Callback(void) { - sub_81D414C(); - sub_81D413C(); + DisableTm3(); + EnableSio(); } -void sub_81D3FAC(void) +void EReaderHelper_SerialCallback(void) { - u16 i, playerCount, k; - u32 value; - u16 var0; - u16 recvBuffer[4]; + u16 i, cnt1, cnt2; + u32 recv32; + u16 recv[4]; - switch (gUnknown_030012C8.unk0[1]) + switch (sSendRecvMgr.state) { - case 1: + case EREADER_XFR_STATE_HANDSHAKE: REG_SIOMLT_SEND = 0xCCD0; // Handshake id - *(u64 *)recvBuffer = REG_SIOMLT_RECV; - for (i = 0, playerCount = 0, k = 0; i < 4; i++) + *(u64 *)recv = REG_SIOMLT_RECV; + for (i = 0, cnt1 = 0, cnt2 = 0; i < 4; i++) { - if (recvBuffer[i] == 0xCCD0) - playerCount++; - else if (recvBuffer[i] != 0xFFFF) - k++; + if (recv[i] == 0xCCD0) + cnt1++; + else if (recv[i] != 0xFFFF) + cnt2++; } - if (playerCount == 2 && k == 0) - gUnknown_030012C8.unk0[1] = 2; + if (cnt1 == 2 && cnt2 == 0) + sSendRecvMgr.state = 2; break; - case 3: - value = REG_SIODATA32; - if (!gUnknown_030012C8.unkC && !gUnknown_030012C8.unk0[0]) - gUnknown_030012C8.unk10 = value / 4 + 1; + case EREADER_XFR_STATE_TRANSFER: + recv32 = REG_SIODATA32; + // The first value sent by the EReader is the payload size + if (!sSendRecvMgr.cursor && !sSendRecvMgr.isParent) + sSendRecvMgr.size = recv32 / 4 + 1; - if (gUnknown_030012C8.unk0[0] == 1) + if (sSendRecvMgr.isParent == TRUE) { - if (gUnknown_030012C8.unkC < gUnknown_030012C8.unk10) + // Send mode + if (sSendRecvMgr.cursor < sSendRecvMgr.size) { - REG_SIODATA32 = gUnknown_030012C8.unk8[gUnknown_030012C8.unkC]; - gUnknown_030012C8.unk14 += gUnknown_030012C8.unk8[gUnknown_030012C8.unkC]; + REG_SIODATA32 = sSendRecvMgr.data[sSendRecvMgr.cursor]; + sSendRecvMgr.checksum += sSendRecvMgr.data[sSendRecvMgr.cursor]; } else { - REG_SIODATA32 = gUnknown_030012C8.unk14; + REG_SIODATA32 = sSendRecvMgr.checksum; } } else { - if (gUnknown_030012C8.unkC > 0 && gUnknown_030012C8.unkC < gUnknown_030012C8.unk10 + 1) + // Receive mode + if (sSendRecvMgr.cursor > 0 && sSendRecvMgr.cursor < sSendRecvMgr.size + 1) { - gUnknown_030012C8.unk8[gUnknown_030012C8.unkC - 1] = value; - gUnknown_030012C8.unk14 += value; + sSendRecvMgr.data[sSendRecvMgr.cursor - 1] = recv32; + sSendRecvMgr.checksum += recv32; } - else if (gUnknown_030012C8.unkC) + else if (sSendRecvMgr.cursor) { - if (gUnknown_030012C8.unk14 == value) - gUnknown_030012C8.unk0[3] = 1; + if (sSendRecvMgr.checksum == recv32) + sSendRecvMgr.checksumResult = EREADER_CHECKSUM_OK; else - gUnknown_030012C8.unk0[3] = 2; + sSendRecvMgr.checksumResult = EREADER_CHECKSUM_ERR; } - gUnknown_030012E8 = 0; + sCounter2 = 0; } - if (++gUnknown_030012C8.unkC < gUnknown_030012C8.unk10 + 2) + if (++sSendRecvMgr.cursor < sSendRecvMgr.size + 2) { - if (gUnknown_030012C8.unk0[0]) + if (sSendRecvMgr.isParent) REG_TM3CNT_H |= TIMER_ENABLE; else - sub_81D413C(); + EnableSio(); } else { - gUnknown_030012C8.unk0[1] = 4; - gUnknown_030012E6 = 0; + sSendRecvMgr.state = EREADER_XFR_STATE_TRANSFER_DONE; + sCounter1 = 0; } break; - case 5: - if (!gUnknown_030012C8.unk0[0]) - REG_SIOMLT_SEND = gUnknown_030012C8.unk0[3]; + case EREADER_XFR_STATE_CHECKSUM: + if (!sSendRecvMgr.isParent) + REG_SIOMLT_SEND = sSendRecvMgr.checksumResult; - *(u64 *)recvBuffer = REG_SIOMLT_RECV; - var0 = recvBuffer[1] - 1; - if (var0 < 2) + *(vu64 *)recv = REG_SIOMLT_RECV; + if (recv[1] == EREADER_CHECKSUM_OK || recv[1] == EREADER_CHECKSUM_ERR) { - if (gUnknown_030012C8.unk0[0] == 1) - gUnknown_030012C8.unk0[3] = recvBuffer[1]; + if (sSendRecvMgr.isParent == TRUE) + sSendRecvMgr.checksumResult = recv[1]; // EReader has (in)validated the payload - gUnknown_030012C8.unk0[1] = 6; + sSendRecvMgr.state = EREADER_XFR_STATE_DONE; } break; } } -static void sub_81D413C(void) +static void EnableSio(void) { REG_SIOCNT |= SIO_ENABLE; } -static void sub_81D414C(void) +static void DisableTm3(void) { REG_TM3CNT_H &= ~TIMER_ENABLE; REG_TM3CNT_L = 0xFDA7; } -static void sub_81D4170(void) +static void GetKeyInput(void) { - int keysMask = REG_KEYINPUT ^ KEYS_MASK; - gUnknown_030012E2 = keysMask & ~gUnknown_030012E0; - gUnknown_030012E0 = keysMask; + int rawKeys = REG_KEYINPUT ^ KEYS_MASK; + sJoyNew = rawKeys & ~sJoyNewOrRepeated; + sJoyNewOrRepeated = rawKeys; } void EReaderHelper_SaveRegsState(void) { - gUnknown_030012EC = REG_IME; - gUnknown_030012EE = REG_IE; - gUnknown_030012F0 = REG_TM3CNT_H; - gUnknown_030012F2 = REG_SIOCNT; - gUnknown_030012F4 = REG_RCNT; + sSavedIme = REG_IME; + sSavedIe = REG_IE; + sSavedTm3Cnt = REG_TM3CNT_H; + sSavedSioCnt = REG_SIOCNT; + sSavedRCnt = REG_RCNT; } void EReaderHelper_RestoreRegsState(void) { - REG_IME = gUnknown_030012EC; - REG_IE = gUnknown_030012EE; - REG_TM3CNT_H = gUnknown_030012F0; - REG_SIOCNT = gUnknown_030012F2; - REG_RCNT = gUnknown_030012F4; + REG_IME = sSavedIme; + REG_IE = sSavedIe; + REG_TM3CNT_H = sSavedTm3Cnt; + REG_SIOCNT = sSavedSioCnt; + REG_RCNT = sSavedRCnt; } -void sub_81D4238(void) +void EReaderHelper_ClearSendRecvMgr(void) { - CpuFill32(0, &gUnknown_030012C8, sizeof(struct Unknown030012C8)); + CpuFill32(0, &sSendRecvMgr, sizeof(sSendRecvMgr)); } diff --git a/src/ereader_screen.c b/src/ereader_screen.c index 3f2cf3217..438c4bec9 100755 --- a/src/ereader_screen.c +++ b/src/ereader_screen.c @@ -47,10 +47,10 @@ static void sub_81D4D50(struct Unk03006370 *arg0, int arg1, u32 *arg2) { volatile u16 backupIME = REG_IME; REG_IME = 0; - gIntrTable[1] = sub_81D3FAC; - gIntrTable[2] = sub_81D3F9C; + gIntrTable[1] = EReaderHelper_SerialCallback; + gIntrTable[2] = EReaderHelper_Timer3Callback; EReaderHelper_SaveRegsState(); - sub_81D4238(); + EReaderHelper_ClearSendRecvMgr(); REG_IE |= INTR_FLAG_VCOUNT; REG_IME = backupIME; arg0->unk0 = 0; @@ -62,7 +62,7 @@ static void sub_81D4DB8(struct Unk03006370 *arg0) { volatile u16 backupIME = REG_IME; REG_IME = 0; - sub_81D4238(); + EReaderHelper_ClearSendRecvMgr(); EReaderHelper_RestoreRegsState(); RestoreSerialTimer3IntrHandlers(); REG_IME = backupIME; @@ -211,7 +211,6 @@ static u32 sub_81D4EE4(u8 *arg0, u16 *arg1) void task_add_00_ereader(void) { - int value; struct Unk81D5014 *data; u8 taskId = CreateTask(sub_81D5084, 0); data = (struct Unk81D5014 *)gTasks[taskId].data; @@ -402,7 +401,7 @@ static void sub_81D5084(u8 taskId) } break; case 15: - data->unkE = EReader_IsReceivedDataValid((struct EReaderTrainerHillSet *)gDecompressionBuffer); + data->unkE = ValidateTrainerHillData((struct EReaderTrainerHillSet *)gDecompressionBuffer); SetCloseLinkCallbackAndType(data->unkE); data->unk8 = 16; break; diff --git a/src/event_object_lock.c b/src/event_object_lock.c index 67652a99b..dec2d7906 100644 --- a/src/event_object_lock.c +++ b/src/event_object_lock.c @@ -16,18 +16,19 @@ bool8 IsPlayerStandingStill(void) return TRUE; } -static void sub_80983A4(u8 taskId) +// Freeze player once their movement is finished +static void Task_FreezePlayer(u8 taskId) { if (IsPlayerStandingStill()) { - sub_808B864(); + PlayerFreeze(); DestroyTask(taskId); } } -bool8 sub_80983C4(void) +bool8 IsFreezePlayerFinished(void) { - if (FuncIsActiveTask(sub_80983A4)) + if (FuncIsActiveTask(Task_FreezePlayer)) { return FALSE; } @@ -42,30 +43,35 @@ bool8 sub_80983C4(void) void ScriptFreezeObjectEvents(void) { FreezeObjectEvents(); - CreateTask(sub_80983A4, 80); + CreateTask(Task_FreezePlayer, 80); } -static void sub_8098400(u8 taskId) +#define tPlayerFrozen data[0] +#define tObjectFrozen data[1] +#define tObjectId data[2] + +// Freeze selected object and player once their movement is finished +static void Task_FreezeSelectedObjectAndPlayer(u8 taskId) { struct Task *task = &gTasks[taskId]; - if (!task->data[0] && IsPlayerStandingStill() == TRUE) + if (!task->tPlayerFrozen && IsPlayerStandingStill() == TRUE) { - sub_808B864(); - task->data[0] = 1; + PlayerFreeze(); + task->tPlayerFrozen = TRUE; } - if (!task->data[1] && !gObjectEvents[gSelectedObjectEvent].singleMovementActive) + if (!task->tObjectFrozen && !gObjectEvents[gSelectedObjectEvent].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]); - task->data[1] = 1; + task->tObjectFrozen = TRUE; } - if (task->data[0] && task->data[1]) + if (task->tPlayerFrozen && task->tObjectFrozen) DestroyTask(taskId); } -bool8 sub_809847C(void) +bool8 IsFreezeSelectedObjectAndPlayerFinished(void) { - if (FuncIsActiveTask(sub_8098400)) + if (FuncIsActiveTask(Task_FreezeSelectedObjectAndPlayer)) { return FALSE; } @@ -80,11 +86,11 @@ void LockSelectedObjectEvent(void) { u8 taskId; FreezeObjectEventsExceptOne(gSelectedObjectEvent); - taskId = CreateTask(sub_8098400, 80); + taskId = CreateTask(Task_FreezeSelectedObjectAndPlayer, 80); if (!gObjectEvents[gSelectedObjectEvent].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[gSelectedObjectEvent]); - gTasks[taskId].data[1] = 1; + gTasks[taskId].tObjectFrozen = TRUE; } } @@ -118,64 +124,71 @@ void Script_ClearHeldMovement(void) ObjectEventClearHeldMovementIfActive(&gObjectEvents[gSelectedObjectEvent]); } -static void sub_80985BC(u8 taskId) +// Freeze designated object and player once their movement is finished +static void Task_FreezeObjectAndPlayer(u8 taskId) { struct Task *task = &gTasks[taskId]; - u8 objectEventId = task->data[2]; + u8 objectEventId = task->tObjectId; - if (!task->data[0] && IsPlayerStandingStill() == TRUE) + if (!task->tPlayerFrozen && IsPlayerStandingStill() == TRUE) { - sub_808B864(); - task->data[0] = 1; + PlayerFreeze(); + task->tPlayerFrozen = TRUE; } - if (!task->data[1] && !gObjectEvents[objectEventId].singleMovementActive) + if (!task->tObjectFrozen && !gObjectEvents[objectEventId].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[objectEventId]); - task->data[1] = 1; + task->tObjectFrozen = TRUE; } - if (task->data[0] && task->data[1]) + if (task->tPlayerFrozen && task->tObjectFrozen) DestroyTask(taskId); } -void sub_8098630(void) +void FreezeForApproachingTrainers(void) { u8 trainerObjectId1, trainerObjectId2, taskId; trainerObjectId1 = GetChosenApproachingTrainerObjectEventId(0); - if(gNoOfApproachingTrainers == 2) + + if (gNoOfApproachingTrainers == 2) { + // Get second trainer, freeze all other objects trainerObjectId2 = GetChosenApproachingTrainerObjectEventId(1); - sub_8098074(trainerObjectId1, trainerObjectId2); - taskId = CreateTask(sub_80985BC, 80); - gTasks[taskId].data[2] = trainerObjectId1; - if(!gObjectEvents[trainerObjectId1].singleMovementActive) + FreezeObjectEventsExceptTwo(trainerObjectId1, trainerObjectId2); + + // Start task to freeze trainer 1 (and player) after movement + taskId = CreateTask(Task_FreezeObjectAndPlayer, 80); + gTasks[taskId].tObjectId = trainerObjectId1; + if (!gObjectEvents[trainerObjectId1].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[trainerObjectId1]); - gTasks[taskId].data[1] = 1; + gTasks[taskId].tObjectFrozen = TRUE; } - taskId = CreateTask(sub_80985BC, 81); - gTasks[taskId].data[2] = trainerObjectId2; - if(!gObjectEvents[trainerObjectId2].singleMovementActive) + + // Start task to freeze trainer 2 after movement + taskId = CreateTask(Task_FreezeObjectAndPlayer, 81); + gTasks[taskId].tObjectId = trainerObjectId2; + if (!gObjectEvents[trainerObjectId2].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[trainerObjectId2]); - gTasks[taskId].data[1] = 1; + gTasks[taskId].tObjectFrozen = TRUE; } } else { FreezeObjectEventsExceptOne(trainerObjectId1); - taskId = CreateTask(sub_80985BC, 80); - gTasks[taskId].data[2] = trainerObjectId1; - if(!gObjectEvents[trainerObjectId1].singleMovementActive) + taskId = CreateTask(Task_FreezeObjectAndPlayer, 80); + gTasks[taskId].tObjectId = trainerObjectId1; + if (!gObjectEvents[trainerObjectId1].singleMovementActive) { FreezeObjectEvent(&gObjectEvents[trainerObjectId1]); - gTasks[taskId].data[1] = 1; + gTasks[taskId].tObjectFrozen = TRUE; } } } -bool8 sub_8098734(void) +bool8 IsFreezeObjectAndPlayerFinished(void) { - if (FuncIsActiveTask(sub_80985BC)) + if (FuncIsActiveTask(Task_FreezeObjectAndPlayer)) { return FALSE; } @@ -185,3 +198,7 @@ bool8 sub_8098734(void) return TRUE; } } + +#undef tPlayerFrozen +#undef tObjectFrozen +#undef tObjectId diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 1d06ddc84..67f203dcd 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -32,31 +32,39 @@ // this file was known as evobjmv.c in Game Freak's original source +// Sprite data used throughout +#define sObjEventId data[0] +#define sTypeFuncId data[1] // Index into corresponding gMovementTypeFuncs_* table +#define sActionFuncId data[2] // Index into corresponding gMovementActionFuncs_* table +#define sDirection data[3] +#define sSpeed data[4] + + #define movement_type_def(setup, table) \ static u8 setup##_callback(struct ObjectEvent *, struct Sprite *);\ void setup(struct Sprite *sprite)\ {\ - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, setup##_callback);\ + UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, setup##_callback);\ }\ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\ {\ - return table[sprite->data[1]](objectEvent, sprite);\ + return table[sprite->sTypeFuncId](objectEvent, sprite);\ } #define movement_type_empty_callback(setup) \ static u8 setup##_callback(struct ObjectEvent *, struct Sprite *);\ void setup(struct Sprite *sprite)\ {\ - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, setup##_callback);\ + UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, setup##_callback);\ }\ static u8 setup##_callback(struct ObjectEvent *objectEvent, struct Sprite *sprite)\ {\ return 0;\ } -EWRAM_DATA u8 sCurrentReflectionType = 0; -EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; -EWRAM_DATA struct LockedAnimObjectEvents *gLockedAnimObjectEvents = {0}; +static EWRAM_DATA u8 sCurrentReflectionType = 0; +static EWRAM_DATA u16 sCurrentSpecialObjectPaletteTag = 0; +static EWRAM_DATA struct LockedAnimObjectEvents *sLockedAnimObjectEvents = {0}; static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *, struct Sprite *); @@ -70,8 +78,8 @@ static void UpdateObjectEventSpriteAnimPause(struct ObjectEvent *, struct Sprite static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *, s16, s16); static bool8 IsMetatileDirectionallyImpassable(struct ObjectEvent *, s16, s16, u8); static bool8 DoesObjectCollideWithObjectAt(struct ObjectEvent *, s16, s16); -static void sub_8096530(struct ObjectEvent *, struct Sprite *); -static void UpdateObjEventSpriteVisibility(struct ObjectEvent *, struct Sprite *); +static void UpdateObjectEventOffscreen(struct ObjectEvent *, struct Sprite *); +static void UpdateObjectEventSpriteVisibility(struct ObjectEvent *, struct Sprite *); static void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent*); static void GetGroundEffectFlags_Reflection(struct ObjectEvent*, u32*); static void GetGroundEffectFlags_TallGrassOnSpawn(struct ObjectEvent*, u32*); @@ -87,7 +95,7 @@ static void GetGroundEffectFlags_Puddle(struct ObjectEvent*, u32*); static void GetGroundEffectFlags_Ripple(struct ObjectEvent*, u32*); static void GetGroundEffectFlags_Seaweed(struct ObjectEvent*, u32*); static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent*, u32*); -static u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent*); +static u8 ObjectEventGetNearbyReflectionType(struct ObjectEvent*); static u8 GetReflectionTypeByMetatileBehavior(u32); static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); static void ObjectEventUpdateSubpriority(struct ObjectEvent*, struct Sprite*); @@ -101,7 +109,7 @@ static void DoGroundEffects_OnFinishStep(struct ObjectEvent*, struct Sprite*); static void UpdateObjectEventSpritePosition(struct Sprite*); static void ApplyLevitateMovement(u8); static bool8 MovementType_Disguise_Callback(struct ObjectEvent *, struct Sprite *); -static bool8 MovementType_Hidden_Callback(struct ObjectEvent *, struct Sprite *); +static bool8 MovementType_Buried_Callback(struct ObjectEvent *, struct Sprite *); static void CreateReflectionEffectSprites(void); static u8 GetObjectEventIdByLocalId(u8); static u8 GetObjectEventIdByLocalIdAndMapInternal(u8, u8, u8); @@ -115,31 +123,49 @@ static void GetObjectEventMovingCameraOffset(s16 *, s16 *); static struct ObjectEventTemplate *GetObjectEventTemplateByLocalIdAndMap(u8, u8, u8); static void LoadObjectEventPalette(u16); static void RemoveObjectEventIfOutsideView(struct ObjectEvent *); -static void sub_808E1B8(u8, s16, s16); +static void SpawnObjectEventOnReturnToField(u8, s16, s16); static void SetPlayerAvatarObjectEventIdAndObjectId(u8, u8); -static void sub_808E38C(struct ObjectEvent *); -static u8 sub_808E8F4(const struct SpritePalette *); +static void ResetObjectEventFldEffData(struct ObjectEvent *); +static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *); static u8 FindObjectEventPaletteIndexByTag(u16); -static void sub_808EAB0(u16, u8); +static void _PatchObjectPalette(u16, u8); static bool8 ObjectEventDoesZCoordMatch(struct ObjectEvent *, u8); -static void ObjectCB_CameraObject(struct Sprite *); +static void SpriteCB_CameraObject(struct Sprite *); static void CameraObject_0(struct Sprite *); static void CameraObject_1(struct Sprite *); static void CameraObject_2(struct Sprite *); static struct ObjectEventTemplate *FindObjectEventTemplateByLocalId(u8 localId, struct ObjectEventTemplate *templates, u8 count); static void ClearObjectEventMovement(struct ObjectEvent *, struct Sprite *); static void ObjectEventSetSingleMovement(struct ObjectEvent *, struct Sprite *, u8); -static void oamt_npc_ministep_reset(struct Sprite *, u8, u8); -static void UpdateObjectEventSpriteSubpriorityAndVisibility(struct Sprite *); +static void SetSpriteDataForNormalStep(struct Sprite *, u8, u8); static void InitSpriteForFigure8Anim(struct Sprite *sprite); static bool8 AnimateSpriteInFigure8(struct Sprite *sprite); static void UpdateObjectEventSprite(struct Sprite *); +static void DoShadowFieldEffect(struct ObjectEvent *); +static void SetJumpSpriteData(struct Sprite *, u8, u8, u8); +static void SetWalkSlowSpriteData(struct Sprite *sprite, u8 direction); +static bool8 UpdateWalkSlowAnim(struct Sprite *sprite); +static u8 DoJumpSpriteMovement(struct Sprite *sprite); +static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite); +static void CreateLevitateMovementTask(struct ObjectEvent *); +static void DestroyLevitateMovementTask(u8); +static bool8 NpcTakeStep(struct Sprite *sprite); + +static const struct SpriteFrameImage sPicTable_PechaBerryTree[]; const u8 gReflectionEffectPaletteMap[] = {1, 1, 6, 7, 8, 9, 6, 7, 8, 9, 11, 11, 0, 0, 0, 0}; -const struct SpriteTemplate gCameraSpriteTemplate = {0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, ObjectCB_CameraObject}; +static const struct SpriteTemplate sCameraSpriteTemplate = { + .tileTag = 0, + .paletteTag = 0xFFFF, + .oam = &gDummyOamData, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_CameraObject +}; -void (*const gCameraObjectFuncs[])(struct Sprite *) = { +static void (*const sCameraObjectFuncs[])(struct Sprite *) = { CameraObject_0, CameraObject_1, CameraObject_2, @@ -213,7 +239,7 @@ static void (*const sMovementTypeCallbacks[])(struct Sprite *) = [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = MovementType_CopyPlayerInGrass, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = MovementType_CopyPlayerInGrass, - [MOVEMENT_TYPE_HIDDEN] = MovementType_Hidden, + [MOVEMENT_TYPE_BURIED] = MovementType_Buried, [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = MovementType_WalkInPlace, [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = MovementType_WalkInPlace, [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = MovementType_WalkInPlace, @@ -297,7 +323,7 @@ const u8 gRangedMovementTypes[] = { [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = 1, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = 1, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = 1, - [MOVEMENT_TYPE_HIDDEN] = 0, + [MOVEMENT_TYPE_BURIED] = 0, [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = 0, [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = 0, [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = 0, @@ -381,7 +407,7 @@ const u8 gInitialMovementTypeFacingDirections[] = { [MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS] = DIR_SOUTH, [MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS] = DIR_WEST, [MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS] = DIR_EAST, - [MOVEMENT_TYPE_HIDDEN] = DIR_SOUTH, + [MOVEMENT_TYPE_BURIED] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_IN_PLACE_DOWN] = DIR_SOUTH, [MOVEMENT_TYPE_WALK_IN_PLACE_UP] = DIR_NORTH, [MOVEMENT_TYPE_WALK_IN_PLACE_LEFT] = DIR_WEST, @@ -670,13 +696,13 @@ static const u16 *const sObjectPaletteTagSets[] = { #include "data/object_events/berry_tree_graphics_tables.h" #include "data/field_effects/field_effect_objects.h" -const s16 gMovementDelaysMedium[] = {32, 64, 96, 128}; -const s16 gMovementDelaysLong[] = {32, 64, 128, 192}; -const s16 gMovementDelaysShort[] = {32, 48, 64, 80}; +static const s16 sMovementDelaysMedium[] = {32, 64, 96, 128}; +static const s16 sMovementDelaysLong[] = {32, 64, 128, 192}; // Unused +static const s16 sMovementDelaysShort[] = {32, 48, 64, 80}; #include "data/object_events/movement_type_func_tables.h" -const u8 gFaceDirectionAnimNums[] = { +static const u8 sFaceDirectionAnimNums[] = { [DIR_NONE] = 0, [DIR_SOUTH] = 0, [DIR_NORTH] = 1, @@ -687,7 +713,7 @@ const u8 gFaceDirectionAnimNums[] = { [DIR_NORTHWEST] = 1, [DIR_NORTHEAST] = 1, }; -const u8 gMoveDirectionAnimNums[] = { +static const u8 sMoveDirectionAnimNums[] = { [DIR_NONE] = 4, [DIR_SOUTH] = 4, [DIR_NORTH] = 5, @@ -698,7 +724,7 @@ const u8 gMoveDirectionAnimNums[] = { [DIR_NORTHWEST] = 5, [DIR_NORTHEAST] = 5, }; -const u8 gMoveDirectionFastAnimNums[] = { +static const u8 sMoveDirectionFastAnimNums[] = { [DIR_NONE] = 8, [DIR_SOUTH] = 8, [DIR_NORTH] = 9, @@ -709,7 +735,7 @@ const u8 gMoveDirectionFastAnimNums[] = { [DIR_NORTHWEST] = 9, [DIR_NORTHEAST] = 9, }; -const u8 gMoveDirectionFasterAnimNums[] = { +static const u8 sMoveDirectionFasterAnimNums[] = { [DIR_NONE] = 12, [DIR_SOUTH] = 12, [DIR_NORTH] = 13, @@ -720,7 +746,7 @@ const u8 gMoveDirectionFasterAnimNums[] = { [DIR_NORTHWEST] = 13, [DIR_NORTHEAST] = 13, }; -const u8 gMoveDirectionFastestAnimNums[] = { +static const u8 sMoveDirectionFastestAnimNums[] = { [DIR_NONE] = 16, [DIR_SOUTH] = 16, [DIR_NORTH] = 17, @@ -731,7 +757,7 @@ const u8 gMoveDirectionFastestAnimNums[] = { [DIR_NORTHWEST] = 17, [DIR_NORTHEAST] = 17, }; -const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon +static const u8 sJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon [DIR_NONE] = 20, [DIR_SOUTH] = 20, [DIR_NORTH] = 21, @@ -742,7 +768,7 @@ const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon [DIR_NORTHWEST] = 21, [DIR_NORTHEAST] = 21, }; -const u8 gAcroWheelieDirectionAnimNums[] = { +static const u8 sAcroWheelieDirectionAnimNums[] = { [DIR_NONE] = 20, [DIR_SOUTH] = 20, [DIR_NORTH] = 21, @@ -753,7 +779,7 @@ const u8 gAcroWheelieDirectionAnimNums[] = { [DIR_NORTHWEST] = 21, [DIR_NORTHEAST] = 21, }; -const u8 gUnrefAnimNums_08375633[] = { +static const u8 sAcroUnusedDirectionAnimNums[] = { [DIR_NONE] = 24, [DIR_SOUTH] = 24, [DIR_NORTH] = 25, @@ -764,7 +790,7 @@ const u8 gUnrefAnimNums_08375633[] = { [DIR_NORTHWEST] = 25, [DIR_NORTHEAST] = 25, }; -const u8 gAcroEndWheelieDirectionAnimNums[] = { +static const u8 sAcroEndWheelieDirectionAnimNums[] = { [DIR_NONE] = 28, [DIR_SOUTH] = 28, [DIR_NORTH] = 29, @@ -775,7 +801,7 @@ const u8 gAcroEndWheelieDirectionAnimNums[] = { [DIR_NORTHWEST] = 29, [DIR_NORTHEAST] = 29, }; -const u8 gAcroUnusedActionDirectionAnimNums[] = { +static const u8 sAcroUnusedActionDirectionAnimNums[] = { [DIR_NONE] = 32, [DIR_SOUTH] = 32, [DIR_NORTH] = 33, @@ -786,7 +812,7 @@ const u8 gAcroUnusedActionDirectionAnimNums[] = { [DIR_NORTHWEST] = 33, [DIR_NORTHEAST] = 33, }; -const u8 gAcroWheeliePedalDirectionAnimNums[] = { +static const u8 sAcroWheeliePedalDirectionAnimNums[] = { [DIR_NONE] = 36, [DIR_SOUTH] = 36, [DIR_NORTH] = 37, @@ -797,7 +823,7 @@ const u8 gAcroWheeliePedalDirectionAnimNums[] = { [DIR_NORTHWEST] = 37, [DIR_NORTHEAST] = 37, }; -const u8 gFishingDirectionAnimNums[] = { +static const u8 sFishingDirectionAnimNums[] = { [DIR_NONE] = 0, [DIR_SOUTH] = 0, [DIR_NORTH] = 1, @@ -808,7 +834,7 @@ const u8 gFishingDirectionAnimNums[] = { [DIR_NORTHWEST] = 1, [DIR_NORTHEAST] = 1, }; -const u8 gFishingNoCatchDirectionAnimNums[] = { +static const u8 sFishingNoCatchDirectionAnimNums[] = { [DIR_NONE] = 4, [DIR_SOUTH] = 4, [DIR_NORTH] = 5, @@ -819,7 +845,7 @@ const u8 gFishingNoCatchDirectionAnimNums[] = { [DIR_NORTHWEST] = 5, [DIR_NORTHEAST] = 5, }; -const u8 gFishingBiteDirectionAnimNums[] = { +static const u8 sFishingBiteDirectionAnimNums[] = { [DIR_NONE] = 8, [DIR_SOUTH] = 8, [DIR_NORTH] = 9, @@ -830,7 +856,7 @@ const u8 gFishingBiteDirectionAnimNums[] = { [DIR_NORTHWEST] = 9, [DIR_NORTHEAST] = 9, }; -const u8 gRunningDirectionAnimNums[] = { +static const u8 sRunningDirectionAnimNums[] = { [DIR_NONE] = 20, [DIR_SOUTH] = 20, [DIR_NORTH] = 21, @@ -1070,7 +1096,7 @@ const u8 gAcroEndWheelieMoveDirectionMovementActions[] = { MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, }; -const u8 gOppositeDirections[] = { +static const u8 sOppositeDirections[] = { DIR_NORTH, DIR_SOUTH, DIR_EAST, @@ -1374,7 +1400,7 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl else if (paletteSlot >= 16) { paletteSlot -= 16; - sub_808EAB0(graphicsInfo->paletteTag, paletteSlot); + _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); } if (objectEvent->movementType == MOVEMENT_TYPE_INVISIBLE) @@ -1389,14 +1415,14 @@ static u8 TrySetupObjectEventSprite(struct ObjectEventTemplate *objectEventTempl } sprite = &gSprites[spriteId]; - sub_8092FF0(objectEvent->currentCoords.x + cameraX, objectEvent->currentCoords.y + cameraY, &sprite->pos1.x, &sprite->pos1.y); + GetMapCoordsFromSpritePos(objectEvent->currentCoords.x + cameraX, objectEvent->currentCoords.y + cameraY, &sprite->pos1.x, &sprite->pos1.y); sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->pos1.x += 8; sprite->pos1.y += 16 + sprite->centerToCornerVecY; sprite->oam.paletteNum = paletteSlot; sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = objectEventId; + sprite->sObjEventId = objectEventId; objectEvent->spriteId = spriteId; objectEvent->inanimate = graphicsInfo->inanimate; if (!objectEvent->inanimate) @@ -1523,7 +1549,7 @@ u8 AddPseudoObjectEvent(u16 graphicsId, void (*callback)(struct Sprite *), s16 x // Used to create sprite object events instead of a full object event // Used when resources are limiting, e.g. for the audience in contests or group members in Union Room -u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction) +u8 CreateObjectSprite(u8 graphicsId, u8 objectEventId, s16 x, s16 y, u8 z, u8 direction) { u8 spriteId; struct Sprite *sprite; @@ -1550,7 +1576,7 @@ u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction) sprite->oam.paletteNum -= 16; } sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = a1; + sprite->sObjEventId = objectEventId; sprite->data[1] = z; if (graphicsInfo->paletteSlot == 10) { @@ -1558,7 +1584,7 @@ u8 CreateObjectSprite(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction) } else if (graphicsInfo->paletteSlot >= 16) { - sub_808EAB0(graphicsInfo->paletteTag, graphicsInfo->paletteSlot | 0xf0); + _PatchObjectPalette(graphicsInfo->paletteTag, graphicsInfo->paletteSlot | 0xf0); } if (subspriteTables != NULL) { @@ -1585,17 +1611,11 @@ void TrySpawnObjectEvents(s16 cameraX, s16 cameraY) s16 bottom = gSaveBlock1Ptr->pos.y + 16; if (InBattlePyramid()) - { objectCount = GetNumBattlePyramidObjectEvents(); - } else if (InTrainerHill()) - { objectCount = 2; - } else - { objectCount = gMapHeader.events->objectEventCount; - } for (i = 0; i < objectCount; i++) { @@ -1648,7 +1668,7 @@ static void RemoveObjectEventIfOutsideView(struct ObjectEvent *objectEvent) RemoveObjectEvent(objectEvent); } -void sub_808E16C(s16 x, s16 y) +void SpawnObjectEventsOnReturnToField(s16 x, s16 y) { u8 i; @@ -1656,16 +1676,14 @@ void sub_808E16C(s16 x, s16 y) for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { if (gObjectEvents[i].active) - { - sub_808E1B8(i, x, y); - } + SpawnObjectEventOnReturnToField(i, x, y); } CreateReflectionEffectSprites(); } -static void sub_808E1B8(u8 objectEventId, s16 x, s16 y) +static void SpawnObjectEventOnReturnToField(u8 objectEventId, s16 x, s16 y) { - u8 spriteId; + u8 i; u8 paletteSlot; struct Sprite *sprite; struct ObjectEvent *objectEvent; @@ -1674,15 +1692,11 @@ static void sub_808E1B8(u8 objectEventId, s16 x, s16 y) const struct SubspriteTable *subspriteTables; const struct ObjectEventGraphicsInfo *graphicsInfo; -#define i spriteId for (i = 0; i < ARRAY_COUNT(gLinkPlayerObjectEvents); i++) { if (gLinkPlayerObjectEvents[i].active && objectEventId == gLinkPlayerObjectEvents[i].objEventId) - { return; - } } -#undef i objectEvent = &gObjectEvents[objectEventId]; subspriteTables = NULL; @@ -1690,6 +1704,7 @@ static void sub_808E1B8(u8 objectEventId, s16 x, s16 y) spriteFrameImage.size = graphicsInfo->size; MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(objectEvent->graphicsId, objectEvent->movementType, &spriteTemplate, &subspriteTables); spriteTemplate.images = &spriteFrameImage; + *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; paletteSlot = graphicsInfo->paletteSlot; if (paletteSlot == 0) @@ -1703,14 +1718,15 @@ static void sub_808E1B8(u8 objectEventId, s16 x, s16 y) else if (paletteSlot >= 16) { paletteSlot -= 16; - sub_808EAB0(graphicsInfo->paletteTag, paletteSlot); + _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); } *(u16 *)&spriteTemplate.paletteTag = 0xFFFF; - spriteId = CreateSprite(&spriteTemplate, 0, 0, 0); - if (spriteId != MAX_SPRITES) + + i = CreateSprite(&spriteTemplate, 0, 0, 0); + if (i != MAX_SPRITES) { - sprite = &gSprites[spriteId]; - sub_8092FF0(x + objectEvent->currentCoords.x, y + objectEvent->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y); + sprite = &gSprites[i]; + GetMapCoordsFromSpritePos(x + objectEvent->currentCoords.x, y + objectEvent->currentCoords.y, &sprite->pos1.x, &sprite->pos1.y); sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->pos1.x += 8; @@ -1718,27 +1734,25 @@ static void sub_808E1B8(u8 objectEventId, s16 x, s16 y) sprite->images = graphicsInfo->images; if (objectEvent->movementType == MOVEMENT_TYPE_PLAYER) { - SetPlayerAvatarObjectEventIdAndObjectId(objectEventId, spriteId); + SetPlayerAvatarObjectEventIdAndObjectId(objectEventId, i); objectEvent->warpArrowSpriteId = CreateWarpArrowSprite(); } if (subspriteTables != NULL) - { SetSubspriteTables(sprite, subspriteTables); - } + sprite->oam.paletteNum = paletteSlot; sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = objectEventId; - objectEvent->spriteId = spriteId; + sprite->sObjEventId = objectEventId; + objectEvent->spriteId = i; if (!objectEvent->inanimate && objectEvent->movementType != MOVEMENT_TYPE_PLAYER) - { StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objectEvent->facingDirection)); - } - sub_808E38C(objectEvent); + + ResetObjectEventFldEffData(objectEvent); SetObjectSubpriorityByZCoord(objectEvent->previousElevation, sprite, 1); } } -static void sub_808E38C(struct ObjectEvent *objectEvent) +static void ResetObjectEventFldEffData(struct ObjectEvent *objectEvent) { objectEvent->singleMovementActive = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; @@ -1779,7 +1793,7 @@ void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId) else if (paletteSlot >= 16) { paletteSlot -= 16; - sub_808EAB0(graphicsInfo->paletteTag, paletteSlot); + _PatchObjectPalette(graphicsInfo->paletteTag, paletteSlot); } sprite->oam.shape = graphicsInfo->oam->shape; sprite->oam.size = graphicsInfo->oam->size; @@ -1835,7 +1849,7 @@ void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) ObjectEventTurn(&gObjectEvents[playerAvatar->objectEventId], direction); } -static void get_berry_tree_graphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void SetBerryTreeGraphics(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 berryStage; u8 berryId; @@ -1843,7 +1857,7 @@ static void get_berry_tree_graphics(struct ObjectEvent *objectEvent, struct Spri objectEvent->invisible = TRUE; sprite->invisible = TRUE; berryStage = GetStageByBerryTreeId(objectEvent->trainerRange_berryTreeId); - if (berryStage != 0) + if (berryStage != BERRY_STAGE_NO_BERRY) { objectEvent->invisible = FALSE; sprite->invisible = FALSE; @@ -1889,13 +1903,13 @@ static void SetObjectEventDynamicGraphicsId(struct ObjectEvent *objectEvent) } } -void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 state) +void SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, bool8 invisible) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { - gObjectEvents[objectEventId].invisible = state; + gObjectEvents[objectEventId].invisible = invisible; } } @@ -1906,7 +1920,7 @@ void ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, *(u8*)(mapGroup) = objectEvent->mapGroup; } -void sub_808E75C(s16 x, s16 y) +void AllowObjectAtPosTriggerGroundEffects(s16 x, s16 y) { u8 objectEventId; struct ObjectEvent *objectEvent; @@ -1919,7 +1933,7 @@ void sub_808E75C(s16 x, s16 y) } } -void sub_808E78C(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) +void SetObjectPriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) { u8 objectEventId; struct ObjectEvent *objectEvent; @@ -1934,7 +1948,7 @@ void sub_808E78C(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) } } -void sub_808E7E4(u8 localId, u8 mapNum, u8 mapGroup) +void ResetObjectPriority(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; struct ObjectEvent *objectEvent; @@ -1971,27 +1985,23 @@ static void LoadObjectEventPalette(u16 paletteTag) u16 i = FindObjectEventPaletteIndexByTag(paletteTag); if (i != OBJ_EVENT_PAL_TAG_NONE) // always true - { - sub_808E8F4(&sObjectEventSpritePalettes[i]); - } + LoadSpritePaletteIfTagExists(&sObjectEventSpritePalettes[i]); } -void Unused_LoadObjectEventPaletteSet(u16 *paletteTags) +// Unused +static void LoadObjectEventPaletteSet(u16 *paletteTags) { u8 i; for (i = 0; paletteTags[i] != OBJ_EVENT_PAL_TAG_NONE; i++) - { LoadObjectEventPalette(paletteTags[i]); - } } -static u8 sub_808E8F4(const struct SpritePalette *spritePalette) +static u8 LoadSpritePaletteIfTagExists(const struct SpritePalette *spritePalette) { if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xFF) - { return 0xFF; - } + return LoadSpritePalette(spritePalette); } @@ -2057,12 +2067,13 @@ void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot) } } -static void sub_808EAB0(u16 tag, u8 slot) +static void _PatchObjectPalette(u16 tag, u8 slot) { PatchObjectPalette(tag, slot); } -void unref_sub_808EAC4(struct ObjectEvent *objectEvent, s16 x, s16 y) +// Unused +static void IncrementObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) { objectEvent->previousCoords.x = objectEvent->currentCoords.x; objectEvent->previousCoords.y = objectEvent->currentCoords.y; @@ -2099,7 +2110,7 @@ void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y) sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); sprite->pos1.x += 8; sprite->pos1.y += 16 + sprite->centerToCornerVecY; - sub_808E38C(objectEvent); + ResetObjectEventFldEffData(objectEvent); if (objectEvent->trackedByCamera) CameraObjectReset1(); } @@ -2178,36 +2189,39 @@ void UpdateObjectEventsForCameraUpdate(s16 x, s16 y) RemoveObjectEventsOutsideView(); } +#define sLinkedSpriteId data[0] +#define sState data[1] + u8 AddCameraObject(u8 linkedSpriteId) { - u8 spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4); + u8 spriteId = CreateSprite(&sCameraSpriteTemplate, 0, 0, 4); gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[0] = linkedSpriteId; + gSprites[spriteId].sLinkedSpriteId = linkedSpriteId; return spriteId; } -static void ObjectCB_CameraObject(struct Sprite *sprite) +static void SpriteCB_CameraObject(struct Sprite *sprite) { - void (*callbacks[ARRAY_COUNT(gCameraObjectFuncs)])(struct Sprite *); + void (*callbacks[ARRAY_COUNT(sCameraObjectFuncs)])(struct Sprite *); - memcpy(callbacks, gCameraObjectFuncs, sizeof gCameraObjectFuncs); - callbacks[sprite->data[1]](sprite); + memcpy(callbacks, sCameraObjectFuncs, sizeof sCameraObjectFuncs); + callbacks[sprite->sState](sprite); } static void CameraObject_0(struct Sprite *sprite) { - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->pos1.x = gSprites[sprite->sLinkedSpriteId].pos1.x; + sprite->pos1.y = gSprites[sprite->sLinkedSpriteId].pos1.y; sprite->invisible = TRUE; - sprite->data[1] = 1; + sprite->sState = 1; CameraObject_1(sprite); } static void CameraObject_1(struct Sprite *sprite) { - s16 x = gSprites[sprite->data[0]].pos1.x; - s16 y = gSprites[sprite->data[0]].pos1.y; + s16 x = gSprites[sprite->sLinkedSpriteId].pos1.x; + s16 y = gSprites[sprite->sLinkedSpriteId].pos1.y; sprite->data[2] = x - sprite->pos1.x; sprite->data[3] = y - sprite->pos1.y; @@ -2217,65 +2231,75 @@ static void CameraObject_1(struct Sprite *sprite) static void CameraObject_2(struct Sprite *sprite) { - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; + sprite->pos1.x = gSprites[sprite->sLinkedSpriteId].pos1.x; + sprite->pos1.y = gSprites[sprite->sLinkedSpriteId].pos1.y; sprite->data[2] = 0; sprite->data[3] = 0; } -static struct Sprite *FindCameraObject(void) +static struct Sprite *FindCameraSprite(void) { u8 i; for (i = 0; i < MAX_SPRITES; i++) { - if (gSprites[i].inUse && gSprites[i].callback == ObjectCB_CameraObject) - { + if (gSprites[i].inUse && gSprites[i].callback == SpriteCB_CameraObject) return &gSprites[i]; - } } return NULL; } void CameraObjectReset1(void) { - struct Sprite *cameraObject; + struct Sprite *camera; - cameraObject = FindCameraObject(); - if (cameraObject != NULL) + camera = FindCameraSprite(); + if (camera != NULL) { - cameraObject->data[1] = 0; - cameraObject->callback(cameraObject); + camera->sState = 0; + camera->callback(camera); } } -void CameraObjectSetFollowedObjectId(u8 objectId) +void CameraObjectSetFollowedSpriteId(u8 spriteId) { - struct Sprite *cameraObject; + struct Sprite *camera; - cameraObject = FindCameraObject(); - if (cameraObject != NULL) + camera = FindCameraSprite(); + if (camera != NULL) { - cameraObject->data[0] = objectId; + camera->sLinkedSpriteId = spriteId; CameraObjectReset1(); } } -u8 CameraObjectGetFollowedObjectId(void) +// Unused +static u8 CameraObjectGetFollowedSpriteId(void) { - struct Sprite *cameraObject; + struct Sprite *camera; - cameraObject = FindCameraObject(); - if (cameraObject == NULL) + camera = FindCameraSprite(); + if (camera == NULL) { return MAX_SPRITES; } - return cameraObject->data[0]; + return camera->sLinkedSpriteId; } void CameraObjectReset2(void) { - FindCameraObject()->data[1] = 2; + // UB: Possible null dereference +#ifdef UBFIX + struct Sprite *camera; + + camera = FindCameraSprite(); + if (camera != NULL) + { + camera->sState = 2; + } +#else + FindCameraSprite()->sState = 2; +#endif // UBFIX } u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) @@ -2535,14 +2559,14 @@ movement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround) bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -2552,8 +2576,8 @@ bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sp { return FALSE; } - SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysMedium[Random() & 3]); + sprite->sTypeFuncId = 3; return TRUE; } @@ -2561,7 +2585,7 @@ bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sp { if (WaitForMovementDelay(sprite)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -2575,9 +2599,9 @@ bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sp memcpy(directions, gStandardDirections, sizeof directions); chosenDirection = directions[Random() & 3]; SetObjectEventDirection(objectEvent, chosenDirection); - sprite->data[1] = 5; + sprite->sTypeFuncId = 5; if (GetCollisionInDirection(objectEvent, chosenDirection)) - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -2585,8 +2609,8 @@ bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sp bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 6; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 6; return TRUE; } @@ -2594,8 +2618,8 @@ bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sp { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 1; } return FALSE; } @@ -2641,17 +2665,13 @@ u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) { direction = DIR_EAST; if (dx < 0) - { direction = DIR_WEST; - } } else { direction = DIR_SOUTH; if (dy < 0) - { direction = DIR_NORTH; - } } return direction; } @@ -2662,9 +2682,7 @@ u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) direction = DIR_SOUTH; if (dy < 0) - { direction = DIR_NORTH; - } return direction; } @@ -2674,9 +2692,7 @@ u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) direction = DIR_EAST; if (dx < 0) - { direction = DIR_WEST; - } return direction; } @@ -2689,17 +2705,13 @@ u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_EAST) - { direction = DIR_NORTH; - } } else if (direction == DIR_EAST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) - { direction = DIR_NORTH; - } } return direction; } @@ -2713,17 +2725,13 @@ u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_WEST) - { direction = DIR_NORTH; - } } else if (direction == DIR_WEST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) - { direction = DIR_NORTH; - } } return direction; } @@ -2737,17 +2745,13 @@ u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_EAST) - { direction = DIR_SOUTH; - } } else if (direction == DIR_EAST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_NORTH) - { direction = DIR_SOUTH; - } } return direction; } @@ -2761,17 +2765,13 @@ u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); if (direction == DIR_WEST) - { direction = DIR_SOUTH; - } } else if (direction == DIR_WEST) { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); if (direction == DIR_NORTH) - { direction = DIR_SOUTH; - } } return direction; } @@ -2782,9 +2782,7 @@ u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_EAST) - { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - } return direction; } @@ -2794,9 +2792,7 @@ u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_WEST) - { direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); - } return direction; } @@ -2806,9 +2802,7 @@ u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_SOUTH) - { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - } return direction; } @@ -2818,9 +2812,7 @@ u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) direction = GetVectorDirection(dx, dy, absdx, absdy); if (direction == DIR_NORTH) - { direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); - } return direction; } @@ -2830,22 +2822,19 @@ u8 TryGetTrainerEncounterDirection(struct ObjectEvent *objectEvent, u8 movementT s16 absdx, absdy; if (!ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) - { - return 0; - } + return DIR_NONE; + PlayerGetDestCoords(&dx, &dy); dx -= objectEvent->currentCoords.x; dy -= objectEvent->currentCoords.y; absdx = dx; absdy = dy; + if (absdx < 0) - { absdx = -absdx; - } if (absdy < 0) - { absdy = -absdy; - } + return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy); } @@ -2854,14 +2843,14 @@ movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround) bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -2869,9 +2858,9 @@ bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Spri { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysMedium[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -2880,7 +2869,7 @@ bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Spri { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -2896,7 +2885,7 @@ bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Spri direction = directions[Random() & 3]; SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -2905,25 +2894,24 @@ movement_type_def(MovementType_WanderUpAndDown, gMovementTypeFuncs_WanderUpAndDo bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { return FALSE; - } - SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); - sprite->data[1] = 3; + + SetMovementDelay(sprite, sMovementDelaysMedium[Random() & 3]); + sprite->sTypeFuncId = 3; return TRUE; } @@ -2931,7 +2919,7 @@ bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct { if (WaitForMovementDelay(sprite)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -2944,9 +2932,9 @@ bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct memcpy(directions, gUpAndDownDirections, sizeof directions); direction = directions[Random() & 1]; SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 5; + sprite->sTypeFuncId = 5; if (GetCollisionInDirection(objectEvent, direction)) - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -2954,8 +2942,8 @@ bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 6; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 6; return TRUE; } @@ -2963,8 +2951,8 @@ bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 1; } return FALSE; } @@ -2974,25 +2962,24 @@ movement_type_def(MovementType_WanderLeftAndRight, gMovementTypeFuncs_WanderLeft bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (!ObjectEventExecSingleMovementAction(objectEvent, sprite)) - { return FALSE; - } - SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); - sprite->data[1] = 3; + + SetMovementDelay(sprite, sMovementDelaysMedium[Random() & 3]); + sprite->sTypeFuncId = 3; return TRUE; } @@ -3000,7 +2987,7 @@ bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, str { if (WaitForMovementDelay(sprite)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3013,9 +3000,9 @@ bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, str memcpy(directions, gLeftAndRightDirections, sizeof directions); direction = directions[Random() & 1]; SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 5; + sprite->sTypeFuncId = 5; if (GetCollisionInDirection(objectEvent, direction)) - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3023,8 +3010,8 @@ bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, str bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkNormalMovementAction(objectEvent->movementDirection)); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 6; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 6; return TRUE; } @@ -3032,8 +3019,8 @@ bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, str { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 1; } return FALSE; } @@ -3044,7 +3031,7 @@ bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct S { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3052,7 +3039,7 @@ bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct S { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } return FALSE; @@ -3060,39 +3047,56 @@ bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct S bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; return FALSE; } static bool8 ObjectEventCB2_BerryTree(struct ObjectEvent *objectEvent, struct Sprite *sprite); extern bool8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct ObjectEvent *objectEvent, struct Sprite *sprite); + +enum { + BERRYTREEFUNC_NORMAL, + BERRYTREEFUNC_MOVE, + BERRYTREEFUNC_SPARKLE_START, + BERRYTREEFUNC_SPARKLE, + BERRYTREEFUNC_SPARKLE_END, +}; + +#define sTimer data[2] +#define sBerryTreeFlags data[7] + +#define BERRY_FLAG_SET_GFX (1 << 0) +#define BERRY_FLAG_SPARKLING (1 << 1) +#define BERRY_FLAG_JUST_PICKED (1 << 2) + void MovementType_BerryTreeGrowth(struct Sprite *sprite) { struct ObjectEvent *objectEvent; - objectEvent = &gObjectEvents[sprite->data[0]]; - if (!(sprite->data[7] & 1)) + objectEvent = &gObjectEvents[sprite->sObjEventId]; + if (!(sprite->sBerryTreeFlags & BERRY_FLAG_SET_GFX)) { - get_berry_tree_graphics(objectEvent, sprite); - sprite->data[7] |= 1; + SetBerryTreeGraphics(objectEvent, sprite); + sprite->sBerryTreeFlags |= BERRY_FLAG_SET_GFX; } UpdateObjectEventCurrentMovement(objectEvent, sprite, ObjectEventCB2_BerryTree); } static bool8 ObjectEventCB2_BerryTree(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - return gMovementTypeFuncs_BerryTreeGrowth[sprite->data[1]](objectEvent, sprite); + return gMovementTypeFuncs_BerryTreeGrowth[sprite->sTypeFuncId](objectEvent, sprite); } -bool8 MovementType_BerryTreeGrowth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// BERRYTREEFUNC_NORMAL +bool8 MovementType_BerryTreeGrowth_Normal(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u8 berryStage; ClearObjectEventMovement(objectEvent, sprite); objectEvent->invisible = TRUE; sprite->invisible = TRUE; berryStage = GetStageByBerryTreeId(objectEvent->trainerRange_berryTreeId); - if (berryStage == 0) + if (berryStage == BERRY_STAGE_NO_BERRY) { - if (!(sprite->data[7] & 4) && sprite->animNum == 4) + if (!(sprite->sBerryTreeFlags & BERRY_FLAG_JUST_PICKED) && sprite->animNum == BERRY_STAGE_FLOWERING) { gFieldEffectArguments[0] = objectEvent->currentCoords.x; gFieldEffectArguments[1] = objectEvent->currentCoords.y; @@ -3105,34 +3109,36 @@ bool8 MovementType_BerryTreeGrowth_Step0(struct ObjectEvent *objectEvent, struct } objectEvent->invisible = FALSE; sprite->invisible = FALSE; - berryStage --; + berryStage--; if (sprite->animNum != berryStage) { - sprite->data[1] = 2; + sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE_START; return TRUE; } - get_berry_tree_graphics(objectEvent, sprite); + SetBerryTreeGraphics(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); - sprite->data[1] = 1; + sprite->sTypeFuncId = BERRYTREEFUNC_MOVE; return TRUE; } -bool8 MovementType_BerryTreeGrowth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// BERRYTREEFUNC_MOVE +bool8 MovementType_BerryTreeGrowth_Move(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - sprite->data[1] = 0; + sprite->sTypeFuncId = BERRYTREEFUNC_NORMAL; return TRUE; } return FALSE; } -bool8 MovementType_BerryTreeGrowth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// BERRYTREEFUNC_SPARKLE_START +bool8 MovementType_BerryTreeGrowth_SparkleStart(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - objectEvent->singleMovementActive = 1; - sprite->data[1] = 3; - sprite->data[2] = 0; - sprite->data[7] |= 2; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE; + sprite->sTimer = 0; + sprite->sBerryTreeFlags |= BERRY_FLAG_SPARKLING; gFieldEffectArguments[0] = objectEvent->currentCoords.x; gFieldEffectArguments[1] = objectEvent->currentCoords.y; gFieldEffectArguments[2] = sprite->subpriority - 1; @@ -3141,30 +3147,32 @@ bool8 MovementType_BerryTreeGrowth_Step2(struct ObjectEvent *objectEvent, struct return TRUE; } -bool8 MovementType_BerryTreeGrowth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// BERRYTREEFUNC_SPARKLE +bool8 MovementType_BerryTreeGrowth_Sparkle(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sprite->data[2]++; - objectEvent->invisible = (sprite->data[2] & 0x02) >> 1; + sprite->sTimer++; + objectEvent->invisible = (sprite->sTimer & 2) >> 1; sprite->animPaused = TRUE; - if (sprite->data[2] > 64) + if (sprite->sTimer > 64) { - get_berry_tree_graphics(objectEvent, sprite); - sprite->data[1] = 4; - sprite->data[2] = 0; + SetBerryTreeGraphics(objectEvent, sprite); + sprite->sTypeFuncId = BERRYTREEFUNC_SPARKLE_END; + sprite->sTimer = 0; return TRUE; } return FALSE; } -bool8 MovementType_BerryTreeGrowth_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite) +// BERRYTREEFUNC_SPARKLE_END +bool8 MovementType_BerryTreeGrowth_SparkleEnd(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sprite->data[2]++; - objectEvent->invisible = (sprite->data[2] & 0x02) >> 1; + sprite->sTimer++; + objectEvent->invisible = (sprite->sTimer & 2) >> 1; sprite->animPaused = TRUE; - if (sprite->data[2] > 64) + if (sprite->sTimer > 64) { - sprite->data[1] = 0; - sprite->data[7] &= ~0x0002; + sprite->sTypeFuncId = BERRYTREEFUNC_NORMAL; + sprite->sBerryTreeFlags &= ~BERRY_FLAG_SPARKLING; return TRUE; } return FALSE; @@ -3175,14 +3183,14 @@ movement_type_def(MovementType_FaceDownAndUp, gMovementTypeFuncs_FaceDownAndUp) bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3190,9 +3198,9 @@ bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct S { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysMedium[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3201,7 +3209,7 @@ bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct S { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3218,7 +3226,7 @@ bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct S direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3227,14 +3235,14 @@ movement_type_def(MovementType_FaceLeftAndRight, gMovementTypeFuncs_FaceLeftAndR bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3242,9 +3250,9 @@ bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struc { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysMedium[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3253,7 +3261,7 @@ bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struc { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3270,7 +3278,7 @@ bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struc direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3279,14 +3287,14 @@ movement_type_def(MovementType_FaceUpAndLeft, gMovementTypeFuncs_FaceUpAndLeft) bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3294,9 +3302,9 @@ bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct S { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3305,7 +3313,7 @@ bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct S { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3322,7 +3330,7 @@ bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct S direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3331,14 +3339,14 @@ movement_type_def(MovementType_FaceUpAndRight, gMovementTypeFuncs_FaceUpAndRight bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3346,9 +3354,9 @@ bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3357,7 +3365,7 @@ bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3374,7 +3382,7 @@ bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3383,14 +3391,14 @@ movement_type_def(MovementType_FaceDownAndLeft, gMovementTypeFuncs_FaceDownAndLe bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3398,9 +3406,9 @@ bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3409,7 +3417,7 @@ bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3426,7 +3434,7 @@ bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3435,14 +3443,14 @@ movement_type_def(MovementType_FaceDownAndRight, gMovementTypeFuncs_FaceDownAndR bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3450,9 +3458,9 @@ bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struc { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3461,7 +3469,7 @@ bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struc { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3478,7 +3486,7 @@ bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struc direction = directions[Random() & 1]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3487,14 +3495,14 @@ movement_type_def(MovementType_FaceDownUpAndLeft, gMovementTypeFuncs_FaceDownUpA bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3502,9 +3510,9 @@ bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, stru { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3513,7 +3521,7 @@ bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, stru { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3530,7 +3538,7 @@ bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, stru direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3539,14 +3547,14 @@ movement_type_def(MovementType_FaceDownUpAndRight, gMovementTypeFuncs_FaceDownUp bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3554,9 +3562,9 @@ bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, str { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3565,7 +3573,7 @@ bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, str { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3582,7 +3590,7 @@ bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, str direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3591,14 +3599,14 @@ movement_type_def(MovementType_FaceUpRightAndLeft, gMovementTypeFuncs_FaceUpLeft bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3606,9 +3614,9 @@ bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, str { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3617,7 +3625,7 @@ bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, str { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3634,7 +3642,7 @@ bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, str direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3643,14 +3651,14 @@ movement_type_def(MovementType_FaceDownRightAndLeft, gMovementTypeFuncs_FaceDown bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3658,9 +3666,9 @@ bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, s { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); - objectEvent->singleMovementActive = 0; - sprite->data[1] = 3; + SetMovementDelay(sprite, sMovementDelaysShort[Random() & 3]); + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3669,7 +3677,7 @@ bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, s { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 4; + sprite->sTypeFuncId = 4; return TRUE; } return FALSE; @@ -3686,7 +3694,7 @@ bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, s direction = directions[Random() & 3]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3696,7 +3704,7 @@ bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3705,7 +3713,7 @@ bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, 48); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; } return FALSE; } @@ -3714,7 +3722,7 @@ bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 3; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3730,7 +3738,7 @@ bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, direction = directions[objectEvent->facingDirection]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 0; + sprite->sTypeFuncId = 0; return TRUE; } @@ -3740,7 +3748,7 @@ bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3749,7 +3757,7 @@ bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { SetMovementDelay(sprite, 48); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; } return FALSE; } @@ -3758,7 +3766,7 @@ bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct { if (WaitForMovementDelay(sprite) || ObjectEventIsTrainerAndCloseToPlayer(objectEvent)) { - sprite->data[1] = 3; + sprite->sTypeFuncId = 3; } return FALSE; } @@ -3774,7 +3782,7 @@ bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct direction = directions[objectEvent->facingDirection]; } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 0; + sprite->sTypeFuncId = 0; return TRUE; } @@ -3783,7 +3791,7 @@ movement_type_def(MovementType_WalkBackAndForth, gMovementTypeFuncs_WalkBackAndF bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3797,7 +3805,7 @@ bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struc direction = GetOppositeDirection(direction); } SetObjectEventDirection(objectEvent, direction); - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3825,8 +3833,8 @@ bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struc movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection); ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 3; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 3; return TRUE; } @@ -3834,8 +3842,8 @@ bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struc { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 1; } return FALSE; } @@ -3843,7 +3851,7 @@ bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struc bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -3870,8 +3878,8 @@ bool8 MoveNextDirectionInSequence(struct ObjectEvent *objectEvent, struct Sprite movementActionId = GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection); ObjectEventSetSingleMovement(objectEvent, sprite, movementActionId); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 2; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 2; return TRUE; } @@ -3879,8 +3887,8 @@ bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sp { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 1; } return FALSE; } @@ -4206,7 +4214,7 @@ bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Spri { objectEvent->directionSequenceIndex = GetPlayerFacingDirection(); } - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -4223,8 +4231,8 @@ bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Spri { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - objectEvent->singleMovementActive = 0; - sprite->data[1] = 1; + objectEvent->singleMovementActive = FALSE; + sprite->sTypeFuncId = 1; } return FALSE; } @@ -4237,8 +4245,8 @@ bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(state_to_direction(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, playerDirection))); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 2; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4258,8 +4266,8 @@ bool8 CopyablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sp direction = state_to_direction(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventMoveDestCoords(objectEvent, direction, &x, &y); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); - objectEvent->singleMovementActive = 1; - sprite->data[1] = 2; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 2; return TRUE; } } @@ -4273,8 +4281,8 @@ bool8 CopyablePlayerMovement_GoSpeed0(struct ObjectEvent *objectEvent, struct Sp { ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } - objectEvent->singleMovementActive = 1; - sprite->data[1] = 2; + objectEvent->singleMovementActive = TRUE; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4293,7 +4301,7 @@ bool8 CopyablePlayerMovement_GoSpeed1(struct ObjectEvent *objectEvent, struct Sp ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4312,7 +4320,7 @@ bool8 CopyablePlayerMovement_GoSpeed2(struct ObjectEvent *objectEvent, struct Sp ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4331,7 +4339,7 @@ bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprit ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4343,7 +4351,7 @@ bool8 cph_IM_DIFFERENT(struct ObjectEvent *objectEvent, struct Sprite *sprite, u direction = state_to_direction(gInitialMovementTypeFacingDirections[objectEvent->movementType], objectEvent->directionSequenceIndex, direction); ObjectEventSetSingleMovement(objectEvent, sprite, GetJumpInPlaceMovementAction(direction)); objectEvent->singleMovementActive = TRUE; - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4362,7 +4370,7 @@ bool8 CopyablePlayerMovement_GoSpeed4(struct ObjectEvent *objectEvent, struct Sp ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4383,7 +4391,7 @@ bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(direction)); } objectEvent->singleMovementActive = TRUE; - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } @@ -4391,10 +4399,9 @@ movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerI bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) - { + if (gObjectEvents[gPlayerAvatar.objectEventId].movementActionId == MOVEMENT_ACTION_NONE || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) return FALSE; - } + return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](objectEvent, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass); } @@ -4402,7 +4409,7 @@ void MovementType_TreeDisguise(struct Sprite *sprite) { struct ObjectEvent *objectEvent; - objectEvent = &gObjectEvents[sprite->data[0]]; + objectEvent = &gObjectEvents[sprite->sObjEventId]; if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7])) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); @@ -4410,7 +4417,7 @@ void MovementType_TreeDisguise(struct Sprite *sprite) objectEvent->directionSequenceIndex = 1; sprite->data[7]++; } - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Disguise_Callback); + UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, MovementType_Disguise_Callback); } static bool8 MovementType_Disguise_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) @@ -4423,7 +4430,7 @@ void MovementType_MountainDisguise(struct Sprite *sprite) { struct ObjectEvent *objectEvent; - objectEvent = &gObjectEvents[sprite->data[0]]; + objectEvent = &gObjectEvents[sprite->sObjEventId]; if (objectEvent->directionSequenceIndex == 0 || (objectEvent->directionSequenceIndex == 1 && !sprite->data[7])) { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); @@ -4431,27 +4438,27 @@ void MovementType_MountainDisguise(struct Sprite *sprite) objectEvent->directionSequenceIndex = 1; sprite->data[7]++; } - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Disguise_Callback); + UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, MovementType_Disguise_Callback); } -void MovementType_Hidden(struct Sprite *sprite) +void MovementType_Buried(struct Sprite *sprite) { if (!sprite->data[7]) { - gObjectEvents[sprite->data[0]].fixedPriority = TRUE; + gObjectEvents[sprite->sObjEventId].fixedPriority = TRUE; sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; sprite->oam.priority = 3; sprite->data[7]++; } - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, MovementType_Hidden_Callback); + UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->sObjEventId], sprite, MovementType_Buried_Callback); } -static bool8 MovementType_Hidden_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static bool8 MovementType_Buried_Callback(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - return gMovementTypeFuncs_Hidden[sprite->data[1]](objectEvent, sprite); + return gMovementTypeFuncs_Buried[sprite->sTypeFuncId](objectEvent, sprite); } -bool8 MovementType_Hidden_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { ClearObjectEventMovement(objectEvent, sprite); return FALSE; @@ -4461,7 +4468,7 @@ bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Spr { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - sprite->data[1] = 0; + sprite->sTypeFuncId = 0; } return FALSE; } @@ -4472,7 +4479,7 @@ bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Spr { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceNormalMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -4482,7 +4489,7 @@ bool8 MovementType_WalkSlowlyInPlace_Step0(struct ObjectEvent *objectEvent, stru { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceSlowMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -4492,7 +4499,7 @@ bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Spri { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFastMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -4502,7 +4509,7 @@ bool8 MovementType_RunInPlace_Step0(struct ObjectEvent *objectEvent, struct Spri { ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetWalkInPlaceFastestMovementAction(objectEvent->facingDirection)); - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } @@ -4513,14 +4520,14 @@ bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprit ClearObjectEventMovement(objectEvent, sprite); ObjectEventSetSingleMovement(objectEvent, sprite, GetFaceDirectionMovementAction(objectEvent->facingDirection)); objectEvent->invisible = TRUE; - sprite->data[1] = 1; + sprite->sTypeFuncId = 1; return TRUE; } bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (ObjectEventExecSingleMovementAction(objectEvent, sprite)) { - sprite->data[1] = 2; + sprite->sTypeFuncId = 2; return TRUE; } return FALSE; @@ -4528,169 +4535,157 @@ bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; return FALSE; } static void ClearObjectEventMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - objectEvent->singleMovementActive = 0; + objectEvent->singleMovementActive = FALSE; objectEvent->heldMovementActive = FALSE; objectEvent->heldMovementFinished = FALSE; objectEvent->movementActionId = 0xFF; - sprite->data[1] = 0; + sprite->sTypeFuncId = 0; } u8 GetFaceDirectionAnimNum(u8 direction) { - return gFaceDirectionAnimNums[direction]; + return sFaceDirectionAnimNums[direction]; } u8 GetMoveDirectionAnimNum(u8 direction) { - return gMoveDirectionAnimNums[direction]; + return sMoveDirectionAnimNums[direction]; } u8 GetMoveDirectionFastAnimNum(u8 direction) { - return gMoveDirectionFastAnimNums[direction]; + return sMoveDirectionFastAnimNums[direction]; } u8 GetMoveDirectionFasterAnimNum(u8 direction) { - return gMoveDirectionFasterAnimNums[direction]; + return sMoveDirectionFasterAnimNums[direction]; } u8 GetMoveDirectionFastestAnimNum(u8 direction) { - return gMoveDirectionFastestAnimNums[direction]; + return sMoveDirectionFastestAnimNums[direction]; } u8 GetJumpSpecialDirectionAnimNum(u8 direction) { - return gJumpSpecialDirectionAnimNums[direction]; + return sJumpSpecialDirectionAnimNums[direction]; } u8 GetAcroWheelieDirectionAnimNum(u8 direction) { - return gAcroWheelieDirectionAnimNums[direction]; + return sAcroWheelieDirectionAnimNums[direction]; } -u8 Unref_GetAnimNums_08375633(u8 direction) +u8 GetAcroUnusedDirectionAnimNum(u8 direction) { - return gUnrefAnimNums_08375633[direction]; + return sAcroUnusedDirectionAnimNums[direction]; } u8 GetAcroEndWheelieDirectionAnimNum(u8 direction) { - return gAcroEndWheelieDirectionAnimNums[direction]; + return sAcroEndWheelieDirectionAnimNums[direction]; } u8 GetAcroUnusedActionDirectionAnimNum(u8 direction) { - return gAcroUnusedActionDirectionAnimNums[direction]; + return sAcroUnusedActionDirectionAnimNums[direction]; } u8 GetAcroWheeliePedalDirectionAnimNum(u8 direction) { - return gAcroWheeliePedalDirectionAnimNums[direction]; + return sAcroWheeliePedalDirectionAnimNums[direction]; } u8 GetFishingDirectionAnimNum(u8 direction) { - return gFishingDirectionAnimNums[direction]; + return sFishingDirectionAnimNums[direction]; } u8 GetFishingNoCatchDirectionAnimNum(u8 direction) { - return gFishingNoCatchDirectionAnimNums[direction]; + return sFishingNoCatchDirectionAnimNums[direction]; } u8 GetFishingBiteDirectionAnimNum(u8 direction) { - return gFishingBiteDirectionAnimNums[direction]; + return sFishingBiteDirectionAnimNums[direction]; } u8 GetRunningDirectionAnimNum(u8 direction) { - return gRunningDirectionAnimNums[direction]; + return sRunningDirectionAnimNums[direction]; } -static const struct UnkStruct_085094AC *sub_8092A4C(const union AnimCmd *const *anims) +static const struct StepAnimTable *GetStepAnimTable(const union AnimCmd *const *anims) { - const struct UnkStruct_085094AC *retval; + const struct StepAnimTable *stepTable; - for (retval = gUnknown_085094AC; retval->anims != NULL; retval++) + for (stepTable = sStepAnimTables; stepTable->anims != NULL; stepTable++) { - if (retval->anims == anims) - { - return retval; - } + if (stepTable->anims == anims) + return stepTable; } return NULL; } -void npc_apply_anim_looping(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) +void SetStepAnimHandleAlternation(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) { - const struct UnkStruct_085094AC *unk85094AC; + const struct StepAnimTable *stepTable; if (!objectEvent->inanimate) { sprite->animNum = animNum; - unk85094AC = sub_8092A4C(sprite->anims); - if (unk85094AC != NULL) + stepTable = GetStepAnimTable(sprite->anims); + if (stepTable != NULL) { - if (sprite->animCmdIndex == unk85094AC->animPos[0]) - { - sprite->animCmdIndex = unk85094AC->animPos[3]; - } - else if (sprite->animCmdIndex == unk85094AC->animPos[1]) - { - sprite->animCmdIndex = unk85094AC->animPos[2]; - } + if (sprite->animCmdIndex == stepTable->animPos[0]) + sprite->animCmdIndex = stepTable->animPos[3]; + else if (sprite->animCmdIndex == stepTable->animPos[1]) + sprite->animCmdIndex = stepTable->animPos[2]; } SeekSpriteAnim(sprite, sprite->animCmdIndex); } } -void obj_npc_animation_step(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) +void SetStepAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animNum) { - const struct UnkStruct_085094AC *unk85094AC; + const struct StepAnimTable *stepTable; if (!objectEvent->inanimate) { u8 animPos; sprite->animNum = animNum; - unk85094AC = sub_8092A4C(sprite->anims); - if (unk85094AC != NULL) + stepTable = GetStepAnimTable(sprite->anims); + if (stepTable != NULL) { - animPos = unk85094AC->animPos[1]; - if (sprite->animCmdIndex <= unk85094AC->animPos[0]) - { - animPos = unk85094AC->animPos[0]; - } + animPos = stepTable->animPos[1]; + if (sprite->animCmdIndex <= stepTable->animPos[0]) + animPos = stepTable->animPos[0]; + SeekSpriteAnim(sprite, animPos); } } } -// file boundary? - -u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2) +u8 GetDirectionToFace(s16 x, s16 y, s16 targetX, s16 targetY) { - if (x1 > x2) - { + if (x > targetX) return DIR_WEST; - } - if (x1 < x2) - { + + if (x < targetX) return DIR_EAST; - } - if (y1 > y2) - { + + if (y > targetY) return DIR_NORTH; - } + return DIR_SOUTH; } @@ -4700,7 +4695,7 @@ void SetTrainerMovementType(struct ObjectEvent *objectEvent, u8 movementType) objectEvent->directionSequenceIndex = 0; objectEvent->playerCopyableMovement = 0; gSprites[objectEvent->spriteId].callback = sMovementTypeCallbacks[movementType]; - gSprites[objectEvent->spriteId].data[1] = 0; + gSprites[objectEvent->spriteId].sTypeFuncId = 0; } u8 GetTrainerFacingDirectionMovementType(u8 direction) @@ -4710,10 +4705,8 @@ u8 GetTrainerFacingDirectionMovementType(u8 direction) static u8 GetCollisionInDirection(struct ObjectEvent *objectEvent, u8 direction) { - s16 x; - s16 y; - x = objectEvent->currentCoords.x; - y = objectEvent->currentCoords.y; + s16 x = objectEvent->currentCoords.x; + s16 y = objectEvent->currentCoords.y; MoveCoords(direction, &x, &y); return GetCollisionAtCoords(objectEvent, x, y, direction); } @@ -4760,19 +4753,17 @@ static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEv { left = objectEvent->initialCoords.x - objectEvent->rangeX; right = objectEvent->initialCoords.x + objectEvent->rangeX; + if (left > x || right < x) - { return TRUE; - } } if (objectEvent->rangeY != 0) { top = objectEvent->initialCoords.y - objectEvent->rangeY; bottom = objectEvent->initialCoords.y + objectEvent->rangeY; + if (top > y || bottom < y) - { return TRUE; - } } return FALSE; } @@ -4814,7 +4805,7 @@ bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) - && gSprites[gObjectEvents[objectEventId].spriteId].data[7] & 2) + && gSprites[gObjectEvents[objectEventId].spriteId].sBerryTreeFlags & BERRY_FLAG_SPARKLING) { return TRUE; } @@ -4822,23 +4813,27 @@ bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) return FALSE; } -void sub_8092EF0(u8 localId, u8 mapNum, u8 mapGroup) +void SetBerryTreeJustPicked(u8 localId, u8 mapNum, u8 mapGroup) { u8 objectEventId; if (!TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId)) { - gSprites[gObjectEvents[objectEventId].spriteId].data[7] |= 0x04; + gSprites[gObjectEvents[objectEventId].spriteId].sBerryTreeFlags |= BERRY_FLAG_JUST_PICKED; } } +#undef sTimer +#undef sBerryTreeFlags + void MoveCoords(u8 direction, s16 *x, s16 *y) { *x += sDirectionToVectors[direction].x; *y += sDirectionToVectors[direction].y; } -void sub_8092F60(u8 direction, s16 *x, s16 *y) +// Unused +static void MoveCoordsInMapCoordIncrement(u8 direction, s16 *x, s16 *y) { *x += sDirectionToVectors[direction].x << 4; *y += sDirectionToVectors[direction].y << 4; @@ -4859,7 +4854,7 @@ static void MoveCoordsInDirection(u32 dir, s16 *x, s16 *y, s16 deltaX, s16 delta *y -= dy2; } -void sub_8092FF0(s16 x, s16 y, s16 *destX, s16 *destY) +void GetMapCoordsFromSpritePos(s16 x, s16 y, s16 *destX, s16 *destY) { *destX = (x - gSaveBlock1Ptr->pos.x) << 4; *destY = (y - gSaveBlock1Ptr->pos.y) << 4; @@ -4898,22 +4893,18 @@ static void GetObjectEventMovingCameraOffset(s16 *x, s16 *y) { *x = 0; *y = 0; + if (gFieldCamera.x > 0) - { (*x)++; - } + if (gFieldCamera.x < 0) - { - (*x) --; - } + (*x)--; + if (gFieldCamera.y > 0) - { (*y)++; - } + if (gFieldCamera.y < 0) - { - (*y) --; - } + (*y)--; } void ObjectEventMoveDestCoords(struct ObjectEvent *objectEvent, u32 direction, s16 *x, s16 *y) @@ -4949,7 +4940,7 @@ bool8 ObjectEventSetHeldMovement(struct ObjectEvent *objectEvent, u8 movementAct objectEvent->movementActionId = movementActionId; objectEvent->heldMovementActive = TRUE; objectEvent->heldMovementFinished = FALSE; - gSprites[objectEvent->spriteId].data[2] = 0; + gSprites[objectEvent->spriteId].sActionFuncId = 0; return FALSE; } @@ -4970,8 +4961,8 @@ void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent) objectEvent->movementActionId = 0xFF; objectEvent->heldMovementActive = FALSE; objectEvent->heldMovementFinished = FALSE; - gSprites[objectEvent->spriteId].data[1] = 0; - gSprites[objectEvent->spriteId].data[2] = 0; + gSprites[objectEvent->spriteId].sTypeFuncId = 0; + gSprites[objectEvent->spriteId].sActionFuncId = 0; } u8 ObjectEventCheckHeldMovementStatus(struct ObjectEvent *objectEvent) @@ -4996,7 +4987,7 @@ u8 ObjectEventGetHeldMovementActionId(struct ObjectEvent *objectEvent) if (objectEvent->heldMovementActive) return objectEvent->movementActionId; - return 0xFF; + return MOVEMENT_ACTION_NONE; } void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 (*callback)(struct ObjectEvent *, struct Sprite *)) @@ -5065,10 +5056,10 @@ dirn_to_anim(GetAcroEndWheelieMoveDirectionMovementAction, gAcroEndWheelieMoveDi u8 GetOppositeDirection(u8 direction) { - u8 directions[sizeof gOppositeDirections]; + u8 directions[sizeof sOppositeDirections]; - memcpy(directions, gOppositeDirections, sizeof gOppositeDirections); - if (direction < 1 || direction > (sizeof gOppositeDirections)) + memcpy(directions, sOppositeDirections, sizeof sOppositeDirections); + if (direction <= DIR_NONE || direction > (sizeof sOppositeDirections)) { return direction; } @@ -5098,7 +5089,7 @@ static u32 state_to_direction(u8 a0, u32 a1, u32 a2) static void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (gMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) + if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) { objectEvent->heldMovementFinished = TRUE; } @@ -5106,10 +5097,10 @@ static void ObjectEventExecHeldMovementAction(struct ObjectEvent *objectEvent, s static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (gMovementActionFuncs[objectEvent->movementActionId][sprite->data[2]](objectEvent, sprite)) + if (gMovementActionFuncs[objectEvent->movementActionId][sprite->sActionFuncId](objectEvent, sprite)) { objectEvent->movementActionId = 0xFF; - sprite->data[2] = 0; + sprite->sActionFuncId = 0; return TRUE; } return FALSE; @@ -5118,16 +5109,16 @@ static bool8 ObjectEventExecSingleMovementAction(struct ObjectEvent *objectEvent static void ObjectEventSetSingleMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 animId) { objectEvent->movementActionId = animId; - sprite->data[2] = 0; + sprite->sActionFuncId = 0; } static void FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { SetObjectEventDirection(objectEvent, direction); ShiftStillObjectEventCoords(objectEvent); - obj_npc_animation_step(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); + SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); sprite->animPaused = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; } bool8 MovementAction_FaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) @@ -5154,7 +5145,7 @@ bool8 MovementAction_FaceRight_Step0(struct ObjectEvent *objectEvent, struct Spr return TRUE; } -void npc_apply_direction(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) +void InitNpcForMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { s16 x; s16 y; @@ -5164,34 +5155,34 @@ void npc_apply_direction(struct ObjectEvent *objectEvent, struct Sprite *sprite, SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); - oamt_npc_ministep_reset(sprite, direction, speed); + SetSpriteDataForNormalStep(sprite, direction, speed); sprite->animPaused = FALSE; - if (gLockedAnimObjectEvents != NULL && FindLockedObjectEventIndex(objectEvent) != OBJECT_EVENTS_COUNT) - { + + if (sLockedAnimObjectEvents != NULL && FindLockedObjectEventIndex(objectEvent) != OBJECT_EVENTS_COUNT) sprite->animPaused = TRUE; - } + objectEvent->triggerGroundEffectsOnMove = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; } -void do_go_anim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) +static void InitMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { - u8 (*functions[ARRAY_COUNT(gUnknown_0850DEE8)])(u8); + u8 (*functions[ARRAY_COUNT(sDirectionAnimFuncsBySpeed)])(u8); - memcpy(functions, gUnknown_0850DEE8, sizeof gUnknown_0850DEE8); - npc_apply_direction(objectEvent, sprite, direction, speed); - npc_apply_anim_looping(objectEvent, sprite, functions[speed](objectEvent->facingDirection)); + memcpy(functions, sDirectionAnimFuncsBySpeed, sizeof sDirectionAnimFuncsBySpeed); + InitNpcForMovement(objectEvent, sprite, direction, speed); + SetStepAnimHandleAlternation(objectEvent, sprite, functions[speed](objectEvent->facingDirection)); } -void StartRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +static void StartRunningAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { - npc_apply_direction(objectEvent, sprite, direction, 1); - npc_apply_anim_looping(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); + InitNpcForMovement(objectEvent, sprite, direction, 1); + SetStepAnimHandleAlternation(objectEvent, sprite, GetRunningDirectionAnimNum(objectEvent->facingDirection)); } -bool8 npc_obj_ministep_stop_on_arrival(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static bool8 UpdateMovementNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (obj_npc_ministep(sprite)) + if (NpcTakeStep(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; @@ -5201,7 +5192,7 @@ bool8 npc_obj_ministep_stop_on_arrival(struct ObjectEvent *objectEvent, struct S return FALSE; } -void sub_8093AF0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +static void InitNpcForWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { s16 x; s16 y; @@ -5211,21 +5202,21 @@ void sub_8093AF0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 dire SetObjectEventDirection(objectEvent, direction); MoveCoords(direction, &x, &y); ShiftObjectEventCoords(objectEvent, x, y); - sub_80976DC(sprite, direction); + SetWalkSlowSpriteData(sprite, direction); sprite->animPaused = FALSE; objectEvent->triggerGroundEffectsOnMove = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; } -void sub_8093B60(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +static void InitWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { - sub_8093AF0(objectEvent, sprite, direction); - npc_apply_anim_looping(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); + InitNpcForWalkSlow(objectEvent, sprite, direction); + SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); } -bool8 an_walk_any_2(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static bool8 UpdateWalkSlow(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80976EC(sprite)) + if (UpdateWalkSlowAnim(sprite)) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; @@ -5237,15 +5228,15 @@ bool8 an_walk_any_2(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_WalkSlowDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_NORTHWEST); + InitWalkSlow(objectEvent, sprite, DIR_NORTHWEST); return MovementAction_WalkSlowDiagonalUpLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5253,15 +5244,15 @@ bool8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_WalkSlowDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_NORTHEAST); + InitWalkSlow(objectEvent, sprite, DIR_NORTHEAST); return MovementAction_WalkSlowDiagonalUpRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5269,15 +5260,15 @@ bool8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct ObjectEvent *objectEve bool8 MovementAction_WalkSlowDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_SOUTHWEST); + InitWalkSlow(objectEvent, sprite, DIR_SOUTHWEST); return MovementAction_WalkSlowDiagonalDownLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5285,15 +5276,15 @@ bool8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct ObjectEvent *objectEv bool8 MovementAction_WalkSlowDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_SOUTHEAST); + InitWalkSlow(objectEvent, sprite, DIR_SOUTHEAST); return MovementAction_WalkSlowDiagonalDownRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5301,15 +5292,15 @@ bool8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct ObjectEvent *objectE bool8 MovementAction_WalkSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_SOUTH); + InitWalkSlow(objectEvent, sprite, DIR_SOUTH); return MovementAction_WalkSlowDown_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5317,15 +5308,15 @@ bool8 MovementAction_WalkSlowDown_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_NORTH); + InitWalkSlow(objectEvent, sprite, DIR_NORTH); return MovementAction_WalkSlowUp_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5333,15 +5324,15 @@ bool8 MovementAction_WalkSlowUp_Step1(struct ObjectEvent *objectEvent, struct Sp bool8 MovementAction_WalkSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_WEST); + InitWalkSlow(objectEvent, sprite, DIR_WEST); return MovementAction_WalkSlowLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5349,15 +5340,15 @@ bool8 MovementAction_WalkSlowLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_EAST); + InitWalkSlow(objectEvent, sprite, DIR_EAST); return MovementAction_WalkSlowRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5365,15 +5356,15 @@ bool8 MovementAction_WalkSlowRight_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkNormalDiagonalUpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTHWEST, 0); + InitMovementNormal(objectEvent, sprite, DIR_NORTHWEST, 0); return MovementAction_WalkNormalDiagonalUpLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5381,15 +5372,15 @@ bool8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct ObjectEvent *objectEv bool8 MovementAction_WalkNormalDiagonalUpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTHEAST, 0); + InitMovementNormal(objectEvent, sprite, DIR_NORTHEAST, 0); return MovementAction_WalkNormalDiagonalUpRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5397,15 +5388,15 @@ bool8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct ObjectEvent *objectE bool8 MovementAction_WalkNormalDiagonalDownLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTHWEST, 0); + InitMovementNormal(objectEvent, sprite, DIR_SOUTHWEST, 0); return MovementAction_WalkNormalDiagonalDownLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5413,15 +5404,15 @@ bool8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct ObjectEvent *object bool8 MovementAction_WalkNormalDiagonalDownRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTHEAST, 0); + InitMovementNormal(objectEvent, sprite, DIR_SOUTHEAST, 0); return MovementAction_WalkNormalDiagonalDownRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5429,15 +5420,15 @@ bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct ObjectEvent *objec bool8 MovementAction_WalkNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTH, 0); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, 0); return MovementAction_WalkNormalDown_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5445,15 +5436,15 @@ bool8 MovementAction_WalkNormalDown_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTH, 0); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, 0); return MovementAction_WalkNormalUp_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5461,15 +5452,15 @@ bool8 MovementAction_WalkNormalUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 0); + InitMovementNormal(objectEvent, sprite, DIR_WEST, 0); return MovementAction_WalkNormalLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5477,65 +5468,74 @@ bool8 MovementAction_WalkNormalLeft_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 0); + InitMovementNormal(objectEvent, sprite, DIR_EAST, 0); return MovementAction_WalkNormalRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkNormalRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -void sub_8093FC4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed, u8 a5) +#define JUMP_HALFWAY 1 +#define JUMP_FINISHED ((u8)-1) + +enum { + JUMP_TYPE_HIGH, + JUMP_TYPE_LOW, + JUMP_TYPE_NORMAL, +}; + +static void InitJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed, u8 type) { - s16 displacements[ARRAY_COUNT(gUnknown_0850DFBC)]; + s16 displacements[ARRAY_COUNT(sJumpInitDisplacements)]; s16 x; s16 y; - memcpy(displacements, gUnknown_0850DFBC, sizeof gUnknown_0850DFBC); + memcpy(displacements, sJumpInitDisplacements, sizeof sJumpInitDisplacements); x = 0; y = 0; SetObjectEventDirection(objectEvent, direction); MoveCoordsInDirection(direction, &x, &y, displacements[speed], displacements[speed]); ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y); - sub_809783C(sprite, direction, speed, a5); - sprite->data[2] = 1; - sprite->animPaused = 0; - objectEvent->triggerGroundEffectsOnMove = 1; - objectEvent->disableCoveringGroundEffects = 1; + SetJumpSpriteData(sprite, direction, speed, type); + sprite->sActionFuncId = 1; + sprite->animPaused = FALSE; + objectEvent->triggerGroundEffectsOnMove = TRUE; + objectEvent->disableCoveringGroundEffects = TRUE; } -void maybe_shadow_1(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed, u8 a4) +static void InitJumpRegular(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed, u8 type) { - sub_8093FC4(objectEvent, sprite, direction, speed, a4); - npc_apply_anim_looping(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); + InitJump(objectEvent, sprite, direction, speed, type); + SetStepAnimHandleAlternation(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); DoShadowFieldEffect(objectEvent); } -u8 sub_80940C4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 callback(struct Sprite *)) +static u8 UpdateJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 callback(struct Sprite *)) { - s16 displacements[ARRAY_COUNT(gUnknown_0850DFC2)]; + s16 displacements[ARRAY_COUNT(sJumpDisplacements)]; s16 x; s16 y; u8 result; - memcpy(displacements, gUnknown_0850DFC2, sizeof gUnknown_0850DFC2); + memcpy(displacements, sJumpDisplacements, sizeof sJumpDisplacements); result = callback(sprite); - if (result == 1 && displacements[sprite->data[4]] != 0) + if (result == JUMP_HALFWAY && displacements[sprite->sSpeed] != 0) { x = 0; y = 0; - MoveCoordsInDirection(objectEvent->movementDirection, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]); + MoveCoordsInDirection(objectEvent->movementDirection, &x, &y, displacements[sprite->sSpeed], displacements[sprite->sSpeed]); ShiftObjectEventCoords(objectEvent, objectEvent->currentCoords.x + x, objectEvent->currentCoords.y + y); objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->disableCoveringGroundEffects = TRUE; } - else if (result == 0xFF) + else if (result == JUMP_FINISHED) { ShiftStillObjectEventCoords(objectEvent); objectEvent->triggerGroundEffectsOnStop = TRUE; @@ -5545,43 +5545,41 @@ u8 sub_80940C4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 callba return result; } -u8 sub_8094188(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static u8 DoJumpAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - return sub_80940C4(objectEvent, sprite, sub_809785C); + return UpdateJumpAnim(objectEvent, sprite, DoJumpSpriteMovement); } -u8 sub_809419C(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static u8 DoJumpSpecialAnimStep(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - return sub_80940C4(objectEvent, sprite, sub_80978E4); + return UpdateJumpAnim(objectEvent, sprite, DoJumpSpecialSpriteMovement); } -bool8 sub_80941B0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static bool8 DoJumpAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_8094188(objectEvent, sprite) == 0xFF) - { + if (DoJumpAnimStep(objectEvent, sprite) == JUMP_FINISHED) return TRUE; - } + return FALSE; } -bool8 sub_80941C8(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static bool8 DoJumpSpecialAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_809419C(objectEvent, sprite) == 0xFF) - { + if (DoJumpSpecialAnimStep(objectEvent, sprite) == JUMP_FINISHED) return TRUE; - } + return FALSE; } -bool8 sub_80941E0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static bool8 DoJumpInPlaceAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - switch (sub_8094188(objectEvent, sprite)) + switch (DoJumpAnimStep(objectEvent, sprite)) { - case 255: + case JUMP_FINISHED: return TRUE; - case 1: + case JUMP_HALFWAY: SetObjectEventDirection(objectEvent, GetOppositeDirection(objectEvent->movementDirection)); - obj_npc_animation_step(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); + SetStepAnim(objectEvent, sprite, GetMoveDirectionAnimNum(objectEvent->facingDirection)); default: return FALSE; } @@ -5589,16 +5587,16 @@ bool8 sub_80941E0(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_Jump2Down_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_SOUTH, 2, 0); + InitJumpRegular(objectEvent, sprite, DIR_SOUTH, 2, JUMP_TYPE_HIGH); return MovementAction_Jump2Down_Step1(objectEvent, sprite); } bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5606,16 +5604,16 @@ bool8 MovementAction_Jump2Down_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_Jump2Up_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_NORTH, 2, 0); + InitJumpRegular(objectEvent, sprite, DIR_NORTH, 2, JUMP_TYPE_HIGH); return MovementAction_Jump2Up_Step1(objectEvent, sprite); } bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5623,16 +5621,16 @@ bool8 MovementAction_Jump2Up_Step1(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementAction_Jump2Left_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_WEST, 2, 0); + InitJumpRegular(objectEvent, sprite, DIR_WEST, 2, JUMP_TYPE_HIGH); return MovementAction_Jump2Left_Step1(objectEvent, sprite); } bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5640,33 +5638,32 @@ bool8 MovementAction_Jump2Left_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_Jump2Right_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_EAST, 2, 0); + InitJumpRegular(objectEvent, sprite, DIR_EAST, 2, JUMP_TYPE_HIGH); return MovementAction_Jump2Right_Step1(objectEvent, sprite); } bool8 MovementAction_Jump2Right_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } - -void sub_8094390(struct Sprite *sprite, u16 duration) +static void InitMovementDelay(struct Sprite *sprite, u16 duration) { - sprite->data[2] = 1; + sprite->sActionFuncId = 1; sprite->data[3] = duration; } bool8 MovementAction_Delay_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (-- sprite->data[3] == 0) + if (--sprite->data[3] == 0) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5674,45 +5671,45 @@ bool8 MovementAction_Delay_Step1(struct ObjectEvent *objectEvent, struct Sprite bool8 MovementAction_Delay1_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094390(sprite, 1); + InitMovementDelay(sprite, 1); return MovementAction_Delay_Step1(objectEvent, sprite); } bool8 MovementAction_Delay2_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094390(sprite, 2); + InitMovementDelay(sprite, 2); return MovementAction_Delay_Step1(objectEvent, sprite); } bool8 MovementAction_Delay4_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094390(sprite, 4); + InitMovementDelay(sprite, 4); return MovementAction_Delay_Step1(objectEvent, sprite); } bool8 MovementAction_Delay8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094390(sprite, 8); + InitMovementDelay(sprite, 8); return MovementAction_Delay_Step1(objectEvent, sprite); } bool8 MovementAction_Delay16_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094390(sprite, 16); + InitMovementDelay(sprite, 16); return MovementAction_Delay_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTH, 1); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_WalkFastDown_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5720,15 +5717,15 @@ bool8 MovementAction_WalkFastDown_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTH, 1); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_WalkFastUp_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5736,15 +5733,15 @@ bool8 MovementAction_WalkFastUp_Step1(struct ObjectEvent *objectEvent, struct Sp bool8 MovementAction_WalkFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 1); + InitMovementNormal(objectEvent, sprite, DIR_WEST, 1); return MovementAction_WalkFastLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5752,27 +5749,27 @@ bool8 MovementAction_WalkFastLeft_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 1); + InitMovementNormal(objectEvent, sprite, DIR_EAST, 1); return MovementAction_WalkFastRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -void sub_8094554(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration) +static void InitMoveInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration) { SetObjectEventDirection(objectEvent, direction); - npc_apply_anim_looping(objectEvent, sprite, animNum); + SetStepAnimHandleAlternation(objectEvent, sprite, animNum); sprite->animPaused = FALSE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; sprite->data[3] = duration; } @@ -5780,7 +5777,7 @@ bool8 MovementAction_WalkInPlace_Step1(struct ObjectEvent *objectEvent, struct S { if (-- sprite->data[3] == 0) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; sprite->animPaused = TRUE; return TRUE; } @@ -5798,111 +5795,111 @@ bool8 MovementAction_WalkInPlaceSlow_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32); + InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); + InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32); + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32); + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32); return MovementAction_WalkInPlaceSlow_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16); + InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16); + InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16); + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16); + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8); + InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8); + InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8); + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8); + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastestDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4); + InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastestUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4); + InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastestLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_WalkInPlaceFastestRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_RideWaterCurrentDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTH, 2); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, 2); return MovementAction_RideWaterCurrentDown_Step1(objectEvent, sprite); } bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5910,15 +5907,15 @@ bool8 MovementAction_RideWaterCurrentDown_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_RideWaterCurrentUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTH, 2); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, 2); return MovementAction_RideWaterCurrentUp_Step1(objectEvent, sprite); } bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5926,15 +5923,15 @@ bool8 MovementAction_RideWaterCurrentUp_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_RideWaterCurrentLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 2); + InitMovementNormal(objectEvent, sprite, DIR_WEST, 2); return MovementAction_RideWaterCurrentLeft_Step1(objectEvent, sprite); } bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5942,15 +5939,15 @@ bool8 MovementAction_RideWaterCurrentLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_RideWaterCurrentRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 2); + InitMovementNormal(objectEvent, sprite, DIR_EAST, 2); return MovementAction_RideWaterCurrentRight_Step1(objectEvent, sprite); } bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5958,15 +5955,15 @@ bool8 MovementAction_RideWaterCurrentRight_Step1(struct ObjectEvent *objectEvent bool8 MovementAction_WalkFastestDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTH, 3); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, 3); return MovementAction_WalkFastestDown_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastestDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5974,15 +5971,15 @@ bool8 MovementAction_WalkFastestDown_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_WalkFastestUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTH, 3); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, 3); return MovementAction_WalkFastestUp_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastestUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -5990,15 +5987,15 @@ bool8 MovementAction_WalkFastestUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_WalkFastestLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 3); + InitMovementNormal(objectEvent, sprite, DIR_WEST, 3); return MovementAction_WalkFastestLeft_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastestLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6006,15 +6003,15 @@ bool8 MovementAction_WalkFastestLeft_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_WalkFastestRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 3); + InitMovementNormal(objectEvent, sprite, DIR_EAST, 3); return MovementAction_WalkFastestRight_Step1(objectEvent, sprite); } bool8 MovementAction_WalkFastestRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6022,15 +6019,15 @@ bool8 MovementAction_WalkFastestRight_Step1(struct ObjectEvent *objectEvent, str bool8 MovementAction_SlideDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_SOUTH, 4); + InitMovementNormal(objectEvent, sprite, DIR_SOUTH, 4); return MovementAction_SlideDown_Step1(objectEvent, sprite); } bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6038,15 +6035,15 @@ bool8 MovementAction_SlideDown_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_SlideUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_NORTH, 4); + InitMovementNormal(objectEvent, sprite, DIR_NORTH, 4); return MovementAction_SlideUp_Step1(objectEvent, sprite); } bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6054,15 +6051,15 @@ bool8 MovementAction_SlideUp_Step1(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementAction_SlideLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 4); + InitMovementNormal(objectEvent, sprite, DIR_WEST, 4); return MovementAction_SlideLeft_Step1(objectEvent, sprite); } bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6070,15 +6067,15 @@ bool8 MovementAction_SlideLeft_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_SlideRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 4); + InitMovementNormal(objectEvent, sprite, DIR_EAST, 4); return MovementAction_SlideRight_Step1(objectEvent, sprite); } bool8 MovementAction_SlideRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6092,9 +6089,9 @@ bool8 MovementAction_PlayerRunDown_Step0(struct ObjectEvent *objectEvent, struct bool8 MovementAction_PlayerRunDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6108,9 +6105,9 @@ bool8 MovementAction_PlayerRunUp_Step0(struct ObjectEvent *objectEvent, struct S bool8 MovementAction_PlayerRunUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6124,9 +6121,9 @@ bool8 MovementAction_PlayerRunLeft_Step0(struct ObjectEvent *objectEvent, struct bool8 MovementAction_PlayerRunLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6140,9 +6137,9 @@ bool8 MovementAction_PlayerRunRight_Step0(struct ObjectEvent *objectEvent, struc bool8 MovementAction_PlayerRunRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6152,7 +6149,7 @@ void StartSpriteAnimInDirection(struct ObjectEvent *objectEvent, struct Sprite * { SetAndStartSpriteAnim(sprite, animNum, 0); SetObjectEventDirection(objectEvent, direction); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; } bool8 MovementAction_StartAnimInDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) @@ -6165,29 +6162,29 @@ bool8 MovementAction_WaitSpriteAnim(struct ObjectEvent *objectEvent, struct Spri { if (SpriteAnimEnded(sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -void sub_8094DE4(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +static void InitJumpSpecial(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { - sub_8093FC4(objectEvent, sprite, direction, 1, 0); + InitJump(objectEvent, sprite, direction, 1, JUMP_TYPE_HIGH); StartSpriteAnim(sprite, GetJumpSpecialDirectionAnimNum(direction)); } bool8 MovementAction_JumpSpecialDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094DE4(objectEvent, sprite, DIR_SOUTH); + InitJumpSpecial(objectEvent, sprite, DIR_SOUTH); return MovementAction_JumpSpecialDown_Step1(objectEvent, sprite); } bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941C8(objectEvent, sprite)) + if (DoJumpSpecialAnim(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; objectEvent->landingJump = FALSE; return TRUE; } @@ -6196,15 +6193,15 @@ bool8 MovementAction_JumpSpecialDown_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_JumpSpecialUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094DE4(objectEvent, sprite, DIR_NORTH); + InitJumpSpecial(objectEvent, sprite, DIR_NORTH); return MovementAction_JumpSpecialUp_Step1(objectEvent, sprite); } bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941C8(objectEvent, sprite)) + if (DoJumpSpecialAnim(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; objectEvent->landingJump = FALSE; return TRUE; } @@ -6213,15 +6210,15 @@ bool8 MovementAction_JumpSpecialUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_JumpSpecialLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094DE4(objectEvent, sprite, DIR_WEST); + InitJumpSpecial(objectEvent, sprite, DIR_WEST); return MovementAction_JumpSpecialLeft_Step1(objectEvent, sprite); } bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941C8(objectEvent, sprite)) + if (DoJumpSpecialAnim(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; objectEvent->landingJump = FALSE; return TRUE; } @@ -6230,15 +6227,15 @@ bool8 MovementAction_JumpSpecialLeft_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_JumpSpecialRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094DE4(objectEvent, sprite, DIR_EAST); + InitJumpSpecial(objectEvent, sprite, DIR_EAST); return MovementAction_JumpSpecialRight_Step1(objectEvent, sprite); } bool8 MovementAction_JumpSpecialRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941C8(objectEvent, sprite)) + if (DoJumpSpecialAnim(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; objectEvent->landingJump = FALSE; return TRUE; } @@ -6253,7 +6250,7 @@ bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *objectEvent, struct Sp { FaceDirection(objectEvent, sprite, GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, gObjectEvents[playerObjectId].currentCoords.y)); } - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } @@ -6265,36 +6262,36 @@ bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *objectEvent, struc { FaceDirection(objectEvent, sprite, GetOppositeDirection(GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, gObjectEvents[playerObjectId].currentCoords.y))); } - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_LockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->facingDirectionLocked = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_UnlockFacingDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->facingDirectionLocked = FALSE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_JumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_SOUTH, 1, 2); + InitJumpRegular(objectEvent, sprite, DIR_SOUTH, 1, JUMP_TYPE_NORMAL); return MovementAction_JumpDown_Step1(objectEvent, sprite); } bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6302,16 +6299,16 @@ bool8 MovementAction_JumpDown_Step1(struct ObjectEvent *objectEvent, struct Spri bool8 MovementAction_JumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_NORTH, 1, 2); + InitJumpRegular(objectEvent, sprite, DIR_NORTH, 1, JUMP_TYPE_NORMAL); return MovementAction_JumpUp_Step1(objectEvent, sprite); } bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6319,16 +6316,16 @@ bool8 MovementAction_JumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite bool8 MovementAction_JumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_WEST, 1, 2); + InitJumpRegular(objectEvent, sprite, DIR_WEST, 1, JUMP_TYPE_NORMAL); return MovementAction_JumpLeft_Step1(objectEvent, sprite); } bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6336,16 +6333,16 @@ bool8 MovementAction_JumpLeft_Step1(struct ObjectEvent *objectEvent, struct Spri bool8 MovementAction_JumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_EAST, 1, 2); + InitJumpRegular(objectEvent, sprite, DIR_EAST, 1, JUMP_TYPE_NORMAL); return MovementAction_JumpRight_Step1(objectEvent, sprite); } bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6353,16 +6350,16 @@ bool8 MovementAction_JumpRight_Step1(struct ObjectEvent *objectEvent, struct Spr bool8 MovementAction_JumpInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_SOUTH, 0, 0); + InitJumpRegular(objectEvent, sprite, DIR_SOUTH, 0, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceDown_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6370,16 +6367,16 @@ bool8 MovementAction_JumpInPlaceDown_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_JumpInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_NORTH, 0, 0); + InitJumpRegular(objectEvent, sprite, DIR_NORTH, 0, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceUp_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6387,16 +6384,16 @@ bool8 MovementAction_JumpInPlaceUp_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_JumpInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_WEST, 0, 0); + InitJumpRegular(objectEvent, sprite, DIR_WEST, 0, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceLeft_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6404,16 +6401,16 @@ bool8 MovementAction_JumpInPlaceLeft_Step1(struct ObjectEvent *objectEvent, stru bool8 MovementAction_JumpInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_EAST, 0, 0); + InitJumpRegular(objectEvent, sprite, DIR_EAST, 0, JUMP_TYPE_HIGH); return MovementAction_JumpInPlaceRight_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6421,16 +6418,16 @@ bool8 MovementAction_JumpInPlaceRight_Step1(struct ObjectEvent *objectEvent, str bool8 MovementAction_JumpInPlaceDownUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_SOUTH, 0, 2); + InitJumpRegular(objectEvent, sprite, DIR_SOUTH, 0, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceDownUp_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941E0(objectEvent, sprite)) + if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6438,16 +6435,16 @@ bool8 MovementAction_JumpInPlaceDownUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_JumpInPlaceUpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_NORTH, 0, 2); + InitJumpRegular(objectEvent, sprite, DIR_NORTH, 0, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceUpDown_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941E0(objectEvent, sprite)) + if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6455,16 +6452,16 @@ bool8 MovementAction_JumpInPlaceUpDown_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_WEST, 0, 2); + InitJumpRegular(objectEvent, sprite, DIR_WEST, 0, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceLeftRight_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941E0(objectEvent, sprite)) + if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6472,16 +6469,16 @@ bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - maybe_shadow_1(objectEvent, sprite, DIR_EAST, 0, 2); + InitJumpRegular(objectEvent, sprite, DIR_EAST, 0, JUMP_TYPE_NORMAL); return MovementAction_JumpInPlaceRightLeft_Step1(objectEvent, sprite); } bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941E0(objectEvent, sprite)) + if (DoJumpInPlaceAnim(objectEvent, sprite)) { objectEvent->hasShadow = 0; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6502,42 +6499,42 @@ bool8 MovementAction_NurseJoyBowDown_Step0(struct ObjectEvent *objectEvent, stru bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->disableJumpLandingGroundEffect = FALSE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->disableJumpLandingGroundEffect = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_DisableAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->inanimate = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_RestoreAnimation_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->inanimate = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->inanimate; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_SetInvisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->invisible = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_SetVisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->invisible = FALSE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } @@ -6545,7 +6542,7 @@ bool8 MovementAction_EmoteExclamationMark_Step0(struct ObjectEvent *objectEvent, { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } @@ -6553,7 +6550,7 @@ bool8 MovementAction_EmoteQuestionMark_Step0(struct ObjectEvent *objectEvent, st { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_QUESTION_MARK_ICON); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } @@ -6561,32 +6558,32 @@ bool8 MovementAction_EmoteHeart_Step0(struct ObjectEvent *objectEvent, struct Sp { ObjectEventGetLocalIdAndMap(objectEvent, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); FieldEffectStart(FLDEFF_HEART_ICON); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_RevealTrainer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (objectEvent->movementType == MOVEMENT_TYPE_HIDDEN) + if (objectEvent->movementType == MOVEMENT_TYPE_BURIED) { - sub_80B4578(objectEvent); + SetBuriedTrainerMovement(objectEvent); return FALSE; } if (objectEvent->movementType != MOVEMENT_TYPE_TREE_DISGUISE && objectEvent->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } - sub_8155D78(objectEvent); - sprite->data[2] = 1; + StartRevealDisguise(objectEvent); + sprite->sActionFuncId = 1; return MovementAction_RevealTrainer_Step1(objectEvent, sprite); } bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_8155DA0(objectEvent)) + if (UpdateRevealDisguise(objectEvent)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6595,7 +6592,7 @@ bool8 MovementAction_RevealTrainer_Step1(struct ObjectEvent *objectEvent, struct bool8 MovementAction_RockSmashBreak_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { SetAndStartSpriteAnim(sprite, 1, 0); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return FALSE; } @@ -6604,7 +6601,7 @@ bool8 MovementAction_RockSmashBreak_Step1(struct ObjectEvent *objectEvent, struc if (SpriteAnimEnded(sprite)) { SetMovementDelay(sprite, 32); - sprite->data[2] = 2; + sprite->sActionFuncId = 2; } return FALSE; } @@ -6615,7 +6612,7 @@ bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *objectEvent, struc if (WaitForMovementDelay(sprite)) { objectEvent->invisible = TRUE; - sprite->data[2] = 3; + sprite->sActionFuncId = 3; } return FALSE; } @@ -6623,7 +6620,7 @@ bool8 MovementAction_RockSmashBreak_Step2(struct ObjectEvent *objectEvent, struc bool8 MovementAction_CutTree_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { SetAndStartSpriteAnim(sprite, 1, 0); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return FALSE; } @@ -6632,7 +6629,7 @@ bool8 MovementAction_CutTree_Step1(struct ObjectEvent *objectEvent, struct Sprit if (SpriteAnimEnded(sprite)) { SetMovementDelay(sprite, 32); - sprite->data[2] = 2; + sprite->sActionFuncId = 2; } return FALSE; } @@ -6643,7 +6640,7 @@ bool8 MovementAction_CutTree_Step2(struct ObjectEvent *objectEvent, struct Sprit if (WaitForMovementDelay(sprite)) { objectEvent->invisible = TRUE; - sprite->data[2] = 3; + sprite->sActionFuncId = 3; } return FALSE; } @@ -6651,14 +6648,14 @@ bool8 MovementAction_CutTree_Step2(struct ObjectEvent *objectEvent, struct Sprit bool8 MovementAction_SetFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->fixedPriority = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_ClearFixedPriority_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { objectEvent->fixedPriority = FALSE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } @@ -6693,7 +6690,7 @@ bool8 MovementAction_ShowReflection_Step0(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_SOUTH); + InitWalkSlow(objectEvent, sprite, DIR_SOUTH); sprite->affineAnimPaused = FALSE; StartSpriteAffineAnimIfDifferent(sprite, 0); return MovementAction_WalkDownStartAffine_Step1(objectEvent, sprite); @@ -6701,10 +6698,10 @@ bool8 MovementAction_WalkDownStartAffine_Step0(struct ObjectEvent *objectEvent, bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { sprite->affineAnimPaused = TRUE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6712,7 +6709,7 @@ bool8 MovementAction_WalkDownStartAffine_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8093B60(objectEvent, sprite, DIR_SOUTH); + InitWalkSlow(objectEvent, sprite, DIR_SOUTH); sprite->affineAnimPaused = FALSE; ChangeSpriteAffineAnimIfDifferent(sprite, 1); return MovementAction_WalkDownAffine_Step1(objectEvent, sprite); @@ -6720,10 +6717,10 @@ bool8 MovementAction_WalkDownAffine_Step0(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (an_walk_any_2(objectEvent, sprite)) + if (UpdateWalkSlow(objectEvent, sprite)) { sprite->affineAnimPaused = TRUE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6731,7 +6728,7 @@ bool8 MovementAction_WalkDownAffine_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkLeftAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_WEST, 1); + InitMovementNormal(objectEvent, sprite, DIR_WEST, 1); sprite->affineAnimPaused = FALSE; ChangeSpriteAffineAnimIfDifferent(sprite, 2); return MovementAction_WalkLeftAffine_Step1(objectEvent, sprite); @@ -6739,10 +6736,10 @@ bool8 MovementAction_WalkLeftAffine_Step0(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkLeftAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { sprite->affineAnimPaused = TRUE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6750,7 +6747,7 @@ bool8 MovementAction_WalkLeftAffine_Step1(struct ObjectEvent *objectEvent, struc bool8 MovementAction_WalkRightAffine_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - do_go_anim(objectEvent, sprite, DIR_EAST, 1); + InitMovementNormal(objectEvent, sprite, DIR_EAST, 1); sprite->affineAnimPaused = FALSE; ChangeSpriteAffineAnimIfDifferent(sprite, 3); return MovementAction_WalkRightAffine_Step1(objectEvent, sprite); @@ -6758,45 +6755,45 @@ bool8 MovementAction_WalkRightAffine_Step0(struct ObjectEvent *objectEvent, stru bool8 MovementAction_WalkRightAffine_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { sprite->affineAnimPaused = TRUE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -static void sub_80958C0(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) +static void AcroWheelieFaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction) { SetObjectEventDirection(objectEvent, direction); ShiftStillObjectEventCoords(objectEvent); - obj_npc_animation_step(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(direction)); + SetStepAnim(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(direction)); sprite->animPaused = TRUE; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; } bool8 MovementAction_AcroWheelieFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80958C0(objectEvent, sprite, DIR_SOUTH); + AcroWheelieFaceDirection(objectEvent, sprite, DIR_SOUTH); return TRUE; } bool8 MovementAction_AcroWheelieFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80958C0(objectEvent, sprite, DIR_NORTH); + AcroWheelieFaceDirection(objectEvent, sprite, DIR_NORTH); return TRUE; } bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80958C0(objectEvent, sprite, DIR_WEST); + AcroWheelieFaceDirection(objectEvent, sprite, DIR_WEST); return TRUE; } bool8 MovementAction_AcroWheelieFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80958C0(objectEvent, sprite, DIR_EAST); + AcroWheelieFaceDirection(objectEvent, sprite, DIR_EAST); return TRUE; } @@ -6893,7 +6890,7 @@ bool8 DoFigure8Anim(struct ObjectEvent *objectEvent, struct Sprite *sprite) bool8 MovementAction_Figure8_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { InitFigure8Anim(objectEvent, sprite); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return MovementAction_Figure8_Step1(objectEvent, sprite); } @@ -6901,31 +6898,31 @@ bool8 MovementAction_Figure8_Step1(struct ObjectEvent *objectEvent, struct Sprit { if (DoFigure8Anim(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -void sub_8095B84(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed, u8 a4) +static void InitAcroWheelieJump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed, u8 type) { - sub_8093FC4(objectEvent, sprite, direction, speed, a4); + InitJump(objectEvent, sprite, direction, speed, type); StartSpriteAnimIfDifferent(sprite, GetAcroWheelieDirectionAnimNum(direction)); DoShadowFieldEffect(objectEvent); } bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_SOUTH, 0, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, 0, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceDown_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6933,16 +6930,16 @@ bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_NORTH, 0, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, 0, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceUp_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6950,16 +6947,16 @@ bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_WEST, 0, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, 0, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceLeft_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6967,16 +6964,16 @@ bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_EAST, 0, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, 0, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopFaceRight_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -6984,16 +6981,16 @@ bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct ObjectEvent *objectEve bool8 MovementAction_AcroWheelieHopDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_SOUTH, 1, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, 1, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopDown_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7001,16 +6998,16 @@ bool8 MovementAction_AcroWheelieHopDown_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_AcroWheelieHopUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_NORTH, 1, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, 1, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopUp_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7018,16 +7015,16 @@ bool8 MovementAction_AcroWheelieHopUp_Step1(struct ObjectEvent *objectEvent, str bool8 MovementAction_AcroWheelieHopLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_WEST, 1, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, 1, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopLeft_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7035,16 +7032,16 @@ bool8 MovementAction_AcroWheelieHopLeft_Step1(struct ObjectEvent *objectEvent, s bool8 MovementAction_AcroWheelieHopRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_EAST, 1, 1); + InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, 1, JUMP_TYPE_LOW); return MovementAction_AcroWheelieHopRight_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7052,16 +7049,16 @@ bool8 MovementAction_AcroWheelieHopRight_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_SOUTH, 2, 0); + InitAcroWheelieJump(objectEvent, sprite, DIR_SOUTH, 2, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpDown_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7069,16 +7066,16 @@ bool8 MovementAction_AcroWheelieJumpDown_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_NORTH, 2, 0); + InitAcroWheelieJump(objectEvent, sprite, DIR_NORTH, 2, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpUp_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7086,16 +7083,16 @@ bool8 MovementAction_AcroWheelieJumpUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_WEST, 2, 0); + InitAcroWheelieJump(objectEvent, sprite, DIR_WEST, 2, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpLeft_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7103,16 +7100,16 @@ bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieJumpRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8095B84(objectEvent, sprite, DIR_EAST, 2, 0); + InitAcroWheelieJump(objectEvent, sprite, DIR_EAST, 2, JUMP_TYPE_HIGH); return MovementAction_AcroWheelieJumpRight_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (sub_80941B0(objectEvent, sprite)) + if (DoJumpAnim(objectEvent, sprite)) { objectEvent->hasShadow = FALSE; - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7120,46 +7117,46 @@ bool8 MovementAction_AcroWheelieJumpRight_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8); + InitMoveInPlace(objectEvent, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8); + InitMoveInPlace(objectEvent, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); + InitMoveInPlace(objectEvent, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8094554(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); + InitMoveInPlace(objectEvent, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); return MovementAction_WalkInPlace_Step1(objectEvent, sprite); } -void sub_80960C8(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) +static void InitAcroPopWheelie(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { - npc_apply_direction(objectEvent, sprite, direction, speed); + InitNpcForMovement(objectEvent, sprite, direction, speed); StartSpriteAnim(sprite, GetAcroWheelieDirectionAnimNum(objectEvent->facingDirection)); SeekSpriteAnim(sprite, 0); } bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, DIR_SOUTH, 1); + InitAcroPopWheelie(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_AcroPopWheelieMoveDown_Step1(objectEvent, sprite); } bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7167,15 +7164,15 @@ bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, DIR_NORTH, 1); + InitAcroPopWheelie(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_AcroPopWheelieMoveUp_Step1(objectEvent, sprite); } bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7183,15 +7180,15 @@ bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, DIR_WEST, 1); + InitAcroPopWheelie(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroPopWheelieMoveLeft_Step1(objectEvent, sprite); } bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7199,37 +7196,37 @@ bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_80960C8(objectEvent, sprite, DIR_EAST, 1); + InitAcroPopWheelie(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroPopWheelieMoveRight_Step1(objectEvent, sprite); } bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -void sub_8096200(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) +static void InitAcroWheelieMove(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { - npc_apply_direction(objectEvent, sprite, direction, speed); - npc_apply_anim_looping(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->facingDirection)); + InitNpcForMovement(objectEvent, sprite, direction, speed); + SetStepAnimHandleAlternation(objectEvent, sprite, GetAcroWheeliePedalDirectionAnimNum(objectEvent->facingDirection)); } bool8 MovementAction_AcroWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, DIR_SOUTH, 1); + InitAcroWheelieMove(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_AcroWheelieMoveDown_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7237,15 +7234,15 @@ bool8 MovementAction_AcroWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, DIR_NORTH, 1); + InitAcroWheelieMove(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_AcroWheelieMoveUp_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7253,15 +7250,15 @@ bool8 MovementAction_AcroWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, st bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, DIR_WEST, 1); + InitAcroWheelieMove(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroWheelieMoveLeft_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7269,38 +7266,38 @@ bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096200(objectEvent, sprite, DIR_EAST, 1); + InitAcroWheelieMove(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroWheelieMoveRight_Step1(objectEvent, sprite); } bool8 MovementAction_AcroWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; } -void sub_8096330(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) +static void InitAcroEndWheelie(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 direction, u8 speed) { - npc_apply_direction(objectEvent, sprite, direction, speed); + InitNpcForMovement(objectEvent, sprite, direction, speed); StartSpriteAnim(sprite, GetAcroEndWheelieDirectionAnimNum(objectEvent->facingDirection)); SeekSpriteAnim(sprite, 0); } bool8 MovementAction_AcroEndWheelieMoveDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, DIR_SOUTH, 1); + InitAcroEndWheelie(objectEvent, sprite, DIR_SOUTH, 1); return MovementAction_AcroEndWheelieMoveDown_Step1(objectEvent, sprite); } bool8 MovementAction_AcroEndWheelieMoveDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7308,15 +7305,15 @@ bool8 MovementAction_AcroEndWheelieMoveDown_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroEndWheelieMoveUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, DIR_NORTH, 1); + InitAcroEndWheelie(objectEvent, sprite, DIR_NORTH, 1); return MovementAction_AcroEndWheelieMoveUp_Step1(objectEvent, sprite); } bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7324,15 +7321,15 @@ bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct ObjectEvent *objectEvent, bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, DIR_WEST, 1); + InitAcroEndWheelie(objectEvent, sprite, DIR_WEST, 1); return MovementAction_AcroEndWheelieMoveLeft_Step1(objectEvent, sprite); } bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7340,15 +7337,15 @@ bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct ObjectEvent *objectEven bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096330(objectEvent, sprite, DIR_EAST, 1); + InitAcroEndWheelie(objectEvent, sprite, DIR_EAST, 1); return MovementAction_AcroEndWheelieMoveRight_Step1(objectEvent, sprite); } bool8 MovementAction_AcroEndWheelieMoveRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - if (npc_obj_ministep_stop_on_arrival(objectEvent, sprite)) + if (UpdateMovementNormal(objectEvent, sprite)) { - sprite->data[2] = 2; + sprite->sActionFuncId = 2; return TRUE; } return FALSE; @@ -7357,24 +7354,24 @@ bool8 MovementAction_AcroEndWheelieMoveRight_Step1(struct ObjectEvent *objectEve bool8 MovementAction_Levitate_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { CreateLevitateMovementTask(objectEvent); - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } bool8 MovementAction_StopLevitate_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - DestroyExtraMovementTask(objectEvent->warpArrowSpriteId); + DestroyLevitateMovementTask(objectEvent->warpArrowSpriteId); sprite->pos2.y = 0; - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } -bool8 MovementAction_DestroyExtraTaskIfAtTop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) +bool8 MovementAction_StopLevitateAtTop_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { if (sprite->pos2.y == 0) { - DestroyExtraMovementTask(objectEvent->warpArrowSpriteId); - sprite->data[2] = 1; + DestroyLevitateMovementTask(objectEvent->warpArrowSpriteId); + sprite->sActionFuncId = 1; return TRUE; } return FALSE; @@ -7411,17 +7408,18 @@ static void TryEnableObjectEventAnim(struct ObjectEvent *objectEvent, struct Spr static void UpdateObjectEventVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sub_8096530(objectEvent, sprite); - UpdateObjEventSpriteVisibility(objectEvent, sprite); + UpdateObjectEventOffscreen(objectEvent, sprite); + UpdateObjectEventSpriteVisibility(objectEvent, sprite); } -static void sub_8096530(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void UpdateObjectEventOffscreen(struct ObjectEvent *objectEvent, struct Sprite *sprite) { u16 x, y; u16 x2, y2; const struct ObjectEventGraphicsInfo *graphicsInfo; objectEvent->offScreen = FALSE; + graphicsInfo = GetObjectEventGraphicsInfo(objectEvent->graphicsId); if (sprite->coordOffsetEnabled) { @@ -7437,23 +7435,19 @@ static void sub_8096530(struct ObjectEvent *objectEvent, struct Sprite *sprite) x2 += x; y2 = y; y2 += graphicsInfo->height; - if ((s16)x >= 0x100 || (s16)x2 < -0x10) - { + + if ((s16)x >= DISPLAY_WIDTH + 16 || (s16)x2 < -16) objectEvent->offScreen = TRUE; - } - if ((s16)y >= 0xB0 || (s16)y2 < -0x10) - { + + if ((s16)y >= DISPLAY_HEIGHT + 16 || (s16)y2 < -16) objectEvent->offScreen = TRUE; - } } -static void UpdateObjEventSpriteVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void UpdateObjectEventSpriteVisibility(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->invisible = FALSE; if (objectEvent->invisible || objectEvent->offScreen) - { sprite->invisible = TRUE; - } } static void GetAllGroundEffectFlags_OnSpawn(struct ObjectEvent *objEvent, u32 *flags) @@ -7503,21 +7497,23 @@ static void ObjectEventUpdateMetatileBehaviors(struct ObjectEvent *objEvent) static void GetGroundEffectFlags_Reflection(struct ObjectEvent *objEvent, u32 *flags) { - u32 reflectionFlags[2] = { GROUND_EFFECT_FLAG_REFLECTION, GROUND_EFFECT_FLAG_ICE_REFLECTION }; - u8 type = ObjectEventCheckForReflectiveSurface(objEvent); + u32 reflectionFlags[NUM_REFLECTION_TYPES - 1] = { + [REFL_TYPE_ICE - 1] = GROUND_EFFECT_FLAG_ICE_REFLECTION, + [REFL_TYPE_WATER - 1] = GROUND_EFFECT_FLAG_WATER_REFLECTION + }; + u8 reflType = ObjectEventGetNearbyReflectionType(objEvent); - if (type) + if (reflType) { - if (!objEvent->hasReflection) + if (objEvent->hasReflection == 0) { - objEvent->hasReflection = 0; - objEvent->hasReflection = 1; - *flags |= reflectionFlags[type - 1]; + objEvent->hasReflection++; + *flags |= reflectionFlags[reflType - 1]; } } else { - objEvent->hasReflection = 0; + objEvent->hasReflection = FALSE; } } @@ -7690,26 +7686,24 @@ static void GetGroundEffectFlags_JumpLanding(struct ObjectEvent *objEvent, u32 * } } -static u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent *objEvent) +#define RETURN_REFLECTION_TYPE_AT(x, y) \ + b = MapGridGetMetatileBehaviorAt(x, y); \ + result = GetReflectionTypeByMetatileBehavior(b); \ + if (result != REFL_TYPE_NONE) \ + return result; + +static u8 ObjectEventGetNearbyReflectionType(struct ObjectEvent *objEvent) { const struct ObjectEventGraphicsInfo *info = GetObjectEventGraphicsInfo(objEvent->graphicsId); // ceil div by tile width? s16 width = (info->width + 8) >> 4; s16 height = (info->height + 8) >> 4; - s16 i; - s16 j; - u8 result; - u8 b; - s16 one; - -#define RETURN_REFLECTION_TYPE_AT(x, y) \ - b = MapGridGetMetatileBehaviorAt(x, y); \ - result = GetReflectionTypeByMetatileBehavior(b); \ - if (result != 0) \ - return result; + s16 i, j; + u8 result, b; // used by RETURN_REFLECTION_TYPE_AT + s16 one = 1; - for (i = 0, one = 1; i < height; i++) + for (i = 0; i < height; i++) { RETURN_REFLECTION_TYPE_AT(objEvent->currentCoords.x, objEvent->currentCoords.y + one + i) RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x, objEvent->previousCoords.y + one + i) @@ -7721,45 +7715,46 @@ static u8 ObjectEventCheckForReflectiveSurface(struct ObjectEvent *objEvent) RETURN_REFLECTION_TYPE_AT(objEvent->previousCoords.x - j, objEvent->previousCoords.y + one + i) } } - return 0; + + return REFL_TYPE_NONE; +} #undef RETURN_REFLECTION_TYPE_AT -} static u8 GetReflectionTypeByMetatileBehavior(u32 behavior) { if (MetatileBehavior_IsIce(behavior)) - return 1; + return REFL_TYPE_ICE; else if (MetatileBehavior_IsReflective(behavior)) - return 2; + return REFL_TYPE_WATER; else - return 0; + return REFL_TYPE_NONE; } -u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 direction) { - static bool8 (*const unknown_08376040[])(u8) = { - MetatileBehavior_IsJumpSouth, - MetatileBehavior_IsJumpNorth, - MetatileBehavior_IsJumpWest, - MetatileBehavior_IsJumpEast, + static bool8 (*const ledgeBehaviorFuncs[])(u8) = { + [DIR_SOUTH - 1] = MetatileBehavior_IsJumpSouth, + [DIR_NORTH - 1] = MetatileBehavior_IsJumpNorth, + [DIR_WEST - 1] = MetatileBehavior_IsJumpWest, + [DIR_EAST - 1] = MetatileBehavior_IsJumpEast, }; - u8 b; - u8 index = z; + u8 behavior; + u8 index = direction; - if (index == 0) - return 0; - else if (index > 4) - index -= 4; + if (index == DIR_NONE) + return DIR_NONE; + else if (index > DIR_EAST) + index -= DIR_EAST; index--; - b = MapGridGetMetatileBehaviorAt(x, y); + behavior = MapGridGetMetatileBehaviorAt(x, y); - if (unknown_08376040[index](b) == 1) + if (ledgeBehaviorFuncs[index](behavior) == TRUE) return index + 1; - return 0; + return DIR_NONE; } static void SetObjectEventSpriteOamTableForLongGrass(struct ObjectEvent *objEvent, struct Sprite *sprite) @@ -7788,7 +7783,7 @@ bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) mapZ = MapGridGetZCoordAt(x, y); - if (mapZ == 0 || mapZ == 0xF) + if (mapZ == 0 || mapZ == 15) return FALSE; if (mapZ != z) @@ -7797,21 +7792,15 @@ bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) return FALSE; } -static const u8 sUnknown_08376050[] = { - 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +static const u8 sElevationToSubpriority[] = { + 115, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 0, 0, 115 }; -// Each byte corresponds to a sprite priority for an object event. -// This is directly the inverse of gObjectEventPriorities_08376070. -static const u8 sObjectEventPriorities_08376060[] = { +static const u8 sElevationToPriority[] = { 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 0, 0, 2 }; -// Each byte corresponds to a sprite priority for an object event. -// This is the inverse of gObjectEventPriorities_08376060. -// 1 = Above player sprite -// 2 = Below player sprite -static const u8 sObjectEventPriorities_08376070[] = { +static const u8 sElevationToSubspriteTableNum[] = { 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, }; @@ -7822,19 +7811,19 @@ void UpdateObjectEventZCoordAndPriority(struct ObjectEvent *objEvent, struct Spr ObjectEventUpdateZCoord(objEvent); - sprite->subspriteTableNum = sObjectEventPriorities_08376070[objEvent->previousElevation]; - sprite->oam.priority = sObjectEventPriorities_08376060[objEvent->previousElevation]; + sprite->subspriteTableNum = sElevationToSubspriteTableNum[objEvent->previousElevation]; + sprite->oam.priority = sElevationToPriority[objEvent->previousElevation]; } static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) { - sprite->subspriteTableNum = sObjectEventPriorities_08376070[z]; - sprite->oam.priority = sObjectEventPriorities_08376060[z]; + sprite->subspriteTableNum = sElevationToSubspriteTableNum[z]; + sprite->oam.priority = sElevationToPriority[z]; } u8 ZCoordToPriority(u8 z) { - return sObjectEventPriorities_08376060[z]; + return sElevationToPriority[z]; } void ObjectEventUpdateZCoord(struct ObjectEvent *objEvent) @@ -7851,14 +7840,14 @@ void ObjectEventUpdateZCoord(struct ObjectEvent *objEvent) objEvent->previousElevation = z; } -void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) +void SetObjectSubpriorityByZCoord(u8 elevation, struct Sprite *sprite, u8 subpriority) { s32 tmp = sprite->centerToCornerVecY; u32 tmpa = *(u16 *)&sprite->pos1.y; u32 tmpb = *(u16 *)&gSpriteCoordOffsetY; s32 tmp2 = (tmpa - tmp) + tmpb; - u16 tmp3 = (0x10 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; - sprite->subpriority = tmp3 + sUnknown_08376050[a] + b; + u16 tmp3 = (16 - ((((u32)tmp2 + 8) & 0xFF) >> 4)) * 2; + sprite->subpriority = tmp3 + sElevationToSubpriority[elevation] + subpriority; } static void ObjectEventUpdateSubpriority(struct ObjectEvent *objEvent, struct Sprite *sprite) @@ -7885,11 +7874,11 @@ void GroundEffect_SpawnOnTallGrass(struct ObjectEvent *objEvent, struct Sprite * gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; + gFieldEffectArguments[3] = 2; // priority gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; gFieldEffectArguments[5] = objEvent->mapGroup; gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; - gFieldEffectArguments[7] = 1; + gFieldEffectArguments[7] = TRUE; // skip to end of anim FieldEffectStart(FLDEFF_TALL_GRASS); } @@ -7898,11 +7887,11 @@ void GroundEffect_StepOnTallGrass(struct ObjectEvent *objEvent, struct Sprite *s gFieldEffectArguments[0] = objEvent->currentCoords.x; gFieldEffectArguments[1] = objEvent->currentCoords.y; gFieldEffectArguments[2] = objEvent->previousElevation; - gFieldEffectArguments[3] = 2; + gFieldEffectArguments[3] = 2; // priority gFieldEffectArguments[4] = objEvent->localId << 8 | objEvent->mapNum; gFieldEffectArguments[5] = objEvent->mapGroup; gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; - gFieldEffectArguments[7] = 0; + gFieldEffectArguments[7] = FALSE; // don't skip to end of anim FieldEffectStart(FLDEFF_TALL_GRASS); } @@ -7934,12 +7923,12 @@ void GroundEffect_StepOnLongGrass(struct ObjectEvent *objEvent, struct Sprite *s void GroundEffect_WaterReflection(struct ObjectEvent *objEvent, struct Sprite *sprite) { - SetUpReflection(objEvent, sprite, 0); + SetUpReflection(objEvent, sprite, FALSE); } void GroundEffect_IceReflection(struct ObjectEvent *objEvent, struct Sprite *sprite) { - SetUpReflection(objEvent, sprite, 1); + SetUpReflection(objEvent, sprite, TRUE); } void GroundEffect_FlowingWater(struct ObjectEvent *objEvent, struct Sprite *sprite) @@ -8106,8 +8095,8 @@ static void (*const sGroundEffectFuncs[])(struct ObjectEvent *objEvent, struct S GroundEffect_StepOnTallGrass, // GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE GroundEffect_SpawnOnLongGrass, // GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN GroundEffect_StepOnLongGrass, // GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE - GroundEffect_WaterReflection, // GROUND_EFFECT_FLAG_ICE_REFLECTION - GroundEffect_IceReflection, // GROUND_EFFECT_FLAG_REFLECTION + GroundEffect_WaterReflection, // GROUND_EFFECT_FLAG_WATER_REFLECTION + GroundEffect_IceReflection, // GROUND_EFFECT_FLAG_ICE_REFLECTION GroundEffect_FlowingWater, // GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER GroundEffect_SandTracks, // GROUND_EFFECT_FLAG_SAND GroundEffect_DeepSandTracks, // GROUND_EFFECT_FLAG_DEEP_SAND @@ -8289,16 +8278,18 @@ static void Step8(struct Sprite *sprite, u8 dir) sprite->pos1.y += 8 * (u16) sDirectionToVectors[dir].y; } -static void oamt_npc_ministep_reset(struct Sprite *sprite, u8 direction, u8 a3) +#define sTimer data[5] + +static void SetSpriteDataForNormalStep(struct Sprite *sprite, u8 direction, u8 speed) { - sprite->data[3] = direction; - sprite->data[4] = a3; - sprite->data[5] = 0; + sprite->sDirection = direction; + sprite->sSpeed = speed; + sprite->sTimer = 0; } typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 direction); -static const SpriteStepFunc gUnknown_0850E6C4[] = { +static const SpriteStepFunc sStep1Funcs[] = { Step1, Step1, Step1, @@ -8317,7 +8308,7 @@ static const SpriteStepFunc gUnknown_0850E6C4[] = { Step1, }; -static const SpriteStepFunc gUnknown_0850E704[] = { +static const SpriteStepFunc sStep2Funcs[] = { Step2, Step2, Step2, @@ -8328,7 +8319,7 @@ static const SpriteStepFunc gUnknown_0850E704[] = { Step2, }; -static const SpriteStepFunc gUnknown_0850E724[] = { +static const SpriteStepFunc sStep3Funcs[] = { Step2, Step3, Step3, @@ -8337,68 +8328,76 @@ static const SpriteStepFunc gUnknown_0850E724[] = { Step3, }; -static const SpriteStepFunc gUnknown_0850E73C[] = { +static const SpriteStepFunc sStep4Funcs[] = { Step4, Step4, Step4, Step4, }; -static const SpriteStepFunc gUnknown_0850E74C[] = { +static const SpriteStepFunc sStep8Funcs[] = { Step8, Step8, }; -static const SpriteStepFunc *const gUnknown_0850E754[] = { - gUnknown_0850E6C4, - gUnknown_0850E704, - gUnknown_0850E724, - gUnknown_0850E73C, - gUnknown_0850E74C, +static const SpriteStepFunc *const sNpcStepFuncTables[] = { + sStep1Funcs, + sStep2Funcs, + sStep3Funcs, + sStep4Funcs, + sStep8Funcs, }; -static const s16 gUnknown_0850E768[] = { +static const s16 sStepTimes[] = { 16, 8, 6, 4, 2 }; -bool8 obj_npc_ministep(struct Sprite *sprite) +static bool8 NpcTakeStep(struct Sprite *sprite) { - if (sprite->data[5] >= gUnknown_0850E768[sprite->data[4]]) + if (sprite->sTimer >= sStepTimes[sprite->sSpeed]) return FALSE; - gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); + sNpcStepFuncTables[sprite->sSpeed][sprite->sTimer](sprite, sprite->sDirection); - sprite->data[5]++; + sprite->sTimer++; - if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]]) + if (sprite->sTimer < sStepTimes[sprite->sSpeed]) return FALSE; return TRUE; } -void sub_80976DC(struct Sprite *sprite, u8 direction) +#undef sTimer + +#define sTimer data[4] +#define sNumSteps data[5] + +static void SetWalkSlowSpriteData(struct Sprite *sprite, u8 direction) { - sprite->data[3] = direction; - sprite->data[4] = 0; - sprite->data[5] = 0; + sprite->sDirection = direction; + sprite->sTimer = 0; + sprite->sNumSteps = 0; } -bool8 sub_80976EC(struct Sprite *sprite) +static bool8 UpdateWalkSlowAnim(struct Sprite *sprite) { - if (!(sprite->data[4] & 1)) + if (!(sprite->sTimer & 1)) { - Step1(sprite, sprite->data[3]); - sprite->data[5]++; + Step1(sprite, sprite->sDirection); + sprite->sNumSteps++; } - sprite->data[4]++; + sprite->sTimer++; - if (sprite->data[5] > 15) + if (sprite->sNumSteps > 15) return TRUE; else return FALSE; } +#undef sTimer +#undef sNumSteps + static const s8 sFigure8XOffsets[FIGURE_8_LENGTH] = { 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, @@ -8476,87 +8475,97 @@ static bool8 AnimateSpriteInFigure8(struct Sprite *sprite) return finished; } -static const s8 gUnknown_0850E802[] = { - -4, -6, -8, -10, -11, -12, -12, -12, -11, -10, -9, -8, -6, -4, 0, 0 +static const s8 sJumpY_High[] = { + -4, -6, -8, -10, -11, -12, -12, -12, + -11, -10, -9, -8, -6, -4, 0, 0 }; -static const s8 gUnknown_0850E812[] = { - 0, -2, -3, -4, -5, -6, -6, -6, -5, -5, -4, -3, -2, 0, 0, 0 +static const s8 sJumpY_Low[] = { + 0, -2, -3, -4, -5, -6, -6, -6, + -5, -5, -4, -3, -2, 0, 0, 0 }; -static const s8 gUnknown_0850E822[] = { - -2, -4, -6, -8, -9, -10, -10, -10, -9, -8, -6, -5, -3, -2, 0, 0 +static const s8 sJumpY_Normal[] = { + -2, -4, -6, -8, -9, -10, -10, -10, + -9, -8, -6, -5, -3, -2, 0, 0 }; -static const s8 *const gUnknown_0850E834[] = { - gUnknown_0850E802, - gUnknown_0850E812, - gUnknown_0850E822 +static const s8 *const sJumpYTable[] = { + [JUMP_TYPE_HIGH] = sJumpY_High, + [JUMP_TYPE_LOW] = sJumpY_Low, + [JUMP_TYPE_NORMAL] = sJumpY_Normal }; -s16 sub_8097820(s16 a1, u8 a2) +static s16 GetJumpY(s16 i, u8 type) { - return gUnknown_0850E834[a2][a1]; + return sJumpYTable[type][i]; } -void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) +#define sJumpType data[5] +#define sTimer data[6] + +static void SetJumpSpriteData(struct Sprite *sprite, u8 direction, u8 speed, u8 type) { - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = a4; - sprite->data[6] = 0; + sprite->sDirection = direction; + sprite->sSpeed = speed; + sprite->sJumpType = type; + sprite->sTimer = 0; } -u8 sub_809785C(struct Sprite *sprite) +static u8 DoJumpSpriteMovement(struct Sprite *sprite) { - s16 v5[] = {16, 16, 32}; - u8 v6[] = {0, 0, 1}; - u8 v2 = 0; + s16 speedToTime[] = {16, 16, 32}; + u8 speedToShift[] = {0, 0, 1}; + u8 result = 0; - if (sprite->data[4]) - Step1(sprite, sprite->data[3]); + if (sprite->sSpeed) + Step1(sprite, sprite->sDirection); - sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + sprite->pos2.y = GetJumpY(sprite->sTimer >> speedToShift[sprite->sSpeed], sprite->sJumpType); - sprite->data[6]++; + sprite->sTimer++; - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; + if (sprite->sTimer == speedToTime[sprite->sSpeed] >> 1) + result = JUMP_HALFWAY; - if (sprite->data[6] >= v5[sprite->data[4]]) + if (sprite->sTimer >= speedToTime[sprite->sSpeed]) { sprite->pos2.y = 0; - v2 = -1; + result = JUMP_FINISHED; } - return v2; + return result; } -u8 sub_80978E4(struct Sprite *sprite) +static u8 DoJumpSpecialSpriteMovement(struct Sprite *sprite) { - s16 v5[] = {32, 32, 64}; - u8 v6[] = {1, 1, 2}; - u8 v2 = 0; + s16 speedToTime[] = {32, 32, 64}; + u8 speedToShift[] = {1, 1, 2}; + u8 result = 0; - if (sprite->data[4] && !(sprite->data[6] & 1)) - Step1(sprite, sprite->data[3]); + if (sprite->sSpeed && !(sprite->sTimer & 1)) + Step1(sprite, sprite->sDirection); - sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + sprite->pos2.y = GetJumpY(sprite->sTimer >> speedToShift[sprite->sSpeed], sprite->sJumpType); - sprite->data[6]++; + sprite->sTimer++; - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; + if (sprite->sTimer == speedToTime[sprite->sSpeed] >> 1) + result = JUMP_HALFWAY; - if (sprite->data[6] >= v5[sprite->data[4]]) + if (sprite->sTimer >= speedToTime[sprite->sSpeed]) { sprite->pos2.y = 0; - v2 = -1; + result = JUMP_FINISHED; } - return v2; + return result; } +#undef sSpeed +#undef sJumpType +#undef sTimer + static void SetMovementDelay(struct Sprite *sprite, s16 timer) { sprite->data[3] = timer; @@ -8564,9 +8573,7 @@ static void SetMovementDelay(struct Sprite *sprite, s16 timer) static bool8 WaitForMovementDelay(struct Sprite *sprite) { - sprite->data[3]--; - - if (sprite->data[3] == 0) + if (--sprite->data[3] == 0) return TRUE; else return FALSE; @@ -8587,7 +8594,7 @@ bool8 SpriteAnimEnded(struct Sprite *sprite) return FALSE; } -void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible) +void UpdateObjectEventSpriteInvisibility(struct Sprite *sprite, bool8 invisible) { u16 x, y; s16 x2, y2; @@ -8608,21 +8615,21 @@ void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible) x2 = x - (sprite->centerToCornerVecX >> 1); y2 = y - (sprite->centerToCornerVecY >> 1); - if ((s16)x > 255 || x2 < -16) + if ((s16)x >= DISPLAY_WIDTH + 16 || x2 < -16) sprite->invisible = TRUE; - if ((s16)y > 175 || y2 < -16) + if ((s16)y >= DISPLAY_HEIGHT + 16 || y2 < -16) sprite->invisible = TRUE; } -#define tInvisible data[2] -#define tAnimNum data[3] -#define tAnimState data[4] +#define sInvisible data[2] +#define sAnimNum data[3] +#define sAnimState data[4] static void UpdateObjectEventSprite(struct Sprite *sprite) { UpdateObjectEventSpritePosition(sprite); SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); - UpdateObjectEventSpriteVisibility(sprite, sprite->tInvisible); + UpdateObjectEventSpriteInvisibility(sprite, sprite->sInvisible); } // Unused @@ -8638,14 +8645,14 @@ static void DestroyObjectEventSprites(void) } } -static int GetObjectEventSpriteId(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end. +static int GetObjectEventSpriteId(u8 objectEventId) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end. { int i; for (i = 0; i < MAX_SPRITES; i++) { struct Sprite *sprite = &gSprites[i]; - if(sprite->inUse && sprite->callback == UpdateObjectEventSprite && (u8)sprite->data[0] == var) + if (sprite->inUse && sprite->callback == UpdateObjectEventSprite && (u8)sprite->sObjEventId == objectEventId) return i; } return MAX_SPRITES; @@ -8697,9 +8704,9 @@ void SetObjectEventSpriteInvisibility(u8 objectEventId, bool32 invisible) return; if (invisible) - gSprites[spriteId].tInvisible = TRUE; + gSprites[spriteId].sInvisible = TRUE; else - gSprites[spriteId].tInvisible = FALSE; + gSprites[spriteId].sInvisible = FALSE; } bool32 IsObjectEventSpriteInvisible(u8 objectEventId) @@ -8709,7 +8716,7 @@ bool32 IsObjectEventSpriteInvisible(u8 objectEventId) if (spriteId == MAX_SPRITES) return FALSE; - return (gSprites[spriteId].tInvisible == TRUE); + return (gSprites[spriteId].sInvisible == TRUE); } void SetObjectEventSpriteAnim(u8 objectEventId, u8 animNum) @@ -8718,50 +8725,50 @@ void SetObjectEventSpriteAnim(u8 objectEventId, u8 animNum) if (spriteId != MAX_SPRITES) { - gSprites[spriteId].tAnimNum = animNum; - gSprites[spriteId].tAnimState = 0; + gSprites[spriteId].sAnimNum = animNum; + gSprites[spriteId].sAnimState = 0; } } static void MoveUnionRoomObjectUp(struct Sprite *sprite) { - switch(sprite->tAnimState) + switch(sprite->sAnimState) { case 0: sprite->pos2.y = 0; - sprite->tAnimState++; + sprite->sAnimState++; case 1: sprite->pos2.y -= 8; - if (sprite->pos2.y == -160) + if (sprite->pos2.y == -DISPLAY_HEIGHT) { sprite->pos2.y = 0; - sprite->tInvisible = TRUE; - sprite->tAnimNum = 0; - sprite->tAnimState = 0; + sprite->sInvisible = TRUE; + sprite->sAnimNum = 0; + sprite->sAnimState = 0; } } } static void MoveUnionRoomObjectDown(struct Sprite *sprite) { - switch(sprite->tAnimState) + switch(sprite->sAnimState) { case 0: - sprite->pos2.y = -160; - sprite->tAnimState++; + sprite->pos2.y = -DISPLAY_HEIGHT; + sprite->sAnimState++; case 1: sprite->pos2.y += 8; if(sprite->pos2.y == 0) { - sprite->tAnimNum = 0; - sprite->tAnimState = 0; + sprite->sAnimNum = 0; + sprite->sAnimState = 0; } } } static void UpdateObjectEventSpritePosition(struct Sprite *sprite) { - switch(sprite->tAnimNum) + switch(sprite->sAnimNum) { case UNION_ROOM_SPAWN_IN: MoveUnionRoomObjectDown(sprite); @@ -8772,19 +8779,19 @@ static void UpdateObjectEventSpritePosition(struct Sprite *sprite) case 0: break; default: - sprite->tAnimNum = 0; + sprite->sAnimNum = 0; break; } } -bool32 IsObjectEventSpriteAnimating(u8 var) +bool32 IsObjectEventSpriteAnimating(u8 objectEventId) { - u8 spriteId = GetObjectEventSpriteId(var); + u8 spriteId = GetObjectEventSpriteId(objectEventId); if (spriteId == MAX_SPRITES) return FALSE; - if (gSprites[spriteId].tAnimNum != 0) + if (gSprites[spriteId].sAnimNum != 0) return TRUE; return FALSE; @@ -8796,11 +8803,11 @@ u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectE return FieldEffectStart(fieldEffectId); } -void DoShadowFieldEffect(struct ObjectEvent *objectEvent) +static void DoShadowFieldEffect(struct ObjectEvent *objectEvent) { if (!objectEvent->hasShadow) { - objectEvent->hasShadow = 1; + objectEvent->hasShadow = TRUE; StartFieldEffectForObjectEvent(FLDEFF_SHADOW, objectEvent); } } @@ -8840,11 +8847,11 @@ u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite * u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { bool32 ableToStore = FALSE; - if (gLockedAnimObjectEvents == NULL) + if (sLockedAnimObjectEvents == NULL) { - gLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents)); - gLockedAnimObjectEvents->objectEventIds[0] = objectEvent->localId; - gLockedAnimObjectEvents->count = 1; + sLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents)); + sLockedAnimObjectEvents->objectEventIds[0] = objectEvent->localId; + sLockedAnimObjectEvents->count = 1; ableToStore = TRUE; } else @@ -8854,10 +8861,10 @@ u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct bool32 found; for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++) { - if (firstFreeSlot == 16 && gLockedAnimObjectEvents->objectEventIds[i] == 0) + if (firstFreeSlot == 16 && sLockedAnimObjectEvents->objectEventIds[i] == 0) firstFreeSlot = i; - if (gLockedAnimObjectEvents->objectEventIds[i] == objectEvent->localId) + if (sLockedAnimObjectEvents->objectEventIds[i] == objectEvent->localId) { found = TRUE; break; @@ -8866,8 +8873,8 @@ u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct if (!found && firstFreeSlot != 16) { - gLockedAnimObjectEvents->objectEventIds[firstFreeSlot] = objectEvent->localId; - gLockedAnimObjectEvents->count++; + sLockedAnimObjectEvents->objectEventIds[firstFreeSlot] = objectEvent->localId; + sLockedAnimObjectEvents->count++; ableToStore = TRUE; } } @@ -8878,7 +8885,7 @@ u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct objectEvent->facingDirectionLocked = TRUE; } - sprite->data[2] = 1; + sprite->sActionFuncId = 1; return TRUE; } @@ -8887,19 +8894,19 @@ u8 MovementAction_FreeAndUnlockAnim_Step0(struct ObjectEvent *objectEvent, struc bool32 ableToStore; u8 index; - sprite->data[2] = 1; - if (gLockedAnimObjectEvents != NULL) + sprite->sActionFuncId = 1; + if (sLockedAnimObjectEvents != NULL) { ableToStore = FALSE; index = FindLockedObjectEventIndex(objectEvent); if (index != 16) { - gLockedAnimObjectEvents->objectEventIds[index] = 0; - gLockedAnimObjectEvents->count--; + sLockedAnimObjectEvents->objectEventIds[index] = 0; + sLockedAnimObjectEvents->count--; ableToStore = TRUE; } - if (gLockedAnimObjectEvents->count == 0) - FREE_AND_SET_NULL(gLockedAnimObjectEvents); + if (sLockedAnimObjectEvents->count == 0) + FREE_AND_SET_NULL(sLockedAnimObjectEvents); if (ableToStore == TRUE) { objectEvent->inanimate = GetObjectEventGraphicsInfo(objectEvent->graphicsId)->inanimate; @@ -8917,13 +8924,13 @@ u8 FindLockedObjectEventIndex(struct ObjectEvent *objectEvent) for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { - if (gLockedAnimObjectEvents->objectEventIds[i] == objectEvent->localId) + if (sLockedAnimObjectEvents->objectEventIds[i] == objectEvent->localId) return i; } return OBJECT_EVENTS_COUNT; } -void CreateLevitateMovementTask(struct ObjectEvent *objectEvent) +static void CreateLevitateMovementTask(struct ObjectEvent *objectEvent) { u8 taskId = CreateTask(ApplyLevitateMovement, 0xFF); struct Task *task = &gTasks[taskId]; @@ -8942,16 +8949,16 @@ static void ApplyLevitateMovement(u8 taskId) LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&objectEvent); // load the map object pointer. sprite = &gSprites[objectEvent->spriteId]; - if(!(task->data[2] & 0x3)) + if(!(task->data[2] & 3)) sprite->pos2.y += task->data[3]; - if(!(task->data[2] & 0xF)) + if(!(task->data[2] & 15)) task->data[3] = -task->data[3]; task->data[2]++; } -void DestroyExtraMovementTask(u8 taskId) +static void DestroyLevitateMovementTask(u8 taskId) { struct ObjectEvent *objectEvent; struct Task *task = &gTasks[taskId]; @@ -8960,13 +8967,14 @@ void DestroyExtraMovementTask(u8 taskId) DestroyTask(taskId); } -void sub_8098074(u8 var1, u8 var2) +// Used to freeze other objects except two trainers approaching for battle +void FreezeObjectEventsExceptTwo(u8 objectEventId1, u8 objectEventId2) { u8 i; for(i = 0; i < OBJECT_EVENTS_COUNT; i++) { - if(i != var1 && i != var2 && + if(i != objectEventId1 && i != objectEventId2 && gObjectEvents[i].active && i != gPlayerAvatar.objectEventId) FreezeObjectEvent(&gObjectEvents[i]); } @@ -8975,7 +8983,7 @@ void sub_8098074(u8 var1, u8 var2) u8 MovementAction_FlyUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { sprite->pos2.y = 0; - sprite->data[2]++; + sprite->sActionFuncId++; return FALSE; } @@ -8983,15 +8991,15 @@ u8 MovementAction_FlyUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sp { sprite->pos2.y -= 8; - if(sprite->pos2.y == -160) - sprite->data[2]++; + if(sprite->pos2.y == -DISPLAY_HEIGHT) + sprite->sActionFuncId++; return FALSE; } u8 MovementAction_FlyDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - sprite->pos2.y = -160; - sprite->data[2]++; + sprite->pos2.y = -DISPLAY_HEIGHT; + sprite->sActionFuncId++; return FALSE; } @@ -9000,7 +9008,7 @@ u8 MovementAction_FlyDown_Step1(struct ObjectEvent *objectEvent, struct Sprite * sprite->pos2.y += 8; if(!sprite->pos2.y) - sprite->data[2]++; + sprite->sActionFuncId++; return FALSE; } diff --git a/src/evolution_graphics.c b/src/evolution_graphics.c index 28bbd4ef7..2a3aaa9e8 100644 --- a/src/evolution_graphics.c +++ b/src/evolution_graphics.c @@ -10,46 +10,52 @@ #include "palette.h" #include "constants/rgb.h" -// this file's functions -static void EvoSparkle_DummySpriteCb(struct Sprite* sprite); -static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID); -static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID); -static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID); -static void EvoTask_BeginPreSparklesSet2(u8 taskID); -static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID); -static void EvoTask_DestroyPreSet2Task(u8 taskID); -static void EvoTask_BeginPostSparklesSet1(u8 taskID); -static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID); -static void EvoTask_DestroyPostSet1Task(u8 taskID); -static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID); -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID); -static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID); -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID); -static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID); -static void sub_817C4EC(u8 taskID); -static void sub_817C510(u8 taskID); -static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskID); -static void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskID); -static void sub_817C560(u8 taskID); - -static const u16 sEvoSparklePalette[] = INCBIN_U16("graphics/misc/evo_sparkle.gbapal"); -static const u32 sEvoSparkleTiles[] = INCBIN_U32("graphics/misc/evo_sparkle.4bpp.lz"); +static void SpriteCB_Sparkle_Dummy(struct Sprite* sprite); + +static void Task_Sparkles_SpiralUpward_Init(u8 taskId); +static void Task_Sparkles_SpiralUpward(u8 taskId); +static void Task_Sparkles_SpiralUpward_End(u8 taskId); + +static void Task_Sparkles_ArcDown_Init(u8 taskId); +static void Task_Sparkles_ArcDown(u8 taskId); +static void Task_Sparkles_ArcDown_End(u8 taskId); + +static void Task_Sparkles_CircleInward_Init(u8 taskId); +static void Task_Sparkles_CircleInward(u8 taskId); +static void Task_Sparkles_CircleInward_End(u8 taskId); + +static void Task_Sparkles_SprayAndFlash_Init(u8 taskId); +static void Task_Sparkles_SprayAndFlash(u8 taskId); +static void Task_Sparkles_SprayAndFlashTrade_Init(u8 taskId); +static void Task_Sparkles_SprayAndFlashTrade(u8 taskId); +static void Task_Sparkles_SprayAndFlash_End(u8 taskId); + +static void Task_CycleEvolutionMonSprite_Init(u8 taskId); +static void Task_CycleEvolutionMonSprite_TryEnd(u8 taskId); +static void Task_CycleEvolutionMonSprite_UpdateSize(u8 taskId); +static void EndOnPreEvoMon(u8 taskId); +static void EndOnPostEvoMon(u8 taskId); + +#define TAG_SPARKLE 1001 + +static const u16 sEvoSparkle_Pal[] = INCBIN_U16("graphics/misc/evo_sparkle.gbapal"); +static const u32 sEvoSparkle_Gfx[] = INCBIN_U32("graphics/misc/evo_sparkle.4bpp.lz"); static const struct CompressedSpriteSheet sEvoSparkleSpriteSheets[] = { - {sEvoSparkleTiles, 0x20, 1001}, + {sEvoSparkle_Gfx, 0x20, TAG_SPARKLE}, {NULL, 0, 0} }; static const struct SpritePalette sEvoSparkleSpritePals[] = { - {sEvoSparklePalette, 1001}, + {sEvoSparkle_Pal, TAG_SPARKLE}, {NULL, 0} }; static const struct OamData sOamData_EvoSparkle = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -77,13 +83,13 @@ static const union AnimCmd *const sSpriteAnimTable_EvoSparkle[] = static const struct SpriteTemplate sEvoSparkleSpriteTemplate = { - .tileTag = 1001, - .paletteTag = 1001, + .tileTag = TAG_SPARKLE, + .paletteTag = TAG_SPARKLE, .oam = &sOamData_EvoSparkle, .anims = sSpriteAnimTable_EvoSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = EvoSparkle_DummySpriteCb + .callback = SpriteCB_Sparkle_Dummy }; static const s16 sEvoSparkleMatrices[] = @@ -93,7 +99,7 @@ static const s16 sEvoSparkleMatrices[] = -1, 0x70, 0x1, 0x70, 0x2, 0x50, 0x3, 0x30, 0x4, 0x10 }; -static void EvoSparkle_DummySpriteCb(struct Sprite *sprite) +static void SpriteCB_Sparkle_Dummy(struct Sprite *sprite) { } @@ -107,7 +113,7 @@ static void SetEvoSparklesMatrices(void) } } -static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite) +static void SpriteCB_Sparkle_SpiralUpward(struct Sprite* sprite) { if (sprite->pos1.y > 8) { @@ -133,7 +139,7 @@ static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite) DestroySprite(sprite); } -static void CreatePreEvoSparkleSet1(u8 arg0) +static void CreateSparkle_SpiralUpward(u8 arg0) { u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0); if (spriteID != MAX_SPRITES) @@ -143,11 +149,11 @@ static void CreatePreEvoSparkleSet1(u8 arg0) gSprites[spriteID].data[7] = 0; gSprites[spriteID].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteID].oam.matrixNum = 31; - gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1; + gSprites[spriteID].callback = SpriteCB_Sparkle_SpiralUpward; } } -static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite) +static void SpriteCB_Sparkle_ArcDown(struct Sprite* sprite) { if (sprite->pos1.y < 88) { @@ -161,7 +167,7 @@ static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite) DestroySprite(sprite); } -static void CreatePreEvoSparkleSet2(u8 arg0) +static void CreateSparkle_ArcDown(u8 arg0) { u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0); if (spriteID != MAX_SPRITES) @@ -172,11 +178,11 @@ static void CreatePreEvoSparkleSet2(u8 arg0) gSprites[spriteID].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteID].oam.matrixNum = 25; gSprites[spriteID].subpriority = 1; - gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet2; + gSprites[spriteID].callback = SpriteCB_Sparkle_ArcDown; } } -static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite) +static void SpriteCB_Sparkle_CircleInward(struct Sprite* sprite) { if (sprite->data[5] > 8) { @@ -189,7 +195,7 @@ static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite) DestroySprite(sprite); } -static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) +static void CreateSparkle_CircleInward(u8 arg0, u8 arg1) { u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); if (spriteID != MAX_SPRITES) @@ -201,11 +207,11 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1) gSprites[spriteID].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].subpriority = 1; - gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet1; + gSprites[spriteID].callback = SpriteCB_Sparkle_CircleInward; } } -static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite) +static void SpriteCB_Sparkle_Spray(struct Sprite* sprite) { if (!(sprite->data[7] & 3)) sprite->pos1.y++; @@ -235,7 +241,7 @@ static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite) DestroySprite(sprite); } -static void CreatePostEvoSparkleSet2(u8 arg0) +static void CreateSparkle_Spray(u8 id) { u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0); if (spriteID != MAX_SPRITES) @@ -246,7 +252,7 @@ static void CreatePostEvoSparkleSet2(u8 arg0) gSprites[spriteID].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteID].oam.matrixNum = 31; gSprites[spriteID].subpriority = 20; - gSprites[spriteID].callback = SpriteCB_PostEvoSparkleSet2; + gSprites[spriteID].callback = SpriteCB_Sparkle_Spray; } } @@ -256,357 +262,386 @@ void LoadEvoSparkleSpriteAndPal(void) LoadSpritePalettes(sEvoSparkleSpritePals); } -#define tFrameCounter data[15] +#define tPalNum data[1] +#define tTimer data[15] -u8 LaunchTask_PreEvoSparklesSet1(u16 arg0) +u8 EvolutionSparkles_SpiralUpward(u16 palNum) { - u8 taskID = CreateTask(EvoTask_BeginPreSet1_FadeAndPlaySE, 0); - gTasks[taskID].data[1] = arg0; - return taskID; + u8 taskId = CreateTask(Task_Sparkles_SpiralUpward_Init, 0); + gTasks[taskId].tPalNum = palNum; + return taskId; } -static void EvoTask_BeginPreSet1_FadeAndPlaySE(u8 taskID) +static void Task_Sparkles_SpiralUpward_Init(u8 taskId) { SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - BeginNormalPaletteFade(3 << gTasks[taskID].data[1], 0xA, 0, 0x10, RGB_WHITE); - gTasks[taskID].func = EvoTask_CreatePreEvoSparkleSet1; - PlaySE(SE_M_MEGA_KICK); + gTasks[taskId].tTimer = 0; + BeginNormalPaletteFade(3 << gTasks[taskId].tPalNum, 0xA, 0, 0x10, RGB_WHITE); + gTasks[taskId].func = Task_Sparkles_SpiralUpward; + PlaySE(SE_M_MEGA_KICK); // 'Charging up' sound for the sparkles as they spiral upwards } -static void EvoTask_CreatePreEvoSparkleSet1(u8 taskID) +static void Task_Sparkles_SpiralUpward(u8 taskId) { - if (gTasks[taskID].tFrameCounter < 64) + if (gTasks[taskId].tTimer < 64) { - if (!(gTasks[taskID].tFrameCounter & 7)) + if (!(gTasks[taskId].tTimer & 7)) { u8 i; for (i = 0; i < 4; i++) - CreatePreEvoSparkleSet1((0x78 & gTasks[taskID].tFrameCounter) * 2 + i * 64); + CreateSparkle_SpiralUpward((0x78 & gTasks[taskId].tTimer) * 2 + i * 64); } - gTasks[taskID].tFrameCounter++; + gTasks[taskId].tTimer++; } else { - gTasks[taskID].tFrameCounter = 96; - gTasks[taskID].func = EvoTask_WaitForPre1SparklesToGoUp; + gTasks[taskId].tTimer = 96; + gTasks[taskId].func = Task_Sparkles_SpiralUpward_End; } } -static void EvoTask_WaitForPre1SparklesToGoUp(u8 taskID) +static void Task_Sparkles_SpiralUpward_End(u8 taskId) { - if (gTasks[taskID].tFrameCounter != 0) - gTasks[taskID].tFrameCounter--; + if (gTasks[taskId].tTimer != 0) + gTasks[taskId].tTimer--; else - DestroyTask(taskID); + DestroyTask(taskId); } -u8 LaunchTask_PreEvoSparklesSet2(void) +u8 EvolutionSparkles_ArcDown(void) { - return CreateTask(EvoTask_BeginPreSparklesSet2, 0); + return CreateTask(Task_Sparkles_ArcDown_Init, 0); } -static void EvoTask_BeginPreSparklesSet2(u8 taskID) +static void Task_Sparkles_ArcDown_Init(u8 taskId) { SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - gTasks[taskID].func = EvoTask_CreatePreEvoSparklesSet2; + gTasks[taskId].tTimer = 0; + gTasks[taskId].func = Task_Sparkles_ArcDown; PlaySE(SE_M_BUBBLE_BEAM2); } -static void EvoTask_CreatePreEvoSparklesSet2(u8 taskID) +static void Task_Sparkles_ArcDown(u8 taskId) { - if (gTasks[taskID].tFrameCounter < 96) + if (gTasks[taskId].tTimer < 96) { - if (gTasks[taskID].tFrameCounter < 6) + if (gTasks[taskId].tTimer < 6) { u8 i; for (i = 0; i < 9; i++) - CreatePreEvoSparkleSet2(i * 16); + CreateSparkle_ArcDown(i * 16); } - gTasks[taskID].tFrameCounter++; + gTasks[taskId].tTimer++; } else - gTasks[taskID].func = EvoTask_DestroyPreSet2Task; + gTasks[taskId].func = Task_Sparkles_ArcDown_End; } -static void EvoTask_DestroyPreSet2Task(u8 taskID) +static void Task_Sparkles_ArcDown_End(u8 taskId) { - DestroyTask(taskID); + DestroyTask(taskId); } -u8 LaunchTask_PostEvoSparklesSet1(void) +u8 EvolutionSparkles_CircleInward(void) { - return CreateTask(EvoTask_BeginPostSparklesSet1, 0); + return CreateTask(Task_Sparkles_CircleInward_Init, 0); } -static void EvoTask_BeginPostSparklesSet1(u8 taskID) +static void Task_Sparkles_CircleInward_Init(u8 taskId) { SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; - gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet1; + gTasks[taskId].tTimer = 0; + gTasks[taskId].func = Task_Sparkles_CircleInward; PlaySE(SE_SHINY); } -static void EvoTask_CreatePostEvoSparklesSet1(u8 taskID) +static void Task_Sparkles_CircleInward(u8 taskId) { - if (gTasks[taskID].tFrameCounter < 48) + if (gTasks[taskId].tTimer < 48) { - if (gTasks[taskID].tFrameCounter == 0) + if (gTasks[taskId].tTimer == 0) { u8 i; for (i = 0; i < 16; i++) - CreatePostEvoSparkleSet1(i * 16, 4); + CreateSparkle_CircleInward(i * 16, 4); } - if (gTasks[taskID].tFrameCounter == 32) + if (gTasks[taskId].tTimer == 32) { u8 i; for (i = 0; i < 16; i++) - CreatePostEvoSparkleSet1(i * 16, 8); + CreateSparkle_CircleInward(i * 16, 8); } - gTasks[taskID].tFrameCounter++; + gTasks[taskId].tTimer++; } else - gTasks[taskID].func = EvoTask_DestroyPostSet1Task; + gTasks[taskId].func = Task_Sparkles_CircleInward_End; } -static void EvoTask_DestroyPostSet1Task(u8 taskID) +static void Task_Sparkles_CircleInward_End(u8 taskId) { - DestroyTask(taskID); + DestroyTask(taskId); } -u8 LaunchTask_PostEvoSparklesSet2AndFlash(u16 species) +#define tSpecies data[2] // Never read + +u8 EvolutionSparkles_SprayAndFlash(u16 species) { - u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash, 0); - gTasks[taskID].data[2] = species; - return taskID; + u8 taskId = CreateTask(Task_Sparkles_SprayAndFlash_Init, 0); + gTasks[taskId].tSpecies = species; + return taskId; } -static void EvoTask_BeginPostSparklesSet2_AndFlash(u8 taskID) +static void Task_Sparkles_SprayAndFlash_Init(u8 taskId) { SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; + gTasks[taskId].tTimer = 0; CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); BeginNormalPaletteFade(0xFFF9041C, 0, 0, 0x10, RGB_WHITE); // was 0xFFF9001C in R/S - gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash; + gTasks[taskId].func = Task_Sparkles_SprayAndFlash; PlaySE(SE_M_PETAL_DANCE); } -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash(u8 taskID) +static void Task_Sparkles_SprayAndFlash(u8 taskId) { - if (gTasks[taskID].tFrameCounter < 128) + if (gTasks[taskId].tTimer < 128) { u8 i; - switch (gTasks[taskID].tFrameCounter) + switch (gTasks[taskId].tTimer) { default: - if (gTasks[taskID].tFrameCounter < 50) - CreatePostEvoSparkleSet2(Random() & 7); + if (gTasks[taskId].tTimer < 50) + CreateSparkle_Spray(Random() & 7); break; case 0: for (i = 0; i < 8; i++) - CreatePostEvoSparkleSet2(i); + CreateSparkle_Spray(i); break; case 32: BeginNormalPaletteFade(0xFFFF041C, 0x10, 0x10, 0, RGB_WHITE); // was 0xFFF9001C in R/S break; } - gTasks[taskID].tFrameCounter++; + gTasks[taskId].tTimer++; } else - gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; + gTasks[taskId].func = Task_Sparkles_SprayAndFlash_End; } -static void EvoTask_DestroyPostSet2AndFlashTask(u8 taskID) +static void Task_Sparkles_SprayAndFlash_End(u8 taskId) { if (!gPaletteFade.active) - DestroyTask(taskID); + DestroyTask(taskId); } -u8 LaunchTask_PostEvoSparklesSet2AndFlash_Trade(u16 species) +// Separate from EvolutionSparkles_SprayAndFlash for difference in fade color +u8 EvolutionSparkles_SprayAndFlash_Trade(u16 species) { - u8 taskID = CreateTask(EvoTask_BeginPostSparklesSet2_AndFlash_Trade, 0); - gTasks[taskID].data[2] = species; - return taskID; + u8 taskId = CreateTask(Task_Sparkles_SprayAndFlashTrade_Init, 0); + gTasks[taskId].tSpecies = species; + return taskId; } -static void EvoTask_BeginPostSparklesSet2_AndFlash_Trade(u8 taskID) +static void Task_Sparkles_SprayAndFlashTrade_Init(u8 taskId) { SetEvoSparklesMatrices(); - gTasks[taskID].tFrameCounter = 0; + gTasks[taskId].tTimer = 0; CpuSet(&gPlttBufferFaded[0x20], &gPlttBufferUnfaded[0x20], 0x30); BeginNormalPaletteFade(0xFFF90400, 0, 0, 0x10, RGB_WHITE); // was 0xFFFF0001 in R/S - gTasks[taskID].func = EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade; + gTasks[taskId].func = Task_Sparkles_SprayAndFlashTrade; PlaySE(SE_M_PETAL_DANCE); } -static void EvoTask_CreatePostEvoSparklesSet2_AndFlash_Trade(u8 taskID) +static void Task_Sparkles_SprayAndFlashTrade(u8 taskId) { - if (gTasks[taskID].tFrameCounter < 128) + if (gTasks[taskId].tTimer < 128) { u8 i; - switch (gTasks[taskID].tFrameCounter) + switch (gTasks[taskId].tTimer) { default: - if (gTasks[taskID].tFrameCounter < 50) - CreatePostEvoSparkleSet2(Random() & 7); + if (gTasks[taskId].tTimer < 50) + CreateSparkle_Spray(Random() & 7); break; case 0: for (i = 0; i < 8; i++) - CreatePostEvoSparkleSet2(i); + CreateSparkle_Spray(i); break; case 32: BeginNormalPaletteFade(0xFFFF0400, 0x10, 0x10, 0, RGB_WHITE); // was 0xFFFF0001 in R/S break; } - gTasks[taskID].tFrameCounter++; + gTasks[taskId].tTimer++; } else - gTasks[taskID].func = EvoTask_DestroyPostSet2AndFlashTask; + gTasks[taskId].func = Task_Sparkles_SprayAndFlash_End; } -#undef tFrameCounter +#undef tTimer +#undef tSpecies -static void PokeEvoSprite_DummySpriteCB(struct Sprite* sprite) +static void SpriteCB_EvolutionMonSprite(struct Sprite* sprite) { } -#define tPreEvoSpriteID data[1] -#define tPostEvoSpriteID data[2] +#define tPreEvoSpriteId data[1] +#define tPostEvoSpriteId data[2] +#define tPreEvoScale data[3] +#define tPostEvoScale data[4] +#define tShowingPostEvo data[5] +#define tScaleSpeed data[6] #define tEvoStopped data[8] -u8 sub_817C3A0(u8 preEvoSpriteID, u8 postEvoSpriteID) +#define MATRIX_PRE_EVO 30 +#define MATRIX_POST_EVO 31 + +#define MON_MAX_SCALE 256 +#define MON_MIN_SCALE 16 + +// Alternately grow/shrink the pre-evolution and post-evolution mon sprites +u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId) { u16 i; u16 stack[16]; - u8 taskID; + u8 taskId; s32 toDiv; - for (i = 0; i < 16; i++) + for (i = 0; i < ARRAY_COUNT(stack); i++) stack[i] = 0x7FFF; - taskID = CreateTask(sub_817C4EC, 0); - gTasks[taskID].tPreEvoSpriteID = preEvoSpriteID; - gTasks[taskID].tPostEvoSpriteID = postEvoSpriteID; - gTasks[taskID].data[3] = 256; - gTasks[taskID].data[4] = 16; + taskId = CreateTask(Task_CycleEvolutionMonSprite_Init, 0); + gTasks[taskId].tPreEvoSpriteId = preEvoSpriteId; + gTasks[taskId].tPostEvoSpriteId = postEvoSpriteId; + gTasks[taskId].tPreEvoScale = MON_MAX_SCALE; + gTasks[taskId].tPostEvoScale = MON_MIN_SCALE; toDiv = 65536; - SetOamMatrix(30, 256, 0, 0, 256); - SetOamMatrix(31, toDiv / gTasks[taskID].data[4], 0, 0, toDiv / gTasks[taskID].data[4]); + SetOamMatrix(MATRIX_PRE_EVO, MON_MAX_SCALE, 0, 0, MON_MAX_SCALE); + SetOamMatrix(MATRIX_POST_EVO, toDiv / gTasks[taskId].tPostEvoScale, 0, 0, toDiv / gTasks[taskId].tPostEvoScale); - gSprites[preEvoSpriteID].callback = PokeEvoSprite_DummySpriteCB; - gSprites[preEvoSpriteID].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[preEvoSpriteID].oam.matrixNum = 30; - gSprites[preEvoSpriteID].invisible = FALSE; - CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteID].oam.paletteNum * 16)], 16); + gSprites[preEvoSpriteId].callback = SpriteCB_EvolutionMonSprite; + gSprites[preEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[preEvoSpriteId].oam.matrixNum = MATRIX_PRE_EVO; + gSprites[preEvoSpriteId].invisible = FALSE; + CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[preEvoSpriteId].oam.paletteNum * 16)], 16); - gSprites[postEvoSpriteID].callback = PokeEvoSprite_DummySpriteCB; - gSprites[postEvoSpriteID].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[postEvoSpriteID].oam.matrixNum = 31; - gSprites[postEvoSpriteID].invisible = FALSE; - CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteID].oam.paletteNum * 16)], 16); + gSprites[postEvoSpriteId].callback = SpriteCB_EvolutionMonSprite; + gSprites[postEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; + gSprites[postEvoSpriteId].oam.matrixNum = MATRIX_POST_EVO; + gSprites[postEvoSpriteId].invisible = FALSE; + CpuSet(stack, &gPlttBufferFaded[0x100 + (gSprites[postEvoSpriteId].oam.paletteNum * 16)], 16); - gTasks[taskID].tEvoStopped = FALSE; - return taskID; + gTasks[taskId].tEvoStopped = FALSE; + return taskId; } -static void sub_817C4EC(u8 taskID) +static void Task_CycleEvolutionMonSprite_Init(u8 taskId) { - gTasks[taskID].data[5] = 0; - gTasks[taskID].data[6] = 8; - gTasks[taskID].func = sub_817C510; + gTasks[taskId].tShowingPostEvo = FALSE; + gTasks[taskId].tScaleSpeed = 8; + gTasks[taskId].func = Task_CycleEvolutionMonSprite_TryEnd; } -static void sub_817C510(u8 taskID) +// Try to end sprite cycling +// If evo hasn't stopped or growth/shrink speed hasn't been maxed out, start another cycle +static void Task_CycleEvolutionMonSprite_TryEnd(u8 taskId) { - if (gTasks[taskID].tEvoStopped) - PreEvoVisible_PostEvoInvisible_KillTask(taskID); - else if (gTasks[taskID].data[6] == 128) - PreEvoInvisible_PostEvoVisible_KillTask(taskID); + if (gTasks[taskId].tEvoStopped) + EndOnPreEvoMon(taskId); + else if (gTasks[taskId].tScaleSpeed == 128) + EndOnPostEvoMon(taskId); else { - gTasks[taskID].data[6] += 2; - gTasks[taskID].data[5] ^= 1; - gTasks[taskID].func = sub_817C560; + gTasks[taskId].tScaleSpeed += 2; + gTasks[taskId].tShowingPostEvo ^= 1; + gTasks[taskId].func = Task_CycleEvolutionMonSprite_UpdateSize; } } -static void sub_817C560(u8 taskID) +static void Task_CycleEvolutionMonSprite_UpdateSize(u8 taskId) { - if (gTasks[taskID].tEvoStopped) - gTasks[taskID].func = PreEvoVisible_PostEvoInvisible_KillTask; + if (gTasks[taskId].tEvoStopped) + gTasks[taskId].func = EndOnPreEvoMon; else { u16 oamMatrixArg; - u8 r6 = 0; - if (gTasks[taskID].data[5] == 0) + u8 numSpritesFinished = 0; + if (!gTasks[taskId].tShowingPostEvo) { - if (gTasks[taskID].data[3] < 256 - gTasks[taskID].data[6]) - gTasks[taskID].data[3] += gTasks[taskID].data[6]; + // Set pre-evo sprite growth + if (gTasks[taskId].tPreEvoScale < MON_MAX_SCALE - gTasks[taskId].tScaleSpeed) + gTasks[taskId].tPreEvoScale += gTasks[taskId].tScaleSpeed; else { - gTasks[taskID].data[3] = 256; - r6++; + gTasks[taskId].tPreEvoScale = MON_MAX_SCALE; + numSpritesFinished++; } - if (gTasks[taskID].data[4] > 16 + gTasks[taskID].data[6]) - gTasks[taskID].data[4] -= gTasks[taskID].data[6]; + + // Set post-evo sprite shrink + if (gTasks[taskId].tPostEvoScale > MON_MIN_SCALE + gTasks[taskId].tScaleSpeed) + gTasks[taskId].tPostEvoScale -= gTasks[taskId].tScaleSpeed; else { - gTasks[taskID].data[4] = 16; - r6++; + gTasks[taskId].tPostEvoScale = MON_MIN_SCALE; + numSpritesFinished++; } } else { - if (gTasks[taskID].data[4] < 256 - gTasks[taskID].data[6]) - gTasks[taskID].data[4] += gTasks[taskID].data[6]; + // Set post-evo sprite growth + if (gTasks[taskId].tPostEvoScale < MON_MAX_SCALE - gTasks[taskId].tScaleSpeed) + gTasks[taskId].tPostEvoScale += gTasks[taskId].tScaleSpeed; else { - gTasks[taskID].data[4] = 256; - r6++; + gTasks[taskId].tPostEvoScale = MON_MAX_SCALE; + numSpritesFinished++; } - if (gTasks[taskID].data[3] > 16 + gTasks[taskID].data[6]) - gTasks[taskID].data[3] -= gTasks[taskID].data[6]; + + // Set pre-evo sprite shrink + if (gTasks[taskId].tPreEvoScale > MON_MIN_SCALE + gTasks[taskId].tScaleSpeed) + gTasks[taskId].tPreEvoScale -= gTasks[taskId].tScaleSpeed; else { - gTasks[taskID].data[3] = 16; - r6++; + gTasks[taskId].tPreEvoScale = MON_MIN_SCALE; + numSpritesFinished++; } } - oamMatrixArg = 65536 / gTasks[taskID].data[3]; - SetOamMatrix(30, oamMatrixArg, 0, 0, oamMatrixArg); - oamMatrixArg = 65536 / gTasks[taskID].data[4]; - SetOamMatrix(31, oamMatrixArg, 0, 0, oamMatrixArg); - if (r6 == 2) - gTasks[taskID].func = sub_817C510; + // Grow/shrink pre-evo sprite + oamMatrixArg = 65536 / gTasks[taskId].tPreEvoScale; + SetOamMatrix(MATRIX_PRE_EVO, oamMatrixArg, 0, 0, oamMatrixArg); + + // Grow/shrink post-evo sprite + oamMatrixArg = 65536 / gTasks[taskId].tPostEvoScale; + SetOamMatrix(MATRIX_POST_EVO, oamMatrixArg, 0, 0, oamMatrixArg); + + // Both sprites have reached their size extreme + if (numSpritesFinished == 2) + gTasks[taskId].func = Task_CycleEvolutionMonSprite_TryEnd; } } -static void PreEvoInvisible_PostEvoVisible_KillTask(u8 taskID) +static void EndOnPostEvoMon(u8 taskId) { - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.affineMode = ST_OAM_AFFINE_OFF; - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPreEvoSpriteID].invisible = TRUE; + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = TRUE; - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.affineMode = ST_OAM_AFFINE_OFF; - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPostEvoSpriteID].invisible = FALSE; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = FALSE; - DestroyTask(taskID); + DestroyTask(taskId); } -static void PreEvoVisible_PostEvoInvisible_KillTask(u8 taskID) +static void EndOnPreEvoMon(u8 taskId) { - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.affineMode = ST_OAM_AFFINE_OFF; - gSprites[gTasks[taskID].tPreEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPreEvoSpriteID].invisible = FALSE; + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPreEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPreEvoSpriteId].invisible = FALSE; - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.affineMode = ST_OAM_AFFINE_OFF; - gSprites[gTasks[taskID].tPostEvoSpriteID].oam.matrixNum = 0; - gSprites[gTasks[taskID].tPostEvoSpriteID].invisible = TRUE; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.affineMode = ST_OAM_AFFINE_OFF; + gSprites[gTasks[taskId].tPostEvoSpriteId].oam.matrixNum = 0; + gSprites[gTasks[taskId].tPostEvoSpriteId].invisible = TRUE; - DestroyTask(taskID); + DestroyTask(taskId); } diff --git a/src/evolution_scene.c b/src/evolution_scene.c index d41bc5970..39e917161 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -32,114 +32,117 @@ #include "constants/battle_string_ids.h" #include "constants/songs.h" #include "constants/rgb.h" +#include "constants/items.h" struct EvoInfo { - u8 preEvoSpriteID; - u8 postEvoSpriteID; - u8 evoTaskID; - u8 field_3; + u8 preEvoSpriteId; + u8 postEvoSpriteId; + u8 evoTaskId; + u8 delayTimer; u16 savedPalette[48]; }; -// EWRAM vars static EWRAM_DATA struct EvoInfo *sEvoStructPtr = NULL; -static EWRAM_DATA u16 *sEvoMovingBgPtr = NULL; +static EWRAM_DATA u16 *sBgAnimPal = NULL; -// IWRAM common void (*gCB2_AfterEvolution)(void); #define sEvoCursorPos gBattleCommunication[1] // when learning a new move -#define sEvoGraphicsTaskID gBattleCommunication[2] +#define sEvoGraphicsTaskId gBattleCommunication[2] -// this file's functions -static void Task_EvolutionScene(u8 taskID); -static void Task_TradeEvolutionScene(u8 taskID); +static void Task_EvolutionScene(u8 taskId); +static void Task_TradeEvolutionScene(u8 taskId); static void CB2_EvolutionSceneUpdate(void); static void CB2_TradeEvolutionSceneUpdate(void); static void EvoDummyFunc(void); static void VBlankCB_EvolutionScene(void); static void VBlankCB_TradeEvolutionScene(void); -static void sub_81150D8(void); -static void sub_8140134(void); -static void EvoScene_DoMonAnimation(u8 monSpriteId, u16 speciesId); +static void EvoScene_DoMonAnimAndCry(u8 monSpriteId, u16 speciesId); static bool32 EvoScene_IsMonAnimFinished(u8 monSpriteId); -static void InitMovingBackgroundTask(bool8 isLink); -static void sub_813FEE8(u8 taskId); -static void sub_8140174(void); - -// const data -static const u16 sUnknown_085B4114[] = INCBIN_U16("graphics/evolution_scene/unknown_5B4114.gbapal"); -static const u32 sUnknown_085B4134[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz"); -static const u32 sUnknown_085B482C[] = INCBIN_U32("graphics/evolution_scene/bg.bin.lz"); -static const u32 sUnknown_085B4D10[] = INCBIN_U32("graphics/evolution_scene/bg2.bin.lz"); -static const u16 sUnknown_085B51E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_intro.gbapal"); -static const u16 sUnknown_085B53E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_lighten.gbapal"); -static const u16 sUnknown_085B5544[] = INCBIN_U16("graphics/evolution_scene/gray_transition_darken.gbapal"); -static const u16 sUnknown_085B56E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_outro.gbapal"); -static const u16 sUnknown_085B5884[] = INCBIN_U16("graphics/evolution_scene/transition.gbapal"); - -static const u8 Text_ShedinjaJapaneseName[] = _("ヌケニン"); - -static const u8 sUnknown_085B58C9[][4] = +static void StartBgAnimation(bool8 isLink); +static void StopBgAnimation(void); +static void Task_AnimateBg(u8 taskId); +static void RestoreBgAfterAnim(void); + +static const u16 sUnusedPal1[] = INCBIN_U16("graphics/evolution_scene/unused_1.gbapal"); +static const u32 sBgAnim_Gfx[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz"); +static const u32 sBgAnim_Inner_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_inner.bin.lz"); +static const u32 sBgAnim_Outer_Tilemap[] = INCBIN_U32("graphics/evolution_scene/bg_outer.bin.lz"); +static const u16 sBgAnim_Intro_Pal[] = INCBIN_U16("graphics/evolution_scene/bg_anim_intro.gbapal"); +static const u16 sUnusedPal2[] = INCBIN_U16("graphics/evolution_scene/unused_2.gbapal"); +static const u16 sUnusedPal3[] = INCBIN_U16("graphics/evolution_scene/unused_3.gbapal"); +static const u16 sUnusedPal4[] = INCBIN_U16("graphics/evolution_scene/unused_4.gbapal"); +static const u16 sBgAnim_Pal[] = INCBIN_U16("graphics/evolution_scene/bg_anim.gbapal"); + +static const u8 sText_ShedinjaJapaneseName[] = _("ヌケニン"); + +// The below table is used by Task_UpdateBgPalette to control the speed at which the bg color updates. +// The first two values are indexes into sBgAnim_PalIndexes (indirectly, via sBgAnimPal), and are +// the start and end of the range of colors in sBgAnim_PalIndexes it will move through incrementally +// before starting over. It will repeat this cycle x number of times, where x = the 3rd value, +// delaying each increment by y, where y = the 4th value. +// Once it has cycled x number of times, it will move to the next array in this table. +static const u8 sBgAnim_PaletteControl[][4] = { - { 0x00, 0x0C, 0x01, 0x06 }, - { 0x0D, 0x24, 0x05, 0x02 }, - { 0x0D, 0x18, 0x01, 0x02 }, - { 0x25, 0x31, 0x01, 0x06 }, + { 0, 12, 1, 6 }, + { 13, 36, 5, 2 }, + { 13, 24, 1, 2 }, + { 37, 49, 1, 6 }, }; -static const u8 sUnknown_085B58D9[][16] = { - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x0B, 0x00, 0x00 }, - { 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00 }, - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x00, 0x00 }, - { 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x00, 0x00 }, - { 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x00, 0x00 }, - { 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x00, 0x00 }, - { 0x00, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x00, 0x00 }, - { 0x00, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x00, 0x00 }, - { 0x00, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x00, 0x00 }, - { 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x00, 0x00 }, - { 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x00, 0x00 }, - { 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x00, 0x00 }, - { 0x00, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x00, 0x00 }, - { 0x00, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00, 0x00 }, - { 0x00, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00 }, - { 0x00, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x00, 0x00 }, - { 0x00, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00 }, - { 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00 }, - { 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00 }, - { 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 }, - { 0x00, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00 }, - { 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00 }, - { 0x00, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 }, - { 0x00, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x00 }, - { 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00 }, - { 0x00, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00 }, - { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x00, 0x00 }, - { 0x00, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00 }, - { 0x00, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, - { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +// Indexes into sBgAnim_Pal, 0 is black, transitioning to a bright light blue (172, 213, 255) at 13 +static const u8 sBgAnim_PalIndexes[][16] = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, + { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0 }, + { 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 11, 0, 0 }, + { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0 }, + { 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 0, 0 }, + { 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 0, 0 }, + { 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 0, 0 }, + { 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 0, 0 }, + { 0, 6, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 0, 0 }, + { 0, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 0, 0 }, + { 0, 8, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 0, 0 }, + { 0, 9, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 0, 0 }, + { 0, 10, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 0, 0 }, + { 0, 11, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 0, 0 }, + { 0, 12, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 0, 0 }, + { 0, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 }, + { 0, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 0, 0 }, + { 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 0, 0 }, + { 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 0, 0 }, + { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 0, 0 }, + { 0, 8, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 0, 0 }, + { 0, 7, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 0, 0 }, + { 0, 6, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 0, 0 }, + { 0, 5, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0 }, + { 0, 4, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0 }, + { 0, 3, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 }, + { 0, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0 }, + { 0, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0 }, + { 0, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0 }, + { 0, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0 }, + { 0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; static void CB2_BeginEvolutionScene(void) @@ -155,53 +158,53 @@ static void CB2_BeginEvolutionScene(void) #define tBits data[3] #define tLearnsFirstMove data[4] #define tLearnMoveState data[6] -#define tData7 data[7] -#define tData8 data[8] +#define tLearnMoveYesState data[7] +#define tLearnMoveNoState data[8] #define tEvoWasStopped data[9] -#define tPartyID data[10] +#define tPartyId data[10] -#define TASK_BIT_CAN_STOP 0x1 -#define TASK_BIT_LEARN_MOVE 0x80 +#define TASK_BIT_CAN_STOP (1 << 0) +#define TASK_BIT_LEARN_MOVE (1 << 7) -static void Task_BeginEvolutionScene(u8 taskID) +static void Task_BeginEvolutionScene(u8 taskId) { struct Pokemon* mon = NULL; - switch (gTasks[taskID].tState) + switch (gTasks[taskId].tState) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskID].tState++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].tState++; break; case 1: if (!gPaletteFade.active) { - u16 speciesToEvolve; + u16 postEvoSpecies; bool8 canStopEvo; - u8 partyID; + u8 partyId; - mon = &gPlayerParty[gTasks[taskID].tPartyID]; - speciesToEvolve = gTasks[taskID].tPostEvoSpecies; - canStopEvo = gTasks[taskID].tCanStop; - partyID = gTasks[taskID].tPartyID; + mon = &gPlayerParty[gTasks[taskId].tPartyId]; + postEvoSpecies = gTasks[taskId].tPostEvoSpecies; + canStopEvo = gTasks[taskId].tCanStop; + partyId = gTasks[taskId].tPartyId; - DestroyTask(taskID); - EvolutionScene(mon, speciesToEvolve, canStopEvo, partyID); + DestroyTask(taskId); + EvolutionScene(mon, postEvoSpecies, canStopEvo, partyId); } break; } } -void BeginEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID) +void BeginEvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId) { - u8 taskID = CreateTask(Task_BeginEvolutionScene, 0); - gTasks[taskID].tState = 0; - gTasks[taskID].tPostEvoSpecies = speciesToEvolve; - gTasks[taskID].tCanStop = canStopEvo; - gTasks[taskID].tPartyID = partyID; + u8 taskId = CreateTask(Task_BeginEvolutionScene, 0); + gTasks[taskId].tState = 0; + gTasks[taskId].tPostEvoSpecies = postEvoSpecies; + gTasks[taskId].tCanStop = canStopEvo; + gTasks[taskId].tPartyId = partyId; SetMainCallback2(CB2_BeginEvolutionScene); } -void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID) +void EvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId) { u8 name[20]; u16 currSpecies; @@ -248,7 +251,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, GetMonData(mon, MON_DATA_NICKNAME, name); StringCopy10(gStringVar1, name); - StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); + StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]); // preEvo sprite currSpecies = GetMonData(mon, MON_DATA_SPECIES); @@ -262,38 +265,38 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, SetMultiuseSpriteTemplateToPokemon(currSpecies, 1); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->preEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + sEvoStructPtr->preEvoSpriteId = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 1; gSprites[ID].invisible = TRUE; // postEvo sprite - DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve], + DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites.ptr[3], - speciesToEvolve); - pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality); + postEvoSpecies); + pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, 0x120, 0x20); - SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 3); + SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 3); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + sEvoStructPtr->postEvoSpriteId = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; gSprites[ID].invisible = TRUE; LoadEvoSparkleSpriteAndPal(); - sEvoStructPtr->evoTaskID = ID = CreateTask(Task_EvolutionScene, 0); + sEvoStructPtr->evoTaskId = ID = CreateTask(Task_EvolutionScene, 0); gTasks[ID].tState = 0; gTasks[ID].tPreEvoSpecies = currSpecies; - gTasks[ID].tPostEvoSpecies = speciesToEvolve; + gTasks[ID].tPostEvoSpecies = postEvoSpecies; gTasks[ID].tCanStop = canStopEvo; gTasks[ID].tLearnsFirstMove = TRUE; gTasks[ID].tEvoWasStopped = FALSE; - gTasks[ID].tPartyID = partyID; + gTasks[ID].tPartyId = partyId; - memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[0x20], 0x60); + memcpy(&sEvoStructPtr->savedPalette, &gPlttBufferUnfaded[0x20], sizeof(sEvoStructPtr->savedPalette)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); @@ -309,11 +312,11 @@ static void CB2_EvolutionSceneLoadGraphics(void) const struct CompressedSpritePalette* pokePal; u16 postEvoSpecies; u32 trainerId, personality; - struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskID].tPartyID]; + struct Pokemon* mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; - postEvoSpecies = gTasks[sEvoStructPtr->evoTaskID].tPostEvoSpecies; - trainerId = GetMonData(Mon, MON_DATA_OT_ID); - personality = GetMonData(Mon, MON_DATA_PERSONALITY); + postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies; + trainerId = GetMonData(mon, MON_DATA_OT_ID); + personality = GetMonData(mon, MON_DATA_PERSONALITY); SetHBlankCallback(NULL); SetVBlankCallback(NULL); @@ -355,7 +358,7 @@ static void CB2_EvolutionSceneLoadGraphics(void) SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 3); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + sEvoStructPtr->postEvoSpriteId = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; @@ -366,7 +369,7 @@ static void CB2_EvolutionSceneLoadGraphics(void) SetVBlankCallback(VBlankCB_EvolutionScene); SetMainCallback2(CB2_EvolutionSceneUpdate); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); ShowBg(0); ShowBg(1); @@ -376,8 +379,8 @@ static void CB2_EvolutionSceneLoadGraphics(void) static void CB2_TradeEvolutionSceneLoadGraphics(void) { - struct Pokemon* Mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskID].tPartyID]; - u16 postEvoSpecies = gTasks[sEvoStructPtr->evoTaskID].tPostEvoSpecies; + struct Pokemon* mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; + u16 postEvoSpecies = gTasks[sEvoStructPtr->evoTaskId].tPostEvoSpecies; switch (gMain.state) { @@ -416,8 +419,8 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) case 4: { const struct CompressedSpritePalette* pokePal; - u32 trainerId = GetMonData(Mon, MON_DATA_OT_ID); - u32 personality = GetMonData(Mon, MON_DATA_PERSONALITY); + u32 trainerId = GetMonData(mon, MON_DATA_OT_ID); + u32 personality = GetMonData(mon, MON_DATA_PERSONALITY); DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites.ptr[3], postEvoSpecies); @@ -432,7 +435,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 1); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + sEvoStructPtr->postEvoSpriteId = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; @@ -446,11 +449,11 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } - BlendPalettes(-1,0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); gMain.state++; break; case 7: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); InitTradeSequenceBgGpuRegs(); ShowBg(0); ShowBg(1); @@ -460,7 +463,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) } } -void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpriteID, u8 partyID) +void TradeEvolutionScene(struct Pokemon* mon, u16 postEvoSpecies, u8 preEvoSpriteId, u8 partyId) { u8 name[20]; u16 currSpecies; @@ -470,7 +473,7 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri GetMonData(mon, MON_DATA_NICKNAME, name); StringCopy10(gStringVar1, name); - StringCopy(gStringVar2, gSpeciesNames[speciesToEvolve]); + StringCopy(gStringVar2, gSpeciesNames[postEvoSpecies]); gAffineAnimsDisabled = TRUE; @@ -480,18 +483,18 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri trainerId = GetMonData(mon, MON_DATA_OT_ID); sEvoStructPtr = AllocZeroed(sizeof(struct EvoInfo)); - sEvoStructPtr->preEvoSpriteID = preEvoSpriteID; + sEvoStructPtr->preEvoSpriteId = preEvoSpriteId; - DecompressPicFromTable_2(&gMonFrontPicTable[speciesToEvolve], + DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], gMonSpritesGfxPtr->sprites.ptr[1], - speciesToEvolve); + postEvoSpecies); - pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality); + pokePal = GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, 0x120, 0x20); - SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 1); + SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 1); gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); + sEvoStructPtr->postEvoSpriteId = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; @@ -499,13 +502,13 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri LoadEvoSparkleSpriteAndPal(); - sEvoStructPtr->evoTaskID = ID = CreateTask(Task_TradeEvolutionScene, 0); + sEvoStructPtr->evoTaskId = ID = CreateTask(Task_TradeEvolutionScene, 0); gTasks[ID].tState = 0; gTasks[ID].tPreEvoSpecies = currSpecies; - gTasks[ID].tPostEvoSpecies = speciesToEvolve; + gTasks[ID].tPostEvoSpecies = postEvoSpecies; gTasks[ID].tLearnsFirstMove = TRUE; gTasks[ID].tEvoWasStopped = FALSE; - gTasks[ID].tPartyID = partyID; + gTasks[ID].tPartyId = partyId; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; @@ -543,7 +546,7 @@ static void CB2_TradeEvolutionSceneUpdate(void) static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) { u32 data = 0; - if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6) + if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE) { s32 i; struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount]; @@ -551,20 +554,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 + 5; i++) - SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&data)); - for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_FATEFUL_ENCOUNTER; i++) - SetMonData(&gPlayerParty[gPlayerPartyCount], i, (&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_UNUSED_RIBBONS; i++) + SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, (&data)); - data = 0xFF; - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, (&data)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); + data = MAIL_NONE; + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); CalculatePlayerPartyCount(); @@ -579,195 +582,243 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon) if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) - SetMonData(shedinja, MON_DATA_NICKNAME, Text_ShedinjaJapaneseName); + SetMonData(shedinja, MON_DATA_NICKNAME, sText_ShedinjaJapaneseName); } } -static void Task_EvolutionScene(u8 taskID) +// States for the main switch in Task_EvolutionScene +enum { + EVOSTATE_FADE_IN, + EVOSTATE_INTRO_MSG, + EVOSTATE_INTRO_MON_ANIM, + EVOSTATE_INTRO_SOUND, + EVOSTATE_START_MUSIC, + EVOSTATE_START_BG_AND_SPARKLE_SPIRAL, + EVOSTATE_SPARKLE_ARC, + EVOSTATE_CYCLE_MON_SPRITE, + EVOSTATE_WAIT_CYCLE_MON_SPRITE, + EVOSTATE_SPARKLE_CIRCLE, + EVOSTATE_SPARKLE_SPRAY, + EVOSTATE_EVO_SOUND, + EVOSTATE_RESTORE_SCREEN, + EVOSTATE_EVO_MON_ANIM, + EVOSTATE_SET_MON_EVOLVED, + EVOSTATE_TRY_LEARN_MOVE, + EVOSTATE_END, + EVOSTATE_CANCEL, + EVOSTATE_CANCEL_MON_ANIM, + EVOSTATE_CANCEL_MSG, + EVOSTATE_LEARNED_MOVE, + EVOSTATE_TRY_LEARN_ANOTHER_MOVE, + EVOSTATE_REPLACE_MOVE, +}; + +// States for the switch in EVOSTATE_REPLACE_MOVE +enum { + MVSTATE_INTRO_MSG_1, + MVSTATE_INTRO_MSG_2, + MVSTATE_INTRO_MSG_3, + MVSTATE_PRINT_YES_NO, + MVSTATE_HANDLE_YES_NO, + MVSTATE_SHOW_MOVE_SELECT, + MVSTATE_HANDLE_MOVE_SELECT, + MVSTATE_FORGET_MSG_1, + MVSTATE_FORGET_MSG_2, + MVSTATE_LEARNED_MOVE, + MVSTATE_ASK_CANCEL, + MVSTATE_CANCEL, + MVSTATE_RETRY_AFTER_HM, +}; + +// Task data from CycleEvolutionMonSprite +#define tEvoStopped data[8] + +static void Task_EvolutionScene(u8 taskId) { u32 var; - struct Pokemon* mon = &gPlayerParty[gTasks[taskID].tPartyID]; + struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId]; // check if B Button was held, so the evolution gets stopped if (gMain.heldKeys == B_BUTTON - && gTasks[taskID].tState == 8 - && gTasks[sEvoGraphicsTaskID].isActive - && gTasks[taskID].tBits & TASK_BIT_CAN_STOP) + && gTasks[taskId].tState == EVOSTATE_WAIT_CYCLE_MON_SPRITE + && gTasks[sEvoGraphicsTaskId].isActive + && gTasks[taskId].tBits & TASK_BIT_CAN_STOP) { - gTasks[taskID].tState = 17; - gTasks[sEvoGraphicsTaskID].EvoGraphicsTaskEvoStop = TRUE; - sub_8140134(); + gTasks[taskId].tState = EVOSTATE_CANCEL; + gTasks[sEvoGraphicsTaskId].tEvoStopped = TRUE; + StopBgAnimation(); return; } - switch (gTasks[taskID].tState) + switch (gTasks[taskId].tState) { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - gSprites[sEvoStructPtr->preEvoSpriteID].invisible = FALSE; - gTasks[taskID].tState++; + case EVOSTATE_FADE_IN: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); + gSprites[sEvoStructPtr->preEvoSpriteId].invisible = FALSE; + gTasks[taskId].tState++; ShowBg(0); ShowBg(1); ShowBg(2); ShowBg(3); break; - case 1: // print 'whoa, poke is evolving!!!' msg + case EVOSTATE_INTRO_MSG: if (!gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); BattlePutTextOnWindow(gStringVar4, 0); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 2: // wait for string, animate mon(and play its cry) + case EVOSTATE_INTRO_MON_ANIM: if (!IsTextPrinterActive(0)) { - EvoScene_DoMonAnimation(sEvoStructPtr->preEvoSpriteID, gTasks[taskID].tPreEvoSpecies); - gTasks[taskID].tState++; + EvoScene_DoMonAnimAndCry(sEvoStructPtr->preEvoSpriteId, gTasks[taskId].tPreEvoSpecies); + gTasks[taskId].tState++; } break; - case 3: - if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteID)) // wait for animation, play tu du SE + case EVOSTATE_INTRO_SOUND: + if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteId)) { PlaySE(MUS_EVOLUTION_INTRO); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 4: // play evolution music and fade screen black + case EVOSTATE_START_MUSIC: if (!IsSEPlaying()) { + // Start music, fade background to black PlayNewMapMusic(MUS_EVOLUTION); - gTasks[taskID].tState++; + gTasks[taskId].tState++; BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK); } break; - case 5: // launch moving bg task, preapre evo sparkles + case EVOSTATE_START_BG_AND_SPARKLE_SPIRAL: if (!gPaletteFade.active) { - InitMovingBackgroundTask(FALSE); - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(17); - gTasks[taskID].tState++; + StartBgAnimation(FALSE); + sEvoGraphicsTaskId = EvolutionSparkles_SpiralUpward(17); + gTasks[taskId].tState++; } break; - case 6: // another set of evo sparkles - if (!gTasks[sEvoGraphicsTaskID].isActive) + case EVOSTATE_SPARKLE_ARC: + if (!gTasks[sEvoGraphicsTaskId].isActive) { - gTasks[taskID].tState++; - sEvoStructPtr->field_3 = 1; - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2(); + gTasks[taskId].tState++; + sEvoStructPtr->delayTimer = 1; + sEvoGraphicsTaskId = EvolutionSparkles_ArcDown(); } break; - case 7: // launch task that flashes pre evo with post evo sprites - if (!gTasks[sEvoGraphicsTaskID].isActive) + case EVOSTATE_CYCLE_MON_SPRITE: // launch task that flashes pre evo with post evo sprites + if (!gTasks[sEvoGraphicsTaskId].isActive) { - sEvoGraphicsTaskID = sub_817C3A0(sEvoStructPtr->preEvoSpriteID, sEvoStructPtr->postEvoSpriteID); - gTasks[taskID].tState++; + sEvoGraphicsTaskId = CycleEvolutionMonSprite(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId); + gTasks[taskId].tState++; } break; - case 8: // wait for the above task to finish - if (--sEvoStructPtr->field_3 == 0) + case EVOSTATE_WAIT_CYCLE_MON_SPRITE: + if (--sEvoStructPtr->delayTimer == 0) { - sEvoStructPtr->field_3 = 3; - if (!gTasks[sEvoGraphicsTaskID].isActive) - gTasks[taskID].tState++; + sEvoStructPtr->delayTimer = 3; + if (!gTasks[sEvoGraphicsTaskId].isActive) + gTasks[taskId].tState++; } break; - case 9: // post evo sparkles - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1(); - gTasks[taskID].tState++; + case EVOSTATE_SPARKLE_CIRCLE: + sEvoGraphicsTaskId = EvolutionSparkles_CircleInward(); + gTasks[taskId].tState++; break; - case 10: - if (!gTasks[sEvoGraphicsTaskID].isActive) + case EVOSTATE_SPARKLE_SPRAY: + if (!gTasks[sEvoGraphicsTaskId].isActive) { - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash(gTasks[taskID].tPostEvoSpecies); - gTasks[taskID].tState++; + sEvoGraphicsTaskId = EvolutionSparkles_SprayAndFlash(gTasks[taskId].tPostEvoSpecies); + gTasks[taskId].tState++; } break; - case 11: // play tu du sound after evolution - if (!gTasks[sEvoGraphicsTaskID].isActive) + case EVOSTATE_EVO_SOUND: + if (!gTasks[sEvoGraphicsTaskId].isActive) { PlaySE(SE_EXP); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 12: // stop music, return screen to pre-fade state + case EVOSTATE_RESTORE_SCREEN: // stop music, return screen to pre-fade state if (IsSEPlaying()) { m4aMPlayAllStop(); - memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, 0x60); - sub_8140174(); + memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); + RestoreBgAfterAnim(); BeginNormalPaletteFade(0x1C, 0, 0x10, 0, RGB_BLACK); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 13: // animate mon + case EVOSTATE_EVO_MON_ANIM: if (!gPaletteFade.active) { - EvoScene_DoMonAnimation(sEvoStructPtr->postEvoSpriteID, gTasks[taskID].tPostEvoSpecies); - gTasks[taskID].tState++; + EvoScene_DoMonAnimAndCry(sEvoStructPtr->postEvoSpriteId, gTasks[taskId].tPostEvoSpecies); + gTasks[taskId].tState++; } break; - case 14: // congratulations string and rename prompt + case EVOSTATE_SET_MON_EVOLVED: if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); BattlePutTextOnWindow(gStringVar4, 0); PlayBGM(MUS_EVOLVED); - gTasks[taskID].tState++; - SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); + gTasks[taskId].tState++; + SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskId].tPostEvoSpecies)); CalculateMonStats(mon); - EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), FLAG_SET_SEEN); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), FLAG_SET_CAUGHT); + EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT); IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); } break; - case 15: // check if it wants to learn a new move + case EVOSTATE_TRY_LEARN_MOVE: if (!IsTextPrinterActive(0)) { - var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); - if (var != 0 && !gTasks[taskID].tEvoWasStopped) + var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); + if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped) { u8 text[20]; - if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE)) + if (!(gTasks[taskId].tBits & TASK_BIT_LEARN_MOVE)) { StopMapMusic(); Overworld_PlaySpecialMapMusic(); } - gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; - gTasks[taskID].tLearnsFirstMove = FALSE; - gTasks[taskID].tLearnMoveState = 0; + gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; + gTasks[taskId].tLearnsFirstMove = FALSE; + gTasks[taskId].tLearnMoveState = MVSTATE_INTRO_MSG_1; GetMonData(mon, MON_DATA_NICKNAME, text); StringCopy10(gBattleTextBuff1, text); if (var == MON_HAS_MAX_MOVES) - gTasks[taskID].tState = 22; + gTasks[taskId].tState = EVOSTATE_REPLACE_MOVE; else if (var == MON_ALREADY_KNOWS_MOVE) break; else - gTasks[taskID].tState = 20; // move has been learned + gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE; } - else // no move to learn + else // no move to learn, or evolution was canceled { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskID].tState++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].tState++; } } break; - case 16: // task has finished, return + case EVOSTATE_END: if (!gPaletteFade.active) { - if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE)) + if (!(gTasks[taskId].tBits & TASK_BIT_LEARN_MOVE)) { StopMapMusic(); Overworld_PlaySpecialMapMusic(); } - if (!gTasks[taskID].tEvoWasStopped) - CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon); + if (!gTasks[taskId].tEvoWasStopped) + CreateShedinja(gTasks[taskId].tPreEvoSpecies, mon); - DestroyTask(taskID); + DestroyTask(taskId); FreeMonSpritesGfx(); Free(sEvoStructPtr); sEvoStructPtr = NULL; @@ -775,91 +826,98 @@ static void Task_EvolutionScene(u8 taskID) SetMainCallback2(gCB2_AfterEvolution); } break; - case 17: // evolution has been canceled, stop music and re-fade palette - if (!gTasks[sEvoGraphicsTaskID].isActive) + case EVOSTATE_CANCEL: + if (!gTasks[sEvoGraphicsTaskId].isActive) { m4aMPlayAllStop(); BeginNormalPaletteFade(0x6001C, 0, 0x10, 0, RGB_WHITE); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 18: // animate pokemon trying to evolve again, evolution has been stopped + case EVOSTATE_CANCEL_MON_ANIM: if (!gPaletteFade.active) { - EvoScene_DoMonAnimation(sEvoStructPtr->preEvoSpriteID, gTasks[taskID].tPreEvoSpecies); - gTasks[taskID].tState++; + EvoScene_DoMonAnimAndCry(sEvoStructPtr->preEvoSpriteId, gTasks[taskId].tPreEvoSpecies); + gTasks[taskId].tState++; } break; - case 19: // after the animation, print the string 'WHOA IT DID NOT EVOLVE!!!' - if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteID)) + case EVOSTATE_CANCEL_MSG: + if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteId)) { - if (gTasks[taskID].tEvoWasStopped) + if (gTasks[taskId].tEvoWasStopped) StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark); else // Fire Red leftover probably StringExpandPlaceholders(gStringVar4, gText_PkmnStoppedEvolving); BattlePutTextOnWindow(gStringVar4, 0); - gTasks[taskID].tEvoWasStopped = TRUE; - gTasks[taskID].tState = 15; + gTasks[taskId].tEvoWasStopped = TRUE; + gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; } break; - case 20: // pokemon learned a new move, print string and play a fanfare + case EVOSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_LEVEL_UP); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter - gTasks[taskID].tState++; + gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter + gTasks[taskId].tState++; } break; - case 21: // wait a bit and check if can learn another move - if (!IsTextPrinterActive(0) && !IsSEPlaying() && --gTasks[taskID].tLearnsFirstMove == 0) - gTasks[taskID].tState = 15; + case EVOSTATE_TRY_LEARN_ANOTHER_MOVE: + if (!IsTextPrinterActive(0) && !IsSEPlaying() && --gTasks[taskId].tLearnsFirstMove == 0) + gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; break; - case 22: // try to learn a new move - switch (gTasks[taskID].tLearnMoveState) + case EVOSTATE_REPLACE_MOVE: + switch (gTasks[taskId].tLearnMoveState) { - case 0: + case MVSTATE_INTRO_MSG_1: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { + // "{mon} is trying to learn {move}" BufferMoveToLearnIntoBattleTextBuff2(); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 1: + case MVSTATE_INTRO_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { + // "But, {mon} can't learn more than four moves" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 2: + case MVSTATE_INTRO_MSG_3: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { + // "Delete a move to make room for {move}?" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tData7 = 5; - gTasks[taskID].tData8 = 10; - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveYesState = MVSTATE_SHOW_MOVE_SELECT; + gTasks[taskId].tLearnMoveNoState = MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveState++; } - case 3: + case MVSTATE_PRINT_YES_NO: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; sEvoCursorPos = 0; BattleCreateYesNoCursorAt(0); } break; - case 4: + case MVSTATE_HANDLE_YES_NO: + // This Yes/No is used for both the initial "delete move?" prompt + // and for the "stop learning move?" prompt + // What Yes/No do next is determined by tLearnMoveYesState / tLearnMoveNoState if (JOY_NEW(DPAD_UP) && sEvoCursorPos != 0) { + // Moved onto YES PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(sEvoCursorPos); sEvoCursorPos = 0; @@ -867,6 +925,7 @@ static void Task_EvolutionScene(u8 taskID) } if (JOY_NEW(DPAD_DOWN) && sEvoCursorPos == 0) { + // Moved onto NO PlaySE(SE_SELECT); BattleDestroyYesNoCursorAt(sEvoCursorPos); sEvoCursorPos = 1; @@ -879,350 +938,403 @@ static void Task_EvolutionScene(u8 taskID) if (sEvoCursorPos != 0) { - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData8; + // NO + gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; } else { - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7; - if (gTasks[taskID].tLearnMoveState == 5) - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + // YES + gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState; + if (gTasks[taskId].tLearnMoveState == MVSTATE_SHOW_MOVE_SELECT) + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); } } if (JOY_NEW(B_BUTTON)) { + // Equivalent to selecting NO HandleBattleWindow(0x18, 8, 0x1D, 0xD, WINDOW_CLEAR); PlaySE(SE_SELECT); - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData8; + gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; } break; - case 5: + case MVSTATE_SHOW_MOVE_SELECT: if (!gPaletteFade.active) { FreeAllWindowBuffers(); - ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId, gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics, gMoveToLearn); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 6: + case MVSTATE_HANDLE_MOVE_SELECT: if (!gPaletteFade.active && gMain.callback2 == CB2_EvolutionSceneUpdate) { var = GetMoveSlotToReplace(); if (var == MAX_MON_MOVES) { - gTasks[taskID].tLearnMoveState = 10; + // Didn't select move slot + gTasks[taskId].tLearnMoveState = MVSTATE_ASK_CANCEL; } else { + // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); if (IsHMMove2(move)) { + // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tLearnMoveState = 12; + gTasks[taskId].tLearnMoveState = MVSTATE_RETRY_AFTER_HM; } else { + // Forget move PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } } } break; - case 7: + case MVSTATE_FORGET_MSG_1: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; break; - case 8: + case MVSTATE_FORGET_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 9: + case MVSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tState = 20; + gTasks[taskId].tState = EVOSTATE_LEARNED_MOVE; } break; - case 10: + case MVSTATE_ASK_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tData7 = 11; - gTasks[taskID].tData8 = 0; - gTasks[taskID].tLearnMoveState = 3; + gTasks[taskId].tLearnMoveYesState = MVSTATE_CANCEL; + gTasks[taskId].tLearnMoveNoState = MVSTATE_INTRO_MSG_1; + gTasks[taskId].tLearnMoveState = MVSTATE_PRINT_YES_NO; break; - case 11: + case MVSTATE_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); BattlePutTextOnWindow(gDisplayedStringBattle, 0); - gTasks[taskID].tState = 15; + gTasks[taskId].tState = EVOSTATE_TRY_LEARN_MOVE; break; - case 12: + case MVSTATE_RETRY_AFTER_HM: if (!IsTextPrinterActive(0) && !IsSEPlaying()) - gTasks[taskID].tLearnMoveState = 5; + gTasks[taskId].tLearnMoveState = MVSTATE_SHOW_MOVE_SELECT; break; } break; } } -static void Task_TradeEvolutionScene(u8 taskID) +// States for the main switch in Task_TradeEvolutionScene +enum { + T_EVOSTATE_INTRO_MSG, + T_EVOSTATE_INTRO_CRY, + T_EVOSTATE_INTRO_SOUND, + T_EVOSTATE_START_MUSIC, + T_EVOSTATE_START_BG_AND_SPARKLE_SPIRAL, + T_EVOSTATE_SPARKLE_ARC, + T_EVOSTATE_CYCLE_MON_SPRITE, + T_EVOSTATE_WAIT_CYCLE_MON_SPRITE, + T_EVOSTATE_SPARKLE_CIRCLE, + T_EVOSTATE_SPARKLE_SPRAY, + T_EVOSTATE_EVO_SOUND, + T_EVOSTATE_EVO_MON_ANIM, + T_EVOSTATE_SET_MON_EVOLVED, + T_EVOSTATE_TRY_LEARN_MOVE, + T_EVOSTATE_END, + T_EVOSTATE_CANCEL, + T_EVOSTATE_CANCEL_MON_ANIM, + T_EVOSTATE_CANCEL_MSG, + T_EVOSTATE_LEARNED_MOVE, + T_EVOSTATE_TRY_LEARN_ANOTHER_MOVE, + T_EVOSTATE_REPLACE_MOVE, +}; + +// States for the switch in T_EVOSTATE_REPLACE_MOVE +enum { + T_MVSTATE_INTRO_MSG_1, + T_MVSTATE_INTRO_MSG_2, + T_MVSTATE_INTRO_MSG_3, + T_MVSTATE_PRINT_YES_NO, + T_MVSTATE_HANDLE_YES_NO, + T_MVSTATE_SHOW_MOVE_SELECT, + T_MVSTATE_HANDLE_MOVE_SELECT, + T_MVSTATE_FORGET_MSG, + T_MVSTATE_LEARNED_MOVE, + T_MVSTATE_ASK_CANCEL, + T_MVSTATE_CANCEL, + T_MVSTATE_RETRY_AFTER_HM, +}; + +// Compare to Task_EvolutionScene, very similar +static void Task_TradeEvolutionScene(u8 taskId) { u32 var = 0; - struct Pokemon* mon = &gPlayerParty[gTasks[taskID].tPartyID]; + struct Pokemon* mon = &gPlayerParty[gTasks[taskId].tPartyId]; - switch (gTasks[taskID].tState) + switch (gTasks[taskId].tState) { - case 0: + case T_EVOSTATE_INTRO_MSG: StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); DrawTextOnTradeWindow(0, gStringVar4, 1); - gTasks[taskID].tState++; + gTasks[taskId].tState++; break; - case 1: + case T_EVOSTATE_INTRO_CRY: if (!IsTextPrinterActive(0)) { - PlayCry1(gTasks[taskID].tPreEvoSpecies, 0); - gTasks[taskID].tState++; + PlayCry1(gTasks[taskId].tPreEvoSpecies, 0); + gTasks[taskId].tState++; } break; - case 2: + case T_EVOSTATE_INTRO_SOUND: if (IsCryFinished()) { m4aSongNumStop(MUS_EVOLUTION); PlaySE(MUS_EVOLUTION_INTRO); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 3: + case T_EVOSTATE_START_MUSIC: if (!IsSEPlaying()) { PlayBGM(MUS_EVOLUTION); - gTasks[taskID].tState++; + gTasks[taskId].tState++; BeginNormalPaletteFade(0x1C, 4, 0, 0x10, RGB_BLACK); } break; - case 4: + case T_EVOSTATE_START_BG_AND_SPARKLE_SPIRAL: if (!gPaletteFade.active) { - InitMovingBackgroundTask(TRUE); - var = gSprites[sEvoStructPtr->preEvoSpriteID].oam.paletteNum + 16; - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet1(var); - gTasks[taskID].tState++; - SetGpuReg(REG_OFFSET_BG3CNT, 0x603); + StartBgAnimation(TRUE); + var = gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16; + sEvoGraphicsTaskId = EvolutionSparkles_SpiralUpward(var); + gTasks[taskId].tState++; + SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(6)); } break; - case 5: - if (!gTasks[sEvoGraphicsTaskID].isActive) + case T_EVOSTATE_SPARKLE_ARC: + if (!gTasks[sEvoGraphicsTaskId].isActive) { - gTasks[taskID].tState++; - sEvoStructPtr->field_3 = 1; - sEvoGraphicsTaskID = LaunchTask_PreEvoSparklesSet2(); + gTasks[taskId].tState++; + sEvoStructPtr->delayTimer = 1; + sEvoGraphicsTaskId = EvolutionSparkles_ArcDown(); } break; - case 6: - if (!gTasks[sEvoGraphicsTaskID].isActive) + case T_EVOSTATE_CYCLE_MON_SPRITE: + if (!gTasks[sEvoGraphicsTaskId].isActive) { - sEvoGraphicsTaskID = sub_817C3A0(sEvoStructPtr->preEvoSpriteID, sEvoStructPtr->postEvoSpriteID); - gTasks[taskID].tState++; + sEvoGraphicsTaskId = CycleEvolutionMonSprite(sEvoStructPtr->preEvoSpriteId, sEvoStructPtr->postEvoSpriteId); + gTasks[taskId].tState++; } break; - case 7: - if (--sEvoStructPtr->field_3 == 0) + case T_EVOSTATE_WAIT_CYCLE_MON_SPRITE: + if (--sEvoStructPtr->delayTimer == 0) { - sEvoStructPtr->field_3 = 3; - if (!gTasks[sEvoGraphicsTaskID].isActive) - gTasks[taskID].tState++; + sEvoStructPtr->delayTimer = 3; + if (!gTasks[sEvoGraphicsTaskId].isActive) + gTasks[taskId].tState++; } break; - case 8: - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet1(); - gTasks[taskID].tState++; + case T_EVOSTATE_SPARKLE_CIRCLE: + sEvoGraphicsTaskId = EvolutionSparkles_CircleInward(); + gTasks[taskId].tState++; break; - case 9: - if (!gTasks[sEvoGraphicsTaskID].isActive) + case T_EVOSTATE_SPARKLE_SPRAY: + if (!gTasks[sEvoGraphicsTaskId].isActive) { - sEvoGraphicsTaskID = LaunchTask_PostEvoSparklesSet2AndFlash_Trade(gTasks[taskID].tPostEvoSpecies); - gTasks[taskID].tState++; + sEvoGraphicsTaskId = EvolutionSparkles_SprayAndFlash_Trade(gTasks[taskId].tPostEvoSpecies); + gTasks[taskId].tState++; } break; - case 10: - if (!gTasks[sEvoGraphicsTaskID].isActive) + case T_EVOSTATE_EVO_SOUND: + if (!gTasks[sEvoGraphicsTaskId].isActive) { PlaySE(SE_EXP); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } break; - case 11: + case T_EVOSTATE_EVO_MON_ANIM: if (IsSEPlaying()) { - Free(sEvoMovingBgPtr); - EvoScene_DoMonAnimation(sEvoStructPtr->postEvoSpriteID, gTasks[taskID].tPostEvoSpecies); - memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, 0x60); - gTasks[taskID].tState++; + // Restore bg, do mon anim/cry + Free(sBgAnimPal); + EvoScene_DoMonAnimAndCry(sEvoStructPtr->postEvoSpriteId, gTasks[taskId].tPostEvoSpecies); + memcpy(&gPlttBufferUnfaded[0x20], sEvoStructPtr->savedPalette, sizeof(sEvoStructPtr->savedPalette)); + gTasks[taskId].tState++; } break; - case 12: + case T_EVOSTATE_SET_MON_EVOLVED: if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); DrawTextOnTradeWindow(0, gStringVar4, 1); PlayFanfare(MUS_EVOLVED); - gTasks[taskID].tState++; - SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskID].tPostEvoSpecies)); + gTasks[taskId].tState++; + SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskId].tPostEvoSpecies)); CalculateMonStats(mon); - EvolutionRenameMon(mon, gTasks[taskID].tPreEvoSpecies, gTasks[taskID].tPostEvoSpecies); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), FLAG_SET_SEEN); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskID].tPostEvoSpecies), FLAG_SET_CAUGHT); + EvolutionRenameMon(mon, gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_SEEN); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(gTasks[taskId].tPostEvoSpecies), FLAG_SET_CAUGHT); IncrementGameStat(GAME_STAT_EVOLVED_POKEMON); } break; - case 13: + case T_EVOSTATE_TRY_LEARN_MOVE: if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE) { - var = MonTryLearningNewMove(mon, gTasks[taskID].tLearnsFirstMove); - if (var != 0 && !gTasks[taskID].tEvoWasStopped) + var = MonTryLearningNewMove(mon, gTasks[taskId].tLearnsFirstMove); + if (var != MOVE_NONE && !gTasks[taskId].tEvoWasStopped) { u8 text[20]; - gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE; - gTasks[taskID].tLearnsFirstMove = FALSE; - gTasks[taskID].tLearnMoveState = 0; + gTasks[taskId].tBits |= TASK_BIT_LEARN_MOVE; + gTasks[taskId].tLearnsFirstMove = FALSE; + gTasks[taskId].tLearnMoveState = 0; GetMonData(mon, MON_DATA_NICKNAME, text); StringCopy10(gBattleTextBuff1, text); if (var == MON_HAS_MAX_MOVES) - gTasks[taskID].tState = 20; + gTasks[taskId].tState = T_EVOSTATE_REPLACE_MOVE; else if (var == MON_ALREADY_KNOWS_MOVE) break; else - gTasks[taskID].tState = 18; + gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE; } else { PlayBGM(MUS_EVOLUTION); DrawTextOnTradeWindow(0, gText_CommunicationStandby5, 1); - gTasks[taskID].tState++; + gTasks[taskId].tState++; } } break; - case 14: + case T_EVOSTATE_END: if (!IsTextPrinterActive(0)) { - DestroyTask(taskID); + DestroyTask(taskId); Free(sEvoStructPtr); sEvoStructPtr = NULL; gTextFlags.useAlternateDownArrow = 0; SetMainCallback2(gCB2_AfterEvolution); } break; - case 15: - if (!gTasks[sEvoGraphicsTaskID].isActive) + case T_EVOSTATE_CANCEL: + if (!gTasks[sEvoGraphicsTaskId].isActive) { m4aMPlayAllStop(); - BeginNormalPaletteFade((1 << (gSprites[sEvoStructPtr->preEvoSpriteID].oam.paletteNum + 16)) | (0x4001C), 0, 0x10, 0, RGB_WHITE); - gTasks[taskID].tState++; + BeginNormalPaletteFade((1 << (gSprites[sEvoStructPtr->preEvoSpriteId].oam.paletteNum + 16)) | (0x4001C), 0, 0x10, 0, RGB_WHITE); + gTasks[taskId].tState++; } break; - case 16: + case T_EVOSTATE_CANCEL_MON_ANIM: if (!gPaletteFade.active) { - EvoScene_DoMonAnimation(sEvoStructPtr->preEvoSpriteID, gTasks[taskID].tPreEvoSpecies); - gTasks[taskID].tState++; + EvoScene_DoMonAnimAndCry(sEvoStructPtr->preEvoSpriteId, gTasks[taskId].tPreEvoSpecies); + gTasks[taskId].tState++; } break; - case 17: - if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteID)) + case T_EVOSTATE_CANCEL_MSG: + if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteId)) { StringExpandPlaceholders(gStringVar4, gText_EllipsisQuestionMark); DrawTextOnTradeWindow(0, gStringVar4, 1); - gTasks[taskID].tEvoWasStopped = 1; - gTasks[taskID].tState = 13; + gTasks[taskId].tEvoWasStopped = TRUE; + gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; } break; - case 18: + case T_EVOSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_LEVEL_UP); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter - gTasks[taskID].tState++; + gTasks[taskId].tLearnsFirstMove = 0x40; // re-used as a counter + gTasks[taskId].tState++; } break; - case 19: - if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE && --gTasks[taskID].tLearnsFirstMove == 0) - gTasks[taskID].tState = 13; + case T_EVOSTATE_TRY_LEARN_ANOTHER_MOVE: + if (!IsTextPrinterActive(0) && IsFanfareTaskInactive() == TRUE && --gTasks[taskId].tLearnsFirstMove == 0) + gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; break; - case 20: - switch (gTasks[taskID].tLearnMoveState) + case T_EVOSTATE_REPLACE_MOVE: + switch (gTasks[taskId].tLearnMoveState) { - case 0: + case T_MVSTATE_INTRO_MSG_1: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { + // "{mon} is trying to learn {move}" BufferMoveToLearnIntoBattleTextBuff2(); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 1: + case T_MVSTATE_INTRO_MSG_2: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { + // "But, {mon} can't learn more than four moves" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 2: + case T_MVSTATE_INTRO_MSG_3: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { + // "Delete a move to make room for {move}?" BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tData7 = 5; - gTasks[taskID].tData8 = 9; - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveYesState = T_MVSTATE_SHOW_MOVE_SELECT; + gTasks[taskId].tLearnMoveNoState = T_MVSTATE_ASK_CANCEL; + gTasks[taskId].tLearnMoveState++; } - case 3: + case T_MVSTATE_PRINT_YES_NO: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { LoadUserWindowBorderGfx(0, 0xA8, 0xE0); CreateYesNoMenu(&gTradeEvolutionSceneYesNoWindowTemplate, 0xA8, 0xE, 0); sEvoCursorPos = 0; - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; sEvoCursorPos = 0; } break; - case 4: + case T_MVSTATE_HANDLE_YES_NO: switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: + case 0: // YES sEvoCursorPos = 0; BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7; - if (gTasks[taskID].tLearnMoveState == 5) - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveYesState; + if (gTasks[taskId].tLearnMoveState == T_MVSTATE_SHOW_MOVE_SELECT) + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); break; - case 1: - case -1: + case 1: // NO + case MENU_B_PRESSED: sEvoCursorPos = 1; BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState = gTasks[taskID].tData8; + gTasks[taskId].tLearnMoveState = gTasks[taskId].tLearnMoveNoState; break; } break; - case 5: + case T_MVSTATE_SHOW_MOVE_SELECT: if (!gPaletteFade.active) { if (gWirelessCommType) @@ -1233,73 +1345,77 @@ static void Task_TradeEvolutionScene(u8 taskID) Free(GetBgTilemapBuffer(0)); FreeAllWindowBuffers(); - ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskId].tPartyId, gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics, gMoveToLearn); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 6: + case T_MVSTATE_HANDLE_MOVE_SELECT: if (!gPaletteFade.active && gMain.callback2 == CB2_TradeEvolutionSceneUpdate) { var = GetMoveSlotToReplace(); if (var == MAX_MON_MOVES) { - gTasks[taskID].tLearnMoveState = 9; + // Didn't select move slot + gTasks[taskId].tLearnMoveState = T_MVSTATE_ASK_CANCEL; } else { + // Selected move to forget u16 move = GetMonData(mon, var + MON_DATA_MOVE1); if (IsHMMove2(move)) { + // Can't forget HMs BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState = 11; + gTasks[taskId].tLearnMoveState = T_MVSTATE_RETRY_AFTER_HM; } else { + // Forget move PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) RemoveMonPPBonus(mon, var); SetMonMoveSlot(mon, gMoveToLearn, var); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } } } break; - case 7: + case T_MVSTATE_FORGET_MSG: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tLearnMoveState++; + gTasks[taskId].tLearnMoveState++; } break; - case 8: + case T_MVSTATE_LEARNED_MOVE: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tState = 18; + gTasks[taskId].tState = T_EVOSTATE_LEARNED_MOVE; } break; - case 9: + case T_MVSTATE_ASK_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tData7 = 10; - gTasks[taskID].tData8 = 0; - gTasks[taskID].tLearnMoveState = 3; + gTasks[taskId].tLearnMoveYesState = T_MVSTATE_CANCEL; + gTasks[taskId].tLearnMoveNoState = T_MVSTATE_INTRO_MSG_1; + gTasks[taskId].tLearnMoveState = T_MVSTATE_PRINT_YES_NO; break; - case 10: + case T_MVSTATE_CANCEL: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); DrawTextOnTradeWindow(0, gDisplayedStringBattle, 1); - gTasks[taskID].tState = 13; + gTasks[taskId].tState = T_EVOSTATE_TRY_LEARN_MOVE; break; - case 11: + case T_MVSTATE_RETRY_AFTER_HM: if (!IsTextPrinterActive(0) && !IsSEPlaying()) - gTasks[taskID].tLearnMoveState = 5; + gTasks[taskId].tLearnMoveState = T_MVSTATE_SHOW_MOVE_SELECT; break; } break; @@ -1313,10 +1429,10 @@ static void Task_TradeEvolutionScene(u8 taskID) #undef tBits #undef tLearnsFirstMove #undef tLearnMoveState -#undef tData7 -#undef tData8 +#undef tLearnMoveYesState +#undef tLearnMoveNoState #undef tEvoWasStopped -#undef tPartyID +#undef tPartyId static void EvoDummyFunc(void) { @@ -1356,57 +1472,87 @@ static void VBlankCB_TradeEvolutionScene(void) ScanlineEffect_InitHBlankDmaTransfer(); } -static void sub_813FDEC(u8 taskId) +#define tCycleTimer data[0] +#define tPalStage data[1] +#define tControlStage data[2] +#define tNumCycles data[3] +#define tStartTimer data[5] +#define tPaused data[6] + +// See comments above sBgAnim_PaletteControl +#define START_PAL sBgAnim_PaletteControl[tControlStage][0] +#define END_PAL sBgAnim_PaletteControl[tControlStage][1] +#define CYCLES sBgAnim_PaletteControl[tControlStage][2] +#define DELAY sBgAnim_PaletteControl[tControlStage][3] + +// Cycles the background through a set range of palettes in a series +// of stages, each stage having a different palette range and timing +static void Task_UpdateBgPalette(u8 taskId) { s16 *data = gTasks[taskId].data; - if (data[6] != 0) + if (tPaused) return; - if (data[5]++ < 20) + if (tStartTimer++ < 20) return; - if (data[0]++ > sUnknown_085B58C9[data[2]][3]) + if (tCycleTimer++ > DELAY) { - if (sUnknown_085B58C9[data[2]][1] == data[1]) + if (END_PAL == tPalStage) { - data[3]++; - if (data[3] == sUnknown_085B58C9[data[2]][2]) + // Reached final palette in current stage, completed a 'cycle' + // If this is the final cycle for this stage, move to the next stage + tNumCycles++; + if (tNumCycles == CYCLES) { - data[3] = 0; - data[2]++; + tNumCycles = 0; + tControlStage++; } - data[1] = sUnknown_085B58C9[data[2]][0]; + tPalStage = START_PAL; } else { - LoadPalette(&sEvoMovingBgPtr[data[1] * 16], 0xA0, 0x20); - data[0] = 0; - data[1]++; + // Haven't reached final palette in current stage, load the current palette + LoadPalette(&sBgAnimPal[tPalStage * 16], 0xA0, 0x20); + tCycleTimer = 0; + tPalStage++; } } - if (data[2] == 4) + if (tControlStage == (int)ARRAY_COUNT(sBgAnim_PaletteControl[0])) DestroyTask(taskId); } -static void sub_813FEA4(bool8 isLink) +#undef tCycleTimer +#undef tPalStage +#undef tControlStage +#undef tNumCycles +#undef tStartTimer +#undef START_PAL +#undef END_PAL +#undef CYCLES +#undef DELAY + +#define tIsLink data[2] + +static void CreateBgAnimTask(bool8 isLink) { - u8 taskId = CreateTask(sub_813FEE8, 7); + u8 taskId = CreateTask(Task_AnimateBg, 7); if (!isLink) - gTasks[taskId].data[2] = 0; + gTasks[taskId].tIsLink = FALSE; else - gTasks[taskId].data[2] = 1; + gTasks[taskId].tIsLink = TRUE; } -static void sub_813FEE8(u8 taskId) +static void Task_AnimateBg(u8 taskId) { u16 *outer_X, *outer_Y; u16 *inner_X = &gBattle_BG1_X; u16 *inner_Y = &gBattle_BG1_Y; - if (!gTasks[taskId].data[2]) + if (!gTasks[taskId].tIsLink) { outer_X = &gBattle_BG2_X; outer_Y = &gBattle_BG2_Y; @@ -1426,7 +1572,7 @@ static void sub_813FEE8(u8 taskId) *outer_X = Cos(gTasks[taskId].data[1], 4) + 8; *outer_Y = Sin(gTasks[taskId].data[1], 4) + 16; - if (!FuncIsActiveTask(sub_813FDEC)) + if (!FuncIsActiveTask(Task_UpdateBgPalette)) { DestroyTask(taskId); @@ -1438,37 +1584,39 @@ static void sub_813FEE8(u8 taskId) } } -static void InitMovingBgValues(u16 *movingBgs) +#undef tIsLink + +static void InitMovingBgPalette(u16 *palette) { s32 i, j; - for (i = 0; i < 50; i++) + for (i = 0; i < (int)ARRAY_COUNT(sBgAnim_PalIndexes); i++) { for (j = 0; j < 16; j++) { - movingBgs[i * 16 + j] = sUnknown_085B5884[sUnknown_085B58D9[i][j]]; + palette[i * 16 + j] = sBgAnim_Pal[sBgAnim_PalIndexes[i][j]]; } } } -static void InitMovingBackgroundTask(bool8 isLink) +static void StartBgAnimation(bool8 isLink) { u8 innerBgId, outerBgId; - sEvoMovingBgPtr = AllocZeroed(0x640); - InitMovingBgValues(sEvoMovingBgPtr); + sBgAnimPal = AllocZeroed(0x640); + InitMovingBgPalette(sBgAnimPal); if (!isLink) innerBgId = 1, outerBgId = 2; else innerBgId = 1, outerBgId = 3; - LoadPalette(sUnknown_085B51E4, 0xA0, 0x20); + LoadPalette(sBgAnim_Intro_Pal, 0xA0, 0x20); - DecompressAndLoadBgGfxUsingHeap(1, sUnknown_085B4134, FALSE, 0, 0); - CopyToBgTilemapBuffer(1, sUnknown_085B482C, 0, 0); - CopyToBgTilemapBuffer(outerBgId, sUnknown_085B4D10, 0, 0); - CopyBgTilemapBufferToVram(1); + DecompressAndLoadBgGfxUsingHeap(1, sBgAnim_Gfx, FALSE, 0, 0); + CopyToBgTilemapBuffer(innerBgId, sBgAnim_Inner_Tilemap, 0, 0); + CopyToBgTilemapBuffer(outerBgId, sBgAnim_Outer_Tilemap, 0, 0); + CopyBgTilemapBufferToVram(innerBgId); CopyBgTilemapBufferToVram(outerBgId); if (!isLink) @@ -1490,46 +1638,49 @@ static void InitMovingBackgroundTask(bool8 isLink) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); } - CreateTask(sub_813FDEC, 5); - sub_813FEA4(isLink); + CreateTask(Task_UpdateBgPalette, 5); + CreateBgAnimTask(isLink); } -static void sub_8140100(void) // unused +// Unused +static void PauseBgPaletteAnim(void) { - u8 taskId = FindTaskIdByFunc(sub_813FDEC); + u8 taskId = FindTaskIdByFunc(Task_UpdateBgPalette); - if (taskId != 0xFF) - gTasks[taskId].data[6] = 1; + if (taskId != TASK_NONE) + gTasks[taskId].tPaused = TRUE; FillPalette(0, 0xA0, 0x20); } -static void sub_8140134(void) +#undef tPaused + +static void StopBgAnimation(void) { u8 taskId; - if ((taskId = FindTaskIdByFunc(sub_813FDEC)) != 0xFF) + if ((taskId = FindTaskIdByFunc(Task_UpdateBgPalette)) != TASK_NONE) DestroyTask(taskId); - if ((taskId = FindTaskIdByFunc(sub_813FEE8)) != 0xFF) + if ((taskId = FindTaskIdByFunc(Task_AnimateBg)) != TASK_NONE) DestroyTask(taskId); FillPalette(0, 0xA0, 0x20); - sub_8140174(); + RestoreBgAfterAnim(); } -static void sub_8140174(void) +static void RestoreBgAfterAnim(void) { SetGpuReg(REG_OFFSET_BLDCNT, 0); gBattle_BG1_X = 0; gBattle_BG1_Y = 0; gBattle_BG2_X = 0; - SetBgAttribute(1, BG_ATTR_PRIORITY, sub_80391E0(1, 5)); - SetBgAttribute(2, BG_ATTR_PRIORITY, sub_80391E0(2, 5)); + SetBgAttribute(1, BG_ATTR_PRIORITY, GetBattleBgTemplateData(1, 5)); + SetBgAttribute(2, BG_ATTR_PRIORITY, GetBattleBgTemplateData(2, 5)); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG3_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP); - Free(sEvoMovingBgPtr); + Free(sBgAnimPal); } -static void EvoScene_DoMonAnimation(u8 monSpriteId, u16 speciesId) +static void EvoScene_DoMonAnimAndCry(u8 monSpriteId, u16 speciesId) { DoMonFrontSpriteAnimation(&gSprites[monSpriteId], speciesId, FALSE, 0); } diff --git a/src/faraway_island.c b/src/faraway_island.c index e3d8444c9..bc0814652 100755 --- a/src/faraway_island.c +++ b/src/faraway_island.c @@ -372,7 +372,6 @@ void SetMewAboveGrass(void) { s16 x; s16 y; - u8 spriteId; struct ObjectEvent *mew = &gObjectEvents[GetMewObjectEventId()]; mew->invisible = FALSE; diff --git a/src/field_camera.c b/src/field_camera.c index 57be52221..a36b6883c 100644 --- a/src/field_camera.c +++ b/src/field_camera.c @@ -39,7 +39,7 @@ static void CameraPanningCB_PanAhead(void); static struct FieldCameraOffset sFieldCameraOffset; static s16 sHorizontalCameraPan; static s16 sVerticalCameraPan; -static bool8 gUnknown_03000E2C; +static bool8 sBikeCameraPanFlag; static void (*sFieldCameraPanningCallback)(void); struct CameraObject gFieldCamera; @@ -89,7 +89,7 @@ void FieldUpdateBgTilemapScroll(void) SetGpuReg(REG_OFFSET_BG3VOFS, r4); } -void sub_8089C08(s16 *x, s16 *y) +void GetCameraOffsetWithPan(s16 *x, s16 *y) { *x = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan; *y = sFieldCameraOffset.yPixelOffset + sVerticalCameraPan + 8; @@ -417,7 +417,7 @@ void CameraUpdate(void) CameraMove(deltaX, deltaY); UpdateObjectEventsForCameraUpdate(deltaX, deltaY); RotatingGatePuzzleCameraUpdate(deltaX, deltaY); - ResetBerryTreeSparkleFlags(); + SetBerryTreesSeen(); AddCameraTileOffset(&sFieldCameraOffset, deltaX * 2, deltaY * 2); RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2); } @@ -450,7 +450,7 @@ void SetCameraPanning(s16 a, s16 b) void InstallCameraPanAheadCallback(void) { sFieldCameraPanningCallback = CameraPanningCB_PanAhead; - gUnknown_03000E2C = FALSE; + sBikeCameraPanFlag = FALSE; sHorizontalCameraPan = 0; sVerticalCameraPan = 32; } @@ -474,16 +474,16 @@ static void CameraPanningCB_PanAhead(void) } else { - // this code is never reached. + // this code is never reached if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) { - gUnknown_03000E2C ^= 1; - if (gUnknown_03000E2C == FALSE) + sBikeCameraPanFlag ^= 1; + if (sBikeCameraPanFlag == FALSE) return; } else { - gUnknown_03000E2C = FALSE; + sBikeCameraPanFlag = FALSE; } var = GetPlayerMovementDirection(); diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index fab14c577..6ec280fd0 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -67,7 +67,7 @@ static bool8 TryStartCoordEventScript(struct MapPosition *); static bool8 TryStartWarpEventScript(struct MapPosition *, u16); static bool8 TryStartMiscWalkingScripts(u16); static bool8 TryStartStepCountScript(u16); -static void UpdateHappinessStepCounter(void); +static void UpdateFriendshipStepCounter(void); static bool8 UpdatePoisonStepCounter(void); void FieldClearPlayerInput(struct FieldInput *input) @@ -542,7 +542,7 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior) } IncrementRematchStepCounter(); - UpdateHappinessStepCounter(); + UpdateFriendshipStepCounter(); UpdateFarawayIslandStepCounter(); if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_FORCED_MOVE) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior)) @@ -607,14 +607,15 @@ static bool8 TryStartStepCountScript(u16 metatileBehavior) return FALSE; } -void Unref_ClearHappinessStepCounter(void) +// Unused +static void ClearFriendshipStepCounter(void) { - VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); + VarSet(VAR_FRIENDSHIP_STEP_COUNTER, 0); } -static void UpdateHappinessStepCounter(void) +static void UpdateFriendshipStepCounter(void) { - u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); + u16 *ptr = GetVarPointer(VAR_FRIENDSHIP_STEP_COUNTER); int i; (*ptr)++; @@ -730,7 +731,8 @@ static bool8 TryStartWarpEventScript(struct MapPosition *position, u16 metatileB } if (MetatileBehavior_IsWarpOrBridge(metatileBehavior) == TRUE) { - sub_80B0268(); + // Maybe unused? This MB is used by log bridges, but there's never a warp event on them + DoSpinExitWarp(); return TRUE; } if (MetatileBehavior_IsMtPyreHole(metatileBehavior) == TRUE) diff --git a/src/field_door.c b/src/field_door.c index 4dcb07cca..8aeb1d491 100644 --- a/src/field_door.c +++ b/src/field_door.c @@ -357,40 +357,42 @@ static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame } } -enum +#define tFramesHi data[0] +#define tFramesLo data[1] +#define tGfxHi data[2] +#define tGfxLo data[3] +#define tFrameId data[4] +#define tCounter data[5] +#define tX data[6] +#define tY data[7] + +// Draws a single frame of the door animation, or skips drawing to wait between frames. +// Returns FALSE when the final frame has been reached +static bool32 AnimateDoorFrame(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *data) { - TD_FRAMELIST = 0, - TD_GFX = 2, - TD_FRAME = 4, - TD_COUNTER, - TD_X, - TD_Y -}; + if (tCounter == 0) + DrawDoor(gfx, &frames[tFrameId], tX, tY); -static bool32 sub_808A5F0(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData) -{ - if (taskData[TD_COUNTER] == 0) - DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]); - if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time) + if (tCounter == frames[tFrameId].time) { - taskData[TD_COUNTER] = 0; - taskData[TD_FRAME]++; - if (frames[taskData[TD_FRAME]].time == 0) + tCounter = 0; + tFrameId++; + if (frames[tFrameId].time == 0) return FALSE; else return TRUE; } - taskData[TD_COUNTER]++; + tCounter++; return TRUE; } static void Task_AnimateDoor(u8 taskId) { - u16 *taskData = gTasks[taskId].data; - struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]); - struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]); + u16 *data = gTasks[taskId].data; + struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(tFramesHi << 16 | tFramesLo); + struct DoorGraphics *gfx = (struct DoorGraphics *)(tGfxHi << 16 | tGfxLo); - if (sub_808A5F0(gfx, frames, taskData) == FALSE) + if (AnimateDoorFrame(gfx, frames, data) == FALSE) DestroyTask(taskId); } @@ -419,16 +421,16 @@ static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct Do else { u8 taskId = CreateTask(Task_AnimateDoor, 0x50); - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - taskData[TD_X] = x; - taskData[TD_Y] = y; + tX = x; + tY = y; - taskData[TD_FRAMELIST + 1] = (u32)frames; - taskData[TD_FRAMELIST] = (u32)frames >> 16; + tFramesLo = (u32)frames; + tFramesHi = (u32)frames >> 16; - taskData[TD_GFX + 1] = (u32)gfx; - taskData[TD_GFX] = (u32)gfx >> 16; + tGfxLo = (u32)gfx; + tGfxHi = (u32)gfx >> 16; return taskId; } diff --git a/src/field_effect.c b/src/field_effect.c index 5a18557eb..8152f19bb 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -480,13 +480,13 @@ static const struct Subsprite sSubsprites_HofMonitorBig[] = static const struct SubspriteTable sSubspriteTable_HofMonitorBig = subsprite_table(sSubsprites_HofMonitorBig); -const union AnimCmd gSpriteAnim_855C2CC[] = +const union AnimCmd sAnim_Static[] = { ANIMCMD_FRAME(.imageValue = 0, .duration = 1), ANIMCMD_JUMP(0) }; -const union AnimCmd gSpriteAnim_855C2D4[] = +const union AnimCmd sAnim_Flicker[] = { ANIMCMD_FRAME(.imageValue = 0, .duration = 16), ANIMCMD_FRAME(.imageValue = 1, .duration = 16), @@ -499,15 +499,16 @@ const union AnimCmd gSpriteAnim_855C2D4[] = ANIMCMD_END }; -const union AnimCmd *const gSpriteAnimTable_855C2F8[] = +// Flicker on and off, for the Pokéballs / monitors during the PokéCenter heal effect +const union AnimCmd *const sAnims_Flicker[] = { - gSpriteAnim_855C2CC, - gSpriteAnim_855C2D4 + sAnim_Static, + sAnim_Flicker }; -static const union AnimCmd *const sAnimTable_HofMonitor[] = +static const union AnimCmd *const sAnims_HofMonitor[] = { - gSpriteAnim_855C2CC + sAnim_Static }; static const struct SpriteTemplate sSpriteTemplate_PokeballGlow = @@ -515,7 +516,7 @@ static const struct SpriteTemplate sSpriteTemplate_PokeballGlow = .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_POKEBALL_GLOW, .oam = &sOam_8x8, - .anims = gSpriteAnimTable_855C2F8, + .anims = sAnims_Flicker, .images = sPicTable_PokeballGlow, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PokeballGlow @@ -526,7 +527,7 @@ static const struct SpriteTemplate sSpriteTemplate_PokecenterMonitor = .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &sOam_16x16, - .anims = gSpriteAnimTable_855C2F8, + .anims = sAnims_Flicker, .images = sPicTable_PokecenterMonitor, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PokecenterMonitor @@ -537,7 +538,7 @@ static const struct SpriteTemplate sSpriteTemplate_HofMonitorBig = .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_HOF_MONITOR, .oam = &sOam_16x16, - .anims = sAnimTable_HofMonitor, + .anims = sAnims_HofMonitor, .images = sPicTable_HofMonitorBig, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HallOfFameMonitor @@ -548,7 +549,7 @@ static const struct SpriteTemplate sSpriteTemplate_HofMonitorSmall = .tileTag = 0xFFFF, .paletteTag = FLDEFF_PAL_TAG_HOF_MONITOR, .oam = &sOam_32x16, - .anims = sAnimTable_HofMonitor, + .anims = sAnims_HofMonitor, .images = sPicTable_HofMonitorSmall, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_HallOfFameMonitor @@ -934,43 +935,43 @@ void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId) // r, g, b are between 0 and 16 void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) { - int curRed; - int curGreen; - int curBlue; - u16 outPal; - - outPal = gPlttBufferUnfaded[i]; - curRed = outPal & 0x1f; - curGreen = (outPal & (0x1f << 5)) >> 5; - curBlue = (outPal & (0x1f << 10)) >> 10; - curRed += (((0x1f - curRed) * r) >> 4); - curGreen += (((0x1f - curGreen) * g) >> 4); - curBlue += (((0x1f - curBlue) * b) >> 4); - outPal = curRed; - outPal |= curGreen << 5; - outPal |= curBlue << 10; - gPlttBufferFaded[i] = outPal; + int curRed, curGreen, curBlue; + u16 color = gPlttBufferUnfaded[i]; + + curRed = (color & RGB_RED); + curGreen = (color & RGB_GREEN) >> 5; + curBlue = (color & RGB_BLUE) >> 10; + + curRed += (((0x1F - curRed) * r) >> 4); + curGreen += (((0x1F - curGreen) * g) >> 4); + curBlue += (((0x1F - curBlue) * b) >> 4); + + color = curRed; + color |= (curGreen << 5); + color |= (curBlue << 10); + + gPlttBufferFaded[i] = color; } // r, g, b are between 0 and 16 void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) { - int curRed; - int curGreen; - int curBlue; - u16 outPal; - - outPal = gPlttBufferUnfaded[i]; - curRed = outPal & 0x1f; - curGreen = (outPal & (0x1f << 5)) >> 5; - curBlue = (outPal & (0x1f << 10)) >> 10; - curRed -= ((curRed * r) >> 4); + int curRed, curGreen, curBlue; + u16 color = gPlttBufferUnfaded[i]; + + curRed = (color & RGB_RED); + curGreen = (color & RGB_GREEN) >> 5; + curBlue = (color & RGB_BLUE) >> 10; + + curRed -= ((curRed * r) >> 4); curGreen -= ((curGreen * g) >> 4); - curBlue -= ((curBlue * b) >> 4); - outPal = curRed; - outPal |= curGreen << 5; - outPal |= curBlue << 10; - gPlttBufferFaded[i] = outPal; + curBlue -= ((curBlue * b) >> 4); + + color = curRed; + color |= (curGreen << 5); + color |= (curBlue << 10); + + gPlttBufferFaded[i] = color; } // Task data for Task_PokecenterHeal and Task_HallOfFameRecord @@ -3052,7 +3053,7 @@ static void SurfFieldEffect_End(struct Task *task) gPlayerAvatar.preventStep = FALSE; gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; ObjectEventSetHeldMovement(objectEvent, GetFaceDirectionMovementAction(objectEvent->movementDirection)); - SetSurfBobState(objectEvent->fieldEffectSpriteId, 1); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); UnfreezeObjectEvents(); ScriptContext2_Disable(); FieldEffectActiveListRemove(FLDEFF_USE_SURF); @@ -3203,8 +3204,8 @@ static void FlyOutFieldEffect_BirdLeaveBall(struct Task *task) struct ObjectEvent *objectEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { - SetSurfBobState(objectEvent->fieldEffectSpriteId, 2); - SetSurfBobWhileFlyingOutState(objectEvent->fieldEffectSpriteId, 0); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_JUST_MON); + SetSurfBlob_DontSyncAnim(objectEvent->fieldEffectSpriteId, FALSE); } task->tBirdSpriteId = CreateFlyBirdSprite(); // Does "leave ball" animation by default task->tState++; @@ -3472,7 +3473,7 @@ static void FlyInFieldEffect_BirdSwoopDown(struct Task *task) SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_ON_FOOT); if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { - SetSurfBobState(objectEvent->fieldEffectSpriteId, 0); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_NONE); } ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_SURFING)); CameraObjectReset2(); @@ -3581,7 +3582,7 @@ static void FlyInFieldEffect_End(struct Task *task) if (task->tAvatarFlags & PLAYER_AVATAR_FLAG_SURFING) { state = PLAYER_AVATAR_STATE_SURFING; - SetSurfBobState(objectEvent->fieldEffectSpriteId, 1); + SetSurfBlob_BobState(objectEvent->fieldEffectSpriteId, BOB_PLAYER_AND_MON); } ObjectEventSetGraphicsId(objectEvent, GetPlayerAvatarGraphicsIdByStateId(state)); ObjectEventTurn(objectEvent, DIR_SOUTH); @@ -3703,8 +3704,8 @@ static void DestroyDeoxysRockEffect_RockFragments(s16* data, u8 taskId) { struct Sprite *sprite = &gSprites[gObjectEvents[tObjectEventId].spriteId]; gObjectEvents[tObjectEventId].invisible = TRUE; - BlendPalettes(0x0000FFFF, 0x10, RGB_WHITE); - BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, RGB_WHITE); + BlendPalettes(PALETTES_BG, 0x10, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_BG, 0, 0x10, 0, RGB_WHITE); CreateDeoxysRockFragments(sprite); PlaySE(SE_THUNDER); StartEndingDeoxysRockCameraShake(tCameraTaskId); @@ -3853,16 +3854,8 @@ static void Task_MoveDeoxysRock(u8 taskId) case 0: data[4] = sprite->pos1.x << 4; data[5] = sprite->pos1.y << 4; - - // UB: Possible divide by zero - #ifdef UBFIX - #define DIVISOR (data[8] ? data[8] : 1); - #else - #define DIVISOR (data[8]) - #endif - - data[6] = (data[2] * 16 - data[4]) / DIVISOR; - data[7] = (data[3] * 16 - data[5]) / DIVISOR; + data[6] = SAFE_DIV(data[2] * 16 - data[4], data[8]); + data[7] = SAFE_DIV(data[3] * 16 - data[5], data[8]); data[0]++; case 1: if (data[8] != 0) diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 2322232b8..67a151aaa 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -19,19 +19,27 @@ static void UpdateObjectReflectionSprite(struct Sprite *); static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite); static void LoadObjectHighBridgeReflectionPalette(struct ObjectEvent *, u8); static void LoadObjectRegularReflectionPalette(struct ObjectEvent *, u8); -static void sub_81561FC(struct Sprite *, u8, u8); +static void UpdateGrassFieldEffectSubpriority(struct Sprite *, u8, u8); static void FadeFootprintsTireTracks_Step0(struct Sprite *); static void FadeFootprintsTireTracks_Step1(struct Sprite *); static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *); -static void UpdateAshFieldEffect_Step0(struct Sprite *); -static void UpdateAshFieldEffect_Step1(struct Sprite *); -static void UpdateAshFieldEffect_Step2(struct Sprite *); +static void UpdateAshFieldEffect_Wait(struct Sprite *); +static void UpdateAshFieldEffect_Show(struct Sprite *); +static void UpdateAshFieldEffect_End(struct Sprite *); static void SynchroniseSurfAnim(struct ObjectEvent *, struct Sprite *); -static void sub_81556E8(struct ObjectEvent *, struct Sprite *); -static void CreateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *); -static void sub_8155850(struct Sprite *); +static void SynchroniseSurfPosition(struct ObjectEvent *, struct Sprite *); +static void UpdateBobbingEffect(struct ObjectEvent *, struct Sprite *, struct Sprite *); +static void SpriteCB_UnderwaterSurfBlob(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); +// Used by several field effects to determine which of a group it is +#define sFldEff data[1] + +#define sReflectionObjEventId data[0] +#define sReflectionObjEventLocalId data[1] +#define sReflectionVerticalOffset data[2] +#define sIsStillReflection data[7] + void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection) { struct Sprite *reflectionSprite; @@ -46,9 +54,9 @@ void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, boo reflectionSprite->affineAnims = gDummySpriteAffineAnimTable; reflectionSprite->affineAnimBeginning = TRUE; reflectionSprite->subspriteMode = SUBSPRITES_OFF; - reflectionSprite->data[0] = sprite->data[0]; - reflectionSprite->data[1] = objectEvent->localId; - reflectionSprite->data[7] = stillReflection; + reflectionSprite->sReflectionObjEventId = sprite->data[0]; + reflectionSprite->sReflectionObjEventLocalId = objectEvent->localId; + reflectionSprite->sIsStillReflection = stillReflection; LoadObjectReflectionPalette(objectEvent, reflectionSprite); if (!stillReflection) @@ -60,19 +68,19 @@ static s16 GetReflectionVerticalOffset(struct ObjectEvent *objectEvent) return GetObjectEventGraphicsInfo(objectEvent->graphicsId)->height - 2; } -static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void LoadObjectReflectionPalette(struct ObjectEvent *objectEvent, struct Sprite *reflectionSprite) { u8 bridgeType; u16 bridgeReflectionVerticalOffsets[] = { 12, 28, 44 }; - sprite->data[2] = 0; + reflectionSprite->sReflectionVerticalOffset = 0; if (!GetObjectEventGraphicsInfo(objectEvent->graphicsId)->disableReflectionPaletteLoad && ((bridgeType = MetatileBehavior_GetBridgeType(objectEvent->previousMetatileBehavior)) || (bridgeType = MetatileBehavior_GetBridgeType(objectEvent->currentMetatileBehavior)))) { - sprite->data[2] = bridgeReflectionVerticalOffsets[bridgeType - 1]; - LoadObjectHighBridgeReflectionPalette(objectEvent, sprite->oam.paletteNum); + reflectionSprite->sReflectionVerticalOffset = bridgeReflectionVerticalOffsets[bridgeType - 1]; + LoadObjectHighBridgeReflectionPalette(objectEvent, reflectionSprite->oam.paletteNum); } else { - LoadObjectRegularReflectionPalette(objectEvent, sprite->oam.paletteNum); + LoadObjectRegularReflectionPalette(objectEvent, reflectionSprite->oam.paletteNum); } } @@ -118,9 +126,9 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) struct ObjectEvent *objectEvent; struct Sprite *mainSprite; - objectEvent = &gObjectEvents[reflectionSprite->data[0]]; + objectEvent = &gObjectEvents[reflectionSprite->sReflectionObjEventId]; mainSprite = &gSprites[objectEvent->spriteId]; - if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->data[1]) + if (!objectEvent->active || !objectEvent->hasReflection || objectEvent->localId != reflectionSprite->sReflectionObjEventLocalId) { reflectionSprite->inUse = FALSE; } @@ -135,8 +143,7 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) reflectionSprite->subspriteTableNum = mainSprite->subspriteTableNum; reflectionSprite->invisible = mainSprite->invisible; reflectionSprite->pos1.x = mainSprite->pos1.x; - // reflectionSprite->data[2] holds an additional vertical offset, used by the high bridges on Route 120 - reflectionSprite->pos1.y = mainSprite->pos1.y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->data[2]; + reflectionSprite->pos1.y = mainSprite->pos1.y + GetReflectionVerticalOffset(objectEvent) + reflectionSprite->sReflectionVerticalOffset; reflectionSprite->centerToCornerVecX = mainSprite->centerToCornerVecX; reflectionSprite->centerToCornerVecY = mainSprite->centerToCornerVecY; reflectionSprite->pos2.x = mainSprite->pos2.x; @@ -146,8 +153,7 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) if (objectEvent->hideReflection == TRUE) reflectionSprite->invisible = TRUE; - // Check if the reflection is not still. - if (reflectionSprite->data[7] == FALSE) + if (reflectionSprite->sIsStillReflection == FALSE) { // Sets the reflection sprite's rot/scale matrix to the appropriate // matrix based on whether or not the main sprite is horizontally flipped. @@ -159,6 +165,11 @@ static void UpdateObjectReflectionSprite(struct Sprite *reflectionSprite) } } +#undef sReflectionObjEventId +#undef sReflectionObjEventLocalId +#undef sReflectionVerticalOffset +#undef sIsStillReflection + extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[]; u8 CreateWarpArrowSprite(void) @@ -265,6 +276,16 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) } } +// Sprite data for FLDEFF_TALL_GRASS and FLDEFF_LONG_GRASS +#define sElevation data[0] +#define sX data[1] +#define sY data[2] +#define sMapNum data[3] // Lower 8 bits +#define sLocalId data[3] >> 8 // Upper 8 bits +#define sMapGroup data[4] +#define sCurrentMap data[5] +#define sObjectMoved data[7] + u32 FldEff_TallGrass(void) { s16 x; @@ -281,16 +302,15 @@ u32 FldEff_TallGrass(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = gFieldEffectArguments[0]; - sprite->data[2] = gFieldEffectArguments[1]; - sprite->data[3] = gFieldEffectArguments[4]; - sprite->data[4] = gFieldEffectArguments[5]; - sprite->data[5] = gFieldEffectArguments[6]; + sprite->sElevation = gFieldEffectArguments[2]; + sprite->sX = gFieldEffectArguments[0]; + sprite->sY = gFieldEffectArguments[1]; + sprite->sMapNum = gFieldEffectArguments[4]; // Also sLocalId + sprite->sMapGroup = gFieldEffectArguments[5]; + sprite->sCurrentMap = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) - { - SeekSpriteAnim(sprite, 4); - } + SeekSpriteAnim(sprite, 4); // Skip to end of anim } return 0; } @@ -304,34 +324,42 @@ void UpdateTallGrassFieldEffect(struct Sprite *sprite) u8 objectEventId; struct ObjectEvent *objectEvent; - mapNum = sprite->data[5] >> 8; - mapGroup = sprite->data[5]; + mapNum = sprite->sCurrentMap >> 8; + mapGroup = sprite->sCurrentMap; if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup)) { - sprite->data[1] -= gCamera.x; - sprite->data[2] -= gCamera.y; - sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup; + sprite->sX -= gCamera.x; + sprite->sY -= gCamera.y; + sprite->sCurrentMap = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup; } - localId = sprite->data[3] >> 8; - mapNum = sprite->data[3]; - mapGroup = sprite->data[4]; - metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); - if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) + localId = sprite->sLocalId; + mapNum = sprite->sMapNum; + mapGroup = sprite->sMapGroup; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->sX, sprite->sY); + + if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) + || !MetatileBehavior_IsTallGrass(metatileBehavior) + || (sprite->sObjectMoved && sprite->animEnded)) { FieldEffectStop(sprite, FLDEFF_TALL_GRASS); } else { + // Check if the object that triggered the effect has moved away objectEvent = &gObjectEvents[objectEventId]; - if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2])) - sprite->data[7] = TRUE; + if ((objectEvent->currentCoords.x != sprite->sX + || objectEvent->currentCoords.y != sprite->sY) + && (objectEvent->previousCoords.x != sprite->sX + || objectEvent->previousCoords.y != sprite->sY)) + sprite->sObjectMoved = TRUE; + // Metatile behavior var re-used metatileBehavior = 0; if (sprite->animCmdIndex == 0) metatileBehavior = 4; - UpdateObjectEventSpriteVisibility(sprite, 0); - sub_81561FC(sprite, sprite->data[0], metatileBehavior); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); + UpdateGrassFieldEffectSubpriority(sprite, sprite->sElevation, metatileBehavior); } } @@ -347,8 +375,8 @@ u32 FldEff_JumpTallGrass(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_JUMP_TALL_GRASS; + sprite->sElevation = gFieldEffectArguments[2]; + sprite->sFldEff = FLDEFF_JUMP_TALL_GRASS; } return 0; } @@ -363,11 +391,14 @@ u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s if (gSprites[i].inUse) { sprite = &gSprites[i]; - if (sprite->callback == UpdateTallGrassFieldEffect && (x == sprite->data[1] && y == sprite->data[2]) && (localId == (u8)(sprite->data[3] >> 8) && mapNum == (sprite->data[3] & 0xFF) && mapGroup == sprite->data[4])) + if (sprite->callback == UpdateTallGrassFieldEffect + && (x == sprite->sX && y == sprite->sY) + && localId == (u8)(sprite->sLocalId) + && mapNum == (sprite->sMapNum & 0xFF) + && mapGroup == sprite->sMapGroup) return i; } } - return MAX_SPRITES; } @@ -387,16 +418,15 @@ u32 FldEff_LongGrass(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]); - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = gFieldEffectArguments[0]; - sprite->data[2] = gFieldEffectArguments[1]; - sprite->data[3] = gFieldEffectArguments[4]; - sprite->data[4] = gFieldEffectArguments[5]; - sprite->data[5] = gFieldEffectArguments[6]; + sprite->sElevation = gFieldEffectArguments[2]; + sprite->sX = gFieldEffectArguments[0]; + sprite->sY = gFieldEffectArguments[1]; + sprite->sMapNum = gFieldEffectArguments[4]; // Also sLocalId + sprite->sMapGroup = gFieldEffectArguments[5]; + sprite->sCurrentMap = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) - { - SeekSpriteAnim(sprite, 6); - } + SeekSpriteAnim(sprite, 6); // Skip to end of anim } return 0; } @@ -410,34 +440,47 @@ void UpdateLongGrassFieldEffect(struct Sprite *sprite) u8 objectEventId; struct ObjectEvent *objectEvent; - mapNum = sprite->data[5] >> 8; - mapGroup = sprite->data[5]; + mapNum = sprite->sCurrentMap >> 8; + mapGroup = sprite->sCurrentMap; if (gCamera.active && (gSaveBlock1Ptr->location.mapNum != mapNum || gSaveBlock1Ptr->location.mapGroup != mapGroup)) { - sprite->data[1] -= gCamera.x; - sprite->data[2] -= gCamera.y; - sprite->data[5] = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup; + sprite->sX -= gCamera.x; + sprite->sY -= gCamera.y; + sprite->sCurrentMap = ((u8)gSaveBlock1Ptr->location.mapNum << 8) | (u8)gSaveBlock1Ptr->location.mapGroup; } - localId = sprite->data[3] >> 8; - mapNum = sprite->data[3]; - mapGroup = sprite->data[4]; + localId = sprite->sLocalId; + mapNum = sprite->sMapNum; + mapGroup = sprite->sMapGroup; metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data[1], sprite->data[2]); - if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data[7] && sprite->animEnded)) + if (TryGetObjectEventIdByLocalIdAndMap(localId, mapNum, mapGroup, &objectEventId) + || !MetatileBehavior_IsLongGrass(metatileBehavior) + || (sprite->sObjectMoved && sprite->animEnded)) { FieldEffectStop(sprite, FLDEFF_LONG_GRASS); } else { + // Check if the object that triggered the effect has moved away objectEvent = &gObjectEvents[objectEventId]; - if ((objectEvent->currentCoords.x != sprite->data[1] || objectEvent->currentCoords.y != sprite->data[2]) && (objectEvent->previousCoords.x != sprite->data[1] || objectEvent->previousCoords.y != sprite->data[2])) - { - sprite->data[7] = TRUE; - } - UpdateObjectEventSpriteVisibility(sprite, 0); - sub_81561FC(sprite, sprite->data[0], 0); + if ((objectEvent->currentCoords.x != sprite->data[1] + || objectEvent->currentCoords.y != sprite->data[2]) + && (objectEvent->previousCoords.x != sprite->data[1] + || objectEvent->previousCoords.y != sprite->data[2])) + sprite->sObjectMoved = TRUE; + + UpdateObjectEventSpriteInvisibility(sprite, FALSE); + UpdateGrassFieldEffectSubpriority(sprite, sprite->sElevation, 0); } } +#undef sX +#undef sY +#undef sMapNum +#undef sLocalId +#undef sMapGroup +#undef sCurrentMap +#undef sObjectMoved + u32 FldEff_JumpLongGrass(void) { u8 spriteId; @@ -450,8 +493,8 @@ u32 FldEff_JumpLongGrass(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[0] = gFieldEffectArguments[2]; - sprite->data[1] = FLDEFF_JUMP_LONG_GRASS; + sprite->sElevation = gFieldEffectArguments[2]; + sprite->sFldEff = FLDEFF_JUMP_LONG_GRASS; } return 0; } @@ -512,7 +555,7 @@ void UpdateShortGrassFieldEffect(struct Sprite *sprite) sprite->pos2.y = (graphicsInfo->height >> 1) - 8; sprite->subpriority = linkedSprite->subpriority - 1; sprite->oam.priority = linkedSprite->oam.priority; - UpdateObjectEventSpriteVisibility(sprite, linkedSprite->invisible); + UpdateObjectEventSpriteInvisibility(sprite, linkedSprite->invisible); } } @@ -586,14 +629,14 @@ static void FadeFootprintsTireTracks_Step0(struct Sprite *sprite) if (++sprite->data[1] > 40) sprite->data[0] = 1; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } static void FadeFootprintsTireTracks_Step1(struct Sprite *sprite) { sprite->invisible ^= 1; sprite->data[1]++; - UpdateObjectEventSpriteVisibility(sprite, sprite->invisible); + UpdateObjectEventSpriteInvisibility(sprite, sprite->invisible); if (sprite->data[1] > 56) { FieldEffectStop(sprite, sprite->data[7]); @@ -640,7 +683,7 @@ void UpdateSplashFieldEffect(struct Sprite *sprite) { sprite->pos1.x = gSprites[gObjectEvents[objectEventId].spriteId].pos1.x; sprite->pos1.y = gSprites[gObjectEvents[objectEventId].spriteId].pos1.y; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } @@ -726,7 +769,7 @@ static void UpdateFeetInFlowingWaterFieldEffect(struct Sprite *sprite) sprite->pos1.x = linkedSprite->pos1.x; sprite->pos1.y = linkedSprite->pos1.y; sprite->subpriority = linkedSprite->subpriority; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (objectEvent->currentCoords.x != sprite->data[3] || objectEvent->currentCoords.y != sprite->data[4]) { sprite->data[3] = objectEvent->currentCoords.x; @@ -796,7 +839,7 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite) sprite->pos1.x = linkedSprite->pos1.x; sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8; sprite->subpriority = linkedSprite->subpriority - 1; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } @@ -868,14 +911,21 @@ u32 FldEff_WaterSurfacing(void) return 0; } -void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 d) +// Sprite data for FLDEFF_ASH +#define sState data[0] +#define sX data[1] +#define sY data[2] +#define sMetatileId data[3] +#define sDelay data[4] + +void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 delay) { gFieldEffectArguments[0] = x; gFieldEffectArguments[1] = y; - gFieldEffectArguments[2] = 0x52; - gFieldEffectArguments[3] = 1; + gFieldEffectArguments[2] = 82; // subpriority + gFieldEffectArguments[3] = 1; // priority gFieldEffectArguments[4] = metatileId; - gFieldEffectArguments[5] = d; + gFieldEffectArguments[5] = delay; FieldEffectStart(FLDEFF_ASH); } @@ -895,50 +945,62 @@ u32 FldEff_Ash(void) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.priority = gFieldEffectArguments[3]; - sprite->data[1] = gFieldEffectArguments[0]; - sprite->data[2] = gFieldEffectArguments[1]; - sprite->data[3] = gFieldEffectArguments[4]; - sprite->data[4] = gFieldEffectArguments[5]; + sprite->sX = gFieldEffectArguments[0]; + sprite->sY = gFieldEffectArguments[1]; + sprite->sMetatileId = gFieldEffectArguments[4]; + sprite->sDelay = gFieldEffectArguments[5]; } return 0; } void (*const gAshFieldEffectFuncs[])(struct Sprite *) = { - UpdateAshFieldEffect_Step0, - UpdateAshFieldEffect_Step1, - UpdateAshFieldEffect_Step2 + UpdateAshFieldEffect_Wait, + UpdateAshFieldEffect_Show, + UpdateAshFieldEffect_End }; void UpdateAshFieldEffect(struct Sprite *sprite) { - gAshFieldEffectFuncs[sprite->data[0]](sprite); + gAshFieldEffectFuncs[sprite->sState](sprite); } -static void UpdateAshFieldEffect_Step0(struct Sprite *sprite) +static void UpdateAshFieldEffect_Wait(struct Sprite *sprite) { sprite->invisible = TRUE; sprite->animPaused = TRUE; - if (--sprite->data[4] == 0) - sprite->data[0] = 1; + if (--sprite->sDelay == 0) + sprite->sState = 1; } -static void UpdateAshFieldEffect_Step1(struct Sprite *sprite) +static void UpdateAshFieldEffect_Show(struct Sprite *sprite) { sprite->invisible = FALSE; sprite->animPaused = FALSE; - MapGridSetMetatileIdAt(sprite->data[1], sprite->data[2], sprite->data[3]); - CurrentMapDrawMetatileAt(sprite->data[1], sprite->data[2]); + MapGridSetMetatileIdAt(sprite->sX, sprite->sY, sprite->sMetatileId); + CurrentMapDrawMetatileAt(sprite->sX, sprite->sY); gObjectEvents[gPlayerAvatar.objectEventId].triggerGroundEffectsOnMove = TRUE; - sprite->data[0] = 2; + sprite->sState = 2; } -static void UpdateAshFieldEffect_Step2(struct Sprite *sprite) +static void UpdateAshFieldEffect_End(struct Sprite *sprite) { - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->animEnded) FieldEffectStop(sprite, FLDEFF_ASH); } +#undef sState +#undef sX +#undef sY +#undef sMetatileId +#undef sDelay + +// Sprite data for FLDEFF_SURF_BLOB +#define tBitfield data[0] +#define tPlayerOffset data[1] +#define tPlayerObjId data[2] + + u32 FldEff_SurfBlob(void) { u8 spriteId; @@ -946,12 +1008,12 @@ u32 FldEff_SurfBlob(void) SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_SURF_BLOB], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); - if (spriteId !=MAX_SPRITES) + if (spriteId != MAX_SPRITES) { sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->oam.paletteNum = 0; - sprite->data[2] = gFieldEffectArguments[2]; + sprite->tPlayerObjId = gFieldEffectArguments[2]; sprite->data[3] = -1; sprite->data[6] = -1; sprite->data[7] = -1; @@ -960,53 +1022,55 @@ u32 FldEff_SurfBlob(void) return spriteId; } -// States for bobbing up and down while surfing -void SetSurfBobState(u8 spriteId, u8 value) + +void SetSurfBlob_BobState(u8 spriteId, u8 state) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (value & 0xF); + gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF) | (state & 0xF); } -void SetSurfBobWhileFlyingOutState(u8 spriteId, u8 value) +void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 dontSync) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((value & 0xF) << 4); + gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF0) | ((dontSync & 0xF) << 4); } -void SetSurfBobWhileFishingState(u8 spriteId, u8 value, s16 data1) +void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset) { - gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((value & 0xF) << 8); - gSprites[spriteId].data[1] = data1; + gSprites[spriteId].data[0] = (gSprites[spriteId].data[0] & ~0xF00) | ((hasOffset & 0xF) << 8); + gSprites[spriteId].tPlayerOffset = offset; } -static u8 GetSurfBobState(struct Sprite *sprite) +static u8 GetSurfBlob_BobState(struct Sprite *sprite) { return sprite->data[0] & 0xF; } -static u8 GetSurfBobWhileFlyingOutState(struct Sprite *sprite) +// Never TRUE +static u8 GetSurfBlob_DontSyncAnim(struct Sprite *sprite) { return (sprite->data[0] & 0xF0) >> 4; } -static u8 GetSurfBobWhileFishingState(struct Sprite *sprite) +static u8 GetSurfBlob_HasPlayerOffset(struct Sprite *sprite) { return (sprite->data[0] & 0xF00) >> 8; } void UpdateSurfBlobFieldEffect(struct Sprite *sprite) { - struct ObjectEvent *objectEvent; - struct Sprite *linkedSprite; + struct ObjectEvent *playerObj; + struct Sprite *playerSprite; - objectEvent = &gObjectEvents[sprite->data[2]]; - linkedSprite = &gSprites[objectEvent->spriteId]; - SynchroniseSurfAnim(objectEvent, sprite); - sub_81556E8(objectEvent, sprite); - CreateBobbingEffect(objectEvent, linkedSprite, sprite); - sprite->oam.priority = linkedSprite->oam.priority; + playerObj = &gObjectEvents[sprite->tPlayerObjId]; + playerSprite = &gSprites[playerObj->spriteId]; + SynchroniseSurfAnim(playerObj, sprite); + SynchroniseSurfPosition(playerObj, sprite); + UpdateBobbingEffect(playerObj, playerSprite, sprite); + sprite->oam.priority = playerSprite->oam.priority; } -static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite *sprite) +static void SynchroniseSurfAnim(struct ObjectEvent *playerObj, struct Sprite *sprite) { + // Indexes into sAnimTable_SurfBlob u8 surfBlobDirectionAnims[] = { [DIR_NONE] = 0, [DIR_SOUTH] = 0, @@ -1019,15 +1083,15 @@ static void SynchroniseSurfAnim(struct ObjectEvent *objectEvent, struct Sprite * [DIR_NORTHEAST] = 1, }; - if (GetSurfBobWhileFlyingOutState(sprite) == 0) - StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[objectEvent->movementDirection]); + if (!GetSurfBlob_DontSyncAnim(sprite)) + StartSpriteAnimIfDifferent(sprite, surfBlobDirectionAnims[playerObj->movementDirection]); } -void sub_81556E8(struct ObjectEvent *objectEvent, struct Sprite *sprite) +void SynchroniseSurfPosition(struct ObjectEvent *playerObj, struct Sprite *sprite) { u8 i; - s16 x = objectEvent->currentCoords.x; - s16 y = objectEvent->currentCoords.y; + s16 x = playerObj->currentCoords.x; + s16 y = playerObj->currentCoords.y; s32 spriteY = sprite->pos2.y; if (spriteY == 0 && (x != sprite->data[6] || y != sprite->data[7])) @@ -1040,68 +1104,81 @@ void sub_81556E8(struct ObjectEvent *objectEvent, struct Sprite *sprite) MoveCoords(i, &x, &y); if (MapGridGetZCoordAt(x, y) == 3) { - sprite->data[5] ++; + sprite->data[5]++; break; } } } } -static void CreateBobbingEffect(struct ObjectEvent *objectEvent, struct Sprite *linkedSprite, struct Sprite *sprite) +static void UpdateBobbingEffect(struct ObjectEvent *playerObj, struct Sprite *playerSprite, struct Sprite *sprite) { - u16 unk_085CDC6A[] = {3, 7}; - u8 bobState = GetSurfBobState(sprite); - if (bobState != 0) + u16 intervals[] = {3, 7}; + u8 bobState = GetSurfBlob_BobState(sprite); + if (bobState != BOB_NONE) { - if (((u16)(++ sprite->data[4]) & unk_085CDC6A[sprite->data[5]]) == 0) + // Update bobbing position of surf blob + if (((u16)(++sprite->data[4]) & intervals[sprite->data[5]]) == 0) { sprite->pos2.y += sprite->data[3]; } - if ((sprite->data[4] & 0x0F) == 0) + if ((sprite->data[4] & 15) == 0) { sprite->data[3] = -sprite->data[3]; } - if (bobState != 2) + if (bobState != BOB_JUST_MON) { - if (GetSurfBobWhileFishingState(sprite) == 0) - linkedSprite->pos2.y = sprite->pos2.y; + // Update bobbing position of player + if (!GetSurfBlob_HasPlayerOffset(sprite)) + playerSprite->pos2.y = sprite->pos2.y; else - linkedSprite->pos2.y = sprite->data[1] + sprite->pos2.y; - sprite->pos1.x = linkedSprite->pos1.x; - sprite->pos1.y = linkedSprite->pos1.y + 8; + playerSprite->pos2.y = sprite->tPlayerOffset + sprite->pos2.y; + sprite->pos1.x = playerSprite->pos1.x; + sprite->pos1.y = playerSprite->pos1.y + 8; } } } -u8 sub_8155800(u8 oldSpriteId) +#define sSpriteId data[0] +#define sBobY data[1] +#define sTimer data[2] + +u8 StartUnderwaterSurfBlobBobbing(u8 blobSpriteId) { u8 spriteId; struct Sprite *sprite; + // Create a dummy sprite with its own callback + // that tracks the actual surf blob sprite and + // makes it bob up and down underwater spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); sprite = &gSprites[spriteId]; - sprite->callback = sub_8155850; + sprite->callback = SpriteCB_UnderwaterSurfBlob; sprite->invisible = TRUE; - sprite->data[0] = oldSpriteId; - sprite->data[1] = 1; + sprite->sSpriteId = blobSpriteId; + sprite->sBobY = 1; return spriteId; } -static void sub_8155850(struct Sprite *sprite) +static void SpriteCB_UnderwaterSurfBlob(struct Sprite *sprite) { - struct Sprite *oldSprite; + struct Sprite *blobSprite; - oldSprite = &gSprites[sprite->data[0]]; - if (((sprite->data[2]++) & 0x03) == 0) + blobSprite = &gSprites[sprite->sSpriteId]; + if (((sprite->sTimer++) & 3) == 0) { - oldSprite->pos2.y += sprite->data[1]; + blobSprite->pos2.y += sprite->sBobY; } - if ((sprite->data[2] & 0x0F) == 0) + if ((sprite->sTimer & 15) == 0) { - sprite->data[1] = -sprite->data[1]; + sprite->sBobY = -sprite->sBobY; } } +#undef sSpriteId +#undef sBobY +#undef sTimer + u32 FldEff_Dust(void) { u8 spriteId; @@ -1174,7 +1251,7 @@ void UpdateSandPileFieldEffect(struct Sprite *sprite) sprite->pos1.x = x; sprite->pos1.y = y; sprite->subpriority = gSprites[gObjectEvents[objectEventId].spriteId].subpriority; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } } @@ -1199,7 +1276,7 @@ void UpdateBubblesFieldEffect(struct Sprite *sprite) sprite->data[0] += 0x80; sprite->data[0] &= 0x100; sprite->pos1.y -= sprite->data[0] >> 8; - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); if (sprite->invisible || sprite->animEnded) { FieldEffectStop(sprite, FLDEFF_BUBBLES); @@ -1224,6 +1301,13 @@ u32 FldEff_BerryTreeGrowthSparkle(void) return 0; } +// Sprite data for FLDEFF_TREE_DISGUISE / FLDEFF_MOUNTAIN_DISGUISE / FLDEFF_SAND_DISGUISE +#define sState data[0] +#define sLocalId data[2] +#define sMapNum data[3] +#define sMapGroup data[4] +#define sReadyToEnd data[7] + u32 ShowTreeDisguiseFieldEffect(void) { return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, FLDEFFOBJ_TREE_DISGUISE, 4); @@ -1255,10 +1339,10 @@ static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 fldEffObj, u8 paletteNum) sprite = &gSprites[spriteId]; sprite->coordOffsetEnabled ++; sprite->oam.paletteNum = paletteNum; - sprite->data[1] = fldEff; - sprite->data[2] = gFieldEffectArguments[0]; - sprite->data[3] = gFieldEffectArguments[1]; - sprite->data[4] = gFieldEffectArguments[2]; + sprite->sFldEff = fldEff; + sprite->sLocalId = gFieldEffectArguments[0]; + sprite->sMapNum = gFieldEffectArguments[1]; + sprite->sMapGroup = gFieldEffectArguments[2]; } return spriteId; } @@ -1269,10 +1353,8 @@ void UpdateDisguiseFieldEffect(struct Sprite *sprite) const struct ObjectEventGraphicsInfo *graphicsInfo; struct Sprite *linkedSprite; - if (TryGetObjectEventIdByLocalIdAndMap(sprite->data[2], sprite->data[3], sprite->data[4], &objectEventId)) - { - FieldEffectStop(sprite, sprite->data[1]); - } + if (TryGetObjectEventIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &objectEventId)) + FieldEffectStop(sprite, sprite->sFldEff); graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[objectEventId].graphicsId); linkedSprite = &gSprites[gObjectEvents[objectEventId].spriteId]; @@ -1280,51 +1362,56 @@ void UpdateDisguiseFieldEffect(struct Sprite *sprite) sprite->pos1.x = linkedSprite->pos1.x; sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16; sprite->subpriority = linkedSprite->subpriority - 1; - if (sprite->data[0] == 1) + + if (sprite->sState == 1) { - sprite->data[0] ++; + sprite->sState++; StartSpriteAnim(sprite, 1); } - if (sprite->data[0] == 2 && sprite->animEnded) - { - sprite->data[7] = 1; - } - if (sprite->data[0] == 3) - { - FieldEffectStop(sprite, sprite->data[1]); - } + + if (sprite->sState == 2 && sprite->animEnded) + sprite->sReadyToEnd = TRUE; + + if (sprite->sState == 3) + FieldEffectStop(sprite, sprite->sFldEff); } -void sub_8155D78(struct ObjectEvent *objectEvent) +void StartRevealDisguise(struct ObjectEvent *objectEvent) { if (objectEvent->directionSequenceIndex == 1) - { - gSprites[objectEvent->fieldEffectSpriteId].data[0]++; - } + gSprites[objectEvent->fieldEffectSpriteId].sState++; } -bool8 sub_8155DA0(struct ObjectEvent *objectEvent) +bool8 UpdateRevealDisguise(struct ObjectEvent *objectEvent) { struct Sprite *sprite; if (objectEvent->directionSequenceIndex == 2) - { return TRUE; - } + if (objectEvent->directionSequenceIndex == 0) - { return TRUE; - } + sprite = &gSprites[objectEvent->fieldEffectSpriteId]; - if (sprite->data[7]) + if (sprite->sReadyToEnd) { objectEvent->directionSequenceIndex = 2; - sprite->data[0]++; + sprite->sState++; return TRUE; } return FALSE; } +#undef sState +#undef sLocalId +#undef sMapNum +#undef sMapGroup +#undef sReadyToEnd + +// Sprite data for FLDEFF_SPARKLE +#define sFinished data[0] +#define sEndTimer data[1] + u32 FldEff_Sparkle(void) { u8 spriteId; @@ -1343,22 +1430,22 @@ u32 FldEff_Sparkle(void) void UpdateSparkleFieldEffect(struct Sprite *sprite) { - if (sprite->data[0] == 0) + if (!sprite->sFinished) { if (sprite->animEnded) { sprite->invisible = TRUE; - sprite->data[0]++; + sprite->sFinished++; } - - if (sprite->data[0] == 0) - return; } - if (++sprite->data[1] > 34) + if (sprite->sFinished && ++sprite->sEndTimer > 34) FieldEffectStop(sprite, FLDEFF_SPARKLE); } +#undef sFinished +#undef sEndTimer + #define sTimer data[0] #define sState data[2] #define sStartY data[4] @@ -1543,16 +1630,17 @@ void UpdateRayquazaSpotlightEffect(struct Sprite *sprite) #undef sAnimCounter #undef sAnimState +// Used by FLDEFF_JUMP_TALL_GRASS and FLDEFF_JUMP_LONG_GRASS void UpdateJumpImpactEffect(struct Sprite *sprite) { if (sprite->animEnded) { - FieldEffectStop(sprite, sprite->data[1]); + FieldEffectStop(sprite, sprite->sFldEff); } else { - UpdateObjectEventSpriteVisibility(sprite, FALSE); - SetObjectSubpriorityByZCoord(sprite->data[0], sprite, 0); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); + SetObjectSubpriorityByZCoord(sprite->sElevation, sprite, 0); } } @@ -1561,10 +1649,10 @@ void WaitFieldEffectSpriteAnim(struct Sprite *sprite) if (sprite->animEnded) FieldEffectStop(sprite, sprite->data[0]); else - UpdateObjectEventSpriteVisibility(sprite, FALSE); + UpdateObjectEventSpriteInvisibility(sprite, FALSE); } -static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset) +static void UpdateGrassFieldEffectSubpriority(struct Sprite *sprite, u8 z, u8 offset) { u8 i; s16 var, xhi, lyhi, yhi, ylo; @@ -1597,18 +1685,27 @@ static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset) } } -// Unused data. Feel free to remove. -static const u8 gUnknown_085CDC6E[] = -{ - 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02, - 0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, - 0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, - 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, - 0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00 +// Unused, duplicates of data in event_object_movement.c +static const s8 sFigure8XOffsets[FIGURE_8_LENGTH] = { + 1, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 1, 2, 2, 1, 2, + 2, 1, 2, 2, 1, 2, 1, 1, + 2, 1, 1, 2, 1, 1, 2, 1, + 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 0, + 1, 0, 1, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, +}; + +static const s8 sFigure8YOffsets[FIGURE_8_LENGTH] = { + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 1, 1, 0, 1, 1, 0, + 1, 1, 0, 1, 1, 0, 1, 1, + 0, 0, 1, 0, 0, 1, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, 0, -1, 0, 0, + -1, 0, -1, -1, 0, -1, -1, 0, + -1, -1, -1, -1, -1, -1, -1, -2, }; diff --git a/src/field_message_box.c b/src/field_message_box.c index 1b760c7df..69d470b84 100755 --- a/src/field_message_box.c +++ b/src/field_message_box.c @@ -1,6 +1,5 @@ #include "global.h" #include "menu.h" -#include "string.h" #include "string_util.h" #include "task.h" #include "text.h" @@ -56,7 +55,7 @@ static void CreateTask_DrawFieldMessage(void) static void DestroyTask_DrawFieldMessage(void) { u8 taskId = FindTaskIdByFunc(Task_DrawFieldMessage); - if (taskId != 0xFF) + if (taskId != TASK_NONE) DestroyTask(taskId); } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index f57cc9979..9b1f4ceb6 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -31,7 +31,7 @@ #include "constants/songs.h" #include "constants/trainer_types.h" -static EWRAM_DATA u8 gUnknown_0203734C = 0; +static EWRAM_DATA u8 sSpinStartFacingDir = 0; EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {}; EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {}; @@ -96,7 +96,7 @@ static void PlayerNotOnBikeCollideWithFarawayIslandMew(u8); static void PlayCollisionSoundIfNotFacingWarp(u8 a); -static void sub_808C280(struct ObjectEvent *); +static void HideShowWarpArrow(struct ObjectEvent *); static void StartStrengthAnim(u8, u8); static void Task_PushBoulder(u8 taskId); @@ -138,7 +138,7 @@ static u8 Fishing_PutRodAway(struct Task *task); static u8 Fishing_EndNoMon(struct Task *task); static void AlignFishingAnimationFrames(void); -static u8 sub_808D38C(struct ObjectEvent *object, s16 *a1); +static u8 TrySpinPlayerForWarp(struct ObjectEvent *object, s16 *a1); // .rodata @@ -323,7 +323,7 @@ void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys) { struct ObjectEvent *playerObjEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; - sub_808C280(playerObjEvent); + HideShowWarpArrow(playerObjEvent); if (gPlayerAvatar.preventStep == FALSE) { Bike_TryAcroBikeHistoryUpdate(newKeys, heldKeys); @@ -382,8 +382,7 @@ static void npc_clear_strange_bits(struct ObjectEvent *objEvent) static void MovePlayerAvatarUsingKeypadInput(u8 direction, u16 newKeys, u16 heldKeys) { - if ((gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) - || (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)) + if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) MovePlayerOnBike(direction, newKeys, heldKeys); else MovePlayerNotOnBike(direction, heldKeys); @@ -723,9 +722,9 @@ static bool8 CanStopSurfing(s16 x, s16 y, u8 direction) } } -static bool8 ShouldJumpLedge(s16 x, s16 y, u8 z) +static bool8 ShouldJumpLedge(s16 x, s16 y, u8 direction) { - if (GetLedgeJumpDirection(x, y, z) != 0) + if (GetLedgeJumpDirection(x, y, direction) != DIR_NONE) return TRUE; else return FALSE; @@ -864,7 +863,7 @@ static void PlayerAvatarTransition_Surfing(struct ObjectEvent *objEvent) gFieldEffectArguments[2] = gPlayerAvatar.objectEventId; spriteId = FieldEffectStart(FLDEFF_SURF_BLOB); objEvent->fieldEffectSpriteId = spriteId; - SetSurfBobState(spriteId, 1); + SetSurfBlob_BobState(spriteId, BOB_PLAYER_AND_MON); } static void PlayerAvatarTransition_Underwater(struct ObjectEvent *objEvent) @@ -872,7 +871,7 @@ static void PlayerAvatarTransition_Underwater(struct ObjectEvent *objEvent) ObjectEventSetGraphicsId(objEvent, GetPlayerAvatarGraphicsIdByStateId(PLAYER_AVATAR_STATE_UNDERWATER)); ObjectEventTurn(objEvent, objEvent->movementDirection); SetPlayerAvatarStateMask(PLAYER_AVATAR_FLAG_UNDERWATER); - objEvent->fieldEffectSpriteId = sub_8155800(objEvent->spriteId); + objEvent->fieldEffectSpriteId = StartUnderwaterSurfBlobBobbing(objEvent->spriteId); } static void PlayerAvatarTransition_ReturnToField(struct ObjectEvent *objEvent) @@ -940,9 +939,9 @@ u8 PlayerGetCopyableMovement(void) return gObjectEvents[gPlayerAvatar.objectEventId].playerCopyableMovement; } -static void sub_808B6BC(u8 a) +static void PlayerForceSetHeldMovement(u8 movementActionId) { - ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], a); + ObjectEventForceSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], movementActionId); } void PlayerSetAnimId(u8 movementActionId, u8 copyableMovement) @@ -1020,12 +1019,13 @@ void PlayerJumpLedge(u8 direction) PlayerSetAnimId(GetJump2MovementAction(direction), 8); } -void sub_808B864(void) +// Stop player on current facing direction once they're done moving and if they're not currently Acro Biking on bumpy slope +void PlayerFreeze(void) { if (gPlayerAvatar.tileTransitionState == T_TILE_CENTER || gPlayerAvatar.tileTransitionState == T_NOT_MOVING) { - if (player_should_look_direction_be_enforced_upon_movement()) - sub_808B6BC(GetFaceDirectionMovementAction(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)); + if (IsPlayerNotUsingAcroBikeOnBumpySlope()) + PlayerForceSetHeldMovement(GetFaceDirectionMovementAction(gObjectEvents[gPlayerAvatar.objectEventId].facingDirection)); } } @@ -1192,7 +1192,7 @@ u8 GetPlayerAvatarFlags(void) return gPlayerAvatar.flags; } -u8 GetPlayerAvatarObjectId(void) +u8 GetPlayerAvatarSpriteId(void) { return gPlayerAvatar.spriteId; } @@ -1424,7 +1424,7 @@ void SetPlayerAvatarWatering(u8 direction) StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], GetFaceDirectionAnimNum(direction)); } -static void sub_808C280(struct ObjectEvent *objectEvent) +static void HideShowWarpArrow(struct ObjectEvent *objectEvent) { s16 x; s16 y; @@ -1435,6 +1435,7 @@ static void sub_808C280(struct ObjectEvent *objectEvent) { if (sArrowWarpMetatileBehaviorChecks2[x](metatileBehavior) && direction == objectEvent->movementDirection) { + // Show warp arrow if applicable x = objectEvent->currentCoords.x; y = objectEvent->currentCoords.y; MoveCoords(direction, &x, &y); @@ -1645,7 +1646,7 @@ static void Task_StopSurfingInit(u8 taskId) if (!ObjectEventClearHeldMovementIfFinished(playerObjEvent)) return; } - SetSurfBobState(playerObjEvent->fieldEffectSpriteId, 2); + SetSurfBlob_BobState(playerObjEvent->fieldEffectSpriteId, BOB_JUST_MON); ObjectEventSetHeldMovement(playerObjEvent, GetJumpSpecialMovementAction((u8)gTasks[taskId].data[0])); gTasks[taskId].func = Task_WaitStopSurfing; } @@ -1931,7 +1932,7 @@ static bool8 Fishing_StartEncounter(struct Task *task) ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBobWhileFishingState(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 0, 0); + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); gSprites[gPlayerAvatar.spriteId].pos2.x = 0; gSprites[gPlayerAvatar.spriteId].pos2.y = 0; ClearDialogWindowAndFrame(0, TRUE); @@ -1988,7 +1989,7 @@ static bool8 Fishing_PutRodAway(struct Task *task) ObjectEventSetGraphicsId(playerObjEvent, task->tPlayerGfxId); ObjectEventTurn(playerObjEvent, playerObjEvent->movementDirection); if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBobWhileFishingState(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 0, 0); + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, FALSE, 0); gSprites[gPlayerAvatar.spriteId].pos2.x = 0; gSprites[gPlayerAvatar.spriteId].pos2.y = 0; task->tStep++; @@ -2047,57 +2048,67 @@ static void AlignFishingAnimationFrames(void) if (animType == 10 || animType == 11) playerSprite->pos2.y = 8; if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) - SetSurfBobWhileFishingState(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, 1, playerSprite->pos2.y); + SetSurfBlob_PlayerOffset(gObjectEvents[gPlayerAvatar.objectEventId].fieldEffectSpriteId, TRUE, playerSprite->pos2.y); } -void sub_808D074(u8 a0) +void SetSpinStartFacingDir(u8 direction) { - gUnknown_0203734C = a0; + sSpinStartFacingDir = direction; } -static u8 sub_808D080(void) +static u8 GetSpinStartFacingDir(void) { - if (gUnknown_0203734C == 0) - { - return 1; - } - return gUnknown_0203734C; + if (sSpinStartFacingDir == DIR_NONE) + return DIR_SOUTH; + + return sSpinStartFacingDir; } -static void sub_808D094(u8 taskId) +// Task data for Task_DoPlayerSpinEntrance and Task_DoPlayerSpinExit +#define tState data[0] +#define tSpinDelayTimer data[1] +#define tSpeed data[2] +#define tCurY data[3] +#define tDestY data[4] +#define tStartDir data[5] +#define tPriority data[6] +#define tSubpriority data[7] +#define tGroundTimer data[8] + +static void Task_DoPlayerSpinExit(u8 taskId) { struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[object->spriteId]; s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { - case 0: + case 0: // Init if (!ObjectEventClearHeldMovementIfFinished(object)) - { return; - } - sub_808D074(object->facingDirection); - data[1] = 0; - data[2] = 1; - data[3] = (u16)(sprite->pos1.y + sprite->pos2.y) << 4; + SetSpinStartFacingDir(object->facingDirection); + tSpinDelayTimer = 0; + tSpeed = 1; + tCurY = (u16)(sprite->pos1.y + sprite->pos2.y) << 4; sprite->pos2.y = 0; CameraObjectReset2(); object->fixedPriority = TRUE; sprite->oam.priority = 0; sprite->subpriority = 0; sprite->subspriteMode = SUBSPRITES_OFF; - data[0]++; - case 1: - sub_808D38C(object, &data[1]); - data[3] -= data[2]; - data[2] += 3; - sprite->pos1.y = data[3] >> 4; + tState++; + case 1: // Spin while rising + TrySpinPlayerForWarp(object, &tSpinDelayTimer); + + // Rise and accelerate + tCurY -= tSpeed; + tSpeed += 3; + sprite->pos1.y = tCurY >> 4; + + // Check if offscreen if (sprite->pos1.y + (s16)gTotalCameraPixelOffsetY < -32) - { - data[0]++; - } + tState++; break; case 2: DestroyTask(taskId); @@ -2105,84 +2116,86 @@ static void sub_808D094(u8 taskId) } } -static void sub_808D1FC(u8 taskId); +static void Task_DoPlayerSpinEntrance(u8 taskId); -void sub_808D194(void) +void DoPlayerSpinEntrance(void) { - sub_808D1FC(CreateTask(sub_808D1FC, 0)); + Task_DoPlayerSpinEntrance(CreateTask(Task_DoPlayerSpinEntrance, 0)); } -bool32 sub_808D1B4(void) +bool32 IsPlayerSpinEntranceActive(void) { - return FuncIsActiveTask(sub_808D1FC); + return FuncIsActiveTask(Task_DoPlayerSpinEntrance); } -void sub_808D1C8(void) +void DoPlayerSpinExit(void) { - sub_808D094(CreateTask(sub_808D094, 0)); + Task_DoPlayerSpinExit(CreateTask(Task_DoPlayerSpinExit, 0)); } -bool32 sub_808D1E8(void) +bool32 IsPlayerSpinExitActive(void) { - return FuncIsActiveTask(sub_808D094); + return FuncIsActiveTask(Task_DoPlayerSpinExit); } -static const u8 gUnknown_084975BC[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; +static const u8 sSpinDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; -static void sub_808D1FC(u8 taskId) +static void Task_DoPlayerSpinEntrance(u8 taskId) { struct ObjectEvent *object = &gObjectEvents[gPlayerAvatar.objectEventId]; struct Sprite *sprite = &gSprites[object->spriteId]; s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - data[5] = sub_808D080(); - ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(gUnknown_084975BC[data[5]])); - data[1] = 0; - data[2] = 116; - data[4] = sprite->pos1.y; - data[6] = sprite->oam.priority; - data[7] = sprite->subpriority; - data[3] = -((u16)sprite->pos2.y + 32) * 16; + // Because the spin start facing direction is never set for this + // warp type, the player will always exit the warp facing South. + // This may have been intentional, unclear + tStartDir = GetSpinStartFacingDir(); + ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(sSpinDirections[tStartDir])); + tSpinDelayTimer = 0; + tSpeed = 116; + tDestY = sprite->pos1.y; + tPriority = sprite->oam.priority; + tSubpriority = sprite->subpriority; + tCurY = -((u16)sprite->pos2.y + 32) * 16; sprite->pos2.y = 0; CameraObjectReset2(); object->fixedPriority = TRUE; sprite->oam.priority = 1; sprite->subpriority = 0; sprite->subspriteMode = SUBSPRITES_OFF; - data[0]++; - case 1: - sub_808D38C(object, &data[1]); - data[3] += data[2]; - data[2] -= 3; - if (data[2] < 4) + tState++; + case 1: // Spin while descending + TrySpinPlayerForWarp(object, &tSpinDelayTimer); + + // Fall and decelerate + tCurY += tSpeed; + tSpeed -= 3; + if (tSpeed < 4) + tSpeed = 4; + sprite->pos1.y = tCurY >> 4; + + // Check if reached dest + if (sprite->pos1.y >= tDestY) { - data[2] = 4; - } - sprite->pos1.y = data[3] >> 4; - if (sprite->pos1.y >= data[4]) - { - sprite->pos1.y = data[4]; - data[8] = 0; - data[0]++; + sprite->pos1.y = tDestY; + tGroundTimer = 0; + tState++; } break; - case 2: - sub_808D38C(object, &data[1]); - data[8]++; - if (data[8] > 8) - { - data[0]++; - } + case 2: // Spin on ground + TrySpinPlayerForWarp(object, &tSpinDelayTimer); + if (++tGroundTimer > 8) + tState++; break; - case 3: - if (data[5] == sub_808D38C(object, &data[1])) + case 3: // Spin until facing original direction + if (tStartDir == TrySpinPlayerForWarp(object, &tSpinDelayTimer)) { object->fixedPriority = 0; - sprite->oam.priority = data[6]; - sprite->subpriority = data[7]; + sprite->oam.priority = tPriority; + sprite->subpriority = tSubpriority; CameraObjectReset1(); DestroyTask(taskId); } @@ -2190,19 +2203,15 @@ static void sub_808D1FC(u8 taskId) } } -static u8 sub_808D38C(struct ObjectEvent *object, s16 *a1) +static u8 TrySpinPlayerForWarp(struct ObjectEvent *object, s16 *delayTimer) { - if (*a1 < 8 && ++(*a1) < 8) - { + if (*delayTimer < 8 && ++(*delayTimer) < 8) return object->facingDirection; - } if (!ObjectEventCheckHeldMovementStatus(object)) - { return object->facingDirection; - } - ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(gUnknown_084975BC[object->facingDirection])); - *a1 = 0; - return gUnknown_084975BC[object->facingDirection]; + ObjectEventForceSetHeldMovement(object, GetFaceDirectionMovementAction(sSpinDirections[object->facingDirection])); + *delayTimer = 0; + return sSpinDirections[object->facingDirection]; } diff --git a/src/field_region_map.c b/src/field_region_map.c index fc6f0fa76..99def4901 100644 --- a/src/field_region_map.c +++ b/src/field_region_map.c @@ -156,7 +156,7 @@ static void FieldUpdateRegionMap(void) ScheduleBgCopyTilemapToVram(0); DrawStdFrameWithCustomTileAndPalette(0, 0, 0x27, 0xd); PrintRegionMapSecName(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sFieldRegionMapHandler->state++; break; case 2: @@ -184,7 +184,7 @@ static void FieldUpdateRegionMap(void) } break; case 5: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sFieldRegionMapHandler->state++; break; case 6: diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 9becd2166..fbe725c0b 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -42,11 +42,14 @@ static void Task_DoContestHallWarp(u8); static void FillPalBufferWhite(void); static void Task_ExitDoor(u8); static bool32 WaitForWeatherFadeIn(void); -static void Task_TeleportTileWarpExit(u8 taskId); +static void Task_SpinEnterWarp(u8 taskId); static void Task_WarpAndLoadMap(u8 taskId); static void Task_DoDoorWarp(u8 taskId); static void Task_EnableScriptAfterMusicFade(u8 taskId); +// data[0] is used universally by tasks in this file as a state for switches +#define tState data[0] + // const static const u16 sFlashLevelPixelRadii[] = { 200, 72, 64, 56, 48, 40, 32, 24, 0 }; const s32 gMaxFlashLevel = ARRAY_COUNT(sFlashLevelPixelRadii) - 1; @@ -156,17 +159,17 @@ static void Task_ReturnToFieldCableLink(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: task->data[1] = CreateTask_ReestablishCableClubLink(); - task->data[0]++; + task->tState++; break; case 1: if (gTasks[task->data[1]].isActive != TRUE) { WarpFadeInScreen(); - task->data[0]++; + task->tState++; } break; case 2: @@ -191,11 +194,11 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: SetLinkStandbyCallback(); - task->data[0]++; + task->tState++; break; case 1: if (!IsLinkTaskFinished()) @@ -206,7 +209,7 @@ static void Task_ReturnToFieldWirelessLink(u8 taskId) else { WarpFadeInScreen(); - task->data[0]++; + task->tState++; } break; case 2: @@ -224,16 +227,16 @@ void Task_ReturnToFieldRecordMixing(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: SetLinkStandbyCallback(); - task->data[0]++; + task->tState++; break; case 1: if (IsLinkTaskFinished()) { - task->data[0]++; + task->tState++; } break; case 2: @@ -295,12 +298,12 @@ void FieldCB_WarpExitFadeFromBlack(void) ScriptContext2_Enable(); } -static void FieldCB_TeleportTileWarpExit(void) +static void FieldCB_SpinEnterWarp(void) { Overworld_PlaySpecialMapMusic(); WarpFadeInScreen(); PlaySE(SE_WARP_OUT); - CreateTask(Task_TeleportTileWarpExit, 10); + CreateTask(Task_SpinEnterWarp, 10); ScriptContext2_Enable(); } @@ -320,14 +323,14 @@ static void Task_ExitDoor(u8 taskId) s16 *x = &task->data[2]; s16 *y = &task->data[3]; - switch (task->data[0]) + switch (task->tState) { case 0: SetPlayerVisibility(FALSE); FreezeObjectEvents(); PlayerGetDestCoords(x, y); FieldSetDoorOpened(*x, *y); - task->data[0] = 1; + task->tState = 1; break; case 1: if (WaitForWeatherFadeIn()) @@ -336,7 +339,7 @@ static void Task_ExitDoor(u8 taskId) SetPlayerVisibility(TRUE); objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventSetHeldMovement(&gObjectEvents[objEventId], MOVEMENT_ACTION_WALK_NORMAL_DOWN); - task->data[0] = 2; + task->tState = 2; } break; case 2: @@ -346,14 +349,14 @@ static void Task_ExitDoor(u8 taskId) task->data[1] = FieldAnimateDoorClose(*x, *y); objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]); - task->data[0] = 3; + task->tState = 3; } break; case 3: if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) { UnfreezeObjectEvents(); - task->data[0] = 4; + task->tState = 4; } break; case 4: @@ -369,13 +372,13 @@ static void Task_ExitNonAnimDoor(u8 taskId) s16 *x = &task->data[2]; s16 *y = &task->data[3]; - switch (task->data[0]) + switch (task->tState) { case 0: SetPlayerVisibility(FALSE); FreezeObjectEvents(); PlayerGetDestCoords(x, y); - task->data[0] = 1; + task->tState = 1; break; case 1: if (WaitForWeatherFadeIn()) @@ -384,14 +387,14 @@ static void Task_ExitNonAnimDoor(u8 taskId) SetPlayerVisibility(TRUE); objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventSetHeldMovement(&gObjectEvents[objEventId], GetWalkNormalMovementAction(GetPlayerFacingDirection())); - task->data[0] = 2; + task->tState = 2; } break; case 2: if (IsPlayerStandingStill()) { UnfreezeObjectEvents(); - task->data[0] = 3; + task->tState = 3; } break; case 3: @@ -403,12 +406,12 @@ static void Task_ExitNonAnimDoor(u8 taskId) static void Task_ExitNonDoor(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: FreezeObjectEvents(); ScriptContext2_Enable(); - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 1: if (WaitForWeatherFadeIn()) @@ -443,7 +446,7 @@ bool8 FieldCB_ReturnToFieldOpenStartMenu(void) return FALSE; } -static void task_mpl_807E3C8(u8 taskId) +static void Task_ReturnToFieldNoScript(u8 taskId) { if (WaitForWeatherFadeIn() == 1) { @@ -453,19 +456,19 @@ static void task_mpl_807E3C8(u8 taskId) } } -void sub_80AF6D4(void) +void FieldCB_ReturnToFieldNoScript(void) { ScriptContext2_Enable(); FadeInFromBlack(); - CreateTask(task_mpl_807E3C8, 10); + CreateTask(Task_ReturnToFieldNoScript, 10); } -void sub_80AF6F0(void) +void FieldCB_ReturnToFieldNoScriptCheckMusic(void) { ScriptContext2_Enable(); Overworld_PlaySpecialMapMusic(); FadeInFromBlack(); - CreateTask(task_mpl_807E3C8, 10); + CreateTask(Task_ReturnToFieldNoScript, 10); } static bool32 PaletteFadeActive(void) @@ -543,7 +546,9 @@ void DoLavaridgeGym1FWarp(void) StartLavaridgeGym1FWarp(10); } -// Warp from a teleporting tile, e.g. in Aqua Hideout (For the move Teleport see FldEff_TeleportWarpOut) +// DoSpinEnterWarp but with a fade out +// Screen fades out to exit current map, player spins down from top to enter new map +// Used by teleporting tiles, e.g. in Aqua Hideout (For the move Teleport see FldEff_TeleportWarpOut) void DoTeleportTileWarp(void) { ScriptContext2_Enable(); @@ -551,7 +556,7 @@ void DoTeleportTileWarp(void) WarpFadeOutScreen(); PlaySE(SE_WARP_IN); CreateTask(Task_WarpAndLoadMap, 10); - gFieldCallback = FieldCB_TeleportTileWarpExit; + gFieldCallback = FieldCB_SpinEnterWarp; } void DoMossdeepGymWarp(void) @@ -574,8 +579,6 @@ void DoPortholeWarp(void) gFieldCallback = FieldCB_ShowPortholeView; } -#define tState data[0] - static void Task_DoCableClubWarp(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -598,8 +601,6 @@ static void Task_DoCableClubWarp(u8 taskId) } } -#undef tState - void DoCableClubWarp(void) { ScriptContext2_Enable(); @@ -613,20 +614,20 @@ static void Task_ReturnToWorldFromLinkRoom(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: ClearLinkCallback_2(); FadeScreen(FADE_TO_BLACK, 0); TryFadeOutOldMapMusic(); PlaySE(SE_EXIT); - data[0]++; + tState++; break; case 1: if (!PaletteFadeActive() && BGMusicStopped()) { SetCloseLinkCallback(); - data[0]++; + tState++; } break; case 2: @@ -649,12 +650,12 @@ static void Task_WarpAndLoadMap(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: FreezeObjectEvents(); ScriptContext2_Enable(); - task->data[0]++; + task->tState++; break; case 1: if (!PaletteFadeActive()) @@ -665,7 +666,7 @@ static void Task_WarpAndLoadMap(u8 taskId) task->data[1] = 1; } if (BGMusicStopped()) - task->data[0]++; + task->tState++; } break; case 2: @@ -682,14 +683,14 @@ static void Task_DoDoorWarp(u8 taskId) s16 *x = &task->data[2]; s16 *y = &task->data[3]; - switch (task->data[0]) + switch (task->tState) { case 0: FreezeObjectEvents(); PlayerGetDestCoords(x, y); PlaySE(GetDoorSoundEffect(*x, *y - 1)); task->data[1] = FieldAnimateDoorOpen(*x, *y - 1); - task->data[0] = 1; + task->tState = 1; break; case 1: if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) @@ -699,7 +700,7 @@ static void Task_DoDoorWarp(u8 taskId) ObjectEventClearHeldMovementIfActive(&gObjectEvents[objEventId]); objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventSetHeldMovement(&gObjectEvents[objEventId], MOVEMENT_ACTION_WALK_NORMAL_UP); - task->data[0] = 2; + task->tState = 2; } break; case 2: @@ -710,20 +711,20 @@ static void Task_DoDoorWarp(u8 taskId) objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]); SetPlayerVisibility(FALSE); - task->data[0] = 3; + task->tState = 3; } break; case 3: if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) { - task->data[0] = 4; + task->tState = 4; } break; case 4: TryFadeOutOldMapMusic(); WarpFadeOutScreen(); PlayRainStoppingSoundEffect(); - task->data[0] = 0; + task->tState = 0; task->func = Task_WarpAndLoadMap; break; } @@ -733,17 +734,17 @@ static void Task_DoContestHallWarp(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: FreezeObjectEvents(); ScriptContext2_Enable(); - task->data[0]++; + task->tState++; break; case 1: if (!PaletteFadeActive() && BGMusicStopped()) { - task->data[0]++; + task->tState++; } break; case 2: @@ -850,22 +851,22 @@ static void UpdateFlashLevelEffect(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius); - data[0] = 1; + tState = 1; break; case 1: SetFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius); - data[0] = 0; + tState = 0; tCurFlashRadius += tFlashRadiusDelta; if (tCurFlashRadius > tDestFlashRadius) { if (tClearScanlineEffect == 1) { ScanlineEffect_Stop(); - data[0] = 2; + tState = 2; } else { @@ -884,22 +885,22 @@ static void UpdateOrbFlashEffect(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: SetOrbFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius); - data[0] = 1; + tState = 1; break; case 1: SetOrbFlashScanlineEffectWindowBoundaries(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], tFlashCenterX, tFlashCenterY, tCurFlashRadius); - data[0] = 0; + tState = 0; tCurFlashRadius += tFlashRadiusDelta; if (tCurFlashRadius > tDestFlashRadius) { if (tClearScanlineEffect == 1) { ScanlineEffect_Stop(); - data[0] = 2; + tState = 2; } else { @@ -914,7 +915,7 @@ static void UpdateOrbFlashEffect(u8 taskId) } } -static void sub_80AFF90(u8 taskId) +static void Task_WaitForFlashUpdate(u8 taskId) { if (!FuncIsActiveTask(UpdateFlashLevelEffect)) { @@ -923,13 +924,13 @@ static void sub_80AFF90(u8 taskId) } } -static void sub_80AFFB8(void) +static void StartWaitForFlashUpdate(void) { - if (!FuncIsActiveTask(sub_80AFF90)) - CreateTask(sub_80AFF90, 80); + if (!FuncIsActiveTask(Task_WaitForFlashUpdate)) + CreateTask(Task_WaitForFlashUpdate, 80); } -static u8 sub_80AFFDC(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, s32 clearScanlineEffect, u8 delta) +static u8 StartUpdateFlashLevelEffect(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, s32 clearScanlineEffect, u8 delta) { u8 taskId = CreateTask(UpdateFlashLevelEffect, 80); s16 *data = gTasks[taskId].data; @@ -948,7 +949,7 @@ static u8 sub_80AFFDC(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 dest return taskId; } -static u8 sub_80B003C(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, s32 clearScanlineEffect, u8 delta) +static u8 StartUpdateOrbFlashEffect(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, s32 clearScanlineEffect, u8 delta) { u8 taskId = CreateTask(UpdateOrbFlashEffect, 80); s16 *data = gTasks[taskId].data; @@ -972,14 +973,15 @@ static u8 sub_80B003C(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 dest #undef tFlashRadiusDelta #undef tClearScanlineEffect +// A higher flashLevel value is a smaller flash radius (more darkness). 0 is full brightness void AnimateFlash(u8 flashLevel) { u8 curFlashLevel = Overworld_GetFlashLevel(); - u8 value = 0; + bool8 fullBrightness = FALSE; if (!flashLevel) - value = 1; - sub_80AFFDC(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sFlashLevelPixelRadii[curFlashLevel], sFlashLevelPixelRadii[flashLevel], value, 1); - sub_80AFFB8(); + fullBrightness = TRUE; + StartUpdateFlashLevelEffect(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sFlashLevelPixelRadii[curFlashLevel], sFlashLevelPixelRadii[flashLevel], fullBrightness, 1); + StartWaitForFlashUpdate(); ScriptContext2_Enable(); } @@ -998,18 +1000,18 @@ void WriteBattlePyramidViewScanlineEffectBuffer(void) CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); } -static void Task_TeleportTileWarpExit(u8 taskId) +static void Task_SpinEnterWarp(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: FreezeObjectEvents(); ScriptContext2_Enable(); - sub_808D194(); - gTasks[taskId].data[0]++; + DoPlayerSpinEntrance(); + gTasks[taskId].tState++; break; case 1: - if (WaitForWeatherFadeIn() && sub_808D1B4() != TRUE) + if (WaitForWeatherFadeIn() && IsPlayerSpinEntranceActive() != TRUE) { UnfreezeObjectEvents(); ScriptContext2_Disable(); @@ -1019,29 +1021,29 @@ static void Task_TeleportTileWarpExit(u8 taskId) } } -static void sub_80B01BC(u8 taskId) +static void Task_SpinExitWarp(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: FreezeObjectEvents(); ScriptContext2_Enable(); PlaySE(SE_WARP_IN); - sub_808D1C8(); - task->data[0]++; + DoPlayerSpinExit(); + task->tState++; break; case 1: - if (!sub_808D1E8()) + if (!IsPlayerSpinExitActive()) { WarpFadeOutScreen(); - task->data[0]++; + task->tState++; } break; case 2: if (!PaletteFadeActive() && BGMusicStopped()) - task->data[0]++; + task->tState++; break; case 3: WarpIntoMap(); @@ -1051,18 +1053,22 @@ static void sub_80B01BC(u8 taskId) } } -void sub_80B0244(void) +// Only called by an unused function +// DoTeleportTileWarp is used instead +void DoSpinEnterWarp(void) { ScriptContext2_Enable(); CreateTask(Task_WarpAndLoadMap, 10); - gFieldCallback = FieldCB_TeleportTileWarpExit; + gFieldCallback = FieldCB_SpinEnterWarp; } -void sub_80B0268(void) +// Opposite of DoSpinEnterWarp / DoTeleportTileWarp +// Player exits current map by spinning up offscreen, enters new map with a fade in +void DoSpinExitWarp(void) { ScriptContext2_Enable(); gFieldCallback = FieldCB_DefaultWarpExit; - CreateTask(sub_80B01BC, 10); + CreateTask(Task_SpinExitWarp, 10); } static void LoadOrbEffectPalette(bool8 blueOrb) @@ -1081,7 +1087,7 @@ static void LoadOrbEffectPalette(bool8 blueOrb) } } -static bool8 sub_80B02C8(u16 shakeDir) +static bool8 UpdateOrbEffectBlend(u16 shakeDir) { u8 lo = REG_BLDALPHA & 0xFF; u8 hi = REG_BLDALPHA >> 8; @@ -1089,27 +1095,22 @@ static bool8 sub_80B02C8(u16 shakeDir) if (shakeDir != 0) { if (lo) - { lo--; - } } else { - if (hi < 0x10) - { + if (hi < 16) hi++; - } } SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(lo, hi)); - if (lo == 0 && hi == 0x10) + if (lo == 0 && hi == 16) return TRUE; else return FALSE; } -#define tState data[0] #define tBlueOrb data[1] #define tCenterX data[2] #define tCenterY data[3] @@ -1148,7 +1149,7 @@ static void Task_OrbEffect(u8 taskId) case 1: sub_8199DF0(0, PIXEL_FILL(1), 0, 1); LoadOrbEffectPalette(tBlueOrb); - sub_80B003C(tCenterX, tCenterY, 1, 160, 1, 2); + StartUpdateOrbFlashEffect(tCenterX, tCenterY, 1, 160, 1, 2); tState = 2; break; case 2: @@ -1188,7 +1189,7 @@ static void Task_OrbEffect(u8 taskId) { tShakeDelay = 8; tShakeDir ^= 1; - if (sub_80B02C8(tShakeDir) == TRUE) + if (UpdateOrbEffectBlend(tShakeDir) == TRUE) { tState = 5; sub_8199DF0(0, PIXEL_FILL(0), 0, 1); @@ -1243,7 +1244,6 @@ void FadeOutOrbEffect(void) gTasks[taskId].tState = 6; } -#undef tState #undef tBlueOrb #undef tCenterX #undef tCenterY diff --git a/src/field_specials.c b/src/field_specials.c index 51030a387..13fad83b1 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -57,7 +57,6 @@ #include "constants/map_types.h" #include "constants/maps.h" #include "constants/mevent.h" -#include "constants/tv.h" #include "constants/script_menu.h" #include "constants/slot_machine.h" #include "constants/songs.h" @@ -1301,12 +1300,12 @@ void SpawnCameraObject(void) { u8 obj = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_BOY_1, MOVEMENT_TYPE_FACE_DOWN, OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3); gObjectEvents[obj].invisible = TRUE; - CameraObjectSetFollowedObjectId(gObjectEvents[obj].spriteId); + CameraObjectSetFollowedSpriteId(gObjectEvents[obj].spriteId); } void RemoveCameraObject(void) { - CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); + CameraObjectSetFollowedSpriteId(GetPlayerAvatarSpriteId()); RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } @@ -1336,7 +1335,7 @@ u16 GetSlotMachineId(void) static const u8 sSlotMachineIds[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; static const u8 sSlotMachineServiceDayIds[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; - u32 rnd = gSaveBlock1Ptr->easyChatPairs[0].unk0_0 + gSaveBlock1Ptr->easyChatPairs[0].unk2 + sSlotMachineRandomSeeds[gSpecialVar_0x8004]; + u32 rnd = gSaveBlock1Ptr->dewfordTrends[0].trendiness + gSaveBlock1Ptr->dewfordTrends[0].rand + sSlotMachineRandomSeeds[gSpecialVar_0x8004]; if (GetPriceReduction(POKENEWS_GAME_CORNER)) { return sSlotMachineServiceDayIds[rnd % SLOT_MACHINE_COUNT]; @@ -1408,13 +1407,13 @@ 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); } } bool8 Special_AreLeadMonEVsMaxedOut(void) { - if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) + if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= MAX_TOTAL_EVS) { return TRUE; } @@ -1449,7 +1448,7 @@ void SetShoalItemFlag(u16 unused) void PutZigzagoonInPlayerParty(void) { u16 monData; - CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 32, FALSE, 0, OT_ID_PLAYER_ID, 0); + CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); monData = TRUE; SetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM, &monData); monData = MOVE_TACKLE; @@ -1622,7 +1621,7 @@ void BufferLottoTicketNumber(void) { if (gSpecialVar_Result >= 10000) { - TV_PrintIntToStringVar(0, gSpecialVar_Result); + ConvertIntToDecimalString(0, gSpecialVar_Result); } else if (gSpecialVar_Result >= 1000) { @@ -2667,7 +2666,7 @@ static void ScrollableMultichoice_MoveCursor(s32 itemIndex, bool8 onInit, struct u8 taskId; PlaySE(SE_SELECT); taskId = FindTaskIdByFunc(ScrollableMultichoice_ProcessInput); - if (taskId != 0xFF) + if (taskId != TASK_NONE) { u16 selection; struct Task *task = &gTasks[taskId]; @@ -2753,7 +2752,7 @@ static void sub_813A600(u8 taskId) void sub_813A630(void) { u8 taskId = FindTaskIdByFunc(sub_813A600); - if (taskId == 0xFF) + if (taskId == TASK_NONE) { EnableBothScriptContexts(); } @@ -3262,7 +3261,7 @@ void sub_813ADD4(void) u16 scrollOffset, selectedRow; u8 i; u8 taskId = FindTaskIdByFunc(sub_813A600); - if (taskId != 0xFF) + if (taskId != TASK_NONE) { struct Task *task = &gTasks[taskId]; ListMenuGetScrollAndRow(task->tListTaskId, &scrollOffset, &selectedRow); @@ -3321,7 +3320,7 @@ void GetBattleFrontierTutorMoveIndex(void) void sub_813AF48(void) { u8 taskId = FindTaskIdByFunc(sub_813A600); - if (taskId != 0xFF) + if (taskId != TASK_NONE) { struct Task *task = &gTasks[taskId]; DestroyListMenuTask(task->tListTaskId, NULL, NULL); @@ -3735,14 +3734,17 @@ bool32 ShouldDistributeEonTicket(void) return TRUE; } -void sub_813B534(void) +#define tState data[0] + +void BattleTowerReconnectLink(void) { + // Save battle type, restored at end + // of Task_LinkRetireStatusWithBattleTowerPartner sBattleTowerMultiBattleTypeFlags = gBattleTypeFlags; gBattleTypeFlags = 0; + if (!gReceivedRemoteLinkPlayers) - { - CreateTask(sub_80B3AF8, 5); - } + CreateTask(Task_ReconnectWithLinkPlayers, 5); } void LinkRetireStatusWithBattleTowerPartner(void) @@ -3750,137 +3752,145 @@ void LinkRetireStatusWithBattleTowerPartner(void) CreateTask(Task_LinkRetireStatusWithBattleTowerPartner, 5); } +// Communicate with a Battle Tower link partner to tell them +// whether or not the player chose to continue or retire, +// and determine what the partner chose to do +// gSpecialVar_0x8004: Player's choice +// gSpecialVar_0x8005: Partner's choice (read from gBlockRecvBuffer[1][0]) static void Task_LinkRetireStatusWithBattleTowerPartner(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { - case 0: - if (!FuncIsActiveTask(sub_80B3AF8)) + case 0: + if (!FuncIsActiveTask(Task_ReconnectWithLinkPlayers)) + { + gTasks[taskId].tState++; + } + break; + case 1: + if (IsLinkTaskFinished() == TRUE) + { + if (GetMultiplayerId() == 0) { - gTasks[taskId].data[0]++; + // Player is link leader, skip sending data + gTasks[taskId].tState++; } - break; - case 1: - if (IsLinkTaskFinished() == TRUE) + else { - if (GetMultiplayerId() == 0) - { - gTasks[taskId].data[0]++; - } - else - { - SendBlock(bitmask_all_link_players_but_self(), &gSpecialVar_0x8004, 2); - gTasks[taskId].data[0]++; - } + // Send value of gSpecialVar_0x8004 to leader + // Will either be BATTLE_TOWER_LINK_CONTINUE or BATTLE_TOWER_LINK_RETIRE + SendBlock(bitmask_all_link_players_but_self(), &gSpecialVar_0x8004, sizeof(gSpecialVar_0x8004)); + gTasks[taskId].tState++; } - break; - case 2: - if ((GetBlockReceivedStatus() & 2) != 0) - { - if (GetMultiplayerId() == 0) - { - gSpecialVar_0x8005 = gBlockRecvBuffer[1][0]; - ResetBlockReceivedFlag(1); - if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_RETIRE - && gSpecialVar_0x8005 == BATTLE_TOWER_LINK_RETIRE) - { - gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_BOTH_RETIRE; - } - else if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_CONTINUE - && gSpecialVar_0x8005 == BATTLE_TOWER_LINK_RETIRE) - { - gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_PARTNER_RETIRE; - } - else if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_RETIRE - && gSpecialVar_0x8005 == BATTLE_TOWER_LINK_CONTINUE) - { - gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_PLAYER_RETIRE; - } - else - { - gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_CONTINUE; - } - } - gTasks[taskId].data[0]++; - } - break; - case 3: - if (IsLinkTaskFinished() == TRUE) + } + break; + case 2: + if (GetBlockReceivedStatus() & 2) + { + if (GetMultiplayerId() == 0) { - if (GetMultiplayerId() != 0) + // Player is leader, read partner's choice + // and determine if play should continue + gSpecialVar_0x8005 = gBlockRecvBuffer[1][0]; + ResetBlockReceivedFlag(1); + + if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_RETIRE + && gSpecialVar_0x8005 == BATTLE_TOWER_LINK_RETIRE) { - gTasks[taskId].data[0]++; + gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_BOTH_RETIRE; } - else + else if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_CONTINUE + && gSpecialVar_0x8005 == BATTLE_TOWER_LINK_RETIRE) { - SendBlock(bitmask_all_link_players_but_self(), &gSpecialVar_Result, 2); - gTasks[taskId].data[0]++; + gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_MEMBER_RETIRE; } - } - break; - case 4: - if ((GetBlockReceivedStatus() & 1) != 0) - { - if (GetMultiplayerId() != 0) + else if (gSpecialVar_0x8004 == BATTLE_TOWER_LINK_RETIRE + && gSpecialVar_0x8005 == BATTLE_TOWER_LINK_CONTINUE) { - gSpecialVar_Result = gBlockRecvBuffer[0][0]; - ResetBlockReceivedFlag(0); - gTasks[taskId].data[0]++; + gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_LEADER_RETIRE; } else { - gTasks[taskId].data[0]++; + gSpecialVar_Result = BATTLE_TOWER_LINKSTAT_CONTINUE; } } - break; - case 5: - if (GetMultiplayerId() == 0) + gTasks[taskId].tState++; + } + break; + case 3: + if (IsLinkTaskFinished() == TRUE) + { + if (GetMultiplayerId() != 0) { - if (gSpecialVar_Result == BATTLE_TOWER_LINKSTAT_PARTNER_RETIRE) - { - ShowFieldAutoScrollMessage(gText_YourPartnerHasRetired); - } + // Player is not link leader, wait for leader's response + gTasks[taskId].tState++; } else { - if (gSpecialVar_Result == BATTLE_TOWER_LINKSTAT_PLAYER_RETIRE) - { - ShowFieldAutoScrollMessage(gText_YourPartnerHasRetired); - } + // Send whether or not play should continue + SendBlock(bitmask_all_link_players_but_self(), &gSpecialVar_Result, sizeof(gSpecialVar_Result)); + gTasks[taskId].tState++; } - gTasks[taskId].data[0]++; - break; - case 6: - if (!IsTextPrinterActive(0)) - { - gTasks[taskId].data[0]++; - } - break; - case 7: - if (IsLinkTaskFinished() == 1) - { - SetLinkStandbyCallback(); - gTasks[taskId].data[0]++; - } - break; - case 8: - if (IsLinkTaskFinished() == 1) + } + break; + case 4: + if (GetBlockReceivedStatus() & 1) + { + if (GetMultiplayerId() != 0) { - gTasks[taskId].data[0]++; + // Player is not link leader, read leader's response + gSpecialVar_Result = gBlockRecvBuffer[0][0]; + ResetBlockReceivedFlag(0); + gTasks[taskId].tState++; } - break; - case 9: - if (gWirelessCommType == 0) + else { - SetCloseLinkCallback(); + gTasks[taskId].tState++; } - gBattleTypeFlags = sBattleTowerMultiBattleTypeFlags; - EnableBothScriptContexts(); - DestroyTask(taskId); - break; + } + break; + case 5: + // Print message if partner chose to retire (and player didn't) + if (GetMultiplayerId() == 0) + { + if (gSpecialVar_Result == BATTLE_TOWER_LINKSTAT_MEMBER_RETIRE) + ShowFieldAutoScrollMessage(gText_YourPartnerHasRetired); + } + else + { + if (gSpecialVar_Result == BATTLE_TOWER_LINKSTAT_LEADER_RETIRE) + ShowFieldAutoScrollMessage(gText_YourPartnerHasRetired); + } + gTasks[taskId].tState++; + break; + case 6: + if (!IsTextPrinterActive(0)) + gTasks[taskId].tState++; + break; + case 7: + if (IsLinkTaskFinished() == TRUE) + { + SetLinkStandbyCallback(); + gTasks[taskId].tState++; + } + break; + case 8: + if (IsLinkTaskFinished() == TRUE) + gTasks[taskId].tState++; + break; + case 9: + if (gWirelessCommType == 0) + SetCloseLinkCallback(); + + gBattleTypeFlags = sBattleTowerMultiBattleTypeFlags; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; } } +#undef tState + void Script_DoRayquazaScene(void) { if (!gSpecialVar_0x8004) diff --git a/src/field_tasks.c b/src/field_tasks.c index 002977a10..676a9cfc7 100644 --- a/src/field_tasks.c +++ b/src/field_tasks.c @@ -174,7 +174,7 @@ void SetUpFieldTasks(void) void ActivatePerStepCallback(u8 callbackId) { u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) + if (taskId != TASK_NONE) { s32 i; s16 *data = gTasks[taskId].data; @@ -199,12 +199,12 @@ void ResetFieldTasksArgs(void) s16 *data; taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) + if (taskId != TASK_NONE) { data = gTasks[taskId].data; } taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); - if (taskId != 0xff) + if (taskId != TASK_NONE) { data = gTasks[taskId].data; data[1] = 0; @@ -635,9 +635,12 @@ static void AshGrassPerStepCallback(u8 taskId) } } +// This function uses the constants for gTileset_Cave's metatile labels, but other tilesets with +// the CrackedFloorPerStepCallback callback use the same metatile numbers for the cracked floor +// and hole metatiles, such as gTileset_MirageTower. static void SetCrackedFloorHoleMetatile(s16 x, s16 y) { - MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237);// unsure what these are referring to + MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == METATILE_Cave_CrackedFloor ? METATILE_Cave_CrackedFloor_Hole : METATILE_Pacifidlog_SkyPillar_CrackedFloor_Hole); CurrentMapDrawMetatileAt(x, y); } diff --git a/src/field_weather.c b/src/field_weather.c index 25ee0582a..4b9c6a863 100644 --- a/src/field_weather.c +++ b/src/field_weather.c @@ -154,18 +154,17 @@ static const u8 sBasePaletteGammaTypes[32] = GAMMA_NORMAL, }; -const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); +const u16 gFogPalette[] = INCBIN_U16("graphics/weather/fog.gbapal"); -// code void StartWeather(void) { if (!FuncIsActiveTask(Task_WeatherMain)) { - u8 index = AllocSpritePalette(0x1200); - CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); + u8 index = AllocSpritePalette(TAG_WEATHER_START); + CpuCopy32(gFogPalette, &gPlttBufferUnfaded[0x100 + index * 16], 32); BuildGammaShiftTables(); gWeatherPtr->altGammaSpritePalIndex = index; - gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); + gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(PALTAG_WEATHER_2); gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->curRainSpriteIndex = 0; gWeatherPtr->cloudSpritesCreated = 0; @@ -366,8 +365,8 @@ static void UpdateWeatherGammaShift(void) static void FadeInScreenWithWeather(void) { - if (++gWeatherPtr->unknown_6CB > 1) - gWeatherPtr->unknown_6CA = 0; + if (++gWeatherPtr->fadeInTimer > 1) + gWeatherPtr->fadeInFirstFrame = FALSE; switch (gWeatherPtr->currWeather) { @@ -494,7 +493,7 @@ static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) r = gammaTable[baseColor.r]; g = gammaTable[baseColor.g]; b = gammaTable[baseColor.b]; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; + gPlttBufferFaded[palOffset++] = RGB2(r, g, b); } } @@ -579,7 +578,7 @@ static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaI r += ((rBlend - r) * blendCoeff) >> 4; g += ((gBlend - g) * blendCoeff) >> 4; b += ((bBlend - b) * blendCoeff) >> 4; - gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; + gPlttBufferFaded[palOffset++] = RGB2(r, g, b); } } @@ -636,7 +635,7 @@ static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 bl g2 += ((gBlend - g2) * blendCoeff) >> 4; b2 += ((bBlend - b2) * blendCoeff) >> 4; - gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; + gPlttBufferFaded[palOffset++] = RGB2(r2, g2, b2); } } } @@ -678,7 +677,7 @@ static void ApplyFogBlend(u8 blendCoeff, u16 blendColor) g += ((gBlend - g) * blendCoeff) >> 4; b += ((bBlend - b) * blendCoeff) >> 4; - gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; + gPlttBufferFaded[palOffset] = RGB2(r, g, b); palOffset++; } } @@ -711,7 +710,7 @@ static bool8 LightenSpritePaletteInFog(u8 paletteIndex) return FALSE; } -void sub_80ABC48(s8 gammaIndex) +void ApplyWeatherGammaShiftIfIdle(s8 gammaIndex) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { @@ -729,7 +728,7 @@ void sub_80ABC7C(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) gWeatherPtr->gammaTargetIndex = gammaTargetIndex; gWeatherPtr->gammaStepFrameCounter = 0; gWeatherPtr->gammaStepDelay = gammaStepDelay; - sub_80ABC48(gammaIndex); + ApplyWeatherGammaShiftIfIdle(gammaIndex); } } @@ -782,7 +781,7 @@ void FadeScreen(u8 mode, s8 delay) if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); - BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); + BeginNormalPaletteFade(PALETTES_ALL, delay, 0, 16, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else @@ -791,11 +790,11 @@ void FadeScreen(u8 mode, s8 delay) if (useWeatherPal) gWeatherPtr->fadeScreenCounter = 0; else - BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); + BeginNormalPaletteFade(PALETTES_ALL, delay, 16, 0, fadeColor); gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; - gWeatherPtr->unknown_6CA = 1; - gWeatherPtr->unknown_6CB = 0; + gWeatherPtr->fadeInFirstFrame = TRUE; + gWeatherPtr->fadeInTimer = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); gWeatherPtr->readyForInit = TRUE; } @@ -814,7 +813,7 @@ void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) switch (gWeatherPtr->palProcessingState) { case WEATHER_PAL_STATE_SCREEN_FADING_IN: - if (gWeatherPtr->unknown_6CA != 0) + if (gWeatherPtr->fadeInFirstFrame) { if (gWeatherPtr->currWeather == WEATHER_FOG_HORIZONTAL) MarkFogSpritePalToLighten(paletteIndex); @@ -849,12 +848,13 @@ void ApplyWeatherGammaShiftToPal(u8 paletteIndex) ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } -u8 sub_80ABF20(void) +// Unused +static bool8 IsFirstFrameOfWeatherFadeIn(void) { if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) - return gWeatherPtr->unknown_6CA; + return gWeatherPtr->fadeInFirstFrame; else - return 0; + return FALSE; } void LoadCustomWeatherSpritePalette(const u16 *palette) @@ -886,50 +886,50 @@ bool8 LoadDroughtWeatherPalettes(void) return FALSE; } -void sub_80ABFE0(s8 gammaIndex) +static void SetDroughtGamma(s8 gammaIndex) { - sub_80ABC48(-gammaIndex - 1); + ApplyWeatherGammaShiftIfIdle(-gammaIndex - 1); } -void sub_80ABFF0(void) +void DroughtStateInit(void) { - gWeatherPtr->unknown_73C = 0; - gWeatherPtr->unknown_740 = 0; - gWeatherPtr->unknown_742 = 0; - gWeatherPtr->unknown_73E = 0; + gWeatherPtr->droughtBrightnessStage = 0; + gWeatherPtr->droughtTimer = 0; + gWeatherPtr->droughtState = 0; + gWeatherPtr->droughtLastBrightnessStage = 0; } -void sub_80AC01C(void) +void DroughtStateRun(void) { - switch (gWeatherPtr->unknown_742) + switch (gWeatherPtr->droughtState) { case 0: - if (++gWeatherPtr->unknown_740 > 5) + if (++gWeatherPtr->droughtTimer > 5) { - gWeatherPtr->unknown_740 = 0; - sub_80ABFE0(gWeatherPtr->unknown_73C++); - if (gWeatherPtr->unknown_73C > 5) + gWeatherPtr->droughtTimer = 0; + SetDroughtGamma(gWeatherPtr->droughtBrightnessStage++); + if (gWeatherPtr->droughtBrightnessStage > 5) { - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; - gWeatherPtr->unknown_742 = 1; - gWeatherPtr->unknown_740 = 0x3C; + gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage; + gWeatherPtr->droughtState = 1; + gWeatherPtr->droughtTimer = 60; } } break; case 1: - gWeatherPtr->unknown_740 = (gWeatherPtr->unknown_740 + 3) & 0x7F; - gWeatherPtr->unknown_73C = ((gSineTable[gWeatherPtr->unknown_740] - 1) >> 6) + 2; - if (gWeatherPtr->unknown_73C != gWeatherPtr->unknown_73E) - sub_80ABFE0(gWeatherPtr->unknown_73C); - gWeatherPtr->unknown_73E = gWeatherPtr->unknown_73C; + gWeatherPtr->droughtTimer = (gWeatherPtr->droughtTimer + 3) & 0x7F; + gWeatherPtr->droughtBrightnessStage = ((gSineTable[gWeatherPtr->droughtTimer] - 1) >> 6) + 2; + if (gWeatherPtr->droughtBrightnessStage != gWeatherPtr->droughtLastBrightnessStage) + SetDroughtGamma(gWeatherPtr->droughtBrightnessStage); + gWeatherPtr->droughtLastBrightnessStage = gWeatherPtr->droughtBrightnessStage; break; case 2: - if (++gWeatherPtr->unknown_740 > 5) + if (++gWeatherPtr->droughtTimer > 5) { - gWeatherPtr->unknown_740 = 0; - sub_80ABFE0(--gWeatherPtr->unknown_73C); - if (gWeatherPtr->unknown_73C == 3) - gWeatherPtr->unknown_742 = 0; + gWeatherPtr->droughtTimer = 0; + SetDroughtGamma(--gWeatherPtr->droughtBrightnessStage); + if (gWeatherPtr->droughtBrightnessStage == 3) + gWeatherPtr->droughtState = 0; } break; } @@ -990,38 +990,39 @@ bool8 Weather_UpdateBlend(void) return FALSE; } -void sub_80AC274(u8 a) +// Unused. Uses the same numbering scheme as the coord events +static void SetFieldWeather(u8 weather) { - switch (a) + switch (weather) { - case 1: + case COORD_EVENT_WEATHER_SUNNY_CLOUDS: SetWeather(WEATHER_SUNNY_CLOUDS); break; - case 2: + case COORD_EVENT_WEATHER_SUNNY: SetWeather(WEATHER_SUNNY); break; - case 3: + case COORD_EVENT_WEATHER_RAIN: SetWeather(WEATHER_RAIN); break; - case 4: + case COORD_EVENT_WEATHER_SNOW: SetWeather(WEATHER_SNOW); break; - case 5: + case COORD_EVENT_WEATHER_RAIN_THUNDERSTORM: SetWeather(WEATHER_RAIN_THUNDERSTORM); break; - case 6: + case COORD_EVENT_WEATHER_FOG_HORIZONTAL: SetWeather(WEATHER_FOG_HORIZONTAL); break; - case 7: + case COORD_EVENT_WEATHER_FOG_DIAGONAL: SetWeather(WEATHER_FOG_DIAGONAL); break; - case 8: + case COORD_EVENT_WEATHER_VOLCANIC_ASH: SetWeather(WEATHER_VOLCANIC_ASH); break; - case 9: + case COORD_EVENT_WEATHER_SANDSTORM: SetWeather(WEATHER_SANDSTORM); break; - case 10: + case COORD_EVENT_WEATHER_SHADE: SetWeather(WEATHER_SHADE); break; } @@ -1085,7 +1086,7 @@ void SetWeatherScreenFadeOut(void) gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } -void sub_80AC3E4(void) +void SetWeatherPalStateIdle(void) { gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } diff --git a/src/field_weather_effect.c b/src/field_weather_effect.c index 320a10670..0d1e6958c 100644 --- a/src/field_weather_effect.c +++ b/src/field_weather_effect.c @@ -51,7 +51,7 @@ static const struct SpriteSheet sCloudSpriteSheet = { .data = gWeatherCloudTiles, .size = sizeof(gWeatherCloudTiles), - .tag = 0x1200 + .tag = GFXTAG_CLOUD }; static const struct OamData sCloudSpriteOamData = @@ -84,8 +84,8 @@ static const union AnimCmd *const sCloudSpriteAnimCmds[] = static const struct SpriteTemplate sCloudSpriteTemplate = { - .tileTag = 0x1200, - .paletteTag = 0x1201, + .tileTag = GFXTAG_CLOUD, + .paletteTag = PALTAG_WEATHER_2, .oam = &sCloudSpriteOamData, .anims = sCloudSpriteAnimCmds, .images = NULL, @@ -214,7 +214,7 @@ static void DestroyCloudSprites(void) DestroySprite(gWeatherPtr->sprites.s1.cloudSprites[i]); } - FreeSpriteTilesByTag(0x1200); + FreeSpriteTilesByTag(GFXTAG_CLOUD); gWeatherPtr->cloudSpritesCreated = FALSE; } @@ -264,19 +264,19 @@ void Drought_Main(void) gWeatherPtr->initStep++; break; case 3: - sub_80ABFF0(); + DroughtStateInit(); gWeatherPtr->initStep++; break; case 4: - sub_80AC01C(); - if (gWeatherPtr->unknown_73C == 6) + DroughtStateRun(); + if (gWeatherPtr->droughtBrightnessStage == 6) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; default: - sub_80AC01C(); + DroughtStateRun(); break; } } @@ -288,7 +288,7 @@ bool8 Drought_Finish(void) void StartDroughtWeatherBlend(void) { - CreateTask(UpdateDroughtBlend, 0x50); + CreateTask(UpdateDroughtBlend, 80); } #define tState data[0] @@ -306,7 +306,7 @@ static void UpdateDroughtBlend(u8 taskId) task->tBlendY = 0; task->tBlendDelay = 0; task->tWinRange = REG_WININ; - SetGpuReg(REG_OFFSET_WININ, WIN_RANGE(63, 63)); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL | WININ_WIN1_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0); task->tState++; @@ -437,8 +437,8 @@ static const union AnimCmd *const sRainSpriteAnimCmds[] = static const struct SpriteTemplate sRainSpriteTemplate = { - .tileTag = 4614, - .paletteTag = 0x1200, + .tileTag = GFXTAG_RAIN, + .paletteTag = PALTAG_WEATHER, .oam = &sRainSpriteOamData, .anims = sRainSpriteAnimCmds, .images = NULL, @@ -466,7 +466,7 @@ static const struct SpriteSheet sRainSpriteSheet = { .data = gWeatherRainTiles, .size = sizeof(gWeatherRainTiles), - .tag = 0x1206, + .tag = GFXTAG_RAIN, }; void Rain_InitVars(void) @@ -677,7 +677,7 @@ static bool8 CreateRainSprite(void) if (spriteId != MAX_SPRITES) { - gSprites[spriteId].tActive = 0; + gSprites[spriteId].tActive = FALSE; gSprites[spriteId].tRandom = spriteIndex * 145; while (gSprites[spriteId].tRandom >= 600) gSprites[spriteId].tRandom -= 600; @@ -722,12 +722,12 @@ static bool8 UpdateVisibleRainSprites(void) gWeatherPtr->rainSpriteVisibleCounter = 0; if (gWeatherPtr->curRainSpriteIndex < gWeatherPtr->targetRainSpriteCount) { - gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = 1; + gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex++]->tActive = TRUE; } else { gWeatherPtr->curRainSpriteIndex--; - gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->tActive = 0; + gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->tActive = FALSE; gWeatherPtr->sprites.s1.rainSprites[gWeatherPtr->curRainSpriteIndex]->invisible = TRUE; } } @@ -744,7 +744,7 @@ static void DestroyRainSprites(void) DestroySprite(gWeatherPtr->sprites.s1.rainSprites[i]); } gWeatherPtr->rainSpriteCount = 0; - FreeSpriteTilesByTag(0x1206); + FreeSpriteTilesByTag(GFXTAG_RAIN); } #undef tCounter @@ -879,7 +879,7 @@ static const union AnimCmd *const sSnowflakeAnimCmds[] = static const struct SpriteTemplate sSnowflakeSpriteTemplate = { .tileTag = 0xFFFF, - .paletteTag = 0x1200, + .paletteTag = PALTAG_WEATHER, .oam = &sSnowflakeSpriteOamData, .anims = sSnowflakeAnimCmds, .images = sSnowflakeSpriteImages, @@ -941,13 +941,14 @@ static void InitSnowflakeSpriteMovement(struct Sprite *sprite) static void WaitSnowflakeSprite(struct Sprite *sprite) { - if (gWeatherPtr->unknown_6E2 > 18) + // Timer is never incremented + if (gWeatherPtr->snowflakeTimer > 18) { sprite->invisible = FALSE; sprite->callback = UpdateSnowflakeSprite; sprite->pos1.y = 250 - (gSpriteCoordOffsetY + sprite->centerToCornerVecY); sprite->tPosY = sprite->pos1.y * 128; - gWeatherPtr->unknown_6E2 = 0; + gWeatherPtr->snowflakeTimer = 0; } } @@ -1011,9 +1012,32 @@ static void UpdateSnowflakeSprite(struct Sprite *sprite) // WEATHER_RAIN_THUNDERSTORM //------------------------------------------------------------------------------ +enum { + // This block of states is run only once + // when first setting up the thunderstorm + TSTORM_STATE_LOAD_RAIN, + TSTORM_STATE_CREATE_RAIN, + TSTORM_STATE_INIT_RAIN, + TSTORM_STATE_WAIT_CHANGE, + + // The thunderstorm loops through these states, + // not necessarily in order. + TSTORM_STATE_LOOP_START, + TSTORM_STATE_LOOP_WAIT, + TSTORM_STATE_INIT_THUNDER_SHORT_1, + TSTORM_STATE_INIT_THUNDER_SHORT_2, + TSTORM_STATE_TRY_THUNDER_SHORT, + TSTORM_STATE_TRY_NEW_THUNDER, + TSTORM_STATE_WAIT_THUNDER_SHORT, + TSTORM_STATE_INIT_THUNDER_LONG, + TSTORM_STATE_WAIT_THUNDER_LONG, + TSTORM_STATE_FADE_THUNDER_LONG, + TSTORM_STATE_END_THUNDER_LONG, +}; + void Thunderstorm_InitVars(void) { - gWeatherPtr->initStep = 0; + gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleDelay = 4; @@ -1022,7 +1046,7 @@ void Thunderstorm_InitVars(void) gWeatherPtr->gammaTargetIndex = 3; gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment - gWeatherPtr->thunderTriggered = 0; + gWeatherPtr->thunderTriggered = FALSE; SetRainStrengthFromSoundEffect(SE_THUNDERSTORM); } @@ -1042,7 +1066,7 @@ static void SetThunderCounter(u16); void Downpour_InitVars(void) { - gWeatherPtr->initStep = 0; + gWeatherPtr->initStep = TSTORM_STATE_LOAD_RAIN; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->rainSpriteVisibleCounter = 0; gWeatherPtr->rainSpriteVisibleDelay = 4; @@ -1066,100 +1090,105 @@ void Thunderstorm_Main(void) UpdateThunderSound(); switch (gWeatherPtr->initStep) { - case 0: + case TSTORM_STATE_LOAD_RAIN: LoadRainSpriteSheet(); gWeatherPtr->initStep++; break; - case 1: + case TSTORM_STATE_CREATE_RAIN: if (!CreateRainSprite()) gWeatherPtr->initStep++; break; - case 2: + case TSTORM_STATE_INIT_RAIN: if (!UpdateVisibleRainSprites()) { gWeatherPtr->weatherGfxLoaded = TRUE; gWeatherPtr->initStep++; } break; - case 3: + case TSTORM_STATE_WAIT_CHANGE: if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) - gWeatherPtr->initStep = 6; + gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_SHORT_1; break; - case 4: - gWeatherPtr->unknown_6EA = 1; - gWeatherPtr->unknown_6E6 = (Random() % 360) + 360; + case TSTORM_STATE_LOOP_START: + gWeatherPtr->thunderAllowEnd = TRUE; + gWeatherPtr->thunderDelay = (Random() % 360) + 360; gWeatherPtr->initStep++; // fall through - case 5: - if (--gWeatherPtr->unknown_6E6 == 0) + case TSTORM_STATE_LOOP_WAIT: + // Wait between 360-720 frames before trying thunder again + if (--gWeatherPtr->thunderDelay == 0) gWeatherPtr->initStep++; break; - case 6: - gWeatherPtr->unknown_6EA = 1; - gWeatherPtr->unknown_6EB = Random() % 2; + case TSTORM_STATE_INIT_THUNDER_SHORT_1: + gWeatherPtr->thunderAllowEnd = TRUE; + gWeatherPtr->thunderSkipShort = Random() % 2; gWeatherPtr->initStep++; break; - case 7: - gWeatherPtr->unknown_6EC = (Random() & 1) + 1; + case TSTORM_STATE_INIT_THUNDER_SHORT_2: + gWeatherPtr->thunderShortRetries = (Random() & 1) + 1; gWeatherPtr->initStep++; // fall through - case 8: - sub_80ABC48(19); - if (gWeatherPtr->unknown_6EB == 0 && gWeatherPtr->unknown_6EC == 1) - SetThunderCounter(20); + case TSTORM_STATE_TRY_THUNDER_SHORT: + ApplyWeatherGammaShiftIfIdle(19); + if (!gWeatherPtr->thunderSkipShort && gWeatherPtr->thunderShortRetries == 1) + SetThunderCounter(20); // Do short thunder - gWeatherPtr->unknown_6E6 = (Random() % 3) + 6; + gWeatherPtr->thunderDelay = (Random() % 3) + 6; gWeatherPtr->initStep++; break; - case 9: - if (--gWeatherPtr->unknown_6E6 == 0) + case TSTORM_STATE_TRY_NEW_THUNDER: + if (--gWeatherPtr->thunderDelay == 0) { - sub_80ABC48(3); - gWeatherPtr->unknown_6EA = 1; - if (--gWeatherPtr->unknown_6EC != 0) + ApplyWeatherGammaShiftIfIdle(3); + gWeatherPtr->thunderAllowEnd = TRUE; + if (--gWeatherPtr->thunderShortRetries != 0) { - gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; - gWeatherPtr->initStep = 10; + // Try a short thunder again + gWeatherPtr->thunderDelay = (Random() % 16) + 60; + gWeatherPtr->initStep = TSTORM_STATE_WAIT_THUNDER_SHORT; } - else if (gWeatherPtr->unknown_6EB == 0) + else if (!gWeatherPtr->thunderSkipShort) { - gWeatherPtr->initStep = 4; + // No more thunder, restart loop + gWeatherPtr->initStep = TSTORM_STATE_LOOP_START; } else { - gWeatherPtr->initStep = 11; + // Set up long thunder + gWeatherPtr->initStep = TSTORM_STATE_INIT_THUNDER_LONG; } } break; - case 10: - if (--gWeatherPtr->unknown_6E6 == 0) - gWeatherPtr->initStep = 8; + case TSTORM_STATE_WAIT_THUNDER_SHORT: + if (--gWeatherPtr->thunderDelay == 0) + gWeatherPtr->initStep = TSTORM_STATE_TRY_THUNDER_SHORT; break; - case 11: - gWeatherPtr->unknown_6E6 = (Random() % 16) + 60; + case TSTORM_STATE_INIT_THUNDER_LONG: + gWeatherPtr->thunderDelay = (Random() % 16) + 60; gWeatherPtr->initStep++; break; - case 12: - if (--gWeatherPtr->unknown_6E6 == 0) + case TSTORM_STATE_WAIT_THUNDER_LONG: + if (--gWeatherPtr->thunderDelay == 0) { + // Do long thunder SetThunderCounter(100); - sub_80ABC48(19); - gWeatherPtr->unknown_6E6 = (Random() & 0xF) + 30; + ApplyWeatherGammaShiftIfIdle(19); + gWeatherPtr->thunderDelay = (Random() & 0xF) + 30; gWeatherPtr->initStep++; } break; - case 13: - if (--gWeatherPtr->unknown_6E6 == 0) + case TSTORM_STATE_FADE_THUNDER_LONG: + if (--gWeatherPtr->thunderDelay == 0) { sub_80ABC7C(19, 3, 5); gWeatherPtr->initStep++; } break; - case 14: + case TSTORM_STATE_END_THUNDER_LONG: if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - gWeatherPtr->unknown_6EA = 1; - gWeatherPtr->initStep = 4; + gWeatherPtr->thunderAllowEnd = TRUE; + gWeatherPtr->initStep = TSTORM_STATE_LOOP_START; } break; } @@ -1170,12 +1199,12 @@ bool8 Thunderstorm_Finish(void) switch (gWeatherPtr->finishStep) { case 0: - gWeatherPtr->unknown_6EA = 0; + gWeatherPtr->thunderAllowEnd = FALSE; gWeatherPtr->finishStep++; // fall through case 1: Thunderstorm_Main(); - if (gWeatherPtr->unknown_6EA) + if (gWeatherPtr->thunderAllowEnd) { if (gWeatherPtr->nextWeather == WEATHER_RAIN || gWeatherPtr->nextWeather == WEATHER_RAIN_THUNDERSTORM @@ -1203,16 +1232,16 @@ bool8 Thunderstorm_Finish(void) static void SetThunderCounter(u16 max) { - if (gWeatherPtr->thunderTriggered == 0) + if (!gWeatherPtr->thunderTriggered) { gWeatherPtr->thunderCounter = Random() % max; - gWeatherPtr->thunderTriggered = 1; + gWeatherPtr->thunderTriggered = TRUE; } } static void UpdateThunderSound(void) { - if (gWeatherPtr->thunderTriggered == 1) + if (gWeatherPtr->thunderTriggered == TRUE) { if (gWeatherPtr->thunderCounter == 0) { @@ -1224,7 +1253,7 @@ static void UpdateThunderSound(void) else PlaySE(SE_THUNDER2); - gWeatherPtr->thunderTriggered = 0; + gWeatherPtr->thunderTriggered = FALSE; } else { @@ -1237,10 +1266,9 @@ static void UpdateThunderSound(void) // WEATHER_FOG_HORIZONTAL and WEATHER_UNDERWATER //------------------------------------------------------------------------------ -// unused data -static const u16 unusedData_839AB1C[] = {0, 6, 6, 12, 18, 42, 300, 300}; +static const u16 sUnusedData[] = {0, 6, 6, 12, 18, 42, 300, 300}; -static const struct OamData gOamData_839AB2C = +static const struct OamData sOamData_FogH = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -1257,72 +1285,72 @@ static const struct OamData gOamData_839AB2C = .affineParam = 0, }; -static const union AnimCmd gSpriteAnim_839AB34[] = +static const union AnimCmd sAnim_FogH_0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_END, }; -static const union AnimCmd gSpriteAnim_839AB3C[] = +static const union AnimCmd sAnim_FogH_1[] = { ANIMCMD_FRAME(32, 16), ANIMCMD_END, }; -static const union AnimCmd gSpriteAnim_839AB44[] = +static const union AnimCmd sAnim_FogH_2[] = { ANIMCMD_FRAME(64, 16), ANIMCMD_END, }; -static const union AnimCmd gSpriteAnim_839AB4C[] = +static const union AnimCmd sAnim_FogH_3[] = { ANIMCMD_FRAME(96, 16), ANIMCMD_END, }; -static const union AnimCmd gSpriteAnim_839AB54[] = +static const union AnimCmd sAnim_FogH_4[] = { ANIMCMD_FRAME(128, 16), ANIMCMD_END, }; -static const union AnimCmd gSpriteAnim_839AB5C[] = +static const union AnimCmd sAnim_FogH_5[] = { ANIMCMD_FRAME(160, 16), ANIMCMD_END, }; -static const union AnimCmd *const gSpriteAnimTable_839AB64[] = +static const union AnimCmd *const sAnims_FogH[] = { - gSpriteAnim_839AB34, - gSpriteAnim_839AB3C, - gSpriteAnim_839AB44, - gSpriteAnim_839AB4C, - gSpriteAnim_839AB54, - gSpriteAnim_839AB5C, + sAnim_FogH_0, + sAnim_FogH_1, + sAnim_FogH_2, + sAnim_FogH_3, + sAnim_FogH_4, + sAnim_FogH_5, }; -static const union AffineAnimCmd gSpriteAffineAnim_839AB7C[] = +static const union AffineAnimCmd sAffineAnim_FogH[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_839AB8C[] = +static const union AffineAnimCmd *const sAffineAnims_FogH[] = { - gSpriteAffineAnim_839AB7C, + sAffineAnim_FogH, }; static void FogHorizontalSpriteCallback(struct Sprite *); static const struct SpriteTemplate sFogHorizontalSpriteTemplate = { - .tileTag = 0x1201, - .paletteTag = 0x1200, - .oam = &gOamData_839AB2C, - .anims = gSpriteAnimTable_839AB64, + .tileTag = GFXTAG_FOG_H, + .paletteTag = PALTAG_WEATHER, + .oam = &sOamData_FogH, + .anims = sAnims_FogH, .images = NULL, - .affineAnims = gSpriteAffineAnimTable_839AB8C, + .affineAnims = sAffineAnims_FogH, .callback = FogHorizontalSpriteCallback, }; @@ -1433,7 +1461,7 @@ static void CreateFogHorizontalSprites(void) struct SpriteSheet fogHorizontalSpriteSheet = { .data = gWeatherFogHorizontalTiles, .size = sizeof(gWeatherFogHorizontalTiles), - .tag = 0x1201, + .tag = GFXTAG_FOG_H, }; LoadSpriteSheet(&fogHorizontalSpriteSheet); for (i = 0; i < NUM_FOG_HORIZONTAL_SPRITES; i++) @@ -1469,7 +1497,7 @@ static void DestroyFogHorizontalSprites(void) DestroySprite(gWeatherPtr->sprites.s2.fogHSprites[i]); } - FreeSpriteTilesByTag(0x1201); + FreeSpriteTilesByTag(GFXTAG_FOG_H); gWeatherPtr->fogHSpritesCreated = 0; } } @@ -1491,7 +1519,7 @@ void Ash_InitVars(void) gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->gammaTargetIndex = 0; gWeatherPtr->gammaStepDelay = 20; - gWeatherPtr->unknown_6FE = 20; + gWeatherPtr->ashUnused = 20; // Never read if (!gWeatherPtr->ashSpritesCreated) { Weather_SetBlendCoeffs(0, 16); @@ -1509,8 +1537,8 @@ void Ash_InitAll(void) void Ash_Main(void) { gWeatherPtr->ashBaseSpritesX = gSpriteCoordOffsetX & 0x1FF; - while (gWeatherPtr->ashBaseSpritesX >= 240) - gWeatherPtr->ashBaseSpritesX -= 240; + while (gWeatherPtr->ashBaseSpritesX >= DISPLAY_WIDTH) + gWeatherPtr->ashBaseSpritesX -= DISPLAY_WIDTH; switch (gWeatherPtr->initStep) { @@ -1567,7 +1595,7 @@ static const struct SpriteSheet sAshSpriteSheet = { .data = gWeatherAshTiles, .size = sizeof(gWeatherAshTiles), - .tag = 0x1202, + .tag = GFXTAG_ASH, }; static void LoadAshSpriteSheet(void) @@ -1603,8 +1631,8 @@ static const union AnimCmd *const sAshSpriteAnimCmds[] = static const struct SpriteTemplate sAshSpriteTemplate = { - .tileTag = 4610, - .paletteTag = 0x1200, + .tileTag = GFXTAG_ASH, + .paletteTag = PALTAG_WEATHER, .oam = &sAshSpriteOamData, .anims = sAshSpriteAnimCmds, .images = NULL, @@ -1659,7 +1687,7 @@ static void DestroyAshSprites(void) DestroySprite(gWeatherPtr->sprites.s2.ashSprites[i]); } - FreeSpriteTilesByTag(0x1202); + FreeSpriteTilesByTag(GFXTAG_ASH); gWeatherPtr->ashSpritesCreated = FALSE; } } @@ -1790,7 +1818,7 @@ static const struct SpriteSheet gFogDiagonalSpriteSheet = { .data = gWeatherFogDiagonalTiles, .size = sizeof(gWeatherFogDiagonalTiles), - .tag = 0x1203, + .tag = GFXTAG_FOG_D, }; static const struct OamData sFogDiagonalSpriteOamData = @@ -1820,8 +1848,8 @@ static const union AnimCmd *const sFogDiagonalSpriteAnimCmds[] = static const struct SpriteTemplate sFogDiagonalSpriteTemplate = { - .tileTag = 0x1203, - .paletteTag = 0x1200, + .tileTag = GFXTAG_FOG_D, + .paletteTag = PALTAG_WEATHER, .oam = &sFogDiagonalSpriteOamData, .anims = sFogDiagonalSpriteAnimCmds, .images = NULL, @@ -1875,7 +1903,7 @@ static void DestroyFogDiagonalSprites(void) DestroySprite(gWeatherPtr->sprites.s2.fogDSprites[i]); } - FreeSpriteTilesByTag(0x1203); + FreeSpriteTilesByTag(GFXTAG_FOG_D); gWeatherPtr->fogDSpritesCreated = FALSE; } } @@ -2018,7 +2046,7 @@ static void DestroySandstormSprites(void) } gWeatherPtr->sandstormSpritesCreated = FALSE; - FreeSpriteTilesByTag(0x1204); + FreeSpriteTilesByTag(GFXTAG_SANDSTORM); } if (gWeatherPtr->sandstormSwirlSpritesCreated) @@ -2067,8 +2095,8 @@ static const union AnimCmd *const sSandstormSpriteAnimCmds[] = static const struct SpriteTemplate sSandstormSpriteTemplate = { - .tileTag = 0x1204, - .paletteTag = 0x1201, + .tileTag = GFXTAG_SANDSTORM, + .paletteTag = PALTAG_WEATHER_2, .oam = &sSandstormSpriteOamData, .anims = sSandstormSpriteAnimCmds, .images = NULL, @@ -2080,7 +2108,7 @@ static const struct SpriteSheet sSandstormSpriteSheet = { .data = gWeatherSandstormTiles, .size = sizeof(gWeatherSandstormTiles), - .tag = 0x1204, + .tag = GFXTAG_SANDSTORM, }; // Regular sandstorm sprites @@ -2242,7 +2270,7 @@ static const struct SpriteSheet sWeatherBubbleSpriteSheet = { .data = gWeatherBubbleTiles, .size = sizeof(gWeatherBubbleTiles), - .tag = 0x1205, + .tag = GFXTAG_BUBBLE, }; static const s16 sBubbleStartCoords[][2] = @@ -2322,8 +2350,8 @@ static const union AnimCmd *const sBubbleSpriteAnimCmds[] = static const struct SpriteTemplate sBubbleSpriteTemplate = { - .tileTag = 0x1205, - .paletteTag = 0x1200, + .tileTag = GFXTAG_BUBBLE, + .paletteTag = PALTAG_WEATHER, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = sBubbleSpriteAnimCmds, .images = NULL, @@ -2363,7 +2391,7 @@ static void DestroyBubbleSprites(void) DestroySprite(&gSprites[i]); } - FreeSpriteTilesByTag(0x1205); + FreeSpriteTilesByTag(GFXTAG_BUBBLE); gWeatherPtr->bubblesSpriteCount = 0; } } diff --git a/src/fieldmap.c b/src/fieldmap.c index 49337ebbe..e437ea7fc 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -15,6 +15,7 @@ #include "trainer_hill.h" #include "tv.h" #include "constants/rgb.h" +#include "constants/metatile_behaviors.h" struct ConnectionFlags { @@ -28,7 +29,7 @@ EWRAM_DATA static u16 gBackupMapData[MAX_MAP_DATA_SIZE] = {0}; EWRAM_DATA struct MapHeader gMapHeader = {0}; EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags gMapConnectionFlags = {0}; -EWRAM_DATA static u32 sFiller_02037344 = 0; // without this, the next file won't align properly +EWRAM_DATA static u32 sFiller = 0; // without this, the next file won't align properly struct BackupMapLayout gBackupMapLayout; @@ -43,6 +44,24 @@ static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHead static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader); static void LoadSavedMapView(void); static bool8 SkipCopyingMetatileFromSavedMap(u16* mapMetatilePtr, u16 mapWidth, u8 yMode); +static struct MapConnection *GetIncomingConnection(u8 direction, int x, int y); +static bool8 IsPosInIncomingConnectingMap(u8 direction, int x, int y, struct MapConnection *connection); +static bool8 IsCoordInIncomingConnectingMap(int coord, int srcMax, int destMax, int offset); + +#define MapGridGetBorderTileAt(x, y) ({ \ + u16 block; \ + int i; \ + u16 *border = gMapHeader.mapLayout->border; \ + \ + i = (x + 1) & 1; \ + i += ((y + 1) & 1) * 2; \ + \ + block = gMapHeader.mapLayout->border[i] | METATILE_COLLISION_MASK; \ +}) + +#define AreCoordsWithinMapGridBounds(x, y) (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height) + +#define MapGridGetTileAt(x, y) (AreCoordsWithinMapGridBounds(x, y) ? gBackupMapLayout.map[x + gBackupMapLayout.width * y] : MapGridGetBorderTileAt(x, y)) struct MapHeader const *const GetMapHeaderFromConnection(struct MapConnection *connection) { @@ -68,13 +87,13 @@ void InitMapFromSavedGame(void) void InitBattlePyramidMap(bool8 setPlayerPosition) { - CpuFastFill(0x03ff03ff, gBackupMapData, sizeof(gBackupMapData)); + CpuFastFill(METATILE_ID_UNDEFINED << 16 | METATILE_ID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData)); GenerateBattlePyramidFloorLayout(gBackupMapData, setPlayerPosition); } void InitTrainerHillMap(void) { - CpuFastFill(0x03ff03ff, gBackupMapData, sizeof(gBackupMapData)); + CpuFastFill(METATILE_ID_UNDEFINED << 16 | METATILE_ID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData)); GenerateTrainerHillFloorLayout(gBackupMapData); } @@ -84,7 +103,7 @@ static void InitMapLayoutData(struct MapHeader *mapHeader) int width; int height; mapLayout = mapHeader->mapLayout; - CpuFastFill16(0x03ff, gBackupMapData, sizeof(gBackupMapData)); + CpuFastFill16(METATILE_ID_UNDEFINED, gBackupMapData, sizeof(gBackupMapData)); gBackupMapLayout.map = gBackupMapData; width = mapLayout->width + 15; gBackupMapLayout.width = width; @@ -130,26 +149,26 @@ static void InitBackupMapLayoutConnections(struct MapHeader *mapHeader) { case CONNECTION_SOUTH: FillSouthConnection(mapHeader, cMap, offset); - gMapConnectionFlags.south = 1; + gMapConnectionFlags.south = TRUE; break; case CONNECTION_NORTH: FillNorthConnection(mapHeader, cMap, offset); - gMapConnectionFlags.north = 1; + gMapConnectionFlags.north = TRUE; break; case CONNECTION_WEST: FillWestConnection(mapHeader, cMap, offset); - gMapConnectionFlags.west = 1; + gMapConnectionFlags.west = TRUE; break; case CONNECTION_EAST: FillEastConnection(mapHeader, cMap, offset); - gMapConnectionFlags.east = 1; + gMapConnectionFlags.east = TRUE; break; } } } } -static void sub_8087F54(int x, int y, struct MapHeader const *connectedMapHeader, int x2, int y2, int width, int height) +static void FillConnection(int x, int y, struct MapHeader const *connectedMapHeader, int x2, int y2, int width, int height) { int i; u16 *src; @@ -185,29 +204,21 @@ static void FillSouthConnection(struct MapHeader const *mapHeader, struct MapHea x2 = -x; x += cWidth; if (x < gBackupMapLayout.width) - { width = x; - } else - { width = gBackupMapLayout.width; - } x = 0; } else { x2 = 0; if (x + cWidth < gBackupMapLayout.width) - { width = cWidth; - } else - { width = gBackupMapLayout.width - x; - } } - sub_8087F54( + FillConnection( x, y, connectedMapHeader, x2, /*y2*/ 0, @@ -233,29 +244,21 @@ static void FillNorthConnection(struct MapHeader const *mapHeader, struct MapHea x2 = -x; x += cWidth; if (x < gBackupMapLayout.width) - { width = x; - } else - { width = gBackupMapLayout.width; - } x = 0; } else { x2 = 0; if (x + cWidth < gBackupMapLayout.width) - { width = cWidth; - } else - { width = gBackupMapLayout.width - x; - } } - sub_8087F54( + FillConnection( x, /*y*/ 0, connectedMapHeader, x2, y2, @@ -280,29 +283,21 @@ static void FillWestConnection(struct MapHeader const *mapHeader, struct MapHead { y2 = -y; if (y + cHeight < gBackupMapLayout.height) - { height = y + cHeight; - } else - { height = gBackupMapLayout.height; - } y = 0; } else { y2 = 0; if (y + cHeight < gBackupMapLayout.height) - { height = cHeight; - } else - { height = gBackupMapLayout.height - y; - } } - sub_8087F54( + FillConnection( /*x*/ 0, y, connectedMapHeader, x2, y2, @@ -325,29 +320,21 @@ static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHead { y2 = -y; if (y + cHeight < gBackupMapLayout.height) - { height = y + cHeight; - } else - { height = gBackupMapLayout.height; - } y = 0; } else { y2 = 0; if (y + cHeight < gBackupMapLayout.height) - { height = cHeight; - } else - { height = gBackupMapLayout.height - y; - } } - sub_8087F54( + FillConnection( x, y, connectedMapHeader, /*x2*/ 0, y2, @@ -355,124 +342,52 @@ static void FillEastConnection(struct MapHeader const *mapHeader, struct MapHead } } -union Block -{ - struct - { - u16 block:10; - u16 collision:2; - u16 elevation:4; - } block; - u16 value; -}; - u8 MapGridGetZCoordAt(int x, int y) { - u16 block; - int i; - u16 *border; - - if (x >= 0 && x < gBackupMapLayout.width - && y >= 0 && y < gBackupMapLayout.height) - { - block = gBackupMapLayout.map[x + gBackupMapLayout.width * y]; - } - else - { - border = gMapHeader.mapLayout->border; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = gMapHeader.mapLayout->border[i]; - block |= METATILE_COLLISION_MASK; - } + u16 block = MapGridGetTileAt(x, y); if (block == METATILE_ID_UNDEFINED) - { return 0; - } return block >> METATILE_ELEVATION_SHIFT; } -u8 MapGridIsImpassableAt(int x, int y) +bool8 MapGridIsImpassableAt(int x, int y) { - u16 block; - int i; - u16 *border; + u16 block = MapGridGetTileAt(x, y); - if (x >= 0 && x < gBackupMapLayout.width - && y >= 0 && y < gBackupMapLayout.height) - { - block = gBackupMapLayout.map[x + gBackupMapLayout.width * y]; - } - else - { - border = gMapHeader.mapLayout->border; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = gMapHeader.mapLayout->border[i]; - block |= METATILE_COLLISION_MASK; - } if (block == METATILE_ID_UNDEFINED) - { - return 1; - } + return TRUE; + return (block & METATILE_COLLISION_MASK) >> METATILE_COLLISION_SHIFT; } u32 MapGridGetMetatileIdAt(int x, int y) { - u16 block; - int i; - int j; - struct MapLayout const *mapLayout; - u16 *border; - u16 block2; + u16 block = MapGridGetTileAt(x, y); - if (x >= 0 && x < gBackupMapLayout.width - && y >= 0 && y < gBackupMapLayout.height) - { - block = gBackupMapLayout.map[x + gBackupMapLayout.width * y]; - } - else - { - mapLayout = gMapHeader.mapLayout; - i = (x + 1) & 1; - i += ((y + 1) & 1) * 2; - block = mapLayout->border[i] | METATILE_COLLISION_MASK; - } if (block == METATILE_ID_UNDEFINED) - { - border = gMapHeader.mapLayout->border; - j = (x + 1) & 1; - j += ((y + 1) & 1) * 2; - block2 = gMapHeader.mapLayout->border[j]; - // This OR is completely pointless. - block2 |= METATILE_COLLISION_MASK; - return block2 & METATILE_ID_MASK; - } + return MapGridGetBorderTileAt(x, y) & METATILE_ID_MASK; + return block & METATILE_ID_MASK; } u32 MapGridGetMetatileBehaviorAt(int x, int y) { - u16 metatile; - metatile = MapGridGetMetatileIdAt(x, y); - return GetBehaviorByMetatileId(metatile) & 0xff; + u16 metatile = MapGridGetMetatileIdAt(x, y); + return GetBehaviorByMetatileId(metatile) & METATILE_BEHAVIOR_MASK; } u8 MapGridGetMetatileLayerTypeAt(int x, int y) { - u16 metatile; - metatile = MapGridGetMetatileIdAt(x, y); + u16 metatile = MapGridGetMetatileIdAt(x, y); return (GetBehaviorByMetatileId(metatile) & METATILE_ELEVATION_MASK) >> METATILE_ELEVATION_SHIFT; } void MapGridSetMetatileIdAt(int x, int y, u16 metatile) { int i; - if (x >= 0 && x < gBackupMapLayout.width - && y >= 0 && y < gBackupMapLayout.height) + if (AreCoordsWithinMapGridBounds(x, y)) { i = x + y * gBackupMapLayout.width; gBackupMapLayout.map[i] = (gBackupMapLayout.map[i] & METATILE_ELEVATION_MASK) | (metatile & ~METATILE_ELEVATION_MASK); @@ -482,8 +397,7 @@ void MapGridSetMetatileIdAt(int x, int y, u16 metatile) void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) { int i; - if (x >= 0 && x < gBackupMapLayout.width - && y >= 0 && y < gBackupMapLayout.height) + if (AreCoordsWithinMapGridBounds(x, y)) { i = x + gBackupMapLayout.width * y; gBackupMapLayout.map[i] = metatile; @@ -505,11 +419,11 @@ u16 GetBehaviorByMetatileId(u16 metatile) } else { - return 0xFF; + return MB_INVALID; } } -void save_serialize_map(void) +void SaveMapView(void) { int i, j; int x, y; @@ -522,9 +436,7 @@ void save_serialize_map(void) for (i = y; i < y + 14; i++) { for (j = x; j < x + 15; j++) - { *mapView++ = gBackupMapData[width * i + j]; - } } } @@ -595,7 +507,7 @@ static void LoadSavedMapView(void) } } -void sub_80885C4(u8 a1) +static void MoveMapViewToBackup(u8 direction) { int width; u16 *mapView; @@ -614,7 +526,7 @@ void sub_80885C4(u8 a1) y0 = gSaveBlock1Ptr->pos.y; x2 = 15; y2 = 14; - switch (a1) + switch (direction) { case CONNECTION_NORTH: y0 += 1; @@ -653,71 +565,40 @@ void sub_80885C4(u8 a1) int GetMapBorderIdAt(int x, int y) { - struct MapLayout const *mapLayout; - u16 block, block2; - int i, j; - if (x >= 0 && x < gBackupMapLayout.width - && y >= 0 && y < gBackupMapLayout.height) - { - i = gBackupMapLayout.width; - i *= y; - block = gBackupMapLayout.map[x + i]; - if (block == METATILE_ID_UNDEFINED) - { - goto fail; - } - } - else - { - mapLayout = gMapHeader.mapLayout; - j = (x + 1) & 1; - j += ((y + 1) & 1) * 2; - block2 = METATILE_COLLISION_MASK | mapLayout->border[j]; - if (block2 == METATILE_ID_UNDEFINED) - { - goto fail; - } - } - goto success; -fail: - return -1; -success: + if (MapGridGetTileAt(x, y) == METATILE_ID_UNDEFINED) + return CONNECTION_INVALID; if (x >= (gBackupMapLayout.width - 8)) { if (!gMapConnectionFlags.east) - { - return -1; - } + return CONNECTION_INVALID; + return CONNECTION_EAST; } else if (x < 7) { if (!gMapConnectionFlags.west) - { - return -1; - } + return CONNECTION_INVALID; + return CONNECTION_WEST; } else if (y >= (gBackupMapLayout.height - 7)) { if (!gMapConnectionFlags.south) - { - return -1; - } + return CONNECTION_INVALID; + return CONNECTION_SOUTH; } else if (y < 7) { if (!gMapConnectionFlags.north) - { - return -1; - } + return CONNECTION_INVALID; + return CONNECTION_NORTH; } else { - return 0; + return CONNECTION_NONE; } } @@ -726,19 +607,19 @@ int GetPostCameraMoveMapBorderId(int x, int y) return GetMapBorderIdAt(gSaveBlock1Ptr->pos.x + 7 + x, gSaveBlock1Ptr->pos.y + 7 + y); } -int CanCameraMoveInDirection(int direction) +bool32 CanCameraMoveInDirection(int direction) { int x, y; x = gSaveBlock1Ptr->pos.x + 7 + gDirectionToVectors[direction].x; y = gSaveBlock1Ptr->pos.y + 7 + gDirectionToVectors[direction].y; - if (GetMapBorderIdAt(x, y) == -1) - { - return 0; - } - return 1; + + if (GetMapBorderIdAt(x, y) == CONNECTION_INVALID) + return FALSE; + + return TRUE; } -void sub_80887F8(struct MapConnection *connection, int direction, int x, int y) +static void SetPositionFromConnection(struct MapConnection *connection, int direction, int x, int y) { struct MapHeader const *mapHeader; mapHeader = GetMapHeaderFromConnection(connection); @@ -765,51 +646,57 @@ void sub_80887F8(struct MapConnection *connection, int direction, int x, int y) bool8 CameraMove(int x, int y) { - unsigned int direction; + int direction; struct MapConnection *connection; int old_x, old_y; gCamera.active = FALSE; direction = GetPostCameraMoveMapBorderId(x, y); - if (direction + 1 <= 1) + if (direction == CONNECTION_NONE || direction == CONNECTION_INVALID) { gSaveBlock1Ptr->pos.x += x; gSaveBlock1Ptr->pos.y += y; } else { - save_serialize_map(); + SaveMapView(); ClearMirageTowerPulseBlendEffect(); old_x = gSaveBlock1Ptr->pos.x; old_y = gSaveBlock1Ptr->pos.y; - connection = sub_8088950(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); - sub_80887F8(connection, direction, x, y); + connection = GetIncomingConnection(direction, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y); + SetPositionFromConnection(connection, direction, x, y); LoadMapFromCameraTransition(connection->mapGroup, connection->mapNum); gCamera.active = TRUE; gCamera.x = old_x - gSaveBlock1Ptr->pos.x; gCamera.y = old_y - gSaveBlock1Ptr->pos.y; gSaveBlock1Ptr->pos.x += x; gSaveBlock1Ptr->pos.y += y; - sub_80885C4(direction); + MoveMapViewToBackup(direction); } return gCamera.active; } -struct MapConnection *sub_8088950(u8 direction, int x, int y) +static struct MapConnection *GetIncomingConnection(u8 direction, int x, int y) { int count; - struct MapConnection *connection; int i; - count = gMapHeader.connections->count; - connection = gMapHeader.connections->connections; + struct MapConnection *connection; + const struct MapConnections *connections = gMapHeader.connections; + +#ifdef UBFIX // UB: Multiple possible null dereferences + if (connections == NULL || connections->connections == NULL) + return NULL; +#endif + count = connections->count; + connection = connections->connections; for (i = 0; i < count; i++, connection++) { - if (connection->direction == direction && sub_80889A8(direction, x, y, connection) == TRUE) + if (connection->direction == direction && IsPosInIncomingConnectingMap(direction, x, y, connection) == TRUE) return connection; } return NULL; } -bool8 sub_80889A8(u8 direction, int x, int y, struct MapConnection *connection) +static bool8 IsPosInIncomingConnectingMap(u8 direction, int x, int y, struct MapConnection *connection) { struct MapHeader const *mapHeader; mapHeader = GetMapHeaderFromConnection(connection); @@ -817,15 +704,15 @@ bool8 sub_80889A8(u8 direction, int x, int y, struct MapConnection *connection) { case CONNECTION_SOUTH: case CONNECTION_NORTH: - return sub_8088A0C(x, gMapHeader.mapLayout->width, mapHeader->mapLayout->width, connection->offset); + return IsCoordInIncomingConnectingMap(x, gMapHeader.mapLayout->width, mapHeader->mapLayout->width, connection->offset); case CONNECTION_WEST: case CONNECTION_EAST: - return sub_8088A0C(y, gMapHeader.mapLayout->height, mapHeader->mapLayout->height, connection->offset); + return IsCoordInIncomingConnectingMap(y, gMapHeader.mapLayout->height, mapHeader->mapLayout->height, connection->offset); } return FALSE; } -bool8 sub_8088A0C(int x, int src_width, int dest_width, int offset) +static bool8 IsCoordInIncomingConnectingMap(int coord, int srcMax, int destMax, int offset) { int offset2; offset2 = offset; @@ -833,24 +720,24 @@ bool8 sub_8088A0C(int x, int src_width, int dest_width, int offset) if (offset2 < 0) offset2 = 0; - if (dest_width + offset < src_width) - src_width = dest_width + offset; + if (destMax + offset < srcMax) + srcMax = destMax + offset; - if (offset2 <= x && x <= src_width) + if (offset2 <= coord && coord <= srcMax) return TRUE; return FALSE; } -int sub_8088A38(int x, int width) +static int IsCoordInConnectingMap(int coord, int max) { - if (x >= 0 && x < width) + if (coord >= 0 && coord < max) return TRUE; return FALSE; } -int sub_8088A4C(struct MapConnection *connection, int x, int y) +static int IsPosInConnectingMap(struct MapConnection *connection, int x, int y) { struct MapHeader const *mapHeader; mapHeader = GetMapHeaderFromConnection(connection); @@ -858,10 +745,10 @@ int sub_8088A4C(struct MapConnection *connection, int x, int y) { case CONNECTION_SOUTH: case CONNECTION_NORTH: - return sub_8088A38(x - connection->offset, mapHeader->mapLayout->width); + return IsCoordInConnectingMap(x - connection->offset, mapHeader->mapLayout->width); case CONNECTION_WEST: case CONNECTION_EAST: - return sub_8088A38(y - connection->offset, mapHeader->mapLayout->height); + return IsCoordInConnectingMap(y - connection->offset, mapHeader->mapLayout->height); } return FALSE; } @@ -891,7 +778,7 @@ struct MapConnection *GetConnectionAtCoords(s16 x, s16 y) { continue; } - if (sub_8088A4C(connection, x - 7, y - 7) == TRUE) + if (IsPosInConnectingMap(connection, x - 7, y - 7) == TRUE) { return connection; } @@ -927,7 +814,7 @@ void GetCameraCoords(u16 *x, u16 *y) void MapGridSetMetatileImpassabilityAt(int x, int y, bool32 impassable) { - if (x >= 0 && x < gBackupMapLayout.width && y >= 0 && y < gBackupMapLayout.height) + if (AreCoordsWithinMapGridBounds(x, y)) { if (impassable) gBackupMapLayout.map[x + gBackupMapLayout.width * y] |= METATILE_COLLISION_MASK; @@ -973,12 +860,12 @@ static void CopyTilesetToVramUsingHeap(struct Tileset const *tileset, u16 numTil } } -void nullsub_3(u16 a0, u16 a1) +static void FieldmapPaletteDummy(u16 offset, u16 size) { } -void nullsub_90(void) +static void FieldmapUnkDummy(void) { } @@ -993,17 +880,17 @@ void LoadTilesetPalette(struct Tileset const *tileset, u16 destOffset, u16 size) { LoadPalette(&black, destOffset, 2); LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); - nullsub_3(destOffset + 1, (size - 2) >> 1); + FieldmapPaletteDummy(destOffset + 1, (size - 2) >> 1); } else if (tileset->isSecondary == TRUE) { LoadPalette(((u16*)tileset->palettes) + (NUM_PALS_IN_PRIMARY * 16), destOffset, size); - nullsub_3(destOffset, size >> 1); + FieldmapPaletteDummy(destOffset, size >> 1); } else { LoadCompressedPalette((u32*)tileset->palettes, destOffset, size); - nullsub_3(destOffset, size >> 1); + FieldmapPaletteDummy(destOffset, size >> 1); } } } diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index 0458f7621..044e25a8f 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -62,7 +62,6 @@ static void HandleLongGrassOnHyper(u8, s16, s16); static u8 sCutSquareSide; static u8 sTileCountFromPlayer_X; static u8 sTileCountFromPlayer_Y; -static u32 sUnused; static bool8 sHyperCutTiles[CUT_HYPER_AREA]; // EWRAM variables @@ -327,7 +326,7 @@ bool8 FldEff_CutGrass(void) y = yAdd + gPlayerFacingPosition.y; SetCutGrassMetatile(x, y); - sub_808E75C(x, y); + AllowObjectAtPosTriggerGroundEffects(x, y); } } diff --git a/src/fldeff_escalator.c b/src/fldeff_escalator.c index 7a96eaa82..733dca722 100644 --- a/src/fldeff_escalator.c +++ b/src/fldeff_escalator.c @@ -10,8 +10,6 @@ static EWRAM_DATA u8 sEscalatorAnim_TaskId = 0; static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks); static void Task_DrawEscalator(u8 taskId); -static void Task_DrawTeleporterHousing(u8 taskId); -static void Task_DrawTeleporterCable(u8 taskId); #define ESCALATOR_STAGES 3 #define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1) diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index b2ddf3180..9c166d008 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -16,7 +16,6 @@ #include "constants/songs.h" #include "constants/map_types.h" -// structures struct FlashStruct { u8 fromType; @@ -26,7 +25,6 @@ struct FlashStruct void (*func)(void); }; -// static functions static void FieldCallback_Flash(void); static void FldEff_UseFlash(void); static bool8 TryDoMapTransition(void); @@ -42,7 +40,6 @@ static void Task_EnterCaveTransition2(u8 taskId); static void Task_EnterCaveTransition3(u8 taskId); static void Task_EnterCaveTransition4(u8 taskId); -// rodata static const struct FlashStruct sTransitionTypes[] = { {MAP_TYPE_TOWN, MAP_TYPE_UNDERGROUND, TRUE, FALSE, DoEnterCaveTransition}, @@ -64,15 +61,14 @@ static const struct FlashStruct sTransitionTypes[] = {}, }; -static const u16 gCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal"); -static const u16 gCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal"); +static const u16 sCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal"); +static const u16 sCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal"); -static const u16 gUnknown_085B2890[] = INCBIN_U16("graphics/misc/85B2890.gbapal"); -static const u16 gUnknown_085B28A0[] = INCBIN_U16("graphics/misc/85B28A0.gbapal"); -static const u32 gCaveTransitionTilemap[] = INCBIN_U32("graphics/misc/cave_transition_map.bin.lz"); -static const u32 gCaveTransitionTiles[] = INCBIN_U32("graphics/misc/cave_transition.4bpp.lz"); +static const u16 sCaveTransitionPalette_Enter[] = INCBIN_U16("graphics/misc/cave_transition_enter.gbapal"); +static const u16 sCaveTransitionPalette_Exit[] = INCBIN_U16("graphics/misc/cave_transition_exit.gbapal"); +static const u32 sCaveTransitionTilemap[] = INCBIN_U32("graphics/misc/cave_transition_map.bin.lz"); +static const u32 sCaveTransitionTiles[] = INCBIN_U32("graphics/misc/cave_transition.4bpp.lz"); -// text bool8 SetUpFieldMove_Flash(void) { // In Ruby and Sapphire, Registeel's tomb is opened by using Fly. In Emerald, @@ -220,10 +216,10 @@ static void Task_ExitCaveTransition1(u8 taskId) static void Task_ExitCaveTransition2(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - LZ77UnCompVram(gCaveTransitionTiles, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(gCaveTransitionTilemap, (void *)(VRAM + 0xF800)); - LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); - LoadPalette(gUnknown_085B28A0, 0xE0, 0x10); + LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); + LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); + LoadPalette(sCaveTransitionPalette_White, 0xE0, 0x20); + LoadPalette(sCaveTransitionPalette_Exit, 0xE0, 0x10); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 @@ -274,11 +270,11 @@ static void Task_ExitCaveTransition4(u8 taskId) if (count < 8) { gTasks[taskId].data[2]++; - LoadPalette(&gUnknown_085B28A0[count], 0xE0, 16 - 2 * count); + LoadPalette(&sCaveTransitionPalette_Exit[count], 0xE0, 16 - 2 * count); } else { - LoadPalette(gCaveTransitionPalette_White, 0, 0x20); + LoadPalette(sCaveTransitionPalette_White, 0, 0x20); gTasks[taskId].func = Task_ExitCaveTransition5; gTasks[taskId].data[2] = 8; } @@ -305,8 +301,8 @@ static void Task_EnterCaveTransition1(u8 taskId) static void Task_EnterCaveTransition2(u8 taskId) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - LZ77UnCompVram(gCaveTransitionTiles, (void *)(VRAM + 0xC000)); - LZ77UnCompVram(gCaveTransitionTilemap, (void *)(VRAM + 0xF800)); + LZ77UnCompVram(sCaveTransitionTiles, (void *)(VRAM + 0xC000)); + LZ77UnCompVram(sCaveTransitionTilemap, (void *)(VRAM + 0xF800)); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); @@ -319,8 +315,8 @@ static void Task_EnterCaveTransition2(u8 taskId) | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_OBJ_ON); - LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20); - LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); + LoadPalette(sCaveTransitionPalette_White, 0xE0, 0x20); + LoadPalette(sCaveTransitionPalette_Black, 0, 0x20); gTasks[taskId].func = Task_EnterCaveTransition3; gTasks[taskId].data[0] = 16; gTasks[taskId].data[1] = 0; @@ -335,7 +331,7 @@ static void Task_EnterCaveTransition3(u8 taskId) { gTasks[taskId].data[2]++; gTasks[taskId].data[2]++; - LoadPalette(&gUnknown_085B2890[15 - count], 0xE0, 2 * (count + 1)); + LoadPalette(&sCaveTransitionPalette_Enter[15 - count], 0xE0, 2 * (count + 1)); } else { @@ -363,7 +359,7 @@ static void Task_EnterCaveTransition4(u8 taskId) } else { - LoadPalette(gCaveTransitionPalette_Black, 0, 0x20); + LoadPalette(sCaveTransitionPalette_Black, 0, 0x20); SetMainCallback2(gMain.savedCallback); } } diff --git a/src/fldeff_misc.c b/src/fldeff_misc.c index 7eae8cfd1..3d3b83fef 100644 --- a/src/fldeff_misc.c +++ b/src/fldeff_misc.c @@ -22,7 +22,6 @@ #include "constants/metatile_behaviors.h" #include "constants/metatile_labels.h" #include "constants/songs.h" -#include "constants/tv.h" EWRAM_DATA struct MapPosition gPlayerFacingPosition = {0}; @@ -387,7 +386,7 @@ static void Task_ComputerScreenOpenEffect(u8 taskId) task->tWinRight = DISPLAY_WIDTH; SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_BLDCNT, task->tBlendCnt); - BlendPalettes(0xFFFFFFFF, 0, 0); + BlendPalettes(PALETTES_ALL, 0, 0); gPlttBufferFaded[0] = 0; } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWinLeft, task->tWinRight)); @@ -463,7 +462,7 @@ static void Task_ComputerScreenCloseEffect(u8 taskId) { task->tWinLeft = DISPLAY_WIDTH / 2; task->tWinRight = DISPLAY_WIDTH / 2; - BlendPalettes(-1, 16, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gPlttBufferFaded[0] = 0; } SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(task->tWinLeft, task->tWinRight)); @@ -1298,7 +1297,7 @@ u8 CreateRecordMixingLights(void) else { struct Sprite *sprite = &gSprites[spriteId]; - sub_8092FF0(16, 13, &sprite->pos1.x, &sprite->pos1.y); + GetMapCoordsFromSpritePos(16, 13, &sprite->pos1.x, &sprite->pos1.y); sprite->coordOffsetEnabled = TRUE; sprite->pos1.x += 16; sprite->pos1.y += 2; diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index a9d81501f..e34d19504 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -54,7 +54,7 @@ static void StartSweetScentFieldEffect(void) PlaySE(SE_M_SWEET_SCENT); CpuFastSet(gPlttBufferUnfaded, gPaletteDecompressionBuffer, 0x100); CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100); - BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB_RED); + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16)), 4, 0, 8, RGB_RED); taskId = CreateTask(TrySweetScentEncounter, 0); gTasks[taskId].data[0] = 0; FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT); @@ -76,7 +76,7 @@ static void TrySweetScentEncounter(u8 taskId) else { gTasks[taskId].func = FailSweetScentEncounter; - BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB_RED); + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarSpriteId()].oam.paletteNum + 16)), 4, 8, 0, RGB_RED); TryStartMirageTowerPulseBlendEffect(); } } @@ -92,7 +92,7 @@ static void FailSweetScentEncounter(u8 taskId) if (!gPaletteFade.active) { CpuFastSet(gPaletteDecompressionBuffer, gPlttBufferUnfaded, 0x100); - sub_80AC3E4(); + SetWeatherPalStateIdle(); ScriptContext1_SetupScript(EventScript_FailSweetScent); DestroyTask(taskId); } diff --git a/src/frontier_pass.c b/src/frontier_pass.c index cf170b350..4081aaabf 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -288,7 +288,7 @@ static const struct WindowTemplate sMapWindowTemplates[] = static const u8 sTextColors[][3] = { - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}, + {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_BLUE}, {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}, }; @@ -751,8 +751,8 @@ static bool32 InitFrontierPass(void) ShowBg(2); LoadCursorAndSymbolSprites(); SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); break; case 10: AnimateSprites(); @@ -775,7 +775,7 @@ static bool32 HideFrontierPass(void) case 0: if (sPassData->unkE != 1 && sPassData->unkE != 2) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); } else { @@ -1023,7 +1023,7 @@ static void Task_DoFadeEffect(u8 taskId) data[2] = Q_8_8(1); data[3] = 0x15; data[4] = 0x15; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITE); } else { @@ -1037,8 +1037,8 @@ static void Task_DoFadeEffect(u8 taskId) ShowBg(2); LoadCursorAndSymbolSprites(); SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITE); + BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_WHITE); } sPassGfx->setAffine = TRUE; sPassGfx->unk2E = MathUtil_Inv16(data[1]); @@ -1366,8 +1366,8 @@ static bool32 InitFrontierMap(void) ShowBg(2); InitFrontierMapSprites(); SetVBlankCallback(VblankCb_FrontierPass); - BlendPalettes(0xFFFFFFFF, 0x10, RGB_WHITE); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITE); + BlendPalettes(PALETTES_ALL, 0x10, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_WHITE); break; case 7: if (UpdatePaletteFade()) @@ -1385,7 +1385,7 @@ static bool32 ExitFrontierMap(void) switch (sPassData->state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITE); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITE); break; case 1: if (UpdatePaletteFade()) diff --git a/src/frontier_util.c b/src/frontier_util.c index 5955d9bf7..4aec27944 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -129,7 +129,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_RAIKOU, .heldItem = ITEM_LUM_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MODEST, .evs = {158, 0, 252, 100, 0, 0}, .moves = {MOVE_THUNDERBOLT, MOVE_CALM_MIND, MOVE_REFLECT, MOVE_REST}, @@ -137,7 +137,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_LATIOS, .heldItem = ITEM_BRIGHT_POWDER, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MODEST, .evs = {252, 0, 252, 6, 0, 0}, .moves = {MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_RECOVER, MOVE_DRAGON_CLAW}, @@ -145,7 +145,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SNORLAX, .heldItem = ITEM_CHESTO_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_ADAMANT, .evs = {252, 252, 0, 0, 6, 0}, .moves = {MOVE_CURSE, MOVE_RETURN, MOVE_REST, MOVE_SHADOW_BALL}, @@ -186,7 +186,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SWAMPERT, .heldItem = ITEM_LEFTOVERS, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_BRAVE, .evs = {252, 252, 6, 0, 0, 0}, .moves = {MOVE_SURF, MOVE_EARTHQUAKE, MOVE_ICE_BEAM, MOVE_MIRROR_COAT}, @@ -194,7 +194,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_METAGROSS, .heldItem = ITEM_QUICK_CLAW, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_BRAVE, .evs = {252, 252, 6, 0, 0, 0}, .moves = {MOVE_PSYCHIC, MOVE_METEOR_MASH, MOVE_EARTHQUAKE, MOVE_PROTECT}, @@ -202,7 +202,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_LATIAS, .heldItem = ITEM_CHESTO_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MODEST, .evs = {252, 0, 252, 6, 0, 0}, .moves = {MOVE_THUNDERBOLT, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_REST}, @@ -243,7 +243,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_ARCANINE, .heldItem = ITEM_WHITE_HERB, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_HASTY, .evs = {6, 252, 252, 0, 0, 0}, .moves = {MOVE_OVERHEAT, MOVE_EXTREME_SPEED, MOVE_ROAR, MOVE_PROTECT}, @@ -251,7 +251,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SLAKING, .heldItem = ITEM_SCOPE_LENS, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_HARDY, .evs = {6, 252, 0, 252, 0, 0}, .moves = {MOVE_HYPER_BEAM, MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_YAWN}, @@ -259,7 +259,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SUICUNE, .heldItem = ITEM_KINGS_ROCK, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_HASTY, .evs = {252, 0, 252, 6, 0, 0}, .moves = {MOVE_BLIZZARD, MOVE_SURF, MOVE_BITE, MOVE_CALM_MIND}, @@ -300,7 +300,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_UMBREON, .heldItem = ITEM_CHESTO_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_CALM, .evs = {252, 0, 0, 0, 252, 6}, .moves = {MOVE_DOUBLE_EDGE, MOVE_CONFUSE_RAY, MOVE_REST, MOVE_PSYCHIC}, @@ -308,7 +308,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_GENGAR, .heldItem = ITEM_LEFTOVERS, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MODEST, .evs = {252, 0, 252, 0, 6, 0}, .moves = {MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_DESTINY_BOND}, @@ -316,7 +316,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_BRELOOM, .heldItem = ITEM_LUM_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_JOLLY, .evs = {6, 252, 0, 252, 0, 0}, .moves = {MOVE_SPORE, MOVE_FOCUS_PUNCH, MOVE_GIGA_DRAIN, MOVE_HEADBUTT}, @@ -331,7 +331,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_METANG, .heldItem = ITEM_SITRUS_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_BRAVE, .evs = {0, 252, 252, 0, 6, 0}, .moves = {MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_METAL_CLAW}, @@ -339,7 +339,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SKARMORY, .heldItem = ITEM_SITRUS_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_IMPISH, .evs = {252, 0, 0, 0, 6, 252}, .moves = {MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_PROTECT, MOVE_STEEL_WING}, @@ -347,7 +347,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_AGGRON, .heldItem = ITEM_SITRUS_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_ADAMANT, .evs = {0, 252, 0, 0, 252, 6}, .moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW}, @@ -357,7 +357,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_METANG, .heldItem = ITEM_SITRUS_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_BRAVE, .evs = {0, 252, 252, 0, 6, 0}, .moves = {MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_METAL_CLAW}, @@ -365,7 +365,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SKARMORY, .heldItem = ITEM_SITRUS_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_IMPISH, .evs = {252, 0, 0, 0, 6, 252}, .moves = {MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_PROTECT, MOVE_STEEL_WING}, @@ -373,7 +373,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_AGGRON, .heldItem = ITEM_SITRUS_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_ADAMANT, .evs = {0, 252, 0, 0, 252, 6}, .moves = {MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW}, @@ -414,7 +414,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_SEVIPER, .heldItem = ITEM_FOCUS_BAND, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_BOLD, .evs = {252, 0, 0, 0, 252, 6}, .moves = {MOVE_SWAGGER, MOVE_CRUNCH, MOVE_SLUDGE_BOMB, MOVE_GIGA_DRAIN}, @@ -422,7 +422,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_STEELIX, .heldItem = ITEM_BRIGHT_POWDER, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_BRAVE, .evs = {252, 0, 0, 0, 6, 252}, .moves = {MOVE_EARTHQUAKE, MOVE_ROCK_SLIDE, MOVE_EXPLOSION, MOVE_SCREECH}, @@ -430,7 +430,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_GYARADOS, .heldItem = ITEM_CHESTO_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_ADAMANT, .evs = {252, 6, 0, 0, 0, 252}, .moves = {MOVE_DRAGON_DANCE, MOVE_RETURN, MOVE_ROAR, MOVE_REST}, @@ -471,7 +471,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_ARTICUNO, .heldItem = ITEM_SCOPE_LENS, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MILD, .evs = {6, 0, 252, 252, 0, 0}, .moves = {MOVE_BLIZZARD, MOVE_WATER_PULSE, MOVE_AERIAL_ACE, MOVE_REFLECT}, @@ -479,7 +479,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_ZAPDOS, .heldItem = ITEM_LUM_BERRY, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MILD, .evs = {6, 0, 252, 252, 0, 0}, .moves = {MOVE_THUNDER, MOVE_DETECT, MOVE_DRILL_PECK, MOVE_LIGHT_SCREEN}, @@ -487,7 +487,7 @@ static const struct FrontierBrainMon sFrontierBrainsMons[][2][FRONTIER_PARTY_SIZ { .species = SPECIES_MOLTRES, .heldItem = ITEM_BRIGHT_POWDER, - .fixedIV = 31, + .fixedIV = MAX_PER_STAT_IVS, .nature = NATURE_MILD, .evs = {6, 0, 252, 252, 0, 0}, .moves = {MOVE_FIRE_BLAST, MOVE_HYPER_BEAM, MOVE_AERIAL_ACE, MOVE_SAFEGUARD}, @@ -1513,9 +1513,9 @@ static void ShowLinkContestResultsWindow(void) AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Smart, x, 89, TEXT_SPEED_FF, NULL); AddTextPrinterParameterized(gRecordsWindowId, 1, gText_Tough, x, 105, TEXT_SPEED_FF, NULL); - for (i = 0; i < 5; i++) + for (i = 0; i < CONTEST_CATEGORIES_COUNT; i++) { - for (j = 0; j < 4; j++) + for (j = 0; j < CONTESTANT_COUNT; j++) { ConvertIntToDecimalStringN(gStringVar4, gSaveBlock2Ptr->contestLinkResults[i][j], STR_CONV_MODE_RIGHT_ALIGN, 4); AddTextPrinterParameterized(gRecordsWindowId, 1, gStringVar4, (j * 38) + 64, (i * 16) + 41, TEXT_SPEED_FF, NULL); @@ -1552,16 +1552,16 @@ static void CheckPutFrontierTVShowOnAir(void) switch (battleMode) { case FRONTIER_MODE_SINGLES: - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 1); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_SINGLES); break; case FRONTIER_MODE_DOUBLES: - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 2); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_DOUBLES); break; case FRONTIER_MODE_MULTIS: - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 3); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_MULTIS); break; case FRONTIER_MODE_LINK_MULTIS: - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], 4); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.towerWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_TOWER_LINK_MULTIS); break; } } @@ -1575,9 +1575,9 @@ static void CheckPutFrontierTVShowOnAir(void) && ShouldAirFrontierTVShow()) { if (battleMode == FRONTIER_MODE_SINGLES) - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], 5); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_DOME_SINGLES); else - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], 6); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.domeWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_DOME_DOUBLES); } } break; @@ -1589,9 +1589,9 @@ static void CheckPutFrontierTVShowOnAir(void) && ShouldAirFrontierTVShow()) { if (battleMode == FRONTIER_MODE_SINGLES) - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], 11); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_PALACE_SINGLES); else - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], 12); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.palaceWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_PALACE_DOUBLES); } } break; @@ -1602,7 +1602,7 @@ static void CheckPutFrontierTVShowOnAir(void) if (gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode] > 1 && ShouldAirFrontierTVShow()) { - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode], 10); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.arenaWinStreaks[lvlMode], FRONTIER_SHOW_ARENA); } } break; @@ -1615,9 +1615,9 @@ static void CheckPutFrontierTVShowOnAir(void) && ShouldAirFrontierTVShow()) { if (battleMode == FRONTIER_MODE_SINGLES) - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], 7); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_FACTORY_SINGLES); else - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], 8); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.factoryWinStreaks[battleMode][lvlMode], FRONTIER_SHOW_FACTORY_DOUBLES); } } break; @@ -1628,7 +1628,7 @@ static void CheckPutFrontierTVShowOnAir(void) if (gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode] > 1 && ShouldAirFrontierTVShow()) { - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode], 9); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pikeWinStreaks[lvlMode], FRONTIER_SHOW_PIKE); } } break; @@ -1639,7 +1639,7 @@ static void CheckPutFrontierTVShowOnAir(void) if (gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode] > 1 && ShouldAirFrontierTVShow()) { - TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode], 13); + TryPutFrontierTVShowOnAir(gSaveBlock2Ptr->frontier.pyramidWinStreaks[lvlMode], FRONTIER_SHOW_PYRAMID); } } break; @@ -2383,13 +2383,13 @@ void ClearRankingHallRecords(void) { s32 i, j, k; - // BUG: Passing 0 as a pointer instead of a pointer holding a value of 0. - #ifdef BUGFIX - u8 zero = 0; - #define ZERO (&zero) - #else + // UB: Passing 0 as a pointer instead of a pointer holding a value of 0. +#ifdef UBFIX + u8 emptyId[TRAINER_ID_LENGTH] = {0}; + #define ZERO emptyId +#else #define ZERO 0 - #endif +#endif for (i = 0; i < HALL_FACILITIES_COUNT; i++) { diff --git a/src/graphics.c b/src/graphics.c index 3973c1507..c3ac6c2df 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -471,11 +471,11 @@ const u8 gContestSliderHeart_Gfx[] = INCBIN_U8("graphics/contest/slider_heart.4b const u32 gUnknownGfx_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.4bpp.lz"); const u32 gUnknownPal_C19470[] = INCBIN_U32("graphics/unknown/unknown_C19470.gbapal.lz"); -const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen.4bpp.lz"); -const u32 gUnknown_08C19EEC[] = INCBIN_U32("graphics/contest/misc_2_tilemap_1.bin.lz"); -const u32 gUnknown_08C1A000[] = INCBIN_U32("graphics/contest/misc_2_tilemap_2.bin.lz"); -const u32 gUnknown_08C1A12C[] = INCBIN_U32("graphics/contest/misc_2_tilemap_3.bin.lz"); -const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen.gbapal.lz"); +const u32 gContestResults_Gfx[] = INCBIN_U32("graphics/contest/results_screen/tiles.4bpp.lz"); +const u32 gContestResults_WinnerBanner_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/winner_banner.bin.lz"); +const u32 gContestResults_Interface_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/interface.bin.lz"); +const u32 gContestResults_Bg_Tilemap[] = INCBIN_U32("graphics/contest/results_screen/bg.bin.lz"); +const u32 gContestResults_Pal[] = INCBIN_U32("graphics/contest/results_screen/tiles.gbapal.lz"); const u32 gBattleAnimSpriteGfx_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.4bpp.lz"); const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/sprites/impact.gbapal.lz"); @@ -668,8 +668,8 @@ const u32 gBattleAnimSpritePal_FangAttack[] = INCBIN_U32("graphics/battle_anims/ const u32 gBattleAnimSpriteGfx_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.4bpp.lz"); const u32 gBattleAnimSpritePal_PurpleHandOutline[] = INCBIN_U32("graphics/battle_anims/sprites/purple_hand_outline.gbapal.lz"); -const u32 gUnknown_08C20668[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.lz"); -const u32 gUnknown_08C20684[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.lz"); +const u32 gBattleAnimMaskImage_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.4bpp.lz"); +const u32 gBattleAnimMaskTilemap_Curse[] = INCBIN_U32("graphics/battle_anims/masks/curse.bin.lz"); const u32 gBattleAnimSpriteGfx_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.4bpp.lz"); const u32 gBattleAnimSpritePal_Pencil[] = INCBIN_U32("graphics/battle_anims/sprites/pencil.gbapal.lz"); @@ -867,8 +867,8 @@ const u32 gBattleAnimSpriteGfx_Confetti[] = INCBIN_U32("graphics/battle_anims/sp const u32 gBattleAnimSpritePal_Confetti[] = INCBIN_U32("graphics/battle_anims/sprites/confetti.gbapal.lz"); const u32 gSubstituteDollPal[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.gbapal.lz"); -const u32 gSubstituteDollGfx[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.lz"); -const u32 gSubstituteDollTilemap[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.bin.lz"); +const u32 gSubstituteDollFrontGfx[] = INCBIN_U32("graphics/battle_anims/sprites/substitute.4bpp.lz"); +const u32 gSubstituteDollBackGfx[] = INCBIN_U32("graphics/battle_anims/sprites/substitute_back.4bpp.lz"); const u32 gBattleAnimSpriteGfx_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.4bpp.lz"); const u32 gBattleAnimSpritePal_GreenStar[] = INCBIN_U32("graphics/battle_anims/sprites/green_star.gbapal.lz"); @@ -911,8 +911,8 @@ const u32 gBattleAnimSpriteGfx_TagHand[] = INCBIN_U32("graphics/battle_anims/spr const u32 gBattleAnimSpriteGfx_NoiseLine[] = INCBIN_U32("graphics/battle_anims/sprites/noise_line.4bpp.lz"); -const u32 gUnknown_08C2EA50[] = INCBIN_U32("graphics/battle_anims/masks/unknown_C2EA50.4bpp.lz"); -const u32 gUnknown_08C2EA9C[] = INCBIN_U32("graphics/battle_anims/masks/unknown_C2EA50.bin.lz"); +const u32 UnusedLevelupAnimationGfx[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.4bpp.lz"); +const u32 UnusedLevelupAnimationTilemap[] = INCBIN_U32("graphics/battle_anims/masks/unused_level_up.bin.lz"); const u32 gBattleAnimSpriteGfx_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.4bpp.lz"); const u32 gBattleAnimSpritePal_SmallRedEye[] = INCBIN_U32("graphics/battle_anims/sprites/small_red_eye.gbapal.lz"); @@ -1201,7 +1201,7 @@ const u32 gPokeblockBlack_Pal[] = INCBIN_U32("graphics/pokeblock/black.gbapal.lz const u32 gPokeblockWhite_Pal[] = INCBIN_U32("graphics/pokeblock/white.gbapal.lz"); const u32 gPokeblockGold_Pal[] = INCBIN_U32("graphics/pokeblock/gold.gbapal.lz"); -const u32 gUnknown_08D9BA44[] = INCBIN_U32("graphics/interface/pokeblock_feeding_bg_map.bin.lz"); +const u32 gPokeblockFeedBg_Tilemap[] = INCBIN_U32("graphics/interface/pokeblock_feeding_bg_map.bin.lz"); #include "data/graphics/berries.h" #include "data/graphics/rayquaza_scene.h" @@ -1296,17 +1296,17 @@ const u8 gBagMenuHMIcon_Gfx[] = INCBIN_U8("graphics/interface/hm.4bpp"); // contest results screen -const u16 gNormalContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_normal.bin"); -const u16 gSuperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_super.bin"); -const u16 gHyperContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_hyper.bin"); -const u16 gMasterContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_master.bin"); -const u16 gLinkContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_link.bin"); -const u16 gCoolContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cool.bin"); -const u16 gBeautyContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_beauty.bin"); -const u16 gCuteContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_cute.bin"); -const u16 gSmartContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_smart.bin"); -const u16 gToughContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen_tough.bin"); -const u16 gContestResults_Tilemap[] = INCBIN_U16("graphics/contest/results_screen.bin"); +const u16 gContestResultsTitle_Normal_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_normal.bin"); +const u16 gContestResultsTitle_Super_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_super.bin"); +const u16 gContestResultsTitle_Hyper_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_hyper.bin"); +const u16 gContestResultsTitle_Master_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_master.bin"); +const u16 gContestResultsTitle_Link_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_link.bin"); +const u16 gContestResultsTitle_Cool_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_cool.bin"); +const u16 gContestResultsTitle_Beauty_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_beauty.bin"); +const u16 gContestResultsTitle_Cute_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_cute.bin"); +const u16 gContestResultsTitle_Smart_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_smart.bin"); +const u16 gContestResultsTitle_Tough_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title_tough.bin"); +const u16 gContestResultsTitle_Tilemap[] = INCBIN_U16("graphics/contest/results_screen/title.bin"); // pokenav @@ -1346,8 +1346,8 @@ const u32 gRegionMapCityZoomText_Gfx[] = INCBIN_U32("graphics/pokenav/city_zoom_ const u16 gPokenavConditionCancel_Pal[] = INCBIN_U16("graphics/pokenav/condition/cancel.gbapal"); const u8 gPokenavConditionCancel_Gfx[] = INCBIN_U8("graphics/pokenav/condition/cancel.4bpp"); -const u16 gPokenavConditionMarker_Pal[] = INCBIN_U16("graphics/pokenav/condition/marker.gbapal"); -const u8 gPokenavConditionMarker_Gfx[] = INCBIN_U8("graphics/pokenav/condition/marker.4bpp"); +const u16 gMonMarkingsMenu_Pal[] = INCBIN_U16("graphics/misc/mon_markings_menu.gbapal"); +const u8 gMonMarkingsMenu_Gfx[] = INCBIN_U8("graphics/misc/mon_markings_menu.4bpp"); const u16 gBerryBlenderMiscPalette[] = INCBIN_U16("graphics/berry_blender/misc.gbapal"); const u16 gBerryBlenderArrowPalette[] = INCBIN_U16("graphics/berry_blender/arrow.gbapal"); @@ -1361,11 +1361,11 @@ static const u8 sEmpty1[0x200] = {0}; const u8 gBerryBlenderPlayerArrow_Gfx[] = INCBIN_U8("graphics/berry_blender/arrow.4bpp"); static const u8 sEmpty2[0x2C0] = {0}; -const u16 gEasyChatCursor_Pal[] = INCBIN_U16("graphics/easy_chat/cursor.gbapal"); -const u32 gEasyChatCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/cursor.4bpp.lz"); +const u16 gEasyChatRectangleCursor_Pal[] = INCBIN_U16("graphics/easy_chat/rectangle_cursor.gbapal"); +const u32 gEasyChatRectangleCursor_Gfx[] = INCBIN_U32("graphics/easy_chat/rectangle_cursor.4bpp.lz"); -const u16 gEasyChatRightWindow_Pal[] = INCBIN_U16("graphics/easy_chat/rwindow.gbapal"); -const u32 gEasyChatRightWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/rwindow.4bpp.lz"); +const u16 gEasyChatButtonWindow_Pal[] = INCBIN_U16("graphics/easy_chat/button_window.gbapal"); +const u32 gEasyChatButtonWindow_Gfx[] = INCBIN_U32("graphics/easy_chat/button_window.4bpp.lz"); const u32 gEasyChatMode_Gfx[] = INCBIN_U32("graphics/easy_chat/mode.4bpp.lz"); const u16 gEasyChatMode_Pal[] = INCBIN_U16("graphics/easy_chat/mode.gbapal"); @@ -1411,9 +1411,9 @@ const u32 gKantoTrainerCardFrontLink_Tilemap[] = INCBIN_U32("graphics/trainer_ca // pokemon storage system -const u32 gPSSMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.lz"); -const u16 gPSSMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/menu.gbapal"); -const u32 gUnknown_08DD36C8[] = INCBIN_U32("graphics/unknown/unknown_DD36C8.bin.lz"); +const u32 gStorageSystemMenu_Gfx[] = INCBIN_U32("graphics/pokemon_storage/menu.4bpp.lz"); +const u16 gStorageSystemPartyMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/menu.gbapal"); // Only used by party menu, but generated from all menu gfx +const u32 gStorageSystemPartyMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/party_menu.bin.lz"); // naming screen @@ -1474,9 +1474,9 @@ static const u16 sEmptyPal[16] = {0}; // Trade const u16 gTradeMenu_Pal[] = INCBIN_U16("graphics/trade/menu.gbapal"); -const u16 gUnknown_08DDB444[] = INCBIN_U16("graphics/trade/unknown_DDB444.gbapal"); +const u16 gTradeCursor_Pal[] = INCBIN_U16("graphics/trade/cursor.gbapal"); const u8 gTradeMenu_Gfx[] = INCBIN_U8("graphics/trade/menu.4bpp"); -const u8 gTradeButtons_Gfx[] = INCBIN_U8("graphics/trade/buttons.4bpp"); +const u8 gTradeCursor_Gfx[] = INCBIN_U8("graphics/trade/cursor.4bpp"); const u16 gUnused_DDCEE4[] = INCBIN_U16("graphics/unused/unused_DDCEE4.bin"); const u16 gUnknown_08DDCF04[] = INCBIN_U16("graphics/trade/unknown_DDCF04.bin"); const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.bin"); @@ -1484,33 +1484,31 @@ const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.b const u16 gMessageBox_Pal[] = INCBIN_U16("graphics/text_window/message_box.gbapal"); const u8 gMessageBox_Gfx[] = INCBIN_U8("graphics/text_window/message_box.4bpp"); -const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/cross_icon.4bpp.lz"); -const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/bolt_icon.4bpp.lz"); -const u32 gWallpaperIcon_Plusle[] = INCBIN_U32("graphics/pokemon_storage/plusle_icon.4bpp.lz"); +const u32 gWallpaperIcon_Cross[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/cross.4bpp.lz"); +const u32 gWallpaperIcon_Bolt[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/bolt.4bpp.lz"); +const u32 gWallpaperIcon_Plusle[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/icons/plusle.4bpp.lz"); const u16 gWallpaperPalettes_Horizontal[][16] = { - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/horizontal_bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/friends_frame2.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/horizontal/bg.gbapal"), }; -const u32 gWallpaperTiles_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/horizontal.4bpp.lz"); -const u32 gWallpaperTilemap_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/horizontal.bin.lz"); +const u32 gWallpaperTiles_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tiles.4bpp.lz"); +const u32 gWallpaperTilemap_Horizontal[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/horizontal/tilemap.bin.lz"); const u16 gWallpaperPalettes_Ribbon[][16] = { - INCBIN_U16("graphics/pokemon_storage/ribbon_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/ribbon_bg.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/ribbon/frame.gbapal"), + INCBIN_U16("graphics/pokemon_storage/wallpapers/ribbon/bg.gbapal"), }; -const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon.4bpp.lz"); -const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon.bin.lz"); +const u32 gWallpaperTiles_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tiles.4bpp.lz"); +const u32 gWallpaperTilemap_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/ribbon/tilemap.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] = { @@ -1545,9 +1543,9 @@ const u16 gUnknown_08DE3350[] = INCBIN_U16("graphics/frontier_pass/tilemap1.bin" const u16 gUnknown_08DE3374[] = INCBIN_U16("graphics/frontier_pass/tilemap2.bin"); // Berry Crush -const u16 gUnknown_08DE3398[] = INCBIN_U16("graphics/berry_crusher/tiles.gbapal"); -const u32 gUnknown_08DE34B8[] = INCBIN_U32("graphics/berry_crusher/tiles.4bpp.lz"); -const u32 gUnknown_08DE3FD4[] = INCBIN_U32("graphics/berry_crusher/tiles.bin.lz"); +const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); +const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz"); +const u32 gBerryCrush_Crusher_Tilemap[] = INCBIN_U32("graphics/berry_crush/crusher.bin.lz"); // random garbage at the end. static const u8 sEmpty3[0x54BAC] = {0}; diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 7b63950d1..3eb8d3f0a 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -71,7 +71,7 @@ static void ClearVramOamPltt_LoadHofPal(void); static void LoadHofGfx(void); static void InitHofBgs(void); static bool8 CreateHofConfettiSprite(void); -static void SetCallback2AfterHallOfFameDisplay(void); +static void StartCredits(void); static bool8 sub_8175024(void); static void Task_Hof_InitMonData(u8 taskId); static void Task_Hof_InitTeamSaveData(u8 taskId); @@ -138,8 +138,8 @@ static const struct BgTemplate sHof_BgTemplates[] = static const struct WindowTemplate sHof_WindowTemplate = {0, 2, 2, 0xE, 6, 0xE, 1}; -static const u8 sMonInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}; -static const u8 sPlayerInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; +static const u8 sMonInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; +static const u8 sPlayerInfoTextColors[4] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; static const u8 sUnused_085E538C[] = {4, 5, 0, 0}; @@ -386,7 +386,7 @@ static bool8 InitHallOfFameScreen(void) if (!sub_8175024()) { SetVBlankCallback(VBlankCB_HallOfFame); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gMain.state++; } break; @@ -464,11 +464,11 @@ static void Task_Hof_InitMonData(u8 taskId) sHofFadePalettes = 0; gTasks[taskId].tDisplayedMonId = 0; - gTasks[taskId].tPlayerSpriteID = 0xFF; + gTasks[taskId].tPlayerSpriteID = SPRITE_NONE; for (i = 0; i < PARTY_SIZE; i++) { - gTasks[taskId].tMonSpriteId(i) = 0xFF; + gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE; } if (gTasks[taskId].tDontSaveData) @@ -639,10 +639,10 @@ static void Task_Hof_PaletteFadeAndPrintWelcomeText(u8 taskId) { u16 i; - BeginNormalPaletteFade(0xFFFF0000, 0, 0, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_OBJECTS, 0, 0, 0, RGB_BLACK); for (i = 0; i < PARTY_SIZE; i++) { - if (gTasks[taskId].tMonSpriteId(i) != 0xFF) + if (gTasks[taskId].tMonSpriteId(i) != SPRITE_NONE) gSprites[gTasks[taskId].tMonSpriteId(i)].oam.priority = 0; } @@ -668,7 +668,7 @@ static void Task_Hof_DoConfetti(u8 taskId) u16 i; for (i = 0; i < PARTY_SIZE; i++) { - if (gTasks[taskId].tMonSpriteId(i) != 0xFF) + if (gTasks[taskId].tMonSpriteId(i) != SPRITE_NONE) gSprites[gTasks[taskId].tMonSpriteId(i)].oam.priority = 1; } BeginNormalPaletteFade(sHofFadePalettes, 0, 12, 12, RGB(16, 29, 24)); @@ -739,7 +739,7 @@ static void Task_Hof_ExitOnKeyPressed(u8 taskId) static void Task_Hof_HandlePaletteOnExit(u8 taskId) { CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); - BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 8, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_Hof_HandleExit; } @@ -752,7 +752,7 @@ static void Task_Hof_HandleExit(u8 taskId) for (i = 0; i < PARTY_SIZE; i++) { u8 spriteId = gTasks[taskId].tMonSpriteId(i); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) { FreeOamMatrix(gSprites[spriteId].oam.matrixNum); FreeAndDestroyMonPicSprite(spriteId); @@ -774,11 +774,11 @@ static void Task_Hof_HandleExit(u8 taskId) if (sHofMonPtr != NULL) FREE_AND_SET_NULL(sHofMonPtr); - SetCallback2AfterHallOfFameDisplay(); + StartCredits(); } } -static void SetCallback2AfterHallOfFameDisplay(void) +static void StartCredits(void) { SetMainCallback2(CB2_StartCreditsSequence); } @@ -847,7 +847,7 @@ void CB2_DoHallOfFamePC(void) for (i = 0; i < PARTY_SIZE; i++) { - gTasks[taskId].tMonSpriteId(i) = 0xFF; + gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE; } sHofMonPtr = AllocZeroed(0x2000); @@ -937,11 +937,11 @@ static void Task_HofPC_DrawSpritesPrintText(u8 taskId) } else { - gTasks[taskId].tMonSpriteId(i) = 0xFF; + gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE; } } - BlendPalettes(0xFFFF0000, 0xC, RGB(16, 29, 24)); + BlendPalettes(PALETTES_OBJECTS, 0xC, RGB(16, 29, 24)); ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tCurrPageNo, STR_CONV_MODE_RIGHT_ALIGN, 3); StringExpandPlaceholders(gStringVar4, gText_HOFNumber); @@ -967,7 +967,7 @@ static void Task_HofPC_PrintMonInfo(u8 taskId) for (i = 0; i < PARTY_SIZE; i++) { u16 spriteId = gTasks[taskId].tMonSpriteId(i); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) gSprites[spriteId].oam.priority = 1; } @@ -999,10 +999,10 @@ static void Task_HofPC_HandleInput(u8 taskId) for (i = 0; i < PARTY_SIZE; i++) { u8 spriteId = gTasks[taskId].tMonSpriteId(i); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) { FreeAndDestroyMonPicSprite(spriteId); - gTasks[taskId].tMonSpriteId(i) = 0xFF; + gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE; } } if (gTasks[taskId].tCurrPageNo != 0) @@ -1060,10 +1060,10 @@ static void Task_HofPC_HandleExit(u8 taskId) for (i = 0; i < PARTY_SIZE; i++) { u16 spriteId = gTasks[taskId].tMonSpriteId(i); - if (spriteId != 0xFF) + if (spriteId != SPRITE_NONE) { FreeAndDestroyMonPicSprite(spriteId); - gTasks[taskId].tMonSpriteId(i) = 0xFF; + gTasks[taskId].tMonSpriteId(i) = SPRITE_NONE; } } @@ -1398,7 +1398,7 @@ static bool8 CreateHofConfettiSprite(void) u8 spriteID; struct Sprite* sprite; - s16 posX = Random() % 240; + s16 posX = Random() % DISPLAY_WIDTH; s16 posY = -(Random() % 8); spriteID = CreateSprite(&sSpriteTemplate_HofConfetti, posX, posY, 0); @@ -1433,7 +1433,7 @@ void DoDomeConfetti(void) gSpecialVar_0x8004 = 180; taskId = CreateTask(Task_DoDomeConfetti, 0); - if (taskId != 0xFF) + if (taskId != TASK_NONE) { gTasks[taskId].tTimer = gSpecialVar_0x8004; gSpecialVar_0x8005 = taskId; @@ -1444,7 +1444,7 @@ static void StopDomeConfetti(void) { u8 taskId; - if ((taskId = FindTaskIdByFunc(Task_DoDomeConfetti)) != 0xFF) + if ((taskId = FindTaskIdByFunc(Task_DoDomeConfetti)) != TASK_NONE) DestroyTask(taskId); ConfettiUtil_Free(); @@ -1505,7 +1505,7 @@ static void Task_DoDomeConfetti(u8 taskId) id = ConfettiUtil_AddNew(&sOamData_Confetti, TAG_CONFETTI, TAG_CONFETTI, - Random() % 240, + Random() % DISPLAY_WIDTH, -(Random() % 8), Random() % ARRAY_COUNT(sAnims_Confetti), id); diff --git a/src/hof_pc.c b/src/hof_pc.c index 327749179..f74448cca 100644 --- a/src/hof_pc.c +++ b/src/hof_pc.c @@ -29,7 +29,7 @@ static void ReshowPCMenuAfterHallOfFamePC(void) Overworld_PlaySpecialMapMusic(); ScriptMenu_CreatePCMultichoice(); ScriptMenu_DisplayPCStartupPrompt(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); CreateTask(Task_WaitForPaletteFade, 10); } diff --git a/src/image_processing_effects.c b/src/image_processing_effects.c index cbd8b9b37..fa6867f2c 100644 --- a/src/image_processing_effects.c +++ b/src/image_processing_effects.c @@ -51,7 +51,9 @@ static u16 QuantizePixel_GrayscaleSmall(u16*); static u16 QuantizePixel_Grayscale(u16*); static u16 QuantizePixel_PrimaryColors(u16*); -extern const u8 gPointillismPoints[][3]; +#define MAX_DIMENSION 64 + +#include "data/pointillism_points.h" void ApplyImageProcessingEffects(struct ImageProcessingContext *context) { @@ -129,11 +131,11 @@ static void ApplyImageEffect_RedChannelGrayscale(u8 delta) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { // Gets the grayscale value, based on the pixel's red channel. // Also adds a delta to skew lighter or darker. - u8 grayValue = (31 & *pixel); + u8 grayValue = (*pixel & RGB_RED); grayValue += delta; if (grayValue > 31) grayValue = 31; @@ -154,9 +156,9 @@ static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { - u8 grayValue = (31 & *pixel); + u8 grayValue = (*pixel & RGB_RED); if (grayValue > 31 - highlight) grayValue = 31 - (highlight >> 1); @@ -169,7 +171,7 @@ static void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight) static void ApplyImageEffect_Pointillism(void) { u32 i; - for (i = 0; i < 3200; i++) + for (i = 0; i < ARRAY_COUNT(sPointillismPoints); i++) AddPointillismPoints(i); } @@ -183,7 +185,7 @@ static void ApplyImageEffect_Grayscale(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) *pixel = ConvertColorToGrayscale(pixel); } } @@ -203,7 +205,7 @@ static void ApplyImageEffect_Blur(void) pixel += gCanvasWidth; while (j < gCanvasRowEnd - 1) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { *pixel = QuantizePixel_Blur(&prevPixel, pixel, pixel + gCanvasWidth); prevPixel = *pixel; @@ -225,7 +227,7 @@ static void ApplyImageEffect_PersonalityColor(u8 personality) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) *pixel = QuantizePixel_PersonalityColor(pixel, personality); } } @@ -241,7 +243,7 @@ static void ApplyImageEffect_BlackAndWhite(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) *pixel = QuantizePixel_BlackAndWhite(pixel); } } @@ -293,7 +295,7 @@ static void ApplyImageEffect_Invert(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) *pixel = QuantizePixel_Invert(pixel); } } @@ -307,55 +309,55 @@ static void ApplyImageEffect_Shimmer(void) // First, invert all of the colors. pixel = gCanvasPixels; - for (i = 0; i < 64; i++) + for (i = 0; i < MAX_DIMENSION; i++) { - for (j = 0; j < 64; j++, pixel++) + for (j = 0; j < MAX_DIMENSION; j++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) *pixel = QuantizePixel_Invert(pixel); } } // Blur the pixels twice. - for (j = 0; j < 64; j++) + for (j = 0; j < MAX_DIMENSION; j++) { pixel = &gCanvasPixels[j]; prevPixel = *pixel; - *pixel = 0x8000; - for (i = 1, pixel += 64; i < 63; i++, pixel += 64) + *pixel = RGB_ALPHA; + for (i = 1, pixel += MAX_DIMENSION; i < MAX_DIMENSION - 1; i++, pixel += MAX_DIMENSION) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { - *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64); + *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + MAX_DIMENSION); prevPixel = *pixel; } } - *pixel = 0x8000; + *pixel = RGB_ALPHA; pixel = &gCanvasPixels[j]; prevPixel = *pixel; - *pixel = 0x8000; - for (i = 1, pixel += 64; i < 63; i++, pixel += 64) + *pixel = RGB_ALPHA; + for (i = 1, pixel += MAX_DIMENSION; i < MAX_DIMENSION - 1; i++, pixel += MAX_DIMENSION) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { - *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + 64); + *pixel = QuantizePixel_BlurHard(&prevPixel, pixel, pixel + MAX_DIMENSION); prevPixel = *pixel; } } - *pixel = 0x8000; + *pixel = RGB_ALPHA; } // Finally, invert colors back to the original color space. // The above blur causes the outline areas to darken, which makes // this inversion give the effect of light outlines. pixel = gCanvasPixels; - for (i = 0; i < 64; i++) + for (i = 0; i < MAX_DIMENSION; i++) { - for (j = 0; j < 64; j++, pixel++) + for (j = 0; j < MAX_DIMENSION; j++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) *pixel = QuantizePixel_Invert(pixel); } } @@ -372,7 +374,7 @@ static void ApplyImageEffect_BlurRight(void) u16 prevPixel = *pixel; for (i = 1, pixel++; i < gCanvasColumnEnd - 1; i++, pixel++) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); prevPixel = *pixel; @@ -392,7 +394,7 @@ static void ApplyImageEffect_BlurDown(void) u16 prevPixel = *pixel; for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) { - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); prevPixel = *pixel; @@ -408,19 +410,19 @@ struct PointillismPoint u16 delta; }; -static void AddPointillismPoints(u16 arg0) +static void AddPointillismPoints(u16 point) { u8 i; bool8 offsetDownLeft; u8 colorType; struct PointillismPoint points[6]; - points[0].column = gPointillismPoints[arg0][0]; - points[0].row = gPointillismPoints[arg0][1]; - points[0].delta = (gPointillismPoints[arg0][2] >> 3) & 7; + points[0].column = sPointillismPoints[point][0]; + points[0].row = sPointillismPoints[point][1]; + points[0].delta = GET_POINT_DELTA(sPointillismPoints[point][2]); - colorType = (gPointillismPoints[arg0][2] >> 1) & 3; - offsetDownLeft = gPointillismPoints[arg0][2] & 1; + colorType = GET_POINT_COLOR_TYPE(sPointillismPoints[point][2]); + offsetDownLeft = GET_POINT_OFFSET_DL(sPointillismPoints[point][2]); for (i = 1; i < points[0].delta; i++) { if (!offsetDownLeft) @@ -434,7 +436,7 @@ static void AddPointillismPoints(u16 arg0) points[i].row = points[0].row - 1; } - if (points[i].column > 63 || points[i].row > 63) + if (points[i].column >= MAX_DIMENSION || points[i].row >= MAX_DIMENSION) { points[0].delta = i - 1; break; @@ -445,19 +447,19 @@ static void AddPointillismPoints(u16 arg0) for (i = 0; i < points[0].delta; i++) { - u16 *pixel = &gCanvasPixels[points[i].row * 64] + points[i].column; + u16 *pixel = &gCanvasPixels[points[i].row * MAX_DIMENSION] + points[i].column; - if (!(0x8000 & *pixel)) + if (!IS_ALPHA(*pixel)) { - u16 red = (*pixel) & 0x1F; - u16 green = (*pixel >> 5) & 0x1F; - u16 blue = (*pixel >> 10) & 0x1F; + u16 red = GET_R(*pixel); + u16 green = GET_G(*pixel); + u16 blue = GET_B(*pixel); switch (colorType) { case 0: case 1: - switch (((gPointillismPoints[arg0][2] >> 3) & 7) % 3) + switch (GET_POINT_DELTA(sPointillismPoints[point][2]) % 3) { case 0: if (red >= points[i].delta) @@ -501,9 +503,9 @@ static void AddPointillismPoints(u16 arg0) static u16 ConvertColorToGrayscale(u16 *color) { s32 clr = *color; - s32 r = clr & 0x1F; - s32 g = (clr >> 5) & 0x1F; - s32 b = (clr >> 10) & 0x1F; + s32 r = GET_R(clr); + s32 g = GET_G(clr); + s32 b = GET_B(clr); s32 gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; return RGB2(gray, gray, gray); } @@ -512,9 +514,9 @@ static u16 ConvertColorToGrayscale(u16 *color) // Everything else is white. static u16 QuantizePixel_PersonalityColor(u16 *color, u8 personality) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); if (red < 17 && green < 17 && blue < 17) return GetColorFromPersonality(personality); @@ -526,9 +528,9 @@ static u16 QuantizePixel_PersonalityColor(u16 *color, u8 personality) // the mon's personality value, return a color. static u16 GetColorFromPersonality(u8 personality) { - u16 red = 0; + u16 red = 0; u16 green = 0; - u16 blue = 0; + u16 blue = 0; u8 strength = (personality / 6) % 3; u8 colorType = personality % 6; @@ -577,9 +579,9 @@ static u16 GetColorFromPersonality(u8 personality) static u16 QuantizePixel_BlackAndWhite(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); if (red < 17 && green < 17 && blue < 17) return RGB_BLACK; @@ -591,9 +593,9 @@ static u16 QuantizePixel_BlackOutline(u16 *pixelA, u16 *pixelB) { if (*pixelA != RGB_BLACK) { - if (*pixelA & 0x8000) - return 0x8000; - if (*pixelB & 0x8000) + if (IS_ALPHA(*pixelA)) + return RGB_ALPHA; + if (IS_ALPHA(*pixelB)) return RGB_BLACK; return *pixelA; @@ -604,13 +606,13 @@ static u16 QuantizePixel_BlackOutline(u16 *pixelA, u16 *pixelB) static u16 QuantizePixel_Invert(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); - red = 31 - red; + red = 31 - red; green = 31 - green; - blue = 31 - blue; + blue = 31 - blue; return RGB2(red, green, blue); } @@ -626,12 +628,12 @@ static u16 QuantizePixel_MotionBlur(u16 *prevPixel, u16 *curPixel) if (*prevPixel == *curPixel) return *curPixel; - pixelChannels[0][0] = (*prevPixel >> 0) & 0x1F; - pixelChannels[0][1] = (*prevPixel >> 5) & 0x1F; - pixelChannels[0][2] = (*prevPixel >> 10) & 0x1F; - pixelChannels[1][0] = (*curPixel >> 0) & 0x1F; - pixelChannels[1][1] = (*curPixel >> 5) & 0x1F; - pixelChannels[1][2] = (*curPixel >> 10) & 0x1F; + pixelChannels[0][0] = GET_R(*prevPixel); + pixelChannels[0][1] = GET_G(*prevPixel); + pixelChannels[0][2] = GET_B(*prevPixel); + pixelChannels[1][0] = GET_R(*curPixel); + pixelChannels[1][1] = GET_G(*curPixel); + pixelChannels[1][2] = GET_B(*curPixel); // Don't blur light colors. if (pixelChannels[0][0] > 25 && pixelChannels[0][1] > 25 && pixelChannels[0][2] > 25) @@ -667,9 +669,9 @@ static u16 QuantizePixel_MotionBlur(u16 *prevPixel, u16 *curPixel) largestDiff = diffs[0]; } - red = (pixelChannels[1][0] * (31 - largestDiff / 2)) / 31; + red = (pixelChannels[1][0] * (31 - largestDiff / 2)) / 31; green = (pixelChannels[1][1] * (31 - largestDiff / 2)) / 31; - blue = (pixelChannels[1][2] * (31 - largestDiff / 2)) / 31; + blue = (pixelChannels[1][2] * (31 - largestDiff / 2)) / 31; return RGB2(red, green, blue); } @@ -684,13 +686,13 @@ static u16 QuantizePixel_Blur(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) if (*prevPixel == *curPixel && *nextPixel == *curPixel) return *curPixel; - red = (*curPixel >> 0) & 0x1F; - green = (*curPixel >> 5) & 0x1F; - blue = (*curPixel >> 10) & 0x1F; + red = GET_R(*curPixel); + green = GET_G(*curPixel); + blue = GET_B(*curPixel); - prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3; - curAvg = (((*curPixel >> 0) & 0x1F) + ((*curPixel >> 5) & 0x1F) + ((*curPixel >> 10) & 0x1F)) / 3; - nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3; + prevAvg = (GET_R(*prevPixel) + GET_G(*prevPixel) + GET_B(*prevPixel)) / 3; + curAvg = (GET_R(*curPixel) + GET_G(*curPixel) + GET_B(*curPixel)) / 3; + nextAvg = (GET_R(*nextPixel) + GET_G(*nextPixel) + GET_B(*nextPixel)) / 3; if (prevAvg == curAvg && nextAvg == curAvg) return *curPixel; @@ -728,14 +730,14 @@ static u16 QuantizePixel_BlurHard(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) if (*prevPixel == *curPixel && *nextPixel == *curPixel) return *curPixel; - red = (*curPixel >> 0) & 0x1F; - green = (*curPixel >> 5) & 0x1F; - blue = (*curPixel >> 10) & 0x1F; - - prevAvg = (((*prevPixel >> 0) & 0x1F) + ((*prevPixel >> 5) & 0x1F) + ((*prevPixel >> 10) & 0x1F)) / 3; - curAvg = (((*curPixel >> 0) & 0x1F) + ((*curPixel >> 5) & 0x1F) + ((*curPixel >> 10) & 0x1F)) / 3; - nextAvg = (((*nextPixel >> 0) & 0x1F) + ((*nextPixel >> 5) & 0x1F) + ((*nextPixel >> 10) & 0x1F)) / 3; - + red = GET_R(*curPixel); + green = GET_G(*curPixel); + blue = GET_B(*curPixel); + + prevAvg = (GET_R(*prevPixel) + GET_G(*prevPixel) + GET_B(*prevPixel)) / 3; + curAvg = (GET_R(*curPixel) + GET_G(*curPixel) + GET_B(*curPixel)) / 3; + nextAvg = (GET_R(*nextPixel) + GET_G(*nextPixel) + GET_B(*nextPixel)) / 3; + if (prevAvg == curAvg && nextAvg == curAvg) return *curPixel; @@ -802,8 +804,8 @@ void ConvertImageProcessingToGBA(struct ImageProcessingContext *context) dest = dest_ + ((i * width + j) << 4) + (k << 1); src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); - dest[0] = src[0] | (src[1] << 4) | (src[2] << 8) | (src[3] << 0xC); - dest[1] = src[4] | (src[5] << 4) | (src[6] << 8) | (src[7] << 0xC); + dest[0] = src[0] | (src[1] << 4) | (src[2] << 8) | (src[3] << 12); + dest[1] = src[4] | (src[5] << 4) | (src[6] << 8) | (src[7] << 12); } } } @@ -851,37 +853,37 @@ void ApplyImageProcessingQuantization(struct ImageProcessingContext *context) static void SetPresetPalette_PrimaryColors(void) { - gCanvasPalette[0] = RGB2(0, 0, 0); - gCanvasPalette[1] = RGB2(6, 6, 6); - gCanvasPalette[2] = RGB2(29, 29, 29); - gCanvasPalette[3] = RGB2(11, 11, 11); - gCanvasPalette[4] = RGB2(29, 6, 6); - gCanvasPalette[5] = RGB2(6, 29, 6); - gCanvasPalette[6] = RGB2(6, 6, 29); - gCanvasPalette[7] = RGB2(29, 29, 6); - gCanvasPalette[8] = RGB2(29, 6, 29); - gCanvasPalette[9] = RGB2(6, 29, 29); - gCanvasPalette[10] = RGB2(29, 11, 6); - gCanvasPalette[11] = RGB2(11, 29, 6); - gCanvasPalette[12] = RGB2(6, 11, 29); - gCanvasPalette[13] = RGB2(29, 6, 11); - gCanvasPalette[14] = RGB2(6, 29, 11); - gCanvasPalette[15] = RGB2(11, 6, 29); + gCanvasPalette[0] = RGB_BLACK; + gCanvasPalette[1] = RGB(6, 6, 6); + gCanvasPalette[2] = RGB(29, 29, 29); + gCanvasPalette[3] = RGB(11, 11, 11); + gCanvasPalette[4] = RGB(29, 6, 6); + gCanvasPalette[5] = RGB(6, 29, 6); + gCanvasPalette[6] = RGB(6, 6, 29); + gCanvasPalette[7] = RGB(29, 29, 6); + gCanvasPalette[8] = RGB(29, 6, 29); + gCanvasPalette[9] = RGB(6, 29, 29); + gCanvasPalette[10] = RGB(29, 11, 6); + gCanvasPalette[11] = RGB(11, 29, 6); + gCanvasPalette[12] = RGB(6, 11, 29); + gCanvasPalette[13] = RGB(29, 6, 11); + gCanvasPalette[14] = RGB(6, 29, 11); + gCanvasPalette[15] = RGB(11, 6, 29); } static void SetPresetPalette_BlackAndWhite(void) { - gCanvasPalette[0] = RGB2(0, 0, 0); - gCanvasPalette[1] = RGB2(0, 0, 0); - gCanvasPalette[2] = RGB2(31, 31, 31); + gCanvasPalette[0] = RGB_BLACK; + gCanvasPalette[1] = RGB_BLACK; + gCanvasPalette[2] = RGB_WHITE; } static void SetPresetPalette_GrayscaleSmall(void) { u8 i; - gCanvasPalette[0] = RGB2(0, 0, 0); - gCanvasPalette[1] = RGB2(0, 0, 0); + gCanvasPalette[0] = RGB_BLACK; + gCanvasPalette[1] = RGB_BLACK; for (i = 0; i < 14; i++) gCanvasPalette[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2)); } @@ -890,7 +892,7 @@ static void SetPresetPalette_Grayscale(void) { u8 i; - gCanvasPalette[0] = RGB2(0, 0, 0); + gCanvasPalette[0] = RGB_BLACK; for (i = 0; i < 32; i++) gCanvasPalette[i + 1] = RGB2(i, i, i); } @@ -914,7 +916,7 @@ static void QuantizePalette_Standard(bool8 useLimitedPalette) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (*pixel & 0x8000) + if (IS_ALPHA(*pixel)) { *pixel = gCanvasPaletteStart; } @@ -982,7 +984,7 @@ static void QuantizePalette_BlackAndWhite(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (*pixel & 0x8000) + if (IS_ALPHA(*pixel)) { *pixel = gCanvasPaletteStart; } @@ -1013,7 +1015,7 @@ static void QuantizePalette_GrayscaleSmall(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (*pixel & 0x8000) + if (IS_ALPHA(*pixel)) *pixel = gCanvasPaletteStart; else *pixel = QuantizePixel_GrayscaleSmall(pixel) + gCanvasPaletteStart; @@ -1031,7 +1033,7 @@ static void QuantizePalette_Grayscale(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (*pixel & 0x8000) + if (IS_ALPHA(*pixel)) *pixel = gCanvasPaletteStart; else *pixel = QuantizePixel_Grayscale(pixel) + gCanvasPaletteStart; @@ -1049,7 +1051,7 @@ static void QuantizePalette_PrimaryColors(void) u16 *pixel = &pixelRow[gCanvasColumnStart]; for (i = 0; i < gCanvasColumnEnd; i++, pixel++) { - if (*pixel & 0x8000) + if (IS_ALPHA(*pixel)) *pixel = gCanvasPaletteStart; else *pixel = QuantizePixel_PrimaryColors(pixel) + gCanvasPaletteStart; @@ -1060,9 +1062,9 @@ static void QuantizePalette_PrimaryColors(void) // Quantizes the pixel's color channels to nearest multiple of 4, and clamps to [6, 30]. static u16 QuantizePixel_Standard(u16 *pixel) { - u16 red = *pixel & 0x1F; - u16 green = (*pixel >> 5) & 0x1F; - u16 blue = (*pixel >> 10) & 0x1F; + u16 red = GET_R(*pixel); + u16 green = GET_G(*pixel); + u16 blue = GET_B(*pixel); // Quantize color channels to muliples of 4, rounding up. if (red & 3) @@ -1091,10 +1093,10 @@ static u16 QuantizePixel_Standard(u16 *pixel) static u16 QuantizePixel_PrimaryColors(u16* color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; - + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); + if (red < 12 && green < 11 && blue < 11) return 1; @@ -1206,9 +1208,9 @@ static u16 QuantizePixel_PrimaryColors(u16* color) static u16 QuantizePixel_GrayscaleSmall(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); u16 average = ((red + green + blue) / 3) & 0x1E; if (average == 0) return 1; @@ -1218,9 +1220,9 @@ static u16 QuantizePixel_GrayscaleSmall(u16 *color) static u16 QuantizePixel_Grayscale(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); u16 average = (red + green + blue) / 3; return average + 1; } diff --git a/src/international_string_util.c b/src/international_string_util.c index 23ca6c081..ab812de89 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -152,7 +152,7 @@ void PadNameString(u8 *dest, u8 padChar) dest[length] = EOS; } -void sub_81DB52C(u8 *str) +void ConvertInternationalPlayerName(u8 *str) { if (StringLength(str) < PLAYER_NAME_LENGTH - 1) ConvertInternationalString(str, LANGUAGE_JAPANESE); @@ -160,14 +160,14 @@ void sub_81DB52C(u8 *str) StripExtCtrlCodes(str); } -void sub_81DB554(u8 *str, u8 arg1) +void ConvertInternationalPlayerNameStripChar(u8 *str, u8 removeChar) { u8 *buffer; if (StringLength(str) < PLAYER_NAME_LENGTH - 1) { ConvertInternationalString(str, LANGUAGE_JAPANESE); } - else if (arg1 == EXT_CTRL_CODE_BEGIN) + else if (removeChar == EXT_CTRL_CODE_BEGIN) { StripExtCtrlCodes(str); } @@ -177,7 +177,7 @@ void sub_81DB554(u8 *str, u8 arg1) while (buffer[1] != EOS) buffer++; - while (buffer >= str && buffer[0] == arg1) + while (buffer >= str && buffer[0] == removeChar) { buffer[0] = EOS; buffer--; @@ -185,7 +185,7 @@ void sub_81DB554(u8 *str, u8 arg1) } } -void sub_81DB5AC(u8 *str) +void ConvertInternationalContestantName(u8 *str) { if (*str++ == EXT_CTRL_CODE_BEGIN && *str++ == EXT_CTRL_CODE_JPN) { @@ -214,7 +214,7 @@ int sub_81DB604(u8 *str) if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN) return LANGUAGE_JAPANESE; else - return LANGUAGE_ENGLISH; + return GAME_LANGUAGE; } void sub_81DB620(int windowId, int columnStart, int rowStart, int numFillTiles, int numRows) diff --git a/src/intro.c b/src/intro.c index 7dab2ad46..1477b67a1 100644 --- a/src/intro.c +++ b/src/intro.c @@ -27,119 +27,193 @@ #include "constants/battle_anim.h" /* - * Intro animation sequence state machine - * -------------------------------------- - * - * Entry Point: CB2_InitCopyrightScreenAfterBootup - * - * Note: States advance sequentially unless otherwise stated. - * - * CB2_InitCopyrightScreenAfterBootup - * - Registers a serial interrupt handler that listens for a GameCube. - * - Waits for 140 frames, and then until palette fading completes. - * - Stops looking for a GameCube for dualboot. - * - Check the save file for corruption - * - Setup global pointers to save file - * - Initialize gHeap - * - * MainCB2_Intro - * - Spawn Task_IntroLoadPart1Graphics - * - If any keys are pressed during the intro, advance to - * MainCB2_EndIntro (which will then kill all tasks). - * - * Task_IntroLoadPart1Graphics - * Task_IntroFadeIn (frame counter starts at 0 here) - * Task_IntroWaterDrops - * - At frame 128 of this state, spawn Task_IntroWaterDrops_1 - * - At frame 256 of this state, spawn Task_IntroWaterDrops_2 - * - At frame 560 of this state, spawn Task_IntroWaterDrops_3 - * Task_IntroScrollDownAndShowFlygon - * Task_IntroWaitToSetupPart2 - * Task_IntroLoadPart2Graphics - * Task_IntroStartBikeRide - * - Spawn Task_AdvanceBicycleAnimation - * Task_IntroHandleBikeAndFlygonMovement - * - At frame 1856, kills the bicycle animation task - * Task_IntroWaitToSetupPart3 - * Task_IntroLoadPart3Graphics (frame counter resets to 0 here) - * Task_IntroSpinAndZoomPokeball - * - Continues until the zoom reaches a certain point - * Task_IntroWaitToSetupPart3LegendsFight - * Task_IntroLoadGroudonScene - * Task_IntroLoadPart3Graphics1 - * Task_IntroLoadPart3Graphics2 - * Task_IntroLoadPart3Graphics3 - * Task_IntroLoadPart3Graphics4 - * Task_IntroGroudonScene - * Task_IntroLoadKyogreScene - * Task_IntroKyogreScene - * Task_IntroLoadClouds1 - * Task_IntroLoadClouds2 - * Task_IntroLoadClouds3 - * Task_IntroCloudsScene - * Task_IntroLoadRayquazaLightningScene - * Task_IntroRayquazaLightningScene - * Task_IntroLoadRayquazaGlowScene - * Task_IntroRayquazaGlowScene_0 - * - Runs concurrently with Task_IntroRayquazaGlowScene_1 - * Task_EndIntroMovie - * MainCB2_EndIntro - * - Advances to CB2_InitTitleScreen - */ + The intro is grouped into the following scenes + Scene 0. Copyright screen + Scene 1. GF Logo, pan up over plants, Flygon silhouette goes by + Scene 2. Player biking on path, joined by Pokémon + Scene 3. A fight between Groudon/Kyogre ends with Rayquaza + + After this it progresses to the title screen +*/ + +// Scene 1 main tasks +static void Task_Scene1_Load(u8); +static void Task_Scene1_FadeIn(u8); +static void Task_Scene1_WaterDrops(u8); +static void Task_Scene1_PanUp(u8); +static void Task_Scene1_End(u8); + +// Scene 1 supplemental functions +static void IntroResetGpuRegs(void); +static u8 CreateGameFreakLogoSprites(s16, s16, s16); +static void Task_BlendLogoIn(u8); +static void Task_BlendLogoOut(u8); +static void Task_CreateSparkles(u8); +static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); +static void SpriteCB_WaterDrop(struct Sprite *sprite); +static void SpriteCB_WaterDrop_Slide(struct Sprite *); +static void SpriteCB_WaterDrop_ReachLeafEnd(struct Sprite *); +static void SpriteCB_WaterDrop_DangleFromLeaf(struct Sprite *); +static void SpriteCB_WaterDrop_Fall(struct Sprite *); +static void SpriteCB_WaterDrop_Ripple(struct Sprite *); +static void SpriteCB_Sparkle(struct Sprite *sprite); +static void SpriteCB_LogoLetter(struct Sprite *sprite); +static void SpriteCB_GameFreakLogo(struct Sprite *sprite); +static void SpriteCB_FlygonSilhouette(struct Sprite *sprite); + +// Scene 2 main tasks +static void Task_Scene2_Load(u8); +static void Task_Scene2_CreateSprites(u8); +static void Task_Scene2_BikeRide(u8); +static void Task_Scene2_End(u8); + +// Scene 2 supplemental functions +static void SpriteCB_Torchic(struct Sprite *sprite); +static void SpriteCB_Manectric(struct Sprite *sprite); +static void SpriteCB_Volbeat(struct Sprite *sprite); +static void SpriteCB_Flygon(struct Sprite *); +static void SpriteCB_PlayerOnBicycle(struct Sprite *); + +// Scene 3 main tasks +static void Task_Scene3_Load(u8); +static void Task_Scene3_SpinPokeball(u8); +static void Task_Scene3_WaitGroudon(u8); +static void Task_Scene3_LoadGroudon(u8); +static void Task_Scene3_InitGroudonBg(u8); +static void Task_Scene3_NarrowWindow(u8); +static void Task_Scene3_EndNarrowWindow(u8); +static void Task_Scene3_StartGroudon(u8); +static void Task_Scene3_Groudon(u8); +static void Task_Scene3_LoadKyogre(u8); +static void Task_Scene3_Kyogre(u8); +static void Task_Scene3_LoadClouds1(u8); +static void Task_Scene3_LoadClouds2(u8); +static void Task_Scene3_InitClouds(u8); +static void Task_Scene3_Clouds(u8); +static void Task_Scene3_LoadLightning(u8); +static void Task_Scene3_Lightning(u8); +static void Task_Scene3_LoadRayquazaAttack(u8); +static void Task_Scene3_Rayquaza(u8); +static void Task_EndIntroMovie(u8); + +// Scene 3 supplemental functions +static void CreateGroudonRockSprites(u8); +static void CreateKyogreBubbleSprites_Body(u8); +static void CreateKyogreBubbleSprites_Fins(void); +static void Task_RayquazaAttack(u8); +static void SpriteCB_GroudonRocks(struct Sprite *); +static void SpriteCB_KyogreBubbles(struct Sprite *sprite); +static void SpriteCB_Lightning(struct Sprite *sprite); +static void SpriteCB_RayquazaOrb(struct Sprite *sprite); + +static void MainCB2_EndIntro(void); extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; extern const struct SpriteTemplate gAncientPowerRockSpriteTemplate[]; -//ewram -EWRAM_DATA u16 gIntroCharacterGender = 0; -EWRAM_DATA u16 gUnknown_0203BCCA = 0; -EWRAM_DATA u16 gIntroGraphicsFlygonYOffset = 0; +#define TAG_VOLBEAT 1500 +#define TAG_TORCHIC 1501 +#define TAG_MANECTRIC 1502 +#define TAG_LIGHTNING 1503 +#define TAG_BUBBLES 1504 +#define TAG_SPARKLE 1505 + +#define GFXTAG_DROPS_LOGO 2000 +#define PALTAG_DROPS 2000 +#define PALTAG_LOGO 2001 + +#define TAG_FLYGON_SILHOUETTE 2002 +#define TAG_RAYQUAZA_ORB 2003 + +#define COLOSSEUM_GAME_CODE 0x65366347 // "Gc6e" in ASCII + +// Used by various tasks and sprites +#define tState data[0] +#define sState data[0] + +/* + gIntroFrameCounter is used as a persistent timer throughout the + intro cinematic. At various points it's used to determine when + to trigger actions or progress through the cutscene. + The values for these are defined contiguously below. +*/ +#define TIMER_BIG_DROP_START 76 +#define TIMER_LOGO_APPEAR 128 +#define TIMER_LOGO_LETTERS_COLOR 144 +#define TIMER_BIG_DROP_FALLS 251 +#define TIMER_LOGO_BLEND_OUT 256 +#define TIMER_LOGO_DISAPPEAR 272 +#define TIMER_SMALL_DROP_1 368 +#define TIMER_SMALL_DROP_2 384 +#define TIMER_SPARKLES 560 +#define TIMER_FLYGON_SILHOUETTE_APPEAR 832 +#define TIMER_END_PAN_UP 904 +#define TIMER_END_SCENE_1 1007 +#define TIMER_START_SCENE_2 1026 +#define TIMER_MANECTRIC_ENTER 1088 +#define TIMER_PLAYER_DRIFT_BACK 1109 +#define TIMER_MANECTRIC_RUN_CIRCULAR 1168 +#define TIMER_PLAYER_MOVE_FORWARD 1214 +#define TIMER_TORCHIC_ENTER 1224 +#define TIMER_FLYGON_ENTER 1394 +#define TIMER_PLAYER_MOVE_BACKWARD 1398 +#define TIMER_PLAYER_HOLD_POSITION 1576 +#define TIMER_PLAYER_EXIT 1727 +#define TIMER_TORCHIC_SPEED_UP 1735 +#define TIMER_TORCHIC_EXIT 1856 +#define TIMER_END_SCENE_2 1946 +#define TIMER_START_SCENE_3 2068 +// timer is reset for scene 3 +#define TIMER_POKEBALL_FADE 28 +#define TIMER_START_LEGENDARIES 43 + +static EWRAM_DATA u16 sIntroCharacterGender = 0; +static EWRAM_DATA u16 sUnusedVar = 0; +static EWRAM_DATA u16 sFlygonYOffset = 0; -//iwram u32 gIntroFrameCounter; struct GcmbStruct gMultibootProgramStruct; -//.rodata -static const u16 gIntro1DropsPal[] = INCBIN_U16("graphics/intro/intro1_drops.gbapal"); -static const u16 gIntro1GFLogoPal[] = INCBIN_U16("graphics/intro/intro1_gflogo.gbapal"); -static const u32 gIntroTiles[] = INCBIN_U32("graphics/intro/intro.4bpp.lz"); -static const u16 gIntro1BGPals[16][16] = INCBIN_U16("graphics/intro/intro1_bgpal.gbapal"); -static const u32 gIntro1BG0_Tilemap[] = INCBIN_U32("graphics/intro/intro1_bg0_map.bin.lz"); -static const u32 gIntro1BG1_Tilemap[] = INCBIN_U32("graphics/intro/intro1_bg1_map.bin.lz"); -static const u32 gIntro1BG2_Tilemap[] = INCBIN_U32("graphics/intro/intro1_bg2_map.bin.lz"); -static const u32 gIntro1BG3_Tilemap[] = INCBIN_U32("graphics/intro/intro1_bg3_map.bin.lz"); -static const u32 gIntro1BGLeavesGfx[] = INCBIN_U32("graphics/intro/introgfx.4bpp.lz"); -static const u16 gIntro3PokeballPal[] = INCBIN_U16("graphics/intro/intro3_pokeball.gbapal"); -static const u32 gIntro3Pokeball_Tilemap[] = INCBIN_U32("graphics/intro/intro3_pokeball_map.bin.lz"); -static const u32 gIntro3Pokeball_Gfx[] = INCBIN_U32("graphics/intro/intro3_pokeball.8bpp.lz"); -static const u16 gIntro3Streaks_Pal_Unused[] = INCBIN_U16("graphics/intro/intro3_streaks.gbapal"); -static const u32 gIntro3Streaks_Gfx_Unused[] = INCBIN_U32("graphics/intro/intro3_streaks.4bpp.lz"); -static const u32 gIntro3Streaks_Tilemap_Unused[] = INCBIN_U32("graphics/intro/intro3_streaks_map.bin.lz"); -static const u16 gIntro3Misc1Palette[] = INCBIN_U16("graphics/intro/intro3_misc1.gbapal"); -static const u16 gIntro3Misc2Palette_Unused[] = INCBIN_U16("graphics/intro/intro3_misc2.gbapal"); -static const u32 gIntro3MiscTiles[] = INCBIN_U32("graphics/intro/intro3_misc.4bpp.lz"); -static const u16 gIntro1FlygonPalette[] = INCBIN_U16("graphics/intro/intro1_flygon.gbapal"); -static const u32 gIntro1EonTiles_Unused[] = INCBIN_U32("graphics/intro/intro1_eon.4bpp.lz"); -static const u8 sUnknownBytes[] = { +static const u16 sIntroDrops_Pal[] = INCBIN_U16("graphics/intro/scene_1/drops.gbapal"); +static const u16 sIntroLogo_Pal[] = INCBIN_U16("graphics/intro/scene_1/logo.gbapal"); +static const u32 sIntroDropsLogo_Gfx[] = INCBIN_U32("graphics/intro/scene_1/drops_logo.4bpp.lz"); +static const u16 sIntro1Bg_Pal[16][16] = INCBIN_U16("graphics/intro/scene_1/bg.gbapal"); +static const u32 sIntro1Bg0_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg0_map.bin.lz"); +static const u32 sIntro1Bg1_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg1_map.bin.lz"); +static const u32 sIntro1Bg2_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg2_map.bin.lz"); +static const u32 sIntro1Bg3_Tilemap[] = INCBIN_U32("graphics/intro/scene_1/bg3_map.bin.lz"); +static const u32 sIntro1Bg_Gfx[] = INCBIN_U32("graphics/intro/scene_1/bg.4bpp.lz"); +static const u16 sIntroPokeball_Pal[] = INCBIN_U16("graphics/intro/scene_3/pokeball.gbapal"); +static const u32 sIntroPokeball_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/pokeball_map.bin.lz"); +static const u32 sIntroPokeball_Gfx[] = INCBIN_U32("graphics/intro/scene_3/pokeball.8bpp.lz"); +static const u16 sIntroStreaks_Pal[] = INCBIN_U16("graphics/intro/scene_3/streaks.gbapal"); // Unused +static const u32 sIntroStreaks_Gfx[] = INCBIN_U32("graphics/intro/scene_3/streaks.4bpp.lz"); // Unused +static const u32 sIntroStreaks_Tilemap[] = INCBIN_U32("graphics/intro/scene_3/streaks_map.bin.lz"); // Unused +static const u16 sIntroRayquzaOrb_Pal[] = INCBIN_U16("graphics/intro/scene_3/rayquaza_orb.gbapal"); +static const u16 sIntroMisc_Pal[] = INCBIN_U16("graphics/intro/scene_3/misc.gbapal"); // Unused +static const u32 sIntroMisc_Gfx[] = INCBIN_U32("graphics/intro/scene_3/misc.4bpp.lz"); // Rayquza orb, and misc unused gfx +static const u16 sIntroFlygonSilhouette_Pal[] = INCBIN_U16("graphics/intro/scene_1/flygon.gbapal"); +static const u32 sIntroLati_Gfx[] = INCBIN_U32("graphics/intro/scene_1/lati.4bpp.lz"); // Unused +static const u8 sUnusedData[] = { 0x02, 0x03, 0x04, 0x05, 0x01, 0x01, 0x01, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x02, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x02, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x00 }; -static const struct CompressedSpriteSheet gIntroSpriteSheet_Sparkle[] = +static const struct CompressedSpriteSheet sSpriteSheet_Sparkle[] = { - {gIntro1SparkleGfx, 0x400, 1505}, - {NULL}, + {gIntroSparkle_Gfx, 0x400, TAG_SPARKLE}, + {}, }; -static const struct SpritePalette gIntroPalette_Lightning[] = +static const struct SpritePalette sSpritePalette_Sparkle[] = { - {gIntro3LightningPal, 1505}, - {NULL}, + {gIntroLightning_Pal, TAG_SPARKLE}, // Lightning palette re-used + {}, }; -static const struct OamData gUnknown_085E4A94 = +static const struct OamData sOamData_Sparkle = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -153,7 +227,7 @@ static const struct OamData gUnknown_085E4A94 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4A9C[] = +static const union AnimCmd sAnim_Sparkle[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(4, 2), @@ -162,53 +236,52 @@ static const union AnimCmd gUnknown_085E4A9C[] = ANIMCMD_FRAME(16, 2), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_085E4AB4[] = +static const union AnimCmd *const sAnims_Sparkle[] = { - gUnknown_085E4A9C, + sAnim_Sparkle, }; -static void sub_816D338(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4AB8 = +static const struct SpriteTemplate sSpriteTemplate_Sparkle = { - .tileTag = 1505, - .paletteTag = 1505, - .oam = &gUnknown_085E4A94, - .anims = gUnknown_085E4AB4, + .tileTag = TAG_SPARKLE, + .paletteTag = TAG_SPARKLE, + .oam = &sOamData_Sparkle, + .anims = sAnims_Sparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816D338, + .callback = SpriteCB_Sparkle, }; -static const u8 gUnknown_085E4AD0[][2] = +static const u8 sSparkleCoords[][2] = { - {0x7C, 0x28}, - {0x66, 0x1E}, - {0x4D, 0x1E}, - {0x36, 0x0F}, - {0x94, 0x09}, - {0x3F, 0x1C}, - {0x5D, 0x28}, - {0x94, 0x20}, - {0xAD, 0x29}, - {0x5E, 0x14}, - {0xD0, 0x26}, - {0x00, 0x00}, + {124, 40}, + {102, 30}, + { 77, 30}, + { 54, 15}, + {148, 9}, + { 63, 28}, + { 93, 40}, + {148, 32}, + {173, 41}, + { 94, 20}, + {208, 38}, + {}, }; -static const struct CompressedSpriteSheet gIntroPokemonRunningSpriteSheet[] = +static const struct CompressedSpriteSheet sSpriteSheet_RunningPokemon[] = { - {gIntro2VolbeatGfx, 0x400, 1500}, - {gIntro2TorchicGfx, 0xC00, 1501}, - {gIntro2ManectricGfx, 0x2000, 1502}, - {NULL}, + {gIntroVolbeat_Gfx, 0x400, TAG_VOLBEAT}, + {gIntroTorchic_Gfx, 0xC00, TAG_TORCHIC}, + {gIntroManectric_Gfx, 0x2000, TAG_MANECTRIC}, + {}, }; -static const struct SpritePalette gIntroPokemonRunningPalette[] = +static const struct SpritePalette sSpritePalettes_RunningPokemon[] = { - {gIntro2VolbeatPal, 1500}, - {gIntro2TorchicPal, 1501}, - {gIntro2ManectricPal, 1502}, - {NULL}, + {gIntroVolbeat_Pal, TAG_VOLBEAT}, + {gIntroTorchic_Pal, TAG_TORCHIC}, + {gIntroManectric_Pal, TAG_MANECTRIC}, + {}, }; -static const struct OamData gUnknown_085E4B28 = +static const struct OamData sOamData_Volbeat = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -222,30 +295,29 @@ static const struct OamData gUnknown_085E4B28 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4B30[] = +static const union AnimCmd sAnim_Volbeat[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_085E4B3C[] = +static const union AnimCmd *const sAnims_Volbeat[] = { - gUnknown_085E4B30, + sAnim_Volbeat, }; -static void sub_816D81C(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4B40 = +static const struct SpriteTemplate sSpriteTemplate_Volbeat = { - .tileTag = 1500, - .paletteTag = 1500, - .oam = &gUnknown_085E4B28, - .anims = gUnknown_085E4B3C, + .tileTag = TAG_VOLBEAT, + .paletteTag = TAG_VOLBEAT, + .oam = &sOamData_Volbeat, + .anims = sAnims_Volbeat, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816D81C, + .callback = SpriteCB_Volbeat, }; -static const struct OamData gUnknown_085E4B58 = +static const struct OamData sOamData_Torchic = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -259,7 +331,7 @@ static const struct OamData gUnknown_085E4B58 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4B60[] = +static const union AnimCmd sAnim_Torchic_Walk[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), @@ -267,7 +339,7 @@ static const union AnimCmd gUnknown_085E4B60[] = ANIMCMD_FRAME(16, 5), ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E4B74[] = +static const union AnimCmd sAnim_Torchic_Run[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), @@ -275,33 +347,37 @@ static const union AnimCmd gUnknown_085E4B74[] = ANIMCMD_FRAME(16, 3), ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E4B88[] = +static const union AnimCmd sAnim_Torchic_Trip[] = { ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(64, 6), ANIMCMD_FRAME(80, 0), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E4B98[] = +enum { + TORCHIC_ANIM_WALK, + TORCHIC_ANIM_RUN, + TORCHIC_ANIM_TRIP, +}; +static const union AnimCmd *const sAnims_Torchic[] = { - gUnknown_085E4B60, - gUnknown_085E4B74, - gUnknown_085E4B88, + [TORCHIC_ANIM_WALK] = sAnim_Torchic_Walk, + [TORCHIC_ANIM_RUN] = sAnim_Torchic_Run, + [TORCHIC_ANIM_TRIP] = sAnim_Torchic_Trip, }; -static void sub_816D9C0(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4BA4 = +static const struct SpriteTemplate sSpriteTemplate_Torchic = { - .tileTag = 1501, - .paletteTag = 1501, - .oam = &gUnknown_085E4B58, - .anims = gUnknown_085E4B98, + .tileTag = TAG_TORCHIC, + .paletteTag = TAG_TORCHIC, + .oam = &sOamData_Torchic, + .anims = sAnims_Torchic, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816D9C0, + .callback = SpriteCB_Torchic, }; -static const struct OamData gUnknown_085E4BBC = +static const struct OamData sOamData_Manectric = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -315,7 +391,7 @@ static const struct OamData gUnknown_085E4BBC = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4BC4[] = +static const union AnimCmd sAnim_Manectric[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(64, 4), @@ -323,34 +399,33 @@ static const union AnimCmd gUnknown_085E4BC4[] = ANIMCMD_FRAME(192, 4), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_085E4BD8[] = +static const union AnimCmd *const sAnims_Manectric[] = { - gUnknown_085E4BC4, + sAnim_Manectric, }; -static void sub_816DAE8(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4BDC = +static const struct SpriteTemplate sSpriteTemplate_Manectric = { - .tileTag = 1502, - .paletteTag = 1502, - .oam = &gUnknown_085E4BBC, - .anims = gUnknown_085E4BD8, + .tileTag = TAG_MANECTRIC, + .paletteTag = TAG_MANECTRIC, + .oam = &sOamData_Manectric, + .anims = sAnims_Manectric, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816DAE8, + .callback = SpriteCB_Manectric, }; -static const struct CompressedSpriteSheet gIntroRayquazaLightningSpriteSheet[] = +static const struct CompressedSpriteSheet sSpriteSheet_Lightning[] = { - {gIntro3LightningGfx, 0xC00, 1503}, - {NULL}, + {gIntroLightning_Gfx, 0xC00, TAG_LIGHTNING}, + {}, }; -static const struct SpritePalette gIntroRayquazaLightningPalette[] = +static const struct SpritePalette sSpritePalette_Lightning[] = { - {gIntro3LightningPal, 1503}, - {NULL}, + {gIntroLightning_Pal, TAG_LIGHTNING}, + {}, }; -static const struct OamData gUnknown_085E4C14 = +static const struct OamData sOamData_Lightning = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -364,78 +439,84 @@ static const struct OamData gUnknown_085E4C14 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4C1C[] = +static const union AnimCmd sAnim_Lightning_Top[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4C28[] = +static const union AnimCmd sAnim_Lightning_Middle[] = { ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(64, 2), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4C34[] = +static const union AnimCmd sAnim_Lightning_Bottom[] = { ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(80, 2), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E4C40[] = +static const union AnimCmd *const sAnims_Lightning[] = { - gUnknown_085E4C1C, - gUnknown_085E4C28, - gUnknown_085E4C34, + sAnim_Lightning_Top, + sAnim_Lightning_Middle, + sAnim_Lightning_Bottom, }; -static void SpriteCB_IntroRayquazaLightning(struct Sprite *sprite); -static const struct SpriteTemplate gIntroLightningSprite = +static const struct SpriteTemplate sSpriteTemplate_Lightning = { - .tileTag = 1503, - .paletteTag = 1503, - .oam = &gUnknown_085E4C14, - .anims = gUnknown_085E4C40, + .tileTag = TAG_LIGHTNING, + .paletteTag = TAG_LIGHTNING, + .oam = &sOamData_Lightning, + .anims = sAnims_Lightning, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_IntroRayquazaLightning, -}; -static const s16 gIntroGroudonRockData[][3] = -{ - {0x68, 0x00, 0x0C0}, - {0x8E, 0x03, 0x280}, - {0x53, 0x01, 0x180}, - {0x9B, 0x00, 0x080}, - {0x38, 0x02, 0x200}, - {0xAE, 0x01, 0x100}, -}; -static const struct CompressedSpriteSheet gUnknown_085E4C88[] = -{ - {gIntro2BubblesGfx, 0x600, 1504}, - {NULL}, -}; -static const struct SpritePalette gUnknown_085E4C98[] = -{ - {gIntro2BubblesPal, 1504}, - {NULL}, -}; -static const s16 gIntroKyogreBubbleData[][3] = -{ - {0x42, 0x40, 0x1}, - {0x60, 0x60, 0x8}, - {0x80, 0x40, 0x1}, - {0x90, 0x30, 0x8}, - {0xA0, 0x48, 0x1}, - {0xB0, 0x60, 0x8}, - {0x60, 0x60, 0x4}, - {0x70, 0x68, 0x8}, - {0x80, 0x60, 0x4}, - {0x58, 0x20, 0x4}, - {0x68, 0x18, 0x8}, - {0x78, 0x20, 0x4}, -}; -static const struct OamData gUnknown_085E4CF0 = -{ - .y = 160, + .callback = SpriteCB_Lightning, +}; +// x coord, anim number, speed +// Smaller anim numbers are larger rocks, and are given slower speeds +static const s16 sGroudonRockData[][3] = +{ + {104, 0, 0x0C0}, + {142, 3, 0x280}, + { 83, 1, 0x180}, + {155, 0, 0x080}, + { 56, 2, 0x200}, + {174, 1, 0x100}, +}; +static const struct CompressedSpriteSheet sSpriteSheet_Bubbles[] = +{ + {gIntroBubbles_Gfx, 0x600, TAG_BUBBLES}, + {}, +}; +static const struct SpritePalette sSpritePalette_Bubbles[] = +{ + {gIntroBubbles_Pal, TAG_BUBBLES}, + {}, +}; +#define NUM_BUBBLES_IN_SET 6 +// x coord, y coord, delay before animation +// Can be produced in two different sets depending on the function called to create the sprites +static const s16 sKyogreBubbleData[NUM_BUBBLES_IN_SET * 2][3] = +{ + // Set 1, for Kyogre's body + { 66, 64, 1}, + { 96, 96, 8}, + {128, 64, 1}, + {144, 48, 8}, + {160, 72, 1}, + {176, 96, 8}, + // Set 2, for Kyogre's fins + { 96, 96, 4}, + {112, 104, 8}, + {128, 96, 4}, + { 88, 32, 4}, + {104, 24, 8}, + {120, 32, 4}, +}; +static const struct OamData sOamData_Bubbles = +{ + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -449,7 +530,7 @@ static const struct OamData gUnknown_085E4CF0 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4CF8[] = +static const union AnimCmd sAnim_Bubbles[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(8, 4), @@ -458,24 +539,23 @@ static const union AnimCmd gUnknown_085E4CF8[] = ANIMCMD_FRAME(32, 4), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E4D10[] = +static const union AnimCmd *const sAnims_Bubbles[] = { - gUnknown_085E4CF8, + sAnim_Bubbles, }; -static void SpriteCB_IntroKyogreBubbles(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4D14 = +static const struct SpriteTemplate sSpriteTemplate_Bubbles = { - .tileTag = 1504, - .paletteTag = 1504, - .oam = &gUnknown_085E4CF0, - .anims = gUnknown_085E4D10, + .tileTag = TAG_BUBBLES, + .paletteTag = TAG_BUBBLES, + .oam = &sOamData_Bubbles, + .anims = sAnims_Bubbles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_IntroKyogreBubbles, + .callback = SpriteCB_KyogreBubbles, }; -static const struct OamData gUnknown_085E4D2C = +static const struct OamData sOamData_WaterDrop = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -489,45 +569,50 @@ static const struct OamData gUnknown_085E4D2C = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4D34[] = +enum { + DROP_ANIM_UPPER_HALF, + DROP_ANIM_LOWER_HALF, + DROP_ANIM_REFLECTION, + DROP_ANIM_RIPPLE, +}; +static const union AnimCmd sAnim_WaterDrop_UpperHalf[] = { ANIMCMD_FRAME(16, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4D3C[] = +static const union AnimCmd sAnim_WaterDrop_LowerHalf[] = { ANIMCMD_FRAME(24, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4D44[] = +static const union AnimCmd sAnim_WaterDrop_Reflection[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4D4C[] = +static const union AnimCmd sAnim_WaterDrop_Ripple[] = { ANIMCMD_FRAME(48, 8), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E4D54[] = +static const union AnimCmd *const sAnims_WaterDrop[] = { - gUnknown_085E4D34, - gUnknown_085E4D3C, - gUnknown_085E4D44, - gUnknown_085E4D4C, + [DROP_ANIM_UPPER_HALF] = sAnim_WaterDrop_UpperHalf, + [DROP_ANIM_LOWER_HALF] = sAnim_WaterDrop_LowerHalf, + [DROP_ANIM_REFLECTION] = sAnim_WaterDrop_Reflection, + [DROP_ANIM_RIPPLE] = sAnim_WaterDrop_Ripple, }; -static void sub_816F454(struct Sprite *sprite); -static const struct SpriteTemplate gIntroWaterDropSprite = +static const struct SpriteTemplate sSpriteTemplate_WaterDrop = { - .tileTag = 2000, - .paletteTag = 2000, - .oam = &gUnknown_085E4D2C, - .anims = gUnknown_085E4D54, + .tileTag = GFXTAG_DROPS_LOGO, + .paletteTag = PALTAG_DROPS, + .oam = &sOamData_WaterDrop, + .anims = sAnims_WaterDrop, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816F454, + .callback = SpriteCB_WaterDrop, }; -static const union AnimCmd gUnknown_085E4D7C[] = +static const union AnimCmd sAnim_PlayerBicycle_Fast[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(64, 4), @@ -535,7 +620,7 @@ static const union AnimCmd gUnknown_085E4D7C[] = ANIMCMD_FRAME(192, 4), ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E4D90[] = +static const union AnimCmd sAnim_PlayerBicycle_Slow[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(64, 8), @@ -543,30 +628,36 @@ static const union AnimCmd gUnknown_085E4D90[] = ANIMCMD_FRAME(192, 8), ANIMCMD_JUMP(0), }; -static const union AnimCmd gUnknown_085E4DA4[] = +// The below two animations appear to be copied from the Credits version +// of the player graphic, where additional frames are present to show +// the player turning around to look at their rival. +// They go unused here, and if they were used they'd overflow beyond +// the player graphics data. +// The above sAnim_PlayerBicycle_Slow, while valid, is likewise unused +static const union AnimCmd sAnim_PlayerBicycle_LookBack[] = { ANIMCMD_FRAME(256, 4), - ANIMCMD_FRAME(0x140, 4), - ANIMCMD_FRAME(0x180, 4), + ANIMCMD_FRAME(320, 4), + ANIMCMD_FRAME(384, 4), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4DB4[] = +static const union AnimCmd sAnim_PlayerBicycle_LookForward[] = { - ANIMCMD_FRAME(0x180, 16), - ANIMCMD_FRAME(0x140, 16), + ANIMCMD_FRAME(384, 16), + ANIMCMD_FRAME(320, 16), ANIMCMD_FRAME(256, 16), ANIMCMD_END, }; -static const union AnimCmd *const gIntroBicycleAnimationCommands[] = +static const union AnimCmd *const sAnims_PlayerBicycle[] = { - gUnknown_085E4D7C, - gUnknown_085E4D90, - gUnknown_085E4DA4, - gUnknown_085E4DB4, + sAnim_PlayerBicycle_Fast, + sAnim_PlayerBicycle_Slow, + sAnim_PlayerBicycle_LookBack, + sAnim_PlayerBicycle_LookForward, }; -static const struct OamData gUnknown_085E4DD4 = +static const struct OamData sOamData_GameFreakLetter = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -580,9 +671,9 @@ static const struct OamData gUnknown_085E4DD4 = .paletteNum = 0, .affineParam = 0, }; -static const struct OamData gUnknown_085E4DDC = +static const struct OamData sOamData_PresentsLetter = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -596,9 +687,9 @@ static const struct OamData gUnknown_085E4DDC = .paletteNum = 0, .affineParam = 0, }; -static const struct OamData gUnknown_085E4DE4 = +static const struct OamData sOamData_GameFreakLogo = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_BLEND, .mosaic = 0, @@ -612,193 +703,232 @@ static const struct OamData gUnknown_085E4DE4 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4DEC[] = +static const union AnimCmd sAnim_GameFreakLetter_G[] = { ANIMCMD_FRAME(80, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4DF4[] = +static const union AnimCmd sAnim_GameFreakLetter_A[] = { ANIMCMD_FRAME(84, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4DFC[] = +static const union AnimCmd sAnim_GameFreakLetter_M[] = { ANIMCMD_FRAME(88, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E04[] = +static const union AnimCmd sAnim_GameFreakLetter_E[] = { ANIMCMD_FRAME(92, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E0C[] = +static const union AnimCmd sAnim_GameFreakLetter_F[] = { ANIMCMD_FRAME(96, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E14[] = +static const union AnimCmd sAnim_GameFreakLetter_R[] = { ANIMCMD_FRAME(100, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E1C[] = +static const union AnimCmd sAnim_GameFreakLetter_K[] = { ANIMCMD_FRAME(104, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E24[] = +static const union AnimCmd sAnim_PresentsLetter_P[] = { ANIMCMD_FRAME(112, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E2C[] = +static const union AnimCmd sAnim_PresentsLetter_R[] = { ANIMCMD_FRAME(113, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E34[] = +static const union AnimCmd sAnim_PresentsLetter_E[] = { ANIMCMD_FRAME(114, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E3C[] = +static const union AnimCmd sAnim_PresentsLetter_S[] = { ANIMCMD_FRAME(115, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E44[] = +static const union AnimCmd sAnim_PresentsLetter_N[] = { ANIMCMD_FRAME(116, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E4C[] = +static const union AnimCmd sAnim_PresentsLetter_T[] = { ANIMCMD_FRAME(117, 8), ANIMCMD_END, }; -static const union AnimCmd gUnknown_085E4E54[] = +static const union AnimCmd sAnim_GameFreakLogo[] = { ANIMCMD_FRAME(128, 8), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E4E5C[] = -{ - gUnknown_085E4DEC, - gUnknown_085E4DF4, - gUnknown_085E4DFC, - gUnknown_085E4E04, - gUnknown_085E4E0C, - gUnknown_085E4E14, - gUnknown_085E4E1C, -}; -static const union AnimCmd *const gUnknown_085E4E78[] = -{ - gUnknown_085E4E24, - gUnknown_085E4E2C, - gUnknown_085E4E34, - gUnknown_085E4E3C, - gUnknown_085E4E44, - gUnknown_085E4E4C, -}; -static const union AnimCmd *const gUnknown_085E4E90[] = -{ - gUnknown_085E4E54, -}; -static const s16 gUnknown_085E4E94[][2] = -{ - {0, -72}, - {1, -56}, - {2, -40}, - {3, -24}, - {4, 8}, - {5, 24}, - {3, 40}, - {1, 56}, - {6, 72}, - {0, -28}, - {1, -20}, - {2, -12}, - {3, -4}, - {2, 4}, - {4, 12}, - {5, 20}, - {3, 28}, -}; -static const union AffineAnimCmd gUnknown_085E4ED8[] = + +enum { + GAMEFREAK_G, + GAMEFREAK_A, + GAMEFREAK_M, + GAMEFREAK_E, + GAMEFREAK_F, + GAMEFREAK_R, + GAMEFREAK_K, +}; +enum { + PRESENTS_P, + PRESENTS_R, + PRESENTS_E, + PRESENTS_S, + PRESENTS_N, + PRESENTS_T, +}; +static const union AnimCmd *const sAnims_GameFreakLetter[] = +{ + [GAMEFREAK_G] = sAnim_GameFreakLetter_G, + [GAMEFREAK_A] = sAnim_GameFreakLetter_A, + [GAMEFREAK_M] = sAnim_GameFreakLetter_M, + [GAMEFREAK_E] = sAnim_GameFreakLetter_E, + [GAMEFREAK_F] = sAnim_GameFreakLetter_F, + [GAMEFREAK_R] = sAnim_GameFreakLetter_R, + [GAMEFREAK_K] = sAnim_GameFreakLetter_K, +}; +static const union AnimCmd *const sAnims_PresentsLetter[] = +{ + [PRESENTS_P] = sAnim_PresentsLetter_P, + [PRESENTS_R] = sAnim_PresentsLetter_R, + [PRESENTS_E] = sAnim_PresentsLetter_E, + [PRESENTS_S] = sAnim_PresentsLetter_S, + [PRESENTS_N] = sAnim_PresentsLetter_N, + [PRESENTS_T] = sAnim_PresentsLetter_T, +}; +static const union AnimCmd *const sAnims_GameFreakLogo[] = +{ + sAnim_GameFreakLogo, +}; +#define NUM_GF_LETTERS 9 // Letters in "Game Freak" +static const s16 sGameFreakLetterData[NUM_GF_LETTERS][2] = +{ + // Letter, x offset + {GAMEFREAK_G, -72}, + {GAMEFREAK_A, -56}, + {GAMEFREAK_M, -40}, + {GAMEFREAK_E, -24}, + {GAMEFREAK_F, 8}, + {GAMEFREAK_R, 24}, + {GAMEFREAK_E, 40}, + {GAMEFREAK_A, 56}, + {GAMEFREAK_K, 72}, +}; +static const s16 sPresentsLetterData[][2] = +{ + // Letter, x offset + {PRESENTS_P, -28}, + {PRESENTS_R, -20}, + {PRESENTS_E, -12}, + {PRESENTS_S, -4}, + {PRESENTS_E, 4}, + {PRESENTS_N, 12}, + {PRESENTS_T, 20}, + {PRESENTS_S, 28}, +}; +static const union AffineAnimCmd sAffineAnim_GameFreak_Small[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_085E4EE8[] = +static const union AffineAnimCmd sAffineAnim_GameFreak_GrowAndShrink[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(16, 16, 0, 16), AFFINEANIMCMD_FRAME(-16, -16, 0, 8), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_085E4F08[] = +static const union AffineAnimCmd sAffineAnim_GameFreak_GrowBig[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(8, 8, 0, 48), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd gUnknown_085E4F20[] = +static const union AffineAnimCmd sAffineAnim_GameFreak_GrowMedium[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(2, 2, 0, 48), AFFINEANIMCMD_END, }; -static const union AffineAnimCmd *const gUnknown_085E4F38[] = +static const union AffineAnimCmd *const sAffineAnims_GameFreak[] = { - gUnknown_085E4ED8, - gUnknown_085E4EE8, - gUnknown_085E4F08, - gUnknown_085E4F20, + sAffineAnim_GameFreak_Small, // Initialize letters while still invisible + sAffineAnim_GameFreak_GrowAndShrink, // For letters appearing. Logo does this too, but while it's invisible + sAffineAnim_GameFreak_GrowBig, // For letters disappearing + sAffineAnim_GameFreak_GrowMedium, // For logo disappearing }; -static const u16 gUnknown_085E4F48[] = +static const u16 sGameFreakLettersMoveSpeed[NUM_GF_LETTERS] = { - 0x100, 0xC0, 0x80, 0x40, 0x00, 0x40, 0x80, 0xC0, 0x100 + 256, // G + 192, // A + 128, // M + 64, // E + 0, // F + 64, // R + 128, // E + 192, // A + 256 // K }; -static void sub_816FB38(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4F5C = +static const struct SpriteTemplate sSpriteTemplate_GameFreakLetter = { - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gUnknown_085E4DD4, - .anims = gUnknown_085E4E5C, + .tileTag = GFXTAG_DROPS_LOGO, + .paletteTag = PALTAG_LOGO, + .oam = &sOamData_GameFreakLetter, + .anims = sAnims_GameFreakLetter, .images = NULL, - .affineAnims = gUnknown_085E4F38, - .callback = sub_816FB38, + .affineAnims = sAffineAnims_GameFreak, + .callback = SpriteCB_LogoLetter, }; -static const struct SpriteTemplate gUnknown_085E4F74 = +// Unused +static const struct SpriteTemplate sSpriteTemplate_PresentsLetter = { - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gUnknown_085E4DDC, - .anims = gUnknown_085E4E78, + .tileTag = GFXTAG_DROPS_LOGO, + .paletteTag = PALTAG_LOGO, + .oam = &sOamData_PresentsLetter, + .anims = sAnims_PresentsLetter, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816FB38, + .callback = SpriteCB_LogoLetter, }; -static void sub_816FD44(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4F8C = +static const struct SpriteTemplate sSpriteTemplate_GameFreakLogo = { - .tileTag = 2000, - .paletteTag = 2001, - .oam = &gUnknown_085E4DE4, - .anims = gUnknown_085E4E90, + .tileTag = GFXTAG_DROPS_LOGO, + .paletteTag = PALTAG_LOGO, + .oam = &sOamData_GameFreakLogo, + .anims = sAnims_GameFreakLogo, .images = NULL, - .affineAnims = gUnknown_085E4F38, - .callback = sub_816FD44, + .affineAnims = sAffineAnims_GameFreak, + .callback = SpriteCB_GameFreakLogo, }; -static const u8 gUnknown_085E4FA4[] = +static const u8 sGameFreakLetterStartDelays[NUM_GF_LETTERS] = { - 0x00, 0x17, 0x17, 0x31, 0x3E, 0x24, 0x24, 0x0A, 0x0A + 0, // G + 23, // A + 23, // M + 49, // E + 62, // F + 36, // R + 36, // E + 10, // A + 10 // K }; -static const struct OamData gUnknown_085E4FB0 = +static const struct OamData sOamData_FlygonSilhouette = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -812,46 +942,45 @@ static const struct OamData gUnknown_085E4FB0 = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E4FB8[] = +static const union AnimCmd sAnim_FlygonSilhouette[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const gUnknown_085E4FC0[] = +static const union AnimCmd *const sAnims_FlygonSilhouette[] = { - gUnknown_085E4FB8, + sAnim_FlygonSilhouette, }; -static void sub_816FEDC(struct Sprite *sprite); -static const struct SpriteTemplate gUnknown_085E4FC4 = +static const struct SpriteTemplate sSpriteTemplate_FlygonSilhouette = { - .tileTag = 2002, - .paletteTag = 2002, - .oam = &gUnknown_085E4FB0, - .anims = gUnknown_085E4FC0, + .tileTag = TAG_FLYGON_SILHOUETTE, + .paletteTag = TAG_FLYGON_SILHOUETTE, + .oam = &sOamData_FlygonSilhouette, + .anims = sAnims_FlygonSilhouette, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_816FEDC, + .callback = SpriteCB_FlygonSilhouette, }; -static const struct CompressedSpriteSheet gIntroSpriteSheet_WaterDropAndLogo[] = +static const struct CompressedSpriteSheet sSpriteSheet_WaterDropsAndLogo[] = { - {gIntroTiles, 0x1400, 2000}, - {NULL}, + {sIntroDropsLogo_Gfx, 0x1400, GFXTAG_DROPS_LOGO}, + {}, }; -static const struct CompressedSpriteSheet gIntroSpriteSheet_Flygon[] = +static const struct CompressedSpriteSheet sSpriteSheet_FlygonSilhouette[] = { - {gIntro1FlygonGfx, 0x400, 2002}, - {NULL}, + {gIntroFlygonSilhouette_Gfx, 0x400, TAG_FLYGON_SILHOUETTE}, + {}, }; -static const struct SpritePalette gIntroPalette_DropLogoFlygon[] = +static const struct SpritePalette sSpritePalettes_Intro1[] = { - {gIntro1DropsPal, 2000}, - {gIntro1GFLogoPal, 2001}, - {gIntro1FlygonPalette, 2002}, - {NULL}, + {sIntroDrops_Pal, PALTAG_DROPS}, + {sIntroLogo_Pal, PALTAG_LOGO}, + {sIntroFlygonSilhouette_Pal, TAG_FLYGON_SILHOUETTE}, + {}, }; -static const struct OamData gUnknown_085E501C = +static const struct OamData sOamData_RayquazaOrb = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -865,86 +994,36 @@ static const struct OamData gUnknown_085E501C = .paletteNum = 0, .affineParam = 0, }; -static const union AnimCmd gUnknown_085E5024[] = +static const union AnimCmd sAnim_RayquazaOrb[] = { ANIMCMD_FRAME(16, 8), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_085E502C[] = +static const union AnimCmd *const sAnims_RayquazaOrb[] = { - gUnknown_085E5024, + sAnim_RayquazaOrb, }; -static void SpriteCB_IntroRayquazaHyperbeam(struct Sprite *sprite); -static const struct SpriteTemplate gIntroRayquazaHyperbeamSprite = +static const struct SpriteTemplate sSpriteTemplate_RayquazaOrb = { - .tileTag = 2003, - .paletteTag = 2003, - .oam = &gUnknown_085E501C, - .anims = gUnknown_085E502C, + .tileTag = TAG_RAYQUAZA_ORB, + .paletteTag = TAG_RAYQUAZA_ORB, + .oam = &sOamData_RayquazaOrb, + .anims = sAnims_RayquazaOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_IntroRayquazaHyperbeam, + .callback = SpriteCB_RayquazaOrb, }; -static const struct CompressedSpriteSheet gIntroRayquazaGlowSpriteSheet[] = +static const struct CompressedSpriteSheet sSpriteSheet_RayquazaOrb[] = { - {gIntro3MiscTiles, 0xA00, 2003}, - {NULL}, + {sIntroMisc_Gfx, 0xA00, TAG_RAYQUAZA_ORB}, + {}, }; -static const struct SpritePalette gIntroRayquazaGlowPalette[] = +static const struct SpritePalette sSpritePalette_RayquazaOrb[] = { - {gIntro3Misc1Palette, 2003}, - {NULL}, + {sIntroRayquzaOrb_Pal, TAG_RAYQUAZA_ORB}, + {}, }; -// this file's functions -static void MainCB2_EndIntro(void); -static void Task_IntroLoadPart1Graphics(u8); -static u8 CreateWaterDrop(s16, s16, u16, u16, u16, u8); -static void Task_IntroFadeIn(u8); -static void intro_reset_and_hide_bgs(void); -static void Task_IntroWaterDrops(u8); -static void Task_IntroWaterDrops_1(u8); -static void Task_IntroWaterDrops_2(u8); -static void Task_IntroWaterDrops_3(u8); -static void Task_IntroScrollDownAndShowFlygon(u8); -static void Task_IntroWaitToSetupPart2(u8); -static void Task_IntroLoadPart2Graphics(u8); -static void Task_IntroStartBikeRide(u8); -static void Task_IntroHandleBikeAndFlygonMovement(u8); -static void Task_IntroWaitToSetupPart3(u8); -static void Task_IntroLoadPart3Graphics(u8); -static void Task_IntroSpinAndZoomPokeball(u8); -static void Task_IntroWaitToSetupPart3LegendsFight(u8); -static void Task_IntroLoadGroudonScene(u8); -static void Task_IntroLoadPart3Graphics1(u8); -static void Task_IntroLoadPart3Graphics2(u8); -static void Task_IntroLoadPart3Graphics3(u8); -static void Task_IntroLoadPart3Graphics4(u8); -static void Task_IntroGroudonScene(u8); -static void Task_IntroLoadKyogreScene(u8); -static void Task_IntroKyogreScene(u8); -static void Task_IntroLoadClouds1(u8); -static void Task_IntroLoadClouds2(u8); -static void Task_IntroLoadClouds3(u8); -static void Task_IntroCloudScene(u8); -static void Task_IntroLoadRayquazaLightningScene(u8); -static void Task_IntroRayquazaLightningScene(u8); -static void Task_IntroLoadRayquazaGlowScene(u8); -static void Task_IntroRayquazaGlowScene_0(u8); -static void Task_EndIntroMovie(u8); -static void CreateGroudonRockSprites(u8); -static void SpriteCB_IntroGroudonRocks(struct Sprite *); -static void CreateKyogreBubbleSprites_0(u8); -static void CreateKyogreBubbleSprites_1(void); -static void Task_IntroRayquazaGlowScene_1(u8); -static void sub_816F46C(struct Sprite *); -static void sub_816F5B4(struct Sprite *); -static void sub_816F660(struct Sprite *); -static void SpriteCB_WaterDropFall(struct Sprite *); -static void sub_816F318(struct Sprite *); -static void SpriteCB_IntroGraphicsBicycle(struct Sprite *); -static void SpriteCB_IntroGraphicsFlygon(struct Sprite *); -static u8 CreatePart1Animations(s16, s16, s16); static void VBlankCB_Intro(void) { @@ -976,7 +1055,7 @@ static void LoadCopyrightGraphics(u16 tilesetAddress, u16 tilemapAddress, u16 pa { LZ77UnCompVram(gIntroCopyright_Gfx, (void *)(VRAM + tilesetAddress)); LZ77UnCompVram(gIntroCopyright_Tilemap, (void *)(VRAM + tilemapAddress)); - LoadPalette(gIntroCopyright_Pal, paletteAddress, 0x20); + LoadPalette(gIntroCopyright_Pal, paletteAddress, 32); } static void SerialCB_CopyrightScreen(void) @@ -986,8 +1065,6 @@ static void SerialCB_CopyrightScreen(void) static u8 SetUpCopyrightScreen(void) { - u16 ime; - switch (gMain.state) { case 0: @@ -995,7 +1072,7 @@ static u8 SetUpCopyrightScreen(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); - *(u16 *)PLTT = 0x7FFF; + *(u16 *)PLTT = RGB_WHITE; SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); @@ -1008,7 +1085,7 @@ static u8 SetUpCopyrightScreen(void) ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(7) @@ -1028,24 +1105,24 @@ static u8 SetUpCopyrightScreen(void) GameCubeMultiBoot_Main(&gMultibootProgramStruct); if (gMultibootProgramStruct.gcmb_field_2 != 1) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state++; } break; case 141: if (UpdatePaletteFade()) break; - CreateTask(Task_IntroLoadPart1Graphics, 0); + CreateTask(Task_Scene1_Load, 0); SetMainCallback2(MainCB2_Intro); if (gMultibootProgramStruct.gcmb_field_2 != 0) { if (gMultibootProgramStruct.gcmb_field_2 == 2) { // check the multiboot ROM header game code to see if we already did this - if (*(u32 *)(EWRAM_START + 0xAC) == 0x65366347) // "Gc6e" in ASCII + if (*(u32 *)(EWRAM_START + 0xAC) == COLOSSEUM_GAME_CODE) { CpuCopy16(&gMultiBootProgram_PokemonColosseum_Start, (void *)EWRAM_START, sizeof(gMultiBootProgram_PokemonColosseum_Start)); - *(u32 *)(EWRAM_START + 0xAC) = 0x65366347; + *(u32 *)(EWRAM_START + 0xAC) = COLOSSEUM_GAME_CODE; } GameCubeMultiBoot_ExecuteProgram(&gMultibootProgramStruct); } @@ -1081,409 +1158,482 @@ void CB2_InitCopyrightScreenAfterTitleScreen(void) SetUpCopyrightScreen(); } -static void Task_IntroLoadPart1Graphics(u8 taskId) +#define sBigDropSpriteId data[0] + +static void Task_Scene1_Load(u8 taskId) { SetVBlankCallback(NULL); - gIntroCharacterGender = Random() & 1; - intro_reset_and_hide_bgs(); + sIntroCharacterGender = Random() & 1; + IntroResetGpuRegs(); SetGpuReg(REG_OFFSET_BG3VOFS, 0); - SetGpuReg(REG_OFFSET_BG2VOFS, 0x50); - SetGpuReg(REG_OFFSET_BG1VOFS, 0x18); - SetGpuReg(REG_OFFSET_BG0VOFS, 0x28); - LZ77UnCompVram(gIntro1BGLeavesGfx, (void *)VRAM); - LZ77UnCompVram(gIntro1BG0_Tilemap, (void *)(BG_CHAR_ADDR(2))); - DmaClear16(3, BG_SCREEN_ADDR(17), 0x800); - LZ77UnCompVram(gIntro1BG1_Tilemap, (void *)(BG_SCREEN_ADDR(18))); - DmaClear16(3, BG_SCREEN_ADDR(19), 0x800); - LZ77UnCompVram(gIntro1BG2_Tilemap, (void *)(BG_SCREEN_ADDR(20))); - DmaClear16(3, BG_SCREEN_ADDR(21), 0x800); - LZ77UnCompVram(gIntro1BG3_Tilemap, (void *)(BG_SCREEN_ADDR(22))); - DmaClear16(3, BG_SCREEN_ADDR(23), 0x800); - LoadPalette(gIntro1BGPals, 0, sizeof(gIntro1BGPals)); + SetGpuReg(REG_OFFSET_BG2VOFS, 80); + SetGpuReg(REG_OFFSET_BG1VOFS, 24); + SetGpuReg(REG_OFFSET_BG0VOFS, 40); + LZ77UnCompVram(sIntro1Bg_Gfx, (void *)VRAM); + LZ77UnCompVram(sIntro1Bg0_Tilemap, (void *)(BG_CHAR_ADDR(2))); + DmaClear16(3, BG_SCREEN_ADDR(17), BG_SCREEN_SIZE); + LZ77UnCompVram(sIntro1Bg1_Tilemap, (void *)(BG_SCREEN_ADDR(18))); + DmaClear16(3, BG_SCREEN_ADDR(19), BG_SCREEN_SIZE); + LZ77UnCompVram(sIntro1Bg2_Tilemap, (void *)(BG_SCREEN_ADDR(20))); + DmaClear16(3, BG_SCREEN_ADDR(21), BG_SCREEN_SIZE); + LZ77UnCompVram(sIntro1Bg3_Tilemap, (void *)(BG_SCREEN_ADDR(22))); + DmaClear16(3, BG_SCREEN_ADDR(23), BG_SCREEN_SIZE); + LoadPalette(sIntro1Bg_Pal, 0, sizeof(sIntro1Bg_Pal)); SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(22) | BGCNT_16COLOR | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(20) | BGCNT_16COLOR | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(18) | BGCNT_16COLOR | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(16) | BGCNT_16COLOR | BGCNT_TXT256x512); - LoadCompressedSpriteSheet(gIntroSpriteSheet_WaterDropAndLogo); - LoadCompressedSpriteSheet(gIntroSpriteSheet_Flygon); - LoadSpritePalettes(gIntroPalette_DropLogoFlygon); - LoadCompressedSpriteSheet(gIntroSpriteSheet_Sparkle); - LoadSpritePalettes(gIntroPalette_Lightning); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1F0, 0x20); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1E1, 0x1E); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1D2, 0x1C); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1C3, 0x1A); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1B4, 0x18); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x1A5, 0x16); - CpuCopy16(gPlttBufferUnfaded + 0x100, gPlttBufferUnfaded + 0x196, 0x14); - CreatePart1Animations(0x78, 0x50, 0); - gTasks[taskId].data[0] = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); - gTasks[taskId].func = Task_IntroFadeIn; -} - -static void Task_IntroFadeIn(u8 taskId) -{ - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + LoadCompressedSpriteSheet(sSpriteSheet_WaterDropsAndLogo); + LoadCompressedSpriteSheet(sSpriteSheet_FlygonSilhouette); + LoadSpritePalettes(sSpritePalettes_Intro1); + LoadCompressedSpriteSheet(sSpriteSheet_Sparkle); + LoadSpritePalettes(sSpritePalette_Sparkle); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1F0], 0x20); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1E1], 0x1E); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1D2], 0x1C); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1C3], 0x1A); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1B4], 0x18); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x1A5], 0x16); + CpuCopy16(&gPlttBufferUnfaded[0x100], &gPlttBufferUnfaded[0x196], 0x14); + CreateGameFreakLogoSprites(120, 80, 0); + gTasks[taskId].sBigDropSpriteId = CreateWaterDrop(236, -14, 0x200, 1, 0x78, FALSE); + gTasks[taskId].func = Task_Scene1_FadeIn; +} + +static void Task_Scene1_FadeIn(u8 taskId) +{ + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_Intro); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON); - gTasks[taskId].func = Task_IntroWaterDrops; + gTasks[taskId].func = Task_Scene1_WaterDrops; gIntroFrameCounter = 0; m4aSongNumStart(MUS_INTRO); ResetSerial(); } -static void Task_IntroWaterDrops(u8 taskId) +// Task data for Task_Scene1_PanUp +#define tBg2PosHi data[1] +#define tBg2PosLo data[2] +#define tBg1PosHi data[3] +#define tBg1PosLo data[4] +#define tBg3PosHi data[5] +#define tBg3PosLo data[6] + +static void Task_Scene1_WaterDrops(u8 taskId) { - //start moving rock - if (gIntroFrameCounter == 76) - gSprites[gTasks[taskId].data[0]].data[0] = 1; + if (gIntroFrameCounter == TIMER_BIG_DROP_START) + gSprites[gTasks[taskId].sBigDropSpriteId].sState = 1; - if (gIntroFrameCounter == 128) - CreateTask(Task_IntroWaterDrops_1, 0); + if (gIntroFrameCounter == TIMER_LOGO_APPEAR) + CreateTask(Task_BlendLogoIn, 0); - //drop rock - if (gIntroFrameCounter == 251) - gSprites[gTasks[taskId].data[0]].data[0] = 2; + if (gIntroFrameCounter == TIMER_BIG_DROP_FALLS) + gSprites[gTasks[taskId].sBigDropSpriteId].sState = 2; - if (gIntroFrameCounter == 256) - CreateTask(Task_IntroWaterDrops_2, 0); + if (gIntroFrameCounter == TIMER_LOGO_BLEND_OUT) + CreateTask(Task_BlendLogoOut, 0); - if (gIntroFrameCounter == 368) + if (gIntroFrameCounter == TIMER_SMALL_DROP_1) CreateWaterDrop(48, 0, 0x400, 5, 0x70, TRUE); - if (gIntroFrameCounter == 384) + if (gIntroFrameCounter == TIMER_SMALL_DROP_2) CreateWaterDrop(200, 60, 0x400, 9, 0x80, TRUE); - if (gIntroFrameCounter == 560) - CreateTask(Task_IntroWaterDrops_3, 0); + if (gIntroFrameCounter == TIMER_SPARKLES) + CreateTask(Task_CreateSparkles, 0); - if (gIntroFrameCounter > 560) + if (gIntroFrameCounter > TIMER_SPARKLES) { - gTasks[taskId].data[1] = 0x50; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0x18; - gTasks[taskId].data[4] = 0; - gTasks[taskId].data[5] = 0x28; - gTasks[taskId].data[6] = 0; - gTasks[taskId].func = Task_IntroScrollDownAndShowFlygon; + gTasks[taskId].tBg2PosHi = 80; + gTasks[taskId].tBg2PosLo = 0; + gTasks[taskId].tBg1PosHi = 24; + gTasks[taskId].tBg1PosLo = 0; + gTasks[taskId].tBg3PosHi = 40; + gTasks[taskId].tBg3PosLo = 0; + gTasks[taskId].func = Task_Scene1_PanUp; } } -static void Task_IntroWaterDrops_3(u8 taskId) +#define tDelay data[1] +#define tTimer data[2] +#define tTimerSteps data[3] +#define tNumSparkles data[4] + +static void Task_CreateSparkles(u8 taskId) { s16 *data = gTasks[taskId].data; - if (++data[2] & 1) - data[3]++; - switch (data[0]) + if (++tTimer & 1) + tTimerSteps++; + + switch (tState) { case 0: - CreateSprite(&gUnknown_085E4AB8, gUnknown_085E4AD0[data[4]][0], gUnknown_085E4AD0[data[4]][1] + data[3], 0); - data[0]++; - data[1] = 0xC; - data[4]++; + CreateSprite(&sSpriteTemplate_Sparkle, sSparkleCoords[tNumSparkles][0], sSparkleCoords[tNumSparkles][1] + tTimerSteps, 0); + tState++; + tDelay = 12; + tNumSparkles++; break; case 1: - if (!--data[1]) - data[0] = 0; + if (--tDelay == 0) + tState = 0; break; } - if (data[3] > 0x3C) + if (tTimerSteps > 60) DestroyTask(taskId); } -static void sub_816D338(struct Sprite *sprite) +#undef tDelay +#undef tTimer +#undef tTimerSteps +#undef tNumSparkles + +#define sTimer data[0] +static void SpriteCB_Sparkle(struct Sprite *sprite) { - if (++sprite->data[0] == 0xC) + if (++sprite->sTimer == 12) DestroySprite(sprite); } +#undef sTimer -static void Task_IntroScrollDownAndShowFlygon(u8 taskId) +static void Task_Scene1_PanUp(u8 taskId) { - if (gIntroFrameCounter < 904) + if (gIntroFrameCounter < TIMER_END_PAN_UP) { - s32 r2; - - //slide backgrounds downward - r2 = (gTasks[taskId].data[1] << 16) + (u16)gTasks[taskId].data[2]; - r2 -= 0x6000; - gTasks[taskId].data[1] = r2 >> 16; - gTasks[taskId].data[2] = r2; - SetGpuReg(REG_OFFSET_BG2VOFS, gTasks[taskId].data[1]); - r2 = (gTasks[taskId].data[3] << 16) + (u16)gTasks[taskId].data[4]; - r2 -= 0x8000; - gTasks[taskId].data[3] = r2 >> 16; - gTasks[taskId].data[4] = r2; - SetGpuReg(REG_OFFSET_BG1VOFS, gTasks[taskId].data[3]); - r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; - r2 -= 0xC000; - gTasks[taskId].data[5] = r2 >> 16; - gTasks[taskId].data[6] = r2; - SetGpuReg(REG_OFFSET_BG0VOFS, gTasks[taskId].data[5]); - - //show Flygon sprite - if (gIntroFrameCounter == 832) - { - u8 spriteId = CreateSprite(&gUnknown_085E4FC4, 120, 160, 10); + s32 offset; + + // Slide bg 2 downward + offset = (gTasks[taskId].tBg2PosHi << 16) + (u16)gTasks[taskId].tBg2PosLo; + offset -= 0x6000; + gTasks[taskId].tBg2PosHi = offset >> 16; + gTasks[taskId].tBg2PosLo = offset; + SetGpuReg(REG_OFFSET_BG2VOFS, gTasks[taskId].tBg2PosHi); + + // Slide bg 1 downward + offset = (gTasks[taskId].tBg1PosHi << 16) + (u16)gTasks[taskId].tBg1PosLo; + offset -= 0x8000; + gTasks[taskId].tBg1PosHi = offset >> 16; + gTasks[taskId].tBg1PosLo = offset; + SetGpuReg(REG_OFFSET_BG1VOFS, gTasks[taskId].tBg1PosHi); + + // Slide bg 3 downward + offset = (gTasks[taskId].tBg3PosHi << 16) + (u16)gTasks[taskId].tBg3PosLo; + offset -= 0xC000; + gTasks[taskId].tBg3PosHi = offset >> 16; + gTasks[taskId].tBg3PosLo = offset; + SetGpuReg(REG_OFFSET_BG0VOFS, gTasks[taskId].tBg3PosHi); + + if (gIntroFrameCounter == TIMER_FLYGON_SILHOUETTE_APPEAR) + { + // Show Flygon silhouette + u8 spriteId = CreateSprite(&sSpriteTemplate_FlygonSilhouette, 120, DISPLAY_HEIGHT, 10); gSprites[spriteId].invisible = TRUE; } } else { - //fade to white - if (gIntroFrameCounter > 1007) + if (gIntroFrameCounter > TIMER_END_SCENE_1) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITEALPHA); - gTasks[taskId].func = Task_IntroWaitToSetupPart2; + // Fade to white + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA); + gTasks[taskId].func = Task_Scene1_End; } } } -static void Task_IntroWaitToSetupPart2(u8 taskId) +static void Task_Scene1_End(u8 taskId) { - if (gIntroFrameCounter > 1026) - gTasks[taskId].func = Task_IntroLoadPart2Graphics; + if (gIntroFrameCounter > TIMER_START_SCENE_2) + gTasks[taskId].func = Task_Scene2_Load; } -static void Task_IntroLoadPart2Graphics(u8 taskId) +static void Task_Scene2_Load(u8 taskId) { - intro_reset_and_hide_bgs(); + IntroResetGpuRegs(); SetVBlankCallback(NULL); ResetSpriteData(); FreeAllSpritePalettes(); - gUnknown_0203BD24 = 0; - gUnknown_0203BD26 = 0; - gIntroGraphicsFlygonYOffset = 0; - load_intro_part2_graphics(1); - gTasks[taskId].func = Task_IntroStartBikeRide; + gIntroCredits_MovingSceneryVBase = 0; + gIntroCredits_MovingSceneryVOffset = 0; + sFlygonYOffset = 0; + LoadIntroPart2Graphics(1); + gTasks[taskId].func = Task_Scene2_CreateSprites; } -static void Task_IntroStartBikeRide(u8 taskId) +#define tBgAnimTaskId data[0] +#define tPlayerSpriteId data[1] +#define tFlygonSpriteId data[2] +#define tFlygonTimer data[3] + +static void Task_Scene2_CreateSprites(u8 taskId) { u8 spriteId; - if (gIntroCharacterGender == 0) - LoadCompressedSpriteSheet(gIntro2BrendanSpriteSheet); + // Load sprite sheets + if (sIntroCharacterGender == MALE) + LoadCompressedSpriteSheet(gSpriteSheet_IntroBrendan); else - LoadCompressedSpriteSheet(gIntro2MaySpriteSheet); + LoadCompressedSpriteSheet(gSpriteSheet_IntroMay); - LoadCompressedSpriteSheet(gIntro2BicycleSpriteSheet); - LoadCompressedSpriteSheet(gIntro2FlygonSpriteSheet); + LoadCompressedSpriteSheet(gSpriteSheet_IntroBicycle); + LoadCompressedSpriteSheet(gSpriteSheet_IntroFlygon); - for (spriteId = 0; spriteId < 3; spriteId++) - { - LoadCompressedSpriteSheet(&gIntroPokemonRunningSpriteSheet[spriteId]); - } + // Load sprite palettes + for (spriteId = 0; spriteId < ARRAY_COUNT(sSpriteSheet_RunningPokemon) - 1; spriteId++) + LoadCompressedSpriteSheet(&sSpriteSheet_RunningPokemon[spriteId]); - LoadSpritePalettes(gIntroBikeAndFlygonPalette); - LoadSpritePalettes(gIntroPokemonRunningPalette); - CreateSprite(&gUnknown_085E4BDC, 0x110, 0x80, 0); - CreateSprite(&gUnknown_085E4BA4, 0x120, 0x6E, 1); + LoadSpritePalettes(gSpritePalettes_IntroPlayerFlygon); + LoadSpritePalettes(sSpritePalettes_RunningPokemon); - if (gIntroCharacterGender == 0) - spriteId = intro_create_brendan_sprite(0x110, 100); + // Create Pokémon and player sprites + CreateSprite(&sSpriteTemplate_Manectric, DISPLAY_WIDTH + 32, 128, 0); + CreateSprite(&sSpriteTemplate_Torchic, DISPLAY_WIDTH + 48, 110, 1); + + if (sIntroCharacterGender == MALE) + spriteId = CreateIntroBrendanSprite(DISPLAY_WIDTH + 32, 100); else - spriteId = intro_create_may_sprite(0x110, 100); - - gSprites[spriteId].callback = SpriteCB_IntroGraphicsBicycle; - gSprites[spriteId].anims = gIntroBicycleAnimationCommands; - gTasks[taskId].data[1] = spriteId; - CreateSprite(&gUnknown_085E4B40, 0x110, 0x50, 0x4); - spriteId = intro_create_flygon_sprite(-0x40, 0x3C); - gSprites[spriteId].callback = SpriteCB_IntroGraphicsFlygon; - gTasks[taskId].data[2] = spriteId; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_WHITEALPHA); + spriteId = CreateIntroMaySprite(DISPLAY_WIDTH + 32, 100); + + gSprites[spriteId].callback = SpriteCB_PlayerOnBicycle; + gSprites[spriteId].anims = sAnims_PlayerBicycle; + gTasks[taskId].tPlayerSpriteId = spriteId; + CreateSprite(&sSpriteTemplate_Volbeat, DISPLAY_WIDTH + 32, 80, 4); + spriteId = CreateIntroFlygonSprite(-64, 60); + gSprites[spriteId].callback = SpriteCB_Flygon; + gTasks[taskId].tFlygonSpriteId = spriteId; + + // Fade in and start bike ride + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); SetVBlankCallback(VBlankCB_Intro); - gTasks[taskId].data[0] = CreateBicycleAnimationTask(1, 0x4000, 0x400, 0x10); - sub_817B150(1); - gTasks[taskId].func = Task_IntroHandleBikeAndFlygonMovement; + gTasks[taskId].tBgAnimTaskId = CreateBicycleBgAnimationTask(1, 0x4000, 0x400, 0x10); + SetIntroPart2BgCnt(1); + gTasks[taskId].func = Task_Scene2_BikeRide; } -static void Task_IntroHandleBikeAndFlygonMovement(u8 taskId) +static void Task_Scene2_BikeRide(u8 taskId) { - s16 a; u16 offset; - if (gIntroFrameCounter == 1856) + if (gIntroFrameCounter == TIMER_TORCHIC_EXIT) { - gUnknown_0203BD28 = 2; - // Destroys the CreateBicycleAnimationTask created earlier. - DestroyTask(gTasks[taskId].data[0]); + // Stop the moving scenery/backgrounds, for when the camera fixes on Torchic + gIntroCredits_MovingSceneryState = INTROCRED_SCENERY_FROZEN; + DestroyTask(gTasks[taskId].tBgAnimTaskId); } - if (gIntroFrameCounter > 1946) + + if (gIntroFrameCounter > TIMER_END_SCENE_2) { - BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA); - gTasks[taskId].func = Task_IntroWaitToSetupPart3; + // Fade out to next scene + BeginNormalPaletteFade(PALETTES_ALL, 8, 0, 16, RGB_WHITEALPHA); + gTasks[taskId].func = Task_Scene2_End; } - if (gIntroFrameCounter == 1109) - gSprites[gTasks[taskId].data[1]].data[0] = 1; - if (gIntroFrameCounter == 1214) - gSprites[gTasks[taskId].data[1]].data[0] = 0; - if (gIntroFrameCounter == 1394) - gSprites[gTasks[taskId].data[2]].data[0] = 1; - if (gIntroFrameCounter == 1398) - gSprites[gTasks[taskId].data[1]].data[0] = 2; - if (gIntroFrameCounter == 1576) - gSprites[gTasks[taskId].data[1]].data[0] = 3; - if (gIntroFrameCounter == 1727) - gSprites[gTasks[taskId].data[1]].data[0] = 4; - - offset = Sin(gTasks[taskId].data[3] >> 2 & 0x7F, 48); - gIntroGraphicsFlygonYOffset = offset; - if (gTasks[taskId].data[3] < 512) - gTasks[taskId].data[3]++; - sub_817B540(0); -} -static void Task_IntroWaitToSetupPart3(u8 taskId) -{ - if (gIntroFrameCounter > 2068) - gTasks[taskId].func = Task_IntroLoadPart3Graphics; -} - -static void sub_816D81C(struct Sprite *sprite) -{ - sprite->data[3] += 4; - switch (sprite->data[0]) + // Check for updates to player/flygon sprites + // These states are for SpriteCB_PlayerOnBicycle and SpriteCB_Flygon respectively + if (gIntroFrameCounter == TIMER_PLAYER_DRIFT_BACK) + gSprites[gTasks[taskId].tPlayerSpriteId].sState = 1; + if (gIntroFrameCounter == TIMER_PLAYER_MOVE_FORWARD) + gSprites[gTasks[taskId].tPlayerSpriteId].sState = 0; + if (gIntroFrameCounter == TIMER_FLYGON_ENTER) + gSprites[gTasks[taskId].tFlygonSpriteId].sState = 1; + if (gIntroFrameCounter == TIMER_PLAYER_MOVE_BACKWARD) + gSprites[gTasks[taskId].tPlayerSpriteId].sState = 2; + if (gIntroFrameCounter == TIMER_PLAYER_HOLD_POSITION) + gSprites[gTasks[taskId].tPlayerSpriteId].sState = 3; + if (gIntroFrameCounter == TIMER_PLAYER_EXIT) + gSprites[gTasks[taskId].tPlayerSpriteId].sState = 4; + + // Handle flygon's y movement + offset = Sin(gTasks[taskId].tFlygonTimer >> 2 & 0x7F, 48); + sFlygonYOffset = offset; + if (gTasks[taskId].tFlygonTimer < 512) + gTasks[taskId].tFlygonTimer++; + + // Alternate colors of the trees + CycleSceneryPalette(0); +} + +static void Task_Scene2_End(u8 taskId) +{ + if (gIntroFrameCounter > TIMER_START_SCENE_3) + gTasks[taskId].func = Task_Scene3_Load; +} + +#define sStateDelay data[1] +#define sNextState data[2] +#define sCosYIdx data[3] +#define sSinXIdx data[4] +#define sSinYIdx data[5] +#define sFig8Loops data[6] + +enum { + VOLBEAT_WAIT_ENTER, + VOLBEAT_ENTER, + VOLBEAT_ZIP_BACKWARD, + VOLBEAT_ZIP_DOWN, + VOLBEAT_ZIP_FORWARD, + VOLBEAT_INIT_FIGURE_8, + VOLBEAT_FIGURE_8, + VOLBEAT_EXIT, + VOLBEAT_WAIT_STATE +}; + +static void SpriteCB_Volbeat(struct Sprite *sprite) +{ + sprite->sCosYIdx += 4; + switch (sprite->sState) { - case 0: - if (++sprite->data[1] < 180) + case VOLBEAT_WAIT_ENTER: + if (++sprite->sStateDelay < 180) break; - ++sprite->data[0]; - case 1: + sprite->sState++; + // fallthrough + case VOLBEAT_ENTER: sprite->pos1.x -= 4; - if (sprite->pos1.x == 0x3C) + if (sprite->pos1.x == 60) { - sprite->data[0] = 8; - sprite->data[1] = 20; - sprite->data[2] = 2; + sprite->sState = VOLBEAT_WAIT_STATE; + sprite->sStateDelay = 20; + sprite->sNextState = VOLBEAT_ZIP_BACKWARD; } break; - case 2: + case VOLBEAT_ZIP_BACKWARD: sprite->pos1.x += 8; sprite->pos1.y -= 2; - if (sprite->pos1.x == 0x7C) + if (sprite->pos1.x == 124) { - sprite->data[0] = 8; - sprite->data[1] = 20; - sprite->data[2] = 3; + sprite->sState = VOLBEAT_WAIT_STATE; + sprite->sStateDelay = 20; + sprite->sNextState = VOLBEAT_ZIP_DOWN; } break; - case 3: + case VOLBEAT_ZIP_DOWN: sprite->pos1.y += 4; - if (sprite->pos1.y == 0x50) + if (sprite->pos1.y == 80) { - sprite->data[0] = 8; - sprite->data[1] = 10; - sprite->data[2] = 4; + sprite->sState = VOLBEAT_WAIT_STATE; + sprite->sStateDelay = 10; + sprite->sNextState = VOLBEAT_ZIP_FORWARD; } break; - case 4: + case VOLBEAT_ZIP_FORWARD: sprite->pos1.x -= 8; sprite->pos1.y -= 2; - if (sprite->pos1.x == 0x3C) - { - sprite->data[0] = 8; - sprite->data[1] = 10; - sprite->data[2] = 5; - } - break; - case 5: - sprite->pos1.x += 0x3C; - sprite->data[4] = 0xC0; - sprite->data[5] = 0x80; - sprite->data[6] = 0x3; - sprite->data[0]++; - case 6: - sprite->pos2.x = Sin((u8)sprite->data[4], 0x3C); - sprite->pos2.y = Sin((u8)sprite->data[5], 0x14); - sprite->data[4] += 2; - sprite->data[5] += 4; - if ((sprite->data[4] & 0xFF) == 0x40) + if (sprite->pos1.x == 60) + { + sprite->sState = VOLBEAT_WAIT_STATE; + sprite->sStateDelay = 10; + sprite->sNextState = VOLBEAT_INIT_FIGURE_8; + } + break; + case VOLBEAT_INIT_FIGURE_8: + sprite->pos1.x += 60; + sprite->sSinXIdx = 0xC0; + sprite->sSinYIdx = 0x80; + sprite->sFig8Loops = 3; + sprite->sState++; + // fallthrough + case VOLBEAT_FIGURE_8: + sprite->pos2.x = Sin((u8)sprite->sSinXIdx, 0x3C); + sprite->pos2.y = Sin((u8)sprite->sSinYIdx, 0x14); + sprite->sSinXIdx += 2; + sprite->sSinYIdx += 4; + if ((sprite->sSinXIdx & 0xFF) == 64) { sprite->hFlip = FALSE; - if (!--sprite->data[6]) + if (--sprite->sFig8Loops == 0) { sprite->pos1.x += sprite->pos2.x; sprite->pos2.x = 0; - sprite->data[0]++; + sprite->sState++; } } break; - case 7: + case VOLBEAT_EXIT: sprite->pos1.x -= 2; - sprite->pos2.y = Sin((u8)sprite->data[5], 0x14); - sprite->data[5] += 4; + sprite->pos2.y = Sin((u8)sprite->sSinYIdx, 0x14); + sprite->sSinYIdx += 4; if (sprite->pos1.x < -16) DestroySprite(sprite); break; - case 8: - sprite->pos2.y = Cos((u8)sprite->data[3], 2); - if (!--sprite->data[1]) - sprite->data[0] = sprite->data[2]; + case VOLBEAT_WAIT_STATE: + // Wait for state progression, fly idly until then + sprite->pos2.y = Cos((u8)sprite->sCosYIdx, 2); + if (!--sprite->sStateDelay) + sprite->sState = sprite->sNextState; break; } } -static void sub_816D9C0(struct Sprite *sprite) +#undef sStateDelay +#undef sNextState +#undef sCosYIdx +#undef sSinXIdx +#undef sSinYIdx +#undef sFig8Loops + +#define sMoveTimer data[1] +#define sDelay data[2] + +static void SpriteCB_Torchic(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (gIntroFrameCounter == 1224) + if (gIntroFrameCounter == TIMER_TORCHIC_ENTER) { - StartSpriteAnim(sprite, 1); - sprite->data[0]++; + StartSpriteAnim(sprite, TORCHIC_ANIM_RUN); + sprite->sState++; } break; case 1: - if (gIntroFrameCounter == 1576) + if (gIntroFrameCounter == TIMER_PLAYER_HOLD_POSITION) { - StartSpriteAnim(sprite, 0); - sprite->data[0]++; + StartSpriteAnim(sprite, TORCHIC_ANIM_WALK); + sprite->sState++; } else { - sprite->data[1] += 0x40; - if (sprite->data[1] & 0xFF00) + sprite->sMoveTimer += 64; + if (sprite->sMoveTimer & 0xFF00) { sprite->pos1.x--; - sprite->data[1] &= 0xFF; + sprite->sMoveTimer &= 0xFF; } } break; case 2: - if (gIntroFrameCounter != 1735) + if (gIntroFrameCounter != TIMER_TORCHIC_SPEED_UP) { - sprite->data[1] += 0x20; - if (sprite->data[1] & 0xFF00) + sprite->sMoveTimer += 32; + if (sprite->sMoveTimer & 0xFF00) { sprite->pos1.x++; - sprite->data[1] &= 0xFF; + sprite->sMoveTimer &= 0xFF; } } else { - StartSpriteAnim(sprite, 1); - sprite->data[0]++; - sprite->data[2] = 0x50; + StartSpriteAnim(sprite, TORCHIC_ANIM_RUN); + sprite->sState++; + sprite->sDelay = 80; } break; case 3: - if (--sprite->data[2]) + if (--sprite->sDelay) { - sprite->data[1] += 0x40; - if (sprite->data[1] & 0xFF00) + sprite->sMoveTimer += 64; + if (sprite->sMoveTimer & 0xFF00) { sprite->pos1.x--; - sprite->data[1] &= 0xFF; + sprite->sMoveTimer &= 0xFF; } } else { - StartSpriteAnim(sprite, 2); - sprite->data[0]++; + StartSpriteAnim(sprite, TORCHIC_ANIM_TRIP); + sprite->sState++; } break; case 4: @@ -1492,129 +1642,155 @@ static void sub_816D9C0(struct Sprite *sprite) if (sprite->pos1.x > 336) { - StartSpriteAnim(sprite, 1); - sprite->data[0]++; + StartSpriteAnim(sprite, TORCHIC_ANIM_RUN); + sprite->sState++; } break; case 5: - if (gIntroFrameCounter > 1855) + if (gIntroFrameCounter >= TIMER_TORCHIC_EXIT) sprite->pos1.x -= 2; break; } } -static void sub_816DAE8(struct Sprite *sprite) +#undef sMoveTimer +#undef sDelay + +#define sSinIdx data[1] +#define sCosIdx data[2] + +static void SpriteCB_Manectric(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (gIntroFrameCounter == 1088) - sprite->data[0]++; + if (gIntroFrameCounter == TIMER_MANECTRIC_ENTER) + sprite->sState++; break; case 1: sprite->pos1.x -= 2; - if (gIntroFrameCounter != 1168) + if (gIntroFrameCounter != TIMER_MANECTRIC_RUN_CIRCULAR) break; + + // Initialize circular pattern running sprite->pos1.y -= 12; - sprite->data[1] = 0x80; - sprite->data[2] = 0; - sprite->data[0]++; + sprite->sSinIdx = 0x80; + sprite->sCosIdx = 0; + sprite->sState++; + // fallthrough case 2: - if (sprite->pos1.x + sprite->pos2.x <= -0x20) + if (sprite->pos1.x + sprite->pos2.x <= -32) { + // Manectric is offscreen now, destroy it DestroySprite(sprite); } else { - if ((sprite->data[1] & 0xFF) < 0x40) + // Run in circular pattern + if ((sprite->sSinIdx & 0xFF) < 64) { - sprite->pos2.x = Sin((u8)sprite->data[1], 0x10); + sprite->pos2.x = Sin((u8)sprite->sSinIdx, 16); } else { - if ((sprite->data[1] & 0xFF) == 0x40) - sprite->pos1.x -= 0x30; - sprite->pos2.x = Sin((u8)sprite->data[1], 0x40); + if ((sprite->sSinIdx & 0xFF) == 64) + sprite->pos1.x -= 48; + sprite->pos2.x = Sin((u8)sprite->sSinIdx, 64); } - sprite->data[1]++; - sprite->pos2.y = Cos((u8)sprite->data[2], 0xC); - sprite->data[2]++; + sprite->sSinIdx++; + sprite->pos2.y = Cos((u8)sprite->sCosIdx, 12); + sprite->sCosIdx++; } break; } } -static void Task_IntroLoadPart3Graphics(u8 taskId) +#undef sSinIdx +#undef sCosIdx + +#define tAlpha data[0] +#define tZoomDiv data[1] +#define tZoomDivSpeed data[2] + +static void Task_Scene3_Load(u8 taskId) { - intro_reset_and_hide_bgs(); - LZ77UnCompVram(gIntro3Pokeball_Gfx, (void *)VRAM); - LZ77UnCompVram(gIntro3Pokeball_Tilemap, (void *)(BG_CHAR_ADDR(1))); - LoadPalette(gIntro3PokeballPal, 0, 0x200); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - gTasks[taskId].data[2] = 0; + IntroResetGpuRegs(); + LZ77UnCompVram(sIntroPokeball_Gfx, (void *)VRAM); + LZ77UnCompVram(sIntroPokeball_Tilemap, (void *)(BG_CHAR_ADDR(1))); + LoadPalette(sIntroPokeball_Pal, 0, sizeof(sIntroPokeball_Pal)); + gTasks[taskId].tAlpha = 0; + gTasks[taskId].tZoomDiv = 0; + gTasks[taskId].tZoomDivSpeed = 0; gTasks[taskId].data[3] = 0; PanFadeAndZoomScreen(0x78, 0x50, 0, 0); ResetSpriteData(); FreeAllSpritePalettes(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(8) | BGCNT_256COLOR | BGCNT_AFF256x256); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - gTasks[taskId].func = Task_IntroSpinAndZoomPokeball; + gTasks[taskId].func = Task_Scene3_SpinPokeball; gIntroFrameCounter = 0; m4aSongNumStart(MUS_INTRO_BATTLE); } - -static void Task_IntroSpinAndZoomPokeball(u8 taskId) +static void Task_Scene3_SpinPokeball(u8 taskId) { - gTasks[taskId].data[0] += 0x400; + gTasks[taskId].tAlpha += 0x400; - if (gTasks[taskId].data[1] <= 0x6BF) + if (gTasks[taskId].tZoomDiv <= 0x6BF) { - gTasks[taskId].data[1] += gTasks[taskId].data[2]; - gTasks[taskId].data[2] += 2; + gTasks[taskId].tZoomDiv += gTasks[taskId].tZoomDivSpeed; + gTasks[taskId].tZoomDivSpeed += 2; } else { - gTasks[taskId].func = Task_IntroWaitToSetupPart3LegendsFight; + gTasks[taskId].func = Task_Scene3_WaitGroudon; } - PanFadeAndZoomScreen(0x78, 0x50, 0x10000 / gTasks[taskId].data[1], gTasks[taskId].data[0]); + PanFadeAndZoomScreen(0x78, 0x50, SAFE_DIV(0x10000, gTasks[taskId].tZoomDiv), gTasks[taskId].tAlpha); - if (gIntroFrameCounter == 28) - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA); + if (gIntroFrameCounter == TIMER_POKEBALL_FADE) + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITEALPHA); } -static void Task_IntroWaitToSetupPart3LegendsFight(u8 taskId) +#undef tAlpha +#undef tZoomDiv +#undef tZoomDivSpeed + +static void Task_Scene3_WaitGroudon(u8 taskId) { - if (gIntroFrameCounter > 43) - gTasks[taskId].func = Task_IntroLoadGroudonScene; + if (gIntroFrameCounter > TIMER_START_LEGENDARIES) + gTasks[taskId].func = Task_Scene3_LoadGroudon; } -static void Task_IntroLoadGroudonScene(u8 taskId) +static void Task_Scene3_LoadGroudon(u8 taskId) { if (!gPaletteFade.active) { - intro_reset_and_hide_bgs(); + IntroResetGpuRegs(); ResetSpriteData(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 8; - LZDecompressVram(gIntro3GroudonGfx, (void *)VRAM); - LZDecompressVram(gIntro3GroudonTilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntro3LegendBgGfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntro3GroudonBgTilemap, (void *)(BG_SCREEN_ADDR(28))); + LZDecompressVram(gIntroGroudon_Gfx, (void *)VRAM); + LZDecompressVram(gIntroGroudon_Tilemap, (void *)(BG_CHAR_ADDR(3))); + LZDecompressVram(gIntroLegendBg_Gfx, (void *)(BG_CHAR_ADDR(1))); + LZDecompressVram(gIntroGroudonBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_ROCKS)]); - CpuCopy16(gIntro3BgPal, gPlttBufferUnfaded, sizeof(gIntro3BgPal)); - gTasks[taskId].func = Task_IntroLoadPart3Graphics1; + CpuCopy16(gIntro3Bg_Pal, gPlttBufferUnfaded, sizeof(gIntro3Bg_Pal)); + gTasks[taskId].func = Task_Scene3_InitGroudonBg; } } -static void Task_IntroLoadPart3Graphics1(u8 taskId) +#define tWinPos data[0] +#define tScreenX data[1] +#define tScreenY data[2] +#define tZoom data[3] + +static void Task_Scene3_InitGroudonBg(u8 taskId) { - SetGpuReg(REG_OFFSET_WIN0H, 0xF0); - SetGpuReg(REG_OFFSET_WIN0V, 0xA0); - SetGpuReg(REG_OFFSET_WININ, 0x3F); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_WIN0V, DISPLAY_HEIGHT); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL); SetGpuReg(REG_OFFSET_WINOUT, 0); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) @@ -1633,185 +1809,220 @@ static void Task_IntroLoadPart3Graphics1(u8 taskId) | DISPCNT_BG2_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0xFFA0; - gTasks[taskId].data[2] = 0xFF51; - gTasks[taskId].data[3] = 0x100; - PanFadeAndZoomScreen(0xFFA0, 0xFF51, 0x100, 0); - gTasks[taskId].func = Task_IntroLoadPart3Graphics2; + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_WHITEALPHA); + gTasks[taskId].tWinPos = 0; + gTasks[taskId].tScreenX = 0xFFA0; + gTasks[taskId].tScreenY = 0xFF51; + gTasks[taskId].tZoom = 0x100; + PanFadeAndZoomScreen(gTasks[taskId].tScreenX, gTasks[taskId].tScreenY, gTasks[taskId].tZoom, 0); + gTasks[taskId].func = Task_Scene3_NarrowWindow; } -static void Task_IntroLoadPart3Graphics2(u8 taskId) +// Before the Groudon scene starts, the black top/bottom edges of the screen +// come inward for a more 'cinematic' look +#define NARROW_HEIGHT 32 +static void Task_Scene3_NarrowWindow(u8 taskId) { - if (gTasks[taskId].data[0] != 32) + if (gTasks[taskId].tWinPos != NARROW_HEIGHT) { - gTasks[taskId].data[0] += 4; - SetGpuReg(REG_OFFSET_WIN0V, (gTasks[taskId].data[0] * 256) - (gTasks[taskId].data[0] - 160)); + gTasks[taskId].tWinPos += 4; + SetGpuReg(REG_OFFSET_WIN0V, (gTasks[taskId].tWinPos * 256) - (gTasks[taskId].tWinPos - DISPLAY_HEIGHT)); } else { - SetGpuReg(REG_OFFSET_WIN0V, 0x2080); - gTasks[taskId].func = Task_IntroLoadPart3Graphics3; + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(NARROW_HEIGHT, DISPLAY_HEIGHT - NARROW_HEIGHT)); + gTasks[taskId].func = Task_Scene3_EndNarrowWindow; } } +#undef tWinPos +#undef tScreenX +#undef tScreenY +#undef tZoom -static void Task_IntroLoadPart3Graphics3(u8 taskId) +static void Task_Scene3_EndNarrowWindow(u8 taskId) { - gTasks[taskId].func = Task_IntroLoadPart3Graphics4; + gTasks[taskId].func = Task_Scene3_StartGroudon; } -static void Task_IntroLoadPart3Graphics4(u8 taskId) +static void Task_Scene3_StartGroudon(u8 taskId) { - gTasks[taskId].data[0] = 0; - gTasks[taskId].func = Task_IntroGroudonScene; - ScanlineEffect_InitWave(0, 0xA0, 0x4, 4, 1, 4, 0); + gTasks[taskId].tState = 0; + gTasks[taskId].func = Task_Scene3_Groudon; + ScanlineEffect_InitWave(0, 160, 4, 4, 1, 4, 0); } -static void Task_IntroGroudonScene(u8 taskId) +#define tScreenX data[1] +#define tScreenY data[2] +#define tZoom data[3] +#define tYShake data[4] +#define tTimer data[5] +#define tDelay data[6] +#define tTrigIdx data[6] // Re-used +#define tPalIdx data[7] + +static void Task_Scene3_Groudon(u8 taskId) { s16 *data = gTasks[taskId].data; - data[5]++; - if ((u16)(data[0] - 1) < 7 && data[5] % 2 == 0) - data[4] ^= 3; - PanFadeAndZoomScreen(data[1], data[2] + data[4], data[3], 0); - switch (data[0]) + tTimer++; + if ((u16)(tState - 1) < 7 && tTimer % 2 == 0) + tYShake ^= 3; + PanFadeAndZoomScreen(tScreenX, tScreenY + tYShake, tZoom, 0); + switch (tState) { case 0: - data[1] += 0x10; - if (data[1] == 0xA0) + tScreenX += 16; + if (tScreenX == 160) { - data[0]++; - data[6] = 2; - data[7] = 0x1E2; + tState++; + tDelay = 2; + tPalIdx = 0x1E2; CreateGroudonRockSprites(taskId); } break; case 1: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 2; - CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[31], sizeof(u16)); - data[7] += 2; - if (data[7] == 0x1EC) - data[0]++; + tDelay = 2; + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[31], sizeof(u16)); + tPalIdx += 2; + if (tPalIdx == 0x1EC) + tState++; } break; case 2: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 2; - data[0]++; + tDelay = 2; + tState++; } break; case 3: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 2; - CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[31], sizeof(u16)); - data[7] -= 2; - if (data[7] == 0x1E0) + tDelay = 2; + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[31], sizeof(u16)); + tPalIdx -= 2; + if (tPalIdx == 0x1E0) { - data[6] = 8; - data[0]++; + tDelay = 8; + tState++; } } break; case 4: - if (--data[6] == 0) + if (--tDelay == 0) { - data[1] = -0x60; - data[2] = 0xA9; - data[6] = 3; - data[0]++; + tScreenX = -96; + tScreenY = 169; + tDelay = 3; + tState++; } break; case 5: - if (--data[6] == 0) + if (--tDelay == 0) { - data[1] = 0x50; - data[2] = 0x29; - data[6] = 0x10; + tScreenX = 80; + tScreenY = 41; + tDelay = 16; PlayCryInternal(SPECIES_GROUDON, 0, 100, 10, 0); - data[0]++; + tState++; } break; case 6: - if (--data[6] == 0) + if (--tDelay == 0) { - data[1] = 0x50; - data[2] = 0x28; - data[0]++; + tScreenX = 80; + tScreenY = 40; + tState++; } break; case 7: - data[1] += 4; - data[2] += 4; - data[6] += 0x666; - data[3] = Sin((data[6] & 0xFF00) >> 8, 0x40) + 0x100; - if (data[1] == 0x78) + tScreenX += 4; + tScreenY += 4; + tTrigIdx += 0x666; + tZoom = Sin((tTrigIdx & 0xFF00) >> 8, 64) + 256; + if (tScreenX == 120) { - BeginNormalPaletteFade(0xFFFFFFFE, 3, 0, 16, RGB_WHITE); - data[3] = 0x100; - data[4] = 0; - data[0]++; + BeginNormalPaletteFade(PALETTES_ALL & ~1, 3, 0, 16, RGB_WHITE); + tZoom = 256; + tYShake = 0; + tState++; } break; case 8: - if (data[3]) - data[3] -= 8; + if (tZoom) + tZoom -= 8; else - data[0]++; + tState++; break; case 9: if (!gPaletteFade.active) { - gTasks[taskId].func = Task_IntroLoadKyogreScene; + gTasks[taskId].func = Task_Scene3_LoadKyogre; gScanlineEffect.state = 3; } break; } } -static void CreateGroudonRockSprites(u8 a0) +#undef tScreenX +#undef tScreenY +#undef tZoom +#undef tYShake +#undef tTimer +#undef tDelay +#undef tTrigIdx +#undef tPalIdx + +#define sRockId data[1] +#define sSpeed data[2] +#define sTimer data[3] +#define sTaskId data[4] + +static void CreateGroudonRockSprites(u8 taskId) { int i; u8 spriteId; - for (i = 0; i < 6; i++) + for (i = 0; i < (int)ARRAY_COUNT(sGroudonRockData); i++) { - spriteId = CreateSprite(gAncientPowerRockSpriteTemplate, gIntroGroudonRockData[i][0], 0xA0, i); - gSprites[spriteId].callback = SpriteCB_IntroGroudonRocks; + spriteId = CreateSprite(gAncientPowerRockSpriteTemplate, sGroudonRockData[i][0], DISPLAY_HEIGHT, i); + gSprites[spriteId].callback = SpriteCB_GroudonRocks; gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].data[1] = i; - gSprites[spriteId].data[4] = a0; - StartSpriteAnim(&gSprites[spriteId], gIntroGroudonRockData[i][1]); + gSprites[spriteId].sRockId = i; + gSprites[spriteId].sTaskId = taskId; + StartSpriteAnim(&gSprites[spriteId], sGroudonRockData[i][1]); } } -static void SpriteCB_IntroGroudonRocks(struct Sprite *sprite) +static void SpriteCB_GroudonRocks(struct Sprite *sprite) { - sprite->data[3]++; - if (sprite->data[3] % 2 == 0) + // Introduce some wobble to the floating + sprite->sTimer++; + if (sprite->sTimer % 2 == 0) sprite->pos2.y ^= 3; - switch(sprite->data[0]) + switch(sprite->sState) { case 0: - sprite->data[2] += gIntroGroudonRockData[sprite->data[1]][2]; - sprite->pos1.y -= (sprite->data[2] & 0xFF00) >> 8; - sprite->data[2] &= 0xFF; - if (gTasks[sprite->data[4]].data[0] > 7) - sprite->data[0]++; + // Rock floats up + sprite->sSpeed += sGroudonRockData[sprite->sRockId][2]; + sprite->pos1.y -= (sprite->sSpeed & 0xFF00) >> 8; + sprite->sSpeed &= 0xFF; + + // Check if Groudon scene is ending + if (gTasks[sprite->sTaskId].tState > 7) + sprite->sState++; break; case 1: - if (sprite->pos1.x < 0x78) + // Scene zooms in, move rock offscreen + if (sprite->pos1.x < DISPLAY_WIDTH / 2) sprite->pos1.x -= 2; else sprite->pos1.x += 2; - if (sprite->pos1.y < 0x50) + if (sprite->pos1.y < DISPLAY_HEIGHT / 2) sprite->pos1.y -= 2; else sprite->pos1.y += 2; @@ -1819,237 +2030,294 @@ static void SpriteCB_IntroGroudonRocks(struct Sprite *sprite) } } -static void Task_IntroLoadKyogreScene(u8 taskId) +#undef sRockId +#undef sSpeed +#undef sTimer +#undef sTaskId + +#define tScreenX data[1] +#define tScreenY data[2] +#define tZoom data[3] +#define tDelay data[6] +#define tTrigIdx data[6] // Re-used +#define tPalIdx data[7] + +static void Task_Scene3_LoadKyogre(u8 taskId) { ResetSpriteData(); - LZDecompressVram(gIntro3KyogreGfx, (void *)VRAM); - LZDecompressVram(gIntro3KyogreTilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntro3KyogreBgTilemap, (void *)(BG_SCREEN_ADDR(28))); - LoadCompressedSpriteSheet(gUnknown_085E4C88); - LoadSpritePalette(gUnknown_085E4C98); - BeginNormalPaletteFade(0xFFFFFFFE, 0, 0x10, 0, RGB_WHITEALPHA); - gTasks[taskId].func = Task_IntroKyogreScene; - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0x150; - gTasks[taskId].data[2] = 0x50; - gTasks[taskId].data[6] = 0x10; - gTasks[taskId].data[3] = 0x100; - PanFadeAndZoomScreen(0x150, 0x50, 0x100, 0); + LZDecompressVram(gIntroKyogre_Gfx, (void *)VRAM); + LZDecompressVram(gIntroKyogre_Tilemap, (void *)(BG_CHAR_ADDR(3))); + LZDecompressVram(gIntroKyogreBg_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + LoadCompressedSpriteSheet(sSpriteSheet_Bubbles); + LoadSpritePalette(sSpritePalette_Bubbles); + BeginNormalPaletteFade(PALETTES_ALL & ~1, 0, 16, 0, RGB_WHITEALPHA); + gTasks[taskId].func = Task_Scene3_Kyogre; + gTasks[taskId].tState = 0; + gTasks[taskId].tScreenX = 336; + gTasks[taskId].tScreenY = 80; + gTasks[taskId].tDelay = 16; + gTasks[taskId].tZoom = 256; + PanFadeAndZoomScreen(gTasks[taskId].tScreenX, gTasks[taskId].tScreenY, gTasks[taskId].tZoom, 0); ScanlineEffect_InitWave(0, 0xA0, 4, 4, 1, 6, 0); } -static void Task_IntroKyogreScene(u8 taskId) +static void Task_Scene3_Kyogre(u8 taskId) { s16 *data = gTasks[taskId].data; - PanFadeAndZoomScreen(data[1], data[2], data[3], 0); + PanFadeAndZoomScreen(tScreenX, tScreenY, tZoom, 0); - switch (data[0]) + switch (tState) { case 0: - if (--data[6] != 0) + if (--tDelay != 0) break; - data[0]++; + tState++; case 1: - data[6] += 4; - gTasks[taskId].data[1] = 0x158 - Sin(data[6], 0x100); - gTasks[taskId].data[2] = 0x54 - Cos(data[6], 0x40); - if (data[6] == 0x40) + tTrigIdx += 4; + gTasks[taskId].tScreenX = 344 - Sin(tTrigIdx, 0x100); + gTasks[taskId].tScreenY = 84 - Cos(tTrigIdx, 0x40); + if (tTrigIdx == 64) { - data[6] = 0x19; - data[7] = 1; - data[0]++; - CreateKyogreBubbleSprites_0(0); + tDelay = 0x19; + tPalIdx = 1; + tState++; + CreateKyogreBubbleSprites_Body(0); } break; case 2: - if (--data[6] == 0) + if (--tDelay == 0) { - gTasks[taskId].data[1] += 0x100; - gTasks[taskId].data[2] -= 0x102; - data[6] = 8; - data[0]++; - CreateKyogreBubbleSprites_0(0); - CreateKyogreBubbleSprites_1(); + gTasks[taskId].tScreenX += 256; + gTasks[taskId].tScreenY -= 258; + tDelay = 8; + tState++; + CreateKyogreBubbleSprites_Body(0); + CreateKyogreBubbleSprites_Fins(); } break; case 3: - if (--data[6] == 0) + if (--tDelay == 0) { - gTasks[taskId].data[1] -= 0x100; - gTasks[taskId].data[2] += 0x102; - data[6] = 8; - data[0]++; + gTasks[taskId].tScreenX -= 256; + gTasks[taskId].tScreenY += 258; + tDelay = 8; + tState++; } break; case 4: - if (--data[6] == 0) + if (--tDelay == 0) { - gTasks[taskId].data[2] -= 0xFC; - data[6] = 8; - data[0]++; + gTasks[taskId].tScreenY -= 252; + tDelay = 8; + tState++; } break; case 5: - if (--data[6] == 0) + if (--tDelay == 0) { - gTasks[taskId].data[2] += 0xFC; - if (data[7] != 0) + gTasks[taskId].tScreenY += 252; + if (tPalIdx != 0) { - data[6] = 12; - data[7]--; - data[0] = 2; + tDelay = 12; + tPalIdx--; + tState = 2; } else { - data[6] = 1; - data[0]++; + tDelay = 1; + tState++; PlayCryInternal(SPECIES_KYOGRE, 0, 120, 10, 0); } } break; case 6: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 4; - data[7] = 0x1EA; - data[0]++; + tDelay = 4; + tPalIdx = 0x1EA; + tState++; } break; case 7: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 4; - CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[47], sizeof(u16)); - data[7] -= 2; - if (data[7] == 0x1E0) - data[0]++; + tDelay = 4; + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[47], sizeof(u16)); + tPalIdx -= 2; + if (tPalIdx == 0x1E0) + tState++; } break; case 8: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 4; - data[7] = 0x1E2; - data[0]++; + tDelay = 4; + tPalIdx = 0x1E2; + tState++; } break; case 9: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 4; - CpuCopy16(&gIntro3BgPal[data[7]], &gPlttBufferFaded[47], sizeof(u16)); - data[7] += 2; - if (data[7] == 0x1EE) + tDelay = 4; + CpuCopy16(&gIntro3Bg_Pal[tPalIdx], &gPlttBufferFaded[47], sizeof(u16)); + tPalIdx += 2; + if (tPalIdx == 0x1EE) { - data[6] = 0x10; - data[0]++; + tDelay = 16; + tState++; } } break; case 10: - if (--data[6] == 0) + if (--tDelay == 0) { - data[6] = 0; - data[0]++; - CreateKyogreBubbleSprites_0(taskId); + tTrigIdx = 0; + tState++; + CreateKyogreBubbleSprites_Body(taskId); } break; case 11: - data[6] += 4; - data[3] -= 8; - gTasks[taskId].data[1] = Sin(data[6], 0x3C) + 0x58; - if (data[6] == 0x40) + tTrigIdx += 4; + tZoom -= 8; + gTasks[taskId].tScreenX = Sin(tTrigIdx, 0x3C) + 88; + if (tTrigIdx == 64) { - BeginNormalPaletteFade(0xFFFFFFFE, 3, 0, 16, RGB_WHITE); - data[0]++; + BeginNormalPaletteFade(PALETTES_ALL & ~1, 3, 0, 16, RGB_WHITE); + tState++; } break; case 12: - data[6] += 4; - data[3] -= 8; - gTasks[taskId].data[1] = Sin(data[6], 0x14) + 0x80; - if (data[6] == 0x80) - data[0]++; + tTrigIdx += 4; + tZoom -= 8; + gTasks[taskId].tScreenX = Sin(tTrigIdx, 0x14) + 128; + if (tTrigIdx == 128) + tState++; break; case 13: if (!gPaletteFade.active) { - gTasks[taskId].func = Task_IntroLoadClouds1; + gTasks[taskId].func = Task_Scene3_LoadClouds1; gScanlineEffect.state = 3; } break; } } -static void CreateKyogreBubbleSprites_0(u8 taskId) +#undef tScreenX +#undef tScreenY +#undef tZoom +#undef tDelay +#undef tTrigIdx +#undef tPalIdx + +#define sSinIdx data[1] +#define sBaseY data[2] +#define sTaskId data[5] +#define sDelay data[6] +#define sUnk data[7] // Never read + +// taskId is used inconsistently for these two functions. +// The sprite callback for the bubbles will always read it, unless delay is 0 to +// start (it never is), but the first function is often passed 0 instead of a +// taskId, and the second function doesn't take/assign a taskId at all. +// The only time an actual taskId is given is when it actually needs the +// result of reading it, to zoom in at the end of the scene. + +// Creates bubbles at positions spread across Kyogre's body +static void CreateKyogreBubbleSprites_Body(u8 taskId) { int i; u8 spriteId; - for (i = 0; i < 6; i++) + for (i = 0; i < NUM_BUBBLES_IN_SET; i++) { - spriteId = CreateSprite(&gUnknown_085E4D14, gIntroKyogreBubbleData[i][0], gIntroKyogreBubbleData[i][1], i); + spriteId = CreateSprite(&sSpriteTemplate_Bubbles, + sKyogreBubbleData[i][0], + sKyogreBubbleData[i][1], + i); gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[5] = taskId; - gSprites[spriteId].data[6] = gIntroKyogreBubbleData[i][2]; - gSprites[spriteId].data[7] = 0x40; + gSprites[spriteId].sTaskId = taskId; + gSprites[spriteId].sDelay = sKyogreBubbleData[i][2]; + gSprites[spriteId].sUnk = 64; } } -static void CreateKyogreBubbleSprites_1(void) +// Creates bubbles at positions around Kyogre's fins, for when it's moving them +static void CreateKyogreBubbleSprites_Fins(void) { int i; u8 spriteId; - for (i = 0; i < 6; i++) + for (i = 0; i < NUM_BUBBLES_IN_SET; i++) { - spriteId = CreateSprite(&gUnknown_085E4D14, gIntroKyogreBubbleData[i + 6][0], gIntroKyogreBubbleData[i + 6][1], i); + spriteId = CreateSprite(&sSpriteTemplate_Bubbles, + sKyogreBubbleData[i + NUM_BUBBLES_IN_SET][0], + sKyogreBubbleData[i + NUM_BUBBLES_IN_SET][1], + i); gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[6] = gIntroKyogreBubbleData[i][2]; - gSprites[spriteId].data[7] = 0x40; +#ifdef BUGFIX + gSprites[spriteId].sDelay = sKyogreBubbleData[i + NUM_BUBBLES_IN_SET][2]; +#else + gSprites[spriteId].sDelay = sKyogreBubbleData[i][2]; // Using the wrong set of delays here +#endif + gSprites[spriteId].sUnk = 64; } } -static void SpriteCB_IntroKyogreBubbles(struct Sprite *sprite) +static void SpriteCB_KyogreBubbles(struct Sprite *sprite) { - switch(sprite->data[0]) + switch(sprite->sState) { case 0: - if (sprite->data[6] == 0) + if (sprite->sDelay == 0) { - sprite->data[1] = (sprite->data[1] + 11) & 0xFF; - sprite->pos2.x = Sin(sprite->data[1], 4); - sprite->data[2] += 0x30; - sprite->pos2.y = -(sprite->data[2] >> 8); + // Animation has started, float bubbles up + sprite->sSinIdx = (sprite->sSinIdx + 11) & 0xFF; + sprite->pos2.x = Sin(sprite->sSinIdx, 4); + sprite->sBaseY += 48; + sprite->pos2.y = -(sprite->sBaseY >> 8); if (sprite->animEnded) DestroySprite(sprite); } - else if (--sprite->data[6] == 0) + else if (--sprite->sDelay == 0) { + // Start bubble animation after delay has finished StartSpriteAnim(sprite, 0); sprite->invisible = FALSE; } - if (gTasks[sprite->data[5]].data[0] > 11) - sprite->data[0]++; + + // Check if Kyogre scene is ending + // For all but the last bubbles, sTaskId isn't actually set + if (gTasks[sprite->sTaskId].tState > 11) + sprite->sState++; break; case 1: - if (sprite->pos1.x < 120) + // Scene zooms in, move bubbles offscreen + if (sprite->pos1.x < DISPLAY_WIDTH / 2) sprite->pos1.x -= 3; else sprite->pos1.x += 3; - if (sprite->pos1.y < 80) + if (sprite->pos1.y < DISPLAY_HEIGHT / 2) sprite->pos1.y -= 3; else sprite->pos1.y += 3; - if ((u16)(sprite->pos1.y - 20) > 140) + + if ((u16)(sprite->pos1.y - 20) > DISPLAY_HEIGHT - 20) DestroySprite(sprite); break; } } -static void Task_IntroLoadClouds1(u8 taskId) +#undef sSinIdx +#undef sBaseY +#undef sTaskId +#undef sDelay +#undef sUnk + +static void Task_Scene3_LoadClouds1(u8 taskId) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 @@ -2085,183 +2353,206 @@ static void Task_IntroLoadClouds1(u8 taskId) SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG2VOFS, 0); - LZDecompressVram(gIntro3CloudsGfx, (void *)VRAM); - LZDecompressVram(gIntro3CloudsGfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntro3Clouds3Tilemap, (void *)(BG_SCREEN_ADDR(28))); - gTasks[taskId].func = Task_IntroLoadClouds2; + LZDecompressVram(gIntroClouds_Gfx, (void *)VRAM); + LZDecompressVram(gIntroClouds_Gfx, (void *)(BG_CHAR_ADDR(1))); + LZDecompressVram(gIntroCloudsSun_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + gTasks[taskId].func = Task_Scene3_LoadClouds2; } -static void Task_IntroLoadClouds2(u8 taskId) +static void Task_Scene3_LoadClouds2(u8 taskId) { - LZDecompressVram(gIntro3Clouds1Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntro3Clouds2Tilemap, (void *)(BG_SCREEN_ADDR(26))); - gTasks[taskId].func = Task_IntroLoadClouds3; + LZDecompressVram(gIntroCloudsLeft_Tilemap, (void *)(BG_CHAR_ADDR(3))); + LZDecompressVram(gIntroCloudsRight_Tilemap, (void *)(BG_SCREEN_ADDR(26))); + gTasks[taskId].func = Task_Scene3_InitClouds; } -static void Task_IntroLoadClouds3(u8 taskId) +#define tCloudPos data[6] + +static void Task_Scene3_InitClouds(u8 taskId) { SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); - gTasks[taskId].func = Task_IntroCloudScene; - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = 16; + gTasks[taskId].func = Task_Scene3_Clouds; + gTasks[taskId].tState = 0; + gTasks[taskId].tCloudPos = 16; } -static void Task_IntroCloudScene(u8 taskId) +// Clouds coming in from the sides before Rayquaza appears +static void Task_Scene3_Clouds(u8 taskId) { s16 *data = gTasks[taskId].data; - SetGpuReg(REG_OFFSET_BG0HOFS, (data[6] >> 8)); - SetGpuReg(REG_OFFSET_BG1HOFS, -(data[6] >> 8)); + // Left clouds are on BG0, right clouds are on BG1 + SetGpuReg(REG_OFFSET_BG0HOFS, (tCloudPos >> 8)); + SetGpuReg(REG_OFFSET_BG1HOFS, -(tCloudPos >> 8)); - switch (data[0]) + switch (tState) { case 0: - if (--data[6] == 0) + // Cloud position is used briefly as a delay, before + // the scene has faded in from white + if (--tCloudPos == 0) { - BeginNormalPaletteFade(0xFFFFFFFE, 0, 16, 0, RGB_WHITEALPHA); - data[6] = 0x5000; - data[0]++; + // Start fade in from white, set cloud starting positions + BeginNormalPaletteFade(PALETTES_ALL & ~1, 0, 16, 0, RGB_WHITEALPHA); + tCloudPos = 80 << 8; + tState++; } break; case 1: - if (data[6] == 0x2800) - BeginNormalPaletteFade(0x0000FFFE, 3, 0, 16, RGB(9, 10, 10)); + // Start fading out + if (tCloudPos == 40 << 8) + BeginNormalPaletteFade(PALETTES_BG & ~1, 3, 0, 16, RGB(9, 10, 10)); - if (data[6] != 0) - data[6] -= 0x80; + // Move clouds inward toward each other + if (tCloudPos != 0) + tCloudPos -= 128; else if (!gPaletteFade.active) - gTasks[taskId].func = Task_IntroLoadRayquazaLightningScene; + gTasks[taskId].func = Task_Scene3_LoadLightning; break; } } +#undef tCloudPos + +#define tDelay data[6] +#define tTimer data[7] -static void Task_IntroLoadRayquazaLightningScene(u8 taskId) +static void Task_Scene3_LoadLightning(u8 taskId) { - LZDecompressVram(gIntro3RayquazaTilemap, (void *)(BG_SCREEN_ADDR(28))); - LZDecompressVram(gIntro3Clouds4Tilemap, (void *)(BG_CHAR_ADDR(3))); - LZDecompressVram(gIntro3RayquazaGfx, (void *)(BG_CHAR_ADDR(1))); - LZDecompressVram(gIntro3Clouds2Gfx, (void *)VRAM); + LZDecompressVram(gIntroRayquaza_Tilemap, (void *)(BG_SCREEN_ADDR(28))); + LZDecompressVram(gIntroRayquazaClouds_Tilemap, (void *)(BG_CHAR_ADDR(3))); + LZDecompressVram(gIntroRayquaza_Gfx, (void *)(BG_CHAR_ADDR(1))); + LZDecompressVram(gIntroRayquazaClouds_Gfx, (void *)VRAM); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); - gTasks[taskId].func = Task_IntroRayquazaLightningScene; - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[6] = 1; - gTasks[taskId].data[7] = 0; - LoadCompressedSpriteSheetUsingHeap(gIntroRayquazaLightningSpriteSheet); - LoadSpritePalettes(gIntroRayquazaLightningPalette); + gTasks[taskId].func = Task_Scene3_Lightning; + gTasks[taskId].tState = 0; + gTasks[taskId].tDelay = 1; + gTasks[taskId].tTimer = 0; + LoadCompressedSpriteSheetUsingHeap(sSpriteSheet_Lightning); + LoadSpritePalettes(sSpritePalette_Lightning); } -static void Task_IntroRayquazaLightningScene(u8 taskId) +static void Task_Scene3_Lightning(u8 taskId) { s16 *data = gTasks[taskId].data; u8 spriteId; - switch (data[0]) + switch (tState) { case 0: - if (--data[6] == 0) + if (--tDelay == 0) { - CreateSprite(&gIntroLightningSprite, 200, 48, 0); - spriteId = CreateSprite(&gIntroLightningSprite, 200, 80, 1); + // Do first lightning bolt + CreateSprite(&sSpriteTemplate_Lightning, 200, 48, 0); + spriteId = CreateSprite(&sSpriteTemplate_Lightning, 200, 80, 1); StartSpriteAnim(&gSprites[spriteId], 1); - spriteId = CreateSprite(&gIntroLightningSprite, 200, 112, 2); + spriteId = CreateSprite(&sSpriteTemplate_Lightning, 200, 112, 2); StartSpriteAnim(&gSprites[spriteId], 2); - data[0]++; - data[6] = 72; + tState++; + tDelay = 72; } break; case 1: - if (--data[6] == 0) + if (--tDelay == 0) { - CreateSprite(&gIntroLightningSprite, 40, 48, 0); - spriteId = CreateSprite(&gIntroLightningSprite, 40, 80, 1); + // Do second lightning bolt + CreateSprite(&sSpriteTemplate_Lightning, 40, 48, 0); + spriteId = CreateSprite(&sSpriteTemplate_Lightning, 40, 80, 1); StartSpriteAnim(&gSprites[spriteId], 1); - spriteId = CreateSprite(&gIntroLightningSprite, 40, 112, 2); + spriteId = CreateSprite(&sSpriteTemplate_Lightning, 40, 112, 2); StartSpriteAnim(&gSprites[spriteId], 2); - data[0]++; - data[6] = 48; + tState++; + tDelay = 48; } break; case 2: - if (--data[6] == 0) - gTasks[taskId].func = Task_IntroLoadRayquazaGlowScene; + if (--tDelay == 0) + gTasks[taskId].func = Task_Scene3_LoadRayquazaAttack; break; } } -static void SpriteCB_IntroRayquazaLightning(struct Sprite *sprite) +#define sPalIdx data[1] +#define sDelay data[2] + +static void SpriteCB_Lightning(struct Sprite *sprite) { if (sprite->animEnded) sprite->invisible = TRUE; - switch(sprite->data[0]) + switch(sprite->sState) { case 0: - sprite->data[1] = 0x1C2; - sprite->data[0]++; + sprite->sPalIdx = 0x1C2; + sprite->sState++; case 1: - CpuCopy16(&gIntro3BgPal[sprite->data[1]], &gPlttBufferFaded[93], 2); - sprite->data[1] += 2; - if (sprite->data[1] != 0x1CE) + CpuCopy16(&gIntro3Bg_Pal[sprite->sPalIdx], &gPlttBufferFaded[93], 2); + sprite->sPalIdx += 2; + if (sprite->sPalIdx != 0x1CE) break; - sprite->data[1] = 0x1CC; - sprite->data[2] = 4; - sprite->data[0]++; + sprite->sPalIdx = 0x1CC; + sprite->sDelay = 4; + sprite->sState++; case 2: - if (--sprite->data[2] == 0) + if (--sprite->sDelay == 0) { - sprite->data[2] = 4; - CpuCopy16(&gIntro3BgPal[sprite->data[1]], &gPlttBufferFaded[93], 2); - sprite->data[1] -= 2; - if (sprite->data[1] == 0x1C0) + sprite->sDelay = 4; + CpuCopy16(&gIntro3Bg_Pal[sprite->sPalIdx], &gPlttBufferFaded[93], 2); + sprite->sPalIdx -= 2; + if (sprite->sPalIdx == 0x1C0) DestroySprite(sprite); } break; } } -static void Task_IntroLoadRayquazaGlowScene(u8 taskId) +#undef sPalIdx +#undef sDelay + +#define tRayquazaTaskId data[4] + +static void Task_Scene3_LoadRayquazaAttack(u8 taskId) { - u8 newTaskId; + u8 attackTaskId; - LoadCompressedSpriteSheet(gIntroRayquazaGlowSpriteSheet); - LoadSpritePalettes(gIntroRayquazaGlowPalette); + LoadCompressedSpriteSheet(sSpriteSheet_RayquazaOrb); + LoadSpritePalettes(sSpritePalette_RayquazaOrb); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON); - gTasks[taskId].func = Task_IntroRayquazaGlowScene_0; - BeginNormalPaletteFade(0x0000FFDE, 0, 16, 0, RGB(9, 10, 10)); - gTasks[taskId].data[0] = 0; + gTasks[taskId].func = Task_Scene3_Rayquaza; + BeginNormalPaletteFade(PALETTES_BG & ~(0x21), 0, 16, 0, RGB(9, 10, 10)); + gTasks[taskId].tState = 0; gTasks[taskId].data[1] = 0xA8; gTasks[taskId].data[2] = -0x10; gTasks[taskId].data[3] = -0x88; gTasks[taskId].data[4] = -0x10; - newTaskId = CreateTask(Task_IntroRayquazaGlowScene_1, 0); - gTasks[newTaskId].data[4] = taskId; + attackTaskId = CreateTask(Task_RayquazaAttack, 0); + gTasks[attackTaskId].tRayquazaTaskId = taskId; } -static void Task_IntroRayquazaGlowScene_0(u8 taskId) +static void Task_Scene3_Rayquaza(u8 taskId) { s16 *data = gTasks[taskId].data; - if (data[7] % 2 == 0) + if (tTimer % 2 == 0) data[6] ^= 2; - data[7]++; + tTimer++; - switch(data[0]) + switch(tState) { case 0: - if ((data[7] & 1) != 0) + if ((tTimer & 1) != 0) { data[1] -= 2; data[2]++; @@ -2270,12 +2561,12 @@ static void Task_IntroRayquazaGlowScene_0(u8 taskId) } if (data[1] == 0x68) { - data[0]++; + tState++; data[5] = 1; } break; case 1: - data[0]++; + tState++; data[5] = 4; break; case 2: @@ -2286,7 +2577,7 @@ static void Task_IntroRayquazaGlowScene_0(u8 taskId) if (!gPaletteFade.active) { data[5] = 0x8C; - data[0]++; + tState++; } break; case 3: @@ -2295,6 +2586,8 @@ static void Task_IntroRayquazaGlowScene_0(u8 taskId) break; } } +#undef tDelay +#undef tTimer static void Task_EndIntroMovie(u8 taskId) { @@ -2302,24 +2595,23 @@ static void Task_EndIntroMovie(u8 taskId) SetMainCallback2(MainCB2_EndIntro); } -static void Task_IntroRayquazaGlowScene_1(u8 taskId) +static void Task_RayquazaAttack(u8 taskId) { - // Note: data[4] contains the taskId of Task_IntroRayquazaGlowScene_0 u8 spriteId; s16 *data = gTasks[taskId].data; data[2]++; - switch(data[0]) + switch(tState) { case 0: if ((data[2] & 1) != 0) { - CpuCopy16(&gIntro3BgPal[0x1A2 + data[1] * 2], &gPlttBufferFaded[94], 2); + CpuCopy16(&gIntro3Bg_Pal[0x1A2 + data[1] * 2], &gPlttBufferFaded[94], 2); data[1]++; } if (data[1] == 6) { - data[0]++; + tState++; data[1] = 0; data[3] = 10; } @@ -2329,12 +2621,12 @@ static void Task_IntroRayquazaGlowScene_1(u8 taskId) { if ((data[2] & 1) != 0) { - CpuCopy16(&gIntro3BgPal[0x1A2 + data[1] * 2], &gPlttBufferFaded[88], 2); + CpuCopy16(&gIntro3Bg_Pal[0x1A2 + data[1] * 2], &gPlttBufferFaded[88], 2); data[1]++; } if (data[1] == 6) { - data[0]++; + tState++; data[3] = 10; } } @@ -2348,16 +2640,16 @@ static void Task_IntroRayquazaGlowScene_1(u8 taskId) { if ((data[2] & 1) != 0) { - CpuCopy16(&gIntro3BgPal[0x182 + data[1] * 2], &gPlttBufferFaded[92], 2); + CpuCopy16(&gIntro3Bg_Pal[0x182 + data[1] * 2], &gPlttBufferFaded[92], 2); data[1]++; } if (data[1] == 6) { - spriteId = CreateSprite(&gIntroRayquazaHyperbeamSprite, 120, 88, 15); + spriteId = CreateSprite(&sSpriteTemplate_RayquazaOrb, 120, 88, 15); PlaySE(SE_INTRO_BLAST); gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[3] = data[4]; - data[0]++; + gSprites[spriteId].data[3] = tRayquazaTaskId; + tState++; data[3] = 16; } } @@ -2372,13 +2664,13 @@ static void Task_IntroRayquazaGlowScene_1(u8 taskId) if (--data[3] != 0) { BlendPalette(0x50, 16, data[3], RGB(9, 10, 10)); - CpuCopy16(&gIntro3BgPal[0x1AC], &gPlttBufferFaded[94], 2); - CpuCopy16(&gIntro3BgPal[0x1AC], &gPlttBufferFaded[88], 2); - CpuCopy16(&gIntro3BgPal[0x18C], &gPlttBufferFaded[92], 2); + CpuCopy16(&gIntro3Bg_Pal[0x1AC], &gPlttBufferFaded[94], 2); + CpuCopy16(&gIntro3Bg_Pal[0x1AC], &gPlttBufferFaded[88], 2); + CpuCopy16(&gIntro3Bg_Pal[0x18C], &gPlttBufferFaded[92], 2); } else { - data[0]++; + tState++; data[3] = 53; } } @@ -2386,8 +2678,8 @@ static void Task_IntroRayquazaGlowScene_1(u8 taskId) case 4: if (--data[3] == 0) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_WHITE); - data[0]++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_WHITE); + tState++; } break; case 5: @@ -2397,7 +2689,7 @@ static void Task_IntroRayquazaGlowScene_1(u8 taskId) } } -static void intro_reset_and_hide_bgs(void) +static void IntroResetGpuRegs(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); @@ -2413,9 +2705,9 @@ static void intro_reset_and_hide_bgs(void) SetGpuReg(REG_OFFSET_BLDY, 0); } -static void Task_IntroWaterDrops_1(u8 taskId) +static void Task_BlendLogoIn(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: default: @@ -2426,10 +2718,10 @@ static void Task_IntroWaterDrops_1(u8 taskId) | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[31]); + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[31]); SetGpuReg(REG_OFFSET_BLDY, 0); - gTasks[taskId].data[1] = 0x40; - gTasks[taskId].data[0]++; + gTasks[taskId].data[1] = ARRAY_COUNT(gTitleScreenAlphaBlend); + gTasks[taskId].tState++; break; case 1: if (gTasks[taskId].data[1] != 0) @@ -2438,13 +2730,13 @@ static void Task_IntroWaterDrops_1(u8 taskId) gTasks[taskId].data[1]--; tmp = gTasks[taskId].data[1] / 2; - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[tmp]); + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[tmp]); } else { - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[0]); - gTasks[taskId].data[1] = 0x10; - gTasks[taskId].data[0]++; + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[0]); + gTasks[taskId].data[1] = ARRAY_COUNT(gTitleScreenAlphaBlend) / 4; + gTasks[taskId].tState++; } break; case 2: @@ -2456,9 +2748,9 @@ static void Task_IntroWaterDrops_1(u8 taskId) } } -static void Task_IntroWaterDrops_2(u8 taskId) +static void Task_BlendLogoOut(u8 taskId) { - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: default: @@ -2469,25 +2761,25 @@ static void Task_IntroWaterDrops_2(u8 taskId) | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[0]); + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[0]); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].data[1] = 0; - gTasks[taskId].data[0]++; + gTasks[taskId].tState++; break; case 1: - if (gTasks[taskId].data[1] < 62) + if (gTasks[taskId].data[1] < (int)ARRAY_COUNT(gTitleScreenAlphaBlend) - 2) { u8 tmp; gTasks[taskId].data[1]++; tmp = gTasks[taskId].data[1] / 2; - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[tmp]); + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[tmp]); } else { - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[31]); - gTasks[taskId].data[1] = 0x10; - gTasks[taskId].data[0]++; + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[31]); + gTasks[taskId].data[1] = ARRAY_COUNT(gTitleScreenAlphaBlend) / 4; + gTasks[taskId].tState++; } break; case 2: @@ -2529,9 +2821,9 @@ void PanFadeAndZoomScreen(u16 screenX, u16 screenY, u16 zoom, u16 alpha) SetGpuReg(REG_OFFSET_BG2Y_H, dest.dy >> 16); } -static void sub_816F318(struct Sprite *sprite) +static void SpriteCB_WaterDrop_Ripple(struct Sprite *sprite) { - u8 r0; + u8 palNum; if (sprite->data[2] >= 192) { @@ -2544,10 +2836,10 @@ static void sub_816F318(struct Sprite *sprite) sprite->invisible = FALSE; SetOamMatrix(sprite->data[1], sprite->data[2], 0, 0, sprite->data[2]); sprite->data[2] = (sprite->data[2] * 95) / 100; - r0 = (sprite->data[2] - 192) / 128 + 9; - if (r0 > 15) - r0 = 15; - sprite->oam.paletteNum = r0; + palNum = (sprite->data[2] - 192) / 128 + 9; + if (palNum > 15) + palNum = 15; + sprite->oam.paletteNum = palNum; } } else @@ -2556,17 +2848,17 @@ static void sub_816F318(struct Sprite *sprite) } } -static void sub_816F3A4(struct Sprite *sprite) +static void SpriteCB_WaterDropHalf(struct Sprite *sprite) { if (gSprites[sprite->data[7]].data[7] != 0) { sprite->invisible = TRUE; sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); + StartSpriteAnim(sprite, DROP_ANIM_RIPPLE); sprite->data[2] = 1024; sprite->data[3] = 8 * (sprite->data[1] & 3); - sprite->callback = sub_816F318; + sprite->callback = SpriteCB_WaterDrop_Ripple; sprite->oam.shape = SPRITE_SHAPE(64x32); sprite->oam.size = SPRITE_SIZE(64x32); CalcCenterToCornerVec(sprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_ERASE); @@ -2580,13 +2872,14 @@ static void sub_816F3A4(struct Sprite *sprite) } } -static void sub_816F454(struct Sprite *sprite) +static void SpriteCB_WaterDrop(struct Sprite *sprite) { - if (sprite->data[0] != 0) - sprite->callback = sub_816F46C; + // Wait for sState to be modified by Task_Scene1_WaterDrops + if (sprite->sState != 0) + sprite->callback = SpriteCB_WaterDrop_Slide; } -static void sub_816F46C(struct Sprite *sprite) +static void SpriteCB_WaterDrop_Slide(struct Sprite *sprite) { if (sprite->pos1.x <= 116) { @@ -2595,7 +2888,7 @@ static void sub_816F46C(struct Sprite *sprite) sprite->pos1.x += 4; sprite->pos2.x = -4; sprite->data[4] = 128; - sprite->callback = sub_816F5B4; + sprite->callback = SpriteCB_WaterDrop_ReachLeafEnd; } else { @@ -2635,28 +2928,27 @@ static void sub_816F46C(struct Sprite *sprite) } } -static void sub_816F5B4(struct Sprite *sprite) +static void SpriteCB_WaterDrop_ReachLeafEnd(struct Sprite *sprite) { SetOamMatrix(sprite->data[1], sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); SetOamMatrix(sprite->data[1] + 1, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); SetOamMatrix(sprite->data[1] + 2, sprite->data[6] + 64, 0, 0, sprite->data[6] + 64); if (sprite->data[4] != 64) { - u16 data4; - + u16 sinIdx; sprite->data[4] -= 8; - data4 = sprite->data[4]; - sprite->pos2.x = gSineTable[(u8)(data4 + 64)] / 64; - sprite->pos2.y = gSineTable[(u8)data4] / 64; + sinIdx = sprite->data[4]; + sprite->pos2.x = gSineTable[(u8)(sinIdx + 64)] / 64; + sprite->pos2.y = gSineTable[(u8)sinIdx] / 64; } else { sprite->data[4] = 0; - sprite->callback = sub_816F660; + sprite->callback = SpriteCB_WaterDrop_DangleFromLeaf; } } -static void sub_816F660(struct Sprite *sprite) +static void SpriteCB_WaterDrop_DangleFromLeaf(struct Sprite *sprite) { if (sprite->data[0] != 2) { @@ -2669,11 +2961,11 @@ static void sub_816F660(struct Sprite *sprite) } else { - sprite->callback = SpriteCB_WaterDropFall; + sprite->callback = SpriteCB_WaterDrop_Fall; } } -static void SpriteCB_WaterDropFall(struct Sprite *sprite) +static void SpriteCB_WaterDrop_Fall(struct Sprite *sprite) { if (sprite->pos1.y < sprite->data[5]) { @@ -2685,18 +2977,19 @@ static void SpriteCB_WaterDropFall(struct Sprite *sprite) sprite->invisible = TRUE; sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); + StartSpriteAnim(sprite, DROP_ANIM_RIPPLE); sprite->data[2] = 1024; sprite->data[3] = 8 * (sprite->data[1] & 3); - sprite->callback = sub_816F318; + sprite->callback = SpriteCB_WaterDrop_Ripple; sprite->oam.shape = SPRITE_SHAPE(64x32); sprite->oam.size = SPRITE_SIZE(64x32); CalcCenterToCornerVec(sprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_ERASE); } } -//Duplicate function -static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) +// Identical to SpriteCB_WaterDrop_Fall +// Used by the 2nd and 3rd water drops to skip the leaf slide +static void SpriteCB_WaterDropShort(struct Sprite *sprite) { if (sprite->pos1.y < sprite->data[5]) { @@ -2708,10 +3001,10 @@ static void SpriteCB_WaterDropFall_2(struct Sprite *sprite) sprite->invisible = TRUE; sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; - StartSpriteAnim(sprite, 3); + StartSpriteAnim(sprite, DROP_ANIM_RIPPLE); sprite->data[2] = 1024; sprite->data[3] = 8 * (sprite->data[1] & 3); - sprite->callback = sub_816F318; + sprite->callback = SpriteCB_WaterDrop_Ripple; sprite->oam.shape = SPRITE_SHAPE(64x32); sprite->oam.size = SPRITE_SIZE(64x32); CalcCenterToCornerVec(sprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_ERASE); @@ -2723,7 +3016,8 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) u8 spriteId; u8 oldSpriteId; - spriteId = CreateSprite(&gIntroWaterDropSprite, x, y, 1); + // Create water drop reflection + spriteId = CreateSprite(&sSpriteTemplate_WaterDrop, x, y, 1); gSprites[spriteId].data[0] = 0; gSprites[spriteId].data[7] = 0; gSprites[spriteId].data[1] = d; @@ -2734,29 +3028,32 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.matrixNum = d; CalcCenterToCornerVec(&gSprites[spriteId], SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), ST_OAM_AFFINE_ERASE); - StartSpriteAnim(&gSprites[spriteId], 2); + StartSpriteAnim(&gSprites[spriteId], DROP_ANIM_REFLECTION); if (!fallImmediately) - gSprites[spriteId].callback = sub_816F454; + gSprites[spriteId].callback = SpriteCB_WaterDrop; // Do full anim, for 1st drop that slides along the leaf else - gSprites[spriteId].callback = SpriteCB_WaterDropFall_2; + gSprites[spriteId].callback = SpriteCB_WaterDropShort; // Skip to drop falling into the water, for 2nd and 3rd drops oldSpriteId = spriteId; - spriteId = CreateSprite(&gIntroWaterDropSprite, x, y, 1); + // Create water drop upper half + // Implicitly anim number 0, DROP_ANIM_UPPER_HALF + spriteId = CreateSprite(&sSpriteTemplate_WaterDrop, x, y, 1); gSprites[spriteId].data[7] = oldSpriteId; gSprites[spriteId].data[1] = d + 1; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.matrixNum = d + 1; CalcCenterToCornerVec(&gSprites[spriteId], SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), ST_OAM_AFFINE_ERASE); - gSprites[spriteId].callback = sub_816F3A4; + gSprites[spriteId].callback = SpriteCB_WaterDropHalf; - spriteId = CreateSprite(&gIntroWaterDropSprite, x, y, 1); + // Create water drop lower half + spriteId = CreateSprite(&sSpriteTemplate_WaterDrop, x, y, 1); gSprites[spriteId].data[7] = oldSpriteId; gSprites[spriteId].data[1] = d + 2; - StartSpriteAnim(&gSprites[spriteId], 1); + StartSpriteAnim(&gSprites[spriteId], DROP_ANIM_LOWER_HALF); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.matrixNum = d + 2; CalcCenterToCornerVec(&gSprites[spriteId], SPRITE_SHAPE(32x32), SPRITE_SIZE(32x32), ST_OAM_AFFINE_ERASE); - gSprites[spriteId].callback = sub_816F3A4; + gSprites[spriteId].callback = SpriteCB_WaterDropHalf; SetOamMatrix(d, c + 32, 0, 0, c + 32); SetOamMatrix(d + 1, c + 32, 0, 0, c + 32); @@ -2765,39 +3062,51 @@ static u8 CreateWaterDrop(s16 x, s16 y, u16 c, u16 d, u16 e, u8 fallImmediately) return oldSpriteId; } -static void SpriteCB_IntroGraphicsBicycle(struct Sprite *sprite) +// State is handled by Task_Scene2_BikeRide +static void SpriteCB_PlayerOnBicycle(struct Sprite *sprite) { - switch (sprite->data[0]) + // Adjust x position + switch (sprite->sState) { case 0: + // Move forwards StartSpriteAnimIfDifferent(sprite, 0); sprite->pos1.x--; break; case 1: + // Drift backwards slowly StartSpriteAnimIfDifferent(sprite, 0); if (gIntroFrameCounter & 7) return; sprite->pos1.x++; break; case 2: + // Move backwards if (sprite->pos1.x <= 120 || gIntroFrameCounter & 7) sprite->pos1.x++; break; case 3: + // Bike in place break; case 4: + // Exit to the left if (sprite->pos1.x > -32) sprite->pos1.x -= 2; break; } + if (gIntroFrameCounter & 7) return; + + // Adjust y position if (sprite->pos2.y != 0) { + // Return to neutral after wobble sprite->pos2.y = 0; } else { + // Random wobble on y axis switch (Random() & 3) { case 0: @@ -2814,115 +3123,136 @@ static void SpriteCB_IntroGraphicsBicycle(struct Sprite *sprite) } } -static void SpriteCB_IntroGraphicsFlygon(struct Sprite *sprite) +#define sSinIdx data[1] + +// Movement is started by setting state to 1 in Task_Scene2_BikeRide +static void SpriteCB_Flygon(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: break; case 1: - if (sprite->pos2.x + sprite->pos1.x < 304) + if (sprite->pos2.x + sprite->pos1.x < DISPLAY_WIDTH + 64) sprite->pos2.x += 8; else - sprite->data[0] = 2; + sprite->sState = 2; break; case 2: if (sprite->pos2.x + sprite->pos1.x > 120) sprite->pos2.x -= 1; else - sprite->data[0] = 3; + sprite->sState = 3; break; case 3: if (sprite->pos2.x > 0) sprite->pos2.x -= 2; break; } - sprite->pos2.y = Sin((u8)sprite->data[1], 8) - gIntroGraphicsFlygonYOffset; - sprite->data[1] += 4; + sprite->pos2.y = Sin((u8)sprite->sSinIdx, 8) - sFlygonYOffset; + sprite->sSinIdx += 4; } -static void sub_816FB38(struct Sprite *sprite) +#undef sSinIdx + +#define sTimer data[1] +#define sLetterId data[2] +#define sColorDelay data[3] +#define sLetterX data[3] // Re-used + +#define COLOR_CHANGES 9 // Number of stages for changing the letter color + +// For the letters in "Game Freak" +// Also intended for the letters in "Presents", which is never shown +static void SpriteCB_LogoLetter(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: - if (sprite->data[1] != 0) + if (sprite->sTimer != 0) { - sprite->data[1]--; + sprite->sTimer--; } else { + // Start the grow and shrink appearance animation sprite->invisible = FALSE; StartSpriteAffineAnim(sprite, 1); - sprite->data[0]++; + sprite->sState++; } break; case 1: - if (gIntroFrameCounter == 0x90) + if (gIntroFrameCounter == TIMER_LOGO_LETTERS_COLOR) { - sprite->data[0]++; - sprite->data[1] = 9; - sprite->data[3] = 2; + // Initialize color fade + sprite->sState++; + sprite->sTimer = COLOR_CHANGES; + sprite->sColorDelay = 2; } break; case 2: - if (sprite->data[3] == 0) + // Fade letters to blue + if (sprite->sColorDelay == 0) { - sprite->data[3] = 2; - if (sprite->data[1] != 0) + sprite->sColorDelay = 2; + if (sprite->sTimer != 0) { - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2); - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2); - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2); - sprite->data[1]--; + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[0x11F], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[0x114], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[0x11A], 2); + sprite->sTimer--; } else { - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2); - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2); - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2); - sprite->data[0]++; + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[0x11F], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[0x114], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[0x11A], 2); + sprite->sState++; } } else { - sprite->data[3]--; + sprite->sColorDelay--; } break; case 3: - if (sprite->data[3] != 0) + // Fade letters back to white + if (sprite->sColorDelay != 0) { - sprite->data[3]--; + sprite->sColorDelay--; } else { - sprite->data[3] = 2; - if (sprite->data[1] < 10) + sprite->sColorDelay = 2; + if (sprite->sTimer <= COLOR_CHANGES) { - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1]], &gPlttBufferFaded[0x11F], 2); - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x10], &gPlttBufferFaded[0x114], 2); - CpuCopy16(&gIntro1GameFreakTextFadePal[sprite->data[1] + 0x20], &gPlttBufferFaded[0x11A], 2); - sprite->data[1]++; + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer], &gPlttBufferFaded[0x11F], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 16], &gPlttBufferFaded[0x114], 2); + CpuCopy16(&gIntroGameFreakTextFade_Pal[sprite->sTimer + 32], &gPlttBufferFaded[0x11A], 2); + sprite->sTimer++; } else { - sprite->data[0]++; + sprite->sState++; } } break; case 4: - if (gIntroFrameCounter == 0x110) + if (gIntroFrameCounter == TIMER_LOGO_DISAPPEAR) { + // Start the grow disappearance animation StartSpriteAffineAnim(sprite, 2); sprite->oam.objMode = ST_OAM_OBJ_BLEND; - sprite->data[0]++; + sprite->sState++; } break; case 5: - sprite->data[3] += gUnknown_085E4F48[sprite->data[2]]; - sprite->pos2.x = (sprite->data[3] & 0xFF00) >> 8; - if (sprite->data[2] < 4) + // Spread the letters out as they grow + sprite->sLetterX += sGameFreakLettersMoveSpeed[sprite->sLetterId]; + sprite->pos2.x = (sprite->sLetterX & 0xFF00) >> 8; + if (sprite->sLetterId < 4) { + // Is in first 4 letters, i.e. "Game" s16 temp = sprite->pos2.x; sprite->pos2.x = -temp; } @@ -2932,22 +3262,23 @@ static void sub_816FB38(struct Sprite *sprite) } } -static void sub_816FD44(struct Sprite *sprite) +static void SpriteCB_GameFreakLogo(struct Sprite *sprite) { - switch(sprite->data[0]) + switch(sprite->sState) { case 0: - if (gIntroFrameCounter == 0x80) + if (gIntroFrameCounter == TIMER_LOGO_APPEAR) { sprite->invisible = FALSE; - sprite->data[0]++; + sprite->sState++; } break; case 1: - if (gIntroFrameCounter == 0x110) + if (gIntroFrameCounter == TIMER_LOGO_DISAPPEAR) { + // Start the grow disappearance animation StartSpriteAffineAnim(sprite, 3); - sprite->data[0]++; + sprite->sState++; } break; case 2: @@ -2957,35 +3288,45 @@ static void sub_816FD44(struct Sprite *sprite) } } -static u8 CreatePart1Animations(s16 a0, s16 a1, s16 a2) +static u8 CreateGameFreakLogoSprites(s16 x, s16 y, s16 unused) { u16 i; u8 spriteId; - for (i = 0; i < 9; i++) + // Create "Game Freak" letters + for (i = 0; i < NUM_GF_LETTERS; i++) { - spriteId = CreateSprite(&gUnknown_085E4F5C, gUnknown_085E4E94[i][1] + a0, a1 - 4, 0); - gSprites[spriteId].data[0] = 0; - gSprites[spriteId].data[1] = gUnknown_085E4FA4[i]; - gSprites[spriteId].data[2] = i; + spriteId = CreateSprite(&sSpriteTemplate_GameFreakLetter, sGameFreakLetterData[i][1] + x, y - 4, 0); + gSprites[spriteId].sState = 0; + gSprites[spriteId].sTimer = sGameFreakLetterStartDelays[i]; + gSprites[spriteId].sLetterId = i; gSprites[spriteId].invisible = TRUE; gSprites[spriteId].oam.matrixNum = i + 12; - StartSpriteAnim(&gSprites[spriteId], gUnknown_085E4E94[i][0]); + StartSpriteAnim(&gSprites[spriteId], sGameFreakLetterData[i][0]); StartSpriteAffineAnim(&gSprites[spriteId], 0); } - spriteId = CreateSprite(&gUnknown_085E4F8C, 120, a1 - 6, 0); - gSprites[spriteId].data[0] = 0; + + // Create Game Freak logo + spriteId = CreateSprite(&sSpriteTemplate_GameFreakLogo, 120, y - 6, 0); + gSprites[spriteId].sState = 0; gSprites[spriteId].invisible = TRUE; gSprites[spriteId].oam.matrixNum = i + 12; StartSpriteAffineAnim(&gSprites[spriteId], 1); + return spriteId; } -static void sub_816FEDC(struct Sprite *sprite) +#undef sTimer +#undef sLetterId +#undef sColorDelay +#undef sLetterX +#undef COLOR_CHANGES + +static void SpriteCB_FlygonSilhouette(struct Sprite *sprite) { sprite->data[7]++; - if (sprite->data[0] != 0) + if (sprite->sState != 0) { s16 sin1; s16 sin2; @@ -3003,7 +3344,7 @@ static void sub_816FEDC(struct Sprite *sprite) SetOamMatrix(1, a, b, c, d); } - switch (sprite->data[0]) + switch (sprite->sState) { case 0: default: @@ -3011,7 +3352,7 @@ static void sub_816FEDC(struct Sprite *sprite) sprite->oam.matrixNum = 1; CalcCenterToCornerVec(sprite, SPRITE_SHAPE(64x32), SPRITE_SIZE(64x32), ST_OAM_AFFINE_DOUBLE); sprite->invisible = FALSE; - sprite->data[0] = 1; + sprite->sState = 1; sprite->data[1] = 0x80; sprite->data[2] = 0; sprite->data[3] = 0; @@ -3024,7 +3365,7 @@ static void sub_816FEDC(struct Sprite *sprite) if (sprite->pos1.x + sprite->pos2.x <= -16) { sprite->oam.priority = 3; - sprite->data[0]++; + sprite->sState++; sprite->pos1.x = 20; sprite->pos1.y = 40; sprite->data[1] = 0x200; @@ -3042,13 +3383,10 @@ static void sub_816FEDC(struct Sprite *sprite) } } -static void SpriteCB_IntroRayquazaHyperbeam(struct Sprite *sprite) +static void SpriteCB_RayquazaOrb(struct Sprite *sprite) { u16 foo; - - //I'm not sure why a switch statement was used here. - //if (sprite->data[0] != 1) would have been more appropriate. - switch (sprite->data[0]) + switch (sprite->sState) { case 0: default: @@ -3057,7 +3395,7 @@ static void SpriteCB_IntroRayquazaHyperbeam(struct Sprite *sprite) sprite->oam.matrixNum = 18; CalcCenterToCornerVec(sprite, SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); sprite->data[1] = 0; - sprite->data[0] = 1; + sprite->sState = 1; //fall through case 1: sprite->data[7]++; diff --git a/src/intro_credits_graphics.c b/src/intro_credits_graphics.c index 45cc24e5c..1f196b268 100644 --- a/src/intro_credits_graphics.c +++ b/src/intro_credits_graphics.c @@ -6,6 +6,25 @@ #include "task.h" #include "main.h" #include "graphics.h" +#include "constants/rgb.h" + +/* + The graphics here are used by both the second scene of the intro + and the credit sequence, where the player bikes along a grassy path. + + These graphics are placed in graphics/intro/scene_2 to keep + all of the intro graphics files together, though it includes + the related graphics that are used only by the credits. +*/ + +#define TAG_BICYCLE 1001 +#define TAG_BRENDAN 1002 +#define TAG_MAY 1003 +#define TAG_FLYGON_LATIOS 1004 +#define TAG_FLYGON_LATIAS 1005 + +// Used for the Clouds/Trees/Houses sprites that pass by in the background +#define TAG_MOVING_SCENERY 2000 struct IntroCreditsSpriteMetadata { @@ -18,99 +37,99 @@ struct IntroCreditsSpriteMetadata u16 xOff; }; -static const u16 gUnknown_085F06E0[] = INCBIN_U16("graphics/intro/intro2_grass.gbapal"); -static const u16 gUnknown_085F0700[] = INCBIN_U16("graphics/intro/intro2_grass_afternoon.gbapal"); -static const u16 gUnknown_085F0720[] = INCBIN_U16("graphics/intro/intro2_grass_night.gbapal"); -static const u32 gUnknown_085F0740[] = INCBIN_U32("graphics/intro/intro2_grass.4bpp.lz"); -static const u32 gUnknown_085F0BC0[] = INCBIN_U32("graphics/intro/intro2_grass_map.bin.lz"); -static const u16 gUnknown_085F0CFC[] = INCBIN_U16("graphics/intro/85F0CFC.gbapal"); -static const u16 gUnknown_085F0D5C[] = INCBIN_U16("graphics/intro/85F0D5C.gbapal"); -static const u32 gUnknown_085F0DBC[] = INCBIN_U32("graphics/intro/intro2_bgclouds.4bpp.lz"); -static const u32 gUnknown_085F1398[] = INCBIN_U32("graphics/intro/intro2_bgclouds_map.bin.lz"); -static const u16 gUnknown_085F1668[] = INCBIN_U16("graphics/intro/intro2_bgclouds.gbapal"); -static const u16 gUnknown_085F1688[] = INCBIN_U16("graphics/intro/intro2_bgclouds_afternoon.gbapal"); -static const u32 gUnknown_085F16A8[] = INCBIN_U32("graphics/intro/intro2_bgclouds2.4bpp.lz"); -static const u16 gUnknown_085F17E4[] = INCBIN_U16("graphics/intro/intro2_bgtrees2.gbapal"); -static const u16 gUnknown_085F1804[] = INCBIN_U16("graphics/intro/intro2_bgtrees2_afternoon.gbapal"); -static const u32 gUnknown_085F1824[] = INCBIN_U32("graphics/intro/intro2_bgtrees.4bpp.lz"); -static const u32 gUnknown_085F1EAC[] = INCBIN_U32("graphics/intro/intro2_bgtrees_map.bin.lz"); -static const u16 gUnknown_085F21B0[] = INCBIN_U16("graphics/intro/intro2_bgtrees.gbapal"); -static const u32 gIntro2TreeTiles[] = INCBIN_U32("graphics/intro/intro2_bgtreessmall.4bpp.lz"); -static const u16 gUnknown_085F231C[] = INCBIN_U16("graphics/intro/85F231C.gbapal"); -static const u32 gUnknown_085F235C[] = INCBIN_U32("graphics/intro/intro2_bgnight.4bpp.lz"); -static const u16 gUnknown_085F2548[] = INCBIN_U16("graphics/intro/intro2_bgnight.gbapal"); -static const u32 gUnknown_085F2568[] = INCBIN_U32("graphics/intro/intro2_bgnight_map.bin.lz"); -static const u32 gIntro2NightTiles[] = INCBIN_U32("graphics/intro/intro2_night.4bpp.lz"); -static const u16 gIntro2BrendanPalette[] = INCBIN_U16("graphics/intro/intro2_brendan.gbapal"); -static const u32 gIntro2BrendanTiles[] = INCBIN_U32("graphics/intro/intro2_brendan.4bpp.lz"); -static const u16 gIntro2MayPalette[] = INCBIN_U16("graphics/intro/intro2_may.gbapal"); -static const u16 gUnknown_085F3490[0xF0] = {0}; -static const u32 gIntro2MayTiles[] = INCBIN_U32("graphics/intro/intro2_may.4bpp.lz"); -static const u32 gIntro2BicycleTiles[] = INCBIN_U32("graphics/intro/intro2_bicycle.4bpp.lz"); -static const u16 gIntro2LatiosPalette[] = INCBIN_U16("graphics/intro/intro2_latios.gbapal"); -static const u32 gIntro2LatiosTiles[] = INCBIN_U32("graphics/intro/intro2_latios.4bpp.lz"); -static const u16 gIntro2LatiasPalette[] = INCBIN_U16("graphics/intro/intro2_latias.gbapal"); -static const u32 gIntro2LatiasTiles[] = INCBIN_U32("graphics/intro/intro2_latias.4bpp.lz"); - -static void sub_817B62C(struct Sprite *sprite); -static void nullsub_65(struct Sprite *sprite); -static void sub_817B7C4(struct Sprite *sprite); -static void nullsub_66(struct Sprite *sprite); - -static const struct SpriteTemplate gUnknown_085F504C = -{ - .tileTag = 2000, +static const u16 sGrass_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass.gbapal"); +static const u16 sGrassSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass_sunset.gbapal"); +static const u16 sGrassNight_Pal[] = INCBIN_U16("graphics/intro/scene_2/grass_night.gbapal"); +static const u32 sGrass_Gfx[] = INCBIN_U32("graphics/intro/scene_2/grass.4bpp.lz"); +static const u32 sGrass_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/grass_map.bin.lz"); +static const u16 sCloudsBg_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_bg.gbapal"); +static const u16 sCloudsBgSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_bg_sunset.gbapal"); +static const u32 sCloudsBg_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg.4bpp.lz"); +static const u32 sCloudsBg_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/clouds_bg_map.bin.lz"); +static const u16 sClouds_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds.gbapal"); +static const u16 sCloudsSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/clouds_sunset.gbapal"); +static const u32 sClouds_Gfx[] = INCBIN_U32("graphics/intro/scene_2/clouds.4bpp.lz"); +static const u16 sTrees_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees.gbapal"); +static const u16 sTreesSunset_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees_sunset.gbapal"); +static const u32 sTrees_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees.4bpp.lz"); +static const u32 sTrees_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/trees_map.bin.lz"); +static const u16 sTreesSmall_Pal[] = INCBIN_U16("graphics/intro/scene_2/trees_small.gbapal"); +static const u32 sTreesSmall_Gfx[] = INCBIN_U32("graphics/intro/scene_2/trees_small.4bpp.lz"); +static const u16 sHouses_Pal[] = INCBIN_U16("graphics/intro/scene_2/houses.gbapal"); +static const u32 sHouses_Gfx[] = INCBIN_U32("graphics/intro/scene_2/houses.4bpp.lz"); +static const u16 sHouseSilhouette_Pal[] = INCBIN_U16("graphics/intro/scene_2/house_silhouette.gbapal"); +static const u32 sHouses_Tilemap[] = INCBIN_U32("graphics/intro/scene_2/houses_map.bin.lz"); +static const u32 sHouseSilhouette_Gfx[] = INCBIN_U32("graphics/intro/scene_2/house_silhouette.4bpp.lz"); +static const u16 sBrendanCredits_Pal[] = INCBIN_U16("graphics/intro/scene_2/brendan_credits.gbapal"); +static const u32 sBrendanCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/brendan_credits.4bpp.lz"); +static const u16 sMayCredits_Pal[] = INCBIN_U16("graphics/intro/scene_2/may_credits.gbapal"); +static const u16 sUnused[0xF0] = {0}; +static const u32 sMayCredits_Gfx[] = INCBIN_U32("graphics/intro/scene_2/may_credits.4bpp.lz"); +static const u32 sBicycle_Gfx[] = INCBIN_U32("graphics/intro/scene_2/bicycle.4bpp.lz"); +static const u16 sLatios_Pal[] = INCBIN_U16("graphics/intro/scene_2/latios.gbapal"); +static const u32 sLatios_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latios.4bpp.lz"); +static const u16 sLatias_Pal[] = INCBIN_U16("graphics/intro/scene_2/latias.gbapal"); +static const u32 sLatias_Gfx[] = INCBIN_U32("graphics/intro/scene_2/latias.4bpp.lz"); + +static void SpriteCB_MovingScenery(struct Sprite *sprite); +static void SpriteCB_Player(struct Sprite *sprite); +static void SpriteCB_Bicycle(struct Sprite *sprite); +static void SpriteCB_FlygonLeftHalf(struct Sprite *sprite); + +static const struct SpriteTemplate sSpriteTemplate_MovingScenery = +{ + .tileTag = TAG_MOVING_SCENERY, .paletteTag = 0xFFFF, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817B62C + .callback = SpriteCB_MovingScenery }; -static const struct CompressedSpriteSheet gUnknown_085F5064[] = +static const struct CompressedSpriteSheet sSpriteSheet_Clouds[] = { { - .data = gUnknown_085F16A8, + .data = sClouds_Gfx, .size = 0x400, - .tag = 2000 + .tag = TAG_MOVING_SCENERY }, {} }; -static const union AnimCmd gUnknown_085F5074[] = +static const union AnimCmd sAnim_Cloud_Largest[] = { ANIMCMD_FRAME( 0, 30), ANIMCMD_END }; -static const union AnimCmd gUnknown_085F507C[] = +static const union AnimCmd sAnim_Cloud_Large[] = { ANIMCMD_FRAME(16, 30), ANIMCMD_END }; -static const union AnimCmd gUnknown_085F5084[] = +static const union AnimCmd sAnim_Cloud_Small[] = { ANIMCMD_FRAME(20, 30), ANIMCMD_END }; -static const union AnimCmd gUnknown_085F508C[] = +static const union AnimCmd sAnim_Cloud_Smallest[] = { ANIMCMD_FRAME(22, 30), ANIMCMD_END }; -static const union AnimCmd *const gUnknown_085F5094[] = +static const union AnimCmd *const sAnims_Clouds[] = { - gUnknown_085F5074, - gUnknown_085F507C, - gUnknown_085F5084, - gUnknown_085F508C + sAnim_Cloud_Largest, + sAnim_Cloud_Large, + sAnim_Cloud_Small, + sAnim_Cloud_Smallest }; -static const struct IntroCreditsSpriteMetadata gUnknown_085F50A4[] = +static const struct IntroCreditsSpriteMetadata sSpriteMetadata_Clouds[] = { { .animNum = 0, @@ -195,42 +214,42 @@ static const struct IntroCreditsSpriteMetadata gUnknown_085F50A4[] = }, }; -static const struct CompressedSpriteSheet gUnknown_085F50EC[] = +static const struct CompressedSpriteSheet sSpriteSheet_TreesSmall[] = { { - .data = gIntro2TreeTiles, + .data = sTreesSmall_Gfx, .size = 0x400, - .tag = 2000 + .tag = TAG_MOVING_SCENERY }, {} }; -static const union AnimCmd gUnknown_085F50FC[] = +static const union AnimCmd sAnim_Trees_0[] = { ANIMCMD_FRAME( 0, 30), ANIMCMD_END }; -static const union AnimCmd gUnknown_085F5104[] = +static const union AnimCmd sAnim_Trees_1[] = { ANIMCMD_FRAME(16, 30), ANIMCMD_END }; -static const union AnimCmd gUnknown_085F510C[] = +static const union AnimCmd sAnim_Trees_2[] = { ANIMCMD_FRAME(24, 30), ANIMCMD_END }; -static const union AnimCmd *const gUnknown_085F5114[] = +static const union AnimCmd *const sAnims_Trees[] = { - gUnknown_085F50FC, - gUnknown_085F5104, - gUnknown_085F510C + sAnim_Trees_0, + sAnim_Trees_1, + sAnim_Trees_2 }; -static const struct IntroCreditsSpriteMetadata gUnknown_085F5120[] = +static const struct IntroCreditsSpriteMetadata sSpriteMetadata_Trees[] = { { .animNum = 0, @@ -342,28 +361,28 @@ static const struct IntroCreditsSpriteMetadata gUnknown_085F5120[] = } }; -static const struct CompressedSpriteSheet gUnknown_085F5180[] = +static const struct CompressedSpriteSheet sSpriteSheet_HouseSilhouette[] = { { - .data = gIntro2NightTiles, + .data = sHouseSilhouette_Gfx, .size = 0x400, - .tag = 2000 + .tag = TAG_MOVING_SCENERY }, {} }; -static const union AnimCmd gUnknown_085F5190[] = +static const union AnimCmd sAnim_HouseSilhouette[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END }; -static const union AnimCmd *const gUnknown_085F5198[] = +static const union AnimCmd *const sAnims_HouseSilhouette[] = { - gUnknown_085F5190 + sAnim_HouseSilhouette }; -static const struct IntroCreditsSpriteMetadata gUnknown_085F519C[] = +static const struct IntroCreditsSpriteMetadata sSpriteMetadata_HouseSilhouette[] = { { .animNum = 0, @@ -421,15 +440,15 @@ static const struct IntroCreditsSpriteMetadata gUnknown_085F519C[] = } }; -static const struct OamData gOamData_85F51CC = +static const struct OamData sOamData_Player = { - .y = 160, + .y = DISPLAY_HEIGHT, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 1 }; -static const union AnimCmd gUnknown_085F51D4[] = +static const union AnimCmd sAnim_Player[] = { ANIMCMD_FRAME( 0, 8), ANIMCMD_FRAME( 64, 8), @@ -438,42 +457,42 @@ static const union AnimCmd gUnknown_085F51D4[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const gUnknown_085F51E8[] = +static const union AnimCmd *const sAnims_Player[] = { - gUnknown_085F51D4 + sAnim_Player }; -static const struct SpriteTemplate gUnknown_085F51EC = +static const struct SpriteTemplate sSpriteTemplate_Brendan = { - .tileTag = 1002, - .paletteTag = 1002, - .oam = &gOamData_85F51CC, - .anims = gUnknown_085F51E8, + .tileTag = TAG_BRENDAN, + .paletteTag = TAG_BRENDAN, + .oam = &sOamData_Player, + .anims = sAnims_Player, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_65 + .callback = SpriteCB_Player }; -static const struct SpriteTemplate gUnknown_085F5204 = +static const struct SpriteTemplate sSpriteTemplate_May = { - .tileTag = 1003, - .paletteTag = 1003, - .oam = &gOamData_85F51CC, - .anims = gUnknown_085F51E8, + .tileTag = TAG_MAY, + .paletteTag = TAG_MAY, + .oam = &sOamData_Player, + .anims = sAnims_Player, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_65 + .callback = SpriteCB_Player }; -static const struct OamData gUnknown_085F521C = +static const struct OamData sOamData_Bicycle = { - .y = 160, + .y = DISPLAY_HEIGHT, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; -static const union AnimCmd gUnknown_085F5224[] = +static const union AnimCmd sAnim_Bicycle[] = { ANIMCMD_FRAME( 0, 8), ANIMCMD_FRAME( 32, 8), @@ -482,261 +501,267 @@ static const union AnimCmd gUnknown_085F5224[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const gUnknown_085F5238[] = +static const union AnimCmd *const sAnims_Bicycle[] = { - gUnknown_085F5224 + sAnim_Bicycle }; -static const struct SpriteTemplate gUnknown_085F523C = +static const struct SpriteTemplate sSpriteTemplate_BrendanBicycle = { - .tileTag = 1001, - .paletteTag = 1002, - .oam = &gUnknown_085F521C, - .anims = gUnknown_085F5238, + .tileTag = TAG_BICYCLE, + .paletteTag = TAG_BRENDAN, + .oam = &sOamData_Bicycle, + .anims = sAnims_Bicycle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817B7C4 + .callback = SpriteCB_Bicycle }; -static const struct SpriteTemplate gUnknown_085F5254 = +static const struct SpriteTemplate sSpriteTemplate_MayBicycle = { - .tileTag = 1001, - .paletteTag = 1003, - .oam = &gUnknown_085F521C, - .anims = gUnknown_085F5238, + .tileTag = TAG_BICYCLE, + .paletteTag = TAG_MAY, + .oam = &sOamData_Bicycle, + .anims = sAnims_Bicycle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_817B7C4 + .callback = SpriteCB_Bicycle }; -static const struct OamData gUnknown_085F526C = +static const struct OamData sOamData_Flygon = { - .y = 160, + .y = DISPLAY_HEIGHT, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 1 }; -static const union AnimCmd gUnknown_085F5274[] = +static const union AnimCmd sAnim_FlygonLeft[] = { - ANIMCMD_FRAME( 0, 16), + ANIMCMD_FRAME(0, 16), ANIMCMD_END }; -static const union AnimCmd gUnknown_085F527C[] = +static const union AnimCmd sAnim_FlygonRight[] = { - ANIMCMD_FRAME( 64, 16), + ANIMCMD_FRAME(64, 16), ANIMCMD_END }; -static const union AnimCmd *const gUnknown_085F5284[] = +static const union AnimCmd *const sAnims_Flygon[] = { - gUnknown_085F5274, - gUnknown_085F527C + sAnim_FlygonLeft, + sAnim_FlygonRight }; -static const struct SpriteTemplate gUnknown_085F528C = +static const struct SpriteTemplate sSpriteTemplate_FlygonLatios = { - .tileTag = 1004, - .paletteTag = 1004, - .oam = &gUnknown_085F526C, - .anims = gUnknown_085F5284, + .tileTag = TAG_FLYGON_LATIOS, + .paletteTag = TAG_FLYGON_LATIOS, + .oam = &sOamData_Flygon, + .anims = sAnims_Flygon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_66 + .callback = SpriteCB_FlygonLeftHalf }; -static const struct SpriteTemplate gUnknown_085F52A4 = +static const struct SpriteTemplate sSpriteTemplate_FlygonLatias = { - .tileTag = 1005, - .paletteTag = 1005, - .oam = &gUnknown_085F526C, - .anims = gUnknown_085F5284, + .tileTag = TAG_FLYGON_LATIAS, + .paletteTag = TAG_FLYGON_LATIAS, + .oam = &sOamData_Flygon, + .anims = sAnims_Flygon, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = nullsub_66 + .callback = SpriteCB_FlygonLeftHalf }; -const struct CompressedSpriteSheet gIntro2BrendanSpriteSheet[] = +const struct CompressedSpriteSheet gSpriteSheet_IntroBrendan[] = { { - .data = gIntro2BrendanNoTurnGfx, + .data = gIntroBrendan_Gfx, .size = 0x2000, - .tag = 1002 + .tag = TAG_BRENDAN }, {} }; -const struct CompressedSpriteSheet gIntro2MaySpriteSheet[] = +const struct CompressedSpriteSheet gSpriteSheet_IntroMay[] = { { - .data = gIntro2MayNoTurnGfx, + .data = gIntroMay_Gfx, .size = 0x2000, - .tag = 1003 + .tag = TAG_MAY }, {} }; -const struct CompressedSpriteSheet gIntro2BicycleSpriteSheet[] = +const struct CompressedSpriteSheet gSpriteSheet_IntroBicycle[] = { { - .data = gIntro2BicycleTiles, + .data = sBicycle_Gfx, .size = 0x1000, - .tag = 1001 + .tag = TAG_BICYCLE }, {} }; -static const struct CompressedSpriteSheet gUnknown_085F52EC[] = +// In RS these were Latios/Latias. In Emerald both are replaced with Flygon and now only 1 is used +static const struct CompressedSpriteSheet sSpriteSheet_IntroFlygon_Unused[] = { { - .data = gIntro2FlygonGfx, + .data = gIntroFlygon_Gfx, .size = 0x1000, - .tag = 1004 + .tag = TAG_FLYGON_LATIOS }, {} }; -const struct CompressedSpriteSheet gIntro2FlygonSpriteSheet[] = +const struct CompressedSpriteSheet gSpriteSheet_IntroFlygon[] = { { - .data = gIntro2FlygonGfx, + .data = gIntroFlygon_Gfx, .size = 0x1000, - .tag = 1005 + .tag = TAG_FLYGON_LATIAS }, {} }; -const struct SpritePalette gIntroBikeAndFlygonPalette[] = +const struct SpritePalette gSpritePalettes_IntroPlayerFlygon[] = { - { .data = gIntro2BrendanNoTurnPal, .tag = 1002 }, - { .data = gIntro2BrendanNoTurnPal, .tag = 1003 }, - { .data = gIntro2FlygonPal, .tag = 1004 }, - { .data = gIntro2FlygonPal, .tag = 1005 }, + { .data = gIntroPlayer_Pal, .tag = TAG_BRENDAN }, + { .data = gIntroPlayer_Pal, .tag = TAG_MAY }, + { .data = gIntroFlygon_Pal, .tag = TAG_FLYGON_LATIOS }, + { .data = gIntroFlygon_Pal, .tag = TAG_FLYGON_LATIAS }, {} }; -const struct CompressedSpriteSheet gUnknown_085F5334[] = +const struct CompressedSpriteSheet gSpriteSheet_CreditsBrendan[] = { { - .data = gIntro2BrendanTiles, + .data = sBrendanCredits_Gfx, .size = 0x3800, - .tag = 1002 + .tag = TAG_BRENDAN }, {} }; -const struct CompressedSpriteSheet gUnknown_085F5344[] = +const struct CompressedSpriteSheet gSpriteSheet_CreditsMay[] = { { - .data = gIntro2MayTiles, + .data = sMayCredits_Gfx, .size = 0x3800, - .tag = 1003 + .tag = TAG_MAY }, {} }; -const struct CompressedSpriteSheet gUnknown_085F5354[] = +const struct CompressedSpriteSheet gSpriteSheet_CreditsBicycle[] = { { - .data = gIntro2BicycleTiles, + .data = sBicycle_Gfx, .size = 0x1000, - .tag = 1001 + .tag = TAG_BICYCLE }, {} }; -static const struct CompressedSpriteSheet gUnknown_085F5364[] = +// Unused +static const struct CompressedSpriteSheet sSpriteSheet_Latios[] = { { - .data = gIntro2LatiosTiles, + .data = sLatios_Gfx, .size = 0x1000, - .tag = 1004 + .tag = TAG_FLYGON_LATIOS }, {} }; -static const struct CompressedSpriteSheet gUnknown_085F5374[] = +// Unused +static const struct CompressedSpriteSheet sSpriteSheet_Latias[] = { { - .data = gIntro2LatiasTiles, + .data = sLatias_Gfx, .size = 0x1000, - .tag = 1005 + .tag = TAG_FLYGON_LATIAS }, {} }; -const struct SpritePalette gUnknown_085F5384[] = +const struct SpritePalette gSpritePalettes_Credits[] = { - { .data = gIntro2BrendanPalette, .tag = 1002 }, - { .data = gIntro2MayPalette, .tag = 1003 }, - { .data = gIntro2LatiosPalette, .tag = 1004 }, - { .data = gIntro2LatiasPalette, .tag = 1005 }, + { .data = sBrendanCredits_Pal, .tag = TAG_BRENDAN }, + { .data = sMayCredits_Pal, .tag = TAG_MAY }, + { .data = sLatios_Pal, .tag = TAG_FLYGON_LATIOS }, + { .data = sLatias_Pal, .tag = TAG_FLYGON_LATIAS }, {} }; -const struct CompressedSpriteSheet gUnknown_085F53AC[] = +const struct CompressedSpriteSheet gSpriteSheet_CreditsRivalBrendan[] = { { - .data = gIntro2BrendanTiles, + .data = sBrendanCredits_Gfx, .size = 0x2000, - .tag = 1002 + .tag = TAG_BRENDAN }, {} }; -const struct CompressedSpriteSheet gUnknown_085F53BC[] = +const struct CompressedSpriteSheet gSpriteSheet_CreditsRivalMay[] = { { - .data = gIntro2MayTiles, + .data = sMayCredits_Gfx, .size = 0x2000, - .tag = 1003 + .tag = TAG_MAY }, {} }; -EWRAM_DATA u16 gUnknown_0203BD24 = 0; -EWRAM_DATA s16 gUnknown_0203BD26 = 0; -EWRAM_DATA s16 gUnknown_0203BD28 = 0; +EWRAM_DATA u16 gIntroCredits_MovingSceneryVBase = 0; +EWRAM_DATA s16 gIntroCredits_MovingSceneryVOffset = 0; +EWRAM_DATA s16 gIntroCredits_MovingSceneryState = 0; -static void sub_817B76C(void); -static void sub_817B788(void); -static void sub_817B7A4(void); -static void sub_817B458(u8); +static void CreateCloudSprites(void); +static void CreateTreeSprites(void); +static void CreateHouseSprites(void); +static void Task_BicycleBgAnimation(u8); -void load_intro_part2_graphics(u8 a) +void LoadIntroPart2Graphics(u8 scenery) { - LZ77UnCompVram(gUnknown_085F0740, (void *)(BG_CHAR_ADDR(1))); - LZ77UnCompVram(gUnknown_085F0BC0, (void *)(BG_SCREEN_ADDR(15))); - LoadPalette(&gUnknown_085F06E0, 240, 32); - switch (a) + LZ77UnCompVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); + LZ77UnCompVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); + LoadPalette(&sGrass_Pal, 240, sizeof(sGrass_Pal)); + switch (scenery) { case 0: default: - LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_085F1398, (void *)(BG_SCREEN_ADDR(6))); - LoadPalette(&gUnknown_085F0CFC, 0, 96); - LoadCompressedSpriteSheet(gUnknown_085F5064); - LoadPalette(&gUnknown_085F1668, 256, 32); - sub_817B76C(); + // Never reached, only called with an argument of 1 + // Clouds are never used in this part of the intro + LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); + LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + LoadPalette(&sCloudsBg_Pal, 0, sizeof(sCloudsBg_Pal)); + LoadCompressedSpriteSheet(sSpriteSheet_Clouds); + LoadPalette(&sClouds_Pal, 256, sizeof(sClouds_Pal)); + CreateCloudSprites(); break; case 1: - LZ77UnCompVram(gUnknown_085F1824, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_085F1EAC, (void *)(BG_SCREEN_ADDR(6))); - LoadPalette(&gUnknown_085F17E4, 0, 32); - LoadCompressedSpriteSheet(gUnknown_085F50EC); - LoadPalette(&gUnknown_085F21B0, 256, 32); - sub_817B788(); + LZ77UnCompVram(sTrees_Gfx, (void *)(VRAM)); + LZ77UnCompVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + LoadPalette(&sTrees_Pal, 0, sizeof(sTrees_Pal)); + LoadCompressedSpriteSheet(sSpriteSheet_TreesSmall); + LoadPalette(&sTreesSmall_Pal, 256, sizeof(sTreesSmall_Pal)); + CreateTreeSprites(); break; } - gUnknown_0203BD28 = 0; + gIntroCredits_MovingSceneryState = INTROCRED_SCENERY_NORMAL; gReservedSpritePaletteCount = 8; } // Note: This is only called with a=1. -void sub_817B150(u8 a) +void SetIntroPart2BgCnt(u8 scenery) { - switch (a) + // Only called with scenery = 1 + switch (scenery) { default: case 0: @@ -811,58 +836,58 @@ void sub_817B150(u8 a) } } -void sub_817B1C8(u8 a) +void LoadCreditsSceneGraphics(u8 scene) { - LZ77UnCompVram(gUnknown_085F0740, (void *)(BG_CHAR_ADDR(1))); - LZ77UnCompVram(gUnknown_085F0BC0, (void *)(BG_SCREEN_ADDR(15))); - switch (a) + LZ77UnCompVram(sGrass_Gfx, (void *)(BG_CHAR_ADDR(1))); + LZ77UnCompVram(sGrass_Tilemap, (void *)(BG_SCREEN_ADDR(15))); + switch (scene) { - case 0: + case SCENE_OCEAN_MORNING: default: - LoadPalette(&gUnknown_085F06E0, 240, 32); - LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_085F1398, (void *)(BG_SCREEN_ADDR(6))); - LoadPalette(&gUnknown_085F0CFC, 0, 96); - LoadCompressedSpriteSheet(gUnknown_085F5064); - LZ77UnCompVram(gUnknown_085F16A8, (void *)(OBJ_VRAM0)); - LoadPalette(&gUnknown_085F1668, 256, 32); - sub_817B76C(); + LoadPalette(&sGrass_Pal, 240, sizeof(sGrass_Pal)); + LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); + LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + LoadPalette(&sCloudsBg_Pal, 0, sizeof(sCloudsBg_Pal)); + LoadCompressedSpriteSheet(sSpriteSheet_Clouds); + LZ77UnCompVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); + LoadPalette(&sClouds_Pal, 256, sizeof(sClouds_Pal)); + CreateCloudSprites(); break; - case 1: - LoadPalette(&gUnknown_085F0700, 240, 32); - LZ77UnCompVram(gUnknown_085F0DBC, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_085F1398, (void *)(BG_SCREEN_ADDR(6))); - LoadPalette(&gUnknown_085F0D5C, 0, 96); - LoadCompressedSpriteSheet(gUnknown_085F5064); - LZ77UnCompVram(gUnknown_085F16A8, (void *)(OBJ_VRAM0)); - LoadPalette(&gUnknown_085F1688, 256, 32); - sub_817B76C(); + case SCENE_OCEAN_SUNSET: + LoadPalette(&sGrassSunset_Pal, 240, sizeof(sGrassSunset_Pal)); + LZ77UnCompVram(sCloudsBg_Gfx, (void *)(VRAM)); + LZ77UnCompVram(sCloudsBg_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + LoadPalette(&sCloudsBgSunset_Pal, 0, sizeof(sCloudsBgSunset_Pal)); + LoadCompressedSpriteSheet(sSpriteSheet_Clouds); + LZ77UnCompVram(sClouds_Gfx, (void *)(OBJ_VRAM0)); + LoadPalette(&sCloudsSunset_Pal, 256, sizeof(sCloudsSunset_Pal)); + CreateCloudSprites(); break; - case 2: - case 3: - LoadPalette(&gUnknown_085F0700, 240, 32); - LZ77UnCompVram(gUnknown_085F1824, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_085F1EAC, (void *)(BG_SCREEN_ADDR(6))); - LoadPalette(&gUnknown_085F1804, 0, 32); - LoadCompressedSpriteSheet(gUnknown_085F50EC); - LoadPalette(&gUnknown_085F1804, 256, 32); - sub_817B788(); + case SCENE_FOREST_RIVAL_ARRIVE: + case SCENE_FOREST_CATCH_RIVAL: + LoadPalette(&sGrassSunset_Pal, 240, sizeof(sGrassSunset_Pal)); + LZ77UnCompVram(sTrees_Gfx, (void *)(VRAM)); + LZ77UnCompVram(sTrees_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + LoadPalette(&sTreesSunset_Pal, 0, sizeof(sTreesSunset_Pal)); + LoadCompressedSpriteSheet(sSpriteSheet_TreesSmall); + LoadPalette(&sTreesSunset_Pal, 256, sizeof(sTreesSunset_Pal)); + CreateTreeSprites(); break; - case 4: - LoadPalette(&gUnknown_085F0720, 240, 32); - LZ77UnCompVram(gUnknown_085F235C, (void *)(VRAM)); - LZ77UnCompVram(gUnknown_085F2568, (void *)(BG_SCREEN_ADDR(6))); - LoadPalette(&gUnknown_085F231C, 0, 64); - LoadCompressedSpriteSheet(gUnknown_085F5180); - LoadPalette(&gUnknown_085F2548, 256, 32); - sub_817B7A4(); + case SCENE_CITY_NIGHT: + LoadPalette(&sGrassNight_Pal, 240, sizeof(sGrassNight_Pal)); + LZ77UnCompVram(sHouses_Gfx, (void *)(VRAM)); + LZ77UnCompVram(sHouses_Tilemap, (void *)(BG_SCREEN_ADDR(6))); + LoadPalette(&sHouses_Pal, 0, sizeof(sHouses_Pal)); + LoadCompressedSpriteSheet(sSpriteSheet_HouseSilhouette); + LoadPalette(&sHouseSilhouette_Pal, 256, sizeof(sHouseSilhouette_Pal)); + CreateHouseSprites(); break; } gReservedSpritePaletteCount = 8; - gUnknown_0203BD28 = 0; + gIntroCredits_MovingSceneryState = INTROCRED_SCENERY_NORMAL; } -void sub_817B3A8(u8 a) +void SetCreditsSceneBgCnt(u8 scene) { SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(0) @@ -885,69 +910,84 @@ void sub_817B3A8(u8 a) | DISPCNT_OBJ_ON); } -u8 CreateBicycleAnimationTask(u8 a, u16 b, u16 c, u16 d) -{ - u8 taskId = CreateTask(&sub_817B458, 0); - - gTasks[taskId].data[0] = a; - gTasks[taskId].data[1] = b; - gTasks[taskId].data[2] = 0; - gTasks[taskId].data[3] = 0; - gTasks[taskId].data[4] = c; - gTasks[taskId].data[5] = 0; - gTasks[taskId].data[6] = 0; - gTasks[taskId].data[7] = d; - gTasks[taskId].data[8] = 8; - gTasks[taskId].data[9] = 0; - sub_817B458(taskId); +#define tMode data[0] // Can be 0-2, but only != 0 matters. Determines vertical movement for bg2 +#define tBg1Speed data[1] +#define tBg1PosHi data[2] +#define tBg1PosLo data[3] +#define tBg2Speed data[4] +#define tBg2PosHi data[5] +#define tBg2PosLo data[6] +#define tBg3Speed data[7] +#define tBg3PosHi data[8] +#define tBg3PosLo data[9] + +// Create task that manages the moving backgrounds during the bicycle ride +u8 CreateBicycleBgAnimationTask(u8 mode, u16 bg1Speed, u16 bg2Speed, u16 bg3Speed) +{ + u8 taskId = CreateTask(Task_BicycleBgAnimation, 0); + + gTasks[taskId].tMode = mode; + gTasks[taskId].tBg1Speed = bg1Speed; + gTasks[taskId].tBg1PosHi = 0; + gTasks[taskId].tBg1PosLo = 0; + gTasks[taskId].tBg2Speed = bg2Speed; + gTasks[taskId].tBg2PosHi = 0; + gTasks[taskId].tBg2PosLo = 0; + gTasks[taskId].tBg3Speed = bg3Speed; + gTasks[taskId].tBg3PosHi = 8; + gTasks[taskId].tBg3PosLo = 0; + Task_BicycleBgAnimation(taskId); return taskId; } -static void sub_817B458(u8 taskId) +static void Task_BicycleBgAnimation(u8 taskId) { - s16 data1; - s16 data4; - s16 data7; - s32 r2; + s16 bg1Speed; + s16 bg2Speed; + s16 bg3Speed; + s32 offset; - data1 = gTasks[taskId].data[1]; - if (data1 != 0) + // Move BG1 + bg1Speed = gTasks[taskId].tBg1Speed; + if (bg1Speed != 0) { - r2 = (gTasks[taskId].data[2] << 16) + (u16)gTasks[taskId].data[3]; - r2 -= (u16)data1 << 4; - gTasks[taskId].data[2] = r2 >> 16; - gTasks[taskId].data[3] = r2; - SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].data[2]); - SetGpuReg(REG_OFFSET_BG1VOFS, gUnknown_0203BD24 + gUnknown_0203BD26); + offset = (gTasks[taskId].tBg1PosHi << 16) + (u16)gTasks[taskId].tBg1PosLo; + offset -= (u16)bg1Speed << 4; + gTasks[taskId].tBg1PosHi = offset >> 16; + gTasks[taskId].tBg1PosLo = offset; + SetGpuReg(REG_OFFSET_BG1HOFS, gTasks[taskId].tBg1PosHi); + SetGpuReg(REG_OFFSET_BG1VOFS, gIntroCredits_MovingSceneryVBase + gIntroCredits_MovingSceneryVOffset); } - data4 = gTasks[taskId].data[4]; - if (data4 != 0) + // Move BG2 + bg2Speed = gTasks[taskId].tBg2Speed; + if (bg2Speed != 0) { - r2 = (gTasks[taskId].data[5] << 16) + (u16)gTasks[taskId].data[6]; - r2 -= (u16)data4 << 4; - gTasks[taskId].data[5] = r2 >> 16; - gTasks[taskId].data[6] = r2; - SetGpuReg(REG_OFFSET_BG2HOFS, gTasks[taskId].data[5]); - if (gTasks[taskId].data[0] != 0) - SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_0203BD24 + gUnknown_0203BD26); + offset = (gTasks[taskId].tBg2PosHi << 16) + (u16)gTasks[taskId].tBg2PosLo; + offset -= (u16)bg2Speed << 4; + gTasks[taskId].tBg2PosHi = offset >> 16; + gTasks[taskId].tBg2PosLo = offset; + SetGpuReg(REG_OFFSET_BG2HOFS, gTasks[taskId].tBg2PosHi); + if (gTasks[taskId].tMode != 0) + SetGpuReg(REG_OFFSET_BG2VOFS, gIntroCredits_MovingSceneryVBase + gIntroCredits_MovingSceneryVOffset); else - SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_0203BD24); + SetGpuReg(REG_OFFSET_BG2VOFS, gIntroCredits_MovingSceneryVBase); } - data7 = gTasks[taskId].data[7]; - if (data7 != 0) + // Move BG3 + bg3Speed = gTasks[taskId].tBg3Speed; + if (bg3Speed != 0) { - r2 = (gTasks[taskId].data[8] << 16) + (u16)gTasks[taskId].data[9]; - r2 -= (u16)data7 << 4; - gTasks[taskId].data[8] = r2 >> 16; - gTasks[taskId].data[9] = r2; - SetGpuReg(REG_OFFSET_BG3HOFS, gTasks[taskId].data[8]); - SetGpuReg(REG_OFFSET_BG3VOFS, gUnknown_0203BD24); + offset = (gTasks[taskId].tBg3PosHi << 16) + (u16)gTasks[taskId].tBg3PosLo; + offset -= (u16)bg3Speed << 4; + gTasks[taskId].tBg3PosHi = offset >> 16; + gTasks[taskId].tBg3PosLo = offset; + SetGpuReg(REG_OFFSET_BG3HOFS, gTasks[taskId].tBg3PosHi); + SetGpuReg(REG_OFFSET_BG3VOFS, gIntroCredits_MovingSceneryVBase); } } -void sub_817B540(u8 mode) +void CycleSceneryPalette(u8 mode) { u16 x; u16 y; @@ -955,7 +995,6 @@ void sub_817B540(u8 mode) { case 0: default: - /* stuff */ if (gMain.vblankCounter1 & 3 || gPaletteFade.active) break; if (gMain.vblankCounter1 & 4) @@ -968,149 +1007,167 @@ void sub_817B540(u8 mode) x = gPlttBufferUnfaded[10]; y = gPlttBufferUnfaded[9]; } - LoadPalette(&x, 9, 2); - LoadPalette(&y, 10, 2); + LoadPalette(&x, 9, sizeof(x)); + LoadPalette(&y, 10, sizeof(y)); break; case 2: if (gMain.vblankCounter1 & 3 || gPaletteFade.active) break; if (gMain.vblankCounter1 & 4) { - x = 0x3D27; - y = 0x295; + x = RGB(7, 9, 15); + y = RGB(21, 20, 0); } else { - x = 0x31C; - y = 0x3D27; + x = RGB(28, 24, 0); + y = RGB(7, 9, 15); } - LoadPalette(&x, 12, 2); - LoadPalette(&y, 13, 2); + LoadPalette(&x, 12, sizeof(x)); + LoadPalette(&y, 13, sizeof(y)); break; case 1: break; } } -static void sub_817B62C(struct Sprite *sprite) +#define tHasVerticalMove data[0] +#define tXOffset data[1] +#define tXPos data[2] + +static void SpriteCB_MovingScenery(struct Sprite *sprite) { - s32 var; - s16 var2 = gUnknown_0203BD28; + s32 x; + s16 state = gIntroCredits_MovingSceneryState; - if (var2 != 2) + if (state != INTROCRED_SCENERY_FROZEN) { - switch (var2) + switch (state) { - default: + default: // INTROCRED_SCENERY_DESTROY DestroySprite(sprite); break; - case 0: - var = ((sprite->pos1.x << 16) | (u16)sprite->data[2]) + (u16)sprite->data[1]; - sprite->pos1.x = var >> 16; - sprite->data[2] = var; - if (sprite->pos1.x > 0xFF) - sprite->pos1.x = -0x20; - if (sprite->data[0]) - sprite->pos2.y = -(gUnknown_0203BD24 + gUnknown_0203BD26); + case INTROCRED_SCENERY_NORMAL: + x = ((sprite->pos1.x << 16) | (u16)sprite->tXPos) + (u16)sprite->tXOffset; + sprite->pos1.x = x >> 16; + sprite->tXPos = x; + if (sprite->pos1.x > 255) + sprite->pos1.x = -32; + if (sprite->tHasVerticalMove) + sprite->pos2.y = -(gIntroCredits_MovingSceneryVBase + gIntroCredits_MovingSceneryVOffset); else - sprite->pos2.y = -gUnknown_0203BD24; + sprite->pos2.y = -gIntroCredits_MovingSceneryVBase; break; } } } -static void sub_817B698(u8 a, const struct IntroCreditsSpriteMetadata *b, const union AnimCmd *const *c, u8 d) +static void CreateMovingScenerySprites(bool8 hasVerticalMove, const struct IntroCreditsSpriteMetadata *metadata, const union AnimCmd *const *anims, u8 numSprites) { u8 i; - for(i = 0; i < d; i++) + for(i = 0; i < numSprites; i++) { - u8 sprite = CreateSprite(&gUnknown_085F504C, b[i].x, b[i].y, b[i].subpriority); - CalcCenterToCornerVec(&gSprites[sprite], b[i].shape, b[i].size, ST_OAM_AFFINE_OFF); + u8 sprite = CreateSprite(&sSpriteTemplate_MovingScenery, metadata[i].x, metadata[i].y, metadata[i].subpriority); + CalcCenterToCornerVec(&gSprites[sprite], metadata[i].shape, metadata[i].size, ST_OAM_AFFINE_OFF); gSprites[sprite].oam.priority = 3; - gSprites[sprite].oam.shape = b[i].shape; - gSprites[sprite].oam.size = b[i].size; + gSprites[sprite].oam.shape = metadata[i].shape; + gSprites[sprite].oam.size = metadata[i].size; gSprites[sprite].oam.paletteNum = 0; - gSprites[sprite].anims = c; - StartSpriteAnim(&gSprites[sprite], b[i].animNum); - gSprites[sprite].data[0] = a; - gSprites[sprite].data[1] = b[i].xOff; - gSprites[sprite].data[2] = 0; + gSprites[sprite].anims = anims; + StartSpriteAnim(&gSprites[sprite], metadata[i].animNum); + gSprites[sprite].tHasVerticalMove = hasVerticalMove; + gSprites[sprite].tXOffset = metadata[i].xOff; + gSprites[sprite].tXPos = 0; } } -static void sub_817B76C(void) +#undef tHasVerticalMove +#undef tXOffset +#undef tXPos + +static void CreateCloudSprites(void) { - sub_817B698(0, gUnknown_085F50A4, gUnknown_085F5094, 9); + CreateMovingScenerySprites(FALSE, sSpriteMetadata_Clouds, sAnims_Clouds, 9); } -static void sub_817B788(void) +static void CreateTreeSprites(void) { - sub_817B698(1, gUnknown_085F5120, gUnknown_085F5114, 12); + CreateMovingScenerySprites(TRUE, sSpriteMetadata_Trees, sAnims_Trees, 12); } -static void sub_817B7A4(void) +static void CreateHouseSprites(void) { - sub_817B698(1, gUnknown_085F519C, gUnknown_085F5198, 6); + CreateMovingScenerySprites(TRUE, sSpriteMetadata_HouseSilhouette, sAnims_HouseSilhouette, 6); } -static void nullsub_65(struct Sprite *sprite) +static void SpriteCB_Player(struct Sprite *sprite) { } -static void sub_817B7C4(struct Sprite* sprite) +#define sPlayerSpriteId data[0] + +static void SpriteCB_Bicycle(struct Sprite* sprite) { - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->pos1.x = gSprites[sprite->data[0]].pos1.x; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + 8; - sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; - sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; + sprite->invisible = gSprites[sprite->sPlayerSpriteId].invisible; + sprite->pos1.x = gSprites[sprite->sPlayerSpriteId].pos1.x; + sprite->pos1.y = gSprites[sprite->sPlayerSpriteId].pos1.y + 8; + sprite->pos2.x = gSprites[sprite->sPlayerSpriteId].pos2.x; + sprite->pos2.y = gSprites[sprite->sPlayerSpriteId].pos2.y; } -u8 intro_create_brendan_sprite(s16 a, s16 b) +u8 CreateIntroBrendanSprite(s16 x, s16 y) { - u8 sprite = CreateSprite(&gUnknown_085F51EC, a, b, 2); - u8 brendan = CreateSprite(&gUnknown_085F523C, a, b + 8, 3); - gSprites[brendan].data[0] = sprite; - return sprite; + u8 playerSpriteId = CreateSprite(&sSpriteTemplate_Brendan, x, y, 2); + u8 bicycleSpriteId = CreateSprite(&sSpriteTemplate_BrendanBicycle, x, y + 8, 3); + gSprites[bicycleSpriteId].sPlayerSpriteId = playerSpriteId; + return playerSpriteId; } -u8 intro_create_may_sprite(s16 a, s16 b) +u8 CreateIntroMaySprite(s16 x, s16 y) { - u8 sprite = CreateSprite(&gUnknown_085F5204, a, b, 2); - u8 may = CreateSprite(&gUnknown_085F5254, a, b + 8, 3); - gSprites[may].data[0] = sprite; - return sprite; + u8 playerSpriteId = CreateSprite(&sSpriteTemplate_May, x, y, 2); + u8 bicycleSpriteId = CreateSprite(&sSpriteTemplate_MayBicycle, x, y + 8, 3); + gSprites[bicycleSpriteId].sPlayerSpriteId = playerSpriteId; + return playerSpriteId; } -static void nullsub_66(struct Sprite *sprite) +#undef sPlayerSpriteId + +static void SpriteCB_FlygonLeftHalf(struct Sprite *sprite) { } -static void sub_817B8E8(struct Sprite* sprite) +#define sLeftSpriteId data[0] + +static void SpriteCB_FlygonRightHalf(struct Sprite* sprite) { - sprite->invisible = gSprites[sprite->data[0]].invisible; - sprite->pos1.y = gSprites[sprite->data[0]].pos1.y; - sprite->pos2.x = gSprites[sprite->data[0]].pos2.x; - sprite->pos2.y = gSprites[sprite->data[0]].pos2.y; + sprite->invisible = gSprites[sprite->sLeftSpriteId].invisible; + sprite->pos1.y = gSprites[sprite->sLeftSpriteId].pos1.y; + sprite->pos2.x = gSprites[sprite->sLeftSpriteId].pos2.x; + sprite->pos2.y = gSprites[sprite->sLeftSpriteId].pos2.y; } -static u8 sub_817B948(s16 a, s16 b) +// In RS these were for Latios/Latias. In Emerald both are replaced with Flygon and now only 1 is used +static u8 CreateIntroFlygonSprite_Unused(s16 x, s16 y) { - u8 sprite = CreateSprite(&gUnknown_085F528C, a - 32, b, 5); - u8 latios = CreateSprite(&gUnknown_085F528C, a + 32, b, 6); - gSprites[latios].data[0] = sprite; - StartSpriteAnim(&gSprites[latios], 1); - gSprites[latios].callback = &sub_817B8E8; - return sprite; + u8 leftSpriteId = CreateSprite(&sSpriteTemplate_FlygonLatios, x - 32, y, 5); + u8 rightSpriteId = CreateSprite(&sSpriteTemplate_FlygonLatios, x + 32, y, 6); + gSprites[rightSpriteId].sLeftSpriteId = leftSpriteId; + StartSpriteAnim(&gSprites[rightSpriteId], 1); + gSprites[rightSpriteId].callback = &SpriteCB_FlygonRightHalf; + return leftSpriteId; } -u8 intro_create_flygon_sprite(s16 a, s16 b) + +u8 CreateIntroFlygonSprite(s16 x, s16 y) { - u8 sprite = CreateSprite(&gUnknown_085F52A4, a - 32, b, 5); - u8 flygon = CreateSprite(&gUnknown_085F52A4, a + 32, b, 6); - gSprites[flygon].data[0] = sprite; - StartSpriteAnim(&gSprites[flygon], 1); - gSprites[flygon].callback = &sub_817B8E8; - return sprite; + u8 leftSpriteId = CreateSprite(&sSpriteTemplate_FlygonLatias, x - 32, y, 5); + u8 rightSpriteId = CreateSprite(&sSpriteTemplate_FlygonLatias, x + 32, y, 6); + gSprites[rightSpriteId].sLeftSpriteId = leftSpriteId; + StartSpriteAnim(&gSprites[rightSpriteId], 1); + gSprites[rightSpriteId].callback = &SpriteCB_FlygonRightHalf; + return leftSpriteId; } + +#undef sLeftSpriteId diff --git a/src/item.c b/src/item.c index 0b6366048..156034262 100644 --- a/src/item.c +++ b/src/item.c @@ -14,14 +14,10 @@ #include "battle_pyramid_bag.h" #include "constants/items.h" #include "constants/hold_effects.h" -#include "constants/tv.h" extern u16 gUnknown_0203CF30[]; // this file's functions -#if !defined(NONMATCHING) && MODERN -#define static -#endif static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count); static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count); @@ -102,8 +98,8 @@ void CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) } else { - if (itemId >= ITEM_CHERI_BERRY && itemId <= ITEM_ENIGMA_BERRY) - GetBerryCountString(dst, gBerries[itemId - ITEM_CHERI_BERRY].name, quantity); + if (itemId >= FIRST_BERRY_INDEX && itemId <= LAST_BERRY_INDEX) + GetBerryCountString(dst, gBerries[itemId - FIRST_BERRY_INDEX].name, quantity); else StringCopy(dst, ItemId_GetName(itemId)); } @@ -284,10 +280,6 @@ bool8 AddBagItem(u16 itemId, u16 count) { // successfully added to already existing item's count SetBagItemQuantity(&newItems[i].quantity, ownedCount + count); - - // goto SUCCESS_ADD_ITEM; - // is equivalent but won't match - memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); Free(newItems); return TRUE; @@ -307,7 +299,7 @@ bool8 AddBagItem(u16 itemId, u16 count) // don't create another instance of the item if it's at max slot capacity and count is equal to 0 if (count == 0) { - goto SUCCESS_ADD_ITEM; + break; } } } @@ -338,7 +330,8 @@ bool8 AddBagItem(u16 itemId, u16 count) { // created a new slot and added quantity SetBagItemQuantity(&newItems[i].quantity, count); - goto SUCCESS_ADD_ITEM; + count = 0; + break; } } } @@ -349,11 +342,9 @@ bool8 AddBagItem(u16 itemId, u16 count) return FALSE; } } - - SUCCESS_ADD_ITEM: - memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); - Free(newItems); - return TRUE; + memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); + Free(newItems); + return TRUE; } } @@ -557,7 +548,6 @@ bool8 AddPCItem(u16 itemId, u16 count) void RemovePCItem(u8 index, u16 count) { - // UB: should use GetPCItemQuantity and SetPCItemQuantity functions gSaveBlock1Ptr->pcItems[index].quantity -= count; if (gSaveBlock1Ptr->pcItems[index].quantity == 0) { @@ -823,7 +813,7 @@ bool8 RemovePyramidBagItem(u16 itemId, u16 count) u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode]; u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.lvlMode]; - i = gPyramidBagCursorData.cursorPosition + gPyramidBagCursorData.scrollPosition; + i = gPyramidBagMenuState.cursorPosition + gPyramidBagMenuState.scrollPosition; if (items[i] == itemId && quantities[i] >= count) { quantities[i] -= count; diff --git a/src/item_icon.c b/src/item_icon.c index 487b89b71..dc69d0331 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -7,8 +7,8 @@ #include "constants/items.h" // EWRAM vars -EWRAM_DATA void *gItemIconDecompressionBuffer = NULL; -EWRAM_DATA void *gItemIcon4x4Buffer = NULL; +EWRAM_DATA u8 *gItemIconDecompressionBuffer = NULL; +EWRAM_DATA u8 *gItemIcon4x4Buffer = NULL; // const rom data #include "data/item_icon_table.h" @@ -55,12 +55,10 @@ const struct SpriteTemplate gItemIconSpriteTemplate = // code bool8 AllocItemIconTemporaryBuffers(void) { - gItemIconDecompressionBuffer = gItemIconDecompressionBuffer; // needed to match gItemIconDecompressionBuffer = Alloc(0x120); if (gItemIconDecompressionBuffer == NULL) return FALSE; - gItemIcon4x4Buffer = gItemIcon4x4Buffer; // needed to match gItemIcon4x4Buffer = AllocZeroed(0x200); if (gItemIcon4x4Buffer == NULL) { diff --git a/src/item_menu.c b/src/item_menu.c index 80035b945..de4d82e9b 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -41,7 +41,6 @@ #include "shop.h" #include "sound.h" #include "sprite.h" -#include "string.h" #include "strings.h" #include "string_util.h" #include "task.h" @@ -87,7 +86,7 @@ u16 BagGetQuantityByPocketPosition(u8, u16); void BagDestroyPocketSwitchArrowPair(void); void TaskCloseBagMenu_2(u8); u8 AddItemMessageWindow(u8); -void BagMenu_RemoveBagItemMessageindow(u8); +void BagMenu_RemoveBagItemMessageWindow(u8); void set_callback3_to_bag(u8); void PrintItemDepositAmount(u8, s16); static u8 BagMenu_AddWindow(u8); @@ -510,7 +509,6 @@ EWRAM_DATA u16 gSpecialVar_ItemId = 0; static EWRAM_DATA struct TempWallyStruct *sTempWallyBag = 0; extern u8 *const gPocketNamesStringsTable[]; -extern u8* gReturnToXStringsTable[]; extern const u8 EventScript_SelectWithoutRegisteredItem[]; extern const u16 gUnknown_0860F074[]; @@ -531,7 +529,7 @@ void CB2_BagMenuFromBattle(void) if (!InBattlePyramid()) GoToBagMenu(ITEMMENULOCATION_BATTLE, POCKETS_COUNT, CB2_SetUpReshowBattleScreenAfterMenu2); else - GoToBattlePyramidBagMenu(1, CB2_SetUpReshowBattleScreenAfterMenu2); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_BATTLE, CB2_SetUpReshowBattleScreenAfterMenu2); } // Choosing berry to plant @@ -595,8 +593,8 @@ void GoToBagMenu(u8 location, u8 pocket, void ( *postExitMenuMainCallback2)()) gBagMenu->pocketSwitchDisabled = TRUE; gBagMenu->exitCallback = NULL; gBagMenu->itemOriginalLocation = 0xFF; - gBagMenu->pocketScrollArrowsTask = 0xFF; - gBagMenu->pocketSwitchArrowsTask = 0xFF; + gBagMenu->pocketScrollArrowsTask = TASK_NONE; + gBagMenu->pocketSwitchArrowsTask = TASK_NONE; memset(gBagMenu->spriteId, 0xFF, sizeof(gBagMenu->spriteId)); memset(gBagMenu->windowPointers, 0xFF, 10); SetMainCallback2(CB2_Bag); @@ -628,7 +626,6 @@ void CB2_Bag(void) bool8 SetupBagMenu(void) { - u32 index; u8 taskId; switch (gMain.state) @@ -709,7 +706,7 @@ bool8 SetupBagMenu(void) gMain.state++; break; case 16: - sub_80D4FAC(); + CreateItemMenuSwapLine(); gMain.state++; break; case 17: @@ -722,11 +719,11 @@ bool8 SetupBagMenu(void) gMain.state++; break; case 19: - BlendPalettes(0xFFFFFFFF, 16, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gMain.state++; break; case 20: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; @@ -743,7 +740,7 @@ void BagMenu_InitBGs(void) ResetVramOamAndBgCntRegs(); memset(gBagMenu->tilemapBuffer, 0, 0x800); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sBgTemplates_ItemMenu, 3); + InitBgsFromTemplates(0, sBgTemplates_ItemMenu, ARRAY_COUNT(sBgTemplates_ItemMenu)); SetBgTilemapBuffer(2, gBagMenu->tilemapBuffer); ResetAllBgsCoordinates(); ScheduleBgCopyTilemapToVram(2); @@ -789,7 +786,7 @@ bool8 LoadBagMenu_Graphics(void) gBagMenu->graphicsLoadState++; break; default: - LoadListMenuArrowsGfx(); + LoadListMenuSwapLineGfx(); gBagMenu->graphicsLoadState = 0; return TRUE; } @@ -866,7 +863,7 @@ void GetItemName(s8 *dest, u16 itemId) } break; case BERRIES_POCKET: - ConvertIntToDecimalStringN(gStringVar1, itemId - ITEM_CHERI_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + ConvertIntToDecimalStringN(gStringVar1, itemId - FIRST_BERRY_INDEX + 1, STR_CONV_MODE_LEADING_ZEROS, 2); CopyItemName(itemId, gStringVar2); StringExpandPlaceholders(dest, gText_NumberVar1Clear7Var2); break; @@ -949,7 +946,7 @@ void BagMenu_PrintDescription(int itemIndex) } else { - StringCopy(gStringVar1, gReturnToXStringsTable[gBagPositionStruct.location]); + StringCopy(gStringVar1, gBagMenu_ReturnToStrings[gBagPositionStruct.location]); StringExpandPlaceholders(gStringVar4, gText_ReturnToVar1); str = gStringVar4; } @@ -973,7 +970,7 @@ void BagMenu_PrintCursor(u8 y, u8 colorIndex) void CreatePocketScrollArrowPair(void) { - if (gBagMenu->pocketScrollArrowsTask == 0xFF) + if (gBagMenu->pocketScrollArrowsTask == TASK_NONE) gBagMenu->pocketScrollArrowsTask = AddScrollIndicatorArrowPairParameterized( SCROLL_ARROW_UP, 172, @@ -987,26 +984,26 @@ void CreatePocketScrollArrowPair(void) void BagDestroyPocketScrollArrowPair(void) { - if (gBagMenu->pocketScrollArrowsTask != 0xFF) + if (gBagMenu->pocketScrollArrowsTask != TASK_NONE) { RemoveScrollIndicatorArrowPair(gBagMenu->pocketScrollArrowsTask); - gBagMenu->pocketScrollArrowsTask = 0xFF; + gBagMenu->pocketScrollArrowsTask = TASK_NONE; } BagDestroyPocketSwitchArrowPair(); } void CreatePocketSwitchArrowPair(void) { - if (gBagMenu->pocketSwitchDisabled != TRUE && gBagMenu->pocketSwitchArrowsTask == 0xFF) + if (gBagMenu->pocketSwitchDisabled != TRUE && gBagMenu->pocketSwitchArrowsTask == TASK_NONE) gBagMenu->pocketSwitchArrowsTask = AddScrollIndicatorArrowPair(&sBagScrollArrowsTemplate, &gBagPositionStruct.unk6); } void BagDestroyPocketSwitchArrowPair(void) { - if (gBagMenu->pocketSwitchArrowsTask != 0xFF) + if (gBagMenu->pocketSwitchArrowsTask != TASK_NONE) { RemoveScrollIndicatorArrowPair(gBagMenu->pocketSwitchArrowsTask); - gBagMenu->pocketSwitchArrowsTask = 0xFF; + gBagMenu->pocketSwitchArrowsTask = TASK_NONE; } } @@ -1020,7 +1017,7 @@ void FreeBagItemListBuffers(void) void Task_FadeAndCloseBagMenu(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = TaskCloseBagMenu_2; } @@ -1117,7 +1114,7 @@ void BagMenu_InitListsMenu(u8 taskId) s16* data = gTasks[taskId].data; u16* scrollPos = &gBagPositionStruct.scrollPosition[gBagPositionStruct.pocket]; u16* cursorPos = &gBagPositionStruct.cursorPosition[gBagPositionStruct.pocket]; - BagMenu_RemoveBagItemMessageindow(4); + BagMenu_RemoveBagItemMessageWindow(4); DestroyListMenuTask(data[0], scrollPos, cursorPos); UpdatePocketItemList(gBagPositionStruct.pocket); SetInitialScrollAndCursorPositions(gBagPositionStruct.pocket); @@ -1375,7 +1372,7 @@ void BagMenu_SwapItems(u8 taskId) StringExpandPlaceholders(gStringVar4, gText_MoveVar1Where); FillWindowPixelBuffer(1, PIXEL_FILL(0)); BagMenu_Print(1, 1, gStringVar4, 3, 1, 0, 0, 0, 0); - sub_80D4FEC(data[1]); + UpdateItemMenuSwapLinePos(data[1]); BagDestroyPocketSwitchArrowPair(); BagMenu_PrintCursor_(data[0], 2); gTasks[taskId].func = Task_HandleSwappingItemsInput; @@ -1398,8 +1395,8 @@ static void Task_HandleSwappingItemsInput(u8 taskId) { input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gBagPositionStruct.scrollPosition[gBagPositionStruct.pocket], &gBagPositionStruct.cursorPosition[gBagPositionStruct.pocket]); - sub_80D4FC8(0); - sub_80D4FEC(gBagPositionStruct.cursorPosition[gBagPositionStruct.pocket]); + SetItemMenuSwapLineInvisibility(FALSE); + UpdateItemMenuSwapLinePos(gBagPositionStruct.cursorPosition[gBagPositionStruct.pocket]); switch (input) { case LIST_NOTHING_CHOSEN: @@ -1437,7 +1434,7 @@ void sub_81AC498(u8 taskId) gBagPositionStruct.cursorPosition[gBagPositionStruct.pocket]--; LoadBagItemListBuffers(gBagPositionStruct.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos); - sub_80D4FC8(1); + SetItemMenuSwapLineInvisibility(TRUE); CreatePocketSwitchArrowPair(); gTasks[taskId].func = Task_BagMenu_HandleInput; } @@ -1455,12 +1452,12 @@ void sub_81AC590(u8 taskId) gBagPositionStruct.cursorPosition[gBagPositionStruct.pocket]--; LoadBagItemListBuffers(gBagPositionStruct.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos); - sub_80D4FC8(1); + SetItemMenuSwapLineInvisibility(TRUE); CreatePocketSwitchArrowPair(); gTasks[taskId].func = Task_BagMenu_HandleInput; } -void OpenContextMenu(u8 unused) +static void OpenContextMenu(u8 unused) { switch (gBagPositionStruct.location) { @@ -1606,8 +1603,8 @@ void sub_81ACAF8(u8 a) void sub_81ACB54(u8 a, u8 b, u8 c) { - sub_8198DBC(a, 7, 8, 1, 0x38, b, c, sItemMenuActions, gBagMenu->contextMenuItemsPtr); - sub_8199944(a, 0x38, b, c, 0); + PrintMenuActionGrid(a, 7, 8, 1, 0x38, b, c, sItemMenuActions, gBagMenu->contextMenuItemsPtr); + InitMenuActionGrid(a, 0x38, b, c, 0); } void Task_ItemContext_FieldOrBattle(u8 taskId) @@ -1722,7 +1719,7 @@ void ItemMenu_UseOutOfBattle(u8 taskId) if (ItemId_GetFieldFunc(gSpecialVar_ItemId)) { BagMenu_RemoveSomeWindow(); - if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1) + if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_USE_PARTY_MENU) BagMenu_PrintThereIsNoPokemon(taskId); else { @@ -1852,7 +1849,7 @@ void ItemMenu_Register(u8 taskId) void ItemMenu_Give(u8 taskId) { BagMenu_RemoveSomeWindow(); - if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId)) + if (!IsWritingMailAllowed(gSpecialVar_ItemId)) { DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350); } @@ -1927,7 +1924,7 @@ void CB2_ReturnToBagMenuPocket(void) void Task_ItemContext_FieldGive(u8 taskId) { - if (!itemid_80BF6D8_mail_related(gSpecialVar_ItemId)) + if (!IsWritingMailAllowed(gSpecialVar_ItemId)) { DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350); } @@ -1973,7 +1970,7 @@ bool8 UseRegisteredKeyItemOnField(void) { ScriptContext2_Enable(); FreezeObjectEvents(); - sub_808B864(); + PlayerFreeze(); sub_808BCF4(); gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem; taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1Ptr->registeredItem), 8); @@ -2037,7 +2034,7 @@ void BagMenu_CancelSell(u8 taskId) s16* data = gTasks[taskId].data; RemoveMoneyWindow(); - BagMenu_RemoveBagItemMessageindow(4); + BagMenu_RemoveBagItemMessageWindow(4); BagMenu_PrintCursor_(data[0], 0); set_callback3_to_bag(taskId); } @@ -2072,7 +2069,7 @@ static void Task_SellHowManyDialogueHandleInput(u8 taskId) BagMenu_PrintCursor_(data[0], 0); RemoveMoneyWindow(); BagMenu_RemoveWindow(8); - BagMenu_RemoveBagItemMessageindow(4); + BagMenu_RemoveBagItemMessageWindow(4); set_callback3_to_bag(taskId); } } @@ -2392,7 +2389,7 @@ u8 sub_81AE124(u8 which) u8 BagMenu_AddWindow(u8 which) { u8 *ptr = &gBagMenu->windowPointers[which]; - if (*ptr == 0xFF) + if (*ptr == WINDOW_NONE) { *ptr = AddWindow(&sContextMenuWindowTemplates[which]); DrawStdFrameWithCustomTileAndPalette(*ptr, 0, 1, 14); @@ -2404,35 +2401,35 @@ u8 BagMenu_AddWindow(u8 which) void BagMenu_RemoveWindow(u8 which) { u8 *ptr = &gBagMenu->windowPointers[which]; - if (*ptr != 0xFF) + if (*ptr != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(*ptr, FALSE); ClearWindowTilemap(*ptr); RemoveWindow(*ptr); ScheduleBgCopyTilemapToVram(1); - *ptr = 0xFF; + *ptr = WINDOW_NONE; } } u8 AddItemMessageWindow(u8 which) { u8 *ptr = &gBagMenu->windowPointers[which]; - if (*ptr == 0xFF) + if (*ptr == WINDOW_NONE) *ptr = AddWindow(&sContextMenuWindowTemplates[which]); return *ptr; } -void BagMenu_RemoveBagItemMessageindow(u8 which) +void BagMenu_RemoveBagItemMessageWindow(u8 which) { u8 *ptr = &gBagMenu->windowPointers[which]; - if (*ptr != 0xFF) + if (*ptr != WINDOW_NONE) { ClearDialogWindowAndFrameToTransparent(*ptr, FALSE); // This ClearWindowTilemap call is redundant, since ClearDialogWindowAndFrameToTransparent already calls it. ClearWindowTilemap(*ptr); RemoveWindow(*ptr); ScheduleBgCopyTilemapToVram(1); - *ptr = 0xFF; + *ptr = WINDOW_NONE; } } diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index cc51236c8..d15409226 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -410,13 +410,13 @@ static const struct SpriteTemplate gBerryCheckCircleSpriteTemplate = void RemoveBagSprite(u8 id) { u8 *spriteId = &gBagMenu->spriteId[id]; - if (*spriteId != 0xFF) + if (*spriteId != SPRITE_NONE) { FreeSpriteTilesByTag(id + 100); FreeSpritePaletteByTag(id + 100); FreeSpriteOamMatrix(&gSprites[*spriteId]); DestroySprite(&gSprites[*spriteId]); - *spriteId = 0xFF; + *spriteId = SPRITE_NONE; } } @@ -516,7 +516,7 @@ static void SpriteCB_SwitchPocketRotatingBallContinue(struct Sprite *sprite) void AddBagItemIconSprite(u16 itemId, u8 id) { u8 *spriteId = &gBagMenu->spriteId[id + 2]; - if (*spriteId == 0xFF) + if (*spriteId == SPRITE_NONE) { u8 iconSpriteId; @@ -537,19 +537,19 @@ void RemoveBagItemIconSprite(u8 id) RemoveBagSprite(id + 2); } -void sub_80D4FAC(void) +void CreateItemMenuSwapLine(void) { - sub_8122344(&gBagMenu->spriteId[4], 8); + CreateSwapLineSprites(&gBagMenu->spriteId[4], 8); } -void sub_80D4FC8(u8 arg0) +void SetItemMenuSwapLineInvisibility(bool8 invisible) { - sub_81223FC(&gBagMenu->spriteId[4], 8, arg0); + SetSwapLineSpritesInvisibility(&gBagMenu->spriteId[4], 8, invisible); } -void sub_80D4FEC(u8 arg0) +void UpdateItemMenuSwapLinePos(u8 y) { - sub_8122448(&gBagMenu->spriteId[4], 136, 120, (arg0 + 1) * 16); + UpdateSwapLineSpritesPos(&gBagMenu->spriteId[4], 136, 120, (y + 1) * 16); } static void sub_80D5018(void *mem0, void *mem1) diff --git a/src/item_use.c b/src/item_use.c index 9ab755a5e..19f50549e 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -53,7 +53,7 @@ static bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *, u8); static u8 GetDirectionToHiddenItem(s16 distanceX, s16 distanceY); static void PlayerFaceHiddenItem(u8 a); static void CheckForHiddenItemsInMapConnection(u8 taskId); -static void sub_80FDC00(u8 taskId); +static void Task_OpenRegisteredPokeblockCase(u8 taskId); static void ItemUseOnFieldCB_Bike(u8 taskId); static void ItemUseOnFieldCB_Rod(u8); static void ItemUseOnFieldCB_Itemfinder(u8); @@ -69,7 +69,7 @@ static void Task_StartUseRepel(u8 taskId); static void Task_UseRepel(u8 taskId); static void Task_CloseCantUseKeyItemMessage(u8 taskId); static void SetDistanceOfClosestHiddenItem(u8 taskId, s16 x, s16 y); -static void CB2_OpenPokeblockCaseOnField(void); +static void CB2_OpenPokeblockFromBag(void); // EWRAM variables EWRAM_DATA static void(*sItemUseOnFieldCB)(u8 taskId) = NULL; @@ -77,13 +77,13 @@ EWRAM_DATA static void(*sItemUseOnFieldCB)(u8 taskId) = NULL; // Below is set TRUE by UseRegisteredKeyItemOnField #define tUsingRegisteredKeyItem data[3] -// .rodata - +// UB here if an item with type ITEM_USE_MAIL or ITEM_USE_BAG_MENU uses SetUpItemUseCallback +// Never occurs in vanilla, but can occur with improperly created items static const MainCallback sItemUseCallbacks[] = { - CB2_ShowPartyMenuForItemUse, - CB2_ReturnToField, - NULL, + [ITEM_USE_PARTY_MENU - 1] = CB2_ShowPartyMenuForItemUse, + [ITEM_USE_FIELD - 1] = CB2_ReturnToField, + [ITEM_USE_PBLOCK_CASE - 1] = NULL, }; static const u8 sClockwiseDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST}; @@ -94,13 +94,12 @@ static const struct YesNoFuncTable sUseTMHMYesNoFuncTable = .noFunc = BagMenu_InitListsMenu, }; -// .text - +#define tEnigmaBerryType data[4] static void SetUpItemUseCallback(u8 taskId) { u8 type; if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY) - type = gTasks[taskId].data[4] - 1; + type = gTasks[taskId].tEnigmaBerryType - 1; else type = ItemId_GetType(gSpecialVar_ItemId) - 1; if (!InBattlePyramid()) @@ -110,8 +109,8 @@ static void SetUpItemUseCallback(u8 taskId) } else { - gPyramidBagResources->callback2 = sItemUseCallbacks[type]; - CloseBattlePyramidBagAndSetCallback(taskId); + gPyramidBagMenu->exitCallback = sItemUseCallbacks[type]; + CloseBattlePyramidBag(taskId); } } @@ -218,9 +217,9 @@ void ItemUseOutOfBattle_Bike(u8 taskId) static void ItemUseOnFieldCB_Bike(u8 taskId) { - if (!ItemId_GetSecondaryId(gSpecialVar_ItemId)) + if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == MACH_BIKE) GetOnOffBike(PLAYER_AVATAR_FLAG_MACH_BIKE); - else + else // ACRO_BIKE GetOnOffBike(PLAYER_AVATAR_FLAG_ACRO_BIKE); ScriptUnfreezeObjectEvents(); ScriptContext2_Disable(); @@ -615,23 +614,23 @@ void ItemUseOutOfBattle_PokeblockCase(u8 taskId) } else if (gTasks[taskId].tUsingRegisteredKeyItem != TRUE) { - gBagMenu->exitCallback = CB2_OpenPokeblockCaseOnField; + gBagMenu->exitCallback = CB2_OpenPokeblockFromBag; Task_FadeAndCloseBagMenu(taskId); } else { - gFieldCallback = sub_80AF6D4; + gFieldCallback = FieldCB_ReturnToFieldNoScript; FadeScreen(FADE_TO_BLACK, 0); - gTasks[taskId].func = sub_80FDC00; + gTasks[taskId].func = Task_OpenRegisteredPokeblockCase; } } -static void CB2_OpenPokeblockCaseOnField(void) +static void CB2_OpenPokeblockFromBag(void) { OpenPokeblockCase(PBLOCK_CASE_FIELD, CB2_ReturnToBagMenuPocket); } -static void sub_80FDC00(u8 taskId) +static void Task_OpenRegisteredPokeblockCase(u8 taskId) { if (!gPaletteFade.active) { @@ -823,8 +822,8 @@ static void RemoveUsedItem(void) } else { - sub_81C5924(); - sub_81C59BC(); + UpdatePyramidBagList(); + UpdatePyramidBagCursorPos(); } } @@ -944,7 +943,7 @@ void ItemUseInBattle_PokeBall(u8 taskId) if (!InBattlePyramid()) Task_FadeAndCloseBagMenu(taskId); else - CloseBattlePyramidBagAndSetCallback(taskId); + CloseBattlePyramidBag(taskId); } else if (!InBattlePyramid()) { @@ -961,7 +960,7 @@ static void Task_CloseStatIncreaseMessage(u8 taskId) if (!InBattlePyramid()) Task_FadeAndCloseBagMenu(taskId); else - CloseBattlePyramidBagAndSetCallback(taskId); + CloseBattlePyramidBag(taskId); } } @@ -1006,8 +1005,8 @@ static void ItemUseInBattle_ShowPartyMenu(u8 taskId) } else { - gPyramidBagResources->callback2 = ChooseMonForInBattleItem; - CloseBattlePyramidBagAndSetCallback(taskId); + gPyramidBagMenu->exitCallback = ChooseMonForInBattleItem; + CloseBattlePyramidBag(taskId); } } @@ -1040,7 +1039,7 @@ void ItemUseInBattle_Escape(u8 taskId) if (!InBattlePyramid()) DisplayItemMessage(taskId, 1, gStringVar4, Task_FadeAndCloseBagMenu); else - DisplayItemMessageInBattlePyramid(taskId, gStringVar4, CloseBattlePyramidBagAndSetCallback); + DisplayItemMessageInBattlePyramid(taskId, gStringVar4, CloseBattlePyramidBag); } else { @@ -1065,28 +1064,28 @@ void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) case ITEM_EFFECT_SPDEF_EV: case ITEM_EFFECT_SPEED_EV: case ITEM_EFFECT_DEF_EV: - gTasks[taskId].data[4] = 1; + gTasks[taskId].tEnigmaBerryType = ITEM_USE_PARTY_MENU; ItemUseOutOfBattle_Medicine(taskId); break; case ITEM_EFFECT_SACRED_ASH: - gTasks[taskId].data[4] = 1; + gTasks[taskId].tEnigmaBerryType = ITEM_USE_PARTY_MENU; ItemUseOutOfBattle_SacredAsh(taskId); break; case ITEM_EFFECT_RAISE_LEVEL: - gTasks[taskId].data[4] = 1; + gTasks[taskId].tEnigmaBerryType = ITEM_USE_PARTY_MENU; ItemUseOutOfBattle_RareCandy(taskId); break; case ITEM_EFFECT_PP_UP: case ITEM_EFFECT_PP_MAX: - gTasks[taskId].data[4] = 1; + gTasks[taskId].tEnigmaBerryType = ITEM_USE_PARTY_MENU; ItemUseOutOfBattle_PPUp(taskId); break; case ITEM_EFFECT_HEAL_PP: - gTasks[taskId].data[4] = 1; + gTasks[taskId].tEnigmaBerryType = ITEM_USE_PARTY_MENU; ItemUseOutOfBattle_PPRecovery(taskId); break; default: - gTasks[taskId].data[4] = 4; + gTasks[taskId].tEnigmaBerryType = ITEM_USE_BAG_MENU; ItemUseOutOfBattle_CannotUse(taskId); break; } diff --git a/src/librfu_intr.c b/src/librfu_intr.c index 1361be40e..19ea60b06 100644 --- a/src/librfu_intr.c +++ b/src/librfu_intr.c @@ -148,11 +148,7 @@ static void sio32intr_clock_slave(void) { u32 regSIODATA32; u32 r0; - #ifndef NONMATCHING - register u32 reqLen asm("r2"); - #else - u32 reqLen; - #endif + u32 reqLen; gSTWIStatus->timerActive = 0; STWI_set_timer_in_RAM(100); @@ -165,10 +161,14 @@ static void sio32intr_clock_slave(void) ((u32*)gSTWIStatus->rxPacket)[0] = regSIODATA32; gSTWIStatus->reqNext = 1; r0 = 0x99660000; - if ((regSIODATA32 >> 16) == (r0 >> 16)) + // variable reuse required + reqLen = (regSIODATA32 >> 16); + if (reqLen == (r0 >> 16)) { - gSTWIStatus->reqLength = reqLen = regSIODATA32 >> 8; - gSTWIStatus->reqActiveCommand = regSIODATA32; + // only reqLen = regSIODATA32 >> 8 is needed to match, but it looks a bit + // more consistent when both lines update the variables. Might have been a macro? + gSTWIStatus->reqLength = reqLen = (regSIODATA32 >> 8); + gSTWIStatus->reqActiveCommand = reqLen = (regSIODATA32 >> 0); if (gSTWIStatus->reqLength == 0) { if ( diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c index fe1d10834..309fc4ead 100644 --- a/src/librfu_rfu.c +++ b/src/librfu_rfu.c @@ -1425,35 +1425,36 @@ static u16 rfu_STC_setSendData_org(u8 ni_or_uni, u8 bmSendSlot, u8 subFrameSize, sending = ni_or_uni & 0x20; if (sending || ni_or_uni == 0x40) { - u8 *dataType_p; // a hack to swap instructions - slotStatus_NI = gRfuSlotStatusNI[bm_slot_id]; slotStatus_UNI = NULL; slotStatus_NI->send.errorCode = 0; - *slotStatus_NI->send.now_p = dataType_p = &slotStatus_NI->send.dataType; + slotStatus_NI->send.now_p[0] = &slotStatus_NI->send.dataType; slotStatus_NI->send.remainSize = 7; slotStatus_NI->send.bmSlotOrg = bmSendSlot; slotStatus_NI->send.bmSlot = bmSendSlot; slotStatus_NI->send.payloadSize = subFrameSize - frameSize; if (sending != 0) - *dataType_p = 0; + slotStatus_NI->send.dataType = 0; else - *dataType_p = 1; + slotStatus_NI->send.dataType = 1; + slotStatus_NI->send.dataSize = dataSize; slotStatus_NI->send.src = src; slotStatus_NI->send.ack = 0; slotStatus_NI->send.phase = 0; - #ifndef NONMATCHING // to fix r2, r3, r4, r5 register roulette - asm("":::"r2"); - #endif for (i = 0; i < WINDOW_COUNT; ++i) { slotStatus_NI->send.recvAckFlag[i] = 0; slotStatus_NI->send.n[i] = 1; } for (bm_slot_id = 0; bm_slot_id < RFU_CHILD_MAX; ++bm_slot_id) - if ((bmSendSlot >> bm_slot_id) & 1) - gRfuSlotStatusNI[bm_slot_id]->send.failCounter = 0; + { + do + { + if ((bmSendSlot >> bm_slot_id) & 1) + gRfuSlotStatusNI[bm_slot_id]->send.failCounter = 0; + } while (0); + } gRfuLinkStatus->sendSlotNIFlag |= bmSendSlot; *llFrameSize_p -= subFrameSize; slotStatus_NI->send.state = SLOT_STATE_SEND_START; @@ -1549,21 +1550,20 @@ u16 rfu_changeSendTarget(u8 connType, u8 slotStatusIndex, u8 bmNewTgtSlot) u16 rfu_NI_stopReceivingData(u8 slotStatusIndex) { - struct NIComm *NI_comm; u16 imeBak; + struct NIComm *NI_comm; if (slotStatusIndex >= RFU_CHILD_MAX) return ERR_SLOT_NO; NI_comm = &gRfuSlotStatusNI[slotStatusIndex]->recv; imeBak = REG_IME; - ++imeBak; --imeBak; // fix imeBak, NI_comm register swap REG_IME = 0; - if (gRfuSlotStatusNI[slotStatusIndex]->recv.state & SLOT_BUSY_FLAG) + if (NI_comm->state & SLOT_BUSY_FLAG) { - if (gRfuSlotStatusNI[slotStatusIndex]->recv.state == SLOT_STATE_RECV_LAST) - gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN; + if (NI_comm->state == SLOT_STATE_RECV_LAST) + NI_comm->state = SLOT_STATE_RECV_SUCCESS_AND_SENDSIDE_UNKNOWN; else - gRfuSlotStatusNI[slotStatusIndex]->recv.state = SLOT_STATE_RECV_FAILED; + NI_comm->state = SLOT_STATE_RECV_FAILED; gRfuLinkStatus->recvSlotNIFlag &= ~(1 << slotStatusIndex); rfu_STC_releaseFrame(slotStatusIndex, 1, NI_comm); } @@ -1724,7 +1724,6 @@ static void rfu_constructSendLLFrame(void) u32 pakcketSize, currSize; u8 i; u8 *llf_p; - struct RfuSlotStatusNI *slotStatusNI; if (gRfuLinkStatus->parentChild != MODE_NEUTRAL && gRfuLinkStatus->sendSlotNIFlag | gRfuLinkStatus->recvSlotNIFlag | gRfuLinkStatus->sendSlotUNIFlag) @@ -1758,9 +1757,6 @@ static void rfu_constructSendLLFrame(void) { u8 *maxSize = llf_p - offsetof(struct RfuFixed, LLFBuffer[1]); - // Does the volatile qualifier make sense? - // It's the same as: - // asm("":::"memory"); pakcketSize = maxSize - *(u8 *volatile *)&gRfuFixed; } } diff --git a/src/librfu_sio32id.c b/src/librfu_sio32id.c index b6623540f..1c02840e8 100644 --- a/src/librfu_sio32id.c +++ b/src/librfu_sio32id.c @@ -123,34 +123,29 @@ static void Sio32IDIntr(void) { u32 regSIODATA32; u16 delay; -#ifndef NONMATCHING - register u32 rfuSIO32IdUnk0_times_16 asm("r1"); - register u16 negRfuSIO32IdUnk6 asm("r0"); -#else u32 rfuSIO32IdUnk0_times_16; - u16 negRfuSIO32IdUnk6; -#endif regSIODATA32 = REG_SIODATA32; if (gRfuSIO32Id.MS_mode != AGB_CLK_MASTER) REG_SIOCNT |= SIO_ENABLE; - rfuSIO32IdUnk0_times_16 = 16 * gRfuSIO32Id.MS_mode; // to handle side effect of inline asm - rfuSIO32IdUnk0_times_16 = (regSIODATA32 << rfuSIO32IdUnk0_times_16) >> 16; + rfuSIO32IdUnk0_times_16 = (regSIODATA32 << (16 * gRfuSIO32Id.MS_mode)) >> 16; regSIODATA32 = (regSIODATA32 << 16 * (1 - gRfuSIO32Id.MS_mode)) >> 16; if (gRfuSIO32Id.lastId == 0) { - if (rfuSIO32IdUnk0_times_16 == gRfuSIO32Id.recv_id) + u16 backup = rfuSIO32IdUnk0_times_16; + if (backup == gRfuSIO32Id.recv_id) { - if (gRfuSIO32Id.count > 3) + if (gRfuSIO32Id.count < 4) { - gRfuSIO32Id.lastId = regSIODATA32; - } - else if (rfuSIO32IdUnk0_times_16 == (u16)~gRfuSIO32Id.send_id) - { - negRfuSIO32IdUnk6 = ~gRfuSIO32Id.recv_id; - if (regSIODATA32 == negRfuSIO32IdUnk6) - ++gRfuSIO32Id.count; + backup = (u16)~gRfuSIO32Id.send_id; + if (gRfuSIO32Id.recv_id == backup) + { + if (regSIODATA32 == (u16)~gRfuSIO32Id.recv_id) + ++gRfuSIO32Id.count; + } } + else + gRfuSIO32Id.lastId = regSIODATA32; } else { diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 011d9fdfd..6fa8ba4eb 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -379,7 +379,7 @@ u8 GetQuizAuthor(void) struct LilycoveLadyQuiz *quiz; quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (sub_811F8D8(quiz->correctAnswer) == 0) + if (IsEasyChatAnswerUnlocked(quiz->correctAnswer) == FALSE) { i = quiz->questionId; do @@ -388,7 +388,7 @@ u8 GetQuizAuthor(void) { i = 0; } - } while (sub_811F8D8(sQuizLadyQuizAnswers[i]) == 0); + } while (IsEasyChatAnswerUnlocked(sQuizLadyQuizAnswers[i]) == FALSE); for (j = 0; j < QUIZ_QUESTION_LEN; j ++) { quiz->question[j] = sQuizLadyQuizQuestions[i][j]; @@ -762,25 +762,16 @@ void BufferContestName(u8 *dest, u8 category) StringCopy(dest, sContestNames[category]); } -// used in tv.c to determine sTVShowState for Contest Lady show -// if return val is 1, sTVShowState is 1 -// if return val is 2, sTVShowState is 3 -// if return val is 0, sTVShowState is 2 -u8 sub_818E880(void) +// Used by the Contest Lady's TV show to determine how well she performed +u8 GetContestLadyPokeblockState(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD) - { - return 1; - } + return CONTEST_LADY_GOOD; else if (sContestLadyPtr->numGoodPokeblocksGiven == 0) - { - return 2; - } + return CONTEST_LADY_BAD; else - { - return 0; - } + return CONTEST_LADY_NORMAL; } @@ -814,7 +805,7 @@ void Script_BufferContestLadyCategoryAndMonName(void) void OpenPokeblockCaseForContestLady(void) { - OpenPokeblockCase(3, CB2_ReturnToField); + OpenPokeblockCase(PBLOCK_CASE_GIVE, CB2_ReturnToField); } void SetContestLadyGivenPokeblock(void) diff --git a/src/link.c b/src/link.c index 9fd35a10b..8a04b53e5 100644 --- a/src/link.c +++ b/src/link.c @@ -41,8 +41,8 @@ struct LinkTestBGInfo { u32 screenBaseBlock; u32 paletteNum; - u32 dummy_8; - u32 dummy_C; + u32 baseChar; + u32 unused; }; static struct BlockTransfer sBlockSend; @@ -97,28 +97,26 @@ struct Link gLink; u8 gLastRecvQueueCount; u16 gLinkSavedIme; -EWRAM_DATA u8 gLinkTestDebugValuesEnabled = 0; -EWRAM_DATA u8 gUnknown_020223BD = 0; +static EWRAM_DATA u8 sLinkTestDebugValuesEnabled = 0; +static EWRAM_DATA u8 sDummyFlag = FALSE; EWRAM_DATA u32 gBerryBlenderKeySendAttempts = 0; EWRAM_DATA u16 gBlockRecvBuffer[MAX_RFU_PLAYERS][BLOCK_BUFFER_SIZE / 2] = {}; EWRAM_DATA u8 gBlockSendBuffer[BLOCK_BUFFER_SIZE] = {}; -EWRAM_DATA bool8 gLinkOpen = FALSE; +static EWRAM_DATA bool8 sLinkOpen = FALSE; EWRAM_DATA u16 gLinkType = 0; -EWRAM_DATA u16 gLinkTimeOutCounter = 0; +static EWRAM_DATA u16 sTimeOutCounter = 0; EWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {}; EWRAM_DATA struct LinkPlayer gLinkPlayers[MAX_RFU_PLAYERS] = {}; -EWRAM_DATA struct LinkPlayer gSavedLinkPlayers[MAX_RFU_PLAYERS] = {}; +static EWRAM_DATA struct LinkPlayer sSavedLinkPlayers[MAX_RFU_PLAYERS] = {}; EWRAM_DATA struct { u32 status; u8 lastRecvQueueCount; u8 lastSendQueueCount; - u8 unk_06; + bool8 disconnected; } sLinkErrorBuffer = {}; static EWRAM_DATA u16 sReadyCloseLinkAttempts = 0; // never read static EWRAM_DATA void *sLinkErrorBgTilemapBuffer = NULL; -// Static ROM declarations - static void InitLocalLinkPlayer(void); static void VBlankCB_LinkError(void); static void CB2_LinkTest(void); @@ -131,7 +129,7 @@ static void LinkCB_BlockSend(void); static void LinkCB_BlockSendEnd(void); static void SetBlockReceivedFlag(u8 who); static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size); -static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2); +static void LinkTest_PrintHex(u32 pos, u8 a0, u8 a1, u8 a2); static void LinkCB_RequestPlayerDataExchange(void); static void Task_PrintTestData(u8 taskId); @@ -160,15 +158,13 @@ static void DoSend(void); static void StopTimer(void); static void SendRecvDone(void); -// .rodata - static const u16 sWirelessLinkDisplayPal[] = INCBIN_U16("graphics/interface/wireless_link_display.gbapal"); static const u32 sWirelessLinkDisplayGfx[] = INCBIN_U32("graphics/interface/wireless_link_display.4bpp.lz"); static const u32 sWirelessLinkDisplayTilemap[] = INCBIN_U32("graphics/interface/wireless_link_display.bin.lz"); static const u16 sLinkTestDigitsPal[] = INCBIN_U16("graphics/interface/link_test_digits.gbapal"); static const u16 sLinkTestDigitsGfx[] = INCBIN_U16("graphics/interface/link_test_digits.4bpp"); static const u8 sUnusedTransparentWhite[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE}"); -static const u16 s2BlankTilesGfx[] = INCBIN_U16("graphics/interface/blank_1x2.4bpp"); +static const u16 sCommErrorBg_Gfx[] = INCBIN_U16("graphics/interface/comm_error_bg.4bpp"); static const struct BlockRequest sBlockRequests[] = { {gBlockSendBuffer, 200}, {gBlockSendBuffer, 200}, @@ -225,16 +221,14 @@ static const struct WindowTemplate sLinkErrorWindowTemplates[] = { }, DUMMY_WIN_TEMPLATE }; -static const u8 sTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY }; -static const u8 sUnused_082ED224[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00}; - -// .text +static const u8 sTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; +static const u8 sUnusedData[] = {0x00, 0xFF, 0xFE, 0xFF, 0x00}; bool8 IsWirelessAdapterConnected(void) { SetWirelessCommType1(); InitRFUAPI(); - if (rfu_LMAN_REQBN_softReset_and_checkID() == 0x8001) + if (rfu_LMAN_REQBN_softReset_and_checkID() == RFU_ID) { rfu_REQ_stopMode(); rfu_waitREQComplete(); @@ -251,13 +245,13 @@ void Task_DestroySelf(u8 taskId) DestroyTask(taskId); } -static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 a4) +static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 baseChar) { LoadPalette(sLinkTestDigitsPal, paletteNum * 16, 0x20); - DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof sLinkTestDigitsGfx); + DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * baseChar), sizeof sLinkTestDigitsGfx); gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; gLinkTestBGInfo.paletteNum = paletteNum; - gLinkTestBGInfo.dummy_8 = a4; + gLinkTestBGInfo.baseChar = baseChar; switch (bgNum) { case 1: @@ -274,17 +268,19 @@ static void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charB SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0); } -void sub_80094EC(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) +// Unused +static void LoadLinkTestBgGfx(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock) { LoadPalette(sLinkTestDigitsPal, paletteNum * 16, 0x20); DmaCopy16(3, sLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof sLinkTestDigitsGfx); gLinkTestBGInfo.screenBaseBlock = screenBaseBlock; gLinkTestBGInfo.paletteNum = paletteNum; - gLinkTestBGInfo.dummy_8 = 0; + gLinkTestBGInfo.baseChar = 0; SetGpuReg(sBGControlRegs[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock)); } -void LinkTestScreen(void) +// Unused +static void LinkTestScreen(void) { int i; @@ -346,10 +342,9 @@ static void InitLink(void) int i; for (i = 0; i < CMD_LENGTH; i++) - { - gSendCmd[i] = 0xEfff; - } - gLinkOpen = TRUE; + gSendCmd[i] = LINKCMD_NONE; + + sLinkOpen = TRUE; EnableSerial(); } @@ -402,7 +397,7 @@ void CloseLink(void) { LinkRfu_Shutdown(); } - gLinkOpen = FALSE; + sLinkOpen = FALSE; DisableSerial(); } @@ -413,14 +408,14 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used) if (sLinkTestLastBlockSendPos != sBlockSend.pos) { - LinkTest_prnthex(sBlockSend.pos, 2, 3, 2); + LinkTest_PrintHex(sBlockSend.pos, 2, 3, 2); sLinkTestLastBlockSendPos = sBlockSend.pos; } for (i = 0; i < MAX_LINK_PLAYERS; i++) { if (sLinkTestLastBlockRecvPos[i] != sBlockRecv[i].pos) { - LinkTest_prnthex(sBlockRecv[i].pos, 2, i + 4, 2); + LinkTest_PrintHex(sBlockRecv[i].pos, 2, i + 4, 2); sLinkTestLastBlockRecvPos[i] = sBlockRecv[i].pos; } } @@ -435,8 +430,8 @@ static void TestBlockTransfer(u8 nothing, u8 is, u8 used) ResetBlockReceivedFlag(i); if (gLinkTestBlockChecksums[i] != 0x0342) { - gLinkTestDebugValuesEnabled = FALSE; - gUnknown_020223BD = FALSE; + sLinkTestDebugValuesEnabled = FALSE; + sDummyFlag = FALSE; } } } @@ -455,7 +450,7 @@ static void LinkTestProcessKeyInput(void) } if (JOY_NEW(L_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(2, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(2, 0, 0)); } if (JOY_NEW(START_BUTTON)) { @@ -469,7 +464,7 @@ static void LinkTestProcessKeyInput(void) { SetCloseLinkCallback(); } - if (gLinkTestDebugValuesEnabled) + if (sLinkTestDebugValuesEnabled) { SetLinkDebugValues(gMain.vblankCounter2, gLinkCallback ? gLinkVSyncDisabled : gLinkVSyncDisabled | 0x10); } @@ -489,7 +484,7 @@ u16 LinkMain2(const u16 *heldKeys) { u8 i; - if (!gLinkOpen) + if (!sLinkOpen) { return 0; } @@ -555,10 +550,10 @@ static void ProcessRecvCmds(u8 unused) case LINKCMD_BLENDER_SEND_KEYS: gLinkPartnersHeldKeys[i] = gRecvCmds[i][1]; break; - case LINKCMD_0x5555: + case LINKCMD_DUMMY_1: gLinkDummy2 = TRUE; break; - case LINKCMD_0x5566: + case LINKCMD_DUMMY_2: gLinkDummy2 = TRUE; break; case LINKCMD_INIT_BLOCK: @@ -612,7 +607,7 @@ static void ProcessRecvCmds(u8 unused) linkPlayer->neverRead = 0; linkPlayer->progressFlags = 0; } - sub_800B524(linkPlayer); + ConvertLinkPlayerName(linkPlayer); if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0) { @@ -664,22 +659,19 @@ static void BuildSendCmd(u16 command) gSendCmd[0] = LINKCMD_BLENDER_SEND_KEYS; gSendCmd[1] = gMain.heldKeys; break; - case LINKCMD_0x5555: - gSendCmd[0] = LINKCMD_0x5555; + case LINKCMD_DUMMY_1: + gSendCmd[0] = LINKCMD_DUMMY_1; break; - case LINKCMD_0x6666: - gSendCmd[0] = LINKCMD_0x6666; + case LINKCMD_SEND_EMPTY: + gSendCmd[0] = LINKCMD_SEND_EMPTY; gSendCmd[1] = 0; break; - case LINKCMD_0x7777: + case LINKCMD_SEND_0xEE: { u8 i; - - gSendCmd[0] = LINKCMD_0x7777; + gSendCmd[0] = LINKCMD_SEND_0xEE; for (i = 0; i < 5; i++) - { gSendCmd[i + 1] = 0xEE; - } break; } case LINKCMD_INIT_BLOCK: @@ -690,8 +682,8 @@ static void BuildSendCmd(u16 command) case LINKCMD_BLENDER_NO_PBLOCK_SPACE: gSendCmd[0] = LINKCMD_BLENDER_NO_PBLOCK_SPACE; break; - case LINKCMD_0xAAAB: - gSendCmd[0] = LINKCMD_0xAAAB; + case LINKCMD_SEND_ITEM: + gSendCmd[0] = LINKCMD_SEND_ITEM; gSendCmd[1] = gSpecialVar_ItemId; break; case LINKCMD_SEND_BLOCK_REQ: @@ -702,14 +694,13 @@ static void BuildSendCmd(u16 command) gSendCmd[0] = LINKCMD_READY_CLOSE_LINK; gSendCmd[1] = gReadyCloseLinkType; break; - case LINKCMD_0x5566: - gSendCmd[0] = LINKCMD_0x5566; + case LINKCMD_DUMMY_2: + gSendCmd[0] = LINKCMD_DUMMY_2; break; case LINKCMD_SEND_HELD_KEYS: if (gHeldKeyCodeToSend == 0 || gLinkTransferringData) - { break; - } + gSendCmd[0] = LINKCMD_SEND_HELD_KEYS; gSendCmd[1] = gHeldKeyCodeToSend; break; @@ -819,7 +810,7 @@ bool32 Link_AnyPartnersPlayingFRLG_JP(void) void OpenLinkTimed(void) { sPlayerDataExchangeStatus = EXCHANGE_NOT_STARTED; - gLinkTimeOutCounter = 0; + sTimeOutCounter = 0; OpenLink(); } @@ -892,7 +883,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers) } } } - else if (++gLinkTimeOutCounter > 600) + else if (++sTimeOutCounter > 600) { sPlayerDataExchangeStatus = EXCHANGE_TIMED_OUT; } @@ -909,9 +900,7 @@ bool8 IsLinkPlayerDataExchangeComplete(void) for (i = 0; i < GetLinkPlayerCount(); i++) { if (gLinkPlayers[i].linkType == gLinkPlayers[0].linkType) - { count++; - } } if (count == GetLinkPlayerCount()) { @@ -936,9 +925,7 @@ void ResetLinkPlayers(void) int i; for (i = 0; i <= MAX_LINK_PLAYERS; i++) - { gLinkPlayers[i] = (struct LinkPlayer){}; - } } static void ResetBlockSend(void) @@ -966,9 +953,8 @@ static bool32 InitBlockSend(const void *src, size_t size) else { if (src != gBlockSendBuffer) - { memcpy(gBlockSendBuffer, src, size); - } + sBlockSend.src = gBlockSendBuffer; } BuildSendCmd(LINKCMD_INIT_BLOCK); @@ -980,9 +966,7 @@ static bool32 InitBlockSend(const void *src, size_t size) static void LinkCB_BlockSendBegin(void) { if (++sBlockSendDelayCounter > 2) - { gLinkCallback = LinkCB_BlockSend; - } } static void LinkCB_BlockSend(void) @@ -1020,13 +1004,9 @@ void SetBerryBlenderLinkCallback(void) { gBerryBlenderKeySendAttempts = 0; if (gWirelessCommType) - { Rfu_SetBerryBlenderLinkCallback(); - } else - { gLinkCallback = LinkCB_BerryBlenderSendHeldKeys; - } } // Unused @@ -1044,9 +1024,8 @@ static void SendBerryBlenderNoSpaceForPokeblocks(void) u8 GetMultiplayerId(void) { if (gWirelessCommType == TRUE) - { return Rfu_GetMultiplayerId(); - } + return SIO_MULTI_CNT->id; } @@ -1061,18 +1040,16 @@ u8 bitmask_all_link_players_but_self(void) bool8 SendBlock(u8 unused, const void *src, u16 size) { if (gWirelessCommType == TRUE) - { return Rfu_InitBlockSend(src, size); - } + return InitBlockSend(src, size); } bool8 SendBlockRequest(u8 blockReqType) { if (gWirelessCommType == TRUE) - { return Rfu_SendBlockRequest(blockReqType); - } + if (gLinkCallback == NULL) { gBlockRequestType = blockReqType; @@ -1085,31 +1062,25 @@ bool8 SendBlockRequest(u8 blockReqType) bool8 IsLinkTaskFinished(void) { if (gWirelessCommType == TRUE) - { return IsLinkRfuTaskFinished(); - } + return gLinkCallback == NULL; } u8 GetBlockReceivedStatus(void) { if (gWirelessCommType == TRUE) - { return Rfu_GetBlockReceivedStatus(); - } + return (gBlockReceivedStatus[3] << 3) | (gBlockReceivedStatus[2] << 2) | (gBlockReceivedStatus[1] << 1) | (gBlockReceivedStatus[0] << 0); } static void SetBlockReceivedFlag(u8 who) { if (gWirelessCommType == TRUE) - { Rfu_SetBlockReceivedFlag(who); - } else - { gBlockReceivedStatus[who] = TRUE; - } } void ResetBlockReceivedFlags(void) @@ -1119,16 +1090,12 @@ void ResetBlockReceivedFlags(void) if (gWirelessCommType == TRUE) { for (i = 0; i < MAX_RFU_PLAYERS; i++) - { Rfu_ResetBlockReceivedFlag(i); - } } else { for (i = 0; i < MAX_LINK_PLAYERS; i++) - { gBlockReceivedStatus[i] = FALSE; - } } } @@ -1147,9 +1114,7 @@ void ResetBlockReceivedFlag(u8 who) void CheckShouldAdvanceLinkState(void) { if ((gLinkStatus & LINK_STAT_MASTER) && EXTRACT_PLAYER_COUNT(gLinkStatus) > 1) - { gShouldAdvanceLinkState = 1; - } } static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size) @@ -1159,92 +1124,90 @@ static u16 LinkTestCalcBlockChecksum(const u16 *src, u16 size) chksum = 0; for (i = 0; i < size / 2; i++) - { chksum += src[i]; - } + return chksum; } -static void LinkTest_prnthexchar(char a0, u8 a1, u8 a2) +static void LinkTest_PrintNumChar(char val, u8 x, u8 y) { u16 *vAddr; vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); - vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + 1 + gLinkTestBGInfo.dummy_8); + vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + 1 + gLinkTestBGInfo.baseChar); } -static void LinkTest_prntchar(char a0, u8 a1, u8 a2) +static void LinkTest_PrintChar(char val, u8 x, u8 y) { u16 *vAddr; vAddr = (u16 *)BG_SCREEN_ADDR(gLinkTestBGInfo.screenBaseBlock); - vAddr[a2 * 32 + a1] = (gLinkTestBGInfo.paletteNum << 12) | (a0 + gLinkTestBGInfo.dummy_8); + vAddr[y * 32 + x] = (gLinkTestBGInfo.paletteNum << 12) | (val + gLinkTestBGInfo.baseChar); } -static void LinkTest_prnthex(u32 pos, u8 a0, u8 a1, u8 a2) +static void LinkTest_PrintHex(u32 num, u8 x, u8 y, u8 length) { - char sp[32 / 2]; + char buff[16]; int i; - for (i = 0; i < a2; i++) + for (i = 0; i < length; i++) { - sp[i] = pos & 0xf; - pos >>= 4; + buff[i] = num & 0xF; + num >>= 4; } - for (i = a2 - 1; i >= 0; i--) + for (i = length - 1; i >= 0; i--) { - LinkTest_prnthexchar(sp[i], a0, a1); - a0++; + LinkTest_PrintNumChar(buff[i], x, y); + x++; } } -static void LinkTest_prntint(int a0, u8 a1, u8 a2, u8 a3) +static void LinkTest_PrintInt(int num, u8 x, u8 y, u8 length) { - char sp[32 / 2]; - int sp10; + char buff[16]; + int negX; int i; - sp10 = -1; - if (a0 < 0) - { - sp10 = a1; - a0 = -a0; - } - for (i = 0; i < a3; i++) + negX = -1; + if (num < 0) { - sp[i] = a0 % 10; - a0 /= 10; + negX = x; + num = -num; } - for (i = a3 - 1; i >= 0; i--) + for (i = 0; i < length; i++) { - LinkTest_prnthexchar(sp[i], a1, a2); - a1++; + buff[i] = num % 10; + num /= 10; } - if (sp10 != -1) + for (i = length - 1; i >= 0; i--) { - LinkTest_prnthexchar(*"\n", sp10, a2); + LinkTest_PrintNumChar(buff[i], x, y); + x++; } + + if (negX != -1) + LinkTest_PrintNumChar(*"\n", negX, y); } -static void LinkTest_prntstr(const char *a0, u8 a1, u8 a2) +static void LinkTest_PrintString(const char *str, u8 x, u8 y) { - int r6; + int xOffset; int i; - int r5; + int yOffset; - r5 = 0; - r6 = 0; - for (i = 0; a0[i] != 0; a0++) + yOffset = 0; + xOffset = 0; + for (i = 0; str[i] != 0; str++) { - if (a0[i] == *"\n") + if (str[i] == *"\n") { - r5++; - r6 = 0; + yOffset++; + xOffset = 0; } else { - LinkTest_prntchar(a0[i], a1 + r6, a2 + r5); - r6++; + LinkTest_PrintChar(str[i], x + xOffset, y + yOffset); + xOffset++; } } } @@ -1260,29 +1223,28 @@ static void LinkCB_RequestPlayerDataExchange(void) static void Task_PrintTestData(u8 taskId) { - char sp[32]; + char testTitle[32]; int i; - strcpy(sp, sASCIITestPrint); - LinkTest_prntstr(sp, 5, 2); - LinkTest_prnthex(gShouldAdvanceLinkState, 2, 1, 2); - LinkTest_prnthex(gLinkStatus, 15, 1, 8); - LinkTest_prnthex(gLink.state, 2, 10, 2); - LinkTest_prnthex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); - LinkTest_prnthex(GetMultiplayerId(), 15, 12, 2); - LinkTest_prnthex(gLastSendQueueCount, 25, 1, 2); - LinkTest_prnthex(gLastRecvQueueCount, 25, 2, 2); - LinkTest_prnthex(GetBlockReceivedStatus(), 15, 5, 2); - LinkTest_prnthex(gLinkDebugSeed, 2, 12, 8); - LinkTest_prnthex(gLinkDebugFlags, 2, 13, 8); - LinkTest_prnthex(GetSioMultiSI(), 25, 5, 1); - LinkTest_prnthex(IsSioMultiMaster(), 25, 6, 1); - LinkTest_prnthex(IsLinkConnectionEstablished(), 25, 7, 1); - LinkTest_prnthex(HasLinkErrorOccurred(), 25, 8, 1); + strcpy(testTitle, sASCIITestPrint); + LinkTest_PrintString(testTitle, 5, 2); + LinkTest_PrintHex(gShouldAdvanceLinkState, 2, 1, 2); + LinkTest_PrintHex(gLinkStatus, 15, 1, 8); + LinkTest_PrintHex(gLink.state, 2, 10, 2); + LinkTest_PrintHex(EXTRACT_PLAYER_COUNT(gLinkStatus), 15, 10, 2); + LinkTest_PrintHex(GetMultiplayerId(), 15, 12, 2); + LinkTest_PrintHex(gLastSendQueueCount, 25, 1, 2); + LinkTest_PrintHex(gLastRecvQueueCount, 25, 2, 2); + LinkTest_PrintHex(GetBlockReceivedStatus(), 15, 5, 2); + LinkTest_PrintHex(gLinkDebugSeed, 2, 12, 8); + LinkTest_PrintHex(gLinkDebugFlags, 2, 13, 8); + LinkTest_PrintHex(GetSioMultiSI(), 25, 5, 1); + LinkTest_PrintHex(IsSioMultiMaster(), 25, 6, 1); + LinkTest_PrintHex(IsLinkConnectionEstablished(), 25, 7, 1); + LinkTest_PrintHex(HasLinkErrorOccurred(), 25, 8, 1); + for (i = 0; i < MAX_LINK_PLAYERS; i++) - { - LinkTest_prnthex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); - } + LinkTest_PrintHex(gLinkTestBlockChecksums[i], 10, 4 + i, 4); } void SetLinkDebugValues(u32 seed, u32 flags) @@ -1298,9 +1260,8 @@ u8 GetSavedLinkPlayerCountAsBitFlags(void) flags = 0; for (i = 0; i < gSavedLinkPlayerCount; i++) - { flags |= (1 << i); - } + return flags; } @@ -1311,9 +1272,8 @@ u8 GetLinkPlayerCountAsBitFlags(void) flags = 0; for (i = 0; i < GetLinkPlayerCount(); i++) - { flags |= (1 << i); - } + return flags; } @@ -1324,9 +1284,7 @@ void SaveLinkPlayers(u8 playerCount) gSavedLinkPlayerCount = playerCount; gSavedMultiplayerId = GetMultiplayerId(); for (i = 0; i < MAX_RFU_PLAYERS; i++) - { - gSavedLinkPlayers[i] = gLinkPlayers[i]; - } + sSavedLinkPlayers[i] = gLinkPlayers[i]; } // The number of players when trading began. This is frequently compared against the @@ -1349,7 +1307,7 @@ bool8 DoesLinkPlayerCountMatchSaved(void) for (i = 0; i < gSavedLinkPlayerCount; i++) { - if (gLinkPlayers[i].trainerId == gSavedLinkPlayers[i].trainerId) + if (gLinkPlayers[i].trainerId == sSavedLinkPlayers[i].trainerId) { if (gLinkType == LINKTYPE_BATTLE_TOWER) { @@ -1375,12 +1333,15 @@ bool8 DoesLinkPlayerCountMatchSaved(void) void ClearSavedLinkPlayers(void) { int i; - - // Clearly not what was meant to be written, but here it is anyway. - for (i = 0; i < 4; i++) - { - CpuSet(&gSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer)); - } + // The CpuSet loop below is incorrectly writing to NULL + // instead of sSavedLinkPlayers. + // Additionally it's using the wrong array size. +#ifdef UBFIX + memset(sSavedLinkPlayers, 0, sizeof(sSavedLinkPlayers)); +#else + for (i = 0; i < MAX_LINK_PLAYERS; i++) + CpuSet(&sSavedLinkPlayers[i], NULL, sizeof(struct LinkPlayer)); +#endif } void CheckLinkPlayersMatchSaved(void) @@ -1389,8 +1350,8 @@ void CheckLinkPlayersMatchSaved(void) for (i = 0; i < gSavedLinkPlayerCount; i++) { - if (gSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId - || StringCompare(gSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) + if (sSavedLinkPlayers[i].trainerId != gLinkPlayers[i].trainerId + || StringCompare(sSavedLinkPlayers[i].name, gLinkPlayers[i].name) != 0) { gLinkErrorOccurred = TRUE; CloseLink(); @@ -1413,9 +1374,8 @@ u8 GetLinkPlayerCount_2(void) bool8 IsLinkMaster(void) { if (gWirelessCommType) - { return Rfu_IsMaster(); - } + return EXTRACT_MASTER(gLinkStatus); } @@ -1489,7 +1449,7 @@ static void LinkCB_WaitCloseLink(void) if (count == linkPlayerCount) { // All ready, close link - gBattleTypeFlags &= ~BATTLE_TYPE_20; + gBattleTypeFlags &= ~BATTLE_TYPE_LINK_IN_BATTLE; gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; @@ -1551,7 +1511,7 @@ static void LinkCB_WaitCloseLinkWithJP(void) if (count == linkPlayerCount) { // All ready, close link - gBattleTypeFlags &= ~BATTLE_TYPE_20; + gBattleTypeFlags &= ~BATTLE_TYPE_LINK_IN_BATTLE; gLinkVSyncDisabled = TRUE; CloseLink(); gLinkCallback = NULL; @@ -1568,9 +1528,8 @@ void SetLinkStandbyCallback(void) else { if (gLinkCallback == NULL) - { gLinkCallback = LinkCB_Standby; - } + gLinkDummy1 = FALSE; } } @@ -1606,7 +1565,7 @@ static void LinkCB_StandbyForAll(void) static void CheckErrorStatus(void) { - if (gLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus)) + if (sLinkOpen && EXTRACT_LINK_ERRORS(gLinkStatus)) { if (!gSuppressLinkErrorMessage) { @@ -1620,12 +1579,12 @@ static void CheckErrorStatus(void) } } -void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 unk_06) +void BufferLinkErrorInfo(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 disconnected) { sLinkErrorBuffer.status = status; sLinkErrorBuffer.lastSendQueueCount = lastSendQueueCount; sLinkErrorBuffer.lastRecvQueueCount = lastRecvQueueCount; - sLinkErrorBuffer.unk_06 = unk_06; + sLinkErrorBuffer.disconnected = disconnected; } void CB2_LinkError(void) @@ -1645,16 +1604,15 @@ void CB2_LinkError(void) ScanlineEffect_Stop(); if (gWirelessCommType) { - if (!sLinkErrorBuffer.unk_06) - { + if (!sLinkErrorBuffer.disconnected) gWirelessCommType = 3; - } + ResetLinkRfuGFLayer(); } SetVBlankCallback(VBlankCB_LinkError); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sLinkErrorBgTemplates, ARRAY_COUNT(sLinkErrorBgTemplates)); - sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(0x800); + sLinkErrorBgTilemapBuffer = tilemapBuffer = malloc(BG_SCREEN_SIZE); SetBgTilemapBuffer(1, tilemapBuffer); if (InitWindows(sLinkErrorWindowTemplates)) { @@ -1680,9 +1638,9 @@ void CB2_LinkError(void) } } -static void sub_800B080(void) +static void ErrorMsg_MoveCloserToPartner(void) { - LoadBgTiles(0, s2BlankTilesGfx, 0x20, 0); + LoadBgTiles(0, sCommErrorBg_Gfx, 0x20, 0); DecompressAndLoadBgGfxUsingHeap(1, sWirelessLinkDisplayGfx, FALSE, 0, 0); CopyToBgTilemapBuffer(1, sWirelessLinkDisplayTilemap, 0, 0); CopyBgTilemapBufferToVram(1); @@ -1697,9 +1655,9 @@ static void sub_800B080(void) CopyWindowToVram(2, 3); } -static void sub_800B138(void) +static void ErrorMsg_CheckConnections(void) { - LoadBgTiles(0, s2BlankTilesGfx, 0x20, 0); + LoadBgTiles(0, sCommErrorBg_Gfx, 0x20, 0); FillWindowPixelBuffer(1, PIXEL_FILL(0)); FillWindowPixelBuffer(2, PIXEL_FILL(0)); AddTextPrinterParameterized3(1, 3, 2, 0, sTextColors, 0, gText_CommErrorCheckConnections); @@ -1714,21 +1672,17 @@ static void CB2_PrintErrorMessage(void) switch (gMain.state) { case 00: - if (sLinkErrorBuffer.unk_06) - { - sub_800B080(); - } + // Below is only true for the RFU, so the other error + // type is inferred to be from a wired connection + if (sLinkErrorBuffer.disconnected) + ErrorMsg_MoveCloserToPartner(); else - { - sub_800B138(); - } + ErrorMsg_CheckConnections(); break; case 02: ShowBg(0); - if (sLinkErrorBuffer.unk_06) - { + if (sLinkErrorBuffer.disconnected) ShowBg(1); - } break; case 30: PlaySE(SE_BOO); @@ -1741,13 +1695,9 @@ static void CB2_PrintErrorMessage(void) break; case 130: if (gWirelessCommType == 2) - { AddTextPrinterParameterized3(0, 3, 2, 20, sTextColors, 0, gText_ABtnTitleScreen); - } else if (gWirelessCommType == 1) - { AddTextPrinterParameterized3(0, 3, 2, 20, sTextColors, 0, gText_ABtnRegistrationCounter); - } break; } if (gMain.state == 160) @@ -1758,7 +1708,7 @@ static void CB2_PrintErrorMessage(void) { PlaySE(SE_PIN); gWirelessCommType = 0; - sLinkErrorBuffer.unk_06 = 0; + sLinkErrorBuffer.disconnected = FALSE; sub_81700F8(); } } @@ -1772,10 +1722,9 @@ static void CB2_PrintErrorMessage(void) } } } + if (gMain.state != 160) - { gMain.state++; - } } // TODO: there might be a file boundary here, let's name it @@ -1805,7 +1754,7 @@ bool8 HasLinkErrorOccurred(void) return gLinkErrorOccurred; } -void sub_800B348(void) +void LocalLinkPlayerToBlock(void) { struct LinkPlayerBlock *block; @@ -1826,11 +1775,11 @@ void LinkPlayerFromBlock(u32 who) block = (struct LinkPlayerBlock *)gBlockRecvBuffer[who_]; player = &gLinkPlayers[who_]; *player = block->linkPlayer; - sub_800B524(player); - if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 || strcmp(block->magic2, sASCIIGameFreakInc) != 0) - { + ConvertLinkPlayerName(player); + + if (strcmp(block->magic1, sASCIIGameFreakInc) != 0 + || strcmp(block->magic2, sASCIIGameFreakInc) != 0) SetMainCallback2(CB2_LinkError); - } } bool8 HandleLinkConnection(void) @@ -1842,21 +1791,17 @@ bool8 HandleLinkConnection(void) { gLinkStatus = LinkMain1(&gShouldAdvanceLinkState, gSendCmd, gRecvCmds); LinkMain2(&gMain.heldKeys); - if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && sub_808766C() == TRUE) - { + if ((gLinkStatus & LINK_STAT_RECEIVED_NOTHING) && IsSendingKeysOverCable() == TRUE) return TRUE; - } } else { r4 = sub_8010EC0(); r5 = sub_8010F1C(); - if (sub_808766C() == TRUE) + if (IsSendingKeysOverCable() == TRUE) { if (r4 == TRUE || IsRfuRecvQueueEmpty() || r5) - { return TRUE; - } } } return FALSE; @@ -1865,42 +1810,34 @@ bool8 HandleLinkConnection(void) void SetWirelessCommType1(void) { if (gReceivedRemoteLinkPlayers == 0) - { gWirelessCommType = 1; - } } static void SetWirelessCommType0_Internal(void) { if (gReceivedRemoteLinkPlayers == 0) - { gWirelessCommType = 0; - } } void SetWirelessCommType0(void) { if (gReceivedRemoteLinkPlayers == 0) - { gWirelessCommType = 0; - } } u32 GetLinkRecvQueueLength(void) { if (gWirelessCommType != 0) - { return GetRfuRecvQueueLength(); - } + return gLink.recvQueue.count; } -bool32 sub_800B504(void) +bool32 IsLinkRecvQueueLengthAtLeast3(void) { if (GetLinkRecvQueueLength() > 2) - { return TRUE; - } + return FALSE; } @@ -1910,9 +1847,9 @@ u8 GetWirelessCommType(void) return gWirelessCommType; } -void sub_800B524(struct LinkPlayer *player) +void ConvertLinkPlayerName(struct LinkPlayer *player) { - player->progressFlagsCopy = player->progressFlags; + player->progressFlagsCopy = player->progressFlags; // ? Perhaps relocating for a longer name field ConvertInternationalString(player->name, player->language); } @@ -2420,9 +2357,7 @@ void ResetSendBuffer(void) for (i = 0; i < CMD_LENGTH; i++) { for (j = 0; j < QUEUE_CAPACITY; j++) - { - gLink.sendQueue.data[i][j] = 0xEFFF; - } + gLink.sendQueue.data[i][j] = LINKCMD_NONE; } } @@ -2439,9 +2374,7 @@ void ResetRecvBuffer(void) for (j = 0; j < CMD_LENGTH; j++) { for (k = 0; k < QUEUE_CAPACITY; k++) - { - gLink.recvQueue.data[i][j][k] = 0xEFFF; - } + gLink.recvQueue.data[i][j][k] = LINKCMD_NONE; } } } diff --git a/src/link_rfu_2.c b/src/link_rfu_2.c index 5e0ef0aa4..6366b9704 100644 --- a/src/link_rfu_2.c +++ b/src/link_rfu_2.c @@ -1380,7 +1380,7 @@ static void WaitAllReadyToCloseLink(void) if (count == playerCount) { // All ready, close link - gBattleTypeFlags &= ~BATTLE_TYPE_20; + gBattleTypeFlags &= ~BATTLE_TYPE_LINK_IN_BATTLE; if (Rfu.parentChild == MODE_CHILD) { Rfu.errorState = 3; @@ -1697,7 +1697,7 @@ static void sub_801084C(u8 taskId) if (AreNoPlayersReceiving()) { ResetBlockReceivedFlags(); - sub_800B348(); + LocalLinkPlayerToBlock(); gTasks[taskId].data[0]++; } break; @@ -1786,7 +1786,7 @@ static void ReceiveRfuLinkPlayers(const struct SioInfo *sioInfo) for (i = 0; i < MAX_RFU_PLAYERS; i++) { gLinkPlayers[i] = sioInfo->linkPlayers[i]; - sub_800B524(gLinkPlayers + i); + ConvertLinkPlayerName(gLinkPlayers + i); } } @@ -1831,7 +1831,7 @@ static void Task_ExchangeLinkPlayers(u8 taskId) ResetBlockReceivedFlag(r4); r2 = (struct LinkPlayerBlock *)gBlockRecvBuffer[r4]; gLinkPlayers[r4] = r2->linkPlayer; - sub_800B524(gLinkPlayers + r4); + ConvertLinkPlayerName(gLinkPlayers + r4); gTasks[taskId].data[0]++; } break; @@ -1887,7 +1887,7 @@ static void sub_8010D0C(u8 taskId) case 0: if (Rfu.playerCount) { - sub_800B348(); + LocalLinkPlayerToBlock(); SendBlock(0, gBlockSendBuffer, sizeof(struct LinkPlayerBlock)); gTasks[taskId].data[0]++; } @@ -2472,7 +2472,7 @@ void RfuVSync(void) rfu_LMAN_syncVBlank(); } -void sub_8011AC8(void) +void ClearRecvCommands(void) { CpuFill32(0, gRecvCmds, sizeof(gRecvCmds)); } @@ -2643,7 +2643,7 @@ static void sub_8011E2C(u8 taskId) static void sub_8011E94(u32 a0, u32 a1) { u8 taskId = FindTaskIdByFunc(sub_8011E2C); - if (taskId == 0xFF) + if (taskId == TASK_NONE) { taskId = CreateTask(sub_8011E2C, 5); gTasks[taskId].data[0] = a0; @@ -2792,12 +2792,12 @@ void sub_8012188(const u8 *name, struct GFtgtGname *structPtr, u8 activity) taskId2 = FindTaskIdByFunc(Task_LinkRfu_UnionRoomListen); if (activity == (ACTIVITY_CHAT | IN_UNION_ROOM)) { - if (taskId2 != 0xFF) + if (taskId2 != TASK_NONE) gTasks[taskId2].data[7] = 1; } else { - if (taskId2 != 0xFF) + if (taskId2 != TASK_NONE) gTasks[taskId2].data[7] = 0; } } diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index c6344f503..f47167873 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -792,7 +792,7 @@ void LoadWirelessStatusIndicatorSpriteGfx(void) LoadCompressedSpriteSheet(&sWirelessStatusIndicatorSpriteSheet); } LoadSpritePalette(&sWirelessStatusIndicatorSpritePalette); - gWirelessStatusIndicatorSpriteId = 0xFF; + gWirelessStatusIndicatorSpriteId = SPRITE_NONE; } static u8 GetParentSignalStrength(void) @@ -822,7 +822,7 @@ static void SetWirelessStatusIndicatorAnim(struct Sprite *sprite, s32 animNum) void UpdateWirelessStatusIndicatorSprite(void) { - if (gWirelessStatusIndicatorSpriteId != 0xFF && gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE) + if (gWirelessStatusIndicatorSpriteId != SPRITE_NONE && gSprites[gWirelessStatusIndicatorSpriteId].sValidator == STATUS_INDICATOR_ACTIVE) { struct Sprite *sprite = &gSprites[gWirelessStatusIndicatorSpriteId]; u8 signalStrength = RFU_LINK_ICON_LEVEL4_MAX; diff --git a/src/list_menu.c b/src/list_menu.c index 3e5642e4c..9ac9b87ab 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -467,8 +467,6 @@ s32 ListMenu_ProcessInput(u8 listTaskId) } } -#define TASK_NONE 0xFF - void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow) { struct ListMenu *list = (void*) gTasks[listTaskId].data; @@ -681,7 +679,7 @@ static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) struct CursorStruct cursor; cursor.left = 0; - cursor.top = 160; + cursor.top = DISPLAY_HEIGHT; cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2; cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2; cursor.tileTag = 0x4000; diff --git a/src/load_save.c b/src/load_save.c index 8459cd96b..eec8f91ae 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -130,7 +130,7 @@ void MoveSaveBlocks_ResetHeap(void) gMain.vblankCallback = vblankCB; // create a new encryption key - encryptionKey = (Random() << 0x10) + (Random()); + encryptionKey = (Random() << 16) + (Random()); ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey); gSaveBlock2Ptr->encryptionKey = encryptionKey; } @@ -887,18 +887,13 @@ void CgbModVol(struct CgbChannel *chan) if ((soundInfo->mode & 1) || !CgbPan(chan)) { chan->pan = 0xFF; - chan->envelopeGoal = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + chan->envelopeGoal = (u32)(chan->leftVolume + chan->rightVolume); + chan->envelopeGoal /= 16; } else { - // Force chan->rightVolume and chan->leftVolume to be read from memory again, - // even though there is no reason to do so. - // The command line option "-fno-gcse" achieves the same result as this. - #ifndef NONMATCHING - asm("" : : : "memory"); - #endif - - chan->envelopeGoal = (u32)(chan->rightVolume + chan->leftVolume) >> 4; + chan->envelopeGoal = (u32)(chan->leftVolume + chan->rightVolume); + chan->envelopeGoal /= 16; if (chan->envelopeGoal > 15) chan->envelopeGoal = 15; } @@ -1616,6 +1611,9 @@ void ply_xcmd_0C(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *tra void ply_xcmd_0D(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track) { u32 unk; +#ifdef UBFIX + unk = 0; +#endif READ_XCMD_BYTE(unk, 0) // UB: uninitialized variable READ_XCMD_BYTE(unk, 1) @@ -1657,18 +1655,12 @@ start_song: mplayInfo = &gPokemonCryMusicPlayers[i]; mplayInfo->ident++; -#define CRY ((s32)&gPokemonCrySongs + i * sizeof(struct PokemonCrySong)) -#define CRY_OFS(field) offsetof(struct PokemonCrySong, field) + gPokemonCrySongs[i] = gPokemonCrySong; - memcpy((void *)CRY, &gPokemonCrySong, sizeof(struct PokemonCrySong)); - - *(u32 *)(CRY + CRY_OFS(tone)) = (u32)tone; - *(u32 *)(CRY + CRY_OFS(part)) = CRY + CRY_OFS(part0); - *(u32 *)(CRY + CRY_OFS(part) + 4) = CRY + CRY_OFS(part1); - *(u32 *)(CRY + CRY_OFS(gotoTarget)) = CRY + CRY_OFS(cont); - -#undef CRY_OFS -#undef CRY + gPokemonCrySongs[i].tone = tone; + gPokemonCrySongs[i].part[0] = &gPokemonCrySongs[i].part0; + gPokemonCrySongs[i].part[1] = &gPokemonCrySongs[i].part1; + gPokemonCrySongs[i].gotoTarget = (u32)&gPokemonCrySongs[i].cont; mplayInfo->ident = ID_NUMBER; @@ -1711,14 +1703,14 @@ void SetPokemonCryProgress(u32 val) gPokemonCrySong.unkCmd0DParam = val; } -int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) +bool32 IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo) { struct MusicPlayerTrack *track = mplayInfo->tracks; if (track->chan && track->chan->track == track) - return 1; + return TRUE; else - return 0; + return FALSE; } void SetPokemonCryChorus(s8 val) diff --git a/src/m4a_1.s b/src/m4a_1.s index d72336c18..62b913c86 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -678,7 +678,7 @@ sub_82DF758: ldr r1, [r4, o_SoundChannel_wav] add r2, r2, r1 add r2, r2, 0x10 - ldr r5, =gUnknown_03001300 + ldr r5, =gDecodingBuffer ldr r6, =gDeltaEncodingTable mov r7, 0x40 ldrb lr, [r2], 1 @@ -699,7 +699,7 @@ _081DD57C: subs r7, r7, 2 bgt _081DD568 _081DD594: - ldr r5, =gUnknown_03001300 + ldr r5, =gDecodingBuffer and r0, r3, 0x3F ldrsb r1, [r5, r0] pop {r0,r2,r5-r7,pc} @@ -1909,9 +1909,9 @@ _081DDD90: .align 2, 0 @ Don't pad with nop. .bss -gUnknown_03001300: +gDecodingBuffer: @ Used as a buffer for audio decoded from compressed DPCM .space 0x40 - .size gUnknown_03001300, .-gUnknown_03001300 + .size gDecodingBuffer, .-gDecodingBuffer .global gMPlayTrack_BGM gMPlayTrack_BGM: diff --git a/src/mail.c b/src/mail.c index 04464f06b..0ee294787 100644 --- a/src/mail.c +++ b/src/mail.c @@ -18,62 +18,31 @@ #include "pokemon_icon.h" #include "malloc.h" #include "easy_chat.h" +#include "graphics.h" #include "constants/rgb.h" -extern const u16 gMailPalette_Orange[]; -extern const u16 gMailPalette_Harbor[]; -extern const u16 gMailPalette_Glitter[]; -extern const u16 gMailPalette_Mech[]; -extern const u16 gMailPalette_Wood[]; -extern const u16 gMailPalette_Wave[]; -extern const u16 gMailPalette_Bead[]; -extern const u16 gMailPalette_Shadow[]; -extern const u16 gMailPalette_Tropic[]; -extern const u16 gMailPalette_Dream[]; -extern const u16 gMailPalette_Fab[]; -extern const u16 gMailPalette_Retro[]; -extern const u8 gMailTiles_Orange[]; -extern const u8 gMailTilemap_Orange[]; -extern const u8 gMailTiles_Harbor[]; -extern const u8 gMailTilemap_Harbor[]; -extern const u8 gMailTiles_Glitter[]; -extern const u8 gMailTilemap_Glitter[]; -extern const u8 gMailTiles_Mech[]; -extern const u8 gMailTilemap_Mech[]; -extern const u8 gMailTiles_Wood[]; -extern const u8 gMailTilemap_Wood[]; -extern const u8 gMailTiles_Wave[]; -extern const u8 gMailTilemap_Wave[]; -extern const u8 gMailTiles_Bead[]; -extern const u8 gMailTilemap_Bead[]; -extern const u8 gMailTiles_Shadow[]; -extern const u8 gMailTilemap_Shadow[]; -extern const u8 gMailTiles_Tropic[]; -extern const u8 gMailTilemap_Tropic[]; -extern const u8 gMailTiles_Dream[]; -extern const u8 gMailTilemap_Dream[]; -extern const u8 gMailTiles_Fab[]; -extern const u8 gMailTilemap_Fab[]; -extern const u8 gMailTiles_Retro[]; -extern const u8 gMailTilemap_Retro[]; - -// Static type declarations - -struct UnkMailStruct +// Bead and Dream mail feature an icon of the Pokémon holding it. +enum { + ICON_TYPE_NONE, + ICON_TYPE_BEAD, + ICON_TYPE_DREAM, +}; + +struct MailLineLayout { - u32 numEasyChatWords:2; - u32 xOffset:6; - u32 lineHeight:8; + u8 numEasyChatWords:2; + u8 xOffset:6; + u8 height; }; struct MailLayout { - u8 numSubStructs; + u8 numLines; u8 signatureYPos; u8 signatureWidth; - u8 wordsXPos; u8 wordsYPos; - const struct UnkMailStruct *var8; + u8 wordsXPos; + const struct MailLineLayout *lines; }; struct MailGraphics @@ -81,26 +50,25 @@ struct MailGraphics const u16 *palette; const u8 *tiles; const u8 *tileMap; - u16 var0C; - u16 var0E; - u16 color10; - u16 color12; + u32 unused; + u16 textColor; + u16 textShadow; }; struct MailRead { - /*0x0000*/ u8 strbuf[8][64]; + /*0x0000*/ u8 message[8][64]; /*0x0200*/ u8 playerName[12]; - /*0x020C*/ MainCallback callback; - /*0x0210*/ MainCallback callback2; + /*0x020C*/ MainCallback exitCallback; + /*0x0210*/ MainCallback callback; /*0x0214*/ struct MailStruct *mail; - /*0x0218*/ bool8 flag; + /*0x0218*/ bool8 hasText; /*0x0219*/ u8 signatureWidth; /*0x021a*/ u8 mailType; - /*0x021b*/ u8 animsActive; - /*0x021c*/ u8 monIconSprite; + /*0x021b*/ u8 iconType; + /*0x021c*/ u8 monIconSpriteId; /*0x021d*/ u8 language; - /*0x021e*/ bool8 playerIsSender; + /*0x021e*/ bool8 international; /*0x0220*/ u8 * (*parserSingle)(u8 *dest, u16 word); /*0x0224*/ u8 * (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2); /*0x0228*/ const struct MailLayout *layout; @@ -108,24 +76,18 @@ struct MailRead /*0x122c*/ u8 bg2TilemapBuffer[0x1000]; }; -// Static RAM declarations - static EWRAM_DATA struct MailRead *sMailRead = NULL; -// Static ROM declarations - static void CB2_InitMailRead(void); -static void sub_8121A1C(void); -static void sub_8121B1C(void); +static void BufferMailText(void); +static void PrintMailText(void); static void VBlankCB_MailRead(void); static void CB2_MailRead(void); static void CB2_WaitForPaletteExitOnKeyPress(void); static void CB2_ExitOnKeyPress(void); static void CB2_ExitMailReadFreeVars(void); -// .rodata - -static const struct BgTemplate sUnknown_0859F290[] = { +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, .charBaseIndex = 2, @@ -144,7 +106,7 @@ static const struct BgTemplate sUnknown_0859F290[] = { } }; -static const struct WindowTemplate sUnknown_0859F29C[] = { +static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, .tilemapLeft = 2, @@ -163,137 +125,377 @@ static const u8 sTextColors[] = { TEXT_DYNAMIC_COLOR_2 }; -static const u16 sUnknown_0859F2B0[][2] = { - { 0x6ACD, 0x51A5 }, - { 0x45FC, 0x38D4 } +// Background is alternating bars of a dark/light color. +// Either blue or red depending on player's gender +static const u16 sBgColors[GENDER_COUNT][2] = { + [MALE] = { RGB(13, 22, 26), RGB(5, 13, 20) }, + [FEMALE] = { RGB(28, 15, 17), RGB(20, 6, 14) } }; -static const struct MailGraphics sUnknown_0859F2B8[] = { - { - gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0, 0x294a, 0x6739 - }, { - gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0, 0x7fff, 0x4631 - }, { - gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0, 0x294a, 0x6739 - }, { - gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0, 0x7fff, 0x4631 - }, { - gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0, 0x7fff, 0x4631 - }, { - gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0, 0x294a, 0x6739 - }, { - gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0, 0x7fff, 0x4631 - }, { - gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0, 0x7fff, 0x4631 - }, { - gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0, 0x294a, 0x6739 - }, { - gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0, 0x294a, 0x6739 - }, { - gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0, 0x294a, 0x6739 - }, { - gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0, 0x294a, 0x6739 +static const struct MailGraphics sMailGraphics[] = { + [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { + .palette = gMailPalette_Orange, + .tiles = gMailTiles_Orange, + .tileMap = gMailTilemap_Orange, + .unused = 0x2C0, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), + }, + [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { + .palette = gMailPalette_Harbor, + .tiles = gMailTiles_Harbor, + .tileMap = gMailTilemap_Harbor, + .unused = 0x2E0, + .textColor = RGB_WHITE, + .textShadow = RGB(17, 17, 17), + }, + [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { + .palette = gMailPalette_Glitter, + .tiles = gMailTiles_Glitter, + .tileMap = gMailTilemap_Glitter, + .unused = 0x400, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), + }, + [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { + .palette = gMailPalette_Mech, + .tiles = gMailTiles_Mech, + .tileMap = gMailTilemap_Mech, + .unused = 0x1E0, + .textColor = RGB_WHITE, + .textShadow = RGB(17, 17, 17), + }, + [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { + .palette = gMailPalette_Wood, + .tiles = gMailTiles_Wood, + .tileMap = gMailTilemap_Wood, + .unused = 0x2E0, + .textColor = RGB_WHITE, + .textShadow = RGB(17, 17, 17), + }, + [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { + .palette = gMailPalette_Wave, + .tiles = gMailTiles_Wave, + .tileMap = gMailTilemap_Wave, + .unused = 0x300, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), + }, + [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { + .palette = gMailPalette_Bead, + .tiles = gMailTiles_Bead, + .tileMap = gMailTilemap_Bead, + .unused = 0x140, + .textColor = RGB_WHITE, + .textShadow = RGB(17, 17, 17), + }, + [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { + .palette = gMailPalette_Shadow, + .tiles = gMailTiles_Shadow, + .tileMap = gMailTilemap_Shadow, + .unused = 0x300, + .textColor = RGB_WHITE, + .textShadow = RGB(17, 17, 17), + }, + [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { + .palette = gMailPalette_Tropic, + .tiles = gMailTiles_Tropic, + .tileMap = gMailTilemap_Tropic, + .unused = 0x220, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), + }, + [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { + .palette = gMailPalette_Dream, + .tiles = gMailTiles_Dream, + .tileMap = gMailTilemap_Dream, + .unused = 0x340, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), + }, + [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { + .palette = gMailPalette_Fab, + .tiles = gMailTiles_Fab, + .tileMap = gMailTilemap_Fab, + .unused = 0x2a0, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), + }, + [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { + .palette = gMailPalette_Retro, + .tiles = gMailTiles_Retro, + .tileMap = gMailTilemap_Retro, + .unused = 0x520, + .textColor = RGB(10, 10, 10), + .textShadow = RGB(25, 25, 25), } }; -static const struct UnkMailStruct Unknown_0859F3A8[] = { - { .numEasyChatWords = 3, .lineHeight = 16 }, - { .numEasyChatWords = 3, .lineHeight = 16 }, - { .numEasyChatWords = 3, .lineHeight = 16 } +static const struct MailLineLayout sLineLayouts_Wide[] = { + { .numEasyChatWords = 3, .xOffset = 0, .height = 16 }, + { .numEasyChatWords = 3, .xOffset = 0, .height = 16 }, + { .numEasyChatWords = 3, .xOffset = 0, .height = 16 } }; -static const struct MailLayout sUnknown_0859F3B4[] = { - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x08, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x02, 0x00, Unknown_0859F3A8 } +static const struct MailLayout sMailLayouts_Wide[] = { + [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 8, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 4, + .lines = sLineLayouts_Wide, + }, + [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Wide), + .signatureYPos = 0, + .signatureWidth = 0, + .wordsYPos = 2, + .wordsXPos = 0, + .lines = sLineLayouts_Wide, + }, }; -static const struct UnkMailStruct Unknown_0859F444[] = { - { .numEasyChatWords = 2, .lineHeight = 16 }, - { .numEasyChatWords = 2, .lineHeight = 16 }, - { .numEasyChatWords = 2, .lineHeight = 16 }, - { .numEasyChatWords = 2, .lineHeight = 16 }, - { .numEasyChatWords = 1, .lineHeight = 16 } +static const struct MailLineLayout sLineLayouts_Tall[] = { + { .numEasyChatWords = 2, .xOffset = 0, .height = 16 }, + { .numEasyChatWords = 2, .xOffset = 0, .height = 16 }, + { .numEasyChatWords = 2, .xOffset = 0, .height = 16 }, + { .numEasyChatWords = 2, .xOffset = 0, .height = 16 }, + { .numEasyChatWords = 1, .xOffset = 0, .height = 16 } }; -static const struct MailLayout sUnknown_0859F458[] = { - { 0x05, 0x07, 0x58, 0x0b, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0c, 0x68, 0x05, 0x1e, Unknown_0859F444 }, - { 0x05, 0x05, 0x60, 0x08, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x70, 0x05, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0c, 0x68, 0x09, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0d, 0x68, 0x0d, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x60, 0x09, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x60, 0x09, 0x1e, Unknown_0859F444 }, - { 0x05, 0x11, 0x68, 0x0f, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x60, 0x05, 0x1e, Unknown_0859F444 } +static const struct MailLayout sMailLayouts_Tall[] = { + [ITEM_TO_MAIL(ITEM_ORANGE_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 7, + .signatureWidth = 88, + .wordsYPos = 11, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_HARBOR_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 10, + .signatureWidth = 96, + .wordsYPos = 9, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_GLITTER_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 12, + .signatureWidth = 104, + .wordsYPos = 5, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_MECH_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 5, + .signatureWidth = 96, + .wordsYPos = 8, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_WOOD_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 10, + .signatureWidth = 96, + .wordsYPos = 9, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_WAVE_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 9, + .signatureWidth = 112, + .wordsYPos = 5, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_BEAD_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 12, + .signatureWidth = 104, + .wordsYPos = 9, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_SHADOW_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 13, + .signatureWidth = 104, + .wordsYPos = 13, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_TROPIC_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 9, + .signatureWidth = 96, + .wordsYPos = 9, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_DREAM_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 9, + .signatureWidth = 96, + .wordsYPos = 9, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_FAB_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 17, + .signatureWidth = 104, + .wordsYPos = 15, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, + [ITEM_TO_MAIL(ITEM_RETRO_MAIL)] = { + .numLines = ARRAY_COUNT(sLineLayouts_Tall), + .signatureYPos = 9, + .signatureWidth = 96, + .wordsYPos = 5, + .wordsXPos = 30, + .lines = sLineLayouts_Tall, + }, }; -// .text - -void ReadMail(struct MailStruct *mail, void (*callback)(void), bool8 flag) +void ReadMail(struct MailStruct *mail, void (*exitCallback)(void), bool8 hasText) { u16 buffer[2]; u16 species; sMailRead = calloc(1, sizeof(*sMailRead)); - sMailRead->language = LANGUAGE_ENGLISH; - sMailRead->playerIsSender = TRUE; + sMailRead->language = GAME_LANGUAGE; + sMailRead->international = TRUE; sMailRead->parserSingle = CopyEasyChatWord; sMailRead->parserMultiple = ConvertEasyChatWordsToString; if (IS_ITEM_MAIL(mail->itemId)) { - sMailRead->mailType = mail->itemId - ITEM_ORANGE_MAIL; + sMailRead->mailType = ITEM_TO_MAIL(mail->itemId); } else { - sMailRead->mailType = 0; - flag = FALSE; + sMailRead->mailType = ITEM_TO_MAIL(FIRST_MAIL_INDEX); + hasText = FALSE; } - switch (sMailRead->playerIsSender) + switch (sMailRead->international) { - case FALSE: - default: - sMailRead->layout = &sUnknown_0859F3B4[sMailRead->mailType]; - break; - case TRUE: - sMailRead->layout = &sUnknown_0859F458[sMailRead->mailType]; - break; + case FALSE: + default: + // Never reached. JP only? + sMailRead->layout = &sMailLayouts_Wide[sMailRead->mailType]; + break; + case TRUE: + sMailRead->layout = &sMailLayouts_Tall[sMailRead->mailType]; + break; } species = MailSpeciesToSpecies(mail->species, buffer); - if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES) + if (species > SPECIES_NONE && species < NUM_SPECIES) { switch (sMailRead->mailType) { - default: - sMailRead->animsActive = 0; - break; - case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL: - sMailRead->animsActive = 1; - break; - case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL: - sMailRead->animsActive = 2; - break; + default: + sMailRead->iconType = ICON_TYPE_NONE; + break; + case ITEM_TO_MAIL(ITEM_BEAD_MAIL): + sMailRead->iconType = ICON_TYPE_BEAD; + break; + case ITEM_TO_MAIL(ITEM_DREAM_MAIL): + sMailRead->iconType = ICON_TYPE_DREAM; + break; } } else { - sMailRead->animsActive = 0; + sMailRead->iconType = ICON_TYPE_NONE; } sMailRead->mail = mail; - sMailRead->callback = callback; - sMailRead->flag = flag; + sMailRead->exitCallback = exitCallback; + sMailRead->hasText = hasText; SetMainCallback2(CB2_InitMailRead); } @@ -336,16 +538,16 @@ static bool8 MailReadBuildGraphics(void) break; case 6: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_0859F290, 3); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sMailRead->bg1TilemapBuffer); SetBgTilemapBuffer(2, sMailRead->bg2TilemapBuffer); break; case 7: - InitWindows(sUnknown_0859F29C); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); break; case 8: - DecompressAndCopyTileDataToVram(1, sUnknown_0859F2B8[sMailRead->mailType].tiles, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sMailGraphics[sMailRead->mailType].tiles, 0, 0, 0); break; case 9: if (FreeTempTileDataBuffersIfPossible()) @@ -356,7 +558,7 @@ static bool8 MailReadBuildGraphics(void) case 10: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); FillBgTilemapBufferRect_Palette0(2, 1, 0, 0, 30, 20); - CopyToBgTilemapBuffer(1, sUnknown_0859F2B8[sMailRead->mailType].tileMap, 0, 0); + CopyToBgTilemapBuffer(1, sMailGraphics[sMailRead->mailType].tileMap, 0, 0); break; case 11: CopyBgTilemapBufferToVram(0); @@ -365,31 +567,33 @@ static bool8 MailReadBuildGraphics(void) break; case 12: LoadPalette(GetOverworldTextboxPalettePtr(), 240, 32); - gPlttBufferUnfaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10; - gPlttBufferFaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10; - gPlttBufferUnfaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12; - gPlttBufferFaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12; - LoadPalette(sUnknown_0859F2B8[sMailRead->mailType].palette, 0, 32); - gPlttBufferUnfaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; - gPlttBufferFaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; - gPlttBufferUnfaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; - gPlttBufferFaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; + + gPlttBufferUnfaded[250] = sMailGraphics[sMailRead->mailType].textColor; + gPlttBufferFaded[250] = sMailGraphics[sMailRead->mailType].textColor; + gPlttBufferUnfaded[251] = sMailGraphics[sMailRead->mailType].textShadow; + gPlttBufferFaded[251] = sMailGraphics[sMailRead->mailType].textShadow; + LoadPalette(sMailGraphics[sMailRead->mailType].palette, 0, 32); + + gPlttBufferUnfaded[10] = sBgColors[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferFaded[10] = sBgColors[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferUnfaded[11] = sBgColors[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferFaded[11] = sBgColors[gSaveBlock2Ptr->playerGender][1]; break; case 13: - if (sMailRead->flag) + if (sMailRead->hasText) { - sub_8121A1C(); + BufferMailText(); } break; case 14: - if (sMailRead->flag) + if (sMailRead->hasText) { - sub_8121B1C(); + PrintMailText(); RunTextPrinters(); } break; case 15: - if (sub_8087598() == TRUE) + if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE) { return FALSE; } @@ -399,17 +603,17 @@ static bool8 MailReadBuildGraphics(void) gPaletteFade.bufferTransferDisabled = TRUE; break; case 17: - icon = sub_80D2E84(sMailRead->mail->species); - switch (sMailRead->animsActive) + icon = GetIconSpeciesNoPersonality(sMailRead->mail->species); + switch (sMailRead->iconType) { - case 1: - LoadMonIconPalette(icon); - sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); - break; - case 2: - LoadMonIconPalette(icon); - sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); - break; + case ICON_TYPE_BEAD: + LoadMonIconPalette(icon); + sMailRead->monIconSpriteId = CreateMonIconNoPersonality(icon, SpriteCallbackDummy, 96, 128, 0, FALSE); + break; + case ICON_TYPE_DREAM: + LoadMonIconPalette(icon); + sMailRead->monIconSpriteId = CreateMonIconNoPersonality(icon, SpriteCallbackDummy, 40, 128, 0, FALSE); + break; } break; case 18: @@ -417,9 +621,9 @@ static bool8 MailReadBuildGraphics(void) ShowBg(0); ShowBg(1); ShowBg(2); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = FALSE; - sMailRead->callback2 = CB2_WaitForPaletteExitOnKeyPress; + sMailRead->callback = CB2_WaitForPaletteExitOnKeyPress; return TRUE; default: return FALSE; @@ -440,35 +644,39 @@ static void CB2_InitMailRead(void) } while (MenuHelpers_LinkSomething() != TRUE); } -static void sub_8121A1C(void) +static void BufferMailText(void) { u16 i; - u8 total; + u8 numWords; u8 *ptr; - total = 0; - for (i = 0; i < sMailRead->layout->numSubStructs; i ++) + // Convert the easy chat words to strings line by line and buffer them to message + numWords = 0; + for (i = 0; i < sMailRead->layout->numLines; i ++) { - ConvertEasyChatWordsToString(sMailRead->strbuf[i], &sMailRead->mail->words[total], sMailRead->layout->var8[i].numEasyChatWords, 1); - total += sMailRead->layout->var8[i].numEasyChatWords; + ConvertEasyChatWordsToString(sMailRead->message[i], &sMailRead->mail->words[numWords], sMailRead->layout->lines[i].numEasyChatWords, 1); + numWords += sMailRead->layout->lines[i].numEasyChatWords; } + + // Buffer the signature ptr = StringCopy(sMailRead->playerName, sMailRead->mail->playerName); - if (!sMailRead->playerIsSender) + if (!sMailRead->international) { - StringCopy(ptr, gText_FromSpace); - sMailRead->signatureWidth = sMailRead->layout->signatureWidth - (StringLength(sMailRead->playerName) * 8 - 0x60); + // Never reached + StringCopy(ptr, gText_FromSpace); // Odd, "From" text is already printed in PrintMailText + sMailRead->signatureWidth = sMailRead->layout->signatureWidth - (StringLength(sMailRead->playerName) * 8 - 96); } else { - sub_81DB52C(sMailRead->playerName); + ConvertInternationalPlayerName(sMailRead->playerName); sMailRead->signatureWidth = sMailRead->layout->signatureWidth; } } -static void sub_8121B1C(void) +static void PrintMailText(void) { u16 i; - u8 strbuf[0x20]; + u8 signature[32]; u8 y; u8 *bufptr; s32 box_x; @@ -479,20 +687,19 @@ static void sub_8121B1C(void) PutWindowTilemap(1); FillWindowPixelBuffer(0, PIXEL_FILL(0)); FillWindowPixelBuffer(1, PIXEL_FILL(0)); - for (i = 0; i < sMailRead->layout->numSubStructs; i ++) + for (i = 0; i < sMailRead->layout->numLines; i ++) { - if (sMailRead->strbuf[i][0] == EOS || sMailRead->strbuf[i][0] == CHAR_SPACE) - { + if (sMailRead->message[i][0] == EOS || sMailRead->message[i][0] == CHAR_SPACE) continue; - } - AddTextPrinterParameterized3(0, 1, sMailRead->layout->var8[i].xOffset + sMailRead->layout->wordsYPos, y + sMailRead->layout->wordsXPos, sTextColors, 0, sMailRead->strbuf[i]); - y += sMailRead->layout->var8[i].lineHeight; + + AddTextPrinterParameterized3(0, 1, sMailRead->layout->lines[i].xOffset + sMailRead->layout->wordsXPos, y + sMailRead->layout->wordsYPos, sTextColors, 0, sMailRead->message[i]); + y += sMailRead->layout->lines[i].height; } - bufptr = StringCopy(strbuf, gText_FromSpace); + bufptr = StringCopy(signature, gText_FromSpace); StringCopy(bufptr, sMailRead->playerName); - box_x = GetStringCenterAlignXOffset(1, strbuf, sMailRead->signatureWidth) + 0x68; - box_y = sMailRead->layout->signatureYPos + 0x58; - AddTextPrinterParameterized3(0, 1, box_x, box_y, sTextColors, 0, strbuf); + box_x = GetStringCenterAlignXOffset(1, signature, sMailRead->signatureWidth) + 104; + box_y = sMailRead->layout->signatureYPos + 88; + AddTextPrinterParameterized3(0, 1, box_x, box_y, sTextColors, 0, signature); CopyWindowToVram(0, 3); CopyWindowToVram(1, 3); } @@ -506,19 +713,19 @@ static void VBlankCB_MailRead(void) static void CB2_MailRead(void) { - if (sMailRead->animsActive != 0) + if (sMailRead->iconType != ICON_TYPE_NONE) { AnimateSprites(); BuildOamBuffer(); } - sMailRead->callback2(); + sMailRead->callback(); } static void CB2_WaitForPaletteExitOnKeyPress(void) { if (!UpdatePaletteFade()) { - sMailRead->callback2 = CB2_ExitOnKeyPress; + sMailRead->callback = CB2_ExitOnKeyPress; } } @@ -526,8 +733,8 @@ static void CB2_ExitOnKeyPress(void) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sMailRead->callback2 = CB2_ExitMailReadFreeVars; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sMailRead->callback = CB2_ExitMailReadFreeVars; } } @@ -535,13 +742,13 @@ static void CB2_ExitMailReadFreeVars(void) { if (!UpdatePaletteFade()) { - SetMainCallback2(sMailRead->callback); - switch (sMailRead->animsActive) + SetMainCallback2(sMailRead->exitCallback); + switch (sMailRead->iconType) { - case 1: - case 2: - FreeMonIconPalette(sub_80D2E84(sMailRead->mail->species)); - FreeAndDestroyMonIconSprite(&gSprites[sMailRead->monIconSprite]); + case ICON_TYPE_BEAD: + case ICON_TYPE_DREAM: + FreeMonIconPalette(GetIconSpeciesNoPersonality(sMailRead->mail->species)); + FreeAndDestroyMonIconSprite(&gSprites[sMailRead->monIconSpriteId]); } memset(sMailRead, 0, sizeof(*sMailRead)); ResetPaletteFade(); diff --git a/src/mail_data.c b/src/mail_data.c index e0553af99..2ae9bedab 100644 --- a/src/mail_data.c +++ b/src/mail_data.c @@ -5,6 +5,7 @@ #include "pokemon_icon.h" #include "text.h" #include "international_string_util.h" +#include "constants/easy_chat.h" void ClearMailData(void) { @@ -19,12 +20,12 @@ void ClearMailStruct(struct MailStruct *mail) s32 i; for (i = 0; i < MAIL_WORDS_COUNT; i++) - mail->words[i] = 0xFFFF; + mail->words[i] = EC_EMPTY_WORD; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) mail->playerName[i] = EOS; - for (i = 0; i < 4; i++) + for (i = 0; i < TRAINER_ID_LENGTH; i++) mail->trainerId[i] = 0; mail->species = SPECIES_BULBASAUR; @@ -34,7 +35,7 @@ void ClearMailStruct(struct MailStruct *mail) bool8 MonHasMail(struct Pokemon *mon) { u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); - if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != MAIL_NONE) return TRUE; else return FALSE; @@ -52,12 +53,12 @@ u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) for (id = 0; id < PARTY_SIZE; id++) { - if (gSaveBlock1Ptr->mail[id].itemId == 0) + if (gSaveBlock1Ptr->mail[id].itemId == ITEM_NONE) { for (i = 0; i < MAIL_WORDS_COUNT; i++) - gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF; + gSaveBlock1Ptr->mail[id].words[i] = EC_EMPTY_WORD; - for (i = 0; i < PLAYER_NAME_LENGTH + 1 - 1; i++) + for (i = 0; i < PLAYER_NAME_LENGTH; i++) gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i]; gSaveBlock1Ptr->mail[id].playerName[i] = EOS; PadNameString(gSaveBlock1Ptr->mail[id].playerName, CHAR_SPACE); @@ -75,7 +76,7 @@ u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) } } - return 0xFF; + return MAIL_NONE; } u16 SpeciesToMailSpecies(u16 species, u32 personality) @@ -93,7 +94,7 @@ u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer) { u16 result; - if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT)) + if (mailSpecies >= 30000 && mailSpecies < (30000 + NUM_UNOWN_FORMS)) { result = SPECIES_UNOWN; *buffer = mailSpecies - 30000; @@ -112,8 +113,8 @@ u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) u16 itemId = mail->itemId; u8 mailId = GiveMailToMon(mon, itemId); - if (mailId == 0xFF) - return 0xFF; + if (mailId == MAIL_NONE) + return MAIL_NONE; gSaveBlock1Ptr->mail[mailId] = *mail; @@ -141,7 +142,7 @@ void TakeMailFromMon(struct Pokemon *mon) { mailId = GetMonData(mon, MON_DATA_MAIL); gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; - mailId = 0xFF; + mailId = MAIL_NONE; heldItem[0] = ITEM_NONE; heldItem[1] = ITEM_NONE << 8; SetMonData(mon, MON_DATA_MAIL, &mailId); @@ -162,7 +163,7 @@ u8 TakeMailFromMon2(struct Pokemon *mon) newHeldItem[0] = ITEM_NONE; newHeldItem[1] = ITEM_NONE << 8; - newMailId = 0xFF; + newMailId = MAIL_NONE; for (i = PARTY_SIZE; i < MAIL_COUNT; i++) { @@ -176,7 +177,7 @@ u8 TakeMailFromMon2(struct Pokemon *mon) } } - return 0xFF; + return MAIL_NONE; } bool8 ItemIsMail(u16 itemId) diff --git a/src/main.c b/src/main.c index 9fd1d0a35..3125716e2 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ #include "intro.h" #include "main.h" #include "trainer_hill.h" +#include "constants/rgb.h" static void VBlankIntr(void); static void HBlankIntr(void); @@ -75,7 +76,7 @@ static EWRAM_DATA u16 gTrainerId = 0; static void UpdateLinkAndCallCallbacks(void); static void InitMainCallbacks(void); static void CallCallbacks(void); -//static void SeedRngWithRtc(void); +static void SeedRngWithRtc(void); static void ReadKeys(void); void InitIntrHandlers(void); static void WaitForVBlank(void); @@ -90,7 +91,7 @@ void AgbMain() #if !MODERN RegisterRamReset(RESET_ALL); #endif //MODERN - *(vu16 *)BG_PLTT = 0x7FFF; + *(vu16 *)BG_PLTT = RGB_WHITE; // Set the backdrop to white on startup InitGpuRegManager(); REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; InitKeys(); @@ -102,7 +103,9 @@ void AgbMain() CheckForFlashMemory(); InitMainCallbacks(); InitMapMusic(); - //SeedRngWithRtc(); see comment at SeedRngWithRtc declaration below +#ifdef BUGFIX + SeedRngWithRtc(); // see comment at SeedRngWithRtc definition below +#endif ClearDma3Requests(); ResetBgs(); SetDefaultFontsPointer(); @@ -129,7 +132,7 @@ void AgbMain() DoSoftReset(); } - if (sub_8087634() == 1) + if (Overworld_SendKeysToLinkIsRunning() == TRUE) { gLinkTransferringData = TRUE; UpdateLinkAndCallCallbacks(); @@ -140,7 +143,7 @@ void AgbMain() gLinkTransferringData = FALSE; UpdateLinkAndCallCallbacks(); - if (sub_80875C8() == 1) + if (Overworld_RecvKeysFromLinkIsRunning() == TRUE) { gMain.newKeys = 0; ClearSpriteCopyRequests(); @@ -213,13 +216,15 @@ void EnableVCountIntrAtLine150(void) EnableInterrupts(INTR_FLAG_VCOUNT); } -// oops! FRLG commented this out to remove RTC, however Emerald didnt undo this! -//static void SeedRngWithRtc(void) -//{ -// u32 seed = RtcGetMinuteCount(); -// seed = (seed >> 16) ^ (seed & 0xFFFF); -// SeedRng(seed); -//} +// FRLG commented this out to remove RTC, however Emerald didn't undo this! +#ifdef BUGFIX +static void SeedRngWithRtc(void) +{ + u32 seed = RtcGetMinuteCount(); + seed = (seed >> 16) ^ (seed & 0xFFFF); + SeedRng(seed); +} +#endif void InitKeys(void) { @@ -294,7 +299,7 @@ void InitIntrHandlers(void) REG_IME = 1; - EnableInterrupts(0x1); + EnableInterrupts(INTR_FLAG_VBLANK); } void SetVBlankCallback(IntrCallback callback) @@ -346,7 +351,7 @@ static void VBlankIntr(void) gPcmDmaCounter = gSoundInfo.pcmDmaCounter; m4aSoundMain(); - sub_8033648(); + TryReceiveLinkBattleData(); if (!gMain.inBattle || !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED))) Random(); diff --git a/src/main_menu.c b/src/main_menu.c index 5b39b6d45..38e7648d0 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -28,7 +28,6 @@ #include "scanline_effect.h" #include "sound.h" #include "sprite.h" -#include "string.h" #include "strings.h" #include "string_util.h" #include "task.h" @@ -582,9 +581,9 @@ static u32 InitMainMenu(bool8 returningFromOptionsMenu) ResetSpriteData(); FreeAllSpritePalettes(); if (returningFromOptionsMenu) - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); // fade to black + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); // fade to black else - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_WHITEALPHA); // fade to white + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_WHITEALPHA); // fade to white ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sMainMenuBgTemplates, ARRAY_COUNT(sMainMenuBgTemplates)); ChangeBgX(0, 0, 0); @@ -890,15 +889,15 @@ static bool8 HandleMainMenuInput(u8 taskId) { PlaySE(SE_SELECT); IsWirelessAdapterConnected(); // why bother calling this here? debug? Task_HandleMainMenuAPressed will check too - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_HandleMainMenuAPressed; } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 240)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 160)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT)); gTasks[taskId].func = Task_HandleMainMenuBPressed; } else if ((JOY_NEW(DPAD_UP)) && tCurrItem > 0) @@ -1096,7 +1095,7 @@ static void Task_HandleMainMenuAPressed(u8 taskId) SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); return; } FreeAllWindowBuffers(); @@ -1153,7 +1152,7 @@ static void Task_DisplayMainMenuInvalidActionError(u8 taskId) if (JOY_NEW(A_BUTTON | B_BUTTON)) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_HandleMainMenuBPressed; } } @@ -1285,10 +1284,10 @@ static void Task_NewGameBirchSpeech_Init(u8 taskId) FreeAllSpritePalettes(); ResetAllPicSprites(); AddBirchSpeechObjects(taskId); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gTasks[taskId].tBG1HOFS = 0; gTasks[taskId].func = Task_NewGameBirchSpeech_WaitToShowBirch; - gTasks[taskId].tPlayerSpriteId = 0xFF; + gTasks[taskId].tPlayerSpriteId = SPRITE_NONE; gTasks[taskId].data[3] = 0xFF; gTasks[taskId].tTimer = 0xD8; PlayBGM(MUS_ROUTE122); @@ -1388,11 +1387,9 @@ static void Task_NewGameBirchSpeechSub_WaitForLotad(u8 taskId) switch (tState) { case 0: - if (sprite->callback == SpriteCallbackDummy) - { - sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - goto incrementStateAndTimer; - } + if (sprite->callback != SpriteCallbackDummy) + return; + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; break; case 1: if (gTasks[sBirchSpeechMainTaskId].tTimer >= 96) @@ -1401,14 +1398,11 @@ static void Task_NewGameBirchSpeechSub_WaitForLotad(u8 taskId) if (gTasks[sBirchSpeechMainTaskId].tTimer < 0x4000) gTasks[sBirchSpeechMainTaskId].tTimer++; } - break; - incrementStateAndTimer: - default: - tState++; - if (gTasks[sBirchSpeechMainTaskId].tTimer < 0x4000) - gTasks[sBirchSpeechMainTaskId].tTimer++; - break; + return; } + tState++; + if (gTasks[sBirchSpeechMainTaskId].tTimer < 0x4000) + gTasks[sBirchSpeechMainTaskId].tTimer++; } #undef tState @@ -1548,7 +1542,7 @@ static void Task_NewGameBirchSpeech_SlideOutOldGenderSprite(u8 taskId) spriteId = gTasks[taskId].tMaySpriteId; else spriteId = gTasks[taskId].tBrendanSpriteId; - gSprites[spriteId].pos1.x = 240; + gSprites[spriteId].pos1.x = DISPLAY_WIDTH; gSprites[spriteId].pos1.y = 60; gSprites[spriteId].invisible = FALSE; gTasks[taskId].tPlayerSpriteId = spriteId; @@ -1595,7 +1589,7 @@ static void Task_NewGameBirchSpeech_WaitPressBeforeNameChoice(u8 taskId) { if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(B_BUTTON))) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_NewGameBirchSpeech_StartNamingScreen; } } @@ -1750,7 +1744,7 @@ static void Task_NewGameBirchSpeech_ShrinkPlayer(u8 taskId) InitSpriteAffineAnim(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], 0); gSprites[spriteId].callback = SpriteCB_MovePlayerDownWhileShrinking; - BeginNormalPaletteFade(0x0000FFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_BG, 0, 0, 16, RGB_BLACK); FadeOutBGM(4); gTasks[taskId].func = Task_NewGameBirchSpeech_WaitForPlayerShrink; } @@ -1774,7 +1768,7 @@ static void Task_NewGameBirchSpeech_FadePlayerToWhite(u8 taskId) spriteId = gTasks[taskId].tPlayerSpriteId; gSprites[spriteId].callback = SpriteCB_Null; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); - BeginNormalPaletteFade(0xFFFF0000, 0, 0, 16, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_OBJECTS, 0, 0, 16, RGB_WHITEALPHA); gTasks[taskId].func = Task_NewGameBirchSpeech_Cleanup; } } @@ -1800,7 +1794,7 @@ static void CB2_NewGameBirchSpeech_ReturnFromNamingScreen(void) ResetBgsAndClearDma3BusyFlags(0); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); - InitBgsFromTemplates(0, sMainMenuBgTemplates, 2); + InitBgsFromTemplates(0, sMainMenuBgTemplates, ARRAY_COUNT(sMainMenuBgTemplates)); InitBgFromTemplate(&sBirchBgTemplate); SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_BG2CNT, 0); @@ -1844,7 +1838,7 @@ static void CB2_NewGameBirchSpeech_ReturnFromNamingScreen(void) gSprites[spriteId].invisible = FALSE; gTasks[taskId].tPlayerSpriteId = spriteId; SetGpuReg(REG_OFFSET_BG1HOFS, -60); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); @@ -2098,7 +2092,7 @@ static void NewGameBirchSpeech_ShowGenderMenu(void) { DrawMainMenuWindowBorder(&gNewGameBirchSpeechTextWindows[1], 0xF3); FillWindowPixelBuffer(1, PIXEL_FILL(1)); - PrintMenuTable(1, 2, sMenuActions_Gender); + PrintMenuTable(1, ARRAY_COUNT(sMenuActions_Gender), sMenuActions_Gender); InitMenuInUpperLeftCornerPlaySoundWhenAPressed(1, 2, 0); PutWindowTilemap(1); CopyWindowToVram(1, 3); @@ -2118,9 +2112,9 @@ static void NewGameBirchSpeech_SetDefaultPlayerName(u8 nameId) name = gMalePresetNames[nameId]; else name = gFemalePresetNames[nameId]; - for (i = 0; i < 7; i++) + for (i = 0; i < PLAYER_NAME_LENGTH; i++) gSaveBlock2Ptr->playerName[i] = name[i]; - gSaveBlock2Ptr->playerName[7] = 0xFF; + gSaveBlock2Ptr->playerName[PLAYER_NAME_LENGTH] = EOS; } static void CreateMainMenuErrorWindow(const u8* str) @@ -2130,8 +2124,8 @@ static void CreateMainMenuErrorWindow(const u8* str) PutWindowTilemap(7); CopyWindowToVram(7, 2); DrawMainMenuWindowBorder(&sWindowTemplates_MainMenu[7], MAIN_MENU_BORDER_TILE); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(9, 231)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(113, 159)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(9, DISPLAY_WIDTH - 9)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(113, DISPLAY_HEIGHT - 1)); } static void MainMenu_FormatSavegameText(void) diff --git a/src/map_name_popup.c b/src/map_name_popup.c index 8939edd90..cd92bbac1 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -36,37 +36,37 @@ static void LoadMapNamePopUpWindowBg(void); static EWRAM_DATA u8 sPopupTaskId = 0; // .rodata -static const u8 gMapPopUp_Table[][960] = +static const u8 sMapPopUp_Table[][960] = { - INCBIN_U8("graphics/interface/map_popup/wood.4bpp"), - INCBIN_U8("graphics/interface/map_popup/marble.4bpp"), - INCBIN_U8("graphics/interface/map_popup/stone.4bpp"), - INCBIN_U8("graphics/interface/map_popup/brick.4bpp"), - INCBIN_U8("graphics/interface/map_popup/underwater.4bpp"), - INCBIN_U8("graphics/interface/map_popup/stone2.4bpp"), + [MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/interface/map_popup/wood.4bpp"), + [MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/interface/map_popup/marble.4bpp"), + [MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/interface/map_popup/stone.4bpp"), + [MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/interface/map_popup/brick.4bpp"), + [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/interface/map_popup/underwater.4bpp"), + [MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/interface/map_popup/stone2.4bpp"), }; -static const u8 gMapPopUp_Outline_Table[][960] = +static const u8 sMapPopUp_OutlineTable[][960] = { - INCBIN_U8("graphics/interface/map_popup/wood_outline.4bpp"), - INCBIN_U8("graphics/interface/map_popup/marble_outline.4bpp"), - INCBIN_U8("graphics/interface/map_popup/stone_outline.4bpp"), - INCBIN_U8("graphics/interface/map_popup/brick_outline.4bpp"), - INCBIN_U8("graphics/interface/map_popup/underwater_outline.4bpp"), - INCBIN_U8("graphics/interface/map_popup/stone2_outline.4bpp"), + [MAPPOPUP_THEME_WOOD] = INCBIN_U8("graphics/interface/map_popup/wood_outline.4bpp"), + [MAPPOPUP_THEME_MARBLE] = INCBIN_U8("graphics/interface/map_popup/marble_outline.4bpp"), + [MAPPOPUP_THEME_STONE] = INCBIN_U8("graphics/interface/map_popup/stone_outline.4bpp"), + [MAPPOPUP_THEME_BRICK] = INCBIN_U8("graphics/interface/map_popup/brick_outline.4bpp"), + [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U8("graphics/interface/map_popup/underwater_outline.4bpp"), + [MAPPOPUP_THEME_STONE2] = INCBIN_U8("graphics/interface/map_popup/stone2_outline.4bpp"), }; -static const u16 gMapPopUp_Palette_Table[][16] = +static const u16 sMapPopUp_PaletteTable[][16] = { - INCBIN_U16("graphics/interface/map_popup/wood.gbapal"), - INCBIN_U16("graphics/interface/map_popup/marble_outline.gbapal"), - INCBIN_U16("graphics/interface/map_popup/stone_outline.gbapal"), - INCBIN_U16("graphics/interface/map_popup/brick_outline.gbapal"), - INCBIN_U16("graphics/interface/map_popup/underwater_outline.gbapal"), - INCBIN_U16("graphics/interface/map_popup/stone2_outline.gbapal"), + [MAPPOPUP_THEME_WOOD] = INCBIN_U16("graphics/interface/map_popup/wood.gbapal"), + [MAPPOPUP_THEME_MARBLE] = INCBIN_U16("graphics/interface/map_popup/marble_outline.gbapal"), + [MAPPOPUP_THEME_STONE] = INCBIN_U16("graphics/interface/map_popup/stone_outline.gbapal"), + [MAPPOPUP_THEME_BRICK] = INCBIN_U16("graphics/interface/map_popup/brick_outline.gbapal"), + [MAPPOPUP_THEME_UNDERWATER] = INCBIN_U16("graphics/interface/map_popup/underwater_outline.gbapal"), + [MAPPOPUP_THEME_STONE2] = INCBIN_U16("graphics/interface/map_popup/stone2_outline.gbapal"), }; -static const u16 gUnknown_0857F444[16] = INCBIN_U16("graphics/interface/map_popup/857F444.gbapal"); +static const u16 sMapPopUp_Palette_Underwater[16] = INCBIN_U16("graphics/interface/map_popup/underwater.gbapal"); static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] = { @@ -197,8 +197,8 @@ static const u8 * const gBattlePyramid_MapHeaderStrings[] = gText_Pyramid, }; -// text -bool8 sub_80D47D4(void) +// Unused +static bool8 StartMenu_ShowMapNamePopup(void) { HideStartMenu(); ShowMapNamePopup(); @@ -333,24 +333,36 @@ static void ShowMapNamePopUpWindow(void) CopyWindowToVram(GetMapNamePopUpWindowId(), 3); } -static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused) +#define TILE_TOP_EDGE_START 0x21D +#define TILE_TOP_EDGE_END 0x228 +#define TILE_LEFT_EDGE_TOP 0x229 +#define TILE_RIGHT_EDGE_TOP 0x22A +#define TILE_LEFT_EDGE_MID 0x22B +#define TILE_RIGHT_EDGE_MID 0x22C +#define TILE_LEFT_EDGE_BOT 0x22D +#define TILE_RIGHT_EDGE_BOT 0x22E +#define TILE_BOT_EDGE_START 0x22F +#define TILE_BOT_EDGE_END 0x23A + +static void DrawMapNamePopUpFrame(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused) { s32 i; - for (i = 0; i < 12; i++) - { - FillBgTilemapBufferRect(bg, 0x21D + i, i - 1 + x, y - 1, 1, 1, 0xE); - } - FillBgTilemapBufferRect(bg, 0x229, x - 1, y, 1, 1, 0xE); - FillBgTilemapBufferRect(bg, 0x22A, deltaX + x, y, 1, 1, 0xE); - FillBgTilemapBufferRect(bg, 0x22B, x - 1, y + 1 , 1, 1, 0xE); - FillBgTilemapBufferRect(bg, 0x22C, deltaX + x, y + 1, 1, 1, 0xE); - FillBgTilemapBufferRect(bg, 0x22D, x - 1, y + 2, 1, 1, 0xE); - FillBgTilemapBufferRect(bg, 0x22E, deltaX + x, y + 2, 1, 1, 0xE); - for (i = 0; i < 12; i++) - { - FillBgTilemapBufferRect(bg, 0x22F + i, i - 1 + x, y + deltaY, 1, 1, 0xE); - } + // Draw top edge + for (i = 0; i < 1 + TILE_TOP_EDGE_END - TILE_TOP_EDGE_START; i++) + FillBgTilemapBufferRect(bg, TILE_TOP_EDGE_START + i, i - 1 + x, y - 1, 1, 1, 14); + + // Draw sides + FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_TOP, x - 1, y, 1, 1, 14); + FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_TOP, deltaX + x, y, 1, 1, 14); + FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_MID, x - 1, y + 1, 1, 1, 14); + FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_MID, deltaX + x, y + 1, 1, 1, 14); + FillBgTilemapBufferRect(bg, TILE_LEFT_EDGE_BOT, x - 1, y + 2, 1, 1, 14); + FillBgTilemapBufferRect(bg, TILE_RIGHT_EDGE_BOT, deltaX + x, y + 2, 1, 1, 14); + + // Draw bottom edge + for (i = 0; i < 1 + TILE_BOT_EDGE_END - TILE_BOT_EDGE_START; i++) + FillBgTilemapBufferRect(bg, TILE_BOT_EDGE_START + i, i - 1 + x, y + deltaY, 1, 1, 14); } static void LoadMapNamePopUpWindowBg(void) @@ -368,12 +380,12 @@ static void LoadMapNamePopUpWindowBg(void) } popUpThemeId = gRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId]; - LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_BG), gMapPopUp_Outline_Table[popUpThemeId], 0x400, 0x21D); - CallWindowFunction(popupWindowId, sub_80D4A78); + LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_BG), sMapPopUp_OutlineTable[popUpThemeId], 0x400, 0x21D); + CallWindowFunction(popupWindowId, DrawMapNamePopUpFrame); PutWindowTilemap(popupWindowId); if (gMapHeader.weather == WEATHER_UNDERWATER_BUBBLES) - LoadPalette(&gUnknown_0857F444, 0xE0, 0x20); + LoadPalette(&sMapPopUp_Palette_Underwater, 0xE0, sizeof(sMapPopUp_Palette_Underwater)); else - LoadPalette(gMapPopUp_Palette_Table[popUpThemeId], 0xE0, 0x20); - BlitBitmapToWindow(popupWindowId, gMapPopUp_Table[popUpThemeId], 0, 0, 80, 24); + LoadPalette(sMapPopUp_PaletteTable[popUpThemeId], 0xE0, sizeof(sMapPopUp_PaletteTable[0])); + BlitBitmapToWindow(popupWindowId, sMapPopUp_Table[popUpThemeId], 0, 0, 80, 24); } diff --git a/src/match_call.c b/src/match_call.c index 723562ade..fd0db630c 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -34,12 +34,62 @@ #include "constants/songs.h" #include "constants/trainers.h" +// Each match call message has variables that can be populated randomly or +// dependent on the trainer. The below are IDs for how to populate the vars +// in a given message. +// Each message may have up to 3 vars in it +enum { + STR_TRAINER_NAME, + STR_MAP_NAME, + STR_SPECIES_IN_ROUTE, + STR_SPECIES_IN_PARTY, + STR_FACILITY_NAME, + STR_FRONTIER_STREAK, + STR_NONE = -1, +}; +#define STRS_NORMAL_MSG {STR_TRAINER_NAME, STR_NONE, STR_NONE} +#define STRS_WILD_BATTLE {STR_TRAINER_NAME, STR_SPECIES_IN_ROUTE, STR_NONE} +#define STRS_BATTLE_NEGATIVE {STR_TRAINER_NAME, STR_NONE, STR_NONE} +#define STRS_BATTLE_POSITIVE {STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE} +#define STRS_BATTLE_REQUEST {STR_TRAINER_NAME, STR_MAP_NAME, STR_NONE} +#define STRS_FRONTIER {STR_TRAINER_NAME, STR_FACILITY_NAME, STR_FRONTIER_STREAK} + +#define NUM_STRVARS_IN_MSG 3 + +// Topic IDs for sMatchCallGeneralTopics +enum { + GEN_TOPIC_PERSONAL = 1, + GEN_TOPIC_STREAK, + GEN_TOPIC_STREAK_RECORD, + GEN_TOPIC_B_DOME, + GEN_TOPIC_B_PIKE, + GEN_TOPIC_B_PYRAMID, +}; + +// Topic IDs for sMatchCallBattleTopics +enum { + B_TOPIC_WILD = 1, + B_TOPIC_NEGATIVE, + B_TOPIC_POSITIVE, +}; + +// Each trainer has a text id for 1 of each of the 3 battle topics +// The msgId is the index into the respective topic's message table +// For all but 2 trainers this index is the same for each topic +#define BATTLE_TEXT_IDS(msgId) {TEXT_ID(B_TOPIC_WILD, (msgId)), TEXT_ID(B_TOPIC_NEGATIVE, (msgId)), TEXT_ID(B_TOPIC_POSITIVE, (msgId))} + +// Topic IDs for sMatchCallBattleRequestTopics +enum { + REQ_TOPIC_SAME_ROUTE = 1, + REQ_TOPIC_DIFF_ROUTE, +}; + struct MatchCallState { u32 minutes; u16 trainerId; u8 stepCounter; - u8 triggeredFromScript; + bool8 triggeredFromScript; }; struct MatchCallTrainerTextInfo @@ -56,7 +106,7 @@ struct MatchCallTrainerTextInfo struct MatchCallText { const u8 *text; - s8 stringVarFuncIds[3]; + s8 stringVarFuncIds[NUM_STRVARS_IN_MSG]; }; struct MultiTrainerMatchCallText @@ -71,8 +121,8 @@ struct BattleFrontierStreakInfo u16 streak; }; -EWRAM_DATA struct MatchCallState gMatchCallState = {0}; -EWRAM_DATA struct BattleFrontierStreakInfo gBattleFrontierStreakInfo = {0}; +static EWRAM_DATA struct MatchCallState sMatchCallState = {0}; +static EWRAM_DATA struct BattleFrontierStreakInfo sBattleFrontierStreakInfo = {0}; static u32 GetCurrentTotalMinutes(struct Time *); static u32 GetNumRegisteredNPCs(void); @@ -82,27 +132,27 @@ static u16 GetRematchTrainerLocation(int); static bool32 TrainerIsEligibleForRematch(int); static void StartMatchCall(void); static void ExecuteMatchCall(u8); -static void DrawMatchCallTextBoxBorder(u32, u32, u32); -static void sub_8196694(u8); +static void DrawMatchCallTextBoxBorder_Internal(u32, u32, u32); +static void Task_SpinPokenavIcon(u8); static void InitMatchCallTextPrinter(int, const u8 *); -static bool32 ExecuteMatchCallTextPrinter(int); +static bool32 RunMatchCallTextPrinter(int); static const struct MatchCallText *GetSameRouteMatchCallText(int, u8 *); static const struct MatchCallText *GetDifferentRouteMatchCallText(int, u8 *); static const struct MatchCallText *GetBattleMatchCallText(int, u8 *); static const struct MatchCallText *GetGeneralMatchCallText(int, u8 *); -static bool32 sub_8196D74(int); +static bool32 ShouldTrainerRequestBattle(int); static void BuildMatchCallString(int, const struct MatchCallText *, u8 *); static u16 GetFrontierStreakInfo(u16, u32 *); static void PopulateMatchCallStringVars(int, const s8 *); static void PopulateMatchCallStringVar(int, int, u8 *); -static bool32 LoadMatchCallWindowGfx(u8); -static bool32 MoveMatchCallWindowToVram(u8); -static bool32 PrintMatchCallIntroEllipsis(u8); -static bool32 sub_81962B0(u8); -static bool32 sub_81962D8(u8); -static bool32 sub_8196330(u8); -static bool32 sub_8196390(u8); -static bool32 sub_81963F0(u8); +static bool32 MatchCall_LoadGfx(u8); +static bool32 MatchCall_DrawWindow(u8); +static bool32 MatchCall_ReadyIntro(u8); +static bool32 MatchCall_SlideWindowIn(u8); +static bool32 MatchCall_PrintIntro(u8); +static bool32 MatchCall_PrintMessage(u8); +static bool32 MatchCall_SlideWindowOut(u8); +static bool32 MatchCall_EndCall(u8); static void PopulateTrainerName(int, u8 *); static void PopulateMapName(int, u8 *); static void PopulateSpeciesFromTrainerLocation(int, u8 *); @@ -117,851 +167,853 @@ static const struct MatchCallTrainerTextInfo sMatchCallTrainers[] = { .trainerId = TRAINER_ROSE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 3), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 3), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_ANDRES_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 12), TEXT_ID(2, 12), TEXT_ID(3, 12) }, - .generalTextId = TEXT_ID(1, 62), + .battleTopicTextIds = BATTLE_TEXT_IDS(12), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 62), .battleFrontierRecordStreakTextIndex = 12, - .sameRouteMatchCallTextId = TEXT_ID(1, 12), - .differentRouteMatchCallTextId = TEXT_ID(2, 12), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 12), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 12), }, { .trainerId = TRAINER_DUSTY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 12), TEXT_ID(2, 12), TEXT_ID(3, 12) }, - .generalTextId = TEXT_ID(1, 4), + .battleTopicTextIds = BATTLE_TEXT_IDS(12), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 4), .battleFrontierRecordStreakTextIndex = 12, - .sameRouteMatchCallTextId = TEXT_ID(1, 12), - .differentRouteMatchCallTextId = TEXT_ID(2, 12), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 12), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 12), }, { .trainerId = TRAINER_LOLA_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 2), TEXT_ID(2, 2), TEXT_ID(3, 2) }, - .generalTextId = TEXT_ID(1, 5), + .battleTopicTextIds = BATTLE_TEXT_IDS(2), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 5), .battleFrontierRecordStreakTextIndex = 2, - .sameRouteMatchCallTextId = TEXT_ID(1, 2), - .differentRouteMatchCallTextId = TEXT_ID(2, 2), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 2), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 2), }, { .trainerId = TRAINER_RICKY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 6), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 6), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_LILA_AND_ROY_1, .unused = 4, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 61), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 61), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_CRISTIN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 10), TEXT_ID(2, 10), TEXT_ID(3, 10) }, - .generalTextId = TEXT_ID(1, 64), + .battleTopicTextIds = BATTLE_TEXT_IDS(10), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 64), .battleFrontierRecordStreakTextIndex = 10, - .sameRouteMatchCallTextId = TEXT_ID(1, 10), - .differentRouteMatchCallTextId = TEXT_ID(2, 10), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 10), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 10), }, { .trainerId = TRAINER_BROOKE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 8), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 8), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_WILTON_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 6), TEXT_ID(2, 6), TEXT_ID(3, 6) }, - .generalTextId = TEXT_ID(1, 7), + .battleTopicTextIds = BATTLE_TEXT_IDS(6), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 7), .battleFrontierRecordStreakTextIndex = 6, - .sameRouteMatchCallTextId = TEXT_ID(1, 6), - .differentRouteMatchCallTextId = TEXT_ID(2, 6), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 6), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 6), }, { .trainerId = TRAINER_VALERIE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 9), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 9), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_CINDY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 10), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 10), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_THALIA_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 10), TEXT_ID(3, 10) }, - .generalTextId = TEXT_ID(1, 14), + // Thalia and Sawyer are the only ones who use different msg ids for their battle topics + .battleTopicTextIds = { TEXT_ID(B_TOPIC_WILD, 8), TEXT_ID(B_TOPIC_NEGATIVE, 10), TEXT_ID(B_TOPIC_POSITIVE, 10) }, + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 14), .battleFrontierRecordStreakTextIndex = 10, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 10), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 10), }, { .trainerId = TRAINER_JESSICA_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 10), TEXT_ID(2, 10), TEXT_ID(3, 10) }, - .generalTextId = TEXT_ID(1, 11), + .battleTopicTextIds = BATTLE_TEXT_IDS(10), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 11), .battleFrontierRecordStreakTextIndex = 10, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 10), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 10), }, { .trainerId = TRAINER_WINSTON_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 4), TEXT_ID(2, 4), TEXT_ID(3, 4) }, - .generalTextId = TEXT_ID(1, 12), + .battleTopicTextIds = BATTLE_TEXT_IDS(4), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 12), .battleFrontierRecordStreakTextIndex = 4, - .sameRouteMatchCallTextId = TEXT_ID(1, 4), - .differentRouteMatchCallTextId = TEXT_ID(2, 4), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 4), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 4), }, { .trainerId = TRAINER_STEVE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 7), TEXT_ID(2, 7), TEXT_ID(3, 7) }, - .generalTextId = TEXT_ID(1, 13), + .battleTopicTextIds = BATTLE_TEXT_IDS(7), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 13), .battleFrontierRecordStreakTextIndex = 7, - .sameRouteMatchCallTextId = TEXT_ID(1, 7), - .differentRouteMatchCallTextId = TEXT_ID(2, 7), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 7), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 7), }, { .trainerId = TRAINER_TONY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 15), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 15), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_NOB_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 3), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 16), + .battleTopicTextIds = BATTLE_TEXT_IDS(3), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 16), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_KOJI_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 3), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 59), + .battleTopicTextIds = BATTLE_TEXT_IDS(3), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 59), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_FERNANDO_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 6), TEXT_ID(2, 6), TEXT_ID(3, 6) }, - .generalTextId = TEXT_ID(1, 17), + .battleTopicTextIds = BATTLE_TEXT_IDS(6), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 17), .battleFrontierRecordStreakTextIndex = 6, - .sameRouteMatchCallTextId = TEXT_ID(1, 6), - .differentRouteMatchCallTextId = TEXT_ID(2, 6), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 6), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 6), }, { .trainerId = TRAINER_DALTON_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 4), TEXT_ID(2, 4), TEXT_ID(3, 4) }, - .generalTextId = TEXT_ID(1, 18), + .battleTopicTextIds = BATTLE_TEXT_IDS(4), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 18), .battleFrontierRecordStreakTextIndex = 4, - .sameRouteMatchCallTextId = TEXT_ID(1, 4), - .differentRouteMatchCallTextId = TEXT_ID(2, 4), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 4), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 4), }, { .trainerId = TRAINER_BERNIE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 11), TEXT_ID(2, 11), TEXT_ID(3, 11) }, - .generalTextId = TEXT_ID(1, 19), + .battleTopicTextIds = BATTLE_TEXT_IDS(11), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 19), .battleFrontierRecordStreakTextIndex = 11, - .sameRouteMatchCallTextId = TEXT_ID(1, 11), - .differentRouteMatchCallTextId = TEXT_ID(2, 11), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 11), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 11), }, { .trainerId = TRAINER_ETHAN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 20), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 20), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_JOHN_AND_JAY_1, .unused = 3, - .battleTopicTextIds = { TEXT_ID(1, 12), TEXT_ID(2, 12), TEXT_ID(3, 12) }, - .generalTextId = TEXT_ID(1, 60), + .battleTopicTextIds = BATTLE_TEXT_IDS(12), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 60), .battleFrontierRecordStreakTextIndex = 12, - .sameRouteMatchCallTextId = TEXT_ID(1, 12), - .differentRouteMatchCallTextId = TEXT_ID(2, 12), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 12), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 12), }, { .trainerId = TRAINER_JEFFREY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 7), TEXT_ID(2, 7), TEXT_ID(3, 7) }, - .generalTextId = TEXT_ID(1, 21), + .battleTopicTextIds = BATTLE_TEXT_IDS(7), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 21), .battleFrontierRecordStreakTextIndex = 7, - .sameRouteMatchCallTextId = TEXT_ID(1, 7), - .differentRouteMatchCallTextId = TEXT_ID(2, 7), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 7), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 7), }, { .trainerId = TRAINER_CAMERON_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 4), TEXT_ID(2, 4), TEXT_ID(3, 4) }, - .generalTextId = TEXT_ID(1, 22), + .battleTopicTextIds = BATTLE_TEXT_IDS(4), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 22), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 4), - .differentRouteMatchCallTextId = TEXT_ID(2, 4), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 4), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 4), }, { .trainerId = TRAINER_JACKI_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 23), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 23), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_WALTER_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 12), TEXT_ID(2, 12), TEXT_ID(3, 12) }, - .generalTextId = TEXT_ID(1, 24), + .battleTopicTextIds = BATTLE_TEXT_IDS(12), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 24), .battleFrontierRecordStreakTextIndex = 12, - .sameRouteMatchCallTextId = TEXT_ID(1, 12), - .differentRouteMatchCallTextId = TEXT_ID(2, 12), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 12), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 12), }, { .trainerId = TRAINER_KAREN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 2), TEXT_ID(2, 2), TEXT_ID(3, 2) }, - .generalTextId = TEXT_ID(1, 26), + .battleTopicTextIds = BATTLE_TEXT_IDS(2), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 26), .battleFrontierRecordStreakTextIndex = 2, - .sameRouteMatchCallTextId = TEXT_ID(1, 2), - .differentRouteMatchCallTextId = TEXT_ID(2, 2), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 2), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 2), }, { .trainerId = TRAINER_JERRY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 25), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 25), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_ANNA_AND_MEG_1, .unused = 6, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 27), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 27), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_ISABEL_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 14), TEXT_ID(2, 14), TEXT_ID(3, 14) }, - .generalTextId = TEXT_ID(1, 29), + .battleTopicTextIds = BATTLE_TEXT_IDS(14), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 29), .battleFrontierRecordStreakTextIndex = 14, - .sameRouteMatchCallTextId = TEXT_ID(1, 14), - .differentRouteMatchCallTextId = TEXT_ID(2, 14), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 14), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 14), }, { .trainerId = TRAINER_MIGUEL_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 11), TEXT_ID(2, 11), TEXT_ID(3, 11) }, - .generalTextId = TEXT_ID(1, 28), + .battleTopicTextIds = BATTLE_TEXT_IDS(11), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 28), .battleFrontierRecordStreakTextIndex = 11, - .sameRouteMatchCallTextId = TEXT_ID(1, 11), - .differentRouteMatchCallTextId = TEXT_ID(2, 11), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 11), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 11), }, { .trainerId = TRAINER_TIMOTHY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 12), TEXT_ID(2, 12), TEXT_ID(3, 12) }, - .generalTextId = TEXT_ID(1, 30), + .battleTopicTextIds = BATTLE_TEXT_IDS(12), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 30), .battleFrontierRecordStreakTextIndex = 12, - .sameRouteMatchCallTextId = TEXT_ID(1, 12), - .differentRouteMatchCallTextId = TEXT_ID(2, 12), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 12), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 12), }, { .trainerId = TRAINER_SHELBY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 13), TEXT_ID(2, 13), TEXT_ID(3, 13) }, - .generalTextId = TEXT_ID(1, 31), + .battleTopicTextIds = BATTLE_TEXT_IDS(13), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 31), .battleFrontierRecordStreakTextIndex = 13, - .sameRouteMatchCallTextId = TEXT_ID(1, 13), - .differentRouteMatchCallTextId = TEXT_ID(2, 13), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 13), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 13), }, { .trainerId = TRAINER_CALVIN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 32), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 32), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_ELLIOT_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 3), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 33), + .battleTopicTextIds = BATTLE_TEXT_IDS(3), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 33), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_ISAIAH_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 38), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 38), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_MARIA_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 37), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 37), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_ABIGAIL_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 35), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 35), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_DYLAN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 36), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 36), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_KATELYN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 40), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 40), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_BENJAMIN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 34), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 34), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_PABLO_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 39), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 39), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_NICOLAS_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 4), TEXT_ID(2, 4), TEXT_ID(3, 4) }, - .generalTextId = TEXT_ID(1, 41), + .battleTopicTextIds = BATTLE_TEXT_IDS(4), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 41), .battleFrontierRecordStreakTextIndex = 4, - .sameRouteMatchCallTextId = TEXT_ID(1, 4), - .differentRouteMatchCallTextId = TEXT_ID(2, 4), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 4), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 4), }, { .trainerId = TRAINER_ROBERT_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 6), TEXT_ID(2, 6), TEXT_ID(3, 6) }, - .generalTextId = TEXT_ID(1, 42), + .battleTopicTextIds = BATTLE_TEXT_IDS(6), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 42), .battleFrontierRecordStreakTextIndex = 6, - .sameRouteMatchCallTextId = TEXT_ID(1, 6), - .differentRouteMatchCallTextId = TEXT_ID(2, 6), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 6), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 6), }, { .trainerId = TRAINER_LAO_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 43), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 43), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_CYNDY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 44), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 44), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_MADELINE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 45), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 45), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_JENNY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 46), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 46), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_DIANA_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 2), TEXT_ID(2, 2), TEXT_ID(3, 2) }, - .generalTextId = TEXT_ID(1, 47), + .battleTopicTextIds = BATTLE_TEXT_IDS(2), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 47), .battleFrontierRecordStreakTextIndex = 2, - .sameRouteMatchCallTextId = TEXT_ID(1, 2), - .differentRouteMatchCallTextId = TEXT_ID(2, 2), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 2), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 2), }, { .trainerId = TRAINER_AMY_AND_LIV_1, .unused = 2, - .battleTopicTextIds = { TEXT_ID(1, 2), TEXT_ID(2, 2), TEXT_ID(3, 2) }, - .generalTextId = TEXT_ID(1, 48), + .battleTopicTextIds = BATTLE_TEXT_IDS(2), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 48), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 2), - .differentRouteMatchCallTextId = TEXT_ID(2, 2), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 2), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 2), }, { .trainerId = TRAINER_ERNEST_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 3), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 49), + .battleTopicTextIds = BATTLE_TEXT_IDS(3), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 49), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_CORY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 3), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 63), + .battleTopicTextIds = BATTLE_TEXT_IDS(3), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 63), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_EDWIN_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 7), TEXT_ID(2, 7), TEXT_ID(3, 7) }, - .generalTextId = TEXT_ID(1, 50), + .battleTopicTextIds = BATTLE_TEXT_IDS(7), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 50), .battleFrontierRecordStreakTextIndex = 7, - .sameRouteMatchCallTextId = TEXT_ID(1, 7), - .differentRouteMatchCallTextId = TEXT_ID(2, 7), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 7), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 7), }, { .trainerId = TRAINER_LYDIA_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 52), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 52), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_ISAAC_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 51), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 51), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_GABRIELLE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 8), TEXT_ID(2, 8), TEXT_ID(3, 8) }, - .generalTextId = TEXT_ID(1, 2), + .battleTopicTextIds = BATTLE_TEXT_IDS(8), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 2), .battleFrontierRecordStreakTextIndex = 8, - .sameRouteMatchCallTextId = TEXT_ID(1, 8), - .differentRouteMatchCallTextId = TEXT_ID(2, 8), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 8), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 8), }, { .trainerId = TRAINER_CATHERINE_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 54), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 54), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, { .trainerId = TRAINER_JACKSON_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 5), TEXT_ID(2, 5), TEXT_ID(3, 5) }, - .generalTextId = TEXT_ID(1, 53), + .battleTopicTextIds = BATTLE_TEXT_IDS(5), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 53), .battleFrontierRecordStreakTextIndex = 5, - .sameRouteMatchCallTextId = TEXT_ID(1, 5), - .differentRouteMatchCallTextId = TEXT_ID(2, 5), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 5), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 5), }, { .trainerId = TRAINER_HALEY_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 2), TEXT_ID(2, 2), TEXT_ID(3, 2) }, - .generalTextId = TEXT_ID(1, 55), + .battleTopicTextIds = BATTLE_TEXT_IDS(2), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 55), .battleFrontierRecordStreakTextIndex = 2, - .sameRouteMatchCallTextId = TEXT_ID(1, 2), - .differentRouteMatchCallTextId = TEXT_ID(2, 2), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 2), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 2), }, { .trainerId = TRAINER_JAMES_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 1), TEXT_ID(2, 1), TEXT_ID(3, 1) }, - .generalTextId = TEXT_ID(1, 56), + .battleTopicTextIds = BATTLE_TEXT_IDS(1), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 56), .battleFrontierRecordStreakTextIndex = 1, - .sameRouteMatchCallTextId = TEXT_ID(1, 1), - .differentRouteMatchCallTextId = TEXT_ID(2, 1), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 1), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 1), }, { .trainerId = TRAINER_TRENT_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 3), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 57), + .battleTopicTextIds = BATTLE_TEXT_IDS(3), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 57), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_SAWYER_1, .unused = 0, - .battleTopicTextIds = { TEXT_ID(1, 15), TEXT_ID(2, 3), TEXT_ID(3, 3) }, - .generalTextId = TEXT_ID(1, 1), + // Thalia and Sawyer are the only ones who use different msg ids for their battle topics + .battleTopicTextIds = { TEXT_ID(B_TOPIC_WILD, 15), TEXT_ID(B_TOPIC_NEGATIVE, 3), TEXT_ID(B_TOPIC_POSITIVE, 3) }, + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 1), .battleFrontierRecordStreakTextIndex = 3, - .sameRouteMatchCallTextId = TEXT_ID(1, 3), - .differentRouteMatchCallTextId = TEXT_ID(2, 3), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 3), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 3), }, { .trainerId = TRAINER_KIRA_AND_DAN_1, .unused = 1, - .battleTopicTextIds = { TEXT_ID(1, 9), TEXT_ID(2, 9), TEXT_ID(3, 9) }, - .generalTextId = TEXT_ID(1, 58), + .battleTopicTextIds = BATTLE_TEXT_IDS(9), + .generalTextId = TEXT_ID(GEN_TOPIC_PERSONAL, 58), .battleFrontierRecordStreakTextIndex = 9, - .sameRouteMatchCallTextId = TEXT_ID(1, 9), - .differentRouteMatchCallTextId = TEXT_ID(2, 9), + .sameRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_SAME_ROUTE, 9), + .differentRouteMatchCallTextId = TEXT_ID(REQ_TOPIC_DIFF_ROUTE, 9), }, }; static const struct MatchCallText sMatchCallWildBattleTexts[] = { - { .text = MatchCall_WildBattleText1, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText2, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText3, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText4, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText5, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText6, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText7, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText8, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText9, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText10, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText11, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText12, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText13, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText14, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_WildBattleText15, .stringVarFuncIds = { 0, 2, -1 } }, + { .text = MatchCall_WildBattleText1, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText2, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText3, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText4, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText5, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText6, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText7, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText8, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText9, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText10, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText11, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText12, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText13, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText14, .stringVarFuncIds = STRS_WILD_BATTLE }, + { .text = MatchCall_WildBattleText15, .stringVarFuncIds = STRS_WILD_BATTLE }, }; - static const struct MatchCallText sMatchCallNegativeBattleTexts[] = - { - { .text = MatchCall_NegativeBattleText1, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText2, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText3, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText4, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText5, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText6, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText7, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText8, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText9, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText10, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText11, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText12, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText13, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_NegativeBattleText14, .stringVarFuncIds = { 0, -1, -1 } }, +static const struct MatchCallText sMatchCallNegativeBattleTexts[] = +{ + { .text = MatchCall_NegativeBattleText1, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText2, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText3, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText4, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText5, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText6, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText7, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText8, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText9, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText10, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText11, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText12, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText13, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, + { .text = MatchCall_NegativeBattleText14, .stringVarFuncIds = STRS_BATTLE_NEGATIVE }, }; static const struct MatchCallText sMatchCallPositiveBattleTexts[] = { - { .text = MatchCall_PositiveBattleText1, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText2, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText3, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText4, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText5, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText6, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText7, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText8, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText9, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText10, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText11, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText12, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText13, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PositiveBattleText14, .stringVarFuncIds = { 0, 3, -1 } }, + { .text = MatchCall_PositiveBattleText1, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText2, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText3, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText4, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText5, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText6, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText7, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText8, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText9, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText10, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText11, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText12, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText13, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, + { .text = MatchCall_PositiveBattleText14, .stringVarFuncIds = STRS_BATTLE_POSITIVE }, }; static const struct MatchCallText sMatchCallSameRouteBattleRequestTexts[] = { - { .text = MatchCall_SameRouteBattleRequestText1, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText2, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText3, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText4, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText5, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText6, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText7, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText8, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText9, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText10, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText11, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText12, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText13, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_SameRouteBattleRequestText14, .stringVarFuncIds = { 0, 1, -1 } }, + { .text = MatchCall_SameRouteBattleRequestText1, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText2, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText3, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText4, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText5, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText6, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText7, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText8, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText9, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText10, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText11, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText12, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText13, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_SameRouteBattleRequestText14, .stringVarFuncIds = STRS_BATTLE_REQUEST }, }; static const struct MatchCallText sMatchCallDifferentRouteBattleRequestTexts[] = { - { .text = MatchCall_DifferentRouteBattleRequestText1, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText2, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText3, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText4, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText5, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText6, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText7, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText8, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText9, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText10, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText11, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText12, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText13, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_DifferentRouteBattleRequestText14, .stringVarFuncIds = { 0, 1, -1 } }, + { .text = MatchCall_DifferentRouteBattleRequestText1, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText2, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText3, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText4, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText5, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText6, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText7, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText8, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText9, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText10, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText11, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText12, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText13, .stringVarFuncIds = STRS_BATTLE_REQUEST }, + { .text = MatchCall_DifferentRouteBattleRequestText14, .stringVarFuncIds = STRS_BATTLE_REQUEST }, }; static const struct MatchCallText sMatchCallPersonalizedTexts[] = { - { .text = MatchCall_PersonalizedText1, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_PersonalizedText2, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText3, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText4, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText5, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText6, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText7, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText8, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText9, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText10, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText11, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText12, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText13, .stringVarFuncIds = { 0, 2, -1 } }, - { .text = MatchCall_PersonalizedText14, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText15, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText16, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText17, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText18, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PersonalizedText19, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText20, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText21, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText22, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText23, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText24, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText25, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText26, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText27, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText28, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PersonalizedText29, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PersonalizedText30, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText31, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText32, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText33, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText34, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText35, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText36, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText37, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText38, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText39, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText40, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText41, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText42, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PersonalizedText43, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText44, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PersonalizedText45, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText46, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText47, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText48, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText49, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText50, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText51, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_PersonalizedText52, .stringVarFuncIds = { 0, 3, -1 } }, - { .text = MatchCall_PersonalizedText53, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText54, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText55, .stringVarFuncIds = { 0, 1, -1 } }, - { .text = MatchCall_PersonalizedText56, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText57, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText58, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText59, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText60, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText61, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText62, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText63, .stringVarFuncIds = { 0, -1, -1 } }, - { .text = MatchCall_PersonalizedText64, .stringVarFuncIds = { 0, -1, -1 } }, + { .text = MatchCall_PersonalizedText1, .stringVarFuncIds = { STR_TRAINER_NAME, STR_MAP_NAME, STR_NONE } }, + { .text = MatchCall_PersonalizedText2, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText3, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText4, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText5, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText6, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText7, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText8, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText9, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText10, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText11, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText12, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText13, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_ROUTE, STR_NONE } }, + { .text = MatchCall_PersonalizedText14, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText15, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText16, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText17, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText18, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE } }, + { .text = MatchCall_PersonalizedText19, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText20, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText21, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText22, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText23, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText24, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText25, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText26, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText27, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText28, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE } }, + { .text = MatchCall_PersonalizedText29, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE } }, + { .text = MatchCall_PersonalizedText30, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText31, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText32, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText33, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText34, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText35, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText36, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText37, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText38, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText39, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText40, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText41, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText42, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE } }, + { .text = MatchCall_PersonalizedText43, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText44, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE } }, + { .text = MatchCall_PersonalizedText45, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText46, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText47, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText48, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText49, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText50, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText51, .stringVarFuncIds = { STR_TRAINER_NAME, STR_MAP_NAME, STR_NONE } }, + { .text = MatchCall_PersonalizedText52, .stringVarFuncIds = { STR_TRAINER_NAME, STR_SPECIES_IN_PARTY, STR_NONE } }, + { .text = MatchCall_PersonalizedText53, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText54, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText55, .stringVarFuncIds = { STR_TRAINER_NAME, STR_MAP_NAME, STR_NONE } }, + { .text = MatchCall_PersonalizedText56, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText57, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText58, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText59, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText60, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText61, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText62, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText63, .stringVarFuncIds = STRS_NORMAL_MSG }, + { .text = MatchCall_PersonalizedText64, .stringVarFuncIds = STRS_NORMAL_MSG }, }; static const struct MatchCallText sMatchCallBattleFrontierStreakTexts[] = { - { .text = MatchCall_BattleFrontierStreakText1, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText2, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText3, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText4, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText5, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText6, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText7, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText8, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText9, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText10, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText11, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText12, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText13, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierStreakText14, .stringVarFuncIds = { 0, 4, 5 } }, + { .text = MatchCall_BattleFrontierStreakText1, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText2, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText3, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText4, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText5, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText6, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText7, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText8, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText9, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText10, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText11, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText12, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText13, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierStreakText14, .stringVarFuncIds = STRS_FRONTIER }, }; static const struct MatchCallText sMatchCallBattleFrontierRecordStreakTexts[] = { - { .text = MatchCall_BattleFrontierRecordStreakText1, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText2, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText3, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText4, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText5, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText6, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText7, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText8, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText9, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText10, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText11, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText12, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText13, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleFrontierRecordStreakText14, .stringVarFuncIds = { 0, 4, 5 } }, + { .text = MatchCall_BattleFrontierRecordStreakText1, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText2, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText3, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText4, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText5, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText6, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText7, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText8, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText9, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText10, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText11, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText12, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText13, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleFrontierRecordStreakText14, .stringVarFuncIds = STRS_FRONTIER }, }; static const struct MatchCallText sMatchCallBattleDomeTexts[] = { - { .text = MatchCall_BattleDomeText1, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText2, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText3, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText4, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText5, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText6, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText7, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText8, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText9, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText10, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText11, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText12, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText13, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattleDomeText14, .stringVarFuncIds = { 0, 4, 5 } }, + { .text = MatchCall_BattleDomeText1, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText2, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText3, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText4, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText5, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText6, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText7, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText8, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText9, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText10, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText11, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText12, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText13, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattleDomeText14, .stringVarFuncIds = STRS_FRONTIER }, }; static const struct MatchCallText sMatchCallBattlePikeTexts[] = { - { .text = MatchCall_BattlePikeText1, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText2, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText3, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText4, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText5, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText6, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText7, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText8, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText9, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText10, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText11, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText12, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText13, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePikeText14, .stringVarFuncIds = { 0, 4, 5 } }, + { .text = MatchCall_BattlePikeText1, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText2, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText3, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText4, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText5, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText6, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText7, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText8, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText9, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText10, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText11, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText12, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText13, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePikeText14, .stringVarFuncIds = STRS_FRONTIER }, }; static const struct MatchCallText sMatchCallBattlePyramidTexts[] = { - { .text = MatchCall_BattlePyramidText1, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText2, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText3, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText4, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText5, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText6, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText7, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText8, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText9, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText10, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText11, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText12, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText13, .stringVarFuncIds = { 0, 4, 5 } }, - { .text = MatchCall_BattlePyramidText14, .stringVarFuncIds = { 0, 4, 5 } }, + { .text = MatchCall_BattlePyramidText1, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText2, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText3, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText4, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText5, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText6, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText7, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText8, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText9, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText10, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText11, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText12, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText13, .stringVarFuncIds = STRS_FRONTIER }, + { .text = MatchCall_BattlePyramidText14, .stringVarFuncIds = STRS_FRONTIER }, }; static const struct MatchCallText *const sMatchCallBattleTopics[] = { - sMatchCallWildBattleTexts, - sMatchCallNegativeBattleTexts, - sMatchCallPositiveBattleTexts, + [B_TOPIC_WILD - 1] = sMatchCallWildBattleTexts, + [B_TOPIC_NEGATIVE - 1] = sMatchCallNegativeBattleTexts, + [B_TOPIC_POSITIVE - 1] = sMatchCallPositiveBattleTexts, }; static const struct MatchCallText *const sMatchCallBattleRequestTopics[] = { - sMatchCallSameRouteBattleRequestTexts, - sMatchCallDifferentRouteBattleRequestTexts, + [REQ_TOPIC_SAME_ROUTE - 1] = sMatchCallSameRouteBattleRequestTexts, + [REQ_TOPIC_DIFF_ROUTE - 1] = sMatchCallDifferentRouteBattleRequestTexts, }; static const struct MatchCallText *const sMatchCallGeneralTopics[] = { - sMatchCallPersonalizedTexts, - sMatchCallBattleFrontierStreakTexts, - sMatchCallBattleFrontierRecordStreakTexts, - sMatchCallBattleDomeTexts, - sMatchCallBattlePikeTexts, - sMatchCallBattlePyramidTexts, + [GEN_TOPIC_PERSONAL - 1] = sMatchCallPersonalizedTexts, + [GEN_TOPIC_STREAK - 1] = sMatchCallBattleFrontierStreakTexts, + [GEN_TOPIC_STREAK_RECORD - 1] = sMatchCallBattleFrontierRecordStreakTexts, + [GEN_TOPIC_B_DOME - 1] = sMatchCallBattleDomeTexts, + [GEN_TOPIC_B_PIKE - 1] = sMatchCallBattlePikeTexts, + [GEN_TOPIC_B_PYRAMID - 1] = sMatchCallBattlePyramidTexts, }; extern const u8 gBirchDexRatingText_AreYouCurious[]; @@ -971,13 +1023,13 @@ extern const u8 gBirchDexRatingText_OnANationwideBasis[]; void InitMatchCallCounters(void) { RtcCalcLocalTime(); - gMatchCallState.minutes = GetCurrentTotalMinutes(&gLocalTime) + 10; - gMatchCallState.stepCounter = 0; + sMatchCallState.minutes = GetCurrentTotalMinutes(&gLocalTime) + 10; + sMatchCallState.stepCounter = 0; } static u32 GetCurrentTotalMinutes(struct Time *time) { - return time->days * 1440 + time->hours * 60 + time->minutes; + return time->days * 24 * 60 + time->hours * 60 + time->minutes; } static bool32 UpdateMatchCallMinutesCounter(void) @@ -985,9 +1037,9 @@ static bool32 UpdateMatchCallMinutesCounter(void) int curMinutes; RtcCalcLocalTime(); curMinutes = GetCurrentTotalMinutes(&gLocalTime); - if (gMatchCallState.minutes > curMinutes || curMinutes - gMatchCallState.minutes > 9) + if (sMatchCallState.minutes > curMinutes || curMinutes - sMatchCallState.minutes > 9) { - gMatchCallState.minutes = curMinutes; + sMatchCallState.minutes = curMinutes; return TRUE; } @@ -1026,9 +1078,9 @@ static bool32 MapAllowsMatchCall(void) static bool32 UpdateMatchCallStepCounter(void) { - if (++gMatchCallState.stepCounter >= 10) + if (++sMatchCallState.stepCounter >= 10) { - gMatchCallState.stepCounter = 0; + sMatchCallState.stepCounter = 0; return TRUE; } else @@ -1041,15 +1093,15 @@ static bool32 SelectMatchCallTrainer(void) { u32 matchCallId; u32 numRegistered = GetNumRegisteredNPCs(); - if (!numRegistered) + if (numRegistered == 0) return FALSE; - gMatchCallState.trainerId = GetActiveMatchCallTrainerId(Random() % numRegistered); - gMatchCallState.triggeredFromScript = 0; - if (gMatchCallState.trainerId == REMATCH_TABLE_ENTRIES) + sMatchCallState.trainerId = GetActiveMatchCallTrainerId(Random() % numRegistered); + sMatchCallState.triggeredFromScript = FALSE; + if (sMatchCallState.trainerId == REMATCH_TABLE_ENTRIES) return FALSE; - matchCallId = GetTrainerMatchCallId(gMatchCallState.trainerId); + matchCallId = GetTrainerMatchCallId(sMatchCallState.trainerId); if (GetRematchTrainerLocation(matchCallId) == gMapHeader.regionMapSectionId && !TrainerIsEligibleForRematch(matchCallId)) return FALSE; @@ -1085,10 +1137,23 @@ static u32 GetActiveMatchCallTrainerId(u32 activeMatchCallId) return REMATCH_TABLE_ENTRIES; } +/* + From the function calls below, a call can only be triggered... + - If the player has match call + - Every 10th step + - Every 10 minutes + - 1/3 of the time (or 2/3 of the time, if the lead party Pokémon has Lightning Rod) + - If in a valid outdoor map (not Safari Zone, not underwater, not Mt Chimney with Team Magma, not Sootopolis with legendaries) + - If an eligible trainer to call the player is selected +*/ bool32 TryStartMatchCall(void) { - if (FlagGet(FLAG_HAS_MATCH_CALL) && UpdateMatchCallStepCounter() && UpdateMatchCallMinutesCounter() - && CheckMatchCallChance() && MapAllowsMatchCall() && SelectMatchCallTrainer()) + if (FlagGet(FLAG_HAS_MATCH_CALL) + && UpdateMatchCallStepCounter() + && UpdateMatchCallMinutesCounter() + && CheckMatchCallChance() + && MapAllowsMatchCall() + && SelectMatchCallTrainer()) { StartMatchCall(); return TRUE; @@ -1099,7 +1164,7 @@ bool32 TryStartMatchCall(void) void StartMatchCallFromScript(const u8 *message) { - gMatchCallState.triggeredFromScript = 1; + sMatchCallState.triggeredFromScript = TRUE; StartMatchCall(); } @@ -1110,11 +1175,11 @@ bool32 IsMatchCallTaskActive(void) static void StartMatchCall(void) { - if (!gMatchCallState.triggeredFromScript) + if (!sMatchCallState.triggeredFromScript) { ScriptContext2_Enable(); FreezeObjectEvents(); - sub_808B864(); + PlayerFreeze(); sub_808BCF4(); } @@ -1122,33 +1187,37 @@ static void StartMatchCall(void) CreateTask(ExecuteMatchCall, 1); } -static const u16 sUnknown_0860EA4C[] = INCBIN_U16("graphics/unknown/unknown_60EA4C.gbapal"); -static const u8 sUnknown_0860EA6C[] = INCBIN_U8("graphics/interface/menu_border.4bpp"); -static const u16 sPokeNavIconPalette[] = INCBIN_U16("graphics/pokenav/icon.gbapal"); -static const u32 sPokeNavIconGfx[] = INCBIN_U32("graphics/pokenav/icon.4bpp.lz"); +static const u16 sMatchCallWindow_Pal[] = INCBIN_U16("graphics/pokenav/match_call_window.gbapal"); +static const u8 sMatchCallWindow_Gfx[] = INCBIN_U8("graphics/pokenav/match_call_window.4bpp"); +static const u16 sPokenavIcon_Pal[] = INCBIN_U16("graphics/pokenav/icon.gbapal"); +static const u32 sPokenavIcon_Gfx[] = INCBIN_U32("graphics/pokenav/icon.4bpp.lz"); static const u8 sText_PokenavCallEllipsis[] = _("………………\p"); +#define tState data[0] +#define tWindowId data[2] +#define tIconTaskId data[5] + static bool32 (*const sMatchCallTaskFuncs[])(u8) = { - LoadMatchCallWindowGfx, - MoveMatchCallWindowToVram, - PrintMatchCallIntroEllipsis, - sub_81962B0, - sub_81962D8, - sub_8196330, - sub_8196390, - sub_81963F0, + MatchCall_LoadGfx, + MatchCall_DrawWindow, + MatchCall_ReadyIntro, + MatchCall_SlideWindowIn, + MatchCall_PrintIntro, + MatchCall_PrintMessage, + MatchCall_SlideWindowOut, + MatchCall_EndCall, }; static void ExecuteMatchCall(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - if (sMatchCallTaskFuncs[taskData[0]](taskId)) + s16 *data = gTasks[taskId].data; + if (sMatchCallTaskFuncs[tState](taskId)) { - taskData[0]++; - taskData[1] = 0; - if ((u16)taskData[0] > 7) + tState++; + data[1] = 0; // Never read + if ((u16)tState > 7) DestroyTask(taskId); } } @@ -1164,65 +1233,69 @@ static const struct WindowTemplate sMatchCallTextWindow = .baseBlock = 0x200 }; -static bool32 LoadMatchCallWindowGfx(u8 taskId) +#define TILE_MC_WINDOW 0x270 +#define TILE_POKENAV_ICON 0x279 + +static bool32 MatchCall_LoadGfx(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - taskData[2] = AddWindow(&sMatchCallTextWindow); - if (taskData[2] == 0xFF) + s16 *data = gTasks[taskId].data; + tWindowId = AddWindow(&sMatchCallTextWindow); + if (tWindowId == WINDOW_NONE) { DestroyTask(taskId); return FALSE; } - if (LoadBgTiles(0, sUnknown_0860EA6C, sizeof(sUnknown_0860EA6C), 0x270) == 0xFFFF) + if (LoadBgTiles(0, sMatchCallWindow_Gfx, sizeof(sMatchCallWindow_Gfx), TILE_MC_WINDOW) == 0xFFFF) { - RemoveWindow(taskData[2]); + RemoveWindow(tWindowId); DestroyTask(taskId); return FALSE; } - if (!DecompressAndCopyTileDataToVram(0, sPokeNavIconGfx, 0, 0x279, 0)) + if (!DecompressAndCopyTileDataToVram(0, sPokenavIcon_Gfx, 0, TILE_POKENAV_ICON, 0)) { - RemoveWindow(taskData[2]); + RemoveWindow(tWindowId); DestroyTask(taskId); return FALSE; } - FillWindowPixelBuffer(taskData[2], PIXEL_FILL(8)); - LoadPalette(sUnknown_0860EA4C, 0xE0, 0x20); - LoadPalette(sPokeNavIconPalette, 0xF0, 0x20); + FillWindowPixelBuffer(tWindowId, PIXEL_FILL(8)); + LoadPalette(sMatchCallWindow_Pal, 0xE0, sizeof(sMatchCallWindow_Pal)); + LoadPalette(sPokenavIcon_Pal, 0xF0, sizeof(sPokenavIcon_Pal)); ChangeBgY(0, -0x2000, 0); return TRUE; } -static bool32 MoveMatchCallWindowToVram(u8 taskId) +static bool32 MatchCall_DrawWindow(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (FreeTempTileDataBuffersIfPossible()) return FALSE; - PutWindowTilemap(taskData[2]); - DrawMatchCallTextBoxBorder(taskData[2], 0x270, 14); - WriteSequenceToBgTilemapBuffer(0, 0xF279, 1, 15, 4, 4, 17, 1); - taskData[5] = CreateTask(sub_8196694, 10); - CopyWindowToVram(taskData[2], 2); + PutWindowTilemap(tWindowId); + DrawMatchCallTextBoxBorder_Internal(tWindowId, TILE_MC_WINDOW, 14); + WriteSequenceToBgTilemapBuffer(0, (0xF << 12) | TILE_POKENAV_ICON, 1, 15, 4, 4, 17, 1); + tIconTaskId = CreateTask(Task_SpinPokenavIcon, 10); + CopyWindowToVram(tWindowId, 2); CopyBgTilemapBufferToVram(0); return TRUE; } -static bool32 PrintMatchCallIntroEllipsis(u8 taskId) +static bool32 MatchCall_ReadyIntro(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!IsDma3ManagerBusyWithBgCopy()) { - InitMatchCallTextPrinter(taskData[2], sText_PokenavCallEllipsis); + // Note that "..." is not printed yet, just readied + InitMatchCallTextPrinter(tWindowId, sText_PokenavCallEllipsis); return TRUE; } return FALSE; } -static bool32 sub_81962B0(u8 taskId) +static bool32 MatchCall_SlideWindowIn(u8 taskId) { if (ChangeBgY(0, 0x600, 1) >= 0) { @@ -1233,29 +1306,30 @@ static bool32 sub_81962B0(u8 taskId) return FALSE; } -static bool32 sub_81962D8(u8 taskId) +static bool32 MatchCall_PrintIntro(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - if (!ExecuteMatchCallTextPrinter(taskData[2])) + s16 *data = gTasks[taskId].data; + if (!RunMatchCallTextPrinter(tWindowId)) { - FillWindowPixelBuffer(taskData[2], PIXEL_FILL(8)); - if (!gMatchCallState.triggeredFromScript) - SelectMatchCallMessage(gMatchCallState.trainerId, gStringVar4); - - InitMatchCallTextPrinter(taskData[2], gStringVar4); + FillWindowPixelBuffer(tWindowId, PIXEL_FILL(8)); + + // Ready the message + if (!sMatchCallState.triggeredFromScript) + SelectMatchCallMessage(sMatchCallState.trainerId, gStringVar4); + InitMatchCallTextPrinter(tWindowId, gStringVar4); return TRUE; } return FALSE; } -static bool32 sub_8196330(u8 taskId) +static bool32 MatchCall_PrintMessage(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - if (!ExecuteMatchCallTextPrinter(taskData[2]) && !IsSEPlaying() && JOY_NEW(A_BUTTON | B_BUTTON)) + s16 *data = gTasks[taskId].data; + if (!RunMatchCallTextPrinter(tWindowId) && !IsSEPlaying() && JOY_NEW(A_BUTTON | B_BUTTON)) { - FillWindowPixelBuffer(taskData[2], PIXEL_FILL(8)); - CopyWindowToVram(taskData[2], 2); + FillWindowPixelBuffer(tWindowId, PIXEL_FILL(8)); + CopyWindowToVram(tWindowId, 2); PlaySE(SE_POKENAV_HANG_UP); return TRUE; } @@ -1263,14 +1337,14 @@ static bool32 sub_8196330(u8 taskId) return FALSE; } -static bool32 sub_8196390(u8 taskId) +static bool32 MatchCall_SlideWindowOut(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (ChangeBgY(0, 0x600, 2) <= -0x2000) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 14, 30, 6); - DestroyTask(taskData[5]); - RemoveWindow(taskData[2]); + DestroyTask(tIconTaskId); + RemoveWindow(tWindowId); CopyBgTilemapBufferToVram(0); return TRUE; } @@ -1278,13 +1352,13 @@ static bool32 sub_8196390(u8 taskId) return FALSE; } -static bool32 sub_81963F0(u8 taskId) +static bool32 MatchCall_EndCall(u8 taskId) { u8 playerObjectId; if (!IsDma3ManagerBusyWithBgCopy() && !IsSEPlaying()) { ChangeBgY(0, 0, 0); - if (!gMatchCallState.triggeredFromScript) + if (!sMatchCallState.triggeredFromScript) { LoadMessageBoxAndBorderGfx(); playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); @@ -1300,7 +1374,7 @@ static bool32 sub_81963F0(u8 taskId) return FALSE; } -static void DrawMatchCallTextBoxBorder(u32 windowId, u32 tileOffset, u32 paletteId) +static void DrawMatchCallTextBoxBorder_Internal(u32 windowId, u32 tileOffset, u32 paletteId) { int bg, x, y, width, height; int tileNum; @@ -1335,40 +1409,48 @@ static void InitMatchCallTextPrinter(int windowId, const u8 *str) printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.unk = 0; - printerTemplate.fgColor = 10; - printerTemplate.bgColor = 8; - printerTemplate.shadowColor = 14; - gTextFlags.useAlternateDownArrow = 0; + printerTemplate.fgColor = TEXT_DYNAMIC_COLOR_1; + printerTemplate.bgColor = TEXT_COLOR_BLUE; + printerTemplate.shadowColor = TEXT_DYNAMIC_COLOR_5; + gTextFlags.useAlternateDownArrow = FALSE; AddTextPrinter(&printerTemplate, GetPlayerTextSpeedDelay(), NULL); } -static bool32 ExecuteMatchCallTextPrinter(int windowId) +static bool32 RunMatchCallTextPrinter(int windowId) { if (JOY_HELD(A_BUTTON)) - gTextFlags.canABSpeedUpPrint = 1; + gTextFlags.canABSpeedUpPrint = TRUE; else - gTextFlags.canABSpeedUpPrint = 0; + gTextFlags.canABSpeedUpPrint = FALSE; RunTextPrinters(); return IsTextPrinterActive(windowId); } -static void sub_8196694(u8 taskId) +#define tTimer data[0] +#define tSpinStage data[1] +#define tTileNum data[2] + +static void Task_SpinPokenavIcon(u8 taskId) { - s16 *taskData = gTasks[taskId].data; - if (++taskData[0] > 8) + s16 *data = gTasks[taskId].data; + if (++tTimer > 8) { - taskData[0] = 0; - if (++taskData[1] > 7) - taskData[1] = 0; + tTimer = 0; + if (++tSpinStage > 7) + tSpinStage = 0; - taskData[2] = (taskData[1] * 16) + 0x279; - WriteSequenceToBgTilemapBuffer(0, taskData[2] | ~0xFFF, 1, 15, 4, 4, 17, 1); + tTileNum = (tSpinStage * 16) + TILE_POKENAV_ICON; + WriteSequenceToBgTilemapBuffer(0, tTileNum | ~0xFFF, 1, 15, 4, 4, 17, 1); CopyBgTilemapBufferToVram(0); } } +#undef tTimer +#undef tSpinStage +#undef tTileNum + static bool32 TrainerIsEligibleForRematch(int matchCallId) { return gSaveBlock1Ptr->trainerRematches[matchCallId] > 0; @@ -1392,7 +1474,10 @@ static u32 GetNumRematchTrainersFought(void) return count; } -static u32 sub_8196774(int arg0) +// Look through the rematch table for trainers that have been defeated once before. +// Return the index into the rematch table of the nth defeated trainer, +// or REMATCH_TABLE_ENTRIES if fewer than n rematch trainers have been defeated. +static u32 GetNthRematchTrainerFought(int n) { u32 i, count; @@ -1400,7 +1485,7 @@ static u32 sub_8196774(int arg0) { if (HasTrainerBeenFought(gRematchTable[i].trainerIds[0])) { - if (count == arg0) + if (count == n) return i; count++; @@ -1417,13 +1502,19 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str) bool32 retVal = FALSE; matchCallId = GetTrainerMatchCallId(trainerId); - gBattleFrontierStreakInfo.facilityId = 0; + sBattleFrontierStreakInfo.facilityId = 0; + + // If the player is on the same route as the trainer + // and they can be rematched, they will always request a battle if (TrainerIsEligibleForRematch(matchCallId) && GetRematchTrainerLocation(matchCallId) == gMapHeader.regionMapSectionId) { matchCallText = GetSameRouteMatchCallText(matchCallId, str); } - else if (sub_8196D74(matchCallId)) + // If the player is not on the same route as the trainer + // and they can be rematched, there is a random chance for + // the trainer to request a battle + else if (ShouldTrainerRequestBattle(matchCallId)) { matchCallText = GetDifferentRouteMatchCallText(matchCallId, str); retVal = TRUE; @@ -1431,10 +1522,12 @@ bool32 SelectMatchCallMessage(int trainerId, u8 *str) } else if (Random() % 3) { + // Message talking about a battle the NPC had matchCallText = GetBattleMatchCallText(matchCallId, str); } else { + // Message talking about something else matchCallText = GetGeneralMatchCallText(matchCallId, str); } @@ -1494,7 +1587,6 @@ static const struct MatchCallText *GetGeneralMatchCallText(int matchCallId, u8 * int count; u32 topic, id; u16 rand; - u16 var3; rand = Random(); if (!(rand & 1)) @@ -1510,8 +1602,8 @@ static const struct MatchCallText *GetGeneralMatchCallText(int matchCallId, u8 * count = Random() % count; for (i = 0; i < NUM_FRONTIER_FACILITIES; i++) { - gBattleFrontierStreakInfo.streak = GetFrontierStreakInfo(i, &topic); - if (gBattleFrontierStreakInfo.streak < 2) + sBattleFrontierStreakInfo.streak = GetFrontierStreakInfo(i, &topic); + if (sBattleFrontierStreakInfo.streak < 2) continue; if (!count) @@ -1520,7 +1612,7 @@ static const struct MatchCallText *GetGeneralMatchCallText(int matchCallId, u8 * count--; } - gBattleFrontierStreakInfo.facilityId = i; + sBattleFrontierStreakInfo.facilityId = i; id = sMatchCallTrainers[matchCallId].battleFrontierRecordStreakTextIndex - 1; return &sMatchCallGeneralTopics[topic][id]; } @@ -1542,7 +1634,7 @@ static u8 *const sMatchCallTextStringVars[] = { gStringVar1, gStringVar2, gStrin static void PopulateMatchCallStringVars(int matchCallId, const s8 *stringVarFuncIds) { int i; - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_STRVARS_IN_MSG; i++) { if (stringVarFuncIds[i] >= 0) PopulateMatchCallStringVar(matchCallId, stringVarFuncIds[i], sMatchCallTextStringVars[i]); @@ -1551,12 +1643,12 @@ static void PopulateMatchCallStringVars(int matchCallId, const s8 *stringVarFunc static void (*const sPopulateMatchCallStringVarFuncs[])(int, u8 *) = { - PopulateTrainerName, - PopulateMapName, - PopulateSpeciesFromTrainerLocation, - PopulateSpeciesFromTrainerParty, - PopulateBattleFrontierFacilityName, - PopulateBattleFrontierStreak, + [STR_TRAINER_NAME] = PopulateTrainerName, + [STR_MAP_NAME] = PopulateMapName, + [STR_SPECIES_IN_ROUTE] = PopulateSpeciesFromTrainerLocation, + [STR_SPECIES_IN_PARTY] = PopulateSpeciesFromTrainerParty, + [STR_FACILITY_NAME] = PopulateBattleFrontierFacilityName, + [STR_FRONTIER_STREAK] = PopulateBattleFrontierStreak, }; static void PopulateMatchCallStringVar(int matchCallId, int funcId, u8 *destStr) @@ -1578,7 +1670,7 @@ static void PopulateTrainerName(int matchCallId, u8 *destStr) { u32 i; u16 trainerId = sMatchCallTrainers[matchCallId].trainerId; - for (i = 0; i < 6; i++) + for (i = 0; i < ARRAY_COUNT(sMultiTrainerMatchCallTexts); i++) { if (sMultiTrainerMatchCallTexts[i].trainerId == trainerId) { @@ -1729,20 +1821,20 @@ static const u8 *const sBattleFrontierFacilityNames[] = static void PopulateBattleFrontierFacilityName(int matchCallId, u8 *destStr) { - StringCopy(destStr, sBattleFrontierFacilityNames[gBattleFrontierStreakInfo.facilityId]); + StringCopy(destStr, sBattleFrontierFacilityNames[sBattleFrontierStreakInfo.facilityId]); } static void PopulateBattleFrontierStreak(int matchCallId, u8 *destStr) { int i = 0; - int streak = gBattleFrontierStreakInfo.streak; + int streak = sBattleFrontierStreakInfo.streak; while (streak != 0) { streak /= 10; i++; } - ConvertIntToDecimalStringN(destStr, gBattleFrontierStreakInfo.streak, STR_CONV_MODE_LEFT_ALIGN, i); + ConvertIntToDecimalStringN(destStr, sBattleFrontierStreakInfo.streak, STR_CONV_MODE_LEFT_ALIGN, i); } static const u16 sBadgeFlags[NUM_BADGES] = @@ -1770,13 +1862,14 @@ static int GetNumOwnedBadges(void) return i; } -static bool32 sub_8196D74(int matchCallId) +// Whether or not a trainer calling the player from a different route should request a battle +static bool32 ShouldTrainerRequestBattle(int matchCallId) { int dayCount; int otId; - u16 easyChatWord; + u16 dewfordRand; int numRematchTrainersFought; - int var0, var1, var2; + int max, rand, n; if (GetNumOwnedBadges() < 5) return FALSE; @@ -1784,14 +1877,14 @@ static bool32 sub_8196D74(int matchCallId) dayCount = RtcGetLocalDayCount(); otId = GetTrainerId(gSaveBlock2Ptr->playerTrainerId) & 0xFFFF; - easyChatWord = gSaveBlock1Ptr->easyChatPairs[0].unk2; + dewfordRand = gSaveBlock1Ptr->dewfordTrends[0].rand; numRematchTrainersFought = GetNumRematchTrainersFought(); - var0 = (numRematchTrainersFought * 13) / 10; - var1 = ((dayCount ^ easyChatWord) + (easyChatWord ^ GetGameStat(GAME_STAT_TRAINER_BATTLES))) ^ otId; - var2 = var1 % var0; - if (var2 < numRematchTrainersFought) + max = (numRematchTrainersFought * 13) / 10; + rand = ((dayCount ^ dewfordRand) + (dewfordRand ^ GetGameStat(GAME_STAT_TRAINER_BATTLES))) ^ otId; + n = rand % max; + if (n < numRematchTrainersFought) { - if (sub_8196774(var2) == matchCallId) + if (GetNthRematchTrainerFought(n) == matchCallId) return TRUE; } @@ -1815,7 +1908,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) streak = gSaveBlock2Ptr->frontier.domeRecordWinStreaks[i][j]; } } - *topicTextId = 3; + *topicTextId = GEN_TOPIC_B_DOME - 1; break; #ifdef BUGFIX case FRONTIER_FACILITY_PIKE: @@ -1827,7 +1920,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) if (streak < gSaveBlock2Ptr->frontier.pikeRecordStreaks[i]) streak = gSaveBlock2Ptr->frontier.pikeRecordStreaks[i]; } - *topicTextId = 4; + *topicTextId = GEN_TOPIC_B_PIKE - 1; break; case FRONTIER_FACILITY_TOWER: for (i = 0; i < 4; i++) @@ -1838,7 +1931,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) streak = gSaveBlock2Ptr->frontier.towerRecordWinStreaks[i][j]; } } - *topicTextId = 2; + *topicTextId = GEN_TOPIC_STREAK_RECORD - 1; break; case FRONTIER_FACILITY_PALACE: for (i = 0; i < 2; i++) @@ -1849,7 +1942,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) streak = gSaveBlock2Ptr->frontier.palaceRecordWinStreaks[i][j]; } } - *topicTextId = 2; + *topicTextId = GEN_TOPIC_STREAK_RECORD - 1; break; #ifdef BUGFIX case FRONTIER_FACILITY_FACTORY: @@ -1864,7 +1957,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) streak = gSaveBlock2Ptr->frontier.factoryRecordWinStreaks[i][j]; } } - *topicTextId = 2; + *topicTextId = GEN_TOPIC_STREAK_RECORD - 1; break; case FRONTIER_FACILITY_ARENA: for (i = 0; i < 2; i++) @@ -1872,7 +1965,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) if (streak < gSaveBlock2Ptr->frontier.arenaRecordStreaks[i]) streak = gSaveBlock2Ptr->frontier.arenaRecordStreaks[i]; } - *topicTextId = 2; + *topicTextId = GEN_TOPIC_STREAK_RECORD - 1; break; case FRONTIER_FACILITY_PYRAMID: for (i = 0; i < 2; i++) @@ -1880,7 +1973,7 @@ static u16 GetFrontierStreakInfo(u16 facilityId, u32 *topicTextId) if (streak < gSaveBlock2Ptr->frontier.pyramidRecordStreaks[i]) streak = gSaveBlock2Ptr->frontier.pyramidRecordStreaks[i]; } - *topicTextId = 5; + *topicTextId = GEN_TOPIC_B_PYRAMID - 1; break; } @@ -1972,7 +2065,7 @@ void BufferPokedexRatingForMatchCall(u8 *destStr) u8 *str; u8 dexRatingLevel; - u8 *buffer = Alloc(0x3E8); + u8 *buffer = Alloc(sizeof(gStringVar4)); if (!buffer) { destStr[0] = EOS; @@ -1985,18 +2078,15 @@ void BufferPokedexRatingForMatchCall(u8 *destStr) ConvertIntToDecimalStringN(gStringVar2, numCaught, STR_CONV_MODE_LEFT_ALIGN, 3); dexRatingLevel = GetPokedexRatingLevel(numCaught); str = StringCopy(buffer, gBirchDexRatingText_AreYouCurious); - str[0] = CHAR_PROMPT_CLEAR; - str++; + *(str++) = CHAR_PROMPT_CLEAR; str = StringCopy(str, gBirchDexRatingText_SoYouveSeenAndCaught); - str[0] = CHAR_PROMPT_CLEAR; - str++; + *(str++) = CHAR_PROMPT_CLEAR; StringCopy(str, sBirchDexRatingTexts[dexRatingLevel]); str = StringExpandPlaceholders(destStr, buffer); if (IsNationalPokedexEnabled()) { - str[0] = CHAR_PROMPT_CLEAR; - str++; + *(str++) = CHAR_PROMPT_CLEAR; numSeen = GetNationalPokedexCount(FLAG_GET_SEEN); numCaught = GetNationalPokedexCount(FLAG_GET_CAUGHT); ConvertIntToDecimalStringN(gStringVar1, numSeen, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -2007,14 +2097,14 @@ void BufferPokedexRatingForMatchCall(u8 *destStr) Free(buffer); } -void sub_8197184(u32 windowId, u32 destOffset, u32 paletteId) +void LoadMatchCallWindowGfx(u32 windowId, u32 destOffset, u32 paletteId) { u8 bg = GetWindowAttribute(windowId, WINDOW_BG); - LoadBgTiles(bg, sUnknown_0860EA6C, 0x100, destOffset); - LoadPalette(sUnknown_0860EA4C, paletteId << 4, 0x20); + LoadBgTiles(bg, sMatchCallWindow_Gfx, 0x100, destOffset); + LoadPalette(sMatchCallWindow_Pal, paletteId << 4, sizeof(sMatchCallWindow_Pal)); } -void sub_81971C4(u32 windowId, u32 tileOffset, u32 paletteId) +void DrawMatchCallTextBoxBorder(u32 windowId, u32 tileOffset, u32 paletteId) { - DrawMatchCallTextBoxBorder(windowId, tileOffset, paletteId); + DrawMatchCallTextBoxBorder_Internal(windowId, tileOffset, paletteId); } diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c index af68c6116..239639e0b 100644 --- a/src/mauville_old_man.c +++ b/src/mauville_old_man.c @@ -250,7 +250,7 @@ void ScrSpecial_HipsterTeachWord(void) { u16 phrase = GetNewHipsterPhraseToTeach(); - if (phrase == 0xFFFF) + if (phrase == EC_EMPTY_WORD) { gSpecialVar_Result = FALSE; } @@ -283,7 +283,7 @@ void ScrSpecial_GenerateGiddyLine(void) if (giddy->taleCounter == 0) InitGiddyTaleList(); - if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array? + if (giddy->randomWords[giddy->taleCounter] != EC_EMPTY_WORD) { u8 *stringPtr; u32 adjective = Random(); @@ -316,7 +316,7 @@ static void InitGiddyTaleList(void) {EC_GROUP_HOBBIES, 0}, {EC_GROUP_MOVE_1, 0}, {EC_GROUP_MOVE_2, 0}, - {EC_GROUP_POKEMON_2, 0} + {EC_GROUP_POKEMON_NATIONAL, 0} }; u16 i; u16 r10; @@ -348,7 +348,7 @@ static void InitGiddyTaleList(void) r1 = Random() % 10; if (r1 < 3 && r7 < 8) { - giddy->randomWords[i] = 0xFFFF; + giddy->randomWords[i] = EC_EMPTY_WORD; r7++; } else @@ -425,21 +425,21 @@ static void StartBardSong(bool8 useTemporaryLyrics) gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics; } -static void sub_81206F0(void) +static void EnableTextPrinters(void) { - gUnknown_03002F84 = FALSE; + gDisableTextPrinters = FALSE; } -static void BardSong_TextSubPrinter(struct TextPrinterTemplate * printer, u16 a1) +static void BardSong_DisableTextPrinters(struct TextPrinterTemplate * printer, u16 a1) { - gUnknown_03002F84 = TRUE; + gDisableTextPrinters = TRUE; } static void sub_8120708(const u8 * src) { DrawDialogueFrame(0, 0); - AddTextPrinterParameterized(0, 1, src, 0, 1, 1, BardSong_TextSubPrinter); - gUnknown_03002F84 = TRUE; + AddTextPrinterParameterized(0, 1, src, 0, 1, 1, BardSong_DisableTextPrinters); + gDisableTextPrinters = TRUE; CopyWindowToVram(0, 3); } @@ -620,7 +620,7 @@ static void Task_BardSong(u8 taskId) else if (gStringVar4[task->tCharIndex] == CHAR_SPACE) { - sub_81206F0(); + EnableTextPrinters(); task->tCharIndex++; task->tState = 2; task->data[2] = 0; @@ -640,7 +640,7 @@ static void Task_BardSong(u8 taskId) else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR) { gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space - sub_81206F0(); + EnableTextPrinters(); task->tCharIndex++; task->data[2] = 0; } @@ -649,7 +649,7 @@ static void Task_BardSong(u8 taskId) switch (task->data[1]) { case 0: - sub_81206F0(); + EnableTextPrinters(); task->data[1]++; break; case 1: @@ -680,45 +680,43 @@ void ScrSpecial_SetMauvilleOldManObjEventGfx(void) // Language fixers? -void sub_8120B70(union OldMan * oldMan) +void SanitizeMauvilleOldManForRuby(union OldMan * oldMan) { s32 i; u8 playerName[PLAYER_NAME_LENGTH + 1]; switch (oldMan->common.id) { - case MAUVILLE_MAN_TRADER: + case MAUVILLE_MAN_TRADER: + { + struct MauvilleOldManTrader * trader = &oldMan->trader; + for (i = 0; i < NUM_TRADER_ITEMS; i++) { - struct MauvilleOldManTrader * trader = &oldMan->trader; - for (i = 0; i < NUM_TRADER_ITEMS; i++) - { - if (trader->language[i] == LANGUAGE_JAPANESE) - { - ConvertInternationalString(trader->playerNames[i], LANGUAGE_JAPANESE); - } - } + if (trader->language[i] == LANGUAGE_JAPANESE) + ConvertInternationalString(trader->playerNames[i], LANGUAGE_JAPANESE); } - break; - case MAUVILLE_MAN_STORYTELLER: + break; + } + case MAUVILLE_MAN_STORYTELLER: + { + struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + for (i = 0; i < NUM_STORYTELLER_TALES; i++) { - struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; - for (i = 0; i < NUM_STORYTELLER_TALES; i++) + if (storyteller->gameStatIDs[i] != 0) { - if (storyteller->gameStatIDs[i] != 0) + memcpy(playerName, storyteller->trainerNames[i], PLAYER_NAME_LENGTH); + playerName[PLAYER_NAME_LENGTH] = EOS; + if (IsStringJapanese(playerName)) { - memcpy(playerName, storyteller->trainerNames[i], PLAYER_NAME_LENGTH); - playerName[PLAYER_NAME_LENGTH] = EOS; - if (IsStringJapanese(playerName)) - { - memset(playerName, CHAR_SPACE, PLAYER_NAME_LENGTH + 1); - StringCopy(playerName, gText_Friend); - memcpy(storyteller->trainerNames[i], playerName, PLAYER_NAME_LENGTH); - storyteller->language[i] = GAME_LANGUAGE; - } + memset(playerName, CHAR_SPACE, PLAYER_NAME_LENGTH + 1); + StringCopy(playerName, gText_Friend); + memcpy(storyteller->trainerNames[i], playerName, PLAYER_NAME_LENGTH); + storyteller->language[i] = GAME_LANGUAGE; } } } - break; + break; + } } } @@ -1324,7 +1322,6 @@ static void PrintStoryList(void) { s32 i; s32 width = GetStringWidth(1, gText_Exit, 0); - u8 tileWidth; for (i = 0; i < NUM_STORYTELLER_TALES; i++) { s32 curWidth; diff --git a/src/menu.c b/src/menu.c index 4813f7b02..90e7d8c75 100644 --- a/src/menu.c +++ b/src/menu.c @@ -95,7 +95,7 @@ static const struct WindowTemplate sYesNo_WindowTemplates = }; const u16 gUnknown_0860F0B0[] = INCBIN_U16("graphics/interface/860F0B0.gbapal"); -const u8 sTextColors[] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY }; +const u8 sTextColors[] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; // Table of move info icon offsets in graphics/interface_fr/menu.png static const struct MenuInfoIcon sMenuInfoIcons[] = @@ -144,8 +144,8 @@ void task_free_buf_after_copying_tile_data_to_vram(u8 taskId); void InitStandardTextBoxWindows(void) { InitWindows(sStandardTextBox_WindowTemplates); - sStartMenuWindowId = 0xFF; - sMapNamePopupWindowId = 0xFF; + sStartMenuWindowId = WINDOW_NONE; + sMapNamePopupWindowId = WINDOW_NONE; } void FreeAllOverworldWindowBuffers(void) @@ -490,7 +490,7 @@ u8 GetPlayerTextSpeedDelay(void) u8 sub_81979C4(u8 a1) { - if (sStartMenuWindowId == 0xFF) + if (sStartMenuWindowId == WINDOW_NONE) sStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139); return sStartMenuWindowId; } @@ -502,26 +502,28 @@ u8 GetStartMenuWindowId(void) void RemoveStartMenuWindow(void) { - if (sStartMenuWindowId != 0xFF) + if (sStartMenuWindowId != WINDOW_NONE) { RemoveWindow(sStartMenuWindowId); - sStartMenuWindowId = 0xFF; + sStartMenuWindowId = WINDOW_NONE; } } -u16 sub_8197A30(void) +// Unused +static u16 GetDialogFrameBaseTileNum(void) { return DLG_WINDOW_BASE_TILE_NUM; } -u16 sub_8197A38(void) +// Unused +static u16 GetStandardFrameBaseTileNum(void) { return STD_WINDOW_BASE_TILE_NUM; } u8 AddMapNamePopUpWindow(void) { - if (sMapNamePopupWindowId == 0xFF) + if (sMapNamePopupWindowId == WINDOW_NONE) sMapNamePopupWindowId = sub_8198AA4(0, 1, 1, 10, 3, 14, 0x107); return sMapNamePopupWindowId; } @@ -533,10 +535,10 @@ u8 GetMapNamePopUpWindowId(void) void RemoveMapNamePopUpWindow(void) { - if (sMapNamePopupWindowId != 0xFF) + if (sMapNamePopupWindowId != WINDOW_NONE) { RemoveWindow(sMapNamePopupWindowId); - sMapNamePopupWindowId = 0xFF; + sMapNamePopupWindowId = WINDOW_NONE; } } @@ -815,7 +817,7 @@ void sub_8198180(const u8 *string, u8 a2, bool8 copyToVram) { u16 width = 0; - if (sWindowId != 0xFF) + if (sWindowId != WINDOW_NONE) { PutWindowTilemap(sWindowId); FillWindowPixelBuffer(sWindowId, PIXEL_FILL(15)); @@ -837,19 +839,19 @@ void sub_8198204(const u8 *string, const u8 *string2, u8 a3, u8 a4, bool8 copyTo u8 color[3]; u16 width = 0; - if (sWindowId != 0xFF) + if (sWindowId != WINDOW_NONE) { if (a3 != 0) { color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_COLOR_WHITE; - color[2] = TEXT_COLOR_DARK_GREY; + color[2] = TEXT_COLOR_DARK_GRAY; } else { color[0] = TEXT_DYNAMIC_COLOR_6; color[1] = TEXT_COLOR_WHITE; - color[2] = TEXT_COLOR_DARK_GREY; + color[2] = TEXT_COLOR_DARK_GRAY; } PutWindowTilemap(sWindowId); FillWindowPixelBuffer(sWindowId, PIXEL_FILL(15)); @@ -872,13 +874,13 @@ void sub_8198204(const u8 *string, const u8 *string2, u8 a3, u8 a4, bool8 copyTo void sub_81982D8(void) { - if (sWindowId != 0xFF) + if (sWindowId != WINDOW_NONE) CopyWindowToVram(sWindowId, 3); } void sub_81982F0(void) { - if (sWindowId != 0xFF) + if (sWindowId != WINDOW_NONE) { FillWindowPixelBuffer(sWindowId, PIXEL_FILL(15)); CopyWindowToVram(sWindowId, 3); @@ -887,13 +889,13 @@ void sub_81982F0(void) void sub_8198314(void) { - if (sWindowId != 0xFF) + if (sWindowId != WINDOW_NONE) { FillWindowPixelBuffer(sWindowId, PIXEL_FILL(0)); ClearWindowTilemap(sWindowId); CopyWindowToVram(sWindowId, 3); RemoveWindow(sWindowId); - sWindowId = 0xFF; + sWindowId = WINDOW_NONE; } } @@ -1241,7 +1243,7 @@ void sub_8198D54(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struc sub_8198C94(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a3, a4, a5, strs); } -void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u8 itemCount2, const struct MenuAction *strs, const u8 *a8) +void PrintMenuActionGrid(u8 windowId, u8 fontId, u8 left, u8 top, u8 optionWidth, u8 horizontalCount, u8 verticalCount, const struct MenuAction *strs, const u8 *strIds) { u8 i; u8 j; @@ -1256,13 +1258,13 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); - for (i = 0; i < itemCount2; i++) + for (i = 0; i < verticalCount; i++) { - for (j = 0; j < itemCount; j++) + for (j = 0; j < horizontalCount; j++) { - printer.currentChar = strs[a8[(itemCount * i) + j]].text; - printer.x = (a4 * j) + left; - printer.y = (GetFontAttribute(fontId, 1) * i) + top; + printer.currentChar = strs[strIds[(horizontalCount * i) + j]].text; + printer.x = (optionWidth * j) + left; + printer.y = (GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT) * i) + top; printer.currentX = printer.x; printer.currentY = printer.y; AddTextPrinter(&printer, 0xFF, NULL); @@ -1272,9 +1274,10 @@ void sub_8198DBC(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 itemCount, u CopyWindowToVram(windowId, 2); } -void sub_8198EF8(u8 windowId, u8 fontId, u8 a2, u8 a3, u8 a4, u8 a5, const struct MenuAction *strs, const u8 *a8) +// Unused +static void PrintMenuActionGrid_TopLeft(u8 windowId, u8 fontId, u8 optionWidth, u8 unused, u8 horizontalCount, u8 verticalCount, const struct MenuAction *strs, const u8 *strIds) { - sub_8198DBC(windowId, fontId, GetFontAttribute(fontId, 0), 0, a2, a4, a5, strs, a8); + PrintMenuActionGrid(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 0, optionWidth, horizontalCount, verticalCount, strs, strIds); } u8 sub_8198F58(u8 windowId, u8 fontId, u8 left, u8 top, u8 a4, u8 cursorHeight, u8 a6, u8 a7, u8 numChoices, u8 a9) @@ -1701,7 +1704,7 @@ void sub_819983C(u8 windowId, u8 a4, u8 itemCount, u8 itemCount2, const struct M CopyWindowToVram(windowId, 2); } -u8 sub_8199944(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos) +u8 InitMenuActionGrid(u8 windowId, u8 optionWidth, u8 columns, u8 rows, u8 initialCursorPos) { s32 pos; @@ -2036,8 +2039,8 @@ void sub_819A080(const struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 src { for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++) { - pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B); - pixelsDst = (void*) dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B); + pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 29) >> 27); + pixelsDst = (void*) dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + ((( loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 29) >> 27); if ((uintptr_t)pixelsDst & 0x1) { diff --git a/src/menu_helpers.c b/src/menu_helpers.c index b31d84a1e..151de0bd4 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -18,19 +18,17 @@ #include "constants/items.h" #include "constants/maps.h" -// this file's functions +#define TAG_SWAP_LINE 109 + static void Task_ContinueTaskAfterMessagePrints(u8 taskId); static void Task_CallYesOrNoCallback(u8 taskId); -// EWRAM vars EWRAM_DATA static struct YesNoFuncTable gUnknown_0203A138 = {0}; EWRAM_DATA static u8 gUnknown_0203A140 = 0; -// IWRAM bss vars static TaskFunc gUnknown_0300117C; -// const rom data -static const struct OamData sOamData_859F4E8 = +static const struct OamData sOamData_SwapLine = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -47,47 +45,47 @@ static const struct OamData sOamData_859F4E8 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_859F4F0[] = +static const union AnimCmd sAnim_SwapLine_RightArrow[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_859F4F8[] = +static const union AnimCmd sAnim_SwapLine_Line[] = { ANIMCMD_FRAME(4, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_859F500[] = +static const union AnimCmd sAnim_SwapLine_LeftArrow[] = { - ANIMCMD_FRAME(0, 0, 1, 0), + ANIMCMD_FRAME(0, 0, .hFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_859F508[] = +static const union AnimCmd *const sAnims_SwapLine[] = { - sSpriteAnim_859F4F0, - sSpriteAnim_859F4F8, - sSpriteAnim_859F500 + sAnim_SwapLine_RightArrow, + sAnim_SwapLine_Line, + sAnim_SwapLine_LeftArrow }; -static const struct CompressedSpriteSheet gUnknown_0859F514 = +static const struct CompressedSpriteSheet sSpriteSheet_SwapLine = { - gBagSwapLineGfx, 0x100, 109 + gBagSwapLineGfx, 0x100, TAG_SWAP_LINE }; -static const struct CompressedSpritePalette gUnknown_0859F51C = +static const struct CompressedSpritePalette sSpritePalette_SwapLine = { - gBagSwapLinePal, 109 + gBagSwapLinePal, TAG_SWAP_LINE }; -static const struct SpriteTemplate gUnknown_0859F524 = +static const struct SpriteTemplate sSpriteTemplate_SwapLine = { - .tileTag = 109, - .paletteTag = 109, - .oam = &sOamData_859F4E8, - .anims = sSpriteAnimTable_859F508, + .tileTag = TAG_SWAP_LINE, + .paletteTag = TAG_SWAP_LINE, + .oam = &sOamData_SwapLine, + .anims = sAnims_SwapLine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, @@ -289,7 +287,7 @@ bool8 sub_8122148(u16 itemId) return FALSE; } -bool8 itemid_80BF6D8_mail_related(u16 itemId) +bool8 IsWritingMailAllowed(u16 itemId) { if (IsUpdateLinkStateCBActive() != TRUE && InUnionRoom() != TRUE) return TRUE; @@ -312,14 +310,14 @@ static bool8 sub_81221D0(void) if (!MenuHelpers_LinkSomething()) return FALSE; else - return sub_8087598(); + return Overworld_LinkRecvQueueLengthMoreThan2(); } bool8 MenuHelpers_CallLinkSomething(void) { if (sub_81221D0() == TRUE) return TRUE; - else if (sub_800B504() != TRUE) + else if (IsLinkRecvQueueLengthAtLeast3() != TRUE) return FALSE; else return TRUE; @@ -390,19 +388,19 @@ void sub_8122298(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3, u8 arg4) } } -void LoadListMenuArrowsGfx(void) +void LoadListMenuSwapLineGfx(void) { - LoadCompressedSpriteSheet(&gUnknown_0859F514); - LoadCompressedSpritePalette(&gUnknown_0859F51C); + LoadCompressedSpriteSheet(&sSpriteSheet_SwapLine); + LoadCompressedSpritePalette(&sSpritePalette_SwapLine); } -void sub_8122344(u8 *spriteIds, u8 count) +void CreateSwapLineSprites(u8 *spriteIds, u8 count) { u8 i; for (i = 0; i < count; i++) { - spriteIds[i] = CreateSprite(&gUnknown_0859F524, i * 16, 0, 0); + spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16, 0, 0); if (i != 0) StartSpriteAnim(&gSprites[spriteIds[i]], 1); @@ -410,7 +408,7 @@ void sub_8122344(u8 *spriteIds, u8 count) } } -void sub_81223B0(u8 *spriteIds, u8 count) +void DestroySwapLineSprites(u8 *spriteIds, u8 count) { u8 i; @@ -423,17 +421,15 @@ void sub_81223B0(u8 *spriteIds, u8 count) } } -void sub_81223FC(u8 *spriteIds, u8 count, bool8 invisible) +void SetSwapLineSpritesInvisibility(u8 *spriteIds, u8 count, bool8 invisible) { u8 i; for (i = 0; i < count; i++) - { gSprites[spriteIds[i]].invisible = invisible; - } } -void sub_8122448(u8 *spriteIds, u8 count, s16 x, u16 y) +void UpdateSwapLineSpritesPos(u8 *spriteIds, u8 count, s16 x, u16 y) { u8 i; bool8 unknownBit = count & 0x80; diff --git a/src/menu_specialized.c b/src/menu_specialized.c index 7de963893..4c4be57f0 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -23,7 +23,6 @@ #include "text_window.h" #include "trig.h" #include "window.h" -#include "constants/berry.h" #include "constants/songs.h" #include "gba/io_reg.h" @@ -74,7 +73,7 @@ static const struct WindowTemplate sUnknown_086253E8[] = static const u8 sPlayerNameTextColors[] = { - TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY + TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY }; static const u8 sEmptyItemName[] = _(""); @@ -217,14 +216,14 @@ bool8 sub_81D1C44(u8 count) return FALSE; for (i = 0; i < ARRAY_COUNT(sUnknown_0203CF48); i++) - sUnknown_0203CF48[i] = 0xFF; + sUnknown_0203CF48[i] = WINDOW_NONE; return TRUE; } u8 sub_81D1C84(u8 a0) { - if (sUnknown_0203CF48[a0] == 0xFF) + if (sUnknown_0203CF48[a0] == WINDOW_NONE) { if (a0 == 2) { @@ -246,7 +245,7 @@ void sub_81D1D04(u8 a0) ClearStdWindowAndFrameToTransparent(sUnknown_0203CF48[a0], 0); ClearWindowTilemap(sUnknown_0203CF48[a0]); RemoveWindow(sUnknown_0203CF48[a0]); - sUnknown_0203CF48[a0] = 0xFF; + sUnknown_0203CF48[a0] = WINDOW_NONE; } static u8 sub_81D1D34(u8 a0) @@ -262,10 +261,10 @@ static void sub_81D1D44(u8 windowId, s32 itemId, u8 y) if (itemId == LIST_CANCEL) return; - StringCopy(buffer, gSaveBlock1Ptr->mail[6 + itemId].playerName); - sub_81DB52C(buffer); + StringCopy(buffer, gSaveBlock1Ptr->mail[PARTY_SIZE + itemId].playerName); + ConvertInternationalPlayerName(buffer); length = StringLength(buffer); - if (length <= 5) + if (length < PLAYER_NAME_LENGTH - 1) ConvertInternationalString(buffer, LANGUAGE_JAPANESE); AddTextPrinterParameterized4(windowId, 1, 8, y, 0, 0, sPlayerNameTextColors, -1, buffer); } @@ -311,7 +310,7 @@ static void sub_81D1E7C(s32 itemIndex, bool8 onInit, struct ListMenu *list) void sub_81D1E90(struct PlayerPCItemPageStruct *page) { - page->scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(2, 0xC8, 12, 0x94, page->count - page->pageItems + 1, 0x6E, 0x6E, &page->itemsAbove); + page->scrollIndicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 0xC8, 12, 0x94, page->count - page->pageItems + 1, 0x6E, 0x6E, &page->itemsAbove); } void sub_81D1EC0(void) @@ -841,7 +840,7 @@ void MoveRelearnerPrintText(u8 *str) FillWindowPixelBuffer(3, PIXEL_FILL(1)); gTextFlags.canABSpeedUpPrint = TRUE; speed = GetPlayerTextSpeedDelay(); - AddTextPrinterParameterized2(3, 1, str, speed, NULL, TEXT_COLOR_DARK_GREY, TEXT_COLOR_WHITE, 3); + AddTextPrinterParameterized2(3, 1, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, 3); } bool16 MoveRelearnerRunTextPrinters(void) @@ -1151,7 +1150,7 @@ static const union AnimCmd *const sAnims_ConditionSelectionIcon[] = // Just loads the generic data, up to the caller to load the actual sheet/pal for the specific mon void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal) { - struct SpriteSheet dataSheet = {NULL, 0x800, TAG_CONDITION_MON}; + struct SpriteSheet dataSheet = {NULL, MON_PIC_SIZE, TAG_CONDITION_MON}; struct SpriteTemplate dataTemplate = { diff --git a/src/mevent2.c b/src/mevent2.c index 3209c585a..d2c020858 100755 --- a/src/mevent2.c +++ b/src/mevent2.c @@ -26,7 +26,7 @@ void sub_801AFD8(void) { CpuFill32(0, &gSaveBlock1Ptr->unk_322C, sizeof(gSaveBlock1Ptr->unk_322C)); sub_801B180(); - sub_811F8BC(); + InitQuestionnaireWords(); } struct WonderNews *GetSavedWonderNews(void) @@ -49,9 +49,9 @@ struct MysteryEventStruct *sub_801B044(void) return &gSaveBlock1Ptr->unk_322C.unk_340; } -u16 *sub_801B058(void) +u16 *GetQuestionnaireWordsPtr(void) { - return gSaveBlock1Ptr->unk_322C.unk_338; + return gSaveBlock1Ptr->unk_322C.questionnaireWords; } void DestroyWonderNews(void) @@ -364,8 +364,8 @@ void sub_801B580(struct MEventStruct_Unk1442CC *data, bool32 a1) data->unk_14 = 0; } - for (i = 0; i < 4; i++) - data->unk_16[i] = gSaveBlock1Ptr->unk_322C.unk_338[i]; + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) + data->unk_16[i] = gSaveBlock1Ptr->unk_322C.questionnaireWords[i]; CopyTrainerId(data->unk_4C, gSaveBlock2Ptr->playerTrainerId); StringCopy(data->unk_45, gSaveBlock2Ptr->playerName); @@ -425,7 +425,7 @@ u32 sub_801B708(const u16 *a0, const struct MEventStruct_Unk1442CC *a1, const vo bool32 MEventStruct_Unk1442CC_CompareField_unk_16(const struct MEventStruct_Unk1442CC *a0, const u16 *a1) { int i; - for (i = 0; i < 4; i++) + for (i = 0; i < NUM_QUESTIONNAIRE_WORDS; i++) { if (a0->unk_16[i] != a1[i]) return FALSE; diff --git a/src/mevent_801BAAC.c b/src/mevent_801BAAC.c index d732e3045..a3e6ee0b6 100644 --- a/src/mevent_801BAAC.c +++ b/src/mevent_801BAAC.c @@ -63,8 +63,8 @@ void sub_801C61C(void); extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; const u8 sTextColorTable[][3] = { - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}, - {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY} + {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}, + {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY} }; const u8 ALIGNED(4) gUnknown_082F0E18[3] = {7, 4, 7}; const struct WindowTemplate gUnknown_082F0E1C[] = { @@ -186,7 +186,7 @@ s32 FadeToWonderCardMenu(void) switch(sWonderCardData->unk_0174) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) @@ -231,7 +231,7 @@ s32 FadeToWonderCardMenu(void) ShowBg(2); gPaletteFade.bufferTransferDisabled = FALSE; sub_801C4C0(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); UpdatePaletteFade(); break; default: @@ -251,7 +251,7 @@ s32 FadeOutFromWonderCard(bool32 flag) switch (sWonderCardData->unk_0174) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) @@ -279,7 +279,7 @@ s32 FadeOutFromWonderCard(bool32 flag) case 5: PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag); CopyBgTilemapBufferToVram(0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; default: if (UpdatePaletteFade()) @@ -420,7 +420,7 @@ void sub_801C4C0(void) sWonderCardData->unk_017C = 0xFF; if (sWonderCardData->unk_014C.unk_06 != SPECIES_NONE) { - sWonderCardData->unk_017C = sub_80D2D78(sub_80D2E84(sWonderCardData->unk_014C.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE); + sWonderCardData->unk_017C = CreateMonIconNoPersonality(GetIconSpeciesNoPersonality(sWonderCardData->unk_014C.unk_06), SpriteCallbackDummy, 0xDC, 0x14, 0, FALSE); gSprites[sWonderCardData->unk_017C].oam.priority = 2; } if (sWonderCardData->unk_0000.unk_09 != 0 && sWonderCardData->unk_0000.unk_08_0 == 1) @@ -434,7 +434,7 @@ void sub_801C4C0(void) sWonderCardData->unk_017D[r7][0] = CreateSprite(&gUnknown_082F1D48, 0xd8 - 32 * r7, 0x90, 8); if (sWonderCardData->unk_014C.unk_08[0][r7] != 0) { - sWonderCardData->unk_017D[r7][1] = sub_80D2D78(sub_80D2E84(sWonderCardData->unk_014C.unk_08[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0); + sWonderCardData->unk_017D[r7][1] = CreateMonIconNoPersonality(GetIconSpeciesNoPersonality(sWonderCardData->unk_014C.unk_08[0][r7]), SpriteCallbackDummy, 0xd8 - 32 * r7, 0x88, 0, 0); } } } @@ -575,7 +575,7 @@ s32 FadeToWonderNewsMenu(void) switch (sWonderNewsData->unk_01C0_1) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) @@ -584,10 +584,10 @@ s32 FadeToWonderNewsMenu(void) ChangeBgY(1, 0, 0); ChangeBgY(2, 0, 0); ChangeBgY(3, 0, 0); - SetGpuReg(REG_OFFSET_WIN0H, 0xF0); - SetGpuReg(REG_OFFSET_WIN0V, 0x1A98); - SetGpuReg(REG_OFFSET_WININ, 0x1F); - SetGpuReg(REG_OFFSET_WINOUT, 0x1B); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(26, 152)); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); break; case 2: @@ -629,7 +629,7 @@ s32 FadeToWonderNewsMenu(void) ShowBg(3); gPaletteFade.bufferTransferDisabled = FALSE; sWonderNewsData->unk_01C1 = AddScrollIndicatorArrowPair(&sWonderNewsData->unk_0394, &sWonderNewsData->unk_01C6); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); UpdatePaletteFade(); break; default: @@ -650,7 +650,7 @@ s32 FadeOutFromWonderNews(bool32 flag) switch (sWonderNewsData->unk_01C0_1) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); break; case 1: if (UpdatePaletteFade()) @@ -692,7 +692,7 @@ s32 FadeOutFromWonderNews(bool32 flag) MG_DrawCheckerboardPattern(3); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; default: if (UpdatePaletteFade()) diff --git a/src/mevent_server.c b/src/mevent_server.c index 0d3afea30..2e7b3d89a 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -288,8 +288,8 @@ static u32 (*const func_tbl[])(struct mevent_srv_common *) = { static u32 mevent_srv_exec_common(struct mevent_srv_common * svr) { u32 response; - AGB_ASSERT(svr->mainseqno < NELEMS(func_tbl)); + AGB_ASSERT(svr->mainseqno < ARRAY_COUNT(func_tbl)); response = func_tbl[svr->mainseqno](svr); - AGB_ASSERT(svr->mainseqno < NELEMS(func_tbl)); + AGB_ASSERT(svr->mainseqno < ARRAY_COUNT(func_tbl)); return response; } diff --git a/src/minigame_countdown.c b/src/minigame_countdown.c index cd5710d44..2d4d98138 100644 --- a/src/minigame_countdown.c +++ b/src/minigame_countdown.c @@ -5,280 +5,378 @@ #include "sound.h" #include "task.h" #include "trig.h" +#include "minigame_countdown.h" #include "constants/songs.h" +/* + This file contains two types of '3-2-1 Start' countdowns intended for use by the wireless minigames. + + One is static, where the numbers simply appear and disappear without moving. This version is unused. + The other (used) version has the numbers squish and bounce up as they appear. +*/ + +#define TAG_STATIC_COUNTDOWN 0x2000 + +enum { + STATE_IDLE = 1, + STATE_START, + STATE_RUN, + STATE_END, +}; + +enum { + FUNC_INIT, + FUNC_FREE, + FUNC_START, + FUNC_RUN, +}; + +enum { + ANIM_THREE, + ANIM_TWO, + ANIM_ONE, + ANIM_START_LEFT, + ANIM_START_MID, + ANIM_START_RIGHT, +}; + extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; -static void sub_802E6D0(u8 taskId); -static void sub_802E83C(u8 taskId); -static void sub_802E8C8(u8 taskId); -static void sub_802EA50(u8 taskId); -static void sub_802EAB0(u8 taskId); -static void sub_802EB98(u8 taskId); -static void Task_MinigameCountdown(u8 taskId); -static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId); -static bool32 IsStartGraphicAnimRunning(u8 spriteId); -static void Load321StartGfx(u16 tileTag, u16 palTag); -static u8 CreateNumberSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority); -static void CreateStartSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 *spriteId1, s16 *spriteId2); -static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3); -static void SpriteCB_Start(struct Sprite *sprite); +static void Task_StaticCountdown(u8 taskId); +static void Task_StaticCountdown_Init(u8 taskId); +static void Task_StaticCountdown_Free(u8 taskId); +static void Task_StaticCountdown_Start(u8 taskId); +static void Task_StaticCountdown_Run(u8 taskId); -static const u16 sSpritePal_321Start_2[] = INCBIN_U16("graphics/link_games/321start_2.gbapal"); -static const u32 sSpriteSheet_321Start_2[] = INCBIN_U32("graphics/link_games/321start_2.4bpp.lz"); +static const u16 s321Start_Static_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start_static.gbapal"); +static const u32 s321Start_Static_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start_static.4bpp.lz"); -static const struct CompressedSpriteSheet gUnknown_082FE6C8[] = +static const struct CompressedSpriteSheet sSpriteSheet_321Start_Static[] = { - {sSpriteSheet_321Start_2, 0xC00, 0x2000}, + {s321Start_Static_Gfx, 0xC00, TAG_STATIC_COUNTDOWN}, {}, }; -static const struct SpritePalette gUnknown_082FE6D8[] = +static const struct SpritePalette sSpritePalette_321Start_Static[] = { - {sSpritePal_321Start_2, 0x2000}, + {s321Start_Static_Pal, TAG_STATIC_COUNTDOWN}, {}, }; -static const union AnimCmd sSpriteAnim_82FE6E8[] = +static const union AnimCmd sAnim_StaticCountdown_Three[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FE6F0[] = +static const union AnimCmd sAnim_StaticCountdown_Two[] = { ANIMCMD_FRAME(16, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FE6F8[] = +static const union AnimCmd sAnim_StaticCountdown_One[] = { ANIMCMD_FRAME(32, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FE700[] = +static const union AnimCmd sAnim_StaticCountdown_StartLeft[] = { ANIMCMD_FRAME(64, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FE708[] = +static const union AnimCmd sAnim_StaticCountdown_StartMid[] = { ANIMCMD_FRAME(48, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FE710[] = +static const union AnimCmd sAnim_StaticCountdown_StartRight[] = { ANIMCMD_FRAME(80, 0), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_82FE718[] = +static const union AnimCmd *const sAnims_StaticCountdown[] = { - sSpriteAnim_82FE6E8, - sSpriteAnim_82FE6F0, - sSpriteAnim_82FE6F8, - sSpriteAnim_82FE700, - sSpriteAnim_82FE708, - sSpriteAnim_82FE710 + [ANIM_THREE] = sAnim_StaticCountdown_Three, + [ANIM_TWO] = sAnim_StaticCountdown_Two, + [ANIM_ONE] = sAnim_StaticCountdown_One, + [ANIM_START_LEFT] = sAnim_StaticCountdown_StartLeft, + [ANIM_START_MID] = sAnim_StaticCountdown_StartMid, + [ANIM_START_RIGHT] = sAnim_StaticCountdown_StartRight }; -static const struct SpriteTemplate gUnknown_082FE730[] = +static const struct SpriteTemplate sSpriteTemplate_StaticCountdown[] = { { - .tileTag = 0x2000, - .paletteTag = 0x2000, + .tileTag = TAG_STATIC_COUNTDOWN, + .paletteTag = TAG_STATIC_COUNTDOWN, .oam = &gOamData_AffineOff_ObjNormal_32x32, - .anims = sSpriteAnimTable_82FE718, + .anims = sAnims_StaticCountdown, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }, }; -static const TaskFunc gUnknown_082FE748[][4] = +static const TaskFunc sStaticCountdownFuncs[][4] = { { - sub_802E83C, - sub_802E8C8, - sub_802EA50, - sub_802EAB0 + [FUNC_INIT] = Task_StaticCountdown_Init, + [FUNC_FREE] = Task_StaticCountdown_Free, + [FUNC_START] = Task_StaticCountdown_Start, + [FUNC_RUN] = Task_StaticCountdown_Run }, }; -static const u16 sSpritePal_321Start[] = INCBIN_U16("graphics/link_games/321start.gbapal"); -static const u32 sSpriteSheet_321Start[] = INCBIN_U32("graphics/link_games/321start.4bpp.lz"); +#define tState data[0] +#define tFuncSetId data[1] // These 4 data elements are indexes into +#define tSpriteTemplateId data[2] // arrays that only have 1 element with +#define tSpriteSheetId data[3] // data. As such their only legal value +#define tSpritePalId data[4] // is 0. Unclear why they were used. +#define tInterval data[5] +#define tPriority data[6] +#define tSubpriority data[7] +#define tNumSprites data[8] +#define tX data[9] +#define tY data[10] +#define tPrevTime data[10] // Re-used +#define tTimer data[11] +#define tLinkTimer data[12] +// 13-15 hold sprite ids +// tSpriteIds(0) is used for the number sprites, and the leftmost part of 'Start' +// tSpriteIds(1) is used for the middle part of 'Start' +// tSpriteIds(2) is used for for the rightmost part of 'Start' +#define tSpriteIds(i) data[13 + i] + +#define sInterval data[1] // Never read +#define sAnimNum data[2] +#define sTaskId data[3] +#define sId data[4] // Never read +#define sNumberSpriteId data[5] // Never read // Unused -static u32 sub_802E63C(u8 funcSetId, u8 taskPriority) +static u32 CreateStaticCountdownTask(u8 funcSetId, u8 taskPriority) { - u8 taskId = CreateTask(sub_802E6D0, taskPriority); + u8 taskId = CreateTask(Task_StaticCountdown, taskPriority); struct Task *task = &gTasks[taskId]; - task->data[0] = 1; - task->data[1] = funcSetId; - gUnknown_082FE748[funcSetId][0](taskId); + task->tState = STATE_IDLE; + task->tFuncSetId = funcSetId; + sStaticCountdownFuncs[funcSetId][FUNC_INIT](taskId); return taskId; } -static bool32 sub_802E688(void) +static bool32 StartStaticCountdown(void) { - u8 taskId = FindTaskIdByFunc(sub_802E6D0); - if (taskId == 0xFF) + u8 taskId = FindTaskIdByFunc(Task_StaticCountdown); + if (taskId == TASK_NONE) return FALSE; - gTasks[taskId].data[0] = 2; + gTasks[taskId].tState = STATE_START; return TRUE; } -static bool32 sub_802E6BC(void) +static bool32 IsStaticCountdownRunning(void) { - return FuncIsActiveTask(sub_802E6D0); + return FuncIsActiveTask(Task_StaticCountdown); } -static void sub_802E6D0(u8 taskId) +static void Task_StaticCountdown(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { - case 2: - gUnknown_082FE748[data[1]][2](taskId); - data[0] = 3; + // STATE_IDLE does nothing; wait until started + case STATE_START: + sStaticCountdownFuncs[tFuncSetId][FUNC_START](taskId); + tState = STATE_RUN; break; - case 3: - gUnknown_082FE748[data[1]][3](taskId); + case STATE_RUN: + sStaticCountdownFuncs[tFuncSetId][FUNC_RUN](taskId); break; - case 4: - gUnknown_082FE748[data[1]][1](taskId); + case STATE_END: + sStaticCountdownFuncs[tFuncSetId][FUNC_FREE](taskId); DestroyTask(taskId); break; } } -static void sub_802E75C(u8 taskId, s16 *data) +static void StaticCountdown_CreateSprites(u8 taskId, s16 *data) { u8 i; struct Sprite *sprite; - LoadCompressedSpriteSheet(&gUnknown_082FE6C8[data[3]]); - LoadSpritePalette(&gUnknown_082FE6D8[data[4]]); - for (i = 0; i < data[8]; i++) - data[13 + i] = CreateSprite(&gUnknown_082FE730[data[2]], data[9], data[10], data[7]); - for (i = 0; i < data[8]; i++) + LoadCompressedSpriteSheet(&sSpriteSheet_321Start_Static[tSpriteSheetId]); + LoadSpritePalette(&sSpritePalette_321Start_Static[tSpritePalId]); + for (i = 0; i < tNumSprites; i++) + tSpriteIds(i) = CreateSprite(&sSpriteTemplate_StaticCountdown[tSpriteTemplateId], tX, tY, tSubpriority); + for (i = 0; i < tNumSprites; i++) { - sprite = &gSprites[data[13 + i]]; - sprite->oam.priority = data[6]; + sprite = &gSprites[tSpriteIds(i)]; + sprite->oam.priority = tPriority; sprite->invisible = TRUE; - sprite->data[1] = data[5]; - sprite->data[3] = taskId; - sprite->data[4] = i; - sprite->data[5] = data[13]; + sprite->sInterval = tInterval; + sprite->sTaskId = taskId; + sprite->sId = i; + sprite->sNumberSpriteId = tSpriteIds(0); } } -static void sub_802E83C(u8 taskId) +static void Task_StaticCountdown_Init(u8 taskId) { s16 *data = gTasks[taskId].data; - data[2] = 0; - data[3] = 0; - data[4] = 0; - data[5] = 60; - data[6] = 0; - data[7] = 0; - data[8] = 3; - data[9] = 120; - data[10] = 88; - sub_802E75C(taskId, data); - - StartSpriteAnim(&gSprites[data[14]], 4); - gSprites[data[14]].pos2.x = -32; - - StartSpriteAnim(&gSprites[data[15]], 5); - gSprites[data[15]].pos2.x = 32; + tSpriteTemplateId = 0; + tSpriteSheetId = 0; + tSpritePalId = 0; + tInterval = 60; + tPriority = 0; + tSubpriority = 0; + tNumSprites = 3; + tX = 120; + tY = 88; + StaticCountdown_CreateSprites(taskId, data); + + StartSpriteAnim(&gSprites[tSpriteIds(1)], ANIM_START_MID); + gSprites[tSpriteIds(1)].pos2.x = -32; + + StartSpriteAnim(&gSprites[tSpriteIds(2)], ANIM_START_RIGHT); + gSprites[tSpriteIds(2)].pos2.x = 32; } -static void sub_802E8C8(u8 taskId) +static void Task_StaticCountdown_Free(u8 taskId) { u8 i = 0; s16 *data = gTasks[taskId].data; - for (i = 0; i < data[8]; i++) - DestroySprite(&gSprites[data[13 + i]]); - FreeSpriteTilesByTag(gUnknown_082FE6C8[data[3]].tag); - FreeSpritePaletteByTag(gUnknown_082FE6D8[data[4]].tag); + for (i = 0; i < tNumSprites; i++) + DestroySprite(&gSprites[tSpriteIds(i)]); + FreeSpriteTilesByTag(sSpriteSheet_321Start_Static[tSpriteSheetId].tag); + FreeSpritePaletteByTag(sSpritePalette_321Start_Static[tSpritePalId].tag); } -static void sub_802E938(struct Sprite *sprite) +static void SpriteCB_StaticCountdown(struct Sprite *sprite) { - s16 *data = gTasks[sprite->data[3]].data; + s16 *data = gTasks[sprite->sTaskId].data; - if (data[11] % data[5] != 0) + if (tTimer % tInterval != 0) return; - if (data[11] == data[10]) + if (tTimer == tPrevTime) return; - data[10] = data[11]; - switch (sprite->data[2]) + tPrevTime = tTimer; + switch (sprite->sAnimNum) { - case 0: + case ANIM_THREE: sprite->invisible = FALSE; - case 1: - case 2: + case ANIM_TWO: + case ANIM_ONE: + // Set sprite to a number PlaySE(SE_BALL_BOUNCE_1); - StartSpriteAnim(sprite, sprite->data[2]); + StartSpriteAnim(sprite, sprite->sAnimNum); break; - case 3: + case ANIM_START_LEFT: + // Set sprite to 'Start' PlaySE(SE_PIN); - StartSpriteAnim(sprite, sprite->data[2]); - gSprites[data[14]].invisible = FALSE; - gSprites[data[15]].invisible = FALSE; + StartSpriteAnim(sprite, sprite->sAnimNum); + gSprites[tSpriteIds(1)].invisible = FALSE; + gSprites[tSpriteIds(2)].invisible = FALSE; break; - case 4: + case ANIM_START_LEFT + 1: // End + // Hide countdown sprite->invisible = TRUE; - gSprites[data[14]].invisible = TRUE; - gSprites[data[15]].invisible = TRUE; - data[0] = 4; + gSprites[tSpriteIds(1)].invisible = TRUE; + gSprites[tSpriteIds(2)].invisible = TRUE; + tState = STATE_END; return; } - sprite->data[2]++; + sprite->sAnimNum++; } -static void sub_802EA50(u8 taskId) +static void Task_StaticCountdown_Start(u8 taskId) { s16 *data = gTasks[taskId].data; PlaySE(SE_BALL_BOUNCE_1); - gSprites[data[13]].callback = sub_802E938; - gSprites[data[13]].invisible = FALSE; - gTasks[taskId].data[0] = 3; + gSprites[tSpriteIds(0)].callback = SpriteCB_StaticCountdown; + gSprites[tSpriteIds(0)].invisible = FALSE; + gTasks[taskId].tState = STATE_RUN; } -static void sub_802EAB0(u8 taskId) +// Increment timer for progressing the countdown. +// If the player is the link leader, increment a +// separate timer and send it to group members for +// them to read and use. +static void Task_StaticCountdown_Run(u8 taskId) { - u16 packet[6]; + u16 packet[RFU_PACKET_SIZE]; s16 *data = gTasks[taskId].data; if (gReceivedRemoteLinkPlayers != 0) { - if (gRecvCmds[0][1] == LINKCMD_0x7FFF) - data[11] = gRecvCmds[0][2]; + // Read link timer + if (gRecvCmds[0][1] == LINKCMD_COUNTDOWN) + tTimer = gRecvCmds[0][2]; + if (GetMultiplayerId() == 0) { - data[12]++; + // Player is link leader. + // Send timer to group members + tLinkTimer++; memset(packet, 0, sizeof(packet)); - packet[0] = LINKCMD_0x7FFF; - packet[1] = data[12]; + packet[0] = LINKCMD_COUNTDOWN; + packet[1] = tLinkTimer; Rfu_SendPacket(packet); } } else { - data[11]++; + // Local, just increment own timer + tTimer++; } } +#undef tState +#undef tFuncSetId +#undef tSpriteTemplateId +#undef tSpriteSheetId +#undef tSpritePalId +#undef tInterval +#undef tPriority +#undef tSubpriority +#undef tNumSprites +#undef tX +#undef tY +#undef tPrevTime +#undef tTimer +#undef tLinkTimer +#undef tSpriteIds +#undef sInterval +#undef sAnimNum +#undef sTaskId +#undef sId +#undef sNumberSpriteId + +/* + The countdown that actually gets used by + the wireless minigames starts here +*/ + +static void Task_MinigameCountdown(u8 taskId); +static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId); +static bool32 IsStartGraphicAnimRunning(u8 spriteId); +static void Load321StartGfx(u16 tileTag, u16 palTag); +static u8 CreateNumberSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority); +static void CreateStartSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority, s16 *spriteId1, s16 *spriteId2); +static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3); +static void SpriteCB_Start(struct Sprite *sprite); + +static const u16 s321Start_Pal[] = INCBIN_U16("graphics/minigame_countdown/321start.gbapal"); +static const u32 s321Start_Gfx[] = INCBIN_U32("graphics/minigame_countdown/321start.4bpp.lz"); + #define tState data[0] #define tTilesTag data[2] #define tPalTag data[3] @@ -289,7 +387,7 @@ static void sub_802EAB0(u8 taskId) #define tSpriteId2 data[8] #define tSpriteId3 data[9] -void StartMinigameCountdown(s16 tilesTag, s16 palTag, s16 x, s16 y, u8 subpriority) +void StartMinigameCountdown(u16 tilesTag, u16 palTag, s16 x, s16 y, u8 subpriority) { u8 taskId = CreateTask(Task_MinigameCountdown, 80); gTasks[taskId].tTilesTag = tilesTag; @@ -338,69 +436,82 @@ static void Task_MinigameCountdown(u8 taskId) } } +#define sState data[0] +#define sTimer data[2] +#define sAnimNum data[4] + static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId) { struct Sprite *sprite = &gSprites[spriteId]; - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sub_8007E18(sprite, 0x800, 0x1A); - sprite->data[0]++; + sprite->sState++; // fallthrough case 1: - if (sprite->data[2] == 0) + if (sprite->sTimer == 0) PlaySE(SE_BALL_BOUNCE_2); - if (++sprite->data[2] >= 20) + + if (++sprite->sTimer >= 20) { - sprite->data[2] = 0; + // Ready for jump + sprite->sTimer = 0; StartSpriteAffineAnim(sprite, 1); - sprite->data[0]++; + sprite->sState++; } break; case 2: if (sprite->affineAnimEnded) - sprite->data[0]++; + sprite->sState++; break; case 3: - if (++sprite->data[2] >= 4) + if (++sprite->sTimer >= 4) { - sprite->data[2] = 0; - sprite->data[0]++; + // Start jump + sprite->sTimer = 0; + sprite->sState++; StartSpriteAffineAnim(sprite, 2); } break; case 4: + // Moving up from jump sprite->pos1.y -= 4; - if (++sprite->data[2] >= 8) + if (++sprite->sTimer >= 8) { - if (sprite->data[4] <= 1) + if (sprite->sAnimNum < 2) { - StartSpriteAnim(sprite, sprite->data[4] + 1); - sprite->data[2] = 0; - sprite->data[0]++; + // Swap to the next number + StartSpriteAnim(sprite, sprite->sAnimNum + 1); + sprite->sTimer = 0; + sprite->sState++; } else { - sprite->data[0] = 7; + // End + sprite->sState = 7; return FALSE; } } break; case 5: + // Falling after jump sprite->pos1.y += 4; - if (++sprite->data[2] >= 8) + if (++sprite->sTimer >= 8) { - sprite->data[2] = 0; + // Land from jump + sprite->sTimer = 0; StartSpriteAffineAnim(sprite, 3); - sprite->data[0]++; + sprite->sState++; } break; case 6: if (sprite->affineAnimEnded) { - sprite->data[4]++; - sprite->data[0] = 1; + // Restart for next number + sprite->sAnimNum++; + sprite->sState = 1; } break; case 7: @@ -410,6 +521,10 @@ static bool32 RunMinigameCountdownDigitsAnim(u8 spriteId) return TRUE; } +#undef sState +#undef sTimer +#undef sAnimNum + // First argument is unused. static void InitStartGraphic(u8 spriteId1, u8 spriteId2, u8 spriteId3) { @@ -426,60 +541,70 @@ static bool32 IsStartGraphicAnimRunning(u8 spriteId) return gSprites[spriteId].callback == SpriteCB_Start; } +#define sState data[0] +#define sTimer data[1] +#define sYSpeed data[4] +#define sY data[5] + static void SpriteCB_Start(struct Sprite *sprite) { int y; s16 *data = sprite->data; - switch (data[0]) + switch (sState) { case 0: - data[4] = 64; - data[5] = sprite->pos2.y << 4; - data[0]++; + sYSpeed = 64; + sY = sprite->pos2.y << 4; + sState++; case 1: - data[5] += data[4]; - data[4]++; - sprite->pos2.y = data[5] >> 4; + sY += sYSpeed; + sYSpeed++; + sprite->pos2.y = sY >> 4; if (sprite->pos2.y >= 0) { PlaySE(SE_BALL_BOUNCE_2); sprite->pos2.y = 0; - data[0]++; + sState++; } break; case 2: - data[1] += 12; - if (data[1] >= 128) + sTimer += 12; + if (sTimer >= 128) { PlaySE(SE_BALL_BOUNCE_2); - data[1] = 0; - data[0]++; + sTimer = 0; + sState++; } - y = gSineTable[data[1]]; + y = gSineTable[sTimer]; sprite->pos2.y = -(y >> 4); break; case 3: - data[1] += 16; - if (data[1] >= 128) + sTimer += 16; + if (sTimer >= 128) { PlaySE(SE_BALL_BOUNCE_2); - data[1] = 0; - data[0]++; + sTimer = 0; + sState++; } - sprite->pos2.y = -(gSineTable[data[1]] >> 5); + sprite->pos2.y = -(gSineTable[sTimer] >> 5); break; case 4: - if (++data[1] > 40) + if (++sTimer > 40) sprite->callback = SpriteCallbackDummy; break; } } +#undef sState +#undef sTimer +#undef sYSpeed +#undef sY + static void Load321StartGfx(u16 tileTag, u16 palTag) { - struct CompressedSpriteSheet spriteSheet = {sSpriteSheet_321Start, 0xE00, 0}; - struct SpritePalette spritePalette = {sSpritePal_321Start, 0}; + struct CompressedSpriteSheet spriteSheet = {s321Start_Gfx, 0xE00, 0}; + struct SpritePalette spritePalette = {s321Start_Pal, 0}; spriteSheet.tag = tileTag; spritePalette.tag = palTag; @@ -565,26 +690,26 @@ static const union AnimCmd *const sAnimTable_Start[] = sAnim_StartRight }; -static const union AffineAnimCmd sAffineAnim_Numbers_0[] = +static const union AffineAnimCmd sAffineAnim_Numbers_Normal[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sAffineAnim_Numbers_1[] = +static const union AffineAnimCmd sAffineAnim_Numbers_Squash[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(16, -16, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sAffineAnim_Numbers_2[] = +static const union AffineAnimCmd sAffineAnim_Numbers_Stretch[] = { AFFINEANIMCMD_FRAME(-18, 18, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sAffineAnim_Numbers_3[] = +static const union AffineAnimCmd sAffineAnim_Numbers_Land[] = { AFFINEANIMCMD_FRAME( 6, -6, 0, 8), AFFINEANIMCMD_FRAME( -4, 4, 0, 8), @@ -594,10 +719,10 @@ static const union AffineAnimCmd sAffineAnim_Numbers_3[] = static const union AffineAnimCmd *const sAffineAnimTable_Numbers[] = { - sAffineAnim_Numbers_0, - sAffineAnim_Numbers_1, - sAffineAnim_Numbers_2, - sAffineAnim_Numbers_3 + sAffineAnim_Numbers_Normal, + sAffineAnim_Numbers_Squash, // Push down before the jump + sAffineAnim_Numbers_Stretch, // Stretch up for the jump + sAffineAnim_Numbers_Land // Land after the jump }; static u8 CreateNumberSprite(u16 tileTag, u16 palTag, s16 x, s16 y, u8 subpriority) diff --git a/src/mirage_tower.c b/src/mirage_tower.c index ef7bf7228..d18ddcc0f 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -398,7 +398,7 @@ static void DoScreenShake(u8 taskId) static void IncrementCeilingCrumbleFinishedCount(void) { u8 taskId = FindTaskIdByFunc(WaitCeilingCrumble); - if (taskId != 0xFF) + if (taskId != TASK_NONE) gTasks[taskId].data[0]++; } @@ -610,7 +610,7 @@ static void DoMirageTowerDisintegration(u8 taskId) case 4: UnsetBgTilemapBuffer(0); bgShakeTaskId = FindTaskIdByFunc(UpdateBgShake); - if (bgShakeTaskId != 0xFF) + if (bgShakeTaskId != TASK_NONE) DestroyTask(bgShakeTaskId); sBgShakeOffsets->bgVOFS = sBgShakeOffsets->bgHOFS = 0; SetBgShakeOffsets(); diff --git a/src/mon_markings.c b/src/mon_markings.c index a819d4f9a..e71d6d795 100644 --- a/src/mon_markings.c +++ b/src/mon_markings.c @@ -10,20 +10,22 @@ #include "sprite.h" #include "text_window.h" -#define MENU_TEXT_SPRITE_X_OFFSET 32 +#define ANIM_CURSOR (NUM_MON_MARKINGS * 2) +#define ANIM_TEXT (ANIM_CURSOR + 1) -// static functions -static void sub_811FC80(s16, s16, u16, u16); -static void TaskDummy7(struct Sprite *); -static void sub_811FF40(struct Sprite *); -static void sub_811FF7C(struct Sprite *); -static struct Sprite *sub_811FFD4(u16, u16, const u16 *, u16); +#define SELECTION_OK NUM_MON_MARKINGS +#define SELECTION_CANCEL (SELECTION_OK + 1) -// .rodata -static const u16 gUnknown_0859E65C[] = INCBIN_U16("graphics/misc/mon_markings.gbapal"); -static const u8 gUnknown_0859E67C[] = INCBIN_U8("graphics/misc/mon_markings.4bpp"); +static void CreateMonMarkingsMenuSprites(s16, s16, u16, u16); +static void SpriteCB_Dummy(struct Sprite *); +static void SpriteCB_Marking(struct Sprite *); +static void SpriteCB_Cursor(struct Sprite *); +static struct Sprite *CreateMarkingComboSprite(u16, u16, const u16 *, u16); -static const struct OamData gUnknown_0859EE7C = +static const u16 sMonMarkings_Pal[] = INCBIN_U16("graphics/misc/mon_markings.gbapal"); +static const u8 sMonMarkings_Gfx[] = INCBIN_U8("graphics/misc/mon_markings.4bpp"); + +static const struct OamData sOamData_MenuWindow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -40,7 +42,8 @@ static const struct OamData gUnknown_0859EE7C = .affineParam = 0, }; -static const struct OamData gUnknown_0859EE84 = +// Used for the markings, OK/Cancel text, and cursor sprites +static const struct OamData sOamData_8x8 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -57,99 +60,99 @@ static const struct OamData gUnknown_0859EE84 = .affineParam = 0, }; -static const union AnimCmd gUnknown_0859EE8C[] = +static const union AnimCmd sAnim_Marking_CircleOff[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EE94[] = +static const union AnimCmd sAnim_Marking_CircleOn[] = { ANIMCMD_FRAME(1, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EE9C[] = +static const union AnimCmd sAnim_Marking_SquareOff[] = { ANIMCMD_FRAME(2, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EEA4[] = +static const union AnimCmd sAnim_Marking_SquareOn[] = { ANIMCMD_FRAME(3, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EEAC[] = +static const union AnimCmd sAnim_Marking_TriangleOff[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EEB4[] = +static const union AnimCmd sAnim_Marking_TriangleOn[] = { ANIMCMD_FRAME(5, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EEBC[] = +static const union AnimCmd sAnim_Marking_HeartOff[] = { ANIMCMD_FRAME(6, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EEC4[] = +static const union AnimCmd sAnim_Marking_HeartOn[] = { ANIMCMD_FRAME(7, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EECC[] = +static const union AnimCmd sAnim_Cursor[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EED4[] = +static const union AnimCmd sAnim_OKCancelText[] = { ANIMCMD_FRAME(9, 5), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_0859EEDC[] = +static const union AnimCmd *const sAnims_MenuSprite[] = { - gUnknown_0859EE8C, - gUnknown_0859EE94, - gUnknown_0859EE9C, - gUnknown_0859EEA4, - gUnknown_0859EEAC, - gUnknown_0859EEB4, - gUnknown_0859EEBC, - gUnknown_0859EEC4, - gUnknown_0859EECC, - gUnknown_0859EED4, + sAnim_Marking_CircleOff, + sAnim_Marking_CircleOn, + sAnim_Marking_SquareOff, + sAnim_Marking_SquareOn, + sAnim_Marking_TriangleOff, + sAnim_Marking_TriangleOn, + sAnim_Marking_HeartOff, + sAnim_Marking_HeartOn, + [ANIM_CURSOR] = sAnim_Cursor, + [ANIM_TEXT] = sAnim_OKCancelText, }; -static const union AnimCmd gUnknown_0859EF04[] = +static const union AnimCmd sAnim_MenuWindow_UpperHalf[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF0C[] = +static const union AnimCmd sAnim_MenuWindow_LowerHalf[] = { ANIMCMD_FRAME(64, 5), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_0859EF14[] = +static const union AnimCmd *const sAnims_MenuWindow[] = { - gUnknown_0859EF04, - gUnknown_0859EF0C, + sAnim_MenuWindow_UpperHalf, + sAnim_MenuWindow_LowerHalf, }; -static const struct OamData gUnknown_0859EF1C = +static const struct OamData sOamData_MarkingCombo = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -166,169 +169,166 @@ static const struct OamData gUnknown_0859EF1C = .affineParam = 0, }; -static const union AnimCmd gUnknown_0859EF24[] = +static const union AnimCmd sAnim_MarkingCombo_AllOff[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF2C[] = +static const union AnimCmd sAnim_MarkingCombo_Circle[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF34[] = +static const union AnimCmd sAnim_MarkingCombo_Square[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF3C[] = +static const union AnimCmd sAnim_MarkingCombo_CircleSquare[] = { ANIMCMD_FRAME(12, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF44[] = +static const union AnimCmd sAnim_MarkingCombo_Triangle[] = { ANIMCMD_FRAME(16, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF4C[] = +static const union AnimCmd sAnim_MarkingCombo_CircleTriangle[] = { ANIMCMD_FRAME(20, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF54[] = +static const union AnimCmd sAnim_MarkingCombo_SquareTriangle[] = { ANIMCMD_FRAME(24, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF5C[] = +static const union AnimCmd sAnim_MarkingCombo_CircleSquareTriangle[] = { ANIMCMD_FRAME(28, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF64[] = +static const union AnimCmd sAnim_MarkingCombo_Heart[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF6C[] = +static const union AnimCmd sAnim_MarkingCombo_CircleHeart[] = { ANIMCMD_FRAME(36, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF74[] = +static const union AnimCmd sAnim_MarkingCombo_SquareHeart[] = { ANIMCMD_FRAME(40, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF7C[] = +static const union AnimCmd sAnim_MarkingCombo_CircleSquareHeart[] = { ANIMCMD_FRAME(44, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF84[] = +static const union AnimCmd sAnim_MarkingCombo_TriangleHeart[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF8C[] = +static const union AnimCmd sAnim_MarkingCombo_CircleTriangleHeart[] = { ANIMCMD_FRAME(52, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF94[] = +static const union AnimCmd sAnim_MarkingCombo_SquareTriangleHeart[] = { ANIMCMD_FRAME(56, 5), ANIMCMD_END, }; -static const union AnimCmd gUnknown_0859EF9C[] = +static const union AnimCmd sAnim_MarkingCombo_AllOn[] = { ANIMCMD_FRAME(60, 5), ANIMCMD_END, }; -static const union AnimCmd *const gUnknown_0859EFA4[] = +static const union AnimCmd *const sAnims_MarkingCombo[] = { - gUnknown_0859EF24, - gUnknown_0859EF2C, - gUnknown_0859EF34, - gUnknown_0859EF3C, - gUnknown_0859EF44, - gUnknown_0859EF4C, - gUnknown_0859EF54, - gUnknown_0859EF5C, - gUnknown_0859EF64, - gUnknown_0859EF6C, - gUnknown_0859EF74, - gUnknown_0859EF7C, - gUnknown_0859EF84, - gUnknown_0859EF8C, - gUnknown_0859EF94, - gUnknown_0859EF9C, + sAnim_MarkingCombo_AllOff, + sAnim_MarkingCombo_Circle, + sAnim_MarkingCombo_Square, + sAnim_MarkingCombo_CircleSquare, + sAnim_MarkingCombo_Triangle, + sAnim_MarkingCombo_CircleTriangle, + sAnim_MarkingCombo_SquareTriangle, + sAnim_MarkingCombo_CircleSquareTriangle, + sAnim_MarkingCombo_Heart, + sAnim_MarkingCombo_CircleHeart, + sAnim_MarkingCombo_SquareHeart, + sAnim_MarkingCombo_CircleSquareHeart, + sAnim_MarkingCombo_TriangleHeart, + sAnim_MarkingCombo_CircleTriangleHeart, + sAnim_MarkingCombo_SquareTriangleHeart, + sAnim_MarkingCombo_AllOn, }; -static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; +static EWRAM_DATA struct MonMarkingsMenu *sMenu = NULL; -void sub_811F90C(struct PokemonMarkMenu *ptr) +void InitMonMarkingsMenu(struct MonMarkingsMenu *ptr) { sMenu = ptr; } -void sub_811F918(void) +static void BufferMenuWindowTiles(void) { const struct TilesPal *frame = GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType); sMenu->frameTiles = frame->tiles; sMenu->framePalette = frame->pal; sMenu->tileLoadState = 0; - CpuFill16(0, sMenu->menuWindowSpriteTiles, sizeof(sMenu->menuWindowSpriteTiles)); + CpuFill16(0, sMenu->windowSpriteTiles, sizeof(sMenu->windowSpriteTiles)); } -bool8 sub_811F960(void) +static bool8 BufferMenuFrameTiles(void) { u16 i; - u8 *dest = sMenu->menuWindowSpriteTiles + sMenu->tileLoadState * 0x100; + u8 *dest = sMenu->windowSpriteTiles + sMenu->tileLoadState * 0x100; switch (sMenu->tileLoadState) { case 0: CpuFastCopy(sMenu->frameTiles, dest, TILE_SIZE_4BPP); for (i = 0; i < 6; i++) - { CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 2, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); sMenu->tileLoadState++; break; default: CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 3, dest, TILE_SIZE_4BPP); for (i = 0; i < 6; i++) - { CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 4, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 5, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); sMenu->tileLoadState++; break; case 13: CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 6, dest, TILE_SIZE_4BPP); for (i = 0; i < 6; i++) - { CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 7, dest + TILE_SIZE_4BPP * (i + 1), TILE_SIZE_4BPP); - } + CpuFastCopy(sMenu->frameTiles + TILE_SIZE_4BPP * 8, dest + TILE_SIZE_4BPP * 7, TILE_SIZE_4BPP); sMenu->tileLoadState++; return FALSE; @@ -339,23 +339,23 @@ bool8 sub_811F960(void) return TRUE; } -void sub_811FA90(void) +void BufferMonMarkingsMenuTiles(void) { - sub_811F918(); - while (sub_811F960()); + BufferMenuWindowTiles(); + while (BufferMenuFrameTiles()); } -void sub_811FAA4(u8 markings, s16 x, s16 y) +void OpenMonMarkingsMenu(u8 markings, s16 x, s16 y) { u16 i; sMenu->cursorPos = 0; sMenu->markings = markings; for (i = 0; i < NUM_MON_MARKINGS; i++) sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; - sub_811FC80(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); + CreateMonMarkingsMenuSprites(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); } -void sub_811FAF8(void) +void FreeMonMarkingsMenu(void) { u16 i; @@ -364,33 +364,33 @@ void sub_811FAF8(void) FreeSpriteTilesByTag(sMenu->baseTileTag + i); FreeSpritePaletteByTag(sMenu->basePaletteTag + i); } - for (i = 0; i < 2; i++) + for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++) { - if (!sMenu->menuWindowSprites[i]) + if (!sMenu->windowSprites[i]) return; - DestroySprite(sMenu->menuWindowSprites[i]); - sMenu->menuWindowSprites[i] = NULL; + DestroySprite(sMenu->windowSprites[i]); + sMenu->windowSprites[i] = NULL; } for (i = 0; i < NUM_MON_MARKINGS; i++) { - if (!sMenu->menuMarkingSprites[i]) + if (!sMenu->markingSprites[i]) return; - DestroySprite(sMenu->menuMarkingSprites[i]); - sMenu->menuMarkingSprites[i] = NULL; + DestroySprite(sMenu->markingSprites[i]); + sMenu->markingSprites[i] = NULL; } - if (sMenu->unkSprite) + if (sMenu->cursorSprite) { - DestroySprite(sMenu->unkSprite); - sMenu->unkSprite = NULL; + DestroySprite(sMenu->cursorSprite); + sMenu->cursorSprite = NULL; } - if (sMenu->menuTextSprite) + if (sMenu->textSprite) { - DestroySprite(sMenu->menuTextSprite); - sMenu->menuTextSprite = NULL; + DestroySprite(sMenu->textSprite); + sMenu->textSprite = NULL; } } -bool8 MonMarkingsMenuHandleInput(void) +bool8 HandleMonMarkingsMenuInput(void) { u16 i; @@ -400,7 +400,7 @@ bool8 MonMarkingsMenuHandleInput(void) PlaySE(SE_SELECT); pos = --sMenu->cursorPos; if (pos < 0) - sMenu->cursorPos = 5; + sMenu->cursorPos = SELECTION_CANCEL; return TRUE; } @@ -409,7 +409,7 @@ bool8 MonMarkingsMenuHandleInput(void) s8 pos; PlaySE(SE_SELECT); pos = ++sMenu->cursorPos; - if (pos > 5) + if (pos > SELECTION_CANCEL) sMenu->cursorPos = 0; return TRUE; } @@ -420,12 +420,12 @@ bool8 MonMarkingsMenuHandleInput(void) switch (sMenu->cursorPos) { - case 4: + case SELECTION_OK: sMenu->markings = 0; for (i = 0; i < NUM_MON_MARKINGS; i++) sMenu->markings |= sMenu->markingsArray[i] << i; return FALSE; - case 5: + case SELECTION_CANCEL: return FALSE; } @@ -442,170 +442,181 @@ bool8 MonMarkingsMenuHandleInput(void) return TRUE; } -static void sub_811FC80(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) +#define sMarkingId data[0] +#define sCursorYOffset data[0] + +static void CreateMonMarkingsMenuSprites(s16 x, s16 y, u16 baseTileTag, u16 basePaletteTag) { u16 i; u8 spriteId; struct SpriteSheet sheets[] = { - { sMenu->menuWindowSpriteTiles, 0x1000, baseTileTag }, - { gPokenavConditionMarker_Gfx, 0x320, baseTileTag + 1 }, - { NULL, 0 } + { sMenu->windowSpriteTiles, 0x1000, baseTileTag }, + { gMonMarkingsMenu_Gfx, 0x320, baseTileTag + 1 }, + {} }; struct SpritePalette palettes[] = { { sMenu->framePalette, basePaletteTag }, - { gPokenavConditionMarker_Pal, basePaletteTag + 1}, - { NULL, 0 } + { gMonMarkingsMenu_Pal, basePaletteTag + 1}, + {} }; - struct SpriteTemplate sprTemplate = + struct SpriteTemplate template = { - baseTileTag, - basePaletteTag, - &gUnknown_0859EE7C, - gUnknown_0859EF14, - NULL, - gDummySpriteAffineAnimTable, - TaskDummy7, + .tileTag = baseTileTag, + .paletteTag = basePaletteTag, + .oam = &sOamData_MenuWindow, + .anims = sAnims_MenuWindow, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_Dummy, }; LoadSpriteSheets(sheets); LoadSpritePalettes(palettes); - for (i = 0; i < 2; i++) + // Create window sprites + for (i = 0; i < ARRAY_COUNT(sMenu->windowSprites); i++) { - spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 1); + spriteId = CreateSprite(&template, x + 32, y + 32, 1); if (spriteId != MAX_SPRITES) { - sMenu->menuWindowSprites[i] = &gSprites[spriteId]; + sMenu->windowSprites[i] = &gSprites[spriteId]; StartSpriteAnim(&gSprites[spriteId], i); } else { - sMenu->menuWindowSprites[i] = NULL; + sMenu->windowSprites[i] = NULL; return; } } + sMenu->windowSprites[1]->pos1.y = y + 96; - sMenu->menuWindowSprites[1]->pos1.y = y + 96; - - sprTemplate.tileTag++; - sprTemplate.paletteTag++; - sprTemplate.anims = gUnknown_0859EEDC; - sprTemplate.callback = sub_811FF40; - sprTemplate.oam = &gUnknown_0859EE84; + // Create marking sprites + template.tileTag++; + template.paletteTag++; + template.anims = sAnims_MenuSprite; + template.callback = SpriteCB_Marking; + template.oam = &sOamData_8x8; for (i = 0; i < NUM_MON_MARKINGS; i++) { - spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 0); + spriteId = CreateSprite(&template, x + 32, y + 16 + 16 * i, 0); if (spriteId != MAX_SPRITES) { - sMenu->menuMarkingSprites[i] = &gSprites[spriteId]; - gSprites[spriteId].data[0] = i; + sMenu->markingSprites[i] = &gSprites[spriteId]; + gSprites[spriteId].sMarkingId = i; } else { - sMenu->menuMarkingSprites[i] = NULL; + sMenu->markingSprites[i] = NULL; return; } } - sprTemplate.callback = SpriteCallbackDummy; - - spriteId = CreateSprite(&sprTemplate, 0, 0, 0); - + // Create OK/Cancel text sprite + template.callback = SpriteCallbackDummy; + spriteId = CreateSprite(&template, 0, 0, 0); if (spriteId != MAX_SPRITES) { - sMenu->menuTextSprite = &gSprites[spriteId]; - sMenu->menuTextSprite->oam.shape = SPRITE_SHAPE(32x32); - sMenu->menuTextSprite->oam.size = SPRITE_SIZE(32x32); - StartSpriteAnim(sMenu->menuTextSprite, 9); - sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET; - sMenu->menuTextSprite->pos1.y = y + 80; - CalcCenterToCornerVec(sMenu->menuTextSprite, SPRITE_SHAPE(32x16), SPRITE_SIZE(32x16), ST_OAM_AFFINE_OFF); + sMenu->textSprite = &gSprites[spriteId]; + sMenu->textSprite->oam.shape = SPRITE_SHAPE(32x32); + sMenu->textSprite->oam.size = SPRITE_SIZE(32x32); + StartSpriteAnim(sMenu->textSprite, ANIM_TEXT); + sMenu->textSprite->pos1.x = x + 32; + sMenu->textSprite->pos1.y = y + 80; + CalcCenterToCornerVec(sMenu->textSprite, SPRITE_SHAPE(32x16), SPRITE_SIZE(32x16), ST_OAM_AFFINE_OFF); } else { - sMenu->menuTextSprite = NULL; + sMenu->textSprite = NULL; } - sprTemplate.callback = sub_811FF7C; - spriteId = CreateSprite(&sprTemplate, x + 12, 0, 0); + // Create cursor sprite + template.callback = SpriteCB_Cursor; + spriteId = CreateSprite(&template, x + 12, 0, 0); if (spriteId != MAX_SPRITES) { - sMenu->unkSprite = &gSprites[spriteId]; - sMenu->unkSprite->data[0] = y + 16; - StartSpriteAnim(sMenu->unkSprite, 8); + sMenu->cursorSprite = &gSprites[spriteId]; + sMenu->cursorSprite->sCursorYOffset = y + 16; + StartSpriteAnim(sMenu->cursorSprite, ANIM_CURSOR); } else { - sMenu->unkSprite = NULL; + sMenu->cursorSprite = NULL; } } -static void TaskDummy7(struct Sprite *sprite) +static void SpriteCB_Dummy(struct Sprite *sprite) { } -static void sub_811FF40(struct Sprite *sprite) +static void SpriteCB_Marking(struct Sprite *sprite) { - if (sMenu->markingsArray[sprite->data[0]]) - StartSpriteAnim(sprite, 2 * sprite->data[0] + 1); + if (sMenu->markingsArray[sprite->sMarkingId]) + StartSpriteAnim(sprite, 2 * sprite->sMarkingId + 1); // Set marking 'on' else - StartSpriteAnim(sprite, 2 * sprite->data[0]); + StartSpriteAnim(sprite, 2 * sprite->sMarkingId); // Set marking 'off' } -static void sub_811FF7C(struct Sprite *sprite) +#undef sMarkingId + +static void SpriteCB_Cursor(struct Sprite *sprite) { - sprite->pos1.y = (16 * sMenu->cursorPos) + sprite->data[0]; + sprite->pos1.y = (16 * sMenu->cursorPos) + sprite->sCursorYOffset; } -struct Sprite *CreateMonMarkingsSpriteWithPal(u16 tileTag, u16 paletteTag, const u16 *palette) +#undef sCursorYOffset + +// Creates a mon marking combination sprite with a spritesheet that holds every possible combination, used by the summary screen / Pokénav +struct Sprite *CreateMonMarkingAllCombosSprite(u16 tileTag, u16 paletteTag, const u16 *palette) { if (!palette) - palette = gUnknown_0859E65C; - return sub_811FFD4(tileTag, paletteTag, palette, 16); + palette = sMonMarkings_Pal; + return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1 << NUM_MON_MARKINGS); } -struct Sprite *sub_811FFB4(u16 tileTag, u16 paletteTag, const u16 *palette) +// Creates a mon marking combination sprite with a spritesheet that holds only one combination, used for the currently selected PC mon +struct Sprite *CreateMonMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette) { if (!palette) - palette = gUnknown_0859E65C; - return sub_811FFD4(tileTag, paletteTag, palette, 1); + palette = sMonMarkings_Pal; + return CreateMarkingComboSprite(tileTag, paletteTag, palette, 1); } -static struct Sprite *sub_811FFD4(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) +static struct Sprite *CreateMarkingComboSprite(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) { u8 spriteId; - struct SpriteTemplate sprTemplate; - struct SpriteSheet sheet = { gUnknown_0859E67C, 0x80, tileTag }; + struct SpriteTemplate template; + struct SpriteSheet sheet = { sMonMarkings_Gfx, 0x80, tileTag }; struct SpritePalette sprPalette = { palette, paletteTag }; - sprTemplate.tileTag = tileTag; - sprTemplate.paletteTag = paletteTag; - sprTemplate.oam = &gUnknown_0859EF1C; - sprTemplate.anims = gUnknown_0859EFA4; - sprTemplate.images = NULL; - sprTemplate.affineAnims = gDummySpriteAffineAnimTable; - sprTemplate.callback = TaskDummy7; + template.tileTag = tileTag; + template.paletteTag = paletteTag; + template.oam = &sOamData_MarkingCombo; + template.anims = sAnims_MarkingCombo; + template.images = NULL; + template.affineAnims = gDummySpriteAffineAnimTable; + template.callback = SpriteCB_Dummy; sheet.size = size * 0x80; LoadSpriteSheet(&sheet); LoadSpritePalette(&sprPalette); - spriteId = CreateSprite(&sprTemplate, 0, 0, 0); + spriteId = CreateSprite(&template, 0, 0, 0); if (spriteId != MAX_SPRITES) return &gSprites[spriteId]; else return NULL; } -void sub_8120084(u8 markings, void *dest) +// Update what combination is shown, used for sprites created with CreateMonMarkingComboSprite +void UpdateMonMarkingTiles(u8 markings, void *dest) { - RequestDma3Copy(gUnknown_0859E67C + markings * 0x80, dest, 0x80, 0x10); + RequestDma3Copy(&sMonMarkings_Gfx[markings * 0x80], dest, 0x80, 0x10); } diff --git a/src/move_relearner.c b/src/move_relearner.c index cd4da5835..9fa7bf11c 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -368,7 +368,7 @@ void TeachMoveRelearnerMove(void) ScriptContext2_Enable(); CreateTask(Task_WaitForFadeOut, 10); // Fade to black - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); } static void Task_WaitForFadeOut(u8 taskId) @@ -472,7 +472,7 @@ static void DoMoveRelearnerMain(void) case MENU_STATE_FADE_TO_BLACK: sMoveRelearnerStruct->state++; HideHeartSpritesAndShowTeachMoveText(FALSE); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; case MENU_STATE_WAIT_FOR_FADE: if (!gPaletteFade.active) @@ -645,7 +645,7 @@ static void DoMoveRelearnerMain(void) if (!MoveRelearnerRunTextPrinters()) { sMoveRelearnerStruct->state = MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } break; case MENU_STATE_SHOW_MOVE_SUMMARY_SCREEN: @@ -662,10 +662,10 @@ static void DoMoveRelearnerMain(void) } break; case 22: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); break; case MENU_STATE_FADE_AND_RETURN: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sMoveRelearnerStruct->state++; break; case MENU_STATE_RETURN_TO_FIELD: @@ -676,7 +676,7 @@ static void DoMoveRelearnerMain(void) } break; case MENU_STATE_FADE_FROM_SUMMARY_SCREEN: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sMoveRelearnerStruct->state++; if (sMoveRelearnerMenuSate.showContestInfo == FALSE) { @@ -844,8 +844,8 @@ static void CreateUISprites(void) { int i; - sMoveRelearnerStruct->moveDisplayArrowTask = 0xFF; - sMoveRelearnerStruct->moveListScrollArrowTask = 0xFF; + sMoveRelearnerStruct->moveDisplayArrowTask = TASK_NONE; + sMoveRelearnerStruct->moveListScrollArrowTask = TASK_NONE; AddScrollArrows(); // These are the appeal hearts. @@ -870,12 +870,12 @@ static void CreateUISprites(void) static void AddScrollArrows(void) { - if (sMoveRelearnerStruct->moveDisplayArrowTask == 0xFF) + if (sMoveRelearnerStruct->moveDisplayArrowTask == TASK_NONE) { sMoveRelearnerStruct->moveDisplayArrowTask = AddScrollIndicatorArrowPair(&sDisplayModeArrowsTemplate, &sMoveRelearnerStruct->scrollOffset); } - if (sMoveRelearnerStruct->moveListScrollArrowTask == 0xFF) + if (sMoveRelearnerStruct->moveListScrollArrowTask == TASK_NONE) { gTempScrollArrowTemplate = sMoveListScrollArrowsTemplate; gTempScrollArrowTemplate.fullyDownThreshold = sMoveRelearnerStruct->numMenuChoices - sMoveRelearnerStruct->numToShowAtOnce; @@ -885,16 +885,16 @@ static void AddScrollArrows(void) static void RemoveScrollArrows(void) { - if (sMoveRelearnerStruct->moveDisplayArrowTask != 0xFF) + if (sMoveRelearnerStruct->moveDisplayArrowTask != TASK_NONE) { RemoveScrollIndicatorArrowPair(sMoveRelearnerStruct->moveDisplayArrowTask); - sMoveRelearnerStruct->moveDisplayArrowTask = 0xFF; + sMoveRelearnerStruct->moveDisplayArrowTask = TASK_NONE; } - if (sMoveRelearnerStruct->moveListScrollArrowTask != 0xFF) + if (sMoveRelearnerStruct->moveListScrollArrowTask != TASK_NONE) { RemoveScrollIndicatorArrowPair(sMoveRelearnerStruct->moveListScrollArrowTask); - sMoveRelearnerStruct->moveListScrollArrowTask = 0xFF; + sMoveRelearnerStruct->moveListScrollArrowTask = TASK_NONE; } } diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c index 00dcbf0e3..297883e9c 100644 --- a/src/mystery_event_menu.c +++ b/src/mystery_event_menu.c @@ -138,7 +138,7 @@ static void CB2_MysteryEventMenu(void) PutWindowTilemap(0); CopyWindowToVram(0, 3); ShowBg(0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); gMain.state++; break; case 1: @@ -281,7 +281,7 @@ static void CB2_MysteryEventMenu(void) } break; case 15: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gMain.state++; break; case 16: diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index beb1bf45d..176eab7fc 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -325,7 +325,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) } else { - memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon)); + memcpy(&gPlayerParty[PARTY_SIZE - 1], pokemonPtr, sizeof(struct Pokemon)); memcpy(&mail, mailPtr, sizeof(struct MailStruct)); if (species != SPECIES_EGG) @@ -335,9 +335,9 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT); } - heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM); + heldItem = GetMonData(&gPlayerParty[PARTY_SIZE - 1], MON_DATA_HELD_ITEM); if (ItemIsMail(heldItem)) - GiveMailToMon2(&gPlayerParty[5], &mail); + GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &mail); CompactPartySlots(); CalculatePlayerPartyCount(); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSentOver); @@ -350,7 +350,7 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx) bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx) { u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]; - memcpy((void*)(gSaveBlock2Ptr) + 0xBEC, (void *)data, 0xBC); + memcpy(&gSaveBlock2Ptr->frontier.ereaderTrainer, (void *)data, sizeof(gSaveBlock2Ptr->frontier.ereaderTrainer)); ValidateEReaderTrainer(); StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer); ctx->data[2] = 2; diff --git a/src/mystery_gift.c b/src/mystery_gift.c index a23f159b2..afbe50e4d 100644 --- a/src/mystery_gift.c +++ b/src/mystery_gift.c @@ -394,10 +394,10 @@ bool32 HandleMysteryGiftOrEReaderSetup(s32 mg_or_ereader) ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); - SetBgTilemapBuffer(3, Alloc(0x800)); - SetBgTilemapBuffer(2, Alloc(0x800)); - SetBgTilemapBuffer(1, Alloc(0x800)); - SetBgTilemapBuffer(0, Alloc(0x800)); + SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(2, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); bgid_upload_textbox_1(3); InitWindows(sMainWindows); @@ -558,14 +558,12 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str) { case 0: AddTextPrinterToWindow1(str); - goto inc; + (*textState)++; + break; case 1: DrawDownArrow(1, 0xD0, 0x14, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); if (({JOY_NEW(A_BUTTON | B_BUTTON);})) - { - inc: (*textState)++; - } break; case 2: DrawDownArrow(1, 0xD0, 0x14, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); @@ -574,7 +572,7 @@ bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str) return TRUE; case 0xFF: *textState = 2; - break; + return FALSE; } return FALSE; } @@ -809,8 +807,6 @@ static bool32 ValidateCardOrNews(bool32 cardOrNews) static bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) { - s32 v0; - switch (*state) { case 0: @@ -827,20 +823,18 @@ static bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) case 1: if (cardOrNews == 0) { - v0 = FadeToWonderCardMenu(); - check: - if (v0 != 0) + if (!FadeToWonderCardMenu()) { - goto done; + return FALSE; } - break; } else { - v0 = FadeToWonderNewsMenu(); - goto check; + if (!FadeToWonderNewsMenu()) + { + return FALSE; + } } - done: *state = 0; return TRUE; } diff --git a/src/naming_screen.c b/src/naming_screen.c index be921078e..3c8478e04 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -475,7 +475,7 @@ static void NamingScreen_Init(void) sNamingScreen->bgToHide = 1; sNamingScreen->template = sNamingScreenTemplates[sNamingScreen->templateNum]; sNamingScreen->currentPage = sNamingScreen->template->initialPage; - sNamingScreen->inputCharBaseXPos = (240 - sNamingScreen->template->maxChars * 8) / 2 + 6; + sNamingScreen->inputCharBaseXPos = (DISPLAY_WIDTH - sNamingScreen->template->maxChars * 8) / 2 + 6; if (sNamingScreen->templateNum == NAMING_SCREEN_WALDA) sNamingScreen->inputCharBaseXPos += 11; sNamingScreen->keyRepeatStartDelayCopy = gKeyRepeatStartDelay; @@ -635,8 +635,8 @@ static bool8 MainState_FadeIn(void) CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); - BlendPalettes(-1, 16, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, 0); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sNamingScreen->state++; return FALSE; } @@ -690,7 +690,7 @@ static bool8 MainState_PressedOKButton(void) static bool8 MainState_FadeOut(void) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sNamingScreen->state++; return FALSE; } @@ -826,7 +826,7 @@ static void Task_HandlePageSwapAnim(u8 taskId) static bool8 IsPageSwapAnimNotInProgress(void) { - if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) + if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == TASK_NONE) return TRUE; else return FALSE; @@ -1929,9 +1929,9 @@ struct TextColor // Needed because of alignment static const struct TextColor sTextColorStruct = { { - {TEXT_DYNAMIC_COLOR_4, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}, - {TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}, - {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY} + {TEXT_DYNAMIC_COLOR_4, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, + {TEXT_DYNAMIC_COLOR_5, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}, + {TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY} } }; @@ -1999,7 +1999,7 @@ static void DrawKeyboardPageOnDeck(void) static void PrintControls(void) { - const u8 color[3] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY }; + const u8 color[3] = { TEXT_DYNAMIC_COLOR_6, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; FillWindowPixelBuffer(sNamingScreen->windows[WIN_BANNER], PIXEL_FILL(15)); AddTextPrinterParameterized3(sNamingScreen->windows[WIN_BANNER], 0, 2, 1, color, 0, gText_MoveOkBack); diff --git a/src/new_game.c b/src/new_game.c index 55a568132..2a950efbc 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -48,23 +48,19 @@ extern const u8 EventScript_ResetAllMapFlags[]; -// this file's functions static void ClearFrontierRecord(void); static void WarpToTruck(void); -static void ResetMiniGamesResults(void); +static void ResetMiniGamesRecords(void); -// EWRAM vars EWRAM_DATA bool8 gDifferentSaveFile = FALSE; EWRAM_DATA bool8 gEnableContestDebugging = FALSE; -// const rom data static const struct ContestWinner sContestWinnerPicDummy = { .monName = _(""), .trainerName = _("") }; -// code void SetTrainerId(u32 trainerId, u8 *dst) { dst[0] = trainerId; @@ -87,7 +83,7 @@ void CopyTrainerId(u8 *dst, u8 *src) static void InitPlayerTrainerId(void) { - u32 trainerId = (Random() << 0x10) | GetGeneratedTrainerIdLower(); + u32 trainerId = (Random() << 16) | GetGeneratedTrainerIdLower(); SetTrainerId(trainerId, gSaveBlock2Ptr->playerTrainerId); } @@ -114,7 +110,9 @@ void ClearAllContestWinnerPics(void) s32 i; ClearContestWinnerPicsInContestHall(); - for (i = 8; i < 13; i++) + + // Clear Museum paintings + for (i = MUSEUM_CONTEST_WINNERS_START; i < NUM_CONTEST_WINNERS; i++) gSaveBlock1Ptr->contestWinners[i] = sContestWinnerPicDummy; } @@ -140,7 +138,7 @@ void Sav2_ClearSetDefault(void) void ResetMenuAndMonGlobals(void) { - gDifferentSaveFile = 0; + gDifferentSaveFile = FALSE; ResetPokedexScrollPositions(); ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); @@ -153,7 +151,7 @@ void NewGameInitData(void) if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT) RtcReset(); - gDifferentSaveFile = 1; + gDifferentSaveFile = TRUE; gSaveBlock2Ptr->encryptionKey = 0; ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); @@ -196,7 +194,7 @@ void NewGameInitData(void) ResetLotteryCorner(); WarpToTruck(); ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags); - ResetMiniGamesResults(); + ResetMiniGamesRecords(); InitUnionRoomChatRegisteredTexts(); InitLilycoveLady(); ResetAllApprenticeData(); @@ -208,10 +206,10 @@ void NewGameInitData(void) ResetContestLinkResults(); } -static void ResetMiniGamesResults(void) +static void ResetMiniGamesRecords(void) { CpuFill16(0, &gSaveBlock2Ptr->berryCrush, sizeof(struct BerryCrush)); SetBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, 0); - ResetPokeJumpResults(); + ResetPokemonJumpRecords(); CpuFill16(0, &gSaveBlock2Ptr->berryPick, sizeof(struct BerryPickingResults)); } diff --git a/src/option_menu.c b/src/option_menu.c index b6440a89c..0174b69db 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -75,7 +75,7 @@ static u8 ButtonMode_ProcessInput(u8 selection); static void ButtonMode_DrawChoices(u8 selection); static void DrawTextOption(void); static void DrawOptionMenuTexts(void); -static void sub_80BB154(void); +static void DrawBgWindowFrames(void); EWRAM_DATA static bool8 sArrowPressed = FALSE; @@ -185,9 +185,9 @@ void CB2_InitOptionMenu(void) DeactivateAllTextPrinters(); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WININ, 1); - SetGpuReg(REG_OFFSET_WINOUT, 35); - SetGpuReg(REG_OFFSET_BLDCNT, 193); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_DARKEN); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 4); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); @@ -228,7 +228,7 @@ void CB2_InitOptionMenu(void) DrawOptionMenuTexts(); gMain.state++; case 9: - sub_80BB154(); + DrawBgWindowFrames(); gMain.state++; break; case 10: @@ -256,7 +256,7 @@ void CB2_InitOptionMenu(void) break; } case 11: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(VBlankCB); SetMainCallback2(MainCB2); return; @@ -365,7 +365,7 @@ static void Task_OptionMenuSave(u8 taskId) gSaveBlock2Ptr->optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; gSaveBlock2Ptr->optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_OptionMenuFadeOut; } @@ -381,7 +381,7 @@ static void Task_OptionMenuFadeOut(u8 taskId) static void HighlightOptionMenuItem(u8 index) { - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(16, 224)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(16, DISPLAY_WIDTH - 16)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(index * 16 + 40, index * 16 + 56)); } @@ -642,25 +642,37 @@ static void DrawOptionMenuTexts(void) CopyWindowToVram(WIN_OPTIONS, 3); } -static void sub_80BB154(void) +#define TILE_TOP_CORNER_L 0x1A2 +#define TILE_TOP_EDGE 0x1A3 +#define TILE_TOP_CORNER_R 0x1A4 +#define TILE_LEFT_EDGE 0x1A5 +#define TILE_RIGHT_EDGE 0x1A7 +#define TILE_BOT_CORNER_L 0x1A8 +#define TILE_BOT_EDGE 0x1A9 +#define TILE_BOT_CORNER_R 0x1AA + +static void DrawBgWindowFrames(void) { - // bg, tileNum, x, y, width, height, pal - FillBgTilemapBufferRect(1, 0x1A2, 1, 0, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A3, 2, 0, 0x1B, 1, 7); - FillBgTilemapBufferRect(1, 0x1A4, 28, 0, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A5, 1, 1, 1, 2, 7); - FillBgTilemapBufferRect(1, 0x1A7, 28, 1, 1, 2, 7); - FillBgTilemapBufferRect(1, 0x1A8, 1, 3, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A9, 2, 3, 0x1B, 1, 7); - FillBgTilemapBufferRect(1, 0x1AA, 28, 3, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A2, 1, 4, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A3, 2, 4, 0x1A, 1, 7); - FillBgTilemapBufferRect(1, 0x1A4, 28, 4, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A5, 1, 5, 1, 0x12, 7); - FillBgTilemapBufferRect(1, 0x1A7, 28, 5, 1, 0x12, 7); - FillBgTilemapBufferRect(1, 0x1A8, 1, 19, 1, 1, 7); - FillBgTilemapBufferRect(1, 0x1A9, 2, 19, 0x1A, 1, 7); - FillBgTilemapBufferRect(1, 0x1AA, 28, 19, 1, 1, 7); + // bg, tile, x, y, width, height, palNum + // Draw title window frame + FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 0, 1, 1, 7); + FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 0, 27, 1, 7); + FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 28, 0, 1, 1, 7); + FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 1, 1, 2, 7); + FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 28, 1, 1, 2, 7); + FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 3, 1, 1, 7); + FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 3, 27, 1, 7); + FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 28, 3, 1, 1, 7); + + // Draw options list window frame + FillBgTilemapBufferRect(1, TILE_TOP_CORNER_L, 1, 4, 1, 1, 7); + FillBgTilemapBufferRect(1, TILE_TOP_EDGE, 2, 4, 26, 1, 7); + FillBgTilemapBufferRect(1, TILE_TOP_CORNER_R, 28, 4, 1, 1, 7); + FillBgTilemapBufferRect(1, TILE_LEFT_EDGE, 1, 5, 1, 18, 7); + FillBgTilemapBufferRect(1, TILE_RIGHT_EDGE, 28, 5, 1, 18, 7); + FillBgTilemapBufferRect(1, TILE_BOT_CORNER_L, 1, 19, 1, 1, 7); + FillBgTilemapBufferRect(1, TILE_BOT_EDGE, 2, 19, 26, 1, 7); + FillBgTilemapBufferRect(1, TILE_BOT_CORNER_R, 28, 19, 1, 1, 7); CopyBgTilemapBufferToVram(1); } diff --git a/src/overworld.c b/src/overworld.c index 72aa17929..600333a47 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -68,10 +68,20 @@ #include "constants/trainer_hill.h" #include "constants/weather.h" -#define PLAYER_TRADING_STATE_IDLE 0x80 -#define PLAYER_TRADING_STATE_BUSY 0x81 -#define PLAYER_TRADING_STATE_UNK_2 0x82 -#define PLAYER_TRADING_STATE_EXITING_ROOM 0x83 +struct CableClubPlayer +{ + u8 playerId; + u8 isLocalPlayer; + u8 movementMode; + u8 facing; + struct MapPosition pos; + u16 metatileBehavior; +}; + +#define PLAYER_LINK_STATE_IDLE 0x80 +#define PLAYER_LINK_STATE_BUSY 0x81 +#define PLAYER_LINK_STATE_READY 0x82 +#define PLAYER_LINK_STATE_EXITING_ROOM 0x83 #define FACING_NONE 0 #define FACING_UP 1 @@ -92,89 +102,88 @@ static void CB2_ReturnToFieldLink(void); static void CB2_LoadMapOnReturnToFieldCableClub(void); static void CB2_LoadMap2(void); static void VBlankCB_Field(void); -static void SpriteCB_LinkPlayer(struct Sprite *sprite); +static void SpriteCB_LinkPlayer(struct Sprite *); static void ChooseAmbientCrySpecies(void); -static void DoMapLoadLoop(u8 *state); -static bool32 LoadMapInStepsLocal(u8 *state, bool32); -static bool32 LoadMapInStepsLink(u8 *state); -static bool32 ReturnToFieldLocal(u8 *state); -static bool32 ReturnToFieldLink(u8 *state); +static void DoMapLoadLoop(u8 *); +static bool32 LoadMapInStepsLocal(u8 *, bool32); +static bool32 LoadMapInStepsLink(u8 *); +static bool32 ReturnToFieldLocal(u8 *); +static bool32 ReturnToFieldLink(u8 *); static void InitObjectEventsLink(void); static void InitObjectEventsLocal(void); static void InitOverworldGraphicsRegisters(void); static u8 GetSpriteForLinkedPlayer(u8); -static u16 KeyInterCB_SendNothing(u32 a1); +static u16 KeyInterCB_SendNothing(u32); static void ResetMirageTowerAndSaveBlockPtrs(void); -static void sub_80867D8(void); +static void ResetScreenForMapLoad(void); static void OffsetCameraFocusByLinkPlayerId(void); static void SpawnLinkPlayers(void); static void SetCameraToTrackGuestPlayer(void); -static void ResumeMap(bool32 arg0); +static void ResumeMap(bool32); static void SetCameraToTrackPlayer(void); -static void sub_8086A68(void); +static void InitObjectEventsReturnToField(void); static void InitViewGraphics(void); static void SetCameraToTrackGuestPlayer_2(void); static void CreateLinkPlayerSprites(void); static void ClearAllPlayerKeys(void); -static void ResetAllTradingStates(void); +static void ResetAllPlayerLinkStates(void); static void UpdateHeldKeyCode(u16); static void UpdateAllLinkPlayers(u16*, s32); -static u8 FlipVerticalAndClearForced(u8 a1, u8 a2); -static u8 LinkPlayerDetectCollision(u8 selfObjEventId, u8 a2, s16 x, s16 y); -static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion); -static void GetLinkPlayerCoords(u8 linkPlayerId, u16 *x, u16 *y); -static u8 GetLinkPlayerFacingDirection(u8 linkPlayerId); -static u8 GetLinkPlayerElevation(u8 linkPlayerId); -static s32 sub_80878E4(u8 linkPlayerId); -static u8 GetLinkPlayerIdAt(s16 x, s16 y); -static void SetPlayerFacingDirection(u8 linkPlayerId, u8 a2); -static void ZeroObjectEvent(struct ObjectEvent *objEvent); -static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 a4); -static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y); -static void sub_80877DC(u8 linkPlayerId, u8 a2); -static void sub_808780C(u8 linkPlayerId); -static u8 GetSpriteForLinkedPlayer(u8 linkPlayerId); +static u8 FlipVerticalAndClearForced(u8, u8); +static u8 LinkPlayerDetectCollision(u8, u8, s16, s16); +static void CreateLinkPlayerSprite(u8, u8); +static void GetLinkPlayerCoords(u8, u16 *, u16 *); +static u8 GetLinkPlayerFacingDirection(u8); +static u8 GetLinkPlayerElevation(u8); +static s32 GetLinkPlayerObjectStepTimer(u8); +static u8 GetLinkPlayerIdAt(s16, s16); +static void SetPlayerFacingDirection(u8, u8); +static void ZeroObjectEvent(struct ObjectEvent *); +static void SpawnLinkPlayerObjectEvent(u8, s16, s16, u8); +static void InitLinkPlayerObjectEventPos(struct ObjectEvent *, s16, s16); +static void SetLinkPlayerObjectRange(u8, u8); +static void DestroyLinkPlayerObject(u8); +static u8 GetSpriteForLinkedPlayer(u8); static void RunTerminateLinkScript(void); static u32 GetLinkSendQueueLength(void); -static void ZeroLinkPlayerObjectEvent(struct LinkPlayerObjectEvent *linkPlayerObjEvent); -static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *a1); -static u16 GetDirectionForEventScript(const u8 *script); -static void sub_8087510(void); +static void ZeroLinkPlayerObjectEvent(struct LinkPlayerObjectEvent *); +static const u8 *TryInteractWithPlayer(struct CableClubPlayer *); +static u16 GetDirectionForEventScript(const u8 *); +static void InitLinkPlayerQueueScript(void); static void InitLinkRoomStartMenuScript(void); -static void sub_8087530(const u8 *script); -static void CreateConfirmLeaveTradeRoomPrompt(void); -static void InitMenuBasedScript(const u8 *script); -static void LoadTradeRoomPlayer(s32 linkPlayerId, s32 a2, struct TradeRoomPlayer *a3); -static bool32 sub_8087340(struct TradeRoomPlayer *a1); -static bool32 sub_8087340_2(struct TradeRoomPlayer *a1); -static u8 *TryGetTileEventScript(struct TradeRoomPlayer *a1); -static bool32 PlayerIsAtSouthExit(struct TradeRoomPlayer *a1); -static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *a1); +static void RunInteractLocalPlayerScript(const u8 *); +static void RunConfirmLeaveCableClubScript(void); +static void InitMenuBasedScript(const u8 *); +static void LoadCableClubPlayer(s32, s32, struct CableClubPlayer *); +static bool32 IsCableClubPlayerUnfrozen(struct CableClubPlayer *); +static bool32 CanCableClubPlayerPressStart(struct CableClubPlayer *); +static u8 *TryGetTileEventScript(struct CableClubPlayer *); +static bool32 PlayerIsAtSouthExit(struct CableClubPlayer *); +static const u8 *TryInteractWithPlayer(struct CableClubPlayer *); static u16 KeyInterCB_DeferToRecvQueue(u32); static u16 KeyInterCB_DeferToSendQueue(u32); -static void ResetPlayerHeldKeys(u16 *a1); -static u16 KeyInterCB_SelfIdle(u32 a1); -static u16 KeyInterCB_DeferToEventScript(u32 a1); -static u16 GetDirectionForDpadKey(u16 a1); +static void ResetPlayerHeldKeys(u16 *); +static u16 KeyInterCB_SelfIdle(u32); +static u16 KeyInterCB_DeferToEventScript(u32); +static u16 GetDirectionForDpadKey(u16); static void CB1_UpdateLinkState(void); static void SetKeyInterceptCallback(u16 (*func)(u32)); static void SetFieldVBlankCallback(void); static void FieldClearVBlankHBlankCallbacks(void); static void TransitionMapMusic(void); -static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *playerStruct, u16 a2, u8 a3); -static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *playerStruct, u8 a2, u16 a3, u8 a4); +static u8 GetAdjustedInitialTransitionFlags(struct InitialPlayerAvatarState *, u16, u8); +static u8 GetAdjustedInitialDirection(struct InitialPlayerAvatarState *, u8, u16, u8); static u16 GetCenterScreenMetatileBehavior(void); // IWRAM bss vars static void *sUnusedOverworldCallback; -static u8 sPlayerTradingStates[MAX_LINK_PLAYERS]; +static u8 sPlayerLinkStates[MAX_LINK_PLAYERS]; // This callback is called with a player's key code. It then returns an // adjusted key code, effectively intercepting the input before anything // can process it. static u16 (*sPlayerKeyInterceptCallback)(u32); -static bool8 sUnknown_03000E18; +static bool8 sReceivingFromLink; static u8 sRfuKeepAliveTimer; -static u32 sUnusedVar; // IWRAM common u16 *gBGTilemapBuffers1; @@ -312,13 +321,13 @@ static const struct ScanlineEffectParams sFlashEffectParams = static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); -static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); +static u8 MovementEventModeCB_Scripted(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); static u8 (*const gLinkPlayerMovementModes[])(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8) = { - MovementEventModeCB_Normal, // MOVEMENT_MODE_FREE - MovementEventModeCB_Ignored, // MOVEMENT_MODE_FROZEN - MovementEventModeCB_Normal_2, // MOVEMENT_MODE_SCRIPTED + [MOVEMENT_MODE_FREE] = MovementEventModeCB_Normal, + [MOVEMENT_MODE_FROZEN] = MovementEventModeCB_Ignored, + [MOVEMENT_MODE_SCRIPTED] = MovementEventModeCB_Scripted, }; static u8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *, struct ObjectEvent *, u8); @@ -412,7 +421,7 @@ static void Overworld_ResetStateAfterWhiteOut(void) } } -static void sub_8084788(void) +static void UpdateMiscOverworldStates(void) { FlagClear(FLAG_SYS_SAFARI_MODE); ChooseAmbientCrySpecies(); @@ -1134,7 +1143,7 @@ void Overworld_PlaySpecialMapMusic(void) { u16 music = GetCurrLocationDefaultMusic(); - if (music != MUS_ABNORMAL_WEATHER && music != 0xFFFF) + if (music != MUS_ABNORMAL_WEATHER && music != MUS_NONE) { if (gSaveBlock1Ptr->savedMusic) music = gSaveBlock1Ptr->savedMusic; @@ -1164,7 +1173,7 @@ static void TransitionMapMusic(void) { u16 newMusic = GetWarpDestinationMusic(); u16 currentMusic = GetCurrentMapMusic(); - if (newMusic != MUS_ABNORMAL_WEATHER && newMusic != 0xFFFF) + if (newMusic != MUS_ABNORMAL_WEATHER && newMusic != MUS_NONE) { if (currentMusic == MUS_UNDERWATER || currentMusic == MUS_SURF) return; @@ -1627,7 +1636,7 @@ static void CB2_ReturnToFieldLocal(void) static void CB2_ReturnToFieldLink(void) { - if (!sub_8087598() && ReturnToFieldLink(&gMain.state)) + if (!Overworld_LinkRecvQueueLengthMoreThan2() && ReturnToFieldLink(&gMain.state)) SetMainCallback2(CB2_Overworld); } @@ -1669,14 +1678,14 @@ void CB2_ReturnToFieldContinueScriptPlayMapMusic(void) CB2_ReturnToField(); } -void sub_80861E8(void) +void CB2_ReturnToFieldFadeFromBlack(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = FieldCB_WarpExitFadeFromBlack; CB2_ReturnToField(); } -static void sub_8086204(void) +static void FieldCB_FadeTryShowMapPopup(void) { if (SHOW_MAP_NAME_ENABLED && SecretBaseMapPopupEnabled() == TRUE) ShowMapNamePopup(); @@ -1705,7 +1714,7 @@ void CB2_ContinueSavedGame(void) UnfreezeObjectEvents(); DoTimeBasedEvents(); - sub_8084788(); + UpdateMiscOverworldStates(); if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) InitBattlePyramidMap(TRUE); else if (trainerHillMapId != 0) @@ -1728,7 +1737,7 @@ void CB2_ContinueSavedGame(void) else { TryPutTodaysRivalTrainerOnAir(); - gFieldCallback = sub_8086204; + gFieldCallback = FieldCB_FadeTryShowMapPopup; SetMainCallback1(CB1_Overworld); CB2_ReturnToField(); } @@ -1797,7 +1806,7 @@ static bool32 LoadMapInStepsLink(u8 *state) ScriptContext1_Init(); ScriptContext2_Disable(); ResetMirageTowerAndSaveBlockPtrs(); - sub_80867D8(); + ResetScreenForMapLoad(); (*state)++; break; case 1: @@ -1878,7 +1887,7 @@ static bool32 LoadMapInStepsLocal(u8 *state, bool32 a2) break; case 1: ResetMirageTowerAndSaveBlockPtrs(); - sub_80867D8(); + ResetScreenForMapLoad(); (*state)++; break; case 2: @@ -1945,9 +1954,9 @@ static bool32 ReturnToFieldLocal(u8 *state) { case 0: ResetMirageTowerAndSaveBlockPtrs(); - sub_80867D8(); + ResetScreenForMapLoad(); ResumeMap(FALSE); - sub_8086A68(); + InitObjectEventsReturnToField(); SetCameraToTrackPlayer(); (*state)++; break; @@ -1974,7 +1983,7 @@ static bool32 ReturnToFieldLink(u8 *state) case 0: FieldClearVBlankHBlankCallbacks(); ResetMirageTowerAndSaveBlockPtrs(); - sub_80867D8(); + ResetScreenForMapLoad(); (*state)++; break; case 1: @@ -1983,7 +1992,7 @@ static bool32 ReturnToFieldLink(u8 *state) break; case 2: CreateLinkPlayerSprites(); - sub_8086A68(); + InitObjectEventsReturnToField(); SetCameraToTrackGuestPlayer_2(); (*state)++; break; @@ -2055,13 +2064,13 @@ static void ResetMirageTowerAndSaveBlockPtrs(void) MoveSaveBlocks_ResetHeap(); } -static void sub_80867D8(void) +static void ResetScreenForMapLoad(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ScanlineEffect_Stop(); DmaClear16(3, PLTT + 2, PLTT_SIZE - 2); - DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); ResetOamRange(0, 128); LoadOam(); } @@ -2158,9 +2167,9 @@ static void InitObjectEventsLocal(void) TryRunOnWarpIntoMapScript(); } -static void sub_8086A68(void) +static void InitObjectEventsReturnToField(void) { - sub_808E16C(0, 0); + SpawnObjectEventsOnReturnToField(0, 0); RotatingGate_InitPuzzleAndGraphics(); RunOnReturnToFieldMapScript(); } @@ -2242,7 +2251,7 @@ static void CB1_UpdateLinkState(void) void ResetAllMultiplayerState(void) { - ResetAllTradingStates(); + ResetAllPlayerLinkStates(); SetKeyInterceptCallback(KeyInterCB_SelfIdle); } @@ -2267,57 +2276,57 @@ static void CheckRfuKeepAliveTimer(void) LinkRfu_FatalError(); } -static void ResetAllTradingStates(void) +static void ResetAllPlayerLinkStates(void) { s32 i; for (i = 0; i < MAX_LINK_PLAYERS; i++) - sPlayerTradingStates[i] = PLAYER_TRADING_STATE_IDLE; + sPlayerLinkStates[i] = PLAYER_LINK_STATE_IDLE; } -// Returns true if all connected players are in tradingState. -static bool32 AreAllPlayersInTradingState(u16 tradingState) +// Returns true if all connected players are in state. +static bool32 AreAllPlayersInLinkState(u16 state) { s32 i; s32 count = gFieldLinkPlayerCount; for (i = 0; i < count; i++) - if (sPlayerTradingStates[i] != tradingState) + if (sPlayerLinkStates[i] != state) return FALSE; return TRUE; } -static bool32 IsAnyPlayerInTradingState(u16 tradingState) +static bool32 IsAnyPlayerInLinkState(u16 state) { s32 i; s32 count = gFieldLinkPlayerCount; for (i = 0; i < count; i++) - if (sPlayerTradingStates[i] == tradingState) + if (sPlayerLinkStates[i] == state) return TRUE; return FALSE; } -static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlayer *trainer, u16 *forceFacing) +static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct CableClubPlayer *trainer, u16 *forceFacing) { const u8 *script; - if (sPlayerTradingStates[playerId] == PLAYER_TRADING_STATE_IDLE) + if (sPlayerLinkStates[playerId] == PLAYER_LINK_STATE_IDLE) { script = TryGetTileEventScript(trainer); if (script) { *forceFacing = GetDirectionForEventScript(script); - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); - sub_8087530(script); + RunInteractLocalPlayerScript(script); } return; } - if (IsAnyPlayerInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE) + if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) { - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); @@ -2329,9 +2338,9 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay switch (key) { case LINK_KEY_CODE_START_BUTTON: - if (sub_8087340_2(trainer)) + if (CanCableClubPlayerPressStart(trainer)) { - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); @@ -2342,11 +2351,11 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay case LINK_KEY_CODE_DPAD_DOWN: if (PlayerIsAtSouthExit(trainer) == TRUE) { - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); - CreateConfirmLeaveTradeRoomPrompt(); + RunConfirmLeaveCableClubScript(); } } break; @@ -2354,7 +2363,7 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay script = TryInteractWithPlayer(trainer); if (script) { - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); @@ -2363,24 +2372,24 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay } break; case LINK_KEY_CODE_HANDLE_RECV_QUEUE: - if (sub_8087340(trainer)) + if (IsCableClubPlayerUnfrozen(trainer)) { - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToRecvQueue); - sub_8087510(); + InitLinkPlayerQueueScript(); } } break; case LINK_KEY_CODE_HANDLE_SEND_QUEUE: - if (sub_8087340(trainer)) + if (IsCableClubPlayerUnfrozen(trainer)) { - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; if (trainer->isLocalPlayer) { SetKeyInterceptCallback(KeyInterCB_DeferToSendQueue); - sub_8087510(); + InitLinkPlayerQueueScript(); } } break; @@ -2390,35 +2399,35 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay switch (key) { case LINK_KEY_CODE_EXIT_ROOM: - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_EXITING_ROOM; + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_EXITING_ROOM; break; - case LINK_KEY_CODE_UNK_2: - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_UNK_2; + case LINK_KEY_CODE_READY: + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_READY; break; - case LINK_KEY_CODE_UNK_4: - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_IDLE; + case LINK_KEY_CODE_IDLE: + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_IDLE; if (trainer->isLocalPlayer) SetKeyInterceptCallback(KeyInterCB_SelfIdle); break; - case LINK_KEY_CODE_UNK_7: - if (sPlayerTradingStates[playerId] == PLAYER_TRADING_STATE_UNK_2) - sPlayerTradingStates[playerId] = PLAYER_TRADING_STATE_BUSY; + case LINK_KEY_CODE_EXIT_SEAT: + if (sPlayerLinkStates[playerId] == PLAYER_LINK_STATE_READY) + sPlayerLinkStates[playerId] = PLAYER_LINK_STATE_BUSY; break; } } static void UpdateAllLinkPlayers(u16 *keys, s32 selfId) { - struct TradeRoomPlayer trainer; + struct CableClubPlayer trainer; s32 i; for (i = 0; i < MAX_LINK_PLAYERS; i++) { u8 key = keys[i]; u16 setFacing = FACING_NONE; - LoadTradeRoomPlayer(i, selfId, &trainer); + LoadCableClubPlayer(i, selfId, &trainer); HandleLinkPlayerKeyInput(i, key, &trainer, &setFacing); - if (sPlayerTradingStates[i] == PLAYER_TRADING_STATE_IDLE) + if (sPlayerLinkStates[i] == PLAYER_LINK_STATE_IDLE) setFacing = GetDirectionForDpadKey(key); SetPlayerFacingDirection(i, setFacing); } @@ -2505,7 +2514,7 @@ static u16 KeyInterCB_SelfIdle(u32 key) return LINK_KEY_CODE_HANDLE_SEND_QUEUE; } -static u16 sub_80870EC(u32 key) +static u16 KeyInterCB_Idle(u32 key) { CheckRfuKeepAliveTimer(); return LINK_KEY_CODE_EMPTY; @@ -2522,8 +2531,8 @@ static u16 KeyInterCB_DeferToEventScript(u32 key) } else { - retVal = LINK_KEY_CODE_UNK_4; - SetKeyInterceptCallback(sub_80870EC); + retVal = LINK_KEY_CODE_IDLE; + SetKeyInterceptCallback(KeyInterCB_Idle); } return retVal; } @@ -2538,9 +2547,9 @@ static u16 KeyInterCB_DeferToRecvQueue(u32 key) } else { - retVal = LINK_KEY_CODE_UNK_4; + retVal = LINK_KEY_CODE_IDLE; ScriptContext2_Disable(); - SetKeyInterceptCallback(sub_80870EC); + SetKeyInterceptCallback(KeyInterCB_Idle); } return retVal; } @@ -2555,27 +2564,27 @@ static u16 KeyInterCB_DeferToSendQueue(u32 key) } else { - retVal = LINK_KEY_CODE_UNK_4; + retVal = LINK_KEY_CODE_IDLE; ScriptContext2_Disable(); - SetKeyInterceptCallback(sub_80870EC); + SetKeyInterceptCallback(KeyInterCB_Idle); } return retVal; } -static u16 KeyInterCB_DoNothingAndKeepAlive(u32 key) +static u16 KeyInterCB_ExitingSeat(u32 key) { CheckRfuKeepAliveTimer(); return LINK_KEY_CODE_EMPTY; } -static u16 sub_8087170(u32 keyOrPlayerId) +static u16 KeyInterCB_Ready(u32 keyOrPlayerId) { - if (sPlayerTradingStates[keyOrPlayerId] == PLAYER_TRADING_STATE_UNK_2) + if (sPlayerLinkStates[keyOrPlayerId] == PLAYER_LINK_STATE_READY) { if (JOY_NEW(B_BUTTON)) { - SetKeyInterceptCallback(KeyInterCB_DoNothingAndKeepAlive); - return LINK_KEY_CODE_UNK_7; + SetKeyInterceptCallback(KeyInterCB_ExitingSeat); + return LINK_KEY_CODE_EXIT_SEAT; } else { @@ -2589,10 +2598,10 @@ static u16 sub_8087170(u32 keyOrPlayerId) } } -static u16 sub_80871AC(u32 a1) +static u16 KeyInterCB_SetReady(u32 a1) { - SetKeyInterceptCallback(sub_8087170); - return LINK_KEY_CODE_UNK_2; + SetKeyInterceptCallback(KeyInterCB_Ready); + return LINK_KEY_CODE_READY; } static u16 KeyInterCB_SendNothing(u32 key) @@ -2605,9 +2614,9 @@ static u16 KeyInterCB_WaitForPlayersToExit(u32 keyOrPlayerId) // keyOrPlayerId could be any keycode. This callback does no sanity checking // on the size of the key. It's assuming that it is being called from // CB1_UpdateLinkState. - if (sPlayerTradingStates[keyOrPlayerId] != PLAYER_TRADING_STATE_EXITING_ROOM) + if (sPlayerLinkStates[keyOrPlayerId] != PLAYER_LINK_STATE_EXITING_ROOM) CheckRfuKeepAliveTimer(); - if (AreAllPlayersInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE) + if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) { ScriptContext1_SetupScript(EventScript_DoLinkRoomExit); SetKeyInterceptCallback(KeyInterCB_SendNothing); @@ -2621,37 +2630,38 @@ static u16 KeyInterCB_SendExitRoomKey(u32 key) return LINK_KEY_CODE_EXIT_ROOM; } -// Duplicate function. -static u16 KeyInterCB_SendNothing_2(u32 key) +// Identical to KeyInterCB_SendNothing +static u16 KeyInterCB_InLinkActivity(u32 key) { return LINK_KEY_CODE_EMPTY; } -u32 sub_8087214(void) +u32 GetCableClubPartnersReady(void) { - if (IsAnyPlayerInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM) == TRUE) - return 2; - if (sPlayerKeyInterceptCallback == sub_8087170 && sPlayerTradingStates[gLocalLinkPlayerId] != PLAYER_TRADING_STATE_UNK_2) - return 0; - if (sPlayerKeyInterceptCallback == KeyInterCB_DoNothingAndKeepAlive && sPlayerTradingStates[gLocalLinkPlayerId] == PLAYER_TRADING_STATE_BUSY) - return 2; - if (AreAllPlayersInTradingState(PLAYER_TRADING_STATE_UNK_2) != FALSE) - return 1; - return 0; + if (IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM) == TRUE) + return CABLE_SEAT_FAILED; + if (sPlayerKeyInterceptCallback == KeyInterCB_Ready && sPlayerLinkStates[gLocalLinkPlayerId] != PLAYER_LINK_STATE_READY) + return CABLE_SEAT_WAITING; + if (sPlayerKeyInterceptCallback == KeyInterCB_ExitingSeat && sPlayerLinkStates[gLocalLinkPlayerId] == PLAYER_LINK_STATE_BUSY) + return CABLE_SEAT_FAILED; + if (AreAllPlayersInLinkState(PLAYER_LINK_STATE_READY)) + return CABLE_SEAT_SUCCESS; + return CABLE_SEAT_WAITING; } -bool32 sub_808727C(void) +// Unused +static bool32 IsAnyPlayerExitingCableClub(void) { - return IsAnyPlayerInTradingState(PLAYER_TRADING_STATE_EXITING_ROOM); + return IsAnyPlayerInLinkState(PLAYER_LINK_STATE_EXITING_ROOM); } -u16 sub_8087288(void) +u16 SetInCableClubSeat(void) { - SetKeyInterceptCallback(sub_80871AC); + SetKeyInterceptCallback(KeyInterCB_SetReady); return 0; } -u16 sub_808729C(void) +u16 SetLinkWaitingForScript(void) { SetKeyInterceptCallback(KeyInterCB_DeferToEventScript); return 0; @@ -2665,58 +2675,58 @@ u16 QueueExitLinkRoomKey(void) return 0; } -u16 sub_80872C4(void) +u16 SetStartedCableClubActivity(void) { - SetKeyInterceptCallback(KeyInterCB_SendNothing_2); + SetKeyInterceptCallback(KeyInterCB_InLinkActivity); return 0; } -static void LoadTradeRoomPlayer(s32 linkPlayerId, s32 myPlayerId, struct TradeRoomPlayer *trainer) +static void LoadCableClubPlayer(s32 linkPlayerId, s32 myPlayerId, struct CableClubPlayer *trainer) { s16 x, y; trainer->playerId = linkPlayerId; trainer->isLocalPlayer = (linkPlayerId == myPlayerId) ? 1 : 0; - trainer->c = gLinkPlayerObjectEvents[linkPlayerId].movementMode; + trainer->movementMode = gLinkPlayerObjectEvents[linkPlayerId].movementMode; trainer->facing = GetLinkPlayerFacingDirection(linkPlayerId); GetLinkPlayerCoords(linkPlayerId, &x, &y); trainer->pos.x = x; trainer->pos.y = y; trainer->pos.height = GetLinkPlayerElevation(linkPlayerId); - trainer->field_C = MapGridGetMetatileBehaviorAt(x, y); + trainer->metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); } -static bool32 sub_8087340(struct TradeRoomPlayer *player) +static bool32 IsCableClubPlayerUnfrozen(struct CableClubPlayer *player) { - u8 v1 = player->c; - if (v1 == MOVEMENT_MODE_SCRIPTED || v1 == MOVEMENT_MODE_FREE) + u8 mode = player->movementMode; + if (mode == MOVEMENT_MODE_SCRIPTED || mode == MOVEMENT_MODE_FREE) return TRUE; else return FALSE; } -// Duplicate function. -static bool32 sub_8087340_2(struct TradeRoomPlayer *player) +// Identical to IsCableClubPlayerUnfrozen +static bool32 CanCableClubPlayerPressStart(struct CableClubPlayer *player) { - u8 v1 = player->c; - if (v1 == MOVEMENT_MODE_SCRIPTED || v1 == MOVEMENT_MODE_FREE) + u8 mode = player->movementMode; + if (mode == MOVEMENT_MODE_SCRIPTED || mode == MOVEMENT_MODE_FREE) return TRUE; else return FALSE; } -static u8 *TryGetTileEventScript(struct TradeRoomPlayer *player) +static u8 *TryGetTileEventScript(struct CableClubPlayer *player) { - if (player->c != MOVEMENT_MODE_SCRIPTED) + if (player->movementMode != MOVEMENT_MODE_SCRIPTED) return FACING_NONE; return GetCoordEventScriptAtMapPosition(&player->pos); } -static bool32 PlayerIsAtSouthExit(struct TradeRoomPlayer *player) +static bool32 PlayerIsAtSouthExit(struct CableClubPlayer *player) { - if (player->c != MOVEMENT_MODE_SCRIPTED && player->c != MOVEMENT_MODE_FREE) + if (player->movementMode != MOVEMENT_MODE_SCRIPTED && player->movementMode != MOVEMENT_MODE_FREE) return FALSE; - else if (!MetatileBehavior_IsSouthArrowWarp(player->field_C)) + else if (!MetatileBehavior_IsSouthArrowWarp(player->metatileBehavior)) return FALSE; else if (player->facing != DIR_SOUTH) return FALSE; @@ -2724,12 +2734,12 @@ static bool32 PlayerIsAtSouthExit(struct TradeRoomPlayer *player) return TRUE; } -static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *player) +static const u8 *TryInteractWithPlayer(struct CableClubPlayer *player) { struct MapPosition otherPlayerPos; u8 linkPlayerId; - if (player->c != MOVEMENT_MODE_FREE && player->c != MOVEMENT_MODE_SCRIPTED) + if (player->movementMode != MOVEMENT_MODE_FREE && player->movementMode != MOVEMENT_MODE_SCRIPTED) return FACING_NONE; otherPlayerPos = player->pos; @@ -2742,7 +2752,7 @@ static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *player) { if (!player->isLocalPlayer) return CableClub_EventScript_TooBusyToNotice; - else if (sPlayerTradingStates[linkPlayerId] != PLAYER_TRADING_STATE_IDLE) + else if (sPlayerLinkStates[linkPlayerId] != PLAYER_LINK_STATE_IDLE) return CableClub_EventScript_TooBusyToNotice; else if (!GetLinkTrainerCardColor(linkPlayerId)) return CableClub_EventScript_ReadTrainerCard; @@ -2750,7 +2760,7 @@ static const u8 *TryInteractWithPlayer(struct TradeRoomPlayer *player) return CableClub_EventScript_ReadTrainerCardColored; } - return GetInteractedLinkPlayerScript(&otherPlayerPos, player->field_C, player->facing); + return GetInteractedLinkPlayerScript(&otherPlayerPos, player->metatileBehavior, player->facing); } // This returns which direction to force the player to look when one of @@ -2785,7 +2795,7 @@ static u16 GetDirectionForEventScript(const u8 *script) return FACING_NONE; } -static void sub_8087510(void) +static void InitLinkPlayerQueueScript(void) { ScriptContext2_Enable(); } @@ -2797,17 +2807,17 @@ static void InitLinkRoomStartMenuScript(void) ScriptContext2_Enable(); } -static void sub_8087530(const u8 *script) +static void RunInteractLocalPlayerScript(const u8 *script) { PlaySE(SE_SELECT); ScriptContext1_SetupScript(script); ScriptContext2_Enable(); } -static void CreateConfirmLeaveTradeRoomPrompt(void) +static void RunConfirmLeaveCableClubScript(void) { PlaySE(SE_WIN_OPEN); - ScriptContext1_SetupScript(EventScript_ConfirmLeaveTradeRoom); + ScriptContext1_SetupScript(EventScript_ConfirmLeaveCableClubRoom); ScriptContext2_Enable(); } @@ -2824,18 +2834,18 @@ static void RunTerminateLinkScript(void) ScriptContext2_Enable(); } -bool32 sub_8087598(void) +bool32 Overworld_LinkRecvQueueLengthMoreThan2(void) { if (!IsUpdateLinkStateCBActive()) return FALSE; if (GetLinkRecvQueueLength() >= 3) - sUnknown_03000E18 = TRUE; + sReceivingFromLink = TRUE; else - sUnknown_03000E18 = FALSE; - return sUnknown_03000E18; + sReceivingFromLink = FALSE; + return sReceivingFromLink; } -bool32 sub_80875C8(void) +bool32 Overworld_RecvKeysFromLinkIsRunning(void) { u8 temp; @@ -2850,8 +2860,8 @@ bool32 sub_80875C8(void) else if (sPlayerKeyInterceptCallback != KeyInterCB_DeferToEventScript) return FALSE; - temp = sUnknown_03000E18; - sUnknown_03000E18 = FALSE; + temp = sReceivingFromLink; + sReceivingFromLink = FALSE; if (temp == TRUE) return TRUE; @@ -2861,7 +2871,7 @@ bool32 sub_80875C8(void) return FALSE; } -bool32 sub_8087634(void) +bool32 Overworld_SendKeysToLinkIsRunning(void) { if (GetLinkSendQueueLength() < 2) return FALSE; @@ -2875,7 +2885,7 @@ bool32 sub_8087634(void) return FALSE; } -bool32 sub_808766C(void) +bool32 IsSendingKeysOverCable(void) { if (gWirelessCommType != 0) return FALSE; @@ -2924,15 +2934,15 @@ static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender) ZeroLinkPlayerObjectEvent(linkPlayerObjEvent); ZeroObjectEvent(objEvent); - linkPlayerObjEvent->active = 1; + linkPlayerObjEvent->active = TRUE; linkPlayerObjEvent->linkPlayerId = linkPlayerId; linkPlayerObjEvent->objEventId = objEventId; linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE; - objEvent->active = 1; + objEvent->active = TRUE; linkGender(objEvent) = gender; linkDirection(objEvent) = DIR_NORTH; - objEvent->spriteId = 64; + objEvent->spriteId = MAX_SPRITES; InitLinkPlayerObjectEventPos(objEvent, x, y); } @@ -2948,7 +2958,7 @@ static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s1 ObjectEventUpdateZCoord(objEvent); } -static void sub_80877DC(u8 linkPlayerId, u8 dir) +static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir) { if (gLinkPlayerObjectEvents[linkPlayerId].active) { @@ -2958,7 +2968,7 @@ static void sub_80877DC(u8 linkPlayerId, u8 dir) } } -static void sub_808780C(u8 linkPlayerId) +static void DestroyLinkPlayerObject(u8 linkPlayerId) { struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId]; u8 objEventId = linkPlayerObjEvent->objEventId; @@ -2999,7 +3009,7 @@ static u8 GetLinkPlayerElevation(u8 linkPlayerId) return objEvent->currentElevation; } -static s32 sub_80878E4(u8 linkPlayerId) +static s32 GetLinkPlayerObjectStepTimer(u8 linkPlayerId) { u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId; struct ObjectEvent *objEvent = &gObjectEvents[objEventId]; @@ -3049,32 +3059,32 @@ static void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing) } -static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3) +static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { - return gLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3); + return gLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir); } -static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3) +static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { return FACING_UP; } -// Duplicate Function -static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3) +// Identical to MovementEventModeCB_Normal +static u8 MovementEventModeCB_Scripted(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { - return gLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3); + return gLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir); } -static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3) +static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { return FALSE; } -static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3) +static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { s16 x, y; - linkDirection(objEvent) = FlipVerticalAndClearForced(a3, linkDirection(objEvent)); + linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent)); ObjectEventMoveDestCoords(objEvent, linkDirection(objEvent), &x, &y); if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, linkDirection(objEvent), x, y)) @@ -3090,9 +3100,9 @@ static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayer } } -static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3) +static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir) { - linkDirection(objEvent) = FlipVerticalAndClearForced(a3, linkDirection(objEvent)); + linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent)); return FALSE; } @@ -3199,7 +3209,7 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite) else StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(linkDirection(objEvent))); - UpdateObjectEventSpriteVisibility(sprite, 0); + UpdateObjectEventSpriteInvisibility(sprite, 0); if (objEvent->triggerGroundEffectsOnMove) { sprite->invisible = ((sprite->data[7] & 4) >> 2); diff --git a/src/palette.c b/src/palette.c index 320e11ecc..cbaae8da2 100644 --- a/src/palette.c +++ b/src/palette.c @@ -60,7 +60,7 @@ ALIGNED(4) EWRAM_DATA u16 gPlttBufferUnfaded[PLTT_BUFFER_SIZE] = {0}; ALIGNED(4) EWRAM_DATA u16 gPlttBufferFaded[PLTT_BUFFER_SIZE] = {0}; EWRAM_DATA struct PaletteStruct sPaletteStructs[0x10] = {0}; EWRAM_DATA struct PaletteFadeControl gPaletteFade = {0}; -static EWRAM_DATA u32 gFiller_2037FE0 = 0; +static EWRAM_DATA u32 sFiller = 0; static EWRAM_DATA u32 sPlttBufferTransferPending = 0; EWRAM_DATA u8 gPaletteDecompressionBuffer[PLTT_DECOMP_BUFFER_SIZE] = {0}; @@ -624,7 +624,7 @@ static u8 UpdateFastPaletteFade(void) if (b < b0) b = b0; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } break; case FAST_FADE_OUT_TO_WHITE: @@ -642,7 +642,7 @@ static u8 UpdateFastPaletteFade(void) if (b > 31) b = 31; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } break; case FAST_FADE_IN_FROM_BLACK: @@ -668,7 +668,7 @@ static u8 UpdateFastPaletteFade(void) if (b > b0) b = b0; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } break; case FAST_FADE_OUT_TO_BLACK: @@ -686,7 +686,7 @@ static u8 UpdateFastPaletteFade(void) if (b < 0) b = 0; - gPlttBufferFaded[i] = r | (g << 5) | (b << 10); + gPlttBufferFaded[i] = RGB(r, g, b); } } @@ -856,13 +856,13 @@ void TintPalette_GrayScale(u16 *palette, u16 count) for (i = 0; i < count; i++) { - r = (*palette >> 0) & 0x1F; - g = (*palette >> 5) & 0x1F; - b = (*palette >> 10) & 0x1F; + r = GET_R(*palette); + g = GET_G(*palette); + b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; - *palette++ = (gray << 10) | (gray << 5) | (gray << 0); + *palette++ = RGB2(gray, gray, gray); } } @@ -873,18 +873,18 @@ void TintPalette_GrayScale2(u16 *palette, u16 count) for (i = 0; i < count; i++) { - r = (*palette >> 0) & 0x1F; - g = (*palette >> 5) & 0x1F; - b = (*palette >> 10) & 0x1F; + r = GET_R(*palette); + g = GET_G(*palette); + b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; - if (gray > 0x1F) - gray = 0x1F; + if (gray > 31) + gray = 31; gray = sRoundedDownGrayscaleMap[gray]; - *palette++ = (gray << 10) | (gray << 5) | (gray << 0); + *palette++ = RGB2(gray, gray, gray); } } @@ -895,9 +895,9 @@ void TintPalette_SepiaTone(u16 *palette, u16 count) for (i = 0; i < count; i++) { - r = (*palette >> 0) & 0x1F; - g = (*palette >> 5) & 0x1F; - b = (*palette >> 10) & 0x1F; + r = GET_R(*palette); + g = GET_G(*palette); + b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; @@ -908,7 +908,7 @@ void TintPalette_SepiaTone(u16 *palette, u16 count) if (r > 31) r = 31; - *palette++ = (b << 10) | (g << 5) | (r << 0); + *palette++ = RGB2(r, g, b); } } @@ -919,9 +919,9 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b for (i = 0; i < count; i++) { - r = (*palette >> 0) & 0x1F; - g = (*palette >> 5) & 0x1F; - b = (*palette >> 10) & 0x1F; + r = GET_R(*palette); + g = GET_G(*palette); + b = GET_B(*palette); gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8; @@ -936,7 +936,7 @@ void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 b if (b > 31) b = 31; - *palette++ = (b << 10) | (g << 5) | (r << 0); + *palette++ = RGB2(r, g, b); } } @@ -1002,7 +1002,7 @@ static void DestroyBlendPalettesGraduallyTask(void) while (1) { taskId = FindTaskIdByFunc(Task_BlendPalettesGradually); - if (taskId == 0xFF) + if (taskId == TASK_NONE) break; DestroyTask(taskId); } diff --git a/src/party_menu.c b/src/party_menu.c index f045a9a47..681dc5f93 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -151,7 +151,7 @@ static EWRAM_DATA u16 *sSlot1TilemapBuffer = 0; // for switching party slots static EWRAM_DATA u16 *sSlot2TilemapBuffer = 0; // EWRAM_DATA u8 gSelectedOrderFromParty[MAX_FRONTIER_PARTY_SIZE] = {0}; static EWRAM_DATA u16 sPartyMenuItemId = 0; -static EWRAM_DATA u16 sUnused_0203CEFE = 0; +static EWRAM_DATA u16 sUnused = 0; EWRAM_DATA u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2] = {0}; // bits 0-3 are the current pos of Slot 1, 4-7 are Slot 2, and so on // IWRAM common @@ -443,7 +443,7 @@ static void InitPartyMenu(u8 menuType, u8 layout, u8 partyAction, bool8 keepCurs for (i = 0; i < ARRAY_COUNT(sPartyMenuInternal->data); i++) sPartyMenuInternal->data[i] = 0; for (i = 0; i < ARRAY_COUNT(sPartyMenuInternal->windowId); i++) - sPartyMenuInternal->windowId[i] = 0xFF; + sPartyMenuInternal->windowId[i] = WINDOW_NONE; if (!keepCursorPos) gPartyMenu.slotId = 0; @@ -589,12 +589,12 @@ static bool8 ShowPartyMenu(void) gMain.state++; break; case 21: - BlendPalettes(0xFFFFFFFF, 16, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; case 22: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; default: @@ -607,7 +607,7 @@ static bool8 ShowPartyMenu(void) static void ExitPartyMenu(void) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); CreateTask(Task_ExitPartyMenu, 0); SetVBlankCallback(VBlankCB_PartyMenu); SetMainCallback2(CB2_UpdatePartyMenu); @@ -731,10 +731,10 @@ static void InitPartyMenuBoxes(u8 layout) sPartyMenuBoxes[i].infoRects = &sPartyBoxInfoRects[PARTY_BOX_RIGHT_COLUMN]; sPartyMenuBoxes[i].spriteCoords = sPartyMenuSpriteCoords[layout][i]; sPartyMenuBoxes[i].windowId = i; - sPartyMenuBoxes[i].monSpriteId = 0xFF; - sPartyMenuBoxes[i].itemSpriteId = 0xFF; - sPartyMenuBoxes[i].pokeballSpriteId = 0xFF; - sPartyMenuBoxes[i].statusSpriteId = 0xFF; + sPartyMenuBoxes[i].monSpriteId = SPRITE_NONE; + sPartyMenuBoxes[i].itemSpriteId = SPRITE_NONE; + sPartyMenuBoxes[i].pokeballSpriteId = SPRITE_NONE; + sPartyMenuBoxes[i].statusSpriteId = SPRITE_NONE; } // The first party mon goes in the left column sPartyMenuBoxes[0].infoRects = &sPartyBoxInfoRects[PARTY_BOX_LEFT_COLUMN]; @@ -915,7 +915,7 @@ static bool8 DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(u8 slot) DisplayPartyPokemonDataToTeachMove(slot, item, 0); break; case 2: // Evolution stone - if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, 3, item) != SPECIES_NONE) + if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, EVO_MODE_ITEM_CHECK, item) != SPECIES_NONE) return FALSE; DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NO_USE); break; @@ -955,7 +955,7 @@ static void DisplayPartyPokemonDataForMultiBattle(u8 slot) menuBox->infoRects->blitFunc(menuBox->windowId, 0, 0, 0, 0, FALSE); StringCopy(gStringVar1, gMultiPartnerParty[actualSlot].nickname); StringGetEnd10(gStringVar1); - sub_81DB52C(gStringVar1); + ConvertInternationalPlayerName(gStringVar1); DisplayPartyPokemonBarDetail(menuBox->windowId, gStringVar1, 0, menuBox->infoRects->dimensions); DisplayPartyPokemonLevel(gMultiPartnerParty[actualSlot].level, menuBox); DisplayPartyPokemonGender(gMultiPartnerParty[actualSlot].gender, gMultiPartnerParty[actualSlot].species, gMultiPartnerParty[actualSlot].nickname, menuBox); @@ -1148,7 +1148,7 @@ static void SwapPartyPokemon(struct Pokemon *mon1, struct Pokemon *mon2) static void Task_ClosePartyMenu(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ClosePartyMenuAndSetCB2; } @@ -1221,16 +1221,16 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) } else { - switch (gPartyMenu.action - 3) + switch (gPartyMenu.action) { - case PARTY_ACTION_SOFTBOILED - 3: + case PARTY_ACTION_SOFTBOILED: if (IsSelectedMonNotEgg((u8*)slotPtr)) { PartyMenuRemoveWindow(&sPartyMenuInternal->windowId[1]); Task_TryUseSoftboiledOnPartyMon(taskId); } break; - case PARTY_ACTION_USE_ITEM - 3: + case PARTY_ACTION_USE_ITEM: if (IsSelectedMonNotEgg((u8*)slotPtr)) { if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) @@ -1240,7 +1240,7 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) gItemUseCB(taskId, Task_ClosePartyMenuAfterText); } break; - case PARTY_ACTION_MOVE_TUTOR - 3: + case PARTY_ACTION_MOVE_TUTOR: if (IsSelectedMonNotEgg((u8*)slotPtr)) { PlaySE(SE_SELECT); @@ -1248,7 +1248,7 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) TryTutorSelectedMon(taskId); } break; - case PARTY_ACTION_GIVE_MAILBOX_MAIL - 3: + case PARTY_ACTION_GIVE_MAILBOX_MAIL: if (IsSelectedMonNotEgg((u8*)slotPtr)) { PlaySE(SE_SELECT); @@ -1256,8 +1256,8 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) TryGiveMailToSelectedMon(taskId); } break; - case PARTY_ACTION_GIVE_ITEM - 3: - case PARTY_ACTION_GIVE_PC_ITEM - 3: + case PARTY_ACTION_GIVE_ITEM: + case PARTY_ACTION_GIVE_PC_ITEM: if (IsSelectedMonNotEgg((u8*)slotPtr)) { PlaySE(SE_SELECT); @@ -1265,23 +1265,23 @@ static void HandleChooseMonSelection(u8 taskId, s8 *slotPtr) TryGiveItemOrMailToSelectedMon(taskId); } break; - case PARTY_ACTION_SWITCH - 3: + case PARTY_ACTION_SWITCH: PlaySE(SE_SELECT); SwitchSelectedMons(taskId); break; - case PARTY_ACTION_CHOOSE_AND_CLOSE - 3: + case PARTY_ACTION_CHOOSE_AND_CLOSE: PlaySE(SE_SELECT); Task_ClosePartyMenu(taskId); break; - case PARTY_ACTION_MINIGAME - 3: + case PARTY_ACTION_MINIGAME: if (IsSelectedMonNotEgg((u8*)slotPtr)) { TryEnterMonForMinigame(taskId, (u8)*slotPtr); } break; default: - case PARTY_ACTION_ABILITY_PREVENTS - 3: - case PARTY_ACTION_SWITCHING - 3: + case PARTY_ACTION_ABILITY_PREVENTS: + case PARTY_ACTION_SWITCHING: PlaySE(SE_SELECT); Task_TryCreateSelectionWindow(taskId); break; @@ -1961,9 +1961,9 @@ static u8 CanMonLearnTMTutor(struct Pokemon *mon, u16 item, u8 tutor) if (GetMonData(mon, MON_DATA_IS_EGG)) return CANNOT_LEARN_MOVE_IS_EGG; - if (item >= ITEM_TM01_FOCUS_PUNCH) + if (item >= ITEM_TM01) { - if (!CanMonLearnTMHM(mon, item - ITEM_TM01_FOCUS_PUNCH)) + if (!CanMonLearnTMHM(mon, item - ITEM_TM01)) return CANNOT_LEARN_MOVE; else move = ItemIdToBattleMoveId(item); @@ -2371,11 +2371,11 @@ static void DisplayPartyPokemonDescriptionText(u8 stringID, struct PartyMenuBox static void PartyMenuRemoveWindow(u8 *ptr) { - if (*ptr != 0xFF) + if (*ptr != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(*ptr, 0); RemoveWindow(*ptr); - *ptr = 0xFF; + *ptr = WINDOW_NONE; ScheduleBgCopyTilemapToVram(2); } } @@ -2384,7 +2384,7 @@ void DisplayPartyMenuStdMessage(u32 stringId) { u8 *windowPtr = &sPartyMenuInternal->windowId[1]; - if (*windowPtr != 0xFF) + if (*windowPtr != WINDOW_NONE) PartyMenuRemoveWindow(windowPtr); if (stringId != PARTY_MSG_NONE) @@ -2703,11 +2703,11 @@ static void CB2_ShowPokemonSummaryScreen(void) if (gPartyMenu.menuType == PARTY_MENU_TYPE_IN_BATTLE) { UpdatePartyToBattleOrder(); - ShowPokemonSummaryScreen(PSS_MODE_LOCK_MOVES, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); + ShowPokemonSummaryScreen(SUMMARY_MODE_LOCK_MOVES, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); } else { - ShowPokemonSummaryScreen(PSS_MODE_NORMAL, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); + ShowPokemonSummaryScreen(SUMMARY_MODE_NORMAL, gPlayerParty, gPartyMenu.slotId, gPlayerPartyCount - 1, CB2_ReturnToPartyMenuFromSummaryScreen); } } @@ -3020,7 +3020,7 @@ static void CB2_SelectBagItemToGive(void) if (InBattlePyramid() == FALSE) GoToBagMenu(ITEMMENULOCATION_PARTY, POCKETS_COUNT, CB2_GiveHoldItem); else - GoToBattlePyramidBagMenu(2, CB2_GiveHoldItem); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PARTY, CB2_GiveHoldItem); } static void CB2_GiveHoldItem(void) @@ -3520,9 +3520,9 @@ static void CursorCb_Register(u8 taskId) { u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2); u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); - u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE); + u8 isEventLegal = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_EVENT_LEGAL); - switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, obedience)) + switch (CanRegisterMonForTradingBoard(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), species2, species, isEventLegal)) { case CANT_REGISTER_MON: StringExpandPlaceholders(gStringVar4, gText_PkmnCantBeTradedNow); @@ -3547,8 +3547,8 @@ static void CursorCb_Trade1(u8 taskId) { u16 species2 = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES2); u16 species = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_SPECIES); - u8 obedience = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_OBEDIENCE); - u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, obedience); + u8 isEventLegal = GetMonData(&gPlayerParty[gPartyMenu.slotId], MON_DATA_EVENT_LEGAL); + u32 stringId = GetUnionRoomTradeMessageId(*(struct GFtgtGnameSub *)GetHostRFUtgtGname(), gPartnerTgtGnameSub, species2, gUnionRoomOfferedSpecies, gUnionRoomRequestedMonType, species, isEventLegal); if (stringId != UR_TRADE_MSG_NONE) { @@ -4203,7 +4203,7 @@ static void CB2_ReturnToBagMenu(void) if (InBattlePyramid() == FALSE) GoToBagMenu(ITEMMENULOCATION_LAST, POCKETS_COUNT, NULL); else - GoToBattlePyramidBagMenu(4, gPyramidBagCursorData.callback); + GoToBattlePyramidBagMenu(PYRAMIDBAG_LOC_PREV, gPyramidBagMenuState.callback); } static void Task_SetSacredAshCB(u8 taskId) @@ -4612,7 +4612,7 @@ void ItemUseCB_PPUp(u8 taskId, TaskFunc task) u16 ItemIdToBattleMoveId(u16 item) { - u16 tmNumber = item - ITEM_TM01_FOCUS_PUNCH; + u16 tmNumber = item - ITEM_TM01; return sTMHMMoves[tmNumber]; } @@ -4904,7 +4904,7 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) else { gPartyMenuUseExitCallback = TRUE; - PlayFanfareByFanfareNum(0); + PlayFanfareByFanfareNum(FANFARE_LEVEL_UP); UpdateMonDisplayInfoAfterRareCandy(gPartyMenu.slotId, mon); RemoveBagItem(gSpecialVar_ItemId, 1); GetMonNickname(mon, gStringVar1); @@ -4954,7 +4954,7 @@ static void DisplayLevelUpStatsPg1(u8 taskId) s16 *arrayPtr = sPartyMenuInternal->data; arrayPtr[12] = CreateLevelUpStatsWindow(); - DrawLevelUpWindowPg1(arrayPtr[12], arrayPtr, &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + DrawLevelUpWindowPg1(arrayPtr[12], arrayPtr, &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(arrayPtr[12], 2); ScheduleBgCopyTilemapToVram(2); } @@ -4963,7 +4963,7 @@ static void DisplayLevelUpStatsPg2(u8 taskId) { s16 *arrayPtr = sPartyMenuInternal->data; - DrawLevelUpWindowPg2(arrayPtr[12], &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + DrawLevelUpWindowPg2(arrayPtr[12], &arrayPtr[6], TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); CopyWindowToVram(arrayPtr[12], 2); ScheduleBgCopyTilemapToVram(2); } @@ -5018,13 +5018,13 @@ static void Task_TryLearningNextMove(u8 taskId) static void PartyMenuTryEvolution(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; - u16 targetSpecies = GetEvolutionTargetSpecies(mon, 0, 0); + u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE); if (targetSpecies != SPECIES_NONE) { FreePartyPointers(); gCB2_AfterEvolution = gPartyMenu.exitCallback; - BeginEvolutionScene(mon, targetSpecies, 1, gPartyMenu.slotId); + BeginEvolutionScene(mon, targetSpecies, TRUE, gPartyMenu.slotId); DestroyTask(taskId); } else @@ -5232,7 +5232,7 @@ u8 GetItemEffectType(u16 item) return ITEM_EFFECT_PP_UP; else if (itemEffect[5] & ITEM5_PP_MAX) return ITEM_EFFECT_PP_MAX; - else if (itemEffect[4] & (ITEM4_HEAL_PP_ALL | ITEM4_HEAL_PP_ONE)) + else if (itemEffect[4] & (ITEM4_HEAL_PP | ITEM4_HEAL_PP_ONE)) return ITEM_EFFECT_HEAL_PP; else return ITEM_EFFECT_NONE; @@ -5697,14 +5697,14 @@ static u8 GetPartyLayoutFromBattleType(void) void OpenPartyMenuInBattle(u8 partyAction) { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), partyAction, FALSE, PARTY_MSG_CHOOSE_MON, Task_HandleChooseMonInput, CB2_SetUpReshowBattleScreenAfterMenu); - nullsub_35(); + ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } void ChooseMonForInBattleItem(void) { InitPartyMenu(PARTY_MENU_TYPE_IN_BATTLE, GetPartyLayoutFromBattleType(), PARTY_ACTION_USE_ITEM, FALSE, PARTY_MSG_USE_ON_WHICH_MON, Task_HandleChooseMonInput, CB2_ReturnToBagMenu); - nullsub_35(); + ReshowBattleScreenDummy(); UpdatePartyToBattleOrder(); } @@ -5753,7 +5753,7 @@ static bool8 TrySwitchInPokemon(void) StringExpandPlaceholders(gStringVar4, gText_EggCantBattle); return FALSE; } - if (GetPartyIdFromBattleSlot(slot) == gBattleStruct->field_8B) + if (GetPartyIdFromBattleSlot(slot) == gBattleStruct->prevSelectedPartySlot) { GetMonNickname(&gPlayerParty[slot], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_PkmnAlreadySelected); @@ -6265,7 +6265,7 @@ static void Task_BattlePyramidChooseMonHeldItems(u8 taskId) void MoveDeleterChooseMoveToForget(void) { - ShowPokemonSummaryScreen(PSS_MODE_SELECT_MOVE, gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField); + ShowPokemonSummaryScreen(SUMMARY_MODE_SELECT_MOVE, gPlayerParty, gSpecialVar_0x8004, gPlayerPartyCount - 1, CB2_ReturnToField); gFieldCallback = FieldCB_ContinueScriptHandleMusic; } diff --git a/src/player_pc.c b/src/player_pc.c index 928aac706..a040ba5b6 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -112,7 +112,7 @@ static void CopyItemName_PlayerPC(u8 *string, u16 itemId); static void sub_816BC14(void); static void sub_816BFE0(u8 y, u8, u8 speed); static void sub_816BCC4(u8); -static void sub_816C690(u8); +static void UpdateSwapLinePos(u8); static void sub_816C4FC(u8 taskId); static void sub_816C0C8(void); static void sub_816C060(u16 itemId); @@ -398,7 +398,7 @@ static void PlayerPC_Mailbox(u8 taskId) { playerPCItemPageInfo.cursorPos = 0; playerPCItemPageInfo.itemsAbove = 0; - playerPCItemPageInfo.scrollIndicatorId = 0xFF; + playerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; Mailbox_UpdateMailList(); ItemStorage_SetItemAndMailCount(taskId); if (sub_81D1C44(playerPCItemPageInfo.count) == TRUE) @@ -443,7 +443,7 @@ static void InitItemStorageMenu(u8 taskId, u8 var) windowTemplate.width = GetMaxWidthInMenuTable(gPCText_ItemPCOptionsText, 4); data[4] = AddWindow(&windowTemplate); SetStandardWindowBorderStyle(data[4], 0); - PrintMenuTable(data[4], 4, gPCText_ItemPCOptionsText); + PrintMenuTable(data[4], ARRAY_COUNT(gPCText_ItemPCOptionsText), gPCText_ItemPCOptionsText); InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], 4, var); ScheduleBgCopyTilemapToVram(0); ItemStorageMenuPrint(gPCText_OptionDescList[var]); @@ -554,12 +554,12 @@ static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss) sub_816B4DC(taskId); playerPCItemPageInfo.cursorPos = 0; playerPCItemPageInfo.itemsAbove = 0; - playerPCItemPageInfo.scrollIndicatorId = 0xFF; + playerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; ItemStorage_SetItemAndMailCount(taskId); sub_816BC14(); FreeAndReserveObjectSpritePalettes(); - LoadListMenuArrowsGfx(); - sub_8122344(gUnknown_0203BCC4->spriteIds, 7); + LoadListMenuSwapLineGfx(); + CreateSwapLineSprites(gUnknown_0203BCC4->spriteIds, 7); ClearDialogWindowAndFrame(0,0); gTasks[taskId].func = ItemStorage_ProcessWithdrawTossInput; } @@ -593,8 +593,8 @@ static u8 GetMailboxMailCount(void) { u8 i, j; - for(i = 0, j = 6; j < 16; j++) - if (gSaveBlock1Ptr->mail[j].itemId != 0) + for(i = 0, j = PARTY_SIZE; j < MAIL_COUNT; j++) + if (gSaveBlock1Ptr->mail[j].itemId != ITEM_NONE) i++; return i; @@ -605,9 +605,9 @@ static void Mailbox_UpdateMailList(void) struct MailStruct mailBuffer; u8 i, j; - for (i=6; i<15; i++) + for (i = PARTY_SIZE; i < MAIL_COUNT - 1; i++) { - for (j=i+1; j<16; j++) + for (j = i + 1; j < MAIL_COUNT; j++) { if (gSaveBlock1Ptr->mail[i].itemId == 0) { @@ -647,7 +647,7 @@ static void Mailbox_ProcessInput(u8 taskId) break; case LIST_CANCEL: PlaySE(SE_SELECT); - RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); + RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorTaskId); Mailbox_ReturnToPlayerPC(taskId); break; default: @@ -656,7 +656,7 @@ static void Mailbox_ProcessInput(u8 taskId) sub_81D1D04(1); DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); ScheduleBgCopyTilemapToVram(0); - RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); + RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorTaskId); gTasks[taskId].func = Mailbox_PrintWhatToDoWithPlayerMailText; break; } @@ -665,8 +665,8 @@ static void Mailbox_ProcessInput(u8 taskId) static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) { - StringCopy(gStringVar1, gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos].playerName); - sub_81DB554(gStringVar1, 0); + StringCopy(gStringVar1, gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + PARTY_SIZE + playerPCItemPageInfo.cursorPos].playerName); + ConvertInternationalPlayerNameStripChar(gStringVar1, CHAR_SPACE); StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithVar1sMail); DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions); } @@ -686,7 +686,7 @@ static void Mailbox_ReturnToPlayerPC(u8 taskId) static void Mailbox_PrintMailOptions(u8 taskId) { u8 r4 = sub_81D1C84(2); - PrintMenuTable(r4, 4, gMailboxMailOptions); + PrintMenuTable(r4, ARRAY_COUNT(gMailboxMailOptions), gMailboxMailOptions); InitMenuInUpperLeftCornerPlaySoundWhenAPressed(r4, 4, 0); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Mailbox_MailOptionsProcessInput; @@ -724,7 +724,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId) { sub_81D1EC0(); CleanupOverworldWindowsAndTilemaps(); - ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE); + ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + PARTY_SIZE + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE); DestroyTask(taskId); } } @@ -785,7 +785,7 @@ static void Mailbox_MoveToBagYesNoPrompt(u8 taskId) static void Mailbox_DoMailMoveToBag(u8 taskId) { - struct MailStruct *mailStruct = &(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]); + struct MailStruct *mailStruct = &(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + PARTY_SIZE + playerPCItemPageInfo.cursorPos]); if (!AddBagItem(mailStruct->itemId, 1)) { DisplayItemMessageOnField(taskId, gText_BagIsFull, Mailbox_Cancel); @@ -874,7 +874,7 @@ static void sub_816BC14(void) gUnknown_0203BCC4 = AllocZeroed(sizeof(struct Struct203BCC4)); memset(gUnknown_0203BCC4->windowIds, 0xFF, 0x6); gUnknown_0203BCC4->unk666 = 0xFF; - gUnknown_0203BCC4->spriteId = 0xFF; + gUnknown_0203BCC4->spriteId = SPRITE_NONE; } static void sub_816BC58(void) @@ -889,7 +889,7 @@ static void sub_816BC58(void) static u8 sub_816BC7C(u8 a) { u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]); - if (*windowIdLoc == 0xFF) + if (*windowIdLoc == WINDOW_NONE) { *windowIdLoc = AddWindow(&gUnknown_085DFF5C[a]); DrawStdFrameWithCustomTileAndPalette(*windowIdLoc, FALSE, 0x214, 0xE); @@ -901,13 +901,13 @@ static u8 sub_816BC7C(u8 a) static void sub_816BCC4(u8 a) { u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]); - if (*windowIdLoc != 0xFF) + if (*windowIdLoc != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(*windowIdLoc, FALSE); ClearWindowTilemap(*windowIdLoc); ScheduleBgCopyTilemapToVram(0); RemoveWindow(*windowIdLoc); - *windowIdLoc = 0xFF; + *windowIdLoc = WINDOW_NONE; } } @@ -983,16 +983,16 @@ static void sub_816BEF0(s32 id) static void ItemStorage_StartScrollIndicator(void) { - if (playerPCItemPageInfo.scrollIndicatorId == 0xFF) - playerPCItemPageInfo.scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 0xC, 0x94, playerPCItemPageInfo.count - playerPCItemPageInfo.pageItems, 0x13F8, 0x13F8, &(playerPCItemPageInfo.itemsAbove)); + if (playerPCItemPageInfo.scrollIndicatorTaskId == TASK_NONE) + playerPCItemPageInfo.scrollIndicatorTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 0xC, 0x94, playerPCItemPageInfo.count - playerPCItemPageInfo.pageItems, 0x13F8, 0x13F8, &(playerPCItemPageInfo.itemsAbove)); } static void ItemStorage_RemoveScrollIndicator(void) { - if (playerPCItemPageInfo.scrollIndicatorId != 0xFF) + if (playerPCItemPageInfo.scrollIndicatorTaskId != TASK_NONE) { - RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); - playerPCItemPageInfo.scrollIndicatorId = 0xFF; + RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorTaskId); + playerPCItemPageInfo.scrollIndicatorTaskId = TASK_NONE; } } @@ -1015,7 +1015,7 @@ static void sub_816C060(u16 itemId) u8 spriteId; u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId); - if (*spriteIdLoc == 0xFF) + if (*spriteIdLoc == SPRITE_NONE) { FreeSpriteTilesByTag(0x13F6); FreeSpritePaletteByTag(0x13F6); @@ -1033,12 +1033,12 @@ static void sub_816C060(u16 itemId) static void sub_816C0C8(void) { u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId); - if (*spriteIdLoc != 0xFF) + if (*spriteIdLoc != SPRITE_NONE) { FreeSpriteTilesByTag(0x13F6); FreeSpritePaletteByTag(0x13F6); DestroySprite(&(gSprites[*spriteIdLoc])); - *spriteIdLoc = 0xFF; + *spriteIdLoc = SPRITE_NONE; } } @@ -1058,7 +1058,6 @@ static void ItemStorage_ProcessWithdrawTossInput(u8 taskId) s16 *data; bool32 toss; u32 i, x; - u8 windowId; const u8* text; data = gTasks[taskId].data; @@ -1187,7 +1186,7 @@ static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) sub_816C0C8(); ItemStorage_RemoveScrollIndicator(); DestroyListMenuTask(data[5], NULL, NULL); - sub_81223B0(gUnknown_0203BCC4->spriteIds, 7); + DestroySwapLineSprites(gUnknown_0203BCC4->spriteIds, 7); sub_816BC58(); gTasks[taskId].func = ItemStorage_GoBackToPlayerPCMenu_InitStorage; } @@ -1200,7 +1199,7 @@ static void ItemStorage_ItemSwapChoosePrompt(u8 taskId) ListMenuSetUnkIndicatorsStructField(data[5], 16, 1); gUnknown_0203BCC4->unk666 = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos); sub_816BFB8(data[5], 0, 0); - sub_816C690(gUnknown_0203BCC4->unk666); + UpdateSwapLinePos(gUnknown_0203BCC4->unk666); CopyItemName(gSaveBlock1Ptr->pcItems[gUnknown_0203BCC4->unk666].itemId, gStringVar1); ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM)); gTasks[taskId].func = sub_816C4FC; @@ -1220,8 +1219,8 @@ static void sub_816C4FC(u8 taskId) } id = ListMenu_ProcessInput(data[5]); ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); - sub_81223FC(gUnknown_0203BCC4->spriteIds, 7, 0); - sub_816C690(playerPCItemPageInfo.cursorPos); + SetSwapLineSpritesInvisibility(gUnknown_0203BCC4->spriteIds, 7, FALSE); + UpdateSwapLinePos(playerPCItemPageInfo.cursorPos); switch(id) { case LIST_NOTHING_CHOSEN: @@ -1246,7 +1245,6 @@ static void ItemStorage_DoItemSwap(u8 taskId, bool8 a) { s16 *data; u16 b; - u8 c; data = gTasks[taskId].data; b = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos); @@ -1254,31 +1252,27 @@ static void ItemStorage_DoItemSwap(u8 taskId, bool8 a) DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); if (!a) { - c = gUnknown_0203BCC4->unk666; - if (c != b) + if (gUnknown_0203BCC4->unk666 != b) { - if (c != b - 1) + if (gUnknown_0203BCC4->unk666 != b - 1) { - MoveItemSlotInList(gSaveBlock1Ptr->pcItems, c, b); + MoveItemSlotInList(gSaveBlock1Ptr->pcItems, gUnknown_0203BCC4->unk666, b); ItemStorage_RefreshListMenu(); } } - else - goto LABEL_SKIP_CURSOR_DECREMENT; } if (gUnknown_0203BCC4->unk666 < b) playerPCItemPageInfo.cursorPos--; - LABEL_SKIP_CURSOR_DECREMENT: - sub_81223FC(gUnknown_0203BCC4->spriteIds, 7, 1); + SetSwapLineSpritesInvisibility(gUnknown_0203BCC4->spriteIds, 7, TRUE); gUnknown_0203BCC4->unk666 = 0xFF; data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = ItemStorage_ProcessInput; } -static void sub_816C690(u8 a) +static void UpdateSwapLinePos(u8 y) { - sub_8122448(gUnknown_0203BCC4->spriteIds, 7, 128, ((a+1) * 16)); + UpdateSwapLineSpritesPos(gUnknown_0203BCC4->spriteIds, 7, 128, ((y+1) * 16)); } static void sub_816C6BC(u8 windowId, u16 value, u32 mode, u8 x, u8 y, u8 n) diff --git a/src/pokeball.c b/src/pokeball.c index 92081a296..3671e6a35 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -12,35 +12,36 @@ #include "task.h" #include "trig.h" #include "util.h" +#include "data.h" #include "constants/songs.h" extern struct MusicPlayerInfo gMPlayInfo_BGM; // this file's functions static void Task_DoPokeballSendOutAnim(u8 taskId); -static void SpriteCB_TestBallThrow(struct Sprite *sprite); static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite); static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite); static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite); -static void sub_80756D4(struct Sprite *sprite); -static void sub_80756E0(struct Sprite *sprite); -static void sub_807574C(struct Sprite *sprite); -static void sub_80757E4(struct Sprite *sprite); -static void sub_8075838(struct Sprite *sprite); -static void sub_8075930(struct Sprite *sprite); +static void SpriteCB_BallThrow(struct Sprite *sprite); +static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite); +static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite); +static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite); +static void SpriteCB_BallThrow_Close(struct Sprite *sprite); +static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite); +static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite); +static void SpriteCB_BallThrow_Shake(struct Sprite *sprite); +static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite); +static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite); static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite); static void SpriteCB_ReleaseMon2FromBall(struct Sprite *sprite); -static void sub_8075970(struct Sprite *sprite); static void HandleBallAnimEnd(struct Sprite *sprite); -static void sub_8075FB4(struct Sprite *sprite); -static void sub_80760F8(struct Sprite *sprite); -static void sub_8076524(struct Sprite *sprite); -static void sub_80765E0(struct Sprite *sprite); -static void sub_80767D4(struct Sprite *sprite); -static void sub_807687C(struct Sprite *sprite); -static void sub_80768F0(struct Sprite *sprite); -static void sub_80769A8(struct Sprite *sprite); -static void sub_80769CC(struct Sprite *sprite); +static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite); +static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite); +static void SpriteCB_TradePokeball(struct Sprite *sprite); +static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite); +static void SpriteCB_TradePokeballEnd(struct Sprite *sprite); +static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite); +static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite); static void SpriteCB_HitAnimHealthoxEffect(struct Sprite *sprite); static u16 GetBattlerPokeballItemId(u8 battlerId); @@ -61,34 +62,34 @@ static u16 GetBattlerPokeballItemId(u8 battlerId); const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] = { - {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL}, - {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL}, - {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL}, - {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL}, - {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL}, - {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL}, - {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL}, - {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL}, - {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL}, - {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL}, - {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL}, - {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL}, + [BALL_POKE] = {gInterfaceGfx_PokeBall, 384, GFX_TAG_POKEBALL}, + [BALL_GREAT] = {gInterfaceGfx_GreatBall, 384, GFX_TAG_GREATBALL}, + [BALL_SAFARI] = {gInterfaceGfx_SafariBall, 384, GFX_TAG_SAFARIBALL}, + [BALL_ULTRA] = {gInterfaceGfx_UltraBall, 384, GFX_TAG_ULTRABALL}, + [BALL_MASTER] = {gInterfaceGfx_MasterBall, 384, GFX_TAG_MASTERBALL}, + [BALL_NET] = {gInterfaceGfx_NetBall, 384, GFX_TAG_NETBALL}, + [BALL_DIVE] = {gInterfaceGfx_DiveBall, 384, GFX_TAG_DIVEBALL}, + [BALL_NEST] = {gInterfaceGfx_NestBall, 384, GFX_TAG_NESTBALL}, + [BALL_REPEAT] = {gInterfaceGfx_RepeatBall, 384, GFX_TAG_REPEATBALL}, + [BALL_TIMER] = {gInterfaceGfx_TimerBall, 384, GFX_TAG_TIMERBALL}, + [BALL_LUXURY] = {gInterfaceGfx_LuxuryBall, 384, GFX_TAG_LUXURYBALL}, + [BALL_PREMIER] = {gInterfaceGfx_PremierBall, 384, GFX_TAG_PREMIERBALL}, }; const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] = { - {gInterfacePal_PokeBall, GFX_TAG_POKEBALL}, - {gInterfacePal_GreatBall, GFX_TAG_GREATBALL}, - {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL}, - {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL}, - {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL}, - {gInterfacePal_NetBall, GFX_TAG_NETBALL}, - {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL}, - {gInterfacePal_NestBall, GFX_TAG_NESTBALL}, - {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL}, - {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL}, - {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL}, - {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL}, + [BALL_POKE] = {gInterfacePal_PokeBall, GFX_TAG_POKEBALL}, + [BALL_GREAT] = {gInterfacePal_GreatBall, GFX_TAG_GREATBALL}, + [BALL_SAFARI] = {gInterfacePal_SafariBall, GFX_TAG_SAFARIBALL}, + [BALL_ULTRA] = {gInterfacePal_UltraBall, GFX_TAG_ULTRABALL}, + [BALL_MASTER] = {gInterfacePal_MasterBall, GFX_TAG_MASTERBALL}, + [BALL_NET] = {gInterfacePal_NetBall, GFX_TAG_NETBALL}, + [BALL_DIVE] = {gInterfacePal_DiveBall, GFX_TAG_DIVEBALL}, + [BALL_NEST] = {gInterfacePal_NestBall, GFX_TAG_NESTBALL}, + [BALL_REPEAT] = {gInterfacePal_RepeatBall, GFX_TAG_REPEATBALL}, + [BALL_TIMER] = {gInterfacePal_TimerBall, GFX_TAG_TIMERBALL}, + [BALL_LUXURY] = {gInterfacePal_LuxuryBall, GFX_TAG_LUXURYBALL}, + [BALL_PREMIER] = {gInterfacePal_PremierBall, GFX_TAG_PREMIERBALL}, }; static const struct OamData sBallOamData = @@ -213,7 +214,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_GREATBALL, @@ -222,7 +223,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_SAFARIBALL, @@ -231,7 +232,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_ULTRABALL, @@ -240,7 +241,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_MASTERBALL, @@ -249,7 +250,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_NETBALL, @@ -258,7 +259,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_DIVEBALL, @@ -267,7 +268,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_NESTBALL, @@ -276,7 +277,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_REPEATBALL, @@ -285,7 +286,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_TIMERBALL, @@ -294,7 +295,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_LUXURYBALL, @@ -303,7 +304,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, { .tileTag = GFX_TAG_PREMIERBALL, @@ -312,7 +313,7 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_TestBallThrow, + .callback = SpriteCB_BallThrow, }, }; @@ -408,7 +409,10 @@ static void Task_DoPokeballSendOutAnim(u8 taskId) PlaySE(SE_BALL_THROW); } -static void SpriteCB_TestBallThrow(struct Sprite *sprite) +// This sequence of functions is very similar to those that get run when +// a Pokéball gets thrown at a wild Pokémon, starting at SpriteCB_Ball_Arc. +// These do not seem to get run. +static void SpriteCB_BallThrow(struct Sprite *sprite) { if (TranslateAnimHorizontalArc(sprite)) { @@ -430,7 +434,7 @@ static void SpriteCB_TestBallThrow(struct Sprite *sprite) sprite->sBattler = opponentBattler; sprite->data[7] = noOfShakes; DestroyTask(taskId); - sprite->callback = sub_80756D4; + sprite->callback = SpriteCB_BallThrow_ReachMon; } } @@ -440,26 +444,24 @@ static void SpriteCB_TestBallThrow(struct Sprite *sprite) #undef tBattler #undef tOpponentBattler -static void sub_80756D4(struct Sprite *sprite) +static void SpriteCB_BallThrow_ReachMon(struct Sprite *sprite) { - sprite->callback = sub_80756E0; + sprite->callback = SpriteCB_BallThrow_StartShrinkMon; } -// Start something for battler -static void sub_80756E0(struct Sprite *sprite) +static void SpriteCB_BallThrow_StartShrinkMon(struct Sprite *sprite) { if (++sprite->data[5] == 10) { sprite->data[5] = 0; - sprite->callback = sub_807574C; - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 2); + sprite->callback = SpriteCB_BallThrow_ShrinkMon; + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_RETURN); AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); gSprites[gBattlerSpriteIds[sprite->sBattler]].data[1] = 0; } } -// Shrink player -static void sub_807574C(struct Sprite *sprite) +static void SpriteCB_BallThrow_ShrinkMon(struct Sprite *sprite) { sprite->data[5]++; if (sprite->data[5] == 11) @@ -469,7 +471,7 @@ static void sub_807574C(struct Sprite *sprite) StartSpriteAnim(sprite, 2); gSprites[gBattlerSpriteIds[sprite->sBattler]].invisible = TRUE; sprite->data[5] = 0; - sprite->callback = sub_80757E4; + sprite->callback = SpriteCB_BallThrow_Close; } else { @@ -478,7 +480,7 @@ static void sub_807574C(struct Sprite *sprite) } } -static void sub_80757E4(struct Sprite *sprite) +static void SpriteCB_BallThrow_Close(struct Sprite *sprite) { if (sprite->animEnded) { @@ -490,12 +492,12 @@ static void sub_80757E4(struct Sprite *sprite) sprite->data[5] = 0; sprite->pos1.y += Cos(0, 32); sprite->pos2.y = -Cos(0, sprite->data[4]); - sprite->callback = sub_8075838; + sprite->callback = SpriteCB_BallThrow_FallToGround; } } } -static void sub_8075838(struct Sprite *sprite) +static void SpriteCB_BallThrow_FallToGround(struct Sprite *sprite) { bool8 r5 = FALSE; @@ -548,14 +550,14 @@ static void sub_8075838(struct Sprite *sprite) } else { - sprite->callback = sub_8075930; + sprite->callback = SpriteCB_BallThrow_StartShakes; sprite->data[4] = 1; sprite->data[5] = 0; } } } -static void sub_8075930(struct Sprite *sprite) +static void SpriteCB_BallThrow_StartShakes(struct Sprite *sprite) { sprite->data[3]++; if (sprite->data[3] == 31) @@ -563,12 +565,12 @@ static void sub_8075930(struct Sprite *sprite) sprite->data[3] = 0; sprite->affineAnimPaused = TRUE; StartSpriteAffineAnim(sprite, 1); - sprite->callback = sub_8075970; + sprite->callback = SpriteCB_BallThrow_Shake; PlaySE(SE_BALL); } } -static void sub_8075970(struct Sprite *sprite) +static void SpriteCB_BallThrow_Shake(struct Sprite *sprite) { switch (sprite->data[3] & 0xFF) { @@ -611,7 +613,7 @@ static void sub_8075970(struct Sprite *sprite) { if (sprite->data[7] == 4 && sprite->data[3] >> 8 == 3) { - sprite->callback = sub_8075FB4; + sprite->callback = SpriteCB_BallThrow_StartCaptureMon; sprite->affineAnimPaused = TRUE; } else @@ -656,7 +658,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) u16 species = gTasks[taskId].tCryTaskSpecies; u8 battlerId = gTasks[taskId].tCryTaskBattler; u8 monSpriteId = gTasks[taskId].tCryTaskMonSpriteId; - struct Pokemon *mon = (void*)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 0x10) | (u16)(gTasks[taskId].tCryTaskMonPtr2)); + struct Pokemon *mon = (void*)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 16) | (u16)(gTasks[taskId].tCryTaskMonPtr2)); switch (gTasks[taskId].tCryTaskState) { @@ -670,7 +672,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) PlayCry3(species, pan, 0); else PlayCry3(species, pan, 11); - gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 0; + gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = FALSE; DestroyTask(taskId); break; case 2: @@ -686,7 +688,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) else PlayCry4(species, pan, 12); - gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 0; + gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = FALSE; DestroyTask(taskId); } else @@ -725,7 +727,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) else PlayCry4(species, pan, 11); - gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 0; + gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = FALSE; DestroyTask(taskId); break; } @@ -763,7 +765,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) species = GetMonData(mon, MON_DATA_SPECIES); if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) - && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1) + && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -776,14 +778,14 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) } } - if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->field_9_x1) + if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->introAnimActive) wantedCryCase = 0; else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) wantedCryCase = 1; else wantedCryCase = 2; - gBattleSpritesDataPtr->healthBoxesData[battlerId].field_1_x40 = 1; + gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = TRUE; taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3); gTasks[taskId].tCryTaskSpecies = species; @@ -791,12 +793,12 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) gTasks[taskId].tCryTaskWantedCry = wantedCryCase; gTasks[taskId].tCryTaskBattler = battlerId; gTasks[taskId].tCryTaskMonSpriteId = gBattlerSpriteIds[sprite->sBattler]; - gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 0x10; + gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 16; gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon); gTasks[taskId].tCryTaskState = 0; } - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], 1); + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBattler]], BATTLER_AFFINE_EMERGE); if (GetBattlerSide(sprite->sBattler) == B_SIDE_OPPONENT) gSprites[gBattlerSpriteIds[sprite->sBattler]].callback = SpriteCb_OpponentMonFromBall; @@ -817,10 +819,10 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) #undef tCryTaskFrames #undef tCryTaskState -static void sub_8075FB4(struct Sprite *sprite) +static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite) { sprite->animPaused = TRUE; - sprite->callback = sub_80760F8; + sprite->callback = SpriteCB_BallThrow_CaptureMon; sprite->data[3] = 0; sprite->data[4] = 0; sprite->data[5] = 0; @@ -836,7 +838,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite) sprite->invisible = TRUE; if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded) { - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL); affineAnimEnded = TRUE; } else @@ -867,7 +869,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite) } } -static void sub_80760F8(struct Sprite *sprite) +static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite) { u8 battlerId = sprite->sBattler; @@ -950,7 +952,7 @@ static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite) sprite->sBattler = sprite->oam.affineParam & 0xFF; sprite->data[0] = 0; - if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1 + if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive && sprite->sBattler == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)) sprite->callback = SpriteCB_ReleaseMon2FromBall; else @@ -976,7 +978,7 @@ static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite) if (sprite->data[0] > 15) { sprite->data[0] = 0; - if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1 + if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive && sprite->sBattler == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)) sprite->callback = SpriteCB_ReleaseMon2FromBall; else @@ -996,6 +998,7 @@ static u8 LaunchBallFadeMonTaskForPokeball(bool8 unFadeLater, u8 battlerId, u32 return LaunchBallFadeMonTask(unFadeLater, battlerId, arg2, BALL_POKE); } +// Pokeball in Birch intro, and when receiving via trade void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 battlerId, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h, u16 species) { u8 spriteId; @@ -1017,12 +1020,12 @@ void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 battlerId, u8 x, u8 y, gSprites[spriteId].data[3] = h; gSprites[spriteId].data[4] = h >> 0x10; gSprites[spriteId].oam.priority = oamPriority; - gSprites[spriteId].callback = sub_8076524; + gSprites[spriteId].callback = SpriteCB_PokeballReleaseMon; gSprites[monSpriteId].invisible = TRUE; } -static void sub_8076524(struct Sprite *sprite) +static void SpriteCB_PokeballReleaseMon(struct Sprite *sprite) { if (sprite->data[1] == 0) { @@ -1039,9 +1042,9 @@ static void sub_8076524(struct Sprite *sprite) StartSpriteAnim(sprite, 1); AnimateBallOpenParticlesForPokeball(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r5); sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, battlerId, r4); - sprite->callback = sub_80765E0; + sprite->callback = SpriteCB_ReleasedMonFlyOut; gSprites[r7].invisible = FALSE; - StartSpriteAffineAnim(&gSprites[r7], 1); + StartSpriteAffineAnim(&gSprites[r7], BATTLER_AFFINE_EMERGE); AnimateSprite(&gSprites[r7]); gSprites[r7].data[1] = 0x1000; sprite->data[7] = 0; @@ -1052,7 +1055,7 @@ static void sub_8076524(struct Sprite *sprite) } } -static void sub_80765E0(struct Sprite *sprite) +static void SpriteCB_ReleasedMonFlyOut(struct Sprite *sprite) { bool8 r12 = FALSE; bool8 r6 = FALSE; @@ -1064,7 +1067,7 @@ static void sub_80765E0(struct Sprite *sprite) sprite->invisible = TRUE; if (gSprites[monSpriteId].affineAnimEnded) { - StartSpriteAffineAnim(&gSprites[monSpriteId], 0); + StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_NORMAL); r12 = TRUE; } var1 = (sprite->data[5] - sprite->pos1.x) * sprite->data[7] / 128 + sprite->pos1.x; @@ -1111,16 +1114,16 @@ u8 CreateTradePokeballSprite(u8 a, u8 b, u8 x, u8 y, u8 oamPriority, u8 subPrior gSprites[spriteId].data[3] = h; gSprites[spriteId].data[4] = h >> 16; gSprites[spriteId].oam.priority = oamPriority; - gSprites[spriteId].callback = sub_80767D4; + gSprites[spriteId].callback = SpriteCB_TradePokeball; return spriteId; } -static void sub_80767D4(struct Sprite *sprite) +static void SpriteCB_TradePokeball(struct Sprite *sprite) { if (sprite->data[1] == 0) { u8 r6; - u8 r7 = sprite->data[0]; + u8 monSpriteId = sprite->data[0]; u8 r8 = sprite->data[2]; u32 r5 = (u16)sprite->data[3] | ((u16)sprite->data[4] << 16); @@ -1132,10 +1135,15 @@ static void sub_80767D4(struct Sprite *sprite) StartSpriteAnim(sprite, 1); AnimateBallOpenParticlesForPokeball(sprite->pos1.x, sprite->pos1.y - 5, sprite->oam.priority, r6); sprite->data[1] = LaunchBallFadeMonTaskForPokeball(1, r8, r5); - sprite->callback = sub_807687C; - StartSpriteAffineAnim(&gSprites[r7], 2); - AnimateSprite(&gSprites[r7]); - gSprites[r7].data[1] = 0; + sprite->callback = SpriteCB_TradePokeballSendOff; +#ifdef BUGFIX + // FIX: If this is used on a sprite that has previously had an affine animation, it will not + // play the shrink anim properly due to being paused. Works together with the fix to `sub_817F77C`. + gSprites[monSpriteId].affineAnimPaused = FALSE; +#endif // BUGFIX + StartSpriteAffineAnim(&gSprites[monSpriteId], BATTLER_AFFINE_RETURN); + AnimateSprite(&gSprites[monSpriteId]); + gSprites[monSpriteId].data[1] = 0; } else { @@ -1143,29 +1151,29 @@ static void sub_80767D4(struct Sprite *sprite) } } -static void sub_807687C(struct Sprite *sprite) +static void SpriteCB_TradePokeballSendOff(struct Sprite *sprite) { - u8 r1; + u8 monSpriteId; sprite->data[5]++; if (sprite->data[5] == 11) PlaySE(SE_BALL_TRADE); - r1 = sprite->data[0]; - if (gSprites[r1].affineAnimEnded) + monSpriteId = sprite->data[0]; + if (gSprites[monSpriteId].affineAnimEnded) { StartSpriteAnim(sprite, 2); - gSprites[r1].invisible = TRUE; + gSprites[monSpriteId].invisible = TRUE; sprite->data[5] = 0; - sprite->callback = sub_80768F0; + sprite->callback = SpriteCB_TradePokeballEnd; } else { - gSprites[r1].data[1] += 96; - gSprites[r1].pos2.y = -gSprites[r1].data[1] >> 8; + gSprites[monSpriteId].data[1] += 96; + gSprites[monSpriteId].pos2.y = -gSprites[monSpriteId].data[1] >> 8; } } -static void sub_80768F0(struct Sprite *sprite) +static void SpriteCB_TradePokeballEnd(struct Sprite *sprite) { if (sprite->animEnded) sprite->callback = SpriteCallbackDummy; @@ -1176,45 +1184,54 @@ static void Unref_DestroySpriteAndFreeResources(struct Sprite *sprite) DestroySpriteAndFreeResources(sprite); } -void sub_8076918(u8 battlerId) +#define sSpeedX data[0] +#define sSpeedY data[1] + +#define sDelayTimer data[1] + +void StartHealthboxSlideIn(u8 battlerId) { struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]]; - healthboxSprite->data[0] = 5; - healthboxSprite->data[1] = 0; + healthboxSprite->sSpeedX = 5; + healthboxSprite->sSpeedY = 0; healthboxSprite->pos2.x = 0x73; healthboxSprite->pos2.y = 0; - healthboxSprite->callback = sub_80769CC; + healthboxSprite->callback = SpriteCB_HealthboxSlideIn; if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { - healthboxSprite->data[0] = -healthboxSprite->data[0]; - healthboxSprite->data[1] = -healthboxSprite->data[1]; + healthboxSprite->sSpeedX = -healthboxSprite->sSpeedX; + healthboxSprite->sSpeedY = -healthboxSprite->sSpeedY; healthboxSprite->pos2.x = -healthboxSprite->pos2.x; healthboxSprite->pos2.y = -healthboxSprite->pos2.y; } gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT) - healthboxSprite->callback = sub_80769A8; + healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed; } -static void sub_80769A8(struct Sprite *sprite) +static void SpriteCB_HealthboxSlideInDelayed(struct Sprite *sprite) { - sprite->data[1]++; - if (sprite->data[1] == 20) + sprite->sDelayTimer++; + if (sprite->sDelayTimer == 20) { - sprite->data[1] = 0; - sprite->callback = sub_80769CC; + sprite->sDelayTimer = 0; + sprite->callback = SpriteCB_HealthboxSlideIn; } } -static void sub_80769CC(struct Sprite *sprite) +static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite) { - sprite->pos2.x -= sprite->data[0]; - sprite->pos2.y -= sprite->data[1]; + sprite->pos2.x -= sprite->sSpeedX; + sprite->pos2.y -= sprite->sSpeedY; if (sprite->pos2.x == 0 && sprite->pos2.y == 0) sprite->callback = SpriteCallbackDummy; } +#undef sSpeedX +#undef sSpeedY +#undef sDelayTimer + void DoHitAnimHealthboxEffect(u8 battlerId) { u8 spriteId; @@ -1257,7 +1274,7 @@ void LoadBallGfx(u8 ballId) break; default: var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); - LZDecompressVram(gOpenPokeballGfx, (void *)(VRAM + 0x10100 + var * 32)); + LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); break; } } diff --git a/src/pokeblock.c b/src/pokeblock.c index 0bfb10632..daf50a612 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -29,28 +29,50 @@ #include "task.h" #include "text.h" #include "text_window.h" -#include "constants/berry.h" #include "constants/items.h" #include "constants/songs.h" #include "constants/rgb.h" +#define MAX_MENU_ITEMS 9 +#define MENU_MIDPOINT (MAX_MENU_ITEMS / 2) + +#define TILE_HIGHLIGHT_NONE 0x0005 // Tile number for the bg of an unselected menu item +#define TILE_HIGHLIGHT_BLUE 0x1005 // Tile number for the bg of a selected menu item +#define TILE_HIGHLIGHT_RED 0x2005 // Tile number for the bg of a menu item to swap + +#define TAG_POKEBLOCK_CASE 14800 +#define TAG_SCROLL_ARROW 1110 + #define POKEBLOCK_MAX_FEEL 99 -#define FIELD_E75_COUNT 7 + +enum { + WIN_TITLE, + WIN_LIST, + WIN_SPICY, + WIN_DRY, + WIN_SWEET, + WIN_BITTER, + WIN_SOUR, + WIN_FEEL, + WIN_ACTIONS_TALL, + WIN_ACTIONS, + WIN_TOSS_MSG, +}; struct PokeblockMenuStruct { - u8 tilemap[0x800]; + u8 tilemap[BG_SCREEN_SIZE]; void (*callbackOnUse)(void); - const u8 *pokeblockOptionsIds; - u8 optionsNo; + const u8 *pokeblockActionIds; + u8 numActions; u8 caseId; u8 itemsNo; u8 maxShowed; struct ListMenuItem items[POKEBLOCKS_COUNT + 1]; - u8 menuItemsStrings[POKEBLOCKS_COUNT + 1][0x20]; // + 1 because of STOW CASE item + u8 menuItemsStrings[POKEBLOCKS_COUNT + 1][32]; // + 1 because of STOW CASE item u8 pokeblockCaseSpriteId; - u8 field_E75[FIELD_E75_COUNT]; - u8 unkTaskId; + u8 swapLineSpriteIds[7]; + u8 arrowTaskId; bool8 isSwapping; s16 gfxState; u8 unused[8]; @@ -59,8 +81,8 @@ struct PokeblockMenuStruct struct PokeblockSavedData { void (*callback)(void); - u16 lastItemPos; - u16 lastItemPage; + u16 selectedRow; + u16 scrollOffset; }; enum @@ -83,43 +105,41 @@ static bool8 LoadPokeblockMenuGfx(void); static void HandleInitBackgrounds(void); static void HandleInitWindows(void); static void SetMenuItemsCountAndMaxShowed(void); -static void sub_81362E0(void); -static void sub_8136344(void); -static void HandlePokeblockListMenuItems(void); -static void sub_81363BC(void); -static void MovePokeblockMenuCursor(s32 pkblId, bool8 arg1, struct ListMenu *arg2); -static void PutPokeblockInfoText(void); -static void HandlePokeblockMenuCursor(u16 cursorPos, u16 arg1); -static void PutPokeblockListMenuString(u8 *dst, u16 pkblId); -static void Task_HandlePokeblockMenuInput(u8 taskId); -static void PokeblockAction_UseOnField(u8 taskId); -static void PokeblockAction_Toss(u8 taskId); -static void PokeblockAction_Cancel(u8 taskId); -static void PokeblockAction_UseInBattle(u8 taskId); -static void PokeblockAction_UseOnPokeblockFeeder(u8 taskId); -static void PokeblockAction_GiveToContestLady(u8 taskId); -static void TossPokeblockChoice_Yes(u8 taskId); -static void TossPokeblockChoice_No(u8 taskId); -static void Task_FreeDataAndExitPokeblockCase(u8 taskId); -static void Task_HandlePokeblockOptionsInput(u8 taskId); -static void PutPokeblockOptionsWindow(u8 taskId); -static void Task_HandlePokeblocksSwapInput(u8 taskId); -static void sub_8136470(struct Sprite *sprite); -static void sub_8135FCC(s32 pkblId); -static void HandlePokeblocksSwap(u8 taskId, bool8 noSwap); +static void LimitMenuScrollAndRow(void); +static void SetInitialScroll(void); +static void UpdatePokeblockList(void); +static void CreateScrollArrows(void); +static void MovePokeblockMenuCursor(s32, bool8, struct ListMenu *); +static void DrawPokeblockMenuTitleText(void); +static void DrawPokeblockMenuHighlight(u16, u16); +static void PutPokeblockListMenuString(u8 *, u16); +static void Task_HandlePokeblockMenuInput(u8); +static void PokeblockAction_UseOnField(u8); +static void PokeblockAction_Toss(u8); +static void PokeblockAction_Cancel(u8); +static void PokeblockAction_UseInBattle(u8); +static void PokeblockAction_UseOnPokeblockFeeder(u8); +static void PokeblockAction_GiveToContestLady(u8); +static void TossedPokeblockMessage(u8); +static void CloseTossPokeblockWindow(u8); +static void Task_FreeDataAndExitPokeblockCase(u8); +static void Task_HandlePokeblockActionsInput(u8); +static void ShowPokeblockActionsWindow(u8); +static void Task_HandlePokeblocksSwapInput(u8); +static void SpriteCB_ShakePokeblockCase(struct Sprite *); +static void DrawPokeblockInfo(s32); +static void UpdatePokeblockSwapMenu(u8, bool8); static void UsePokeblockOnField(void); static void ReturnToPokeblockCaseOnField(void); -static void CreateTossPokeblockYesNoMenu(u8 taskId); -static void HandleErasePokeblock(u8 taskId); +static void CreateTossPokeblockYesNoMenu(u8); +static void TossPokeblock(u8); -// ram variables EWRAM_DATA static struct PokeblockSavedData sSavedPokeblockData = {0}; EWRAM_DATA static struct PokeblockMenuStruct *sPokeblockMenu = NULL; -// const rom data const s8 gPokeblockFlavorCompatibilityTable[NUM_NATURES * FLAVOR_COUNT] = { - // Cool, Beauty, Cute, Smart, Tough + // Spicy, Dry, Sweet, Bitter, Sour 0, 0, 0, 0, 0, // Hardy 1, 0, 0, 0, -1, // Lonely 1, 0, -1, 0, 0, // Brave @@ -199,12 +219,12 @@ const u8 *const gPokeblockNames[] = static const struct MenuAction sPokeblockMenuActions[] = { - {gMenuText_Use, PokeblockAction_UseOnField}, - {gMenuText_Toss, PokeblockAction_Toss}, - {gText_Cancel2, PokeblockAction_Cancel}, - {gMenuText_Use, PokeblockAction_UseInBattle}, - {gMenuText_Use, PokeblockAction_UseOnPokeblockFeeder}, - {gMenuText_Give2, PokeblockAction_GiveToContestLady}, + [PKBL_USE_ON_FIELD] = {gMenuText_Use, PokeblockAction_UseOnField}, + [PKBL_TOSS] = {gMenuText_Toss, PokeblockAction_Toss}, + [PKBL_CANCEL] = {gText_Cancel2, PokeblockAction_Cancel}, + [PKBL_USE_IN_BATTLE] = {gMenuText_Use, PokeblockAction_UseInBattle}, + [PKBL_USE_ON_FEEDER] = {gMenuText_Use, PokeblockAction_UseOnPokeblockFeeder}, + [PKBL_GIVE_TO_LADY] = {gMenuText_Give2, PokeblockAction_GiveToContestLady}, }; static const u8 sActionsOnField[] = {PKBL_USE_ON_FIELD, PKBL_TOSS, PKBL_CANCEL}; @@ -212,7 +232,7 @@ static const u8 sActionsInBattle[] = {PKBL_USE_IN_BATTLE, PKBL_CANCEL}; static const u8 sActionsOnPokeblockFeeder[] = {PKBL_USE_ON_FEEDER, PKBL_CANCEL}; static const u8 sActionsWhenGivingToLady[] = {PKBL_GIVE_TO_LADY, PKBL_CANCEL}; -static const struct YesNoFuncTable sTossYesNoFuncTable = {TossPokeblockChoice_Yes, TossPokeblockChoice_No}; +static const struct YesNoFuncTable sTossYesNoFuncTable = {TossedPokeblockMessage, CloseTossPokeblockWindow}; static const u8 sContestStatsMonData[] = {MON_DATA_COOL, MON_DATA_BEAUTY, MON_DATA_CUTE, MON_DATA_SMART, MON_DATA_TOUGH}; @@ -260,39 +280,39 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_85B26F0[] = const struct CompressedSpriteSheet gPokeblockCase_SpriteSheet = { - gMenuPokeblockDevice_Gfx, 0x800, GFX_TAG_POKEBLOCK_CASE + gMenuPokeblockDevice_Gfx, 0x800, TAG_POKEBLOCK_CASE }; const struct CompressedSpritePalette gPokeblockCase_SpritePal = { - gMenuPokeblockDevice_Pal, GFX_TAG_POKEBLOCK_CASE + gMenuPokeblockDevice_Pal, TAG_POKEBLOCK_CASE }; static const struct SpriteTemplate sSpriteTemplate_PokeblockCase = { - GFX_TAG_POKEBLOCK_CASE, - GFX_TAG_POKEBLOCK_CASE, - &sOamData_PokeblockCase, - sSpriteAnimTable_PokeblockCase, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy + .tileTag = TAG_POKEBLOCK_CASE, + .paletteTag = TAG_POKEBLOCK_CASE, + .oam = &sOamData_PokeblockCase, + .anims = sSpriteAnimTable_PokeblockCase, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy }; -static const u8 sTextColorInPokeblockMenu[3] = {0, 2, 3}; +static const u8 sTextColor[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; -static const struct Pokeblock sFavoritePokeblocksTable[] = +static const struct Pokeblock sFavoritePokeblocksTable[FLAVOR_COUNT] = { - { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20}, - { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20}, - { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20}, - { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20}, - { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20} + [FLAVOR_SPICY] = { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20}, + [FLAVOR_DRY] = { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20}, + [FLAVOR_SWEET] = { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20}, + [FLAVOR_BITTER] = { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20}, + [FLAVOR_SOUR] = { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20} }; -static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = +static const struct WindowTemplate sWindowTemplates[] = { - { + [WIN_TITLE] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 1, @@ -301,7 +321,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x1E }, - { + [WIN_LIST] = { .bg = 0, .tilemapLeft = 15, .tilemapTop = 1, @@ -310,7 +330,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x30 }, - { + [WIN_SPICY] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 13, @@ -319,7 +339,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x12C }, - { + [WIN_DRY] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 15, @@ -328,7 +348,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x136 }, - { + [WIN_SWEET] = { .bg = 0, .tilemapLeft = 2, .tilemapTop = 17, @@ -337,7 +357,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x140 }, - { + [WIN_BITTER] = { .bg = 0, .tilemapLeft = 8, .tilemapTop = 13, @@ -346,7 +366,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x14A }, - { + [WIN_SOUR] = { .bg = 0, .tilemapLeft = 8, .tilemapTop = 15, @@ -355,7 +375,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x154 }, - { + [WIN_FEEL] = { .bg = 0, .tilemapLeft = 11, .tilemapTop = 17, @@ -364,7 +384,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x15E }, - { + [WIN_ACTIONS_TALL] = { .bg = 1, .tilemapLeft = 7, .tilemapTop = 5, @@ -373,7 +393,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x162 }, - { + [WIN_ACTIONS] = { .bg = 1, .tilemapLeft = 7, .tilemapTop = 7, @@ -382,7 +402,7 @@ static const struct WindowTemplate sWindowTemplatesForPokeblockMenu[] = .paletteNum = 15, .baseBlock = 0x186 }, - { + [WIN_TOSS_MSG] = { .bg = 1, .tilemapLeft = 2, .tilemapTop = 15, @@ -412,7 +432,7 @@ static const struct ListMenuTemplate sPokeblockListMenuTemplate = .itemPrintFunc = NULL, .totalItems = 0, .maxShowed = 0, - .windowId = 1, + .windowId = WIN_LIST, .header_X = 0, .item_X = 1, .cursor_X = 0, @@ -427,33 +447,32 @@ static const struct ListMenuTemplate sPokeblockListMenuTemplate = .cursorKind = 1 }; -// code void OpenPokeblockCase(u8 caseId, void (*callback)(void)) { sPokeblockMenu = Alloc(sizeof(*sPokeblockMenu)); sPokeblockMenu->caseId = caseId; sPokeblockMenu->callbackOnUse = NULL; - sPokeblockMenu->unkTaskId = 0xFF; + sPokeblockMenu->arrowTaskId = TASK_NONE; sPokeblockMenu->isSwapping = FALSE; sSavedPokeblockData.callback = callback; switch (sPokeblockMenu->caseId) { case PBLOCK_CASE_BATTLE: - sPokeblockMenu->pokeblockOptionsIds = sActionsInBattle; - sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsInBattle); + sPokeblockMenu->pokeblockActionIds = sActionsInBattle; + sPokeblockMenu->numActions = ARRAY_COUNT(sActionsInBattle); break; case PBLOCK_CASE_FEEDER: - sPokeblockMenu->pokeblockOptionsIds = sActionsOnPokeblockFeeder; - sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsOnPokeblockFeeder); + sPokeblockMenu->pokeblockActionIds = sActionsOnPokeblockFeeder; + sPokeblockMenu->numActions = ARRAY_COUNT(sActionsOnPokeblockFeeder); break; case PBLOCK_CASE_GIVE: - sPokeblockMenu->pokeblockOptionsIds = sActionsWhenGivingToLady; - sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsWhenGivingToLady); + sPokeblockMenu->pokeblockActionIds = sActionsWhenGivingToLady; + sPokeblockMenu->numActions = ARRAY_COUNT(sActionsWhenGivingToLady); break; default: // PBLOCK_CASE_FIELD - sPokeblockMenu->pokeblockOptionsIds = sActionsOnField; - sPokeblockMenu->optionsNo = ARRAY_COUNT(sActionsOnField); + sPokeblockMenu->pokeblockActionIds = sActionsOnField; + sPokeblockMenu->numActions = ARRAY_COUNT(sActionsOnField); break; } @@ -499,6 +518,10 @@ static void CB2_InitPokeblockMenu(void) } } +#define tListTaskId data[0] +#define tWindowId data[1] +#define tToSwapId data[2] + static bool8 InitPokeblockMenu(void) { u8 taskId; @@ -520,7 +543,7 @@ static bool8 InitPokeblockMenu(void) break; case 3: ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = 1; + gPaletteFade.bufferTransferDisabled = TRUE; gMain.state++; break; case 4: @@ -544,8 +567,8 @@ static bool8 InitPokeblockMenu(void) break; case 8: SetMenuItemsCountAndMaxShowed(); - sub_81362E0(); - sub_8136344(); + LimitMenuScrollAndRow(); + SetInitialScroll(); gMain.state++; break; case 9: @@ -553,11 +576,11 @@ static bool8 InitPokeblockMenu(void) gMain.state++; break; case 10: - sub_8122344(sPokeblockMenu->field_E75, FIELD_E75_COUNT); + CreateSwapLineSprites(sPokeblockMenu->swapLineSpriteIds, ARRAY_COUNT(sPokeblockMenu->swapLineSpriteIds)); gMain.state++; break; case 11: - HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x1005); + DrawPokeblockMenuHighlight(sSavedPokeblockData.selectedRow, TILE_HIGHLIGHT_BLUE); gMain.state++; break; case 12: @@ -565,29 +588,29 @@ static bool8 InitPokeblockMenu(void) gMain.state++; break; case 13: - HandlePokeblockListMenuItems(); + UpdatePokeblockList(); gMain.state++; break; case 14: - sub_81363BC(); + CreateScrollArrows(); gMain.state++; break; case 15: taskId = CreateTask(Task_HandlePokeblockMenuInput, 0); - gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sSavedPokeblockData.lastItemPage, sSavedPokeblockData.lastItemPos); + gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sSavedPokeblockData.scrollOffset, sSavedPokeblockData.selectedRow); gMain.state++; break; case 16: - PutPokeblockInfoText(); + DrawPokeblockMenuTitleText(); gMain.state++; break; case 17: - BlendPalettes(-1, 0x10, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gMain.state++; break; case 18: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - gPaletteFade.bufferTransferDisabled = 0; + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; default: @@ -646,7 +669,7 @@ static bool8 LoadPokeblockMenuGfx(void) sPokeblockMenu->gfxState++; break; case 5: - LoadListMenuArrowsGfx(); + LoadListMenuSwapLineGfx(); sPokeblockMenu->gfxState = 0; return TRUE; } @@ -658,16 +681,14 @@ static void HandleInitWindows(void) { u8 i; - InitWindows(sWindowTemplatesForPokeblockMenu); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); LoadUserWindowBorderGfx(0, 1, 0xE0); LoadMessageBoxGfx(0, 0xA, 0xD0); LoadPalette(gUnknown_0860F074, 0xF0, 0x20); - for (i = 0; i < ARRAY_COUNT(sWindowTemplatesForPokeblockMenu) - 1; i++) - { + for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++) FillWindowPixelBuffer(i, PIXEL_FILL(0)); - } ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); @@ -675,29 +696,27 @@ static void HandleInitWindows(void) static void PrintOnPokeblockWindow(u8 windowId, const u8 *string, s32 x) { - AddTextPrinterParameterized4(windowId, 1, x, 1, 0, 0, sTextColorInPokeblockMenu, 0, string); + AddTextPrinterParameterized4(windowId, 1, x, 1, 0, 0, sTextColor, 0, string); } -static void PutPokeblockInfoText(void) +static void DrawPokeblockMenuTitleText(void) { u8 i; const u8 *itemName = ItemId_GetName(ITEM_POKEBLOCK_CASE); - PrintOnPokeblockWindow(0, itemName, GetStringCenterAlignXOffset(1, itemName, 0x48)); + PrintOnPokeblockWindow(WIN_TITLE, itemName, GetStringCenterAlignXOffset(1, itemName, 0x48)); - PrintOnPokeblockWindow(2, gText_Spicy, 0); - PrintOnPokeblockWindow(3, gText_Dry, 0); - PrintOnPokeblockWindow(4, gText_Sweet, 0); - PrintOnPokeblockWindow(5, gText_Bitter, 0); - PrintOnPokeblockWindow(6, gText_Sour, 0); + PrintOnPokeblockWindow(WIN_SPICY, gText_Spicy, 0); + PrintOnPokeblockWindow(WIN_DRY, gText_Dry, 0); + PrintOnPokeblockWindow(WIN_SWEET, gText_Sweet, 0); + PrintOnPokeblockWindow(WIN_BITTER, gText_Bitter, 0); + PrintOnPokeblockWindow(WIN_SOUR, gText_Sour, 0); - for (i = 0; i < 8; i++) - { + for (i = 0; i < WIN_ACTIONS_TALL; i++) PutWindowTilemap(i); - } } -static void HandlePokeblockListMenuItems(void) +static void UpdatePokeblockList(void) { u16 i; @@ -732,19 +751,19 @@ static void PutPokeblockListMenuString(u8 *dst, u16 pkblId) StringExpandPlaceholders(txtPtr, gText_LvVar1); } -static void MovePokeblockMenuCursor(s32 pkblId, bool8 arg1, struct ListMenu *arg2) +static void MovePokeblockMenuCursor(s32 pkblId, bool8 onInit, struct ListMenu *list) { - if (arg1 != TRUE) + if (onInit != TRUE) { PlaySE(SE_SELECT); - gSprites[sPokeblockMenu->pokeblockCaseSpriteId].callback = sub_8136470; + gSprites[sPokeblockMenu->pokeblockCaseSpriteId].callback = SpriteCB_ShakePokeblockCase; } if (!sPokeblockMenu->isSwapping) - sub_8135FCC(pkblId); + DrawPokeblockInfo(pkblId); } -static void sub_8135FCC(s32 pkblId) +static void DrawPokeblockInfo(s32 pkblId) { u8 i; struct Pokeblock *pokeblock; @@ -761,28 +780,32 @@ static void sub_8135FCC(s32 pkblId) { if (GetPokeblockData(pokeblock, PBLOCK_SPICY + i) > 0) { - rectTilemapSrc[0] = (i << 0xC) + 0x17; - rectTilemapSrc[1] = (i << 0xC) + 0x18; + // Pokéblock has this flavor, draw Pokéblock icon next to it + rectTilemapSrc[0] = (i << 12) + 0x17; + rectTilemapSrc[1] = (i << 12) + 0x18; } else { + // Pokéblock doesn't have this flavor, draw regular tiles rectTilemapSrc[0] = 0xF; rectTilemapSrc[1] = 0xF; } CopyToBgTilemapBufferRect(2, rectTilemapSrc, (i / 3 * 6) + 1, (i % 3 * 2) + 13, 1, 2); } + + // Print the Pokéblock's feel ConvertIntToDecimalStringN(gStringVar1, GetPokeblocksFeel(pokeblock), STR_CONV_MODE_RIGHT_ALIGN, 2); - PrintOnPokeblockWindow(7, gStringVar1, 4); + PrintOnPokeblockWindow(WIN_FEEL, gStringVar1, 4); } else { + // Selected cancel, erase info rectTilemapSrc[0] = 0xF; rectTilemapSrc[1] = 0xF; for (i = 0; i < FLAVOR_COUNT; i++) - { CopyToBgTilemapBufferRect(2, rectTilemapSrc, (i / 3 * 6) + 1, (i % 3 * 2) + 13, 1, 2); - } + CopyWindowToVram(7, 2); } @@ -790,9 +813,9 @@ static void sub_8135FCC(s32 pkblId) ScheduleBgCopyTilemapToVram(2); } -static void HandlePokeblockMenuCursor(u16 cursorPos, u16 arg1) +static void DrawPokeblockMenuHighlight(u16 cursorPos, u16 tileNum) { - FillBgTilemapBufferRect_Palette0(2, arg1, 0xF, (cursorPos * 2) + 1, 0xE, 2); + FillBgTilemapBufferRect_Palette0(2, tileNum, 0xF, (cursorPos * 2) + 1, 0xE, 2); ScheduleBgCopyTilemapToVram(2); } @@ -814,7 +837,7 @@ static void CompactPokeblockSlots(void) } } -static void SwapSortPokeblocksInternalData(u32 id1, u32 id2) +static void SwapPokeblockMenuItems(u32 id1, u32 id2) { s16 i, count; struct Pokeblock *pokeblocks = gSaveBlock1Ptr->pokeblocks; @@ -844,8 +867,8 @@ static void SwapSortPokeblocksInternalData(u32 id1, u32 id2) void ResetPokeblockScrollPositions(void) { - sSavedPokeblockData.lastItemPos = 0; - sSavedPokeblockData.lastItemPage = 0; + sSavedPokeblockData.selectedRow = 0; + sSavedPokeblockData.scrollOffset = 0; } static void SetMenuItemsCountAndMaxShowed(void) @@ -862,56 +885,56 @@ static void SetMenuItemsCountAndMaxShowed(void) sPokeblockMenu->itemsNo++; // STOW CASE menu item - if (sPokeblockMenu->itemsNo > 9) - sPokeblockMenu->maxShowed = 9; + if (sPokeblockMenu->itemsNo > MAX_MENU_ITEMS) + sPokeblockMenu->maxShowed = MAX_MENU_ITEMS; else sPokeblockMenu->maxShowed = sPokeblockMenu->itemsNo; } -static void sub_81362E0(void) +static void LimitMenuScrollAndRow(void) { - if (sSavedPokeblockData.lastItemPage != 0) + if (sSavedPokeblockData.scrollOffset != 0) { - if (sSavedPokeblockData.lastItemPage + sPokeblockMenu->maxShowed > sPokeblockMenu->itemsNo) - sSavedPokeblockData.lastItemPage = sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed; + if (sSavedPokeblockData.scrollOffset + sPokeblockMenu->maxShowed > sPokeblockMenu->itemsNo) + sSavedPokeblockData.scrollOffset = sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed; } - if (sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos >= sPokeblockMenu->itemsNo) + if (sSavedPokeblockData.scrollOffset + sSavedPokeblockData.selectedRow >= sPokeblockMenu->itemsNo) { if (sPokeblockMenu->itemsNo == 0) - sSavedPokeblockData.lastItemPos = 0; + sSavedPokeblockData.selectedRow = 0; else - sSavedPokeblockData.lastItemPos = sPokeblockMenu->itemsNo - 1; + sSavedPokeblockData.selectedRow = sPokeblockMenu->itemsNo - 1; } } -static void sub_8136344(void) +static void SetInitialScroll(void) { - if (sSavedPokeblockData.lastItemPos > 4) + if (sSavedPokeblockData.selectedRow > MENU_MIDPOINT) { u8 i; for (i = 0; - (i < sSavedPokeblockData.lastItemPos - 4) && (sSavedPokeblockData.lastItemPage + sPokeblockMenu->maxShowed != sPokeblockMenu->itemsNo); - sSavedPokeblockData.lastItemPos--, sSavedPokeblockData.lastItemPage++, i++); + (i < sSavedPokeblockData.selectedRow - MENU_MIDPOINT) && (sSavedPokeblockData.scrollOffset + sPokeblockMenu->maxShowed != sPokeblockMenu->itemsNo); + sSavedPokeblockData.selectedRow--, sSavedPokeblockData.scrollOffset++, i++); } } -static void sub_81363BC(void) +static void CreateScrollArrows(void) { - if (sPokeblockMenu->unkTaskId == 0xFF) + if (sPokeblockMenu->arrowTaskId == TASK_NONE) { - sPokeblockMenu->unkTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 8, 0x98, sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed, - 0x456, 0x456, &sSavedPokeblockData.lastItemPage); + sPokeblockMenu->arrowTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 8, 0x98, sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed, + TAG_SCROLL_ARROW, TAG_SCROLL_ARROW, &sSavedPokeblockData.scrollOffset); } } -static void sub_8136418(void) +static void DestroyScrollArrows(void) { - if (sPokeblockMenu->unkTaskId != 0xFF) + if (sPokeblockMenu->arrowTaskId != TASK_NONE) { - RemoveScrollIndicatorArrowPair(sPokeblockMenu->unkTaskId); - sPokeblockMenu->unkTaskId = 0xFF; + RemoveScrollIndicatorArrowPair(sPokeblockMenu->arrowTaskId); + sPokeblockMenu->arrowTaskId = TASK_NONE; } } @@ -920,26 +943,29 @@ u8 CreatePokeblockCaseSprite(s16 x, s16 y, u8 subpriority) return CreateSprite(&sSpriteTemplate_PokeblockCase, x, y, subpriority); } -static void sub_8136470(struct Sprite *sprite) +#define sState data[0] +#define sTimer data[1] + +static void SpriteCB_ShakePokeblockCase(struct Sprite *sprite) { - if (sprite->data[0] > 1) - sprite->data[0] = 0; + if (sprite->sState > 1) + sprite->sState = 0; - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; sprite->affineAnims = sSpriteAffineAnimTable_85B26F0; InitSpriteAffineAnim(sprite); - sprite->data[0] = 1; - sprite->data[1] = 0; + sprite->sState = 1; + sprite->sTimer = 0; break; case 1: - if (++sprite->data[1] > 11) + if (++sprite->sTimer > 11) { sprite->oam.affineMode = ST_OAM_AFFINE_OFF; - sprite->data[0] = 0; - sprite->data[1] = 0; + sprite->sState = 0; + sprite->sTimer = 0; FreeOamMatrix(sprite->oam.matrixNum); sprite->callback = SpriteCallbackDummy; } @@ -949,7 +975,7 @@ static void sub_8136470(struct Sprite *sprite) static void FadePaletteAndSetTaskToClosePokeblockCase(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_FreeDataAndExitPokeblockCase; } @@ -962,8 +988,8 @@ static void Task_FreeDataAndExitPokeblockCase(u8 taskId) if (sPokeblockMenu->caseId == PBLOCK_CASE_FEEDER || sPokeblockMenu->caseId == PBLOCK_CASE_GIVE) gFieldCallback = FieldCB_ContinueScriptHandleMusic; - DestroyListMenuTask(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); - sub_8136418(); + DestroyListMenuTask(tListTaskId, &sSavedPokeblockData.scrollOffset, &sSavedPokeblockData.selectedRow); + DestroyScrollArrows(); ResetSpriteData(); FreeAllSpritePalettes(); @@ -986,29 +1012,31 @@ static void Task_HandlePokeblockMenuInput(u8 taskId) { if (JOY_NEW(SELECT_BUTTON)) { - ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); - if (sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos != sPokeblockMenu->itemsNo - 1) + ListMenuGetScrollAndRow(tListTaskId, &sSavedPokeblockData.scrollOffset, &sSavedPokeblockData.selectedRow); + if (sSavedPokeblockData.scrollOffset + sSavedPokeblockData.selectedRow != sPokeblockMenu->itemsNo - 1) { + // Chose menu item to swap PlaySE(SE_SELECT); - HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x2005); - data[2] = sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos; + DrawPokeblockMenuHighlight(sSavedPokeblockData.selectedRow, TILE_HIGHLIGHT_RED); + tToSwapId = sSavedPokeblockData.scrollOffset + sSavedPokeblockData.selectedRow; sPokeblockMenu->isSwapping = TRUE; gTasks[taskId].func = Task_HandlePokeblocksSwapInput; } } else { - u16 oldPosition = sSavedPokeblockData.lastItemPos; - s32 itemId = ListMenu_ProcessInput(data[0]); + u16 oldPosition = sSavedPokeblockData.selectedRow; + s32 input = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &sSavedPokeblockData.scrollOffset, &sSavedPokeblockData.selectedRow); - ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); - if (oldPosition != sSavedPokeblockData.lastItemPos) + if (oldPosition != sSavedPokeblockData.selectedRow) { - HandlePokeblockMenuCursor(oldPosition, 5); - HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x1005); + // Moved cursor + DrawPokeblockMenuHighlight(oldPosition, TILE_HIGHLIGHT_NONE); + DrawPokeblockMenuHighlight(sSavedPokeblockData.selectedRow, TILE_HIGHLIGHT_BLUE); } - switch (itemId) + switch (input) { case LIST_NOTHING_CHOSEN: break; @@ -1019,9 +1047,10 @@ static void Task_HandlePokeblockMenuInput(u8 taskId) FadePaletteAndSetTaskToClosePokeblockCase(taskId); break; default: + // Selected Pokéblock PlaySE(SE_SELECT); - gSpecialVar_ItemId = itemId; - PutPokeblockOptionsWindow(taskId); + gSpecialVar_ItemId = input; + ShowPokeblockActionsWindow(taskId); break; } } @@ -1037,100 +1066,102 @@ static void Task_HandlePokeblocksSwapInput(u8 taskId) if (JOY_NEW(SELECT_BUTTON)) { + // Swap items PlaySE(SE_SELECT); - ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); - HandlePokeblocksSwap(taskId, FALSE); + ListMenuGetScrollAndRow(tListTaskId, &sSavedPokeblockData.scrollOffset, &sSavedPokeblockData.selectedRow); + UpdatePokeblockSwapMenu(taskId, FALSE); } else { - u16 i = sSavedPokeblockData.lastItemPage; - u16 var = sSavedPokeblockData.lastItemPos; - s32 itemId = ListMenu_ProcessInput(data[0]); + u16 i = sSavedPokeblockData.scrollOffset; + u16 row = sSavedPokeblockData.selectedRow; + s32 input = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &sSavedPokeblockData.scrollOffset, &sSavedPokeblockData.selectedRow); - ListMenuGetScrollAndRow(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); - if (i != sSavedPokeblockData.lastItemPage || var != sSavedPokeblockData.lastItemPos) + if (i != sSavedPokeblockData.scrollOffset || row != sSavedPokeblockData.selectedRow) { - for (i = 0; i < 9; i++) + for (i = 0; i < MAX_MENU_ITEMS; i++) { - var = i + sSavedPokeblockData.lastItemPage; - if (var == data[2]) - HandlePokeblockMenuCursor(i, 0x2005); + row = i + sSavedPokeblockData.scrollOffset; + if (row == tToSwapId) + DrawPokeblockMenuHighlight(i, TILE_HIGHLIGHT_RED); else - HandlePokeblockMenuCursor(i, 5); + DrawPokeblockMenuHighlight(i, TILE_HIGHLIGHT_NONE); } } - sub_81223FC(sPokeblockMenu->field_E75, FIELD_E75_COUNT, 0); - sub_8122448(sPokeblockMenu->field_E75, FIELD_E75_COUNT, 0x80, (sSavedPokeblockData.lastItemPos * 16) + 8); + SetSwapLineSpritesInvisibility(sPokeblockMenu->swapLineSpriteIds, ARRAY_COUNT(sPokeblockMenu->swapLineSpriteIds), FALSE); + UpdateSwapLineSpritesPos(sPokeblockMenu->swapLineSpriteIds, ARRAY_COUNT(sPokeblockMenu->swapLineSpriteIds), 128, (sSavedPokeblockData.selectedRow * 16) + 8); - switch (itemId) + switch (input) { case LIST_NOTHING_CHOSEN: break; - case LIST_CANCEL: // same id as STOW CASE field + case LIST_CANCEL: PlaySE(SE_SELECT); - if (JOY_NEW(A_BUTTON)) - HandlePokeblocksSwap(taskId, FALSE); + if (JOY_NEW(A_BUTTON)) // Pointless check, B Button has been pressed here + UpdatePokeblockSwapMenu(taskId, FALSE); else - HandlePokeblocksSwap(taskId, TRUE); + UpdatePokeblockSwapMenu(taskId, TRUE); // Canceled swapping break; default: + // Swap items PlaySE(SE_SELECT); - HandlePokeblocksSwap(taskId, FALSE); + UpdatePokeblockSwapMenu(taskId, FALSE); break; } } } -static void HandlePokeblocksSwap(u8 taskId, bool8 noSwap) +static void UpdatePokeblockSwapMenu(u8 taskId, bool8 noSwap) { u8 i; s16 *data = gTasks[taskId].data; - u16 swappedFromId = sSavedPokeblockData.lastItemPage + sSavedPokeblockData.lastItemPos; + u16 swappedFromId = sSavedPokeblockData.scrollOffset + sSavedPokeblockData.selectedRow; sPokeblockMenu->isSwapping = FALSE; - DestroyListMenuTask(data[0], &sSavedPokeblockData.lastItemPage, &sSavedPokeblockData.lastItemPos); + DestroyListMenuTask(tListTaskId, &sSavedPokeblockData.scrollOffset, &sSavedPokeblockData.selectedRow); - if (!noSwap && data[2] != swappedFromId && data[2] != swappedFromId - 1) + if (!noSwap && tToSwapId != swappedFromId && tToSwapId != swappedFromId - 1) { - SwapSortPokeblocksInternalData(data[2], swappedFromId); - HandlePokeblockListMenuItems(); + SwapPokeblockMenuItems(tToSwapId, swappedFromId); + UpdatePokeblockList(); } - if (data[2] < swappedFromId) - sSavedPokeblockData.lastItemPos--; + if (tToSwapId < swappedFromId) + sSavedPokeblockData.selectedRow--; - data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sSavedPokeblockData.lastItemPage, sSavedPokeblockData.lastItemPos); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, sSavedPokeblockData.scrollOffset, sSavedPokeblockData.selectedRow); ScheduleBgCopyTilemapToVram(0); - sub_81223FC(sPokeblockMenu->field_E75, FIELD_E75_COUNT, 1); + SetSwapLineSpritesInvisibility(sPokeblockMenu->swapLineSpriteIds, ARRAY_COUNT(sPokeblockMenu->swapLineSpriteIds), TRUE); - for (i = 0; i < 9; i++) - HandlePokeblockMenuCursor(i, 5); + for (i = 0; i < MAX_MENU_ITEMS; i++) + DrawPokeblockMenuHighlight(i, TILE_HIGHLIGHT_NONE); - HandlePokeblockMenuCursor(sSavedPokeblockData.lastItemPos, 0x1005); + DrawPokeblockMenuHighlight(sSavedPokeblockData.selectedRow, TILE_HIGHLIGHT_BLUE); gTasks[taskId].func = Task_HandlePokeblockMenuInput; } -static void PutPokeblockOptionsWindow(u8 taskId) +static void ShowPokeblockActionsWindow(u8 taskId) { s16 *data = gTasks[taskId].data; - if (sPokeblockMenu->optionsNo == 3) - data[1] = 8; + if (sPokeblockMenu->numActions == 3) + tWindowId = WIN_ACTIONS_TALL; else - data[1] = 9; + tWindowId = WIN_ACTIONS; - sub_8136418(); - DrawStdFrameWithCustomTileAndPalette(data[1], 0, 1, 0xE); - sub_81995E4(data[1], sPokeblockMenu->optionsNo, sPokeblockMenuActions, sPokeblockMenu->pokeblockOptionsIds); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[1], sPokeblockMenu->optionsNo, 0); - PutWindowTilemap(data[1]); + DestroyScrollArrows(); + DrawStdFrameWithCustomTileAndPalette(tWindowId, 0, 1, 0xE); + sub_81995E4(tWindowId, sPokeblockMenu->numActions, sPokeblockMenuActions, sPokeblockMenu->pokeblockActionIds); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(tWindowId, sPokeblockMenu->numActions, 0); + PutWindowTilemap(tWindowId); ScheduleBgCopyTilemapToVram(1); - gTasks[taskId].func = Task_HandlePokeblockOptionsInput; + gTasks[taskId].func = Task_HandlePokeblockActionsInput; } -static void Task_HandlePokeblockOptionsInput(u8 taskId) +static void Task_HandlePokeblockActionsInput(u8 taskId) { s8 itemId; @@ -1150,7 +1181,7 @@ static void Task_HandlePokeblockOptionsInput(u8 taskId) else { PlaySE(SE_SELECT); - sPokeblockMenuActions[sPokeblockMenu->pokeblockOptionsIds[itemId]].func.void_u8(taskId); + sPokeblockMenuActions[sPokeblockMenu->pokeblockActionIds[itemId]].func.void_u8(taskId); } } @@ -1174,10 +1205,10 @@ static void PokeblockAction_Toss(u8 taskId) { s16 *data = gTasks[taskId].data; - ClearStdWindowAndFrameToTransparent(data[1], FALSE); + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId].color]); StringExpandPlaceholders(gStringVar4, gText_ThrowAwayVar1); - DisplayMessageAndContinueTask(taskId, 10, 10, 13, 1, GetPlayerTextSpeedDelay(), gStringVar4, CreateTossPokeblockYesNoMenu); + DisplayMessageAndContinueTask(taskId, WIN_TOSS_MSG, 10, 13, 1, GetPlayerTextSpeedDelay(), gStringVar4, CreateTossPokeblockYesNoMenu); } static void CreateTossPokeblockYesNoMenu(u8 taskId) @@ -1185,44 +1216,44 @@ static void CreateTossPokeblockYesNoMenu(u8 taskId) CreateYesNoMenuWithCallbacks(taskId, &sTossPkblockWindowTemplate, 1, 0, 2, 1, 0xE, &sTossYesNoFuncTable); } -static void TossPokeblockChoice_Yes(u8 taskId) +static void TossedPokeblockMessage(u8 taskId) { StringExpandPlaceholders(gStringVar4, gText_Var1ThrownAway); - DisplayMessageAndContinueTask(taskId, 10, 10, 13, 1, GetPlayerTextSpeedDelay(), gStringVar4, HandleErasePokeblock); + DisplayMessageAndContinueTask(taskId, WIN_TOSS_MSG, 10, 13, 1, GetPlayerTextSpeedDelay(), gStringVar4, TossPokeblock); } -static void HandleErasePokeblock(u8 taskId) +static void TossPokeblock(u8 taskId) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { s16 *data; - u16 *lastPage, *lastPos; + u16 *scrollOffset, *selectedRow; TryClearPokeblock(gSpecialVar_ItemId); PlaySE(SE_SELECT); - lastPage = &sSavedPokeblockData.lastItemPage; - lastPos = &sSavedPokeblockData.lastItemPos; + scrollOffset = &sSavedPokeblockData.scrollOffset; + selectedRow = &sSavedPokeblockData.selectedRow; data = gTasks[taskId].data; - DestroyListMenuTask(data[0], lastPage, lastPos); - HandlePokeblockMenuCursor(*lastPos, 5); + DestroyListMenuTask(tListTaskId, scrollOffset, selectedRow); + DrawPokeblockMenuHighlight(*selectedRow, TILE_HIGHLIGHT_NONE); SetMenuItemsCountAndMaxShowed(); - sub_81362E0(); - HandlePokeblockListMenuItems(); - data[0] = ListMenuInit(&gMultiuseListMenuTemplate, *lastPage, *lastPos); - HandlePokeblockMenuCursor(*lastPos, 0x1005); + LimitMenuScrollAndRow(); + UpdatePokeblockList(); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollOffset, *selectedRow); + DrawPokeblockMenuHighlight(*selectedRow, TILE_HIGHLIGHT_BLUE); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); - TossPokeblockChoice_No(taskId); + CloseTossPokeblockWindow(taskId); } } -static void TossPokeblockChoice_No(u8 taskId) +static void CloseTossPokeblockWindow(u8 taskId) { - ClearDialogWindowAndFrameToTransparent(10, FALSE); + ClearDialogWindowAndFrameToTransparent(WIN_TOSS_MSG, FALSE); ScheduleBgCopyTilemapToVram(1); - sub_81363BC(); + CreateScrollArrows(); gTasks[taskId].func = Task_HandlePokeblockMenuInput; } @@ -1267,9 +1298,9 @@ static void PokeblockAction_Cancel(u8 taskId) { s16 *data = gTasks[taskId].data; - ClearStdWindowAndFrameToTransparent(data[1], FALSE); + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); ScheduleBgCopyTilemapToVram(1); - sub_81363BC(); + CreateScrollArrows(); gTasks[taskId].func = Task_HandlePokeblockMenuInput; } diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index 32db6c717..47e510562 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -26,208 +26,283 @@ #include "util.h" #include "constants/rgb.h" -struct PokeblockFeedStruct +enum { + ANIMDATA_ROT_IDX, + ANIMDATA_ROT_SPEED, + ANIMDATA_SIN_AMPLITUDE, + ANIMDATA_COS_AMPLITUDE, + ANIMDATA_TIME, + ANIMDATA_ROT_ACCEL, + ANIMDATA_TARGET_X, + ANIMDATA_TARGET_Y, + ANIMDATA_APPR_TIME, + ANIMDATA_IS_LAST, + NUM_ANIMDATA +}; + +enum { + AFFINE_NONE, + AFFINE_TURN_UP, + AFFINE_TURN_UP_AND_DOWN, + AFFINE_TURN_DOWN, + AFFINE_TURN_DOWN_SLOW, + AFFINE_TURN_DOWN_SLIGHT, + AFFINE_TURN_UP_HIGH, + AFFINE_UNUSED_1, + AFFINE_UNUSED_2, + AFFINE_UNUSED_3, + NUM_MON_AFFINES, +}; + +#define MON_X 48 +#define MON_Y 80 + +// The animation the Pokémon does during the feeding scene depends on their nature. +// The below values are offsets into sMonPokeblockAnims of the animation data for that nature. +#define ANIM_HARDY 0 +#define ANIM_LONELY (ANIM_HARDY + 3) +#define ANIM_BRAVE (ANIM_LONELY + 1) +#define ANIM_ADAMANT (ANIM_BRAVE + 1) +#define ANIM_NAUGHTY (ANIM_ADAMANT + 5) +#define ANIM_BOLD (ANIM_NAUGHTY + 3) +#define ANIM_DOCILE (ANIM_BOLD + 2) +#define ANIM_RELAXED (ANIM_DOCILE + 1) +#define ANIM_IMPISH (ANIM_RELAXED + 2) +#define ANIM_LAX (ANIM_IMPISH + 1) +#define ANIM_TIMID (ANIM_LAX + 1) +#define ANIM_HASTY (ANIM_TIMID + 5) +#define ANIM_SERIOUS (ANIM_HASTY + 2) +#define ANIM_JOLLY (ANIM_SERIOUS + 1) +#define ANIM_NAIVE (ANIM_JOLLY + 1) +#define ANIM_MODEST (ANIM_NAIVE + 4) +#define ANIM_MILD (ANIM_MODEST + 3) +#define ANIM_QUIET (ANIM_MILD + 1) +#define ANIM_BASHFUL (ANIM_QUIET + 2) +#define ANIM_RASH (ANIM_BASHFUL + 3) +#define ANIM_CALM (ANIM_RASH + 3) +#define ANIM_GENTLE (ANIM_CALM + 1) +#define ANIM_SASSY (ANIM_GENTLE + 1) +#define ANIM_CAREFUL (ANIM_SASSY + 1) +#define ANIM_QUIRKY (ANIM_CAREFUL + 5) + +struct PokeblockFeed { struct Sprite *monSpritePtr; struct Sprite savedMonSprite; - u8 tilemapBuffer[0x808]; - s16 field_850[0x200]; - s16 field_C50[0x200]; - u8 field_1050; + u8 tilemapBuffer[BG_SCREEN_SIZE]; + u8 unused1[8]; + s16 monAnimX[0x200]; + s16 monAnimY[0x200]; + u8 animRunState; u8 animId; - u8 field_1052; + u8 unused2; bool8 noMonFlip; u16 species; - u16 field_1056; - u16 field_1058; + u16 monAnimLength; + u16 timer; u8 nature; - u8 monSpriteId_; - u8 field_105C; + u8 monSpriteId_; // Duplicated unnecessarily + u8 unused3; u8 monSpriteId; u8 pokeblockCaseSpriteId; u8 pokeblockSpriteId; - s16 field_1060[15]; + s16 animData[NUM_ANIMDATA]; + s16 monInitX; + s16 monInitY; + s16 maxAnimStageTime; + s16 monX; + s16 monY; s16 loadGfxState; - u8 unused; + u8 unused4; }; extern struct MusicPlayerInfo gMPlayInfo_BGM; extern const u16 gUnknown_0860F074[]; -// this file's functions static void HandleInitBackgrounds(void); static void HandleInitWindows(void); static void LaunchPokeblockFeedTask(void); -static void SetPokeblockSpritePal(u8 pokeblockCaseId); -static void sub_817A5CC(void); -static void sub_8148108(u8 spriteId, bool8 a1); -static void DoPokeblockCaseThrowEffect(u8 spriteId, bool8 arg1); -static void PrepareMonToMoveToPokeblock(u8 spriteId); -static void Task_HandleMonAtePokeblock(u8 taskId); -static void Task_PaletteFadeToReturn(u8 taskId); -static void sub_817A634(void); -static void sub_817A468(struct Sprite *sprite); -static void sub_817AB68(void); -static void sub_817AA54(void); -static bool8 sub_817A91C(void); +static void SetPokeblockSpritePal(u8); +static void CalculateMonAnimLength(void); +static void DoPokeblockCaseThrowEffect(u8, bool8); +static void StartMonJumpForPokeblock(u8); +static void Task_PrintAtePokeblockMessage(u8); +static void Task_FadeOutPokeblockFeed(u8); +static void UpdateMonAnim(void); +static void SpriteCB_MonJumpForPokeblock(struct Sprite *); +static void CalculateMonAnimMovement(void); +static void CalculateMonAnimMovementEnd(void); +static bool8 InitMonAnimStage(void); static bool8 FreeMonSpriteOamMatrix(void); -static bool8 sub_817A9E4(void); -static bool8 LoadMonAndSceneGfx(struct Pokemon *mon); +static bool8 DoMonAnimStep(void); +static bool8 LoadMonAndSceneGfx(struct Pokemon *); static u8 CreatePokeblockSprite(void); static u8 CreatePokeblockCaseSpriteForFeeding(void); -static u8 CreateMonSprite(struct Pokemon *mon); -static void SpriteCB_ThrownPokeblock(struct Sprite* sprite); +static u8 CreateMonSprite(struct Pokemon *); +static void SpriteCB_ThrownPokeblock(struct Sprite *); -// ram variables -EWRAM_DATA static struct PokeblockFeedStruct *sPokeblockFeed = NULL; +EWRAM_DATA static struct PokeblockFeed *sPokeblockFeed = NULL; EWRAM_DATA static struct CompressedSpritePalette sPokeblockSpritePal = {0}; -// const rom data static const u8 sNatureToMonPokeblockAnim[NUM_NATURES][2] = { - [NATURE_HARDY] = { 0, 0 }, - [NATURE_LONELY] = { 3, 0 }, - [NATURE_BRAVE] = { 4, 1 }, - [NATURE_ADAMANT] = { 5, 0 }, - [NATURE_NAUGHTY] = { 10, 0 }, - [NATURE_BOLD] = { 13, 0 }, - [NATURE_DOCILE] = { 15, 0 }, - [NATURE_RELAXED] = { 16, 2 }, - [NATURE_IMPISH] = { 18, 0 }, - [NATURE_LAX] = { 19, 0 }, - [NATURE_TIMID] = { 20, 0 }, - [NATURE_HASTY] = { 25, 0 }, - [NATURE_SERIOUS] = { 27, 3 }, - [NATURE_JOLLY] = { 28, 0 }, - [NATURE_NAIVE] = { 29, 0 }, - [NATURE_MODEST] = { 33, 4 }, - [NATURE_MILD] = { 36, 0 }, - [NATURE_QUIET] = { 37, 0 }, - [NATURE_BASHFUL] = { 39, 0 }, - [NATURE_RASH] = { 42, 0 }, - [NATURE_CALM] = { 45, 0 }, - [NATURE_GENTLE] = { 46, 5 }, - [NATURE_SASSY] = { 47, 6 }, - [NATURE_CAREFUL] = { 48, 0 }, - [NATURE_QUIRKY] = { 53, 0 }, + [NATURE_HARDY] = { ANIM_HARDY, AFFINE_NONE }, + [NATURE_LONELY] = { ANIM_LONELY, AFFINE_NONE }, + [NATURE_BRAVE] = { ANIM_BRAVE, AFFINE_TURN_UP }, + [NATURE_ADAMANT] = { ANIM_ADAMANT, AFFINE_NONE }, + [NATURE_NAUGHTY] = { ANIM_NAUGHTY, AFFINE_NONE }, + [NATURE_BOLD] = { ANIM_BOLD, AFFINE_NONE }, + [NATURE_DOCILE] = { ANIM_DOCILE, AFFINE_NONE }, + [NATURE_RELAXED] = { ANIM_RELAXED, AFFINE_TURN_UP_AND_DOWN }, + [NATURE_IMPISH] = { ANIM_IMPISH, AFFINE_NONE }, + [NATURE_LAX] = { ANIM_LAX, AFFINE_NONE }, + [NATURE_TIMID] = { ANIM_TIMID, AFFINE_NONE }, + [NATURE_HASTY] = { ANIM_HASTY, AFFINE_NONE }, + [NATURE_SERIOUS] = { ANIM_SERIOUS, AFFINE_TURN_DOWN }, + [NATURE_JOLLY] = { ANIM_JOLLY, AFFINE_NONE }, + [NATURE_NAIVE] = { ANIM_NAIVE, AFFINE_NONE }, + [NATURE_MODEST] = { ANIM_MODEST, AFFINE_TURN_DOWN_SLOW }, + [NATURE_MILD] = { ANIM_MILD, AFFINE_NONE }, + [NATURE_QUIET] = { ANIM_QUIET, AFFINE_NONE }, + [NATURE_BASHFUL] = { ANIM_BASHFUL, AFFINE_NONE }, + [NATURE_RASH] = { ANIM_RASH, AFFINE_NONE }, + [NATURE_CALM] = { ANIM_CALM, AFFINE_NONE }, + [NATURE_GENTLE] = { ANIM_GENTLE, AFFINE_TURN_DOWN_SLIGHT }, + [NATURE_SASSY] = { ANIM_SASSY, AFFINE_TURN_UP_HIGH }, + [NATURE_CAREFUL] = { ANIM_CAREFUL, AFFINE_NONE }, + [NATURE_QUIRKY] = { ANIM_QUIRKY, AFFINE_NONE }, }; -static const s16 sMonPokeblockAnims[][10] = +// Data for the animation the Pokémon does while readying to jump for the Pokéblock +// Each nature can have up to 8 anim 'stages' it progresses through, and each stage has its own array of data. +// The elements in each array correspond in order to the following: +// - ANIMDATA_ROT_IDX : Index into sin/cos table for circular movement +// - ANIMDATA_ROT_SPEED : Circular movement speed +// - ANIMDATA_SIN_AMPLITUDE: How far on the x to move +// - ANIMDATA_COS_AMPLITUDE: How far on the y to move +// - ANIMDATA_TIME : How long in frames this part of the animation takes +// - ANIMDATA_ROT_ACCEL : How much to increase circular movement speed +// - ANIMDATA_TARGET_X : Target x coord offset from start position +// - ANIMDATA_TARGET_Y : Target y coord offset from start position +// - ANIMDATA_APPR_TIME : The time over which the target position should be approached +// - ANIMDATA_IS_LAST : TRUE if it's the last anim stage for this nature, FALSE otherwise +// +static const s16 sMonPokeblockAnims[][NUM_ANIMDATA] = { - // HARDY - { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0}, - { 0, 4, 0, 16, 24, 0, 0, 0, 12, 0}, - { 0, 4, 0, 32, 32, 0, 0, 0, 16, 1}, - - // LONELY - { 0, 3, 6, 0, 48, 0, 0, 0, 24, 1}, - - // BRAVE - { 64, 16, -24, 0, 32, 0, 0, 0, 0, 1}, - - // ADAMANT - { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0}, - { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0}, - { 0, 4, 8, 0, 16, 0, -8, 0, 0, 0}, - { 0, 0, 0, 0, 16, 0, 0, 0, 0, 0}, - { 0, 4, -16, 0, 4, 0, 16, 0, 0, 1}, - - // NAUGHTY - { 0, 3, 6, 0, 12, 0, 0, 0, 6, 0}, - { 0, 3, -6, 0, 12, 0, 0, 0, 6, 0}, - { 0, 16, 16, 0, 45, 1, 0, 0, 0, 1}, - - // BOLD - { 0, 16, 0, 24, 32, 0, 0, 0, 16, 0}, - { 0, 16, 0, 23, 32, 0, 0, 0, 16, 1}, - - // DOCILE - { 0, 0, 0, 0, 80, 0, 0, 0, 0, 1}, - - // RELAXED - { 0, 2, 8, 0, 32, 0, 0, 0, 0, 0}, - { 0, 2, -8, 0, 32, 0, 0, 0, 0, 1}, - - // IMPISH - { 0, 32, 2, 1, 48, 1, 0, 0, 24, 1}, - - // LAX - { 0, 2, 16, 16, 128, 0, 0, 0, 0, 1}, - - // TIMID - { 0, 2, -8, 0, 48, 0, -24, 0, 0, 0}, - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, - { 64, 32, 2, 0, 36, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, - { 0, 2, 8, 0, 48, 0, 24, 0, 0, 1}, - - // HASTY - { 64, 24, 16, 0, 32, 0, 0, 0, 0, 0}, - { 0, 28, 2, 1, 32, 1, 0, 0, 16, 1}, - - // SERIOUS - { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1}, - - // JOLLY - { 64, 16, -16, 2, 48, 0, 0, 0, 32, 1}, - - // NAIVE - { 0, 12, -8, 4, 24, 0, 8, 0, 12, 0}, - { 0, 12, 8, 8, 24, 0, -16, 0, 12, 0}, - { 0, 12, -8, 16, 24, 0, 16, 0, 12, 0}, - { 0, 12, 8, 28, 24, 0, -8, 0, 12, 1}, - - // MODEST - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 0}, - { 64, 16, -4, 0, 32, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 8, 0, 0, 0, 0, 1}, - - // MILD - { 128, 4, 0, 8, 64, 0, 0, 0, 0, 1}, - - // QUIET - { 0, 2, 16, 0, 48, 0, 0, 0, 0, 0}, - { 128, 2, 16, 0, 48, 0, 0, 0, 0, 1}, - - // BASHFUL - { 0, 2, -4, 0, 48, 0, -48, 0, 0, 0}, - { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0}, - { 0, 2, 8, 0, 24, 0, 48, 0, 0, 1}, - - // RASH - { 64, 4, 64, 58, 52, 0, -88, 0, 0, 0}, - { 0, 0, 0, 0, 80, 0, 0, 0, 0, 0}, - { 0, 24, 80, 0, 32, 0, 88, 0, 0, 1}, - - // CALM - { 0, 2, 16, 4, 64, 0, 0, 0, 0, 1}, - - // GENTLE - { 0, 0, 0, 0, 32, 0, 0, 0, 0, 1}, - - // SASSY - { 0, 0, 0, 0, 42, 0, 0, 0, 0, 1}, - - // CAREFUL - { 0, 4, 0, 8, 24, 0, 0, 0, 12, 0}, - { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0}, - { 0, 4, 0, 12, 24, 0, 0, 0, 12, 0}, - { 0, 0, 0, 0, 12, 0, 0, 0, 0, 0}, - { 0, 4, 0, 4, 24, 0, 0, 0, 12, 1}, - - // QUIRKY - { 0, 4, 16, 12, 64, 0, 0, 0, 0, 0}, - { 0, -4, 16, 12, 64, 0, 0, 0, 0, 1}, + [ANIM_HARDY] = + { 0, 4, 0, 8, 24, 0, 0, 0, 12, FALSE}, + { 0, 4, 0, 16, 24, 0, 0, 0, 12, FALSE}, + { 0, 4, 0, 32, 32, 0, 0, 0, 16, TRUE}, + + [ANIM_LONELY] = + { 0, 3, 6, 0, 48, 0, 0, 0, 24, TRUE}, + + [ANIM_BRAVE] = + { 64, 16, -24, 0, 32, 0, 0, 0, 0, TRUE}, + + [ANIM_ADAMANT] = + { 0, 4, 8, 0, 16, 0, -8, 0, 0, FALSE}, + { 0, 0, 0, 0, 16, 0, 0, 0, 0, FALSE}, + { 0, 4, 8, 0, 16, 0, -8, 0, 0, FALSE}, + { 0, 0, 0, 0, 16, 0, 0, 0, 0, FALSE}, + { 0, 4, -16, 0, 4, 0, 16, 0, 0, TRUE}, + + [ANIM_NAUGHTY] = + { 0, 3, 6, 0, 12, 0, 0, 0, 6, FALSE}, + { 0, 3, -6, 0, 12, 0, 0, 0, 6, FALSE}, + { 0, 16, 16, 0, 45, 1, 0, 0, 0, TRUE}, + + [ANIM_BOLD] = + { 0, 16, 0, 24, 32, 0, 0, 0, 16, FALSE}, + { 0, 16, 0, 23, 32, 0, 0, 0, 16, TRUE}, + + [ANIM_DOCILE] = + { 0, 0, 0, 0, 80, 0, 0, 0, 0, TRUE}, + + [ANIM_RELAXED] = + { 0, 2, 8, 0, 32, 0, 0, 0, 0, FALSE}, + { 0, 2, -8, 0, 32, 0, 0, 0, 0, TRUE}, + + [ANIM_IMPISH] = + { 0, 32, 2, 1, 48, 1, 0, 0, 24, TRUE}, + + [ANIM_LAX] = + { 0, 2, 16, 16, 128, 0, 0, 0, 0, TRUE}, + + [ANIM_TIMID] = + { 0, 2, -8, 0, 48, 0, -24, 0, 0, FALSE}, + { 0, 0, 0, 0, 8, 0, 0, 0, 0, FALSE}, + { 64, 32, 2, 0, 36, 0, 0, 0, 0, FALSE}, + { 0, 0, 0, 0, 8, 0, 0, 0, 0, FALSE}, + { 0, 2, 8, 0, 48, 0, 24, 0, 0, TRUE}, + + [ANIM_HASTY] = + { 64, 24, 16, 0, 32, 0, 0, 0, 0, FALSE}, + { 0, 28, 2, 1, 32, 1, 0, 0, 16, TRUE}, + + [ANIM_SERIOUS] = + { 0, 0, 0, 0, 32, 0, 0, 0, 0, TRUE}, + + [ANIM_JOLLY] = + { 64, 16, -16, 2, 48, 0, 0, 0, 32, TRUE}, + + [ANIM_NAIVE] = + { 0, 12, -8, 4, 24, 0, 8, 0, 12, FALSE}, + { 0, 12, 8, 8, 24, 0, -16, 0, 12, FALSE}, + { 0, 12, -8, 16, 24, 0, 16, 0, 12, FALSE}, + { 0, 12, 8, 28, 24, 0, -8, 0, 12, TRUE}, + + [ANIM_MODEST] = + { 0, 0, 0, 0, 8, 0, 0, 0, 0, FALSE}, + { 64, 16, -4, 0, 32, 0, 0, 0, 0, FALSE}, + { 0, 0, 0, 0, 8, 0, 0, 0, 0, TRUE}, + + [ANIM_MILD] = + { 128, 4, 0, 8, 64, 0, 0, 0, 0, TRUE}, + + [ANIM_QUIET] = + { 0, 2, 16, 0, 48, 0, 0, 0, 0, FALSE}, + { 128, 2, 16, 0, 48, 0, 0, 0, 0, TRUE}, + + [ANIM_BASHFUL] = + { 0, 2, -4, 0, 48, 0, -48, 0, 0, FALSE}, + { 0, 0, 0, 0, 80, 0, 0, 0, 0, FALSE}, + { 0, 2, 8, 0, 24, 0, 48, 0, 0, TRUE}, + + [ANIM_RASH] = + { 64, 4, 64, 58, 52, 0, -88, 0, 0, FALSE}, + { 0, 0, 0, 0, 80, 0, 0, 0, 0, FALSE}, + { 0, 24, 80, 0, 32, 0, 88, 0, 0, TRUE}, + + [ANIM_CALM] = + { 0, 2, 16, 4, 64, 0, 0, 0, 0, TRUE}, + + [ANIM_GENTLE] = + { 0, 0, 0, 0, 32, 0, 0, 0, 0, TRUE}, + + [ANIM_SASSY] = + { 0, 0, 0, 0, 42, 0, 0, 0, 0, TRUE}, + + [ANIM_CAREFUL] = + { 0, 4, 0, 8, 24, 0, 0, 0, 12, FALSE}, + { 0, 0, 0, 0, 12, 0, 0, 0, 0, FALSE}, + { 0, 4, 0, 12, 24, 0, 0, 0, 12, FALSE}, + { 0, 0, 0, 0, 12, 0, 0, 0, 0, FALSE}, + { 0, 4, 0, 4, 24, 0, 0, 0, 12, TRUE}, + + [ANIM_QUIRKY] = + { 0, 4, 16, 12, 64, 0, 0, 0, 0, FALSE}, + { 0, -4, 16, 12, 64, 0, 0, 0, 0, TRUE}, }; -static const union AffineAnimCmd sSpriteAffineAnim_8411E90[] = +static const union AffineAnimCmd sAffineAnim_Mon_None[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411EA0[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnUp[] = { AFFINEANIMCMD_FRAME(0, 0, 12, 1), AFFINEANIMCMD_FRAME(0, 0, 0, 30), @@ -235,7 +310,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411EA0[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411EC0[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnUp_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 12, 1), @@ -244,7 +319,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411EC0[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411EE8[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnUpAndDown[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 32), @@ -252,7 +327,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411EE8[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411F08[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnUpAndDown_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 16), @@ -261,7 +336,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411F08[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411F30[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnDown[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), @@ -269,7 +344,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411F30[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411F50[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnDown_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), @@ -278,7 +353,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411F50[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411F78[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnDownSlow[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 32), @@ -286,7 +361,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411F78[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411F98[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnDownSlow_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 8), @@ -295,7 +370,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411F98[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411FC0[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnDownSlight[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 24), @@ -303,7 +378,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411FC0[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8411FE0[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnDownSlight_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 4), @@ -312,7 +387,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8411FE0[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8412008[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnUpHigh[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 16), @@ -320,7 +395,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_8412008[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8412028[] = +static const union AffineAnimCmd sAffineAnim_Mon_TurnUpHigh_Flipped[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), @@ -329,29 +404,33 @@ static const union AffineAnimCmd sSpriteAffineAnim_8412028[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F04FC[] = +static const union AffineAnimCmd *const sAffineAnims_Mon[] = { - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411EA0, - sSpriteAffineAnim_8411EE8, - sSpriteAffineAnim_8411F30, - sSpriteAffineAnim_8411F78, - sSpriteAffineAnim_8411FC0, - sSpriteAffineAnim_8412008, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411EC0, - sSpriteAffineAnim_8411F08, - sSpriteAffineAnim_8411F50, - sSpriteAffineAnim_8411F98, - sSpriteAffineAnim_8411FE0, - sSpriteAffineAnim_8412028, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, - sSpriteAffineAnim_8411E90, + // Animations for non-flipped mon sprites + [AFFINE_NONE] = sAffineAnim_Mon_None, + [AFFINE_TURN_UP] = sAffineAnim_Mon_TurnUp, + [AFFINE_TURN_UP_AND_DOWN] = sAffineAnim_Mon_TurnUpAndDown, + [AFFINE_TURN_DOWN] = sAffineAnim_Mon_TurnDown, + [AFFINE_TURN_DOWN_SLOW] = sAffineAnim_Mon_TurnDownSlow, + [AFFINE_TURN_DOWN_SLIGHT] = sAffineAnim_Mon_TurnDownSlight, + [AFFINE_TURN_UP_HIGH] = sAffineAnim_Mon_TurnUpHigh, + [AFFINE_UNUSED_1] = sAffineAnim_Mon_None, + [AFFINE_UNUSED_2] = sAffineAnim_Mon_None, + [AFFINE_UNUSED_3] = sAffineAnim_Mon_None, + + // Animations for flipped mon sprites + [AFFINE_NONE + NUM_MON_AFFINES] = sAffineAnim_Mon_None, + [AFFINE_TURN_UP + NUM_MON_AFFINES] = sAffineAnim_Mon_TurnUp_Flipped, + [AFFINE_TURN_UP_AND_DOWN + NUM_MON_AFFINES] = sAffineAnim_Mon_TurnUpAndDown_Flipped, + [AFFINE_TURN_DOWN + NUM_MON_AFFINES] = sAffineAnim_Mon_TurnDown_Flipped, + [AFFINE_TURN_DOWN_SLOW + NUM_MON_AFFINES] = sAffineAnim_Mon_TurnDownSlow_Flipped, + [AFFINE_TURN_DOWN_SLIGHT + NUM_MON_AFFINES] = sAffineAnim_Mon_TurnDownSlight_Flipped, + [AFFINE_TURN_UP_HIGH + NUM_MON_AFFINES] = sAffineAnim_Mon_TurnUpHigh_Flipped, + [AFFINE_UNUSED_1 + NUM_MON_AFFINES] = sAffineAnim_Mon_None, + [AFFINE_UNUSED_2 + NUM_MON_AFFINES] = sAffineAnim_Mon_None, + [AFFINE_UNUSED_3 + NUM_MON_AFFINES] = sAffineAnim_Mon_None, + + sAffineAnim_Mon_None, // ? Extra for some reason }; static const struct BgTemplate sBackgroundTemplates[] = @@ -378,7 +457,15 @@ static const struct BgTemplate sBackgroundTemplates[] = static const struct WindowTemplate sWindowTemplates[] = { - {0, 1, 0xF, 0x1C, 4, 0xF, 0xA}, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 15, + .width = 28, + .height = 4, + .paletteNum = 15, + .baseBlock = 0xA + }, DUMMY_WIN_TEMPLATE }; @@ -401,7 +488,7 @@ static const u32* const sPokeblocksPals[] = [PBLOCK_CLR_GOLD - 1] = gPokeblockGold_Pal }; -static const union AffineAnimCmd sSpriteAffineAnim_84120DC[] = +static const union AffineAnimCmd sAffineAnim_Still[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_END @@ -409,10 +496,10 @@ static const union AffineAnimCmd sSpriteAffineAnim_84120DC[] = static const union AffineAnimCmd *const sSpriteAffineAnimTable_MonNoFlip[] = { - sSpriteAffineAnim_84120DC + sAffineAnim_Still }; -static const union AffineAnimCmd sSpriteAffineAnim_84120F0[] = +static const union AffineAnimCmd sAffineAnim_PokeblockCase_ThrowFromVertical[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 1), @@ -427,7 +514,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_84120F0[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_8412148[] = +static const union AffineAnimCmd sAffineAnim_PokeblockCase_ThrowFromHorizontal[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 1), @@ -442,22 +529,22 @@ static const union AffineAnimCmd sSpriteAffineAnim_8412148[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F0664[] = +static const union AffineAnimCmd *const sAffineAnims_PokeblockCase_Still[] = { - sSpriteAffineAnim_84120DC + sAffineAnim_Still }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F0668[] = +static const union AffineAnimCmd *const sAffineAnims_PokeblockCase_ThrowFromVertical[] = { - sSpriteAffineAnim_84120F0 + sAffineAnim_PokeblockCase_ThrowFromVertical }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_85F066C[] = +static const union AffineAnimCmd *const sAffineAnims_PokeblockCase_ThrowFromHorizontal[] = { - sSpriteAffineAnim_8412148 + sAffineAnim_PokeblockCase_ThrowFromHorizontal }; -static const struct OamData sThrownPokeblockOamData = +static const struct OamData sOamData_Pokeblock = { .y = 0, .affineMode = ST_OAM_AFFINE_DOUBLE, @@ -474,46 +561,45 @@ static const struct OamData sThrownPokeblockOamData = .affineParam = 0, }; -static const union AnimCmd sThrownPokeblockSpriteAnim[] = +static const union AnimCmd sAnim_Pokeblock[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd *const sThrownPokeblockAnimTable[] = +static const union AnimCmd *const sAnims_Pokeblock[] = { - sThrownPokeblockSpriteAnim, + sAnim_Pokeblock, }; -static const union AffineAnimCmd sSpriteAffineAnim_84121C0[] = +static const union AffineAnimCmd sAffineAnim_Pokeblock[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-8, -8, 0, 1), AFFINEANIMCMD_JUMP(1) }; -static const union AffineAnimCmd *const sThrownPokeblockAffineAnimTable[] = +static const union AffineAnimCmd *const sAffineAnims_Pokeblock[] = { - sSpriteAffineAnim_84121C0 + sAffineAnim_Pokeblock }; -static const struct CompressedSpriteSheet sPokeblock_SpriteSheet = +static const struct CompressedSpriteSheet sSpriteSheet_Pokeblock = { - gPokeblock_Gfx, 0x20, GFX_TAG_POKEBLOCK + gPokeblock_Gfx, 0x20, TAG_POKEBLOCK }; -static const struct SpriteTemplate sThrownPokeblockSpriteTemplate = +static const struct SpriteTemplate sSpriteTemplate_Pokeblock = { - .tileTag = GFX_TAG_POKEBLOCK, - .paletteTag = GFX_TAG_POKEBLOCK, - .oam = &sThrownPokeblockOamData, - .anims = sThrownPokeblockAnimTable, + .tileTag = TAG_POKEBLOCK, + .paletteTag = TAG_POKEBLOCK, + .oam = &sOamData_Pokeblock, + .anims = sAnims_Pokeblock, .images = NULL, - .affineAnims = sThrownPokeblockAffineAnimTable, + .affineAnims = sAffineAnims_Pokeblock, .callback = SpriteCB_ThrownPokeblock }; -// code static void CB2_PokeblockFeed(void) { RunTasks(); @@ -530,7 +616,7 @@ static void VBlankCB_PokeblockFeed(void) TransferPlttBuffer(); } -static bool8 TransitionToPokeblockFeedScene(void) +static bool8 LoadPokeblockFeedScene(void) { switch (gMain.state) { @@ -542,7 +628,7 @@ static bool8 TransitionToPokeblockFeedScene(void) break; case 1: ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = 1; + gPaletteFade.bufferTransferDisabled = TRUE; gMain.state++; break; case 2: @@ -567,9 +653,7 @@ static bool8 TransitionToPokeblockFeedScene(void) break; case 7: if (LoadMonAndSceneGfx(&gPlayerParty[gPokeblockMonId])) - { gMain.state++; - } break; case 8: sPokeblockFeed->pokeblockCaseSpriteId = CreatePokeblockCaseSpriteForFeeding(); @@ -588,12 +672,12 @@ static bool8 TransitionToPokeblockFeedScene(void) gMain.state++; break; case 12: - BlendPalettes(-1, 0x10, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gMain.state++; break; case 13: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); - gPaletteFade.bufferTransferDisabled = 0; + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); + gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; default: @@ -604,13 +688,13 @@ static bool8 TransitionToPokeblockFeedScene(void) return FALSE; } -void CB2_PreparePokeblockFeedScene(void) +void PreparePokeblockFeedScene(void) { while (1) { if (MenuHelpers_CallLinkSomething() == TRUE) break; - if (TransitionToPokeblockFeedScene() == TRUE) + if (LoadPokeblockFeedScene() == TRUE) break; if (MenuHelpers_LinkSomething() == TRUE) break; @@ -644,12 +728,14 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) switch (sPokeblockFeed->loadGfxState) { case 0: + // Load mon gfx species = GetMonData(mon, MON_DATA_SPECIES2); personality = GetMonData(mon, MON_DATA_PERSONALITY); HandleLoadSpecialPokePic_2(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[1], species, personality); sPokeblockFeed->loadGfxState++; break; case 1: + // Load mon palette species = GetMonData(mon, MON_DATA_SPECIES2); personality = GetMonData(mon, MON_DATA_PERSONALITY); trainerId = GetMonData(mon, MON_DATA_OT_ID); @@ -668,7 +754,7 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) sPokeblockFeed->loadGfxState++; break; case 4: - LoadCompressedSpriteSheet(&sPokeblock_SpriteSheet); + LoadCompressedSpriteSheet(&sSpriteSheet_Pokeblock); sPokeblockFeed->loadGfxState++; break; case 5: @@ -684,7 +770,7 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) case 7: if (FreeTempTileDataBuffersIfPossible() != TRUE) { - LZDecompressWram(gUnknown_08D9BA44, sPokeblockFeed->tilemapBuffer); + LZDecompressWram(gPokeblockFeedBg_Tilemap, sPokeblockFeed->tilemapBuffer); sPokeblockFeed->loadGfxState++; } break; @@ -712,63 +798,68 @@ static void SetPokeblockSpritePal(u8 pokeblockCaseId) { u8 colorId = GetPokeblockData(&gSaveBlock1Ptr->pokeblocks[pokeblockCaseId], PBLOCK_COLOR); sPokeblockSpritePal.data = sPokeblocksPals[colorId - 1]; - sPokeblockSpritePal.tag = GFX_TAG_POKEBLOCK; + sPokeblockSpritePal.tag = TAG_POKEBLOCK; } // defines for task data fields -#define tFrames data[0] -#define tData1 data[1] +#define tState data[0] +#define tHorizontalThrow data[1] + +#define STATE_START_THROW 255 // If the length of the Pokémon's animation exceeds 255 the throw may happen twice +#define STATE_SPAWN_PBLOCK (STATE_START_THROW + 14) +#define STATE_START_JUMP (STATE_SPAWN_PBLOCK + 12) +#define STATE_PRINT_MSG (STATE_START_JUMP + 16) static void Task_HandlePokeblockFeed(u8 taskId) { if (!gPaletteFade.active) { - switch (gTasks[taskId].tFrames) + switch (gTasks[taskId].tState) { case 0: - sPokeblockFeed->field_1050 = 0; - sPokeblockFeed->field_1058 = 0; - sub_817A5CC(); + sPokeblockFeed->animRunState = 0; + sPokeblockFeed->timer = 0; + CalculateMonAnimLength(); break; - case 255: - DoPokeblockCaseThrowEffect(sPokeblockFeed->pokeblockCaseSpriteId, gTasks[taskId].tData1); + case STATE_START_THROW: + DoPokeblockCaseThrowEffect(sPokeblockFeed->pokeblockCaseSpriteId, gTasks[taskId].tHorizontalThrow); break; - case 269: + case STATE_SPAWN_PBLOCK: sPokeblockFeed->pokeblockSpriteId = CreatePokeblockSprite(); break; - case 281: - PrepareMonToMoveToPokeblock(sPokeblockFeed->monSpriteId); + case STATE_START_JUMP: + StartMonJumpForPokeblock(sPokeblockFeed->monSpriteId); break; - case 297: - gTasks[taskId].func = Task_HandleMonAtePokeblock; + case STATE_PRINT_MSG: + gTasks[taskId].func = Task_PrintAtePokeblockMessage; return; } - if (sPokeblockFeed->field_1058 < sPokeblockFeed->field_1056) - sub_817A634(); - else if (sPokeblockFeed->field_1058 == sPokeblockFeed->field_1056) - gTasks[taskId].tFrames = 254; + if (sPokeblockFeed->timer < sPokeblockFeed->monAnimLength) + UpdateMonAnim(); + else if (sPokeblockFeed->timer == sPokeblockFeed->monAnimLength) + gTasks[taskId].tState = STATE_START_THROW - 1; - sPokeblockFeed->field_1058++; - gTasks[taskId].tFrames++; + sPokeblockFeed->timer++; + gTasks[taskId].tState++; } } static void LaunchPokeblockFeedTask(void) { u8 taskId = CreateTask(Task_HandlePokeblockFeed, 0); - gTasks[taskId].tFrames = 0; - gTasks[taskId].tData1 = 1; + gTasks[taskId].tState = 0; + gTasks[taskId].tHorizontalThrow = TRUE; } -static void Task_WaitForAtePokeblockText(u8 taskId) +static void Task_WaitForAtePokeblockMessage(u8 taskId) { if (RunTextPrintersRetIsActive(0) != TRUE) - gTasks[taskId].func = Task_PaletteFadeToReturn; + gTasks[taskId].func = Task_FadeOutPokeblockFeed; } -static void Task_HandleMonAtePokeblock(u8 taskId) +static void Task_PrintAtePokeblockMessage(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPokeblockMonId]; struct Pokeblock *pokeblock = &gSaveBlock1Ptr->pokeblocks[gSpecialVar_ItemId]; @@ -784,12 +875,12 @@ static void Task_HandleMonAtePokeblock(u8 taskId) else StringExpandPlaceholders(gStringVar4, gText_Var1DisdainfullyAteVar2); - gTextFlags.canABSpeedUpPrint = 1; + gTextFlags.canABSpeedUpPrint = TRUE; AddTextPrinterParameterized2(0, 1, gStringVar4, GetPlayerTextSpeedDelay(), NULL, 2, 1, 3); - gTasks[taskId].func = Task_WaitForAtePokeblockText; + gTasks[taskId].func = Task_WaitForAtePokeblockMessage; } -static void Task_ReturnAfterPaletteFade(u8 taskId) +static void Task_ExitPokeblockFeed(u8 taskId) { if (!gPaletteFade.active) { @@ -804,30 +895,29 @@ static void Task_ReturnAfterPaletteFade(u8 taskId) } } -static void Task_PaletteFadeToReturn(u8 taskId) +static void Task_FadeOutPokeblockFeed(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); - gTasks[taskId].func = Task_ReturnAfterPaletteFade; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_ExitPokeblockFeed; } -#undef tFrames -#undef tData1 - -// defines for mon sprite data fields +#undef tState +#undef tHorizontalThrow -#define tDelta data[0] -#define tDeltaMod data[1] -#define tSpecies data[2] +// Sprite data for Pokéblock and Pokémon +#define sSpeed data[0] +#define sAccel data[1] +#define sSpecies data[2] static u8 CreateMonSprite(struct Pokemon* mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2); - u8 spriteId = CreateSprite(&gMultiuseSpriteTemplate, 48, 80, 2); + u8 spriteId = CreateSprite(&gMultiuseSpriteTemplate, MON_X, MON_Y, 2); sPokeblockFeed->species = species; sPokeblockFeed->monSpriteId_ = spriteId; sPokeblockFeed->nature = GetNature(mon); - gSprites[spriteId].tSpecies = species; + gSprites[spriteId].sSpecies = species; gSprites[spriteId].callback = SpriteCallbackDummy; sPokeblockFeed->noMonFlip = TRUE; @@ -842,189 +932,191 @@ static u8 CreateMonSprite(struct Pokemon* mon) return spriteId; } -static void PrepareMonToMoveToPokeblock(u8 spriteId) +static void StartMonJumpForPokeblock(u8 spriteId) { - gSprites[spriteId].pos1.x = 48; - gSprites[spriteId].pos1.y = 80; - gSprites[spriteId].tDelta = -8; - gSprites[spriteId].tDeltaMod = 1; - gSprites[spriteId].callback = sub_817A468; + gSprites[spriteId].pos1.x = MON_X; + gSprites[spriteId].pos1.y = MON_Y; + gSprites[spriteId].sSpeed = -8; + gSprites[spriteId].sAccel = 1; + gSprites[spriteId].callback = SpriteCB_MonJumpForPokeblock; } -static void sub_817A468(struct Sprite* sprite) +static void SpriteCB_MonJumpForPokeblock(struct Sprite* sprite) { sprite->pos1.x += 4; - sprite->pos1.y += sprite->tDelta; - sprite->tDelta += sprite->tDeltaMod; + sprite->pos1.y += sprite->sSpeed; + sprite->sSpeed += sprite->sAccel; - if (sprite->tDelta == 0) - PlayCry1(sprite->tSpecies, 0); - if (sprite->tDelta == 9) + // Play cry at jump peak + if (sprite->sSpeed == 0) + PlayCry1(sprite->sSpecies, 0); + + if (sprite->sSpeed == 9) sprite->callback = SpriteCallbackDummy; } -#undef tDelta -#undef tDeltaMod -#undef tSpecies - static u8 CreatePokeblockCaseSpriteForFeeding(void) { u8 spriteId = CreatePokeblockCaseSprite(188, 100, 2); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; - gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_85F0664; + gSprites[spriteId].affineAnims = sAffineAnims_PokeblockCase_Still; gSprites[spriteId].callback = SpriteCallbackDummy; InitSpriteAffineAnim(&gSprites[spriteId]); return spriteId; } -static void DoPokeblockCaseThrowEffect(u8 spriteId, bool8 a1) +static void DoPokeblockCaseThrowEffect(u8 spriteId, bool8 horizontalThrow) { FreeOamMatrix(gSprites[spriteId].oam.matrixNum); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; - if (!a1) - gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_85F0668; + if (!horizontalThrow) + gSprites[spriteId].affineAnims = sAffineAnims_PokeblockCase_ThrowFromVertical; // Never used, horizontalThrow always TRUE else - gSprites[spriteId].affineAnims = sSpriteAffineAnimTable_85F066C; + gSprites[spriteId].affineAnims = sAffineAnims_PokeblockCase_ThrowFromHorizontal; InitSpriteAffineAnim(&gSprites[spriteId]); } -// defines for the pokeblock sprite data fields -#define tDelta data[0] -#define tDeltaMod data[1] - static u8 CreatePokeblockSprite(void) { - u8 spriteId = CreateSprite(&sThrownPokeblockSpriteTemplate, 174, 84, 1); - gSprites[spriteId].tDelta = -12; - gSprites[spriteId].tDeltaMod = 1; + u8 spriteId = CreateSprite(&sSpriteTemplate_Pokeblock, 174, 84, 1); + gSprites[spriteId].sSpeed = -12; + gSprites[spriteId].sAccel = 1; return spriteId; } static void SpriteCB_ThrownPokeblock(struct Sprite* sprite) { sprite->pos1.x -= 4; - sprite->pos1.y += sprite->tDelta; - sprite->tDelta += sprite->tDeltaMod; - if (sprite->tDelta == 10) + sprite->pos1.y += sprite->sSpeed; + sprite->sSpeed += sprite->sAccel; + if (sprite->sSpeed == 10) DestroySprite(sprite); } -#undef tDelta -#undef tDeltaMod - -static void sub_817A5CC(void) +static void CalculateMonAnimLength(void) { u8 animId, i; - struct PokeblockFeedStruct *pokeblockFeed; + struct PokeblockFeed *pokeblockFeed; pokeblockFeed = sPokeblockFeed; - pokeblockFeed->field_1056 = 1; + pokeblockFeed->monAnimLength = 1; animId = sNatureToMonPokeblockAnim[pokeblockFeed->nature][0]; + + // Add up the time each stage of the animation will take for (i = 0; i < 8; i++, animId++) { - pokeblockFeed->field_1056 += sMonPokeblockAnims[animId][4]; - if (sMonPokeblockAnims[animId][9] == 1) + pokeblockFeed->monAnimLength += sMonPokeblockAnims[animId][ANIMDATA_TIME]; + if (sMonPokeblockAnims[animId][ANIMDATA_IS_LAST] == TRUE) break; } } -static void sub_817A634(void) +static void UpdateMonAnim(void) { - struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed; + struct PokeblockFeed *pokeblockFeed = sPokeblockFeed; - switch (pokeblockFeed->field_1050) + switch (pokeblockFeed->animRunState) { case 0: pokeblockFeed->animId = sNatureToMonPokeblockAnim[pokeblockFeed->nature][0]; pokeblockFeed->monSpritePtr = &gSprites[pokeblockFeed->monSpriteId_]; pokeblockFeed->savedMonSprite = *pokeblockFeed->monSpritePtr; - pokeblockFeed->field_1050 = 10; + pokeblockFeed->animRunState = 10; break; case 1 ... 9: break; case 10: - sub_817A91C(); - if (sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] != 0) + InitMonAnimStage(); + if (sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] != AFFINE_NONE) { + // Initialize affine anim pokeblockFeed->monSpritePtr->oam.affineMode = ST_OAM_AFFINE_DOUBLE; pokeblockFeed->monSpritePtr->oam.matrixNum = 0; - pokeblockFeed->monSpritePtr->affineAnims = sSpriteAffineAnimTable_85F04FC; + pokeblockFeed->monSpritePtr->affineAnims = sAffineAnims_Mon; InitSpriteAffineAnim(pokeblockFeed->monSpritePtr); } - pokeblockFeed->field_1050 = 50; + pokeblockFeed->animRunState = 50; case 50: - if (sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] != 0) + if (sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] != AFFINE_NONE) { + // Start affine anim if (!pokeblockFeed->noMonFlip) // double negation, so mon's sprite is flipped - StartSpriteAffineAnim(pokeblockFeed->monSpritePtr, sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] + 10); + StartSpriteAffineAnim(pokeblockFeed->monSpritePtr, sNatureToMonPokeblockAnim[pokeblockFeed->nature][1] + NUM_MON_AFFINES); else StartSpriteAffineAnim(pokeblockFeed->monSpritePtr, sNatureToMonPokeblockAnim[pokeblockFeed->nature][1]); } - pokeblockFeed->field_1050 = 60; + pokeblockFeed->animRunState = 60; break; case 60: - if (sub_817A9E4() == TRUE) + if (DoMonAnimStep() == TRUE) { - if (pokeblockFeed->field_1060[9] == 0) + if (!pokeblockFeed->animData[ANIMDATA_IS_LAST]) { + // Continue to next stage of animation pokeblockFeed->animId++; - sub_817A91C(); - pokeblockFeed->field_1050 = 60; + InitMonAnimStage(); + pokeblockFeed->animRunState = 60; } else { + // End animation FreeOamMatrix(pokeblockFeed->monSpritePtr->oam.matrixNum); - pokeblockFeed->field_1050 = 70; + pokeblockFeed->animRunState = 70; } } break; case 70: FreeMonSpriteOamMatrix(); pokeblockFeed->animId = 0; - pokeblockFeed->field_1050 = 0; + pokeblockFeed->animRunState = 0; break; case 71 ... 90: break; } } -static bool8 sub_817A91C(void) +static bool8 InitMonAnimStage(void) { - struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed; + struct PokeblockFeed *pokeblockFeed = sPokeblockFeed; u8 i; - for (i = 0; i < 10; i++) - pokeblockFeed->field_1060[i] = sMonPokeblockAnims[pokeblockFeed->animId][i]; + for (i = 0; i < NUM_ANIMDATA; i++) + pokeblockFeed->animData[i] = sMonPokeblockAnims[pokeblockFeed->animId][i]; - if (pokeblockFeed->field_1060[4] == 0) + if (pokeblockFeed->animData[ANIMDATA_TIME] == 0) { return TRUE; } else { - pokeblockFeed->field_1060[10] = Sin(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[2]); - pokeblockFeed->field_1060[11] = Cos(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[3]); - pokeblockFeed->field_1060[12] = pokeblockFeed->field_1060[4]; - pokeblockFeed->field_1060[13] = pokeblockFeed->monSpritePtr->pos2.x; - pokeblockFeed->field_1060[14] = pokeblockFeed->monSpritePtr->pos2.y; - sub_817AB68(); - pokeblockFeed->field_1060[4] = pokeblockFeed->field_1060[12]; - sub_817AA54(); - pokeblockFeed->field_1060[4] = pokeblockFeed->field_1060[12]; + pokeblockFeed->monInitX = Sin(pokeblockFeed->animData[ANIMDATA_ROT_IDX], pokeblockFeed->animData[ANIMDATA_SIN_AMPLITUDE]); + pokeblockFeed->monInitY = Cos(pokeblockFeed->animData[ANIMDATA_ROT_IDX], pokeblockFeed->animData[ANIMDATA_COS_AMPLITUDE]); + pokeblockFeed->maxAnimStageTime = pokeblockFeed->animData[ANIMDATA_TIME]; + pokeblockFeed->monX = pokeblockFeed->monSpritePtr->pos2.x; + pokeblockFeed->monY = pokeblockFeed->monSpritePtr->pos2.y; + + // Calculate the positions to move to during the animation + // The time is counted down during this, so reset it afterwards + CalculateMonAnimMovement(); + pokeblockFeed->animData[ANIMDATA_TIME] = pokeblockFeed->maxAnimStageTime; + CalculateMonAnimMovementEnd(); + pokeblockFeed->animData[ANIMDATA_TIME] = pokeblockFeed->maxAnimStageTime; // Redundant return FALSE; } } -static bool8 sub_817A9E4(void) +static bool8 DoMonAnimStep(void) { - u16 var = sPokeblockFeed->field_1060[12] - sPokeblockFeed->field_1060[4]; - - sPokeblockFeed->monSpritePtr->pos2.x = sPokeblockFeed->field_850[var]; - sPokeblockFeed->monSpritePtr->pos2.y = sPokeblockFeed->field_C50[var]; - - if (--sPokeblockFeed->field_1060[4] == 0) + // Update mon's position + u16 time = sPokeblockFeed->maxAnimStageTime - sPokeblockFeed->animData[ANIMDATA_TIME]; + sPokeblockFeed->monSpritePtr->pos2.x = sPokeblockFeed->monAnimX[time]; + sPokeblockFeed->monSpritePtr->pos2.y = sPokeblockFeed->monAnimY[time]; + + // Count down time remaining in this stage + // Return TRUE if this stage is complete + if (--sPokeblockFeed->animData[ANIMDATA_TIME] == 0) return TRUE; else return FALSE; @@ -1036,66 +1128,70 @@ static bool8 FreeMonSpriteOamMatrix(void) return FALSE; } -static void sub_817AA54(void) +static void CalculateMonAnimMovementEnd(void) { - struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed; + struct PokeblockFeed *pokeblockFeed = sPokeblockFeed; u16 i; - u16 r8 = pokeblockFeed->field_1060[8]; - u16 r7 = pokeblockFeed->field_1060[12] - r8; - s16 var3 = pokeblockFeed->field_1060[13] + pokeblockFeed->field_1060[6]; - s16 r9 = pokeblockFeed->field_1060[14] + pokeblockFeed->field_1060[7]; + u16 approachTime = pokeblockFeed->animData[ANIMDATA_APPR_TIME]; + u16 time = pokeblockFeed->maxAnimStageTime - approachTime; + s16 x = pokeblockFeed->monX + pokeblockFeed->animData[ANIMDATA_TARGET_X]; + s16 y = pokeblockFeed->monY + pokeblockFeed->animData[ANIMDATA_TARGET_Y]; - for (i = 0; i < r7 - 1; i++) + for (i = 0; i < time - 1; i++) { - s16 r1 = pokeblockFeed->field_850[r8 + i] - (var3); - s16 r4 = pokeblockFeed->field_C50[r8 + i] - r9; + s16 xOffset = pokeblockFeed->monAnimX[approachTime + i] - x; + s16 yOffset = pokeblockFeed->monAnimY[approachTime + i] - y; - pokeblockFeed->field_850[r8 + i] -= r1 * (i + 1) / r7; - pokeblockFeed->field_C50[r8 + i] -= r4 * (i + 1) / r7; + pokeblockFeed->monAnimX[approachTime + i] -= xOffset * (i + 1) / time; + pokeblockFeed->monAnimY[approachTime + i] -= yOffset * (i + 1) / time; } - pokeblockFeed->field_850[(r8 + r7) - 1] = var3; - pokeblockFeed->field_C50[(r8 + r7) - 1] = r9; + pokeblockFeed->monAnimX[approachTime + time - 1] = x; + pokeblockFeed->monAnimY[approachTime + time - 1] = y; } -static void sub_817AB68(void) +static void CalculateMonAnimMovement(void) { - struct PokeblockFeedStruct *pokeblockFeed = sPokeblockFeed; - bool8 var_24 = FALSE; - s16 r8 = pokeblockFeed->field_1060[13] - pokeblockFeed->field_1060[10]; - s16 r7 = pokeblockFeed->field_1060[14] - pokeblockFeed->field_1060[11]; + struct PokeblockFeed *pokeblockFeed = sPokeblockFeed; + bool8 negative = FALSE; + s16 x = pokeblockFeed->monX - pokeblockFeed->monInitX; + s16 y = pokeblockFeed->monY - pokeblockFeed->monInitY; while (1) { - u16 r5; - u16 r4; - u16 var; + u16 amplitude; + u16 time; + u16 acceleration; - var = abs(pokeblockFeed->field_1060[5]); - r5 = var + pokeblockFeed->field_1060[3]; - pokeblockFeed->field_1060[3] = r5; + acceleration = abs(pokeblockFeed->animData[ANIMDATA_ROT_ACCEL]); + amplitude = acceleration + pokeblockFeed->animData[ANIMDATA_COS_AMPLITUDE]; + pokeblockFeed->animData[ANIMDATA_COS_AMPLITUDE] = amplitude; - if (pokeblockFeed->field_1060[2] < 0) - var_24 = TRUE; + if (pokeblockFeed->animData[ANIMDATA_SIN_AMPLITUDE] < 0) + negative = TRUE; - r4 = pokeblockFeed->field_1060[12] - pokeblockFeed->field_1060[4]; + time = pokeblockFeed->maxAnimStageTime - pokeblockFeed->animData[ANIMDATA_TIME]; - if (pokeblockFeed->field_1060[4] == 0) + if (pokeblockFeed->animData[ANIMDATA_TIME] == 0) break; - if (!var_24) + if (!negative) { - pokeblockFeed->field_850[r4] = Sin(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[2] + r5 / 0x100) + r8; - pokeblockFeed->field_C50[r4] = Cos(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[3] + r5 / 0x100) + r7; + pokeblockFeed->monAnimX[time] = Sin(pokeblockFeed->animData[ANIMDATA_ROT_IDX], + pokeblockFeed->animData[ANIMDATA_SIN_AMPLITUDE] + amplitude / 0x100) + x; + pokeblockFeed->monAnimY[time] = Cos(pokeblockFeed->animData[ANIMDATA_ROT_IDX], + pokeblockFeed->animData[ANIMDATA_COS_AMPLITUDE] + amplitude / 0x100) + y; } else { - pokeblockFeed->field_850[r4] = Sin(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[2] - r5 / 0x100) + r8; - pokeblockFeed->field_C50[r4] = Cos(pokeblockFeed->field_1060[0], pokeblockFeed->field_1060[3] - r5 / 0x100) + r7; + pokeblockFeed->monAnimX[time] = Sin(pokeblockFeed->animData[ANIMDATA_ROT_IDX], + pokeblockFeed->animData[ANIMDATA_SIN_AMPLITUDE] - amplitude / 0x100) + x; + pokeblockFeed->monAnimY[time] = Cos(pokeblockFeed->animData[ANIMDATA_ROT_IDX], + pokeblockFeed->animData[ANIMDATA_COS_AMPLITUDE] - amplitude / 0x100) + y; } - pokeblockFeed->field_1060[0] += pokeblockFeed->field_1060[1]; - pokeblockFeed->field_1060[0] &= 0xFF; - pokeblockFeed->field_1060[4]--; + pokeblockFeed->animData[ANIMDATA_ROT_IDX] += pokeblockFeed->animData[ANIMDATA_ROT_SPEED]; + pokeblockFeed->animData[ANIMDATA_ROT_IDX] &= 0xFF; + pokeblockFeed->animData[ANIMDATA_TIME]--; } } diff --git a/src/pokedex.c b/src/pokedex.c index 516cef6a7..c7c892d53 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -305,7 +305,7 @@ static void ClearSearchParameterBoxText(void); static const struct OamData sOamData_ScrollBar = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -322,7 +322,7 @@ static const struct OamData sOamData_ScrollBar = static const struct OamData sOamData_ScrollArrow = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -339,7 +339,7 @@ static const struct OamData sOamData_ScrollArrow = static const struct OamData sOamData_InterfaceText = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -356,7 +356,7 @@ static const struct OamData sOamData_InterfaceText = static const struct OamData sOamData_RotatingPokeBall = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_WINDOW, .mosaic = 0, @@ -373,7 +373,7 @@ static const struct OamData sOamData_RotatingPokeBall = static const struct OamData sOamData_SeenOwnText = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -390,7 +390,7 @@ static const struct OamData sOamData_SeenOwnText = static const struct OamData sOamData_Dex8x16 = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -1373,7 +1373,7 @@ static const struct SearchOptionText sDexSearchColorOptions[] = {}, }; -static const struct SearchOptionText sDexSearchTypeOptions[] = +static const struct SearchOptionText sDexSearchTypeOptions[NUMBER_OF_MON_TYPES + 1] = // + 2 for "None" and terminator, - 1 for Mystery { {gText_DexEmptyString, gText_DexSearchTypeNone}, {gText_DexEmptyString, gTypeNames[TYPE_NORMAL]}, @@ -1407,7 +1407,7 @@ static const u8 sOrderOptions[] = ORDER_SMALLEST, }; -static const u8 sDexSearchTypeIds[] = +static const u8 sDexSearchTypeIds[NUMBER_OF_MON_TYPES] = { TYPE_NONE, TYPE_NORMAL, @@ -1587,9 +1587,6 @@ static void ResetPokedexView(struct PokedexView *pokedexView) void CB2_OpenPokedex(void) { - u8 *addr; - u32 size; - switch (gMain.state) { case 0: @@ -1692,7 +1689,7 @@ static void Task_HandlePokedexInput(u8 taskId) else if (JOY_NEW(SELECT_BUTTON)) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tTaskId = LoadSearchMenu(); sPokedexView->screenSwitchState = 0; sPokedexView->pokeBallRotationBackup = sPokedexView->pokeBallRotation; @@ -1705,7 +1702,7 @@ static void Task_HandlePokedexInput(u8 taskId) } else if (JOY_NEW(B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ClosePokedex; PlaySE(SE_PC_OFF); } @@ -1759,7 +1756,7 @@ static void Task_HandlePokedexStartMenuInput(u8 taskId) gMain.newKeys |= START_BUTTON; //Exit menu break; case 3: //CLOSE POKEDEX - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ClosePokedex; PlaySE(SE_PC_OFF); break; @@ -1894,7 +1891,7 @@ static void Task_HandleSearchResultsInput(u8 taskId) } else if (JOY_NEW(SELECT_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tTaskId = LoadSearchMenu(); sPokedexView->screenSwitchState = 0; gTasks[taskId].func = Task_WaitForExitSearch; @@ -1903,7 +1900,7 @@ static void Task_HandleSearchResultsInput(u8 taskId) } else if (JOY_NEW(B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ReturnToPokedexFromSearchResults; PlaySE(SE_PC_OFF); } @@ -1956,12 +1953,12 @@ static void Task_HandleSearchResultsStartMenuInput(u8 taskId) gMain.newKeys |= START_BUTTON; break; case 3: //BACK TO POKEDEX - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ReturnToPokedexFromSearchResults; PlaySE(SE_TRUCK_DOOR); break; case 4: //CLOSE POKEDEX - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ClosePokedexFromSearchResultsStartMenu; PlaySE(SE_PC_OFF); break; @@ -2107,13 +2104,13 @@ static bool8 LoadPokedexListPage(u8 page) gMain.state++; break; case 4: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_Pokedex); gMain.state++; break; case 5: - SetGpuReg(REG_OFFSET_WININ, 0x3F3F); - SetGpuReg(REG_OFFSET_WINOUT, 0x1D3F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_ALL | WININ_WIN1_ALL); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_ALL | WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3 | WINOUT_WINOBJ_OBJ); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); @@ -2321,7 +2318,7 @@ static void PrintMonDexNumAndName(u8 windowId, u8 fontId, const u8* str, u8 left color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_6; - color[2] = TEXT_COLOR_LIGHT_GREY; + color[2] = TEXT_COLOR_LIGHT_GRAY; AddTextPrinterParameterized4(windowId, fontId, left * 8, (top * 8) + 1, 0, 0, color, -1, str); } @@ -2771,7 +2768,7 @@ static void CreateInterfaceSprites(u8 page) // Scroll arrows spriteId = CreateSprite(&sScrollArrowSpriteTemplate, 184, 4, 0); gSprites[spriteId].sIsDownArrow = FALSE; - spriteId = CreateSprite(&sScrollArrowSpriteTemplate, 184, 156, 0); + spriteId = CreateSprite(&sScrollArrowSpriteTemplate, 184, DISPLAY_HEIGHT - 4, 0); gSprites[spriteId].sIsDownArrow = TRUE; gSprites[spriteId].vFlip = TRUE; @@ -2782,20 +2779,20 @@ static void CreateInterfaceSprites(u8 page) spriteId = CreateSprite(&sInterfaceTextSpriteTemplate, 48, 120, 0); StartSpriteAnim(&gSprites[spriteId], 3); // Select button - spriteId = CreateSprite(&sInterfaceTextSpriteTemplate, 16, 144, 0); + spriteId = CreateSprite(&sInterfaceTextSpriteTemplate, 16, DISPLAY_HEIGHT - 16, 0); StartSpriteAnim(&gSprites[spriteId], 2); gSprites[spriteId].data[2] = 0x80; // Search text - spriteId = CreateSprite(&sInterfaceTextSpriteTemplate, 48, 144, 0); + spriteId = CreateSprite(&sInterfaceTextSpriteTemplate, 48, DISPLAY_HEIGHT - 16, 0); StartSpriteAnim(&gSprites[spriteId], 1); - spriteId = CreateSprite(&sRotatingPokeBallSpriteTemplate, 0, 80, 2); + spriteId = CreateSprite(&sRotatingPokeBallSpriteTemplate, 0, DISPLAY_HEIGHT / 2, 2); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.matrixNum = 30; gSprites[spriteId].data[0] = 30; gSprites[spriteId].data[1] = 0; - spriteId = CreateSprite(&sRotatingPokeBallSpriteTemplate, 0, 80, 2); + spriteId = CreateSprite(&sRotatingPokeBallSpriteTemplate, 0, DISPLAY_HEIGHT / 2, 2); gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL; gSprites[spriteId].oam.matrixNum = 31; gSprites[spriteId].data[0] = 31; @@ -3035,9 +3032,8 @@ static void SpriteCB_PokedexListMonSprite(struct Sprite *sprite) else { u32 var; - sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256; - var = 0x10000 / gSineTable[sprite->data[5] + 64]; + var = SAFE_DIV(0x10000, gSineTable[sprite->data[5] + 64]); if (var > 0xFFFF) var = 0xFFFF; SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var); @@ -3164,7 +3160,7 @@ static void PrintInfoScreenText(const u8* str, u8 left, u8 top) u8 color[3]; color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_6; - color[2] = TEXT_COLOR_LIGHT_GREY; + color[2] = TEXT_COLOR_LIGHT_GRAY; AddTextPrinterParameterized4(0, 1, left, top, 0, 0, color, -1, str); } @@ -3350,14 +3346,14 @@ static void Task_HandleInfoScreenInput(u8 taskId) if (gTasks[taskId].data[0] != 0) { // Scroll up/down - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_LoadInfoScreenWaitForFade; PlaySE(SE_DEX_SCROLL); return; } if (JOY_NEW(B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ExitInfoScreen; PlaySE(SE_PC_OFF); return; @@ -3367,13 +3363,13 @@ static void Task_HandleInfoScreenInput(u8 taskId) switch (sPokedexView->selectedScreen) { case AREA_SCREEN: - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 16, RGB_BLACK); sPokedexView->screenSwitchState = 1; gTasks[taskId].func = Task_SwitchScreensFromInfoScreen; PlaySE(SE_PIN); break; case CRY_SCREEN: - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); sPokedexView->screenSwitchState = 2; gTasks[taskId].func = Task_SwitchScreensFromInfoScreen; PlaySE(SE_PIN); @@ -3385,14 +3381,14 @@ static void Task_HandleInfoScreenInput(u8 taskId) } else { - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); sPokedexView->screenSwitchState = 3; gTasks[taskId].func = Task_SwitchScreensFromInfoScreen; PlaySE(SE_PIN); } break; case CANCEL_SCREEN: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_ExitInfoScreen; PlaySE(SE_PC_OFF); break; @@ -3597,7 +3593,7 @@ static void Task_LoadCryScreen(u8 taskId) } break; case 8: - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gMain.state++; break; @@ -3639,7 +3635,7 @@ static void Task_HandleCryScreenInput(u8 taskId) { if (JOY_NEW(B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); m4aMPlayContinue(&gMPlayInfo_BGM); sPokedexView->screenSwitchState = 1; gTasks[taskId].func = Task_SwitchScreensFromCryScreen; @@ -3649,7 +3645,7 @@ static void Task_HandleCryScreenInput(u8 taskId) if ((JOY_NEW(DPAD_LEFT)) || ((JOY_NEW(L_BUTTON)) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) { - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); m4aMPlayContinue(&gMPlayInfo_BGM); sPokedexView->screenSwitchState = 2; gTasks[taskId].func = Task_SwitchScreensFromCryScreen; @@ -3665,7 +3661,7 @@ static void Task_HandleCryScreenInput(u8 taskId) } else { - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); m4aMPlayContinue(&gMPlayInfo_BGM); sPokedexView->screenSwitchState = 3; gTasks[taskId].func = Task_SwitchScreensFromCryScreen; @@ -3781,7 +3777,7 @@ static void Task_LoadSizeScreen(u8 taskId) gMain.state++; break; case 7: - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gMain.state++; break; @@ -3811,7 +3807,7 @@ static void Task_HandleSizeScreenInput(u8 taskId) { if (JOY_NEW(B_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); sPokedexView->screenSwitchState = 1; gTasks[taskId].func = Task_SwitchScreensFromSizeScreen; PlaySE(SE_PC_OFF); @@ -3819,7 +3815,7 @@ static void Task_HandleSizeScreenInput(u8 taskId) else if ((JOY_NEW(DPAD_LEFT)) || ((JOY_NEW(L_BUTTON)) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) { - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 0x10, RGB_BLACK); sPokedexView->screenSwitchState = 2; gTasks[taskId].func = Task_SwitchScreensFromSizeScreen; PlaySE(SE_DEX_PAGE); @@ -3982,7 +3978,7 @@ static void Task_DisplayCaughtMonDexPage(u8 taskId) case 4: spriteId = CreateMonSpriteFromNationalDexNumber(dexNum, 48, 56, 0); gSprites[spriteId].oam.priority = 0; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(gPokedexVBlankCB); gTasks[taskId].tMonSpriteId = spriteId; gTasks[taskId].tState++; @@ -4011,7 +4007,7 @@ static void Task_HandleCaughtMonPageInput(u8 taskId) { if (JOY_NEW(A_BUTTON | B_BUTTON)) { - BeginNormalPaletteFade(0x0000FFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_BG, 0, 0, 16, RGB_BLACK); gSprites[gTasks[taskId].tMonSpriteId].callback = SpriteCB_SlideCaughtMonToCenter; gTasks[taskId].func = Task_ExitCaughtMonPage; } @@ -4461,7 +4457,7 @@ static void PrintInfoSubMenuText(u8 windowId, const u8 *str, u8 left, u8 top) u8 color[3]; color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_6; - color[2] = TEXT_COLOR_LIGHT_GREY; + color[2] = TEXT_COLOR_LIGHT_GRAY; AddTextPrinterParameterized4(windowId, 1, left, top, 0, 0, color, -1, str); } @@ -4770,7 +4766,7 @@ static void PrintSearchText(const u8 *str, u32 x, u32 y) color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_6; - color[2] = TEXT_COLOR_DARK_GREY; + color[2] = TEXT_COLOR_DARK_GRAY; AddTextPrinterParameterized4(0, 1, x, y, 0, 0, color, -1, str); } @@ -4844,7 +4840,7 @@ static void Task_LoadSearchMenu(u8 taskId) gMain.state++; break; case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 3: @@ -5214,7 +5210,7 @@ static void Task_HandleSearchParameterInput(u8 taskId) static void Task_ExitSearch(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ExitSearchWaitForFade; } diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 7a3b38dc2..f9cf42309 100755 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -489,7 +489,6 @@ static bool8 MonListHasMon(const struct WildPokemonInfo *info, u16 species, u16 static void BuildAreaGlowTilemap(void) { u16 i, y, x, j; - u16 val; for (i = 0; i < ARRAY_COUNT(sPokedexAreaScreen->areaGlowTilemap); i++) sPokedexAreaScreen->areaGlowTilemap[i] = 0; @@ -692,7 +691,7 @@ static void Task_ShowPokedexAreaScreen(u8 taskId) CreateAreaUnknownSprites(); break; case 9: - BeginNormalPaletteFade(0xFFFFFFEB, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 16, 0, RGB(0, 0, 0)); break; case 10: SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_ALL); @@ -737,7 +736,7 @@ static void Task_HandlePokedexAreaScreenInput(u8 taskId) return; break; case 2: - BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL & ~(0x14), 0, 0, 16, RGB_BLACK); break; case 3: if (gPaletteFade.active) diff --git a/src/pokedex_cry_screen.c b/src/pokedex_cry_screen.c index 0a6f639ae..447ce7515 100644 --- a/src/pokedex_cry_screen.c +++ b/src/pokedex_cry_screen.c @@ -188,7 +188,7 @@ static const union AnimCmd *const sSpriteAnimTable_CryMeterNeedle[] = static const struct OamData sOamData_CryMeterNeedle = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_NORMAL, .bpp = ST_OAM_4BPP, diff --git a/src/pokemon.c b/src/pokemon.c index 475373550..28b402216 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -57,7 +57,7 @@ static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); static void EncryptBoxMon(struct BoxPokemon *boxMon); static void DecryptBoxMon(struct BoxPokemon *boxMon); -static void sub_806E6CC(u8 taskId); +static void Task_PlayMapChosenOrBattleBGM(u8 taskId); static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId); static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); static bool8 ShouldSkipFriendshipChange(void); @@ -1350,32 +1350,32 @@ const struct SpindaSpot gSpindaSpotGraphics[] = const s8 gNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] = { - // Atk Def Spd Sp.Atk Sp.Def - { 0, 0, 0, 0, 0}, // Hardy - { +1, -1, 0, 0, 0}, // Lonely - { +1, 0, -1, 0, 0}, // Brave - { +1, 0, 0, -1, 0}, // Adamant - { +1, 0, 0, 0, -1}, // Naughty - { -1, +1, 0, 0, 0}, // Bold - { 0, 0, 0, 0, 0}, // Docile - { 0, +1, -1, 0, 0}, // Relaxed - { 0, +1, 0, -1, 0}, // Impish - { 0, +1, 0, 0, -1}, // Lax - { -1, 0, +1, 0, 0}, // Timid - { 0, -1, +1, 0, 0}, // Hasty - { 0, 0, 0, 0, 0}, // Serious - { 0, 0, +1, -1, 0}, // Jolly - { 0, 0, +1, 0, -1}, // Naive - { -1, 0, 0, +1, 0}, // Modest - { 0, -1, 0, +1, 0}, // Mild - { 0, 0, -1, +1, 0}, // Quiet - { 0, 0, 0, 0, 0}, // Bashful - { 0, 0, 0, +1, -1}, // Rash - { -1, 0, 0, 0, +1}, // Calm - { 0, -1, 0, 0, +1}, // Gentle - { 0, 0, -1, 0, +1}, // Sassy - { 0, 0, 0, -1, +1}, // Careful - { 0, 0, 0, 0, 0}, // Quirky + // Atk Def Spd Sp.Atk Sp.Def + [NATURE_HARDY] = { 0, 0, 0, 0, 0}, + [NATURE_LONELY] = { +1, -1, 0, 0, 0}, + [NATURE_BRAVE] = { +1, 0, -1, 0, 0}, + [NATURE_ADAMANT] = { +1, 0, 0, -1, 0}, + [NATURE_NAUGHTY] = { +1, 0, 0, 0, -1}, + [NATURE_BOLD] = { -1, +1, 0, 0, 0}, + [NATURE_DOCILE] = { 0, 0, 0, 0, 0}, + [NATURE_RELAXED] = { 0, +1, -1, 0, 0}, + [NATURE_IMPISH] = { 0, +1, 0, -1, 0}, + [NATURE_LAX] = { 0, +1, 0, 0, -1}, + [NATURE_TIMID] = { -1, 0, +1, 0, 0}, + [NATURE_HASTY] = { 0, -1, +1, 0, 0}, + [NATURE_SERIOUS] = { 0, 0, 0, 0, 0}, + [NATURE_JOLLY] = { 0, 0, +1, -1, 0}, + [NATURE_NAIVE] = { 0, 0, +1, 0, -1}, + [NATURE_MODEST] = { -1, 0, 0, +1, 0}, + [NATURE_MILD] = { 0, -1, 0, +1, 0}, + [NATURE_QUIET] = { 0, 0, -1, +1, 0}, + [NATURE_BASHFUL] = { 0, 0, 0, 0, 0}, + [NATURE_RASH] = { 0, 0, 0, +1, -1}, + [NATURE_CALM] = { -1, 0, 0, 0, +1}, + [NATURE_GENTLE] = { 0, -1, 0, 0, +1}, + [NATURE_SASSY] = { 0, 0, -1, 0, +1}, + [NATURE_CAREFUL] = { 0, 0, 0, -1, +1}, + [NATURE_QUIRKY] = { 0, 0, 0, 0, 0}, }; #include "data/pokemon/tmhm_learnsets.h" @@ -1391,476 +1391,451 @@ const s8 gNatureStatTable[NUM_NATURES][NUM_NATURE_STATS] = static const u8 sMonFrontAnimIdsTable[] = { - [SPECIES_BULBASAUR - 1] = 0x06, - [SPECIES_IVYSAUR - 1] = 0x17, - [SPECIES_VENUSAUR - 1] = 0x2f, - [SPECIES_CHARMANDER - 1] = 0x52, - [SPECIES_CHARMELEON - 1] = 0x25, - [SPECIES_CHARIZARD - 1] = 0x10, - [SPECIES_SQUIRTLE - 1] = 0x0b, - [SPECIES_WARTORTLE - 1] = 0x13, - [SPECIES_BLASTOISE - 1] = 0x19, - [SPECIES_CATERPIE - 1] = 0x0b, - [SPECIES_METAPOD - 1] = 0x0b, - [SPECIES_BUTTERFREE - 1] = 0x1d, - [SPECIES_WEEDLE - 1] = 0x46, - [SPECIES_KAKUNA - 1] = 0x20, - [SPECIES_BEEDRILL - 1] = 0x02, - [SPECIES_PIDGEY - 1] = 0x47, - [SPECIES_PIDGEOTTO - 1] = 0x17, - [SPECIES_PIDGEOT - 1] = 0x29, - [SPECIES_RATTATA - 1] = 0x43, - [SPECIES_RATICATE - 1] = 0x2b, - [SPECIES_SPEAROW - 1] = 0x18, - [SPECIES_FEAROW - 1] = 0x2b, - [SPECIES_EKANS - 1] = 0x16, - [SPECIES_ARBOK - 1] = 0x17, - [SPECIES_PIKACHU - 1] = 0x2c, - [SPECIES_RAICHU - 1] = 0x17, - [SPECIES_SANDSHREW - 1] = 0x2d, - [SPECIES_SANDSLASH - 1] = 0x17, - [SPECIES_NIDORAN_F - 1] = 0x00, - [SPECIES_NIDORINA - 1] = 0x17, - [SPECIES_NIDOQUEEN - 1] = 0x0f, - [SPECIES_NIDORAN_M - 1] = 0x09, - [SPECIES_NIDORINO - 1] = 0x13, - [SPECIES_NIDOKING - 1] = 0x0f, - [SPECIES_CLEFAIRY - 1] = 0x00, - [SPECIES_CLEFABLE - 1] = 0x4a, - [SPECIES_VULPIX - 1] = 0x17, - [SPECIES_NINETALES - 1] = 0x10, - [SPECIES_JIGGLYPUFF - 1] = 0x48, - [SPECIES_WIGGLYTUFF - 1] = 0x31, - [SPECIES_ZUBAT - 1] = 0x00, - [SPECIES_GOLBAT - 1] = 0x1d, - [SPECIES_ODDISH - 1] = 0x00, - [SPECIES_GLOOM - 1] = 0x45, - [SPECIES_VILEPLUME - 1] = 0x49, - [SPECIES_PARAS - 1] = 0x46, - [SPECIES_PARASECT - 1] = 0x0f, - [SPECIES_VENONAT - 1] = 0x06, - [SPECIES_VENOMOTH - 1] = 0x4b, - [SPECIES_DIGLETT - 1] = 0x10, - [SPECIES_DUGTRIO - 1] = 0x4c, - [SPECIES_MEOWTH - 1] = 0x52, - [SPECIES_PERSIAN - 1] = 0x17, - [SPECIES_PSYDUCK - 1] = 0x06, - [SPECIES_GOLDUCK - 1] = 0x4c, - [SPECIES_MANKEY - 1] = 0x32, - [SPECIES_PRIMEAPE - 1] = 0x48, - [SPECIES_GROWLITHE - 1] = 0x25, - [SPECIES_ARCANINE - 1] = 0x02, - [SPECIES_POLIWAG - 1] = 0x00, - [SPECIES_POLIWHIRL - 1] = 0x32, - [SPECIES_POLIWRATH - 1] = 0x19, - [SPECIES_ABRA - 1] = 0x31, - [SPECIES_KADABRA - 1] = 0x09, - [SPECIES_ALAKAZAM - 1] = 0x17, - [SPECIES_MACHOP - 1] = 0x00, - [SPECIES_MACHOKE - 1] = 0x10, - [SPECIES_MACHAMP - 1] = 0x31, - [SPECIES_BELLSPROUT - 1] = 0x17, - [SPECIES_WEEPINBELL - 1] = 0x0d, - [SPECIES_VICTREEBEL - 1] = 0x32, - [SPECIES_TENTACOOL - 1] = 0x00, - [SPECIES_TENTACRUEL - 1] = 0x00, - [SPECIES_GEODUDE - 1] = 0x48, - [SPECIES_GRAVELER - 1] = 0x48, - [SPECIES_GOLEM - 1] = 0x2f, - [SPECIES_PONYTA - 1] = 0x20, - [SPECIES_RAPIDASH - 1] = 0x11, - [SPECIES_SLOWPOKE - 1] = 0x45, - [SPECIES_SLOWBRO - 1] = 0x0b, - [SPECIES_MAGNEMITE - 1] = 0x54, - [SPECIES_MAGNETON - 1] = 0x2c, - [SPECIES_FARFETCHD - 1] = 0x48, - [SPECIES_DODUO - 1] = 0x4c, - [SPECIES_DODRIO - 1] = 0x41, - [SPECIES_SEEL - 1] = 0x0b, - [SPECIES_DEWGONG - 1] = 0x45, - [SPECIES_GRIMER - 1] = 0x46, - [SPECIES_MUK - 1] = 0x30, - [SPECIES_SHELLDER - 1] = 0x12, - [SPECIES_CLOYSTER - 1] = 0x1d, - [SPECIES_GASTLY - 1] = 0x15, - [SPECIES_HAUNTER - 1] = 0x35, - [SPECIES_GENGAR - 1] = 0x3a, - [SPECIES_ONIX - 1] = 0x43, - [SPECIES_DROWZEE - 1] = 0x4f, - [SPECIES_HYPNO - 1] = 0x09, - [SPECIES_KRABBY - 1] = 0x03, - [SPECIES_KINGLER - 1] = 0x4b, - [SPECIES_VOLTORB - 1] = 0x00, - [SPECIES_ELECTRODE - 1] = 0x00, - [SPECIES_EXEGGCUTE - 1] = 0x46, - [SPECIES_EXEGGUTOR - 1] = 0x32, - [SPECIES_CUBONE - 1] = 0x48, - [SPECIES_MAROWAK - 1] = 0x05, - [SPECIES_HITMONLEE - 1] = 0x16, - [SPECIES_HITMONCHAN - 1] = 0x09, - [SPECIES_LICKITUNG - 1] = 0x45, - [SPECIES_KOFFING - 1] = 0x13, - [SPECIES_WEEZING - 1] = 0x04, - [SPECIES_RHYHORN - 1] = 0x10, - [SPECIES_RHYDON - 1] = 0x13, - [SPECIES_CHANSEY - 1] = 0x45, - [SPECIES_TANGELA - 1] = 0x48, - [SPECIES_KANGASKHAN - 1] = 0x17, - [SPECIES_HORSEA - 1] = 0x12, - [SPECIES_SEADRA - 1] = 0x04, - [SPECIES_GOLDEEN - 1] = 0x0d, - [SPECIES_SEAKING - 1] = 0x1c, - [SPECIES_STARYU - 1] = 0x4e, - [SPECIES_STARMIE - 1] = 0x12, - [SPECIES_MR_MIME - 1] = 0x46, - [SPECIES_SCYTHER - 1] = 0x02, - [SPECIES_JYNX - 1] = 0x17, - [SPECIES_ELECTABUZZ - 1] = 0x2c, - [SPECIES_MAGMAR - 1] = 0x0f, - [SPECIES_PINSIR - 1] = 0x09, - [SPECIES_TAUROS - 1] = 0x19, - [SPECIES_MAGIKARP - 1] = 0x05, - [SPECIES_GYARADOS - 1] = 0x48, - [SPECIES_LAPRAS - 1] = 0x17, - [SPECIES_DITTO - 1] = 0x01, - [SPECIES_EEVEE - 1] = 0x17, - [SPECIES_VAPOREON - 1] = 0x17, - [SPECIES_JOLTEON - 1] = 0x00, - [SPECIES_FLAREON - 1] = 0x17, - [SPECIES_PORYGON - 1] = 0x52, - [SPECIES_OMANYTE - 1] = 0x51, - [SPECIES_OMASTAR - 1] = 0x09, - [SPECIES_KABUTO - 1] = 0x1d, - [SPECIES_KABUTOPS - 1] = 0x0f, - [SPECIES_AERODACTYL - 1] = 0x47, - [SPECIES_SNORLAX - 1] = 0x0b, - [SPECIES_ARTICUNO - 1] = 0x09, - [SPECIES_ZAPDOS - 1] = 0x2c, - [SPECIES_MOLTRES - 1] = 0x45, - [SPECIES_DRATINI - 1] = 0x00, - [SPECIES_DRAGONAIR - 1] = 0x10, - [SPECIES_DRAGONITE - 1] = 0x47, - [SPECIES_MEWTWO - 1] = 0x09, - [SPECIES_MEW - 1] = 0x0d, - [SPECIES_CHIKORITA - 1] = 0x00, - [SPECIES_BAYLEEF - 1] = 0x00, - [SPECIES_MEGANIUM - 1] = 0x17, - [SPECIES_CYNDAQUIL - 1] = 0x52, - [SPECIES_QUILAVA - 1] = 0x17, - [SPECIES_TYPHLOSION - 1] = 0x10, - [SPECIES_TOTODILE - 1] = 0x31, - [SPECIES_CROCONAW - 1] = 0x0f, - [SPECIES_FERALIGATR - 1] = 0x0f, - [SPECIES_SENTRET - 1] = 0x00, - [SPECIES_FURRET - 1] = 0x32, - [SPECIES_HOOTHOOT - 1] = 0x47, - [SPECIES_NOCTOWL - 1] = 0x17, - [SPECIES_LEDYBA - 1] = 0x52, - [SPECIES_LEDIAN - 1] = 0x47, - [SPECIES_SPINARAK - 1] = 0x4f, - [SPECIES_ARIADOS - 1] = 0x0f, - [SPECIES_CROBAT - 1] = 0x00, - [SPECIES_CHINCHOU - 1] = 0x45, - [SPECIES_LANTURN - 1] = 0x51, - [SPECIES_PICHU - 1] = 0x1e, - [SPECIES_CLEFFA - 1] = 0x52, - [SPECIES_IGGLYBUFF - 1] = 0x0c, - [SPECIES_TOGEPI - 1] = 0x0b, - [SPECIES_TOGETIC - 1] = 0x00, - [SPECIES_NATU - 1] = 0x31, - [SPECIES_XATU - 1] = 0x09, - [SPECIES_MAREEP - 1] = 0x00, - [SPECIES_FLAAFFY - 1] = 0x1e, - [SPECIES_AMPHAROS - 1] = 0x2c, - [SPECIES_BELLOSSOM - 1] = 0x0b, - [SPECIES_MARILL - 1] = 0x00, - [SPECIES_AZUMARILL - 1] = 0x4a, - [SPECIES_SUDOWOODO - 1] = 0x46, - [SPECIES_POLITOED - 1] = 0x32, - [SPECIES_HOPPIP - 1] = 0x1c, - [SPECIES_SKIPLOOM - 1] = 0x18, - [SPECIES_JUMPLUFF - 1] = 0x51, - [SPECIES_AIPOM - 1] = 0x32, - [SPECIES_SUNKERN - 1] = 0x52, - [SPECIES_SUNFLORA - 1] = 0x00, - [SPECIES_YANMA - 1] = 0x2b, - [SPECIES_WOOPER - 1] = 0x00, - [SPECIES_QUAGSIRE - 1] = 0x16, - [SPECIES_ESPEON - 1] = 0x09, - [SPECIES_UMBREON - 1] = 0x10, - [SPECIES_MURKROW - 1] = 0x00, - [SPECIES_SLOWKING - 1] = 0x13, - [SPECIES_MISDREAVUS - 1] = 0x1c, - [SPECIES_UNOWN - 1] = 0x0a, - [SPECIES_WOBBUFFET - 1] = 0x30, - [SPECIES_GIRAFARIG - 1] = 0x1e, - [SPECIES_PINECO - 1] = 0x0b, - [SPECIES_FORRETRESS - 1] = 0x10, - [SPECIES_DUNSPARCE - 1] = 0x00, - [SPECIES_GLIGAR - 1] = 0x13, - [SPECIES_STEELIX - 1] = 0x0f, - [SPECIES_SNUBBULL - 1] = 0x17, - [SPECIES_GRANBULL - 1] = 0x10, - [SPECIES_QWILFISH - 1] = 0x3a, - [SPECIES_SCIZOR - 1] = 0x02, - [SPECIES_SHUCKLE - 1] = 0x0b, - [SPECIES_HERACROSS - 1] = 0x41, - [SPECIES_SNEASEL - 1] = 0x16, - [SPECIES_TEDDIURSA - 1] = 0x17, - [SPECIES_URSARING - 1] = 0x10, - [SPECIES_SLUGMA - 1] = 0x17, - [SPECIES_MAGCARGO - 1] = 0x17, - [SPECIES_SWINUB - 1] = 0x00, - [SPECIES_PILOSWINE - 1] = 0x0f, - [SPECIES_CORSOLA - 1] = 0x03, - [SPECIES_REMORAID - 1] = 0x52, - [SPECIES_OCTILLERY - 1] = 0x17, - [SPECIES_DELIBIRD - 1] = 0x52, - [SPECIES_MANTINE - 1] = 0x0d, - [SPECIES_SKARMORY - 1] = 0x17, - [SPECIES_HOUNDOUR - 1] = 0x17, - [SPECIES_HOUNDOOM - 1] = 0x10, - [SPECIES_KINGDRA - 1] = 0x42, - [SPECIES_PHANPY - 1] = 0x32, - [SPECIES_DONPHAN - 1] = 0x19, - [SPECIES_PORYGON2 - 1] = 0x00, - [SPECIES_STANTLER - 1] = 0x00, - [SPECIES_SMEARGLE - 1] = 0x31, - [SPECIES_TYROGUE - 1] = 0x16, - [SPECIES_HITMONTOP - 1] = 0x02, - [SPECIES_SMOOCHUM - 1] = 0x09, - [SPECIES_ELEKID - 1] = 0x2c, - [SPECIES_MAGBY - 1] = 0x00, - [SPECIES_MILTANK - 1] = 0x45, - [SPECIES_BLISSEY - 1] = 0x00, - [SPECIES_RAIKOU - 1] = 0x2c, - [SPECIES_ENTEI - 1] = 0x09, - [SPECIES_SUICUNE - 1] = 0x10, - [SPECIES_LARVITAR - 1] = 0x52, - [SPECIES_PUPITAR - 1] = 0x10, - [SPECIES_TYRANITAR - 1] = 0x0f, - [SPECIES_LUGIA - 1] = 0x3a, - [SPECIES_HO_OH - 1] = 0x09, - [SPECIES_CELEBI - 1] = 0x18, - [SPECIES_OLD_UNOWN_B - 1] = 0x00, - [SPECIES_OLD_UNOWN_C - 1] = 0x00, - [SPECIES_OLD_UNOWN_D - 1] = 0x00, - [SPECIES_OLD_UNOWN_E - 1] = 0x00, - [SPECIES_OLD_UNOWN_F - 1] = 0x00, - [SPECIES_OLD_UNOWN_G - 1] = 0x00, - [SPECIES_OLD_UNOWN_H - 1] = 0x00, - [SPECIES_OLD_UNOWN_I - 1] = 0x00, - [SPECIES_OLD_UNOWN_J - 1] = 0x00, - [SPECIES_OLD_UNOWN_K - 1] = 0x00, - [SPECIES_OLD_UNOWN_L - 1] = 0x00, - [SPECIES_OLD_UNOWN_M - 1] = 0x00, - [SPECIES_OLD_UNOWN_N - 1] = 0x00, - [SPECIES_OLD_UNOWN_O - 1] = 0x00, - [SPECIES_OLD_UNOWN_P - 1] = 0x00, - [SPECIES_OLD_UNOWN_Q - 1] = 0x00, - [SPECIES_OLD_UNOWN_R - 1] = 0x00, - [SPECIES_OLD_UNOWN_S - 1] = 0x00, - [SPECIES_OLD_UNOWN_T - 1] = 0x00, - [SPECIES_OLD_UNOWN_U - 1] = 0x00, - [SPECIES_OLD_UNOWN_V - 1] = 0x00, - [SPECIES_OLD_UNOWN_W - 1] = 0x00, - [SPECIES_OLD_UNOWN_X - 1] = 0x00, - [SPECIES_OLD_UNOWN_Y - 1] = 0x00, - [SPECIES_OLD_UNOWN_Z - 1] = 0x00, - [SPECIES_TREECKO - 1] = 0x00, - [SPECIES_GROVYLE - 1] = 0x17, - [SPECIES_SCEPTILE - 1] = 0x10, - [SPECIES_TORCHIC - 1] = 0x16, - [SPECIES_COMBUSKEN - 1] = 0x06, - [SPECIES_BLAZIKEN - 1] = 0x0f, - [SPECIES_MUDKIP - 1] = 0x01, - [SPECIES_MARSHTOMP - 1] = 0x04, - [SPECIES_SWAMPERT - 1] = 0x1e, - [SPECIES_POOCHYENA - 1] = 0x10, - [SPECIES_MIGHTYENA - 1] = 0x10, - [SPECIES_ZIGZAGOON - 1] = 0x03, - [SPECIES_LINOONE - 1] = 0x09, - [SPECIES_WURMPLE - 1] = 0x00, - [SPECIES_SILCOON - 1] = 0x00, - [SPECIES_BEAUTIFLY - 1] = 0x04, - [SPECIES_CASCOON - 1] = 0x04, - [SPECIES_DUSTOX - 1] = 0x06, - [SPECIES_LOTAD - 1] = 0x00, - [SPECIES_LOMBRE - 1] = 0x00, - [SPECIES_LUDICOLO - 1] = 0x49, - [SPECIES_SEEDOT - 1] = 0x05, - [SPECIES_NUZLEAF - 1] = 0x00, - [SPECIES_SHIFTRY - 1] = 0x02, - [SPECIES_NINCADA - 1] = 0x00, - [SPECIES_NINJASK - 1] = 0x46, - [SPECIES_SHEDINJA - 1] = 0x1c, - [SPECIES_TAILLOW - 1] = 0x1e, - [SPECIES_SWELLOW - 1] = 0x01, - [SPECIES_SHROOMISH - 1] = 0x00, - [SPECIES_BRELOOM - 1] = 0x00, - [SPECIES_SPINDA - 1] = 0x31, - [SPECIES_WINGULL - 1] = 0x1b, - [SPECIES_PELIPPER - 1] = 0x1c, - [SPECIES_SURSKIT - 1] = 0x00, - [SPECIES_MASQUERAIN - 1] = 0x00, - [SPECIES_WAILMER - 1] = 0x01, - [SPECIES_WAILORD - 1] = 0x1c, - [SPECIES_SKITTY - 1] = 0x00, - [SPECIES_DELCATTY - 1] = 0x17, - [SPECIES_KECLEON - 1] = 0x35, - [SPECIES_BALTOY - 1] = 0x1d, - [SPECIES_CLAYDOL - 1] = 0x51, - [SPECIES_NOSEPASS - 1] = 0x49, - [SPECIES_TORKOAL - 1] = 0x17, - [SPECIES_SABLEYE - 1] = 0x15, - [SPECIES_BARBOACH - 1] = 0x49, - [SPECIES_WHISCASH - 1] = 0x49, - [SPECIES_LUVDISC - 1] = 0x1d, - [SPECIES_CORPHISH - 1] = 0x10, - [SPECIES_CRAWDAUNT - 1] = 0x09, - [SPECIES_FEEBAS - 1] = 0x49, - [SPECIES_MILOTIC - 1] = 0x22, - [SPECIES_CARVANHA - 1] = 0x49, - [SPECIES_SHARPEDO - 1] = 0x56, - [SPECIES_TRAPINCH - 1] = 0x10, - [SPECIES_VIBRAVA - 1] = 0x0f, - [SPECIES_FLYGON - 1] = 0x4b, - [SPECIES_MAKUHITA - 1] = 0x0b, - [SPECIES_HARIYAMA - 1] = 0x34, - [SPECIES_ELECTRIKE - 1] = 0x00, - [SPECIES_MANECTRIC - 1] = 0x00, - [SPECIES_NUMEL - 1] = 0x04, - [SPECIES_CAMERUPT - 1] = 0x10, - [SPECIES_SPHEAL - 1] = 0x53, - [SPECIES_SEALEO - 1] = 0x17, - [SPECIES_WALREIN - 1] = 0x0f, - [SPECIES_CACNEA - 1] = 0x49, - [SPECIES_CACTURNE - 1] = 0x04, - [SPECIES_SNORUNT - 1] = 0x45, - [SPECIES_GLALIE - 1] = 0x0a, - [SPECIES_LUNATONE - 1] = 0x0e, - [SPECIES_SOLROCK - 1] = 0x08, - [SPECIES_AZURILL - 1] = 0x00, - [SPECIES_SPOINK - 1] = 0x56, - [SPECIES_GRUMPIG - 1] = 0x32, - [SPECIES_PLUSLE - 1] = 0x00, - [SPECIES_MINUN - 1] = 0x01, - [SPECIES_MAWILE - 1] = 0x00, - [SPECIES_MEDITITE - 1] = 0x05, - [SPECIES_MEDICHAM - 1] = 0x45, - [SPECIES_SWABLU - 1] = 0x04, - [SPECIES_ALTARIA - 1] = 0x16, - [SPECIES_WYNAUT - 1] = 0x32, - [SPECIES_DUSKULL - 1] = 0x0a, - [SPECIES_DUSCLOPS - 1] = 0x02, - [SPECIES_ROSELIA - 1] = 0x45, - [SPECIES_SLAKOTH - 1] = 0x45, - [SPECIES_VIGOROTH - 1] = 0x31, - [SPECIES_SLAKING - 1] = 0x45, - [SPECIES_GULPIN - 1] = 0x00, - [SPECIES_SWALOT - 1] = 0x45, - [SPECIES_TROPIUS - 1] = 0x10, - [SPECIES_WHISMUR - 1] = 0x03, - [SPECIES_LOUDRED - 1] = 0x49, - [SPECIES_EXPLOUD - 1] = 0x19, - [SPECIES_CLAMPERL - 1] = 0x12, - [SPECIES_HUNTAIL - 1] = 0x09, - [SPECIES_GOREBYSS - 1] = 0x1c, - [SPECIES_ABSOL - 1] = 0x11, - [SPECIES_SHUPPET - 1] = 0x1c, - [SPECIES_BANETTE - 1] = 0x0d, - [SPECIES_SEVIPER - 1] = 0x17, - [SPECIES_ZANGOOSE - 1] = 0x09, - [SPECIES_RELICANTH - 1] = 0x1a, - [SPECIES_ARON - 1] = 0x45, - [SPECIES_LAIRON - 1] = 0x00, - [SPECIES_AGGRON - 1] = 0x19, - [SPECIES_CASTFORM - 1] = 0x1d, - [SPECIES_VOLBEAT - 1] = 0x00, - [SPECIES_ILLUMISE - 1] = 0x05, - [SPECIES_LILEEP - 1] = 0x17, - [SPECIES_CRADILY - 1] = 0x19, - [SPECIES_ANORITH - 1] = 0x12, - [SPECIES_ARMALDO - 1] = 0x10, - [SPECIES_RALTS - 1] = 0x45, - [SPECIES_KIRLIA - 1] = 0x00, - [SPECIES_GARDEVOIR - 1] = 0x00, - [SPECIES_BAGON - 1] = 0x19, - [SPECIES_SHELGON - 1] = 0x04, - [SPECIES_SALAMENCE - 1] = 0x0f, - [SPECIES_BELDUM - 1] = 0x0f, - [SPECIES_METANG - 1] = 0x04, - [SPECIES_METAGROSS - 1] = 0x10, - [SPECIES_REGIROCK - 1] = 0x01, - [SPECIES_REGICE - 1] = 0x44, - [SPECIES_REGISTEEL - 1] = 0x09, - [SPECIES_KYOGRE - 1] = 0x2d, - [SPECIES_GROUDON - 1] = 0x10, - [SPECIES_RAYQUAZA - 1] = 0x0f, - [SPECIES_LATIAS - 1] = 0x2d, - [SPECIES_LATIOS - 1] = 0x10, - [SPECIES_JIRACHI - 1] = 0x0d, - [SPECIES_DEOXYS - 1] = 0x1b, - [SPECIES_CHIMECHO - 1] = 0x1d, + [SPECIES_BULBASAUR - 1] = ANIM_V_JUMPS_H_JUMPS, + [SPECIES_IVYSAUR - 1] = ANIM_V_STRETCH, + [SPECIES_VENUSAUR - 1] = ANIM_ROTATE_UP_SLAM_DOWN, + [SPECIES_CHARMANDER - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_CHARMELEON - 1] = ANIM_BACK_AND_LUNGE, + [SPECIES_CHARIZARD - 1] = ANIM_V_SHAKE, + [SPECIES_SQUIRTLE - 1] = ANIM_SWING_CONCAVE, + [SPECIES_WARTORTLE - 1] = ANIM_SHRINK_GROW, + [SPECIES_BLASTOISE - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_CATERPIE - 1] = ANIM_SWING_CONCAVE, + [SPECIES_METAPOD - 1] = ANIM_SWING_CONCAVE, + [SPECIES_BUTTERFREE - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_WEEDLE - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_KAKUNA - 1] = ANIM_GLOW_ORANGE, + [SPECIES_BEEDRILL - 1] = ANIM_H_VIBRATE, + [SPECIES_PIDGEY - 1] = ANIM_V_SLIDE_SLOW, + [SPECIES_PIDGEOTTO - 1] = ANIM_V_STRETCH, + [SPECIES_PIDGEOT - 1] = ANIM_FRONT_FLIP, + [SPECIES_RATTATA - 1] = ANIM_RAPID_H_HOPS, + [SPECIES_RATICATE - 1] = ANIM_FIGURE_8, + [SPECIES_SPEAROW - 1] = ANIM_RISING_WOBBLE, + [SPECIES_FEAROW - 1] = ANIM_FIGURE_8, + [SPECIES_EKANS - 1] = ANIM_H_STRETCH, + [SPECIES_ARBOK - 1] = ANIM_V_STRETCH, + [SPECIES_PIKACHU - 1] = ANIM_FLASH_YELLOW, + [SPECIES_RAICHU - 1] = ANIM_V_STRETCH, + [SPECIES_SANDSHREW - 1] = ANIM_SWING_CONCAVE_FAST_SHORT, + [SPECIES_SANDSLASH - 1] = ANIM_V_STRETCH, + [SPECIES_NIDORAN_F - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_NIDORINA - 1] = ANIM_V_STRETCH, + [SPECIES_NIDOQUEEN - 1] = ANIM_H_SHAKE, + [SPECIES_NIDORAN_M - 1] = ANIM_GROW_VIBRATE, + [SPECIES_NIDORINO - 1] = ANIM_SHRINK_GROW, + [SPECIES_NIDOKING - 1] = ANIM_H_SHAKE, + [SPECIES_CLEFAIRY - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_CLEFABLE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, + [SPECIES_VULPIX - 1] = ANIM_V_STRETCH, + [SPECIES_NINETALES - 1] = ANIM_V_SHAKE, + [SPECIES_JIGGLYPUFF - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_WIGGLYTUFF - 1] = ANIM_H_JUMPS, + [SPECIES_ZUBAT - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_GOLBAT - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_ODDISH - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_GLOOM - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_VILEPLUME - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_PARAS - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_PARASECT - 1] = ANIM_H_SHAKE, + [SPECIES_VENONAT - 1] = ANIM_V_JUMPS_H_JUMPS, + [SPECIES_VENOMOTH - 1] = ANIM_ZIGZAG_SLOW, + [SPECIES_DIGLETT - 1] = ANIM_V_SHAKE, + [SPECIES_DUGTRIO - 1] = ANIM_H_SHAKE_SLOW, + [SPECIES_MEOWTH - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_PERSIAN - 1] = ANIM_V_STRETCH, + [SPECIES_PSYDUCK - 1] = ANIM_V_JUMPS_H_JUMPS, + [SPECIES_GOLDUCK - 1] = ANIM_H_SHAKE_SLOW, + [SPECIES_MANKEY - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_PRIMEAPE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_GROWLITHE - 1] = ANIM_BACK_AND_LUNGE, + [SPECIES_ARCANINE - 1] = ANIM_H_VIBRATE, + [SPECIES_POLIWAG - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_POLIWHIRL - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_POLIWRATH - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_ABRA - 1] = ANIM_H_JUMPS, + [SPECIES_KADABRA - 1] = ANIM_GROW_VIBRATE, + [SPECIES_ALAKAZAM - 1] = ANIM_V_STRETCH, + [SPECIES_MACHOP - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MACHOKE - 1] = ANIM_V_SHAKE, + [SPECIES_MACHAMP - 1] = ANIM_H_JUMPS, + [SPECIES_BELLSPROUT - 1] = ANIM_V_STRETCH, + [SPECIES_WEEPINBELL - 1] = ANIM_SWING_CONVEX, + [SPECIES_VICTREEBEL - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_TENTACOOL - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_TENTACRUEL - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_GEODUDE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_GRAVELER - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_GOLEM - 1] = ANIM_ROTATE_UP_SLAM_DOWN, + [SPECIES_PONYTA - 1] = ANIM_GLOW_ORANGE, + [SPECIES_RAPIDASH - 1] = ANIM_CIRCULAR_VIBRATE, + [SPECIES_SLOWPOKE - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_SLOWBRO - 1] = ANIM_SWING_CONCAVE, + [SPECIES_MAGNEMITE - 1] = ANIM_TUMBLING_FRONT_FLIP_TWICE, + [SPECIES_MAGNETON - 1] = ANIM_FLASH_YELLOW, + [SPECIES_FARFETCHD - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_DODUO - 1] = ANIM_H_SHAKE_SLOW, + [SPECIES_DODRIO - 1] = ANIM_LUNGE_GROW, + [SPECIES_SEEL - 1] = ANIM_SWING_CONCAVE, + [SPECIES_DEWGONG - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_GRIMER - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_MUK - 1] = ANIM_DEEP_V_SQUISH_AND_BOUNCE, + [SPECIES_SHELLDER - 1] = ANIM_TWIST, + [SPECIES_CLOYSTER - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_GASTLY - 1] = ANIM_GLOW_BLACK, + [SPECIES_HAUNTER - 1] = ANIM_FLICKER_INCREASING, + [SPECIES_GENGAR - 1] = ANIM_GROW_IN_STAGES, + [SPECIES_ONIX - 1] = ANIM_RAPID_H_HOPS, + [SPECIES_DROWZEE - 1] = ANIM_CIRCLE_C_CLOCKWISE_SLOW, + [SPECIES_HYPNO - 1] = ANIM_GROW_VIBRATE, + [SPECIES_KRABBY - 1] = ANIM_H_SLIDE, + [SPECIES_KINGLER - 1] = ANIM_ZIGZAG_SLOW, + [SPECIES_VOLTORB - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_ELECTRODE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_EXEGGCUTE - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_EXEGGUTOR - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_CUBONE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_MAROWAK - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES, + [SPECIES_HITMONLEE - 1] = ANIM_H_STRETCH, + [SPECIES_HITMONCHAN - 1] = ANIM_GROW_VIBRATE, + [SPECIES_LICKITUNG - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_KOFFING - 1] = ANIM_SHRINK_GROW, + [SPECIES_WEEZING - 1] = ANIM_V_SLIDE, + [SPECIES_RHYHORN - 1] = ANIM_V_SHAKE, + [SPECIES_RHYDON - 1] = ANIM_SHRINK_GROW, + [SPECIES_CHANSEY - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_TANGELA - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_KANGASKHAN - 1] = ANIM_V_STRETCH, + [SPECIES_HORSEA - 1] = ANIM_TWIST, + [SPECIES_SEADRA - 1] = ANIM_V_SLIDE, + [SPECIES_GOLDEEN - 1] = ANIM_SWING_CONVEX, + [SPECIES_SEAKING - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_STARYU - 1] = ANIM_TWIST_TWICE, + [SPECIES_STARMIE - 1] = ANIM_TWIST, + [SPECIES_MR_MIME - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_SCYTHER - 1] = ANIM_H_VIBRATE, + [SPECIES_JYNX - 1] = ANIM_V_STRETCH, + [SPECIES_ELECTABUZZ - 1] = ANIM_FLASH_YELLOW, + [SPECIES_MAGMAR - 1] = ANIM_H_SHAKE, + [SPECIES_PINSIR - 1] = ANIM_GROW_VIBRATE, + [SPECIES_TAUROS - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_MAGIKARP - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES, + [SPECIES_GYARADOS - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL, + [SPECIES_LAPRAS - 1] = ANIM_V_STRETCH, + [SPECIES_DITTO - 1] = ANIM_CIRCULAR_STRETCH_TWICE, + [SPECIES_EEVEE - 1] = ANIM_V_STRETCH, + [SPECIES_VAPOREON - 1] = ANIM_V_STRETCH, + [SPECIES_JOLTEON - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_FLAREON - 1] = ANIM_V_STRETCH, + [SPECIES_PORYGON - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_OMANYTE - 1] = ANIM_V_SLIDE_WOBBLE_SMALL, + [SPECIES_OMASTAR - 1] = ANIM_GROW_VIBRATE, + [SPECIES_KABUTO - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_KABUTOPS - 1] = ANIM_H_SHAKE, + [SPECIES_AERODACTYL - 1] = ANIM_V_SLIDE_SLOW, + [SPECIES_SNORLAX - 1] = ANIM_SWING_CONCAVE, + [SPECIES_ARTICUNO - 1] = ANIM_GROW_VIBRATE, + [SPECIES_ZAPDOS - 1] = ANIM_FLASH_YELLOW, + [SPECIES_MOLTRES - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_DRATINI - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_DRAGONAIR - 1] = ANIM_V_SHAKE, + [SPECIES_DRAGONITE - 1] = ANIM_V_SLIDE_SLOW, + [SPECIES_MEWTWO - 1] = ANIM_GROW_VIBRATE, + [SPECIES_MEW - 1] = ANIM_SWING_CONVEX, + [SPECIES_CHIKORITA - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_BAYLEEF - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MEGANIUM - 1] = ANIM_V_STRETCH, + [SPECIES_CYNDAQUIL - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_QUILAVA - 1] = ANIM_V_STRETCH, + [SPECIES_TYPHLOSION - 1] = ANIM_V_SHAKE, + [SPECIES_TOTODILE - 1] = ANIM_H_JUMPS, + [SPECIES_CROCONAW - 1] = ANIM_H_SHAKE, + [SPECIES_FERALIGATR - 1] = ANIM_H_SHAKE, + [SPECIES_SENTRET - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_FURRET - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_HOOTHOOT - 1] = ANIM_V_SLIDE_SLOW, + [SPECIES_NOCTOWL - 1] = ANIM_V_STRETCH, + [SPECIES_LEDYBA - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_LEDIAN - 1] = ANIM_V_SLIDE_SLOW, + [SPECIES_SPINARAK - 1] = ANIM_CIRCLE_C_CLOCKWISE_SLOW, + [SPECIES_ARIADOS - 1] = ANIM_H_SHAKE, + [SPECIES_CROBAT - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_CHINCHOU - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_LANTURN - 1] = ANIM_V_SLIDE_WOBBLE_SMALL, + [SPECIES_PICHU - 1] = ANIM_V_JUMPS_BIG, + [SPECIES_CLEFFA - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_IGGLYBUFF - 1] = ANIM_SWING_CONCAVE_FAST, + [SPECIES_TOGEPI - 1] = ANIM_SWING_CONCAVE, + [SPECIES_TOGETIC - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_NATU - 1] = ANIM_H_JUMPS, + [SPECIES_XATU - 1] = ANIM_GROW_VIBRATE, + [SPECIES_MAREEP - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_FLAAFFY - 1] = ANIM_V_JUMPS_BIG, + [SPECIES_AMPHAROS - 1] = ANIM_FLASH_YELLOW, + [SPECIES_BELLOSSOM - 1] = ANIM_SWING_CONCAVE, + [SPECIES_MARILL - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_AZUMARILL - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW, + [SPECIES_SUDOWOODO - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_POLITOED - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_HOPPIP - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_SKIPLOOM - 1] = ANIM_RISING_WOBBLE, + [SPECIES_JUMPLUFF - 1] = ANIM_V_SLIDE_WOBBLE_SMALL, + [SPECIES_AIPOM - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_SUNKERN - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_SUNFLORA - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_YANMA - 1] = ANIM_FIGURE_8, + [SPECIES_WOOPER - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_QUAGSIRE - 1] = ANIM_H_STRETCH, + [SPECIES_ESPEON - 1] = ANIM_GROW_VIBRATE, + [SPECIES_UMBREON - 1] = ANIM_V_SHAKE, + [SPECIES_MURKROW - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SLOWKING - 1] = ANIM_SHRINK_GROW, + [SPECIES_MISDREAVUS - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_UNOWN - 1] = ANIM_ZIGZAG_FAST, + [SPECIES_WOBBUFFET - 1] = ANIM_DEEP_V_SQUISH_AND_BOUNCE, + [SPECIES_GIRAFARIG - 1] = ANIM_V_JUMPS_BIG, + [SPECIES_PINECO - 1] = ANIM_SWING_CONCAVE, + [SPECIES_FORRETRESS - 1] = ANIM_V_SHAKE, + [SPECIES_DUNSPARCE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_GLIGAR - 1] = ANIM_SHRINK_GROW, + [SPECIES_STEELIX - 1] = ANIM_H_SHAKE, + [SPECIES_SNUBBULL - 1] = ANIM_V_STRETCH, + [SPECIES_GRANBULL - 1] = ANIM_V_SHAKE, + [SPECIES_QWILFISH - 1] = ANIM_GROW_IN_STAGES, + [SPECIES_SCIZOR - 1] = ANIM_H_VIBRATE, + [SPECIES_SHUCKLE - 1] = ANIM_SWING_CONCAVE, + [SPECIES_HERACROSS - 1] = ANIM_LUNGE_GROW, + [SPECIES_SNEASEL - 1] = ANIM_H_STRETCH, + [SPECIES_TEDDIURSA - 1] = ANIM_V_STRETCH, + [SPECIES_URSARING - 1] = ANIM_V_SHAKE, + [SPECIES_SLUGMA - 1] = ANIM_V_STRETCH, + [SPECIES_MAGCARGO - 1] = ANIM_V_STRETCH, + [SPECIES_SWINUB - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_PILOSWINE - 1] = ANIM_H_SHAKE, + [SPECIES_CORSOLA - 1] = ANIM_H_SLIDE, + [SPECIES_REMORAID - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_OCTILLERY - 1] = ANIM_V_STRETCH, + [SPECIES_DELIBIRD - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_MANTINE - 1] = ANIM_SWING_CONVEX, + [SPECIES_SKARMORY - 1] = ANIM_V_STRETCH, + [SPECIES_HOUNDOUR - 1] = ANIM_V_STRETCH, + [SPECIES_HOUNDOOM - 1] = ANIM_V_SHAKE, + [SPECIES_KINGDRA - 1] = ANIM_CIRCLE_INTO_BG, + [SPECIES_PHANPY - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_DONPHAN - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_PORYGON2 - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_STANTLER - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SMEARGLE - 1] = ANIM_H_JUMPS, + [SPECIES_TYROGUE - 1] = ANIM_H_STRETCH, + [SPECIES_HITMONTOP - 1] = ANIM_H_VIBRATE, + [SPECIES_SMOOCHUM - 1] = ANIM_GROW_VIBRATE, + [SPECIES_ELEKID - 1] = ANIM_FLASH_YELLOW, + [SPECIES_MAGBY - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MILTANK - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_BLISSEY - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_RAIKOU - 1] = ANIM_FLASH_YELLOW, + [SPECIES_ENTEI - 1] = ANIM_GROW_VIBRATE, + [SPECIES_SUICUNE - 1] = ANIM_V_SHAKE, + [SPECIES_LARVITAR - 1] = ANIM_V_JUMPS_SMALL, + [SPECIES_PUPITAR - 1] = ANIM_V_SHAKE, + [SPECIES_TYRANITAR - 1] = ANIM_H_SHAKE, + [SPECIES_LUGIA - 1] = ANIM_GROW_IN_STAGES, + [SPECIES_HO_OH - 1] = ANIM_GROW_VIBRATE, + [SPECIES_CELEBI - 1] = ANIM_RISING_WOBBLE, + [SPECIES_TREECKO - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_GROVYLE - 1] = ANIM_V_STRETCH, + [SPECIES_SCEPTILE - 1] = ANIM_V_SHAKE, + [SPECIES_TORCHIC - 1] = ANIM_H_STRETCH, + [SPECIES_COMBUSKEN - 1] = ANIM_V_JUMPS_H_JUMPS, + [SPECIES_BLAZIKEN - 1] = ANIM_H_SHAKE, + [SPECIES_MUDKIP - 1] = ANIM_CIRCULAR_STRETCH_TWICE, + [SPECIES_MARSHTOMP - 1] = ANIM_V_SLIDE, + [SPECIES_SWAMPERT - 1] = ANIM_V_JUMPS_BIG, + [SPECIES_POOCHYENA - 1] = ANIM_V_SHAKE, + [SPECIES_MIGHTYENA - 1] = ANIM_V_SHAKE, + [SPECIES_ZIGZAGOON - 1] = ANIM_H_SLIDE, + [SPECIES_LINOONE - 1] = ANIM_GROW_VIBRATE, + [SPECIES_WURMPLE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SILCOON - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_BEAUTIFLY - 1] = ANIM_V_SLIDE, + [SPECIES_CASCOON - 1] = ANIM_V_SLIDE, + [SPECIES_DUSTOX - 1] = ANIM_V_JUMPS_H_JUMPS, + [SPECIES_LOTAD - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_LOMBRE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_LUDICOLO - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_SEEDOT - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES, + [SPECIES_NUZLEAF - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SHIFTRY - 1] = ANIM_H_VIBRATE, + [SPECIES_NINCADA - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_NINJASK - 1] = ANIM_H_SLIDE_SLOW, + [SPECIES_SHEDINJA - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_TAILLOW - 1] = ANIM_V_JUMPS_BIG, + [SPECIES_SWELLOW - 1] = ANIM_CIRCULAR_STRETCH_TWICE, + [SPECIES_SHROOMISH - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_BRELOOM - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SPINDA - 1] = ANIM_H_JUMPS, + [SPECIES_WINGULL - 1] = ANIM_H_PIVOT, + [SPECIES_PELIPPER - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_SURSKIT - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MASQUERAIN - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_WAILMER - 1] = ANIM_CIRCULAR_STRETCH_TWICE, + [SPECIES_WAILORD - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_SKITTY - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_DELCATTY - 1] = ANIM_V_STRETCH, + [SPECIES_KECLEON - 1] = ANIM_FLICKER_INCREASING, + [SPECIES_BALTOY - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_CLAYDOL - 1] = ANIM_V_SLIDE_WOBBLE_SMALL, + [SPECIES_NOSEPASS - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_TORKOAL - 1] = ANIM_V_STRETCH, + [SPECIES_SABLEYE - 1] = ANIM_GLOW_BLACK, + [SPECIES_BARBOACH - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_WHISCASH - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_LUVDISC - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_CORPHISH - 1] = ANIM_V_SHAKE, + [SPECIES_CRAWDAUNT - 1] = ANIM_GROW_VIBRATE, + [SPECIES_FEEBAS - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_MILOTIC - 1] = ANIM_GLOW_BLUE, + [SPECIES_CARVANHA - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_SHARPEDO - 1] = ANIM_H_JUMPS_V_STRETCH_TWICE, + [SPECIES_TRAPINCH - 1] = ANIM_V_SHAKE, + [SPECIES_VIBRAVA - 1] = ANIM_H_SHAKE, + [SPECIES_FLYGON - 1] = ANIM_ZIGZAG_SLOW, + [SPECIES_MAKUHITA - 1] = ANIM_SWING_CONCAVE, + [SPECIES_HARIYAMA - 1] = ANIM_ROTATE_UP_TO_SIDES, + [SPECIES_ELECTRIKE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MANECTRIC - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_NUMEL - 1] = ANIM_V_SLIDE, + [SPECIES_CAMERUPT - 1] = ANIM_V_SHAKE, + [SPECIES_SPHEAL - 1] = ANIM_SPIN, + [SPECIES_SEALEO - 1] = ANIM_V_STRETCH, + [SPECIES_WALREIN - 1] = ANIM_H_SHAKE, + [SPECIES_CACNEA - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_CACTURNE - 1] = ANIM_V_SLIDE, + [SPECIES_SNORUNT - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_GLALIE - 1] = ANIM_ZIGZAG_FAST, + [SPECIES_LUNATONE - 1] = ANIM_SWING_CONVEX_FAST, + [SPECIES_SOLROCK - 1] = ANIM_ROTATE_TO_SIDES_TWICE, + [SPECIES_AZURILL - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SPOINK - 1] = ANIM_H_JUMPS_V_STRETCH_TWICE, + [SPECIES_GRUMPIG - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_PLUSLE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MINUN - 1] = ANIM_CIRCULAR_STRETCH_TWICE, + [SPECIES_MAWILE - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_MEDITITE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES, + [SPECIES_MEDICHAM - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_SWABLU - 1] = ANIM_V_SLIDE, + [SPECIES_ALTARIA - 1] = ANIM_H_STRETCH, + [SPECIES_WYNAUT - 1] = ANIM_H_JUMPS_V_STRETCH, + [SPECIES_DUSKULL - 1] = ANIM_ZIGZAG_FAST, + [SPECIES_DUSCLOPS - 1] = ANIM_H_VIBRATE, + [SPECIES_ROSELIA - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_SLAKOTH - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_VIGOROTH - 1] = ANIM_H_JUMPS, + [SPECIES_SLAKING - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_GULPIN - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_SWALOT - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_TROPIUS - 1] = ANIM_V_SHAKE, + [SPECIES_WHISMUR - 1] = ANIM_H_SLIDE, + [SPECIES_LOUDRED - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW, + [SPECIES_EXPLOUD - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_CLAMPERL - 1] = ANIM_TWIST, + [SPECIES_HUNTAIL - 1] = ANIM_GROW_VIBRATE, + [SPECIES_GOREBYSS - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_ABSOL - 1] = ANIM_CIRCULAR_VIBRATE, + [SPECIES_SHUPPET - 1] = ANIM_V_SLIDE_WOBBLE, + [SPECIES_BANETTE - 1] = ANIM_SWING_CONVEX, + [SPECIES_SEVIPER - 1] = ANIM_V_STRETCH, + [SPECIES_ZANGOOSE - 1] = ANIM_GROW_VIBRATE, + [SPECIES_RELICANTH - 1] = ANIM_TIP_MOVE_FORWARD, + [SPECIES_ARON - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_LAIRON - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_AGGRON - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_CASTFORM - 1] = ANIM_H_SLIDE_WOBBLE, + [SPECIES_VOLBEAT - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_ILLUMISE - 1] = ANIM_BOUNCE_ROTATE_TO_SIDES, + [SPECIES_LILEEP - 1] = ANIM_V_STRETCH, + [SPECIES_CRADILY - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_ANORITH - 1] = ANIM_TWIST, + [SPECIES_ARMALDO - 1] = ANIM_V_SHAKE, + [SPECIES_RALTS - 1] = ANIM_V_SQUISH_AND_BOUNCE_SLOW, + [SPECIES_KIRLIA - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_GARDEVOIR - 1] = ANIM_V_SQUISH_AND_BOUNCE, + [SPECIES_BAGON - 1] = ANIM_V_SHAKE_TWICE, + [SPECIES_SHELGON - 1] = ANIM_V_SLIDE, + [SPECIES_SALAMENCE - 1] = ANIM_H_SHAKE, + [SPECIES_BELDUM - 1] = ANIM_H_SHAKE, + [SPECIES_METANG - 1] = ANIM_V_SLIDE, + [SPECIES_METAGROSS - 1] = ANIM_V_SHAKE, + [SPECIES_REGIROCK - 1] = ANIM_CIRCULAR_STRETCH_TWICE, + [SPECIES_REGICE - 1] = ANIM_FOUR_PETAL, + [SPECIES_REGISTEEL - 1] = ANIM_GROW_VIBRATE, + [SPECIES_KYOGRE - 1] = ANIM_SWING_CONCAVE_FAST_SHORT, + [SPECIES_GROUDON - 1] = ANIM_V_SHAKE, + [SPECIES_RAYQUAZA - 1] = ANIM_H_SHAKE, + [SPECIES_LATIAS - 1] = ANIM_SWING_CONCAVE_FAST_SHORT, + [SPECIES_LATIOS - 1] = ANIM_V_SHAKE, + [SPECIES_JIRACHI - 1] = ANIM_SWING_CONVEX, + [SPECIES_DEOXYS - 1] = ANIM_H_PIVOT, + [SPECIES_CHIMECHO - 1] = ANIM_H_SLIDE_WOBBLE, }; static const u8 sMonAnimationDelayTable[NUM_SPECIES - 1] = { - [SPECIES_BLASTOISE - 1] = 0x32, - [SPECIES_WEEDLE - 1] = 0x0a, - [SPECIES_KAKUNA - 1] = 0x14, - [SPECIES_BEEDRILL - 1] = 0x23, - [SPECIES_PIDGEOTTO - 1] = 0x19, - [SPECIES_FEAROW - 1] = 0x02, - [SPECIES_EKANS - 1] = 0x1e, - [SPECIES_NIDORAN_F - 1] = 0x1c, - [SPECIES_NIDOKING - 1] = 0x19, - [SPECIES_PARAS - 1] = 0x0a, - [SPECIES_PARASECT - 1] = 0x2d, - [SPECIES_VENONAT - 1] = 0x14, - [SPECIES_DIGLETT - 1] = 0x19, - [SPECIES_DUGTRIO - 1] = 0x23, - [SPECIES_MEOWTH - 1] = 0x28, - [SPECIES_PERSIAN - 1] = 0x14, - [SPECIES_MANKEY - 1] = 0x14, - [SPECIES_GROWLITHE - 1] = 0x1e, - [SPECIES_ARCANINE - 1] = 0x28, - [SPECIES_POLIWHIRL - 1] = 0x05, - [SPECIES_WEEPINBELL - 1] = 0x03, - [SPECIES_MUK - 1] = 0x2d, - [SPECIES_SHELLDER - 1] = 0x14, - [SPECIES_HAUNTER - 1] = 0x17, - [SPECIES_DROWZEE - 1] = 0x30, - [SPECIES_HYPNO - 1] = 0x28, - [SPECIES_HITMONCHAN - 1] = 0x19, - [SPECIES_SCYTHER - 1] = 0x0a, - [SPECIES_TAUROS - 1] = 0x0a, - [SPECIES_TYPHLOSION - 1] = 0x14, - [SPECIES_FERALIGATR - 1] = 0x05, - [SPECIES_NATU - 1] = 0x1e, - [SPECIES_MAREEP - 1] = 0x32, - [SPECIES_AMPHAROS - 1] = 0x0a, - [SPECIES_POLITOED - 1] = 0x28, - [SPECIES_DUNSPARCE - 1] = 0x0a, - [SPECIES_STEELIX - 1] = 0x2d, - [SPECIES_QWILFISH - 1] = 0x27, - [SPECIES_SCIZOR - 1] = 0x13, - [SPECIES_OCTILLERY - 1] = 0x14, - [SPECIES_SMOOCHUM - 1] = 0x28, - [SPECIES_TYRANITAR - 1] = 0x0a, - [SPECIES_LUGIA - 1] = 0x14, - [SPECIES_WAILORD - 1] = 0x0a, - [SPECIES_KECLEON - 1] = 0x1e, - [SPECIES_MILOTIC - 1] = 0x2d, - [SPECIES_SPHEAL - 1] = 0x0f, - [SPECIES_SNORUNT - 1] = 0x14, - [SPECIES_GRUMPIG - 1] = 0x0f, - [SPECIES_WYNAUT - 1] = 0x0f, - [SPECIES_DUSCLOPS - 1] = 0x1e, - [SPECIES_ABSOL - 1] = 0x2d, - [SPECIES_SALAMENCE - 1] = 0x46, - [SPECIES_KYOGRE - 1] = 0x3c, - [SPECIES_RAYQUAZA - 1] = 0x3c, + [SPECIES_BLASTOISE - 1] = 50, + [SPECIES_WEEDLE - 1] = 10, + [SPECIES_KAKUNA - 1] = 20, + [SPECIES_BEEDRILL - 1] = 35, + [SPECIES_PIDGEOTTO - 1] = 25, + [SPECIES_FEAROW - 1] = 2, + [SPECIES_EKANS - 1] = 30, + [SPECIES_NIDORAN_F - 1] = 28, + [SPECIES_NIDOKING - 1] = 25, + [SPECIES_PARAS - 1] = 10, + [SPECIES_PARASECT - 1] = 45, + [SPECIES_VENONAT - 1] = 20, + [SPECIES_DIGLETT - 1] = 25, + [SPECIES_DUGTRIO - 1] = 35, + [SPECIES_MEOWTH - 1] = 40, + [SPECIES_PERSIAN - 1] = 20, + [SPECIES_MANKEY - 1] = 20, + [SPECIES_GROWLITHE - 1] = 30, + [SPECIES_ARCANINE - 1] = 40, + [SPECIES_POLIWHIRL - 1] = 5, + [SPECIES_WEEPINBELL - 1] = 3, + [SPECIES_MUK - 1] = 45, + [SPECIES_SHELLDER - 1] = 20, + [SPECIES_HAUNTER - 1] = 23, + [SPECIES_DROWZEE - 1] = 48, + [SPECIES_HYPNO - 1] = 40, + [SPECIES_HITMONCHAN - 1] = 25, + [SPECIES_SCYTHER - 1] = 10, + [SPECIES_TAUROS - 1] = 10, + [SPECIES_TYPHLOSION - 1] = 20, + [SPECIES_FERALIGATR - 1] = 5, + [SPECIES_NATU - 1] = 30, + [SPECIES_MAREEP - 1] = 50, + [SPECIES_AMPHAROS - 1] = 10, + [SPECIES_POLITOED - 1] = 40, + [SPECIES_DUNSPARCE - 1] = 10, + [SPECIES_STEELIX - 1] = 45, + [SPECIES_QWILFISH - 1] = 39, + [SPECIES_SCIZOR - 1] = 19, + [SPECIES_OCTILLERY - 1] = 20, + [SPECIES_SMOOCHUM - 1] = 40, + [SPECIES_TYRANITAR - 1] = 10, + [SPECIES_LUGIA - 1] = 20, + [SPECIES_WAILORD - 1] = 10, + [SPECIES_KECLEON - 1] = 30, + [SPECIES_MILOTIC - 1] = 45, + [SPECIES_SPHEAL - 1] = 15, + [SPECIES_SNORUNT - 1] = 20, + [SPECIES_GRUMPIG - 1] = 15, + [SPECIES_WYNAUT - 1] = 15, + [SPECIES_DUSCLOPS - 1] = 30, + [SPECIES_ABSOL - 1] = 45, + [SPECIES_SALAMENCE - 1] = 70, + [SPECIES_KYOGRE - 1] = 60, + [SPECIES_RAYQUAZA - 1] = 60, }; const u8 gPPUpGetMask[] = {0x03, 0x0c, 0x30, 0xc0}; // Masks for getting PP Up count, also PP Max values @@ -1937,119 +1912,119 @@ static const u8 sHoldEffectToType[][2] = {HOLD_EFFECT_NORMAL_POWER, TYPE_NORMAL}, }; -const struct SpriteTemplate gUnknown_08329D98[MAX_BATTLERS_COUNT] = +const struct SpriteTemplate gBattlerSpriteTemplates[MAX_BATTLERS_COUNT] = { - { // B_POSITION_PLAYER_LEFT + [B_POSITION_PLAYER_LEFT] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, - .images = gUnknown_082FF3A8, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .images = gBattlerPicTable_PlayerLeft, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { // B_POSITION_OPPONENT_LEFT + [B_POSITION_OPPONENT_LEFT] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACA8, + .oam = &gOamData_BattleSpriteOpponentSide, .anims = NULL, - .images = gUnknown_082FF3C8, - .affineAnims = gUnknown_082FF694, + .images = gBattlerPicTable_OpponentLeft, + .affineAnims = gAffineAnims_BattleSpriteOpponentSide, .callback = SpriteCb_WildMon, }, - { // B_POSITION_PLAYER_RIGHT + [B_POSITION_PLAYER_RIGHT] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, - .images = gUnknown_082FF3E8, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .images = gBattlerPicTable_PlayerRight, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { // B_POSITION_OPPONENT_RIGHT + [B_POSITION_OPPONENT_RIGHT] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACA8, + .oam = &gOamData_BattleSpriteOpponentSide, .anims = NULL, - .images = gUnknown_082FF408, - .affineAnims = gUnknown_082FF694, + .images = gBattlerPicTable_OpponentRight, + .affineAnims = gAffineAnims_BattleSpriteOpponentSide, .callback = SpriteCb_WildMon }, }; -static const struct SpriteTemplate gSpriteTemplateTable_TrainerBackSprites[] = +static const struct SpriteTemplate sTrainerBackSpriteTemplates[] = { - { + [TRAINER_BACK_PIC_BRENDAN] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_Brendan, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_MAY] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_May, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_RED] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_Red, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_LEAF] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_Leaf, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_RubySapphireBrendan, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_RUBY_SAPPHIRE_MAY] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_RubySapphireMay, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_WALLY] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_Wally, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, - { + [TRAINER_BACK_PIC_STEVEN] = { .tileTag = 0xFFFF, .paletteTag = 0, - .oam = &gOamData_831ACB0, + .oam = &gOamData_BattleSpritePlayerSide, .anims = NULL, .images = gTrainerBackPicTable_Steven, - .affineAnims = gUnknown_082FF618, - .callback = sub_8039BB4, + .affineAnims = gAffineAnims_BattleSpritePlayerSide, + .callback = SpriteCB_BattleSpriteStartSlideLeft, }, }; @@ -2247,7 +2222,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_POKEBALL, &value); SetBoxMonData(boxMon, MON_DATA_OT_GENDER, &gSaveBlock2Ptr->playerGender); - if (fixedIV < 32) + if (fixedIV < USE_RANDOM_IVS) { SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); @@ -2261,20 +2236,20 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, u32 iv; value = Random(); - iv = value & 0x1F; + iv = value & MAX_IV_MASK; SetBoxMonData(boxMon, MON_DATA_HP_IV, &iv); - iv = (value & 0x3E0) >> 5; + iv = (value & (MAX_IV_MASK << 5)) >> 5; SetBoxMonData(boxMon, MON_DATA_ATK_IV, &iv); - iv = (value & 0x7C00) >> 10; + iv = (value & (MAX_IV_MASK << 10)) >> 10; SetBoxMonData(boxMon, MON_DATA_DEF_IV, &iv); value = Random(); - iv = value & 0x1F; + iv = value & MAX_IV_MASK; SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); - iv = (value & 0x3E0) >> 5; + iv = (value & (MAX_IV_MASK << 5)) >> 5; SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); - iv = (value & 0x7C00) >> 10; + iv = (value & (MAX_IV_MASK << 10)) >> 10; SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &iv); } @@ -2304,14 +2279,14 @@ void CreateMonWithGenderNatureLetter(struct Pokemon *mon, u16 species, u8 level, { u32 personality; - if ((u8)(unownLetter - 1) < 28) + if ((u8)(unownLetter - 1) < NUM_UNOWN_FORMS) { u16 actualLetter; do { personality = Random32(); - actualLetter = ((((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 28); + actualLetter = GET_UNOWN_LETTER(personality); } while (nature != GetNatureFromPersonality(personality) || gender != GetGenderFromSpeciesAndPersonality(species, personality) @@ -2342,7 +2317,7 @@ void CreateMaleMon(struct Pokemon *mon, u16 species, u8 level) personality = Random32(); } while (GetGenderFromSpeciesAndPersonality(species, personality) != MON_MALE); - CreateMon(mon, species, level, 32, 1, personality, OT_ID_PRESET, otId); + CreateMon(mon, species, level, USE_RANDOM_IVS, 1, personality, OT_ID_PRESET, otId); } void CreateMonWithIVsPersonality(struct Pokemon *mon, u16 species, u8 level, u32 ivs, u32 personality) @@ -2524,7 +2499,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m CreateMon(mon, src->party[monId].species, GetFrontierEnemyMonLevel(src->lvlMode - 1), - 0x1F, + MAX_PER_STAT_IVS, TRUE, personality, OT_ID_PRESET, @@ -2578,7 +2553,7 @@ void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, CalculateMonStats(mon); } -void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest) +void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest) { s32 i; u16 heldItem; @@ -2587,7 +2562,7 @@ void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest) heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) - heldItem = 0; + heldItem = ITEM_NONE; dest->heldItem = heldItem; @@ -2615,22 +2590,23 @@ void sub_80686FC(struct Pokemon *mon, struct BattleTowerPokemon *dest) GetMonData(mon, MON_DATA_NICKNAME, dest->nickname); } -void CreateObedientMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) +void CreateEventLegalMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedIV, u8 hasFixedPersonality, u32 fixedPersonality, u8 otIdType, u32 fixedOtId) { - bool32 obedient = TRUE; + bool32 isEventLegal = TRUE; CreateMon(mon, species, level, fixedIV, hasFixedPersonality, fixedPersonality, otIdType, fixedOtId); - SetMonData(mon, MON_DATA_OBEDIENCE, &obedient); + SetMonData(mon, MON_DATA_EVENT_LEGAL, &isEventLegal); } -bool8 sub_80688F8(u8 caseId, u8 battlerId) +// If FALSE, should load this game's Deoxys form. If TRUE, should load normal Deoxys form +bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) { switch (caseId) { case 0: default: return FALSE; - case 1: + case 1: // Player's side in battle if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) @@ -2640,7 +2616,7 @@ bool8 sub_80688F8(u8 caseId, u8 battlerId) break; case 2: break; - case 3: + case 3: // Summary Screen if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) return FALSE; if (!gMain.inBattle) @@ -2650,7 +2626,7 @@ bool8 sub_80688F8(u8 caseId, u8 battlerId) return FALSE; case 4: break; - case 5: + case 5: // In move animation, e.g. in Role Play or Snatch if (gBattleTypeFlags & BATTLE_TYPE_LINK) { if (!gMain.inBattle) @@ -2685,7 +2661,7 @@ static u16 GetDeoxysStat(struct Pokemon *mon, s32 statId) u16 statValue = 0; u8 nature; - if (gBattleTypeFlags & BATTLE_TYPE_20 || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) + if (gBattleTypeFlags & BATTLE_TYPE_LINK_IN_BATTLE || GetMonData(mon, MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS) return 0; ivVal = GetMonData(mon, MON_DATA_HP_IV + statId, NULL); @@ -2729,8 +2705,8 @@ u16 GetUnionRoomTrainerPic(void) u8 linkId; u32 arrId; - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - linkId = gUnknown_0203C7B4 ^ 1; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + linkId = gRecordedBattleMultiplayerId ^ 1; else linkId = GetMultiplayerId() ^ 1; @@ -2744,8 +2720,8 @@ u16 GetUnionRoomTrainerClass(void) u8 linkId; u32 arrId; - if (gBattleTypeFlags & BATTLE_TYPE_x2000000) - linkId = gUnknown_0203C7B4 ^ 1; + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) + linkId = gRecordedBattleMultiplayerId ^ 1; else linkId = GetMultiplayerId() ^ 1; @@ -2754,14 +2730,14 @@ u16 GetUnionRoomTrainerClass(void) return gFacilityClassToTrainerClass[gLinkPlayerFacilityClasses[arrId]]; } -void CreateObedientEnemyMon(void) +void CreateEventLegalEnemyMon(void) { s32 species = gSpecialVar_0x8004; s32 level = gSpecialVar_0x8005; s32 itemId = gSpecialVar_0x8006; ZeroEnemyPartyMons(); - CreateObedientMon(&gEnemyParty[0], species, level, 32, 0, 0, 0, 0); + CreateEventLegalMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, 0, 0, 0, 0); if (itemId) { u8 heldItem[2]; @@ -2859,13 +2835,14 @@ void CalculateMonStats(struct Pokemon *mon) { if (currentHP == 0 && oldMaxHP == 0) currentHP = newMaxHP; - else if (currentHP != 0) + else if (currentHP != 0) { // BUG: currentHP is unintentionally able to become <= 0 after the instruction below. This causes the pomeg berry glitch. currentHP += newMaxHP - oldMaxHP; #ifdef BUGFIX if (currentHP <= 0) currentHP = 1; #endif + } else return; } @@ -2991,7 +2968,7 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { - u32 retVal = 0; + u32 retVal = MOVE_NONE; u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); u8 level = GetMonData(mon, MON_DATA_LEVEL, NULL); @@ -3007,7 +2984,7 @@ u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) { sLearningMoveTableID++; if (gLevelUpLearnsets[species][sLearningMoveTableID] == LEVEL_UP_END) - return 0; + return MOVE_NONE; } } @@ -3366,7 +3343,7 @@ u8 CountAliveMonsInBattle(u8 caseId) static bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) { - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) return FALSE; else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) return FALSE; @@ -3453,11 +3430,11 @@ void SetMultiuseSpriteTemplateToPokemon(u16 speciesTag, u8 battlerPosition) else if (gUnknown_020249B4[1]) gMultiuseSpriteTemplate = gUnknown_020249B4[1]->templates[battlerPosition]; else - gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition]; + gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; gMultiuseSpriteTemplate.paletteTag = speciesTag; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) - gMultiuseSpriteTemplate.anims = gUnknown_082FF70C; + gMultiuseSpriteTemplate.anims = gAnims_MonPic; else if (speciesTag > SPECIES_SHINY_TAG) gMultiuseSpriteTemplate.anims = gMonFrontAnimsPtrTable[speciesTag - SPECIES_SHINY_TAG]; else @@ -3469,7 +3446,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosit gMultiuseSpriteTemplate.paletteTag = trainerSpriteId; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) { - gMultiuseSpriteTemplate = gSpriteTemplateTable_TrainerBackSprites[trainerSpriteId]; + gMultiuseSpriteTemplate = sTrainerBackSpriteTemplates[trainerSpriteId]; gMultiuseSpriteTemplate.anims = gTrainerBackAnimsPtrTable[trainerSpriteId]; } else @@ -3477,7 +3454,7 @@ void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosit if (gMonSpritesGfxPtr != NULL) gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else - gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition]; + gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; gMultiuseSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[trainerSpriteId]; } } @@ -3487,7 +3464,7 @@ void SetMultiuseSpriteTemplateToTrainerFront(u16 arg0, u8 battlerPosition) if (gMonSpritesGfxPtr != NULL) gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else - gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition]; + gMultiuseSpriteTemplate = gBattlerSpriteTemplates[battlerPosition]; gMultiuseSpriteTemplate.paletteTag = arg0; gMultiuseSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[arg0]; @@ -3905,32 +3882,32 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_EFFORT_RIBBON: retVal = substruct3->effortRibbon; break; - case MON_DATA_GIFT_RIBBON_1: - retVal = substruct3->giftRibbon1; + case MON_DATA_MARINE_RIBBON: + retVal = substruct3->marineRibbon; break; - case MON_DATA_GIFT_RIBBON_2: - retVal = substruct3->giftRibbon2; + case MON_DATA_LAND_RIBBON: + retVal = substruct3->landRibbon; break; - case MON_DATA_GIFT_RIBBON_3: - retVal = substruct3->giftRibbon3; + case MON_DATA_SKY_RIBBON: + retVal = substruct3->skyRibbon; break; - case MON_DATA_GIFT_RIBBON_4: - retVal = substruct3->giftRibbon4; + case MON_DATA_COUNTRY_RIBBON: + retVal = substruct3->countryRibbon; break; - case MON_DATA_GIFT_RIBBON_5: - retVal = substruct3->giftRibbon5; + case MON_DATA_NATIONAL_RIBBON: + retVal = substruct3->nationalRibbon; break; - case MON_DATA_GIFT_RIBBON_6: - retVal = substruct3->giftRibbon6; + case MON_DATA_EARTH_RIBBON: + retVal = substruct3->earthRibbon; break; - case MON_DATA_GIFT_RIBBON_7: - retVal = substruct3->giftRibbon7; + case MON_DATA_WORLD_RIBBON: + retVal = substruct3->worldRibbon; break; - case MON_DATA_FATEFUL_ENCOUNTER: - retVal = substruct3->fatefulEncounter; + case MON_DATA_UNUSED_RIBBONS: + retVal = substruct3->unusedRibbons; break; - case MON_DATA_OBEDIENCE: - retVal = substruct3->obedient; + case MON_DATA_EVENT_LEGAL: + retVal = substruct3->eventLegal; break; case MON_DATA_SPECIES2: retVal = substruct0->species; @@ -3950,9 +3927,9 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) { u16 move = moves[i]; if (substruct1->moves[0] == move - || substruct1->moves[1] == move - || substruct1->moves[2] == move - || substruct1->moves[3] == move) + || substruct1->moves[1] == move + || substruct1->moves[2] == move + || substruct1->moves[3] == move) retVal |= gBitTable[i]; i++; } @@ -3972,13 +3949,13 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) retVal += substruct3->victoryRibbon; retVal += substruct3->artistRibbon; retVal += substruct3->effortRibbon; - retVal += substruct3->giftRibbon1; - retVal += substruct3->giftRibbon2; - retVal += substruct3->giftRibbon3; - retVal += substruct3->giftRibbon4; - retVal += substruct3->giftRibbon5; - retVal += substruct3->giftRibbon6; - retVal += substruct3->giftRibbon7; + retVal += substruct3->marineRibbon; + retVal += substruct3->landRibbon; + retVal += substruct3->skyRibbon; + retVal += substruct3->countryRibbon; + retVal += substruct3->nationalRibbon; + retVal += substruct3->earthRibbon; + retVal += substruct3->worldRibbon; } break; case MON_DATA_RIBBONS: @@ -3995,13 +3972,13 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) | (substruct3->victoryRibbon << 17) | (substruct3->artistRibbon << 18) | (substruct3->effortRibbon << 19) - | (substruct3->giftRibbon1 << 20) - | (substruct3->giftRibbon2 << 21) - | (substruct3->giftRibbon3 << 22) - | (substruct3->giftRibbon4 << 23) - | (substruct3->giftRibbon5 << 24) - | (substruct3->giftRibbon6 << 25) - | (substruct3->giftRibbon7 << 26); + | (substruct3->marineRibbon << 20) + | (substruct3->landRibbon << 21) + | (substruct3->skyRibbon << 22) + | (substruct3->countryRibbon << 23) + | (substruct3->nationalRibbon << 24) + | (substruct3->earthRibbon << 25) + | (substruct3->worldRibbon << 26); } break; default: @@ -4284,42 +4261,42 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_EFFORT_RIBBON: SET8(substruct3->effortRibbon); break; - case MON_DATA_GIFT_RIBBON_1: - SET8(substruct3->giftRibbon1); + case MON_DATA_MARINE_RIBBON: + SET8(substruct3->marineRibbon); break; - case MON_DATA_GIFT_RIBBON_2: - SET8(substruct3->giftRibbon2); + case MON_DATA_LAND_RIBBON: + SET8(substruct3->landRibbon); break; - case MON_DATA_GIFT_RIBBON_3: - SET8(substruct3->giftRibbon3); + case MON_DATA_SKY_RIBBON: + SET8(substruct3->skyRibbon); break; - case MON_DATA_GIFT_RIBBON_4: - SET8(substruct3->giftRibbon4); + case MON_DATA_COUNTRY_RIBBON: + SET8(substruct3->countryRibbon); break; - case MON_DATA_GIFT_RIBBON_5: - SET8(substruct3->giftRibbon5); + case MON_DATA_NATIONAL_RIBBON: + SET8(substruct3->nationalRibbon); break; - case MON_DATA_GIFT_RIBBON_6: - SET8(substruct3->giftRibbon6); + case MON_DATA_EARTH_RIBBON: + SET8(substruct3->earthRibbon); break; - case MON_DATA_GIFT_RIBBON_7: - SET8(substruct3->giftRibbon7); + case MON_DATA_WORLD_RIBBON: + SET8(substruct3->worldRibbon); break; - case MON_DATA_FATEFUL_ENCOUNTER: - SET8(substruct3->fatefulEncounter); + case MON_DATA_UNUSED_RIBBONS: + SET8(substruct3->unusedRibbons); break; - case MON_DATA_OBEDIENCE: - SET8(substruct3->obedient); + case MON_DATA_EVENT_LEGAL: + SET8(substruct3->eventLegal); break; case MON_DATA_IVS: { u32 ivs = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24); - substruct3->hpIV = ivs & 0x1F; - substruct3->attackIV = (ivs >> 5) & 0x1F; - substruct3->defenseIV = (ivs >> 10) & 0x1F; - substruct3->speedIV = (ivs >> 15) & 0x1F; - substruct3->spAttackIV = (ivs >> 20) & 0x1F; - substruct3->spDefenseIV = (ivs >> 25) & 0x1F; + substruct3->hpIV = ivs & MAX_IV_MASK; + substruct3->attackIV = (ivs >> 5) & MAX_IV_MASK; + substruct3->defenseIV = (ivs >> 10) & MAX_IV_MASK; + substruct3->speedIV = (ivs >> 15) & MAX_IV_MASK; + substruct3->spAttackIV = (ivs >> 20) & MAX_IV_MASK; + substruct3->spDefenseIV = (ivs >> 25) & MAX_IV_MASK; break; } default: @@ -4638,30 +4615,56 @@ void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) { - return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, 0); -} - -bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e) + return PokemonUseItemEffects(mon, item, partyIndex, moveIndex, FALSE); +} + +#define UPDATE_FRIENDSHIP_FROM_ITEM \ +{ \ + if ((retVal == 0 || friendshipOnly) && !ShouldSkipFriendshipChange() && friendshipChange == 0) \ + { \ + friendshipChange = itemEffect[itemEffectParam]; \ + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); \ + if (friendshipChange > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) \ + friendship += 150 * friendshipChange / 100; \ + else \ + friendship += friendshipChange; \ + if (friendshipChange > 0) \ + { \ + if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) \ + friendship++; \ + if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) \ + friendship++; \ + } \ + if (friendship < 0) \ + friendship = 0; \ + if (friendship > MAX_FRIENDSHIP) \ + friendship = MAX_FRIENDSHIP; \ + SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); \ + retVal = FALSE; \ + } \ +} + +// Returns TRUE if the item has no effect on the Pokémon, FALSE otherwise +bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI) { u32 dataUnsigned; s32 dataSigned; s32 friendship; - s32 cmdIndex; + s32 i; bool8 retVal = TRUE; const u8 *itemEffect; - u8 var_3C = 6; - u32 var_38; - s8 var_34 = 0; + u8 itemEffectParam = ITEM_EFFECT_ARG_START; + u32 temp1, temp2; + s8 friendshipChange = 0; u8 holdEffect; - u8 battlerId = 4; - u32 var_28 = 0; + u8 battlerId = MAX_BATTLERS_COUNT; + u32 friendshipOnly = FALSE; u16 heldItem; - u8 r10; - u32 r4; - u32 r5; - s8 r2; + u8 effectFlags; + s8 evChange; u16 evCount; + // Get item hold effect heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, NULL); if (heldItem == ITEM_ENIGMA_BERRY) { @@ -4675,19 +4678,20 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov holdEffect = ItemId_GetHoldEffect(heldItem); } + // Get battler id (if relevant) gPotentialItemEffectBattler = gBattlerInMenuId; if (gMain.inBattle) { gActiveBattler = gBattlerInMenuId; - cmdIndex = (GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER); - while (cmdIndex < gBattlersCount) + i = (GetBattlerSide(gActiveBattler) != B_SIDE_PLAYER); + while (i < gBattlersCount) { - if (gBattlerPartyIndexes[cmdIndex] == partyIndex) + if (gBattlerPartyIndexes[i] == partyIndex) { - battlerId = cmdIndex; + battlerId = i; break; } - cmdIndex += 2; + i += 2; } } else @@ -4696,11 +4700,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov battlerId = MAX_BATTLERS_COUNT; } + // Skip using the item if it won't do anything if (!ITEM_HAS_EFFECT(item)) return TRUE; if (gItemEffectTable[item - ITEM_POTION] == NULL && item != ITEM_ENIGMA_BERRY) return TRUE; + // Get item effect if (item == ITEM_ENIGMA_BERRY) { if (gMain.inBattle) @@ -4713,79 +4719,98 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov itemEffect = gItemEffectTable[item - ITEM_POTION]; } - for (cmdIndex = 0; cmdIndex < 6; cmdIndex++) + // Do item effect + for (i = 0; i < ITEM_EFFECT_ARG_START; i++) { - switch (cmdIndex) + switch (i) { - // infatuation heal, x attack, sacred ash and dire hit + + // Handle ITEM0 effects (infatuation, Dire Hit, X Attack). ITEM0_SACRED_ASH is handled in party_menu.c case 0: - if ((itemEffect[cmdIndex] & ITEM0_INFATUATION) + // Cure infatuation + if ((itemEffect[i] & ITEM0_INFATUATION) && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)) { gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM0_DIRE_HIT) + + // Dire Hit + if ((itemEffect[i] & ITEM0_DIRE_HIT) && !(gBattleMons[gActiveBattler].status2 & STATUS2_FOCUS_ENERGY)) { gBattleMons[gActiveBattler].status2 |= STATUS2_FOCUS_ENERGY; retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM0_X_ATTACK) + + // X Attack + if ((itemEffect[i] & ITEM0_X_ATTACK) && gBattleMons[gActiveBattler].statStages[STAT_ATK] < MAX_STAT_STAGE) { - gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[cmdIndex] & ITEM0_X_ATTACK; + gBattleMons[gActiveBattler].statStages[STAT_ATK] += itemEffect[i] & ITEM0_X_ATTACK; if (gBattleMons[gActiveBattler].statStages[STAT_ATK] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_ATK] = MAX_STAT_STAGE; retVal = FALSE; } break; - // in-battle stat boosting effects + + // Handle ITEM1 effects (in-battle stat boosting effects) case 1: - if ((itemEffect[cmdIndex] & ITEM1_X_DEFEND) + // X Defend + if ((itemEffect[i] & ITEM1_X_DEFEND) && gBattleMons[gActiveBattler].statStages[STAT_DEF] < MAX_STAT_STAGE) { - gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[cmdIndex] & ITEM1_X_DEFEND) >> 4; + gBattleMons[gActiveBattler].statStages[STAT_DEF] += (itemEffect[i] & ITEM1_X_DEFEND) >> 4; if (gBattleMons[gActiveBattler].statStages[STAT_DEF] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_DEF] = MAX_STAT_STAGE; retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM1_X_SPEED) + + // X Speed + if ((itemEffect[i] & ITEM1_X_SPEED) && gBattleMons[gActiveBattler].statStages[STAT_SPEED] < MAX_STAT_STAGE) { - gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[cmdIndex] & ITEM1_X_SPEED; + gBattleMons[gActiveBattler].statStages[STAT_SPEED] += itemEffect[i] & ITEM1_X_SPEED; if (gBattleMons[gActiveBattler].statStages[STAT_SPEED] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_SPEED] = MAX_STAT_STAGE; retVal = FALSE; } break; - // more stat boosting effects + // Handle ITEM2 effects (more stat boosting effects) case 2: - if ((itemEffect[cmdIndex] & ITEM2_X_ACCURACY) + // X Accuracy + if ((itemEffect[i] & ITEM2_X_ACCURACY) && gBattleMons[gActiveBattler].statStages[STAT_ACC] < MAX_STAT_STAGE) { - gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[cmdIndex] & ITEM2_X_ACCURACY) >> 4; + gBattleMons[gActiveBattler].statStages[STAT_ACC] += (itemEffect[i] & ITEM2_X_ACCURACY) >> 4; if (gBattleMons[gActiveBattler].statStages[STAT_ACC] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_ACC] = MAX_STAT_STAGE; retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM2_X_SPATK) + + // X Sp Attack + if ((itemEffect[i] & ITEM2_X_SPATK) && gBattleMons[gActiveBattler].statStages[STAT_SPATK] < MAX_STAT_STAGE) { - gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[cmdIndex] & ITEM2_X_SPATK; + gBattleMons[gActiveBattler].statStages[STAT_SPATK] += itemEffect[i] & ITEM2_X_SPATK; if (gBattleMons[gActiveBattler].statStages[STAT_SPATK] > MAX_STAT_STAGE) gBattleMons[gActiveBattler].statStages[STAT_SPATK] = MAX_STAT_STAGE; retVal = FALSE; } break; + + // Handle ITEM3 effects (Guard Spec, Rare Candy, cure status) case 3: - if ((itemEffect[cmdIndex] & ITEM3_GUARD_SPEC) + // Guard Spec + if ((itemEffect[i] & ITEM3_GUARD_SPEC) && gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer == 0) { gSideTimers[GetBattlerSide(gActiveBattler)].mistTimer = 5; retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM3_LEVEL_UP) + + // Rare Candy + if ((itemEffect[i] & ITEM3_LEVEL_UP) && GetMonData(mon, MON_DATA_LEVEL, NULL) != MAX_LEVEL) { dataUnsigned = gExperienceTables[gBaseStats[GetMonData(mon, MON_DATA_SPECIES, NULL)].growthRate][GetMonData(mon, MON_DATA_LEVEL, NULL) + 1]; @@ -4793,106 +4818,120 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov CalculateMonStats(mon); retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM3_SLEEP) - && HealStatusConditions(mon, partyIndex, 7, battlerId) == 0) + + // Cure status + if ((itemEffect[i] & ITEM3_SLEEP) + && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battlerId) == 0) { - if (battlerId != 4) + if (battlerId != MAX_BATTLERS_COUNT) gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; retVal = FALSE; } - if ((itemEffect[cmdIndex] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId) == 0) + if ((itemEffect[i] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battlerId) == 0) + if ((itemEffect[i] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battlerId) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battlerId) == 0) + if ((itemEffect[i] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battlerId) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battlerId) == 0) + if ((itemEffect[i] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battlerId) == 0) retVal = FALSE; - if ((itemEffect[cmdIndex] & ITEM3_CONFUSION) // heal confusion + if ((itemEffect[i] & ITEM3_CONFUSION) // heal confusion && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)) { gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; retVal = FALSE; } break; - // EV, HP, and PP raising effects + + // Handle ITEM4 effects (Change HP/Atk EVs, HP heal, PP heal, PP up, Revive, and evolution stones) case 4: - r10 = itemEffect[cmdIndex]; - if (r10 & ITEM4_PP_UP) + effectFlags = itemEffect[i]; + + // PP Up + if (effectFlags & ITEM4_PP_UP) { - r10 &= ~ITEM4_PP_UP; + effectFlags &= ~ITEM4_PP_UP; dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - var_38 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); - if (dataUnsigned <= 2 && var_38 > 4) + temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (dataUnsigned <= 2 && temp1 > 4) { dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gPPUpAddMask[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned); - dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - var_38; + dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - temp1; dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + dataUnsigned; SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); retVal = FALSE; } } - var_38 = 0; - while (r10 != 0) + temp1 = 0; + + // Loop through and try each of the remaining ITEM4 effects + while (effectFlags != 0) { - if (r10 & 1) + if (effectFlags & 1) { - switch (var_38) + switch (temp1) { - case 0: - case 1: - // ev raise + case 0: // ITEM4_EV_HP + case 1: // ITEM4_EV_ATK evCount = GetMonEVCount(mon); - r5 = itemEffect[var_3C]; - dataSigned = GetMonData(mon, sGetMonDataEVConstants[var_38], NULL); - r2 = r5; - if (r2 > 0) + temp2 = itemEffect[itemEffectParam]; + dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1], NULL); + evChange = temp2; + + if (evChange > 0) // Increasing EV (HP or Atk) { + // Has EV increase limit already been reached? if (evCount >= MAX_TOTAL_EVS) return TRUE; if (dataSigned >= EV_ITEM_RAISE_LIMIT) break; - if (dataSigned + r2 > EV_ITEM_RAISE_LIMIT) - r5 = EV_ITEM_RAISE_LIMIT - (dataSigned + r2) + r2; + // Limit the increase + if (dataSigned + evChange > EV_ITEM_RAISE_LIMIT) + temp2 = EV_ITEM_RAISE_LIMIT - (dataSigned + evChange) + evChange; else - r5 = r2; + temp2 = evChange; - if (evCount + r5 > MAX_TOTAL_EVS) - r5 += MAX_TOTAL_EVS - (evCount + r5); - dataSigned += r5; + if (evCount + temp2 > MAX_TOTAL_EVS) + temp2 += MAX_TOTAL_EVS - (evCount + temp2); + + dataSigned += temp2; } - else + else // Decreasing EV (HP or Atk) { if (dataSigned == 0) { - var_28 = 1; - var_3C++; + // No EVs to lose, but make sure friendship updates anyway + friendshipOnly = TRUE; + itemEffectParam++; break; } - dataSigned += r2; + dataSigned += evChange; if (dataSigned < 0) dataSigned = 0; } - SetMonData(mon, sGetMonDataEVConstants[var_38], &dataSigned); + + // Update EVs and stats + SetMonData(mon, sGetMonDataEVConstants[temp1], &dataSigned); CalculateMonStats(mon); - var_3C++; + itemEffectParam++; retVal = FALSE; break; - case 2: - // revive - if (r10 & 0x10) + + case 2: // ITEM4_HEAL_HP + // If Revive, update number of times revive has been used + if (effectFlags & (ITEM4_REVIVE >> 2)) { if (GetMonData(mon, MON_DATA_HP, NULL) != 0) { - var_3C++; + itemEffectParam++; break; } if (gMain.inBattle) { - if (battlerId != 4) + if (battlerId != MAX_BATTLERS_COUNT) { gAbsentBattlerFlags &= ~gBitTable[battlerId]; CopyPlayerPartyMonToBattleData(battlerId, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battlerId])); @@ -4911,48 +4950,53 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { if (GetMonData(mon, MON_DATA_HP, NULL) == 0) { - var_3C++; + itemEffectParam++; break; } } // Get amount of HP to restore - dataUnsigned = itemEffect[var_3C++]; + dataUnsigned = itemEffect[itemEffectParam++]; switch (dataUnsigned) { - case ITEM6_HEAL_FULL: + case ITEM6_HEAL_HP_FULL: dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL); break; - case ITEM6_HEAL_HALF: + case ITEM6_HEAL_HP_HALF: dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2; if (dataUnsigned == 0) dataUnsigned = 1; break; - case ITEM6_HEAL_LVL_UP: + case ITEM6_HEAL_HP_LVL_UP: dataUnsigned = gBattleScripting.levelUpHP; break; } + + // Only restore HP if not at max health if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL)) { - if (e == 0) + if (!usedByAI) { + // Restore HP dataUnsigned = GetMonData(mon, MON_DATA_HP, NULL) + dataUnsigned; if (dataUnsigned > GetMonData(mon, MON_DATA_MAX_HP, NULL)) dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL); SetMonData(mon, MON_DATA_HP, &dataUnsigned); - if (gMain.inBattle && battlerId != 4) + + // Update battler (if applicable) + if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT) { gBattleMons[battlerId].hp = dataUnsigned; - if (!(r10 & 0x10) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) + if (!(effectFlags & (ITEM4_REVIVE >> 2)) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gBattleResults.numHealingItemsUsed < 255) gBattleResults.numHealingItemsUsed++; - // I have to re-use this variable to match. - r5 = gActiveBattler; + + temp2 = gActiveBattler; gActiveBattler = battlerId; BtlController_EmitGetMonData(0, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); - gActiveBattler = r5; + gActiveBattler = temp2; } } } @@ -4962,227 +5006,197 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov } retVal = FALSE; } - r10 &= 0xEF; + effectFlags &= ~(ITEM4_REVIVE >> 2); break; - case 3: - // Heal pp in all moves. - if (!(r10 & 2)) + + case 3: // ITEM4_HEAL_PP + if (!(effectFlags & (ITEM4_HEAL_PP_ONE >> 3))) { - for (r5 = 0; (signed)(r5) < (signed)(4); r5++) + // Heal PP for all moves + for (temp2 = 0; (signed)(temp2) < (signed)(MAX_MON_MOVES); temp2++) { u16 moveId; - - dataUnsigned = GetMonData(mon, MON_DATA_PP1 + r5, NULL); - moveId = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); - if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5)) + dataUnsigned = GetMonData(mon, MON_DATA_PP1 + temp2, NULL); + moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); + if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { - dataUnsigned += itemEffect[var_3C]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); - if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5)) + dataUnsigned += itemEffect[itemEffectParam]; + moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { - moveId = GetMonData(mon, MON_DATA_MOVE1 + r5, NULL); - dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), r5); + moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); } - SetMonData(mon, MON_DATA_PP1 + r5, &dataUnsigned); + SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); + + // Heal battler PP too (if applicable) if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) - && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[r5])) - gBattleMons[battlerId].pp[r5] = dataUnsigned; + && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[temp2])) + gBattleMons[battlerId].pp[temp2] = dataUnsigned; + retVal = FALSE; } } - var_3C++; + itemEffectParam++; } - // Heal pp in one move. else { + // Heal PP for one move u16 moveId; - dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - dataUnsigned += itemEffect[var_3C++]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + dataUnsigned += itemEffect[itemEffectParam++]; + moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); + + // Heal battler PP too (if applicable) if (gMain.inBattle - && battlerId != 4 && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) + && battlerId != MAX_BATTLERS_COUNT && !(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED) && !(gDisableStructs[battlerId].mimickedMoves & gBitTable[moveIndex])) gBattleMons[battlerId].pp[moveIndex] = dataUnsigned; + retVal = FALSE; } } break; - // Evolution stone - case 7: + + // cases 4-6 are ITEM4_HEAL_PP_ONE, ITEM4_PP_UP, and ITEM4_REVIVE, which + // are already handled above by other cases or before the loop + + case 7: // ITEM4_EVO_STONE { - u16 targetSpecies = GetEvolutionTargetSpecies(mon, 2, item); + u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item); if (targetSpecies != SPECIES_NONE) { - BeginEvolutionScene(mon, targetSpecies, 0, partyIndex); + BeginEvolutionScene(mon, targetSpecies, FALSE, partyIndex); return FALSE; } } break; } } - var_38++; - r10 >>= 1; + temp1++; + effectFlags >>= 1; } break; - // EV and friendship + + // Handle ITEM5 effects (Change Def/SpDef/SpAtk/Speed EVs, PP Max, and friendship changes) case 5: - r10 = itemEffect[cmdIndex]; - var_38 = 0; - while (r10 != 0) + effectFlags = itemEffect[i]; + temp1 = 0; + + // Loop through and try each of the ITEM5 effects + while (effectFlags != 0) { - if (r10 & 1) + if (effectFlags & 1) { - switch (var_38) + switch (temp1) { - case 0: - case 1: - case 2: - case 3: + case 0: // ITEM5_EV_DEF + case 1: // ITEM5_EV_SPEED + case 2: // ITEM5_EV_SPDEF + case 3: // ITEM5_EV_SPATK evCount = GetMonEVCount(mon); - r5 = itemEffect[var_3C]; - dataSigned = GetMonData(mon, sGetMonDataEVConstants[var_38 + 2], NULL); - r2 = r5; - if (r2 > 0) + temp2 = itemEffect[itemEffectParam]; + dataSigned = GetMonData(mon, sGetMonDataEVConstants[temp1 + 2], NULL); + evChange = temp2; + if (evChange > 0) // Increasing EV { + // Has EV increase limit already been reached? if (evCount >= MAX_TOTAL_EVS) return TRUE; if (dataSigned >= EV_ITEM_RAISE_LIMIT) break; - if (dataSigned + r2 > EV_ITEM_RAISE_LIMIT) - r5 = EV_ITEM_RAISE_LIMIT - (dataSigned + r2) + r2; + // Limit the increase + if (dataSigned + evChange > EV_ITEM_RAISE_LIMIT) + temp2 = EV_ITEM_RAISE_LIMIT - (dataSigned + evChange) + evChange; else - r5 = r2; + temp2 = evChange; - if (evCount + r5 > MAX_TOTAL_EVS) - r5 += MAX_TOTAL_EVS - (evCount + r5); - dataSigned += r5; + if (evCount + temp2 > MAX_TOTAL_EVS) + temp2 += MAX_TOTAL_EVS - (evCount + temp2); + + dataSigned += temp2; } - else + else // Decreasing EV { if (dataSigned == 0) { - var_28 = 1; - var_3C++; + // No EVs to lose, but make sure friendship updates anyway + friendshipOnly = TRUE; + itemEffectParam++; break; } - dataSigned += r2; + dataSigned += evChange; if (dataSigned < 0) dataSigned = 0; } - SetMonData(mon, sGetMonDataEVConstants[var_38 + 2], &dataSigned); + + // Update EVs and stats + SetMonData(mon, sGetMonDataEVConstants[temp1 + 2], &dataSigned); CalculateMonStats(mon); retVal = FALSE; - var_3C++; + itemEffectParam++; break; - case 4: + + case 4: // ITEM5_PP_MAX dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - r5 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); - if (dataUnsigned < 3 && r5 > 4) + temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (dataUnsigned < 3 && temp2 > 4) { dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); dataUnsigned &= gPPUpSetMask[moveIndex]; dataUnsigned += gPPUpAddMask[moveIndex] * 3; SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned); - dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - r5; + dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - temp2; dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL) + dataUnsigned; SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); retVal = FALSE; } break; - case 5: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) + + case 5: // ITEM5_FRIENDSHIP_LOW + // Changes to friendship are given differently depending on + // how much friendship the Pokémon already has. + // In general, Pokémon with lower friendship receive more, + // and Pokémon with higher friendship receive less. + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 100) { - var_34 = itemEffect[var_3C]; - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - if (var_34 > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * var_34 / 100; - else - friendship += var_34; - if (var_34 > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > MAX_FRIENDSHIP) - friendship = MAX_FRIENDSHIP; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); - retVal = FALSE; + UPDATE_FRIENDSHIP_FROM_ITEM; } - var_3C++; + itemEffectParam++; break; - case 6: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200 - && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) + + case 6: // ITEM5_FRIENDSHIP_MID + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 100 && GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) < 200) { - var_34 = itemEffect[var_3C]; - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - if ((s8)(var_34) > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * var_34 / 100; - else - friendship += var_34; - if (var_34 > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > MAX_FRIENDSHIP) - friendship = MAX_FRIENDSHIP; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); - retVal = FALSE; + UPDATE_FRIENDSHIP_FROM_ITEM; } - var_3C++; + itemEffectParam++; break; - case 7: - if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200 && (retVal == 0 || var_28 != 0) && !ShouldSkipFriendshipChange() && var_34 == 0) + + case 7: // ITEM5_FRIENDSHIP_HIGH + if (GetMonData(mon, MON_DATA_FRIENDSHIP, NULL) >= 200) { - var_34 = itemEffect[var_3C]; - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, NULL); - if ((s8)(var_34) > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) - friendship += 150 * var_34 / 100; - else - friendship += var_34; - if (var_34 > 0) - { - if (GetMonData(mon, MON_DATA_POKEBALL, NULL) == ITEM_LUXURY_BALL) - friendship++; - if (GetMonData(mon, MON_DATA_MET_LOCATION, NULL) == GetCurrentRegionMapSectionId()) - friendship++; - } - if (friendship < 0) - friendship = 0; - if (friendship > MAX_FRIENDSHIP) - friendship = MAX_FRIENDSHIP; - SetMonData(mon, MON_DATA_FRIENDSHIP, &friendship); - retVal = FALSE; + UPDATE_FRIENDSHIP_FROM_ITEM; } - var_3C++; + itemEffectParam++; break; } } - var_38++; - r10 >>= 1; + temp1++; + effectFlags >>= 1; } break; } @@ -5215,9 +5229,9 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) u8 offset; int i; u8 j; - u8 val; + u8 effectFlags; - offset = 6; + offset = ITEM_EFFECT_ARG_START; temp = gItemEffectTable[itemId - ITEM_POTION]; @@ -5231,7 +5245,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) itemEffect = temp; - for (i = 0; i < 6; i++) + for (i = 0; i < ITEM_EFFECT_ARG_START; i++) { switch (i) { @@ -5243,74 +5257,75 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit) return 0; break; case 4: - val = itemEffect[4]; - if (val & ITEM4_PP_UP) - val &= ~(ITEM4_PP_UP); + effectFlags = itemEffect[4]; + if (effectFlags & ITEM4_PP_UP) + effectFlags &= ~(ITEM4_PP_UP); j = 0; - while (val) + while (effectFlags) { - if (val & 1) + if (effectFlags & 1) { switch (j) { - case 2: - if (val & 0x10) - val &= 0xEF; - case 0: - if (i == effectByte && (val & effectBit)) + case 2: // ITEM4_HEAL_HP + if (effectFlags & (ITEM4_REVIVE >> 2)) + effectFlags &= ~(ITEM4_REVIVE >> 2); + // fallthrough + case 0: // ITEM4_EV_HP + if (i == effectByte && (effectFlags & effectBit)) return offset; offset++; break; - case 1: - if (i == effectByte && (val & effectBit)) + case 1: // ITEM4_EV_ATK + if (i == effectByte && (effectFlags & effectBit)) return offset; offset++; break; - case 3: - if (i == effectByte && (val & effectBit)) + case 3: // ITEM4_HEAL_PP + if (i == effectByte && (effectFlags & effectBit)) return offset; offset++; break; - case 7: + case 7: // ITEM4_EVO_STONE if (i == effectByte) return 0; break; } } j++; - val >>= 1; + effectFlags >>= 1; if (i == effectByte) effectBit >>= 1; } break; case 5: - val = itemEffect[5]; + effectFlags = itemEffect[5]; j = 0; - while (val) + while (effectFlags) { - if (val & 1) + if (effectFlags & 1) { switch (j) { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - if (i == effectByte && (val & effectBit)) + case 0: // ITEM5_EV_DEF + case 1: // ITEM5_EV_SPEED + case 2: // ITEM5_EV_SPDEF + case 3: // ITEM5_EV_SPATK + case 4: // ITEM5_PP_MAX + case 5: // ITEM5_FRIENDSHIP_LOW + case 6: // ITEM5_FRIENDSHIP_MID + if (i == effectByte && (effectFlags & effectBit)) return offset; offset++; break; - case 7: + case 7: // ITEM5_FRIENDSHIP_HIGH if (i == effectByte) return 0; break; } } j++; - val >>= 1; + effectFlags >>= 1; if (i == effectByte) effectBit >>= 1; } @@ -5326,7 +5341,7 @@ static void BufferStatRoseMessage(s32 arg0) gBattlerTarget = gBattlerInMenuId; StringCopy(gBattleTextBuff1, gStatNamesTable[sStatsToRaise[arg0]]); StringCopy(gBattleTextBuff2, gText_StatRose); - BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnsStatChanged2); + BattleStringExpandPlaceholdersToDisplayedString(gText_DefendersStatRose); } u8 *UseStatIncreaseItem(u16 itemId) @@ -5386,7 +5401,7 @@ u8 GetNatureFromPersonality(u32 personality) return personality % NUM_NATURES; } -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem) { int i; u16 targetSpecies = 0; @@ -5404,12 +5419,13 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) else holdEffect = ItemId_GetHoldEffect(heldItem); - if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) + // Prevent evolution with Everstone, unless we're just viewing the party menu with an evolution item + if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && mode != EVO_MODE_ITEM_CHECK) return SPECIES_NONE; - switch (type) + switch (mode) { - case 0: + case EVO_MODE_NORMAL: level = GetMonData(mon, MON_DATA_LEVEL, 0); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); @@ -5469,7 +5485,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) } } break; - case 1: + case EVO_MODE_TRADE: for (i = 0; i < EVOS_PER_MON; i++) { switch (gEvolutionTable[species][i].method) @@ -5488,8 +5504,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) } } break; - case 2: - case 3: + case EVO_MODE_ITEM_USE: + case EVO_MODE_ITEM_CHECK: for (i = 0; i < EVOS_PER_MON; i++) { if (gEvolutionTable[species][i].method == EVO_ITEM @@ -5594,96 +5610,63 @@ u16 SpeciesToCryId(u16 species) return gSpeciesIdToCryId[species - (SPECIES_TREECKO - 1)]; } -void sub_806D544(u16 species, u32 personality, u8 *dest) +#define DRAW_SPINDA_SPOTS \ +{ \ + int i; \ + for (i = 0; i < 4; i++) \ + { \ + int j; \ + u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); \ + u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); \ + \ + for (j = 0; j < 16; j++) \ + { \ + int k; \ + s32 row = gSpindaSpotGraphics[i].image[j]; \ + \ + for (k = x; k < x + 16; k++) \ + { \ + u8 *val = dest + ((k / 8) * 32) + \ + ((k % 8) / 2) + \ + ((y >> 3) << 8) + \ + ((y & 7) << 2); \ + \ + if (row & 1) \ + { \ + if (k & 1) \ + { \ + if ((u8)((*val & 0xF0) - 0x10) <= 0x20) \ + *val += 0x40; \ + } \ + else \ + { \ + if ((u8)((*val & 0xF) - 0x01) <= 0x02) \ + *val += 0x04; \ + } \ + } \ + \ + row >>= 1; \ + } \ + \ + y++; \ + } \ + \ + personality >>= 8; \ + } \ +} + +static void DrawSpindaSpotsUnused(u16 species, u32 personality, u8 *dest) { if (species == SPECIES_SPINDA && dest != gMonSpritesGfxPtr->sprites.ptr[0] && dest != gMonSpritesGfxPtr->sprites.ptr[2]) - { - int i; - for (i = 0; i < 4; i++) - { - int j; - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); - - for (j = 0; j < 16; j++) - { - int k; - s32 row = gSpindaSpotGraphics[i].image[j]; - - for (k = x; k < x + 16; k++) - { - u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); - - if (row & 1) - { - if (k & 1) - { - if ((u8)((*val & 0xF0) - 0x10) <= 0x20) - *val += 0x40; - } - else - { - if ((u8)((*val & 0xF) - 0x01) <= 0x02) - *val += 0x04; - } - } - - row >>= 1; - } - - y++; - } - - personality >>= 8; - } - } + DRAW_SPINDA_SPOTS; } -void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, u8 a4) +void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic) { - if (species == SPECIES_SPINDA && a4) - { - int i; - for (i = 0; i < 4; i++) - { - int j; - u8 x = gSpindaSpotGraphics[i].x + ((personality & 0x0F) - 8); - u8 y = gSpindaSpotGraphics[i].y + (((personality & 0xF0) >> 4) - 8); - - for (j = 0; j < 16; j++) - { - int k; - s32 row = gSpindaSpotGraphics[i].image[j]; - - for (k = x; k < x + 16; k++) - { - u8 *val = dest + ((k / 8) * 32) + ((k % 8) / 2) + ((y >> 3) << 8) + ((y & 7) << 2); - - if (row & 1) - { - if (k & 1) - { - if ((u8)((*val & 0xF0) - 0x10) <= 0x20) - *val += 0x40; - } - else - { - if ((u8)((*val & 0xF) - 0x01) <= 0x02) - *val += 0x04; - } - } - - row >>= 1; - } - - y++; - } - - personality >>= 8; - } - } + if (species == SPECIES_SPINDA && isFrontPic) + DRAW_SPINDA_SPOTS; } void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) @@ -5820,7 +5803,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) && (event != FRIENDSHIP_EVENT_LEAGUE_BATTLE || IS_LEAGUE_BATTLE)) { s8 mod = sFriendshipEventModifiers[event][friendshipLevel]; - if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP) + if (mod > 0 && holdEffect == HOLD_EFFECT_FRIENDSHIP_UP) mod = (150 * mod) / 100; friendship += mod; if (mod > 0) @@ -6266,7 +6249,7 @@ u16 GetBattleBGM(void) return MUS_VS_KYOGRE_GROUDON; else if (gBattleTypeFlags & BATTLE_TYPE_REGI) return MUS_VS_REGI; - else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return MUS_VS_TRAINER; else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { @@ -6334,26 +6317,31 @@ void PlayMapChosenOrBattleBGM(u16 songId) PlayNewMapMusic(GetBattleBGM()); } -void sub_806E694(u16 songId) +// Identical to PlayMapChosenOrBattleBGM, but uses a task instead +// Only used by Battle Dome +#define tSongId data[0] +void CreateTask_PlayMapChosenOrBattleBGM(u16 songId) { u8 taskId; ResetMapMusic(); m4aMPlayAllStop(); - taskId = CreateTask(sub_806E6CC, 0); - gTasks[taskId].data[0] = songId; + taskId = CreateTask(Task_PlayMapChosenOrBattleBGM, 0); + gTasks[taskId].tSongId = songId; } -static void sub_806E6CC(u8 taskId) +static void Task_PlayMapChosenOrBattleBGM(u8 taskId) { - if (gTasks[taskId].data[0]) - PlayNewMapMusic(gTasks[taskId].data[0]); + if (gTasks[taskId].tSongId) + PlayNewMapMusic(gTasks[taskId].tSongId); else PlayNewMapMusic(GetBattleBGM()); DestroyTask(taskId); } +#undef tSongId + const u32 *GetMonFrontSpritePal(struct Pokemon *mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0); @@ -6592,12 +6580,12 @@ const u8 *GetTrainerPartnerName(void) #define READ_PTR_FROM_TASK(taskId, dataId) \ (void*)( \ ((u16)(gTasks[taskId].data[dataId]) | \ - ((u16)(gTasks[taskId].data[dataId + 1]) << 0x10))) + ((u16)(gTasks[taskId].data[dataId + 1]) << 16))) #define STORE_PTR_IN_TASK(ptr, taskId, dataId) \ { \ gTasks[taskId].data[dataId] = (u32)(ptr); \ - gTasks[taskId].data[dataId + 1] = (u32)(ptr) >> 0x10; \ + gTasks[taskId].data[dataId + 1] = (u32)(ptr) >> 16; \ } static void Task_AnimateAfterDelay(u8 taskId) @@ -6614,14 +6602,14 @@ static void Task_PokemonSummaryAnimateAfterDelay(u8 taskId) if (--gTasks[taskId].data[3] == 0) { StartMonSummaryAnimation(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]); - SummaryScreen_SetUnknownTaskId(0xFF); + SummaryScreen_SetAnimDelayTaskId(TASK_NONE); DestroyTask(taskId); } } void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3) { - if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) + if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))) DoMonFrontSpriteAnimation(sprite, species, noCry, arg3 | 0x80); else DoMonFrontSpriteAnimation(sprite, species, noCry, arg3); @@ -6681,7 +6669,7 @@ void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneF STORE_PTR_IN_TASK(sprite, taskId, 0); gTasks[taskId].data[2] = sMonFrontAnimIdsTable[species - 1]; gTasks[taskId].data[3] = sMonAnimationDelayTable[species - 1]; - SummaryScreen_SetUnknownTaskId(taskId); + SummaryScreen_SetAnimDelayTaskId(taskId); SetSpriteCB_MonAnimDummy(sprite); } else @@ -6693,13 +6681,13 @@ void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneF void StopPokemonAnimationDelayTask(void) { u8 delayTaskId = FindTaskIdByFunc(Task_PokemonSummaryAnimateAfterDelay); - if (delayTaskId != 0xFF) + if (delayTaskId != TASK_NONE) DestroyTask(delayTaskId); } void BattleAnimateBackSprite(struct Sprite* sprite, u16 species) { - if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))) + if (gHitMarker & HITMARKER_NO_ANIMATIONS && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK))) { sprite->callback = SpriteCallbackDummy; } @@ -6819,7 +6807,7 @@ static void sub_806F160(struct Unknown_806F160_Struct* structPtr) u16 i, j; for (i = 0; i < structPtr->field_0_0; i++) { - structPtr->templates[i] = gUnknown_08329D98[i]; + structPtr->templates[i] = gBattlerSpriteTemplates[i]; for (j = 0; j < structPtr->field_1; j++) { structPtr->frameImages[i * structPtr->field_1 + j].data = &structPtr->byteArrays[i][j * 0x800]; @@ -6839,7 +6827,7 @@ static void sub_806F1FC(struct Unknown_806F160_Struct* structPtr) structPtr->frameImages[i * structPtr->field_0_0 + j].data = &structPtr->byteArrays[i][j * 0x800]; } structPtr->templates[i].images = &structPtr->frameImages[i * structPtr->field_0_0]; - structPtr->templates[i].anims = gUnknown_082FF70C; + structPtr->templates[i].anims = gAnims_MonPic; structPtr->templates[i].paletteTag = i; } } @@ -6884,7 +6872,7 @@ struct Unknown_806F160_Struct *sub_806F2AC(u8 id, u8 arg1) else { for (i = 0; i < structPtr->field_0_0; i++) - structPtr->byteArrays[i] = structPtr->bytes + (structPtr->field_3_0 * (i << 0xD)); + structPtr->byteArrays[i] = structPtr->bytes + (structPtr->field_3_0 * (i << 13)); } structPtr->templates = AllocZeroed(sizeof(struct SpriteTemplate) * structPtr->field_0_0); diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 58c174263..14a17437c 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -6,835 +6,865 @@ #include "task.h" #include "trig.h" #include "util.h" +#include "data.h" #include "constants/battle_anim.h" #include "constants/rgb.h" -struct UnkAnimStruct +/* + This file handles the movements of the Pokémon intro animations. + + Each animation type is identified by an ANIM_* constant that + refers to a sprite callback to start the animation. These functions + are named Anim_<name> or Anim_<name>_<variant>. Many of these + functions share additional movement functions to do a variation of the + same movement (e.g. a faster or larger movement). + Vertical and Horizontal are frequently shortened to V and H. + + Every front animation uses 1 of these ANIMs, and every back animation + uses a BACK_ANIM_* that refers to a set of 3 ANIM functions. Which of the + 3 that gets used depends on the Pokémon's nature (see sBackAnimationIds). + + The table linking species to a BACK_ANIM is in this file (sSpeciesToBackAnimSet) + while the table linking species to an ANIM for their front animation is in + pokemon.c (sMonFrontAnimIdsTable). + + These are the functions that will start an animation: + - LaunchAnimationTaskForFrontSprite + - LaunchAnimationTaskForBackSprite + - StartMonSummaryAnimation +*/ + +#define sDontFlip data[1] // TRUE if a normal animation, FALSE if Summary Screen animation + +struct PokemonAnimData { - u16 field_0; - s16 field_2; - s16 field_4; - s16 field_6; - s16 field_8; + u16 delay; + s16 speed; // Only used by 2 sets of animations + s16 runs; // Number of times to do the animation + s16 rotation; + s16 data; // General use }; -// this file's functions -static void pokemonanimfunc_00(struct Sprite *sprite); -static void pokemonanimfunc_01(struct Sprite *sprite); -static void pokemonanimfunc_02(struct Sprite *sprite); -static void pokemonanimfunc_03(struct Sprite *sprite); -static void pokemonanimfunc_04(struct Sprite *sprite); -static void pokemonanimfunc_05(struct Sprite *sprite); -static void pokemonanimfunc_06(struct Sprite *sprite); -static void pokemonanimfunc_07(struct Sprite *sprite); -static void pokemonanimfunc_08(struct Sprite *sprite); -static void pokemonanimfunc_09(struct Sprite *sprite); -static void pokemonanimfunc_0A(struct Sprite *sprite); -static void pokemonanimfunc_0B(struct Sprite *sprite); -static void pokemonanimfunc_0C(struct Sprite *sprite); -static void pokemonanimfunc_0D(struct Sprite *sprite); -static void pokemonanimfunc_0E(struct Sprite *sprite); -static void pokemonanimfunc_0F(struct Sprite *sprite); -static void pokemonanimfunc_10(struct Sprite *sprite); -static void pokemonanimfunc_11(struct Sprite *sprite); -static void pokemonanimfunc_12(struct Sprite *sprite); -static void pokemonanimfunc_13(struct Sprite *sprite); -static void pokemonanimfunc_14(struct Sprite *sprite); -static void pokemonanimfunc_15(struct Sprite *sprite); -static void pokemonanimfunc_16(struct Sprite *sprite); -static void pokemonanimfunc_17(struct Sprite *sprite); -static void pokemonanimfunc_18(struct Sprite *sprite); -static void pokemonanimfunc_19(struct Sprite *sprite); -static void pokemonanimfunc_1A(struct Sprite *sprite); -static void pokemonanimfunc_1B(struct Sprite *sprite); -static void pokemonanimfunc_1C(struct Sprite *sprite); -static void pokemonanimfunc_1D(struct Sprite *sprite); -static void pokemonanimfunc_1E(struct Sprite *sprite); -static void pokemonanimfunc_1F(struct Sprite *sprite); -static void pokemonanimfunc_20(struct Sprite *sprite); -static void pokemonanimfunc_21(struct Sprite *sprite); -static void pokemonanimfunc_22(struct Sprite *sprite); -static void pokemonanimfunc_23(struct Sprite *sprite); -static void pokemonanimfunc_24(struct Sprite *sprite); -static void pokemonanimfunc_25(struct Sprite *sprite); -static void pokemonanimfunc_26(struct Sprite *sprite); -static void pokemonanimfunc_27(struct Sprite *sprite); -static void pokemonanimfunc_28(struct Sprite *sprite); -static void pokemonanimfunc_29(struct Sprite *sprite); -static void pokemonanimfunc_2A(struct Sprite *sprite); -static void pokemonanimfunc_2B(struct Sprite *sprite); -static void pokemonanimfunc_2C(struct Sprite *sprite); -static void pokemonanimfunc_2D(struct Sprite *sprite); -static void pokemonanimfunc_2E(struct Sprite *sprite); -static void pokemonanimfunc_2F(struct Sprite *sprite); -static void pokemonanimfunc_30(struct Sprite *sprite); -static void pokemonanimfunc_31(struct Sprite *sprite); -static void pokemonanimfunc_32(struct Sprite *sprite); -static void pokemonanimfunc_33(struct Sprite *sprite); -static void pokemonanimfunc_34(struct Sprite *sprite); -static void pokemonanimfunc_35(struct Sprite *sprite); -static void pokemonanimfunc_36(struct Sprite *sprite); -static void pokemonanimfunc_37(struct Sprite *sprite); -static void pokemonanimfunc_38(struct Sprite *sprite); -static void pokemonanimfunc_39(struct Sprite *sprite); -static void pokemonanimfunc_3A(struct Sprite *sprite); -static void pokemonanimfunc_3B(struct Sprite *sprite); -static void pokemonanimfunc_3C(struct Sprite *sprite); -static void pokemonanimfunc_3D(struct Sprite *sprite); -static void pokemonanimfunc_3E(struct Sprite *sprite); -static void pokemonanimfunc_3F(struct Sprite *sprite); -static void pokemonanimfunc_40(struct Sprite *sprite); -static void pokemonanimfunc_41(struct Sprite *sprite); -static void pokemonanimfunc_42(struct Sprite *sprite); -static void pokemonanimfunc_43(struct Sprite *sprite); -static void pokemonanimfunc_44(struct Sprite *sprite); -static void pokemonanimfunc_45(struct Sprite *sprite); -static void pokemonanimfunc_46(struct Sprite *sprite); -static void pokemonanimfunc_47(struct Sprite *sprite); -static void pokemonanimfunc_48(struct Sprite *sprite); -static void pokemonanimfunc_49(struct Sprite *sprite); -static void pokemonanimfunc_4A(struct Sprite *sprite); -static void pokemonanimfunc_4B(struct Sprite *sprite); -static void pokemonanimfunc_4C(struct Sprite *sprite); -static void pokemonanimfunc_4D(struct Sprite *sprite); -static void pokemonanimfunc_4E(struct Sprite *sprite); -static void pokemonanimfunc_4F(struct Sprite *sprite); -static void pokemonanimfunc_50(struct Sprite *sprite); -static void pokemonanimfunc_51(struct Sprite *sprite); -static void pokemonanimfunc_52(struct Sprite *sprite); -static void pokemonanimfunc_53(struct Sprite *sprite); -static void pokemonanimfunc_54(struct Sprite *sprite); -static void pokemonanimfunc_55(struct Sprite *sprite); -static void pokemonanimfunc_56(struct Sprite *sprite); -static void pokemonanimfunc_57(struct Sprite *sprite); -static void pokemonanimfunc_58(struct Sprite *sprite); -static void pokemonanimfunc_59(struct Sprite *sprite); -static void pokemonanimfunc_5A(struct Sprite *sprite); -static void pokemonanimfunc_5B(struct Sprite *sprite); -static void pokemonanimfunc_5C(struct Sprite *sprite); -static void pokemonanimfunc_5D(struct Sprite *sprite); -static void pokemonanimfunc_5E(struct Sprite *sprite); -static void pokemonanimfunc_5F(struct Sprite *sprite); -static void pokemonanimfunc_60(struct Sprite *sprite); -static void pokemonanimfunc_61(struct Sprite *sprite); -static void pokemonanimfunc_62(struct Sprite *sprite); -static void pokemonanimfunc_63(struct Sprite *sprite); -static void pokemonanimfunc_64(struct Sprite *sprite); -static void pokemonanimfunc_65(struct Sprite *sprite); -static void pokemonanimfunc_66(struct Sprite *sprite); -static void pokemonanimfunc_67(struct Sprite *sprite); -static void pokemonanimfunc_68(struct Sprite *sprite); -static void pokemonanimfunc_69(struct Sprite *sprite); -static void pokemonanimfunc_6A(struct Sprite *sprite); -static void pokemonanimfunc_6B(struct Sprite *sprite); -static void pokemonanimfunc_6C(struct Sprite *sprite); -static void pokemonanimfunc_6D(struct Sprite *sprite); -static void pokemonanimfunc_6E(struct Sprite *sprite); -static void pokemonanimfunc_6F(struct Sprite *sprite); -static void pokemonanimfunc_70(struct Sprite *sprite); -static void pokemonanimfunc_71(struct Sprite *sprite); -static void pokemonanimfunc_72(struct Sprite *sprite); -static void pokemonanimfunc_73(struct Sprite *sprite); -static void pokemonanimfunc_74(struct Sprite *sprite); -static void pokemonanimfunc_75(struct Sprite *sprite); -static void pokemonanimfunc_76(struct Sprite *sprite); -static void pokemonanimfunc_77(struct Sprite *sprite); -static void pokemonanimfunc_78(struct Sprite *sprite); -static void pokemonanimfunc_79(struct Sprite *sprite); -static void pokemonanimfunc_7A(struct Sprite *sprite); -static void pokemonanimfunc_7B(struct Sprite *sprite); -static void pokemonanimfunc_7C(struct Sprite *sprite); -static void pokemonanimfunc_7D(struct Sprite *sprite); -static void pokemonanimfunc_7E(struct Sprite *sprite); -static void pokemonanimfunc_7F(struct Sprite *sprite); -static void pokemonanimfunc_80(struct Sprite *sprite); -static void pokemonanimfunc_81(struct Sprite *sprite); -static void pokemonanimfunc_82(struct Sprite *sprite); -static void pokemonanimfunc_83(struct Sprite *sprite); -static void pokemonanimfunc_84(struct Sprite *sprite); -static void pokemonanimfunc_85(struct Sprite *sprite); -static void pokemonanimfunc_86(struct Sprite *sprite); -static void pokemonanimfunc_87(struct Sprite *sprite); -static void pokemonanimfunc_88(struct Sprite *sprite); -static void pokemonanimfunc_89(struct Sprite *sprite); -static void pokemonanimfunc_8A(struct Sprite *sprite); -static void pokemonanimfunc_8B(struct Sprite *sprite); -static void pokemonanimfunc_8C(struct Sprite *sprite); -static void pokemonanimfunc_8D(struct Sprite *sprite); -static void pokemonanimfunc_8E(struct Sprite *sprite); -static void pokemonanimfunc_8F(struct Sprite *sprite); -static void pokemonanimfunc_90(struct Sprite *sprite); -static void pokemonanimfunc_91(struct Sprite *sprite); -static void pokemonanimfunc_92(struct Sprite *sprite); -static void pokemonanimfunc_93(struct Sprite *sprite); -static void pokemonanimfunc_94(struct Sprite *sprite); -static void pokemonanimfunc_95(struct Sprite *sprite); -static void pokemonanimfunc_96(struct Sprite *sprite); - -static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite); - -#define STRUCT_COUNT 4 - -// IWRAM bss -static struct UnkAnimStruct sUnknown_03001240[STRUCT_COUNT]; -static u8 sUnknown_03001270; -static bool32 sUnknown_03001274; - -// const rom data +struct YellowFlashData +{ + bool8 isYellow; + u8 time; +}; + +static void Anim_VerticalSquishBounce(struct Sprite *sprite); +static void Anim_CircularStretchTwice(struct Sprite *sprite); +static void Anim_HorizontalVibrate(struct Sprite *sprite); +static void Anim_HorizontalSlide(struct Sprite *sprite); +static void Anim_VerticalSlide(struct Sprite *sprite); +static void Anim_BounceRotateToSides(struct Sprite *sprite); +static void Anim_VerticalJumpsHorizontalJumps(struct Sprite *sprite); +static void Anim_RotateToSides(struct Sprite *sprite); +static void Anim_RotateToSides_Twice(struct Sprite *sprite); +static void Anim_GrowVibrate(struct Sprite *sprite); +static void Anim_ZigzagFast(struct Sprite *sprite); +static void Anim_SwingConcave(struct Sprite *sprite); +static void Anim_SwingConcave_Fast(struct Sprite *sprite); +static void Anim_SwingConvex(struct Sprite *sprite); +static void Anim_SwingConvex_Fast(struct Sprite *sprite); +static void Anim_HorizontalShake(struct Sprite *sprite); +static void Anim_VerticalShake(struct Sprite *sprite); +static void Anim_CircularVibrate(struct Sprite *sprite); +static void Anim_Twist(struct Sprite *sprite); +static void Anim_ShrinkGrow(struct Sprite *sprite); +static void Anim_CircleCounterclockwise(struct Sprite *sprite); +static void Anim_GlowBlack(struct Sprite *sprite); +static void Anim_HorizontalStretch(struct Sprite *sprite); +static void Anim_VerticalStretch(struct Sprite *sprite); +static void Anim_RisingWobble(struct Sprite *sprite); +static void Anim_VerticalShakeTwice(struct Sprite *sprite); +static void Anim_TipMoveForward(struct Sprite *sprite); +static void Anim_HorizontalPivot(struct Sprite *sprite); +static void Anim_VerticalSlideWobble(struct Sprite *sprite); +static void Anim_HorizontalSlideWobble(struct Sprite *sprite); +static void Anim_VerticalJumps_Big(struct Sprite *sprite); +static void Anim_Spin_Long(struct Sprite *sprite); +static void Anim_GlowOrange(struct Sprite *sprite); +static void Anim_GlowRed(struct Sprite *sprite); +static void Anim_GlowBlue(struct Sprite *sprite); +static void Anim_GlowYellow(struct Sprite *sprite); +static void Anim_GlowPurple(struct Sprite *sprite); +static void Anim_BackAndLunge(struct Sprite *sprite); +static void Anim_BackFlip(struct Sprite *sprite); +static void Anim_Flicker(struct Sprite *sprite); +static void Anim_BackFlipBig(struct Sprite *sprite); +static void Anim_FrontFlip(struct Sprite *sprite); +static void Anim_TumblingFrontFlip(struct Sprite *sprite); +static void Anim_Figure8(struct Sprite *sprite); +static void Anim_FlashYellow(struct Sprite *sprite); +static void Anim_SwingConcave_FastShort(struct Sprite *sprite); +static void Anim_SwingConvex_FastShort(struct Sprite *sprite); +static void Anim_RotateUpSlamDown(struct Sprite *sprite); +static void Anim_DeepVerticalSquishBounce(struct Sprite *sprite); +static void Anim_HorizontalJumps(struct Sprite *sprite); +static void Anim_HorizontalJumpsVerticalStretch(struct Sprite *sprite); +static void Anim_RotateToSides_Fast(struct Sprite *sprite); +static void Anim_RotateUpToSides(struct Sprite *sprite); +static void Anim_FlickerIncreasing(struct Sprite *sprite); +static void Anim_TipHopForward(struct Sprite *sprite); +static void Anim_PivotShake(struct Sprite *sprite); +static void Anim_TipAndShake(struct Sprite *sprite); +static void Anim_VibrateToCorners(struct Sprite *sprite); +static void Anim_GrowInStages(struct Sprite *sprite); +static void Anim_VerticalSpring(struct Sprite *sprite); +static void Anim_VerticalRepeatedSpring(struct Sprite *sprite); +static void Anim_SpringRising(struct Sprite *sprite); +static void Anim_HorizontalSpring(struct Sprite *sprite); +static void Anim_HorizontalRepeatedSpring_Slow(struct Sprite *sprite); +static void Anim_HorizontalSlideShrink(struct Sprite *sprite); +static void Anim_LungeGrow(struct Sprite *sprite); +static void Anim_CircleIntoBackground(struct Sprite *sprite); +static void Anim_RapidHorizontalHops(struct Sprite *sprite); +static void Anim_FourPetal(struct Sprite *sprite); +static void Anim_VerticalSquishBounce_Slow(struct Sprite *sprite); +static void Anim_HorizontalSlide_Slow(struct Sprite *sprite); +static void Anim_VerticalSlide_Slow(struct Sprite *sprite); +static void Anim_BounceRotateToSides_Small(struct Sprite *sprite); +static void Anim_BounceRotateToSides_Slow(struct Sprite *sprite); +static void Anim_BounceRotateToSides_SmallSlow(struct Sprite *sprite); +static void Anim_ZigzagSlow(struct Sprite *sprite); +static void Anim_HorizontalShake_Slow(struct Sprite *sprite); +static void Anim_VertialShake_Slow(struct Sprite *sprite); +static void Anim_Twist_Twice(struct Sprite *sprite); +static void Anim_CircleCounterclockwise_Slow(struct Sprite *sprite); +static void Anim_VerticalShakeTwice_Slow(struct Sprite *sprite); +static void Anim_VerticalSlideWobble_Small(struct Sprite *sprite); +static void Anim_VerticalJumps_Small(struct Sprite *sprite); +static void Anim_Spin(struct Sprite *sprite); +static void Anim_TumblingFrontFlip_Twice(struct Sprite *sprite); +static void Anim_DeepVerticalSquishBounce_Twice(struct Sprite *sprite); +static void Anim_HorizontalJumpsVerticalStretch_Twice(struct Sprite *sprite); +static void Anim_VerticalShakeBack(struct Sprite *sprite); +static void Anim_VerticalShakeBack_Slow(struct Sprite *sprite); +static void Anim_VerticalShakeHorizontalSlide_Slow(struct Sprite *sprite); +static void Anim_VerticalStretchBothEnds_Slow(struct Sprite *sprite); +static void Anim_HorizontalStretchFar_Slow(struct Sprite *sprite); +static void Anim_VerticalShakeLowTwice(struct Sprite *sprite); +static void Anim_HorizontalShake_Fast(struct Sprite *sprite); +static void Anim_HorizontalSlide_Fast(struct Sprite *sprite); +static void Anim_HorizontalVibrate_Fast(struct Sprite *sprite); +static void Anim_HorizontalVibrate_Fastest(struct Sprite *sprite); +static void Anim_VerticalShakeBack_Fast(struct Sprite *sprite); +static void Anim_VerticalShakeLowTwice_Slow(struct Sprite *sprite); +static void Anim_VerticalShakeLowTwice_Fast(struct Sprite *sprite); +static void Anim_CircleCounterclockwise_Long(struct Sprite *sprite); +static void Anim_GrowStutter_Slow(struct Sprite *sprite); +static void Anim_VerticalShakeHorizontalSlide(struct Sprite *sprite); +static void Anim_VerticalShakeHorizontalSlide_Fast(struct Sprite *sprite); +static void Anim_TriangleDown_Slow(struct Sprite *sprite); +static void Anim_TriangleDown(struct Sprite *sprite); +static void Anim_TriangleDown_Fast(struct Sprite *sprite); +static void Anim_Grow(struct Sprite *sprite); +static void Anim_Grow_Twice(struct Sprite *sprite); +static void Anim_HorizontalSpring_Fast(struct Sprite *sprite); +static void Anim_HorizontalSpring_Slow(struct Sprite *sprite); +static void Anim_HorizontalRepeatedSpring_Fast(struct Sprite *sprite); +static void Anim_HorizontalRepeatedSpring(struct Sprite *sprite); +static void Anim_ShrinkGrow_Fast(struct Sprite *sprite); +static void Anim_ShrinkGrow_Slow(struct Sprite *sprite); +static void Anim_VerticalStretchBothEnds(struct Sprite *sprite); +static void Anim_VerticalStretchBothEnds_Twice(struct Sprite *sprite); +static void Anim_HorizontalStretchFar_Twice(struct Sprite *sprite); +static void Anim_HorizontalStretchFar(struct Sprite *sprite); +static void Anim_GrowStutter_Twice(struct Sprite *sprite); +static void Anim_GrowStutter(struct Sprite *sprite); +static void Anim_ConcaveArcLarge_Slow(struct Sprite *sprite); +static void Anim_ConcaveArcLarge(struct Sprite *sprite); +static void Anim_ConcaveArcLarge_Twice(struct Sprite *sprite); +static void Anim_ConvexDoubleArc_Slow(struct Sprite *sprite); +static void Anim_ConvexDoubleArc(struct Sprite *sprite); +static void Anim_ConvexDoubleArc_Twice(struct Sprite *sprite); +static void Anim_ConcaveArcSmall_Slow(struct Sprite *sprite); +static void Anim_ConcaveArcSmall(struct Sprite *sprite); +static void Anim_ConcaveArcSmall_Twice(struct Sprite *sprite); +static void Anim_HorizontalDip(struct Sprite *sprite); +static void Anim_HorizontalDip_Fast(struct Sprite *sprite); +static void Anim_HorizontalDip_Twice(struct Sprite *sprite); +static void Anim_ShrinkGrowVibrate_Fast(struct Sprite *sprite); +static void Anim_ShrinkGrowVibrate(struct Sprite *sprite); +static void Anim_ShrinkGrowVibrate_Slow(struct Sprite *sprite); +static void Anim_JoltRight_Fast(struct Sprite *sprite); +static void Anim_JoltRight(struct Sprite *sprite); +static void Anim_JoltRight_Slow(struct Sprite *sprite); +static void Anim_ShakeFlashYellow_Fast(struct Sprite *sprite); +static void Anim_ShakeFlashYellow(struct Sprite *sprite); +static void Anim_ShakeFlashYellow_Slow(struct Sprite *sprite); +static void Anim_ShakeGlowRed_Fast(struct Sprite *sprite); +static void Anim_ShakeGlowRed(struct Sprite *sprite); +static void Anim_ShakeGlowRed_Slow(struct Sprite *sprite); +static void Anim_ShakeGlowGreen_Fast(struct Sprite *sprite); +static void Anim_ShakeGlowGreen(struct Sprite *sprite); +static void Anim_ShakeGlowGreen_Slow(struct Sprite *sprite); +static void Anim_ShakeGlowBlue_Fast(struct Sprite *sprite); +static void Anim_ShakeGlowBlue(struct Sprite *sprite); +static void Anim_ShakeGlowBlue_Slow(struct Sprite *sprite); + +static void WaitAnimEnd(struct Sprite *sprite); + +static struct PokemonAnimData sAnims[MAX_BATTLERS_COUNT]; +static u8 sAnimIdx; +static bool32 sIsSummaryAnim; + static const u8 sSpeciesToBackAnimSet[] = { - [SPECIES_BULBASAUR] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_IVYSAUR] = BACK_ANIM_H_SLIDE, - [SPECIES_VENUSAUR] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_CHARMANDER] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, + [SPECIES_BULBASAUR] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_IVYSAUR] = BACK_ANIM_H_SLIDE, + [SPECIES_VENUSAUR] = BACK_ANIM_H_SHAKE, + [SPECIES_CHARMANDER] = BACK_ANIM_CONCAVE_ARC_SMALL, [SPECIES_CHARMELEON] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_CHARIZARD] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_SQUIRTLE] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_WARTORTLE] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_BLASTOISE] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_CATERPIE] = BACK_ANIM_H_SLIDE, - [SPECIES_METAPOD] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_BUTTERFREE] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_WEEDLE] = BACK_ANIM_H_SLIDE, - [SPECIES_KAKUNA] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_BEEDRILL] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_PIDGEY] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_PIDGEOTTO] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_PIDGEOT] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_RATTATA] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_RATICATE] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_SPEAROW] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_FEAROW] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_EKANS] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_ARBOK] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_PIKACHU] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_RAICHU] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_SANDSHREW] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_SANDSLASH] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_NIDORAN_F] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_NIDORINA] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_NIDOQUEEN] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_NIDORAN_M] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_NIDORINO] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_NIDOKING] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_CLEFAIRY] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_CLEFABLE] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_VULPIX] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_NINETALES] = BACK_ANIM_H_SLIDE_QUICK, + [SPECIES_CHARIZARD] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_SQUIRTLE] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_WARTORTLE] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_BLASTOISE] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_CATERPIE] = BACK_ANIM_H_SLIDE, + [SPECIES_METAPOD] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_BUTTERFREE] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_WEEDLE] = BACK_ANIM_H_SLIDE, + [SPECIES_KAKUNA] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_BEEDRILL] = BACK_ANIM_H_VIBRATE, + [SPECIES_PIDGEY] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_PIDGEOTTO] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_PIDGEOT] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_RATTATA] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_RATICATE] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_SPEAROW] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_FEAROW] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_EKANS] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_ARBOK] = BACK_ANIM_V_SHAKE, + [SPECIES_PIKACHU] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_RAICHU] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_SANDSHREW] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_SANDSLASH] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_NIDORAN_F] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_NIDORINA] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_NIDOQUEEN] = BACK_ANIM_V_SHAKE, + [SPECIES_NIDORAN_M] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_NIDORINO] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_NIDOKING] = BACK_ANIM_V_SHAKE, + [SPECIES_CLEFAIRY] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_CLEFABLE] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_VULPIX] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_NINETALES] = BACK_ANIM_H_VIBRATE, [SPECIES_JIGGLYPUFF] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_WIGGLYTUFF] = BACK_ANIM_GROW_1, - [SPECIES_ZUBAT] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_GOLBAT] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_ODDISH] = BACK_ANIM_H_SLIDE, - [SPECIES_GLOOM] = BACK_ANIM_H_SLIDE, - [SPECIES_VILEPLUME] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_PARAS] = BACK_ANIM_H_SLIDE, - [SPECIES_PARASECT] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_VENONAT] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_VENOMOTH] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_DIGLETT] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_DUGTRIO] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_MEOWTH] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_PERSIAN] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_PSYDUCK] = BACK_ANIM_H_SLIDE, - [SPECIES_GOLDUCK] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_MANKEY] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_PRIMEAPE] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_GROWLITHE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_ARCANINE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_POLIWAG] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_POLIWHIRL] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_POLIWRATH] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_ABRA] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_KADABRA] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_ALAKAZAM] = BACK_ANIM_GROW_2, - [SPECIES_MACHOP] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_MACHOKE] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_MACHAMP] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_BELLSPROUT] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_WEEPINBELL] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_VICTREEBEL] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_TENTACOOL] = BACK_ANIM_H_SLIDE, + [SPECIES_WIGGLYTUFF] = BACK_ANIM_GROW, + [SPECIES_ZUBAT] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_GOLBAT] = BACK_ANIM_V_SHAKE, + [SPECIES_ODDISH] = BACK_ANIM_H_SLIDE, + [SPECIES_GLOOM] = BACK_ANIM_H_SLIDE, + [SPECIES_VILEPLUME] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_PARAS] = BACK_ANIM_H_SLIDE, + [SPECIES_PARASECT] = BACK_ANIM_H_SHAKE, + [SPECIES_VENONAT] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_VENOMOTH] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_DIGLETT] = BACK_ANIM_V_SHAKE, + [SPECIES_DUGTRIO] = BACK_ANIM_V_SHAKE, + [SPECIES_MEOWTH] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_PERSIAN] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_PSYDUCK] = BACK_ANIM_H_SLIDE, + [SPECIES_GOLDUCK] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_MANKEY] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_PRIMEAPE] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_GROWLITHE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_ARCANINE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_POLIWAG] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_POLIWHIRL] = BACK_ANIM_V_SHAKE, + [SPECIES_POLIWRATH] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_ABRA] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_KADABRA] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_ALAKAZAM] = BACK_ANIM_GROW_STUTTER, + [SPECIES_MACHOP] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_MACHOKE] = BACK_ANIM_V_SHAKE, + [SPECIES_MACHAMP] = BACK_ANIM_V_SHAKE, + [SPECIES_BELLSPROUT] = BACK_ANIM_V_STRETCH, + [SPECIES_WEEPINBELL] = BACK_ANIM_V_STRETCH, + [SPECIES_VICTREEBEL] = BACK_ANIM_V_STRETCH, + [SPECIES_TENTACOOL] = BACK_ANIM_H_SLIDE, [SPECIES_TENTACRUEL] = BACK_ANIM_H_SLIDE, - [SPECIES_GEODUDE] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_GRAVELER] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_GOLEM] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_PONYTA] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_RAPIDASH] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SLOWPOKE] = BACK_ANIM_H_SLIDE, - [SPECIES_SLOWBRO] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_MAGNEMITE] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_MAGNETON] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_FARFETCHD] = BACK_ANIM_H_SLIDE, - [SPECIES_DODUO] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_DODRIO] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SEEL] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_DEWGONG] = BACK_ANIM_H_SLIDE, - [SPECIES_GRIMER] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_MUK] = BACK_ANIM_HORIZONTAL_STRETCH, - [SPECIES_SHELLDER] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_CLOYSTER] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_GASTLY] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_HAUNTER] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_GENGAR] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_ONIX] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_DROWZEE] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_HYPNO] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_KRABBY] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_KINGLER] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_VOLTORB] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_ELECTRODE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_EXEGGCUTE] = BACK_ANIM_H_SLIDE, - [SPECIES_EXEGGUTOR] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_CUBONE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_MAROWAK] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_HITMONLEE] = BACK_ANIM_H_SLIDE, - [SPECIES_HITMONCHAN] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_LICKITUNG] = BACK_ANIM_H_SLIDE, - [SPECIES_KOFFING] = BACK_ANIM_GROW_1, - [SPECIES_WEEZING] = BACK_ANIM_GROW_1, - [SPECIES_RHYHORN] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_RHYDON] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_CHANSEY] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_TANGELA] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_KANGASKHAN] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_HORSEA] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_SEADRA] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_GOLDEEN] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_SEAKING] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_STARYU] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_STARMIE] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_MR_MIME] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_SCYTHER] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_JYNX] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_ELECTABUZZ] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_MAGMAR] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_PINSIR] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_TAUROS] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_MAGIKARP] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_GYARADOS] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_LAPRAS] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_DITTO] = BACK_ANIM_SHRINK_GROW_1, - [SPECIES_EEVEE] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_VAPOREON] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_JOLTEON] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_FLAREON] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_PORYGON] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_OMANYTE] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_OMASTAR] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_KABUTO] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_KABUTOPS] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_GEODUDE] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_GRAVELER] = BACK_ANIM_H_SHAKE, + [SPECIES_GOLEM] = BACK_ANIM_H_SHAKE, + [SPECIES_PONYTA] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_RAPIDASH] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SLOWPOKE] = BACK_ANIM_H_SLIDE, + [SPECIES_SLOWBRO] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_MAGNEMITE] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_MAGNETON] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_FARFETCHD] = BACK_ANIM_H_SLIDE, + [SPECIES_DODUO] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_DODRIO] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SEEL] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_DEWGONG] = BACK_ANIM_H_SLIDE, + [SPECIES_GRIMER] = BACK_ANIM_V_STRETCH, + [SPECIES_MUK] = BACK_ANIM_H_STRETCH, + [SPECIES_SHELLDER] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_CLOYSTER] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_GASTLY] = BACK_ANIM_H_VIBRATE, + [SPECIES_HAUNTER] = BACK_ANIM_H_VIBRATE, + [SPECIES_GENGAR] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_ONIX] = BACK_ANIM_V_SHAKE, + [SPECIES_DROWZEE] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_HYPNO] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_KRABBY] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_KINGLER] = BACK_ANIM_V_SHAKE, + [SPECIES_VOLTORB] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_ELECTRODE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_EXEGGCUTE] = BACK_ANIM_H_SLIDE, + [SPECIES_EXEGGUTOR] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_CUBONE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_MAROWAK] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_HITMONLEE] = BACK_ANIM_H_SLIDE, + [SPECIES_HITMONCHAN] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_LICKITUNG] = BACK_ANIM_H_SLIDE, + [SPECIES_KOFFING] = BACK_ANIM_GROW, + [SPECIES_WEEZING] = BACK_ANIM_GROW, + [SPECIES_RHYHORN] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_RHYDON] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_CHANSEY] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_TANGELA] = BACK_ANIM_V_STRETCH, + [SPECIES_KANGASKHAN] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_HORSEA] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_SEADRA] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_GOLDEEN] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_SEAKING] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_STARYU] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_STARMIE] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_MR_MIME] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_SCYTHER] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_JYNX] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_ELECTABUZZ] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_MAGMAR] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_PINSIR] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_TAUROS] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_MAGIKARP] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_GYARADOS] = BACK_ANIM_V_SHAKE, + [SPECIES_LAPRAS] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_DITTO] = BACK_ANIM_SHRINK_GROW, + [SPECIES_EEVEE] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_VAPOREON] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_JOLTEON] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_FLAREON] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_PORYGON] = BACK_ANIM_H_VIBRATE, + [SPECIES_OMANYTE] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_OMASTAR] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_KABUTO] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_KABUTOPS] = BACK_ANIM_JOLT_RIGHT, [SPECIES_AERODACTYL] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SNORLAX] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_ARTICUNO] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_ZAPDOS] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_MOLTRES] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_DRATINI] = BACK_ANIM_H_SLIDE, - [SPECIES_DRAGONAIR] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_DRAGONITE] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_MEWTWO] = BACK_ANIM_GROW_2, - [SPECIES_MEW] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_CHIKORITA] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_BAYLEEF] = BACK_ANIM_H_SLIDE, - [SPECIES_MEGANIUM] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_CYNDAQUIL] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_QUILAVA] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_TYPHLOSION] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_TOTODILE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_CROCONAW] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_FERALIGATR] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_SENTRET] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_FURRET] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_HOOTHOOT] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_NOCTOWL] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_LEDYBA] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_LEDIAN] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_SPINARAK] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_ARIADOS] = BACK_ANIM_H_SLIDE, - [SPECIES_CROBAT] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_CHINCHOU] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_LANTURN] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_PICHU] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_CLEFFA] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_IGGLYBUFF] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_TOGEPI] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_TOGETIC] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_NATU] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_XATU] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_MAREEP] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_FLAAFFY] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_AMPHAROS] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_BELLOSSOM] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_MARILL] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_AZUMARILL] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_SUDOWOODO] = BACK_ANIM_H_SLIDE, - [SPECIES_POLITOED] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_HOPPIP] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_SKIPLOOM] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_JUMPLUFF] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_AIPOM] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_SUNKERN] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_SUNFLORA] = BACK_ANIM_H_SLIDE, - [SPECIES_YANMA] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_WOOPER] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_QUAGSIRE] = BACK_ANIM_H_SLIDE, - [SPECIES_ESPEON] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_UMBREON] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_MURKROW] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_SLOWKING] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_MISDREAVUS] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_UNOWN] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_WOBBUFFET] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_GIRAFARIG] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_PINECO] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_FORRETRESS] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_DUNSPARCE] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_GLIGAR] = BACK_ANIM_SHRINK_GROW_1, - [SPECIES_STEELIX] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_SNUBBULL] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_GRANBULL] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_QWILFISH] = BACK_ANIM_GROW_2, - [SPECIES_SCIZOR] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SHUCKLE] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_HERACROSS] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SNEASEL] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_TEDDIURSA] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_URSARING] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_SLUGMA] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_MAGCARGO] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_SWINUB] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_PILOSWINE] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_CORSOLA] = BACK_ANIM_H_SLIDE, - [SPECIES_REMORAID] = BACK_ANIM_H_SLIDE, - [SPECIES_OCTILLERY] = BACK_ANIM_SHRINK_GROW_1, - [SPECIES_DELIBIRD] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_MANTINE] = BACK_ANIM_H_SLIDE, - [SPECIES_SKARMORY] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_HOUNDOUR] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_HOUNDOOM] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_KINGDRA] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_PHANPY] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_DONPHAN] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_PORYGON2] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_STANTLER] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_SMEARGLE] = BACK_ANIM_H_SLIDE, - [SPECIES_TYROGUE] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_HITMONTOP] = BACK_ANIM_CIRCLE_MOVE_COUNTERCLOCKWISE, - [SPECIES_SMOOCHUM] = BACK_ANIM_H_SLIDE, - [SPECIES_ELEKID] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_MAGBY] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_MILTANK] = BACK_ANIM_H_SLIDE, - [SPECIES_BLISSEY] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_RAIKOU] = BACK_ANIM_FLASH_YELLOW_WITH_SHAKE, - [SPECIES_ENTEI] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_SUICUNE] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_LARVITAR] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_PUPITAR] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_TYRANITAR] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_LUGIA] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_HO_OH] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_CELEBI] = BACK_ANIM_FADE_GREEN_WITH_SHAKE, - [SPECIES_TREECKO] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_GROVYLE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SCEPTILE] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_TORCHIC] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_COMBUSKEN] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_BLAZIKEN] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_MUDKIP] = BACK_ANIM_H_SLIDE, - [SPECIES_MARSHTOMP] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_SWAMPERT] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_POOCHYENA] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_MIGHTYENA] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_ZIGZAGOON] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_LINOONE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_WURMPLE] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_SILCOON] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_BEAUTIFLY] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_CASCOON] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_DUSTOX] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_LOTAD] = BACK_ANIM_H_SLIDE, - [SPECIES_LOMBRE] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_LUDICOLO] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_SEEDOT] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_NUZLEAF] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_SHIFTRY] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_NINCADA] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_NINJASK] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_SHEDINJA] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_TAILLOW] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_SWELLOW] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SHROOMISH] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_BRELOOM] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_SPINDA] = BACK_ANIM_CIRCLE_MOVE_COUNTERCLOCKWISE, - [SPECIES_WINGULL] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_PELIPPER] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_SURSKIT] = BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_1, - [SPECIES_MASQUERAIN] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_WAILMER] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_WAILORD] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_SKITTY] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_DELCATTY] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_KECLEON] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_BALTOY] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_CLAYDOL] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_NOSEPASS] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_TORKOAL] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_SABLEYE] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_BARBOACH] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_WHISCASH] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_LUVDISC] = BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_2, - [SPECIES_CORPHISH] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_CRAWDAUNT] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_FEEBAS] = BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_1, - [SPECIES_MILOTIC] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_CARVANHA] = BACK_ANIM_H_SLIDE_WITH_V_COMPRESS_2, - [SPECIES_SHARPEDO] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_TRAPINCH] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_VIBRAVA] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_FLYGON] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_MAKUHITA] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_HARIYAMA] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_ELECTRIKE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_MANECTRIC] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_NUMEL] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_CAMERUPT] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_SPHEAL] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_SEALEO] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_WALREIN] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_CACNEA] = BACK_ANIM_V_SHAKE_WITH_H_SLIDE, - [SPECIES_CACTURNE] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_SNORUNT] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_GLALIE] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_LUNATONE] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_SOLROCK] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_AZURILL] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_SPOINK] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_GRUMPIG] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_PLUSLE] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_MINUN] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_MAWILE] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_MEDITITE] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_MEDICHAM] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_SWABLU] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_ALTARIA] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_WYNAUT] = BACK_ANIM_CONCAVE_UP_ARC_SWAY_LARGE, - [SPECIES_DUSKULL] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_DUSCLOPS] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_ROSELIA] = BACK_ANIM_FADE_GREEN_WITH_SHAKE, - [SPECIES_SLAKOTH] = BACK_ANIM_H_SLIDE, - [SPECIES_VIGOROTH] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_SMALL, - [SPECIES_SLAKING] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_GULPIN] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_SWALOT] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_TROPIUS] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_WHISMUR] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_LOUDRED] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_EXPLOUD] = BACK_ANIM_GROW_2, - [SPECIES_CLAMPERL] = BACK_ANIM_DIP_RIGHT_SIDE, - [SPECIES_HUNTAIL] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_GOREBYSS] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_ABSOL] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_SHUPPET] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_BANETTE] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_SEVIPER] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_ZANGOOSE] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_RELICANTH] = BACK_ANIM_H_SLIDE, - [SPECIES_ARON] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_LAIRON] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_AGGRON] = BACK_ANIM_V_SHAKE_WITH_PAUSE, - [SPECIES_CASTFORM] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_VOLBEAT] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_ILLUMISE] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_LILEEP] = BACK_ANIM_HORIZONTAL_STRETCH, - [SPECIES_CRADILY] = BACK_ANIM_VERTICAL_STRETCH, - [SPECIES_ANORITH] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_ARMALDO] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_RALTS] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_KIRLIA] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_GARDEVOIR] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_BAGON] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_SHELGON] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_SALAMENCE] = BACK_ANIM_HORIZONTAL_SHAKE, - [SPECIES_BELDUM] = BACK_ANIM_CIRCLE_MOVE_CLOCKWISE, - [SPECIES_METANG] = BACK_ANIM_JOLT_RIGHT, - [SPECIES_METAGROSS] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_REGIROCK] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_REGICE] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_REGISTEEL] = BACK_ANIM_VERTICAL_SHAKE, - [SPECIES_KYOGRE] = BACK_ANIM_FADE_BLUE_WITH_SHAKE, - [SPECIES_GROUDON] = BACK_ANIM_FADE_RED_WITH_SHAKE, - [SPECIES_RAYQUAZA] = BACK_ANIM_GROW_2, - [SPECIES_LATIAS] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_LATIOS] = BACK_ANIM_H_SLIDE_QUICK, - [SPECIES_JIRACHI] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, - [SPECIES_DEOXYS] = BACK_ANIM_SHRINK_GROW_2, - [SPECIES_CHIMECHO] = BACK_ANIM_CONCAVE_DOWN_ARC_SWAY_LARGE, + [SPECIES_SNORLAX] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_ARTICUNO] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_ZAPDOS] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_MOLTRES] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_DRATINI] = BACK_ANIM_H_SLIDE, + [SPECIES_DRAGONAIR] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_DRAGONITE] = BACK_ANIM_V_SHAKE, + [SPECIES_MEWTWO] = BACK_ANIM_GROW_STUTTER, + [SPECIES_MEW] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_CHIKORITA] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_BAYLEEF] = BACK_ANIM_H_SLIDE, + [SPECIES_MEGANIUM] = BACK_ANIM_V_SHAKE, + [SPECIES_CYNDAQUIL] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_QUILAVA] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_TYPHLOSION] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_TOTODILE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_CROCONAW] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_FERALIGATR] = BACK_ANIM_V_SHAKE, + [SPECIES_SENTRET] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_FURRET] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_HOOTHOOT] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_NOCTOWL] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_LEDYBA] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_LEDIAN] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_SPINARAK] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_ARIADOS] = BACK_ANIM_H_SLIDE, + [SPECIES_CROBAT] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_CHINCHOU] = BACK_ANIM_V_STRETCH, + [SPECIES_LANTURN] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_PICHU] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_CLEFFA] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_IGGLYBUFF] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_TOGEPI] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_TOGETIC] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_NATU] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_XATU] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_MAREEP] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_FLAAFFY] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_AMPHAROS] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_BELLOSSOM] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_MARILL] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_AZUMARILL] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_SUDOWOODO] = BACK_ANIM_H_SLIDE, + [SPECIES_POLITOED] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_HOPPIP] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_SKIPLOOM] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_JUMPLUFF] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_AIPOM] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_SUNKERN] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_SUNFLORA] = BACK_ANIM_H_SLIDE, + [SPECIES_YANMA] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_WOOPER] = BACK_ANIM_V_STRETCH, + [SPECIES_QUAGSIRE] = BACK_ANIM_H_SLIDE, + [SPECIES_ESPEON] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_UMBREON] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_MURKROW] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_SLOWKING] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_MISDREAVUS] = BACK_ANIM_H_VIBRATE, + [SPECIES_UNOWN] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_WOBBUFFET] = BACK_ANIM_V_STRETCH, + [SPECIES_GIRAFARIG] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_PINECO] = BACK_ANIM_H_SHAKE, + [SPECIES_FORRETRESS] = BACK_ANIM_V_SHAKE, + [SPECIES_DUNSPARCE] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_GLIGAR] = BACK_ANIM_SHRINK_GROW, + [SPECIES_STEELIX] = BACK_ANIM_V_SHAKE, + [SPECIES_SNUBBULL] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_GRANBULL] = BACK_ANIM_V_SHAKE, + [SPECIES_QWILFISH] = BACK_ANIM_GROW_STUTTER, + [SPECIES_SCIZOR] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SHUCKLE] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_HERACROSS] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SNEASEL] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_TEDDIURSA] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_URSARING] = BACK_ANIM_V_SHAKE, + [SPECIES_SLUGMA] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_MAGCARGO] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_SWINUB] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_PILOSWINE] = BACK_ANIM_H_SHAKE, + [SPECIES_CORSOLA] = BACK_ANIM_H_SLIDE, + [SPECIES_REMORAID] = BACK_ANIM_H_SLIDE, + [SPECIES_OCTILLERY] = BACK_ANIM_SHRINK_GROW, + [SPECIES_DELIBIRD] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_MANTINE] = BACK_ANIM_H_SLIDE, + [SPECIES_SKARMORY] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_HOUNDOUR] = BACK_ANIM_V_SHAKE, + [SPECIES_HOUNDOOM] = BACK_ANIM_V_SHAKE, + [SPECIES_KINGDRA] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_PHANPY] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_DONPHAN] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_PORYGON2] = BACK_ANIM_H_VIBRATE, + [SPECIES_STANTLER] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_SMEARGLE] = BACK_ANIM_H_SLIDE, + [SPECIES_TYROGUE] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_HITMONTOP] = BACK_ANIM_CIRCLE_COUNTERCLOCKWISE, + [SPECIES_SMOOCHUM] = BACK_ANIM_H_SLIDE, + [SPECIES_ELEKID] = BACK_ANIM_H_SHAKE, + [SPECIES_MAGBY] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_MILTANK] = BACK_ANIM_H_SLIDE, + [SPECIES_BLISSEY] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_RAIKOU] = BACK_ANIM_SHAKE_FLASH_YELLOW, + [SPECIES_ENTEI] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_SUICUNE] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_LARVITAR] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_PUPITAR] = BACK_ANIM_V_SHAKE, + [SPECIES_TYRANITAR] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_LUGIA] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_HO_OH] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_CELEBI] = BACK_ANIM_SHAKE_GLOW_GREEN, + [SPECIES_TREECKO] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_GROVYLE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SCEPTILE] = BACK_ANIM_V_SHAKE, + [SPECIES_TORCHIC] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_COMBUSKEN] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_BLAZIKEN] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_MUDKIP] = BACK_ANIM_H_SLIDE, + [SPECIES_MARSHTOMP] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_SWAMPERT] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_POOCHYENA] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_MIGHTYENA] = BACK_ANIM_H_SHAKE, + [SPECIES_ZIGZAGOON] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_LINOONE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_WURMPLE] = BACK_ANIM_V_STRETCH, + [SPECIES_SILCOON] = BACK_ANIM_H_SHAKE, + [SPECIES_BEAUTIFLY] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_CASCOON] = BACK_ANIM_H_SHAKE, + [SPECIES_DUSTOX] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_LOTAD] = BACK_ANIM_H_SLIDE, + [SPECIES_LOMBRE] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_LUDICOLO] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_SEEDOT] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_NUZLEAF] = BACK_ANIM_V_SHAKE, + [SPECIES_SHIFTRY] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_NINCADA] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_NINJASK] = BACK_ANIM_H_VIBRATE, + [SPECIES_SHEDINJA] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_TAILLOW] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_SWELLOW] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SHROOMISH] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_BRELOOM] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_SPINDA] = BACK_ANIM_CIRCLE_COUNTERCLOCKWISE, + [SPECIES_WINGULL] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_PELIPPER] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_SURSKIT] = BACK_ANIM_H_SPRING, + [SPECIES_MASQUERAIN] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_WAILMER] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_WAILORD] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_SKITTY] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_DELCATTY] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_KECLEON] = BACK_ANIM_H_VIBRATE, + [SPECIES_BALTOY] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_CLAYDOL] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_NOSEPASS] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_TORKOAL] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_SABLEYE] = BACK_ANIM_H_VIBRATE, + [SPECIES_BARBOACH] = BACK_ANIM_V_STRETCH, + [SPECIES_WHISCASH] = BACK_ANIM_V_SHAKE, + [SPECIES_LUVDISC] = BACK_ANIM_H_SPRING_REPEATED, + [SPECIES_CORPHISH] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_CRAWDAUNT] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_FEEBAS] = BACK_ANIM_H_SPRING, + [SPECIES_MILOTIC] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_CARVANHA] = BACK_ANIM_H_SPRING_REPEATED, + [SPECIES_SHARPEDO] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_TRAPINCH] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_VIBRAVA] = BACK_ANIM_H_VIBRATE, + [SPECIES_FLYGON] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_MAKUHITA] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_HARIYAMA] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_ELECTRIKE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_MANECTRIC] = BACK_ANIM_V_SHAKE, + [SPECIES_NUMEL] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_CAMERUPT] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_SPHEAL] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_SEALEO] = BACK_ANIM_V_SHAKE, + [SPECIES_WALREIN] = BACK_ANIM_V_SHAKE, + [SPECIES_CACNEA] = BACK_ANIM_V_SHAKE_H_SLIDE, + [SPECIES_CACTURNE] = BACK_ANIM_H_SHAKE, + [SPECIES_SNORUNT] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_GLALIE] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_LUNATONE] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_SOLROCK] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_AZURILL] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_SPOINK] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_GRUMPIG] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_PLUSLE] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_MINUN] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_MAWILE] = BACK_ANIM_V_SHAKE, + [SPECIES_MEDITITE] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_MEDICHAM] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_SWABLU] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_ALTARIA] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_WYNAUT] = BACK_ANIM_CONCAVE_ARC_SMALL, + [SPECIES_DUSKULL] = BACK_ANIM_H_VIBRATE, + [SPECIES_DUSCLOPS] = BACK_ANIM_H_VIBRATE, + [SPECIES_ROSELIA] = BACK_ANIM_SHAKE_GLOW_GREEN, + [SPECIES_SLAKOTH] = BACK_ANIM_H_SLIDE, + [SPECIES_VIGOROTH] = BACK_ANIM_CONCAVE_ARC_LARGE, + [SPECIES_SLAKING] = BACK_ANIM_H_SHAKE, + [SPECIES_GULPIN] = BACK_ANIM_V_STRETCH, + [SPECIES_SWALOT] = BACK_ANIM_V_STRETCH, + [SPECIES_TROPIUS] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_WHISMUR] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_LOUDRED] = BACK_ANIM_V_SHAKE, + [SPECIES_EXPLOUD] = BACK_ANIM_GROW_STUTTER, + [SPECIES_CLAMPERL] = BACK_ANIM_DIP_RIGHT_SIDE, + [SPECIES_HUNTAIL] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_GOREBYSS] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_ABSOL] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_SHUPPET] = BACK_ANIM_H_VIBRATE, + [SPECIES_BANETTE] = BACK_ANIM_H_VIBRATE, + [SPECIES_SEVIPER] = BACK_ANIM_V_STRETCH, + [SPECIES_ZANGOOSE] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_RELICANTH] = BACK_ANIM_H_SLIDE, + [SPECIES_ARON] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_LAIRON] = BACK_ANIM_V_SHAKE, + [SPECIES_AGGRON] = BACK_ANIM_V_SHAKE_LOW, + [SPECIES_CASTFORM] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_VOLBEAT] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_ILLUMISE] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_LILEEP] = BACK_ANIM_H_STRETCH, + [SPECIES_CRADILY] = BACK_ANIM_V_STRETCH, + [SPECIES_ANORITH] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_ARMALDO] = BACK_ANIM_V_SHAKE, + [SPECIES_RALTS] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_KIRLIA] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_GARDEVOIR] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_BAGON] = BACK_ANIM_V_SHAKE, + [SPECIES_SHELGON] = BACK_ANIM_V_SHAKE, + [SPECIES_SALAMENCE] = BACK_ANIM_H_SHAKE, + [SPECIES_BELDUM] = BACK_ANIM_TRIANGLE_DOWN, + [SPECIES_METANG] = BACK_ANIM_JOLT_RIGHT, + [SPECIES_METAGROSS] = BACK_ANIM_V_SHAKE, + [SPECIES_REGIROCK] = BACK_ANIM_V_SHAKE, + [SPECIES_REGICE] = BACK_ANIM_V_SHAKE, + [SPECIES_REGISTEEL] = BACK_ANIM_V_SHAKE, + [SPECIES_KYOGRE] = BACK_ANIM_SHAKE_GLOW_BLUE, + [SPECIES_GROUDON] = BACK_ANIM_SHAKE_GLOW_RED, + [SPECIES_RAYQUAZA] = BACK_ANIM_GROW_STUTTER, + [SPECIES_LATIAS] = BACK_ANIM_H_VIBRATE, + [SPECIES_LATIOS] = BACK_ANIM_H_VIBRATE, + [SPECIES_JIRACHI] = BACK_ANIM_CONVEX_DOUBLE_ARC, + [SPECIES_DEOXYS] = BACK_ANIM_SHRINK_GROW_VIBRATE, + [SPECIES_CHIMECHO] = BACK_ANIM_CONVEX_DOUBLE_ARC, }; -static const u8 sUnknown_0860AA64[][2] = -{ - {0, 5}, - {1, 1}, - {0, 15}, - {1, 4}, - {0, 2}, - {1, 2}, - {0, 2}, - {1, 2}, - {0, 2}, - {1, 2}, - {0, 2}, - {1, 2}, - {0, 2}, - {0, 0xFF} +// Equivalent to struct YellowFlashData, but doesn't match as a struct +static const u8 sYellowFlashData[][2] = +{ + {FALSE, 5}, + { TRUE, 1}, + {FALSE, 15}, + { TRUE, 4}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + {FALSE, -1} }; -static const u8 sUnknown_0860AA80[][2] = +static const u8 sVerticalShakeData[][2] = { - {6, 30}, - {0xFE, 15}, - {6, 30}, - {0xFF, 0} + { 6, 30}, + {-2, 15}, + { 6, 30}, + {-1, 0} }; static void (* const sMonAnimFunctions[])(struct Sprite *sprite) = { - pokemonanimfunc_00, - pokemonanimfunc_01, - pokemonanimfunc_02, - pokemonanimfunc_03, - pokemonanimfunc_04, - pokemonanimfunc_05, - pokemonanimfunc_06, - pokemonanimfunc_07, - pokemonanimfunc_08, - pokemonanimfunc_09, - pokemonanimfunc_0A, - pokemonanimfunc_0B, - pokemonanimfunc_0C, - pokemonanimfunc_0D, - pokemonanimfunc_0E, - pokemonanimfunc_0F, - pokemonanimfunc_10, - pokemonanimfunc_11, - pokemonanimfunc_12, - pokemonanimfunc_13, - pokemonanimfunc_14, - pokemonanimfunc_15, - pokemonanimfunc_16, - pokemonanimfunc_17, - pokemonanimfunc_18, - pokemonanimfunc_19, - pokemonanimfunc_1A, - pokemonanimfunc_1B, - pokemonanimfunc_1C, - pokemonanimfunc_1D, - pokemonanimfunc_1E, - pokemonanimfunc_1F, - pokemonanimfunc_20, - pokemonanimfunc_21, - pokemonanimfunc_22, - pokemonanimfunc_23, - pokemonanimfunc_24, - pokemonanimfunc_25, - pokemonanimfunc_26, - pokemonanimfunc_27, - pokemonanimfunc_28, - pokemonanimfunc_29, - pokemonanimfunc_2A, - pokemonanimfunc_2B, - pokemonanimfunc_2C, - pokemonanimfunc_2D, - pokemonanimfunc_2E, - pokemonanimfunc_2F, - pokemonanimfunc_30, - pokemonanimfunc_31, - pokemonanimfunc_32, - pokemonanimfunc_33, - pokemonanimfunc_34, - pokemonanimfunc_35, - pokemonanimfunc_36, - pokemonanimfunc_37, - pokemonanimfunc_38, - pokemonanimfunc_39, - pokemonanimfunc_3A, - pokemonanimfunc_3B, - pokemonanimfunc_3C, - pokemonanimfunc_3D, - pokemonanimfunc_3E, - pokemonanimfunc_3F, - pokemonanimfunc_40, - pokemonanimfunc_41, - pokemonanimfunc_42, - pokemonanimfunc_43, - pokemonanimfunc_44, - pokemonanimfunc_45, - pokemonanimfunc_46, - pokemonanimfunc_47, - pokemonanimfunc_48, - pokemonanimfunc_49, - pokemonanimfunc_4A, - pokemonanimfunc_4B, - pokemonanimfunc_4C, - pokemonanimfunc_4D, - pokemonanimfunc_4E, - pokemonanimfunc_4F, - pokemonanimfunc_50, - pokemonanimfunc_51, - pokemonanimfunc_52, - pokemonanimfunc_53, - pokemonanimfunc_54, - pokemonanimfunc_55, - pokemonanimfunc_56, - pokemonanimfunc_57, - pokemonanimfunc_58, - pokemonanimfunc_59, - pokemonanimfunc_5A, - pokemonanimfunc_5B, - pokemonanimfunc_5C, - pokemonanimfunc_5D, - pokemonanimfunc_5E, - pokemonanimfunc_5F, - pokemonanimfunc_60, - pokemonanimfunc_61, - pokemonanimfunc_62, - pokemonanimfunc_63, - pokemonanimfunc_64, - pokemonanimfunc_65, - pokemonanimfunc_66, - pokemonanimfunc_67, - pokemonanimfunc_68, - pokemonanimfunc_69, - pokemonanimfunc_6A, - pokemonanimfunc_6B, - pokemonanimfunc_6C, - pokemonanimfunc_6D, - pokemonanimfunc_6E, - pokemonanimfunc_6F, - pokemonanimfunc_70, - pokemonanimfunc_71, - pokemonanimfunc_72, - pokemonanimfunc_73, - pokemonanimfunc_74, - pokemonanimfunc_75, - pokemonanimfunc_76, - pokemonanimfunc_77, - pokemonanimfunc_78, - pokemonanimfunc_79, - pokemonanimfunc_7A, - pokemonanimfunc_7B, - pokemonanimfunc_7C, - pokemonanimfunc_7D, - pokemonanimfunc_7E, - pokemonanimfunc_7F, - pokemonanimfunc_80, - pokemonanimfunc_81, - pokemonanimfunc_82, - pokemonanimfunc_83, - pokemonanimfunc_84, - pokemonanimfunc_85, - pokemonanimfunc_86, - pokemonanimfunc_87, - pokemonanimfunc_88, - pokemonanimfunc_89, - pokemonanimfunc_8A, - pokemonanimfunc_8B, - pokemonanimfunc_8C, - pokemonanimfunc_8D, - pokemonanimfunc_8E, - pokemonanimfunc_8F, - pokemonanimfunc_90, - pokemonanimfunc_91, - pokemonanimfunc_92, - pokemonanimfunc_93, - pokemonanimfunc_94, - pokemonanimfunc_95, - pokemonanimfunc_96 + [ANIM_V_SQUISH_AND_BOUNCE] = Anim_VerticalSquishBounce, + [ANIM_CIRCULAR_STRETCH_TWICE] = Anim_CircularStretchTwice, + [ANIM_H_VIBRATE] = Anim_HorizontalVibrate, + [ANIM_H_SLIDE] = Anim_HorizontalSlide, + [ANIM_V_SLIDE] = Anim_VerticalSlide, + [ANIM_BOUNCE_ROTATE_TO_SIDES] = Anim_BounceRotateToSides, + [ANIM_V_JUMPS_H_JUMPS] = Anim_VerticalJumpsHorizontalJumps, + [ANIM_ROTATE_TO_SIDES] = Anim_RotateToSides, // Unused + [ANIM_ROTATE_TO_SIDES_TWICE] = Anim_RotateToSides_Twice, + [ANIM_GROW_VIBRATE] = Anim_GrowVibrate, + [ANIM_ZIGZAG_FAST] = Anim_ZigzagFast, + [ANIM_SWING_CONCAVE] = Anim_SwingConcave, + [ANIM_SWING_CONCAVE_FAST] = Anim_SwingConcave_Fast, + [ANIM_SWING_CONVEX] = Anim_SwingConvex, + [ANIM_SWING_CONVEX_FAST] = Anim_SwingConvex_Fast, + [ANIM_H_SHAKE] = Anim_HorizontalShake, + [ANIM_V_SHAKE] = Anim_VerticalShake, + [ANIM_CIRCULAR_VIBRATE] = Anim_CircularVibrate, + [ANIM_TWIST] = Anim_Twist, + [ANIM_SHRINK_GROW] = Anim_ShrinkGrow, + [ANIM_CIRCLE_C_CLOCKWISE] = Anim_CircleCounterclockwise, + [ANIM_GLOW_BLACK] = Anim_GlowBlack, + [ANIM_H_STRETCH] = Anim_HorizontalStretch, + [ANIM_V_STRETCH] = Anim_VerticalStretch, + [ANIM_RISING_WOBBLE] = Anim_RisingWobble, + [ANIM_V_SHAKE_TWICE] = Anim_VerticalShakeTwice, + [ANIM_TIP_MOVE_FORWARD] = Anim_TipMoveForward, + [ANIM_H_PIVOT] = Anim_HorizontalPivot, + [ANIM_V_SLIDE_WOBBLE] = Anim_VerticalSlideWobble, + [ANIM_H_SLIDE_WOBBLE] = Anim_HorizontalSlideWobble, + [ANIM_V_JUMPS_BIG] = Anim_VerticalJumps_Big, + [ANIM_SPIN_LONG] = Anim_Spin_Long, // Unused + [ANIM_GLOW_ORANGE] = Anim_GlowOrange, + [ANIM_GLOW_RED] = Anim_GlowRed, // Unused + [ANIM_GLOW_BLUE] = Anim_GlowBlue, + [ANIM_GLOW_YELLOW] = Anim_GlowYellow, // Unused + [ANIM_GLOW_PURPLE] = Anim_GlowPurple, // Unused + [ANIM_BACK_AND_LUNGE] = Anim_BackAndLunge, + [ANIM_BACK_FLIP] = Anim_BackFlip, // Unused + [ANIM_FLICKER] = Anim_Flicker, // Unused + [ANIM_BACK_FLIP_BIG] = Anim_BackFlipBig, // Unused + [ANIM_FRONT_FLIP] = Anim_FrontFlip, + [ANIM_TUMBLING_FRONT_FLIP] = Anim_TumblingFrontFlip, // Unused + [ANIM_FIGURE_8] = Anim_Figure8, + [ANIM_FLASH_YELLOW] = Anim_FlashYellow, + [ANIM_SWING_CONCAVE_FAST_SHORT] = Anim_SwingConcave_FastShort, + [ANIM_SWING_CONVEX_FAST_SHORT] = Anim_SwingConvex_FastShort, // Unused + [ANIM_ROTATE_UP_SLAM_DOWN] = Anim_RotateUpSlamDown, + [ANIM_DEEP_V_SQUISH_AND_BOUNCE] = Anim_DeepVerticalSquishBounce, + [ANIM_H_JUMPS] = Anim_HorizontalJumps, + [ANIM_H_JUMPS_V_STRETCH] = Anim_HorizontalJumpsVerticalStretch, + [ANIM_ROTATE_TO_SIDES_FAST] = Anim_RotateToSides_Fast, // Unused + [ANIM_ROTATE_UP_TO_SIDES] = Anim_RotateUpToSides, + [ANIM_FLICKER_INCREASING] = Anim_FlickerIncreasing, + [ANIM_TIP_HOP_FORWARD] = Anim_TipHopForward, // Unused + [ANIM_PIVOT_SHAKE] = Anim_PivotShake, // Unused + [ANIM_TIP_AND_SHAKE] = Anim_TipAndShake, // Unused + [ANIM_VIBRATE_TO_CORNERS] = Anim_VibrateToCorners, // Unused + [ANIM_GROW_IN_STAGES] = Anim_GrowInStages, + [ANIM_V_SPRING] = Anim_VerticalSpring, // Unused + [ANIM_V_REPEATED_SPRING] = Anim_VerticalRepeatedSpring, // Unused + [ANIM_SPRING_RISING] = Anim_SpringRising, // Unused + [ANIM_H_SPRING] = Anim_HorizontalSpring, + [ANIM_H_REPEATED_SPRING_SLOW] = Anim_HorizontalRepeatedSpring_Slow, + [ANIM_H_SLIDE_SHRINK] = Anim_HorizontalSlideShrink, // Unused + [ANIM_LUNGE_GROW] = Anim_LungeGrow, + [ANIM_CIRCLE_INTO_BG] = Anim_CircleIntoBackground, + [ANIM_RAPID_H_HOPS] = Anim_RapidHorizontalHops, + [ANIM_FOUR_PETAL] = Anim_FourPetal, + [ANIM_V_SQUISH_AND_BOUNCE_SLOW] = Anim_VerticalSquishBounce_Slow, + [ANIM_H_SLIDE_SLOW] = Anim_HorizontalSlide_Slow, + [ANIM_V_SLIDE_SLOW] = Anim_VerticalSlide_Slow, + [ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL] = Anim_BounceRotateToSides_Small, + [ANIM_BOUNCE_ROTATE_TO_SIDES_SLOW] = Anim_BounceRotateToSides_Slow, + [ANIM_BOUNCE_ROTATE_TO_SIDES_SMALL_SLOW] = Anim_BounceRotateToSides_SmallSlow, + [ANIM_ZIGZAG_SLOW] = Anim_ZigzagSlow, + [ANIM_H_SHAKE_SLOW] = Anim_HorizontalShake_Slow, + [ANIM_V_SHAKE_SLOW] = Anim_VertialShake_Slow, // Unused + [ANIM_TWIST_TWICE] = Anim_Twist_Twice, + [ANIM_CIRCLE_C_CLOCKWISE_SLOW] = Anim_CircleCounterclockwise_Slow, + [ANIM_V_SHAKE_TWICE_SLOW] = Anim_VerticalShakeTwice_Slow, // Unused + [ANIM_V_SLIDE_WOBBLE_SMALL] = Anim_VerticalSlideWobble_Small, + [ANIM_V_JUMPS_SMALL] = Anim_VerticalJumps_Small, + [ANIM_SPIN] = Anim_Spin, + [ANIM_TUMBLING_FRONT_FLIP_TWICE] = Anim_TumblingFrontFlip_Twice, + [ANIM_DEEP_V_SQUISH_AND_BOUNCE_TWICE] = Anim_DeepVerticalSquishBounce_Twice, // Unused + [ANIM_H_JUMPS_V_STRETCH_TWICE] = Anim_HorizontalJumpsVerticalStretch_Twice, + [ANIM_V_SHAKE_BACK] = Anim_VerticalShakeBack, + [ANIM_V_SHAKE_BACK_SLOW] = Anim_VerticalShakeBack_Slow, + [ANIM_V_SHAKE_H_SLIDE_SLOW] = Anim_VerticalShakeHorizontalSlide_Slow, + [ANIM_V_STRETCH_BOTH_ENDS_SLOW] = Anim_VerticalStretchBothEnds_Slow, + [ANIM_H_STRETCH_FAR_SLOW] = Anim_HorizontalStretchFar_Slow, + [ANIM_V_SHAKE_LOW_TWICE] = Anim_VerticalShakeLowTwice, + [ANIM_H_SHAKE_FAST] = Anim_HorizontalShake_Fast, + [ANIM_H_SLIDE_FAST] = Anim_HorizontalSlide_Fast, + [ANIM_H_VIBRATE_FAST] = Anim_HorizontalVibrate_Fast, + [ANIM_H_VIBRATE_FASTEST] = Anim_HorizontalVibrate_Fastest, + [ANIM_V_SHAKE_BACK_FAST] = Anim_VerticalShakeBack_Fast, + [ANIM_V_SHAKE_LOW_TWICE_SLOW] = Anim_VerticalShakeLowTwice_Slow, + [ANIM_V_SHAKE_LOW_TWICE_FAST] = Anim_VerticalShakeLowTwice_Fast, + [ANIM_CIRCLE_C_CLOCKWISE_LONG] = Anim_CircleCounterclockwise_Long, + [ANIM_GROW_STUTTER_SLOW] = Anim_GrowStutter_Slow, + [ANIM_V_SHAKE_H_SLIDE] = Anim_VerticalShakeHorizontalSlide, + [ANIM_V_SHAKE_H_SLIDE_FAST] = Anim_VerticalShakeHorizontalSlide_Fast, + [ANIM_TRIANGLE_DOWN_SLOW] = Anim_TriangleDown_Slow, + [ANIM_TRIANGLE_DOWN] = Anim_TriangleDown, + [ANIM_TRIANGLE_DOWN_TWICE] = Anim_TriangleDown_Fast, + [ANIM_GROW] = Anim_Grow, + [ANIM_GROW_TWICE] = Anim_Grow_Twice, + [ANIM_H_SPRING_FAST] = Anim_HorizontalSpring_Fast, + [ANIM_H_SPRING_SLOW] = Anim_HorizontalSpring_Slow, + [ANIM_H_REPEATED_SPRING_FAST] = Anim_HorizontalRepeatedSpring_Fast, + [ANIM_H_REPEATED_SPRING] = Anim_HorizontalRepeatedSpring, + [ANIM_SHRINK_GROW_FAST] = Anim_ShrinkGrow_Fast, + [ANIM_SHRINK_GROW_SLOW] = Anim_ShrinkGrow_Slow, + [ANIM_V_STRETCH_BOTH_ENDS] = Anim_VerticalStretchBothEnds, + [ANIM_V_STRETCH_BOTH_ENDS_TWICE] = Anim_VerticalStretchBothEnds_Twice, + [ANIM_H_STRETCH_FAR_TWICE] = Anim_HorizontalStretchFar_Twice, + [ANIM_H_STRETCH_FAR] = Anim_HorizontalStretchFar, + [ANIM_GROW_STUTTER_TWICE] = Anim_GrowStutter_Twice, + [ANIM_GROW_STUTTER] = Anim_GrowStutter, + [ANIM_CONCAVE_ARC_LARGE_SLOW] = Anim_ConcaveArcLarge_Slow, + [ANIM_CONCAVE_ARC_LARGE] = Anim_ConcaveArcLarge, + [ANIM_CONCAVE_ARC_LARGE_TWICE] = Anim_ConcaveArcLarge_Twice, + [ANIM_CONVEX_DOUBLE_ARC_SLOW] = Anim_ConvexDoubleArc_Slow, + [ANIM_CONVEX_DOUBLE_ARC] = Anim_ConvexDoubleArc, + [ANIM_CONVEX_DOUBLE_ARC_TWICE] = Anim_ConvexDoubleArc_Twice, + [ANIM_CONCAVE_ARC_SMALL_SLOW] = Anim_ConcaveArcSmall_Slow, + [ANIM_CONCAVE_ARC_SMALL] = Anim_ConcaveArcSmall, + [ANIM_CONCAVE_ARC_SMALL_TWICE] = Anim_ConcaveArcSmall_Twice, + [ANIM_H_DIP] = Anim_HorizontalDip, + [ANIM_H_DIP_FAST] = Anim_HorizontalDip_Fast, + [ANIM_H_DIP_TWICE] = Anim_HorizontalDip_Twice, + [ANIM_SHRINK_GROW_VIBRATE_FAST] = Anim_ShrinkGrowVibrate_Fast, + [ANIM_SHRINK_GROW_VIBRATE] = Anim_ShrinkGrowVibrate, + [ANIM_SHRINK_GROW_VIBRATE_SLOW] = Anim_ShrinkGrowVibrate_Slow, + [ANIM_JOLT_RIGHT_FAST] = Anim_JoltRight_Fast, + [ANIM_JOLT_RIGHT] = Anim_JoltRight, + [ANIM_JOLT_RIGHT_SLOW] = Anim_JoltRight_Slow, + [ANIM_SHAKE_FLASH_YELLOW_FAST] = Anim_ShakeFlashYellow_Fast, + [ANIM_SHAKE_FLASH_YELLOW] = Anim_ShakeFlashYellow, + [ANIM_SHAKE_FLASH_YELLOW_SLOW] = Anim_ShakeFlashYellow_Slow, + [ANIM_SHAKE_GLOW_RED_FAST] = Anim_ShakeGlowRed_Fast, + [ANIM_SHAKE_GLOW_RED] = Anim_ShakeGlowRed, + [ANIM_SHAKE_GLOW_RED_SLOW] = Anim_ShakeGlowRed_Slow, + [ANIM_SHAKE_GLOW_GREEN_FAST] = Anim_ShakeGlowGreen_Fast, + [ANIM_SHAKE_GLOW_GREEN] = Anim_ShakeGlowGreen, + [ANIM_SHAKE_GLOW_GREEN_SLOW] = Anim_ShakeGlowGreen_Slow, + [ANIM_SHAKE_GLOW_BLUE_FAST] = Anim_ShakeGlowBlue_Fast, + [ANIM_SHAKE_GLOW_BLUE] = Anim_ShakeGlowBlue, + [ANIM_SHAKE_GLOW_BLUE_SLOW] = Anim_ShakeGlowBlue_Slow }; -// counting from Id 1, because 0 in sSpeciesToBackAnimSet is used for mons with no back animation +// Each back anim set has 3 possible animations depending on nature +// Each of the 3 animations is a slight variation of the others +// BACK_ANIM_NONE is skipped below. GetSpeciesBackAnimSet subtracts 1 from the back anim id static const u8 sBackAnimationIds[] = { - 0x60, 0x5f, 0x02, // 1 - 0x5e, 0x03, 0x46, // 2 - 0x6d, 0x3e, 0x6e, // 3 - 0x6f, 0x70, 0x3f, // 4 - 0x71, 0x13, 0x72, // 5 - 0x6c, 0x6b, 0x3a, // 6 - 0x64, 0x14, 0x4f, // 7 - 0x5d, 0x0f, 0x4c, // 8 - 0x61, 0x57, 0x58, // 9 - 0x67, 0x66, 0x59, // 0xA - 0x74, 0x73, 0x5a, // 0xB - 0x75, 0x76, 0x5b, // 0xC - 0x77, 0x78, 0x65, // 0xD - 0x63, 0x5c, 0x62, // 0xE - 0x6a, 0x69, 0x68, // 0xF - 0x7b, 0x7a, 0x79, // 0x10 - 0x7e, 0x7d, 0x7c, // 0x11 - 0x81, 0x80, 0x7f, // 0x12 - 0x84, 0x82, 0x83, // 0x13 - 0x85, 0x86, 0x87, // 0x14 - 0x88, 0x89, 0x8a, // 0x15 - 0x8b, 0x8c, 0x8d, // 0x16 - 0x8e, 0x8f, 0x90, // 0x17 - 0x91, 0x92, 0x93, // 0x18 - 0x94, 0x95, 0x96, // 0x19 + [(BACK_ANIM_H_VIBRATE - 1) * 3] = ANIM_H_VIBRATE_FASTEST, ANIM_H_VIBRATE_FAST, ANIM_H_VIBRATE, + [(BACK_ANIM_H_SLIDE - 1) * 3] = ANIM_H_SLIDE_FAST, ANIM_H_SLIDE, ANIM_H_SLIDE_SLOW, + [(BACK_ANIM_H_SPRING - 1) * 3] = ANIM_H_SPRING_FAST, ANIM_H_SPRING, ANIM_H_SPRING_SLOW, + [(BACK_ANIM_H_SPRING_REPEATED - 1) * 3] = ANIM_H_REPEATED_SPRING_FAST, ANIM_H_REPEATED_SPRING, ANIM_H_REPEATED_SPRING_SLOW, + [(BACK_ANIM_SHRINK_GROW - 1) * 3] = ANIM_SHRINK_GROW_FAST, ANIM_SHRINK_GROW, ANIM_SHRINK_GROW_SLOW, + [(BACK_ANIM_GROW - 1) * 3] = ANIM_GROW_TWICE, ANIM_GROW, ANIM_GROW_IN_STAGES, + [(BACK_ANIM_CIRCLE_COUNTERCLOCKWISE - 1) * 3] = ANIM_CIRCLE_C_CLOCKWISE_LONG, ANIM_CIRCLE_C_CLOCKWISE, ANIM_CIRCLE_C_CLOCKWISE_SLOW, + [(BACK_ANIM_H_SHAKE - 1) * 3] = ANIM_H_SHAKE_FAST, ANIM_H_SHAKE, ANIM_H_SHAKE_SLOW, + [(BACK_ANIM_V_SHAKE - 1) * 3] = ANIM_V_SHAKE_BACK_FAST, ANIM_V_SHAKE_BACK, ANIM_V_SHAKE_BACK_SLOW, + [(BACK_ANIM_V_SHAKE_H_SLIDE - 1) * 3] = ANIM_V_SHAKE_H_SLIDE_FAST, ANIM_V_SHAKE_H_SLIDE, ANIM_V_SHAKE_H_SLIDE_SLOW, + [(BACK_ANIM_V_STRETCH - 1) * 3] = ANIM_V_STRETCH_BOTH_ENDS_TWICE, ANIM_V_STRETCH_BOTH_ENDS, ANIM_V_STRETCH_BOTH_ENDS_SLOW, + [(BACK_ANIM_H_STRETCH - 1) * 3] = ANIM_H_STRETCH_FAR_TWICE, ANIM_H_STRETCH_FAR, ANIM_H_STRETCH_FAR_SLOW, + [(BACK_ANIM_GROW_STUTTER - 1) * 3] = ANIM_GROW_STUTTER_TWICE, ANIM_GROW_STUTTER, ANIM_GROW_STUTTER_SLOW, + [(BACK_ANIM_V_SHAKE_LOW - 1) * 3] = ANIM_V_SHAKE_LOW_TWICE_FAST, ANIM_V_SHAKE_LOW_TWICE, ANIM_V_SHAKE_LOW_TWICE_SLOW, + [(BACK_ANIM_TRIANGLE_DOWN - 1) * 3] = ANIM_TRIANGLE_DOWN_TWICE, ANIM_TRIANGLE_DOWN, ANIM_TRIANGLE_DOWN_SLOW, + [(BACK_ANIM_CONCAVE_ARC_LARGE - 1) * 3] = ANIM_CONCAVE_ARC_LARGE_TWICE, ANIM_CONCAVE_ARC_LARGE, ANIM_CONCAVE_ARC_LARGE_SLOW, + [(BACK_ANIM_CONVEX_DOUBLE_ARC - 1) * 3] = ANIM_CONVEX_DOUBLE_ARC_TWICE, ANIM_CONVEX_DOUBLE_ARC, ANIM_CONVEX_DOUBLE_ARC_SLOW, + [(BACK_ANIM_CONCAVE_ARC_SMALL - 1) * 3] = ANIM_CONCAVE_ARC_SMALL_TWICE, ANIM_CONCAVE_ARC_SMALL, ANIM_CONCAVE_ARC_SMALL_SLOW, + [(BACK_ANIM_DIP_RIGHT_SIDE - 1) * 3] = ANIM_H_DIP_TWICE, ANIM_H_DIP, ANIM_H_DIP_FAST, + [(BACK_ANIM_SHRINK_GROW_VIBRATE - 1) * 3] = ANIM_SHRINK_GROW_VIBRATE_FAST, ANIM_SHRINK_GROW_VIBRATE, ANIM_SHRINK_GROW_VIBRATE_SLOW, + [(BACK_ANIM_JOLT_RIGHT - 1) * 3] = ANIM_JOLT_RIGHT_FAST, ANIM_JOLT_RIGHT, ANIM_JOLT_RIGHT_SLOW, + [(BACK_ANIM_SHAKE_FLASH_YELLOW - 1) * 3] = ANIM_SHAKE_FLASH_YELLOW_FAST, ANIM_SHAKE_FLASH_YELLOW, ANIM_SHAKE_FLASH_YELLOW_SLOW, + [(BACK_ANIM_SHAKE_GLOW_RED - 1) * 3] = ANIM_SHAKE_GLOW_RED_FAST, ANIM_SHAKE_GLOW_RED, ANIM_SHAKE_GLOW_RED_SLOW, + [(BACK_ANIM_SHAKE_GLOW_GREEN - 1) * 3] = ANIM_SHAKE_GLOW_GREEN_FAST, ANIM_SHAKE_GLOW_GREEN, ANIM_SHAKE_GLOW_GREEN_SLOW, + [(BACK_ANIM_SHAKE_GLOW_BLUE - 1) * 3] = ANIM_SHAKE_GLOW_BLUE_FAST, ANIM_SHAKE_GLOW_BLUE, ANIM_SHAKE_GLOW_BLUE_SLOW, }; static const u8 sBackAnimNatureModTable[NUM_NATURES] = { - [NATURE_HARDY] = 0x00, - [NATURE_LONELY] = 0x02, - [NATURE_BRAVE] = 0x00, - [NATURE_ADAMANT] = 0x00, - [NATURE_NAUGHTY] = 0x00, - [NATURE_BOLD] = 0x01, - [NATURE_DOCILE] = 0x01, - [NATURE_RELAXED] = 0x01, - [NATURE_IMPISH] = 0x00, - [NATURE_LAX] = 0x01, - [NATURE_TIMID] = 0x02, - [NATURE_HASTY] = 0x00, - [NATURE_SERIOUS] = 0x01, - [NATURE_JOLLY] = 0x00, - [NATURE_NAIVE] = 0x00, - [NATURE_MODEST] = 0x02, - [NATURE_MILD] = 0x02, - [NATURE_QUIET] = 0x02, - [NATURE_BASHFUL] = 0x02, - [NATURE_RASH] = 0x01, - [NATURE_CALM] = 0x01, - [NATURE_GENTLE] = 0x02, - [NATURE_SASSY] = 0x01, - [NATURE_CAREFUL] = 0x02, - [NATURE_QUIRKY] = 0x01, + [NATURE_HARDY] = 0, + [NATURE_LONELY] = 2, + [NATURE_BRAVE] = 0, + [NATURE_ADAMANT] = 0, + [NATURE_NAUGHTY] = 0, + [NATURE_BOLD] = 1, + [NATURE_DOCILE] = 1, + [NATURE_RELAXED] = 1, + [NATURE_IMPISH] = 0, + [NATURE_LAX] = 1, + [NATURE_TIMID] = 2, + [NATURE_HASTY] = 0, + [NATURE_SERIOUS] = 1, + [NATURE_JOLLY] = 0, + [NATURE_NAIVE] = 0, + [NATURE_MODEST] = 2, + [NATURE_MILD] = 2, + [NATURE_QUIET] = 2, + [NATURE_BASHFUL] = 2, + [NATURE_RASH] = 1, + [NATURE_CALM] = 1, + [NATURE_GENTLE] = 2, + [NATURE_SASSY] = 1, + [NATURE_CAREFUL] = 2, + [NATURE_QUIRKY] = 1, }; -static const union AffineAnimCmd sSpriteAffineAnim_860AD48[] = +static const union AffineAnimCmd sMonAffineAnim_0[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMDTYPE_END }; -static const union AffineAnimCmd sSpriteAffineAnim_860AD58[] = +static const union AffineAnimCmd sMonAffineAnim_1[] = { AFFINEANIMCMD_FRAME(-256, 256, 0, 0), AFFINEANIMCMDTYPE_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_860AD68[] = +static const union AffineAnimCmd *const sMonAffineAnims[] = { - sSpriteAffineAnim_860AD48, - sSpriteAffineAnim_860AD58 + sMonAffineAnim_0, + sMonAffineAnim_1 }; -// code static void MonAnimDummySpriteCallback(struct Sprite *sprite) { } -static void sub_817F3F0(struct Sprite *sprite, u16 index, s16 amplitudeX, s16 amplitudeY) +static void SetPosForRotation(struct Sprite *sprite, u16 index, s16 amplitudeX, s16 amplitudeY) { s16 xAdder, yAdder; @@ -853,7 +883,7 @@ static void sub_817F3F0(struct Sprite *sprite, u16 index, s16 amplitudeX, s16 am u8 GetSpeciesBackAnimSet(u16 species) { - if (sSpeciesToBackAnimSet[species] != 0) + if (sSpeciesToBackAnimSet[species] != BACK_ANIM_NONE) return sSpeciesToBackAnimSet[species] - 1; else return 0; @@ -863,8 +893,8 @@ u8 GetSpeciesBackAnimSet(u16 species) #define tPtrHi data[1] #define tPtrLo data[2] #define tAnimId data[3] -#define tSaved0 data[4] -#define tSaved2 data[5] +#define tBattlerId data[4] +#define tSpeciesId data[5] // BUG: In vanilla, tPtrLo is read as an s16, so if bit 15 of the // address were to be set it would cause the pointer to be read @@ -884,23 +914,23 @@ static void Task_HandleMonAnimation(u8 taskId) if (gTasks[taskId].tState == 0) { - gTasks[taskId].tSaved0 = sprite->data[0]; - gTasks[taskId].tSaved2 = sprite->data[2]; - sprite->data[1] = 1; + gTasks[taskId].tBattlerId = sprite->data[0]; + gTasks[taskId].tSpeciesId = sprite->data[2]; + sprite->sDontFlip = TRUE; sprite->data[0] = 0; for (i = 2; i < ARRAY_COUNT(sprite->data); i++) sprite->data[i] = 0; sprite->callback = sMonAnimFunctions[gTasks[taskId].tAnimId]; - sUnknown_03001274 = FALSE; + sIsSummaryAnim = FALSE; gTasks[taskId].tState++; } if (sprite->callback == SpriteCallbackDummy) { - sprite->data[0] = gTasks[taskId].tSaved0; - sprite->data[2] = gTasks[taskId].tSaved2; + sprite->data[0] = gTasks[taskId].tBattlerId; + sprite->data[2] = gTasks[taskId].tSpeciesId; sprite->data[1] = 0; DestroyTask(taskId); @@ -910,14 +940,15 @@ static void Task_HandleMonAnimation(u8 taskId) void LaunchAnimationTaskForFrontSprite(struct Sprite *sprite, u8 frontAnimId) { u8 taskId = CreateTask(Task_HandleMonAnimation, 128); - gTasks[taskId].tPtrHi = (u32)(sprite) >> 0x10; + gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; gTasks[taskId].tPtrLo = (u32)(sprite); gTasks[taskId].tAnimId = frontAnimId; } void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId) { - sUnknown_03001274 = TRUE; + // sDontFlip is expected to still be FALSE here, not explicitly cleared + sIsSummaryAnim = TRUE; sprite->callback = sMonAnimFunctions[frontAnimId]; } @@ -926,12 +957,13 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet) u8 nature, taskId, animId, battlerId; taskId = CreateTask(Task_HandleMonAnimation, 128); - gTasks[taskId].tPtrHi = (u32)(sprite) >> 0x10; + gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; gTasks[taskId].tPtrLo = (u32)(sprite); battlerId = sprite->data[0]; nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[battlerId]]); + // * 3 below because each back anim has 3 variants depending on nature animId = 3 * backAnimSet + sBackAnimNatureModTable[nature]; gTasks[taskId].tAnimId = sBackAnimationIds[animId]; } @@ -940,8 +972,8 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet) #undef tPtrHi #undef tPtrLo #undef tAnimId -#undef tSaved0 -#undef tSaved2 +#undef tBattlerId +#undef tSpeciesId void SetSpriteCB_MonAnimDummy(struct Sprite *sprite) { @@ -970,23 +1002,23 @@ static void SetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u16 rot static void HandleStartAffineAnim(struct Sprite *sprite) { sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; - sprite->affineAnims = sSpriteAffineAnimTable_860AD68; + sprite->affineAnims = sMonAffineAnims; - if (sUnknown_03001274 == TRUE) + if (sIsSummaryAnim == TRUE) InitSpriteAffineAnim(sprite); - if (!sprite->data[1]) + if (!sprite->sDontFlip) StartSpriteAffineAnim(sprite, 1); else StartSpriteAffineAnim(sprite, 0); CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - sprite->affineAnimPaused = 1; + sprite->affineAnimPaused = TRUE; } static void HandleSetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u16 rotation) { - if (!sprite->data[1]) + if (!sprite->sDontFlip) { xScale *= -1; rotation *= -1; @@ -995,47 +1027,47 @@ static void HandleSetAffineData(struct Sprite *sprite, s16 xScale, s16 yScale, u SetAffineData(sprite, xScale, yScale, rotation); } -static void sub_817F70C(struct Sprite *sprite) +static void TryFlipX(struct Sprite *sprite) { - if (!sprite->data[1]) + if (!sprite->sDontFlip) sprite->pos2.x *= -1; } -static bool32 sub_817F724(u8 id) +static bool32 InitAnimData(u8 id) { - if (id >= STRUCT_COUNT) + if (id >= MAX_BATTLERS_COUNT) { return FALSE; } else { - sUnknown_03001240[id].field_6 = 0; - sUnknown_03001240[id].field_0 = 0; - sUnknown_03001240[id].field_4 = 1; - sUnknown_03001240[id].field_2 = 0; - sUnknown_03001240[id].field_8 = 0; + sAnims[id].rotation = 0; + sAnims[id].delay = 0; + sAnims[id].runs = 1; + sAnims[id].speed = 0; + sAnims[id].data = 0; return TRUE; } } -static u8 sub_817F758(void) +static u8 AddNewAnim(void) { - sUnknown_03001270 = (sUnknown_03001270 + 1) % STRUCT_COUNT; - sub_817F724(sUnknown_03001270); - return sUnknown_03001270; + sAnimIdx = (sAnimIdx + 1) % MAX_BATTLERS_COUNT; + InitAnimData(sAnimIdx); + return sAnimIdx; } -static void sub_817F77C(struct Sprite *sprite) +static void ResetSpriteAfterAnim(struct Sprite *sprite) { sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - if (sUnknown_03001274 == TRUE) + if (sIsSummaryAnim == TRUE) { - if (!sprite->data[1]) - sprite->hFlip = 1; + if (!sprite->sDontFlip) + sprite->hFlip = TRUE; else - sprite->hFlip = 0; + sprite->hFlip = FALSE; FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.matrixNum |= (sprite->hFlip << 3); @@ -1046,13 +1078,12 @@ static void sub_817F77C(struct Sprite *sprite) { // FIX: Reset these back to normal after they were changed so Poké Ball catch/release // animations without a screen transition in between don't break - sprite->affineAnimPaused = FALSE; - sprite->affineAnims = gUnknown_082FF694; + sprite->affineAnims = gAffineAnims_BattleSpriteOpponentSide; } #endif // BUGFIX } -static void pokemonanimfunc_01(struct Sprite *sprite) +static void Anim_CircularStretchTwice(struct Sprite *sprite) { if (sprite->data[2] == 0) HandleStartAffineAnim(sprite); @@ -1060,8 +1091,8 @@ static void pokemonanimfunc_01(struct Sprite *sprite) if (sprite->data[2] > 40) { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1075,11 +1106,11 @@ static void pokemonanimfunc_01(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_02(struct Sprite *sprite) +static void Anim_HorizontalVibrate(struct Sprite *sprite) { if (sprite->data[2] > 40) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -1096,13 +1127,13 @@ static void pokemonanimfunc_02(struct Sprite *sprite) sprite->data[2]++; } -static void sub_817F8FC(struct Sprite *sprite) +static void HorizontalSlide(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > sprite->data[0]) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -1111,23 +1142,23 @@ static void sub_817F8FC(struct Sprite *sprite) } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_03(struct Sprite *sprite) +static void Anim_HorizontalSlide(struct Sprite *sprite) { sprite->data[0] = 40; - sub_817F8FC(sprite); - sprite->callback = sub_817F8FC; + HorizontalSlide(sprite); + sprite->callback = HorizontalSlide; } -static void sub_817F978(struct Sprite *sprite) +static void VerticalSlide(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > sprite->data[0]) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.y = 0; } else @@ -1136,22 +1167,22 @@ static void sub_817F978(struct Sprite *sprite) } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_04(struct Sprite *sprite) +static void Anim_VerticalSlide(struct Sprite *sprite) { sprite->data[0] = 40; - sub_817F978(sprite); - sprite->callback = sub_817F978; + VerticalSlide(sprite); + sprite->callback = VerticalSlide; } -static void sub_817F9F4(struct Sprite *sprite) +static void VerticalJumps(struct Sprite *sprite) { s32 counter = sprite->data[2]; if (counter > 384) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; sprite->pos2.y = 0; } @@ -1175,20 +1206,20 @@ static void sub_817F9F4(struct Sprite *sprite) sprite->data[2] += 12; } -static void pokemonanimfunc_1E(struct Sprite *sprite) +static void Anim_VerticalJumps_Big(struct Sprite *sprite) { sprite->data[0] = 4; - sub_817F9F4(sprite); - sprite->callback = sub_817F9F4; + VerticalJumps(sprite); + sprite->callback = VerticalJumps; } -static void pokemonanimfunc_06(struct Sprite *sprite) +static void Anim_VerticalJumpsHorizontalJumps(struct Sprite *sprite) { s32 counter = sprite->data[2]; if (counter > 768) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; sprite->pos2.y = 0; } @@ -1222,7 +1253,7 @@ static void pokemonanimfunc_06(struct Sprite *sprite) sprite->data[2] += 12; } -static void pokemonanimfunc_09(struct Sprite *sprite) +static void Anim_GrowVibrate(struct Sprite *sprite) { if (sprite->data[2] == 0) HandleStartAffineAnim(sprite); @@ -1230,8 +1261,8 @@ static void pokemonanimfunc_09(struct Sprite *sprite) if (sprite->data[2] > 40) { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1254,32 +1285,33 @@ static void pokemonanimfunc_09(struct Sprite *sprite) sprite->data[2]++; } -static const s8 sUnknown_0860AD70[][3] = +// x delta, y delta, time +static const s8 sZigzagData[][3] = { {-1, -1, 6}, - {2, 0, 6}, + { 2, 0, 6}, {-2, 2, 6}, - {2, 0, 6}, + { 2, 0, 6}, {-2, -2, 6}, - {2, 0, 6}, + { 2, 0, 6}, {-2, 2, 6}, - {2, 0, 6}, + { 2, 0, 6}, {-1, -1, 6}, - {0, 0, 0}, + { 0, 0, 0}, }; -static void sub_817FC20(struct Sprite *sprite) +static void Zigzag(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) sprite->data[3] = 0; - if (sUnknown_0860AD70[sprite->data[3]][2] == sprite->data[2]) + if (sZigzagData[sprite->data[3]][2] == sprite->data[2]) { - if (sUnknown_0860AD70[sprite->data[3]][2] == 0) + if (sZigzagData[sprite->data[3]][2] == 0) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { @@ -1288,32 +1320,32 @@ static void sub_817FC20(struct Sprite *sprite) } } - if (sUnknown_0860AD70[sprite->data[3]][2] == 0) + if (sZigzagData[sprite->data[3]][2] == 0) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { - sprite->pos2.x += sUnknown_0860AD70[sprite->data[3]][0]; - sprite->pos2.y += sUnknown_0860AD70[sprite->data[3]][1]; + sprite->pos2.x += sZigzagData[sprite->data[3]][0]; + sprite->pos2.y += sZigzagData[sprite->data[3]][1]; sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } } -static void pokemonanimfunc_0A(struct Sprite *sprite) +static void Anim_ZigzagFast(struct Sprite *sprite) { - sub_817FC20(sprite); - sprite->callback = sub_817FC20; + Zigzag(sprite); + sprite->callback = Zigzag; } -static void sub_817FCDC(struct Sprite *sprite) +static void HorizontalShake(struct Sprite *sprite) { s32 counter = sprite->data[2]; if (counter > 2304) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -1324,21 +1356,21 @@ static void sub_817FCDC(struct Sprite *sprite) sprite->data[2] += sprite->data[0]; } -static void pokemonanimfunc_0F(struct Sprite *sprite) +static void Anim_HorizontalShake(struct Sprite *sprite) { sprite->data[0] = 60; sprite->data[7] = 3; - sub_817FCDC(sprite); - sprite->callback = sub_817FCDC; + HorizontalShake(sprite); + sprite->callback = HorizontalShake; } -static void sub_817FD44(struct Sprite *sprite) +static void VerticalShake(struct Sprite *sprite) { s32 counter = sprite->data[2]; if (counter > 2304) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.y = 0; } else @@ -1349,18 +1381,18 @@ static void sub_817FD44(struct Sprite *sprite) sprite->data[2] += sprite->data[0]; } -static void pokemonanimfunc_10(struct Sprite *sprite) +static void Anim_VerticalShake(struct Sprite *sprite) { sprite->data[0] = 60; - sub_817FD44(sprite); - sprite->callback = sub_817FD44; + VerticalShake(sprite); + sprite->callback = VerticalShake; } -static void pokemonanimfunc_11(struct Sprite *sprite) +static void Anim_CircularVibrate(struct Sprite *sprite) { if (sprite->data[2] > 512) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; sprite->pos2.y = 0; } @@ -1384,36 +1416,36 @@ static void pokemonanimfunc_11(struct Sprite *sprite) sprite->data[2] += 9; } -static void sub_817FE30(struct Sprite *sprite) +static void Twist(struct Sprite *sprite) { s16 id = sprite->data[0]; - if (sUnknown_03001240[id].field_0 != 0) + if (sAnims[id].delay != 0) { - sUnknown_03001240[id].field_0--; + sAnims[id].delay--; } else { - if (sprite->data[2] == 0 && sUnknown_03001240[id].field_8 == 0) + if (sprite->data[2] == 0 && sAnims[id].data == 0) { HandleStartAffineAnim(sprite); - sUnknown_03001240[id].field_8++; + sAnims[id].data++; } - if (sprite->data[2] > sUnknown_03001240[id].field_6) + if (sprite->data[2] > sAnims[id].rotation) { HandleSetAffineData(sprite, 256, 256, 0); - if (sUnknown_03001240[id].field_4 > 1) + if (sAnims[id].runs > 1) { - sUnknown_03001240[id].field_4--; - sUnknown_03001240[id].field_0 = 10; + sAnims[id].runs--; + sAnims[id].delay = 10; sprite->data[2] = 0; } else { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } } else @@ -1426,103 +1458,107 @@ static void sub_817FE30(struct Sprite *sprite) } } -static void pokemonanimfunc_12(struct Sprite *sprite) +static void Anim_Twist(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 512; - sUnknown_03001240[id].field_0 = 0; - sub_817FE30(sprite); - sprite->callback = sub_817FE30; + sAnims[id].rotation = 512; + sAnims[id].delay = 0; + Twist(sprite); + sprite->callback = Twist; } -static void sub_817FF3C(struct Sprite *sprite) +static void Spin(struct Sprite *sprite) { u8 id = sprite->data[0]; if (sprite->data[2] == 0) HandleStartAffineAnim(sprite); - if (sprite->data[2] > sUnknown_03001240[id].field_0) + if (sprite->data[2] > sAnims[id].delay) { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { - sprite->data[6] = (65536 / sUnknown_03001240[id].field_8) * sprite->data[2]; + sprite->data[6] = (65536 / sAnims[id].data) * sprite->data[2]; HandleSetAffineData(sprite, 256, 256, sprite->data[6]); } sprite->data[2]++; } -static void pokemonanimfunc_1F(struct Sprite *sprite) +static void Anim_Spin_Long(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_0 = 60; - sUnknown_03001240[id].field_8 = 20; - sub_817FF3C(sprite); - sprite->callback = sub_817FF3C; + sAnims[id].delay = 60; + sAnims[id].data = 20; + Spin(sprite); + sprite->callback = Spin; } -static void sub_817FFF0(struct Sprite *sprite) +static void CircleCounterclockwise(struct Sprite *sprite) { u8 id = sprite->data[0]; - sub_817F70C(sprite); + TryFlipX(sprite); - if (sprite->data[2] > sUnknown_03001240[id].field_6) + if (sprite->data[2] > sAnims[id].rotation) { sprite->pos2.x = 0; sprite->pos2.y = 0; - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { s16 index = (sprite->data[2] + 192) % 256; - sprite->pos2.x = -(Cos(index, sUnknown_03001240[id].field_8 * 2)); - sprite->pos2.y = Sin(index, sUnknown_03001240[id].field_8) + sUnknown_03001240[id].field_8; + sprite->pos2.x = -(Cos(index, sAnims[id].data * 2)); + sprite->pos2.y = Sin(index, sAnims[id].data) + sAnims[id].data; } - sprite->data[2] += sUnknown_03001240[id].field_2; - sub_817F70C(sprite); + sprite->data[2] += sAnims[id].speed; + TryFlipX(sprite); } -static void pokemonanimfunc_14(struct Sprite *sprite) +static void Anim_CircleCounterclockwise(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 512; - sUnknown_03001240[id].field_8 = 6; - sUnknown_03001240[id].field_2 = 24; - sub_817FFF0(sprite); - sprite->callback = sub_817FFF0; + sAnims[id].rotation = 512; + sAnims[id].data = 6; + sAnims[id].speed = 24; + CircleCounterclockwise(sprite); + sprite->callback = CircleCounterclockwise; } -static void pokemonanimfunc_15(struct Sprite *sprite) -{ - if (sprite->data[2] == 0) - sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; - - if (sprite->data[2] > 128) - { - BlendPalette(sprite->data[7], 0x10, 0, RGB_BLACK); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - } - else - { - sprite->data[6] = Sin(sprite->data[2], 16); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_BLACK); - } +#define GlowColor(color, colorIncrement, speed) \ +{ \ + if (sprite->data[2] == 0) \ + sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; \ + \ + if (sprite->data[2] > 128) \ + { \ + BlendPalette(sprite->data[7], 16, 0, (color)); \ + sprite->callback = WaitAnimEnd; \ + } \ + else \ + { \ + sprite->data[6] = Sin(sprite->data[2], (colorIncrement)); \ + BlendPalette(sprite->data[7], 16, sprite->data[6], (color)); \ + } \ + sprite->data[2] += (speed); \ +} - sprite->data[2]++; +static void Anim_GlowBlack(struct Sprite *sprite) +{ + GlowColor(RGB_BLACK, 16, 1); } -static void pokemonanimfunc_16(struct Sprite *sprite) +static void Anim_HorizontalStretch(struct Sprite *sprite) { s16 index1 = 0, index2 = 0; @@ -1532,8 +1568,8 @@ static void pokemonanimfunc_16(struct Sprite *sprite) if (sprite->data[2] > 40) { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1545,7 +1581,7 @@ static void pokemonanimfunc_16(struct Sprite *sprite) index1 = 0xFF & sprite->data[7]; } - if (sprite->data[1] == 0) + if (!sprite->sDontFlip) sprite->data[4] = (Sin(index2, 40) - 256) + Sin(index1, 16); else sprite->data[4] = (256 - Sin(index2, 40)) - Sin(index1, 16); @@ -1557,7 +1593,7 @@ static void pokemonanimfunc_16(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_17(struct Sprite *sprite) +static void Anim_VerticalStretch(struct Sprite *sprite) { s16 posY = 0, index1 = 0, index2 = 0; @@ -1567,8 +1603,8 @@ static void pokemonanimfunc_17(struct Sprite *sprite) if (sprite->data[2] > 40) { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; sprite->pos2.y = posY; } else @@ -1581,7 +1617,7 @@ static void pokemonanimfunc_17(struct Sprite *sprite) index1 = 0xFF & sprite->data[7]; } - if (sprite->data[1] == 0) + if (!sprite->sDontFlip) sprite->data[4] = -(Sin(index2, 16)) - 256; else sprite->data[4] = Sin(index2, 16) + 256; @@ -1598,22 +1634,22 @@ static void pokemonanimfunc_17(struct Sprite *sprite) sprite->data[2]++; } -static void sub_818031C(struct Sprite *sprite) +static void VerticalShakeTwice(struct Sprite *sprite) { u8 index = sprite->data[2]; u8 var7 = sprite->data[6]; - u8 var5 = sUnknown_0860AA80[sprite->data[5]][0]; - u8 var6 = sUnknown_0860AA80[sprite->data[5]][1]; + u8 var5 = sVerticalShakeData[sprite->data[5]][0]; + u8 var6 = sVerticalShakeData[sprite->data[5]][1]; u8 amplitude = 0; - if (var5 != 0xFE) + if (var5 != (u8)-2) amplitude = (var6 - var7) * var5 / var6; else amplitude = 0; - if (var5 == 0xFF) + if (var5 == (u8)-1) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.y = 0; } else @@ -1633,18 +1669,18 @@ static void sub_818031C(struct Sprite *sprite) } } -static void pokemonanimfunc_19(struct Sprite *sprite) +static void Anim_VerticalShakeTwice(struct Sprite *sprite) { sprite->data[0] = 48; - sub_818031C(sprite); - sprite->callback = sub_818031C; + VerticalShakeTwice(sprite); + sprite->callback = VerticalShakeTwice; } -static void pokemonanimfunc_1A(struct Sprite *sprite) +static void Anim_TipMoveForward(struct Sprite *sprite) { u8 counter = 0; - sub_817F70C(sprite); + TryFlipX(sprite); counter = sprite->data[2]; if (sprite->data[2] == 0) @@ -1653,8 +1689,8 @@ static void pokemonanimfunc_1A(struct Sprite *sprite) if (sprite->data[2] > 35) { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -1670,10 +1706,10 @@ static void pokemonanimfunc_1A(struct Sprite *sprite) } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_1B(struct Sprite *sprite) +static void Anim_HorizontalPivot(struct Sprite *sprite) { if (sprite->data[2] == 0) HandleStartAffineAnim(sprite); @@ -1682,8 +1718,8 @@ static void pokemonanimfunc_1B(struct Sprite *sprite) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1695,7 +1731,7 @@ static void pokemonanimfunc_1B(struct Sprite *sprite) sprite->data[2]++; } -static void sub_81804F8(struct Sprite *sprite) +static void VerticalSlideWobble(struct Sprite *sprite) { s32 var = 0; s16 index = 0; @@ -1707,8 +1743,8 @@ static void sub_81804F8(struct Sprite *sprite) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1722,14 +1758,14 @@ static void sub_81804F8(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_1C(struct Sprite *sprite) +static void Anim_VerticalSlideWobble(struct Sprite *sprite) { sprite->data[0] = 10; - sub_81804F8(sprite); - sprite->callback = sub_81804F8; + VerticalSlideWobble(sprite); + sprite->callback = VerticalSlideWobble; } -static void sub_81805B0(struct Sprite *sprite) +static void RisingWobble(struct Sprite *sprite) { s32 var = 0; s16 index = 0; @@ -1741,8 +1777,8 @@ static void sub_81805B0(struct Sprite *sprite) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1756,19 +1792,19 @@ static void sub_81805B0(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_18(struct Sprite *sprite) +static void Anim_RisingWobble(struct Sprite *sprite) { sprite->data[0] = 5; - sub_81805B0(sprite); - sprite->callback = sub_81805B0; + RisingWobble(sprite); + sprite->callback = RisingWobble; } -static void pokemonanimfunc_1D(struct Sprite *sprite) +static void Anim_HorizontalSlideWobble(struct Sprite *sprite) { s32 var; s16 index = 0; - sub_817F70C(sprite); + TryFlipX(sprite); var = 0; if (sprite->data[2] == 0) @@ -1778,25 +1814,23 @@ static void pokemonanimfunc_1D(struct Sprite *sprite) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.x = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { - s16 toDiv = 100; - - index = (sprite->data[2] * 256) / toDiv; - var = (sprite->data[2] * 512) / toDiv; + index = (sprite->data[2] * 256) / 100; + var = (sprite->data[2] * 512) / 100; var &= 0xFF; sprite->pos2.x = Sin(index, 8); HandleSetAffineData(sprite, 256, 256, Sin(var, 3276)); } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180714(struct Sprite *sprite) +static void VerticalSquishBounce(struct Sprite *sprite) { s16 posY = 0; @@ -1806,14 +1840,14 @@ static void sub_8180714(struct Sprite *sprite) sprite->data[3] = 0; } - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > sprite->data[0] * 3) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1830,17 +1864,17 @@ static void sub_8180714(struct Sprite *sprite) sprite->data[4] = (sprite->data[4] + 128 / sprite->data[0]) & 0xFF; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_00(struct Sprite *sprite) +static void Anim_VerticalSquishBounce(struct Sprite *sprite) { sprite->data[0] = 16; - sub_8180714(sprite); - sprite->callback = sub_8180714; + VerticalSquishBounce(sprite); + sprite->callback = VerticalSquishBounce; } -static void sub_8180828(struct Sprite *sprite) +static void ShrinkGrow(struct Sprite *sprite) { s16 posY = 0; @@ -1848,8 +1882,8 @@ static void sub_8180828(struct Sprite *sprite) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -1865,7 +1899,7 @@ static void sub_8180828(struct Sprite *sprite) } } -static void pokemonanimfunc_13(struct Sprite *sprite) +static void Anim_ShrinkGrow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -1874,34 +1908,34 @@ static void pokemonanimfunc_13(struct Sprite *sprite) sprite->data[6] = 8; } - sub_8180828(sprite); + ShrinkGrow(sprite); } -static const s8 sUnknown_0860AD8E[][8][3] = +static const s8 sBounceRotateToSidesData[][8][3] = { { - {0, 8, 8}, - {8, -8, 12}, - {-8, 8, 12}, - {8, -8, 12}, - {-8, 8, 12}, - {8, -8, 12}, - {-8, 0, 12}, - {0, 0, 0} + { 0, 8, 8}, + { 8, -8, 12}, + {-8, 8, 12}, + { 8, -8, 12}, + {-8, 8, 12}, + { 8, -8, 12}, + {-8, 0, 12}, + { 0, 0, 0} }, { - {0, 8, 16}, - {8, -8, 24}, - {-8, 8, 24}, - {8, -8, 24}, - {-8, 8, 24}, - {8, -8, 24}, - {-8, 0, 24}, - {0, 0, 0} + { 0, 8, 16}, + { 8, -8, 24}, + {-8, 8, 24}, + { 8, -8, 24}, + {-8, 8, 24}, + { 8, -8, 24}, + {-8, 0, 24}, + { 0, 0, 0} }, }; -static void sub_8180900(struct Sprite *sprite) +static void BounceRotateToSides(struct Sprite *sprite) { s16 var; u8 structId; @@ -1910,12 +1944,12 @@ static void sub_8180900(struct Sprite *sprite) s16 r7; u32 arrId; - sub_817F70C(sprite); + TryFlipX(sprite); structId = sprite->data[0]; - var = sUnknown_03001240[structId].field_6; - r9 = sUnknown_0860AD8E[sUnknown_03001240[structId].field_8][sprite->data[4]][0]; - r10 = sUnknown_0860AD8E[sUnknown_03001240[structId].field_8][sprite->data[4]][1] - r9; - arrId = sUnknown_03001240[structId].field_8; + var = sAnims[structId].rotation; + r9 = sBounceRotateToSidesData[sAnims[structId].data][sprite->data[4]][0]; + r10 = sBounceRotateToSidesData[sAnims[structId].data][sprite->data[4]][1] - r9; + arrId = sAnims[structId].data; r7 = sprite->data[3]; if (sprite->data[2] == 0) @@ -1924,25 +1958,25 @@ static void sub_8180900(struct Sprite *sprite) sprite->data[2]++; } - if (sUnknown_0860AD8E[arrId][sprite->data[4]][2] == 0) + if (sBounceRotateToSidesData[arrId][sprite->data[4]][2] == 0) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.x = 0; sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { u16 rotation; - sprite->pos2.y = -(Sin(r7 * 128 / sUnknown_0860AD8E[arrId][sprite->data[4]][2], 10)); - sprite->pos2.x = (r10 * r7 / sUnknown_0860AD8E[arrId][sprite->data[4]][2]) + r9; + sprite->pos2.y = -(Sin(r7 * 128 / sBounceRotateToSidesData[arrId][sprite->data[4]][2], 10)); + sprite->pos2.x = (r10 * r7 / sBounceRotateToSidesData[arrId][sprite->data[4]][2]) + r9; rotation = -(var * sprite->pos2.x) / 8; HandleSetAffineData(sprite, 256, 256, rotation); - if (r7 == sUnknown_0860AD8E[arrId][sprite->data[4]][2]) + if (r7 == sBounceRotateToSidesData[arrId][sprite->data[4]][2]) { sprite->data[4]++; sprite->data[3] = 0; @@ -1953,140 +1987,70 @@ static void sub_8180900(struct Sprite *sprite) } } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_05(struct Sprite *sprite) +static void Anim_BounceRotateToSides(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_6 = 4096; - sUnknown_03001240[id].field_8 = sprite->data[6]; - sub_8180900(sprite); - sprite->callback = sub_8180900; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].rotation = 4096; + sAnims[id].data = sprite->data[6]; + BounceRotateToSides(sprite); + sprite->callback = BounceRotateToSides; } -static void pokemonanimfunc_20(struct Sprite *sprite) +static void Anim_GlowOrange(struct Sprite *sprite) { - if (sprite->data[2] == 0) - sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; - - if (sprite->data[2] > 128) - { - BlendPalette(sprite->data[7], 0x10, 0, RGB(31, 22, 0)); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - } - else - { - sprite->data[6] = Sin(sprite->data[2], 12); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB(31, 22, 0)); - } - - sprite->data[2] += 2; + GlowColor(RGB(31, 22, 0), 12, 2); } -static void pokemonanimfunc_21(struct Sprite *sprite) +static void Anim_GlowRed(struct Sprite *sprite) { - if (sprite->data[2] == 0) - sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; - - if (sprite->data[2] > 128) - { - BlendPalette(sprite->data[7], 0x10, 0, RGB_RED); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - } - else - { - sprite->data[6] = Sin(sprite->data[2], 12); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_RED); - } - - sprite->data[2] += 2; + GlowColor(RGB_RED, 12, 2); } -static void pokemonanimfunc_22(struct Sprite *sprite) +static void Anim_GlowBlue(struct Sprite *sprite) { - if (sprite->data[2] == 0) - sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; - - if (sprite->data[2] > 128) - { - BlendPalette(sprite->data[7], 0x10, 0, RGB_BLUE); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - } - else - { - sprite->data[6] = Sin(sprite->data[2], 12); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_BLUE); - } - - sprite->data[2] += 2; + GlowColor(RGB_BLUE, 12, 2); } -static void pokemonanimfunc_23(struct Sprite *sprite) +static void Anim_GlowYellow(struct Sprite *sprite) { - if (sprite->data[2] == 0) - sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; - - if (sprite->data[2] > 128) - { - BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - } - else - { - sprite->data[6] = Sin(sprite->data[2], 12); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB_YELLOW); - } - - sprite->data[2] += 2; + GlowColor(RGB_YELLOW, 12, 2); } -static void pokemonanimfunc_24(struct Sprite *sprite) +static void Anim_GlowPurple(struct Sprite *sprite) { - if (sprite->data[2] == 0) - sprite->data[7] = (sprite->oam.paletteNum * 16) + 256; - - if (sprite->data[2] > 128) - { - BlendPalette(sprite->data[7], 0x10, 0, RGB(24, 0, 24)); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - } - else - { - sprite->data[6] = Sin(sprite->data[2], 12); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], RGB(24, 0, 24)); - } - - sprite->data[2] += 2; + GlowColor(RGB(24, 0, 24), 12, 2); } -static void sub_8180CB4(struct Sprite *sprite); -static void sub_8180CE8(struct Sprite *sprite); -static void sub_8180D44(struct Sprite *sprite); -static void sub_8180DC0(struct Sprite *sprite); -static void sub_8180E28(struct Sprite *sprite); +static void BackAndLunge_0(struct Sprite *sprite); +static void BackAndLunge_1(struct Sprite *sprite); +static void BackAndLunge_2(struct Sprite *sprite); +static void BackAndLunge_3(struct Sprite *sprite); +static void BackAndLunge_4(struct Sprite *sprite); -static void pokemonanimfunc_25(struct Sprite *sprite) +static void Anim_BackAndLunge(struct Sprite *sprite) { HandleStartAffineAnim(sprite); - sprite->callback = sub_8180CB4; + sprite->callback = BackAndLunge_0; } -static void sub_8180CB4(struct Sprite *sprite) +static void BackAndLunge_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (++sprite->pos2.x > 7) { sprite->pos2.x = 8; sprite->data[7] = 2; - sprite->callback = sub_8180CE8; + sprite->callback = BackAndLunge_1; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180CE8(struct Sprite *sprite) +static void BackAndLunge_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x -= sprite->data[7]; sprite->data[7]++; @@ -2106,17 +2070,17 @@ static void sub_8180CE8(struct Sprite *sprite) while (subResult > -8); sprite->data[5] = 1; - sprite->callback = sub_8180D44; + sprite->callback = BackAndLunge_2; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180D44(struct Sprite *sprite) +static void BackAndLunge_2(struct Sprite *sprite) { u8 rotation; - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x -= sprite->data[7]; sprite->data[7]++; rotation = (sprite->data[5] * 6) / sprite->data[6]; @@ -2132,15 +2096,15 @@ static void sub_8180D44(struct Sprite *sprite) sprite->data[4] = 2; sprite->data[3] = 0; sprite->data[2] = rotation; - sprite->callback = sub_8180DC0; + sprite->callback = BackAndLunge_3; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180DC0(struct Sprite *sprite) +static void BackAndLunge_3(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[3] > 11) { @@ -2150,7 +2114,7 @@ static void sub_8180DC0(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256, sprite->data[2] << 8); if (sprite->data[2] == 0) - sprite->callback = sub_8180E28; + sprite->callback = BackAndLunge_4; } else { @@ -2159,38 +2123,38 @@ static void sub_8180DC0(struct Sprite *sprite) sprite->data[3]++; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180E28(struct Sprite *sprite) +static void BackAndLunge_4(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x += 2; if (sprite->pos2.x > 0) { sprite->pos2.x = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180E78(struct Sprite *sprite); -static void sub_8180ED0(struct Sprite *sprite); -static void sub_8180F2C(struct Sprite *sprite); +static void BackFlip_0(struct Sprite *sprite); +static void BackFlip_1(struct Sprite *sprite); +static void BackFlip_2(struct Sprite *sprite); -static void pokemonanimfunc_26(struct Sprite *sprite) +static void Anim_BackFlip(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[3] = 0; - sprite->callback = sub_8180E78; + sprite->callback = BackFlip_0; } -static void sub_8180E78(struct Sprite *sprite) +static void BackFlip_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x++; sprite->pos2.y--; @@ -2201,15 +2165,15 @@ static void sub_8180E78(struct Sprite *sprite) sprite->pos2.x = 8; sprite->pos2.y = -8; sprite->data[4] = 0; - sprite->callback = sub_8180ED0; + sprite->callback = BackFlip_1; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180ED0(struct Sprite *sprite) +static void BackFlip_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x = Cos(sprite->data[4], 16) - 8; sprite->pos2.y = Sin(sprite->data[4], 16) - 8; @@ -2217,18 +2181,18 @@ static void sub_8180ED0(struct Sprite *sprite) { sprite->data[2] = 160; sprite->data[3] = 10; - sprite->callback = sub_8180F2C; + sprite->callback = BackFlip_2; } sprite->data[4] += 8; if (sprite->data[4] > 64) sprite->data[4] = 64; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8180F2C(struct Sprite *sprite) +static void BackFlip_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[3] > 0) { @@ -2248,15 +2212,15 @@ static void sub_8180F2C(struct Sprite *sprite) { sprite->pos2.x = 0; sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_27(struct Sprite *sprite) +static void Anim_Flicker(struct Sprite *sprite) { if (sprite->data[3] > 0) { @@ -2264,30 +2228,30 @@ static void pokemonanimfunc_27(struct Sprite *sprite) } else { - sprite->data[4] = (sprite->data[4] == 0) ? 1 : 0; + sprite->data[4] = (sprite->data[4] == 0) ? TRUE : FALSE; sprite->invisible = sprite->data[4]; if (++sprite->data[2] > 19) { sprite->invisible = FALSE; - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } sprite->data[3] = 2; } } -static void sub_8181024(struct Sprite *sprite); -static void sub_8181068(struct Sprite *sprite); -static void sub_81810C4(struct Sprite *sprite); +static void BackFlipBig_0(struct Sprite *sprite); +static void BackFlipBig_1(struct Sprite *sprite); +static void BackFlipBig_2(struct Sprite *sprite); -static void pokemonanimfunc_28(struct Sprite *sprite) +static void Anim_BackFlipBig(struct Sprite *sprite) { HandleStartAffineAnim(sprite); - sprite->callback = sub_8181024; + sprite->callback = BackFlipBig_0; } -static void sub_8181024(struct Sprite *sprite) +static void BackFlipBig_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x--; sprite->pos2.y++; @@ -2295,18 +2259,18 @@ static void sub_8181024(struct Sprite *sprite) { sprite->pos2.x = -16; sprite->pos2.y = 16; - sprite->callback = sub_8181068; + sprite->callback = BackFlipBig_1; sprite->data[2] = 160; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181068(struct Sprite *sprite) +static void BackFlipBig_1(struct Sprite *sprite) { u32 rotation; - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[2] -= 4; sprite->pos2.x = Cos(sprite->data[2], 22); sprite->pos2.y = -(Sin(sprite->data[2], 22)); @@ -2314,54 +2278,54 @@ static void sub_8181068(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256, rotation * 512); if (sprite->data[2] <= 32) - sprite->callback = sub_81810C4; + sprite->callback = BackFlipBig_2; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_81810C4(struct Sprite *sprite) +static void BackFlipBig_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x--; sprite->pos2.y++; if (sprite->pos2.x <= 0) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181110(struct Sprite *sprite); -static void sub_8181144(struct Sprite *sprite); -static void sub_81811A4(struct Sprite *sprite); +static void FrontFlip_0(struct Sprite *sprite); +static void FrontFlip_1(struct Sprite *sprite); +static void FrontFlip_2(struct Sprite *sprite); -static void pokemonanimfunc_29(struct Sprite *sprite) +static void Anim_FrontFlip(struct Sprite *sprite) { HandleStartAffineAnim(sprite); - sprite->callback = sub_8181110; + sprite->callback = FrontFlip_0; } -static void sub_8181110(struct Sprite *sprite) +static void FrontFlip_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x++; sprite->pos2.y--; if (sprite->pos2.x > 15) { sprite->data[2] = 0; - sprite->callback = sub_8181144; + sprite->callback = FrontFlip_1; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181144(struct Sprite *sprite) +static void FrontFlip_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[2] += 16; if (sprite->pos2.x <= -16) @@ -2369,7 +2333,7 @@ static void sub_8181144(struct Sprite *sprite) sprite->pos2.x = -16; sprite->pos2.y = 16; sprite->data[2] = 0; - sprite->callback = sub_81811A4; + sprite->callback = FrontFlip_2; } else { @@ -2378,12 +2342,12 @@ static void sub_8181144(struct Sprite *sprite) } HandleSetAffineData(sprite, 256, 256, sprite->data[2] << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_81811A4(struct Sprite *sprite) +static void FrontFlip_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x++; sprite->pos2.y--;; @@ -2391,37 +2355,37 @@ static void sub_81811A4(struct Sprite *sprite) { sprite->pos2.x = 0; sprite->pos2.y = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181214(struct Sprite *sprite); +static void TumblingFrontFlip(struct Sprite *sprite); -static void pokemonanimfunc_2A(struct Sprite *sprite) +static void Anim_TumblingFrontFlip(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_2 = 2; - sub_8181214(sprite); - sprite->callback = sub_8181214; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].speed = 2; + TumblingFrontFlip(sprite); + sprite->callback = TumblingFrontFlip; } -static void sub_8181214(struct Sprite *sprite) +static void TumblingFrontFlip(struct Sprite *sprite) { - if (sUnknown_03001240[sprite->data[0]].field_0 != 0) + if (sAnims[sprite->data[0]].delay != 0) { - sUnknown_03001240[sprite->data[0]].field_0--; + sAnims[sprite->data[0]].delay--; } else { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { sprite->data[2]++; HandleStartAffineAnim(sprite); - sprite->data[7] = sUnknown_03001240[sprite->data[0]].field_2; + sprite->data[7] = sAnims[sprite->data[0]].speed; sprite->data[3] = -1; sprite->data[4] = -1; sprite->data[5] = 0; @@ -2448,38 +2412,38 @@ static void sub_8181214(struct Sprite *sprite) { sprite->pos2.x = 0; sprite->pos2.y = 0; - if (sUnknown_03001240[sprite->data[0]].field_4 > 1) + if (sAnims[sprite->data[0]].runs > 1) { - sUnknown_03001240[sprite->data[0]].field_4--; + sAnims[sprite->data[0]].runs--; sprite->data[5] = 0; sprite->data[6] = 0; - sUnknown_03001240[sprite->data[0]].field_0 = 10; + sAnims[sprite->data[0]].delay = 10; } else { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } } HandleSetAffineData(sprite, 256, 256, sprite->data[6] << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } } -static void sub_8181370(struct Sprite *sprite); +static void Figure8(struct Sprite *sprite); -static void pokemonanimfunc_2B(struct Sprite *sprite) +static void Anim_Figure8(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[6] = 0; sprite->data[7] = 0; - sprite->callback = sub_8181370; + sprite->callback = Figure8; } -static void sub_8181370(struct Sprite *sprite) +static void Figure8(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[6] += 4; sprite->pos2.x = -(Sin(sprite->data[6], 16)); sprite->pos2.y = -(Sin((sprite->data[6] * 2) & 0xFF, 8)); @@ -2499,13 +2463,13 @@ static void sub_8181370(struct Sprite *sprite) sprite->pos2.x = 0; sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_2C(struct Sprite *sprite) +static void Anim_FlashYellow(struct Sprite *sprite) { if (++sprite->data[2] == 1) { @@ -2515,23 +2479,23 @@ static void pokemonanimfunc_2C(struct Sprite *sprite) sprite->data[4] = 0; } - if (sUnknown_0860AA64[sprite->data[6]][1] == 0xFF) + if (sYellowFlashData[sprite->data[6]][1] == (u8)-1) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { if (sprite->data[4] == 1) { - if (sUnknown_0860AA64[sprite->data[6]][0] != 0) - BlendPalette(sprite->data[7], 0x10, 0x10, RGB_YELLOW); + if (sYellowFlashData[sprite->data[6]][0]) + BlendPalette(sprite->data[7], 16, 16, RGB_YELLOW); else - BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW); + BlendPalette(sprite->data[7], 16, 0, RGB_YELLOW); sprite->data[4] = 0; } - if (sUnknown_0860AA64[sprite->data[6]][1] == sprite->data[5]) + if (sYellowFlashData[sprite->data[6]][1] == sprite->data[5]) { sprite->data[4] = 1; sprite->data[5] = 0; @@ -2544,101 +2508,101 @@ static void pokemonanimfunc_2C(struct Sprite *sprite) } } -static void sub_81814D4(struct Sprite *sprite) +static void SwingConcave(struct Sprite *sprite) { if (sprite->data[2] == 0) HandleStartAffineAnim(sprite); - sub_817F70C(sprite); - if (sprite->data[2] > sUnknown_03001240[sprite->data[0]].field_8) + TryFlipX(sprite); + if (sprite->data[2] > sAnims[sprite->data[0]].data) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.x = 0; - if (sUnknown_03001240[sprite->data[0]].field_4 > 1) + if (sAnims[sprite->data[0]].runs > 1) { - sUnknown_03001240[sprite->data[0]].field_4--; + sAnims[sprite->data[0]].runs--; sprite->data[2] = 0; } else { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } } else { - s16 index = (sprite->data[2] * 256) / sUnknown_03001240[sprite->data[0]].field_8; + s16 index = (sprite->data[2] * 256) / sAnims[sprite->data[0]].data; sprite->pos2.x = -(Sin(index, 10)); HandleSetAffineData(sprite, 256, 256, Sin(index, 3276)); } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_2D(struct Sprite *sprite) +static void Anim_SwingConcave_FastShort(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_8 = 50; - sub_81814D4(sprite); - sprite->callback = sub_81814D4; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].data = 50; + SwingConcave(sprite); + sprite->callback = SwingConcave; } -static void sub_81815D4(struct Sprite *sprite) +static void SwingConvex(struct Sprite *sprite) { if (sprite->data[2] == 0) HandleStartAffineAnim(sprite); - sub_817F70C(sprite); - if (sprite->data[2] > sUnknown_03001240[sprite->data[0]].field_8) + TryFlipX(sprite); + if (sprite->data[2] > sAnims[sprite->data[0]].data) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.x = 0; - if (sUnknown_03001240[sprite->data[0]].field_4 > 1) + if (sAnims[sprite->data[0]].runs > 1) { - sUnknown_03001240[sprite->data[0]].field_4--; + sAnims[sprite->data[0]].runs--; sprite->data[2] = 0; } else { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } } else { - s16 index = (sprite->data[2] * 256) / sUnknown_03001240[sprite->data[0]].field_8; + s16 index = (sprite->data[2] * 256) / sAnims[sprite->data[0]].data; sprite->pos2.x = -(Sin(index, 10)); HandleSetAffineData(sprite, 256, 256, -(Sin(index, 3276))); } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_2E(struct Sprite *sprite) +static void Anim_SwingConvex_FastShort(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_8 = 50; - sub_81815D4(sprite); - sprite->callback = sub_81815D4; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].data = 50; + SwingConvex(sprite); + sprite->callback = SwingConvex; } -static void sub_8181708(struct Sprite *sprite); -static void sub_8181770(struct Sprite *sprite); -static void sub_8181794(struct Sprite *sprite); +static void RotateUpSlamDown_0(struct Sprite *sprite); +static void RotateUpSlamDown_1(struct Sprite *sprite); +static void RotateUpSlamDown_2(struct Sprite *sprite); -static void pokemonanimfunc_2F(struct Sprite *sprite) +static void Anim_RotateUpSlamDown(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[6] = -(14 * sprite->centerToCornerVecX / 10); sprite->data[7] = 128; - sprite->callback = sub_8181708; + sprite->callback = RotateUpSlamDown_0; } -static void sub_8181708(struct Sprite *sprite) +static void RotateUpSlamDown_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[7]--; sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6]; @@ -2649,26 +2613,26 @@ static void sub_8181708(struct Sprite *sprite) { sprite->data[7] = 120; sprite->data[3] = 0; - sprite->callback = sub_8181770; + sprite->callback = RotateUpSlamDown_1; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181770(struct Sprite *sprite) +static void RotateUpSlamDown_1(struct Sprite *sprite) { if (sprite->data[3] == 20) { - sprite->callback = sub_8181794; + sprite->callback = RotateUpSlamDown_2; sprite->data[3] = 0; } sprite->data[3]++; } -static void sub_8181794(struct Sprite *sprite) +static void RotateUpSlamDown_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[7] += 2; sprite->pos2.x = Cos(sprite->data[7], sprite->data[6]) + sprite->data[6]; @@ -2681,18 +2645,18 @@ static void sub_8181794(struct Sprite *sprite) sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); sprite->data[2] = 0; - sub_817F77C(sprite); - sprite->callback = pokemonanimfunc_10; + ResetSpriteAfterAnim(sprite); + sprite->callback = Anim_VerticalShake; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181810(struct Sprite *sprite) +static void DeepVerticalSquishBounce(struct Sprite *sprite) { - if (sUnknown_03001240[sprite->data[0]].field_0 != 0) + if (sAnims[sprite->data[0]].delay != 0) { - sUnknown_03001240[sprite->data[0]].field_0--; + sAnims[sprite->data[0]].delay--; } else { @@ -2724,41 +2688,41 @@ static void sub_8181810(struct Sprite *sprite) HandleSetAffineData(sprite, 256 + sprite->data[6], 256 - sprite->data[7], 0); if (sprite->data[4] == 128) { - if (sUnknown_03001240[sprite->data[0]].field_4 > 1) + if (sAnims[sprite->data[0]].runs > 1) { - sUnknown_03001240[sprite->data[0]].field_4--; - sUnknown_03001240[sprite->data[0]].field_0 = 10; + sAnims[sprite->data[0]].runs--; + sAnims[sprite->data[0]].delay = 10; sprite->data[4] = 0; sprite->data[5] = 0; } else { HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } } } - sprite->data[4] += sUnknown_03001240[sprite->data[0]].field_6; + sprite->data[4] += sAnims[sprite->data[0]].rotation; } } -static void pokemonanimfunc_30(struct Sprite *sprite) +static void Anim_DeepVerticalSquishBounce(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_6 = 4; - sub_8181810(sprite); - sprite->callback = sub_8181810; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].rotation = 4; + DeepVerticalSquishBounce(sprite); + sprite->callback = DeepVerticalSquishBounce; } -static void pokemonanimfunc_31(struct Sprite *sprite) +static void Anim_HorizontalJumps(struct Sprite *sprite) { s32 counter = sprite->data[2]; - sub_817F70C(sprite); + TryFlipX(sprite); if (counter > 512) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; sprite->pos2.y = 0; } @@ -2784,61 +2748,61 @@ static void pokemonanimfunc_31(struct Sprite *sprite) } sprite->data[2] += 12; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181ABC(struct Sprite *sprite); -static void sub_8181B4C(struct Sprite *sprite); -static void sub_8181C2C(struct Sprite *sprite); +static void HorizontalJumpsVerticalStretch_0(struct Sprite *sprite); +static void HorizontalJumpsVerticalStretch_1(struct Sprite *sprite); +static void HorizontalJumpsVerticalStretch_2(struct Sprite *sprite); -static void pokemonanimfunc_32(struct Sprite *sprite) +static void Anim_HorizontalJumpsVerticalStretch(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_8 = -1; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].data = -1; HandleStartAffineAnim(sprite); sprite->data[3] = 0; - sub_8181ABC(sprite); - sprite->callback = sub_8181ABC; + HorizontalJumpsVerticalStretch_0(sprite); + sprite->callback = HorizontalJumpsVerticalStretch_0; } -static void sub_8181ABC(struct Sprite *sprite) +static void HorizontalJumpsVerticalStretch_0(struct Sprite *sprite) { - if (sUnknown_03001240[sprite->data[0]].field_0 != 0) + if (sAnims[sprite->data[0]].delay != 0) { - sUnknown_03001240[sprite->data[0]].field_0--; + sAnims[sprite->data[0]].delay--; } else { s32 counter; - sub_817F70C(sprite); + TryFlipX(sprite); counter = sprite->data[2]; if (sprite->data[2] > 128) { sprite->data[2] = 0; - sprite->callback = sub_8181B4C; + sprite->callback = HorizontalJumpsVerticalStretch_1; } else { - s32 var = 8 * sUnknown_03001240[sprite->data[0]].field_8; + s32 var = 8 * sAnims[sprite->data[0]].data; sprite->pos2.x = var * (counter % 128) / 128; sprite->pos2.y = -(Sin(counter % 128, 8)); sprite->data[2] += 12; } - sub_817F70C(sprite); + TryFlipX(sprite); } } -static void sub_8181B4C(struct Sprite *sprite) +static void HorizontalJumpsVerticalStretch_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 48) { HandleSetAffineData(sprite, 256, 256, 0); sprite->pos2.y = 0; sprite->data[2] = 0; - sprite->callback = sub_8181C2C; + sprite->callback = HorizontalJumpsVerticalStretch_2; } else { @@ -2847,7 +2811,7 @@ static void sub_8181B4C(struct Sprite *sprite) if (sprite->data[2] >= 16 && sprite->data[2] <= 31) { sprite->data[3] += 8; - sprite->pos2.x -= sUnknown_03001240[sprite->data[0]].field_8; + sprite->pos2.x -= sAnims[sprite->data[0]].data; } yDelta = 0; @@ -2861,30 +2825,30 @@ static void sub_8181B4C(struct Sprite *sprite) sprite->data[4] &= 0xFF; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181C2C(struct Sprite *sprite) +static void HorizontalJumpsVerticalStretch_2(struct Sprite *sprite) { s32 counter; - sub_817F70C(sprite); + TryFlipX(sprite); counter = sprite->data[2]; if (counter > 128) { - if (sUnknown_03001240[sprite->data[0]].field_4 > 1) + if (sAnims[sprite->data[0]].runs > 1) { - sUnknown_03001240[sprite->data[0]].field_4--; - sUnknown_03001240[sprite->data[0]].field_0 = 10; + sAnims[sprite->data[0]].runs--; + sAnims[sprite->data[0]].delay = 10; sprite->data[3] = 0; sprite->data[2] = 0; sprite->data[4] = 0; - sprite->callback = sub_8181ABC; + sprite->callback = HorizontalJumpsVerticalStretch_0; } else { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } sprite->pos2.x = 0; @@ -2892,17 +2856,17 @@ static void sub_8181C2C(struct Sprite *sprite) } else { - s32 var = sUnknown_03001240[sprite->data[0]].field_8; + s32 var = sAnims[sprite->data[0]].data; sprite->pos2.x = var * ((counter % 128) * 8) / 128 + 8 * -var; sprite->pos2.y = -(Sin(counter % 128, 8)); } sprite->data[2] += 12; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181CE8(struct Sprite *sprite) +static void RotateToSides(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -2910,25 +2874,25 @@ static void sub_8181CE8(struct Sprite *sprite) sprite->data[2]++; } - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[7] > 254) { sprite->pos2.x = 0; sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); - if (sUnknown_03001240[sprite->data[0]].field_4 > 1) + if (sAnims[sprite->data[0]].runs > 1) { - sUnknown_03001240[sprite->data[0]].field_4--; + sAnims[sprite->data[0]].runs--; sprite->data[2] = 0; sprite->data[7] = 0; } else { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } - sub_817F70C(sprite); + TryFlipX(sprite); } else { @@ -2937,20 +2901,20 @@ static void sub_8181CE8(struct Sprite *sprite) sprite->pos2.x = -(Sin(sprite->data[7], 16)); rotation = Sin(sprite->data[7], 32); HandleSetAffineData(sprite, 256, 256, rotation << 8); - sprite->data[7] += sUnknown_03001240[sprite->data[0]].field_6; - sub_817F70C(sprite); + sprite->data[7] += sAnims[sprite->data[0]].rotation; + TryFlipX(sprite); } } -static void pokemonanimfunc_33(struct Sprite *sprite) +static void Anim_RotateToSides_Fast(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); - sUnknown_03001240[id].field_6 = 4; - sub_8181CE8(sprite); - sprite->callback = sub_8181CE8; + u8 id = sprite->data[0] = AddNewAnim(); + sAnims[id].rotation = 4; + RotateToSides(sprite); + sprite->callback = RotateToSides; } -static void pokemonanimfunc_34(struct Sprite *sprite) +static void Anim_RotateUpToSides(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -2958,15 +2922,15 @@ static void pokemonanimfunc_34(struct Sprite *sprite) sprite->data[2]++; } - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[7] > 254) { sprite->pos2.x = 0; sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; - sub_817F70C(sprite); + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; + TryFlipX(sprite); } else { @@ -2977,11 +2941,11 @@ static void pokemonanimfunc_34(struct Sprite *sprite) rotation = Sin(sprite->data[7], 32); HandleSetAffineData(sprite, 256, 256, rotation << 8); sprite->data[7] += 8; - sub_817F70C(sprite); + TryFlipX(sprite); } } -static void pokemonanimfunc_35(struct Sprite *sprite) +static void Anim_FlickerIncreasing(struct Sprite *sprite) { if (sprite->data[2] == 0) sprite->data[7] = 0; @@ -3001,28 +2965,28 @@ static void pokemonanimfunc_35(struct Sprite *sprite) if (sprite->data[2] > 10) { sprite->invisible = FALSE; - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } } -static void sub_8181F14(struct Sprite *sprite); -static void sub_8181F50(struct Sprite *sprite); -static void sub_8181FC0(struct Sprite *sprite); +static void TipHopForward_0(struct Sprite *sprite); +static void TipHopForward_1(struct Sprite *sprite); +static void TipHopForward_2(struct Sprite *sprite); -static void pokemonanimfunc_36(struct Sprite *sprite) +static void Anim_TipHopForward(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[7] = 0; - sprite->callback = sub_8181F14; + sprite->callback = TipHopForward_0; } -static void sub_8181F14(struct Sprite *sprite) +static void TipHopForward_0(struct Sprite *sprite) { if (sprite->data[7] > 31) { sprite->data[7] = 32; sprite->data[2] = 0; - sprite->callback = sub_8181F50; + sprite->callback = TipHopForward_1; } else { @@ -3032,12 +2996,12 @@ static void sub_8181F14(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256, sprite->data[7] << 8); } -static void sub_8181F50(struct Sprite *sprite) +static void TipHopForward_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 512) { - sprite->callback = sub_8181FC0; + sprite->callback = TipHopForward_2; sprite->data[6] = 0; } else @@ -3047,19 +3011,19 @@ static void sub_8181F50(struct Sprite *sprite) sprite->data[2] += 12; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8181FC0(struct Sprite *sprite) +static void TipHopForward_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[7] -= 2; if (sprite->data[7] < 0) { sprite->data[7] = 0; sprite->pos2.x = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -3067,10 +3031,10 @@ static void sub_8181FC0(struct Sprite *sprite) } HandleSetAffineData(sprite, 256, 256, sprite->data[7] << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_37(struct Sprite *sprite) +static void Anim_PivotShake(struct Sprite *sprite) { u16 rotation; @@ -3081,14 +3045,14 @@ static void pokemonanimfunc_37(struct Sprite *sprite) sprite->data[7] = 0; } - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[7] > 255) { sprite->pos2.x = 0; sprite->pos2.y = 0; sprite->data[7] = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -3099,31 +3063,31 @@ static void pokemonanimfunc_37(struct Sprite *sprite) rotation = Sin(sprite->data[7] % 128, 16); HandleSetAffineData(sprite, 256, 256, rotation << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_81820FC(struct Sprite *sprite); -static void sub_818216C(struct Sprite *sprite); -static void sub_81821CC(struct Sprite *sprite); -static void sub_8182248(struct Sprite *sprite); +static void TipAndShake_0(struct Sprite *sprite); +static void TipAndShake_1(struct Sprite *sprite); +static void TipAndShake_2(struct Sprite *sprite); +static void TipAndShake_3(struct Sprite *sprite); -static void pokemonanimfunc_38(struct Sprite *sprite) +static void Anim_TipAndShake(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[7] = 0; sprite->data[4] = 0; - sprite->callback = sub_81820FC; + sprite->callback = TipAndShake_0; } -static void sub_81820FC(struct Sprite *sprite) +static void TipAndShake_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[7] > 24) { if (++sprite->data[4] > 4) { sprite->data[4] = 0; - sprite->callback = sub_818216C; + sprite->callback = TipAndShake_1; } } else @@ -3134,16 +3098,16 @@ static void sub_81820FC(struct Sprite *sprite) } HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_818216C(struct Sprite *sprite) +static void TipAndShake_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[7] > 32) { sprite->data[6] = 1; - sprite->callback = sub_81821CC; + sprite->callback = TipAndShake_2; } else { @@ -3153,17 +3117,17 @@ static void sub_818216C(struct Sprite *sprite) } HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_81821CC(struct Sprite *sprite) +static void TipAndShake_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->data[7] += (sprite->data[6] * 4); if (sprite->data[5] > 9) { sprite->data[7] = 32; - sprite->callback = sub_8182248; + sprite->callback = TipAndShake_3; } sprite->pos2.x = Sin(sprite->data[7], 8); @@ -3175,17 +3139,17 @@ static void sub_81821CC(struct Sprite *sprite) } HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8182248(struct Sprite *sprite) +static void TipAndShake_3(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[7] <= 0) { sprite->data[7] = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -3195,15 +3159,15 @@ static void sub_8182248(struct Sprite *sprite) } HandleSetAffineData(sprite, 256, 256, -(sprite->data[7]) << 8); - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_39(struct Sprite *sprite) +static void Anim_VibrateToCorners(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 40) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -3227,12 +3191,12 @@ static void pokemonanimfunc_39(struct Sprite *sprite) } sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_3A(struct Sprite *sprite) +static void Anim_GrowInStages(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { HandleStartAffineAnim(sprite); @@ -3262,8 +3226,8 @@ static void pokemonanimfunc_3A(struct Sprite *sprite) { sprite->data[7] = 64; HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } var = Cos(sprite->data[7], 64); } @@ -3295,10 +3259,10 @@ static void pokemonanimfunc_3A(struct Sprite *sprite) HandleSetAffineData(sprite, 256 - var, 256 - var, 0); } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_3B(struct Sprite *sprite) +static void Anim_VerticalSpring(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -3311,8 +3275,8 @@ static void pokemonanimfunc_3B(struct Sprite *sprite) { sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -3325,7 +3289,7 @@ static void pokemonanimfunc_3B(struct Sprite *sprite) } } -static void pokemonanimfunc_3C(struct Sprite *sprite) +static void Anim_VerticalRepeatedSpring(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -3338,8 +3302,8 @@ static void pokemonanimfunc_3C(struct Sprite *sprite) { sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -3352,18 +3316,18 @@ static void pokemonanimfunc_3C(struct Sprite *sprite) } } -static void sub_81825F8(struct Sprite *sprite); -static void sub_8182648(struct Sprite *sprite); -static void sub_81826F8(struct Sprite *sprite); +static void SpringRising_0(struct Sprite *sprite); +static void SpringRising_1(struct Sprite *sprite); +static void SpringRising_2(struct Sprite *sprite); -static void pokemonanimfunc_3D(struct Sprite *sprite) +static void Anim_SpringRising(struct Sprite *sprite) { HandleStartAffineAnim(sprite); - sprite->callback = sub_81825F8; + sprite->callback = SpringRising_0; sprite->data[7] = 0; } -static void sub_81825F8(struct Sprite *sprite) +static void SpringRising_0(struct Sprite *sprite) { s16 yScale; @@ -3372,7 +3336,7 @@ static void sub_81825F8(struct Sprite *sprite) { sprite->data[7] = 0; sprite->data[6] = 0; - sprite->callback = sub_8182648; + sprite->callback = SpringRising_1; yScale = Sin(64, 128); // 128 * 1 = 128 } else @@ -3383,7 +3347,7 @@ static void sub_81825F8(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256 + yScale, 0); } -static void sub_8182648(struct Sprite *sprite) +static void SpringRising_1(struct Sprite *sprite) { s16 yScale; @@ -3417,11 +3381,11 @@ static void sub_8182648(struct Sprite *sprite) if (sprite->data[6] == 3) { sprite->data[7] = 0; - sprite->callback = sub_81826F8; + sprite->callback = SpringRising_2; } } -static void sub_81826F8(struct Sprite *sprite) +static void SpringRising_2(struct Sprite *sprite) { s16 yScale; @@ -3430,8 +3394,8 @@ static void sub_81826F8(struct Sprite *sprite) sprite->pos2.y = -(Cos(sprite->data[7], 12)); if (sprite->data[7] > 63) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); } @@ -3439,13 +3403,13 @@ static void sub_81826F8(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256 + yScale, 0); } -static void sub_8182764(struct Sprite *sprite) +static void HorizontalSpring(struct Sprite *sprite) { if (sprite->data[7] > sprite->data[5]) { sprite->pos2.x = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; HandleSetAffineData(sprite, 256, 256, 0); } else @@ -3459,7 +3423,7 @@ static void sub_8182764(struct Sprite *sprite) } } -static void pokemonanimfunc_3E(struct Sprite *sprite) +static void Anim_HorizontalSpring(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -3471,16 +3435,16 @@ static void pokemonanimfunc_3E(struct Sprite *sprite) sprite->data[4] = 8; } - sub_8182764(sprite); + HorizontalSpring(sprite); } -static void sub_8182830(struct Sprite *sprite) +static void HorizontalRepeatedSpring(struct Sprite *sprite) { if (sprite->data[7] > sprite->data[5]) { sprite->pos2.x = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; HandleSetAffineData(sprite, 256, 256, 0); } else @@ -3494,7 +3458,7 @@ static void sub_8182830(struct Sprite *sprite) } } -static void pokemonanimfunc_3F(struct Sprite *sprite) +static void Anim_HorizontalRepeatedSpring_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -3506,12 +3470,12 @@ static void pokemonanimfunc_3F(struct Sprite *sprite) sprite->data[4] = 16; } - sub_8182830(sprite); + HorizontalRepeatedSpring(sprite); } -static void pokemonanimfunc_40(struct Sprite *sprite) +static void Anim_HorizontalSlideShrink(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { HandleStartAffineAnim(sprite); @@ -3522,9 +3486,9 @@ static void pokemonanimfunc_40(struct Sprite *sprite) if (sprite->data[7] > 512) { sprite->pos2.x = 0; - sub_817F77C(sprite); + ResetSpriteAfterAnim(sprite); HandleSetAffineData(sprite, 256, 256, 0); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { @@ -3536,12 +3500,12 @@ static void pokemonanimfunc_40(struct Sprite *sprite) HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0); } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_41(struct Sprite *sprite) +static void Anim_LungeGrow(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { HandleStartAffineAnim(sprite); @@ -3552,9 +3516,9 @@ static void pokemonanimfunc_41(struct Sprite *sprite) if (sprite->data[7] > 512) { sprite->pos2.x = 0; - sub_817F77C(sprite); + ResetSpriteAfterAnim(sprite); HandleSetAffineData(sprite, 256, 256, 0); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { @@ -3566,12 +3530,12 @@ static void pokemonanimfunc_41(struct Sprite *sprite) HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0); } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_42(struct Sprite *sprite) +static void Anim_CircleIntoBackground(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { HandleStartAffineAnim(sprite); @@ -3582,9 +3546,9 @@ static void pokemonanimfunc_42(struct Sprite *sprite) if (sprite->data[7] > 512) { sprite->pos2.x = 0; - sub_817F77C(sprite); + ResetSpriteAfterAnim(sprite); HandleSetAffineData(sprite, 256, 256, 0); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { @@ -3596,15 +3560,15 @@ static void pokemonanimfunc_42(struct Sprite *sprite) HandleSetAffineData(sprite, 256 + scale, 256 + scale, 0); } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_43(struct Sprite *sprite) +static void Anim_RapidHorizontalHops(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 2048) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->data[6] = 0; } else @@ -3630,12 +3594,12 @@ static void pokemonanimfunc_43(struct Sprite *sprite) sprite->data[2] += 24; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_44(struct Sprite *sprite) +static void Anim_FourPetal(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { sprite->data[6] = 0; @@ -3683,64 +3647,64 @@ static void pokemonanimfunc_44(struct Sprite *sprite) default: sprite->pos2.x = 0; sprite->pos2.y = 0; - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; break; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_45(struct Sprite *sprite) +static void Anim_VerticalSquishBounce_Slow(struct Sprite *sprite) { sprite->data[0] = 32; - sub_8180714(sprite); - sprite->callback = sub_8180714; + VerticalSquishBounce(sprite); + sprite->callback = VerticalSquishBounce; } -static void pokemonanimfunc_46(struct Sprite *sprite) +static void Anim_HorizontalSlide_Slow(struct Sprite *sprite) { sprite->data[0] = 80; - sub_817F8FC(sprite); - sprite->callback = sub_817F8FC; + HorizontalSlide(sprite); + sprite->callback = HorizontalSlide; } -static void pokemonanimfunc_47(struct Sprite *sprite) +static void Anim_VerticalSlide_Slow(struct Sprite *sprite) { sprite->data[0] = 80; - sub_817F978(sprite); - sprite->callback = sub_817F978; + VerticalSlide(sprite); + sprite->callback = VerticalSlide; } -static void pokemonanimfunc_48(struct Sprite *sprite) +static void Anim_BounceRotateToSides_Small(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 2048; - sUnknown_03001240[id].field_8 = sprite->data[6]; - sub_8180900(sprite); - sprite->callback = sub_8180900; + sAnims[id].rotation = 2048; + sAnims[id].data = sprite->data[6]; + BounceRotateToSides(sprite); + sprite->callback = BounceRotateToSides; } -static void pokemonanimfunc_49(struct Sprite *sprite) +static void Anim_BounceRotateToSides_Slow(struct Sprite *sprite) { sprite->data[6] = 1; - pokemonanimfunc_05(sprite); + Anim_BounceRotateToSides(sprite); } -static void pokemonanimfunc_4A(struct Sprite *sprite) +static void Anim_BounceRotateToSides_SmallSlow(struct Sprite *sprite) { sprite->data[6] = 1; - pokemonanimfunc_48(sprite); + Anim_BounceRotateToSides_Small(sprite); } -static void pokemonanimfunc_4B(struct Sprite *sprite) +static void Anim_ZigzagSlow(struct Sprite *sprite) { if (sprite->data[2] == 0) sprite->data[0] = 0; if (sprite->data[0] <= 0) { - sub_817FC20(sprite); + Zigzag(sprite); sprite->data[0] = 1; } else @@ -3749,169 +3713,170 @@ static void pokemonanimfunc_4B(struct Sprite *sprite) } } -static void pokemonanimfunc_4C(struct Sprite *sprite) +static void Anim_HorizontalShake_Slow(struct Sprite *sprite) { sprite->data[0] = 30; sprite->data[7] = 3; - sub_817FCDC(sprite); - sprite->callback = sub_817FCDC; + HorizontalShake(sprite); + sprite->callback = HorizontalShake; } -static void pokemonanimfunc_4D(struct Sprite *sprite) +static void Anim_VertialShake_Slow(struct Sprite *sprite) { sprite->data[0] = 30; - sub_817FD44(sprite); - sprite->callback = sub_817FD44; + VerticalShake(sprite); + sprite->callback = VerticalShake; } -static void pokemonanimfunc_4E(struct Sprite *sprite) +static void Anim_Twist_Twice(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 1024; - sUnknown_03001240[id].field_0 = 0; - sUnknown_03001240[id].field_4 = 2; - sub_817FE30(sprite); - sprite->callback = sub_817FE30; + sAnims[id].rotation = 1024; + sAnims[id].delay = 0; + sAnims[id].runs = 2; + Twist(sprite); + sprite->callback = Twist; } -static void pokemonanimfunc_4F(struct Sprite *sprite) +static void Anim_CircleCounterclockwise_Slow(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 512; - sUnknown_03001240[id].field_8 = 3; - sUnknown_03001240[id].field_2 = 12; - sub_817FFF0(sprite); - sprite->callback = sub_817FFF0; + sAnims[id].rotation = 512; + sAnims[id].data = 3; + sAnims[id].speed = 12; + CircleCounterclockwise(sprite); + sprite->callback = CircleCounterclockwise; } -static void pokemonanimfunc_50(struct Sprite *sprite) +static void Anim_VerticalShakeTwice_Slow(struct Sprite *sprite) { sprite->data[0] = 24; - sub_818031C(sprite); - sprite->callback = sub_818031C; + VerticalShakeTwice(sprite); + sprite->callback = VerticalShakeTwice; } -static void pokemonanimfunc_51(struct Sprite *sprite) +static void Anim_VerticalSlideWobble_Small(struct Sprite *sprite) { sprite->data[0] = 5; - sub_81804F8(sprite); - sprite->callback = sub_81804F8; + VerticalSlideWobble(sprite); + sprite->callback = VerticalSlideWobble; } -static void pokemonanimfunc_52(struct Sprite *sprite) +static void Anim_VerticalJumps_Small(struct Sprite *sprite) { sprite->data[0] = 3; - sub_817F9F4(sprite); - sprite->callback = sub_817F9F4; + VerticalJumps(sprite); + sprite->callback = VerticalJumps; } -static void pokemonanimfunc_53(struct Sprite *sprite) +static void Anim_Spin(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_0 = 60; - sUnknown_03001240[id].field_8 = 30; - sub_817FF3C(sprite); - sprite->callback = sub_817FF3C; + sAnims[id].delay = 60; + sAnims[id].data = 30; + Spin(sprite); + sprite->callback = Spin; } -static void pokemonanimfunc_54(struct Sprite *sprite) +static void Anim_TumblingFrontFlip_Twice(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_2 = 1; - sUnknown_03001240[id].field_4 = 2; - sub_8181214(sprite); - sprite->callback = sub_8181214; + sAnims[id].speed = 1; + sAnims[id].runs = 2; + TumblingFrontFlip(sprite); + sprite->callback = TumblingFrontFlip; } -static void pokemonanimfunc_55(struct Sprite *sprite) +static void Anim_DeepVerticalSquishBounce_Twice(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 4; - sUnknown_03001240[id].field_4 = 2; - sub_8181810(sprite); - sprite->callback = sub_8181810; + sAnims[id].rotation = 4; + sAnims[id].runs = 2; + DeepVerticalSquishBounce(sprite); + sprite->callback = DeepVerticalSquishBounce; } -static void pokemonanimfunc_56(struct Sprite *sprite) +static void Anim_HorizontalJumpsVerticalStretch_Twice(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_8 = 1; - sUnknown_03001240[id].field_4 = 2; + sAnims[id].data = 1; + sAnims[id].runs = 2; HandleStartAffineAnim(sprite); sprite->data[3] = 0; - sub_8181ABC(sprite); - sprite->callback = sub_8181ABC; + HorizontalJumpsVerticalStretch_0(sprite); + sprite->callback = HorizontalJumpsVerticalStretch_0; } -static void pokemonanimfunc_07(struct Sprite *sprite) +static void Anim_RotateToSides(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 2; - sub_8181CE8(sprite); - sprite->callback = sub_8181CE8; + sAnims[id].rotation = 2; + RotateToSides(sprite); + sprite->callback = RotateToSides; } -static void pokemonanimfunc_08(struct Sprite *sprite) +static void Anim_RotateToSides_Twice(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 4; - sUnknown_03001240[id].field_4 = 2; - sub_8181CE8(sprite); - sprite->callback = sub_8181CE8; + sAnims[id].rotation = 4; + sAnims[id].runs = 2; + RotateToSides(sprite); + sprite->callback = RotateToSides; } -static void pokemonanimfunc_0B(struct Sprite *sprite) +static void Anim_SwingConcave(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_8 = 100; - sub_81814D4(sprite); - sprite->callback = sub_81814D4; + sAnims[id].data = 100; + SwingConcave(sprite); + sprite->callback = SwingConcave; } -static void pokemonanimfunc_0C(struct Sprite *sprite) +static void Anim_SwingConcave_Fast(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_8 = 50; - sUnknown_03001240[id].field_4 = 2; - sub_81814D4(sprite); - sprite->callback = sub_81814D4; + sAnims[id].data = 50; + sAnims[id].runs = 2; + SwingConcave(sprite); + sprite->callback = SwingConcave; } -static void pokemonanimfunc_0D(struct Sprite *sprite) +static void Anim_SwingConvex(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_8 = 100; - sub_81815D4(sprite); - sprite->callback = sub_81815D4; + sAnims[id].data = 100; + SwingConvex(sprite); + sprite->callback = SwingConvex; } -static void pokemonanimfunc_0E(struct Sprite *sprite) +static void Anim_SwingConvex_Fast(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_8 = 50; - sUnknown_03001240[id].field_4 = 2; - sub_81815D4(sprite); - sprite->callback = sub_81815D4; + sAnims[id].data = 50; + sAnims[id].runs = 2; + SwingConvex(sprite); + sprite->callback = SwingConvex; } -static void sub_8183140(struct Sprite *sprite) +// Very similar to VerticalShake, used by back animations only +static void VerticalShakeBack(struct Sprite *sprite) { s32 counter = sprite->data[2]; if (counter > 2304) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.y = 0; } else @@ -3922,28 +3887,28 @@ static void sub_8183140(struct Sprite *sprite) sprite->data[2] += sprite->data[0]; } -static void pokemonanimfunc_57(struct Sprite *sprite) +static void Anim_VerticalShakeBack(struct Sprite *sprite) { sprite->data[0] = 60; sprite->data[7] = 3; - sub_8183140(sprite); - sprite->callback = sub_8183140; + VerticalShakeBack(sprite); + sprite->callback = VerticalShakeBack; } -static void pokemonanimfunc_58(struct Sprite *sprite) +static void Anim_VerticalShakeBack_Slow(struct Sprite *sprite) { sprite->data[0] = 30; sprite->data[7] = 3; - sub_8183140(sprite); - sprite->callback = sub_8183140; + VerticalShakeBack(sprite); + sprite->callback = VerticalShakeBack; } -static void pokemonanimfunc_59(struct Sprite *sprite) +static void Anim_VerticalShakeHorizontalSlide_Slow(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 2048) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->data[6] = 0; } else @@ -3969,10 +3934,10 @@ static void pokemonanimfunc_59(struct Sprite *sprite) sprite->data[2] += 24; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_81832C8(struct Sprite *sprite) +static void VerticalStretchBothEnds(struct Sprite *sprite) { s16 index1 = 0, index2 = 0; @@ -3983,8 +3948,8 @@ static void sub_81832C8(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256, 0); if (sprite->data[4] <= 1) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -4006,7 +3971,7 @@ static void sub_81832C8(struct Sprite *sprite) index1 = sprite->data[7] & 0xFF; } - if (sprite->data[1] == 0) + if (!sprite->sDontFlip) xScale = -256 - Sin(index2, 16); else xScale = 256 + Sin(index2, 16); @@ -4018,7 +3983,7 @@ static void sub_81832C8(struct Sprite *sprite) } } -static void pokemonanimfunc_5A(struct Sprite *sprite) +static void Anim_VerticalStretchBothEnds_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4031,10 +3996,10 @@ static void pokemonanimfunc_5A(struct Sprite *sprite) sprite->data[7] = 0; } - sub_81832C8(sprite); + VerticalStretchBothEnds(sprite); } -static void sub_8183418(struct Sprite *sprite) +static void HorizontalStretchFar(struct Sprite *sprite) { s16 index1 = 0, index2; @@ -4044,8 +4009,8 @@ static void sub_8183418(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256, 0); if (sprite->data[4] <= 1) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -4069,7 +4034,7 @@ static void sub_8183418(struct Sprite *sprite) amplitude = sprite->data[3]; - if (sprite->data[1] == 0) + if (!sprite->sDontFlip) xScale = -256 + Sin(index2, amplitude) + Sin(index1, amplitude / 5 * 2); else xScale = 256 - Sin(index2, amplitude) - Sin(index1, amplitude / 5 * 2); @@ -4079,7 +4044,7 @@ static void sub_8183418(struct Sprite *sprite) } } -static void pokemonanimfunc_5B(struct Sprite *sprite) +static void Anim_HorizontalStretchFar_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4092,29 +4057,29 @@ static void pokemonanimfunc_5B(struct Sprite *sprite) sprite->data[7] = 0; } - sub_8183418(sprite); + HorizontalStretchFar(sprite); } -static void sub_8183574(struct Sprite *sprite) +static void VerticalShakeLowTwice(struct Sprite *sprite) { u8 var6, var7; u8 var8 = sprite->data[2]; u8 var9 = sprite->data[6]; - u8 var5 = sUnknown_0860AA80[sprite->data[5]][0]; + u8 var5 = sVerticalShakeData[sprite->data[5]][0]; u8 var2 = var5; - if (var5 != 0xFF) + if (var5 != (u8)-1) var5 = sprite->data[7]; else - var5 = 0xFF; // needed to match + var5 = (u8)-1; // needed to match - var6 = sUnknown_0860AA80[sprite->data[5]][1]; + var6 = sVerticalShakeData[sprite->data[5]][1]; var7 = 0; - if (var2 != 0xFE) + if (var2 != (u8)-2) var7 = (var6 - var9) * var5 / var6; - if (var5 == 0xFF) + if (var5 == (u8)-1) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.y = 0; } else @@ -4133,34 +4098,35 @@ static void sub_8183574(struct Sprite *sprite) } } -static void pokemonanimfunc_5C(struct Sprite *sprite) +// Very similar in appearance to Anim_VerticalShakeTwice (especially the fast variant), but deeper +static void Anim_VerticalShakeLowTwice(struct Sprite *sprite) { sprite->data[0] = 40; sprite->data[7] = 6; - sub_8183574(sprite); - sprite->callback = sub_8183574; + VerticalShakeLowTwice(sprite); + sprite->callback = VerticalShakeLowTwice; } -static void pokemonanimfunc_5D(struct Sprite *sprite) +static void Anim_HorizontalShake_Fast(struct Sprite *sprite) { sprite->data[0] = 70; sprite->data[7] = 6; - sub_817FCDC(sprite); - sprite->callback = sub_817FCDC; + HorizontalShake(sprite); + sprite->callback = HorizontalShake; } -static void pokemonanimfunc_5E(struct Sprite *sprite) +static void Anim_HorizontalSlide_Fast(struct Sprite *sprite) { sprite->data[0] = 20; - sub_817F8FC(sprite); - sprite->callback = sub_817F8FC; + HorizontalSlide(sprite); + sprite->callback = HorizontalSlide; } -static void pokemonanimfunc_5F(struct Sprite *sprite) +static void Anim_HorizontalVibrate_Fast(struct Sprite *sprite) { if (sprite->data[2] > 40) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -4177,11 +4143,11 @@ static void pokemonanimfunc_5F(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_60(struct Sprite *sprite) +static void Anim_HorizontalVibrate_Fastest(struct Sprite *sprite) { if (sprite->data[2] > 40) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; } else @@ -4198,42 +4164,42 @@ static void pokemonanimfunc_60(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_61(struct Sprite *sprite) +static void Anim_VerticalShakeBack_Fast(struct Sprite *sprite) { sprite->data[0] = 70; sprite->data[7] = 6; - sub_8183140(sprite); - sprite->callback = sub_8183140; + VerticalShakeBack(sprite); + sprite->callback = VerticalShakeBack; } -static void pokemonanimfunc_62(struct Sprite *sprite) +static void Anim_VerticalShakeLowTwice_Slow(struct Sprite *sprite) { sprite->data[0] = 24; sprite->data[7] = 6; - sub_8183574(sprite); - sprite->callback = sub_8183574; + VerticalShakeLowTwice(sprite); + sprite->callback = VerticalShakeLowTwice; } -static void pokemonanimfunc_63(struct Sprite *sprite) +static void Anim_VerticalShakeLowTwice_Fast(struct Sprite *sprite) { sprite->data[0] = 56; sprite->data[7] = 9; - sub_8183574(sprite); - sprite->callback = sub_8183574; + VerticalShakeLowTwice(sprite); + sprite->callback = VerticalShakeLowTwice; } -static void pokemonanimfunc_64(struct Sprite *sprite) +static void Anim_CircleCounterclockwise_Long(struct Sprite *sprite) { - u8 id = sprite->data[0] = sub_817F758(); + u8 id = sprite->data[0] = AddNewAnim(); - sUnknown_03001240[id].field_6 = 1024; - sUnknown_03001240[id].field_8 = 6; - sUnknown_03001240[id].field_2 = 24; - sub_817FFF0(sprite); - sprite->callback = sub_817FFF0; + sAnims[id].rotation = 1024; + sAnims[id].data = 6; + sAnims[id].speed = 24; + CircleCounterclockwise(sprite); + sprite->callback = CircleCounterclockwise; } -static void sub_81837DC(struct Sprite *sprite) +static void GrowStutter(struct Sprite *sprite) { s16 index1 = 0, index2 = 0; if (sprite->data[5] > sprite->data[6]) @@ -4243,8 +4209,8 @@ static void sub_81837DC(struct Sprite *sprite) HandleSetAffineData(sprite, 256, 256, 0); if (sprite->data[4] <= 1) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -4268,7 +4234,7 @@ static void sub_81837DC(struct Sprite *sprite) amplitude = sprite->data[3]; - if (sprite->data[1] == 0) + if (!sprite->sDontFlip) xScale = Sin(index2, amplitude) + (Sin(index1, amplitude / 5 * 2) - 256); else xScale = 256 - Sin(index1, amplitude / 5 * 2) - Sin(index2, amplitude); @@ -4279,7 +4245,7 @@ static void sub_81837DC(struct Sprite *sprite) } } -static void pokemonanimfunc_65(struct Sprite *sprite) +static void Anim_GrowStutter_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4292,15 +4258,15 @@ static void pokemonanimfunc_65(struct Sprite *sprite) sprite->data[7] = 0; } - sub_81837DC(sprite); + GrowStutter(sprite); } -static void pokemonanimfunc_66(struct Sprite *sprite) +static void Anim_VerticalShakeHorizontalSlide(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 2048) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->data[6] = 0; } else @@ -4326,15 +4292,15 @@ static void pokemonanimfunc_66(struct Sprite *sprite) sprite->data[2] += 48; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_67(struct Sprite *sprite) +static void Anim_VerticalShakeHorizontalSlide_Fast(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] > 2048) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->data[6] = 0; } else @@ -4360,10 +4326,10 @@ static void pokemonanimfunc_67(struct Sprite *sprite) sprite->data[2] += 64; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static const s8 sUnknown_0860ADBE[][3] = +static const s8 sTriangleDownData[][3] = { // x y timer {1, 1, 12}, @@ -4372,67 +4338,67 @@ static const s8 sUnknown_0860ADBE[][3] = {0, 0, 0} }; -static void sub_8183B4C(struct Sprite *sprite) +static void TriangleDown(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) sprite->data[3] = 0; - if (sUnknown_0860ADBE[sprite->data[3]][2] / sprite->data[5] == sprite->data[2]) + if (sTriangleDownData[sprite->data[3]][2] / sprite->data[5] == sprite->data[2]) { sprite->data[3]++; sprite->data[2] = 0; } - if (sUnknown_0860ADBE[sprite->data[3]][2] / sprite->data[5] == 0) + if (sTriangleDownData[sprite->data[3]][2] / sprite->data[5] == 0) { if (--sprite->data[6] == 0) - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; else sprite->data[2] = 0; } else { s32 amplitude = sprite->data[5]; - sprite->pos2.x += (sUnknown_0860ADBE[sprite->data[3]][0] * amplitude); - sprite->pos2.y += (sUnknown_0860ADBE[sprite->data[3]][1] * sprite->data[5]); // what's the point of the var if you're not reusing it? + sprite->pos2.x += (sTriangleDownData[sprite->data[3]][0] * amplitude); + sprite->pos2.y += (sTriangleDownData[sprite->data[3]][1] * sprite->data[5]); // Not using amplitude here. No reason for this. sprite->data[2]++; - sub_817F70C(sprite); + TryFlipX(sprite); } } -static void pokemonanimfunc_68(struct Sprite *sprite) +static void Anim_TriangleDown_Slow(struct Sprite *sprite) { sprite->data[5] = 1; sprite->data[6] = 1; - sub_8183B4C(sprite); - sprite->callback = sub_8183B4C; + TriangleDown(sprite); + sprite->callback = TriangleDown; } -static void pokemonanimfunc_69(struct Sprite *sprite) +static void Anim_TriangleDown(struct Sprite *sprite) { sprite->data[5] = 2; sprite->data[6] = 1; - sub_8183B4C(sprite); - sprite->callback = sub_8183B4C; + TriangleDown(sprite); + sprite->callback = TriangleDown; } -static void pokemonanimfunc_6A(struct Sprite *sprite) +static void Anim_TriangleDown_Fast(struct Sprite *sprite) { sprite->data[5] = 2; sprite->data[6] = 2; - sub_8183B4C(sprite); - sprite->callback = sub_8183B4C; + TriangleDown(sprite); + sprite->callback = TriangleDown; } -static void sub_8183C6C(struct Sprite *sprite) +static void Grow(struct Sprite *sprite) { if (sprite->data[7] > 255) { if (sprite->data[5] <= 1) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; HandleSetAffineData(sprite, 256, 256, 0); } else @@ -4454,9 +4420,9 @@ static void sub_8183C6C(struct Sprite *sprite) } } -static void pokemonanimfunc_6B(struct Sprite *sprite) +static void Anim_Grow(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { HandleStartAffineAnim(sprite); @@ -4466,13 +4432,13 @@ static void pokemonanimfunc_6B(struct Sprite *sprite) sprite->data[5] = 1; } - sub_8183C6C(sprite); - sub_817F70C(sprite); + Grow(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_6C(struct Sprite *sprite) +static void Anim_Grow_Twice(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[2] == 0) { HandleStartAffineAnim(sprite); @@ -4482,11 +4448,11 @@ static void pokemonanimfunc_6C(struct Sprite *sprite) sprite->data[5] = 2; } - sub_8183C6C(sprite); - sub_817F70C(sprite); + Grow(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_6D(struct Sprite *sprite) +static void Anim_HorizontalSpring_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4498,10 +4464,10 @@ static void pokemonanimfunc_6D(struct Sprite *sprite) sprite->data[4] = 16; } - sub_8182764(sprite); + HorizontalSpring(sprite); } -static void pokemonanimfunc_6E(struct Sprite *sprite) +static void Anim_HorizontalSpring_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4513,10 +4479,10 @@ static void pokemonanimfunc_6E(struct Sprite *sprite) sprite->data[4] = 16; } - sub_8182764(sprite); + HorizontalSpring(sprite); } -static void pokemonanimfunc_6F(struct Sprite *sprite) +static void Anim_HorizontalRepeatedSpring_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4528,10 +4494,10 @@ static void pokemonanimfunc_6F(struct Sprite *sprite) sprite->data[4] = 16; } - sub_8182830(sprite); + HorizontalRepeatedSpring(sprite); } -static void pokemonanimfunc_70(struct Sprite *sprite) +static void Anim_HorizontalRepeatedSpring(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4543,10 +4509,10 @@ static void pokemonanimfunc_70(struct Sprite *sprite) sprite->data[4] = 8; } - sub_8182830(sprite); + HorizontalRepeatedSpring(sprite); } -static void pokemonanimfunc_71(struct Sprite *sprite) +static void Anim_ShrinkGrow_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4555,10 +4521,10 @@ static void pokemonanimfunc_71(struct Sprite *sprite) sprite->data[6] = 8; } - sub_8180828(sprite); + ShrinkGrow(sprite); } -static void pokemonanimfunc_72(struct Sprite *sprite) +static void Anim_ShrinkGrow_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4567,10 +4533,10 @@ static void pokemonanimfunc_72(struct Sprite *sprite) sprite->data[6] = 4; } - sub_8180828(sprite); + ShrinkGrow(sprite); } -static void pokemonanimfunc_73(struct Sprite *sprite) +static void Anim_VerticalStretchBothEnds(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4582,10 +4548,10 @@ static void pokemonanimfunc_73(struct Sprite *sprite) sprite->data[7] = 0; } - sub_81832C8(sprite); + VerticalStretchBothEnds(sprite); } -static void pokemonanimfunc_74(struct Sprite *sprite) +static void Anim_VerticalStretchBothEnds_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4597,10 +4563,10 @@ static void pokemonanimfunc_74(struct Sprite *sprite) sprite->data[7] = 0; } - sub_81832C8(sprite); + VerticalStretchBothEnds(sprite); } -static void pokemonanimfunc_75(struct Sprite *sprite) +static void Anim_HorizontalStretchFar_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4613,10 +4579,10 @@ static void pokemonanimfunc_75(struct Sprite *sprite) sprite->data[7] = 0; } - sub_8183418(sprite); + HorizontalStretchFar(sprite); } -static void pokemonanimfunc_76(struct Sprite *sprite) +static void Anim_HorizontalStretchFar(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4629,10 +4595,10 @@ static void pokemonanimfunc_76(struct Sprite *sprite) sprite->data[7] = 0; } - sub_8183418(sprite); + HorizontalStretchFar(sprite); } -static void pokemonanimfunc_77(struct Sprite *sprite) +static void Anim_GrowStutter_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4645,10 +4611,10 @@ static void pokemonanimfunc_77(struct Sprite *sprite) sprite->data[7] = 0; } - sub_81837DC(sprite); + GrowStutter(sprite); } -static void pokemonanimfunc_78(struct Sprite *sprite) +static void Anim_GrowStutter(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4661,16 +4627,16 @@ static void pokemonanimfunc_78(struct Sprite *sprite) sprite->data[7] = 0; } - sub_81837DC(sprite); + GrowStutter(sprite); } -static void sub_8183FA8(struct Sprite *sprite) +static void ConcaveArc(struct Sprite *sprite) { if (sprite->data[7] > 255) { if (sprite->data[6] <= 1) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; sprite->pos2.x = 0; sprite->pos2.y = 0; } @@ -4692,7 +4658,7 @@ static void sub_8183FA8(struct Sprite *sprite) } } -static void pokemonanimfunc_79(struct Sprite *sprite) +static void Anim_ConcaveArcLarge_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4704,10 +4670,10 @@ static void pokemonanimfunc_79(struct Sprite *sprite) sprite->data[3] = 4; } - sub_8183FA8(sprite); + ConcaveArc(sprite); } -static void pokemonanimfunc_7A(struct Sprite *sprite) +static void Anim_ConcaveArcLarge(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4719,10 +4685,10 @@ static void pokemonanimfunc_7A(struct Sprite *sprite) sprite->data[3] = 6; } - sub_8183FA8(sprite); + ConcaveArc(sprite); } -static void pokemonanimfunc_7B(struct Sprite *sprite) +static void Anim_ConcaveArcLarge_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4734,16 +4700,16 @@ static void pokemonanimfunc_7B(struct Sprite *sprite) sprite->data[3] = 8; } - sub_8183FA8(sprite); + ConcaveArc(sprite); } -static void sub_81840C4(struct Sprite *sprite) +static void ConvexDoubleArc(struct Sprite *sprite) { if (sprite->data[7] > 256) { if (sprite->data[6] <= sprite->data[4]) { - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { @@ -4783,7 +4749,7 @@ static void sub_81840C4(struct Sprite *sprite) } } -static void pokemonanimfunc_7C(struct Sprite *sprite) +static void Anim_ConvexDoubleArc_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4795,10 +4761,10 @@ static void pokemonanimfunc_7C(struct Sprite *sprite) sprite->data[3] = 4; } - sub_81840C4(sprite); + ConvexDoubleArc(sprite); } -static void pokemonanimfunc_7D(struct Sprite *sprite) +static void Anim_ConvexDoubleArc(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4810,10 +4776,10 @@ static void pokemonanimfunc_7D(struct Sprite *sprite) sprite->data[3] = 6; } - sub_81840C4(sprite); + ConvexDoubleArc(sprite); } -static void pokemonanimfunc_7E(struct Sprite *sprite) +static void Anim_ConvexDoubleArc_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4825,10 +4791,10 @@ static void pokemonanimfunc_7E(struct Sprite *sprite) sprite->data[3] = 8; } - sub_81840C4(sprite); + ConvexDoubleArc(sprite); } -static void pokemonanimfunc_7F(struct Sprite *sprite) +static void Anim_ConcaveArcSmall_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4840,10 +4806,10 @@ static void pokemonanimfunc_7F(struct Sprite *sprite) sprite->data[3] = 4; } - sub_8183FA8(sprite); + ConcaveArc(sprite); } -static void pokemonanimfunc_80(struct Sprite *sprite) +static void Anim_ConcaveArcSmall(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4855,10 +4821,10 @@ static void pokemonanimfunc_80(struct Sprite *sprite) sprite->data[3] = 6; } - sub_8183FA8(sprite); + ConcaveArc(sprite); } -static void pokemonanimfunc_81(struct Sprite *sprite) +static void Anim_ConcaveArcSmall_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4870,18 +4836,18 @@ static void pokemonanimfunc_81(struct Sprite *sprite) sprite->data[3] = 8; } - sub_8183FA8(sprite); + ConcaveArc(sprite); } -static void sub_8184290(struct Sprite *sprite) +static void SetHorizontalDip(struct Sprite *sprite) { u16 index = Sin((sprite->data[2] * 128) / sprite->data[7], sprite->data[5]); sprite->data[6] = -(index << 8); - sub_817F3F0(sprite, index, sprite->data[4], 0); + SetPosForRotation(sprite, index, sprite->data[4], 0); HandleSetAffineData(sprite, 256, 256, sprite->data[6]); } -static void pokemonanimfunc_82(struct Sprite *sprite) +static void Anim_HorizontalDip(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4901,8 +4867,8 @@ static void pokemonanimfunc_82(struct Sprite *sprite) sprite->data[0]++; if (sprite->data[3] <= sprite->data[0]) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; return; } else @@ -4912,13 +4878,13 @@ static void pokemonanimfunc_82(struct Sprite *sprite) } else { - sub_8184290(sprite); + SetHorizontalDip(sprite); } sprite->data[2]++; } -static void pokemonanimfunc_83(struct Sprite *sprite) +static void Anim_HorizontalDip_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4938,8 +4904,8 @@ static void pokemonanimfunc_83(struct Sprite *sprite) sprite->data[0]++; if (sprite->data[3] <= sprite->data[0]) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; return; } else @@ -4949,13 +4915,13 @@ static void pokemonanimfunc_83(struct Sprite *sprite) } else { - sub_8184290(sprite); + SetHorizontalDip(sprite); } sprite->data[2]++; } -static void pokemonanimfunc_84(struct Sprite *sprite) +static void Anim_HorizontalDip_Twice(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4975,8 +4941,8 @@ static void pokemonanimfunc_84(struct Sprite *sprite) sprite->data[0]++; if (sprite->data[3] <= sprite->data[0]) { - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; return; } else @@ -4986,20 +4952,20 @@ static void pokemonanimfunc_84(struct Sprite *sprite) } else { - sub_8184290(sprite); + SetHorizontalDip(sprite); } sprite->data[2]++; } -static void sub_8184468(struct Sprite *sprite) +static void ShrinkGrowVibrate(struct Sprite *sprite) { if (sprite->data[2] > sprite->data[7]) { sprite->pos2.y = 0; HandleSetAffineData(sprite, 256, 256, 0); - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } else { @@ -5032,7 +4998,7 @@ static void sub_8184468(struct Sprite *sprite) sprite->data[2]++; } -static void pokemonanimfunc_85(struct Sprite *sprite) +static void Anim_ShrinkGrowVibrate_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5042,10 +5008,10 @@ static void pokemonanimfunc_85(struct Sprite *sprite) sprite->data[7] = 80; } - sub_8184468(sprite); + ShrinkGrowVibrate(sprite); } -static void pokemonanimfunc_86(struct Sprite *sprite) +static void Anim_ShrinkGrowVibrate(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5055,10 +5021,10 @@ static void pokemonanimfunc_86(struct Sprite *sprite) sprite->data[7] = 40; } - sub_8184468(sprite); + ShrinkGrowVibrate(sprite); } -static void pokemonanimfunc_87(struct Sprite *sprite) +static void Anim_ShrinkGrowVibrate_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5068,59 +5034,59 @@ static void pokemonanimfunc_87(struct Sprite *sprite) sprite->data[7] = 80; } - sub_8184468(sprite); + ShrinkGrowVibrate(sprite); } -static void sub_8184610(struct Sprite *sprite); -static void sub_8184640(struct Sprite *sprite); -static void sub_8184678(struct Sprite *sprite); -static void sub_81846B8(struct Sprite *sprite); +static void JoltRight_0(struct Sprite *sprite); +static void JoltRight_1(struct Sprite *sprite); +static void JoltRight_2(struct Sprite *sprite); +static void JoltRight_3(struct Sprite *sprite); -static void sub_81845D4(struct Sprite *sprite) +static void JoltRight(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x -= sprite->data[2]; if (sprite->pos2.x <= -sprite->data[6]) { sprite->pos2.x = -sprite->data[6]; sprite->data[7] = 2; - sprite->callback = sub_8184610; + sprite->callback = JoltRight_0; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8184610(struct Sprite *sprite) +static void JoltRight_0(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x += sprite->data[7]; sprite->data[7]++; if (sprite->pos2.x >= 0) - sprite->callback = sub_8184640; + sprite->callback = JoltRight_1; - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8184640(struct Sprite *sprite) +static void JoltRight_1(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x += sprite->data[7]; sprite->data[7]++; if (sprite->pos2.x > sprite->data[6]) { sprite->pos2.x = sprite->data[6]; - sprite->callback = sub_8184678; + sprite->callback = JoltRight_2; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_8184678(struct Sprite *sprite) +static void JoltRight_2(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[3] >= sprite->data[5]) { - sprite->callback = sub_81846B8; + sprite->callback = JoltRight_3; } else { @@ -5129,24 +5095,24 @@ static void sub_8184678(struct Sprite *sprite) sprite->data[3]++; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void sub_81846B8(struct Sprite *sprite) +static void JoltRight_3(struct Sprite *sprite) { - sub_817F70C(sprite); + TryFlipX(sprite); sprite->pos2.x -= 2; if (sprite->pos2.x <= 0) { sprite->pos2.x = 0; - sub_817F77C(sprite); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + ResetSpriteAfterAnim(sprite); + sprite->callback = WaitAnimEnd; } - sub_817F70C(sprite); + TryFlipX(sprite); } -static void pokemonanimfunc_88(struct Sprite *sprite) +static void Anim_JoltRight_Fast(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[7] = 4; @@ -5155,10 +5121,10 @@ static void pokemonanimfunc_88(struct Sprite *sprite) sprite->data[4] = 4; sprite->data[3] = 0; sprite->data[2] = 2; - sprite->callback = sub_81845D4; + sprite->callback = JoltRight; } -static void pokemonanimfunc_89(struct Sprite *sprite) +static void Anim_JoltRight(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[7] = 2; @@ -5167,10 +5133,10 @@ static void pokemonanimfunc_89(struct Sprite *sprite) sprite->data[4] = 2; sprite->data[3] = 0; sprite->data[2] = 1; - sprite->callback = sub_81845D4; + sprite->callback = JoltRight; } -static void pokemonanimfunc_8A(struct Sprite *sprite) +static void Anim_JoltRight_Slow(struct Sprite *sprite) { HandleStartAffineAnim(sprite); sprite->data[7] = 0; @@ -5179,10 +5145,10 @@ static void pokemonanimfunc_8A(struct Sprite *sprite) sprite->data[4] = 2; sprite->data[3] = 0; sprite->data[2] = 1; - sprite->callback = sub_81845D4; + sprite->callback = JoltRight; } -static void sub_8184770(struct Sprite *sprite) +static void SetShakeFlashYellowPos(struct Sprite *sprite) { sprite->pos2.x = sprite->data[1]; if (sprite->data[0] > 1) @@ -5196,97 +5162,91 @@ static void sub_8184770(struct Sprite *sprite) } } -struct YellowBlendStruct -{ - u8 field_0; - u8 field_1; -}; - -static const struct YellowBlendStruct sUnknown_0860ADCC[] = -{ - {0, 1}, - {1, 2}, - {0, 15}, - {1, 1}, - {0, 15}, - {1, 1}, - {0, 15}, - {1, 1}, - {0, 1}, - {1, 1}, - {0, 1}, - {1, 1}, - {0, 1}, - {1, 1}, - {0, 1}, - {1, 1}, - {0, 1}, - {1, 1}, - {0, 1}, - {0, 0xFF} +static const struct YellowFlashData sShakeYellowFlashData_Fast[] = +{ + {FALSE, 1}, + { TRUE, 2}, + {FALSE, 15}, + { TRUE, 1}, + {FALSE, 15}, + { TRUE, 1}, + {FALSE, 15}, + { TRUE, 1}, + {FALSE, 1}, + { TRUE, 1}, + {FALSE, 1}, + { TRUE, 1}, + {FALSE, 1}, + { TRUE, 1}, + {FALSE, 1}, + { TRUE, 1}, + {FALSE, 1}, + { TRUE, 1}, + {FALSE, 1}, + {FALSE, -1} }; -static const struct YellowBlendStruct sUnknown_0860AE1C[] = -{ - {0, 5}, - {1, 1}, - {0, 15}, - {1, 4}, - {0, 2}, - {1, 2}, - {0, 2}, - {1, 2}, - {0, 2}, - {1, 2}, - {0, 2}, - {1, 2}, - {0, 2}, - {0, 0xFF} +static const struct YellowFlashData sShakeYellowFlashData_Normal[] = +{ + {FALSE, 5}, + { TRUE, 1}, + {FALSE, 15}, + { TRUE, 4}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + { TRUE, 2}, + {FALSE, 2}, + {FALSE, -1} }; -static const struct YellowBlendStruct sUnknown_0860AE54[] = -{ - {0, 1}, - {1, 1}, - {0, 20}, - {1, 1}, - {0, 20}, - {1, 1}, - {0, 20}, - {1, 1}, - {0, 1}, - {0, 0xFF} +static const struct YellowFlashData sShakeYellowFlashData_Slow[] = +{ + {FALSE, 1}, + { TRUE, 1}, + {FALSE, 20}, + { TRUE, 1}, + {FALSE, 20}, + { TRUE, 1}, + {FALSE, 20}, + { TRUE, 1}, + {FALSE, 1}, + {FALSE, -1} }; -static const struct YellowBlendStruct *const sUnknown_0860AE7C[] = +static const struct YellowFlashData *const sShakeYellowFlashData[] = { - sUnknown_0860ADCC, - sUnknown_0860AE1C, - sUnknown_0860AE54 + sShakeYellowFlashData_Fast, + sShakeYellowFlashData_Normal, + sShakeYellowFlashData_Slow }; -static void BackAnimBlendYellow(struct Sprite *sprite) +static void ShakeFlashYellow(struct Sprite *sprite) { - const struct YellowBlendStruct *array = sUnknown_0860AE7C[sprite->data[3]]; - sub_8184770(sprite); - if (array[sprite->data[6]].field_1 == 0xFF) + const struct YellowFlashData *array = sShakeYellowFlashData[sprite->data[3]]; + SetShakeFlashYellowPos(sprite); + if (array[sprite->data[6]].time == (u8)-1) { sprite->pos2.x = 0; - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + sprite->callback = WaitAnimEnd; } else { if (sprite->data[4] == 1) { - if (array[sprite->data[6]].field_0 != 0) - BlendPalette(sprite->data[7], 0x10, 0x10, RGB_YELLOW); + if (array[sprite->data[6]].isYellow) + BlendPalette(sprite->data[7], 16, 16, RGB_YELLOW); else - BlendPalette(sprite->data[7], 0x10, 0, RGB_YELLOW); + BlendPalette(sprite->data[7], 16, 0, RGB_YELLOW); sprite->data[4] = 0; } - if (array[sprite->data[6]].field_1 == sprite->data[5]) + if (array[sprite->data[6]].time == sprite->data[5]) { sprite->data[4] = 1; sprite->data[5] = 0; @@ -5299,7 +5259,7 @@ static void BackAnimBlendYellow(struct Sprite *sprite) } } -static void pokemonanimfunc_8B(struct Sprite *sprite) +static void Anim_ShakeFlashYellow_Fast(struct Sprite *sprite) { if (++sprite->data[2] == 1) { @@ -5310,10 +5270,10 @@ static void pokemonanimfunc_8B(struct Sprite *sprite) sprite->data[3] = 0; } - BackAnimBlendYellow(sprite); + ShakeFlashYellow(sprite); } -static void pokemonanimfunc_8C(struct Sprite *sprite) +static void Anim_ShakeFlashYellow(struct Sprite *sprite) { if (++sprite->data[2] == 1) { @@ -5324,10 +5284,10 @@ static void pokemonanimfunc_8C(struct Sprite *sprite) sprite->data[3] = 1; } - BackAnimBlendYellow(sprite); + ShakeFlashYellow(sprite); } -static void pokemonanimfunc_8D(struct Sprite *sprite) +static void Anim_ShakeFlashYellow_Slow(struct Sprite *sprite) { if (++sprite->data[2] == 1) { @@ -5338,33 +5298,43 @@ static void pokemonanimfunc_8D(struct Sprite *sprite) sprite->data[3] = 2; } - BackAnimBlendYellow(sprite); + ShakeFlashYellow(sprite); } -static void BackAnimBlend(struct Sprite *sprite) +enum { + SHAKEGLOW_RED, + SHAKEGLOW_GREEN, + SHAKEGLOW_BLUE, + SHAKEGLOW_BLACK +}; + +static void ShakeGlow_Blend(struct Sprite *sprite) { static const u16 sColors[] = { - RGB_RED, RGB_GREEN, RGB_BLUE, RGB_BLACK + [SHAKEGLOW_RED] = RGB_RED, + [SHAKEGLOW_GREEN] = RGB_GREEN, + [SHAKEGLOW_BLUE] = RGB_BLUE, + [SHAKEGLOW_BLACK] = RGB_BLACK }; if (sprite->data[2] > 127) { - BlendPalette(sprite->data[7], 0x10, 0, RGB_RED); - sprite->callback = SpriteCB_SetDummyOnAnimEnd; + BlendPalette(sprite->data[7], 16, 0, RGB_RED); + sprite->callback = WaitAnimEnd; } else { sprite->data[6] = Sin(sprite->data[2], 12); - BlendPalette(sprite->data[7], 0x10, sprite->data[6], sColors[sprite->data[1]]); + BlendPalette(sprite->data[7], 16, sprite->data[6], sColors[sprite->data[1]]); } } -static void sub_8184934(struct Sprite *sprite) +static void ShakeGlow_Move(struct Sprite *sprite) { if (sprite->data[3] < sprite->data[4]) { - sub_817F70C(sprite); + TryFlipX(sprite); if (sprite->data[5] > sprite->data[0]) { if (++sprite->data[3] < sprite->data[4]) @@ -5379,11 +5349,11 @@ static void sub_8184934(struct Sprite *sprite) sprite->data[5]++; } - sub_817F70C(sprite); + TryFlipX(sprite); } } -static void pokemonanimfunc_8E(struct Sprite *sprite) +static void Anim_ShakeGlowRed_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5392,19 +5362,19 @@ static void pokemonanimfunc_8E(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 2; sprite->data[3] = 0; - sprite->data[1] = 0; + sprite->data[1] = SHAKEGLOW_RED; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_8F(struct Sprite *sprite) +static void Anim_ShakeGlowRed(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5413,19 +5383,19 @@ static void pokemonanimfunc_8F(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 1; sprite->data[3] = 0; - sprite->data[1] = 0; + sprite->data[1] = SHAKEGLOW_RED; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_90(struct Sprite *sprite) +static void Anim_ShakeGlowRed_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5434,19 +5404,19 @@ static void pokemonanimfunc_90(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 1; sprite->data[3] = 0; - sprite->data[1] = 0; + sprite->data[1] = SHAKEGLOW_RED; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_91(struct Sprite *sprite) +static void Anim_ShakeGlowGreen_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5455,19 +5425,19 @@ static void pokemonanimfunc_91(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 2; sprite->data[3] = 0; - sprite->data[1] = 1; + sprite->data[1] = SHAKEGLOW_GREEN; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_92(struct Sprite *sprite) +static void Anim_ShakeGlowGreen(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5476,19 +5446,19 @@ static void pokemonanimfunc_92(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 1; sprite->data[3] = 0; - sprite->data[1] = 1; + sprite->data[1] = SHAKEGLOW_GREEN; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_93(struct Sprite *sprite) +static void Anim_ShakeGlowGreen_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5497,19 +5467,19 @@ static void pokemonanimfunc_93(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 1; sprite->data[3] = 0; - sprite->data[1] = 1; + sprite->data[1] = SHAKEGLOW_GREEN; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_94(struct Sprite *sprite) +static void Anim_ShakeGlowBlue_Fast(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5518,19 +5488,19 @@ static void pokemonanimfunc_94(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 2; sprite->data[3] = 0; - sprite->data[1] = 2; + sprite->data[1] = SHAKEGLOW_BLUE; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_95(struct Sprite *sprite) +static void Anim_ShakeGlowBlue(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5539,19 +5509,19 @@ static void pokemonanimfunc_95(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 1; sprite->data[3] = 0; - sprite->data[1] = 2; + sprite->data[1] = SHAKEGLOW_BLUE; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void pokemonanimfunc_96(struct Sprite *sprite) +static void Anim_ShakeGlowBlue_Slow(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -5560,19 +5530,19 @@ static void pokemonanimfunc_96(struct Sprite *sprite) sprite->data[5] = 0; sprite->data[4] = 1; sprite->data[3] = 0; - sprite->data[1] = 2; + sprite->data[1] = SHAKEGLOW_BLUE; } if (sprite->data[2] % 2 == 0) - BackAnimBlend(sprite); + ShakeGlow_Blend(sprite); if (sprite->data[2] >= (128 - sprite->data[0] * sprite->data[4]) / 2) - sub_8184934(sprite); + ShakeGlow_Move(sprite); sprite->data[2]++; } -static void SpriteCB_SetDummyOnAnimEnd(struct Sprite *sprite) +static void WaitAnimEnd(struct Sprite *sprite) { if (sprite->animEnded) sprite->callback = SpriteCallbackDummy; diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index b85a29151..42330b6a5 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; @@ -1049,7 +1051,7 @@ u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u return spriteId; } -u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, bool32 extra) +u8 CreateMonIconNoPersonality(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, bool32 handleDeoxys) { u8 spriteId; struct MonIconSpriteTemplate iconTemplate = @@ -1062,7 +1064,7 @@ u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], }; - iconTemplate.image = GetMonIconTiles(species, extra); + iconTemplate.image = GetMonIconTiles(species, handleDeoxys); spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); UpdateMonIconFrame(&gSprites[spriteId]); @@ -1086,7 +1088,7 @@ u16 GetIconSpecies(u16 species, u32 personality) else { if (species > NUM_SPECIES) - result = 260; + result = INVALID_ICON_SPECIES; else result = species; } @@ -1099,10 +1101,10 @@ u16 GetUnownLetterByPersonality(u32 personality) if (!personality) return 0; else - return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; + return GET_UNOWN_LETTER(personality); } -u16 sub_80D2E84(u16 species) +u16 GetIconSpeciesNoPersonality(u16 species) { u16 value; @@ -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_jump.c b/src/pokemon_jump.c index 914752eb4..5c678ed8c 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -29,515 +29,645 @@ #include "pokemon_jump.h" #include "constants/rgb.h" #include "constants/songs.h" +#include "constants/items.h" -struct PokemonJump1_MonInfo +#define MAX_JUMP_SCORE 99990 +#define MAX_JUMPS 9999 + +#define JUMP_PEAK (-30) + +enum { + BG_INTERFACE, + BG_BONUSES, + BG_VENUSAUR, + BG_SCENERY, +}; + +// IDs for persistent windows +enum { + WIN_POINTS, + WIN_TIMES, + NUM_WINDOWS +}; + +enum { + PACKET_MON_INFO = 1, + PACKET_UNUSED, + PACKET_LEADER_STATE, + PACKET_MEMBER_STATE, +}; + +enum { + JUMP_TYPE_NORMAL, + JUMP_TYPE_FAST, + JUMP_TYPE_SLOW, +}; + +enum { + FUNC_GAME_INTRO, + FUNC_WAIT_ROUND, + FUNC_GAME_ROUND, + FUNC_GAME_OVER, + FUNC_ASK_PLAY_AGAIN, + FUNC_RESET_GAME, + FUNC_EXIT, + FUNC_GIVE_PRIZE, + FUNC_SAVE, + FUNC_NONE +}; + +enum { + GFXFUNC_LOAD, + GFXFUNC_SHOW_NAMES, + GFXFUNC_SHOW_NAMES_HIGHLIGHT, + GFXFUNC_ERASE_NAMES, + GFXFUNC_MSG_PLAY_AGAIN, + GFXFUNC_MSG_SAVING, + GFXFUNC_ERASE_MSG, + GFXFUNC_MSG_PLAYER_DROPPED, + GFXFUNC_MSG_COMM_STANDBY, + GFXFUNC_COUNTDOWN, +}; + +enum { + VINE_HIGHEST, + VINE_DOWNSWING_HIGHER, + VINE_DOWNSWING_HIGH, + VINE_DOWNSWING_LOW, + VINE_DOWNSWING_LOWER, + VINE_LOWEST, + VINE_UPSWING_LOWER, + VINE_UPSWING_LOW, + VINE_UPSWING_HIGH, + VINE_UPSWING_HIGHER, + NUM_VINESTATES +}; + +// Used to compare limits for vineStateTimer +// The upper 8 bits of vineStateTimer are the vine state, +// the lower 8 bits are a timer to the next state. +// When the timer is incremented above 255, it increments +// the vine state and the timer is reset. +#define VINE_STATE_TIMER(vineState)(((vineState) << 8) | 0xFF) + +enum { + MONSTATE_NORMAL, // Pokémon is either on the ground or in the middle of a jump + MONSTATE_JUMP, // Pokémon has begun a jump + MONSTATE_HIT, // Pokémon got hit by the vine +}; + +enum { + JUMPSTATE_NONE, + JUMPSTATE_SUCCESS, // Cleared vine + JUMPSTATE_FAILURE, // Hit vine +}; + +#define PLAY_AGAIN_NO 1 +#define PLAY_AGAIN_YES 2 + +#define TAG_MON1 0 +#define TAG_MON2 1 // MON2-5 used implicitly by adding multiplayer id to tag +#define TAG_MON3 2 +#define TAG_MON4 3 +#define TAG_MON5 4 + +#define GFXTAG_VINE1 5 +#define GFXTAG_VINE2 6 +#define GFXTAG_VINE3 7 +#define GFXTAG_VINE4 8 +#define GFXTAG_COUNTDOWN 9 +#define GFXTAG_STAR 10 + +#define PALTAG_1 5 +#define PALTAG_2 6 +#define PALTAG_COUNTDOWN 7 + +#define TAG_DIGITS 800 + +#define VINE_SPRITES_PER_SIDE 4 // Vine rope is divided into 8 sprites, 4 per side copied and flipped horizontally + +// Used by SetLinkTimeInterval to get a bit mask for capping +// a timer that controls how frequently link data is sent. +#define LINK_INTERVAL_NONE 0 +#define LINK_INTERVAL_SHORT 3 // 3 frame interval +#define LINK_INTERVAL_MEDIUM 4 // 7 frame interval +#define LINK_INTERVAL_LONG 5 // 15 frame interval + +#define LINK_TIMER_STOPPED 0x1111 + +struct PokemonJump_MonInfo { u16 species; u32 otId; u32 personality; }; -struct PokemonJump1_82E4 -{ - int unk0; - int unk4; - u8 filler8[0x4]; - u16 unkC; - u16 unkE; - u16 unk10; - u16 unk12; - int unk14; - int unk18; - u8 unk1C[11]; -}; - -struct PokemonJump2 -{ - int unk0; - u16 unk4; - u8 unk6; - u8 filler7[0xa - 0x7]; - u8 unkA; - u8 unkB; - u8 unkC; - u8 unkD; - u8 unkE; - u8 unkF; - u16 filler10; - u16 unk12; - u16 unk14; - u32 unk18; - u16 unk1C[5]; - u8 txtBuff[2][0x40]; - u8 strBuff[0x100]; - u16 tilemapBuffer[(0x81a8 - 0x1a6) / 2]; // 0x1A6 - struct Sprite *unk81A8[MAX_RFU_PLAYERS]; - struct Sprite *unk81BC[MAX_RFU_PLAYERS]; - struct Sprite *unk81D0[8]; - u8 filler81F0[0xC]; - u8 unk81FC[MAX_RFU_PLAYERS]; -}; - -struct PokemonJump1Sub -{ - u8 unk0; - u8 unk1; - u16 unk2; - u16 unk4; - u32 unk8; -}; - -struct PokemonJump1 -{ - MainCallback returnCallback; - u8 unk4; - u8 unk5; - u8 unk6; - u8 unk7; - u16 unk8; - u16 unkA; - u16 unkC; - u16 unkE; - int unk10; - u32 unk14; - u32 unk18; - int unk1C; - u32 unk20; - u32 unk24; - u32 unk28; - int unk2C; - u32 unk30; - u16 unk34; - u16 unk36; - u8 filler38[0x2]; - u16 unk3A; - u16 unk3C; - u16 unk3E; - u16 unk40; - u16 unk42; - u8 unk44; - u8 unk45; - u8 unk46; - u8 isLeader; - u8 unk48; - u8 unk49; - u16 unk4A; - u8 unk4C; - u8 unk4D; - u16 unk4E; - u8 unk50; - u8 unk51; - u8 filler52[0x2]; - int unk54; - int unk58; - int unk5C; - int unk60; - int unk64; - int unk68; - int unk6C; - struct PokemonJump1Sub unk70; - u8 unk7C[MAX_RFU_PLAYERS]; - u8 unk81[MAX_RFU_PLAYERS]; - u8 unk86[MAX_RFU_PLAYERS]; - u8 unk8B[MAX_RFU_PLAYERS]; - u16 unk90[MAX_RFU_PLAYERS]; - u16 unk9A[MAX_RFU_PLAYERS]; - struct PokemonJump2 unkA4; - struct PokemonJump1_MonInfo unk82A8[MAX_RFU_PLAYERS]; - struct PokemonJump1_82E4 unk82E4[MAX_RFU_PLAYERS]; - struct PokemonJump1_82E4 *unk83AC; +struct PokemonJump_Player +{ + int jumpOffset; + int jumpOffsetIdx; + u32 unused; + u16 monJumpType; + u16 jumpTimeStart; + u16 monState; + u16 prevMonState; + int jumpState; + bool32 funcFinished; + u8 name[11]; +}; + +struct PokemonJumpGfx +{ + bool32 funcFinished; + u16 mainState; + u8 taskId; + u8 unused1[3]; + u8 resetVineState; + u8 resetVineTimer; + u8 vineState; + u8 msgWindowState; + u8 vinePalNumDownswing; + u8 vinePalNumUpswing; + u16 unused2; + u16 msgWindowId; + u16 fanfare; + u32 bonusTimer; + u16 nameWindowIds[MAX_RFU_PLAYERS]; + u8 itemName[64]; + u8 itemQuantityStr[64]; + u8 prizeMsg[256]; + u16 tilemapBuffer[0x4000]; + struct Sprite *monSprites[MAX_RFU_PLAYERS]; + struct Sprite *starSprites[MAX_RFU_PLAYERS]; + struct Sprite *vineSprites[VINE_SPRITES_PER_SIDE * 2]; + u8 unused3[12]; + u8 monSpriteSubpriorities[MAX_RFU_PLAYERS]; +}; + +struct PokemonJump_CommData +{ + u8 funcId; + u8 receivedBonusFlags; + u16 data; // Multi-use + u16 jumpsInRow; + u32 jumpScore; +}; + +struct PokemonJump +{ + MainCallback exitCallback; + u8 taskId; + u8 numPlayers; + u8 multiplayerId; + u8 startDelayTimer; + u16 mainState; + u16 helperState; + u16 excellentsInRow; + u16 excellentsInRowRecord; + bool32 gameOver; + u32 vineState; + u32 prevVineState; + int vineSpeed; + u32 vineSpeedAccel; + u32 rngSeed; + u32 nextVineSpeed; + int linkTimer; + u32 linkTimerLimit; + u16 vineStateTimer; + bool16 ignoreJumpInput; + u16 unused1; + u16 unused2; // Set to 0, never read + u16 timer; + u16 prizeItemId; + u16 prizeItemQuantity; + u16 playAgainComm; + u8 unused3; // Set to 0, never read + u8 playAgainState; + bool8 allowVineUpdates; + bool8 isLeader; + bool8 funcActive; + bool8 allPlayersReady; + u16 vineTimer; + u8 nextFuncId; + bool8 showBonus; + u16 vineSpeedDelay; + u8 vineBaseSpeedIdx; + u8 vineSpeedStage; + int numPlayersAtPeak; + bool32 initScoreUpdate; + bool32 updateScore; + bool32 unused4; // Set to TRUE, never read + bool32 giveBonus; + bool32 skipJumpUpdate; + bool32 atMaxSpeedStage; + struct PokemonJump_CommData comm; + bool8 atJumpPeak[MAX_RFU_PLAYERS]; + bool8 atJumpPeak2[MAX_RFU_PLAYERS]; + bool8 atJumpPeak3[MAX_RFU_PLAYERS]; + u8 memberFuncIds[MAX_RFU_PLAYERS]; + u16 playAgainStates[MAX_RFU_PLAYERS]; + u16 jumpTimeStarts[MAX_RFU_PLAYERS]; + struct PokemonJumpGfx jumpGfx; + struct PokemonJump_MonInfo monInfo[MAX_RFU_PLAYERS]; + struct PokemonJump_Player players[MAX_RFU_PLAYERS]; + struct PokemonJump_Player *player; }; struct PokemonJumpMons { u16 species; - u16 unk2; + u16 jumpType; }; -static void sub_802AA60(struct PokemonJump1 *); -static void sub_802AA94(struct PokemonJump1 *); -static void sub_802AB20(void); -static void sub_802AB98(void); +static void InitGame(struct PokemonJump *); +static void ResetForNewGame(struct PokemonJump *); +static void InitPlayerAndJumpTypes(void); +static void ResetPlayersForNewGame(void); static s16 GetPokemonJumpSpeciesIdx(u16 species); -static void sub_802AC2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon); -static void sub_802AC6C(void); -static void sub_802ACA0(u8 taskId); -static void sub_802AF80(u8 taskId); -static void sub_802B008(void); -static void sub_802B194(u8 taskId); -static void sub_802B1FC(void); -static bool32 sub_802B248(void); -static bool32 sub_802B2D4(void); -static bool32 sub_802B368(void); -static bool32 sub_802B3D4(void); -static bool32 sub_802B470(void); -static bool32 sub_802B4CC(void); -static bool32 sub_802B568(void); -static bool32 sub_802B5C8(void); -static bool32 sub_802B628(void); -static bool32 sub_802B664(void); -static bool32 sub_802B6B8(void); -static bool32 sub_802B704(void); -static bool32 sub_802B720(void); -static bool32 sub_802B7E0(void); -static bool32 sub_802B8CC(void); -static bool32 sub_802B964(void); -static bool32 sub_802B29C(void); -static bool32 sub_802B31C(void); -static bool32 sub_802B3B4(void); -static bool32 sub_802BA58(void); -static bool32 sub_802BB84(void); -static bool32 sub_802BC60(void); -static bool32 sub_802BD30(void); -static void sub_802BD84(u8 taskId); -static void sub_802BE60(TaskFunc func, u8 taskPriority); -static void sub_802BE80(void); -static void sub_802BEA0(void); -static void sub_802BEE4(void); -static int sub_802BF48(void); -static void sub_802BF7C(void); -static int sub_802C098(void); -static void sub_802C0B8(void); -static void sub_802C0E8(void); -static void sub_802C114(void); -static bool32 sub_802C130(u16); -static void sub_802C164(void); -static void sub_802C1DC(void); -static void sub_802C240(void); -static void sub_802C260(void); -static void sub_802C270(void); -static void sub_802C280(void); -static void sub_802C398(int); -static void sub_802C43C(void); -static bool32 sub_802C538(void); -static bool32 sub_802C5DC(void); -static bool32 sub_802C618(void); -static bool32 sub_802C650(void); -static void sub_802C688(int); -static int sub_802C6B0(void); +static void InitJumpMonInfo(struct PokemonJump_MonInfo *, struct Pokemon *); +static void CB2_PokemonJump(void); +static void Task_StartPokemonJump(u8); +static void Task_PokemonJump_Leader(u8); +static void SendLinkData_Leader(void); +static void Task_PokemonJump_Member(u8); +static void SendLinkData_Member(void); +static bool32 GameIntro_Leader(void); +static bool32 WaitRound_Leader(void); +static bool32 GameRound_Leader(void); +static bool32 GameOver_Leader(void); +static bool32 GameOver_Member(void); +static bool32 AskPlayAgain_Leader(void); +static bool32 AskPlayAgain_Member(void); +static bool32 ResetGame_Leader(void); +static bool32 ResetGame_Member(void); +static bool32 ExitGame(void); +static bool32 GivePrize_Leader(void); +static bool32 GivePrize_Member(void); +static bool32 SavePokeJump(void); +static bool32 DoGameIntro(void); +static bool32 HandleSwingRound(void); +static bool32 DoVineHitEffect(void); +static bool32 GameIntro_Member(void); +static bool32 WaitRound_Member(void); +static bool32 GameRound_Member(void); +static bool32 TryGivePrize(void); +static bool32 DoPlayAgainPrompt(void); +static bool32 ClosePokeJumpLink(void); +static bool32 CloseMessageAndResetScore(void); +static void Task_CommunicateMonInfo(u8); +static void SetTaskWithPokeJumpStruct(TaskFunc, u8); +static void InitVineState(void); +static void ResetVineState(void); +static void UpdateVineState(void); +static int GetVineSpeed(void); +static void UpdateVineSpeed(void); +static int PokeJumpRandom(void); +static void ResetVineAfterHit(void); +static void ResetPlayersJumpStates(void); +static void ResetPlayersMonState(void); +static bool32 IsPlayersMonState(u16); +static void SetMonStateJump(void); +static void UpdateGame(void); +static void TryUpdateVineSwing(void); +static void DisallowVineUpdates(void); +static void AllowVineUpdates(void); +static void HandleMonState(void); +static void UpdateJump(int); +static void TryUpdateScore(void); +static bool32 UpdateVineHitStates(void); +static bool32 AllPlayersJumpedOrHit(void); +static bool32 DidAllPlayersClearVine(void); +static bool32 ShouldPlayAgain(void); +static void AddJumpScore(int); +static int GetPlayersAtJumpPeak(void); static bool32 AreLinkQueuesEmpty(void); -static int sub_802C73C(u8 *); -static void sub_802C780(void); -static int sub_802C790(int); -static void sub_802C7A0(u16); -static bool32 sub_802C7BC(void); -static u16 sub_802C7E0(void); -static void sub_802C808(u16, u16 *, u16 *); -static u16 sub_802C818(void); -static u16 sub_802C838(void); -static u16 sub_802C880(u16 item, u16 quantity); -static void sub_802CB7C(struct Sprite *sprite); -static void sub_802CC40(struct Sprite *sprite); -static void sub_802CD08(struct Sprite *sprite); -static void sub_802CDD4(struct Sprite *sprite); -static void sub_802DC9C(int id); -static void sub_802D074(struct PokemonJump2 *); -static void sub_802D0BC(struct PokemonJump2 *); -static void sub_802D0AC(void); -static void sub_802D0C8(int); -static bool32 sub_802D0F0(void); -static void sub_802D764(void); -static bool32 sub_802D788(void); -static void sub_802D7E8(u16 itemId, u16 quantity); -static void sub_802D884(u16 itemId); -static void sub_802D8FC(u16 itemId); -static bool32 sub_802D974(void); -static void sub_802DA14(void); -static void sub_802DC80(u32 id, s16 y); -static void sub_802DD88(u8 multiplayerId); -static bool32 sub_802DA44(void); -static void sub_802DD64(int); -static s8 sub_802DA8C(void); -static int sub_802DCCC(u8 flags); -static void sub_802DD74(u16); -static void sub_802DDA0(u8 multiplayerId); -static int sub_802DDB8(int multiplayerId); -static void sub_802DDCC(void); -static void sub_802DDE0(void); -static void sub_802DDF4(int); -static int sub_802DE08(void); -static void sub_802E0AC(struct PokemonJump1_MonInfo *arg0); -static bool32 sub_802E0D0(int multiplayerId, struct PokemonJump1_MonInfo *arg0); -static void sub_802E138(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1); -static bool32 sub_802E1BC(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1); -static void sub_802E234(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2); -static bool32 sub_802E264(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3); -static bool32 sub_802E2D0(struct PokemonJump1_82E4 *arg0, int multiplayerId); -static bool32 sub_802E354(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow); -static void sub_802E3A8(void); -static void sub_802D12C(u8 taskId); -static void sub_802E00C(u8 arg0); -static void sub_802E090(u8 taskId); -static void sub_802D150(void); -static void sub_802DD08(void); -static void sub_802DB8C(void); -static void sub_802DBF8(void); -static void sub_802DE1C(void); -static void sub_802DFD4(void); -static void sub_802D108(void (*func)(void)); -static void sub_802DF70(bool32 arg0); -static u32 sub_802DA9C(u32 left, u32 top, u32 width, u32 height); -static void sub_802DB18(u16 left, u16 top, u8 cursorPos); -static void sub_802D150(void); -static void sub_802D2E4(void); -static void sub_802D350(void); -static void sub_802D3BC(void); -static void sub_802D448(void); -static void sub_802D4F4(void); -static void sub_802D598(void); -static void sub_802D5E4(void); -static void sub_802D72C(void); -static void sub_802D688(void); -static void Task_ShowPokemonJumpRecords(u8 taskId); -static void sub_802E500(u16 windowId, int width); -static void TruncateToFirstWordOnly(u8 *str); - -EWRAM_DATA static struct PokemonJump1 *gUnknown_02022CFC = NULL; -EWRAM_DATA static struct PokemonJump2 *gUnknown_02022D00 = NULL; - -static const struct PokemonJumpMons gPkmnJumpSpecies[] = -{ - { .species = SPECIES_BULBASAUR, .unk2 = 2, }, - { .species = SPECIES_CHARMANDER, .unk2 = 1, }, - { .species = SPECIES_SQUIRTLE, .unk2 = 0, }, - { .species = SPECIES_CATERPIE, .unk2 = 1, }, - { .species = SPECIES_METAPOD, .unk2 = 1, }, - { .species = SPECIES_WEEDLE, .unk2 = 1, }, - { .species = SPECIES_KAKUNA, .unk2 = 1, }, - { .species = SPECIES_RATTATA, .unk2 = 1, }, - { .species = SPECIES_RATICATE, .unk2 = 1, }, - { .species = SPECIES_PIKACHU, .unk2 = 0, }, - { .species = SPECIES_SANDSHREW, .unk2 = 0, }, - { .species = SPECIES_NIDORAN_F, .unk2 = 0, }, - { .species = SPECIES_NIDORAN_M, .unk2 = 0, }, - { .species = SPECIES_CLEFAIRY, .unk2 = 0, }, - { .species = SPECIES_VULPIX, .unk2 = 0, }, - { .species = SPECIES_JIGGLYPUFF, .unk2 = 2, }, - { .species = SPECIES_ODDISH, .unk2 = 2, }, - { .species = SPECIES_PARAS, .unk2 = 1, }, - { .species = SPECIES_MEOWTH, .unk2 = 0, }, - { .species = SPECIES_PSYDUCK, .unk2 = 2, }, - { .species = SPECIES_MANKEY, .unk2 = 1, }, - { .species = SPECIES_GROWLITHE, .unk2 = 1, }, - { .species = SPECIES_POLIWAG, .unk2 = 2, }, - { .species = SPECIES_BELLSPROUT, .unk2 = 2, }, - { .species = SPECIES_SHELLDER, .unk2 = 1, }, - { .species = SPECIES_KRABBY, .unk2 = 1, }, - { .species = SPECIES_EXEGGCUTE, .unk2 = 2, }, - { .species = SPECIES_CUBONE, .unk2 = 0, }, - { .species = SPECIES_DITTO, .unk2 = 2, }, - { .species = SPECIES_EEVEE, .unk2 = 0, }, - { .species = SPECIES_OMANYTE, .unk2 = 1, }, - { .species = SPECIES_KABUTO, .unk2 = 1, }, - { .species = SPECIES_CHIKORITA, .unk2 = 2, }, - { .species = SPECIES_CYNDAQUIL, .unk2 = 1, }, - { .species = SPECIES_TOTODILE, .unk2 = 0, }, - { .species = SPECIES_SPINARAK, .unk2 = 1, }, - { .species = SPECIES_PICHU, .unk2 = 0, }, - { .species = SPECIES_CLEFFA, .unk2 = 0, }, - { .species = SPECIES_IGGLYBUFF, .unk2 = 2, }, - { .species = SPECIES_TOGEPI, .unk2 = 2, }, - { .species = SPECIES_MAREEP, .unk2 = 0, }, - { .species = SPECIES_BELLOSSOM, .unk2 = 2, }, - { .species = SPECIES_MARILL, .unk2 = 2, }, - { .species = SPECIES_SUNKERN, .unk2 = 2, }, - { .species = SPECIES_WOOPER, .unk2 = 2, }, - { .species = SPECIES_PINECO, .unk2 = 2, }, - { .species = SPECIES_SNUBBULL, .unk2 = 0, }, - { .species = SPECIES_SHUCKLE, .unk2 = 2, }, - { .species = SPECIES_TEDDIURSA, .unk2 = 0, }, - { .species = SPECIES_SLUGMA, .unk2 = 2, }, - { .species = SPECIES_SWINUB, .unk2 = 0, }, - { .species = SPECIES_HOUNDOUR, .unk2 = 1, }, - { .species = SPECIES_PHANPY, .unk2 = 0, }, - { .species = SPECIES_PORYGON2, .unk2 = 0, }, - { .species = SPECIES_TYROGUE, .unk2 = 1, }, - { .species = SPECIES_SMOOCHUM, .unk2 = 2, }, - { .species = SPECIES_ELEKID, .unk2 = 1, }, - { .species = SPECIES_MAGBY, .unk2 = 1, }, - { .species = SPECIES_LARVITAR, .unk2 = 1, }, - { .species = SPECIES_TREECKO, .unk2 = 1, }, - { .species = SPECIES_TORCHIC, .unk2 = 2, }, - { .species = SPECIES_MUDKIP, .unk2 = 0, }, - { .species = SPECIES_MARSHTOMP, .unk2 = 0, }, - { .species = SPECIES_POOCHYENA, .unk2 = 1, }, - { .species = SPECIES_ZIGZAGOON, .unk2 = 0, }, - { .species = SPECIES_LINOONE, .unk2 = 0, }, - { .species = SPECIES_WURMPLE, .unk2 = 1, }, - { .species = SPECIES_SILCOON, .unk2 = 2, }, - { .species = SPECIES_CASCOON, .unk2 = 2, }, - { .species = SPECIES_LOTAD, .unk2 = 2, }, - { .species = SPECIES_SEEDOT, .unk2 = 1, }, - { .species = SPECIES_RALTS, .unk2 = 0, }, - { .species = SPECIES_KIRLIA, .unk2 = 0, }, - { .species = SPECIES_SURSKIT, .unk2 = 2, }, - { .species = SPECIES_SHROOMISH, .unk2 = 2, }, - { .species = SPECIES_NINCADA, .unk2 = 1, }, - { .species = SPECIES_WHISMUR, .unk2 = 0, }, - { .species = SPECIES_AZURILL, .unk2 = 2, }, - { .species = SPECIES_SKITTY, .unk2 = 0, }, - { .species = SPECIES_SABLEYE, .unk2 = 0, }, - { .species = SPECIES_MAWILE, .unk2 = 0, }, - { .species = SPECIES_ARON, .unk2 = 1, }, - { .species = SPECIES_MEDITITE, .unk2 = 2, }, - { .species = SPECIES_ELECTRIKE, .unk2 = 1, }, - { .species = SPECIES_PLUSLE, .unk2 = 1, }, - { .species = SPECIES_MINUN, .unk2 = 1, }, - { .species = SPECIES_VOLBEAT, .unk2 = 0, }, - { .species = SPECIES_ILLUMISE, .unk2 = 0, }, - { .species = SPECIES_ROSELIA, .unk2 = 2, }, - { .species = SPECIES_GULPIN, .unk2 = 2, }, - { .species = SPECIES_NUMEL, .unk2 = 2, }, - { .species = SPECIES_TORKOAL, .unk2 = 2, }, - { .species = SPECIES_SPOINK, .unk2 = 0, }, - { .species = SPECIES_TRAPINCH, .unk2 = 2, }, - { .species = SPECIES_CACNEA, .unk2 = 2, }, - { .species = SPECIES_ANORITH, .unk2 = 1, }, - { .species = SPECIES_WYNAUT, .unk2 = 0, }, - { .species = SPECIES_SNORUNT, .unk2 = 0, }, - { .species = SPECIES_CLAMPERL, .unk2 = 1, }, - { .species = SPECIES_BAGON, .unk2 = 1, }, -}; - -void StartPokemonJump(u16 partyIndex, MainCallback callback) +static int GetNumPlayersForBonus(u8 *); +static void ClearUnreadField(void); +static int GetScoreBonus(int); +static void TryUpdateExcellentsRecord(u16); +static bool32 HasEnoughScoreForPrize(void); +static u16 GetPrizeData(void); +static void UnpackPrizeData(u16, u16 *, u16 *); +static u16 GetPrizeItemId(void); +static u16 GetPrizeQuantity(void); +static u16 GetQuantityLimitedByBag(u16, u16); +static void SpriteCB_Star(struct Sprite *); +static void SpriteCB_MonHitShake(struct Sprite *); +static void SpriteCB_MonHitFlash(struct Sprite *); +static void SpriteCB_MonIntroBounce(struct Sprite *); +static void UpdateVineSwing(int); +static void StartPokeJumpGfx(struct PokemonJumpGfx *); +static void InitPokeJumpGfx(struct PokemonJumpGfx *); +static void FreeWindowsAndDigitObj(void); +static void SetUpPokeJumpGfxFuncById(int); +static bool32 IsPokeJumpGfxFuncFinished(void); +static void SetUpResetVineGfx(void); +static bool32 ResetVineGfx(void); +static void PrintPrizeMessage(u16, u16); +static void PrintPrizeFilledBagMessage(u16); +static void PrintNoRoomForPrizeMessage(u16); +static bool32 DoPrizeMessageAndFanfare(void); +static void ClearMessageWindow(void); +static void SetMonSpriteY(u32, s16); +static void StartMonHitShake(u8); +static bool32 RemoveMessageWindow(void); +static void PrintScore(int); +static s8 HandlePlayAgainInput(void); +static int DoSameJumpTimeBonus(u8); +static void PrintJumpsInRow(u16); +static void StartMonHitFlash(u8); +static int IsMonHitShakeActive(int); +static void StopMonHitFlash(void); +static void ResetMonSpriteSubpriorities(void); +static void StartMonIntroBounce(int); +static int IsMonIntroBounceActive(void); +static void SendPacket_MonInfo(struct PokemonJump_MonInfo *); +static bool32 RecvPacket_MonInfo(int, struct PokemonJump_MonInfo *); +static void SendPacket_LeaderState(struct PokemonJump_Player *, struct PokemonJump_CommData *); +static bool32 RecvPacket_LeaderState(struct PokemonJump_Player *, struct PokemonJump_CommData *); +static void SendPacket_MemberState(struct PokemonJump_Player *, u8, u16); +static bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *, int, u8 *, u16 *); +static bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *, int); +static bool32 TryUpdateRecords(u32, u16, u16); +static void IncrementGamesWithMaxPlayers(void); +static void Task_RunPokeJumpGfxFunc(u8); +static void ShowBonus(u8); +static void Task_UpdateBonus(u8); +static void LoadPokeJumpGfx(void); +static void InitDigitPrinters(void); +static void PrintScoreSuffixes(void); +static void CreateJumpMonSprites(void); +static void AddPlayerNameWindows(void); +static void DrawPlayerNameWindows(void); +static void SetUpPokeJumpGfxFunc(void (*func)(void)); +static void PrintPokeJumpPlayerNames(bool32); +static u32 AddMessageWindow(u32, u32, u32, u32); +static void CreatePokeJumpYesNoMenu(u16, u16, u8); +static void PrintPlayerNamesNoHighlight(void); +static void PrintPlayerNamesWithHighlight(void); +static void ErasePlayerNames(void); +static void Msg_WantToPlayAgain(void); +static void Msg_SavingDontTurnOff(void); +static void EraseMessage(void); +static void Msg_SomeoneDroppedOut(void); +static void DoPokeJumpCountdown(void); +static void Msg_CommunicationStandby(void); +static void Task_ShowPokemonJumpRecords(u8); +static void PrintRecordsText(u16, int); +static void TruncateToFirstWordOnly(u8 *); + +EWRAM_DATA static struct PokemonJump *sPokemonJump = NULL; +EWRAM_DATA static struct PokemonJumpGfx *sPokemonJumpGfx = NULL; + +/* + According to the clerk, the Pokémon allowed in + Pokémon Jump are all <= 28 inches, and do not + only swim, burrow, or fly. +*/ +static const struct PokemonJumpMons sPokeJumpMons[] = +{ + { .species = SPECIES_BULBASAUR, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_CHARMANDER, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_SQUIRTLE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_CATERPIE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_METAPOD, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_WEEDLE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_KAKUNA, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_RATTATA, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_RATICATE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_PIKACHU, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SANDSHREW, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_NIDORAN_F, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_NIDORAN_M, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_CLEFAIRY, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_VULPIX, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_JIGGLYPUFF, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_ODDISH, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_PARAS, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_MEOWTH, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PSYDUCK, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_MANKEY, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_GROWLITHE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_POLIWAG, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_BELLSPROUT, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SHELLDER, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_KRABBY, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_EXEGGCUTE, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_CUBONE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_DITTO, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_EEVEE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_OMANYTE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_KABUTO, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_CHIKORITA, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_CYNDAQUIL, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_TOTODILE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SPINARAK, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_PICHU, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_CLEFFA, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_IGGLYBUFF, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_TOGEPI, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_MAREEP, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_BELLOSSOM, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_MARILL, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SUNKERN, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_WOOPER, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_PINECO, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SNUBBULL, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SHUCKLE, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_TEDDIURSA, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SLUGMA, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SWINUB, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_HOUNDOUR, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_PHANPY, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_PORYGON2, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_TYROGUE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_SMOOCHUM, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_ELEKID, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_MAGBY, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_LARVITAR, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_TREECKO, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_TORCHIC, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_MUDKIP, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_MARSHTOMP, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_POOCHYENA, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_ZIGZAGOON, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_LINOONE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_WURMPLE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_SILCOON, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_CASCOON, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_LOTAD, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SEEDOT, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_RALTS, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_KIRLIA, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SURSKIT, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SHROOMISH, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_NINCADA, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_WHISMUR, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_AZURILL, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SKITTY, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SABLEYE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_MAWILE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_ARON, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_MEDITITE, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_ELECTRIKE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_PLUSLE, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_MINUN, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_VOLBEAT, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_ILLUMISE, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_ROSELIA, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_GULPIN, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_NUMEL, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_TORKOAL, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_SPOINK, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_TRAPINCH, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_CACNEA, .jumpType = JUMP_TYPE_SLOW, }, + { .species = SPECIES_ANORITH, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_WYNAUT, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_SNORUNT, .jumpType = JUMP_TYPE_NORMAL, }, + { .species = SPECIES_CLAMPERL, .jumpType = JUMP_TYPE_FAST, }, + { .species = SPECIES_BAGON, .jumpType = JUMP_TYPE_FAST, }, +}; + +void StartPokemonJump(u16 partyId, MainCallback exitCallback) { u8 taskId; if (gReceivedRemoteLinkPlayers) { - gUnknown_02022CFC = Alloc(sizeof(*gUnknown_02022CFC)); - if (gUnknown_02022CFC) + sPokemonJump = Alloc(sizeof(*sPokemonJump)); + if (sPokemonJump) { ResetTasks(); - taskId = CreateTask(sub_802ACA0, 1); - gUnknown_02022CFC->unk8 = 0; - gUnknown_02022CFC->returnCallback = callback; - gUnknown_02022CFC->unk4 = taskId; - gUnknown_02022CFC->unk6 = GetMultiplayerId(); - sub_802AC2C(&gUnknown_02022CFC->unk82A8[gUnknown_02022CFC->unk6], &gPlayerParty[partyIndex]); - sub_802AA60(gUnknown_02022CFC); - SetWordTaskArg(taskId, 2, (u32)gUnknown_02022CFC); - SetMainCallback2(sub_802AC6C); + taskId = CreateTask(Task_StartPokemonJump, 1); + sPokemonJump->mainState = 0; + sPokemonJump->exitCallback = exitCallback; + sPokemonJump->taskId = taskId; + sPokemonJump->multiplayerId = GetMultiplayerId(); + InitJumpMonInfo(&sPokemonJump->monInfo[sPokemonJump->multiplayerId], &gPlayerParty[partyId]); + InitGame(sPokemonJump); + SetWordTaskArg(taskId, 2, (u32)sPokemonJump); + SetMainCallback2(CB2_PokemonJump); return; } } - SetMainCallback2(callback); + // Exit - Players not connected, or alloc failed + SetMainCallback2(exitCallback); } -static void sub_802AA48(void) +static void FreePokemonJump(void) { - sub_802D0AC(); - Free(gUnknown_02022CFC); + FreeWindowsAndDigitObj(); + Free(sPokemonJump); } -static void sub_802AA60(struct PokemonJump1 *arg0) +static void InitGame(struct PokemonJump *jump) { - arg0->unk5 = GetLinkPlayerCount(); - arg0->unk70.unk0 = 5; - arg0->unk70.unk2 = 0; - sub_802AB20(); - sub_802AA94(arg0); - if (arg0->unk5 == MAX_RFU_PLAYERS) - sub_802E3A8(); + jump->numPlayers = GetLinkPlayerCount(); + jump->comm.funcId = FUNC_RESET_GAME; + jump->comm.data = 0; + InitPlayerAndJumpTypes(); + ResetForNewGame(jump); + if (jump->numPlayers == MAX_RFU_PLAYERS) + IncrementGamesWithMaxPlayers(); } -static void sub_802AA94(struct PokemonJump1 *arg0) +static void ResetForNewGame(struct PokemonJump *jump) { int i; - arg0->unk14 = 6; - arg0->unk18 = 6; - arg0->unk4A = 0; - arg0->unk1C = 0; - arg0->unk5C = 0; - arg0->isLeader = GetMultiplayerId() == 0; - arg0->unk8 = 0; - arg0->unkA = 0; - arg0->unkC = 0; - arg0->unkE = 0; - arg0->unk58 = 0; - arg0->unk3A = 0; - arg0->unk44 = 0; - arg0->unk54 = 0; - arg0->unk46 = 0; - arg0->unk49 = 0; - arg0->unk48 = 1; - arg0->unk70.unk8 = 0; - arg0->unk70.unk1 = 0; - arg0->unk70.unk4 = 0; - arg0->unk60 = 1; - arg0->unk4D = 0; - arg0->unk68 = 0; - arg0->unk64 = 0; - arg0->unk2C = 0; - arg0->unk30 = 0; - sub_802AB98(); - sub_802C0E8(); + jump->vineState = VINE_UPSWING_LOWER; + jump->prevVineState = VINE_UPSWING_LOWER; + jump->vineTimer = 0; + jump->vineSpeed = 0; + jump->updateScore = FALSE; + jump->isLeader = GetMultiplayerId() == 0; + jump->mainState = 0; + jump->helperState = 0; + jump->excellentsInRow = 0; + jump->excellentsInRowRecord = 0; + jump->initScoreUpdate = FALSE; + jump->unused2 = 0; + jump->unused3 = 0; + jump->numPlayersAtPeak = 0; + jump->allowVineUpdates = FALSE; + jump->allPlayersReady = FALSE; + jump->funcActive = TRUE; + jump->comm.jumpScore = 0; + jump->comm.receivedBonusFlags = 0; + jump->comm.jumpsInRow = 0; + jump->unused4 = TRUE; + jump->showBonus = FALSE; + jump->skipJumpUpdate = FALSE; + jump->giveBonus = FALSE; + jump->linkTimer = 0; + jump->linkTimerLimit = 0; + ResetPlayersForNewGame(); + ResetPlayersJumpStates(); for (i = 0; i < MAX_RFU_PLAYERS; i++) { - arg0->unk7C[i] = 0; - arg0->unk9A[i] = 0; + jump->atJumpPeak[i] = FALSE; + jump->jumpTimeStarts[i] = 0; } } -static void sub_802AB20(void) +static void InitPlayerAndJumpTypes(void) { int i, index; for (i = 0; i < MAX_RFU_PLAYERS; i++) { - index = GetPokemonJumpSpeciesIdx(gUnknown_02022CFC->unk82A8[i].species); - gUnknown_02022CFC->unk82E4[i].unkC = gPkmnJumpSpecies[index].unk2; + index = GetPokemonJumpSpeciesIdx(sPokemonJump->monInfo[i].species); + sPokemonJump->players[i].monJumpType = sPokeJumpMons[index].jumpType; } - gUnknown_02022CFC->unk83AC = &gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6]; + sPokemonJump->player = &sPokemonJump->players[sPokemonJump->multiplayerId]; } -static void sub_802AB98(void) +static void ResetPlayersForNewGame(void) { int i; for (i = 0; i < MAX_RFU_PLAYERS; i++) { - gUnknown_02022CFC->unk82E4[i].unkE = 0; - gUnknown_02022CFC->unk82E4[i].unk10 = 0; - gUnknown_02022CFC->unk82E4[i].unk12 = 0; - gUnknown_02022CFC->unk82E4[i].unk0 = 0; - gUnknown_02022CFC->unk82E4[i].unk4 = 0x7FFFFFFF; - gUnknown_02022CFC->unk82E4[i].unk14 = 0; - gUnknown_02022CFC->unk8B[i] = 9; + sPokemonJump->players[i].jumpTimeStart = 0; + sPokemonJump->players[i].monState = MONSTATE_NORMAL; + sPokemonJump->players[i].prevMonState = MONSTATE_NORMAL; + sPokemonJump->players[i].jumpOffset = 0; + sPokemonJump->players[i].jumpOffsetIdx = INT_MAX; + sPokemonJump->players[i].jumpState = JUMPSTATE_NONE; + sPokemonJump->memberFuncIds[i] = FUNC_NONE; } } static s16 GetPokemonJumpSpeciesIdx(u16 species) { u32 i; - for (i = 0; i < ARRAY_COUNT(gPkmnJumpSpecies); i++) + for (i = 0; i < ARRAY_COUNT(sPokeJumpMons); i++) { - if (gPkmnJumpSpecies[i].species == species) + if (sPokeJumpMons[i].species == species) return i; } return -1; // species isnt allowed } -static void sub_802AC2C(struct PokemonJump1_MonInfo *monInfo, struct Pokemon *mon) +static void InitJumpMonInfo(struct PokemonJump_MonInfo *monInfo, struct Pokemon *mon) { monInfo->species = GetMonData(mon, MON_DATA_SPECIES); monInfo->otId = GetMonData(mon, MON_DATA_OT_ID); monInfo->personality = GetMonData(mon, MON_DATA_PERSONALITY); } -static void sub_802AC58(void) +static void VBlankCB_PokemonJump(void) { TransferPlttBuffer(); LoadOam(); ProcessSpriteCopyRequests(); } -static void sub_802AC6C(void) +static void CB2_PokemonJump(void) { RunTasks(); AnimateSprites(); @@ -545,280 +675,284 @@ static void sub_802AC6C(void) UpdatePaletteFade(); } -static void sub_802AC84(TaskFunc func) +static void SetPokeJumpTask(TaskFunc func) { - gUnknown_02022CFC->unk4 = CreateTask(func, 1); - gUnknown_02022CFC->unk8 = 0; + sPokemonJump->taskId = CreateTask(func, 1); + sPokemonJump->mainState = 0; } -static void sub_802ACA0(u8 taskId) +static void Task_StartPokemonJump(u8 taskId) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: SetVBlankCallback(NULL); ResetSpriteData(); FreeAllSpritePalettes(); - sub_802BE60(sub_802BD84, 5); + SetTaskWithPokeJumpStruct(Task_CommunicateMonInfo, 5); FadeOutMapMusic(4); - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; break; case 1: - if (!FuncIsActiveTask(sub_802BD84)) + if (!FuncIsActiveTask(Task_CommunicateMonInfo)) { - sub_802D074(&gUnknown_02022CFC->unkA4); + StartPokeJumpGfx(&sPokemonJump->jumpGfx); LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; } break; case 2: - if (!sub_802D0F0() && IsNotWaitingForBGMStop() == TRUE) + if (!IsPokeJumpGfxFuncFinished() && IsNotWaitingForBGMStop() == TRUE) { FadeOutAndPlayNewMapMusic(MUS_RG_POKE_JUMP, 8); - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; } break; case 3: if (IsLinkTaskFinished()) { - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - SetVBlankCallback(sub_802AC58); - gUnknown_02022CFC->unk8++; + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); + SetVBlankCallback(VBlankCB_PokemonJump); + sPokemonJump->mainState++; } break; case 4: UpdatePaletteFade(); if (!gPaletteFade.active) { - gUnknown_02022CFC->unk7 = 0; - gUnknown_02022CFC->unk8++; + sPokemonJump->startDelayTimer = 0; + sPokemonJump->mainState++; } break; case 5: - gUnknown_02022CFC->unk7++; - if (gUnknown_02022CFC->unk7 >= 20) + sPokemonJump->startDelayTimer++; + if (sPokemonJump->startDelayTimer >= 20) { - if (gUnknown_02022CFC->isLeader) - sub_802AC84(sub_802AF80); + if (sPokemonJump->isLeader) + SetPokeJumpTask(Task_PokemonJump_Leader); else - sub_802AC84(sub_802B194); + SetPokeJumpTask(Task_PokemonJump_Member); - sub_802BE80(); + InitVineState(); DestroyTask(taskId); } break; } } -static void sub_802AE14(int arg0) +static void SetLinkTimeInterval(int intervalId) { - if (arg0 == 0) + if (intervalId == LINK_INTERVAL_NONE) { - gUnknown_02022CFC->unk30 = 0x1111; - gUnknown_02022CFC->unk2C = 1; + // Link data is sent when timer reaches 0. + // Set timer to 1 and set limit to special + // 'stopped' value so timer won't change + sPokemonJump->linkTimerLimit = LINK_TIMER_STOPPED; + sPokemonJump->linkTimer = 1; } else { - gUnknown_02022CFC->unk30 = (1 << (arg0 - 1)) - 1; - gUnknown_02022CFC->unk2C = 0; + sPokemonJump->linkTimerLimit = (1 << (intervalId - 1)) - 1; + sPokemonJump->linkTimer = 0; } } -static void sub_802AE50(u8 arg0) +static void SetFunc_Leader(u8 funcId) { int i; - gUnknown_02022CFC->unk70.unk0 = arg0; - gUnknown_02022CFC->unk8 = 0; - gUnknown_02022CFC->unkA = 0; - gUnknown_02022CFC->unk48 = 1; - gUnknown_02022CFC->unk49 = 0; - for (i = 1; i < gUnknown_02022CFC->unk5; i++) - gUnknown_02022CFC->unk82E4[i].unk18 = 0; + sPokemonJump->comm.funcId = funcId; + sPokemonJump->mainState = 0; + sPokemonJump->helperState = 0; + sPokemonJump->funcActive = TRUE; + sPokemonJump->allPlayersReady = FALSE; + for (i = 1; i < sPokemonJump->numPlayers; i++) + sPokemonJump->players[i].funcFinished = FALSE; } -static void sub_802AEA4(void) +static void RecvLinkData_Leader(void) { int i; - int count; - u16 var0; - u8 var1; - u16 var2; + int numReady; + u16 monState; + u8 funcId; + u16 playAgainState; - for (i = 1, count = 0; i < gUnknown_02022CFC->unk5; i++) + for (i = 1, numReady = 0; i < sPokemonJump->numPlayers; i++) { - var0 = gUnknown_02022CFC->unk82E4[i].unk10; - if (sub_802E264(&gUnknown_02022CFC->unk82E4[i], i, &var1, &var2)) + monState = sPokemonJump->players[i].monState; + if (RecvPacket_MemberStateToLeader(&sPokemonJump->players[i], i, &funcId, &playAgainState)) { - gUnknown_02022CFC->unk90[i] = var2; - gUnknown_02022CFC->unk8B[i] = var1; - gUnknown_02022CFC->unk82E4[i].unk12 = var0; + sPokemonJump->playAgainStates[i] = playAgainState; + sPokemonJump->memberFuncIds[i] = funcId; + sPokemonJump->players[i].prevMonState = monState; } - if (gUnknown_02022CFC->unk82E4[i].unk18 && gUnknown_02022CFC->unk8B[i] == gUnknown_02022CFC->unk70.unk0) - count++; + // Group member has finished currently assigned function + if (sPokemonJump->players[i].funcFinished && sPokemonJump->memberFuncIds[i] == sPokemonJump->comm.funcId) + numReady++; } - if (count == gUnknown_02022CFC->unk5 - 1) - gUnknown_02022CFC->unk49 = 1; + if (numReady == sPokemonJump->numPlayers - 1) + sPokemonJump->allPlayersReady = TRUE; } -static bool32 (* const gUnknown_082FB5F4[])(void) = +static bool32 (* const sPokeJumpLeaderFuncs[])(void) = { - sub_802B248, - sub_802B2D4, - sub_802B368, - sub_802B3D4, - sub_802B4CC, - sub_802B5C8, - sub_802B664, - sub_802B6B8, - sub_802B720, + [FUNC_GAME_INTRO] = GameIntro_Leader, + [FUNC_WAIT_ROUND] = WaitRound_Leader, + [FUNC_GAME_ROUND] = GameRound_Leader, + [FUNC_GAME_OVER] = GameOver_Leader, + [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain_Leader, + [FUNC_RESET_GAME] = ResetGame_Leader, + [FUNC_EXIT] = ExitGame, + [FUNC_GIVE_PRIZE] = GivePrize_Leader, + [FUNC_SAVE] = SavePokeJump, }; -static void sub_802AF80(u8 taskId) +static void Task_PokemonJump_Leader(u8 taskId) { - sub_802AEA4(); - sub_802C43C(); - if (!gUnknown_02022CFC->unk48 && gUnknown_02022CFC->unk49) + RecvLinkData_Leader(); + TryUpdateScore(); + if (!sPokemonJump->funcActive && sPokemonJump->allPlayersReady) { - sub_802AE50(gUnknown_02022CFC->unk4C); - sub_802AE14(3); + SetFunc_Leader(sPokemonJump->nextFuncId); + SetLinkTimeInterval(LINK_INTERVAL_SHORT); } - if (gUnknown_02022CFC->unk48 == 1) + if (sPokemonJump->funcActive == TRUE) { - if (!gUnknown_082FB5F4[gUnknown_02022CFC->unk70.unk0]()) + if (!sPokeJumpLeaderFuncs[sPokemonJump->comm.funcId]()) { - gUnknown_02022CFC->unk48 = 0; - gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 = 1; + sPokemonJump->funcActive = FALSE; + sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = TRUE; } } - sub_802C1DC(); - sub_802B008(); + UpdateGame(); + SendLinkData_Leader(); } -static void sub_802B008(void) +static void SendLinkData_Leader(void) { - if (!gUnknown_02022CFC->unk2C) - sub_802E138(gUnknown_02022CFC->unk82E4, &gUnknown_02022CFC->unk70); + if (!sPokemonJump->linkTimer) + SendPacket_LeaderState(sPokemonJump->players, &sPokemonJump->comm); - if (gUnknown_02022CFC->unk30 != 0x1111) + if (sPokemonJump->linkTimerLimit != LINK_TIMER_STOPPED) { - gUnknown_02022CFC->unk2C++; - gUnknown_02022CFC->unk2C &= gUnknown_02022CFC->unk30; + sPokemonJump->linkTimer++; + sPokemonJump->linkTimer &= sPokemonJump->linkTimerLimit; } } -static void sub_802B044(u8 arg0) +static void SetFunc_Member(u8 funcId) { - gUnknown_02022CFC->unk70.unk0 = arg0; - gUnknown_02022CFC->unk8 = 0; - gUnknown_02022CFC->unkA = 0; - gUnknown_02022CFC->unk48 = 1; - gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 = 0; + sPokemonJump->comm.funcId = funcId; + sPokemonJump->mainState = 0; + sPokemonJump->helperState = 0; + sPokemonJump->funcActive = TRUE; + sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = FALSE; } -static void sub_802B078(void) +static void RecvLinkData_Member(void) { int i; - u16 var0; - struct PokemonJump1Sub sp0; + u16 monState; + struct PokemonJump_CommData leaderData; - var0 = gUnknown_02022CFC->unk82E4[0].unk10; - if (sub_802E1BC(gUnknown_02022CFC->unk82E4, &sp0)) + monState = sPokemonJump->players[0].monState; + if (RecvPacket_LeaderState(sPokemonJump->players, &leaderData)) { - if (gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 == 1 - && sp0.unk0 != gUnknown_02022CFC->unk70.unk0) + if (sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished == TRUE + && leaderData.funcId != sPokemonJump->comm.funcId) { - sub_802B044(sp0.unk0); + SetFunc_Member(leaderData.funcId); } - if (gUnknown_02022CFC->unk70.unk8 != sp0.unk8) + if (sPokemonJump->comm.jumpScore != leaderData.jumpScore) { - gUnknown_02022CFC->unk70.unk8 = sp0.unk8; - gUnknown_02022CFC->unk5C = 1; - gUnknown_02022CFC->unk70.unk1 = sp0.unk1; - if (gUnknown_02022CFC->unk70.unk1) - gUnknown_02022CFC->unk4D = 1; + sPokemonJump->comm.jumpScore = leaderData.jumpScore; + sPokemonJump->updateScore = TRUE; + sPokemonJump->comm.receivedBonusFlags = leaderData.receivedBonusFlags; + if (sPokemonJump->comm.receivedBonusFlags) + sPokemonJump->showBonus = TRUE; else - gUnknown_02022CFC->unk4D = 0; + sPokemonJump->showBonus = FALSE; } - gUnknown_02022CFC->unk70.unk2 = sp0.unk2; - gUnknown_02022CFC->unk70.unk4 = sp0.unk4; - gUnknown_02022CFC->unk82E4[0].unk12 = var0; + sPokemonJump->comm.data = leaderData.data; + sPokemonJump->comm.jumpsInRow = leaderData.jumpsInRow; + sPokemonJump->players[0].prevMonState = monState; } - for (i = 1; i < gUnknown_02022CFC->unk5; i++) + for (i = 1; i < sPokemonJump->numPlayers; i++) { - if (i != gUnknown_02022CFC->unk6) + if (i != sPokemonJump->multiplayerId) { - var0 = gUnknown_02022CFC->unk82E4[i].unk10; - if (sub_802E2D0(&gUnknown_02022CFC->unk82E4[i], i)) - gUnknown_02022CFC->unk82E4[i].unk12 = var0; + monState = sPokemonJump->players[i].monState; + if (RecvPacket_MemberStateToMember(&sPokemonJump->players[i], i)) + sPokemonJump->players[i].prevMonState = monState; } } } -static bool32 (* const gUnknown_082FB618[])(void) = +static bool32 (* const sPokeJumpMemberFuncs[])(void) = { - sub_802B29C, - sub_802B31C, - sub_802B3B4, - sub_802B470, - sub_802B568, - sub_802B628, - sub_802B664, - sub_802B704, - sub_802B720, + [FUNC_GAME_INTRO] = GameIntro_Member, + [FUNC_WAIT_ROUND] = WaitRound_Member, + [FUNC_GAME_ROUND] = GameRound_Member, + [FUNC_GAME_OVER] = GameOver_Member, + [FUNC_ASK_PLAY_AGAIN] = AskPlayAgain_Member, + [FUNC_RESET_GAME] = ResetGame_Member, + [FUNC_EXIT] = ExitGame, + [FUNC_GIVE_PRIZE] = GivePrize_Member, + [FUNC_SAVE] = SavePokeJump, }; -static void sub_802B194(u8 taskId) +static void Task_PokemonJump_Member(u8 taskId) { - sub_802B078(); - if (gUnknown_02022CFC->unk48) + RecvLinkData_Member(); + if (sPokemonJump->funcActive) { - if (!gUnknown_082FB618[gUnknown_02022CFC->unk70.unk0]()) + if (!sPokeJumpMemberFuncs[sPokemonJump->comm.funcId]()) { - gUnknown_02022CFC->unk48 = 0; - gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk18 = 1; - sub_802AE14(3); + sPokemonJump->funcActive = FALSE; + sPokemonJump->players[sPokemonJump->multiplayerId].funcFinished = TRUE; + SetLinkTimeInterval(LINK_INTERVAL_SHORT); } } - sub_802C1DC(); - sub_802B1FC(); + UpdateGame(); + SendLinkData_Member(); } -static void sub_802B1FC(void) +static void SendLinkData_Member(void) { - if (!gUnknown_02022CFC->unk2C) - sub_802E234(&gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6], gUnknown_02022CFC->unk70.unk0, gUnknown_02022CFC->unk42); + if (!sPokemonJump->linkTimer) + SendPacket_MemberState(&sPokemonJump->players[sPokemonJump->multiplayerId], sPokemonJump->comm.funcId, sPokemonJump->playAgainComm); - if (gUnknown_02022CFC->unk30 != 0x1111) + if (sPokemonJump->linkTimerLimit != LINK_TIMER_STOPPED) { - gUnknown_02022CFC->unk2C++; - gUnknown_02022CFC->unk2C &= gUnknown_02022CFC->unk30; + sPokemonJump->linkTimer++; + sPokemonJump->linkTimer &= sPokemonJump->linkTimerLimit; } } -static bool32 sub_802B248(void) +static bool32 GameIntro_Leader(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802AE14(3); - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_SHORT); + sPokemonJump->mainState++; // fall through case 1: - if (!sub_802B7E0()) + if (!DoGameIntro()) { - gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unk4A; - gUnknown_02022CFC->unk4C = 1; + sPokemonJump->comm.data = sPokemonJump->vineTimer; + sPokemonJump->nextFuncId = FUNC_WAIT_ROUND; return FALSE; } break; @@ -827,35 +961,35 @@ static bool32 sub_802B248(void) return TRUE; } -static bool32 sub_802B29C(void) +static bool32 GameIntro_Member(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802AE14(0); - gUnknown_02022CFC->unk24 = gUnknown_02022CFC->unk70.unk2; - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_NONE); + sPokemonJump->rngSeed = sPokemonJump->comm.data; + sPokemonJump->mainState++; // fall through case 1: - return sub_802B7E0(); + return DoGameIntro(); } return TRUE; } -static bool32 sub_802B2D4(void) +static bool32 WaitRound_Leader(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802C0E8(); - sub_802AE14(5); - gUnknown_02022CFC->unk8++; + ResetPlayersJumpStates(); + SetLinkTimeInterval(LINK_INTERVAL_LONG); + sPokemonJump->mainState++; break; case 1: - if (gUnknown_02022CFC->unk49) + if (sPokemonJump->allPlayersReady) { - gUnknown_02022CFC->unk4C = 2; + sPokemonJump->nextFuncId = FUNC_GAME_ROUND; return FALSE; } break; @@ -864,15 +998,15 @@ static bool32 sub_802B2D4(void) return TRUE; } -static bool32 sub_802B31C(void) +static bool32 WaitRound_Member(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802C0E8(); - sub_802AE14(0); - gUnknown_02022CFC->unk4A = gUnknown_02022CFC->unk70.unk2; - gUnknown_02022CFC->unk8++; + ResetPlayersJumpStates(); + SetLinkTimeInterval(LINK_INTERVAL_NONE); + sPokemonJump->vineTimer = sPokemonJump->comm.data; + sPokemonJump->mainState++; // fall through case 1: if (AreLinkQueuesEmpty()) @@ -883,67 +1017,68 @@ static bool32 sub_802B31C(void) return TRUE; } -static bool32 sub_802B368(void) +static bool32 GameRound_Leader(void) { - if (!sub_802B8CC()) + if (!HandleSwingRound()) { - gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unk4A; - gUnknown_02022CFC->unk4C = 1; + sPokemonJump->comm.data = sPokemonJump->vineTimer; + sPokemonJump->nextFuncId = FUNC_WAIT_ROUND; } - else if (sub_802C538()) + else if (UpdateVineHitStates()) { return TRUE; } else { - sub_802C0B8(); - gUnknown_02022CFC->unk4C = 3; + // Someone hit the vine + ResetVineAfterHit(); + sPokemonJump->nextFuncId = FUNC_GAME_OVER; } return FALSE; } -static bool32 sub_802B3B4(void) +static bool32 GameRound_Member(void) { - if (!sub_802B8CC()) + if (!HandleSwingRound()) ; - else if (sub_802C538()) + else if (UpdateVineHitStates()) return TRUE; - else - sub_802C0B8(); + else // Someone hit the vine + ResetVineAfterHit(); return FALSE; } -static bool32 sub_802B3D4(void) +static bool32 GameOver_Leader(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802C538(); - if (sub_802C5DC()) - gUnknown_02022CFC->unk8++; + UpdateVineHitStates(); + if (AllPlayersJumpedOrHit()) + sPokemonJump->mainState++; break; case 1: - if (!sub_802B964()) + if (!DoVineHitEffect()) { - if (sub_802C7BC()) + if (HasEnoughScoreForPrize()) { - gUnknown_02022CFC->unk70.unk2 = sub_802C7E0(); - gUnknown_02022CFC->unk4C = 7; + sPokemonJump->comm.data = GetPrizeData(); + sPokemonJump->nextFuncId = FUNC_GIVE_PRIZE; } - else if (gUnknown_02022CFC->unk70.unk4 >= 200) + else if (sPokemonJump->comm.jumpsInRow >= 200) { - gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unkE; - gUnknown_02022CFC->unk4C = 8; + sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord; + sPokemonJump->nextFuncId = FUNC_SAVE; } else { - gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unkE; - gUnknown_02022CFC->unk4C = 4; + sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord; + sPokemonJump->nextFuncId = FUNC_ASK_PLAY_AGAIN; } - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; return FALSE; } break; @@ -954,20 +1089,20 @@ static bool32 sub_802B3D4(void) return TRUE; } -static bool32 sub_802B470(void) +static bool32 GameOver_Member(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - if (!sub_802C538()) - sub_802C0B8(); - if (sub_802C5DC()) - gUnknown_02022CFC->unk8++; + if (!UpdateVineHitStates()) + ResetVineAfterHit(); + if (AllPlayersJumpedOrHit()) + sPokemonJump->mainState++; break; case 1: - if (!sub_802B964()) + if (!DoVineHitEffect()) { - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; return FALSE; } break; @@ -978,30 +1113,30 @@ static bool32 sub_802B470(void) return TRUE; } -static bool32 sub_802B4CC(void) +static bool32 AskPlayAgain_Leader(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802AE14(4); - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_MEDIUM); + sPokemonJump->mainState++; // fall through case 1: - if (!sub_802BB84()) + if (!DoPlayAgainPrompt()) { - sub_802E354(gUnknown_02022CFC->unk70.unk8, gUnknown_02022CFC->unk70.unk4, gUnknown_02022CFC->unk70.unk2); - gUnknown_02022CFC->unk8++; + TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data); + sPokemonJump->mainState++; } break; case 2: - if (gUnknown_02022CFC->unk49) + if (sPokemonJump->allPlayersReady) { - if (sub_802C650()) - gUnknown_02022CFC->unk4C = 5; + if (ShouldPlayAgain()) + sPokemonJump->nextFuncId = FUNC_RESET_GAME; else - gUnknown_02022CFC->unk4C = 6; + sPokemonJump->nextFuncId = FUNC_EXIT; - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; return FALSE; } break; @@ -1012,19 +1147,19 @@ static bool32 sub_802B4CC(void) return TRUE; } -static bool32 sub_802B568(void) +static bool32 AskPlayAgain_Member(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802AE14(0); - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_NONE); + sPokemonJump->mainState++; // fall through case 1: - if (!sub_802BB84()) + if (!DoPlayAgainPrompt()) { - sub_802E354(gUnknown_02022CFC->unk70.unk8, gUnknown_02022CFC->unk70.unk4, gUnknown_02022CFC->unk70.unk2); - gUnknown_02022CFC->unk42 = gUnknown_02022CFC->unk45; + TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data); + sPokemonJump->playAgainComm = sPokemonJump->playAgainState; return FALSE; } break; @@ -1033,21 +1168,21 @@ static bool32 sub_802B568(void) return TRUE; } -static bool32 sub_802B5C8(void) +static bool32 ResetGame_Leader(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - if (!sub_802BD30()) - gUnknown_02022CFC->unk8++; + if (!CloseMessageAndResetScore()) + sPokemonJump->mainState++; break; case 1: - if (gUnknown_02022CFC->unk49) + if (sPokemonJump->allPlayersReady) { - sub_802AA94(gUnknown_02022CFC); - gUnknown_02022CFC->unk24 = Random(); - gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unk24; - gUnknown_02022CFC->unk4C = 0; + ResetForNewGame(sPokemonJump); + sPokemonJump->rngSeed = Random(); + sPokemonJump->comm.data = sPokemonJump->rngSeed; + sPokemonJump->nextFuncId = FUNC_GAME_INTRO; return FALSE; } break; @@ -1056,15 +1191,15 @@ static bool32 sub_802B5C8(void) return TRUE; } -static bool32 sub_802B628(void) +static bool32 ResetGame_Member(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - if (!sub_802BD30()) + if (!CloseMessageAndResetScore()) { - sub_802AA94(gUnknown_02022CFC); - gUnknown_02022CFC->unk8++; + ResetForNewGame(sPokemonJump); + sPokemonJump->mainState++; return FALSE; } break; @@ -1075,22 +1210,22 @@ static bool32 sub_802B628(void) return TRUE; } -static bool32 sub_802B664(void) +static bool32 ExitGame(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - gUnknown_02022CFC->unk8 = 1; + sPokemonJump->mainState = 1; break; case 1: - sub_802AE14(0); - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_NONE); + sPokemonJump->mainState++; break; case 2: - if (!sub_802BC60()) + if (!ClosePokeJumpLink()) { - SetMainCallback2(gUnknown_02022CFC->returnCallback); - sub_802AA48(); + SetMainCallback2(sPokemonJump->exitCallback); + FreePokemonJump(); } break; } @@ -1098,19 +1233,19 @@ static bool32 sub_802B664(void) return TRUE; } -static bool32 sub_802B6B8(void) +static bool32 GivePrize_Leader(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802AE14(4); - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_MEDIUM); + sPokemonJump->mainState++; break; case 1: - if (!sub_802BA58()) + if (!TryGivePrize()) { - gUnknown_02022CFC->unk70.unk2 = gUnknown_02022CFC->unkE; - gUnknown_02022CFC->unk4C = 8; + sPokemonJump->comm.data = sPokemonJump->excellentsInRowRecord; + sPokemonJump->nextFuncId = FUNC_SAVE; return FALSE; } break; @@ -1119,49 +1254,49 @@ static bool32 sub_802B6B8(void) return TRUE; } -static bool32 sub_802B704(void) +static bool32 GivePrize_Member(void) { - sub_802AE14(0); - if (!sub_802BA58()) + SetLinkTimeInterval(LINK_INTERVAL_NONE); + if (!TryGivePrize()) return FALSE; else return TRUE; } -static bool32 sub_802B720(void) +static bool32 SavePokeJump(void) { - switch (gUnknown_02022CFC->unk8) + switch (sPokemonJump->mainState) { case 0: - sub_802E354(gUnknown_02022CFC->unk70.unk8, gUnknown_02022CFC->unk70.unk4, gUnknown_02022CFC->unk70.unk2); - sub_802D0C8(5); - gUnknown_02022CFC->unk8++; + TryUpdateRecords(sPokemonJump->comm.jumpScore, sPokemonJump->comm.jumpsInRow, sPokemonJump->comm.data); + SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_SAVING); + sPokemonJump->mainState++; break; case 1: - if (!sub_802D0F0()) + if (!IsPokeJumpGfxFuncFinished()) { - sub_802AE14(0); - gUnknown_02022CFC->unk8++; + SetLinkTimeInterval(LINK_INTERVAL_NONE); + sPokemonJump->mainState++; } break; case 2: if (AreLinkQueuesEmpty()) { CreateTask(Task_LinkSave, 6); - gUnknown_02022CFC->unk8++; + sPokemonJump->mainState++; } break; case 3: if (!FuncIsActiveTask(Task_LinkSave)) { - sub_802DA14(); - gUnknown_02022CFC->unk8++; + ClearMessageWindow(); + sPokemonJump->mainState++; } break; case 4: - if (!sub_802DA44()) + if (!RemoveMessageWindow()) { - gUnknown_02022CFC->unk4C = 4; + sPokemonJump->nextFuncId = FUNC_ASK_PLAY_AGAIN; return FALSE; } break; @@ -1170,52 +1305,52 @@ static bool32 sub_802B720(void) return TRUE; } -static bool32 sub_802B7E0(void) +static bool32 DoGameIntro(void) { - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - sub_802D0C8(2); - sub_802DDE0(); - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_SHOW_NAMES_HIGHLIGHT); + ResetMonSpriteSubpriorities(); + sPokemonJump->helperState++; break; case 1: - if (!sub_802D0F0()) + if (!IsPokeJumpGfxFuncFinished()) { - sub_802DDF4(gUnknown_02022CFC->unk6); - gUnknown_02022CFC->unk3C = 0; - gUnknown_02022CFC->unkA++; + StartMonIntroBounce(sPokemonJump->multiplayerId); + sPokemonJump->timer = 0; + sPokemonJump->helperState++; } break; case 2: - if (++gUnknown_02022CFC->unk3C > 120) + if (++sPokemonJump->timer > 120) { - sub_802D0C8(3); - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_NAMES); + sPokemonJump->helperState++; } break; case 3: - if (sub_802D0F0() != 1 && sub_802DE08() != 1) - gUnknown_02022CFC->unkA++; + if (IsPokeJumpGfxFuncFinished() != TRUE && IsMonIntroBounceActive() != TRUE) + sPokemonJump->helperState++; break; case 4: - sub_802D0C8(9); - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_COUNTDOWN); + sPokemonJump->helperState++; break; case 5: - if (!sub_802D0F0()) + if (!IsPokeJumpGfxFuncFinished()) { - sub_802C260(); - sub_802D764(); - gUnknown_02022CFC->unkA++; + DisallowVineUpdates(); + SetUpResetVineGfx(); + sPokemonJump->helperState++; } break; case 6: - if (!sub_802D788()) + if (!ResetVineGfx()) { - sub_802C270(); - sub_802BEA0(); - gUnknown_02022CFC->unkA++; + AllowVineUpdates(); + ResetVineState(); + sPokemonJump->helperState++; return FALSE; } break; @@ -1226,85 +1361,88 @@ static bool32 sub_802B7E0(void) return TRUE; } -static bool32 sub_802B8CC(void) +// Update the vine and wait for player to input a jump +// Returns false when vine reaches the 'hit' point, after +// which input is ignored +static bool32 HandleSwingRound(void) { - sub_802BEE4(); - if (gUnknown_02022CFC->unk36) + UpdateVineState(); + if (sPokemonJump->ignoreJumpInput) { - gUnknown_02022CFC->unk36 = 0; + sPokemonJump->ignoreJumpInput = FALSE; return FALSE; } - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - if (sub_802C130(0)) - gUnknown_02022CFC->unkA++; + if (IsPlayersMonState(MONSTATE_NORMAL)) + sPokemonJump->helperState++; else break; // fall through case 1: if (JOY_NEW(A_BUTTON)) { - sub_802C164(); - sub_802AE14(3); - gUnknown_02022CFC->unkA++; + SetMonStateJump(); + SetLinkTimeInterval(LINK_INTERVAL_SHORT); + sPokemonJump->helperState++; } break; case 2: - if (sub_802C130(1) == TRUE) - gUnknown_02022CFC->unkA++; + if (IsPlayersMonState(MONSTATE_JUMP) == TRUE) + sPokemonJump->helperState++; break; case 3: - if (sub_802C130(0) == TRUE) - gUnknown_02022CFC->unkA = 0; + if (IsPlayersMonState(MONSTATE_NORMAL) == TRUE) + sPokemonJump->helperState = 0; break; } return TRUE; } -static bool32 sub_802B964(void) +static bool32 DoVineHitEffect(void) { int i; - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - for (i = 0; i < gUnknown_02022CFC->unk5; i++) + for (i = 0; i < sPokemonJump->numPlayers; i++) { - if (sub_802DDB8(i) == 1) + if (IsMonHitShakeActive(i) == TRUE) return TRUE; } - gUnknown_02022CFC->unkA++; + sPokemonJump->helperState++; break; case 1: - for (i = 0; i < gUnknown_02022CFC->unk5; i++) + for (i = 0; i < sPokemonJump->numPlayers; i++) { - if (gUnknown_02022CFC->unk82E4[i].unk10 == 2) - sub_802DDA0(i); + if (sPokemonJump->players[i].monState == MONSTATE_HIT) + StartMonHitFlash(i); } - sub_802D0C8(1); - gUnknown_02022CFC->unk3C = 0; - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_SHOW_NAMES); + sPokemonJump->timer = 0; + sPokemonJump->helperState++; break; case 2: - if (++gUnknown_02022CFC->unk3C > 100) + if (++sPokemonJump->timer > 100) { - sub_802D0C8(3); - gUnknown_02022CFC->unk3C = 0; - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_NAMES); + sPokemonJump->timer = 0; + sPokemonJump->helperState++; } break; case 3: - if (!sub_802D0F0()) + if (!IsPokeJumpGfxFuncFinished()) { - sub_802DDCC(); - gUnknown_02022CFC->unk70.unk1 = 0; - sub_802C114(); - gUnknown_02022CFC->unkA++; + StopMonHitFlash(); + sPokemonJump->comm.receivedBonusFlags = 0; + ResetPlayersMonState(); + sPokemonJump->helperState++; return FALSE; } break; @@ -1315,58 +1453,61 @@ static bool32 sub_802B964(void) return TRUE; } -static bool32 sub_802BA58(void) +static bool32 TryGivePrize(void) { - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - sub_802C808(gUnknown_02022CFC->unk70.unk2, &gUnknown_02022CFC->unk3E, &gUnknown_02022CFC->unk40); - sub_802D7E8(gUnknown_02022CFC->unk3E, gUnknown_02022CFC->unk40); - gUnknown_02022CFC->unkA++; + UnpackPrizeData(sPokemonJump->comm.data, &sPokemonJump->prizeItemId, &sPokemonJump->prizeItemQuantity); + PrintPrizeMessage(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity); + sPokemonJump->helperState++; break; case 1: case 4: - if (!sub_802D974()) + if (!DoPrizeMessageAndFanfare()) { - gUnknown_02022CFC->unk3C = 0; - gUnknown_02022CFC->unkA++; + sPokemonJump->timer = 0; + sPokemonJump->helperState++; } break; case 2: case 5: - gUnknown_02022CFC->unk3C++; - if (JOY_NEW(A_BUTTON | B_BUTTON) || gUnknown_02022CFC->unk3C > 180) + // Wait to continue after message + sPokemonJump->timer++; + if (JOY_NEW(A_BUTTON | B_BUTTON) || sPokemonJump->timer > 180) { - sub_802DA14(); - gUnknown_02022CFC->unkA++; + ClearMessageWindow(); + sPokemonJump->helperState++; } break; case 3: - if (!sub_802DA44()) + if (!RemoveMessageWindow()) { - gUnknown_02022CFC->unk40 = sub_802C880(gUnknown_02022CFC->unk3E, gUnknown_02022CFC->unk40); - if (gUnknown_02022CFC->unk40 && AddBagItem(gUnknown_02022CFC->unk3E, gUnknown_02022CFC->unk40)) + sPokemonJump->prizeItemQuantity = GetQuantityLimitedByBag(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity); + if (sPokemonJump->prizeItemQuantity && AddBagItem(sPokemonJump->prizeItemId, sPokemonJump->prizeItemQuantity)) { - if (!CheckBagHasSpace(gUnknown_02022CFC->unk3E, 1)) + if (!CheckBagHasSpace(sPokemonJump->prizeItemId, 1)) { - sub_802D884(gUnknown_02022CFC->unk3E); - gUnknown_02022CFC->unkA = 4; + // An item was given successfully, but no room for any more. + // It's possible the full prize quantity had to be limited + PrintPrizeFilledBagMessage(sPokemonJump->prizeItemId); + sPokemonJump->helperState = 4; // Do message } else { - gUnknown_02022CFC->unkA = 6; + sPokemonJump->helperState = 6; // Exit break; } } else { - sub_802D8FC(gUnknown_02022CFC->unk3E); - gUnknown_02022CFC->unkA = 4; + PrintNoRoomForPrizeMessage(sPokemonJump->prizeItemId); + sPokemonJump->helperState = 4; // Do message } } break; case 6: - if (!sub_802DA44()) + if (!RemoveMessageWindow()) return FALSE; break; } @@ -1374,49 +1515,49 @@ static bool32 sub_802BA58(void) return TRUE; } -static bool32 sub_802BB84(void) +static bool32 DoPlayAgainPrompt(void) { s8 input; - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - sub_802D0C8(4); - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_PLAY_AGAIN); + sPokemonJump->helperState++; break; case 1: - if (!sub_802D0F0()) - gUnknown_02022CFC->unkA++; + if (!IsPokeJumpGfxFuncFinished()) + sPokemonJump->helperState++; break; case 2: - input = sub_802DA8C(); + input = HandlePlayAgainInput(); switch (input) { case MENU_B_PRESSED: - case 1: - gUnknown_02022CFC->unk45 = 1; - sub_802D0C8(6); - gUnknown_02022CFC->unkA++; + case 1: // No + sPokemonJump->playAgainState = PLAY_AGAIN_NO; + SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_MSG); + sPokemonJump->helperState++; break; - case 0: - gUnknown_02022CFC->unk45 = 2; - sub_802D0C8(6); - gUnknown_02022CFC->unkA++; + case 0: // Yes + sPokemonJump->playAgainState = PLAY_AGAIN_YES; + SetUpPokeJumpGfxFuncById(GFXFUNC_ERASE_MSG); + sPokemonJump->helperState++; break; } break; case 3: - if (!sub_802D0F0()) - gUnknown_02022CFC->unkA++; + if (!IsPokeJumpGfxFuncFinished()) + sPokemonJump->helperState++; break; case 4: - sub_802D0C8(8); - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_COMM_STANDBY); + sPokemonJump->helperState++; break; case 5: - if (!sub_802D0F0()) + if (!IsPokeJumpGfxFuncFinished()) { - gUnknown_02022CFC->unkA++; + sPokemonJump->helperState++; return FALSE; } break; @@ -1427,43 +1568,40 @@ static bool32 sub_802BB84(void) return TRUE; } -static bool32 sub_802BC60(void) +static bool32 ClosePokeJumpLink(void) { - int var0; - - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - sub_802DA14(); - gUnknown_02022CFC->unkA++; + ClearMessageWindow(); + sPokemonJump->helperState++; break; case 1: - if (!sub_802DA44()) + if (!RemoveMessageWindow()) { - sub_802D0C8(7); - gUnknown_02022CFC->unkA++; + SetUpPokeJumpGfxFuncById(GFXFUNC_MSG_PLAYER_DROPPED); + sPokemonJump->helperState++; } break; case 2: - var0 = sub_802D0F0(); - if (!var0) + if (!IsPokeJumpGfxFuncFinished()) { - gUnknown_02022CFC->unk3C = var0; - gUnknown_02022CFC->unkA++; + sPokemonJump->timer = 0; + sPokemonJump->helperState++; } break; case 3: - if (++gUnknown_02022CFC->unk3C > 120) + if (++sPokemonJump->timer > 120) { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - gUnknown_02022CFC->unkA++; + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); + sPokemonJump->helperState++; } break; case 4: if (!gPaletteFade.active) { SetCloseLinkCallback(); - gUnknown_02022CFC->unkA++; + sPokemonJump->helperState++; } break; case 5: @@ -1475,19 +1613,19 @@ static bool32 sub_802BC60(void) return TRUE; } -static bool32 sub_802BD30(void) +static bool32 CloseMessageAndResetScore(void) { - switch (gUnknown_02022CFC->unkA) + switch (sPokemonJump->helperState) { case 0: - sub_802DA14(); - sub_802DD64(0); - gUnknown_02022CFC->unkA++; + ClearMessageWindow(); + PrintScore(0); + sPokemonJump->helperState++; break; case 1: - if (!sub_802DA44()) + if (!RemoveMessageWindow()) { - gUnknown_02022CFC->unkA++; + sPokemonJump->helperState++; return FALSE; } break; @@ -1498,32 +1636,37 @@ static bool32 sub_802BD30(void) return TRUE; } -static void sub_802BD84(u8 taskId) +#define tState data[0] +#define tNumReceived data[1] +#define tReceivedPacket(playerId) data[(playerId) + 2] +#define DATAIDX_GAME_STRUCT 14 + +static void Task_CommunicateMonInfo(u8 taskId) { int i; - s16 *taskData = gTasks[taskId].data; - struct PokemonJump1 *ptr = (struct PokemonJump1 *)GetWordTaskArg(taskId, 14); + s16 *data = gTasks[taskId].data; + struct PokemonJump *jump = (struct PokemonJump *)GetWordTaskArg(taskId, DATAIDX_GAME_STRUCT); - switch (taskData[0]) + switch (tState) { case 0: for (i = 0; i < MAX_RFU_PLAYERS; i++) - taskData[i + 2] = 0; + tReceivedPacket(i) = FALSE; - taskData[0]++; + tState++; // fall through case 1: - sub_802E0AC(&ptr->unk82A8[ptr->unk6]); + SendPacket_MonInfo(&jump->monInfo[jump->multiplayerId]); for (i = 0; i < MAX_RFU_PLAYERS; i++) { - if (!taskData[i + 2] && sub_802E0D0(i, &ptr->unk82A8[i])) + if (!tReceivedPacket(i) && RecvPacket_MonInfo(i, &jump->monInfo[i])) { - StringCopy(ptr->unk82E4[i].unk1C, gLinkPlayers[i].name); - taskData[i + 2] = 1; - taskData[1]++; - if (taskData[1] == ptr->unk5) + StringCopy(jump->players[i].name, gLinkPlayers[i].name); + tReceivedPacket(i) = TRUE; + tNumReceived++; + if (tNumReceived == jump->numPlayers) { - sub_802AB20(); + InitPlayerAndJumpTypes(); DestroyTask(taskId); break; } @@ -1533,495 +1676,528 @@ static void sub_802BD84(u8 taskId) } } -static void sub_802BE60(TaskFunc func, u8 taskPriority) +static void SetTaskWithPokeJumpStruct(TaskFunc func, u8 taskPriority) { u8 taskId = CreateTask(func, taskPriority); - SetWordTaskArg(taskId, 14, (u32)gUnknown_02022CFC); + SetWordTaskArg(taskId, DATAIDX_GAME_STRUCT, (u32)sPokemonJump); } -static void sub_802BE80(void) +#undef tState +#undef tNumReceived +#undef tReceivedPacket +#undef DATAIDX_GAME_STRUCT + +static void InitVineState(void) { - gUnknown_02022CFC->unk4A = 0; - gUnknown_02022CFC->unk14 = 6; - gUnknown_02022CFC->unk34 = 0; - gUnknown_02022CFC->unk1C = 0; - gUnknown_02022CFC->unk36 = 0; - gUnknown_02022CFC->unk10 = 0; + sPokemonJump->vineTimer = 0; + sPokemonJump->vineState = VINE_UPSWING_LOWER; + sPokemonJump->vineStateTimer = 0; + sPokemonJump->vineSpeed = 0; + sPokemonJump->ignoreJumpInput = FALSE; + sPokemonJump->gameOver = FALSE; } -static void sub_802BEA0(void) +static void ResetVineState(void) { - gUnknown_02022CFC->unk4A = 0; - gUnknown_02022CFC->unk34 = 0x6FF; - gUnknown_02022CFC->unk14 = 7; - gUnknown_02022CFC->unk36 = 0; - gUnknown_02022CFC->unk10 = 0; - gUnknown_02022CFC->unk51 = 0; - gUnknown_02022CFC->unk50 = 0; - gUnknown_02022CFC->unk20 = 0; - gUnknown_02022CFC->unk4E = 0; - gUnknown_02022CFC->unk6C = 0; - sub_802BF7C(); + sPokemonJump->vineTimer = 0; + sPokemonJump->vineStateTimer = VINE_STATE_TIMER(VINE_UPSWING_LOWER); + sPokemonJump->vineState = VINE_UPSWING_LOW; + sPokemonJump->ignoreJumpInput = FALSE; + sPokemonJump->gameOver = FALSE; + sPokemonJump->vineSpeedStage = 0; + sPokemonJump->vineBaseSpeedIdx = 0; + sPokemonJump->vineSpeedAccel = 0; + sPokemonJump->vineSpeedDelay = 0; + sPokemonJump->atMaxSpeedStage = FALSE; + UpdateVineSpeed(); } -static void sub_802BEE4(void) +static void UpdateVineState(void) { - if (gUnknown_02022CFC->unk46) + if (sPokemonJump->allowVineUpdates) { - gUnknown_02022CFC->unk4A++; - gUnknown_02022CFC->unk34 += sub_802BF48(); - if (gUnknown_02022CFC->unk34 >= 0x9FF) - gUnknown_02022CFC->unk34 -= 0x9FF; - - gUnknown_02022CFC->unk18 = gUnknown_02022CFC->unk14; - gUnknown_02022CFC->unk14 = gUnknown_02022CFC->unk34 >> 8; - if (gUnknown_02022CFC->unk14 > 6 && gUnknown_02022CFC->unk18 < 7) + sPokemonJump->vineTimer++; + sPokemonJump->vineStateTimer += GetVineSpeed(); + if (sPokemonJump->vineStateTimer >= VINE_STATE_TIMER(NUM_VINESTATES - 1)) + sPokemonJump->vineStateTimer -= VINE_STATE_TIMER(NUM_VINESTATES - 1); + + sPokemonJump->prevVineState = sPokemonJump->vineState; + sPokemonJump->vineState = sPokemonJump->vineStateTimer >> 8; + + // If beginning upswing + if (sPokemonJump->vineState > VINE_UPSWING_LOWER && sPokemonJump->prevVineState < VINE_UPSWING_LOW) { - gUnknown_02022CFC->unk36++; - sub_802BF7C(); + sPokemonJump->ignoreJumpInput++; + UpdateVineSpeed(); } } } -static int sub_802BF48(void) +static int GetVineSpeed(void) { - int result; + int speed; - if (gUnknown_02022CFC->unk10) + if (sPokemonJump->gameOver) return 0; - result = gUnknown_02022CFC->unk1C; - if (gUnknown_02022CFC->unk34 <= 0x5FF) + speed = sPokemonJump->vineSpeed; + if (sPokemonJump->vineStateTimer <= VINE_STATE_TIMER(VINE_LOWEST)) { - gUnknown_02022CFC->unk20 += 80; - result += gUnknown_02022CFC->unk20 >> 8; + // If at or below lowest, then vine is in downswing + // Increase speed in downswing + sPokemonJump->vineSpeedAccel += 80; + speed += sPokemonJump->vineSpeedAccel / 256; } - return result; + return speed; } -static const u16 gUnknown_082FB63C[] = {0x1a, 0x1f, 0x24, 0x29, 0x2e, 0x33, 0x38, 0x3d}; -static const u16 gUnknown_082FB64C[] = {0, 1, 1, 2}; +static const u16 sVineBaseSpeeds[] = {26, 31, 36, 41, 46, 51, 56, 61}; +static const u16 sVineSpeedDelays[] = {0, 1, 1, 2}; -static void sub_802BF7C(void) +static void UpdateVineSpeed(void) { - int var0; + int baseSpeed; - gUnknown_02022CFC->unk20 = 0; - if (gUnknown_02022CFC->unk4E) + sPokemonJump->vineSpeedAccel = 0; + if (sPokemonJump->vineSpeedDelay) { - gUnknown_02022CFC->unk4E--; - if (gUnknown_02022CFC->unk6C) + sPokemonJump->vineSpeedDelay--; + if (sPokemonJump->atMaxSpeedStage) { - if (sub_802C098() % 4 != 0) + if (PokeJumpRandom() % 4) { - gUnknown_02022CFC->unk1C = gUnknown_02022CFC->unk28; + sPokemonJump->vineSpeed = sPokemonJump->nextVineSpeed; } else { - if (gUnknown_02022CFC->unk28 > 54) - gUnknown_02022CFC->unk1C = 30; + if (sPokemonJump->nextVineSpeed > 54) + sPokemonJump->vineSpeed = 30; else - gUnknown_02022CFC->unk1C = 82; + sPokemonJump->vineSpeed = 82; } } } else { - if (!(gUnknown_02022CFC->unk50 & 8)) + if (!(sPokemonJump->vineBaseSpeedIdx & ARRAY_COUNT(sVineBaseSpeeds))) { - gUnknown_02022CFC->unk28 = gUnknown_082FB63C[gUnknown_02022CFC->unk50] + (gUnknown_02022CFC->unk51 * 7); - gUnknown_02022CFC->unk4E = gUnknown_082FB64C[sub_802C098() % ARRAY_COUNT(gUnknown_082FB64C)] + 2; - gUnknown_02022CFC->unk50++; + sPokemonJump->nextVineSpeed = sVineBaseSpeeds[sPokemonJump->vineBaseSpeedIdx] + (sPokemonJump->vineSpeedStage * 7); + sPokemonJump->vineSpeedDelay = sVineSpeedDelays[PokeJumpRandom() % ARRAY_COUNT(sVineSpeedDelays)] + 2; + sPokemonJump->vineBaseSpeedIdx++; } else { - if (gUnknown_02022CFC->unk50 == 8) + if (sPokemonJump->vineBaseSpeedIdx == ARRAY_COUNT(sVineBaseSpeeds)) { - if (gUnknown_02022CFC->unk51 < 3) - gUnknown_02022CFC->unk51++; + if (sPokemonJump->vineSpeedStage < 3) + sPokemonJump->vineSpeedStage++; else - gUnknown_02022CFC->unk6C = 1; + sPokemonJump->atMaxSpeedStage = TRUE; } - var0 = gUnknown_082FB63C[15 - gUnknown_02022CFC->unk50]; - gUnknown_02022CFC->unk28 = var0 + (gUnknown_02022CFC->unk51 * 7); - if (++gUnknown_02022CFC->unk50 > 15) + baseSpeed = sVineBaseSpeeds[15 - sPokemonJump->vineBaseSpeedIdx]; + sPokemonJump->nextVineSpeed = baseSpeed + (sPokemonJump->vineSpeedStage * 7); + if (++sPokemonJump->vineBaseSpeedIdx > 15) { - if (sub_802C098() % 4 == 0) - gUnknown_02022CFC->unk28 -= 5; + if (PokeJumpRandom() % 4 == 0) + sPokemonJump->nextVineSpeed -= 5; - gUnknown_02022CFC->unk50 = 0; + sPokemonJump->vineBaseSpeedIdx = 0; } } - gUnknown_02022CFC->unk1C = gUnknown_02022CFC->unk28; + sPokemonJump->vineSpeed = sPokemonJump->nextVineSpeed; } } -static int sub_802C098(void) +static int PokeJumpRandom(void) { - gUnknown_02022CFC->unk24 = ISO_RANDOMIZE1(gUnknown_02022CFC->unk24); - return gUnknown_02022CFC->unk24 >> 16; + sPokemonJump->rngSeed = ISO_RANDOMIZE1(sPokemonJump->rngSeed); + return sPokemonJump->rngSeed >> 16; } -static void sub_802C0B8(void) +static void ResetVineAfterHit(void) { - gUnknown_02022CFC->unk10 = 1; - gUnknown_02022CFC->unk14 = 6; - gUnknown_02022CFC->unk34 = 0x5FF; - sub_802C270(); + sPokemonJump->gameOver = TRUE; + sPokemonJump->vineState = VINE_UPSWING_LOWER; + sPokemonJump->vineStateTimer = VINE_STATE_TIMER(VINE_LOWEST); + AllowVineUpdates(); } -static int sub_802C0DC(void) +static int IsGameOver(void) { - return gUnknown_02022CFC->unk10; + return sPokemonJump->gameOver; } -static void sub_802C0E8(void) +static void ResetPlayersJumpStates(void) { int i; for (i = 0; i < MAX_RFU_PLAYERS; i++) - gUnknown_02022CFC->unk82E4[i].unk14 = 0; + sPokemonJump->players[i].jumpState = JUMPSTATE_NONE; } -static void sub_802C114(void) +static void ResetPlayersMonState(void) { - gUnknown_02022CFC->unk83AC->unk10 = 0; - gUnknown_02022CFC->unk83AC->unk12 = 0; + sPokemonJump->player->monState = MONSTATE_NORMAL; + sPokemonJump->player->prevMonState = MONSTATE_NORMAL; } -static bool32 sub_802C130(u16 arg0) +static bool32 IsPlayersMonState(u16 monState) { - if (gUnknown_02022CFC->unk82E4[gUnknown_02022CFC->unk6].unk10 == arg0) + if (sPokemonJump->players[sPokemonJump->multiplayerId].monState == monState) return TRUE; else return FALSE; } -static void sub_802C164(void) +static void SetMonStateJump(void) { - gUnknown_02022CFC->unk83AC->unkE = gUnknown_02022CFC->unk4A; - gUnknown_02022CFC->unk83AC->unk12 = gUnknown_02022CFC->unk83AC->unk10; - gUnknown_02022CFC->unk83AC->unk10 = 1; + sPokemonJump->player->jumpTimeStart = sPokemonJump->vineTimer; + sPokemonJump->player->prevMonState = sPokemonJump->player->monState; + sPokemonJump->player->monState = MONSTATE_JUMP; } -static void sub_802C18C(void) +static void SetMonStateHit(void) { - gUnknown_02022CFC->unk83AC->unk12 = gUnknown_02022CFC->unk83AC->unk10; - gUnknown_02022CFC->unk83AC->unk10 = 2; - gUnknown_02022CFC->unk83AC->unkE = gUnknown_02022CFC->unk4A; - gUnknown_02022CFC->unk83AC->unk14 = 2; + sPokemonJump->player->prevMonState = sPokemonJump->player->monState; + sPokemonJump->player->monState = MONSTATE_HIT; + sPokemonJump->player->jumpTimeStart = sPokemonJump->vineTimer; + sPokemonJump->player->jumpState = JUMPSTATE_FAILURE; } -static void sub_802C1BC(void) +static void SetMonStateNormal(void) { - gUnknown_02022CFC->unk83AC->unk12 = gUnknown_02022CFC->unk83AC->unk10; - gUnknown_02022CFC->unk83AC->unk10 = 0; + sPokemonJump->player->prevMonState = sPokemonJump->player->monState; + sPokemonJump->player->monState = MONSTATE_NORMAL; } -static const u16 gUnknown_082FB654[] = {SE_SHOP, SE_SHINY, SE_M_MORNING_SUN, SE_RG_POKE_JUMP_SUCCESS}; +static const u16 sSoundEffects[MAX_RFU_PLAYERS - 1] = {SE_SHOP, SE_SHINY, SE_M_MORNING_SUN, SE_RG_POKE_JUMP_SUCCESS}; -static void sub_802C1DC(void) +static void UpdateGame(void) { - if (gUnknown_02022CFC->unk5C) + if (sPokemonJump->updateScore) { - sub_802DD64(gUnknown_02022CFC->unk70.unk8); - gUnknown_02022CFC->unk5C = 0; - if (gUnknown_02022CFC->unk4D) + PrintScore(sPokemonJump->comm.jumpScore); + sPokemonJump->updateScore = FALSE; + if (sPokemonJump->showBonus) { - int index = sub_802DCCC(gUnknown_02022CFC->unk70.unk1); - PlaySE(gUnknown_082FB654[index - 2]); - gUnknown_02022CFC->unk4D = 0; + int numPlayers = DoSameJumpTimeBonus(sPokemonJump->comm.receivedBonusFlags); + PlaySE(sSoundEffects[numPlayers - 2]); + sPokemonJump->showBonus = FALSE; } } - sub_802DD74(gUnknown_02022CFC->unk70.unk4); - sub_802C280(); - sub_802C240(); + PrintJumpsInRow(sPokemonJump->comm.jumpsInRow); + HandleMonState(); + TryUpdateVineSwing(); } -static void sub_802C240(void) +static void TryUpdateVineSwing(void) { - if (gUnknown_02022CFC->unk46) - sub_802DC9C(gUnknown_02022CFC->unk14); + if (sPokemonJump->allowVineUpdates) + UpdateVineSwing(sPokemonJump->vineState); } -static void sub_802C260(void) +static void DisallowVineUpdates(void) { - gUnknown_02022CFC->unk46 = 0; + sPokemonJump->allowVineUpdates = FALSE; } -static void sub_802C270(void) +static void AllowVineUpdates(void) { - gUnknown_02022CFC->unk46 = 1; + sPokemonJump->allowVineUpdates = TRUE; } -static void sub_802C280(void) +#define F_SE_JUMP (1 << 0) +#define F_SE_FAIL (1 << 1) + +static void HandleMonState(void) { int i; - int whichSound = 0; - int numLinkPlayers = gUnknown_02022CFC->unk5; + int soundFlags = 0; + int numPlayers = sPokemonJump->numPlayers; - for (i = 0; i < numLinkPlayers; i++) + for (i = 0; i < numPlayers; i++) { - switch (gUnknown_02022CFC->unk82E4[i].unk10) + switch (sPokemonJump->players[i].monState) { - case 0: - sub_802DC80(i, 0); + case MONSTATE_NORMAL: + SetMonSpriteY(i, 0); break; - case 1: - if (gUnknown_02022CFC->unk82E4[i].unk12 != 1 || gUnknown_02022CFC->unk82E4[i].unkE != gUnknown_02022CFC->unk9A[i]) + case MONSTATE_JUMP: + if (sPokemonJump->players[i].prevMonState != MONSTATE_JUMP || sPokemonJump->players[i].jumpTimeStart != sPokemonJump->jumpTimeStarts[i]) { - if (i == gUnknown_02022CFC->unk6) - gUnknown_02022CFC->unk82E4[i].unk12 = 1; + // This is a new jump, play SE and init fields for jump handling + if (i == sPokemonJump->multiplayerId) + sPokemonJump->players[i].prevMonState = MONSTATE_JUMP; - whichSound |= 0x1; - gUnknown_02022CFC->unk82E4[i].unk4 = 0x7FFFFFFF; - gUnknown_02022CFC->unk9A[i] = gUnknown_02022CFC->unk82E4[i].unkE; + soundFlags |= F_SE_JUMP; + sPokemonJump->players[i].jumpOffsetIdx = INT_MAX; + sPokemonJump->jumpTimeStarts[i] = sPokemonJump->players[i].jumpTimeStart; } - sub_802C398(i); + UpdateJump(i); break; - case 2: - if (gUnknown_02022CFC->unk82E4[i].unk12 != 2) + case MONSTATE_HIT: + if (sPokemonJump->players[i].prevMonState != MONSTATE_HIT) { - if (i == gUnknown_02022CFC->unk6) - gUnknown_02022CFC->unk82E4[i].unk12 = 2; + if (i == sPokemonJump->multiplayerId) + sPokemonJump->players[i].prevMonState = MONSTATE_HIT; - whichSound |= 0x2; - sub_802DD88(i); + soundFlags |= F_SE_FAIL; + StartMonHitShake(i); } break; } } - if (whichSound & 0x2) + if (soundFlags & F_SE_FAIL) PlaySE(SE_RG_POKE_JUMP_FAILURE); - else if (whichSound & 0x1) + else if (soundFlags & F_SE_JUMP) PlaySE(SE_LEDGE); } -static const s8 gUnknown_082FB65C[][48] = +static const s8 sJumpOffsets[][48] = { - {-3, -6, -8, -10, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -28, -27, - -26, -25, -23, -22, -20, -18, -17, -15, -13, -11, -8, -6, -4, -1}, + [JUMP_TYPE_NORMAL] = { -3, -6, -8, -10, -13, -15, -17, -19, + -21, -23, -25, -27, -28, -29, + JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, + -28, -27, -26, -25, -23, -22, -20, -18, + -17, -15, -13, -11, -8, -6, -4, -1}, - {-3, -6, -9, -11, -14, -16, -18, -20, -22, -24, -26, -28, -29, -30, -30, -28, -26, -24, -22, - -20, -18, -16, -14, -11, -9, -6, -4, -1}, + [JUMP_TYPE_FAST] = { -3, -6, -9, -11, -14, -16, -18, -20, + -22, -24, -26, -28, -29, + JUMP_PEAK, JUMP_PEAK, + -28, -26, -24, -22, -20, -18, -16, -14, + -11, -9, -6, -4, -1}, - {-3, -6, -9, -11, -13, -15, -17, -19, -21, -23, -25, -27, -28, -29, -30, -30, -30, -30, -29, - -29, -28, -28, -27, -27, -26, -25, -24, -22, -20, -18, -16, -14, - -12, -11, -9, -6, -4, -1}, + [JUMP_TYPE_SLOW] = { -3, -6, -9, -11, -13, -15, -17, -19, + -21, -23, -25, -27, -28, -29, + JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, JUMP_PEAK, + -29, -29, -28, -28, -27, -27, -26, -25, + -24, -22, -20, -18, -16, -14, -12, -11, + -9, -6, -4, -1}, }; -static void sub_802C398(int multiplayerId) +static void UpdateJump(int multiplayerId) { - int var0; - int var1; - struct PokemonJump1_82E4 *player; + int jumpOffsetIdx; + int jumpOffset; + struct PokemonJump_Player *player; - if (gUnknown_02022CFC->unk68) + if (sPokemonJump->skipJumpUpdate) // Always false return; - player = &gUnknown_02022CFC->unk82E4[multiplayerId]; - if (player->unk4 != 0x7FFFFFFF) + player = &sPokemonJump->players[multiplayerId]; + if (player->jumpOffsetIdx != INT_MAX) { - player->unk4++; - var0 = player->unk4; + player->jumpOffsetIdx++; + jumpOffsetIdx = player->jumpOffsetIdx; } else { - var0 = gUnknown_02022CFC->unk4A - player->unkE; - if (var0 >= 65000) + jumpOffsetIdx = sPokemonJump->vineTimer - player->jumpTimeStart; + if (jumpOffsetIdx >= 65000) { - var0 -= 65000; - var0 += gUnknown_02022CFC->unk4A; + jumpOffsetIdx -= 65000; + jumpOffsetIdx += sPokemonJump->vineTimer; } - player->unk4 = var0; + player->jumpOffsetIdx = jumpOffsetIdx; } - if (var0 < 4) + if (jumpOffsetIdx < 4) return; - var0 -= 4; - if (var0 < 48) - var1 = gUnknown_082FB65C[player->unkC][var0]; + jumpOffsetIdx -= 4; + if (jumpOffsetIdx < (int)ARRAY_COUNT(sJumpOffsets[0])) + jumpOffset = sJumpOffsets[player->monJumpType][jumpOffsetIdx]; else - var1 = 0; + jumpOffset = 0; - sub_802DC80(multiplayerId, var1); - if (!var1 && multiplayerId == gUnknown_02022CFC->unk6) - sub_802C1BC(); + SetMonSpriteY(multiplayerId, jumpOffset); + if (jumpOffset == 0 && multiplayerId == sPokemonJump->multiplayerId) + SetMonStateNormal(); - player->unk0 = var1; + player->jumpOffset = jumpOffset; } -static void sub_802C43C(void) +static void TryUpdateScore(void) { - if (gUnknown_02022CFC->unk14 == 8 && gUnknown_02022CFC->unk18 == 7) + if (sPokemonJump->vineState == VINE_UPSWING_HIGH && sPokemonJump->prevVineState == VINE_UPSWING_LOW) { - if (gUnknown_02022CFC->unk58 == 0) + // Vine has passed through the point where it + // would hit the players, allow score to update + + if (!sPokemonJump->initScoreUpdate) { - sub_802C780(); - gUnknown_02022CFC->unk54 = 0; - gUnknown_02022CFC->unk58 = 1; - gUnknown_02022CFC->unk70.unk1 = 0; + ClearUnreadField(); + sPokemonJump->numPlayersAtPeak = 0; + sPokemonJump->initScoreUpdate = TRUE; + sPokemonJump->comm.receivedBonusFlags = 0; } else { - if (gUnknown_02022CFC->unk54 == 5) + if (sPokemonJump->numPlayersAtPeak == MAX_RFU_PLAYERS) { - gUnknown_02022CFC->unkC++; - sub_802C7A0(gUnknown_02022CFC->unkC); + // An 'excellent' is the max 5 players all jumping synchronously + sPokemonJump->excellentsInRow++; + TryUpdateExcellentsRecord(sPokemonJump->excellentsInRow); } else { - gUnknown_02022CFC->unkC = 0; + sPokemonJump->excellentsInRow = 0; } - if (gUnknown_02022CFC->unk54 > 1) + if (sPokemonJump->numPlayersAtPeak > 1) { - gUnknown_02022CFC->unk64 = 1; - memcpy(gUnknown_02022CFC->unk86, gUnknown_02022CFC->unk81, sizeof(u8) * MAX_RFU_PLAYERS); + sPokemonJump->giveBonus = TRUE; + // Unclear why atJumpPeak needed to be copied over twice + memcpy(sPokemonJump->atJumpPeak3, sPokemonJump->atJumpPeak2, sizeof(u8) * MAX_RFU_PLAYERS); } - sub_802C780(); - gUnknown_02022CFC->unk54 = 0; - gUnknown_02022CFC->unk58 = 1; - gUnknown_02022CFC->unk70.unk1 = 0; - if (gUnknown_02022CFC->unk70.unk4 < 9999) - gUnknown_02022CFC->unk70.unk4++; + ClearUnreadField(); + sPokemonJump->numPlayersAtPeak = 0; + sPokemonJump->initScoreUpdate = TRUE; + sPokemonJump->comm.receivedBonusFlags = 0; + if (sPokemonJump->comm.jumpsInRow < MAX_JUMPS) + sPokemonJump->comm.jumpsInRow++; - sub_802C688(10); - sub_802AE14(3); + AddJumpScore(10); + SetLinkTimeInterval(LINK_INTERVAL_SHORT); } } - if (gUnknown_02022CFC->unk64 && (sub_802C618() == TRUE || !gUnknown_02022CFC->unk14)) + if (sPokemonJump->giveBonus && (DidAllPlayersClearVine() == TRUE || sPokemonJump->vineState == VINE_HIGHEST)) { - int var0 = sub_802C73C(gUnknown_02022CFC->unk86); - sub_802C688(sub_802C790(var0)); - sub_802AE14(3); - gUnknown_02022CFC->unk64 = 0; + int numPlayers = GetNumPlayersForBonus(sPokemonJump->atJumpPeak3); + AddJumpScore(GetScoreBonus(numPlayers)); + SetLinkTimeInterval(LINK_INTERVAL_SHORT); + sPokemonJump->giveBonus = FALSE; } - if (gUnknown_02022CFC->unk58) + if (sPokemonJump->initScoreUpdate) { - int var1 = sub_802C6B0(); - if (var1 > gUnknown_02022CFC->unk54) + int numAtPeak = GetPlayersAtJumpPeak(); + if (numAtPeak > sPokemonJump->numPlayersAtPeak) { - gUnknown_02022CFC->unk54 = var1; - memcpy(gUnknown_02022CFC->unk81, gUnknown_02022CFC->unk7C, sizeof(u8) * MAX_RFU_PLAYERS); + sPokemonJump->numPlayersAtPeak = numAtPeak; + memcpy(sPokemonJump->atJumpPeak2, sPokemonJump->atJumpPeak, sizeof(u8) * MAX_RFU_PLAYERS); } } } -static bool32 sub_802C538(void) +// Returns FALSE if any player was hit by vine +static bool32 UpdateVineHitStates(void) { int i; - if (gUnknown_02022CFC->unk14 == 6 && !gUnknown_02022CFC->unk83AC->unk0) + if (sPokemonJump->vineState == VINE_UPSWING_LOWER && sPokemonJump->player->jumpOffset == 0) { - if (gUnknown_02022CFC->unk83AC->unk12 == 1 && sub_802C0DC() == 1) + // Vine is in position to hit the player and jump offset is 0. + // Unless the player had just jumped and has been forced to the ground + // by someone else getting hit, the player has been hit + if (sPokemonJump->player->prevMonState == MONSTATE_JUMP && IsGameOver() == TRUE) { - gUnknown_02022CFC->unk83AC->unk14 = 1; + sPokemonJump->player->jumpState = JUMPSTATE_SUCCESS; } else { - sub_802C18C(); - sub_802AE14(3); + // Hit vine + SetMonStateHit(); + SetLinkTimeInterval(LINK_INTERVAL_SHORT); } } - if (gUnknown_02022CFC->unk14 == 7 - && gUnknown_02022CFC->unk18 == 6 - && gUnknown_02022CFC->unk83AC->unk10 != 2) + if (sPokemonJump->vineState == VINE_UPSWING_LOW + && sPokemonJump->prevVineState == VINE_UPSWING_LOWER + && sPokemonJump->player->monState != MONSTATE_HIT) { - gUnknown_02022CFC->unk83AC->unk14 = 1; - sub_802AE14(3); + sPokemonJump->player->jumpState = JUMPSTATE_SUCCESS; + SetLinkTimeInterval(LINK_INTERVAL_SHORT); } - for (i = 0; i < gUnknown_02022CFC->unk5; i++) + for (i = 0; i < sPokemonJump->numPlayers; i++) { - if (gUnknown_02022CFC->unk82E4[i].unk10 == 2) + if (sPokemonJump->players[i].monState == MONSTATE_HIT) return FALSE; } return TRUE; } -static bool32 sub_802C5DC(void) +// Has everyone either jumped or been hit by the vine +static bool32 AllPlayersJumpedOrHit(void) { int i; - int numPlayers = gUnknown_02022CFC->unk5; - int count = 0; + int numPlayers = sPokemonJump->numPlayers; + int numJumpedOrHit = 0; for (i = 0; i < numPlayers; i++) { - if (gUnknown_02022CFC->unk82E4[i].unk14) - count++; + if (sPokemonJump->players[i].jumpState != JUMPSTATE_NONE) + numJumpedOrHit++; } - return count == numPlayers; + return numJumpedOrHit == numPlayers; } -static bool32 sub_802C618(void) +static bool32 DidAllPlayersClearVine(void) { int i; - for (i = 0; i < gUnknown_02022CFC->unk5; i++) + for (i = 0; i < sPokemonJump->numPlayers; i++) { - if (gUnknown_02022CFC->unk82E4[i].unk14 != 1) + if (sPokemonJump->players[i].jumpState != JUMPSTATE_SUCCESS) return FALSE; } return TRUE; } -static bool32 sub_802C650(void) +static bool32 ShouldPlayAgain(void) { int i; - if (gUnknown_02022CFC->unk45 == 1) + if (sPokemonJump->playAgainState == PLAY_AGAIN_NO) return FALSE; - for (i = 1; i < gUnknown_02022CFC->unk5; i++) + for (i = 1; i < sPokemonJump->numPlayers; i++) { - if (gUnknown_02022CFC->unk90[i] == 1) + if (sPokemonJump->playAgainStates[i] == PLAY_AGAIN_NO) return FALSE; } return TRUE; } -static void sub_802C688(int arg0) +static void AddJumpScore(int score) { - gUnknown_02022CFC->unk70.unk8 += arg0; - gUnknown_02022CFC->unk5C = 1; - if (gUnknown_02022CFC->unk70.unk8 >= 99990) - gUnknown_02022CFC->unk70.unk8 = 99990; + sPokemonJump->comm.jumpScore += score; + sPokemonJump->updateScore = TRUE; + if (sPokemonJump->comm.jumpScore >= MAX_JUMP_SCORE) + sPokemonJump->comm.jumpScore = MAX_JUMP_SCORE; } -static int sub_802C6B0(void) +static int GetPlayersAtJumpPeak(void) { int i; - int count = 0; - int numPlayers = gUnknown_02022CFC->unk5; + int numAtPeak = 0; + int numPlayers = sPokemonJump->numPlayers; for (i = 0; i < numPlayers; i++) { - if (gUnknown_02022CFC->unk82E4[i].unk0 == -30) + if (sPokemonJump->players[i].jumpOffset == JUMP_PEAK) { - gUnknown_02022CFC->unk7C[i] = 1; - count++; + sPokemonJump->atJumpPeak[i] = TRUE; + numAtPeak++; } else { - gUnknown_02022CFC->unk7C[i] = 0; + sPokemonJump->atJumpPeak[i] = FALSE; } } - return count; + return numAtPeak; } static bool32 AreLinkQueuesEmpty(void) @@ -2029,13 +2205,13 @@ static bool32 AreLinkQueuesEmpty(void) return !Rfu.recvQueue.count && !Rfu.sendQueue.count; } -static int sub_802C73C(u8 *arg0) +static int GetNumPlayersForBonus(u8 *arg0) { - int i; - int flags; - int count; + int i = 0; + int flags = 0; + int count = 0; - for (i = 0, flags = 0, count = 0; i < MAX_RFU_PLAYERS; i++) + for (; i < MAX_RFU_PLAYERS; i++) { if (arg0[i]) { @@ -2044,87 +2220,100 @@ static int sub_802C73C(u8 *arg0) } } - gUnknown_02022CFC->unk70.unk1 = flags; + sPokemonJump->comm.receivedBonusFlags = flags; if (flags) - gUnknown_02022CFC->unk4D = 1; + sPokemonJump->showBonus = TRUE; return count; } -static void sub_802C780(void) +static void ClearUnreadField(void) { - gUnknown_02022CFC->unk44 = 0; + sPokemonJump->unused3 = 0; } -static const int gUnknown_082FB6EC[] = {0, 0, 0x32, 0x64, 0xc8, 0x1f4}; +// Bonuses given depend on the number of +// players that jumped at the same time +static const int sScoreBonuses[MAX_RFU_PLAYERS + 1] = {0, 0, 50, 100, 200, 500}; -static int sub_802C790(int arg0) +static int GetScoreBonus(int numPlayers) { - return gUnknown_082FB6EC[arg0]; + return sScoreBonuses[numPlayers]; } -static void sub_802C7A0(u16 arg0) +static void TryUpdateExcellentsRecord(u16 excellentsInRow) { - if (arg0 > gUnknown_02022CFC->unkE) - gUnknown_02022CFC->unkE = arg0; + if (excellentsInRow > sPokemonJump->excellentsInRowRecord) + sPokemonJump->excellentsInRowRecord = excellentsInRow; } -static const u16 gUnknown_082FB704[] = {0x8a, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93}; -static const u32 gUnknown_082FB714[][2] = +static const u16 sPrizeItems[] = { + ITEM_LEPPA_BERRY, + ITEM_LUM_BERRY, + ITEM_SITRUS_BERRY, + ITEM_FIGY_BERRY, + ITEM_WIKI_BERRY, + ITEM_MAGO_BERRY, + ITEM_AGUAV_BERRY, + ITEM_IAPAPA_BERRY +}; + +struct { + u32 score; + u32 quantity; +} static const sPrizeQuantityData[] = { - {0x1388, 1}, - {0x1f40, 2}, - {0x2ee0, 3}, - {0x3e80, 4}, - {0x4e20, 5}, + { .score = 5000, .quantity = 1}, + { .score = 8000, .quantity = 2}, + { .score = 12000, .quantity = 3}, + { .score = 16000, .quantity = 4}, + { .score = 20000, .quantity = 5}, }; -static bool32 sub_802C7BC(void) +static bool32 HasEnoughScoreForPrize(void) { - if (gUnknown_02022CFC->unk70.unk8 >= gUnknown_082FB714[0][0]) + if (sPokemonJump->comm.jumpScore >= sPrizeQuantityData[0].score) return TRUE; else return FALSE; } -static u16 sub_802C7E0(void) +static u16 GetPrizeData(void) { - u16 lo = sub_802C818(); - u16 hi = sub_802C838(); - return (hi << 12) | (lo & 0xFFF); + u16 itemId = GetPrizeItemId(); + u16 quantity = GetPrizeQuantity(); + return (quantity << 12) | (itemId & 0xFFF); } -static void sub_802C808(u16 arg0, u16 *arg1, u16 *arg2) +static void UnpackPrizeData(u16 data, u16 *itemId, u16 *quantity) { - *arg2 = arg0 >> 12; - *arg1 = arg0 & 0xFFF; + *quantity = data >> 12; + *itemId = data & 0xFFF; } -static u16 sub_802C818(void) +static u16 GetPrizeItemId(void) { - u16 index = Random() % ARRAY_COUNT(gUnknown_082FB704); - return gUnknown_082FB704[index]; + u16 index = Random() % ARRAY_COUNT(sPrizeItems); + return sPrizeItems[index]; } -static u16 sub_802C838(void) +static u16 GetPrizeQuantity(void) { - u32 val, i; + u32 quantity, i; - val = 0; - for (i = 0; i < 5; i++) + quantity = 0; + for (i = 0; i < ARRAY_COUNT(sPrizeQuantityData); i++) { - if (gUnknown_02022CFC->unk70.unk8 < gUnknown_082FB714[i][0]) - break; - else if (1) - val = gUnknown_082FB714[i][1]; + if (sPokemonJump->comm.jumpScore >= sPrizeQuantityData[i].score) + quantity = sPrizeQuantityData[i].quantity; else break; } - return val; + return quantity; } -static u16 sub_802C880(u16 item, u16 quantity) +static u16 GetQuantityLimitedByBag(u16 item, u16 quantity) { while (quantity && !CheckBagHasSpace(item, quantity)) quantity--; @@ -2132,24 +2321,24 @@ static u16 sub_802C880(u16 item, u16 quantity) return quantity; } -static u16 sub_802C8AC(void) +static u16 GetNumPokeJumpPlayers(void) { return GetLinkPlayerCount(); } -static u16 sub_802C8BC(void) +static u16 GetPokeJumpMultiplayerId(void) { - return gUnknown_02022CFC->unk6; + return sPokemonJump->multiplayerId; } -static struct PokemonJump1_MonInfo *sub_802C8C8(u8 multiplayerId) +static struct PokemonJump_MonInfo *GetMonInfoByMultiplayerId(u8 multiplayerId) { - return &gUnknown_02022CFC->unk82A8[multiplayerId]; + return &sPokemonJump->monInfo[multiplayerId]; } -static u8 *sub_802C8E8(u8 multiplayerId) +static u8 *GetPokeJumpPlayerName(u8 multiplayerId) { - return gUnknown_02022CFC->unk82E4[multiplayerId].unk1C; + return sPokemonJump->players[multiplayerId].name; } bool32 IsSpeciesAllowedInPokemonJump(u16 species) @@ -2177,69 +2366,67 @@ void IsPokemonJumpSpeciesInParty(void) gSpecialVar_Result = FALSE; } -// Large group of data. -static const u16 gPkmnJumpPal1[] = INCBIN_U16("graphics/link_games/pkmnjump_pal1.gbapal"); -static const u16 gPkmnJumpPal2[] = INCBIN_U16("graphics/link_games/pkmnjump_pal2.gbapal"); +static const u16 sPokeJumpPal1[] = INCBIN_U16("graphics/pokemon_jump/pal1.gbapal"); +static const u16 sPokeJumpPal2[] = INCBIN_U16("graphics/pokemon_jump/pal2.gbapal"); -static const u32 gPkmnJumpRopeGfx1[] = INCBIN_U32("graphics/link_games/pkmnjump_rope1.4bpp.lz"); -static const u32 gPkmnJumpRopeGfx2[] = INCBIN_U32("graphics/link_games/pkmnjump_rope2.4bpp.lz"); -static const u32 gPkmnJumpRopeGfx3[] = INCBIN_U32("graphics/link_games/pkmnjump_rope3.4bpp.lz"); -static const u32 gPkmnJumpRopeGfx4[] = INCBIN_U32("graphics/link_games/pkmnjump_rope4.4bpp.lz"); +static const u32 sVine1_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine1.4bpp.lz"); +static const u32 sVine2_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine2.4bpp.lz"); +static const u32 sVine3_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine3.4bpp.lz"); +static const u32 sVine4_Gfx[] = INCBIN_U32("graphics/pokemon_jump/vine4.4bpp.lz"); -static const u32 gPkmnJumpStarGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_star.4bpp.lz"); +static const u32 sStar_Gfx[] = INCBIN_U32("graphics/pokemon_jump/star.4bpp.lz"); -static const struct CompressedSpriteSheet gUnknown_082FBE08[] = +static const struct CompressedSpriteSheet sCompressedSpriteSheets[] = { - {gPkmnJumpRopeGfx1, 0x600, 5}, - {gPkmnJumpRopeGfx2, 0x0c00, 6}, - {gPkmnJumpRopeGfx3, 0x0600, 7}, - {gPkmnJumpRopeGfx4, 0x0600, 8}, - {gPkmnJumpStarGfx, 0x0200, 10}, + {sVine1_Gfx, 0x600, GFXTAG_VINE1}, + {sVine2_Gfx, 0xC00, GFXTAG_VINE2}, + {sVine3_Gfx, 0x600, GFXTAG_VINE3}, + {sVine4_Gfx, 0x600, GFXTAG_VINE4}, + {sStar_Gfx, 0x200, GFXTAG_STAR}, }; -static const struct SpritePalette gUnknown_082FBE30[] = +static const struct SpritePalette sSpritePalettes[] = { - {gPkmnJumpPal1, 5}, - {gPkmnJumpPal2, 6}, + {sPokeJumpPal1, PALTAG_1}, + {sPokeJumpPal2, PALTAG_2}, }; -// Forward declarations. -static const struct OamData sOamData_82FBEC8; -static const struct SpriteTemplate gUnknown_082FBF78; -static const struct SpriteTemplate gUnknown_082FBF90; -static const struct SpriteTemplate gUnknown_082FBFA8; -static const struct SpriteTemplate gUnknown_082FBFC0; +static const struct OamData sOamData_JumpMon; +static const struct SpriteTemplate sSpriteTemplate_Vine1; +static const struct SpriteTemplate sSpriteTemplate_Vine2; +static const struct SpriteTemplate sSpriteTemplate_Vine3; +static const struct SpriteTemplate sSpriteTemplate_Vine4; -static const struct SpriteTemplate gUnknown_082FBE40 = +static const struct SpriteTemplate sSpriteTemplate_JumpMon = { - .tileTag = 0, - .paletteTag = 0, - .oam = &sOamData_82FBEC8, + .tileTag = TAG_MON1, + .paletteTag = TAG_MON1, + .oam = &sOamData_JumpMon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const s16 gUnknown_082FBE58[][10] = +static const s16 sVineYCoords[VINE_SPRITES_PER_SIDE][NUM_VINESTATES] = { - {0x60, 0x60, 0x60, 0x72, 0x78, 0x78, 0x78, 0x72, 0x60, 0x60}, - {0x46, 0x50, 0x60, 0x72, 0x78, 0x80, 0x78, 0x72, 0x60, 0x50}, - {0x32, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48}, - {0x2a, 0x48, 0x60, 0x72, 0x80, 0x88, 0x80, 0x72, 0x60, 0x48}, + {96, 96, 96, 114, 120, 120, 120, 114, 96, 96}, + {70, 80, 96, 114, 120, 128, 120, 114, 96, 80}, + {50, 72, 96, 114, 128, 136, 128, 114, 96, 72}, + {42, 72, 96, 114, 128, 136, 128, 114, 96, 72}, }; -static const s16 gUnknown_082FBEA8[] = {0x10, 0x28, 0x48, 0x68, 0x88, 0xa8, 0xc8, 0xe0}; +static const s16 sVineXCoords[VINE_SPRITES_PER_SIDE * 2] = {16, 40, 72, 104, 136, 168, 200, 224}; -static const struct SpriteTemplate *const gUnknown_082FBEB8[] = +static const struct SpriteTemplate *const sSpriteTemplates_Vine[VINE_SPRITES_PER_SIDE] = { - &gUnknown_082FBF78, - &gUnknown_082FBF90, - &gUnknown_082FBFA8, - &gUnknown_082FBFC0, + &sSpriteTemplate_Vine1, + &sSpriteTemplate_Vine2, + &sSpriteTemplate_Vine3, + &sSpriteTemplate_Vine4, }; -static const struct OamData sOamData_82FBEC8 = +static const struct OamData sOamData_JumpMon = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -2256,7 +2443,7 @@ static const struct OamData sOamData_82FBEC8 = .affineParam = 0 }; -static const struct OamData sOamData_82FBED0 = +static const struct OamData sOamData_Vine16x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -2273,7 +2460,7 @@ static const struct OamData sOamData_82FBED0 = .affineParam = 0 }; -static const struct OamData sOamData_82FBED8 = +static const struct OamData sOamData_Vine32x32 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -2290,7 +2477,7 @@ static const struct OamData sOamData_82FBED8 = .affineParam = 0 }; -static const struct OamData sOamData_82FBEE0 = +static const struct OamData sOamData_Vine32x16 = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -2307,143 +2494,144 @@ static const struct OamData sOamData_82FBEE0 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_82FBEE8[] = +static const union AnimCmd sAnims_Vine_Highest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBEF0[] = +static const union AnimCmd sAnims_Vine_Higher[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBEF8[] = +static const union AnimCmd sAnims_Vine_High[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF00[] = +static const union AnimCmd sAnims_Vine_Low[] = { ANIMCMD_FRAME(24, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF08[] = +static const union AnimCmd sAnims_Vine_Lower[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF10[] = +static const union AnimCmd sAnims_Vine_Lowest[] = { ANIMCMD_FRAME(40, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF18[] = +static const union AnimCmd sAnims_VineTall_Highest[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF20[] = +static const union AnimCmd sAnims_VineTall_Higher[] = { ANIMCMD_FRAME(16, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF28[] = +static const union AnimCmd sAnims_VineTall_High[] = { ANIMCMD_FRAME(32, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF30[] = +static const union AnimCmd sAnims_VineTall_Low[] = { ANIMCMD_FRAME(48, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF38[] = +static const union AnimCmd sAnims_VineTall_Lower[] = { ANIMCMD_FRAME(64, 1), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBF40[] = +static const union AnimCmd sAnims_VineTall_Lowest[] = { ANIMCMD_FRAME(80, 1), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_82FBF48[] = +static const union AnimCmd *const sAnims_Vine[] = { - sSpriteAnim_82FBEE8, - sSpriteAnim_82FBEF0, - sSpriteAnim_82FBEF8, - sSpriteAnim_82FBF00, - sSpriteAnim_82FBF08, - sSpriteAnim_82FBF10 + sAnims_Vine_Highest, + sAnims_Vine_Higher, + sAnims_Vine_High, + sAnims_Vine_Low, + sAnims_Vine_Lower, + sAnims_Vine_Lowest }; -static const union AnimCmd *const sSpriteAnimTable_82FBF60[] = +// Vine 2 needs its own set of anims because the graphic is twice as large +static const union AnimCmd *const sAnims_VineTall[] = { - sSpriteAnim_82FBF18, - sSpriteAnim_82FBF20, - sSpriteAnim_82FBF28, - sSpriteAnim_82FBF30, - sSpriteAnim_82FBF38, - sSpriteAnim_82FBF40 + sAnims_VineTall_Highest, + sAnims_VineTall_Higher, + sAnims_VineTall_High, + sAnims_VineTall_Low, + sAnims_VineTall_Lower, + sAnims_VineTall_Lowest }; -static const struct SpriteTemplate gUnknown_082FBF78 = +static const struct SpriteTemplate sSpriteTemplate_Vine1 = { - .tileTag = 5, - .paletteTag = 5, - .oam = &sOamData_82FBED0, - .anims = sSpriteAnimTable_82FBF48, + .tileTag = GFXTAG_VINE1, + .paletteTag = PALTAG_1, + .oam = &sOamData_Vine16x32, + .anims = sAnims_Vine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate gUnknown_082FBF90 = +static const struct SpriteTemplate sSpriteTemplate_Vine2 = { - .tileTag = 6, - .paletteTag = 5, - .oam = &sOamData_82FBED8, - .anims = sSpriteAnimTable_82FBF60, + .tileTag = GFXTAG_VINE2, + .paletteTag = PALTAG_1, + .oam = &sOamData_Vine32x32, + .anims = sAnims_VineTall, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate gUnknown_082FBFA8 = +static const struct SpriteTemplate sSpriteTemplate_Vine3 = { - .tileTag = 7, - .paletteTag = 5, - .oam = &sOamData_82FBEE0, - .anims = sSpriteAnimTable_82FBF48, + .tileTag = GFXTAG_VINE3, + .paletteTag = PALTAG_1, + .oam = &sOamData_Vine32x16, + .anims = sAnims_Vine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct SpriteTemplate gUnknown_082FBFC0 = +static const struct SpriteTemplate sSpriteTemplate_Vine4 = { - .tileTag = 8, - .paletteTag = 5, - .oam = &sOamData_82FBEE0, - .anims = sSpriteAnimTable_82FBF48, + .tileTag = GFXTAG_VINE4, + .paletteTag = PALTAG_1, + .oam = &sOamData_Vine32x16, + .anims = sAnims_Vine, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct OamData sOamData_82FBFD8 = +static const struct OamData sOamData_Star = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -2460,13 +2648,13 @@ static const struct OamData sOamData_82FBFD8 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_82FBFE0[] = +static const union AnimCmd sAnim_Star_Still[] = { ANIMCMD_FRAME(0, 0), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_82FBFE8[] = +static const union AnimCmd sAnim_Star_Spinning[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), @@ -2477,46 +2665,45 @@ static const union AnimCmd sSpriteAnim_82FBFE8[] = ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_82FC004[] = +static const union AnimCmd *const sAnims_Star[] = { - sSpriteAnim_82FBFE0, - sSpriteAnim_82FBFE8 + sAnim_Star_Still, + sAnim_Star_Spinning }; -static const struct SpriteTemplate gUnknown_082FC00C = +static const struct SpriteTemplate sSpriteTemplate_Star = { - .tileTag = 10, - .paletteTag = 5, - .oam = &sOamData_82FBFD8, - .anims = sSpriteAnimTable_82FC004, + .tileTag = GFXTAG_STAR, + .paletteTag = PALTAG_1, + .oam = &sOamData_Star, + .anims = sAnims_Star, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -// Back to code -static void sub_802C974(struct PokemonJump2 *arg0) +static void LoadSpriteSheetsAndPalettes(struct PokemonJumpGfx *jumpGfx) { int i; - for (i = 0; i < ARRAY_COUNT(gUnknown_082FBE08); i++) - LoadCompressedSpriteSheet(&gUnknown_082FBE08[i]); + for (i = 0; i < ARRAY_COUNT(sCompressedSpriteSheets); i++) + LoadCompressedSpriteSheet(&sCompressedSpriteSheets[i]); - for (i = 0; i < ARRAY_COUNT(gUnknown_082FBE30); i++) - LoadSpritePalette(&gUnknown_082FBE30[i]); + for (i = 0; i < ARRAY_COUNT(sSpritePalettes); i++) + LoadSpritePalette(&sSpritePalettes[i]); - arg0->unkE = IndexOfSpritePaletteTag(5); - arg0->unkF = IndexOfSpritePaletteTag(6); + jumpGfx->vinePalNumDownswing = IndexOfSpritePaletteTag(PALTAG_1); + jumpGfx->vinePalNumUpswing = IndexOfSpritePaletteTag(PALTAG_2); } -static void sub_802C9BC(struct Sprite *sprite) +static void ResetPokeJumpSpriteData(struct Sprite *sprite) { int i; - for (i = 0; i < 8; i++) + for (i = 0; i < (int)ARRAY_COUNT(sprite->data); i++) sprite->data[i] = 0; } -static void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo *jumpMon, s16 x, s16 y, u8 multiplayerId) +static void CreateJumpMonSprite(struct PokemonJumpGfx *jumpGfx, struct PokemonJump_MonInfo *monInfo, s16 x, s16 y, u8 multiplayerId) { struct SpriteTemplate spriteTemplate; struct SpriteSheet spriteSheet; @@ -2526,10 +2713,10 @@ static void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo * u8 subpriority; u8 spriteId; - spriteTemplate = gUnknown_082FBE40; + spriteTemplate = sSpriteTemplate_JumpMon; buffer = Alloc(0x2000); - unusedBuffer = Alloc(0x800); - if (multiplayerId == sub_802C8BC()) + unusedBuffer = Alloc(MON_PIC_SIZE); + if (multiplayerId == GetPokeJumpMultiplayerId()) subpriority = 3; else subpriority = multiplayerId + 4; @@ -2537,17 +2724,17 @@ static void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo * if (buffer && unusedBuffer) { HandleLoadSpecialPokePic( - &gMonStillFrontPicTable[jumpMon->species], + &gMonStillFrontPicTable[monInfo->species], buffer, - jumpMon->species, - jumpMon->personality); + monInfo->species, + monInfo->personality); spriteSheet.data = buffer; spriteSheet.tag = multiplayerId; - spriteSheet.size = 0x800; + spriteSheet.size = MON_PIC_SIZE; LoadSpriteSheet(&spriteSheet); - spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(jumpMon->species, jumpMon->otId, jumpMon->personality); + spritePalette.data = GetMonSpritePalFromSpeciesAndPersonality(monInfo->species, monInfo->otId, monInfo->personality); spritePalette.tag = multiplayerId; LoadCompressedSpritePalette(&spritePalette); @@ -2559,162 +2746,184 @@ static void sub_802C9D4(struct PokemonJump2 *arg0, struct PokemonJump1_MonInfo * spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); if (spriteId != MAX_SPRITES) { - arg0->unk81A8[multiplayerId] = &gSprites[spriteId]; - arg0->unk81FC[multiplayerId] = subpriority; + jumpGfx->monSprites[multiplayerId] = &gSprites[spriteId]; + jumpGfx->monSpriteSubpriorities[multiplayerId] = subpriority; return; } } - arg0->unk81A8[multiplayerId] = NULL; + jumpGfx->monSprites[multiplayerId] = NULL; } -static void sub_802CB14(struct PokemonJump2 *arg0, int multiplayerId) +#define sState data[0] +#define sTimer data[1] +#define sOffset data[7] // Never read + +static void DoStarAnim(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { - sub_802C9BC(arg0->unk81BC[multiplayerId]); - arg0->unk81BC[multiplayerId]->data[7] = arg0->unk81A8[multiplayerId] - gSprites; - arg0->unk81BC[multiplayerId]->invisible = 0; - arg0->unk81BC[multiplayerId]->pos1.y = 96; - arg0->unk81BC[multiplayerId]->callback = sub_802CB7C; - StartSpriteAnim(arg0->unk81BC[multiplayerId], 1); + ResetPokeJumpSpriteData(jumpGfx->starSprites[multiplayerId]); + jumpGfx->starSprites[multiplayerId]->sOffset = jumpGfx->monSprites[multiplayerId] - gSprites; + jumpGfx->starSprites[multiplayerId]->invisible = FALSE; + jumpGfx->starSprites[multiplayerId]->pos1.y = 96; + jumpGfx->starSprites[multiplayerId]->callback = SpriteCB_Star; + StartSpriteAnim(jumpGfx->starSprites[multiplayerId], 1); } -static void sub_802CB7C(struct Sprite *sprite) +static void SpriteCB_Star(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: if (sprite->animEnded) { - sprite->invisible = 1; + sprite->invisible = TRUE; sprite->callback = SpriteCallbackDummy; } break; case 1: sprite->pos1.y--; - sprite->data[1]++; + sprite->sTimer++; if (sprite->pos1.y <= 72) { sprite->pos1.y = 72; - sprite->data[0]++; + sprite->sState++; } break; case 2: - if (++sprite->data[1] >= 48) + if (++sprite->sTimer >= 48) { - sprite->invisible = 1; + sprite->invisible = TRUE; sprite->callback = SpriteCallbackDummy; } break; } } -static void sub_802CBF0(struct PokemonJump2 *arg0, int multiplayerId) +#undef sState +#undef sTimer +#undef sOffset + +static void Gfx_StartMonHitShake(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { - arg0->unk81A8[multiplayerId]->callback = sub_802CC40; - arg0->unk81A8[multiplayerId]->pos2.y = 0; - sub_802C9BC(arg0->unk81A8[multiplayerId]); + jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonHitShake; + jumpGfx->monSprites[multiplayerId]->pos2.y = 0; + ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]); } -static bool32 sub_802CC18(struct PokemonJump2 *arg0, int multiplayerId) +static bool32 Gfx_IsMonHitShakeActive(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { - return arg0->unk81A8[multiplayerId]->callback == sub_802CC40; + return jumpGfx->monSprites[multiplayerId]->callback == SpriteCB_MonHitShake; } -static void sub_802CC40(struct Sprite *sprite) +#define sTimer data[1] +#define sNumShakes data[2] + +static void SpriteCB_MonHitShake(struct Sprite *sprite) { - if (++sprite->data[1] > 1) + if (++sprite->sTimer > 1) { - if (++sprite->data[2] & 1) + if (++sprite->sNumShakes & 1) sprite->pos2.y = 2; else sprite->pos2.y = -2; - sprite->data[1] = 0; + sprite->sTimer = 0; } - if (sprite->data[2] > 12) + if (sprite->sNumShakes > 12) { sprite->pos2.y = 0; sprite->callback = SpriteCallbackDummy; } } -static void sub_802CC88(struct PokemonJump2 *arg0, int multiplayerId) +#undef sTimer +#undef sNumShakes + +static void Gfx_StartMonHitFlash(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { - sub_802C9BC(arg0->unk81A8[multiplayerId]); - arg0->unk81A8[multiplayerId]->callback = sub_802CD08; + ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]); + jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonHitFlash; } -static void sub_802CCB0(struct PokemonJump2 *arg0) +static void Gfx_StopMonHitFlash(struct PokemonJumpGfx *jumpGfx) { int i; - u16 numPlayers = sub_802C8AC(); + u16 numPlayers = GetNumPokeJumpPlayers(); for (i = 0; i < numPlayers; i++) { - if (arg0->unk81A8[i]->callback == sub_802CD08) + if (jumpGfx->monSprites[i]->callback == SpriteCB_MonHitFlash) { - arg0->unk81A8[i]->invisible = 0; - arg0->unk81A8[i]->callback = SpriteCallbackDummy; - arg0->unk81A8[i]->subpriority = 10; + jumpGfx->monSprites[i]->invisible = FALSE; + jumpGfx->monSprites[i]->callback = SpriteCallbackDummy; + jumpGfx->monSprites[i]->subpriority = 10; } } } -static void sub_802CD08(struct Sprite *sprite) +#define sTimer data[0] + +static void SpriteCB_MonHitFlash(struct Sprite *sprite) { - if (++sprite->data[0] > 3) + if (++sprite->sTimer > 3) { - sprite->data[0] = 0; + sprite->sTimer = 0; sprite->invisible ^= 1; } } -static void sub_802CD3C(struct PokemonJump2 *arg0) +#undef sTimer + +static void Gfx_ResetMonSpriteSubpriorities(struct PokemonJumpGfx *jumpGfx) { int i; - u16 numPlayers = sub_802C8AC(); + u16 numPlayers = GetNumPokeJumpPlayers(); for (i = 0; i < numPlayers; i++) - arg0->unk81A8[i]->subpriority = arg0->unk81FC[i]; + jumpGfx->monSprites[i]->subpriority = jumpGfx->monSpriteSubpriorities[i]; } -static void sub_802CD70(struct PokemonJump2 *arg0, int multiplayerId) +static void Gfx_StartMonIntroBounce(struct PokemonJumpGfx *jumpGfx, int multiplayerId) { - sub_802C9BC(arg0->unk81A8[multiplayerId]); - arg0->unk81A8[multiplayerId]->callback = sub_802CDD4; + ResetPokeJumpSpriteData(jumpGfx->monSprites[multiplayerId]); + jumpGfx->monSprites[multiplayerId]->callback = SpriteCB_MonIntroBounce; } -static bool32 sub_802CD98(struct PokemonJump2 *arg0) +static bool32 Gfx_IsMonIntroBounceActive(struct PokemonJumpGfx *jumpGfx) { int i; - u16 numPlayers = sub_802C8AC(); + u16 numPlayers = GetNumPokeJumpPlayers(); for (i = 0; i < numPlayers; i++) { - if (arg0->unk81A8[i]->callback == sub_802CDD4) + if (jumpGfx->monSprites[i]->callback == SpriteCB_MonIntroBounce) return TRUE; } return FALSE; } -static void sub_802CDD4(struct Sprite *sprite) +#define sState data[0] +#define sHopPos data[1] +#define sNumHops data[2] + +static void SpriteCB_MonIntroBounce(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: PlaySE(SE_BIKE_HOP); - sprite->data[1] = 0; - sprite->data[0]++; + sprite->sHopPos = 0; + sprite->sState++; // fall through case 1: - sprite->data[1] += 4; - if (sprite->data[1] > 0x7F) - sprite->data[1] = 0; + sprite->sHopPos += 4; + if (sprite->sHopPos > 127) + sprite->sHopPos = 0; - sprite->pos2.y = -(gSineTable[sprite->data[1]] >> 3); - if (sprite->data[1] == 0) + sprite->pos2.y = -(gSineTable[sprite->sHopPos] >> 3); + if (sprite->sHopPos == 0) { - if (++sprite->data[2] < 2) - sprite->data[0] = 0; + if (++sprite->sNumHops < 2) + sprite->sState = 0; else sprite->callback = SpriteCallbackDummy; } @@ -2722,131 +2931,136 @@ static void sub_802CDD4(struct Sprite *sprite) } } -static void sub_802CE48(struct PokemonJump2 *arg0, s16 x, s16 y, u8 multiplayerId) +#undef sState +#undef sHopPos +#undef sNumHops + +static void CreateStarSprite(struct PokemonJumpGfx *jumpGfx, s16 x, s16 y, u8 multiplayerId) { - u8 spriteId = CreateSprite(&gUnknown_082FC00C, x, y, 1); + u8 spriteId = CreateSprite(&sSpriteTemplate_Star, x, y, 1); if (spriteId != MAX_SPRITES) { - gSprites[spriteId].invisible = 1; - arg0->unk81BC[multiplayerId] = &gSprites[spriteId]; + gSprites[spriteId].invisible = TRUE; + jumpGfx->starSprites[multiplayerId] = &gSprites[spriteId]; } } -static void sub_802CE9C(struct PokemonJump2 *arg0) +static void CreateVineSprites(struct PokemonJumpGfx *jumpGfx) { int i; int count; u8 spriteId; count = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < VINE_SPRITES_PER_SIDE; i++) { - spriteId = CreateSprite(gUnknown_082FBEB8[i], gUnknown_082FBEA8[count], gUnknown_082FBE58[i][0], 2); - arg0->unk81D0[count] = &gSprites[spriteId]; + spriteId = CreateSprite(sSpriteTemplates_Vine[i], sVineXCoords[count], sVineYCoords[i][0], 2); + jumpGfx->vineSprites[count] = &gSprites[spriteId]; count++; } - for (i = 3; i >= 0; i--) + for (i = VINE_SPRITES_PER_SIDE - 1; i >= 0; i--) { - spriteId = CreateSprite(gUnknown_082FBEB8[i], gUnknown_082FBEA8[count], gUnknown_082FBE58[i][0], 2); - arg0->unk81D0[count] = &gSprites[spriteId]; - arg0->unk81D0[count]->hFlip = 1; + spriteId = CreateSprite(sSpriteTemplates_Vine[i], sVineXCoords[count], sVineYCoords[i][0], 2); + jumpGfx->vineSprites[count] = &gSprites[spriteId]; + jumpGfx->vineSprites[count]->hFlip = TRUE; count++; } } -static void sub_802CF50(struct PokemonJump2 *arg0, int arg1) +static void UpdateVineAnim(struct PokemonJumpGfx *jumpGfx, int vineState) { int i, count, palNum; int priority; - if (arg1 > 5) + if (vineState > VINE_LOWEST) { - arg1 = 10 - arg1; - priority = 3; - palNum = arg0->unkF; + // animNums for vine on upswing are same as + // on downswing but in reverse + vineState = NUM_VINESTATES - vineState; + priority = 3; // Set vine behind Pokémon + palNum = jumpGfx->vinePalNumUpswing; } else { - priority = 2; - palNum = arg0->unkE; + priority = 2; // Set vine in front of Pokémon + palNum = jumpGfx->vinePalNumDownswing; } count = 0; - for (i = 0; i < 4; i++) + for (i = 0; i < VINE_SPRITES_PER_SIDE; i++) { - arg0->unk81D0[count]->pos1.y = gUnknown_082FBE58[i][arg1]; - arg0->unk81D0[count]->oam.priority = priority; - arg0->unk81D0[count]->oam.paletteNum = palNum; - StartSpriteAnim(arg0->unk81D0[count], arg1); + jumpGfx->vineSprites[count]->pos1.y = sVineYCoords[i][vineState]; + jumpGfx->vineSprites[count]->oam.priority = priority; + jumpGfx->vineSprites[count]->oam.paletteNum = palNum; + StartSpriteAnim(jumpGfx->vineSprites[count], vineState); count++; } - for (i = 3; i >= 0; i--) + for (i = VINE_SPRITES_PER_SIDE - 1; i >= 0; i--) { - arg0->unk81D0[count]->pos1.y = gUnknown_082FBE58[i][arg1]; - arg0->unk81D0[count]->oam.priority = priority; - arg0->unk81D0[count]->oam.paletteNum = palNum; - StartSpriteAnim(arg0->unk81D0[count], arg1); + jumpGfx->vineSprites[count]->pos1.y = sVineYCoords[i][vineState]; + jumpGfx->vineSprites[count]->oam.priority = priority; + jumpGfx->vineSprites[count]->oam.paletteNum = palNum; + StartSpriteAnim(jumpGfx->vineSprites[count], vineState); count++; } } -static void sub_802D044(struct PokemonJump2 *arg0) +static void StartPokeJumpCountdown(struct PokemonJumpGfx *jumpGfx) { - StartMinigameCountdown(9, 7, 120, 80, 0); - sub_802CD3C(arg0); + StartMinigameCountdown(GFXTAG_COUNTDOWN, PALTAG_COUNTDOWN, 120, 80, 0); + Gfx_ResetMonSpriteSubpriorities(jumpGfx); } -static bool32 sub_802D068(void) +static bool32 IsPokeJumpCountdownRunning(void) { return IsMinigameCountdownRunning(); } -static void sub_802D074(struct PokemonJump2 *arg0) +static void StartPokeJumpGfx(struct PokemonJumpGfx *jumpGfx) { u8 taskId; - gUnknown_02022D00 = arg0; - sub_802D0BC(gUnknown_02022D00); - taskId = CreateTask(sub_802D12C, 3); - gUnknown_02022D00->unk6 = taskId; - SetWordTaskArg(gUnknown_02022D00->unk6, 2, (u32) gUnknown_02022D00); - sub_802D108(sub_802D150); + sPokemonJumpGfx = jumpGfx; + InitPokeJumpGfx(sPokemonJumpGfx); + taskId = CreateTask(Task_RunPokeJumpGfxFunc, 3); + sPokemonJumpGfx->taskId = taskId; + SetWordTaskArg(sPokemonJumpGfx->taskId, 2, (u32) sPokemonJumpGfx); + SetUpPokeJumpGfxFunc(LoadPokeJumpGfx); } -static void sub_802D0AC(void) +static void FreeWindowsAndDigitObj(void) { FreeAllWindowBuffers(); DigitObjUtil_Free(); } -static void sub_802D0BC(struct PokemonJump2 *arg0) +static void InitPokeJumpGfx(struct PokemonJumpGfx *jumpGfx) { - arg0->unk4 = 0; - arg0->unk0 = 0; - arg0->unk12 = 0xFF; + jumpGfx->mainState = 0; + jumpGfx->funcFinished = FALSE; + jumpGfx->msgWindowId = WINDOW_NONE; } -// Gfx -static const u16 gPkmnJumpPal3[] = INCBIN_U16("graphics/link_games/pkmnjump_pal3.gbapal"); +static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_jump/interface.gbapal"); -static const u16 gPkmnJumpBgPal[] = INCBIN_U16("graphics/link_games/pkmnjump_bg.gbapal"); -static const u32 gPkmnJumpBgGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.4bpp.lz"); -static const u32 gPkmnJumpBgTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_bg.bin.lz"); +static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_jump/bg.gbapal"); +static const u32 sBg_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bg.4bpp.lz"); +static const u32 sBg_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bg.bin.lz"); -static const u16 gPkmnJumpVenusaurPal[] = INCBIN_U16("graphics/link_games/pkmnjump_venusaur.gbapal"); -static const u32 gPkmnJumpVenusaurGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.4bpp.lz"); -static const u32 gPkmnJumpVenusaurTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_venusaur.bin.lz"); +static const u16 sVenusaur_Pal[] = INCBIN_U16("graphics/pokemon_jump/venusaur.gbapal"); +static const u32 sVenusaur_Gfx[] = INCBIN_U32("graphics/pokemon_jump/venusaur.4bpp.lz"); +static const u32 sVenusaur_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/venusaur.bin.lz"); -static const u16 gPkmnJumpResultsPal[] = INCBIN_U16("graphics/link_games/pkmnjump_results.gbapal"); -static const u32 gPkmnJumpResultsGfx[] = INCBIN_U32("graphics/link_games/pkmnjump_results.4bpp.lz"); -static const u32 gPkmnJumpResultsTilemap[] = INCBIN_U32("graphics/link_games/pkmnjump_results.bin.lz"); +static const u16 sBonuses_Pal[] = INCBIN_U16("graphics/pokemon_jump/bonuses.gbapal"); +static const u32 sBonuses_Gfx[] = INCBIN_U32("graphics/pokemon_jump/bonuses.4bpp.lz"); +static const u32 sBonuses_Tilemap[] = INCBIN_U32("graphics/pokemon_jump/bonuses.bin.lz"); -static const struct BgTemplate gUnknown_082FE164[] = +static const struct BgTemplate sBgTemplates[] = { { - .bg = 0, + .bg = BG_INTERFACE, .charBaseIndex = 0, .mapBaseIndex = 27, .screenSize = 0, @@ -2855,7 +3069,7 @@ static const struct BgTemplate gUnknown_082FE164[] = .baseTile = 0 }, { - .bg = 2, + .bg = BG_VENUSAUR, .charBaseIndex = 1, .mapBaseIndex = 30, .screenSize = 2, @@ -2864,7 +3078,7 @@ static const struct BgTemplate gUnknown_082FE164[] = .baseTile = 0 }, { - .bg = 1, + .bg = BG_BONUSES, .charBaseIndex = 2, .mapBaseIndex = 12, .screenSize = 3, @@ -2873,7 +3087,7 @@ static const struct BgTemplate gUnknown_082FE164[] = .baseTile = 0 }, { - .bg = 3, + .bg = BG_SCENERY, .charBaseIndex = 3, .mapBaseIndex = 29, .screenSize = 0, @@ -2883,10 +3097,10 @@ static const struct BgTemplate gUnknown_082FE164[] = }, }; -static const struct WindowTemplate gUnknown_082FE174[] = +static const struct WindowTemplate sWindowTemplates[] = { - { - .bg = 0, + [WIN_POINTS] = { + .bg = BG_INTERFACE, .tilemapLeft = 19, .tilemapTop = 0, .width = 6, @@ -2894,8 +3108,8 @@ static const struct WindowTemplate gUnknown_082FE174[] = .paletteNum = 2, .baseBlock = 0x13, }, - { - .bg = 0, + [WIN_TIMES] = { + .bg = BG_INTERFACE, .tilemapLeft = 8, .tilemapTop = 0, .width = 6, @@ -2910,351 +3124,352 @@ struct { int id; void (*func)(void); -} static const gUnknown_082FE18C[] = -{ - {0x00, sub_802D150}, - {0x01, sub_802D2E4}, - {0x02, sub_802D350}, - {0x03, sub_802D3BC}, - {0x04, sub_802D448}, - {0x05, sub_802D4F4}, - {0x06, sub_802D598}, - {0x07, sub_802D5E4}, - {0x09, sub_802D72C}, - {0x08, sub_802D688}, +} static const sPokeJumpGfxFuncs[] = +{ + {GFXFUNC_LOAD, LoadPokeJumpGfx}, // Element not used, LoadPokeJumpGfx is passed directly to SetUpPokeJumpGfxFunc + {GFXFUNC_SHOW_NAMES, PrintPlayerNamesNoHighlight}, + {GFXFUNC_SHOW_NAMES_HIGHLIGHT, PrintPlayerNamesWithHighlight}, + {GFXFUNC_ERASE_NAMES, ErasePlayerNames}, + {GFXFUNC_MSG_PLAY_AGAIN, Msg_WantToPlayAgain}, + {GFXFUNC_MSG_SAVING, Msg_SavingDontTurnOff}, + {GFXFUNC_ERASE_MSG, EraseMessage}, + {GFXFUNC_MSG_PLAYER_DROPPED, Msg_SomeoneDroppedOut}, + {GFXFUNC_COUNTDOWN, DoPokeJumpCountdown}, + {GFXFUNC_MSG_COMM_STANDBY, Msg_CommunicationStandby}, }; -static void sub_802D0C8(int arg0) +static void SetUpPokeJumpGfxFuncById(int id) { int i; - for (i = 0; i < ARRAY_COUNT(gUnknown_082FE18C); i++) + for (i = 0; i < ARRAY_COUNT(sPokeJumpGfxFuncs); i++) { - if (gUnknown_082FE18C[i].id == arg0) - sub_802D108(gUnknown_082FE18C[i].func); + if (sPokeJumpGfxFuncs[i].id == id) + SetUpPokeJumpGfxFunc(sPokeJumpGfxFuncs[i].func); } } -static bool32 sub_802D0F0(void) +static bool32 IsPokeJumpGfxFuncFinished(void) { - return (gUnknown_02022D00->unk0 != 1); + return (sPokemonJumpGfx->funcFinished != TRUE); } -static void sub_802D108(void (*func)(void)) +static void SetUpPokeJumpGfxFunc(void (*func)(void)) { - SetWordTaskArg(gUnknown_02022D00->unk6, 0, (u32) func); - gUnknown_02022D00->unk4 = 0; - gUnknown_02022D00->unk0 = 0; + SetWordTaskArg(sPokemonJumpGfx->taskId, 0, (u32) func); + sPokemonJumpGfx->mainState = 0; + sPokemonJumpGfx->funcFinished = FALSE; } -static void sub_802D12C(u8 taskId) +static void Task_RunPokeJumpGfxFunc(u8 taskId) { - if (!gUnknown_02022D00->unk0) + if (!sPokemonJumpGfx->funcFinished) { + // Read the function set in the data by SetUpPokeJumpGfxFunc void (*func)(void) = (void *)(GetWordTaskArg(taskId, 0)); func(); } } -static void sub_802D150(void) +static void LoadPokeJumpGfx(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_082FE164, ARRAY_COUNT(gUnknown_082FE164)); - InitWindows(gUnknown_082FE174); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + InitWindows(sWindowTemplates); ResetTempTileDataBuffers(); - sub_802C974(gUnknown_02022D00); - sub_802DD08(); - LoadPalette(gPkmnJumpBgPal, 0, 0x20); - DecompressAndCopyTileDataToVram(3, gPkmnJumpBgGfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(3, gPkmnJumpBgTilemap, 0, 0, 1); - LoadPalette(gPkmnJumpVenusaurPal, 0x30, 0x20); - DecompressAndCopyTileDataToVram(2, gPkmnJumpVenusaurGfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(2, gPkmnJumpVenusaurTilemap, 0, 0, 1); - LoadPalette(gPkmnJumpResultsPal, 0x10, 0x20); - DecompressAndCopyTileDataToVram(1, gPkmnJumpResultsGfx, 0, 0, 0); - DecompressAndCopyTileDataToVram(1, gPkmnJumpResultsTilemap, 0, 0, 1); - LoadPalette(gPkmnJumpPal3, 0x20, 0x20); - SetBgTilemapBuffer(0, gUnknown_02022D00->tilemapBuffer); - FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); - sub_802DB8C(); - sub_802DD64(0); + LoadSpriteSheetsAndPalettes(sPokemonJumpGfx); + InitDigitPrinters(); + LoadPalette(sBg_Pal, 0, 0x20); + DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_SCENERY, sBg_Tilemap, 0, 0, 1); + LoadPalette(sVenusaur_Pal, 0x30, 0x20); + DecompressAndCopyTileDataToVram(BG_VENUSAUR, sVenusaur_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_VENUSAUR, sVenusaur_Tilemap, 0, 0, 1); + LoadPalette(sBonuses_Pal, 0x10, 0x20); + DecompressAndCopyTileDataToVram(BG_BONUSES, sBonuses_Gfx, 0, 0, 0); + DecompressAndCopyTileDataToVram(BG_BONUSES, sBonuses_Tilemap, 0, 0, 1); + LoadPalette(sInterface_Pal, 0x20, 0x20); + SetBgTilemapBuffer(BG_INTERFACE, sPokemonJumpGfx->tilemapBuffer); + FillBgTilemapBufferRect_Palette0(BG_INTERFACE, 0, 0, 0, 0x20, 0x20); + PrintScoreSuffixes(); + PrintScore(0); sub_8098C6C(0, 1, 0xE0); - CopyBgTilemapBufferToVram(0); - CopyBgTilemapBufferToVram(2); - CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(BG_INTERFACE); + CopyBgTilemapBufferToVram(BG_VENUSAUR); + CopyBgTilemapBufferToVram(BG_BONUSES); ResetBgPositions(); - gUnknown_02022D00->unk4++; + sPokemonJumpGfx->mainState++; break; case 1: if (!FreeTempTileDataBuffersIfPossible()) { - sub_802DBF8(); - sub_802CE9C(gUnknown_02022D00); - sub_802CF50(gUnknown_02022D00, 6); - ShowBg(3); - ShowBg(0); - ShowBg(2); - HideBg(1); - gUnknown_02022D00->unk4++; + CreateJumpMonSprites(); + CreateVineSprites(sPokemonJumpGfx); + UpdateVineAnim(sPokemonJumpGfx, VINE_UPSWING_LOWER); + ShowBg(BG_SCENERY); + ShowBg(BG_INTERFACE); + ShowBg(BG_VENUSAUR); + HideBg(BG_BONUSES); + sPokemonJumpGfx->mainState++; } break; case 2: - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D2E4(void) +static void PrintPlayerNamesNoHighlight(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - sub_802DE1C(); - gUnknown_02022D00->unk4++; + AddPlayerNameWindows(); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_802DF70(FALSE); - gUnknown_02022D00->unk4++; + PrintPokeJumpPlayerNames(FALSE); + sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_802DFD4(); - gUnknown_02022D00->unk4++; + DrawPlayerNameWindows(); + sPokemonJumpGfx->mainState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D350(void) +static void PrintPlayerNamesWithHighlight(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - sub_802DE1C(); - gUnknown_02022D00->unk4++; + AddPlayerNameWindows(); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_802DF70(TRUE); - gUnknown_02022D00->unk4++; + PrintPokeJumpPlayerNames(TRUE); + sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_802DFD4(); - gUnknown_02022D00->unk4++; + DrawPlayerNameWindows(); + sPokemonJumpGfx->mainState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D3BC(void) +static void ErasePlayerNames(void) { int i, numPlayers; - numPlayers = sub_802C8AC(); - switch (gUnknown_02022D00->unk4) + numPlayers = GetNumPokeJumpPlayers(); + switch (sPokemonJumpGfx->mainState) { case 0: for (i = 0; i < numPlayers; i++) - ClearWindowTilemap(gUnknown_02022D00->unk1C[i]); + ClearWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unk4++; + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { for (i = 0; i < numPlayers; i++) - RemoveWindow(gUnknown_02022D00->unk1C[i]); + RemoveWindow(sPokemonJumpGfx->nameWindowIds[i]); - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; } break; } } -static void sub_802D448(void) +static void Msg_WantToPlayAgain(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - gUnknown_02022D00->unk12 = sub_802DA9C(1, 8, 20, 2); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_WantToPlayAgain2, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk4++; + sPokemonJumpGfx->msgWindowId = AddMessageWindow(1, 8, 20, 2); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, gText_WantToPlayAgain2, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022D00->unk12); - DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14); - sub_802DB18(23, 7, 0); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unk4++; + PutWindowTilemap(sPokemonJumpGfx->msgWindowId); + DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); + CreatePokeJumpYesNoMenu(23, 7, 0); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D4F4(void) +static void Msg_SavingDontTurnOff(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - gUnknown_02022D00->unk12 = sub_802DA9C(2, 7, 26, 4); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_SavingDontTurnOffPower, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk4++; + sPokemonJumpGfx->msgWindowId = AddMessageWindow(2, 7, 26, 4); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, gText_SavingDontTurnOffPower, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022D00->unk12); - DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unk4++; + PutWindowTilemap(sPokemonJumpGfx->msgWindowId); + DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D598(void) +static void EraseMessage(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - sub_802DA14(); + ClearMessageWindow(); sub_8198C78(); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unk4++; + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->mainState++; break; case 1: - if (!sub_802DA44() && !IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + if (!RemoveMessageWindow() && !IsDma3ManagerBusyWithBgCopy()) + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D5E4(void) +static void Msg_SomeoneDroppedOut(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - gUnknown_02022D00->unk12 = sub_802DA9C(2, 8, 22, 4); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_SomeoneDroppedOut2, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk4++; + sPokemonJumpGfx->msgWindowId = AddMessageWindow(2, 8, 22, 4); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, gText_SomeoneDroppedOut2, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022D00->unk12); - DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unk4++; + PutWindowTilemap(sPokemonJumpGfx->msgWindowId); + DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D688(void) +static void Msg_CommunicationStandby(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - gUnknown_02022D00->unk12 = sub_802DA9C(7, 10, 16, 2); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gText_CommunicationStandby4, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk4++; + sPokemonJumpGfx->msgWindowId = AddMessageWindow(7, 10, 16, 2); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, gText_CommunicationStandby4, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->mainState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022D00->unk12); - DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unk4++; + PutWindowTilemap(sPokemonJumpGfx->msgWindowId); + DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->mainState++; } break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) - gUnknown_02022D00->unk0 = 1; + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D72C(void) +static void DoPokeJumpCountdown(void) { - switch (gUnknown_02022D00->unk4) + switch (sPokemonJumpGfx->mainState) { case 0: - sub_802D044(gUnknown_02022D00); - gUnknown_02022D00->unk4++; + StartPokeJumpCountdown(sPokemonJumpGfx); + sPokemonJumpGfx->mainState++; break; case 1: - if (!sub_802D068()) - gUnknown_02022D00->unk0 = 1; + if (!IsPokeJumpCountdownRunning()) + sPokemonJumpGfx->funcFinished = TRUE; break; } } -static void sub_802D764(void) +static void SetUpResetVineGfx(void) { - gUnknown_02022D00->unkA = 0; - gUnknown_02022D00->unkB = 0; - gUnknown_02022D00->unkC = 6; - sub_802DC9C(gUnknown_02022D00->unkC); + sPokemonJumpGfx->resetVineState = 0; + sPokemonJumpGfx->resetVineTimer = 0; + sPokemonJumpGfx->vineState = VINE_UPSWING_LOWER; + UpdateVineSwing(sPokemonJumpGfx->vineState); } -static bool32 sub_802D788(void) +static bool32 ResetVineGfx(void) { - switch (gUnknown_02022D00->unkA) + switch (sPokemonJumpGfx->resetVineState) { case 0: - gUnknown_02022D00->unkB++; - if (gUnknown_02022D00->unkB > 10) + sPokemonJumpGfx->resetVineTimer++; + if (sPokemonJumpGfx->resetVineTimer > 10) { - gUnknown_02022D00->unkB = 0; - gUnknown_02022D00->unkC++; - if (gUnknown_02022D00->unkC >= 10) + sPokemonJumpGfx->resetVineTimer = 0; + sPokemonJumpGfx->vineState++; + if (sPokemonJumpGfx->vineState >= NUM_VINESTATES) { - gUnknown_02022D00->unkC = 0; - gUnknown_02022D00->unkA++; + sPokemonJumpGfx->vineState = VINE_HIGHEST; + sPokemonJumpGfx->resetVineState++; } } - sub_802DC9C(gUnknown_02022D00->unkC); - if (gUnknown_02022D00->unkC != 7) + UpdateVineSwing(sPokemonJumpGfx->vineState); + if (sPokemonJumpGfx->vineState != VINE_UPSWING_LOW) break; case 1: return FALSE; @@ -3263,74 +3478,74 @@ static bool32 sub_802D788(void) return TRUE; } -static void sub_802D7E8(u16 itemId, u16 quantity) +static void PrintPrizeMessage(u16 itemId, u16 quantity) { - CopyItemNameHandlePlural(itemId, gUnknown_02022D00->txtBuff[0], quantity); - ConvertIntToDecimalStringN(gUnknown_02022D00->txtBuff[1], quantity, STR_CONV_MODE_LEFT_ALIGN, 1); + CopyItemNameHandlePlural(itemId, sPokemonJumpGfx->itemName, quantity); + ConvertIntToDecimalStringN(sPokemonJumpGfx->itemQuantityStr, quantity, STR_CONV_MODE_LEFT_ALIGN, 1); DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_02022D00->txtBuff[0]); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_02022D00->txtBuff[1]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022D00->strBuff, gText_AwesomeWonF701F700); - gUnknown_02022D00->unk12 = sub_802DA9C(4, 8, 22, 4); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gUnknown_02022D00->strBuff, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk14 = MUS_LEVEL_UP; - gUnknown_02022D00->unkD = 0; + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, sPokemonJumpGfx->itemQuantityStr); + DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_AwesomeWonF701F700); + sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 8, 22, 4); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, sPokemonJumpGfx->prizeMsg, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->fanfare = MUS_LEVEL_UP; + sPokemonJumpGfx->msgWindowState = 0; } -static void sub_802D884(u16 itemId) +static void PrintPrizeFilledBagMessage(u16 itemId) { - CopyItemName(itemId, gUnknown_02022D00->txtBuff[0]); + CopyItemName(itemId, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_02022D00->txtBuff[0]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022D00->strBuff, gText_FilledStorageSpace2); - gUnknown_02022D00->unk12 = sub_802DA9C(4, 8, 22, 4); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gUnknown_02022D00->strBuff, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk14 = 0; - gUnknown_02022D00->unkD = 0; + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName); + DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_FilledStorageSpace2); + sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 8, 22, 4); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, sPokemonJumpGfx->prizeMsg, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->fanfare = MUS_DUMMY; + sPokemonJumpGfx->msgWindowState = 0; } -static void sub_802D8FC(u16 itemId) +static void PrintNoRoomForPrizeMessage(u16 itemId) { - CopyItemName(itemId, gUnknown_02022D00->txtBuff[0]); + CopyItemName(itemId, sPokemonJumpGfx->itemName); DynamicPlaceholderTextUtil_Reset(); - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_02022D00->txtBuff[0]); - DynamicPlaceholderTextUtil_ExpandPlaceholders(gUnknown_02022D00->strBuff, gText_CantHoldMore); - gUnknown_02022D00->unk12 = sub_802DA9C(4, 9, 22, 2); - AddTextPrinterParameterized(gUnknown_02022D00->unk12, 1, gUnknown_02022D00->strBuff, 0, 1, TEXT_SPEED_FF, NULL); - CopyWindowToVram(gUnknown_02022D00->unk12, 2); - gUnknown_02022D00->unk14 = 0; - gUnknown_02022D00->unkD = 0; + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPokemonJumpGfx->itemName); + DynamicPlaceholderTextUtil_ExpandPlaceholders(sPokemonJumpGfx->prizeMsg, gText_CantHoldMore); + sPokemonJumpGfx->msgWindowId = AddMessageWindow(4, 9, 22, 2); + AddTextPrinterParameterized(sPokemonJumpGfx->msgWindowId, 1, sPokemonJumpGfx->prizeMsg, 0, 1, TEXT_SPEED_FF, NULL); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 2); + sPokemonJumpGfx->fanfare = MUS_DUMMY; + sPokemonJumpGfx->msgWindowState = 0; } -static bool32 sub_802D974(void) +static bool32 DoPrizeMessageAndFanfare(void) { - switch (gUnknown_02022D00->unkD) + switch (sPokemonJumpGfx->msgWindowState) { case 0: if (!IsDma3ManagerBusyWithBgCopy()) { - PutWindowTilemap(gUnknown_02022D00->unk12); - DrawTextBorderOuter(gUnknown_02022D00->unk12, 1, 14); - CopyBgTilemapBufferToVram(0); - gUnknown_02022D00->unkD++; + PutWindowTilemap(sPokemonJumpGfx->msgWindowId); + DrawTextBorderOuter(sPokemonJumpGfx->msgWindowId, 1, 14); + CopyBgTilemapBufferToVram(BG_INTERFACE); + sPokemonJumpGfx->msgWindowState++; } break; case 1: if (IsDma3ManagerBusyWithBgCopy()) break; - if (gUnknown_02022D00->unk14 == 0) + if (sPokemonJumpGfx->fanfare == MUS_DUMMY) { - gUnknown_02022D00->unkD += 2; + sPokemonJumpGfx->msgWindowState += 2; return FALSE; } - PlayFanfare(gUnknown_02022D00->unk14); - gUnknown_02022D00->unkD++; + PlayFanfare(sPokemonJumpGfx->fanfare); + sPokemonJumpGfx->msgWindowState++; case 2: if (!IsFanfareTaskInactive()) break; - gUnknown_02022D00->unkD++; + sPokemonJumpGfx->msgWindowState++; case 3: return FALSE; } @@ -3338,52 +3553,50 @@ static bool32 sub_802D974(void) return TRUE; } -static void sub_802DA14(void) +static void ClearMessageWindow(void) { - if (gUnknown_02022D00->unk12 != 0xFF) + if (sPokemonJumpGfx->msgWindowId != WINDOW_NONE) { - rbox_fill_rectangle(gUnknown_02022D00->unk12); - CopyWindowToVram(gUnknown_02022D00->unk12, 1); - gUnknown_02022D00->unkD = 0; + rbox_fill_rectangle(sPokemonJumpGfx->msgWindowId); + CopyWindowToVram(sPokemonJumpGfx->msgWindowId, 1); + sPokemonJumpGfx->msgWindowState = 0; } } -// Can't match this without the ugly GOTO, oh well. -static bool32 sub_802DA44(void) +static bool32 RemoveMessageWindow(void) { - if (gUnknown_02022D00->unk12 == 0xFF) - { - RET_FALSE: + if (sPokemonJumpGfx->msgWindowId == WINDOW_NONE) return FALSE; - } - if (gUnknown_02022D00->unkD == 0) + switch (sPokemonJumpGfx->msgWindowState) { + case 0: if (!IsDma3ManagerBusyWithBgCopy()) { - RemoveWindow(gUnknown_02022D00->unk12); - gUnknown_02022D00->unk12 = 0xFF; - gUnknown_02022D00->unkD++; - goto RET_FALSE; + RemoveWindow(sPokemonJumpGfx->msgWindowId); + sPokemonJumpGfx->msgWindowId = WINDOW_NONE; + sPokemonJumpGfx->msgWindowState++; } + else + break; + case 1: + return FALSE; } - else if (gUnknown_02022D00->unkD == 1) - goto RET_FALSE; return TRUE; } -static s8 sub_802DA8C(void) +static s8 HandlePlayAgainInput(void) { return Menu_ProcessInputNoWrapClearOnChoose(); } -static u32 sub_802DA9C(u32 left, u32 top, u32 width, u32 height) +static u32 AddMessageWindow(u32 left, u32 top, u32 width, u32 height) { u32 windowId; struct WindowTemplate window; - window.bg = 0; + window.bg = BG_INTERFACE; window.tilemapLeft = left; window.tilemapTop = top; window.width = width; @@ -3396,12 +3609,12 @@ static u32 sub_802DA9C(u32 left, u32 top, u32 width, u32 height) return windowId; } -static void sub_802DB18(u16 left, u16 top, u8 cursorPos) +static void CreatePokeJumpYesNoMenu(u16 left, u16 top, u8 cursorPos) { struct WindowTemplate window; u8 a = cursorPos; - window.bg = 0; + window.bg = BG_INTERFACE; window.tilemapLeft = left; window.tilemapTop = top; window.width = 6; @@ -3412,171 +3625,212 @@ static void sub_802DB18(u16 left, u16 top, u8 cursorPos) CreateYesNoMenu(&window, 1, 0xD, a); } -static void sub_802DB8C(void) +// "Points" for jump score and "times" for number of jumps in a row +static void PrintScoreSuffixes(void) { - u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; + u8 color[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; - PutWindowTilemap(0); - PutWindowTilemap(1); - FillWindowPixelBuffer(0, 0); - FillWindowPixelBuffer(1, 0); - AddTextPrinterParameterized3(0, 0, 0, 1, color, 0, gText_SpacePoints2); - AddTextPrinterParameterized3(1, 0, 0, 1, color, 0, gText_SpaceTimes3); + PutWindowTilemap(WIN_POINTS); + PutWindowTilemap(WIN_TIMES); + FillWindowPixelBuffer(WIN_POINTS, 0); + FillWindowPixelBuffer(WIN_TIMES, 0); + AddTextPrinterParameterized3(WIN_POINTS, 0, 0, 1, color, 0, gText_SpacePoints2); + AddTextPrinterParameterized3(WIN_TIMES, 0, 0, 1, color, 0, gText_SpaceTimes3); } -static const u8 gUnknown_082FE1DF[] = {2, 2, 0, 0, 1, 1, 1, 0, 0, 2, 0, 0, 0}; +// The venusaurs in the background are actually an empty 256x512 bg with 3 pairs of venusaurs on it. +// The below array is used to get values for where to set the bg Y to show the corresponding +// venusaur pair in their state of swinging the vine rope +// NEUTRAL/DOWN/UP refers to which direction the Venusaur is facing as it swings the vine +enum { + VENUSAUR_NEUTRAL, + VENUSAUR_DOWN, + VENUSAUR_UP, +}; + +static const u8 sVenusaurStates[] = { + [VINE_HIGHEST] = VENUSAUR_UP, + [VINE_DOWNSWING_HIGHER] = VENUSAUR_UP, + [VINE_DOWNSWING_HIGH] = VENUSAUR_NEUTRAL, + [VINE_DOWNSWING_LOW] = VENUSAUR_NEUTRAL, + [VINE_DOWNSWING_LOWER] = VENUSAUR_DOWN, + [VINE_LOWEST] = VENUSAUR_DOWN, + [VINE_UPSWING_LOWER] = VENUSAUR_DOWN, + [VINE_UPSWING_LOW] = VENUSAUR_NEUTRAL, + [VINE_UPSWING_HIGH] = VENUSAUR_NEUTRAL, + [VINE_UPSWING_HIGHER] = VENUSAUR_UP, +}; -static const struct CompressedSpriteSheet gUnknown_082FE1EC = {gUnknown_082FF1F8, 0, 0x320}; -static const struct SpritePalette gUnknown_082FE1F4 = {gUnknown_082FF1D8, 0x320}; +static const struct CompressedSpriteSheet sSpriteSheet_Digits = {gMinigameDigits_Gfx, 0, TAG_DIGITS}; +static const struct SpritePalette sSpritePalette_Digits = {gMinigameDigits_Pal, TAG_DIGITS}; -static const u16 gUnknown_082FE1FC[] = {0x06, 0x08, 0x10, 0x08}; -static const u16 gUnknown_082FE204[] = {0x06, 0x08, 0x0b, 0x06, 0x10, 0x08}; -static const u16 gUnknown_082FE210[] = {0x02, 0x06, 0x06, 0x08, 0x10, 0x08, 0x14, 0x06}; -static const u16 gUnknown_082FE220[] = {0x02, 0x06, 0x06, 0x08, 0x0b, 0x06, 0x10, 0x08, 0x14, 0x06}; +static const u16 sPlayerNameWindowCoords_2Players[] = { + 6, 8, + 16, 8 +}; +static const u16 sPlayerNameWindowCoords_3Players[] = { + 6, 8, + 11, 6, + 16, 8 +}; +static const u16 sPlayerNameWindowCoords_4Players[] = { + 2, 6, + 6, 8, + 16, 8, + 20, 6 +}; +static const u16 sPlayerNameWindowCoords_5Players[] = { + 2, 6, + 6, 8, + 11, 6, + 16, 8, + 20, 6 +}; -static const u16 *const gUnknown_082FE234[] = +static const u16 *const sPlayerNameWindowCoords[MAX_RFU_PLAYERS - 1] = { - gUnknown_082FE1FC, - gUnknown_082FE204, - gUnknown_082FE210, - gUnknown_082FE220, + sPlayerNameWindowCoords_2Players, + sPlayerNameWindowCoords_3Players, + sPlayerNameWindowCoords_4Players, + sPlayerNameWindowCoords_5Players, }; -static const s16 gUnknown_082FE244[] = {0x0058, 0x0098}; -static const s16 gUnknown_082FE248[] = {0x0058, 0x0078, 0x0098}; -static const s16 gUnknown_082FE24E[] = {0x0038, 0x0058, 0x0098, 0x00b8}; -static const s16 gUnknown_082FE256[] = {0x0038, 0x0058, 0x0078, 0x0098, 0x00b8}; +static const s16 sMonXCoords_2Players[] = {88, 152}; +static const s16 sMonXCoords_3Players[] = {88, 120, 152}; +static const s16 sMonXCoords_4Players[] = {56, 88, 152, 184}; +static const s16 sMonXCoords_5Players[] = {56, 88, 120, 152, 184}; -static const s16 *const gUnknown_082FE260[] = +static const s16 *const sMonXCoords[MAX_RFU_PLAYERS - 1] = { - gUnknown_082FE244, - gUnknown_082FE248, - gUnknown_082FE24E, - gUnknown_082FE256, + sMonXCoords_2Players, + sMonXCoords_3Players, + sMonXCoords_4Players, + sMonXCoords_5Players, }; -static void sub_802DBF8(void) +static void CreateJumpMonSprites(void) { - int i, y, playersCount = sub_802C8AC(); - const s16 *xCoords = gUnknown_082FE260[playersCount - 2]; + int i, y, playersCount = GetNumPokeJumpPlayers(); + const s16 *xCoords = sMonXCoords[playersCount - 2]; for (i = 0; i < playersCount; i++) { - struct PokemonJump1_MonInfo *info = sub_802C8C8(i); + struct PokemonJump_MonInfo *monInfo = GetMonInfoByMultiplayerId(i); - y = gMonFrontPicCoords[info->species].y_offset; - sub_802C9D4(gUnknown_02022D00, info, *xCoords, y + 112, i); - sub_802CE48(gUnknown_02022D00, *xCoords, 112, i); + y = gMonFrontPicCoords[monInfo->species].y_offset; + CreateJumpMonSprite(sPokemonJumpGfx, monInfo, *xCoords, y + 112, i); + CreateStarSprite(sPokemonJumpGfx, *xCoords, 112, i); xCoords++; } } -static void sub_802DC80(u32 id, s16 y) +static void SetMonSpriteY(u32 id, s16 y) { - gUnknown_02022D00->unk81A8[id]->pos2.y = y; + sPokemonJumpGfx->monSprites[id]->pos2.y = y; } -static void sub_802DC9C(int id) +static void UpdateVineSwing(int vineState) { - sub_802CF50(gUnknown_02022D00, id); - ChangeBgY(2, (gUnknown_082FE1DF[id] * 5) << 0xD, 0); + UpdateVineAnim(sPokemonJumpGfx, vineState); + ChangeBgY(BG_VENUSAUR, (sVenusaurStates[vineState] * 5) << 13, 0); } -static int sub_802DCCC(u8 flags) +static int DoSameJumpTimeBonus(u8 flags) { - int i, count; + int i, numPlayers; - for (i = 0, count = 0; i < 5; i++) + for (i = 0, numPlayers = 0; i < MAX_RFU_PLAYERS; i++) { if (flags & 1) { - sub_802CB14(gUnknown_02022D00, i); - count++; + // Player was part of a synchronous jump + // Give a bonus to them + DoStarAnim(sPokemonJumpGfx, i); + numPlayers++; } flags >>= 1; } - sub_802E00C(count - 2); - return count; + ShowBonus(numPlayers - 2); + return numPlayers; } -static void sub_802DD08(void) +static void InitDigitPrinters(void) { - struct DigitObjUtilTemplate template; - struct DigitObjUtilTemplate *ptr = &template; // This temp variable is needed to match, don't ask me why. - - ptr->shape = SPRITE_SHAPE(8x8); - ptr->size = SPRITE_SIZE(8x8); - ptr->strConvMode = 0; - ptr->priority = 1; - ptr->oamCount = 5; - ptr->xDelta = 8; - ptr->x = 108; - ptr->y = 6; - ptr->spriteSheet = (void*) &gUnknown_082FE1EC; - ptr->spritePal = &gUnknown_082FE1F4; + struct DigitObjUtilTemplate template = { + .shape = SPRITE_SHAPE(8x8), + .size = SPRITE_SIZE(8x8), + .strConvMode = 0, + .priority = 1, + .oamCount = 5, + .xDelta = 8, + .x = 108, + .y = 6, + .spriteSheet = (void*) &sSpriteSheet_Digits, + .spritePal = &sSpritePalette_Digits, + }; - DigitObjUtil_Init(2); - DigitObjUtil_CreatePrinter(0, 0, ptr); + DigitObjUtil_Init(NUM_WINDOWS); + DigitObjUtil_CreatePrinter(WIN_POINTS, 0, &template); template.oamCount = 4; template.x = 30; template.y = 6; - DigitObjUtil_CreatePrinter(1, 0, &template); + DigitObjUtil_CreatePrinter(WIN_TIMES, 0, &template); } -static void sub_802DD64(int arg0) +static void PrintScore(int num) { - DigitObjUtil_PrintNumOn(0, arg0); + DigitObjUtil_PrintNumOn(WIN_POINTS, num); } -static void sub_802DD74(u16 arg0) +static void PrintJumpsInRow(u16 num) { - DigitObjUtil_PrintNumOn(1, arg0); + DigitObjUtil_PrintNumOn(WIN_TIMES, num); } -static void sub_802DD88(u8 multiplayerId) +static void StartMonHitShake(u8 multiplayerId) { - sub_802CBF0(gUnknown_02022D00, multiplayerId); + Gfx_StartMonHitShake(sPokemonJumpGfx, multiplayerId); } -static void sub_802DDA0(u8 multiplayerId) +static void StartMonHitFlash(u8 multiplayerId) { - sub_802CC88(gUnknown_02022D00, multiplayerId); + Gfx_StartMonHitFlash(sPokemonJumpGfx, multiplayerId); } -static int sub_802DDB8(int multiplayerId) +static int IsMonHitShakeActive(int multiplayerId) { - return sub_802CC18(gUnknown_02022D00, multiplayerId); + return Gfx_IsMonHitShakeActive(sPokemonJumpGfx, multiplayerId); } -static void sub_802DDCC(void) +static void StopMonHitFlash(void) { - sub_802CCB0(gUnknown_02022D00); + Gfx_StopMonHitFlash(sPokemonJumpGfx); } -static void sub_802DDE0(void) +static void ResetMonSpriteSubpriorities(void) { - sub_802CD3C(gUnknown_02022D00); + Gfx_ResetMonSpriteSubpriorities(sPokemonJumpGfx); } -static void sub_802DDF4(int multiplayerId) +static void StartMonIntroBounce(int multiplayerId) { - sub_802CD70(gUnknown_02022D00, multiplayerId); + Gfx_StartMonIntroBounce(sPokemonJumpGfx, multiplayerId); } -static int sub_802DE08(void) +static int IsMonIntroBounceActive(void) { - return sub_802CD98(gUnknown_02022D00); + return Gfx_IsMonIntroBounceActive(sPokemonJumpGfx); } -static void sub_802DE1C(void) +static void AddPlayerNameWindows(void) { struct WindowTemplate window; - int i, playersCount = sub_802C8AC(); - const u16 *winCoords = gUnknown_082FE234[playersCount - 2]; + int i, playersCount = GetNumPokeJumpPlayers(); + const u16 *winCoords = sPlayerNameWindowCoords[playersCount - 2]; - window.bg = 0; + window.bg = BG_INTERFACE; window.width = 8; window.height = 2; window.paletteNum = 2; @@ -3586,107 +3840,108 @@ static void sub_802DE1C(void) { window.tilemapLeft = winCoords[0]; window.tilemapTop = winCoords[1]; - gUnknown_02022D00->unk1C[i] = AddWindow(&window); - ClearWindowTilemap(gUnknown_02022D00->unk1C[i]); + sPokemonJumpGfx->nameWindowIds[i] = AddWindow(&window); + ClearWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]); window.baseBlock += 0x10; winCoords += 2; } - CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(BG_INTERFACE); } -static void sub_802DED8(int multiplayerId, u8 clr1, u8 clr2, u8 clr3) +static void PrintPokeJumpPlayerName(int multiplayerId, u8 bgColor, u8 fgColor, u8 shadow) { u32 x; - u8 colors[3] = {clr1, clr2, clr3}; + u8 colors[3] = {bgColor, fgColor, shadow}; - FillWindowPixelBuffer(gUnknown_02022D00->unk1C[multiplayerId], 0); - x = 64 - GetStringWidth(1, sub_802C8E8(multiplayerId), -1); + FillWindowPixelBuffer(sPokemonJumpGfx->nameWindowIds[multiplayerId], 0); + x = 64 - GetStringWidth(1, GetPokeJumpPlayerName(multiplayerId), -1); x /= 2; - AddTextPrinterParameterized3(gUnknown_02022D00->unk1C[multiplayerId], 1, x, 1, colors, -1, sub_802C8E8(multiplayerId)); - CopyWindowToVram(gUnknown_02022D00->unk1C[multiplayerId], 2); + AddTextPrinterParameterized3(sPokemonJumpGfx->nameWindowIds[multiplayerId], 1, x, 1, colors, -1, GetPokeJumpPlayerName(multiplayerId)); + CopyWindowToVram(sPokemonJumpGfx->nameWindowIds[multiplayerId], 2); } -static void sub_802DF70(bool32 arg0) +static void PrintPokeJumpPlayerNames(bool32 highlightSelf) { - int i, var, playersCount = sub_802C8AC(); + int i, multiplayerId, playersCount = GetNumPokeJumpPlayers(); - if (!arg0) + if (!highlightSelf) { for (i = 0; i < playersCount; i++) - sub_802DED8(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); } else { - var = sub_802C8BC(); + // Highlight own name + multiplayerId = GetPokeJumpMultiplayerId(); for (i = 0; i < playersCount; i++) { - if (var != i) - sub_802DED8(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY); + if (multiplayerId != i) + PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY); else - sub_802DED8(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED); + PrintPokeJumpPlayerName(i, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED); } } } -static void sub_802DFD4(void) +static void DrawPlayerNameWindows(void) { - int i, playersCount = sub_802C8AC(); + int i, playersCount = GetNumPokeJumpPlayers(); for (i = 0; i < playersCount; i++) - PutWindowTilemap(gUnknown_02022D00->unk1C[i]); - CopyBgTilemapBufferToVram(0); + PutWindowTilemap(sPokemonJumpGfx->nameWindowIds[i]); + CopyBgTilemapBufferToVram(BG_INTERFACE); } -static void sub_802E00C(u8 arg0) +static void ShowBonus(u8 bonusId) { - gUnknown_02022D00->unk18 = 0; - ChangeBgX(1, (arg0 / 2) << 16, 0); - ChangeBgY(1, (((arg0 % 2) << 8) - 40) << 8, 0); - ShowBg(1); - CreateTask(sub_802E090, 4); + sPokemonJumpGfx->bonusTimer = 0; + ChangeBgX(BG_BONUSES, (bonusId / 2) * 256 * 256, 0); + ChangeBgY(BG_BONUSES, (((bonusId % 2) * 256) - 40) * 256, 0); + ShowBg(BG_BONUSES); + CreateTask(Task_UpdateBonus, 4); } -static bool32 sub_802E058(void) +static bool32 UpdateBonus(void) { - if (gUnknown_02022D00->unk18 >= 32) + if (sPokemonJumpGfx->bonusTimer >= 32) { return FALSE; } else { - ChangeBgY(1, 128, 1); - if (++gUnknown_02022D00->unk18 >= 32) - HideBg(1); + ChangeBgY(BG_BONUSES, 128, 1); + if (++sPokemonJumpGfx->bonusTimer >= 32) + HideBg(BG_BONUSES); return TRUE; } } -static void sub_802E090(u8 taskId) +static void Task_UpdateBonus(u8 taskId) { - if (!sub_802E058()) + if (!UpdateBonus()) DestroyTask(taskId); } struct MonInfoPacket { - u8 id; // packet id + u8 id; u16 species; u32 personality; u32 otId; }; -static void sub_802E0AC(struct PokemonJump1_MonInfo *arg0) +static void SendPacket_MonInfo(struct PokemonJump_MonInfo *monInfo) { struct MonInfoPacket packet; - packet.id = 1, - packet.species = arg0->species, - packet.otId = arg0->otId, - packet.personality = arg0->personality, + packet.id = PACKET_MON_INFO, + packet.species = monInfo->species, + packet.otId = monInfo->otId, + packet.personality = monInfo->personality, Rfu_SendPacket(&packet); } -static bool32 sub_802E0D0(int multiplayerId, struct PokemonJump1_MonInfo *arg0) +static bool32 RecvPacket_MonInfo(int multiplayerId, struct PokemonJump_MonInfo *monInfo) { struct MonInfoPacket packet; @@ -3694,180 +3949,185 @@ static bool32 sub_802E0D0(int multiplayerId, struct PokemonJump1_MonInfo *arg0) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); - if (packet.id == 1) + if (packet.id == PACKET_MON_INFO) { - arg0->species = packet.species; - arg0->otId = packet.otId; - arg0->personality = packet.personality; + monInfo->species = packet.species; + monInfo->otId = packet.otId; + monInfo->personality = packet.personality; return TRUE; } return FALSE; } -struct UnkPacket2 +struct UnusedPacket { - u8 id; // packet id - u32 unk4; - u32 unk8; + u8 id; + u32 data; + u32 filler; }; -static void sub_802E120(u32 arg0) +// Data packet that's never sent +// No function to read it either +static void SendPacket_Unused(u32 data) { - struct UnkPacket2 packet; - packet.id = 2; - packet.unk4 = arg0; + struct UnusedPacket packet; + packet.id = PACKET_UNUSED; + packet.data = data; Rfu_SendPacket(&packet); } -struct UnkPacket3 +struct LeaderStatePacket { - u8 id; // packet id - u8 unk1; - u8 unk2; - u8 unk3_0:5; - u8 unk3_1:3; - u16 unk4; - u16 unk6; - u32 unk8_0:15; - u32 unk8_1:17; + u8 id; + u8 funcId; + u8 monState; + u8 receivedBonusFlags:5; // 1 bit for each player (MAX_RFU_PLAYERS) + u8 jumpState:3; + u16 jumpTimeStart; + u16 vineTimer; + u32 jumpsInRow:15; + u32 jumpScore:17; }; -static void sub_802E138(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) -{ - struct UnkPacket3 packet; - packet.id = 3; - packet.unk8_1 = arg1->unk8; - packet.unk3_0 = arg1->unk1; - packet.unk1 = arg1->unk0; - packet.unk6 = arg1->unk2; - packet.unk8_0 = arg1->unk4; - packet.unk2 = arg0->unk10; - packet.unk3_1 = arg0->unk14; - packet.unk4 = arg0->unkE; +static void SendPacket_LeaderState(struct PokemonJump_Player *player, struct PokemonJump_CommData *comm) +{ + struct LeaderStatePacket packet; + packet.id = PACKET_LEADER_STATE; + packet.jumpScore = comm->jumpScore; + packet.receivedBonusFlags = comm->receivedBonusFlags; + packet.funcId = comm->funcId; + packet.vineTimer = comm->data; + packet.jumpsInRow = comm->jumpsInRow; + packet.monState = player->monState; + packet.jumpState = player->jumpState; + packet.jumpTimeStart = player->jumpTimeStart; Rfu_SendPacket(&packet); } -static bool32 sub_802E1BC(struct PokemonJump1_82E4 *arg0, struct PokemonJump1Sub *arg1) +// Used by group members to read the state of the group leader +static bool32 RecvPacket_LeaderState(struct PokemonJump_Player *player, struct PokemonJump_CommData *comm) { - struct UnkPacket3 packet; + struct LeaderStatePacket packet; if ((gRecvCmds[0][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[0][1], sizeof(packet)); - if (packet.id != 3) + if (packet.id != PACKET_LEADER_STATE) return FALSE; - arg1->unk8 = packet.unk8_1; - arg1->unk1 = packet.unk3_0; - arg1->unk0 = packet.unk1; - arg1->unk2 = packet.unk6; - arg1->unk4 = packet.unk8_0; - arg0->unk10 = packet.unk2; - arg0->unk14 = packet.unk3_1; - arg0->unkE = packet.unk4; + comm->jumpScore = packet.jumpScore; + comm->receivedBonusFlags = packet.receivedBonusFlags; + comm->funcId = packet.funcId; + comm->data = packet.vineTimer; + comm->jumpsInRow = packet.jumpsInRow; + player->monState = packet.monState; + player->jumpState = packet.jumpState; + player->jumpTimeStart = packet.jumpTimeStart; return TRUE; } -struct UnkPacket4 +struct MemberStatePacket { - u8 id; // packet id - u8 unk1; - u8 unk2; - u8 unk3; - u16 unk4; - u8 unk6; - u16 unk8; + u8 id; + u8 monState; + u8 jumpState; + bool8 funcFinished; + u16 jumpTimeStart; + u8 funcId; + u16 playAgainState; }; -static void sub_802E234(struct PokemonJump1_82E4 *arg0, u8 arg1, u16 arg2) +static void SendPacket_MemberState(struct PokemonJump_Player *player, u8 funcId, u16 playAgainState) { - struct UnkPacket4 packet; - packet.id = 4; - packet.unk1 = arg0->unk10; - packet.unk2 = arg0->unk14; - packet.unk3 = arg0->unk18; - packet.unk4 = arg0->unkE; - packet.unk6 = arg1; - packet.unk8 = arg2; + struct MemberStatePacket packet; + packet.id = PACKET_MEMBER_STATE; + packet.monState = player->monState; + packet.jumpState = player->jumpState; + packet.funcFinished = player->funcFinished; + packet.jumpTimeStart = player->jumpTimeStart; + packet.funcId = funcId; + packet.playAgainState = playAgainState; Rfu_SendPacket(&packet); } -static bool32 sub_802E264(struct PokemonJump1_82E4 *arg0, int multiplayerId, u8 *arg2, u16 *arg3) +// Used by the group leader to read the state of group members +static bool32 RecvPacket_MemberStateToLeader(struct PokemonJump_Player *player, int multiplayerId, u8 *funcId, u16 *playAgainState) { - struct UnkPacket4 packet; + struct MemberStatePacket packet; if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); - if (packet.id != 4) + if (packet.id != PACKET_MEMBER_STATE) return FALSE; - arg0->unk10 = packet.unk1; - arg0->unk14 = packet.unk2; - arg0->unk18 = packet.unk3; - arg0->unkE = packet.unk4; - *arg2 = packet.unk6; - *arg3 = packet.unk8; + player->monState = packet.monState; + player->jumpState = packet.jumpState; + player->funcFinished = packet.funcFinished; + player->jumpTimeStart = packet.jumpTimeStart; + *funcId = packet.funcId; + *playAgainState = packet.playAgainState; return TRUE; } -static bool32 sub_802E2D0(struct PokemonJump1_82E4 *arg0, int multiplayerId) +// Used by group members to read the state of other group members +static bool32 RecvPacket_MemberStateToMember(struct PokemonJump_Player *player, int multiplayerId) { - struct UnkPacket4 packet; + struct MemberStatePacket packet; if ((gRecvCmds[multiplayerId][0] & 0xFF00) != RFUCMD_SEND_PACKET) return FALSE; memcpy(&packet, &gRecvCmds[multiplayerId][1], sizeof(packet)); - if (packet.id != 4) + if (packet.id != PACKET_MEMBER_STATE) return FALSE; - arg0->unk10 = packet.unk1; - arg0->unk14 = packet.unk2; - arg0->unk18 = packet.unk3; - arg0->unkE = packet.unk4; + player->monState = packet.monState; + player->jumpState = packet.jumpState; + player->funcFinished = packet.funcFinished; + player->jumpTimeStart = packet.jumpTimeStart; return TRUE; } -static struct PokemonJumpResults *sub_802E32C(void) +static struct PokemonJumpRecords *GetPokeJumpRecords(void) { return &gSaveBlock2Ptr->pokeJump; } -void ResetPokeJumpResults(void) +void ResetPokemonJumpRecords(void) { - struct PokemonJumpResults *pokeJump = sub_802E32C(); - pokeJump->jumpsInRow = 0; - pokeJump->bestJumpScore = 0; - pokeJump->excellentsInRow = 0; - pokeJump->field6 = 0; - pokeJump->field8 = 0; - pokeJump->field2 = 0; + struct PokemonJumpRecords *records = GetPokeJumpRecords(); + records->jumpsInRow = 0; + records->bestJumpScore = 0; + records->excellentsInRow = 0; + records->gamesWithMaxPlayers = 0; + records->unused2 = 0; + records->unused1 = 0; } -static bool32 sub_802E354(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow) +static bool32 TryUpdateRecords(u32 jumpScore, u16 jumpsInRow, u16 excellentsInRow) { - struct PokemonJumpResults *pokeJump = sub_802E32C(); - bool32 ret = FALSE; + struct PokemonJumpRecords *records = GetPokeJumpRecords(); + bool32 newRecord = FALSE; - if (pokeJump->bestJumpScore < jumpScore && jumpScore <= 99990) - pokeJump->bestJumpScore = jumpScore, ret = TRUE; - if (pokeJump->jumpsInRow < jumpsInRow && jumpsInRow <= 9999) - pokeJump->jumpsInRow = jumpsInRow, ret = TRUE; - if (pokeJump->excellentsInRow < excellentsInRow && excellentsInRow <= 9999) - pokeJump->excellentsInRow = excellentsInRow, ret = TRUE; + if (records->bestJumpScore < jumpScore && jumpScore <= MAX_JUMP_SCORE) + records->bestJumpScore = jumpScore, newRecord = TRUE; + if (records->jumpsInRow < jumpsInRow && jumpsInRow <= MAX_JUMPS) + records->jumpsInRow = jumpsInRow, newRecord = TRUE; + if (records->excellentsInRow < excellentsInRow && excellentsInRow <= MAX_JUMPS) + records->excellentsInRow = excellentsInRow, newRecord = TRUE; - return ret; + return newRecord; } -static void sub_802E3A8(void) +static void IncrementGamesWithMaxPlayers(void) { - struct PokemonJumpResults *pokeJump = sub_802E32C(); - if (pokeJump->field6 < 9999) - pokeJump->field6++; + struct PokemonJumpRecords *records = GetPokeJumpRecords(); + if (records->gamesWithMaxPlayers < 9999) + records->gamesWithMaxPlayers++; } void ShowPokemonJumpRecords(void) @@ -3876,7 +4136,7 @@ void ShowPokemonJumpRecords(void) Task_ShowPokemonJumpRecords(taskId); } -static const struct WindowTemplate gUnknown_082FE270 = +static const struct WindowTemplate sWindowTemplate_Records = { .bg = 0, .tilemapLeft = 1, @@ -3887,7 +4147,10 @@ static const struct WindowTemplate gUnknown_082FE270 = .baseBlock = 0x1, }; -static const u8 *const gUnknown_082FE278[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow}; +static const u8 *const sRecordsTexts[] = {gText_JumpsInARow, gText_BestScore2, gText_ExcellentsInARow}; + +#define tState data[0] +#define tWindowId data[1] static void Task_ShowPokemonJumpRecords(u8 taskId) { @@ -3895,14 +4158,14 @@ static void Task_ShowPokemonJumpRecords(u8 taskId) int i, width, widthCurr; s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: - window = gUnknown_082FE270; + window = sWindowTemplate_Records; width = GetStringWidth(1, gText_PkmnJumpRecords, 0); - for (i = 0; i < ARRAY_COUNT(gUnknown_082FE278); i++) + for (i = 0; i < ARRAY_COUNT(sRecordsTexts); i++) { - widthCurr = GetStringWidth(1, gUnknown_082FE278[i], 0) + 38; + widthCurr = GetStringWidth(1, sRecordsTexts[i], 0) + 38; if (widthCurr > width) width = widthCurr; } @@ -3911,27 +4174,27 @@ static void Task_ShowPokemonJumpRecords(u8 taskId) width++; window.tilemapLeft = (30 - width) / 2; window.width = width; - data[1] = AddWindow(&window); - sub_802E500(data[1], width); - CopyWindowToVram(data[1], 3); - data[0]++; + tWindowId = AddWindow(&window); + PrintRecordsText(tWindowId, width); + CopyWindowToVram(tWindowId, 3); + tState++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) - data[0]++; + tState++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON)) { - rbox_fill_rectangle(data[1]); - CopyWindowToVram(data[1], 1); - data[0]++; + rbox_fill_rectangle(tWindowId); + CopyWindowToVram(tWindowId, 1); + tState++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - RemoveWindow(data[1]); + RemoveWindow(tWindowId); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -3939,23 +4202,26 @@ static void Task_ShowPokemonJumpRecords(u8 taskId) } } -static void sub_802E500(u16 windowId, int width) +#undef tState +#undef tWindowId + +static void PrintRecordsText(u16 windowId, int width) { int i, x; - int results[3]; - struct PokemonJumpResults *pokeJump = sub_802E32C(); - results[0] = pokeJump->jumpsInRow; - results[1] = pokeJump->bestJumpScore; - results[2] = pokeJump->excellentsInRow; + int recordNums[3]; + struct PokemonJumpRecords *records = GetPokeJumpRecords(); + recordNums[0] = records->jumpsInRow; + recordNums[1] = records->bestJumpScore; + recordNums[2] = records->excellentsInRow; LoadUserWindowBorderGfx_(windowId, 0x21D, 0xD0); DrawTextBorderOuter(windowId, 0x21D, 0xD); FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); AddTextPrinterParameterized(windowId, 1, gText_PkmnJumpRecords, GetStringCenterAlignXOffset(1, gText_PkmnJumpRecords, width * 8), 1, TEXT_SPEED_FF, NULL); - for (i = 0; i < ARRAY_COUNT(gUnknown_082FE278); i++) + for (i = 0; i < ARRAY_COUNT(sRecordsTexts); i++) { - AddTextPrinterParameterized(windowId, 1, gUnknown_082FE278[i], 0, 25 + (i * 16), TEXT_SPEED_FF, NULL); - ConvertIntToDecimalStringN(gStringVar1, results[i], STR_CONV_MODE_LEFT_ALIGN, 5); + AddTextPrinterParameterized(windowId, 1, sRecordsTexts[i], 0, 25 + (i * 16), TEXT_SPEED_FF, NULL); + ConvertIntToDecimalStringN(gStringVar1, recordNums[i], STR_CONV_MODE_LEFT_ALIGN, 5); TruncateToFirstWordOnly(gStringVar1); x = (width * 8) - GetStringWidth(1, gStringVar1, 0); AddTextPrinterParameterized(windowId, 1, gStringVar1, x, 25 + (i * 16), TEXT_SPEED_FF, NULL); diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index f8b361912..7c88e5bf1 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -36,11 +36,12 @@ 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_GIFT_RIBBON_1, MON_DATA_GIFT_RIBBON_2, MON_DATA_GIFT_RIBBON_3, - MON_DATA_GIFT_RIBBON_4, MON_DATA_GIFT_RIBBON_5, MON_DATA_GIFT_RIBBON_6, - MON_DATA_GIFT_RIBBON_7 + MON_DATA_MARINE_RIBBON, MON_DATA_LAND_RIBBON, MON_DATA_SKY_RIBBON, + MON_DATA_COUNTRY_RIBBON, MON_DATA_NATIONAL_RIBBON, MON_DATA_EARTH_RIBBON, + MON_DATA_WORLD_RIBBON }; extern const u8 gText_DecimalPoint[]; @@ -96,7 +97,7 @@ static void FormatMonSizeRecord(u8 *string, u32 size) { #ifdef UNITS_IMPERIAL //Convert size from centimeters to inches - size = (double)(size * 10) / (CM_PER_INCH * 10); + size = (f64)(size * 10) / (CM_PER_INCH * 10); #endif string = ConvertIntToDecimalStringN(string, size / 10, STR_CONV_MODE_LEFT_ALIGN, 8); @@ -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/pokemon_storage_system.c b/src/pokemon_storage_system.c index db8f3d2bb..e5720d914 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -42,20 +42,304 @@ #include "constants/rgb.h" #include "constants/songs.h" -struct WallpaperTable -{ - const u32 *tiles; - const u32 *tileMap; - const u16 *palettes; +/* + NOTE: This file is large. Some general groups of functions have + been labeled with commented headers to make navigation easier. + Search for "SECTION:" to locate them. These sections are not + hard and fast rules, but give a basic idea of where certain + types of functions are likely located. +*/ + +// PC main menu options +enum { + OPTION_WITHDRAW, + OPTION_DEPOSIT, + OPTION_MOVE_MONS, + OPTION_MOVE_ITEMS, + OPTION_EXIT, + OPTIONS_COUNT +}; + +// IDs for messages to print with PrintMessage +enum { + MSG_EXIT_BOX, + MSG_WHAT_YOU_DO, + MSG_PICK_A_THEME, + MSG_PICK_A_WALLPAPER, + MSG_IS_SELECTED, + MSG_JUMP_TO_WHICH_BOX, + MSG_DEPOSIT_IN_WHICH_BOX, + MSG_WAS_DEPOSITED, + MSG_BOX_IS_FULL, + MSG_RELEASE_POKE, + MSG_WAS_RELEASED, + MSG_BYE_BYE, + MSG_MARK_POKE, + MSG_LAST_POKE, + MSG_PARTY_FULL, + MSG_HOLDING_POKE, + MSG_WHICH_ONE_WILL_TAKE, + MSG_CANT_RELEASE_EGG, + MSG_CONTINUE_BOX, + MSG_CAME_BACK, + MSG_WORRIED, + MSG_SURPRISE, + MSG_PLEASE_REMOVE_MAIL, + MSG_IS_SELECTED2, + MSG_GIVE_TO_MON, + MSG_PLACED_IN_BAG, + MSG_BAG_FULL, + MSG_PUT_IN_BAG, + MSG_ITEM_IS_HELD, + MSG_CHANGED_TO_ITEM, + MSG_CANT_STORE_MAIL, +}; + +// IDs for how to resolve variables in the above messages +enum { + MSG_VAR_NONE, + MSG_VAR_MON_NAME_1, + MSG_VAR_MON_NAME_2, // Unused + MSG_VAR_MON_NAME_3, // Unused + MSG_VAR_RELEASE_MON_1, + MSG_VAR_RELEASE_MON_2, // Unused + MSG_VAR_RELEASE_MON_3, + MSG_VAR_ITEM_NAME, +}; + +// IDs for menu selection items. See SetMenuText, HandleMenuInput, etc +enum { + MENU_CANCEL, + MENU_STORE, + MENU_WITHDRAW, + MENU_MOVE, + MENU_SHIFT, + MENU_PLACE, + MENU_SUMMARY, + MENU_RELEASE, + MENU_MARK, + MENU_JUMP, + MENU_WALLPAPER, + MENU_NAME, + MENU_TAKE, + MENU_GIVE, + MENU_GIVE_2, + MENU_SWITCH, + MENU_BAG, + MENU_INFO, + MENU_SCENERY_1, + MENU_SCENERY_2, + MENU_SCENERY_3, + MENU_ETCETERA, + MENU_FRIENDS, + MENU_FOREST, + MENU_CITY, + MENU_DESERT, + MENU_SAVANNA, + MENU_CRAG, + MENU_VOLCANO, + MENU_SNOW, + MENU_CAVE, + MENU_BEACH, + MENU_SEAFLOOR, + MENU_RIVER, + MENU_SKY, + MENU_POLKADOT, + MENU_POKECENTER, + MENU_MACHINE, + MENU_SIMPLE, +}; +#define MENU_WALLPAPER_SETS_START MENU_SCENERY_1 +#define MENU_WALLPAPERS_START MENU_FOREST + +// Return IDs for input handlers +enum { + INPUT_NONE, + INPUT_MOVE_CURSOR, + INPUT_2, // Unused + INPUT_3, // Unused + INPUT_CLOSE_BOX, + INPUT_SHOW_PARTY, + INPUT_HIDE_PARTY, + INPUT_BOX_OPTIONS, + INPUT_IN_MENU, + INPUT_SCROLL_RIGHT, + INPUT_SCROLL_LEFT, + INPUT_DEPOSIT, + INPUT_WITHDRAW, + INPUT_MOVE_MON, + INPUT_SHIFT_MON, + INPUT_PLACE_MON, + INPUT_TAKE_ITEM, + INPUT_GIVE_ITEM, + INPUT_SWITCH_ITEMS, + INPUT_PRESSED_B, + INPUT_MULTIMOVE_START, + INPUT_MULTIMOVE_CHANGE_SELECTION, + INPUT_MULTIMOVE_SINGLE, + INPUT_MULTIMOVE_GRAB_SELECTION, + INPUT_MULTIMOVE_UNABLE, + INPUT_MULTIMOVE_MOVE_MONS, + INPUT_MULTIMOVE_PLACE_MONS, +}; + +enum { + SCREEN_CHANGE_EXIT_BOX, + SCREEN_CHANGE_SUMMARY_SCREEN, + SCREEN_CHANGE_NAME_BOX, + SCREEN_CHANGE_ITEM_FROM_BAG, +}; + +enum { + MODE_PARTY, + MODE_BOX, + MODE_MOVE, +}; + +enum { + CURSOR_AREA_IN_BOX, + CURSOR_AREA_IN_PARTY, + CURSOR_AREA_BOX_TITLE, + CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box +}; +#define CURSOR_AREA_IN_HAND CURSOR_AREA_BOX_TITLE // Alt name for cursor area used by Move Items + +enum { + CURSOR_ANIM_BOUNCE, + CURSOR_ANIM_STILL, + CURSOR_ANIM_OPEN, + CURSOR_ANIM_FIST, +}; + +// Special box ids for the choose box menu +#define BOXID_NONE_CHOSEN 200 +#define BOXID_CANCELED 201 + +enum { + PALTAG_MON_ICON_0 = 56000, + PALTAG_MON_ICON_1, // Used implicitly in CreateMonIconSprite + PALTAG_MON_ICON_2, // Used implicitly in CreateMonIconSprite + PALTAG_3, // Unused + PALTAG_4, // Unused + PALTAG_5, // Unused + PALTAG_DISPLAY_MON, + PALTAG_MISC_1, + PALTAG_MARKING_COMBO, + PALTAG_BOX_TITLE, + PALTAG_MISC_2, + PALTAG_ITEM_ICON_0, + PALTAG_ITEM_ICON_1, // Used implicitly in CreateItemIconSprites + PALTAG_ITEM_ICON_2, // Used implicitly in CreateItemIconSprites + PALTAG_MARKING_MENU, +}; + +enum { + GFXTAG_CURSOR, + GFXTAG_CURSOR_SHADOW, + GFXTAG_DISPLAY_MON, + GFXTAG_BOX_TITLE, + GFXTAG_BOX_TITLE_ALT, + GFXTAG_WAVEFORM, + GFXTAG_ARROW, + GFXTAG_ITEM_ICON_0, + GFXTAG_ITEM_ICON_1, // Used implicitly in CreateItemIconSprites + GFXTAG_ITEM_ICON_2, // Used implicitly in CreateItemIconSprites + GFXTAG_CHOOSE_BOX_MENU, + GFXTAG_CHOOSE_BOX_MENU_SIDES, // Used implicitly in LoadChooseBoxMenuGfx + GFXTAG_12, // Unused + GFXTAG_MARKING_MENU, + GFXTAG_14, // Unused + GFXTAG_15, // Unused + GFXTAG_MARKING_COMBO, + GFXTAG_17, // Unused + GFXTAG_MON_ICON, }; -struct PokemonStorageSystemFunc +// The maximum number of Pokémon icons that can appear on-screen. +// By default the limit is 40 (though in practice only 37 can be). +#define MAX_MON_ICONS (IN_BOX_COUNT + PARTY_SIZE + 1 >= 40 ? IN_BOX_COUNT + PARTY_SIZE + 1 : 40) + +// The maximum number of item icons that can appear on-screen while +// moving held items. 1 in the cursor, and 2 more while switching +// between 2 Pokémon with held items +#define MAX_ITEM_ICONS 3 + +// IDs for the item icons affine anims +enum { + ITEM_ANIM_NONE, + ITEM_ANIM_APPEAR, + ITEM_ANIM_DISAPPEAR, + ITEM_ANIM_PICK_UP, + ITEM_ANIM_PUT_DOWN, + ITEM_ANIM_PUT_AWAY, + ITEM_ANIM_LARGE, +}; + +// IDs for the item icon sprite callbacks +enum { + ITEM_CB_WAIT_ANIM, + ITEM_CB_TO_HAND, + ITEM_CB_TO_MON, + ITEM_CB_SWAP_TO_HAND, + ITEM_CB_SWAP_TO_MON, + ITEM_CB_UNUSED_1, + ITEM_CB_UNUSED_2, + ITEM_CB_HIDE_PARTY, +}; + +enum { + RELEASE_ANIM_RELEASE, + RELEASE_ANIM_CAME_BACK, +}; + +// IDs for InitMonPlaceChange +enum { + CHANGE_GRAB, + CHANGE_PLACE, + CHANGE_SHIFT, +}; + +// Modes for selecting and moving Pokémon in the box. +// "MULTIPLE" mode allows up to an entire box to be +// picked up at once by pressing Select then holding +// down the A button. While holding A down, the player +// may move the cursor around to select multiple Pokémon. +// This is MOVE_MODE_MULTIPLE_SELECTING. After releasing A +// those Pokémon will be picked up and can be moved around +// as a single unit. This is MOVE_MODE_MULTIPLE_MOVING +enum { + MOVE_MODE_NORMAL, + MOVE_MODE_MULTIPLE_SELECTING, + MOVE_MODE_MULTIPLE_MOVING, +}; + +// IDs for the main functions for moving multiple Pokémon. +// Given as arguments to MultiMove_SetFunction +enum { + MULTIMOVE_START, + MULTIMOVE_CANCEL, // If only 1 Pokémon is grabbed + MULTIMOVE_CHANGE_SELECTION, + MULTIMOVE_GRAB_SELECTION, + MULTIMOVE_MOVE_MONS, + MULTIMOVE_PLACE_MONS, +}; + +// IDs for TilemapUtil +enum { + TILEMAPID_PKMN_DATA, // The "Pkmn Data" text at the top of the display + TILEMAPID_PARTY_MENU, + TILEMAPID_CLOSE_BUTTON, + TILEMAPID_COUNT +}; + +struct Wallpaper { - u8 (*func)(void); - s8 unk4; + const u32 *tiles; + const u32 *tilemap; + const u16 *palettes; }; -struct StorageAction +struct StorageMessage { const u8 *text; u8 format; @@ -67,52 +351,46 @@ struct StorageMenu int textId; }; -struct PSS_MenuStringPtrs +struct UnkUtilData { - const u8 *text; - const u8 *desc; -}; - -struct UnkStruct_2000028 -{ - const u8 *unk_00; - u8 *unk_04; - u16 unk_08; - u16 unk_0a; - u16 newField; - void (*unk_0c)(struct UnkStruct_2000028 *data); + const u8 *src; + u8 *dest; + u16 size; + u16 unk; + u16 height; + void (*func)(struct UnkUtilData *data); }; -struct UnkStruct_2000020 +struct UnkUtil { - struct UnkStruct_2000028 *unk_00; - u8 unk_04; - u8 unk_05; + struct UnkUtilData *data; + u8 numActive; + u8 max; }; -struct UnkPSSStruct_2002370 +struct ChooseBoxMenu { - struct Sprite *unk_0000; - struct Sprite *unk_0004[4]; - u32 unk_0014[3]; - struct Sprite *unk_0020[2]; - u8 filler_0028[0x214]; - u32 unk_023c; - u16 unk_0240; - u16 unk_0242; + struct Sprite *menuSprite; + struct Sprite *menuSideSprites[4]; + u32 unused1[3]; + struct Sprite *arrowSprites[2]; + u8 unused2[0x214]; + bool32 loadedPalette; + u16 tileTag; + u16 paletteTag; u8 curBox; - u8 unk_0245; - u8 unk_0246; + u8 unused3; + u8 subpriority; }; -struct UnkStorageStruct +struct ItemIcon { struct Sprite *sprite; u8 *tiles; u16 palIndex; - u8 unk8; - u8 unk9; - u8 unk10; + u8 area; + u8 pos; + bool8 active; }; struct PokemonStorageSystemData @@ -120,611 +398,491 @@ struct PokemonStorageSystemData u8 state; u8 boxOption; u8 screenChangeType; - bool8 isReshowingPSS; + bool8 isReopening; u8 taskId; - struct UnkStruct_2000020 unk_0020; - struct UnkStruct_2000028 unk_0028[8]; - u16 field_B0[528 / 2]; - u16 field_2C0; - u16 field_2C2; - u8 field_2C4; // Unused - u8 field_2C5; + struct UnkUtil unkUtil; + struct UnkUtilData unkUtilData[8]; + u16 partyMenuTilemapBuffer[0x108]; + u16 partyMenuUnused1; // Never read + u16 partyMenuY; + u8 partyMenuUnused2; // Unused + u8 partyMenuMoveTimer; u8 showPartyMenuState; - u8 unk_02C7; - u8 unk_02C8; - bool8 unk_02C9; + bool8 closeBoxFlashing; + u8 closeBoxFlashTimer; + bool8 closeBoxFlashState; s16 newCurrBoxId; u16 bg2_X; - s16 wallpaperScrollSpeed; - u16 field_2D0; - u8 field_2D2; - u8 field_2D3; // Written to, but never read. - u8 field_2D4; // Written to, but never read. - u16 field_2D6; // Written to, but never read. - s16 field_2D8; // Written to, but never read. - u16 field_2DA; // Written to, but never read. - u16 field_2DC; // Written to, but never read. - u16 field_2DE; // Written to, but never read. - u16 field_2E0; // Written to, but never read. - u8 filler[22]; - u8 field_2F8[1024]; - u8 field_6F8; - u8 field_6F9; // Written to, but never read. - u8 field_6FA; - s8 field_6FB; - u16 field_6FC[16]; - u16 field_71C; - u16 field_71E; - struct Sprite *field_720[2]; - struct Sprite *field_728[2]; - struct Sprite *field_730[2]; - u32 field_738; - u8 field_73C[80]; // Unused - u16 field_78C; // Written to, but never read. + s16 scrollSpeed; + u16 scrollTimer; + u8 wallpaperOffset; + u8 scrollUnused1; // Never read + u8 scrollToBoxIdUnused; // Never read + u16 scrollUnused2; // Never read + s16 scrollDirectionUnused; // Never read. + u16 scrollUnused3; // Never read + u16 scrollUnused4; // Never read + u16 scrollUnused5; // Never read + u16 scrollUnused6; // Never read + u8 filler1[22]; + u8 boxTitleTiles[1024]; + u8 boxTitleCycleId; + u8 wallpaperLoadState; // Written to, but never read. + u8 wallpaperLoadBoxId; + s8 wallpaperLoadDir; + u16 boxTitlePal[16]; + u16 boxTitlePalOffset; + u16 boxTitleAltPalOffset; + struct Sprite *curBoxTitleSprites[2]; + struct Sprite *nextBoxTitleSprites[2]; + struct Sprite *arrowSprites[2]; + u32 wallpaperPalBits; + u8 filler2[80]; // Unused + u16 unkUnused1; // Never read. s16 wallpaperSetId; s16 wallpaperId; - u16 field_792[360]; + u16 wallpaperTilemap[360]; u8 wallpaperChangeState; - u8 field_A63; - u8 boxScrollDestination; - s8 field_A65; + u8 scrollState; + u8 scrollToBoxId; + s8 scrollDirection; u8 *wallpaperTiles; struct Sprite *movingMonSprite; struct Sprite *partySprites[PARTY_SIZE]; struct Sprite *boxMonsSprites[IN_BOX_COUNT]; - struct Sprite **field_B00; - struct Sprite **field_B04; - u16 field_B08[40]; - u16 field_B58[40]; + struct Sprite **shiftMonSpritePtr; + struct Sprite **releaseMonSpritePtr; + u16 numIconsPerSpecies[MAX_MON_ICONS]; + u16 iconSpeciesList[MAX_MON_ICONS]; u16 boxSpecies[IN_BOX_COUNT]; u32 boxPersonalities[IN_BOX_COUNT]; - u8 field_C5C; - u8 field_C5D; - u8 field_C5E; - u16 field_C60; - s16 field_C62; - s16 field_C64; - u16 field_C66; - u8 field_C68; - s8 field_C69; - u8 field_C6A; - u8 field_C6B; // Written to, but never read. + u8 incomingBoxId; + u8 shiftTimer; + u8 numPartyToCompact; + u16 iconScrollDistance; + s16 iconScrollPos; + s16 iconScrollSpeed; + u16 iconScrollNumIncoming; + u8 iconScrollCurColumn; + s8 iconScrollDirection; // Unnecessary duplicate of scrollDirection + u8 iconScrollState; + u8 iconScrollToBoxId; // Unnecessary duplicate of scrollToBoxId struct WindowTemplate menuWindow; struct StorageMenu menuItems[7]; u8 menuItemsCount; u8 menuWidth; - u8 field_CAE; // Written to, but never read. - u16 field_CB0; - struct Sprite *field_CB4; - struct Sprite *field_CB8; - s32 field_CBC; - s32 field_CC0; - u32 field_CC4; - u32 field_CC8; - s16 field_CCC; - s16 field_CCE; - u16 field_CD0; - s8 field_CD2; - s8 field_CD3; - u8 field_CD4; - u8 field_CD5; - u8 field_CD6; - u8 field_CD7; - u8 field_CD8[2]; - const u32 *cursorMonPalette; - u32 cursorMonPersonality; - u16 cursorMonSpecies; - u16 cursorMonItem; - u16 field_CE8; + u8 menuUnusedField; // Never read. + u16 menuWindowId; + struct Sprite *cursorSprite; + struct Sprite *cursorShadowSprite; + s32 cursorNewX; + s32 cursorNewY; + u32 cursorSpeedX; + u32 cursorSpeedY; + s16 cursorTargetX; + s16 cursorTargetY; + u16 cursorMoveSteps; + s8 cursorVerticalWrap; + s8 cursorHorizontalWrap; + u8 newCursorArea; + u8 newCursorPosition; + u8 cursorPrevHorizPos; + u8 cursorFlipTimer; + u8 cursorPalNums[2]; + const u32 *displayMonPalette; + u32 displayMonPersonality; + u16 displayMonSpecies; + u16 displayMonItemId; + u16 displayUnusedVar; bool8 setMosaic; - u8 cursorMonMarkings; - u8 cursorMonLevel; - bool8 cursorMonIsEgg; - u8 cursorMonNick[POKEMON_NAME_LENGTH + 1]; - u8 cursorMonNickText[36]; - u8 cursorMonSpeciesName[36]; - u8 cursorMonGenderLvlText[36]; - u8 cursorMonItemName[36]; + u8 displayMonMarkings; + u8 displayMonLevel; + bool8 displayMonIsEgg; + u8 displayMonName[POKEMON_NAME_LENGTH + 1]; + u8 displayMonNameText[36]; + u8 displayMonSpeciesName[36]; + u8 displayMonGenderLvlText[36]; + u8 displayMonItemName[36]; bool8 (*monPlaceChangeFunc)(void); u8 monPlaceChangeState; - u8 field_D91; - struct Sprite *field_D94; - struct Sprite *field_D98[2]; - u16 *field_DA0; - struct PokemonMarkMenu markMenu; - struct UnkPSSStruct_2002370 field_1E5C; + u8 shiftBoxId; + struct Sprite *markingComboSprite; + struct Sprite *waveformSprites[2]; + u16 *markingComboTilesPtr; + struct MonMarkingsMenu markMenu; + struct ChooseBoxMenu chooseBoxMenu; struct Pokemon movingMon; - struct Pokemon field_2108; - s8 field_216C; - u8 field_216D; - s8 field_216E; - s8 field_216F; - s8 field_2170; - s8 field_2171; - u16 field_2172; - u16 field_2174; - u16 field_2176[8]; - u8 field_2186; - u8 field_2187; - u8 pokemonSummaryScreenMode; + struct Pokemon tempMon; + s8 canReleaseMon; + bool8 releaseStatusResolved; + s8 releaseCheckBoxId; + s8 releaseCheckBoxPos; + s8 releaseBoxId; + s8 releaseBoxPos; + u16 releaseCheckState; + u16 restrictedReleaseMonMoves; + u16 restrictedMoveList[8]; + u8 summaryMaxPos; + u8 summaryStartPos; + u8 summaryScreenMode; union { struct Pokemon *mon; struct BoxPokemon *box; - } field_218C; - u8 field_2190[40]; - u8 field_21B8[40]; - u8 field_21E0[POKEMON_NAME_LENGTH + 1]; + } summaryMon; + u8 messageText[40]; + u8 boxTitleText[40]; + u8 releaseMonName[POKEMON_NAME_LENGTH + 1]; u8 itemName[20]; u8 inBoxMovingMode; - u16 field_2200; - struct UnkStorageStruct field_2204[3]; - u16 movingItem; - u16 field_2236; - u8 field_2238; // Unused - u16 field_223A; - u16 *field_223C; - struct Sprite *cursorMonSprite; - u16 field_2244[0x40]; - u8 field_22C4[0x800]; - u8 field_2AC4[0x1800]; // Unused - u8 field_42C4[0x800]; - u8 field_4AC4[0x1000]; - u8 field_5AC4[0x800]; + u16 multiMoveWindowId; + struct ItemIcon itemIcons[MAX_ITEM_ICONS]; + u16 movingItemId; + u16 itemInfoWindowOffset; + u8 unkUnused2; // Unused + u16 displayMonPalOffset; + u16 *displayMonTilePtr; + struct Sprite *displayMonSprite; + u16 displayMonPalBuffer[0x40]; + u8 tileBuffer[0x800]; + u8 unusedBuffer[0x1800]; // Unused + u8 itemIconBuffer[0x800]; + u8 wallpaperBgTilemapBuffer[0x1000]; + u8 displayMenuTilemapBuffer[0x800]; }; -struct UnkSubStruct_2039D84 -{ - s16 field_0; - s16 field_2; - u16 field_4; - u16 field_6; - s16 field_8; - s16 field_A; -}; +static u32 sItemIconGfxBuffer[98]; -struct UnkStruct_2039D84 -{ - struct UnkSubStruct_2039D84 field_0[2]; - const void *field_18; - const void *field_1C; - u16 field_20; - u16 field_22; - u16 field_24; - u16 field_26; - u16 field_28; - u8 field_2A; - u8 field_2B; - u8 field_2C; - u8 field_2D; -}; - -enum -{ - BOX_OPTION_WITHDRAW, - BOX_OPTION_DEPOSIT, - BOX_OPTION_MOVE_MONS, - BOX_OPTION_MOVE_ITEMS, - BOX_OPTION_EXIT, -}; - -enum -{ - PC_TEXT_EXIT_BOX, - PC_TEXT_WHAT_YOU_DO, - PC_TEXT_PICK_A_THEME, - PC_TEXT_PICK_A_WALLPAPER, - PC_TEXT_IS_SELECTED, - PC_TEXT_JUMP_TO_WHICH_BOX, - PC_TEXT_DEPOSIT_IN_WHICH_BOX, - PC_TEXT_WAS_DEPOSITED, - PC_TEXT_BOX_IS_FULL, - PC_TEXT_RELEASE_POKE, - PC_TEXT_WAS_RELEASED, - PC_TEXT_BYE_BYE, - PC_TEXT_MARK_POKE, - PC_TEXT_LAST_POKE, - PC_TEXT_PARTY_FULL, - PC_TEXT_HOLDING_POKE, - PC_TEXT_WHICH_ONE_WILL_TAKE, - PC_TEXT_CANT_RELEASE_EGG, - PC_TEXT_CONTINUE_BOX, - PC_TEXT_CAME_BACK, - PC_TEXT_WORRIED, - PC_TEXT_SURPRISE, - PC_TEXT_PLEASE_REMOVE_MAIL, - PC_TEXT_IS_SELECTED2, - PC_TEXT_GIVE_TO_MON, - PC_TEXT_PLACED_IN_BAG, - PC_TEXT_BAG_FULL, - PC_TEXT_PUT_IN_BAG, - PC_TEXT_ITEM_IS_HELD, - PC_TEXT_CHANGED_TO_ITEM, - PC_TEXT_CANT_STORE_MAIL, -}; - -enum -{ - PC_TEXT_FMT_NORMAL, - PC_TEXT_FMT_MON_NAME_1, - PC_TEXT_FMT_MON_NAME_2, - PC_TEXT_FMT_MON_NAME_3, - PC_TEXT_FMT_MON_NAME_4, - PC_TEXT_FMT_MON_NAME_5, - PC_TEXT_FMT_MON_NAME_6, - PC_TEXT_FMT_ITEM_NAME, -}; - -enum -{ - SCREEN_CHANGE_EXIT_BOX, - SCREEN_CHANGE_SUMMARY_SCREEN, - SCREEN_CHANGE_NAME_BOX, - SCREEN_CHANGE_ITEM_FROM_BAG, -}; - -enum -{ - MODE_PARTY, - MODE_BOX, - MODE_MOVE, -}; - -enum -{ - WALLPAPER_FOREST, - WALLPAPER_CITY, - WALLPAPER_DESERT, - WALLPAPER_SAVANNA, - WALLPAPER_CRAG, - WALLPAPER_VOLCANO, - WALLPAPER_SNOW, - WALLPAPER_CAVE, - WALLPAPER_BEACH, - WALLPAPER_SEAFLOOR, - WALLPAPER_RIVER, - WALLPAPER_SKY, - WALLPAPER_POLKADOT, - WALLPAPER_POKECENTER, - WALLPAPER_MACHINE, - WALLPAPER_PLAIN, - WALLPAPER_FRIENDS, // The one received as a gift from Walda's parents. - WALLPAPER_COUNT -}; - -enum -{ - FRIENDS_ZIGZAGOON, - FRIENDS_SCREEN, - FRIENDS_HORIZONTAL, - FRIENDS_DIAGONAL, - FRIENDS_BLOCK, - FRIENDS_RIBBON, - FRIENDS_POKECENTER2, - FRIENDS_FRAME, - FRIENDS_BLANK, - FRIENDS_CIRCLES, - FRIENDS_AZUMARILL, - FRIENDS_PIKACHU, - FRIENDS_LEGENDARY, - FRIENDS_DUSCLOPS, - FRIENDS_LUDICOLO, - FRIENDS_WHISCASH, - FRIENDS_WALLPAPERS_COUNT -}; - -enum -{ - CURSOR_AREA_IN_BOX, - CURSOR_AREA_IN_PARTY, - CURSOR_AREA_BOX, - CURSOR_AREA_BUTTONS, // Party Pokemon and Close Box -}; - -#define TAG_PAL_WAVEFORM 0xDACA -#define TAG_PAL_DAC8 0xDAC8 -#define TAG_PAL_DAC6 0xDAC6 -#define TAG_PAL_DACE 0xDACE -#define TAG_PAL_DAC7 0xDAC7 -#define TAG_PAL_DAC9 0xDAC9 -#define TAG_PAL_DAC0 0xDAC0 -#define TAG_PAL_DACB 0xDACB - -#define TAG_TILE_WAVEFORM 0x5 -#define TAG_TILE_10 0x10 -#define TAG_TILE_2 0x2 -#define TAG_TILE_D 0xD -#define TAG_TILE_A 0xA -#define TAG_TILE_3 0x3 -#define TAG_TILE_4 0x4 -#define TAG_TILE_12 0x12 -#define TAG_TILE_7 0x7 -#define TAG_TILE_0 0x0 -#define TAG_TILE_1 0x1 - -// IWRAM bss -static u32 gUnknown_03000F78[98]; - -// EWRAM DATA EWRAM_DATA static u8 sPreviousBoxOption = 0; -EWRAM_DATA static struct UnkPSSStruct_2002370 *gUnknown_02039D04 = NULL; -EWRAM_DATA static struct PokemonStorageSystemData *sPSSData = NULL; +EWRAM_DATA static struct ChooseBoxMenu *sChooseBoxMenu = NULL; +EWRAM_DATA static struct PokemonStorageSystemData *sStorage = NULL; EWRAM_DATA static bool8 sInPartyMenu = 0; EWRAM_DATA static u8 sCurrentBoxOption = 0; -EWRAM_DATA static u8 gUnknown_02039D0E = 0; +EWRAM_DATA static u8 sDepositBoxId = 0; EWRAM_DATA static u8 sWhichToReshow = 0; EWRAM_DATA static u8 sLastUsedBox = 0; EWRAM_DATA static u16 sMovingItemId = 0; -EWRAM_DATA static struct Pokemon gUnknown_02039D14 = {0}; -EWRAM_DATA static s8 sBoxCursorArea = 0; -EWRAM_DATA static s8 sBoxCursorPosition = 0; +EWRAM_DATA static struct Pokemon sSavedMovingMon = {0}; +EWRAM_DATA static s8 sCursorArea = 0; +EWRAM_DATA static s8 sCursorPosition = 0; EWRAM_DATA static bool8 sIsMonBeingMoved = 0; EWRAM_DATA static u8 sMovingMonOrigBoxId = 0; EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0; -EWRAM_DATA static bool8 sCanOnlyMove = 0; +EWRAM_DATA static bool8 sAutoActionOn = 0; + +// Main tasks +static void EnterPokeStorage(u8); +static void Task_InitPokeStorage(u8); +static void Task_PlaceMon(u8); +static void Task_ChangeScreen(u8); +static void Task_ShowPokeStorage(u8); +static void Task_OnBPressed(u8); +static void Task_HandleBoxOptions(u8); +static void Task_OnSelectedMon(u8); +static void Task_OnCloseBoxPressed(u8); +static void Task_HidePartyPokemon(u8); +static void Task_DepositMenu(u8); +static void Task_MoveMon(u8); +static void Task_GiveMovingItemToMon(u8); +static void Task_SwitchSelectedItem(u8); +static void Task_TakeItemForMoving(u8); +static void Task_WithdrawMon(u8); +static void Task_ShiftMon(u8); +static void Task_ShowPartyPokemon(u8); +static void Task_ShowItemInfo(u8); +static void Task_GiveItemFromBag(u8); +static void Task_ItemToBag(u8); +static void Task_TakeItemForMoving(u8); +static void Task_ShowMarkMenu(u8); +static void Task_ShowMonSummary(u8); +static void Task_ReleaseMon(u8); +static void Task_ReshowPokeStorage(u8); +static void Task_PokeStorageMain(u8); +static void Task_JumpBox(u8); +static void Task_HandleWallpapers(u8); +static void Task_NameBox(u8); +static void Task_PrintCantStoreMail(u8); +static void Task_HandleMovingMonFromParty(u8); + +// Input handlers +static u8 InBoxInput_Normal(void); +static u8 InBoxInput_MovingMultiple(void); +static u8 InBoxInput_SelectingMultiple(void); +static u8 HandleInput(void); +static void AddBoxOptionsMenu(void); +static u8 SetSelectionMenuTexts(void); +static bool8 SetMenuTexts_Mon(void); +static bool8 SetMenuTexts_Item(void); + +// Choose box menu +static void ChooseBoxMenu_CreateSprites(u8); +static void ChooseBoxMenu_DestroySprites(void); +static void ChooseBoxMenu_MoveLeft(void); +static void ChooseBoxMenu_MoveRight(void); +static void ChooseBoxMenu_PrintInfo(void); +static void SpriteCB_ChooseBoxArrow(struct Sprite *); + +// Options menus +static void InitMenu(void); +static void SetMenuText(u8); +static s8 GetMenuItemTextId(u8); +static void AddMenu(void); +static bool8 IsMenuLoading(void); +static s16 HandleMenuInput(void); +static void RemoveMenu(void); + +// Pokémon sprites +static void InitMonIconFields(void); +static void SpriteCB_BoxMonIconScrollOut(struct Sprite *); +static void GetIncomingBoxMonData(u8); +static void CreatePartyMonsSprites(bool8); +static void CompactPartySprites(void); +static u8 GetNumPartySpritesCompacting(void); +static void MovePartySpriteToNextSlot(struct Sprite *, u16); +static void SpriteCB_MovePartyMonToNextSlot(struct Sprite *); +static void MovePartySprites(s16); +static void DestroyAllPartyMonIcons(void); +static void ReshowReleaseMon(void); +static bool8 ResetReleaseMonSpritePtr(void); +static void SetMovingMonPriority(u8); +static void SpriteCB_HeldMon(struct Sprite *); +static struct Sprite *CreateMonIconSprite(u16, u32, s16, s16, u8, u8); +static void DestroyBoxMonIcon(struct Sprite *); + +// Pokémon data +static void MoveMon(void); +static void PlaceMon(void); +static void RefreshDisplayMon(void); +static void SetMovingMonData(u8, u8); +static void SetPlacedMonData(u8, u8); +static void PurgeMonOrBoxMon(u8, u8); +static void SetShiftedMonData(u8, u8); +static bool8 TryStorePartyMonInBox(u8); +static void ResetSelectionAfterDeposit(void); +static void InitReleaseMon(void); +static bool8 TryHideReleaseMon(void); +static void InitCanReleaseMonVars(void); +static void ReleaseMon(void); +static bool32 AtLeastThreeUsableMons(void); +static s8 RunCanReleaseMon(void); +static void SaveMovingMon(void); +static void LoadSavedMovingMon(void); +static void InitSummaryScreenData(void); +static void SetSelectionAfterSummaryScreen(void); +static void SetMonMarkings(u8); +static bool8 IsRemovingLastPartyMon(void); +static bool8 CanShiftMon(void); +static bool8 IsMonBeingMoved(void); +static void TryRefreshDisplayMon(void); +static void ReshowDisplayMon(void); +static void SetDisplayMonData(void *, u8); + +// Moving multiple Pokémon at once +static void MultiMove_Free(void); +static bool8 MultiMove_Init(void); +static bool8 MultiMove_RunFunction(void); +static bool8 MultiMove_TryMoveGroup(u8); +static bool8 MultiMove_CanPlaceSelection(void); +static void MultiMove_SetFunction(u8); +static u8 MultiMove_GetOrigin(void); +static bool8 MultiMove_Start(void); +static bool8 MultiMove_Cancel(void); +static bool8 MultiMove_ChangeSelection(void); +static bool8 MultiMove_GrabSelection(void); +static bool8 MultiMove_MoveMons(void); +static bool8 MultiMove_PlaceMons(void); +static void MultiMove_SetIconToBg(u8, u8); +static void MultiMove_ClearIconFromBg(u8, u8); +static void MultiMove_ResetBg(void); +static void MultiMove_UpdateSelectedIcons(void); +static void MultiMove_InitMove(u16, u16, u16); +static void MultiMove_GetMonsFromSelection(void); +static void MultiMove_RemoveMonsFromBox(void); +static void MultiMove_CreatePlacedMonIcons(void); +static void MultiMove_SetPlacedMonData(void); +static u8 MultiMove_UpdateMove(void); +static void MultiMove_DeselectRow(u8, u8, u8); +static void MultiMove_SelectRow(u8, u8, u8); +static void MultiMove_SelectColumn(u8, u8, u8); +static void MultiMove_DeselectColumn(u8, u8, u8); + +// Move Items mode +static bool32 IsItemIconAtPosition(u8, u8); +static const u32 *GetItemIconPic(u16); +static const u32 *GetItemIconPalette(u16); +static u8 GetNewItemIconIdx(void); +static void SetItemIconPosition(u8, u8, u8); +static void LoadItemIconGfx(u8, const u32 *, const u32 *); +static void SetItemIconAffineAnim(u8, u8); +static void SetItemIconActive(u8, bool8); +static u8 GetItemIconIdxByPosition(u8, u8); +static void CreateItemIconSprites(void); +static void TryLoadItemIconAtPos(u8, u8); +static void TryHideItemIconAtPos(u8, u8); +static void TakeItemFromMon(u8, u8); +static void InitItemIconInCursor(u16); +static void SwapItemsWithMon(u8, u8); +static void GiveItemToMon(u8, u8); +static void MoveItemFromMonToBag(u8, u8); +static void MoveItemFromCursorToBag(void); +static void MoveHeldItemWithPartyMenu(void); +static bool8 IsItemIconAnimActive(void); +static bool8 IsMovingItem(void); +static const u8 *GetMovingItemName(void); +static u16 GetMovingItemId(void); +static void PrintItemDescription(void); +static void InitItemInfoWindow(void); +static bool8 UpdateItemInfoWindowSlideIn(void); +static bool8 UpdateItemInfoWindowSlideOut(void); +static void DrawItemInfoWindow(u32); +static void SetItemIconCallback(u8, u8, u8, u8); +static void SpriteCB_ItemIcon_SetPosToCursor(struct Sprite *); +static void SpriteCB_ItemIcon_WaitAnim(struct Sprite *); +static void SpriteCB_ItemIcon_ToHand(struct Sprite *); +static void SpriteCB_ItemIcon_ToMon(struct Sprite *); +static void SpriteCB_ItemIcon_SwapToHand(struct Sprite *); +static void SpriteCB_ItemIcon_HideParty(struct Sprite *); +static void SpriteCB_ItemIcon_SwapToMon(struct Sprite *); + +// Cursor +static void CreateCursorSprites(void); +static void ToggleCursorAutoAction(void); +static u8 GetCursorPosition(void); +static void StartCursorAnim(u8); +static void TryHideItemAtCursor(void); +static void TryShowItemAtCursor(void); +static void InitCursor(void); +static void InitCursorOnReopen(void); +static void GetCursorCoordsByPos(u8, u8, u16 *, u16 *); +static bool8 UpdateCursorPos(void); +static void DoCursorNewPosUpdate(void); +static void SetCursorInParty(void); +static void SetCursorBoxPosition(u8); +static void ClearSavedCursorPos(void); +static void SaveCursorPos(void); +static u8 GetSavedCursorPos(void); +static void InitMonPlaceChange(u8); +static bool8 DoMonPlaceChange(void); +static bool8 MonPlaceChange_Shift(void); +static bool8 MonPlaceChange_Grab(void); +static bool8 MonPlaceChange_Place(void); +static bool8 MultiMonPlaceChange_Up(void); +static bool8 MultiMonPlaceChange_Down(void); +static bool8 MonPlaceChange_CursorDown(void); +static bool8 MonPlaceChange_CursorUp(void); +static void TrySetCursorFistAnim(void); +static bool8 IsCursorOnCloseBox(void); +static bool8 IsCursorOnBoxTitle(void); +static bool8 IsCursorInBox(void); -// This file's functions. -static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr); -static void Cb2_EnterPSS(u8 boxOption); +// Scroll arrows +static void CreateBoxScrollArrows(void); +static void StartBoxScrollArrowsSlide(s8); +static void StopBoxScrollArrowsSlide(void); +static void AnimateBoxScrollArrows(bool8); +static void SpriteCB_Arrow(struct Sprite *); +static struct Sprite *CreateChooseBoxArrows(u16, u16, u8, u8, u8); + +// Box title +static void InitBoxTitle(u8); +static void CreateIncomingBoxTitle(u8, s8); +static void CycleBoxTitleSprites(void); +static void SpriteCB_IncomingBoxTitle(struct Sprite *); +static void SpriteCB_OutgoingBoxTitle(struct Sprite *); +static void CycleBoxTitleColor(void); +static s16 GetBoxTitleBaseX(const u8 *); + +// Wallpaper +static void SetWallpaperForCurrentBox(u8); +static bool8 DoWallpaperGfxChange(void); +static void LoadWallpaperGfx(u8, s8); +static bool32 WaitForWallpaperGfxLoad(void); +static void DrawWallpaper(const void *, s8, u8); +static void TrimOldWallpaper(void *); +static void AddWallpaperSetsMenu(void); +static void AddWallpapersMenu(u8); +static u8 GetBoxWallpaper(u8); +static void SetBoxWallpaper(u8, u8); + +// General box +static void CreateInitBoxTask(u8); +static bool8 IsInitBoxActive(void); +static void Task_InitBox(u8); +static void SetUpScrollToBox(u8); +static bool8 ScrollToBox(void); +static s8 DetermineBoxScrollDirection(u8); +static void SetCurrentBox(u8); + +// Misc +static void CreateMainMenu(u8, s16 *); static u8 GetCurrentBoxOption(void); -static u8 HandleInput(void); -static u8 sub_80CDC2C(void); -static u8 sub_80CB9BC(void); -static void LoadWallpaperGfx(u8 boxId, s8 direction); -static void sub_80CCCFC(u8 boxId, s8 direction); -static void sub_80CD0B8(s8 direction); -static void SetCurrentBox(u8 boxId); -static void sub_80CC32C(u8 boxId); -static void sub_80C7958(u8 curBox); -static void sub_80CCAE0(void *arg0); -static void sub_80C7B14(void); -static void sub_80C7BB4(void); static void ScrollBackground(void); -static void sub_80C7B80(void); -static void sub_80C7BE4(void); -static void sub_80CAA14(void); -static void sub_80CFDC4(void); -static void sub_80CE790(void); -static void sub_80CE8E4(void); +static void UpdateCloseBoxButtonFlash(void); static void GiveChosenBagItem(void); static void SetUpHidePartyMenu(void); -static void DestroyAllPartyMonIcons(void); -static void sub_80D11CC(void); -static void LoadPSSMenuGfx(void); +static void LoadPokeStorageMenuGfx(void); static void LoadWaveformSpritePalette(void); -static void sub_80CDC18(void); -static void sub_80CD36C(void); -static void sub_80CD3EC(void); -static void sub_80CAC1C(void); -static void sub_80CEBDC(void); +static void InitPokeStorageBg0(void); static void SetScrollingBackground(void); -static void sub_80CABE0(void); -static void sub_80CAEAC(void); -static void sub_80D0C60(void); -static void sub_80CFEA8(void); -static void sub_80CDC0C(void); -static void sub_80CAF04(void); -static void sub_80CA0D8(void); -static void AddMenu(void); -static void sub_80CE250(void); -static void InitCanRelaseMonVars(void); -static void sub_80D01B8(void); -static void ReleaseMon(void); -static void RefreshCursorMonData(void); -static void LoadCursorMonSprite(void); -static void sub_80CA154(void); -static void sub_80CA1C4(void); -static void sub_80CC064(void); -static void sub_80CE324(void); +static void UpdateBoxToSendMons(void); +static void InitCursorItemIcon(void); +static void InitPalettesAndSprites(void); +static void RefreshDisplayMonData(void); +static void CreateDisplayMonSprite(void); +static void CreateMarkingComboSprite(void); +static void CreateWaveformSprites(void); static void ClearBottomWindow(void); -static void sub_80CA704(void); -static void sub_80D013C(void); -static void sub_80CE00C(void); -static void sub_80D1194(void); -static void PrintCursorMonInfo(void); -static void sub_80CA65C(void); -static void AddWallpaperSetsMenu(void); -static void sub_80CD02C(void); -static void InitMenu(void); -static void sub_80CD158(void); -static void sub_80CFC14(void); -static void sub_80CEB40(void); -static void sub_80CCEE0(void); -static void sub_80D1818(void); -static void sub_80D19B4(u32 arg0); -static void sub_80CAA74(void); -static void PrintItemDescription(void); -static void sub_80CE760(void); -static void sub_80CDBA0(void); -static void sub_80CE7E8(void); -static void sub_80CFECC(void); -static void sub_80CA9EC(void); -static void FreePSSData(void); -static void AddBoxMenu(void); -static void sub_80CCF9C(void); -static void MoveMon(void); -static void PlaceMon(void); -static void sub_80CAB20(void); -static void sub_80CE22C(void); -static void sub_80CDA68(void); -static void sub_80CB950(void); -static void sub_80CA9C0(void); +static void InitSupplementalTilemaps(void); +static void PrintDisplayMonInfo(void); +static void UpdateWaveformAnimation(void); +static void SetPartySlotTilemaps(void); +static void StopFlashingCloseBoxButton(void); +static void FreePokeStorageData(void); +static void UpdatePartySlotColors(void); +static void StartFlashingCloseBoxButton(void); static void SetUpDoShowPartyMenu(void); -static void BoxSetMosaic(void); -static void sub_80C7CF4(struct Sprite *sprite); -static void sub_80CC100(struct Sprite *sprite); -static void sub_80CB278(struct Sprite *sprite); -static void sub_80CD210(struct Sprite *sprite); -static bool32 WaitForWallpaperGfxLoad(void); -static bool8 InitPSSWindows(void); -static bool8 sub_80CC0A0(void); -static bool8 sub_80CE2A8(void); -static bool8 sub_80D0164(void); -static bool8 sub_80CC35C(void); -static bool8 sub_80D01E4(void); -static bool8 sub_80CDED4(void); -static bool8 sub_80CDF08(void); -static bool8 sub_80D184C(void); -static bool8 sub_80D18E4(void); +static void StartDisplayMonMosaicEffect(void); +static bool8 InitPokeStorageWindows(void); static bool8 DoShowPartyMenu(void); -static bool8 sub_80D1218(void); -static bool8 ScrollToBox(void); -static bool8 sub_80CD554(void); static bool8 HidePartyMenu(void); -static bool8 IsActiveItemMoving(void); -static bool8 sub_80D0580(u8 arg0); -static bool8 sub_80D0BC0(void); -static bool8 sub_80CA2B8(void); -static bool8 DoWallpaperGfxChange(void); -static bool8 DoMonPlaceChange(void); -static bool8 sub_80D00A8(void); -static bool8 CanMovePartyMon(void); -static bool8 CanShiftMon(void); -static bool8 IsCursorOnCloseBox(void); -static bool8 IsCursorOnBox(void); -static bool8 IsCursorInBox(void); -static bool8 IsMonBeingMoved(void); -static bool8 TryStorePartyMonInBox(u8 boxId); -static void Cb_InitPSS(u8 taskId); -static void Cb_PlaceMon(u8 taskId); -static void Cb_ChangeScreen(u8 taskId); -static void Cb_ShowPSS(u8 taskId); -static void Cb_OnBPressed(u8 taskId); -static void Cb_HandleBoxOptions(u8 taskId); -static void Cb_OnSelectedMon(u8 taskId); -static void Cb_OnCloseBoxPressed(u8 taskId); -static void Cb_HidePartyPokemon(u8 taskId); -static void Cb_DepositMenu(u8 taskId); -static void Cb_MoveMon(u8 taskId); -static void Cb_GiveMovingItemToMon(u8 taskId); -static void Cb_SwitchSelectedItem(u8 taskId); -static void Cb_TakeItemForMoving(u8 taskId); -static void Cb_WithdrawMon(u8 taskId); -static void Cb_ShiftMon(u8 taskId); -static void Cb_ShowPartyPokemon(u8 taskId); -static void Cb_ShowItemInfo(u8 taskId); -static void Cb_GiveItemFromBag(u8 taskId); -static void Cb_ItemToBag(u8 taskId); -static void Cb_TakeItemForMoving(u8 taskId); -static void Cb_ShowMarkMenu(u8 taskId); -static void Cb_ShowMonSummary(u8 taskId); -static void Cb_ReleaseMon(u8 taskId); -static void Cb_ReshowPSS(u8 taskId); -static void Cb_MainPSS(u8 taskId); -static void Cb_JumpBox(u8 taskId); -static void Cb_HandleWallpapers(u8 taskId); -static void Cb_NameBox(u8 taskId); -static void Cb_PrintCantStoreMail(u8 taskId); -static void Cb_HandleMovingMonFromParty(u8 taskId); -static void SetUpScrollToBox(u8 boxId); -static void sub_80CFE54(u8 animNum); -static void SetMovingMonPriority(u8 priority); -static void InitMonPlaceChange(u8 arg0); -static void SetMonMarkings(u8 markings); -static void ShowYesNoWindow(s8 cursorPos); -static void sub_80CDBF8(u8 cursorBoxPosition); -static void sub_80D01D0(u8 arg0); -static void sub_80CD1A8(bool8 arg0); -static void sub_80CA984(bool8 arg0); -static void CreatePartyMonsSprites(bool8 arg0); -static void PrintStorageActionText(u8 id); -static s16 sub_80D00AC(void); -static s8 RunCanReleaseMon(void); -static u8 GetBoxCursorPosition(void); -static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos); -static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos); -static void Item_TakeMons(u8 cursorArea, u8 cursorPos); -static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos); -static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority); -static void SetWallpaperForCurrentBox(u8 wallpaperId); -static void AddWallpapersMenu(u8 wallpaperSet); -static u16 GetMovingItem(void); -static void LoadCursorMonGfx(u16 species, u32 pid); -static void sub_80CA2D0(struct Sprite *sprite); -static void sub_80CCF64(struct Sprite *sprite); -static void sub_80CBA3C(struct Sprite *sprite); -static void sub_80CCF30(struct Sprite *sprite); -static void sub_80CBAF0(s16 yDelta); -static void sub_80CAAA8(u8 arg0, bool8 isPartyMon); -static const u8 *GetMovingItemName(void); -static void SetMenuText(u8 textId); -static void sub_80D0D8C(u8 cursorArea, u8 cursorPos); -static void sub_80D0E50(u8 cursorArea, u8 cursorPos); -static void sub_80D0F38(u16 item); -static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s16 y, u8 oamPriority, u8 subpriority); -static void DestroyBoxMonIcon(struct Sprite *sprite); -static void SetBoxSpeciesAndPersonalities(u8 boxId); -static void sub_80CB9D0(struct Sprite *sprite, u16 partyId); -static void sub_80CC370(u8 taskId); -static void sub_80CCB50(u8 boxId); -static s8 DetermineBoxScrollDirection(u8 boxId); -static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2); -static s16 sub_80CD00C(const u8 *string); -static bool8 MonPlaceChange_Shift(void); -static bool8 MonPlaceChange_Move(void); -static bool8 MonPlaceChange_Place(void); -static bool8 sub_80CDEC4(void); -static bool8 sub_80CDEB4(void); -static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y); -static void SetShiftedMonData(u8 boxId, u8 position); -static void SetMovedMonData(u8 boxId, u8 position); -static void SetPlacedMonData(u8 boxId, u8 position); -static void PurgeMonOrBoxMon(u8 boxId, u8 position); -static void SetCursorMonData(void *pokemon, u8 mode); -static bool32 AtLeastThreeUsableMons(void); -static u8 InBoxInput_Normal(void); -static u8 InBoxInput_MovingMultiple(void); -static u8 InBoxInput_GrabbingMultiple(void); -static s8 sub_80CFF98(u8 arg0); -static u8 sub_80CFA5C(void); -static u8 sub_80D0BA4(void); -static bool8 sub_80CFA84(void); -static bool8 sub_80CFB44(void); -static bool8 sub_80D024C(void); -static bool8 sub_80D0344(void); -static bool8 sub_80D03B0(void); -static bool8 sub_80D0420(void); -static bool8 sub_80D04A0(void); -static bool8 sub_80D04C8(void); -static void sub_80D07B0(u8 arg0, u8 arg1); -static void sub_80D0834(u8 arg0, u8 arg1); -static void sub_80D0B5C(void); -static void sub_80D062C(void); -static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2); -static void sub_80D08CC(void); -static void sub_80D09A4(void); -static void sub_80D0A1C(void); -static void sub_80D0AAC(void); -static u8 sub_80D0894(void); -static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2); -static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2); -static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2); -static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2); -static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4); -static void sub_80D27F4(u8 id, u8 arg1, s8 arg2); -static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4); -static void sub_80D2770(u8 id, u16 arg1, u16 arg2); -static void sub_80D259C(u8 count); -static void sub_80D25F0(void); -static void sub_80D2918(u8 id); -static void sub_80D2960(u8 id); -static void sub_80D29F8(u8 id); -static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2); -static void sub_80D2AA4(void); -static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct); -static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct); - -// static const rom data -static const struct PSS_MenuStringPtrs gUnknown_085716C0[] = -{ - {gText_WithdrawPokemon, gText_WithdrawMonDescription}, - {gText_DepositPokemon, gText_DepositMonDescription}, - {gText_MovePokemon, gText_MoveMonDescription}, - {gText_MoveItems, gText_MoveItemsDescription}, - {gText_SeeYa, gText_SeeYaDescription} +static bool8 IsDisplayMosaicActive(void); +static void ShowYesNoWindow(s8); +static void UpdateCloseBoxButtonTilemap(bool8); +static void PrintMessage(u8 id); +static void LoadDisplayMonGfx(u16, u32); +static void SpriteCB_DisplayMonMosaic(struct Sprite *); +static void SetPartySlotTilemap(u8, bool8); + +// Tilemap utility +static void TilemapUtil_SetRect(u8, u16, u16, u16, u16); +static void TilemapUtil_Move(u8, u8, s8); +static void TilemapUtil_SetMap(u8, u8, const void *, u16, u16); +static void TilemapUtil_SetPos(u8, u16, u16); +static void TilemapUtil_Init(u8); +static void TilemapUtil_Free(void); +static void TilemapUtil_Update(u8); +static void TilemapUtil_DrawPrev(u8); +static void TilemapUtil_Draw(u8); + +// Unknown utility +static void UnkUtil_Init(struct UnkUtil *, struct UnkUtilData *, u32); +static void UnkUtil_Run(void); +static void UnkUtil_CpuRun(struct UnkUtilData *); +static void UnkUtil_DmaRun(struct UnkUtilData *); + +struct { + const u8 *text; + const u8 *desc; +} static const sMainMenuTexts[OPTIONS_COUNT] = +{ + [OPTION_WITHDRAW] = {gText_WithdrawPokemon, gText_WithdrawMonDescription}, + [OPTION_DEPOSIT] = {gText_DepositPokemon, gText_DepositMonDescription}, + [OPTION_MOVE_MONS] = {gText_MovePokemon, gText_MoveMonDescription}, + [OPTION_MOVE_ITEMS] = {gText_MoveItems, gText_MoveItemsDescription}, + [OPTION_EXIT] = {gText_SeeYa, gText_SeeYaDescription} }; -static const struct WindowTemplate gUnknown_085716E8 = +static const struct WindowTemplate sWindowTemplate_MainMenu = { .bg = 0, .tilemapLeft = 1, @@ -735,94 +893,96 @@ static const struct WindowTemplate gUnknown_085716E8 = .baseBlock = 0x1, }; -static const union AnimCmd sSpriteAnim_85716F0[] = +static const union AnimCmd sAnim_ChooseBoxMenu_TopLeft[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_85716F8[] = +static const union AnimCmd sAnim_ChooseBoxMenu_BottomLeft[] = { ANIMCMD_FRAME(4, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8571700[] = +static const union AnimCmd sAnim_ChooseBoxMenu_TopRight[] = { ANIMCMD_FRAME(6, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8571708[] = +static const union AnimCmd sAnim_ChooseBoxMenu_BottomRight[] = { ANIMCMD_FRAME(10, 5), ANIMCMD_END }; -static const union AnimCmd *const sSpriteAnimTable_8571710[] = +static const union AnimCmd *const sAnims_ChooseBoxMenu[] = { - sSpriteAnim_85716F0, - sSpriteAnim_85716F8, - sSpriteAnim_8571700, - sSpriteAnim_8571708 + sAnim_ChooseBoxMenu_TopLeft, + sAnim_ChooseBoxMenu_BottomLeft, + sAnim_ChooseBoxMenu_TopRight, + sAnim_ChooseBoxMenu_BottomRight }; -static const union AffineAnimCmd sSpriteAffineAnim_8571720[] = +static const union AffineAnimCmd sAffineAnim_ChooseBoxMenu[] = { AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] = +// Unused +static const union AffineAnimCmd *const sAffineAnims_ChooseBoxMenu[] = { - sSpriteAffineAnim_8571720 + sAffineAnim_ChooseBoxMenu }; -static const u8 sBoxInfoTextColors[] = {TEXT_COLOR_RED, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; +static const u8 sChooseBoxMenu_TextColors[] = {TEXT_COLOR_RED, TEXT_DYNAMIC_COLOR_6, TEXT_DYNAMIC_COLOR_5}; static const u8 sText_OutOf30[] = _("/30"); -static const u16 gBoxSelectionPopupPalette[] = INCBIN_U16("graphics/unknown/unknown_57173C.gbapal"); -static const u8 gBoxSelectionPopupCenterTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); -static const u8 gBoxSelectionPopupSidesTiles[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); -static const u32 gPokemonStorageScrollingBGTileset[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz"); -static const u32 gPokemonStorageScrollingBGTilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz"); -static const u32 gUnknown_08572280[] = INCBIN_U32("graphics/unknown/unknown_572280.gbapal"); -static const u32 gUnknown_085722A0[] = INCBIN_U32("graphics/unknown/unknown_5722A0.bin.lz"); +static const u16 sChooseBoxMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/box_selection_popup.gbapal"); +static const u8 sChooseBoxMenuCenter_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_center.4bpp"); +static const u8 sChooseBoxMenuSides_Gfx[] = INCBIN_U8("graphics/pokemon_storage/box_selection_popup_sides.4bpp"); +static const u32 sScrollingBg_Gfx[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.4bpp.lz"); +static const u32 sScrollingBg_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/scrolling_bg.bin.lz"); +static const u16 sDisplayMenu_Pal[] = INCBIN_U16("graphics/pokemon_storage/display_menu.gbapal"); // Unused +static const u32 sDisplayMenu_Tilemap[] = INCBIN_U32("graphics/pokemon_storage/display_menu.bin.lz"); -static const u16 gUnknown_0857239C[] = +static const u16 sPkmnData_Tilemap[] = { 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, 0x0118, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, 0x2108, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, 0x2118, }; -static const u16 gUnknown_085723DC[] = INCBIN_U16("graphics/unknown/unknown_5723DC.gbapal"); // Left-most part and Close Box. -static const u16 gUnknown_085723FC[] = INCBIN_U16("graphics/unknown/unknown_5723FC.gbapal"); -static const u16 gUnknown_0857241C[] = INCBIN_U16("graphics/unknown/unknown_57241C.gbapal"); -static const u16 gUnknown_0857243C[] = INCBIN_U16("graphics/unknown/unknown_57243C.gbapal"); +// sInterface_Pal - parts of the display frame, "PkmnData"'s normal color, Close Box +static const u16 sInterface_Pal[] = INCBIN_U16("graphics/pokemon_storage/interface.gbapal"); +static const u16 sPkmnDataGray_Pal[] = INCBIN_U16("graphics/pokemon_storage/pkmn_data_gray.gbapal"); +static const u16 sBg_Pal[] = INCBIN_U16("graphics/pokemon_storage/bg.gbapal"); +static const u16 sBgMoveItems_Pal[] = INCBIN_U16("graphics/pokemon_storage/bg_move_items.gbapal"); -static const u16 gUnknown_0857245C[] = +static const u16 sCloseBoxButton_Tilemap[] = { 0x014c, 0x014d, 0x014e, 0x014f, 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x015c, 0x015d, 0x015e, 0x015f, 0x0180, 0x0181, 0x0182, 0x0183, 0x0184, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017a, 0x017b, 0x017c, 0x017d, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018b, 0x018c, 0x018d }; -static const u16 gUnknown_085724A4[] = +static const u16 sPartySlotFilled_Tilemap[] = { 0x1140, 0x1141, 0x1141, 0x1142, 0x1150, 0x1151, 0x1151, 0x1152, 0x1160, 0x1161, 0x1161, 0x1162, }; -static const u16 gUnknown_085724BC[] = +static const u16 sPartySlotEmpty_Tilemap[] = { 0x1143, 0x1144, 0x1144, 0x1145, 0x1153, 0x1154, 0x1154, 0x1155, 0x1163, 0x1164, 0x1164, 0x1165, }; -static const u16 gWaveformPalette[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); -static const u32 gWaveformTiles[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp"); -static const u32 gUnknown_085726B4[] = INCBIN_U32("graphics/unused/unknown_5726B4.gbapal"); -static const u32 gUnknown_085726F4[] = INCBIN_U32("graphics/unknown/unknown_5726F4.gbapal"); +static const u16 sWaveform_Pal[] = INCBIN_U16("graphics/pokemon_storage/waveform.gbapal"); +static const u32 sWaveform_Gfx[] = INCBIN_U32("graphics/pokemon_storage/waveform.4bpp"); +static const u16 sUnused_Pal[] = INCBIN_U16("graphics/pokemon_storage/unused.gbapal"); +static const u16 sUnknown_Pal[] = INCBIN_U16("graphics/pokemon_storage/unknown.gbapal"); -static const struct WindowTemplate gUnknown_08572714[] = +static const struct WindowTemplate sWindowTemplates[] = { - { // 0 + { .bg = 1, .tilemapLeft = 0, .tilemapTop = 11, @@ -831,7 +991,7 @@ static const struct WindowTemplate gUnknown_08572714[] = .paletteNum = 3, .baseBlock = 0xC0, }, - { // 1 + { .bg = 0, .tilemapLeft = 11, .tilemapTop = 17, @@ -840,7 +1000,7 @@ static const struct WindowTemplate gUnknown_08572714[] = .paletteNum = 15, .baseBlock = 0x14, }, - { // 2 + { .bg = 0, .tilemapLeft = 0, .tilemapTop = 13, @@ -852,7 +1012,7 @@ static const struct WindowTemplate gUnknown_08572714[] = DUMMY_WIN_TEMPLATE }; -static const struct BgTemplate gUnknown_08572734[] = +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, @@ -894,59 +1054,59 @@ static const struct BgTemplate gUnknown_08572734[] = static const struct SpritePalette gWaveformSpritePalette = { - gWaveformPalette, TAG_PAL_WAVEFORM + sWaveform_Pal, PALTAG_MISC_2 }; -static const struct SpriteSheet gWaveformSpriteSheet = +static const struct SpriteSheet sSpriteSheet_Waveform = { - gWaveformTiles, sizeof(gWaveformTiles), TAG_TILE_WAVEFORM + sWaveform_Gfx, sizeof(sWaveform_Gfx), GFXTAG_WAVEFORM }; -static const struct OamData sOamData_857286C; -static const struct SpriteTemplate sSpriteTemplate_CursorMon = +static const struct OamData sOamData_DisplayMon; +static const struct SpriteTemplate sSpriteTemplate_DisplayMon = { - .tileTag = TAG_TILE_2, - .paletteTag = TAG_PAL_DAC6, - .oam = &sOamData_857286C, + .tileTag = GFXTAG_DISPLAY_MON, + .paletteTag = PALTAG_DISPLAY_MON, + .oam = &sOamData_DisplayMon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct StorageAction gPCStorageActionTexts[] = -{ - [PC_TEXT_EXIT_BOX] = {gText_ExitFromBox, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_PICK_A_THEME] = {gText_PleasePickATheme, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_IS_SELECTED] = {gText_PkmnIsSelected, PC_TEXT_FMT_MON_NAME_1}, - [PC_TEXT_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_WAS_DEPOSITED] = {gText_PkmnWasDeposited, PC_TEXT_FMT_MON_NAME_1}, - [PC_TEXT_BOX_IS_FULL] = {gText_BoxIsFull2, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_RELEASE_POKE] = {gText_ReleaseThisPokemon, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_WAS_RELEASED] = {gText_PkmnWasReleased, PC_TEXT_FMT_MON_NAME_4}, - [PC_TEXT_BYE_BYE] = {gText_ByeByePkmn, PC_TEXT_FMT_MON_NAME_6}, - [PC_TEXT_MARK_POKE] = {gText_MarkYourPkmn, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_LAST_POKE] = {gText_ThatsYourLastPkmn, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_PARTY_FULL] = {gText_YourPartysFull, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_HOLDING_POKE] = {gText_YoureHoldingAPkmn, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_CONTINUE_BOX] = {gText_ContinueBoxOperations, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_CAME_BACK] = {gText_PkmnCameBack, PC_TEXT_FMT_MON_NAME_1}, - [PC_TEXT_WORRIED] = {gText_WasItWorriedAboutYou, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_SURPRISE] = {gText_FourEllipsesExclamation, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_IS_SELECTED2] = {gText_PkmnIsSelected, PC_TEXT_FMT_ITEM_NAME}, - [PC_TEXT_GIVE_TO_MON] = {gText_GiveToAPkmn, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_PLACED_IN_BAG] = {gText_PlacedItemInBag, PC_TEXT_FMT_ITEM_NAME}, - [PC_TEXT_BAG_FULL] = {gText_BagIsFull2, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_PUT_IN_BAG] = {gText_PutItemInBag, PC_TEXT_FMT_NORMAL}, - [PC_TEXT_ITEM_IS_HELD] = {gText_ItemIsNowHeld, PC_TEXT_FMT_ITEM_NAME}, - [PC_TEXT_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, PC_TEXT_FMT_ITEM_NAME}, - [PC_TEXT_CANT_STORE_MAIL] = {gText_MailCantBeStored, PC_TEXT_FMT_NORMAL}, +static const struct StorageMessage sMessages[] = +{ + [MSG_EXIT_BOX] = {gText_ExitFromBox, MSG_VAR_NONE}, + [MSG_WHAT_YOU_DO] = {gText_WhatDoYouWantToDo, MSG_VAR_NONE}, + [MSG_PICK_A_THEME] = {gText_PleasePickATheme, MSG_VAR_NONE}, + [MSG_PICK_A_WALLPAPER] = {gText_PickTheWallpaper, MSG_VAR_NONE}, + [MSG_IS_SELECTED] = {gText_PkmnIsSelected, MSG_VAR_MON_NAME_1}, + [MSG_JUMP_TO_WHICH_BOX] = {gText_JumpToWhichBox, MSG_VAR_NONE}, + [MSG_DEPOSIT_IN_WHICH_BOX] = {gText_DepositInWhichBox, MSG_VAR_NONE}, + [MSG_WAS_DEPOSITED] = {gText_PkmnWasDeposited, MSG_VAR_MON_NAME_1}, + [MSG_BOX_IS_FULL] = {gText_BoxIsFull2, MSG_VAR_NONE}, + [MSG_RELEASE_POKE] = {gText_ReleaseThisPokemon, MSG_VAR_NONE}, + [MSG_WAS_RELEASED] = {gText_PkmnWasReleased, MSG_VAR_RELEASE_MON_1}, + [MSG_BYE_BYE] = {gText_ByeByePkmn, MSG_VAR_RELEASE_MON_3}, + [MSG_MARK_POKE] = {gText_MarkYourPkmn, MSG_VAR_NONE}, + [MSG_LAST_POKE] = {gText_ThatsYourLastPkmn, MSG_VAR_NONE}, + [MSG_PARTY_FULL] = {gText_YourPartysFull, MSG_VAR_NONE}, + [MSG_HOLDING_POKE] = {gText_YoureHoldingAPkmn, MSG_VAR_NONE}, + [MSG_WHICH_ONE_WILL_TAKE] = {gText_WhichOneWillYouTake, MSG_VAR_NONE}, + [MSG_CANT_RELEASE_EGG] = {gText_YouCantReleaseAnEgg, MSG_VAR_NONE}, + [MSG_CONTINUE_BOX] = {gText_ContinueBoxOperations, MSG_VAR_NONE}, + [MSG_CAME_BACK] = {gText_PkmnCameBack, MSG_VAR_MON_NAME_1}, + [MSG_WORRIED] = {gText_WasItWorriedAboutYou, MSG_VAR_NONE}, + [MSG_SURPRISE] = {gText_FourEllipsesExclamation, MSG_VAR_NONE}, + [MSG_PLEASE_REMOVE_MAIL] = {gText_PleaseRemoveTheMail, MSG_VAR_NONE}, + [MSG_IS_SELECTED2] = {gText_PkmnIsSelected, MSG_VAR_ITEM_NAME}, + [MSG_GIVE_TO_MON] = {gText_GiveToAPkmn, MSG_VAR_NONE}, + [MSG_PLACED_IN_BAG] = {gText_PlacedItemInBag, MSG_VAR_ITEM_NAME}, + [MSG_BAG_FULL] = {gText_BagIsFull2, MSG_VAR_NONE}, + [MSG_PUT_IN_BAG] = {gText_PutItemInBag, MSG_VAR_NONE}, + [MSG_ITEM_IS_HELD] = {gText_ItemIsNowHeld, MSG_VAR_ITEM_NAME}, + [MSG_CHANGED_TO_ITEM] = {gText_ChangedToNewItem, MSG_VAR_ITEM_NAME}, + [MSG_CANT_STORE_MAIL] = {gText_MailCantBeStored, MSG_VAR_NONE}, }; static const struct WindowTemplate sYesNoWindowTemplate = @@ -960,7 +1120,7 @@ static const struct WindowTemplate sYesNoWindowTemplate = .baseBlock = 0x5C, }; -static const struct OamData sOamData_857286C = +static const struct OamData sOamData_DisplayMon = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -977,7 +1137,7 @@ static const struct OamData sOamData_857286C = .affineParam = 0 }; -static const struct OamData sOamData_8572874 = +static const struct OamData sOamData_Waveform = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -994,13 +1154,13 @@ static const struct OamData sOamData_8572874 = .affineParam = 0 }; -static const union AnimCmd sSpriteAnim_857287C[] = +static const union AnimCmd sAnim_Waveform_LeftOff[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_8572884[] = +static const union AnimCmd sAnim_Waveform_LeftOn[] = { ANIMCMD_FRAME(2, 8), ANIMCMD_FRAME(4, 8), @@ -1008,13 +1168,13 @@ static const union AnimCmd sSpriteAnim_8572884[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd sSpriteAnim_8572894[] = +static const union AnimCmd sAnim_Waveform_RightOff[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_857289C[] = +static const union AnimCmd sAnim_Waveform_RightOn[] = { ANIMCMD_FRAME(10, 8), ANIMCMD_FRAME(4, 8), @@ -1022,38 +1182,38 @@ static const union AnimCmd sSpriteAnim_857289C[] = ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sSpriteAnimTable_85728AC[] = +static const union AnimCmd *const sAnims_Waveform[] = { - sSpriteAnim_857287C, - sSpriteAnim_8572884, - sSpriteAnim_8572894, - sSpriteAnim_857289C + sAnim_Waveform_LeftOff, + sAnim_Waveform_LeftOn, + sAnim_Waveform_RightOff, + sAnim_Waveform_RightOn }; static const struct SpriteTemplate sSpriteTemplate_Waveform = { - .tileTag = TAG_TILE_WAVEFORM, - .paletteTag = TAG_PAL_WAVEFORM, - .oam = &sOamData_8572874, - .anims = sSpriteAnimTable_85728AC, + .tileTag = GFXTAG_WAVEFORM, + .paletteTag = PALTAG_MISC_2, + .oam = &sOamData_Waveform, + .anims = sAnims_Waveform, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct OamData sOamData_85728EC; -static const struct SpriteTemplate gUnknown_085728D4 = +static const struct OamData sOamData_MonIcon; +static const struct SpriteTemplate sSpriteTemplate_MonIcon = { - .tileTag = TAG_TILE_12, - .paletteTag = TAG_PAL_DAC0, - .oam = &sOamData_85728EC, + .tileTag = GFXTAG_MON_ICON, + .paletteTag = PALTAG_MON_ICON_0, + .oam = &sOamData_MonIcon, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -static const struct OamData sOamData_85728EC = +static const struct OamData sOamData_MonIcon = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -1070,476 +1230,113 @@ static const struct OamData sOamData_85728EC = .affineParam = 0 }; -static const union AffineAnimCmd gSpriteAffineAnim_85728F4[] = +static const union AffineAnimCmd sAffineAnim_ReleaseMon_Release[] = { AFFINEANIMCMD_FRAME(-2, -2, 0, 120), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gSpriteAffineAnim_8572904[] = +static const union AffineAnimCmd sAffineAnim_ReleaseMon_CameBack[] = { AFFINEANIMCMD_FRAME(16, 16, 0, 0), AFFINEANIMCMD_FRAME(16, 16, 0, 15), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_857291C[] = -{ - gSpriteAffineAnim_85728F4, - gSpriteAffineAnim_8572904 -}; - -static const u16 gWallpaperPalettes_Forest[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/forest_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/forest_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/forest.4bpp.lz"); -static const u32 gWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/forest.bin.lz"); - -static const u16 gWallpaperPalettes_City[][16] = +static const union AffineAnimCmd *const sAffineAnims_ReleaseMon[] = { - INCBIN_U16("graphics/pokemon_storage/city_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/city_bg.gbapal"), + [RELEASE_ANIM_RELEASE] = sAffineAnim_ReleaseMon_Release, + [RELEASE_ANIM_CAME_BACK] = sAffineAnim_ReleaseMon_CameBack }; -static const u32 gWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/city.4bpp.lz"); -static const u32 gWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/city.bin.lz"); -static const u16 gWallpaperPalettes_Desert[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/desert_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/desert_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/desert.4bpp.lz"); -static const u32 gWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/desert.bin.lz"); +#include "data/wallpapers.h" -static const u16 gWallpaperPalettes_Savanna[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/savanna_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/savanna_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/savanna.4bpp.lz"); -static const u32 gWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/savanna.bin.lz"); +static const u16 sUnusedColor = RGB(26, 29, 8); -static const u16 gWallpaperPalettes_Crag[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/crag_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/crag_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/crag.4bpp.lz"); -static const u32 gWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/crag.bin.lz"); +static const struct SpriteSheet sSpriteSheet_Arrow = {sArrow_Gfx, 0x80, GFXTAG_ARROW}; -static const u16 gWallpaperPalettes_Volcano[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/volcano_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/volcano_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/volcano.4bpp.lz"); -static const u32 gWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/volcano.bin.lz"); - -static const u16 gWallpaperPalettes_Snow[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/snow_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/snow_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/snow.4bpp.lz"); -static const u32 gWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/snow.bin.lz"); - -static const u16 gWallpaperPalettes_Cave[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/cave_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/cave_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/cave.4bpp.lz"); -static const u32 gWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/cave.bin.lz"); - -static const u16 gWallpaperPalettes_Beach[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/beach_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/beach_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/beach.4bpp.lz"); -static const u32 gWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/beach.bin.lz"); - -static const u16 gWallpaperPalettes_Seafloor[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/seafloor_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/seafloor_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/seafloor.4bpp.lz"); -static const u32 gWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/seafloor.bin.lz"); - -static const u16 gWallpaperPalettes_River[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/river_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/river_bg.gbapal"), -}; -static const u32 gWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/river.4bpp.lz"); -static const u32 gWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/river.bin.lz"); -static const u16 gWallpaperPalettes_Sky[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/sky_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/sky_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/sky.4bpp.lz"); -static const u32 gWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/sky.bin.lz"); - -static const u16 gWallpaperPalettes_PolkaDot[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/polkadot_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/polkadot_bg.gbapal"), -}; -static const u32 gWallpaperTiles_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/polkadot.4bpp.lz"); -static const u32 gWallpaperTilemap_PolkaDot[] = INCBIN_U32("graphics/pokemon_storage/polkadot.bin.lz"); - -static const u16 gWallpaperPalettes_Pokecenter[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/pokecenter_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/pokecenter_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/pokecenter.4bpp.lz"); -static const u32 gWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/pokecenter.bin.lz"); - -static const u16 gWallpaperPalettes_Machine[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/machine_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/machine_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Machine[] = INCBIN_U32("graphics/pokemon_storage/machine.4bpp.lz"); -static const u32 gWallpaperTilemap_Machine[] = INCBIN_U32("graphics/pokemon_storage/machine.bin.lz"); - -static const u16 gWallpaperPalettes_Plain[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/plain_frame.gbapal"), - INCBIN_U16("graphics/pokemon_storage/plain_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Plain[] = INCBIN_U32("graphics/pokemon_storage/plain.4bpp.lz"); -static const u32 gWallpaperTilemap_Plain[] = INCBIN_U32("graphics/pokemon_storage/plain.bin.lz"); - -// 12x18 tilemap -static const u32 gUnknown_085773C4[] = INCBIN_U32("graphics/unused/tilemap_5773C4.bin"); - -static const u16 gUnknown_08577574[][2] = -{ - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF}, - {0x1CE7, 0x7FFF} -}; - -#define WALLPAPER_ENTRY(name) {gWallpaperTiles_##name, gWallpaperTilemap_##name, gWallpaperPalettes_##name[0]} - -static const struct WallpaperTable gWallpaperTable[] = -{ - [WALLPAPER_FOREST] = WALLPAPER_ENTRY(Forest), - [WALLPAPER_CITY] = WALLPAPER_ENTRY(City), - [WALLPAPER_DESERT] = WALLPAPER_ENTRY(Desert), - [WALLPAPER_SAVANNA] = WALLPAPER_ENTRY(Savanna), - [WALLPAPER_CRAG] = WALLPAPER_ENTRY(Crag), - [WALLPAPER_VOLCANO] = WALLPAPER_ENTRY(Volcano), - [WALLPAPER_SNOW] = WALLPAPER_ENTRY(Snow), - [WALLPAPER_CAVE] = WALLPAPER_ENTRY(Cave), - [WALLPAPER_BEACH] = WALLPAPER_ENTRY(Beach), - [WALLPAPER_SEAFLOOR] = WALLPAPER_ENTRY(Seafloor), - [WALLPAPER_RIVER] = WALLPAPER_ENTRY(River), - [WALLPAPER_SKY] = WALLPAPER_ENTRY(Sky), - [WALLPAPER_POLKADOT] = WALLPAPER_ENTRY(PolkaDot), - [WALLPAPER_POKECENTER] = WALLPAPER_ENTRY(Pokecenter), - [WALLPAPER_MACHINE] = WALLPAPER_ENTRY(Machine), - [WALLPAPER_PLAIN] = WALLPAPER_ENTRY(Plain), -}; - -static const u8 gPCGfx_Arrow[] = INCBIN_U8("graphics/pokemon_storage/arrow.4bpp"); - -static const u16 gWallpaperPalettes_Zigzagoon[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), - INCBIN_U16("graphics/pokemon_storage/zigzagoon_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/zigzagoon.4bpp.lz"); -static const u32 gWallpaperTilemap_Zigzagoon[] = INCBIN_U32("graphics/pokemon_storage/zigzagoon.bin.lz"); - -static const u16 gWallpaperPalettes_Screen[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), - INCBIN_U16("graphics/pokemon_storage/screen_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Screen[] = INCBIN_U32("graphics/pokemon_storage/screen.4bpp.lz"); -static const u32 gWallpaperTilemap_Screen[] = INCBIN_U32("graphics/pokemon_storage/screen.bin.lz"); - -static const u16 gWallpaperPalettes_Diagonal[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), - INCBIN_U16("graphics/pokemon_storage/diagonal_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/diagonal.4bpp.lz"); -static const u32 gWallpaperTilemap_Diagonal[] = INCBIN_U32("graphics/pokemon_storage/diagonal.bin.lz"); - -static const u16 gWallpaperPalettes_Block[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/block_bg.gbapal"), - INCBIN_U16("graphics/pokemon_storage/block_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Block[] = INCBIN_U32("graphics/pokemon_storage/block.4bpp.lz"); -static const u32 gWallpaperTilemap_Block[] = INCBIN_U32("graphics/pokemon_storage/block.bin.lz"); - -static const u16 gWallpaperPalettes_Pokecenter2[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/pokecenter2_bg.gbapal"), - INCBIN_U16("graphics/pokemon_storage/pokecenter2_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/pokecenter2.4bpp.lz"); -static const u32 gWallpaperTilemap_Pokecenter2[] = INCBIN_U32("graphics/pokemon_storage/pokecenter2.bin.lz"); - -static const u16 gWallpaperPalettes_Frame[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/frame_bg.gbapal"), - INCBIN_U16("graphics/pokemon_storage/frame_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Frame[] = INCBIN_U32("graphics/pokemon_storage/frame.4bpp.lz"); -static const u32 gWallpaperTilemap_Frame[] = INCBIN_U32("graphics/pokemon_storage/frame.bin.lz"); - -static const u16 gWallpaperPalettes_Blank[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame1.gbapal"), - INCBIN_U16("graphics/pokemon_storage/zigzagoon_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Blank[] = INCBIN_U32("graphics/pokemon_storage/blank.4bpp.lz"); -static const u32 gWallpaperTilemap_Blank[] = INCBIN_U32("graphics/pokemon_storage/blank.bin.lz"); - -static const u16 gWallpaperPalettes_Circles[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/circles_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Circles[] = INCBIN_U32("graphics/pokemon_storage/circles.4bpp.lz"); -static const u32 gWallpaperTilemap_Circles[] = INCBIN_U32("graphics/pokemon_storage/circles.bin.lz"); - -static const u16 gWallpaperPalettes_Azumarill[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/azumarill_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/azumarill.4bpp.lz"); -static const u32 gWallpaperTilemap_Azumarill[] = INCBIN_U32("graphics/pokemon_storage/azumarill.bin.lz"); - -static const u16 gWallpaperPalettes_Pikachu[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/pikachu_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/pikachu.4bpp.lz"); -static const u32 gWallpaperTilemap_Pikachu[] = INCBIN_U32("graphics/pokemon_storage/pikachu.bin.lz"); - -static const u16 gWallpaperPalettes_Legendary[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/legendary_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Legendary[] = INCBIN_U32("graphics/pokemon_storage/legendary.4bpp.lz"); -static const u32 gWallpaperTilemap_Legendary[] = INCBIN_U32("graphics/pokemon_storage/legendary.bin.lz"); - -static const u16 gWallpaperPalettes_Dusclops[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/dusclops_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/dusclops.4bpp.lz"); -static const u32 gWallpaperTilemap_Dusclops[] = INCBIN_U32("graphics/pokemon_storage/dusclops.bin.lz"); - -static const u16 gWallpaperPalettes_Ludicolo[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/ludicolo_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/ludicolo.4bpp.lz"); -static const u32 gWallpaperTilemap_Ludicolo[] = INCBIN_U32("graphics/pokemon_storage/ludicolo.bin.lz"); - -static const u16 gWallpaperPalettes_Whiscash[][16] = -{ - INCBIN_U16("graphics/pokemon_storage/friends_frame2.gbapal"), - INCBIN_U16("graphics/pokemon_storage/whiscash_bg.gbapal"), -}; -static const u32 gWallpaperTiles_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/whiscash.4bpp.lz"); -static const u32 gWallpaperTilemap_Whiscash[] = INCBIN_U32("graphics/pokemon_storage/whiscash.bin.lz"); - -static const u32 gWallpaperIcon_Aqua[] = INCBIN_U32("graphics/pokemon_storage/aqua_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Heart[] = INCBIN_U32("graphics/pokemon_storage/heart_icon.4bpp.lz"); -static const u32 gWallpaperIcon_FiveStar[] = INCBIN_U32("graphics/pokemon_storage/five_star_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Brick[] = INCBIN_U32("graphics/pokemon_storage/brick_icon.4bpp.lz"); -static const u32 gWallpaperIcon_FourStar[] = INCBIN_U32("graphics/pokemon_storage/four_star_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Asterisk[] = INCBIN_U32("graphics/pokemon_storage/asterisk_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Dot[] = INCBIN_U32("graphics/pokemon_storage/dot_icon.4bpp.lz"); -static const u32 gWallpaperIcon_LineCircle[] = INCBIN_U32("graphics/pokemon_storage/line_circle_icon.4bpp.lz"); -static const u32 gWallpaperIcon_PokeBall[] = INCBIN_U32("graphics/pokemon_storage/pokeball_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Maze[] = INCBIN_U32("graphics/pokemon_storage/maze_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Footprint[] = INCBIN_U32("graphics/pokemon_storage/footprint_icon.4bpp.lz"); -static const u32 gWallpaperIcon_BigAsterisk[] = INCBIN_U32("graphics/pokemon_storage/big_asterisk_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Circle[] = INCBIN_U32("graphics/pokemon_storage/circle_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Koffing[] = INCBIN_U32("graphics/pokemon_storage/koffing_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Ribbon[] = INCBIN_U32("graphics/pokemon_storage/ribbon_icon.4bpp.lz"); -static const u32 gWallpaperIcon_FourCircles[] = INCBIN_U32("graphics/pokemon_storage/four_circles_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Lotad[] = INCBIN_U32("graphics/pokemon_storage/lotad_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Crystal[] = INCBIN_U32("graphics/pokemon_storage/crystal_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Pichu[] = INCBIN_U32("graphics/pokemon_storage/pichu_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Diglett[] = INCBIN_U32("graphics/pokemon_storage/diglett_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Luvdisc[] = INCBIN_U32("graphics/pokemon_storage/luvdisc_icon.4bpp.lz"); -static const u32 gWallpaperIcon_StarInCircle[] = INCBIN_U32("graphics/pokemon_storage/star_in_circle_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Spinda[] = INCBIN_U32("graphics/pokemon_storage/spinda_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Latis[] = INCBIN_U32("graphics/pokemon_storage/latis_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Minun[] = INCBIN_U32("graphics/pokemon_storage/minun_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Togepi[] = INCBIN_U32("graphics/pokemon_storage/togepi_icon.4bpp.lz"); -static const u32 gWallpaperIcon_Magma[] = INCBIN_U32("graphics/pokemon_storage/magma_icon.4bpp.lz"); - -static const struct WallpaperTable gFriendsWallpaperTable[] = -{ - WALLPAPER_ENTRY(Zigzagoon), - WALLPAPER_ENTRY(Screen), - WALLPAPER_ENTRY(Horizontal), - WALLPAPER_ENTRY(Diagonal), - WALLPAPER_ENTRY(Block), - WALLPAPER_ENTRY(Ribbon), - WALLPAPER_ENTRY(Pokecenter2), - WALLPAPER_ENTRY(Frame), - WALLPAPER_ENTRY(Blank), - WALLPAPER_ENTRY(Circles), - WALLPAPER_ENTRY(Azumarill), - WALLPAPER_ENTRY(Pikachu), - WALLPAPER_ENTRY(Legendary), - WALLPAPER_ENTRY(Dusclops), - WALLPAPER_ENTRY(Ludicolo), - WALLPAPER_ENTRY(Whiscash), -}; - -static const u32 *const gFriendsIcons[] = -{ - gWallpaperIcon_Aqua, - gWallpaperIcon_Heart, - gWallpaperIcon_FiveStar, - gWallpaperIcon_Brick, - gWallpaperIcon_FourStar, - gWallpaperIcon_Asterisk, - gWallpaperIcon_Dot, - gWallpaperIcon_Cross, - gWallpaperIcon_LineCircle, - gWallpaperIcon_PokeBall, - gWallpaperIcon_Maze, - gWallpaperIcon_Footprint, - gWallpaperIcon_BigAsterisk, - gWallpaperIcon_Circle, - gWallpaperIcon_Koffing, - gWallpaperIcon_Ribbon, - gWallpaperIcon_Bolt, - gWallpaperIcon_FourCircles, - gWallpaperIcon_Lotad, - gWallpaperIcon_Crystal, - gWallpaperIcon_Pichu, - gWallpaperIcon_Diglett, - gWallpaperIcon_Luvdisc, - gWallpaperIcon_StarInCircle, - gWallpaperIcon_Spinda, - gWallpaperIcon_Latis, - gWallpaperIcon_Plusle, - gWallpaperIcon_Minun, - gWallpaperIcon_Togepi, - gWallpaperIcon_Magma, -}; - -// Unknown Unused data. -static const u16 gUnknown_0857B07C = 0x23BA; - -static const struct SpriteSheet gUnknown_0857B080 = {gPCGfx_Arrow, 0x80, 6}; - -static const struct OamData gOamData_83BB298 = +static const struct OamData sOamData_BoxTitle = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 2 }; -static const union AnimCmd gSpriteAnim_83BB2A0[] = +static const union AnimCmd sAnim_BoxTitle_Left[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_83BB2A8[] = +static const union AnimCmd sAnim_BoxTitle_Right[] = { ANIMCMD_FRAME(8, 5), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_83BB2B0[] = +static const union AnimCmd *const sAnims_BoxTitle[] = { - gSpriteAnim_83BB2A0, - gSpriteAnim_83BB2A8 + sAnim_BoxTitle_Left, + sAnim_BoxTitle_Right }; -static const struct SpriteTemplate gSpriteTemplate_857B0A8 = +static const struct SpriteTemplate sSpriteTemplate_BoxTitle = { - TAG_TILE_3, - TAG_PAL_DAC9, - &gOamData_83BB298, - gSpriteAnimTable_83BB2B0, - NULL, - gDummySpriteAffineAnimTable, - SpriteCallbackDummy + .tileTag = GFXTAG_BOX_TITLE, + .paletteTag = PALTAG_BOX_TITLE, + .oam = &sOamData_BoxTitle, + .anims = sAnims_BoxTitle, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy }; -static const struct OamData gOamData_83BB2D0 = +static const struct OamData sOamData_Arrow = { .shape = SPRITE_SHAPE(8x16), .size = SPRITE_SIZE(8x16), .priority = 2 }; -static const union AnimCmd gSpriteAnim_83BB2D8[] = +static const union AnimCmd sAnim_Arrow_Left[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_83BB2E0[] = +static const union AnimCmd sAnim_Arrow_Right[] = { ANIMCMD_FRAME(2, 5), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_83BB2E8[] = +static const union AnimCmd *const sAnims_Arrow[] = { - gSpriteAnim_83BB2D8, - gSpriteAnim_83BB2E0 + sAnim_Arrow_Left, + sAnim_Arrow_Right }; -static const struct SpriteTemplate gUnknown_0857B0E0 = +static const struct SpriteTemplate sSpriteTemplate_Arrow = { - 6, - TAG_PAL_WAVEFORM, - &gOamData_83BB2D0, - gSpriteAnimTable_83BB2E8, - NULL, - gDummySpriteAffineAnimTable, - sub_80CD210 + .tileTag = GFXTAG_ARROW, + .paletteTag = PALTAG_MISC_2, + .oam = &sOamData_Arrow, + .anims = sAnims_Arrow, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_Arrow }; -static const u16 gHandCursorPalette[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor.gbapal"); -static const u8 gHandCursorTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); -static const u8 gHandCursorShadowTiles[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); +static const u16 sHandCursor_Pal[] = INCBIN_U16("graphics/pokemon_storage/hand_cursor.gbapal"); +static const u8 sHandCursor_Gfx[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor.4bpp"); +static const u8 sHandCursorShadow_Gfx[] = INCBIN_U8("graphics/pokemon_storage/hand_cursor_shadow.4bpp"); + + +//------------------------------------------------------------------------------ +// SECTION: Misc utility +//------------------------------------------------------------------------------ + -// code void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero2, s32 bytesToBuffer) { s32 i, tileBytesToBuffer, remainingBytes; @@ -1587,9 +1384,9 @@ void DrawTextWindowAndBufferTiles(const u8 *string, void *dst, u8 zero1, u8 zero } // Unused -void sub_80C6EAC(const u8 *string, void *dst, u16 arg2, u8 arg3, u8 clr2, u8 clr3) +static void UnusedDrawTextWindow(const u8 *string, void *dst, u16 offset, u8 bgColor, u8 fgColor, u8 shadowColor) { - u32 var; + u32 tileSize; u8 windowId; u8 txtColor[3]; u8 *tileData1, *tileData2; @@ -1597,17 +1394,17 @@ void sub_80C6EAC(const u8 *string, void *dst, u16 arg2, u8 arg3, u8 clr2, u8 clr winTemplate.width = StringLength_Multibyte(string); winTemplate.height = 2; - var = winTemplate.width * 32; + tileSize = winTemplate.width * 32; windowId = AddWindow(&winTemplate); - FillWindowPixelBuffer(windowId, PIXEL_FILL(arg3)); + FillWindowPixelBuffer(windowId, PIXEL_FILL(bgColor)); tileData1 = (u8*) GetWindowAttribute(windowId, WINDOW_TILE_DATA); tileData2 = (winTemplate.width * 32) + tileData1; - txtColor[0] = arg3; - txtColor[1] = clr2; - txtColor[2] = clr3; + txtColor[0] = bgColor; + txtColor[1] = fgColor; + txtColor[2] = shadowColor; AddTextPrinterParameterized4(windowId, 1, 0, 2, 0, 0, txtColor, -1, string); - CpuCopy16(tileData1, dst, var); - CpuCopy16(tileData2, dst + arg2, var); + CpuCopy16(tileData1, dst, tileSize); + CpuCopy16(tileData2, dst + offset, tileSize); RemoveWindow(windowId); } @@ -1702,7 +1499,8 @@ u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n) return str; } -static void sub_80C7128(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) +// Unused +static void UnusedWriteRectCpu(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, u16 src_left, u16 src_top, u16 dest_width, u16 dest_height, u16 src_width) { u16 i; @@ -1717,7 +1515,8 @@ static void sub_80C7128(u16 *dest, u16 dest_left, u16 dest_top, const u16 *src, } } -static void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) +// Unused +static void UnusedWriteRectDma(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 height) { u16 i; @@ -1727,109 +1526,136 @@ static void sub_80C71A4(u16 *dest, u16 dest_left, u16 dest_top, u16 width, u16 h Dma3FillLarge16_(0, dest, width); } -static void Task_PokemonStorageSystemPC(u8 taskId) + +//------------------------------------------------------------------------------ +// SECTION: Main menu +// +// The below functions generally handle the PC main menu where the main +// options can be selected (Withdraw, Deposit, etc.), as well as exiting +// Pokémon Storage back to this menu. +//------------------------------------------------------------------------------ + + +enum { + STATE_LOAD, + STATE_FADE_IN, + STATE_HANDLE_INPUT, + STATE_ERROR_MSG, + STATE_ENTER_PC, +}; + +#define tState data[0] +#define tSelectedOption data[1] +#define tInput data[2] +#define tNextOption data[3] +#define tWindowId data[15] + +static void Task_PCMainMenu(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { - case 0: - CreatePCMenu(task->data[1], &task->data[15]); + case STATE_LOAD: + CreateMainMenu(task->tSelectedOption, &task->tWindowId); LoadMessageBoxAndBorderGfx(); DrawDialogueFrame(0, 0); FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, TEXT_SPEED_FF, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, sMainMenuTexts[task->tSelectedOption].desc, TEXT_SPEED_FF, NULL, 2, 1, 3); CopyWindowToVram(0, 3); - CopyWindowToVram(task->data[15], 3); - task->data[0]++; + CopyWindowToVram(task->tWindowId, 3); + task->tState++; break; - case 1: + case STATE_FADE_IN: if (IsWeatherNotFadingIn()) - { - task->data[0]++; - } + task->tState++; break; - case 2: - task->data[2] = Menu_ProcessInput(); - switch(task->data[2]) + case STATE_HANDLE_INPUT: + task->tInput = Menu_ProcessInput(); + switch(task->tInput) { case MENU_NOTHING_CHOSEN: - task->data[3] = task->data[1]; - if (JOY_NEW(DPAD_UP) && --task->data[3] < 0) - task->data[3] = 4; + task->tNextOption = task->tSelectedOption; + if (JOY_NEW(DPAD_UP) && --task->tNextOption < 0) + task->tNextOption = OPTIONS_COUNT - 1; + if (JOY_NEW(DPAD_DOWN) && ++task->tNextOption > OPTIONS_COUNT - 1) + task->tNextOption = 0; - if (JOY_NEW(DPAD_DOWN) && ++task->data[3] > 4) - task->data[3] = 0; - if (task->data[1] != task->data[3]) + if (task->tSelectedOption != task->tNextOption) { - task->data[1] = task->data[3]; + task->tSelectedOption = task->tNextOption; FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); + AddTextPrinterParameterized2(0, 1, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, 2, 1, 3); } break; case MENU_B_PRESSED: - case 4: - ClearStdWindowAndFrame(task->data[15], TRUE); + case OPTION_EXIT: + ClearStdWindowAndFrame(task->tWindowId, TRUE); ScriptContext2_Disable(); EnableBothScriptContexts(); - RemoveWindow(task->data[15]); + RemoveWindow(task->tWindowId); DestroyTask(taskId); break; default: - if (task->data[2] == 0 && CountPartyMons() == PARTY_SIZE) + if (task->tInput == OPTION_WITHDRAW && CountPartyMons() == PARTY_SIZE) { + // Can't withdraw FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, 1, gText_PartyFull, 0, NULL, 2, 1, 3); - task->data[0] = 3; + task->tState = STATE_ERROR_MSG; } - else if (task->data[2] == 1 && CountPartyMons() == 1) + else if (task->tInput == OPTION_DEPOSIT && CountPartyMons() == 1) { + // Can't deposit FillWindowPixelBuffer(0, PIXEL_FILL(1)); AddTextPrinterParameterized2(0, 1, gText_JustOnePkmn, 0, NULL, 2, 1, 3); - task->data[0] = 3; + task->tState = STATE_ERROR_MSG; } else { + // Enter PC FadeScreen(FADE_TO_BLACK, 0); - task->data[0] = 4; + task->tState = STATE_ENTER_PC; } break; } break; - case 3: + case STATE_ERROR_MSG: + // Printed "can't do PC option message" + // Wait for new input after message if (JOY_NEW(A_BUTTON | B_BUTTON)) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); - task->data[0] = 2; + AddTextPrinterParameterized2(0, 1, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, 2, 1, 3); + task->tState = STATE_HANDLE_INPUT; } else if (JOY_NEW(DPAD_UP)) { - if (--task->data[1] < 0) - task->data[1] = 4; + if (--task->tSelectedOption < 0) + task->tSelectedOption = OPTIONS_COUNT - 1; Menu_MoveCursor(-1); - task->data[1] = Menu_GetCursorPos(); + task->tSelectedOption = Menu_GetCursorPos(); FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); - task->data[0] = 2; + AddTextPrinterParameterized2(0, 1, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, 2, 1, 3); + task->tState = STATE_HANDLE_INPUT; } else if (JOY_NEW(DPAD_DOWN)) { - if (++task->data[1] > 3) - task->data[1] = 0; + if (++task->tSelectedOption >= OPTIONS_COUNT - 1) + task->tSelectedOption = 0; Menu_MoveCursor(1); - task->data[1] = Menu_GetCursorPos(); + task->tSelectedOption = Menu_GetCursorPos(); FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized2(0, 1, gUnknown_085716C0[task->data[1]].desc, 0, NULL, 2, 1, 3); - task->data[0] = 2; + AddTextPrinterParameterized2(0, 1, sMainMenuTexts[task->tSelectedOption].desc, 0, NULL, 2, 1, 3); + task->tState = STATE_HANDLE_INPUT; } break; - case 4: + case STATE_ENTER_PC: if (!gPaletteFade.active) { CleanupOverworldWindowsAndTilemaps(); - Cb2_EnterPSS(task->data[2]); - RemoveWindow(task->data[15]); + EnterPokeStorage(task->tInput); + RemoveWindow(task->tWindowId); DestroyTask(taskId); } break; @@ -1838,46 +1664,53 @@ static void Task_PokemonStorageSystemPC(u8 taskId) void ShowPokemonStorageSystemPC(void) { - u8 taskId = CreateTask(Task_PokemonStorageSystemPC, 80); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; + u8 taskId = CreateTask(Task_PCMainMenu, 80); + gTasks[taskId].tState = 0; + gTasks[taskId].tSelectedOption = 0; ScriptContext2_Enable(); } -static void FieldCb_ReturnToPcMenu(void) +static void FieldTask_ReturnToPcMenu(void) { u8 taskId; MainCallback vblankCb = gMain.vblankCallback; SetVBlankCallback(NULL); - taskId = CreateTask(Task_PokemonStorageSystemPC, 80); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = sPreviousBoxOption; - Task_PokemonStorageSystemPC(taskId); + taskId = CreateTask(Task_PCMainMenu, 80); + gTasks[taskId].tState = 0; + gTasks[taskId].tSelectedOption = sPreviousBoxOption; + Task_PCMainMenu(taskId); SetVBlankCallback(vblankCb); FadeInFromBlack(); } -static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr) +#undef tState +#undef tSelectedOption +#undef tInput +#undef tNextOption +#undef tWindowId + +static void CreateMainMenu(u8 whichMenu, s16 *windowIdPtr) { s16 windowId; - struct WindowTemplate winTemplate = gUnknown_085716E8; - winTemplate.width = GetMaxWidthInMenuTable((void *)gUnknown_085716C0, ARRAY_COUNT(gUnknown_085716C0)); - windowId = AddWindow(&winTemplate); + struct WindowTemplate template = sWindowTemplate_MainMenu; + template.width = GetMaxWidthInMenuTable((void *)sMainMenuTexts, OPTIONS_COUNT); + windowId = AddWindow(&template); DrawStdWindowFrame(windowId, FALSE); - PrintMenuTable(windowId, ARRAY_COUNT(gUnknown_085716C0), (void *)gUnknown_085716C0); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, ARRAY_COUNT(gUnknown_085716C0), whichMenu); + PrintMenuTable(windowId, OPTIONS_COUNT, (void *)sMainMenuTexts); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(windowId, OPTIONS_COUNT, whichMenu); *windowIdPtr = windowId; } -static void Cb2_ExitPSS(void) +static void CB2_ExitPokeStorage(void) { sPreviousBoxOption = GetCurrentBoxOption(); - gFieldCallback = FieldCb_ReturnToPcMenu; + gFieldCallback = FieldTask_ReturnToPcMenu; SetMainCallback2(CB2_ReturnToField); } +// Unused static s16 StorageSystemGetNextMonIndex(struct BoxPokemon *box, s8 startIdx, u8 stopIdx, u8 mode) { s16 i; @@ -1924,81 +1757,92 @@ void ResetPokemonStorageSystem(void) u8 *dest = StringCopy(GetBoxNamePtr(boxId), gText_Box); ConvertIntToDecimalStringN(dest, boxId + 1, STR_CONV_MODE_LEFT_ALIGN, 2); } + for (boxId = 0; boxId < TOTAL_BOXES_COUNT; boxId++) - { - SetBoxWallpaper(boxId, boxId % 4); - } + SetBoxWallpaper(boxId, boxId % (MAX_DEFAULT_WALLPAPER + 1)); + ResetWaldaWallpaper(); } -static void sub_80C77E8(struct UnkPSSStruct_2002370 *a0, u16 tileTag, u16 palTag, u8 a3, bool32 loadPal) + +//------------------------------------------------------------------------------ +// SECTION: Choose Box menu +// +// The below functions handle the popup menu that allows the player to cycle +// through the boxes and select one. Used when storing Pokémon in Deposit mode +// and for the Jump feature. +//------------------------------------------------------------------------------ + + +static void LoadChooseBoxMenuGfx(struct ChooseBoxMenu *menu, u16 tileTag, u16 palTag, u8 subpriority, bool32 loadPal) { struct SpritePalette palette = { - gBoxSelectionPopupPalette, palTag + sChooseBoxMenu_Pal, palTag }; struct SpriteSheet sheets[] = { - {gBoxSelectionPopupCenterTiles, 0x800, tileTag}, - {gBoxSelectionPopupSidesTiles, 0x180, tileTag + 1}, + {sChooseBoxMenuCenter_Gfx, 0x800, tileTag}, + {sChooseBoxMenuSides_Gfx, 0x180, tileTag + 1}, {} }; - if (loadPal) + if (loadPal) // Always false LoadSpritePalette(&palette); LoadSpriteSheets(sheets); - gUnknown_02039D04 = a0; - a0->unk_0240 = tileTag; - a0->unk_0242 = palTag; - a0->unk_0246 = a3; - a0->unk_023c = loadPal; + sChooseBoxMenu = menu; + menu->tileTag = tileTag; + menu->paletteTag = palTag; + menu->subpriority = subpriority; + menu->loadedPalette = loadPal; } -static void sub_80C7890(void) +static void FreeChooseBoxMenu(void) { - if (gUnknown_02039D04->unk_023c) - FreeSpritePaletteByTag(gUnknown_02039D04->unk_0242); - FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240); - FreeSpriteTilesByTag(gUnknown_02039D04->unk_0240 + 1); + if (sChooseBoxMenu->loadedPalette) + FreeSpritePaletteByTag(sChooseBoxMenu->paletteTag); + FreeSpriteTilesByTag(sChooseBoxMenu->tileTag); + FreeSpriteTilesByTag(sChooseBoxMenu->tileTag + 1); } -static void sub_80C78D4(u8 curBox) +static void CreateChooseBoxMenuSprites(u8 curBox) { - sub_80C7958(curBox); + ChooseBoxMenu_CreateSprites(curBox); } -static void sub_80C78E4(void) +static void DestroyChooseBoxMenuSprites(void) { - sub_80C7B14(); + ChooseBoxMenu_DestroySprites(); } -static u8 HandleBoxChooseSelectionInput(void) +// For the popout window when choosing a box to deposit in or jump to +static u8 HandleChooseBoxMenuInput(void) { if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - return 201; + return BOXID_CANCELED; } if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - return gUnknown_02039D04->curBox; + return sChooseBoxMenu->curBox; } if (JOY_NEW(DPAD_LEFT)) { PlaySE(SE_SELECT); - sub_80C7BB4(); + ChooseBoxMenu_MoveLeft(); } else if (JOY_NEW(DPAD_RIGHT)) { PlaySE(SE_SELECT); - sub_80C7B80(); + ChooseBoxMenu_MoveRight(); } - return 200; + return BOXID_NONE_CHOSEN; } -static void sub_80C7958(u8 curBox) +static void ChooseBoxMenu_CreateSprites(u8 curBox) { u16 i; u8 spriteId; @@ -2010,116 +1854,118 @@ static void sub_80C7958(u8 curBox) 0, 0, &oamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; - gUnknown_02039D04->curBox = curBox; - template.tileTag = gUnknown_02039D04->unk_0240; - template.paletteTag = gUnknown_02039D04->unk_0242; + sChooseBoxMenu->curBox = curBox; + template.tileTag = sChooseBoxMenu->tileTag; + template.paletteTag = sChooseBoxMenu->paletteTag; spriteId = CreateSprite(&template, 160, 96, 0); - gUnknown_02039D04->unk_0000 = gSprites + spriteId; + sChooseBoxMenu->menuSprite = &gSprites[spriteId]; oamData.shape = SPRITE_SHAPE(8x32); oamData.size = SPRITE_SIZE(8x32); - template.tileTag = gUnknown_02039D04->unk_0240 + 1; - template.anims = sSpriteAnimTable_8571710; - for (i = 0; i < 4; i++) - { - u16 r5; - spriteId = CreateSprite(&template, 124, 80, gUnknown_02039D04->unk_0246); - gUnknown_02039D04->unk_0004[i] = gSprites + spriteId; - r5 = 0; + template.tileTag = sChooseBoxMenu->tileTag + 1; + template.anims = sAnims_ChooseBoxMenu; + for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->menuSideSprites); i++) + { + u16 anim; + spriteId = CreateSprite(&template, 124, 80, sChooseBoxMenu->subpriority); + sChooseBoxMenu->menuSideSprites[i] = &gSprites[spriteId]; + anim = 0; if (i & 2) { - gUnknown_02039D04->unk_0004[i]->pos1.x = 196; - r5 = 2; + sChooseBoxMenu->menuSideSprites[i]->pos1.x = 196; + anim = 2; } if (i & 1) { - gUnknown_02039D04->unk_0004[i]->pos1.y = 112; - gUnknown_02039D04->unk_0004[i]->oam.size = 0; - r5++; + sChooseBoxMenu->menuSideSprites[i]->pos1.y = 112; + sChooseBoxMenu->menuSideSprites[i]->oam.size = 0; + anim++; } - StartSpriteAnim(gUnknown_02039D04->unk_0004[i], r5); + StartSpriteAnim(sChooseBoxMenu->menuSideSprites[i], anim); } - for (i = 0; i < 2; i++) + for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->arrowSprites); i++) { - gUnknown_02039D04->unk_0020[i] = sub_80CD2E8(72 * i + 0x7c, 0x58, i, 0, gUnknown_02039D04->unk_0246); - if (gUnknown_02039D04->unk_0020[i]) + sChooseBoxMenu->arrowSprites[i] = CreateChooseBoxArrows(72 * i + 124, 88, i, 0, sChooseBoxMenu->subpriority); + if (sChooseBoxMenu->arrowSprites[i]) { - gUnknown_02039D04->unk_0020[i]->data[0] = (i == 0 ? -1 : 1); - gUnknown_02039D04->unk_0020[i]->callback = sub_80C7CF4; + sChooseBoxMenu->arrowSprites[i]->data[0] = (i == 0 ? -1 : 1); + sChooseBoxMenu->arrowSprites[i]->callback = SpriteCB_ChooseBoxArrow; } } - sub_80C7BE4(); + ChooseBoxMenu_PrintInfo(); } -static void sub_80C7B14(void) +static void ChooseBoxMenu_DestroySprites(void) { u16 i; - if (gUnknown_02039D04->unk_0000) + if (sChooseBoxMenu->menuSprite) { - DestroySprite(gUnknown_02039D04->unk_0000); - gUnknown_02039D04->unk_0000 = NULL; + DestroySprite(sChooseBoxMenu->menuSprite); + sChooseBoxMenu->menuSprite = NULL; } - for (i = 0; i < 4; i++) + for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->menuSideSprites); i++) { - if (gUnknown_02039D04->unk_0004[i]) + if (sChooseBoxMenu->menuSideSprites[i]) { - DestroySprite(gUnknown_02039D04->unk_0004[i]); - gUnknown_02039D04->unk_0004[i] = NULL; + DestroySprite(sChooseBoxMenu->menuSideSprites[i]); + sChooseBoxMenu->menuSideSprites[i] = NULL; } } - for (i = 0; i < 2; i++) + for (i = 0; i < ARRAY_COUNT(sChooseBoxMenu->arrowSprites); i++) { - if (gUnknown_02039D04->unk_0020[i]) - DestroySprite(gUnknown_02039D04->unk_0020[i]); + if (sChooseBoxMenu->arrowSprites[i]) + DestroySprite(sChooseBoxMenu->arrowSprites[i]); } } -static void sub_80C7B80(void) +static void ChooseBoxMenu_MoveRight(void) { - if (++gUnknown_02039D04->curBox >= TOTAL_BOXES_COUNT) - gUnknown_02039D04->curBox = 0; - sub_80C7BE4(); + if (++sChooseBoxMenu->curBox >= TOTAL_BOXES_COUNT) + sChooseBoxMenu->curBox = 0; + ChooseBoxMenu_PrintInfo(); } -static void sub_80C7BB4(void) +static void ChooseBoxMenu_MoveLeft(void) { - gUnknown_02039D04->curBox = (gUnknown_02039D04->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : gUnknown_02039D04->curBox - 1); - sub_80C7BE4(); + sChooseBoxMenu->curBox = (sChooseBoxMenu->curBox == 0 ? TOTAL_BOXES_COUNT - 1 : sChooseBoxMenu->curBox - 1); + ChooseBoxMenu_PrintInfo(); } -static void sub_80C7BE4(void) +static void ChooseBoxMenu_PrintInfo(void) { u8 numBoxMonsText[16]; - struct WindowTemplate winTemplate; + struct WindowTemplate template; u8 windowId; - u8 *boxName = GetBoxNamePtr(gUnknown_02039D04->curBox); - u8 nPokemonInBox = CountMonsInBox(gUnknown_02039D04->curBox); + u8 *boxName = GetBoxNamePtr(sChooseBoxMenu->curBox); + u8 numInBox = CountMonsInBox(sChooseBoxMenu->curBox); u32 winTileData; s32 center; - memset(&winTemplate, 0, sizeof(winTemplate)); - winTemplate.width = 8; - winTemplate.height = 4; + memset(&template, 0, sizeof(template)); + template.width = 8; + template.height = 4; - windowId = AddWindow(&winTemplate); + windowId = AddWindow(&template); FillWindowPixelBuffer(windowId, PIXEL_FILL(4)); + // Print box name center = GetStringCenterAlignXOffset(1, boxName, 64); - AddTextPrinterParameterized3(windowId, 1, center, 1, sBoxInfoTextColors, TEXT_SPEED_FF, boxName); + AddTextPrinterParameterized3(windowId, 1, center, 1, sChooseBoxMenu_TextColors, TEXT_SPEED_FF, boxName); - ConvertIntToDecimalStringN(numBoxMonsText, nPokemonInBox, STR_CONV_MODE_RIGHT_ALIGN, 2); + // Print #/30 for number of Pokémon in the box + ConvertIntToDecimalStringN(numBoxMonsText, numInBox, STR_CONV_MODE_RIGHT_ALIGN, 2); StringAppend(numBoxMonsText, sText_OutOf30); center = GetStringCenterAlignXOffset(1, numBoxMonsText, 64); - AddTextPrinterParameterized3(windowId, 1, center, 17, sBoxInfoTextColors, TEXT_SPEED_FF, numBoxMonsText); + AddTextPrinterParameterized3(windowId, 1, center, 17, sChooseBoxMenu_TextColors, TEXT_SPEED_FF, numBoxMonsText); winTileData = GetWindowAttribute(windowId, WINDOW_TILE_DATA); - CpuCopy32((void *)winTileData, (void *)OBJ_VRAM0 + 0x100 + (GetSpriteTileStartByTag(gUnknown_02039D04->unk_0240) * 32), 0x400); + CpuCopy32((void *)winTileData, (void *)OBJ_VRAM0 + 0x100 + (GetSpriteTileStartByTag(sChooseBoxMenu->tileTag) * 32), 0x400); RemoveWindow(windowId); } -static void sub_80C7CF4(struct Sprite *sprite) +static void SpriteCB_ChooseBoxArrow(struct Sprite *sprite) { if (++sprite->data[1] > 3) { @@ -2133,61 +1979,72 @@ static void sub_80C7CF4(struct Sprite *sprite) } } -static void VblankCb_PSS(void) + +//------------------------------------------------------------------------------ +// SECTION: Main tasks +// +// Below are the main task callbacks that handle the primary actions the +// player can take in the PC. The most 'important' of these tasks is the +// primary one, Task_PokeStorageMain. Also included are some basic +// initialization functions. +//------------------------------------------------------------------------------ + + +static void VBlankCB_PokeStorage(void) { LoadOam(); ProcessSpriteCopyRequests(); - sub_80D2AA4(); + UnkUtil_Run(); TransferPlttBuffer(); - SetGpuReg(REG_OFFSET_BG2HOFS, sPSSData->bg2_X); + SetGpuReg(REG_OFFSET_BG2HOFS, sStorage->bg2_X); } -static void Cb2_PSS(void) +static void CB2_PokeStorage(void) { RunTasks(); DoScheduledBgTilemapCopiesToVram(); ScrollBackground(); - sub_80CAA14(); + UpdateCloseBoxButtonFlash(); AnimateSprites(); BuildOamBuffer(); } -static void Cb2_EnterPSS(u8 boxOption) +static void EnterPokeStorage(u8 boxOption) { ResetTasks(); sCurrentBoxOption = boxOption; - sPSSData = Alloc(sizeof(*sPSSData)); - if (sPSSData == NULL) + sStorage = Alloc(sizeof(*sStorage)); + if (sStorage == NULL) { - SetMainCallback2(Cb2_ExitPSS); + SetMainCallback2(CB2_ExitPokeStorage); } else { - sPSSData->boxOption = boxOption; - sPSSData->isReshowingPSS = FALSE; + sStorage->boxOption = boxOption; + sStorage->isReopening = FALSE; sMovingItemId = ITEM_NONE; - sPSSData->state = 0; - sPSSData->taskId = CreateTask(Cb_InitPSS, 3); + sStorage->state = 0; + sStorage->taskId = CreateTask(Task_InitPokeStorage, 3); sLastUsedBox = StorageGetCurrentBox(); - SetMainCallback2(Cb2_PSS); + SetMainCallback2(CB2_PokeStorage); } } -static void Cb2_ReturnToPSS(void) +static void CB2_ReturnToPokeStorage(void) { ResetTasks(); - sPSSData = Alloc(sizeof(*sPSSData)); - if (sPSSData == NULL) + sStorage = Alloc(sizeof(*sStorage)); + if (sStorage == NULL) { - SetMainCallback2(Cb2_ExitPSS); + SetMainCallback2(CB2_ExitPokeStorage); } else { - sPSSData->boxOption = sCurrentBoxOption; - sPSSData->isReshowingPSS = TRUE; - sPSSData->state = 0; - sPSSData->taskId = CreateTask(Cb_InitPSS, 3); - SetMainCallback2(Cb2_PSS); + sStorage->boxOption = sCurrentBoxOption; + sStorage->isReopening = TRUE; + sStorage->state = 0; + sStorage->taskId = CreateTask(Task_InitPokeStorage, 3); + SetMainCallback2(CB2_PokeStorage); } } @@ -2203,7 +2060,7 @@ static void ResetAllBgCoords(void) SetGpuReg(REG_OFFSET_BG3VOFS, 0); } -static void sub_80C7E98(void) +static void ResetForPokeStorage(void) { ResetPaletteFade(); ResetSpriteData(); @@ -2211,25 +2068,25 @@ static void sub_80C7E98(void) FreeAllSpritePalettes(); ClearDma3Requests(); gReservedSpriteTileCount = 0x280; - sub_80D2A90(&sPSSData->unk_0020, sPSSData->unk_0028, 8); + UnkUtil_Init(&sStorage->unkUtil, sStorage->unkUtilData, ARRAY_COUNT(sStorage->unkUtilData)); gKeyRepeatStartDelay = 20; ClearScheduledBgCopiesToVram(); - sub_80D259C(3); - sub_80D2644(0, 1, gUnknown_0857239C, 8, 4); - sub_80D2770(0, 1, 0); - sPSSData->unk_02C7 = 0; + TilemapUtil_Init(TILEMAPID_COUNT); + TilemapUtil_SetMap(TILEMAPID_PKMN_DATA, 1, sPkmnData_Tilemap, 8, 4); + TilemapUtil_SetPos(TILEMAPID_PKMN_DATA, 1, 0); + sStorage->closeBoxFlashing = FALSE; } -static void sub_80C7F1C(void) +static void InitStartingPosData(void) { - sub_80CDC0C(); - sInPartyMenu = (sPSSData->boxOption == BOX_OPTION_DEPOSIT); - gUnknown_02039D0E = 0; + ClearSavedCursorPos(); + sInPartyMenu = (sStorage->boxOption == OPTION_DEPOSIT); + sDepositBoxId = 0; } static void SetMonIconTransparency(void) { - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(7, 11)); @@ -2237,42 +2094,45 @@ static void SetMonIconTransparency(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_1D_MAP); } -static void SetPSSCallback(TaskFunc newFunc) +static void SetPokeStorageTask(TaskFunc newFunc) { - gTasks[sPSSData->taskId].func = newFunc; - sPSSData->state = 0; + gTasks[sStorage->taskId].func = newFunc; + sStorage->state = 0; } -static void Cb_InitPSS(u8 taskId) +static void Task_InitPokeStorage(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, 0); - sub_80C7E98(); - if (sPSSData->isReshowingPSS) + ResetForPokeStorage(); + if (sStorage->isReopening) { switch (sWhichToReshow) { - case 1: - sub_80CE790(); + case SCREEN_CHANGE_NAME_BOX - 1: + // Return from naming box + LoadSavedMovingMon(); break; - case 0: - sub_80CE8E4(); + case SCREEN_CHANGE_SUMMARY_SCREEN - 1: + // Return from summary screen + SetSelectionAfterSummaryScreen(); break; - case 2: + case SCREEN_CHANGE_ITEM_FROM_BAG - 1: + // Return from bag menu GiveChosenBagItem(); break; } } - LoadPSSMenuGfx(); + LoadPokeStorageMenuGfx(); LoadWaveformSpritePalette(); break; case 1: - if (!InitPSSWindows()) + if (!InitPokeStorageWindows()) { - SetPSSCallback(Cb_ChangeScreen); + SetPokeStorageTask(Task_ChangeScreen); return; } break; @@ -2284,110 +2144,110 @@ static void Cb_InitPSS(u8 taskId) break; case 3: ResetAllBgCoords(); - if (!sPSSData->isReshowingPSS) - sub_80C7F1C(); + if (!sStorage->isReopening) + InitStartingPosData(); break; case 4: - sub_80CAF04(); - if (!sPSSData->isReshowingPSS) - sub_80CD36C(); + InitMonIconFields(); + if (!sStorage->isReopening) + InitCursor(); else - sub_80CD3EC(); + InitCursorOnReopen(); break; case 5: - if (!sub_80D0164()) + if (!MultiMove_Init()) { - SetPSSCallback(Cb_ChangeScreen); + SetPokeStorageTask(Task_ChangeScreen); return; } else { SetScrollingBackground(); - sub_80CAC1C(); + InitPokeStorageBg0(); } break; case 6: - sub_80CA0D8(); + InitPalettesAndSprites(); break; case 7: - sub_80CA704(); + InitSupplementalTilemaps(); break; case 8: - sub_80CC32C(StorageGetCurrentBox()); + CreateInitBoxTask(StorageGetCurrentBox()); break; case 9: - if (sub_80CC35C()) + if (IsInitBoxActive()) return; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - sPSSData->markMenu.baseTileTag = TAG_TILE_D; - sPSSData->markMenu.basePaletteTag = TAG_PAL_DACE; - sub_811F90C(&sPSSData->markMenu); - sub_811FA90(); + sStorage->markMenu.baseTileTag = GFXTAG_MARKING_MENU; + sStorage->markMenu.basePaletteTag = PALTAG_MARKING_MENU; + InitMonMarkingsMenu(&sStorage->markMenu); + BufferMonMarkingsMenuTiles(); } else { - sub_80D0C60(); - sub_80CAEAC(); + CreateItemIconSprites(); + InitCursorItemIcon(); } break; case 10: SetMonIconTransparency(); - if (!sPSSData->isReshowingPSS) + if (!sStorage->isReopening) { - BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); - SetPSSCallback(Cb_ShowPSS); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + SetPokeStorageTask(Task_ShowPokeStorage); } else { - BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); - SetPSSCallback(Cb_ReshowPSS); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + SetPokeStorageTask(Task_ReshowPokeStorage); } - SetVBlankCallback(VblankCb_PSS); + SetVBlankCallback(VBlankCB_PokeStorage); return; default: return; } - sPSSData->state++; + sStorage->state++; } -static void Cb_ShowPSS(u8 taskId) +static void Task_ShowPokeStorage(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: PlaySE(SE_PC_LOGIN); ComputerScreenOpenEffect(20, 0, 1); - sPSSData->state++; + sStorage->state++; break; case 1: if (!IsComputerScreenOpenEffectActive()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_ReshowPSS(u8 taskId) +static void Task_ReshowPokeStorage(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, RGB_BLACK); - sPSSData->state++; + BeginNormalPaletteFade(PALETTES_ALL, -1, 0x10, 0, RGB_BLACK); + sStorage->state++; break; case 1: if (!UpdatePaletteFade()) { - if (sWhichToReshow == 2 && gSpecialVar_ItemId != 0) + if (sWhichToReshow == SCREEN_CHANGE_ITEM_FROM_BAG - 1 && gSpecialVar_ItemId != ITEM_NONE) { - PrintStorageActionText(PC_TEXT_ITEM_IS_HELD); - sPSSData->state++; + PrintMessage(MSG_ITEM_IS_HELD); + sStorage->state++; } else { - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } } break; @@ -2395,557 +2255,579 @@ static void Cb_ReshowPSS(u8 taskId) if (!IsDma3ManagerBusyWithBgCopy() && JOY_NEW(A_BUTTON | B_BUTTON)) { ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_MainPSS(u8 taskId) +// States for the outer switch in Task_PokeStorageMain +enum { + MSTATE_HANDLE_INPUT, + MSTATE_MOVE_CURSOR, + MSTATE_SCROLL_BOX, + MSTATE_WAIT_MSG, + MSTATE_ERROR_LAST_PARTY_MON, + MSTATE_ERROR_HAS_MAIL, + MSTATE_WAIT_ERROR_MSG, + MSTATE_MULTIMOVE_RUN, + MSTATE_MULTIMOVE_RUN_CANCEL, + MSTATE_MULTIMOVE_RUN_MOVED, + MSTATE_SCROLL_BOX_ITEM, + MSTATE_WAIT_ITEM_ANIM, +}; + +static void Task_PokeStorageMain(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { - case 0: + case MSTATE_HANDLE_INPUT: switch (HandleInput()) { - case 1: + case INPUT_MOVE_CURSOR: PlaySE(SE_SELECT); - sPSSData->state = 1; + sStorage->state = MSTATE_MOVE_CURSOR; break; - case 5: - if (sPSSData->boxOption != BOX_OPTION_MOVE_MONS && sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + case INPUT_SHOW_PARTY: + if (sStorage->boxOption != OPTION_MOVE_MONS && sStorage->boxOption != OPTION_MOVE_ITEMS) { - PrintStorageActionText(PC_TEXT_WHICH_ONE_WILL_TAKE); - sPSSData->state = 3; + PrintMessage(MSG_WHICH_ONE_WILL_TAKE); + sStorage->state = MSTATE_WAIT_MSG; } else { - sub_80CDC0C(); - SetPSSCallback(Cb_ShowPartyPokemon); + ClearSavedCursorPos(); + SetPokeStorageTask(Task_ShowPartyPokemon); } break; - case 6: - if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS) + case INPUT_HIDE_PARTY: + if (sStorage->boxOption == OPTION_MOVE_MONS) { - if (IsMonBeingMoved() && ItemIsMail(sPSSData->cursorMonItem)) - sPSSData->state = 5; + if (IsMonBeingMoved() && ItemIsMail(sStorage->displayMonItemId)) + sStorage->state = MSTATE_ERROR_HAS_MAIL; else - SetPSSCallback(Cb_HidePartyPokemon); + SetPokeStorageTask(Task_HidePartyPokemon); } - else if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + else if (sStorage->boxOption == OPTION_MOVE_ITEMS) { - SetPSSCallback(Cb_HidePartyPokemon); + SetPokeStorageTask(Task_HidePartyPokemon); } break; - case 4: - SetPSSCallback(Cb_OnCloseBoxPressed); + case INPUT_CLOSE_BOX: + SetPokeStorageTask(Task_OnCloseBoxPressed); break; - case 19: - SetPSSCallback(Cb_OnBPressed); + case INPUT_PRESSED_B: + SetPokeStorageTask(Task_OnBPressed); break; - case 7: + case INPUT_BOX_OPTIONS: PlaySE(SE_SELECT); - SetPSSCallback(Cb_HandleBoxOptions); + SetPokeStorageTask(Task_HandleBoxOptions); break; - case 8: - SetPSSCallback(Cb_OnSelectedMon); + case INPUT_IN_MENU: + SetPokeStorageTask(Task_OnSelectedMon); break; - case 9: + case INPUT_SCROLL_RIGHT: PlaySE(SE_SELECT); - sPSSData->newCurrBoxId = StorageGetCurrentBox() + 1; - if (sPSSData->newCurrBoxId >= TOTAL_BOXES_COUNT) - sPSSData->newCurrBoxId = 0; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + sStorage->newCurrBoxId = StorageGetCurrentBox() + 1; + if (sStorage->newCurrBoxId >= TOTAL_BOXES_COUNT) + sStorage->newCurrBoxId = 0; + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - SetUpScrollToBox(sPSSData->newCurrBoxId); - sPSSData->state = 2; + SetUpScrollToBox(sStorage->newCurrBoxId); + sStorage->state = MSTATE_SCROLL_BOX; } else { - sub_80CFEA8(); - sPSSData->state = 10; + TryHideItemAtCursor(); + sStorage->state = MSTATE_SCROLL_BOX_ITEM; } break; - case 10: + case INPUT_SCROLL_LEFT: PlaySE(SE_SELECT); - sPSSData->newCurrBoxId = StorageGetCurrentBox() - 1; - if (sPSSData->newCurrBoxId < 0) - sPSSData->newCurrBoxId = TOTAL_BOXES_COUNT - 1; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + sStorage->newCurrBoxId = StorageGetCurrentBox() - 1; + if (sStorage->newCurrBoxId < 0) + sStorage->newCurrBoxId = TOTAL_BOXES_COUNT - 1; + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - SetUpScrollToBox(sPSSData->newCurrBoxId); - sPSSData->state = 2; + SetUpScrollToBox(sStorage->newCurrBoxId); + sStorage->state = MSTATE_SCROLL_BOX; } else { - sub_80CFEA8(); - sPSSData->state = 10; + TryHideItemAtCursor(); + sStorage->state = MSTATE_SCROLL_BOX_ITEM; } break; - case 11: - if (!CanMovePartyMon()) + case INPUT_DEPOSIT: + if (!IsRemovingLastPartyMon()) { - if (ItemIsMail(sPSSData->cursorMonItem)) + if (ItemIsMail(sStorage->displayMonItemId)) { - sPSSData->state = 5; + sStorage->state = MSTATE_ERROR_HAS_MAIL; } else { PlaySE(SE_SELECT); - SetPSSCallback(Cb_DepositMenu); + SetPokeStorageTask(Task_DepositMenu); } } else { - sPSSData->state = 4; + sStorage->state = MSTATE_ERROR_LAST_PARTY_MON; } break; - case 13: - if (CanMovePartyMon()) + case INPUT_MOVE_MON: + if (IsRemovingLastPartyMon()) { - sPSSData->state = 4; + sStorage->state = MSTATE_ERROR_LAST_PARTY_MON; } else { PlaySE(SE_SELECT); - SetPSSCallback(Cb_MoveMon); + SetPokeStorageTask(Task_MoveMon); } break; - case 14: + case INPUT_SHIFT_MON: if (!CanShiftMon()) { - sPSSData->state = 4; + sStorage->state = MSTATE_ERROR_LAST_PARTY_MON; } else { PlaySE(SE_SELECT); - SetPSSCallback(Cb_ShiftMon); + SetPokeStorageTask(Task_ShiftMon); } break; - case 12: + case INPUT_WITHDRAW: PlaySE(SE_SELECT); - SetPSSCallback(Cb_WithdrawMon); + SetPokeStorageTask(Task_WithdrawMon); break; - case 15: + case INPUT_PLACE_MON: PlaySE(SE_SELECT); - SetPSSCallback(Cb_PlaceMon); + SetPokeStorageTask(Task_PlaceMon); break; - case 16: + case INPUT_TAKE_ITEM: PlaySE(SE_SELECT); - SetPSSCallback(Cb_TakeItemForMoving); + SetPokeStorageTask(Task_TakeItemForMoving); break; - case 17: + case INPUT_GIVE_ITEM: PlaySE(SE_SELECT); - SetPSSCallback(Cb_GiveMovingItemToMon); + SetPokeStorageTask(Task_GiveMovingItemToMon); break; - case 18: + case INPUT_SWITCH_ITEMS: PlaySE(SE_SELECT); - SetPSSCallback(Cb_SwitchSelectedItem); + SetPokeStorageTask(Task_SwitchSelectedItem); break; - case 20: + case INPUT_MULTIMOVE_START: PlaySE(SE_SELECT); - sub_80D01D0(0); - sPSSData->state = 7; + MultiMove_SetFunction(MULTIMOVE_START); + sStorage->state = MSTATE_MULTIMOVE_RUN; break; - case 22: - sub_80D01D0(1); - sPSSData->state = 8; + case INPUT_MULTIMOVE_SINGLE: + MultiMove_SetFunction(MULTIMOVE_CANCEL); + sStorage->state = MSTATE_MULTIMOVE_RUN_CANCEL; break; - case 21: + case INPUT_MULTIMOVE_CHANGE_SELECTION: PlaySE(SE_SELECT); - sub_80D01D0(2); - sPSSData->state = 9; + MultiMove_SetFunction(MULTIMOVE_CHANGE_SELECTION); + sStorage->state = MSTATE_MULTIMOVE_RUN_MOVED; break; - case 23: - sub_80D01D0(3); - sPSSData->state = 7; + case INPUT_MULTIMOVE_GRAB_SELECTION: + MultiMove_SetFunction(MULTIMOVE_GRAB_SELECTION); + sStorage->state = MSTATE_MULTIMOVE_RUN; break; - case 25: + case INPUT_MULTIMOVE_MOVE_MONS: PlaySE(SE_SELECT); - sub_80D01D0(4); - sPSSData->state = 9; + MultiMove_SetFunction(MULTIMOVE_MOVE_MONS); + sStorage->state = MSTATE_MULTIMOVE_RUN_MOVED; break; - case 26: + case INPUT_MULTIMOVE_PLACE_MONS: PlaySE(SE_SELECT); - sub_80D01D0(5); - sPSSData->state = 7; + MultiMove_SetFunction(MULTIMOVE_PLACE_MONS); + sStorage->state = MSTATE_MULTIMOVE_RUN; break; - case 24: + case INPUT_MULTIMOVE_UNABLE: + // When selecting/moving multiple Pokémon the + // cursor may not wrap around the edges. PlaySE(SE_FAILURE); break; } break; - case 1: - if (!sub_80CD554()) + case MSTATE_MOVE_CURSOR: + if (!UpdateCursorPos()) { if (IsCursorOnCloseBox()) - sub_80CA9C0(); + StartFlashingCloseBoxButton(); else - sub_80CA9EC(); + StopFlashingCloseBoxButton(); - if (sPSSData->setMosaic) - BoxSetMosaic(); - sPSSData->state = 0; + if (sStorage->setMosaic) + StartDisplayMonMosaicEffect(); + sStorage->state = MSTATE_HANDLE_INPUT; } break; - case 2: + case MSTATE_SCROLL_BOX: if (!ScrollToBox()) { - SetCurrentBox(sPSSData->newCurrBoxId); + SetCurrentBox(sStorage->newCurrBoxId); if (!sInPartyMenu && !IsMonBeingMoved()) { - sub_80CE00C(); - BoxSetMosaic(); + RefreshDisplayMon(); + StartDisplayMonMosaicEffect(); } - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { - sub_80CFECC(); - sPSSData->state = 11; + TryShowItemAtCursor(); + sStorage->state = MSTATE_WAIT_ITEM_ANIM; } else { - sPSSData->state = 0; + sStorage->state = MSTATE_HANDLE_INPUT; } } break; - case 3: + case MSTATE_WAIT_MSG: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sPSSData->state = 0; + sStorage->state = MSTATE_HANDLE_INPUT; } break; - case 4: + case MSTATE_ERROR_LAST_PARTY_MON: PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - sPSSData->state = 6; + PrintMessage(MSG_LAST_POKE); + sStorage->state = MSTATE_WAIT_ERROR_MSG; break; - case 5: + case MSTATE_ERROR_HAS_MAIL: PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - sPSSData->state = 6; + PrintMessage(MSG_PLEASE_REMOVE_MAIL); + sStorage->state = MSTATE_WAIT_ERROR_MSG; break; - case 6: + case MSTATE_WAIT_ERROR_MSG: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; - case 7: - if (!sub_80D01E4()) - sPSSData->state = 0; + case MSTATE_MULTIMOVE_RUN: + if (!MultiMove_RunFunction()) + sStorage->state = MSTATE_HANDLE_INPUT; break; - case 8: - if (!sub_80D01E4()) - SetPSSCallback(Cb_MoveMon); + case MSTATE_MULTIMOVE_RUN_CANCEL: + // Began a multiple Pokémon selection but + // ended up selecting a single Pokémon. + // Wait for multi move to cancel, then + // do a normal move. + if (!MultiMove_RunFunction()) + SetPokeStorageTask(Task_MoveMon); break; - case 9: - if (!sub_80D01E4()) + case MSTATE_MULTIMOVE_RUN_MOVED: + if (!MultiMove_RunFunction()) { - if (sPSSData->setMosaic) - BoxSetMosaic(); - sPSSData->state = 0; + if (sStorage->setMosaic) + StartDisplayMonMosaicEffect(); + sStorage->state = MSTATE_HANDLE_INPUT; } break; - case 10: - if (!sub_80D1218()) + case MSTATE_SCROLL_BOX_ITEM: + if (!IsItemIconAnimActive()) { - SetUpScrollToBox(sPSSData->newCurrBoxId); - sPSSData->state = 2; + SetUpScrollToBox(sStorage->newCurrBoxId); + sStorage->state = MSTATE_SCROLL_BOX; } break; - case 11: - if (!sub_80D1218()) - sPSSData->state = 0; + case MSTATE_WAIT_ITEM_ANIM: + if (!IsItemIconAnimActive()) + sStorage->state = MSTATE_HANDLE_INPUT; break; } } -static void Cb_ShowPartyPokemon(u8 taskId) +static void Task_ShowPartyPokemon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: SetUpDoShowPartyMenu(); - sPSSData->state++; + sStorage->state++; break; case 1: if (!DoShowPartyMenu()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_HidePartyPokemon(u8 taskId) +static void Task_HidePartyPokemon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: PlaySE(SE_SELECT); SetUpHidePartyMenu(); - sPSSData->state++; + sStorage->state++; break; case 1: if (!HidePartyMenu()) { - sub_80CDBF8(sub_80CDC2C()); - sPSSData->state++; + SetCursorBoxPosition(GetSavedCursorPos()); + sStorage->state++; } break; case 2: - if (!sub_80CD554()) + if (!UpdateCursorPos()) { - if (sPSSData->setMosaic) - BoxSetMosaic(); - SetPSSCallback(Cb_MainPSS); + if (sStorage->setMosaic) + StartDisplayMonMosaicEffect(); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_OnSelectedMon(u8 taskId) +static void Task_OnSelectedMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - if (!sub_80CA2B8()) + if (!IsDisplayMosaicActive()) { PlaySE(SE_SELECT); - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) - PrintStorageActionText(PC_TEXT_IS_SELECTED); - else if (IsActiveItemMoving() || sPSSData->cursorMonItem != 0) - PrintStorageActionText(PC_TEXT_IS_SELECTED2); + if (sStorage->boxOption != OPTION_MOVE_ITEMS) + PrintMessage(MSG_IS_SELECTED); + else if (IsMovingItem() || sStorage->displayMonItemId != ITEM_NONE) + PrintMessage(MSG_IS_SELECTED2); else - PrintStorageActionText(PC_TEXT_GIVE_TO_MON); + PrintMessage(MSG_GIVE_TO_MON); AddMenu(); - sPSSData->state = 1; + sStorage->state = 1; } break; - case 1: // debug? - if (!sub_80D00A8()) - sPSSData->state = 2; + case 1: + if (!IsMenuLoading()) + sStorage->state = 2; break; case 2: - switch (sub_80D00AC()) + switch (HandleMenuInput()) { - case -1: - case 0: + case MENU_B_PRESSED: + case MENU_CANCEL: ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; - case 3: - if (CanMovePartyMon()) + case MENU_MOVE: + if (IsRemovingLastPartyMon()) { - sPSSData->state = 3; + sStorage->state = 3; } else { PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_MoveMon); + SetPokeStorageTask(Task_MoveMon); } break; - case 5: + case MENU_PLACE: PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_PlaceMon); + SetPokeStorageTask(Task_PlaceMon); break; - case 4: + case MENU_SHIFT: if (!CanShiftMon()) { - sPSSData->state = 3; + sStorage->state = 3; } else { PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_ShiftMon); + SetPokeStorageTask(Task_ShiftMon); } break; - case 2: + case MENU_WITHDRAW: PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_WithdrawMon); + SetPokeStorageTask(Task_WithdrawMon); break; - case 1: - if (CanMovePartyMon()) + case MENU_STORE: + if (IsRemovingLastPartyMon()) { - sPSSData->state = 3; + sStorage->state = 3; } - else if (ItemIsMail(sPSSData->cursorMonItem)) + else if (ItemIsMail(sStorage->displayMonItemId)) { - sPSSData->state = 4; + sStorage->state = 4; } else { PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_DepositMenu); + SetPokeStorageTask(Task_DepositMenu); } break; - case 7: - if (CanMovePartyMon()) + case MENU_RELEASE: + if (IsRemovingLastPartyMon()) { - sPSSData->state = 3; + sStorage->state = 3; } - else if (sPSSData->cursorMonIsEgg) + else if (sStorage->displayMonIsEgg) { - sPSSData->state = 5; // Cannot release an Egg. + sStorage->state = 5; // Cannot release an Egg. } - else if (ItemIsMail(sPSSData->cursorMonItem)) + else if (ItemIsMail(sStorage->displayMonItemId)) { - sPSSData->state = 4; + sStorage->state = 4; } else { PlaySE(SE_SELECT); - SetPSSCallback(Cb_ReleaseMon); + SetPokeStorageTask(Task_ReleaseMon); } break; - case 6: + case MENU_SUMMARY: PlaySE(SE_SELECT); - SetPSSCallback(Cb_ShowMonSummary); + SetPokeStorageTask(Task_ShowMonSummary); break; - case 8: + case MENU_MARK: PlaySE(SE_SELECT); - SetPSSCallback(Cb_ShowMarkMenu); + SetPokeStorageTask(Task_ShowMarkMenu); break; - case 12: + case MENU_TAKE: PlaySE(SE_SELECT); - SetPSSCallback(Cb_TakeItemForMoving); + SetPokeStorageTask(Task_TakeItemForMoving); break; - case 13: + case MENU_GIVE: PlaySE(SE_SELECT); - SetPSSCallback(Cb_GiveMovingItemToMon); + SetPokeStorageTask(Task_GiveMovingItemToMon); break; - case 16: - SetPSSCallback(Cb_ItemToBag); + case MENU_BAG: + SetPokeStorageTask(Task_ItemToBag); break; - case 15: + case MENU_SWITCH: PlaySE(SE_SELECT); - SetPSSCallback(Cb_SwitchSelectedItem); + SetPokeStorageTask(Task_SwitchSelectedItem); break; - case 14: + case MENU_GIVE_2: PlaySE(SE_SELECT); - SetPSSCallback(Cb_GiveItemFromBag); + SetPokeStorageTask(Task_GiveItemFromBag); break; - case 17: - SetPSSCallback(Cb_ShowItemInfo); + case MENU_INFO: + SetPokeStorageTask(Task_ShowItemInfo); break; } break; case 3: PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_LAST_POKE); - sPSSData->state = 6; + PrintMessage(MSG_LAST_POKE); + sStorage->state = 6; break; case 5: PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_CANT_RELEASE_EGG); - sPSSData->state = 6; + PrintMessage(MSG_CANT_RELEASE_EGG); + sStorage->state = 6; break; case 4: PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_PLEASE_REMOVE_MAIL); - sPSSData->state = 6; + PrintMessage(MSG_PLEASE_REMOVE_MAIL); + sStorage->state = 6; break; case 6: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_MoveMon(u8 taskId) +static void Task_MoveMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - InitMonPlaceChange(0); - sPSSData->state++; + InitMonPlaceChange(CHANGE_GRAB); + sStorage->state++; break; case 1: if (!DoMonPlaceChange()) { if (sInPartyMenu) - SetPSSCallback(Cb_HandleMovingMonFromParty); + SetPokeStorageTask(Task_HandleMovingMonFromParty); else - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_PlaceMon(u8 taskId) +static void Task_PlaceMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - InitMonPlaceChange(1); - sPSSData->state++; + InitMonPlaceChange(CHANGE_PLACE); + sStorage->state++; break; case 1: if (!DoMonPlaceChange()) { if (sInPartyMenu) - SetPSSCallback(Cb_HandleMovingMonFromParty); + SetPokeStorageTask(Task_HandleMovingMonFromParty); else - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_ShiftMon(u8 taskId) +static void Task_ShiftMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - InitMonPlaceChange(2); - sPSSData->state++; + InitMonPlaceChange(CHANGE_SHIFT); + sStorage->state++; break; case 1: if (!DoMonPlaceChange()) { - BoxSetMosaic(); - SetPSSCallback(Cb_MainPSS); + StartDisplayMonMosaicEffect(); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_WithdrawMon(u8 taskId) +static void Task_WithdrawMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: if (CalculatePlayerPartyCount() == PARTY_SIZE) { - PrintStorageActionText(PC_TEXT_PARTY_FULL); - sPSSData->state = 1; + PrintMessage(MSG_PARTY_FULL); + sStorage->state = 1; } else { - sub_80CDC18(); - InitMonPlaceChange(0); - sPSSData->state = 2; + SaveCursorPos(); + InitMonPlaceChange(CHANGE_GRAB); + sStorage->state = 2; } break; case 1: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; case 2: @@ -2953,135 +2835,134 @@ static void Cb_WithdrawMon(u8 taskId) { SetMovingMonPriority(1); SetUpDoShowPartyMenu(); - sPSSData->state++; + sStorage->state++; } break; case 3: if (!DoShowPartyMenu()) { - InitMonPlaceChange(1); - sPSSData->state++; + InitMonPlaceChange(CHANGE_PLACE); + sStorage->state++; } break; case 4: if (!DoMonPlaceChange()) { - sub_80CAB20(); - sPSSData->state++; + UpdatePartySlotColors(); + sStorage->state++; } break; case 5: - SetPSSCallback(Cb_HidePartyPokemon); + SetPokeStorageTask(Task_HidePartyPokemon); break; } } -static void Cb_DepositMenu(u8 taskId) +static void Task_DepositMenu(u8 taskId) { u8 boxId; - switch (sPSSData->state) + switch (sStorage->state) { case 0: - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE); - sub_80C78D4(gUnknown_02039D0E); - sPSSData->state++; + PrintMessage(MSG_DEPOSIT_IN_WHICH_BOX); + LoadChooseBoxMenuGfx(&sStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU, PALTAG_MISC_1, 3, FALSE); + CreateChooseBoxMenuSprites(sDepositBoxId); + sStorage->state++; break; case 1: - boxId = HandleBoxChooseSelectionInput(); - if (boxId == 200) - { - // no box chosen yet - } - else if (boxId == 201) + boxId = HandleChooseBoxMenuInput(); + switch (boxId) { + case BOXID_NONE_CHOSEN: + break; + case BOXID_CANCELED: ClearBottomWindow(); - sub_80C78E4(); - sub_80C7890(); - SetPSSCallback(Cb_MainPSS); - } - else - { + DestroyChooseBoxMenuSprites(); + FreeChooseBoxMenu(); + SetPokeStorageTask(Task_PokeStorageMain); + break; + default: if (TryStorePartyMonInBox(boxId)) { - gUnknown_02039D0E = boxId; + sDepositBoxId = boxId; ClearBottomWindow(); - sub_80C78E4(); - sub_80C7890(); - sPSSData->state = 2; + DestroyChooseBoxMenuSprites(); + FreeChooseBoxMenu(); + sStorage->state = 2; } else { - PrintStorageActionText(PC_TEXT_BOX_IS_FULL); - sPSSData->state = 4; + PrintMessage(MSG_BOX_IS_FULL); + sStorage->state = 4; } + break; } break; case 2: CompactPartySlots(); - sub_80CB950(); - sPSSData->state++; + CompactPartySprites(); + sStorage->state++; break; case 3: - if (!sub_80CB9BC()) + if (GetNumPartySpritesCompacting() == 0) { - sub_80CE22C(); - BoxSetMosaic(); - sub_80CAB20(); - SetPSSCallback(Cb_MainPSS); + ResetSelectionAfterDeposit(); + StartDisplayMonMosaicEffect(); + UpdatePartySlotColors(); + SetPokeStorageTask(Task_PokeStorageMain); } break; case 4: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { - PrintStorageActionText(PC_TEXT_DEPOSIT_IN_WHICH_BOX); - sPSSData->state = 1; + PrintMessage(MSG_DEPOSIT_IN_WHICH_BOX); + sStorage->state = 1; } break; } } -static void Cb_ReleaseMon(u8 taskId) +static void Task_ReleaseMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - PrintStorageActionText(PC_TEXT_RELEASE_POKE); + PrintMessage(MSG_RELEASE_POKE); ShowYesNoWindow(1); - sPSSData->state++; + sStorage->state++; // fallthrough case 1: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: - case 1: + case 1: // No ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; - case 0: + case 0: // Yes ClearBottomWindow(); - InitCanRelaseMonVars(); - sub_80CE250(); - sPSSData->state++; + InitCanReleaseMonVars(); + InitReleaseMon(); + sStorage->state++; break; } break; case 2: RunCanReleaseMon(); - if (!sub_80CE2A8()) + if (!TryHideReleaseMon()) { while (1) { - s8 r0 = RunCanReleaseMon(); - if (r0 == 1) + s8 canRelease = RunCanReleaseMon(); + if (canRelease == TRUE) { - sPSSData->state++; + sStorage->state++; break; } - else if (r0 == 0) + else if (!canRelease) { - sPSSData->state = 8; // Can't release the mon. + sStorage->state = 8; break; } } @@ -3089,15 +2970,15 @@ static void Cb_ReleaseMon(u8 taskId) break; case 3: ReleaseMon(); - RefreshCursorMonData(); - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - sPSSData->state++; + RefreshDisplayMonData(); + PrintMessage(MSG_WAS_RELEASED); + sStorage->state++; break; case 4: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { - PrintStorageActionText(PC_TEXT_BYE_BYE); - sPSSData->state++; + PrintMessage(MSG_BYE_BYE); + sStorage->state++; } break; case 5: @@ -3107,331 +2988,332 @@ static void Cb_ReleaseMon(u8 taskId) if (sInPartyMenu) { CompactPartySlots(); - sub_80CB950(); - sPSSData->state++; + CompactPartySprites(); + sStorage->state++; } else { - sPSSData->state = 7; + sStorage->state = 7; } } break; case 6: - if (!sub_80CB9BC()) + if (GetNumPartySpritesCompacting() == 0) { - sub_80CE00C(); - BoxSetMosaic(); - sub_80CAB20(); - sPSSData->state++; + RefreshDisplayMon(); + StartDisplayMonMosaicEffect(); + UpdatePartySlotColors(); + sStorage->state++; } break; case 7: - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; case 8: - PrintStorageActionText(PC_TEXT_WAS_RELEASED); - sPSSData->state++; + // Start "can't release" sequence + PrintMessage(MSG_WAS_RELEASED); + sStorage->state++; break; case 9: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { - PrintStorageActionText(PC_TEXT_SURPRISE); - sPSSData->state++; + PrintMessage(MSG_SURPRISE); + sStorage->state++; } break; case 10: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sub_80CC064(); - sPSSData->state++; + ReshowReleaseMon(); + sStorage->state++; } break; case 11: - if (!sub_80CC0A0()) + if (!ResetReleaseMonSpritePtr()) { - sub_80CE324(); - PrintStorageActionText(PC_TEXT_CAME_BACK); - sPSSData->state++; + TrySetCursorFistAnim(); + PrintMessage(MSG_CAME_BACK); + sStorage->state++; } break; case 12: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { - PrintStorageActionText(PC_TEXT_WORRIED); - sPSSData->state++; + PrintMessage(MSG_WORRIED); + sStorage->state++; } break; case 13: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_ShowMarkMenu(u8 taskId) +static void Task_ShowMarkMenu(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - PrintStorageActionText(PC_TEXT_MARK_POKE); - sPSSData->markMenu.markings = sPSSData->cursorMonMarkings; - sub_811FAA4(sPSSData->cursorMonMarkings, 0xb0, 0x10); - sPSSData->state++; + PrintMessage(MSG_MARK_POKE); + sStorage->markMenu.markings = sStorage->displayMonMarkings; + OpenMonMarkingsMenu(sStorage->displayMonMarkings, 0xb0, 0x10); + sStorage->state++; break; case 1: - if (!MonMarkingsMenuHandleInput()) + if (!HandleMonMarkingsMenuInput()) { - sub_811FAF8(); + FreeMonMarkingsMenu(); ClearBottomWindow(); - SetMonMarkings(sPSSData->markMenu.markings); - RefreshCursorMonData(); - SetPSSCallback(Cb_MainPSS); + SetMonMarkings(sStorage->markMenu.markings); + RefreshDisplayMonData(); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_TakeItemForMoving(u8 taskId) +static void Task_TakeItemForMoving(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - if (!ItemIsMail(sPSSData->cursorMonItem)) + if (!ItemIsMail(sStorage->displayMonItemId)) { ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; } else { - SetPSSCallback(Cb_PrintCantStoreMail); + SetPokeStorageTask(Task_PrintCantStoreMail); } break; case 1: - sub_80CFE54(2); - Item_FromMonToMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); - sPSSData->state++; + StartCursorAnim(CURSOR_ANIM_OPEN); + TakeItemFromMon(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetCursorPosition()); + sStorage->state++; break; case 2: - if (!sub_80D1218()) + if (!IsItemIconAnimActive()) { - sub_80CFE54(3); + StartCursorAnim(CURSOR_ANIM_FIST); ClearBottomWindow(); - sub_80CE00C(); - PrintCursorMonInfo(); - sPSSData->state++; + RefreshDisplayMon(); + PrintDisplayMonInfo(); + sStorage->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_GiveMovingItemToMon(u8 taskId) +static void Task_GiveMovingItemToMon(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; break; case 1: - sub_80CFE54(2); - Item_GiveMovingToMon((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); - sPSSData->state++; + StartCursorAnim(CURSOR_ANIM_OPEN); + GiveItemToMon(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetCursorPosition()); + sStorage->state++; break; case 2: - if (!sub_80D1218()) + if (!IsItemIconAnimActive()) { - sub_80CFE54(0); - sub_80CE00C(); - PrintCursorMonInfo(); - PrintStorageActionText(PC_TEXT_ITEM_IS_HELD); - sPSSData->state++; + StartCursorAnim(CURSOR_ANIM_BOUNCE); + RefreshDisplayMon(); + PrintDisplayMonInfo(); + PrintMessage(MSG_ITEM_IS_HELD); + sStorage->state++; } break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_ItemToBag(u8 taskId) +static void Task_ItemToBag(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - if (!AddBagItem(sPSSData->cursorMonItem, 1)) + if (!AddBagItem(sStorage->displayMonItemId, 1)) { PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_BAG_FULL); - sPSSData->state = 3; + PrintMessage(MSG_BAG_FULL); + sStorage->state = 3; } else { PlaySE(SE_SELECT); - Item_TakeMons((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); - sPSSData->state = 1; + MoveItemFromMonToBag(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetCursorPosition()); + sStorage->state = 1; } break; case 1: - if (!sub_80D1218()) + if (!IsItemIconAnimActive()) { - PrintStorageActionText(PC_TEXT_PLACED_IN_BAG); - sPSSData->state = 2; + PrintMessage(MSG_PLACED_IN_BAG); + sStorage->state = 2; } break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sub_80CE00C(); - PrintCursorMonInfo(); - sPSSData->state = 4; + RefreshDisplayMon(); + PrintDisplayMonInfo(); + sStorage->state = 4; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_SwitchSelectedItem(u8 taskId) +static void Task_SwitchSelectedItem(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - if (!ItemIsMail(sPSSData->cursorMonItem)) + if (!ItemIsMail(sStorage->displayMonItemId)) { ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; } else { - SetPSSCallback(Cb_PrintCantStoreMail); + SetPokeStorageTask(Task_PrintCantStoreMail); } break; case 1: - sub_80CFE54(2); - Item_SwitchMonsWithMoving((sInPartyMenu != FALSE) ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); - sPSSData->state++; + StartCursorAnim(CURSOR_ANIM_OPEN); + SwapItemsWithMon(sInPartyMenu ? CURSOR_AREA_IN_PARTY : CURSOR_AREA_IN_BOX, GetCursorPosition()); + sStorage->state++; break; case 2: - if (!sub_80D1218()) + if (!IsItemIconAnimActive()) { - sub_80CFE54(3); - sub_80CE00C(); - PrintCursorMonInfo(); - PrintStorageActionText(PC_TEXT_CHANGED_TO_ITEM); - sPSSData->state++; + StartCursorAnim(CURSOR_ANIM_FIST); + RefreshDisplayMon(); + PrintDisplayMonInfo(); + PrintMessage(MSG_CHANGED_TO_ITEM); + sStorage->state++; } break; case 3: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; } break; case 4: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_ShowItemInfo(u8 taskId) +static void Task_ShowItemInfo(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) { PlaySE(SE_WIN_OPEN); PrintItemDescription(); - sub_80D1818(); - sPSSData->state++; + InitItemInfoWindow(); + sStorage->state++; } break; case 2: - if (!sub_80D184C()) - sPSSData->state++; + if (!UpdateItemInfoWindowSlideIn()) + sStorage->state++; break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) - sPSSData->state++; + sStorage->state++; break; case 4: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { PlaySE(SE_WIN_OPEN); - sPSSData->state++; + sStorage->state++; } break; case 5: - if (!sub_80D18E4()) - sPSSData->state++; + if (!UpdateItemInfoWindowSlideOut()) + sStorage->state++; break; case 6: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_CloseBoxWhileHoldingItem(u8 taskId) +static void Task_CloseBoxWhileHoldingItem(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_PUT_IN_BAG); + PrintMessage(MSG_PUT_IN_BAG); ShowYesNoWindow(0); - sPSSData->state = 1; + sStorage->state = 1; break; case 1: switch (Menu_ProcessInputNoWrapClearOnChoose()) { case MENU_B_PRESSED: - case 1: + case 1: // No ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; - case 0: - if (AddBagItem(sPSSData->movingItem, 1) == TRUE) + case 0:// Yes + if (AddBagItem(sStorage->movingItemId, 1) == TRUE) { ClearBottomWindow(); - sPSSData->state = 3; + sStorage->state = 3; } else { - PrintStorageActionText(PC_TEXT_BAG_FULL); - sPSSData->state = 2; + PrintMessage(MSG_BAG_FULL); + sStorage->state = 2; } break; } @@ -3440,328 +3322,332 @@ static void Cb_CloseBoxWhileHoldingItem(u8 taskId) if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sPSSData->state = 5; + sStorage->state = 5; } break; case 3: - sub_80D1194(); - sPSSData->state = 4; + MoveItemFromCursorToBag(); + sStorage->state = 4; break; case 4: - if (!sub_80D1218()) + if (!IsItemIconAnimActive()) { - sub_80CFE54(0); - SetPSSCallback(Cb_MainPSS); + StartCursorAnim(CURSOR_ANIM_BOUNCE); + SetPokeStorageTask(Task_PokeStorageMain); } break; case 5: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_HandleMovingMonFromParty(u8 taskId) +static void Task_HandleMovingMonFromParty(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: CompactPartySlots(); - sub_80CB950(); - sPSSData->state++; + CompactPartySprites(); + sStorage->state++; break; case 1: - if (!sub_80CB9BC()) + if (GetNumPartySpritesCompacting() == 0) { - sub_80CAB20(); - SetPSSCallback(Cb_MainPSS); + UpdatePartySlotColors(); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_PrintCantStoreMail(u8 taskId) +static void Task_PrintCantStoreMail(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - PrintStorageActionText(PC_TEXT_CANT_STORE_MAIL); - sPSSData->state++; + PrintMessage(MSG_CANT_STORE_MAIL); + sStorage->state++; break; case 1: if (!IsDma3ManagerBusyWithBgCopy()) - sPSSData->state++; + sStorage->state++; break; case 2: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; } } -static void Cb_HandleBoxOptions(u8 taskId) +// Handle options menu that shows when the box title bar is selected +static void Task_HandleBoxOptions(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - PrintStorageActionText(PC_TEXT_WHAT_YOU_DO); + PrintMessage(MSG_WHAT_YOU_DO); AddMenu(); - sPSSData->state++; + sStorage->state++; break; case 1: - if (sub_80D00A8()) + if (IsMenuLoading()) return; - sPSSData->state++; + sStorage->state++; case 2: - switch (sub_80D00AC()) + switch (HandleMenuInput()) { - case -1: - case 0: - sub_80CD1A8(TRUE); + case MENU_B_PRESSED: + case MENU_CANCEL: + AnimateBoxScrollArrows(TRUE); ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; - case 11: + case MENU_NAME: PlaySE(SE_SELECT); - SetPSSCallback(Cb_NameBox); + SetPokeStorageTask(Task_NameBox); break; - case 10: + case MENU_WALLPAPER: PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_HandleWallpapers); + SetPokeStorageTask(Task_HandleWallpapers); break; - case 9: + case MENU_JUMP: PlaySE(SE_SELECT); ClearBottomWindow(); - SetPSSCallback(Cb_JumpBox); + SetPokeStorageTask(Task_JumpBox); break; } break; } } -static void Cb_HandleWallpapers(u8 taskId) +static void Task_HandleWallpapers(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: AddWallpaperSetsMenu(); - PrintStorageActionText(PC_TEXT_PICK_A_THEME); - sPSSData->state++; + PrintMessage(MSG_PICK_A_THEME); + sStorage->state++; break; case 1: - if (!sub_80D00A8()) - sPSSData->state++; + if (!IsMenuLoading()) + sStorage->state++; break; case 2: - sPSSData->wallpaperSetId = sub_80D00AC(); - switch (sPSSData->wallpaperSetId) + sStorage->wallpaperSetId = HandleMenuInput(); + switch (sStorage->wallpaperSetId) { - case -1: - sub_80CD1A8(TRUE); + case MENU_B_PRESSED: + AnimateBoxScrollArrows(TRUE); ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; - case 18 ... 21: + case MENU_SCENERY_1: + case MENU_SCENERY_2: + case MENU_SCENERY_3: + case MENU_ETCETERA: PlaySE(SE_SELECT); - sub_80D013C(); - sPSSData->wallpaperSetId -= 18; - sPSSData->state++; + RemoveMenu(); + sStorage->wallpaperSetId -= MENU_WALLPAPER_SETS_START; + sStorage->state++; break; - // New wallpaper from Walda. - case 22: + case MENU_FRIENDS: + // New wallpaper from Walda. PlaySE(SE_SELECT); - sPSSData->wallpaperId = 16; - sub_80D013C(); + sStorage->wallpaperId = WALLPAPER_FRIENDS; + RemoveMenu(); ClearBottomWindow(); - sPSSData->state = 6; + sStorage->state = 6; break; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - AddWallpapersMenu(sPSSData->wallpaperSetId); - PrintStorageActionText(PC_TEXT_PICK_A_WALLPAPER); - sPSSData->state++; + AddWallpapersMenu(sStorage->wallpaperSetId); + PrintMessage(MSG_PICK_A_WALLPAPER); + sStorage->state++; } break; case 4: - sPSSData->wallpaperId = sub_80D00AC(); - switch (sPSSData->wallpaperId) + sStorage->wallpaperId = HandleMenuInput(); + switch (sStorage->wallpaperId) { - case -2: + case MENU_NOTHING_CHOSEN: break; - case -1: + case MENU_B_PRESSED: ClearBottomWindow(); - sPSSData->state = 0; + sStorage->state = 0; break; default: PlaySE(SE_SELECT); ClearBottomWindow(); - sPSSData->wallpaperId -= 23; - SetWallpaperForCurrentBox(sPSSData->wallpaperId); - sPSSData->state++; + sStorage->wallpaperId -= MENU_WALLPAPERS_START; + SetWallpaperForCurrentBox(sStorage->wallpaperId); + sStorage->state++; break; } break; case 5: if (!DoWallpaperGfxChange()) { - sub_80CD1A8(TRUE); - SetPSSCallback(Cb_MainPSS); + AnimateBoxScrollArrows(TRUE); + SetPokeStorageTask(Task_PokeStorageMain); } break; case 6: if (!IsDma3ManagerBusyWithBgCopy()) { - SetWallpaperForCurrentBox(sPSSData->wallpaperId); - sPSSData->state = 5; + SetWallpaperForCurrentBox(sStorage->wallpaperId); + sStorage->state = 5; } break; } } -static void Cb_JumpBox(u8 taskId) +static void Task_JumpBox(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - PrintStorageActionText(PC_TEXT_JUMP_TO_WHICH_BOX); - sub_80C77E8(&sPSSData->field_1E5C, TAG_TILE_A, TAG_PAL_DAC7, 3, FALSE); - sub_80C78D4(StorageGetCurrentBox()); - sPSSData->state++; + PrintMessage(MSG_JUMP_TO_WHICH_BOX); + LoadChooseBoxMenuGfx(&sStorage->chooseBoxMenu, GFXTAG_CHOOSE_BOX_MENU, PALTAG_MISC_1, 3, FALSE); + CreateChooseBoxMenuSprites(StorageGetCurrentBox()); + sStorage->state++; break; case 1: - sPSSData->newCurrBoxId = HandleBoxChooseSelectionInput(); - switch (sPSSData->newCurrBoxId) + sStorage->newCurrBoxId = HandleChooseBoxMenuInput(); + switch (sStorage->newCurrBoxId) { - case 200: + case BOXID_NONE_CHOSEN: break; default: ClearBottomWindow(); - sub_80C78E4(); - sub_80C7890(); - if (sPSSData->newCurrBoxId == 201 || sPSSData->newCurrBoxId == StorageGetCurrentBox()) + DestroyChooseBoxMenuSprites(); + FreeChooseBoxMenu(); + if (sStorage->newCurrBoxId == BOXID_CANCELED || sStorage->newCurrBoxId == StorageGetCurrentBox()) { - sub_80CD1A8(TRUE); - SetPSSCallback(Cb_MainPSS); + AnimateBoxScrollArrows(TRUE); + SetPokeStorageTask(Task_PokeStorageMain); } else { - sPSSData->state++; + sStorage->state++; } break; } break; case 2: - SetUpScrollToBox(sPSSData->newCurrBoxId); - sPSSData->state++; + SetUpScrollToBox(sStorage->newCurrBoxId); + sStorage->state++; break; case 3: if (!ScrollToBox()) { - SetCurrentBox(sPSSData->newCurrBoxId); - SetPSSCallback(Cb_MainPSS); + SetCurrentBox(sStorage->newCurrBoxId); + SetPokeStorageTask(Task_PokeStorageMain); } break; } } -static void Cb_NameBox(u8 taskId) +static void Task_NameBox(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - sub_80CE760(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sPSSData->state++; + SaveMovingMon(); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sStorage->state++; break; case 1: if (!UpdatePaletteFade()) { - sWhichToReshow = 1; - sPSSData->screenChangeType = SCREEN_CHANGE_NAME_BOX; - SetPSSCallback(Cb_ChangeScreen); + sWhichToReshow = SCREEN_CHANGE_NAME_BOX - 1; + sStorage->screenChangeType = SCREEN_CHANGE_NAME_BOX; + SetPokeStorageTask(Task_ChangeScreen); } break; } } -static void Cb_ShowMonSummary(u8 taskId) +static void Task_ShowMonSummary(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - sub_80CE7E8(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sPSSData->state++; + InitSummaryScreenData(); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sStorage->state++; break; case 1: if (!UpdatePaletteFade()) { - sWhichToReshow = 0; - sPSSData->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN; - SetPSSCallback(Cb_ChangeScreen); + sWhichToReshow = SCREEN_CHANGE_SUMMARY_SCREEN - 1; + sStorage->screenChangeType = SCREEN_CHANGE_SUMMARY_SCREEN; + SetPokeStorageTask(Task_ChangeScreen); } break; } } -static void Cb_GiveItemFromBag(u8 taskId) +static void Task_GiveItemFromBag(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sPSSData->state++; + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sStorage->state++; break; case 1: if (!UpdatePaletteFade()) { - sWhichToReshow = 2; - sPSSData->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG; - SetPSSCallback(Cb_ChangeScreen); + sWhichToReshow = SCREEN_CHANGE_ITEM_FROM_BAG - 1; + sStorage->screenChangeType = SCREEN_CHANGE_ITEM_FROM_BAG; + SetPokeStorageTask(Task_ChangeScreen); } break; } } -static void Cb_OnCloseBoxPressed(u8 taskId) +static void Task_OnCloseBoxPressed(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: if (IsMonBeingMoved()) { PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - sPSSData->state = 1; + PrintMessage(MSG_HOLDING_POKE); + sStorage->state = 1; } - else if (IsActiveItemMoving()) + else if (IsMovingItem()) { - SetPSSCallback(Cb_CloseBoxWhileHoldingItem); + SetPokeStorageTask(Task_CloseBoxWhileHoldingItem); } else { PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_EXIT_BOX); + PrintMessage(MSG_EXIT_BOX); ShowYesNoWindow(0); - sPSSData->state = 2; + sStorage->state = 2; } break; case 1: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; case 2: @@ -3770,59 +3656,59 @@ static void Cb_OnCloseBoxPressed(u8 taskId) case MENU_B_PRESSED: case 1: ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; case 0: PlaySE(SE_PC_OFF); ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; break; } break; case 3: ComputerScreenCloseEffect(20, 0, 1); - sPSSData->state++; + sStorage->state++; break; case 4: if (!IsComputerScreenCloseEffectActive()) { - sub_80CABE0(); + UpdateBoxToSendMons(); gPlayerPartyCount = CalculatePlayerPartyCount(); - sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX; - SetPSSCallback(Cb_ChangeScreen); + sStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX; + SetPokeStorageTask(Task_ChangeScreen); } break; } } -static void Cb_OnBPressed(u8 taskId) +static void Task_OnBPressed(u8 taskId) { - switch (sPSSData->state) + switch (sStorage->state) { case 0: if (IsMonBeingMoved()) { PlaySE(SE_FAILURE); - PrintStorageActionText(PC_TEXT_HOLDING_POKE); - sPSSData->state = 1; + PrintMessage(MSG_HOLDING_POKE); + sStorage->state = 1; } - else if (IsActiveItemMoving()) + else if (IsMovingItem()) { - SetPSSCallback(Cb_CloseBoxWhileHoldingItem); + SetPokeStorageTask(Task_CloseBoxWhileHoldingItem); } else { PlaySE(SE_SELECT); - PrintStorageActionText(PC_TEXT_CONTINUE_BOX); + PrintMessage(MSG_CONTINUE_BOX); ShowYesNoWindow(0); - sPSSData->state = 2; + sStorage->state = 2; } break; case 1: if (JOY_NEW(A_BUTTON | B_BUTTON | DPAD_ANY)) { ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); } break; case 2: @@ -3830,40 +3716,40 @@ static void Cb_OnBPressed(u8 taskId) { case 0: ClearBottomWindow(); - SetPSSCallback(Cb_MainPSS); + SetPokeStorageTask(Task_PokeStorageMain); break; case 1: case MENU_B_PRESSED: PlaySE(SE_PC_OFF); ClearBottomWindow(); - sPSSData->state++; + sStorage->state++; break; } break; case 3: ComputerScreenCloseEffect(20, 0, 0); - sPSSData->state++; + sStorage->state++; break; case 4: if (!IsComputerScreenCloseEffectActive()) { - sub_80CABE0(); + UpdateBoxToSendMons(); gPlayerPartyCount = CalculatePlayerPartyCount(); - sPSSData->screenChangeType = SCREEN_CHANGE_EXIT_BOX; - SetPSSCallback(Cb_ChangeScreen); + sStorage->screenChangeType = SCREEN_CHANGE_EXIT_BOX; + SetPokeStorageTask(Task_ChangeScreen); } break; } } -static void Cb_ChangeScreen(u8 taskId) +static void Task_ChangeScreen(u8 taskId) { struct BoxPokemon *boxMons; u8 mode, monIndex, maxMonIndex; - u8 screenChangeType = sPSSData->screenChangeType; + u8 screenChangeType = sStorage->screenChangeType; - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS && IsActiveItemMoving() == TRUE) - sMovingItemId = GetMovingItem(); + if (sStorage->boxOption == OPTION_MOVE_ITEMS && IsMovingItem() == TRUE) + sMovingItemId = GetMovingItemId(); else sMovingItemId = ITEM_NONE; @@ -3871,27 +3757,27 @@ static void Cb_ChangeScreen(u8 taskId) { case SCREEN_CHANGE_EXIT_BOX: default: - FreePSSData(); - SetMainCallback2(Cb2_ExitPSS); + FreePokeStorageData(); + SetMainCallback2(CB2_ExitPokeStorage); break; case SCREEN_CHANGE_SUMMARY_SCREEN: - boxMons = sPSSData->field_218C.box; - monIndex = sPSSData->field_2187; - maxMonIndex = sPSSData->field_2186; - mode = sPSSData->pokemonSummaryScreenMode; - FreePSSData(); - if (mode == PSS_MODE_NORMAL && boxMons == &gUnknown_02039D14.box) - ShowPokemonSummaryScreenSet40EF(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS); + boxMons = sStorage->summaryMon.box; + monIndex = sStorage->summaryStartPos; + maxMonIndex = sStorage->summaryMaxPos; + mode = sStorage->summaryScreenMode; + FreePokeStorageData(); + if (mode == SUMMARY_MODE_NORMAL && boxMons == &sSavedMovingMon.box) + ShowPokemonSummaryScreenSet40EF(mode, boxMons, monIndex, maxMonIndex, CB2_ReturnToPokeStorage); else - ShowPokemonSummaryScreen(mode, boxMons, monIndex, maxMonIndex, Cb2_ReturnToPSS); + ShowPokemonSummaryScreen(mode, boxMons, monIndex, maxMonIndex, CB2_ReturnToPokeStorage); break; case SCREEN_CHANGE_NAME_BOX: - FreePSSData(); - DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, Cb2_ReturnToPSS); + FreePokeStorageData(); + DoNamingScreen(NAMING_SCREEN_BOX, GetBoxNamePtr(StorageGetCurrentBox()), 0, 0, 0, CB2_ReturnToPokeStorage); break; case SCREEN_CHANGE_ITEM_FROM_BAG: - FreePSSData(); - GoToBagMenu(ITEMMENULOCATION_PCBOX, 0, Cb2_ReturnToPSS); + FreePokeStorageData(); + GoToBagMenu(ITEMMENULOCATION_PCBOX, 0, CB2_ReturnToPokeStorage); break; } @@ -3900,34 +3786,43 @@ static void Cb_ChangeScreen(u8 taskId) static void GiveChosenBagItem(void) { - u16 item = gSpecialVar_ItemId; + u16 itemId = gSpecialVar_ItemId; - if (item != 0) + if (itemId != ITEM_NONE) { - u8 id = GetBoxCursorPosition(); - + u8 pos = GetCursorPosition(); if (sInPartyMenu) - SetMonData(&gPlayerParty[id], MON_DATA_HELD_ITEM, &item); + SetMonData(&gPlayerParty[pos], MON_DATA_HELD_ITEM, &itemId); else - SetCurrentBoxMonData(id, MON_DATA_HELD_ITEM, &item); + SetCurrentBoxMonData(pos, MON_DATA_HELD_ITEM, &itemId); - RemoveBagItem(item, 1); + RemoveBagItem(itemId, 1); } } -static void FreePSSData(void) +static void FreePokeStorageData(void) { - sub_80D25F0(); - sub_80D01B8(); - FREE_AND_SET_NULL(sPSSData); + TilemapUtil_Free(); + MultiMove_Free(); + FREE_AND_SET_NULL(sStorage); FreeAllWindowBuffers(); } + +//------------------------------------------------------------------------------ +// SECTION: Misc +// +// No real uniform section below. Misc functions including more initialization, +// showing/hiding the party menu, updating the Close Box button, printing +// messages, doing the mosaic effect when transitioning between Pokémon, etc. +//------------------------------------------------------------------------------ + + static void SetScrollingBackground(void) { SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(3) | BGCNT_16COLOR | BGCNT_SCREENBASE(31)); - DecompressAndLoadBgGfxUsingHeap(3, gPokemonStorageScrollingBGTileset, 0, 0, 0); - LZ77UnCompVram(gPokemonStorageScrollingBGTilemap, (void *)BG_SCREEN_ADDR(31)); + DecompressAndLoadBgGfxUsingHeap(3, sScrollingBg_Gfx, 0, 0, 0); + LZ77UnCompVram(sScrollingBg_Tilemap, (void *)BG_SCREEN_ADDR(31)); } static void ScrollBackground(void) @@ -3936,19 +3831,19 @@ static void ScrollBackground(void) ChangeBgY(3, 128, 2); } -static void LoadPSSMenuGfx(void) +static void LoadPokeStorageMenuGfx(void) { - InitBgsFromTemplates(0, gUnknown_08572734, ARRAY_COUNT(gUnknown_08572734)); - DecompressAndLoadBgGfxUsingHeap(1, gPSSMenu_Gfx, 0, 0, 0); - LZ77UnCompWram(gUnknown_085722A0, sPSSData->field_5AC4); - SetBgTilemapBuffer(1, sPSSData->field_5AC4); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + DecompressAndLoadBgGfxUsingHeap(1, gStorageSystemMenu_Gfx, 0, 0, 0); + LZ77UnCompWram(sDisplayMenu_Tilemap, sStorage->displayMenuTilemapBuffer); + SetBgTilemapBuffer(1, sStorage->displayMenuTilemapBuffer); ShowBg(1); ScheduleBgCopyTilemapToVram(1); } -static bool8 InitPSSWindows(void) +static bool8 InitPokeStorageWindows(void) { - if (!InitWindows(gUnknown_08572714)) + if (!InitWindows(sWindowTemplates)) { return FALSE; } @@ -3964,73 +3859,73 @@ static void LoadWaveformSpritePalette(void) LoadSpritePalette(&gWaveformSpritePalette); } -static void sub_80CA0D8(void) +static void InitPalettesAndSprites(void) { - LoadPalette(gUnknown_085723DC, 0, 0x20); - LoadPalette(gUnknown_085723FC, 0x20, 0x20); - LoadPalette(gUnknown_085726F4, 0xF0, 0x20); - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) - LoadPalette(gUnknown_0857241C, 0x30, 0x20); + LoadPalette(sInterface_Pal, 0, sizeof(sInterface_Pal)); + LoadPalette(sPkmnDataGray_Pal, 0x20, sizeof(sPkmnDataGray_Pal)); + LoadPalette(sUnknown_Pal, 0xF0, sizeof(sUnknown_Pal)); + if (sStorage->boxOption != OPTION_MOVE_ITEMS) + LoadPalette(sBg_Pal, 0x30, sizeof(sBg_Pal)); else - LoadPalette(gUnknown_0857243C, 0x30, 0x20); + LoadPalette(sBgMoveItems_Pal, 0x30, sizeof(sBgMoveItems_Pal)); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_16COLOR | BGCNT_SCREENBASE(30)); - LoadCursorMonSprite(); - sub_80CA154(); - sub_80CA1C4(); - RefreshCursorMonData(); + CreateDisplayMonSprite(); + CreateMarkingComboSprite(); + CreateWaveformSprites(); + RefreshDisplayMonData(); } -static void sub_80CA154(void) +static void CreateMarkingComboSprite(void) { - sPSSData->field_D94 = sub_811FFB4(TAG_TILE_10, TAG_PAL_DAC8, NULL); - sPSSData->field_D94->oam.priority = 1; - sPSSData->field_D94->subpriority = 1; - sPSSData->field_D94->pos1.x = 40; - sPSSData->field_D94->pos1.y = 150; - sPSSData->field_DA0 = (void*) OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(TAG_TILE_10); + sStorage->markingComboSprite = CreateMonMarkingComboSprite(GFXTAG_MARKING_COMBO, PALTAG_MARKING_COMBO, NULL); + sStorage->markingComboSprite->oam.priority = 1; + sStorage->markingComboSprite->subpriority = 1; + sStorage->markingComboSprite->pos1.x = 40; + sStorage->markingComboSprite->pos1.y = 150; + sStorage->markingComboTilesPtr = (void*) OBJ_VRAM0 + 32 * GetSpriteTileStartByTag(GFXTAG_MARKING_COMBO); } -static void sub_80CA1C4(void) +static void CreateWaveformSprites(void) { u16 i; - struct SpriteSheet sheet = gWaveformSpriteSheet; + struct SpriteSheet sheet = sSpriteSheet_Waveform; LoadSpriteSheet(&sheet); - for (i = 0; i < 2; i++) + for (i = 0; i < ARRAY_COUNT(sStorage->waveformSprites); i++) { u8 spriteId = CreateSprite(&sSpriteTemplate_Waveform, i * 63 + 8, 9, 2); - sPSSData->field_D98[i] = &gSprites[spriteId]; + sStorage->waveformSprites[i] = &gSprites[spriteId]; } } -static void RefreshCursorMonData(void) +static void RefreshDisplayMonData(void) { - LoadCursorMonGfx(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality); - PrintCursorMonInfo(); - sub_80CA65C(); + LoadDisplayMonGfx(sStorage->displayMonSpecies, sStorage->displayMonPersonality); + PrintDisplayMonInfo(); + UpdateWaveformAnimation(); ScheduleBgCopyTilemapToVram(0); } -static void BoxSetMosaic(void) +static void StartDisplayMonMosaicEffect(void) { - RefreshCursorMonData(); - if (sPSSData->cursorMonSprite) + RefreshDisplayMonData(); + if (sStorage->displayMonSprite) { - sPSSData->cursorMonSprite->oam.mosaic = TRUE; - sPSSData->cursorMonSprite->data[0] = 10; - sPSSData->cursorMonSprite->data[1] = 1; - sPSSData->cursorMonSprite->callback = sub_80CA2D0; - SetGpuReg(REG_OFFSET_MOSAIC, (sPSSData->cursorMonSprite->data[0] << 12) | (sPSSData->cursorMonSprite->data[0] << 8)); + sStorage->displayMonSprite->oam.mosaic = TRUE; + sStorage->displayMonSprite->data[0] = 10; + sStorage->displayMonSprite->data[1] = 1; + sStorage->displayMonSprite->callback = SpriteCB_DisplayMonMosaic; + SetGpuReg(REG_OFFSET_MOSAIC, (sStorage->displayMonSprite->data[0] << 12) | (sStorage->displayMonSprite->data[0] << 8)); } } -static u8 sub_80CA2B8(void) +static u8 IsDisplayMosaicActive(void) { - return sPSSData->cursorMonSprite->oam.mosaic; + return sStorage->displayMonSprite->oam.mosaic; } -static void sub_80CA2D0(struct Sprite *sprite) +static void SpriteCB_DisplayMonMosaic(struct Sprite *sprite) { sprite->data[0] -= sprite->data[1]; if (sprite->data[0] < 0) @@ -4043,22 +3938,22 @@ static void sub_80CA2D0(struct Sprite *sprite) } } -static void LoadCursorMonSprite(void) +static void CreateDisplayMonSprite(void) { u16 i; u16 tileStart; u8 palSlot; u8 spriteId; - struct SpriteSheet sheet = {sPSSData->field_22C4, 0x800, TAG_TILE_2}; - struct SpritePalette palette = {sPSSData->field_2244, TAG_PAL_DAC6}; - struct SpriteTemplate template = sSpriteTemplate_CursorMon; + struct SpriteSheet sheet = {sStorage->tileBuffer, MON_PIC_SIZE, GFXTAG_DISPLAY_MON}; + struct SpritePalette palette = {sStorage->displayMonPalBuffer, PALTAG_DISPLAY_MON}; + struct SpriteTemplate template = sSpriteTemplate_DisplayMon; - for (i = 0; i < 0x800; i++) - sPSSData->field_22C4[i] = 0; - for (i = 0; i < 0x10; i++) - sPSSData->field_2244[i] = 0; + for (i = 0; i < MON_PIC_SIZE; i++) + sStorage->tileBuffer[i] = 0; + for (i = 0; i < 16; i++) + sStorage->displayMonPalBuffer[i] = 0; - sPSSData->cursorMonSprite = NULL; + sStorage->displayMonSprite = NULL; do { @@ -4074,136 +3969,139 @@ static void LoadCursorMonSprite(void) if (spriteId == MAX_SPRITES) break; - sPSSData->cursorMonSprite = &gSprites[spriteId]; - sPSSData->field_223A = palSlot * 16 + 0x100; - sPSSData->field_223C = (void*) OBJ_VRAM0 + tileStart * 32; + sStorage->displayMonSprite = &gSprites[spriteId]; + sStorage->displayMonPalOffset = palSlot * 16 + 0x100; + sStorage->displayMonTilePtr = (void*) OBJ_VRAM0 + tileStart * 32; } while (0); - if (sPSSData->cursorMonSprite == NULL) + if (sStorage->displayMonSprite == NULL) { - FreeSpriteTilesByTag(TAG_TILE_2); - FreeSpritePaletteByTag(TAG_PAL_DAC6); + FreeSpriteTilesByTag(GFXTAG_DISPLAY_MON); + FreeSpritePaletteByTag(PALTAG_DISPLAY_MON); } } -static void LoadCursorMonGfx(u16 species, u32 pid) +static void LoadDisplayMonGfx(u16 species, u32 pid) { - if (sPSSData->cursorMonSprite == NULL) + if (sStorage->displayMonSprite == NULL) return; if (species != SPECIES_NONE) { - LoadSpecialPokePic(&gMonFrontPicTable[species], sPSSData->field_22C4, species, pid, TRUE); - LZ77UnCompWram(sPSSData->cursorMonPalette, sPSSData->field_2244); - CpuCopy32(sPSSData->field_22C4, sPSSData->field_223C, 0x800); - LoadPalette(sPSSData->field_2244, sPSSData->field_223A, 0x20); - sPSSData->cursorMonSprite->invisible = FALSE; + LoadSpecialPokePic(&gMonFrontPicTable[species], sStorage->tileBuffer, species, pid, TRUE); + LZ77UnCompWram(sStorage->displayMonPalette, sStorage->displayMonPalBuffer); + CpuCopy32(sStorage->tileBuffer, sStorage->displayMonTilePtr, MON_PIC_SIZE); + LoadPalette(sStorage->displayMonPalBuffer, sStorage->displayMonPalOffset, 0x20); + sStorage->displayMonSprite->invisible = FALSE; } else { - sPSSData->cursorMonSprite->invisible = TRUE; + sStorage->displayMonSprite->invisible = TRUE; } } -static void PrintCursorMonInfo(void) +static void PrintDisplayMonInfo(void) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 0, TEXT_SPEED_FF, NULL); - AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 15, TEXT_SPEED_FF, NULL); - AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 29, TEXT_SPEED_FF, NULL); - AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 43, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 1, sStorage->displayMonNameText, 6, 0, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sStorage->displayMonSpeciesName, 6, 15, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sStorage->displayMonGenderLvlText, 10, 29, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 0, sStorage->displayMonItemName, 6, 43, TEXT_SPEED_FF, NULL); } else { - AddTextPrinterParameterized(0, 0, sPSSData->cursorMonItemName, 6, 0, TEXT_SPEED_FF, NULL); - AddTextPrinterParameterized(0, 1, sPSSData->cursorMonNickText, 6, 13, TEXT_SPEED_FF, NULL); - AddTextPrinterParameterized(0, 2, sPSSData->cursorMonSpeciesName, 6, 28, TEXT_SPEED_FF, NULL); - AddTextPrinterParameterized(0, 2, sPSSData->cursorMonGenderLvlText, 10, 42, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 0, sStorage->displayMonItemName, 6, 0, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 1, sStorage->displayMonNameText, 6, 13, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sStorage->displayMonSpeciesName, 6, 28, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(0, 2, sStorage->displayMonGenderLvlText, 10, 42, TEXT_SPEED_FF, NULL); } CopyWindowToVram(0, 2); - if (sPSSData->cursorMonSpecies != SPECIES_NONE) + if (sStorage->displayMonSpecies != SPECIES_NONE) { - sub_8120084(sPSSData->cursorMonMarkings, sPSSData->field_DA0); - sPSSData->field_D94->invisible = FALSE; + UpdateMonMarkingTiles(sStorage->displayMonMarkings, sStorage->markingComboTilesPtr); + sStorage->markingComboSprite->invisible = FALSE; } else { - sPSSData->field_D94->invisible = TRUE; + sStorage->markingComboSprite->invisible = TRUE; } } -static void sub_80CA65C(void) +// Turn the wave animation on the sides of "Pkmn Data" on/off +static void UpdateWaveformAnimation(void) { u16 i; - if (sPSSData->cursorMonSpecies != SPECIES_NONE) + if (sStorage->displayMonSpecies != SPECIES_NONE) { - sub_80D27AC(0, 0, 0, 8, 2); - for (i = 0; i < 2; i++) - StartSpriteAnimIfDifferent(sPSSData->field_D98[i], i * 2 + 1); + // Start waveform animation and color "Pkmn Data" + TilemapUtil_SetRect(TILEMAPID_PKMN_DATA, 0, 0, 8, 2); + for (i = 0; i < ARRAY_COUNT(sStorage->waveformSprites); i++) + StartSpriteAnimIfDifferent(sStorage->waveformSprites[i], i * 2 + 1); } else { - sub_80D27AC(0, 0, 2, 8, 2); - for (i = 0; i < 2; i++) - StartSpriteAnim(sPSSData->field_D98[i], i * 2); + // Stop waveform animation and gray out "Pkmn Data" + TilemapUtil_SetRect(TILEMAPID_PKMN_DATA, 0, 2, 8, 2); + for (i = 0; i < ARRAY_COUNT(sStorage->waveformSprites); i++) + StartSpriteAnim(sStorage->waveformSprites[i], i * 2); } - sub_80D2918(0); + TilemapUtil_Update(TILEMAPID_PKMN_DATA); ScheduleBgCopyTilemapToVram(1); } -static void sub_80CA704(void) +static void InitSupplementalTilemaps(void) { - LZ77UnCompWram(gUnknown_08DD36C8, sPSSData->field_B0); - LoadPalette(gPSSMenu_Pal, 0x10, 0x20); - sub_80D2644(1, 1, sPSSData->field_B0, 12, 22); - sub_80D2644(2, 1, gUnknown_0857245C, 9, 4); - sub_80D2770(1, 10, 0); - sub_80D2770(2, 21, 0); - sub_80CAA74(); + LZ77UnCompWram(gStorageSystemPartyMenu_Tilemap, sStorage->partyMenuTilemapBuffer); + LoadPalette(gStorageSystemPartyMenu_Pal, 0x10, 0x20); + TilemapUtil_SetMap(TILEMAPID_PARTY_MENU, 1, sStorage->partyMenuTilemapBuffer, 12, 22); + TilemapUtil_SetMap(TILEMAPID_CLOSE_BUTTON, 1, sCloseBoxButton_Tilemap, 9, 4); + TilemapUtil_SetPos(TILEMAPID_PARTY_MENU, 10, 0); + TilemapUtil_SetPos(TILEMAPID_CLOSE_BUTTON, 21, 0); + SetPartySlotTilemaps(); if (sInPartyMenu) { - sub_80CA984(TRUE); + UpdateCloseBoxButtonTilemap(TRUE); CreatePartyMonsSprites(TRUE); - sub_80D2918(2); - sub_80D2918(1); + TilemapUtil_Update(TILEMAPID_CLOSE_BUTTON); + TilemapUtil_Update(TILEMAPID_PARTY_MENU); } else { - sub_80D27AC(1, 0, 20, 12, 2); - sub_80CA984(TRUE); - sub_80D2918(1); - sub_80D2918(2); + TilemapUtil_SetRect(TILEMAPID_PARTY_MENU, 0, 20, 12, 2); + UpdateCloseBoxButtonTilemap(TRUE); + TilemapUtil_Update(TILEMAPID_PARTY_MENU); + TilemapUtil_Update(TILEMAPID_CLOSE_BUTTON); } ScheduleBgCopyTilemapToVram(1); - sPSSData->unk_02C7 = 0; + sStorage->closeBoxFlashing = FALSE; } static void SetUpShowPartyMenu(void) { - sPSSData->field_2C0 = 20; - sPSSData->field_2C2 = 2; - sPSSData->field_2C5 = 0; + sStorage->partyMenuUnused1 = 20; + sStorage->partyMenuY = 2; + sStorage->partyMenuMoveTimer = 0; CreatePartyMonsSprites(FALSE); } static bool8 ShowPartyMenu(void) { - if (sPSSData->field_2C5 == 20) + if (sStorage->partyMenuMoveTimer == 20) return FALSE; - sPSSData->field_2C0--; - sPSSData->field_2C2++; - sub_80D27F4(1, 3, 1); - sub_80D2918(1); + sStorage->partyMenuUnused1--; + sStorage->partyMenuY++; + TilemapUtil_Move(TILEMAPID_PARTY_MENU, 3, 1); + TilemapUtil_Update(TILEMAPID_PARTY_MENU); ScheduleBgCopyTilemapToVram(1); - sub_80CBAF0(8); - if (++sPSSData->field_2C5 == 20) + MovePartySprites(8); + if (++sStorage->partyMenuMoveTimer == 20) { sInPartyMenu = TRUE; return FALSE; @@ -4216,24 +4114,24 @@ static bool8 ShowPartyMenu(void) static void SetUpHidePartyMenu(void) { - sPSSData->field_2C0 = 0; - sPSSData->field_2C2 = 22; - sPSSData->field_2C5 = 0; - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) - sub_80D11CC(); + sStorage->partyMenuUnused1 = 0; + sStorage->partyMenuY = 22; + sStorage->partyMenuMoveTimer = 0; + if (sStorage->boxOption == OPTION_MOVE_ITEMS) + MoveHeldItemWithPartyMenu(); } static bool8 HidePartyMenu(void) { - if (sPSSData->field_2C5 != 20) + if (sStorage->partyMenuMoveTimer != 20) { - sPSSData->field_2C0++; - sPSSData->field_2C2--; - sub_80D27F4(1, 3, -1); - sub_80D2918(1); - FillBgTilemapBufferRect_Palette0(1, 0x100, 10, sPSSData->field_2C2, 12, 1); - sub_80CBAF0(-8); - if (++sPSSData->field_2C5 != 20) + sStorage->partyMenuUnused1++; + sStorage->partyMenuY--; + TilemapUtil_Move(TILEMAPID_PARTY_MENU, 3, -1); + TilemapUtil_Update(TILEMAPID_PARTY_MENU); + FillBgTilemapBufferRect_Palette0(1, 0x100, 10, sStorage->partyMenuY, 12, 1); + MovePartySprites(-8); + if (++sStorage->partyMenuMoveTimer != 20) { ScheduleBgCopyTilemapToVram(1); return TRUE; @@ -4243,8 +4141,11 @@ static bool8 HidePartyMenu(void) sInPartyMenu = FALSE; DestroyAllPartyMonIcons(); CompactPartySlots(); - sub_80D27AC(2, 0, 0, 9, 2); - sub_80D2918(2); + + // The close box button gets partially covered by + // the party menu, restore it + TilemapUtil_SetRect(TILEMAPID_CLOSE_BUTTON, 0, 0, 9, 2); + TilemapUtil_Update(TILEMAPID_CLOSE_BUTTON); ScheduleBgCopyTilemapToVram(1); return FALSE; } @@ -4253,110 +4154,111 @@ static bool8 HidePartyMenu(void) return FALSE; } -static void sub_80CA984(bool8 arg0) +static void UpdateCloseBoxButtonTilemap(bool8 normal) { - if (arg0) - sub_80D27AC(2, 0, 0, 9, 2); - else - sub_80D27AC(2, 0, 2, 9, 2); + if (normal) + TilemapUtil_SetRect(TILEMAPID_CLOSE_BUTTON, 0, 0, 9, 2); + else // flashing + TilemapUtil_SetRect(TILEMAPID_CLOSE_BUTTON, 0, 2, 9, 2); - sub_80D2918(2); + TilemapUtil_Update(TILEMAPID_CLOSE_BUTTON); ScheduleBgCopyTilemapToVram(1); } -static void sub_80CA9C0(void) +static void StartFlashingCloseBoxButton(void) { - sPSSData->unk_02C7 = 1; - sPSSData->unk_02C8 = 30; - sPSSData->unk_02C9 = TRUE; + sStorage->closeBoxFlashing = TRUE; + sStorage->closeBoxFlashTimer = 30; + sStorage->closeBoxFlashState = TRUE; } -static void sub_80CA9EC(void) +static void StopFlashingCloseBoxButton(void) { - if (sPSSData->unk_02C7) + if (sStorage->closeBoxFlashing) { - sPSSData->unk_02C7 = 0; - sub_80CA984(TRUE); + sStorage->closeBoxFlashing = FALSE; + UpdateCloseBoxButtonTilemap(TRUE); } } -static void sub_80CAA14(void) +static void UpdateCloseBoxButtonFlash(void) { - if (sPSSData->unk_02C7 && ++sPSSData->unk_02C8 > 30) + if (sStorage->closeBoxFlashing && ++sStorage->closeBoxFlashTimer > 30) { - sPSSData->unk_02C8 = 0; - sPSSData->unk_02C9 = (sPSSData->unk_02C9 == FALSE); - sub_80CA984(sPSSData->unk_02C9); + sStorage->closeBoxFlashTimer = 0; + sStorage->closeBoxFlashState = (sStorage->closeBoxFlashState == FALSE); + UpdateCloseBoxButtonTilemap(sStorage->closeBoxFlashState); } } -static void sub_80CAA74(void) +static void SetPartySlotTilemaps(void) { u8 i; + // Skips first party slot, it should always be drawn + // as if it has a Pokémon in it for (i = 1; i < PARTY_SIZE; i++) { - s32 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); - sub_80CAAA8(i, (species != SPECIES_NONE)); + s32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); + SetPartySlotTilemap(i, species != SPECIES_NONE); } } -static void sub_80CAAA8(u8 arg0, bool8 isPartyMon) +static void SetPartySlotTilemap(u8 partyId, bool8 hasMon) { u16 i, j, index; const u16 *data; - if (isPartyMon) - data = gUnknown_085724A4; + if (hasMon) + data = sPartySlotFilled_Tilemap; else - data = gUnknown_085724BC; + data = sPartySlotEmpty_Tilemap; - index = 3 * (3 * (arg0 - 1) + 1); + index = 3 * (3 * (partyId - 1) + 1); index *= 4; index += 7; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) - { - sPSSData->field_B0[index + j] = data[j]; - } + sStorage->partyMenuTilemapBuffer[index + j] = data[j]; + data += 4; index += 12; } } -static void sub_80CAB20(void) +static void UpdatePartySlotColors(void) { - sub_80CAA74(); - sub_80D27AC(1, 0, 0, 12, 22); - sub_80D2918(1); + SetPartySlotTilemaps(); + TilemapUtil_SetRect(TILEMAPID_PARTY_MENU, 0, 0, 12, 22); + TilemapUtil_Update(TILEMAPID_PARTY_MENU); ScheduleBgCopyTilemapToVram(1); } static void SetUpDoShowPartyMenu(void) { - sPSSData->showPartyMenuState = 0; + sStorage->showPartyMenuState = 0; PlaySE(SE_WIN_OPEN); SetUpShowPartyMenu(); } static bool8 DoShowPartyMenu(void) { - switch (sPSSData->showPartyMenuState) + switch (sStorage->showPartyMenuState) { case 0: if (!ShowPartyMenu()) { - sub_80CDBA0(); - sPSSData->showPartyMenuState++; + SetCursorInParty(); + sStorage->showPartyMenuState++; } break; case 1: - if (!sub_80CD554()) + if (!UpdateCursorPos()) { - if (sPSSData->setMosaic) - BoxSetMosaic(); - sPSSData->showPartyMenuState++; + if (sStorage->setMosaic) + StartDisplayMonMosaicEffect(); + sStorage->showPartyMenuState++; } break; case 2: @@ -4365,7 +4267,7 @@ static bool8 DoShowPartyMenu(void) return TRUE; } -static void sub_80CABE0(void) +static void UpdateBoxToSendMons(void) { if (sLastUsedBox != StorageGetCurrentBox()) { @@ -4374,7 +4276,7 @@ static void sub_80CABE0(void) } } -static void sub_80CAC1C(void) +static void InitPokeStorageBg0(void) { SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(29)); LoadUserWindowBorderGfx(1, 2, 208); @@ -4382,42 +4284,42 @@ static void sub_80CAC1C(void) CopyBgTilemapBufferToVram(0); } -static void PrintStorageActionText(u8 id) +static void PrintMessage(u8 id) { u8 *txtPtr; DynamicPlaceholderTextUtil_Reset(); - switch (gPCStorageActionTexts[id].format) + switch (sMessages[id].format) { - case PC_TEXT_FMT_NORMAL: + case MSG_VAR_NONE: break; - case PC_TEXT_FMT_MON_NAME_1: - case PC_TEXT_FMT_MON_NAME_2: - case PC_TEXT_FMT_MON_NAME_3: - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->cursorMonNick); + case MSG_VAR_MON_NAME_1: + case MSG_VAR_MON_NAME_2: + case MSG_VAR_MON_NAME_3: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sStorage->displayMonName); break; - case PC_TEXT_FMT_MON_NAME_4: - case PC_TEXT_FMT_MON_NAME_5: - case PC_TEXT_FMT_MON_NAME_6: - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->field_21E0); + case MSG_VAR_RELEASE_MON_1: + case MSG_VAR_RELEASE_MON_2: + case MSG_VAR_RELEASE_MON_3: + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sStorage->releaseMonName); break; - case PC_TEXT_FMT_ITEM_NAME: - if (IsActiveItemMoving()) - txtPtr = StringCopy(sPSSData->itemName, GetMovingItemName()); + case MSG_VAR_ITEM_NAME: + if (IsMovingItem()) + txtPtr = StringCopy(sStorage->itemName, GetMovingItemName()); else - txtPtr = StringCopy(sPSSData->itemName, sPSSData->cursorMonItemName); + txtPtr = StringCopy(sStorage->itemName, sStorage->displayMonItemName); while (*(txtPtr - 1) == CHAR_SPACE) txtPtr--; *txtPtr = EOS; - DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sPSSData->itemName); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, sStorage->itemName); break; } - DynamicPlaceholderTextUtil_ExpandPlaceholders(sPSSData->field_2190, gPCStorageActionTexts[id].text); + DynamicPlaceholderTextUtil_ExpandPlaceholders(sStorage->messageText, sMessages[id].text); FillWindowPixelBuffer(1, PIXEL_FILL(1)); - AddTextPrinterParameterized(1, 1, sPSSData->field_2190, 0, 1, TEXT_SPEED_FF, NULL); + AddTextPrinterParameterized(1, 1, sStorage->messageText, 0, 1, TEXT_SPEED_FF, NULL); DrawTextBorderOuter(1, 2, 14); PutWindowTilemap(1); CopyWindowToVram(1, 2); @@ -4439,12 +4341,12 @@ static void ClearBottomWindow(void) static void AddWallpaperSetsMenu(void) { InitMenu(); - SetMenuText(18); - SetMenuText(19); - SetMenuText(20); - SetMenuText(21); + SetMenuText(MENU_SCENERY_1); + SetMenuText(MENU_SCENERY_2); + SetMenuText(MENU_SCENERY_3); + SetMenuText(MENU_ETCETERA); if (IsWaldaWallpaperUnlocked()) - SetMenuText(22); + SetMenuText(MENU_FRIENDS); AddMenu(); } @@ -4453,29 +4355,29 @@ static void AddWallpapersMenu(u8 wallpaperSet) InitMenu(); switch (wallpaperSet) { - case 0: - SetMenuText(23); - SetMenuText(24); - SetMenuText(25); - SetMenuText(26); + case MENU_SCENERY_1 - MENU_WALLPAPER_SETS_START: + SetMenuText(MENU_FOREST); + SetMenuText(MENU_CITY); + SetMenuText(MENU_DESERT); + SetMenuText(MENU_SAVANNA); break; - case 1: - SetMenuText(27); - SetMenuText(28); - SetMenuText(29); - SetMenuText(30); + case MENU_SCENERY_2 - MENU_WALLPAPER_SETS_START: + SetMenuText(MENU_CRAG); + SetMenuText(MENU_VOLCANO); + SetMenuText(MENU_SNOW); + SetMenuText(MENU_CAVE); break; - case 2: - SetMenuText(31); - SetMenuText(32); - SetMenuText(33); - SetMenuText(34); + case MENU_SCENERY_3 - MENU_WALLPAPER_SETS_START: + SetMenuText(MENU_BEACH); + SetMenuText(MENU_SEAFLOOR); + SetMenuText(MENU_RIVER); + SetMenuText(MENU_SKY); break; - case 3: - SetMenuText(35); - SetMenuText(36); - SetMenuText(37); - SetMenuText(38); + case MENU_ETCETERA - MENU_WALLPAPER_SETS_START: + SetMenuText(MENU_POLKADOT); + SetMenuText(MENU_POKECENTER); + SetMenuText(MENU_MACHINE); + SetMenuText(MENU_SIMPLE); break; } AddMenu(); @@ -4486,57 +4388,67 @@ static u8 GetCurrentBoxOption(void) return sCurrentBoxOption; } -static void sub_80CAEAC(void) +static void InitCursorItemIcon(void) { - if (!IsCursorOnBox()) + if (!IsCursorOnBoxTitle()) { if (sInPartyMenu) - sub_80D0D8C(CURSOR_AREA_IN_PARTY, GetBoxCursorPosition()); + TryLoadItemIconAtPos(CURSOR_AREA_IN_PARTY, GetCursorPosition()); else - sub_80D0D8C(CURSOR_AREA_IN_BOX, GetBoxCursorPosition()); + TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, GetCursorPosition()); } if (sMovingItemId != ITEM_NONE) { - sub_80D0F38(sMovingItemId); - sub_80CFE54(3); + InitItemIconInCursor(sMovingItemId); + StartCursorAnim(CURSOR_ANIM_FIST); } } -static void sub_80CAF04(void) + +//------------------------------------------------------------------------------ +// SECTION: Pokémon sprites +// +// The below functions generally handle the Pokémon icon sprites, including +// moving them with a scrolling box, shifting the party sprites, and +// animating released Pokémon. +//------------------------------------------------------------------------------ + + +static void InitMonIconFields(void) { u16 i; LoadMonIconPalettes(); - for (i = 0; i < 40; i++) - sPSSData->field_B08[i] = 0; - for (i = 0; i < 40; i++) - sPSSData->field_B58[i] = 0; + for (i = 0; i < MAX_MON_ICONS; i++) + sStorage->numIconsPerSpecies[i] = 0; + for (i = 0; i < MAX_MON_ICONS; i++) + sStorage->iconSpeciesList[i] = SPECIES_NONE; for (i = 0; i < PARTY_SIZE; i++) - sPSSData->partySprites[i] = NULL; + sStorage->partySprites[i] = NULL; for (i = 0; i < IN_BOX_COUNT; i++) - sPSSData->boxMonsSprites[i] = NULL; + sStorage->boxMonsSprites[i] = NULL; - sPSSData->movingMonSprite = NULL; - sPSSData->field_78C = 0; + sStorage->movingMonSprite = NULL; + sStorage->unkUnused1 = 0; } -static u8 sub_80CAFAC(void) +static u8 GetMonIconPriorityByCursorPos(void) { return (IsCursorInBox() ? 2 : 1); } static void CreateMovingMonIcon(void) { - u32 personality = GetMonData(&sPSSData->movingMon, MON_DATA_PERSONALITY); - u16 species = GetMonData(&sPSSData->movingMon, MON_DATA_SPECIES2); - u8 priority = sub_80CAFAC(); + u32 personality = GetMonData(&sStorage->movingMon, MON_DATA_PERSONALITY); + u16 species = GetMonData(&sStorage->movingMon, MON_DATA_SPECIES2); + u8 priority = GetMonIconPriorityByCursorPos(); - sPSSData->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7); - sPSSData->movingMonSprite->callback = sub_80CC100; + sStorage->movingMonSprite = CreateMonIconSprite(species, personality, 0, 0, priority, 7); + sStorage->movingMonSprite->callback = SpriteCB_HeldMon; } -static void sub_80CB028(u8 boxId) +static void InitBoxMonSprites(u8 boxId) { u8 boxPosition; u16 i, j, count; @@ -4545,224 +4457,255 @@ static void sub_80CB028(u8 boxId) count = 0; boxPosition = 0; - for (i = 0; i < IN_BOX_COLUMNS; i++) + + // For each box slot, create a Pokémon icon if a species is present + for (i = 0; i < IN_BOX_ROWS; i++) { - for (j = 0; j < IN_BOX_ROWS; j++) + for (j = 0; j < IN_BOX_COLUMNS; j++) { species = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2); if (species != SPECIES_NONE) { personality = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); - sPSSData->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j); + sStorage->boxMonsSprites[count] = CreateMonIconSprite(species, personality, 8 * (3 * j) + 100, 8 * (3 * i) + 44, 2, 19 - j); } else { - sPSSData->boxMonsSprites[count] = NULL; + sStorage->boxMonsSprites[count] = NULL; } boxPosition++; count++; } } - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + // If in item mode, set all Pokémon icons with no item to be transparent + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { for (boxPosition = 0; boxPosition < IN_BOX_COUNT; boxPosition++) { - if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == 0) - sPSSData->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; + if (GetBoxMonDataAt(boxId, boxPosition, MON_DATA_HELD_ITEM) == ITEM_NONE) + sStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; } } } -static void sub_80CB140(u8 boxPosition) +static void CreateBoxMonIconAtPos(u8 boxPosition) { u16 species = GetCurrentBoxMonData(boxPosition, MON_DATA_SPECIES2); if (species != SPECIES_NONE) { - s16 x = 8 * (3 * (boxPosition % IN_BOX_ROWS)) + 100; - s16 y = 8 * (3 * (boxPosition / IN_BOX_ROWS)) + 44; + s16 x = 8 * (3 * (boxPosition % IN_BOX_COLUMNS)) + 100; + s16 y = 8 * (3 * (boxPosition / IN_BOX_COLUMNS)) + 44; u32 personality = GetCurrentBoxMonData(boxPosition, MON_DATA_PERSONALITY); - sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_ROWS)); - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) - sPSSData->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; + sStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(species, personality, x, y, 2, 19 - (boxPosition % IN_BOX_COLUMNS)); + if (sStorage->boxOption == OPTION_MOVE_ITEMS) + sStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; } } -static void sub_80CB1F0(s16 arg0) +#define sDistance data[1] +#define sSpeed data[2] +#define sScrollInDestX data[3] +#define sDelay data[4] +#define sScrollOutX data[5] + +static void StartBoxMonIconsScrollOut(s16 speed) { u16 i; for (i = 0; i < IN_BOX_COUNT; i++) { - if (sPSSData->boxMonsSprites[i] != NULL) + if (sStorage->boxMonsSprites[i] != NULL) { - sPSSData->boxMonsSprites[i]->data[2] = arg0; - sPSSData->boxMonsSprites[i]->data[4] = 1; - sPSSData->boxMonsSprites[i]->callback = sub_80CB278; + sStorage->boxMonsSprites[i]->sSpeed = speed; + sStorage->boxMonsSprites[i]->sDelay = 1; + sStorage->boxMonsSprites[i]->callback = SpriteCB_BoxMonIconScrollOut; } } } -static void sub_80CB234(struct Sprite *sprite) +static void SpriteCB_BoxMonIconScrollIn(struct Sprite *sprite) { - if (sprite->data[1] != 0) + if (sprite->sDistance != 0) { - sprite->data[1]--; - sprite->pos1.x += sprite->data[2]; + // Icon moving + sprite->sDistance--; + sprite->pos1.x += sprite->sSpeed; } else { - sPSSData->field_C66--; - sprite->pos1.x = sprite->data[3]; + // Icon arrived + sStorage->iconScrollNumIncoming--; + sprite->pos1.x = sprite->sScrollInDestX; sprite->callback = SpriteCallbackDummy; } } -static void sub_80CB278(struct Sprite *sprite) +static void SpriteCB_BoxMonIconScrollOut(struct Sprite *sprite) { - if (sprite->data[4] != 0) + if (sprite->sDelay != 0) { - sprite->data[4]--; + sprite->sDelay--; } else { - sprite->pos1.x += sprite->data[2]; - sprite->data[5] = sprite->pos1.x + sprite->pos2.x; - if (sprite->data[5] <= 68 || sprite->data[5] >= 252) + // Icon moving + sprite->pos1.x += sprite->sSpeed; + sprite->sScrollOutX = sprite->pos1.x + sprite->pos2.x; + + // Check if icon offscreen + if (sprite->sScrollOutX <= 68 || sprite->sScrollOutX >= 252) sprite->callback = SpriteCallbackDummy; } } -static void DestroyAllIconsInRow(u8 row) +// Sprites for Pokémon icons are destroyed during +// the box scroll once they've gone offscreen +static void DestroyBoxMonIconsInColumn(u8 column) { - u16 column; - u8 boxPosition = row; + u16 row; + u8 boxPosition = column; - for (column = 0; column < IN_BOX_COLUMNS; column++) + for (row = 0; row < IN_BOX_ROWS; row++) { - if (sPSSData->boxMonsSprites[boxPosition] != NULL) + if (sStorage->boxMonsSprites[boxPosition] != NULL) { - DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]); - sPSSData->boxMonsSprites[boxPosition] = NULL; + DestroyBoxMonIcon(sStorage->boxMonsSprites[boxPosition]); + sStorage->boxMonsSprites[boxPosition] = NULL; } - boxPosition += IN_BOX_ROWS; + boxPosition += IN_BOX_COLUMNS; } } -static u8 sub_80CB2F8(u8 row, u16 times, s16 xDelta) +// Create the appearing icons for the incoming scrolling box +static u8 CreateBoxMonIconsInColumn(u8 column, u16 distance, s16 speed) { s32 i; u16 y = 44; - s16 xDest = 8 * (3 * row) + 100; - u16 x = xDest - ((times + 1) * xDelta); - u8 subpriority = 19 - row; - u8 count = 0; - u8 boxPosition = row; + s16 xDest = 8 * (3 * column) + 100; + u16 x = xDest - ((distance + 1) * speed); + u8 subpriority = 19 - column; + u8 iconsCreated = 0; + u8 boxPosition = column; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - for (i = 0; i < IN_BOX_COLUMNS; i++) + for (i = 0; i < IN_BOX_ROWS; i++) { - if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE) + if (sStorage->boxSpecies[boxPosition] != SPECIES_NONE) { - sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition], - sPSSData->boxPersonalities[boxPosition], + sStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(sStorage->boxSpecies[boxPosition], + sStorage->boxPersonalities[boxPosition], x, y, 2, subpriority); - if (sPSSData->boxMonsSprites[boxPosition] != NULL) + if (sStorage->boxMonsSprites[boxPosition] != NULL) { - sPSSData->boxMonsSprites[boxPosition]->data[1] = times; - sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta; - sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest; - sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234; - count++; + sStorage->boxMonsSprites[boxPosition]->sDistance = distance; + sStorage->boxMonsSprites[boxPosition]->sSpeed = speed; + sStorage->boxMonsSprites[boxPosition]->sScrollInDestX = xDest; + sStorage->boxMonsSprites[boxPosition]->callback = SpriteCB_BoxMonIconScrollIn; + iconsCreated++; } } - boxPosition += IN_BOX_ROWS; + boxPosition += IN_BOX_COLUMNS; y += 24; } } else { - for (i = 0; i < IN_BOX_COLUMNS; i++) + // Separate case for Move Items mode is used + // to create the icons with the proper blend + for (i = 0; i < IN_BOX_ROWS; i++) { - if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE) + if (sStorage->boxSpecies[boxPosition] != SPECIES_NONE) { - sPSSData->boxMonsSprites[boxPosition] = CreateMonIconSprite(sPSSData->boxSpecies[boxPosition], - sPSSData->boxPersonalities[boxPosition], + sStorage->boxMonsSprites[boxPosition] = CreateMonIconSprite(sStorage->boxSpecies[boxPosition], + sStorage->boxPersonalities[boxPosition], x, y, 2, subpriority); - if (sPSSData->boxMonsSprites[boxPosition] != NULL) + if (sStorage->boxMonsSprites[boxPosition] != NULL) { - sPSSData->boxMonsSprites[boxPosition]->data[1] = times; - sPSSData->boxMonsSprites[boxPosition]->data[2] = xDelta; - sPSSData->boxMonsSprites[boxPosition]->data[3] = xDest; - sPSSData->boxMonsSprites[boxPosition]->callback = sub_80CB234; - if (GetBoxMonDataAt(sPSSData->field_C5C, boxPosition, MON_DATA_HELD_ITEM) == 0) - sPSSData->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; - count++; + sStorage->boxMonsSprites[boxPosition]->sDistance = distance; + sStorage->boxMonsSprites[boxPosition]->sSpeed = speed; + sStorage->boxMonsSprites[boxPosition]->sScrollInDestX = xDest; + sStorage->boxMonsSprites[boxPosition]->callback = SpriteCB_BoxMonIconScrollIn; + if (GetBoxMonDataAt(sStorage->incomingBoxId, boxPosition, MON_DATA_HELD_ITEM) == ITEM_NONE) + sStorage->boxMonsSprites[boxPosition]->oam.objMode = ST_OAM_OBJ_BLEND; + iconsCreated++; } } - boxPosition += IN_BOX_ROWS; + boxPosition += IN_BOX_COLUMNS; y += 24; } } - return count; + return iconsCreated; } -static void sub_80CB4CC(u8 boxId, s8 direction) +#undef sDistance +#undef sSpeed +#undef sScrollInDestX +#undef sDelay +#undef sScrollOutX + +static void InitBoxMonIconScroll(u8 boxId, s8 direction) { - sPSSData->field_C6A = 0; - sPSSData->field_C6B = boxId; - sPSSData->field_C69 = direction; - sPSSData->field_C60 = 32; - sPSSData->field_C64 = -(6 * direction); - sPSSData->field_C66 = 0; - SetBoxSpeciesAndPersonalities(boxId); + sStorage->iconScrollState = 0; + sStorage->iconScrollToBoxId = boxId; + sStorage->iconScrollDirection = direction; + sStorage->iconScrollDistance = 32; + sStorage->iconScrollSpeed = -(6 * direction); + sStorage->iconScrollNumIncoming = 0; + GetIncomingBoxMonData(boxId); if (direction > 0) - sPSSData->field_C68 = 0; + sStorage->iconScrollCurColumn = 0; else - sPSSData->field_C68 = IN_BOX_ROWS - 1; + sStorage->iconScrollCurColumn = IN_BOX_COLUMNS - 1; - sPSSData->field_C62 = (24 * sPSSData->field_C68) + 100; - sub_80CB1F0(sPSSData->field_C64); + sStorage->iconScrollPos = (24 * sStorage->iconScrollCurColumn) + 100; + StartBoxMonIconsScrollOut(sStorage->iconScrollSpeed); } -static bool8 sub_80CB584(void) +static bool8 UpdateBoxMonIconScroll(void) { - if (sPSSData->field_C60 != 0) - sPSSData->field_C60--; + if (sStorage->iconScrollDistance != 0) + sStorage->iconScrollDistance--; - switch (sPSSData->field_C6A) + switch (sStorage->iconScrollState) { case 0: - sPSSData->field_C62 += sPSSData->field_C64; - if (sPSSData->field_C62 <= 64 || sPSSData->field_C62 >= 252) + sStorage->iconScrollPos += sStorage->iconScrollSpeed; + if (sStorage->iconScrollPos <= 64 || sStorage->iconScrollPos >= 252) { - DestroyAllIconsInRow(sPSSData->field_C68); - sPSSData->field_C62 += sPSSData->field_C69 * 24; - sPSSData->field_C6A++; + // A column of icons has gone offscreen, destroy them + DestroyBoxMonIconsInColumn(sStorage->iconScrollCurColumn); + sStorage->iconScrollPos += sStorage->iconScrollDirection * 24; + sStorage->iconScrollState++; } break; case 1: - sPSSData->field_C62 += sPSSData->field_C64; - sPSSData->field_C66 += sub_80CB2F8(sPSSData->field_C68, sPSSData->field_C60, sPSSData->field_C64); - if ((sPSSData->field_C69 > 0 && sPSSData->field_C68 == IN_BOX_ROWS - 1) - || (sPSSData->field_C69 < 0 && sPSSData->field_C68 == 0)) + // Create the new incoming column of icons + sStorage->iconScrollPos += sStorage->iconScrollSpeed; + sStorage->iconScrollNumIncoming += CreateBoxMonIconsInColumn(sStorage->iconScrollCurColumn, sStorage->iconScrollDistance, sStorage->iconScrollSpeed); + + if ((sStorage->iconScrollDirection > 0 && sStorage->iconScrollCurColumn == IN_BOX_COLUMNS - 1) + || (sStorage->iconScrollDirection < 0 && sStorage->iconScrollCurColumn == 0)) { - sPSSData->field_C6A++; + // Scroll has reached final column + sStorage->iconScrollState++; } else { - sPSSData->field_C68 += sPSSData->field_C69; - sPSSData->field_C6A = 0; + // Continue scrolling + sStorage->iconScrollCurColumn += sStorage->iconScrollDirection; + sStorage->iconScrollState = 0; } break; case 2: - if (sPSSData->field_C66 == 0) + // Wait to make sure all icons have arrived + if (sStorage->iconScrollNumIncoming == 0) { - sPSSData->field_C60++; + sStorage->iconScrollDistance++; return FALSE; } break; @@ -4773,49 +4716,47 @@ static bool8 sub_80CB584(void) return TRUE; } -static void SetBoxSpeciesAndPersonalities(u8 boxId) +static void GetIncomingBoxMonData(u8 boxId) { s32 i, j, boxPosition; boxPosition = 0; - for (i = 0; i < IN_BOX_COLUMNS; i++) + for (i = 0; i < IN_BOX_ROWS; i++) { - for (j = 0; j < IN_BOX_ROWS; j++) + for (j = 0; j < IN_BOX_COLUMNS; j++) { - sPSSData->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2); - if (sPSSData->boxSpecies[boxPosition] != SPECIES_NONE) - sPSSData->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); + sStorage->boxSpecies[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_SPECIES2); + if (sStorage->boxSpecies[boxPosition] != SPECIES_NONE) + sStorage->boxPersonalities[boxPosition] = GetBoxMonDataAt(boxId, boxPosition, MON_DATA_PERSONALITY); boxPosition++; } } - sPSSData->field_C5C = boxId; + sStorage->incomingBoxId = boxId; } static void DestroyBoxMonIconAtPosition(u8 boxPosition) { - if (sPSSData->boxMonsSprites[boxPosition] != NULL) + if (sStorage->boxMonsSprites[boxPosition] != NULL) { - DestroyBoxMonIcon(sPSSData->boxMonsSprites[boxPosition]); - sPSSData->boxMonsSprites[boxPosition] = NULL; + DestroyBoxMonIcon(sStorage->boxMonsSprites[boxPosition]); + sStorage->boxMonsSprites[boxPosition] = NULL; } } static void SetBoxMonIconObjMode(u8 boxPosition, u8 objMode) { - if (sPSSData->boxMonsSprites[boxPosition] != NULL) - { - sPSSData->boxMonsSprites[boxPosition]->oam.objMode = objMode; - } + if (sStorage->boxMonsSprites[boxPosition] != NULL) + sStorage->boxMonsSprites[boxPosition]->oam.objMode = objMode; } -static void CreatePartyMonsSprites(bool8 arg0) +static void CreatePartyMonsSprites(bool8 visible) { u16 i, count; u16 species = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES2); u32 personality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY); - sPSSData->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12); + sStorage->partySprites[0] = CreateMonIconSprite(species, personality, 104, 64, 1, 12); count = 1; for (i = 1; i < PARTY_SIZE; i++) { @@ -4823,90 +4764,97 @@ static void CreatePartyMonsSprites(bool8 arg0) if (species != SPECIES_NONE) { personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY); - sPSSData->partySprites[i] = CreateMonIconSprite(species, personality, 152, 8 * (3 * (i - 1)) + 16, 1, 12); + sStorage->partySprites[i] = CreateMonIconSprite(species, personality, 152, 8 * (3 * (i - 1)) + 16, 1, 12); count++; } else { - sPSSData->partySprites[i] = NULL; + sStorage->partySprites[i] = NULL; } } - if (!arg0) + if (!visible) { for (i = 0; i < count; i++) { - sPSSData->partySprites[i]->pos1.y -= 160; - sPSSData->partySprites[i]->invisible = TRUE; + sStorage->partySprites[i]->pos1.y -= DISPLAY_HEIGHT; + sStorage->partySprites[i]->invisible = TRUE; } } - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { for (i = 0; i < PARTY_SIZE; i++) { - if (sPSSData->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == 0) - sPSSData->partySprites[i]->oam.objMode = ST_OAM_OBJ_BLEND; + if (sStorage->partySprites[i] != NULL && GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM) == ITEM_NONE) + sStorage->partySprites[i]->oam.objMode = ST_OAM_OBJ_BLEND; } } } -static void sub_80CB950(void) +static void CompactPartySprites(void) { - u16 i, count; + u16 i, targetSlot; - sPSSData->field_C5E = 0; - for (i = 0, count = 0; i < PARTY_SIZE; i++) + sStorage->numPartyToCompact = 0; + for (i = 0, targetSlot = 0; i < PARTY_SIZE; i++) { - if (sPSSData->partySprites[i] != NULL) + if (sStorage->partySprites[i] != NULL) { - if (i != count) + if (i != targetSlot) { - sub_80CB9D0(sPSSData->partySprites[i], count); - sPSSData->partySprites[i] = NULL; - sPSSData->field_C5E++; + MovePartySpriteToNextSlot(sStorage->partySprites[i], targetSlot); + sStorage->partySprites[i] = NULL; + sStorage->numPartyToCompact++; } - count++; + targetSlot++; } } } -static u8 sub_80CB9BC(void) +static u8 GetNumPartySpritesCompacting(void) { - return sPSSData->field_C5E; + return sStorage->numPartyToCompact; } -static void sub_80CB9D0(struct Sprite *sprite, u16 partyId) +#define sPartyId data[1] +#define sMonX data[2] +#define sMonY data[3] +#define sSpeedX data[4] +#define sSpeedY data[5] +#define sMoveSteps data[6] + +static void MovePartySpriteToNextSlot(struct Sprite *sprite, u16 partyId) { s16 x, y; - sprite->data[1] = partyId; + sprite->sPartyId = partyId; if (partyId == 0) x = 104, y = 64; else x = 152, y = 8 * (3 * (partyId - 1)) + 16; - sprite->data[2] = (u16)(sprite->pos1.x) * 8; - sprite->data[3] = (u16)(sprite->pos1.y) * 8; - sprite->data[4] = ((x * 8) - sprite->data[2]) / 8; - sprite->data[5] = ((y * 8) - sprite->data[3]) / 8; + sprite->sMonX = (u16)(sprite->pos1.x) * 8; + sprite->sMonY = (u16)(sprite->pos1.y) * 8; + sprite->sSpeedX = ((x * 8) - sprite->sMonX) / 8; + sprite->sSpeedY = ((y * 8) - sprite->sMonY) / 8; sprite->data[6] = 8; - sprite->callback = sub_80CBA3C; + sprite->callback = SpriteCB_MovePartyMonToNextSlot; } -static void sub_80CBA3C(struct Sprite *sprite) +static void SpriteCB_MovePartyMonToNextSlot(struct Sprite *sprite) { - if (sprite->data[6] != 0) + if (sprite->sMoveSteps != 0) { - s16 x = sprite->data[2] += sprite->data[4]; - s16 y = sprite->data[3] += sprite->data[5]; + s16 x = sprite->sMonX += sprite->sSpeedX; + s16 y = sprite->sMonY += sprite->sSpeedY; sprite->pos1.x = x / 8u; sprite->pos1.y = y / 8u; - sprite->data[6]--; + sprite->sMoveSteps--; } else { - if (sprite->data[1] == 0) + if (sprite->sPartyId == 0) { sprite->pos1.x = 104; sprite->pos1.y = 64; @@ -4914,48 +4862,55 @@ static void sub_80CBA3C(struct Sprite *sprite) else { sprite->pos1.x = 152; - sprite->pos1.y = 8 * (3 * (sprite->data[1] - 1)) + 16; + sprite->pos1.y = 8 * (3 * (sprite->sPartyId - 1)) + 16; } sprite->callback = SpriteCallbackDummy; - sPSSData->partySprites[sprite->data[1]] = sprite; - sPSSData->field_C5E--; + sStorage->partySprites[sprite->sPartyId] = sprite; + sStorage->numPartyToCompact--; } } +#undef sPartyId +#undef sMonX +#undef sMonY +#undef sSpeedX +#undef sSpeedY +#undef sMoveSteps + static void DestroyMovingMonIcon(void) { - if (sPSSData->movingMonSprite != NULL) + if (sStorage->movingMonSprite != NULL) { - DestroyBoxMonIcon(sPSSData->movingMonSprite); - sPSSData->movingMonSprite = NULL; + DestroyBoxMonIcon(sStorage->movingMonSprite); + sStorage->movingMonSprite = NULL; } } -static void sub_80CBAF0(s16 yDelta) +static void MovePartySprites(s16 yDelta) { u16 i, posY; for (i = 0; i < PARTY_SIZE; i++) { - if (sPSSData->partySprites[i] != NULL) + if (sStorage->partySprites[i] != NULL) { - sPSSData->partySprites[i]->pos1.y += yDelta; - posY = sPSSData->partySprites[i]->pos1.y + sPSSData->partySprites[i]->pos2.y + sPSSData->partySprites[i]->centerToCornerVecY; + sStorage->partySprites[i]->pos1.y += yDelta; + posY = sStorage->partySprites[i]->pos1.y + sStorage->partySprites[i]->pos2.y + sStorage->partySprites[i]->centerToCornerVecY; posY += 16; if (posY > 192) - sPSSData->partySprites[i]->invisible = TRUE; + sStorage->partySprites[i]->invisible = TRUE; else - sPSSData->partySprites[i]->invisible = FALSE; + sStorage->partySprites[i]->invisible = FALSE; } } } static void DestroyPartyMonIcon(u8 partyId) { - if (sPSSData->partySprites[partyId] != NULL) + if (sStorage->partySprites[partyId] != NULL) { - DestroyBoxMonIcon(sPSSData->partySprites[partyId]); - sPSSData->partySprites[partyId] = NULL; + DestroyBoxMonIcon(sStorage->partySprites[partyId]); + sStorage->partySprites[partyId] = NULL; } } @@ -4965,225 +4920,232 @@ static void DestroyAllPartyMonIcons(void) for (i = 0; i < PARTY_SIZE; i++) { - if (sPSSData->partySprites[i] != NULL) + if (sStorage->partySprites[i] != NULL) { - DestroyBoxMonIcon(sPSSData->partySprites[i]); - sPSSData->partySprites[i] = NULL; + DestroyBoxMonIcon(sStorage->partySprites[i]); + sStorage->partySprites[i] = NULL; } } } static void SetPartyMonIconObjMode(u8 partyId, u8 objMode) { - if (sPSSData->partySprites[partyId] != NULL) + if (sStorage->partySprites[partyId] != NULL) { - sPSSData->partySprites[partyId]->oam.objMode = objMode; + sStorage->partySprites[partyId]->oam.objMode = objMode; } } -static void sub_80CBC14(u8 mode, u8 id) +static void SetMovingMonSprite(u8 mode, u8 id) { if (mode == MODE_PARTY) { - sPSSData->movingMonSprite = sPSSData->partySprites[id]; - sPSSData->partySprites[id] = NULL; + sStorage->movingMonSprite = sStorage->partySprites[id]; + sStorage->partySprites[id] = NULL; } else if (mode == MODE_BOX) { - sPSSData->movingMonSprite = sPSSData->boxMonsSprites[id]; - sPSSData->boxMonsSprites[id] = NULL; + sStorage->movingMonSprite = sStorage->boxMonsSprites[id]; + sStorage->boxMonsSprites[id] = NULL; } else { return; } - sPSSData->movingMonSprite->callback = sub_80CC100; - sPSSData->movingMonSprite->oam.priority = sub_80CAFAC(); - sPSSData->movingMonSprite->subpriority = 7; + sStorage->movingMonSprite->callback = SpriteCB_HeldMon; + sStorage->movingMonSprite->oam.priority = GetMonIconPriorityByCursorPos(); + sStorage->movingMonSprite->subpriority = 7; } -static void sub_80CBCAC(u8 boxId, u8 position) +static void SetPlacedMonSprite(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) // party mon { - sPSSData->partySprites[position] = sPSSData->movingMonSprite; - sPSSData->partySprites[position]->oam.priority = 1; - sPSSData->partySprites[position]->subpriority = 12; + sStorage->partySprites[position] = sStorage->movingMonSprite; + sStorage->partySprites[position]->oam.priority = 1; + sStorage->partySprites[position]->subpriority = 12; } else { - sPSSData->boxMonsSprites[position] = sPSSData->movingMonSprite; - sPSSData->boxMonsSprites[position]->oam.priority = 2; - sPSSData->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_ROWS); + sStorage->boxMonsSprites[position] = sStorage->movingMonSprite; + sStorage->boxMonsSprites[position]->oam.priority = 2; + sStorage->boxMonsSprites[position]->subpriority = 19 - (position % IN_BOX_COLUMNS); } - sPSSData->movingMonSprite->callback = SpriteCallbackDummy; - sPSSData->movingMonSprite = NULL; + sStorage->movingMonSprite->callback = SpriteCallbackDummy; + sStorage->movingMonSprite = NULL; } -static void sub_80CBD5C(u8 boxId, u8 position) +static void SaveMonSpriteAtPos(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) // party mon - sPSSData->field_B00 = &sPSSData->partySprites[position]; + sStorage->shiftMonSpritePtr = &sStorage->partySprites[position]; else - sPSSData->field_B00 = &sPSSData->boxMonsSprites[position]; + sStorage->shiftMonSpritePtr = &sStorage->boxMonsSprites[position]; - sPSSData->movingMonSprite->callback = SpriteCallbackDummy; - sPSSData->field_C5D = 0; + sStorage->movingMonSprite->callback = SpriteCallbackDummy; + sStorage->shiftTimer = 0; } -static bool8 sub_80CBDC4(void) +static bool8 MoveShiftingMons(void) { - if (sPSSData->field_C5D == 16) + if (sStorage->shiftTimer == 16) return FALSE; - sPSSData->field_C5D++; - if (sPSSData->field_C5D & 1) + sStorage->shiftTimer++; + if (sStorage->shiftTimer & 1) { - (*sPSSData->field_B00)->pos1.y--; - sPSSData->movingMonSprite->pos1.y++; + (*sStorage->shiftMonSpritePtr)->pos1.y--; + sStorage->movingMonSprite->pos1.y++; } - (*sPSSData->field_B00)->pos2.x = gSineTable[sPSSData->field_C5D * 8] / 16; - sPSSData->movingMonSprite->pos2.x = -(gSineTable[sPSSData->field_C5D * 8] / 16); - if (sPSSData->field_C5D == 8) + (*sStorage->shiftMonSpritePtr)->pos2.x = gSineTable[sStorage->shiftTimer * 8] / 16; + sStorage->movingMonSprite->pos2.x = -(gSineTable[sStorage->shiftTimer * 8] / 16); + if (sStorage->shiftTimer == 8) { - sPSSData->movingMonSprite->oam.priority = (*sPSSData->field_B00)->oam.priority; - sPSSData->movingMonSprite->subpriority = (*sPSSData->field_B00)->subpriority; - (*sPSSData->field_B00)->oam.priority = sub_80CAFAC(); - (*sPSSData->field_B00)->subpriority = 7; + sStorage->movingMonSprite->oam.priority = (*sStorage->shiftMonSpritePtr)->oam.priority; + sStorage->movingMonSprite->subpriority = (*sStorage->shiftMonSpritePtr)->subpriority; + (*sStorage->shiftMonSpritePtr)->oam.priority = GetMonIconPriorityByCursorPos(); + (*sStorage->shiftMonSpritePtr)->subpriority = 7; } - if (sPSSData->field_C5D == 16) + if (sStorage->shiftTimer == 16) { - struct Sprite *sprite = sPSSData->movingMonSprite; - sPSSData->movingMonSprite = (*sPSSData->field_B00); - *sPSSData->field_B00 = sprite; + struct Sprite *sprite = sStorage->movingMonSprite; + sStorage->movingMonSprite = (*sStorage->shiftMonSpritePtr); + *sStorage->shiftMonSpritePtr = sprite; - sPSSData->movingMonSprite->callback = sub_80CC100; - (*sPSSData->field_B00)->callback = SpriteCallbackDummy; + sStorage->movingMonSprite->callback = SpriteCB_HeldMon; + (*sStorage->shiftMonSpritePtr)->callback = SpriteCallbackDummy; } return TRUE; } -static void sub_80CBF14(u8 mode, u8 position) +static void SetReleaseMon(u8 mode, u8 position) { switch (mode) { case MODE_PARTY: - sPSSData->field_B04 = &sPSSData->partySprites[position]; + sStorage->releaseMonSpritePtr = &sStorage->partySprites[position]; break; case MODE_BOX: - sPSSData->field_B04 = &sPSSData->boxMonsSprites[position]; + sStorage->releaseMonSpritePtr = &sStorage->boxMonsSprites[position]; break; case MODE_MOVE: - sPSSData->field_B04 = &sPSSData->movingMonSprite; + sStorage->releaseMonSpritePtr = &sStorage->movingMonSprite; break; default: return; } - if (*sPSSData->field_B04 != NULL) + if (*sStorage->releaseMonSpritePtr != NULL) { - InitSpriteAffineAnim(*sPSSData->field_B04); - (*sPSSData->field_B04)->oam.affineMode = ST_OAM_AFFINE_NORMAL; - (*sPSSData->field_B04)->affineAnims = gSpriteAffineAnimTable_857291C; - StartSpriteAffineAnim(*sPSSData->field_B04, 0); + InitSpriteAffineAnim(*sStorage->releaseMonSpritePtr); + (*sStorage->releaseMonSpritePtr)->oam.affineMode = ST_OAM_AFFINE_NORMAL; + (*sStorage->releaseMonSpritePtr)->affineAnims = sAffineAnims_ReleaseMon; + StartSpriteAffineAnim(*sStorage->releaseMonSpritePtr, RELEASE_ANIM_RELEASE); } } -static bool8 sub_80CBFD8(void) +static bool8 TryHideReleaseMonSprite(void) { - if (*sPSSData->field_B04 == NULL || (*sPSSData->field_B04)->invisible) + if (*sStorage->releaseMonSpritePtr == NULL + || (*sStorage->releaseMonSpritePtr)->invisible) return FALSE; - if ((*sPSSData->field_B04)->affineAnimEnded) - (*sPSSData->field_B04)->invisible = TRUE; + if ((*sStorage->releaseMonSpritePtr)->affineAnimEnded) + (*sStorage->releaseMonSpritePtr)->invisible = TRUE; return TRUE; } -static void sub_80CC020(void) +static void DestroyReleaseMonIcon(void) { - if (*sPSSData->field_B04 != NULL) + if (*sStorage->releaseMonSpritePtr != NULL) { - FreeOamMatrix((*sPSSData->field_B04)->oam.matrixNum); - DestroyBoxMonIcon(*sPSSData->field_B04); - *sPSSData->field_B04 = NULL; + FreeOamMatrix((*sStorage->releaseMonSpritePtr)->oam.matrixNum); + DestroyBoxMonIcon(*sStorage->releaseMonSpritePtr); + *sStorage->releaseMonSpritePtr = NULL; } } -static void sub_80CC064(void) +static void ReshowReleaseMon(void) { - if (*sPSSData->field_B04 != NULL) + if (*sStorage->releaseMonSpritePtr != NULL) { - (*sPSSData->field_B04)->invisible = FALSE; - StartSpriteAffineAnim(*sPSSData->field_B04, 1); + (*sStorage->releaseMonSpritePtr)->invisible = FALSE; + StartSpriteAffineAnim(*sStorage->releaseMonSpritePtr, RELEASE_ANIM_CAME_BACK); } } -static bool8 sub_80CC0A0(void) +static bool8 ResetReleaseMonSpritePtr(void) { - if (sPSSData->field_B04 == NULL) + if (sStorage->releaseMonSpritePtr == NULL) return FALSE; - if ((*sPSSData->field_B04)->affineAnimEnded) - sPSSData->field_B04 = NULL; + if ((*sStorage->releaseMonSpritePtr)->affineAnimEnded) + sStorage->releaseMonSpritePtr = NULL; return TRUE; } static void SetMovingMonPriority(u8 priority) { - sPSSData->movingMonSprite->oam.priority = priority; + sStorage->movingMonSprite->oam.priority = priority; } -static void sub_80CC100(struct Sprite *sprite) +static void SpriteCB_HeldMon(struct Sprite *sprite) { - sprite->pos1.x = sPSSData->field_CB4->pos1.x; - sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 4; + sprite->pos1.x = sStorage->cursorSprite->pos1.x; + sprite->pos1.y = sStorage->cursorSprite->pos1.y + sStorage->cursorSprite->pos2.y + 4; } -static u16 sub_80CC124(u16 species) +static u16 TryLoadMonIconTiles(u16 species) { - u16 i, var; + u16 i, offset; - for (i = 0; i < 40; i++) + // Search icon list for this species + for (i = 0; i < MAX_MON_ICONS; i++) { - if (sPSSData->field_B58[i] == species) + if (sStorage->iconSpeciesList[i] == species) break; } - if (i == 40) + if (i == MAX_MON_ICONS) { - for (i = 0; i < 40; i++) + // Species not present in the list + // Find first empty spot in the list to put it + for (i = 0; i < MAX_MON_ICONS; i++) { - if (sPSSData->field_B58[i] == 0) + if (sStorage->iconSpeciesList[i] == 0) break; } - if (i == 40) + + // Failed to find an empty spot + if (i == MAX_MON_ICONS) return 0xFFFF; } - sPSSData->field_B58[i] = species; - sPSSData->field_B08[i]++; - var = 16 * i; - CpuCopy32(GetMonIconTiles(species, TRUE), (void*)(OBJ_VRAM0) + var * 32, 0x200); + // Add species to icon list and load tiles + sStorage->iconSpeciesList[i] = species; + sStorage->numIconsPerSpecies[i]++; + offset = 16 * i; + CpuCopy32(GetMonIconTiles(species, TRUE), (void*)(OBJ_VRAM0) + offset * 32, 0x200); - return var; + return offset; } -static void sub_80CC1E0(u16 species) +static void RemoveSpeciesFromIconList(u16 species) { u16 i; - for (i = 0; i < 40; i++) + for (i = 0; i < MAX_MON_ICONS; i++) { - if (sPSSData->field_B58[i] == species) + if (sStorage->iconSpeciesList[i] == species) { - if (--sPSSData->field_B08[i] == 0) - sPSSData->field_B58[i] = 0; + if (--sStorage->numIconsPerSpecies[i] == 0) + sStorage->iconSpeciesList[i] = SPECIES_NONE; break; } } @@ -5193,18 +5155,18 @@ static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s { u16 tileNum; u8 spriteId; - struct SpriteTemplate tempalte = gUnknown_085728D4; + struct SpriteTemplate template = sSpriteTemplate_MonIcon; species = GetIconSpecies(species, personality); - tempalte.paletteTag = 0xDAC0 + gMonIconPaletteIndices[species]; - tileNum = sub_80CC124(species); + template.paletteTag = PALTAG_MON_ICON_0 + gMonIconPaletteIndices[species]; + tileNum = TryLoadMonIconTiles(species); if (tileNum == 0xFFFF) return NULL; - spriteId = CreateSprite(&tempalte, x, y, subpriority); + spriteId = CreateSprite(&template, x, y, subpriority); if (spriteId == MAX_SPRITES) { - sub_80CC1E0(species); + RemoveSpeciesFromIconList(species); return NULL; } @@ -5216,113 +5178,130 @@ static struct Sprite *CreateMonIconSprite(u16 species, u32 personality, s16 x, s static void DestroyBoxMonIcon(struct Sprite *sprite) { - sub_80CC1E0(sprite->data[0]); + RemoveSpeciesFromIconList(sprite->data[0]); DestroySprite(sprite); } -static void sub_80CC32C(u8 boxId) + +//------------------------------------------------------------------------------ +// SECTION: General box +// +// Some basic box functions, including initializing the box and scrolling. +//------------------------------------------------------------------------------ + + +#define tState data[0] +#define tDmaIdx data[1] +#define tBoxId data[2] + +static void CreateInitBoxTask(u8 boxId) { - u8 taskId = CreateTask(sub_80CC370, 2); + u8 taskId = CreateTask(Task_InitBox, 2); - gTasks[taskId].data[2] = boxId; + gTasks[taskId].tBoxId = boxId; } -static bool8 sub_80CC35C(void) +static bool8 IsInitBoxActive(void) { - return FuncIsActiveTask(sub_80CC370); + return FuncIsActiveTask(Task_InitBox); } -static void sub_80CC370(u8 taskId) +static void Task_InitBox(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: - sPSSData->field_2D2 = 0; - sPSSData->bg2_X = 0; - task->data[1] = RequestDma3Fill(0, sPSSData->field_4AC4, 0x1000, 1); + sStorage->wallpaperOffset = 0; + sStorage->bg2_X = 0; + task->tDmaIdx = RequestDma3Fill(0, sStorage->wallpaperBgTilemapBuffer, sizeof(sStorage->wallpaperBgTilemapBuffer), 1); break; case 1: - if (CheckForSpaceForDma3Request(task->data[1]) == -1) + if (CheckForSpaceForDma3Request(task->tDmaIdx) == -1) return; - SetBgTilemapBuffer(2, sPSSData->field_4AC4); + SetBgTilemapBuffer(2, sStorage->wallpaperBgTilemapBuffer); ShowBg(2); break; case 2: - LoadWallpaperGfx(task->data[2], 0); + LoadWallpaperGfx(task->tBoxId, 0); break; case 3: if (!WaitForWallpaperGfxLoad()) return; - sub_80CCB50(task->data[2]); - sub_80CD02C(); - sub_80CB028(task->data[2]); + InitBoxTitle(task->tBoxId); + CreateBoxScrollArrows(); + InitBoxMonSprites(task->tBoxId); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(27) | BGCNT_TXT512x256); break; case 4: DestroyTask(taskId); break; default: - task->data[0] = 0; + task->tState = 0; return; } - task->data[0]++; + task->tState++; } +#undef tState +#undef tDmaIdx +#undef tBoxId + static void SetUpScrollToBox(u8 boxId) { s8 direction = DetermineBoxScrollDirection(boxId); - sPSSData->wallpaperScrollSpeed = (direction > 0) ? 6 : -6; - sPSSData->field_2D3 = (direction > 0) ? 1 : 2; - sPSSData->field_2D0 = 32; - sPSSData->field_2D4 = boxId; - sPSSData->field_2D6 = (direction <= 0) ? 5 : 0; - sPSSData->field_2D8 = direction; - sPSSData->field_2DA = (direction > 0) ? 264 : 56; - sPSSData->field_2DC = (direction <= 0) ? 5 : 0; - sPSSData->field_2DE = 0; - sPSSData->field_2E0 = 2; - sPSSData->boxScrollDestination = boxId; - sPSSData->field_A65 = direction; - sPSSData->field_A63 = 0; + sStorage->scrollSpeed = (direction > 0) ? 6 : -6; + sStorage->scrollUnused1 = (direction > 0) ? 1 : 2; + sStorage->scrollTimer = 32; + sStorage->scrollToBoxIdUnused = boxId; + sStorage->scrollUnused2 = (direction <= 0) ? 5 : 0; + sStorage->scrollDirectionUnused = direction; + + sStorage->scrollUnused3 = (direction > 0) ? 264 : 56; + sStorage->scrollUnused4 = (direction <= 0) ? 5 : 0; + sStorage->scrollUnused5 = 0; + sStorage->scrollUnused6 = 2; + sStorage->scrollToBoxId = boxId; + sStorage->scrollDirection = direction; + sStorage->scrollState = 0; } static bool8 ScrollToBox(void) { - bool8 var; + bool8 iconsScrolling; - switch (sPSSData->field_A63) + switch (sStorage->scrollState) { case 0: - LoadWallpaperGfx(sPSSData->boxScrollDestination, sPSSData->field_A65); - sPSSData->field_A63++; + LoadWallpaperGfx(sStorage->scrollToBoxId, sStorage->scrollDirection); + sStorage->scrollState++; case 1: if (!WaitForWallpaperGfxLoad()) return TRUE; - sub_80CB4CC(sPSSData->boxScrollDestination, sPSSData->field_A65); - sub_80CCCFC(sPSSData->boxScrollDestination, sPSSData->field_A65); - sub_80CD0B8(sPSSData->field_A65); + InitBoxMonIconScroll(sStorage->scrollToBoxId, sStorage->scrollDirection); + CreateIncomingBoxTitle(sStorage->scrollToBoxId, sStorage->scrollDirection); + StartBoxScrollArrowsSlide(sStorage->scrollDirection); break; case 2: - var = sub_80CB584(); - if (sPSSData->field_2D0 != 0) + iconsScrolling = UpdateBoxMonIconScroll(); + if (sStorage->scrollTimer != 0) { - sPSSData->bg2_X += sPSSData->wallpaperScrollSpeed; - if (--sPSSData->field_2D0 != 0) + sStorage->bg2_X += sStorage->scrollSpeed; + if (--sStorage->scrollTimer != 0) return TRUE; - sub_80CCEE0(); - sub_80CD158(); + CycleBoxTitleSprites(); + StopBoxScrollArrowsSlide(); } - return var; + return iconsScrolling; } - sPSSData->field_A63++; + sStorage->scrollState++; return TRUE; } @@ -5341,40 +5320,46 @@ static s8 DetermineBoxScrollDirection(u8 boxId) return (i < TOTAL_BOXES_COUNT / 2) ? 1 : -1; } + +//------------------------------------------------------------------------------ +// SECTION: Wallpaper gfx +//------------------------------------------------------------------------------ + + static void SetWallpaperForCurrentBox(u8 wallpaperId) { u8 boxId = StorageGetCurrentBox(); SetBoxWallpaper(boxId, wallpaperId); - sPSSData->wallpaperChangeState = 0; + sStorage->wallpaperChangeState = 0; } static bool8 DoWallpaperGfxChange(void) { - switch (sPSSData->wallpaperChangeState) + switch (sStorage->wallpaperChangeState) { case 0: - BeginNormalPaletteFade(sPSSData->field_738, 1, 0, 16, RGB_WHITEALPHA); - sPSSData->wallpaperChangeState++; + BeginNormalPaletteFade(sStorage->wallpaperPalBits, 1, 0, 16, RGB_WHITEALPHA); + sStorage->wallpaperChangeState++; break; case 1: if (!UpdatePaletteFade()) { u8 curBox = StorageGetCurrentBox(); LoadWallpaperGfx(curBox, 0); - sPSSData->wallpaperChangeState++; + sStorage->wallpaperChangeState++; } break; case 2: if (WaitForWallpaperGfxLoad() == TRUE) { - sub_80CCF9C(); - BeginNormalPaletteFade(sPSSData->field_738, 1, 16, 0, RGB_WHITEALPHA); - sPSSData->wallpaperChangeState++; + CycleBoxTitleColor(); + BeginNormalPaletteFade(sStorage->wallpaperPalBits, 1, 16, 0, RGB_WHITEALPHA); + sStorage->wallpaperChangeState++; } break; case 3: if (!UpdatePaletteFade()) - sPSSData->wallpaperChangeState++; + sStorage->wallpaperChangeState++; break; case 4: return FALSE; @@ -5386,54 +5371,54 @@ static bool8 DoWallpaperGfxChange(void) static void LoadWallpaperGfx(u8 boxId, s8 direction) { u8 wallpaperId; - const struct WallpaperTable *wallpaperGfx; + const struct Wallpaper *wallpaper; void *iconGfx; - u32 size1, size2; + u32 tilesSize, iconSize; - sPSSData->field_6F9 = 0; - sPSSData->field_6FA = boxId; - sPSSData->field_6FB = direction; - if (sPSSData->field_6FB != 0) + sStorage->wallpaperLoadState = 0; + sStorage->wallpaperLoadBoxId = boxId; + sStorage->wallpaperLoadDir = direction; + if (sStorage->wallpaperLoadDir != 0) { - sPSSData->field_2D2 = (sPSSData->field_2D2 == 0); - sub_80CCAE0(sPSSData->field_4AC4); + sStorage->wallpaperOffset = (sStorage->wallpaperOffset == 0); + TrimOldWallpaper(sStorage->wallpaperBgTilemapBuffer); } - wallpaperId = GetBoxWallpaper(sPSSData->field_6FA); + wallpaperId = GetBoxWallpaper(sStorage->wallpaperLoadBoxId); if (wallpaperId != WALLPAPER_FRIENDS) { - wallpaperGfx = &gWallpaperTable[wallpaperId]; - LZ77UnCompWram(wallpaperGfx->tileMap, sPSSData->field_792); - sub_80CCA3C(sPSSData->field_792, sPSSData->field_6FB, sPSSData->field_2D2); + wallpaper = &sWallpapers[wallpaperId]; + LZ77UnCompWram(wallpaper->tilemap, sStorage->wallpaperTilemap); + DrawWallpaper(sStorage->wallpaperTilemap, sStorage->wallpaperLoadDir, sStorage->wallpaperOffset); - if (sPSSData->field_6FB != 0) - LoadPalette(wallpaperGfx->palettes, (sPSSData->field_2D2 * 32) + 0x40, 0x40); + if (sStorage->wallpaperLoadDir != 0) + LoadPalette(wallpaper->palettes, (sStorage->wallpaperOffset * 32) + 0x40, 0x40); else - CpuCopy16(wallpaperGfx->palettes, &gPlttBufferUnfaded[(sPSSData->field_2D2 * 32) + 0x40], 0x40); + CpuCopy16(wallpaper->palettes, &gPlttBufferUnfaded[(sStorage->wallpaperOffset * 32) + 0x40], 0x40); - sPSSData->wallpaperTiles = malloc_and_decompress(wallpaperGfx->tiles, &size1); - LoadBgTiles(2, sPSSData->wallpaperTiles, size1, sPSSData->field_2D2 << 8); + sStorage->wallpaperTiles = malloc_and_decompress(wallpaper->tiles, &tilesSize); + LoadBgTiles(2, sStorage->wallpaperTiles, tilesSize, sStorage->wallpaperOffset << 8); } else { - wallpaperGfx = &gFriendsWallpaperTable[GetWaldaWallpaperPatternId()]; - LZ77UnCompWram(wallpaperGfx->tileMap, sPSSData->field_792); - sub_80CCA3C(sPSSData->field_792, sPSSData->field_6FB, sPSSData->field_2D2); + wallpaper = &sWaldaWallpapers[GetWaldaWallpaperPatternId()]; + LZ77UnCompWram(wallpaper->tilemap, sStorage->wallpaperTilemap); + DrawWallpaper(sStorage->wallpaperTilemap, sStorage->wallpaperLoadDir, sStorage->wallpaperOffset); - CpuCopy16(wallpaperGfx->palettes, sPSSData->field_792, 0x40); - CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->field_792[1], 4); - CpuCopy16(GetWaldaWallpaperColorsPtr(), &sPSSData->field_792[17], 4); + CpuCopy16(wallpaper->palettes, sStorage->wallpaperTilemap, 0x40); + CpuCopy16(GetWaldaWallpaperColorsPtr(), &sStorage->wallpaperTilemap[1], 4); + CpuCopy16(GetWaldaWallpaperColorsPtr(), &sStorage->wallpaperTilemap[17], 4); - if (sPSSData->field_6FB != 0) - LoadPalette(sPSSData->field_792, (sPSSData->field_2D2 * 32) + 0x40, 0x40); + if (sStorage->wallpaperLoadDir != 0) + LoadPalette(sStorage->wallpaperTilemap, (sStorage->wallpaperOffset * 32) + 0x40, 0x40); else - CpuCopy16(sPSSData->field_792, &gPlttBufferUnfaded[(sPSSData->field_2D2 * 32) + 0x40], 0x40); + CpuCopy16(sStorage->wallpaperTilemap, &gPlttBufferUnfaded[(sStorage->wallpaperOffset * 32) + 0x40], 0x40); - sPSSData->wallpaperTiles = malloc_and_decompress(wallpaperGfx->tiles, &size1); - iconGfx = malloc_and_decompress(gFriendsIcons[GetWaldaWallpaperIconId()], &size2); - CpuCopy32(iconGfx, sPSSData->wallpaperTiles + 0x800, size2); + sStorage->wallpaperTiles = malloc_and_decompress(wallpaper->tiles, &tilesSize); + iconGfx = malloc_and_decompress(sWaldaWallpaperIcons[GetWaldaWallpaperIconId()], &iconSize); + CpuCopy32(iconGfx, sStorage->wallpaperTiles + 0x800, iconSize); Free(iconGfx); - LoadBgTiles(2, sPSSData->wallpaperTiles, size1, sPSSData->field_2D2 << 8); + LoadBgTiles(2, sStorage->wallpaperTiles, tilesSize, sStorage->wallpaperOffset << 8); } CopyBgTilemapBufferToVram(2); @@ -5444,20 +5429,18 @@ static bool32 WaitForWallpaperGfxLoad(void) if (IsDma3ManagerBusyWithBgCopy()) return FALSE; - if (sPSSData->wallpaperTiles != NULL) - { - Free(sPSSData->wallpaperTiles); - sPSSData->wallpaperTiles = NULL; - } + if (sStorage->wallpaperTiles != NULL) + FREE_AND_SET_NULL(sStorage->wallpaperTiles); + return TRUE; } -static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2) +static void DrawWallpaper(const void *tilemap, s8 direction, u8 offset) { - s16 var = (arg2 * 2) + 3; - s16 x = ((sPSSData->bg2_X / 8 + 10) + (direction * 24)) & 0x3F; + s16 var = (offset * 2) + 3; + s16 x = ((sStorage->bg2_X / 8 + 10) + (direction * 24)) & 0x3F; - CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, arg2 << 8, var); + CopyRectToBgTilemapBufferRect(2, tilemap, 0, 0, 0x14, 0x12, x, 2, 0x14, 0x12, 0x11, offset << 8, var); if (direction == 0) return; @@ -5469,11 +5452,11 @@ static void sub_80CCA3C(const void *tilemap, s8 direction, u8 arg2) FillBgTilemapBufferRect(2, 0, x, 2, 4, 0x12, 0x11); } -static void sub_80CCAE0(void *arg0) +static void TrimOldWallpaper(void *tilemap) { u16 i; - u16 *dest = arg0; - s16 r3 = ((sPSSData->bg2_X / 8) + 30) & 0x3F; + u16 *dest = tilemap; + s16 r3 = ((sStorage->bg2_X / 8) + 30) & 0x3F; if (r3 <= 31) dest += r3 + 0x260; @@ -5491,238 +5474,278 @@ static void sub_80CCAE0(void *arg0) } } -static void sub_80CCB50(u8 boxId) + +//------------------------------------------------------------------------------ +// SECTION: Box Title +//------------------------------------------------------------------------------ + + +static void InitBoxTitle(u8 boxId) { u8 tagIndex; - s16 r6; + s16 x; u16 i; - struct SpriteSheet spriteSheet = {sPSSData->field_2F8, 0x200, TAG_TILE_3}; + struct SpriteSheet spriteSheet = {sStorage->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE}; struct SpritePalette palettes[] = { - {sPSSData->field_6FC, TAG_PAL_DAC9}, + {sStorage->boxTitlePal, PALTAG_BOX_TITLE}, {} }; u16 wallpaperId = GetBoxWallpaper(boxId); - sPSSData->field_6FC[14] = gUnknown_08577574[wallpaperId][0]; - sPSSData->field_6FC[15] = gUnknown_08577574[wallpaperId][1]; + sStorage->boxTitlePal[14] = sBoxTitleColors[wallpaperId][0]; // Shadow color + sStorage->boxTitlePal[15] = sBoxTitleColors[wallpaperId][1]; // Text Color LoadSpritePalettes(palettes); - sPSSData->field_738 = 0x3f0; - - tagIndex = IndexOfSpritePaletteTag(TAG_PAL_DAC9); - sPSSData->field_71C = 0x10e + 16 * tagIndex; - sPSSData->field_738 |= 0x10000 << tagIndex; - - tagIndex = IndexOfSpritePaletteTag(TAG_PAL_DAC9); - sPSSData->field_71E = 0x10e + 16 * tagIndex; - sPSSData->field_738 |= 0x10000 << tagIndex; - - StringCopyPadded(sPSSData->field_21B8, GetBoxNamePtr(boxId), 0, 8); - DrawTextWindowAndBufferTiles(sPSSData->field_21B8, sPSSData->field_2F8, 0, 0, 2); + sStorage->wallpaperPalBits = 0x3f0; + + tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE); + sStorage->boxTitlePalOffset = 0x10e + 16 * tagIndex; + sStorage->wallpaperPalBits |= 0x10000 << tagIndex; + + // The below seems intended to have separately tracked + // the incoming wallpaper title's palette, but as they now + // share a palette tag, all colors (and fields in some cases) + // this is redundant along with the use of boxTitleAltPalOffset + tagIndex = IndexOfSpritePaletteTag(PALTAG_BOX_TITLE); + sStorage->boxTitleAltPalOffset = 0x10e + 16 * tagIndex; + sStorage->wallpaperPalBits |= 0x10000 << tagIndex; + + StringCopyPadded(sStorage->boxTitleText, GetBoxNamePtr(boxId), 0, 8); + DrawTextWindowAndBufferTiles(sStorage->boxTitleText, sStorage->boxTitleTiles, 0, 0, 2); LoadSpriteSheet(&spriteSheet); - r6 = sub_80CD00C(GetBoxNamePtr(boxId)); + x = GetBoxTitleBaseX(GetBoxNamePtr(boxId)); + // Title is split across two sprites for (i = 0; i < 2; i++) { - u8 spriteId = CreateSprite(&gSpriteTemplate_857B0A8, r6 + i * 32, 28, 24); - sPSSData->field_720[i] = &gSprites[spriteId]; - StartSpriteAnim(sPSSData->field_720[i], i); + u8 spriteId = CreateSprite(&sSpriteTemplate_BoxTitle, x + i * 32, 28, 24); + sStorage->curBoxTitleSprites[i] = &gSprites[spriteId]; + StartSpriteAnim(sStorage->curBoxTitleSprites[i], i); } - sPSSData->field_6F8 = 0; + sStorage->boxTitleCycleId = 0; } -static void sub_80CCCFC(u8 boxId, s8 direction) +// Sprite data for moving title text +#define sSpeed data[0] +// Flipped between incoming/outgoing for some reason +#define sIncomingX data[1] +#define sIncomingDelay data[2] +#define sOutgoingDelay data[1] +#define sOutgoingX data[2] + +static void CreateIncomingBoxTitle(u8 boxId, s8 direction) { - u16 r8; - s16 x, x2; + u16 palOffset; + s16 x, adjustedX; u16 i; - struct SpriteSheet spriteSheet = {sPSSData->field_2F8, 0x200, TAG_TILE_3}; - struct SpriteTemplate template = gSpriteTemplate_857B0A8; + struct SpriteSheet spriteSheet = {sStorage->boxTitleTiles, 0x200, GFXTAG_BOX_TITLE}; + struct SpriteTemplate template = sSpriteTemplate_BoxTitle; - sPSSData->field_6F8 = (sPSSData->field_6F8 == 0); - if (sPSSData->field_6F8 == 0) + sStorage->boxTitleCycleId = (sStorage->boxTitleCycleId == 0); + if (sStorage->boxTitleCycleId == 0) { - spriteSheet.tag = TAG_TILE_3; - r8 = sPSSData->field_71C; + spriteSheet.tag = GFXTAG_BOX_TITLE; + palOffset = sStorage->boxTitlePalOffset; } else { - spriteSheet.tag = TAG_TILE_4; - r8 = sPSSData->field_71C; - template.tileTag = TAG_TILE_4; - template.paletteTag = TAG_PAL_DAC9; + spriteSheet.tag = GFXTAG_BOX_TITLE_ALT; + palOffset = sStorage->boxTitlePalOffset; + template.tileTag = GFXTAG_BOX_TITLE_ALT; + template.paletteTag = PALTAG_BOX_TITLE; } - StringCopyPadded(sPSSData->field_21B8, GetBoxNamePtr(boxId), 0, 8); - DrawTextWindowAndBufferTiles(sPSSData->field_21B8, sPSSData->field_2F8, 0, 0, 2); + StringCopyPadded(sStorage->boxTitleText, GetBoxNamePtr(boxId), 0, 8); + DrawTextWindowAndBufferTiles(sStorage->boxTitleText, sStorage->boxTitleTiles, 0, 0, 2); LoadSpriteSheet(&spriteSheet); - LoadPalette(gUnknown_08577574[GetBoxWallpaper(boxId)], r8, 4); - x = sub_80CD00C(GetBoxNamePtr(boxId)); - x2 = x; - x2 += direction * 192; + LoadPalette(sBoxTitleColors[GetBoxWallpaper(boxId)], palOffset, sizeof(sBoxTitleColors[0])); + x = GetBoxTitleBaseX(GetBoxNamePtr(boxId)); + adjustedX = x; + adjustedX += direction * 192; + // Title is split across two sprites for (i = 0; i < 2; i++) { - u8 spriteId = CreateSprite(&template, i * 32 + x2, 28, 24); + u8 spriteId = CreateSprite(&template, i * 32 + adjustedX, 28, 24); - sPSSData->field_728[i] = &gSprites[spriteId]; - sPSSData->field_728[i]->data[0] = (-direction) * 6; - sPSSData->field_728[i]->data[1] = i * 32 + x; - sPSSData->field_728[i]->data[2] = 0; - sPSSData->field_728[i]->callback = sub_80CCF30; - StartSpriteAnim(sPSSData->field_728[i], i); + sStorage->nextBoxTitleSprites[i] = &gSprites[spriteId]; + sStorage->nextBoxTitleSprites[i]->sSpeed = (-direction) * 6; + sStorage->nextBoxTitleSprites[i]->sIncomingX = i * 32 + x; + sStorage->nextBoxTitleSprites[i]->sIncomingDelay = 0; + sStorage->nextBoxTitleSprites[i]->callback = SpriteCB_IncomingBoxTitle; + StartSpriteAnim(sStorage->nextBoxTitleSprites[i], i); - sPSSData->field_720[i]->data[0] = (-direction) * 6; - sPSSData->field_720[i]->data[1] = 1; - sPSSData->field_720[i]->callback = sub_80CCF64; + sStorage->curBoxTitleSprites[i]->sSpeed = (-direction) * 6; + sStorage->curBoxTitleSprites[i]->sOutgoingDelay = 1; + sStorage->curBoxTitleSprites[i]->callback = SpriteCB_OutgoingBoxTitle; } } -static void sub_80CCEE0(void) +static void CycleBoxTitleSprites(void) { - if (sPSSData->field_6F8 == 0) - FreeSpriteTilesByTag(TAG_TILE_4); + if (sStorage->boxTitleCycleId == 0) + FreeSpriteTilesByTag(GFXTAG_BOX_TITLE_ALT); else - FreeSpriteTilesByTag(TAG_TILE_3); + FreeSpriteTilesByTag(GFXTAG_BOX_TITLE); - sPSSData->field_720[0] = sPSSData->field_728[0]; - sPSSData->field_720[1] = sPSSData->field_728[1]; + sStorage->curBoxTitleSprites[0] = sStorage->nextBoxTitleSprites[0]; + sStorage->curBoxTitleSprites[1] = sStorage->nextBoxTitleSprites[1]; } -static void sub_80CCF30(struct Sprite *sprite) +static void SpriteCB_IncomingBoxTitle(struct Sprite *sprite) { - if (sprite->data[2] != 0) - sprite->data[2]--; - else if ((sprite->pos1.x += sprite->data[0]) == sprite->data[1]) + if (sprite->sIncomingDelay != 0) + sprite->sIncomingDelay--; + else if ((sprite->pos1.x += sprite->sSpeed) == sprite->sIncomingX) sprite->callback = SpriteCallbackDummy; } -static void sub_80CCF64(struct Sprite *sprite) +static void SpriteCB_OutgoingBoxTitle(struct Sprite *sprite) { - if (sprite->data[1] != 0) + if (sprite->sOutgoingDelay != 0) { - sprite->data[1]--; + sprite->sOutgoingDelay--; } else { - sprite->pos1.x += sprite->data[0]; - sprite->data[2] = sprite->pos1.x + sprite->pos2.x; - if (sprite->data[2] < 0x40 || sprite->data[2] > 0x100) + sprite->pos1.x += sprite->sSpeed; + sprite->sOutgoingX = sprite->pos1.x + sprite->pos2.x; + if (sprite->sOutgoingX < 64 || sprite->sOutgoingX > DISPLAY_WIDTH + 16) DestroySprite(sprite); } } -static void sub_80CCF9C(void) +#undef sSpeed +#undef sIncomingX +#undef sIncomingDelay +#undef sOutgoingDelay +#undef sOutgoingX + +static void CycleBoxTitleColor(void) { u8 boxId = StorageGetCurrentBox(); u8 wallpaperId = GetBoxWallpaper(boxId); - if (sPSSData->field_6F8 == 0) - CpuCopy16(gUnknown_08577574[wallpaperId], gPlttBufferUnfaded + sPSSData->field_71C, 4); + if (sStorage->boxTitleCycleId == 0) + CpuCopy16(sBoxTitleColors[wallpaperId], gPlttBufferUnfaded + sStorage->boxTitlePalOffset, 4); else - CpuCopy16(gUnknown_08577574[wallpaperId], gPlttBufferUnfaded + sPSSData->field_71E, 4); + CpuCopy16(sBoxTitleColors[wallpaperId], gPlttBufferUnfaded + sStorage->boxTitleAltPalOffset, 4); } -static s16 sub_80CD00C(const u8 *string) +static s16 GetBoxTitleBaseX(const u8 *string) { - return 0xB0 - GetStringWidth(1, string, 0) / 2; + return DISPLAY_WIDTH - 64 - GetStringWidth(1, string, 0) / 2; } -static void sub_80CD02C(void) + +//------------------------------------------------------------------------------ +// SECTION: Scroll arrows +//------------------------------------------------------------------------------ + + +// Sprite data for box scroll arrows +#define sState data[0] +#define sTimer data[1] +#define sSpeed data[3] + +static void CreateBoxScrollArrows(void) { u16 i; - LoadSpriteSheet(&gUnknown_0857B080); + LoadSpriteSheet(&sSpriteSheet_Arrow); for (i = 0; i < 2; i++) { - u8 spriteId = CreateSprite(&gUnknown_0857B0E0, 0x5c + i * 0x88, 28, 22); + u8 spriteId = CreateSprite(&sSpriteTemplate_Arrow, 92 + i * 136, 28, 22); if (spriteId != MAX_SPRITES) { struct Sprite *sprite = &gSprites[spriteId]; StartSpriteAnim(sprite, i); - sprite->data[3] = (i == 0) ? -1 : 1; - sPSSData->field_730[i] = sprite; + sprite->sSpeed = (i == 0) ? -1 : 1; + sStorage->arrowSprites[i] = sprite; } } - if (IsCursorOnBox()) - sub_80CD1A8(TRUE); + if (IsCursorOnBoxTitle()) + AnimateBoxScrollArrows(TRUE); } -static void sub_80CD0B8(s8 direction) +// Slide box scroll arrows horizontally for box change +static void StartBoxScrollArrowsSlide(s8 direction) { u16 i; for (i = 0; i < 2; i++) { - sPSSData->field_730[i]->pos2.x = 0; - sPSSData->field_730[i]->data[0] = 2; + sStorage->arrowSprites[i]->pos2.x = 0; + sStorage->arrowSprites[i]->sState = 2; } if (direction < 0) { - sPSSData->field_730[0]->data[1] = 29; - sPSSData->field_730[1]->data[1] = 5; - sPSSData->field_730[0]->data[2] = 0x48; - sPSSData->field_730[1]->data[2] = 0x48; + sStorage->arrowSprites[0]->sTimer = 29; + sStorage->arrowSprites[1]->sTimer = 5; + sStorage->arrowSprites[0]->data[2] = 72; + sStorage->arrowSprites[1]->data[2] = 72; } else { - sPSSData->field_730[0]->data[1] = 5; - sPSSData->field_730[1]->data[1] = 29; - sPSSData->field_730[0]->data[2] = 0xF8; - sPSSData->field_730[1]->data[2] = 0xF8; + sStorage->arrowSprites[0]->sTimer = 5; + sStorage->arrowSprites[1]->sTimer = 29; + sStorage->arrowSprites[0]->data[2] = DISPLAY_WIDTH + 8; + sStorage->arrowSprites[1]->data[2] = DISPLAY_WIDTH + 8; } - sPSSData->field_730[0]->data[7] = 0; - sPSSData->field_730[1]->data[7] = 1; + sStorage->arrowSprites[0]->data[7] = 0; + sStorage->arrowSprites[1]->data[7] = 1; } -static void sub_80CD158(void) +// New box's scroll arrows have entered, stop sliding and set their position +static void StopBoxScrollArrowsSlide(void) { u16 i; for (i = 0; i < 2; i++) { - sPSSData->field_730[i]->pos1.x = 0x88 * i + 0x5c; - sPSSData->field_730[i]->pos2.x = 0; - sPSSData->field_730[i]->invisible = FALSE; + sStorage->arrowSprites[i]->pos1.x = 136 * i + 92; + sStorage->arrowSprites[i]->pos2.x = 0; + sStorage->arrowSprites[i]->invisible = FALSE; } - sub_80CD1A8(TRUE); + AnimateBoxScrollArrows(TRUE); } -static void sub_80CD1A8(bool8 a0) +// Bounce scroll arrows while title is selected +static void AnimateBoxScrollArrows(bool8 animate) { u16 i; - if (a0) + if (animate) { + // Start arrows moving for (i = 0; i < 2; i++) { - sPSSData->field_730[i]->data[0] = 1; - sPSSData->field_730[i]->data[1] = 0; - sPSSData->field_730[i]->data[2] = 0; - sPSSData->field_730[i]->data[4] = 0; + sStorage->arrowSprites[i]->sState = 1; + sStorage->arrowSprites[i]->sTimer = 0; + sStorage->arrowSprites[i]->data[2] = 0; + sStorage->arrowSprites[i]->data[4] = 0; } } else { + // Stop arrows moving for (i = 0; i < 2; i++) - { - sPSSData->field_730[i]->data[0] = 0; - } + sStorage->arrowSprites[i]->sState = 0; } } -static void sub_80CD210(struct Sprite *sprite) +static void SpriteCB_Arrow(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->pos2.x = 0; break; case 1: - if (++sprite->data[1] > 3) + if (++sprite->sTimer > 3) { - sprite->data[1] = 0; - sprite->pos2.x += sprite->data[3]; + sprite->sTimer = 0; + sprite->pos2.x += sprite->sSpeed; if (++sprite->data[2] > 5) { sprite->data[2] = 0; @@ -5731,28 +5754,32 @@ static void sub_80CD210(struct Sprite *sprite) } break; case 2: - sprite->data[0] = 3; + sprite->sState = 3; break; case 3: - sprite->pos1.x -= sPSSData->wallpaperScrollSpeed; - if (sprite->pos1.x < 73 || sprite->pos1.x > 247) + sprite->pos1.x -= sStorage->scrollSpeed; + if (sprite->pos1.x <= 72 || sprite->pos1.x >= DISPLAY_WIDTH + 8) sprite->invisible = TRUE; - if (--sprite->data[1] == 0) + if (--sprite->sTimer == 0) { sprite->pos1.x = sprite->data[2]; sprite->invisible = FALSE; - sprite->data[0] = 4; + sprite->sState = 4; } break; case 4: - sprite->pos1.x -= sPSSData->wallpaperScrollSpeed; + sprite->pos1.x -= sStorage->scrollSpeed; break; } } -static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) +#undef sState +#undef sSpeed + +// Arrows for Deposit/Jump Box selection +static struct Sprite *CreateChooseBoxArrows(u16 x, u16 y, u8 animId, u8 priority, u8 subpriority) { - u8 spriteId = CreateSprite(&gUnknown_0857B0E0, x, y, subpriority); + u8 spriteId = CreateSprite(&sSpriteTemplate_Arrow, x, y, subpriority); if (spriteId == MAX_SPRITES) return NULL; @@ -5763,299 +5790,320 @@ static struct Sprite *sub_80CD2E8(u16 x, u16 y, u8 animId, u8 priority, u8 subpr return &gSprites[spriteId]; } -static void sub_80CD36C(void) + +//------------------------------------------------------------------------------ +// SECTION: Cursor movement +// +// The functions below generally handle the cursor's movement, including +// moving around the box and picking up/putting down Pokémon. +//------------------------------------------------------------------------------ + + +static void InitCursor(void) { - if (sPSSData->boxOption != BOX_OPTION_DEPOSIT) - sBoxCursorArea = CURSOR_AREA_IN_BOX; + if (sStorage->boxOption != OPTION_DEPOSIT) + sCursorArea = CURSOR_AREA_IN_BOX; else - sBoxCursorArea = CURSOR_AREA_IN_PARTY; + sCursorArea = CURSOR_AREA_IN_PARTY; - sBoxCursorPosition = 0; + sCursorPosition = 0; sIsMonBeingMoved = FALSE; sMovingMonOrigBoxId = 0; sMovingMonOrigBoxPos = 0; - sCanOnlyMove = FALSE; - sub_80CDC0C(); - sub_80CFC14(); - sPSSData->field_CD6 = 1; - sPSSData->inBoxMovingMode = 0; - sub_80CEB40(); + sAutoActionOn = FALSE; + ClearSavedCursorPos(); + CreateCursorSprites(); + sStorage->cursorPrevHorizPos = 1; + sStorage->inBoxMovingMode = MOVE_MODE_NORMAL; + TryRefreshDisplayMon(); } -static void sub_80CD3EC(void) +static void InitCursorOnReopen(void) { - sub_80CFC14(); - sub_80CEBDC(); - sPSSData->field_CD6 = 1; - sPSSData->inBoxMovingMode = 0; + CreateCursorSprites(); + ReshowDisplayMon(); + sStorage->cursorPrevHorizPos = 1; + sStorage->inBoxMovingMode = MOVE_MODE_NORMAL; if (sIsMonBeingMoved) { - sPSSData->movingMon = gUnknown_02039D14; + sStorage->movingMon = sSavedMovingMon; CreateMovingMonIcon(); } } -static void sub_80CD444(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y) +static void GetCursorCoordsByPos(u8 cursorArea, u8 cursorPosition, u16 *x, u16 *y) { switch (cursorArea) { case CURSOR_AREA_IN_BOX: - *x = (cursorPosition % IN_BOX_ROWS) * 24 + 100; - *y = (cursorPosition / IN_BOX_ROWS) * 24 + 32; + *x = (cursorPosition % IN_BOX_COLUMNS) * 24 + 100; + *y = (cursorPosition / IN_BOX_COLUMNS) * 24 + 32; break; case CURSOR_AREA_IN_PARTY: if (cursorPosition == 0) { - *x = 0x68; - *y = 0x34; + *x = 104; + *y = 52; } else if (cursorPosition == PARTY_SIZE) { - *x = 0x98; - *y = 0x84; + *x = 152; + *y = 132; } else { - *x = 0x98; + *x = 152; *y = (cursorPosition - 1) * 24 + 4; } break; - case CURSOR_AREA_BOX: - *x = 0xa2; - *y = 0x0c; + case CURSOR_AREA_BOX_TITLE: + *x = 162; + *y = 12; break; case CURSOR_AREA_BUTTONS: *y = sIsMonBeingMoved ? 8 : 14; - *x = cursorPosition * 0x58 + 0x78; + *x = cursorPosition * 88 + 120; break; case 4: - *x = 0xa0; - *y = 0x60; + *x = 160; + *y = 96; break; } } -static u16 sub_80CD504(void) +static u16 GetSpeciesAtCursorPosition(void) { - switch (sBoxCursorArea) + switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: - return GetMonData(&gPlayerParty[sBoxCursorPosition], MON_DATA_SPECIES); + return GetMonData(&gPlayerParty[sCursorPosition], MON_DATA_SPECIES); case CURSOR_AREA_IN_BOX: - return GetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_SPECIES); + return GetCurrentBoxMonData(sCursorPosition, MON_DATA_SPECIES); default: return SPECIES_NONE; } } -static bool8 sub_80CD554(void) +static bool8 UpdateCursorPos(void) { s16 tmp; - if (sPSSData->field_CD0 == 0) + if (sStorage->cursorMoveSteps == 0) { - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return FALSE; else - return sub_80D1218(); + return IsItemIconAnimActive(); } - else if (--sPSSData->field_CD0 != 0) + else if (--sStorage->cursorMoveSteps != 0) { - sPSSData->field_CBC += sPSSData->field_CC4; - sPSSData->field_CC0 += sPSSData->field_CC8; - sPSSData->field_CB4->pos1.x = sPSSData->field_CBC >> 8; - sPSSData->field_CB4->pos1.y = sPSSData->field_CC0 >> 8; - if (sPSSData->field_CB4->pos1.x > 0x100) + // Update position toward target + sStorage->cursorNewX += sStorage->cursorSpeedX; + sStorage->cursorNewY += sStorage->cursorSpeedY; + sStorage->cursorSprite->pos1.x = sStorage->cursorNewX >> 8; + sStorage->cursorSprite->pos1.y = sStorage->cursorNewY >> 8; + + // Limit cursor on right + if (sStorage->cursorSprite->pos1.x > DISPLAY_WIDTH + 16) { - tmp = sPSSData->field_CB4->pos1.x - 0x100; - sPSSData->field_CB4->pos1.x = tmp + 0x40; + tmp = sStorage->cursorSprite->pos1.x - (DISPLAY_WIDTH + 16); + sStorage->cursorSprite->pos1.x = tmp + 64; } - if (sPSSData->field_CB4->pos1.x < 0x40) + + // Limit cursor on left + if (sStorage->cursorSprite->pos1.x < 64) { - tmp = 0x40 - sPSSData->field_CB4->pos1.x; - sPSSData->field_CB4->pos1.x = 0x100 - tmp; + tmp = 64 - sStorage->cursorSprite->pos1.x; + sStorage->cursorSprite->pos1.x = DISPLAY_WIDTH + 16 - tmp; } - if (sPSSData->field_CB4->pos1.y > 0xb0) + + // Limit cursor on bottom + if (sStorage->cursorSprite->pos1.y > DISPLAY_HEIGHT + 16) { - tmp = sPSSData->field_CB4->pos1.y - 0xb0; - sPSSData->field_CB4->pos1.y = tmp - 0x10; + tmp = sStorage->cursorSprite->pos1.y - (DISPLAY_HEIGHT + 16); + sStorage->cursorSprite->pos1.y = tmp - 16; } - if (sPSSData->field_CB4->pos1.y < -0x10) + + // Limit cursor on top + if (sStorage->cursorSprite->pos1.y < -16) { - tmp = -0x10 - sPSSData->field_CB4->pos1.y; - sPSSData->field_CB4->pos1.y = 0xb0 - tmp; + tmp = -16 - sStorage->cursorSprite->pos1.y; + sStorage->cursorSprite->pos1.y = DISPLAY_HEIGHT + 16 - tmp; } - if (sPSSData->field_CD7 && --sPSSData->field_CD7 == 0) - sPSSData->field_CB4->vFlip = (sPSSData->field_CB4->vFlip == FALSE); + + // Cursor flips vertically when moving on/off the top buttons + if (sStorage->cursorFlipTimer && --sStorage->cursorFlipTimer == 0) + sStorage->cursorSprite->vFlip = (sStorage->cursorSprite->vFlip == FALSE); } else { - sPSSData->field_CB4->pos1.x = sPSSData->field_CCC; - sPSSData->field_CB4->pos1.y = sPSSData->field_CCE; - sub_80CDA68(); + // Time is up for cursor movement, make sure it's exactly at target + sStorage->cursorSprite->pos1.x = sStorage->cursorTargetX; + sStorage->cursorSprite->pos1.y = sStorage->cursorTargetY; + DoCursorNewPosUpdate(); } return TRUE; } -static void sub_80CD6AC(u8 newCurosrArea, u8 newCursorPosition) +static void InitNewCursorPos(u8 newCursorArea, u8 newCursorPosition) { u16 x, y; - sub_80CD444(newCurosrArea, newCursorPosition, &x, &y); - sPSSData->field_CD4 = newCurosrArea; - sPSSData->field_CD5 = newCursorPosition; - sPSSData->field_CCC = x; - sPSSData->field_CCE = y; + GetCursorCoordsByPos(newCursorArea, newCursorPosition, &x, &y); + sStorage->newCursorArea = newCursorArea; + sStorage->newCursorPosition = newCursorPosition; + sStorage->cursorTargetX = x; + sStorage->cursorTargetY = y; } -static void sub_80CD70C(void) +static void InitCursorMove(void) { - int r7, r0; + int yDistance, xDistance; - if (sPSSData->field_CD2 != 0 || sPSSData->field_CD3 != 0) - sPSSData->field_CD0 = 12; + if (sStorage->cursorVerticalWrap != 0 || sStorage->cursorHorizontalWrap != 0) + sStorage->cursorMoveSteps = 12; else - sPSSData->field_CD0 = 6; + sStorage->cursorMoveSteps = 6; - if (sPSSData->field_CD7) - sPSSData->field_CD7 = sPSSData->field_CD0 >> 1; + if (sStorage->cursorFlipTimer) + sStorage->cursorFlipTimer = sStorage->cursorMoveSteps >> 1; - switch (sPSSData->field_CD2) + switch (sStorage->cursorVerticalWrap) { - default: - r7 = sPSSData->field_CCE - sPSSData->field_CB4->pos1.y; + default: // No wrap + yDistance = sStorage->cursorTargetY - sStorage->cursorSprite->pos1.y; break; - case -1: - r7 = sPSSData->field_CCE - 0xc0 - sPSSData->field_CB4->pos1.y; + case -1: // Wrap from top to bottom + yDistance = sStorage->cursorTargetY - 192 - sStorage->cursorSprite->pos1.y; break; - case 1: - r7 = sPSSData->field_CCE + 0xc0 - sPSSData->field_CB4->pos1.y; + case 1: // Wrap from bottom to top + yDistance = sStorage->cursorTargetY + 192 - sStorage->cursorSprite->pos1.y; break; } - switch (sPSSData->field_CD3) + switch (sStorage->cursorHorizontalWrap) { - default: - r0 = sPSSData->field_CCC - sPSSData->field_CB4->pos1.x; + default: // No Wrap + xDistance = sStorage->cursorTargetX - sStorage->cursorSprite->pos1.x; break; - case -1: - r0 = sPSSData->field_CCC - 0xc0 - sPSSData->field_CB4->pos1.x; + case -1: // Wrap from left to right + xDistance = sStorage->cursorTargetX - 192 - sStorage->cursorSprite->pos1.x; break; - case 1: - r0 = sPSSData->field_CCC + 0xc0 - sPSSData->field_CB4->pos1.x; + case 1: // Wrap from right to left + xDistance = sStorage->cursorTargetX + 192 - sStorage->cursorSprite->pos1.x; break; } - r7 <<= 8; - r0 <<= 8; - sPSSData->field_CC4 = r0 / sPSSData->field_CD0; - sPSSData->field_CC8 = r7 / sPSSData->field_CD0; - sPSSData->field_CBC = sPSSData->field_CB4->pos1.x << 8; - sPSSData->field_CC0 = sPSSData->field_CB4->pos1.y << 8; + yDistance <<= 8; + xDistance <<= 8; + sStorage->cursorSpeedX = xDistance / sStorage->cursorMoveSteps; + sStorage->cursorSpeedY = yDistance / sStorage->cursorMoveSteps; + sStorage->cursorNewX = sStorage->cursorSprite->pos1.x << 8; + sStorage->cursorNewY = sStorage->cursorSprite->pos1.y << 8; } -static void sub_80CD894(u8 newCurosrArea, u8 newCursorPosition) +static void SetCursorPosition(u8 newCursorArea, u8 newCursorPosition) { - sub_80CD6AC(newCurosrArea, newCursorPosition); - sub_80CD70C(); - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + InitNewCursorPos(newCursorArea, newCursorPosition); + InitCursorMove(); + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved) - StartSpriteAnim(sPSSData->field_CB4, 1); + if (sStorage->inBoxMovingMode == MOVE_MODE_NORMAL && !sIsMonBeingMoved) + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_STILL); } else { - if (!IsActiveItemMoving()) - StartSpriteAnim(sPSSData->field_CB4, 1); + if (!IsMovingItem()) + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_STILL); } - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { - if (sBoxCursorArea == CURSOR_AREA_IN_BOX) - sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition); - else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) - sub_80D0E50(CURSOR_AREA_IN_PARTY, sBoxCursorPosition); + if (sCursorArea == CURSOR_AREA_IN_BOX) + TryHideItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); + else if (sCursorArea == CURSOR_AREA_IN_PARTY) + TryHideItemIconAtPos(CURSOR_AREA_IN_PARTY, sCursorPosition); - if (newCurosrArea == CURSOR_AREA_IN_BOX) - sub_80D0D8C(newCurosrArea, newCursorPosition); - else if (newCurosrArea == CURSOR_AREA_IN_PARTY) - sub_80D0D8C(newCurosrArea, newCursorPosition); + if (newCursorArea == CURSOR_AREA_IN_BOX) + TryLoadItemIconAtPos(newCursorArea, newCursorPosition); + else if (newCursorArea == CURSOR_AREA_IN_PARTY) + TryLoadItemIconAtPos(newCursorArea, newCursorPosition); } - if (newCurosrArea == CURSOR_AREA_IN_PARTY && sBoxCursorArea != CURSOR_AREA_IN_PARTY) + if (newCursorArea == CURSOR_AREA_IN_PARTY && sCursorArea != CURSOR_AREA_IN_PARTY) { - sPSSData->field_CD6 = newCurosrArea; - sPSSData->field_CB8->invisible = TRUE; + sStorage->cursorPrevHorizPos = 1; + sStorage->cursorShadowSprite->invisible = TRUE; } - switch (newCurosrArea) + switch (newCursorArea) { case CURSOR_AREA_IN_PARTY: - case CURSOR_AREA_BOX: + case CURSOR_AREA_BOX_TITLE: case CURSOR_AREA_BUTTONS: - sPSSData->field_CB4->oam.priority = 1; - sPSSData->field_CB8->invisible = TRUE; - sPSSData->field_CB8->oam.priority = 1; + sStorage->cursorSprite->oam.priority = 1; + sStorage->cursorShadowSprite->invisible = TRUE; + sStorage->cursorShadowSprite->oam.priority = 1; break; case CURSOR_AREA_IN_BOX: - if (sPSSData->inBoxMovingMode != 0) + if (sStorage->inBoxMovingMode != MOVE_MODE_NORMAL) { - sPSSData->field_CB4->oam.priority = 0; - sPSSData->field_CB8->invisible = TRUE; + sStorage->cursorSprite->oam.priority = 0; + sStorage->cursorShadowSprite->invisible = TRUE; } else { - sPSSData->field_CB4->oam.priority = 2; - if (sBoxCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved) + sStorage->cursorSprite->oam.priority = 2; + if (sCursorArea == CURSOR_AREA_IN_BOX && sIsMonBeingMoved) SetMovingMonPriority(2); } break; } } -static void sub_80CDA68(void) +static void DoCursorNewPosUpdate(void) { - sBoxCursorArea = sPSSData->field_CD4; - sBoxCursorPosition = sPSSData->field_CD5; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + sCursorArea = sStorage->newCursorArea; + sCursorPosition = sStorage->newCursorPosition; + if (sStorage->boxOption != OPTION_MOVE_ITEMS) { - if (sPSSData->inBoxMovingMode == 0 && !sIsMonBeingMoved) - StartSpriteAnim(sPSSData->field_CB4, 0); + if (sStorage->inBoxMovingMode == MOVE_MODE_NORMAL && !sIsMonBeingMoved) + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_BOUNCE); } else { - if (!IsActiveItemMoving()) - StartSpriteAnim(sPSSData->field_CB4, 0); + if (!IsMovingItem()) + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_BOUNCE); } - sub_80CEB40(); - switch (sBoxCursorArea) + TryRefreshDisplayMon(); + switch (sCursorArea) { case CURSOR_AREA_BUTTONS: SetMovingMonPriority(1); break; - case CURSOR_AREA_BOX: - sub_80CD1A8(TRUE); + case CURSOR_AREA_BOX_TITLE: + AnimateBoxScrollArrows(TRUE); break; case CURSOR_AREA_IN_PARTY: - sPSSData->field_CB8->subpriority = 13; + sStorage->cursorShadowSprite->subpriority = 13; SetMovingMonPriority(1); break; case CURSOR_AREA_IN_BOX: - if (sPSSData->inBoxMovingMode == 0) + if (sStorage->inBoxMovingMode == MOVE_MODE_NORMAL) { - sPSSData->field_CB4->oam.priority = 1; - sPSSData->field_CB8->oam.priority = 2; - sPSSData->field_CB8->subpriority = 21; - sPSSData->field_CB8->invisible = FALSE; + sStorage->cursorSprite->oam.priority = 1; + sStorage->cursorShadowSprite->oam.priority = 2; + sStorage->cursorShadowSprite->subpriority = 21; + sStorage->cursorShadowSprite->invisible = FALSE; SetMovingMonPriority(2); } break; } } -static void sub_80CDBA0(void) +static void SetCursorInParty(void) { u8 partyCount; @@ -6069,82 +6117,84 @@ static void sub_80CDBA0(void) if (partyCount >= PARTY_SIZE) partyCount = PARTY_SIZE - 1; } - if (sPSSData->field_CB4->vFlip) - sPSSData->field_CD7 = 1; - sub_80CD894(CURSOR_AREA_IN_PARTY, partyCount); + if (sStorage->cursorSprite->vFlip) + sStorage->cursorFlipTimer = 1; + SetCursorPosition(CURSOR_AREA_IN_PARTY, partyCount); } -static void sub_80CDBF8(u8 cursorBoxPosition) +static void SetCursorBoxPosition(u8 cursorBoxPosition) { - sub_80CD894(CURSOR_AREA_IN_BOX, cursorBoxPosition); + SetCursorPosition(CURSOR_AREA_IN_BOX, cursorBoxPosition); } -EWRAM_DATA static u8 gUnknown_02039D7E = 0; +EWRAM_DATA static u8 sSavedCursorPosition = 0; -static void sub_80CDC0C(void) +static void ClearSavedCursorPos(void) { - gUnknown_02039D7E = 0; + sSavedCursorPosition = 0; } -static void sub_80CDC18(void) +static void SaveCursorPos(void) { - gUnknown_02039D7E = sBoxCursorPosition; + sSavedCursorPosition = sCursorPosition; } -static u8 sub_80CDC2C(void) +static u8 GetSavedCursorPos(void) { - return gUnknown_02039D7E; + return sSavedCursorPosition; } -static void InitMonPlaceChange(u8 a0) +static void InitMonPlaceChange(u8 type) { static bool8 (*const placeChangeFuncs[])(void) = { - MonPlaceChange_Move, - MonPlaceChange_Place, - MonPlaceChange_Shift, + [CHANGE_GRAB] = MonPlaceChange_Grab, + [CHANGE_PLACE] = MonPlaceChange_Place, + [CHANGE_SHIFT] = MonPlaceChange_Shift, }; - sPSSData->monPlaceChangeFunc = placeChangeFuncs[a0]; - sPSSData->monPlaceChangeState = 0; + sStorage->monPlaceChangeFunc = placeChangeFuncs[type]; + sStorage->monPlaceChangeState = 0; } -static void sub_80CDC64(bool8 arg0) +// No Shift while moving multiple Pokémon, only grab and place +// For both grab/place, the cursor moves down, then up +static void InitMultiMonPlaceChange(bool8 up) { - if (!arg0) - sPSSData->monPlaceChangeFunc = sub_80CDEB4; + if (!up) + sStorage->monPlaceChangeFunc = MultiMonPlaceChange_Down; else - sPSSData->monPlaceChangeFunc = sub_80CDEC4; + sStorage->monPlaceChangeFunc = MultiMonPlaceChange_Up; - sPSSData->monPlaceChangeState = 0; + sStorage->monPlaceChangeState = 0; } static bool8 DoMonPlaceChange(void) { - return sPSSData->monPlaceChangeFunc(); + return sStorage->monPlaceChangeFunc(); } -static bool8 MonPlaceChange_Move(void) +static bool8 MonPlaceChange_Grab(void) { - switch (sPSSData->monPlaceChangeState) + switch (sStorage->monPlaceChangeState) { case 0: if (sIsMonBeingMoved) return FALSE; - StartSpriteAnim(sPSSData->field_CB4, 2); - sPSSData->monPlaceChangeState++; + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_OPEN); + sStorage->monPlaceChangeState++; break; case 1: - if (!sub_80CDED4()) + if (!MonPlaceChange_CursorDown()) { - StartSpriteAnim(sPSSData->field_CB4, 3); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_FIST); MoveMon(); - sPSSData->monPlaceChangeState++; + sStorage->monPlaceChangeState++; } break; case 2: - if (!sub_80CDF08()) - sPSSData->monPlaceChangeState++; + if (!MonPlaceChange_CursorUp()) + sStorage->monPlaceChangeState++; break; case 3: return FALSE; @@ -6155,21 +6205,21 @@ static bool8 MonPlaceChange_Move(void) static bool8 MonPlaceChange_Place(void) { - switch (sPSSData->monPlaceChangeState) + switch (sStorage->monPlaceChangeState) { case 0: - if (!sub_80CDED4()) + if (!MonPlaceChange_CursorDown()) { - StartSpriteAnim(sPSSData->field_CB4, 2); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_OPEN); PlaceMon(); - sPSSData->monPlaceChangeState++; + sStorage->monPlaceChangeState++; } break; case 1: - if (!sub_80CDF08()) + if (!MonPlaceChange_CursorUp()) { - StartSpriteAnim(sPSSData->field_CB4, 0); - sPSSData->monPlaceChangeState++; + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_BOUNCE); + sStorage->monPlaceChangeState++; } break; case 2: @@ -6181,30 +6231,30 @@ static bool8 MonPlaceChange_Place(void) static bool8 MonPlaceChange_Shift(void) { - switch (sPSSData->monPlaceChangeState) + switch (sStorage->monPlaceChangeState) { case 0: - switch (sBoxCursorArea) + switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: - sPSSData->field_D91 = TOTAL_BOXES_COUNT; + sStorage->shiftBoxId = TOTAL_BOXES_COUNT; break; case CURSOR_AREA_IN_BOX: - sPSSData->field_D91 = StorageGetCurrentBox(); + sStorage->shiftBoxId = StorageGetCurrentBox(); break; default: return FALSE; } - StartSpriteAnim(sPSSData->field_CB4, 2); - sub_80CBD5C(sPSSData->field_D91, sBoxCursorPosition); - sPSSData->monPlaceChangeState++; + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_OPEN); + SaveMonSpriteAtPos(sStorage->shiftBoxId, sCursorPosition); + sStorage->monPlaceChangeState++; break; case 1: - if (!sub_80CBDC4()) + if (!MoveShiftingMons()) { - StartSpriteAnim(sPSSData->field_CB4, 3); - SetShiftedMonData(sPSSData->field_D91, sBoxCursorPosition); - sPSSData->monPlaceChangeState++; + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_FIST); + SetShiftedMonData(sStorage->shiftBoxId, sCursorPosition); + sStorage->monPlaceChangeState++; } break; case 2: @@ -6214,60 +6264,70 @@ static bool8 MonPlaceChange_Shift(void) return TRUE; } -static bool8 sub_80CDEB4(void) +static bool8 MultiMonPlaceChange_Down(void) { - return sub_80CDED4(); + return MonPlaceChange_CursorDown(); } -static bool8 sub_80CDEC4(void) +static bool8 MultiMonPlaceChange_Up(void) { - return sub_80CDF08(); + return MonPlaceChange_CursorUp(); } -static bool8 sub_80CDED4(void) +static bool8 MonPlaceChange_CursorDown(void) { - switch (sPSSData->field_CB4->pos2.y) + switch (sStorage->cursorSprite->pos2.y) { default: - sPSSData->field_CB4->pos2.y++; + sStorage->cursorSprite->pos2.y++; break; case 0: - sPSSData->field_CB4->pos2.y++; + sStorage->cursorSprite->pos2.y++; break; - case 8: + case 8: // Cursor has reached bottom return FALSE; } return TRUE; } -static bool8 sub_80CDF08(void) +static bool8 MonPlaceChange_CursorUp(void) { - switch (sPSSData->field_CB4->pos2.y) + switch (sStorage->cursorSprite->pos2.y) { - case 0: + case 0: // Cursor has reached top return FALSE; default: - sPSSData->field_CB4->pos2.y--; + sStorage->cursorSprite->pos2.y--; break; } return TRUE; } + +//------------------------------------------------------------------------------ +// SECTION: Pokémon data +// +// The functions below handle moving Pokémon data around while using the PC, +// including changing the positions of Pokémon, releasing Pokémon, viewing the +// summary screen, and updating the display of the currently selected Pokémon. +//------------------------------------------------------------------------------ + + static void MoveMon(void) { - switch (sBoxCursorArea) + switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: - SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); - sub_80CBC14(MODE_PARTY, sBoxCursorPosition); + SetMovingMonData(TOTAL_BOXES_COUNT, sCursorPosition); + SetMovingMonSprite(MODE_PARTY, sCursorPosition); break; case CURSOR_AREA_IN_BOX: - if (sPSSData->inBoxMovingMode == 0) + if (sStorage->inBoxMovingMode == MOVE_MODE_NORMAL) { - SetMovedMonData(StorageGetCurrentBox(), sBoxCursorPosition); - sub_80CBC14(MODE_BOX, sBoxCursorPosition); + SetMovingMonData(StorageGetCurrentBox(), sCursorPosition); + SetMovingMonSprite(MODE_BOX, sCursorPosition); } break; default: @@ -6281,16 +6341,16 @@ static void PlaceMon(void) { u8 boxId; - switch (sBoxCursorArea) + switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: - SetPlacedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); - sub_80CBCAC(TOTAL_BOXES_COUNT, sBoxCursorPosition); + SetPlacedMonData(TOTAL_BOXES_COUNT, sCursorPosition); + SetPlacedMonSprite(TOTAL_BOXES_COUNT, sCursorPosition); break; case CURSOR_AREA_IN_BOX: boxId = StorageGetCurrentBox(); - SetPlacedMonData(boxId, sBoxCursorPosition); - sub_80CBCAC(boxId, sBoxCursorPosition); + SetPlacedMonData(boxId, sCursorPosition); + SetPlacedMonSprite(boxId, sCursorPosition); break; default: return; @@ -6299,17 +6359,17 @@ static void PlaceMon(void) sIsMonBeingMoved = FALSE; } -static void sub_80CE00C(void) +static void RefreshDisplayMon(void) { - sub_80CEB40(); + TryRefreshDisplayMon(); } -static void SetMovedMonData(u8 boxId, u8 position) +static void SetMovingMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) - sPSSData->movingMon = gPlayerParty[sBoxCursorPosition]; + sStorage->movingMon = gPlayerParty[sCursorPosition]; else - BoxMonAtToMon(boxId, position, &sPSSData->movingMon); + BoxMonAtToMon(boxId, position, &sStorage->movingMon); PurgeMonOrBoxMon(boxId, position); sMovingMonOrigBoxId = boxId; @@ -6320,12 +6380,12 @@ static void SetPlacedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) { - gPlayerParty[position] = sPSSData->movingMon; + gPlayerParty[position] = sStorage->movingMon; } else { - BoxMonRestorePP(&sPSSData->movingMon.box); - SetBoxMonAt(boxId, position, &sPSSData->movingMon.box); + BoxMonRestorePP(&sStorage->movingMon.box); + SetBoxMonAt(boxId, position, &sStorage->movingMon.box); } } @@ -6340,13 +6400,13 @@ static void PurgeMonOrBoxMon(u8 boxId, u8 position) static void SetShiftedMonData(u8 boxId, u8 position) { if (boxId == TOTAL_BOXES_COUNT) - sPSSData->field_2108 = gPlayerParty[position]; + sStorage->tempMon = gPlayerParty[position]; else - BoxMonAtToMon(boxId, position, &sPSSData->field_2108); + BoxMonAtToMon(boxId, position, &sStorage->tempMon); SetPlacedMonData(boxId, position); - sPSSData->movingMon = sPSSData->field_2108; - SetCursorMonData(&sPSSData->movingMon, MODE_PARTY); + sStorage->movingMon = sStorage->tempMon; + SetDisplayMonData(&sStorage->movingMon, MODE_PARTY); sMovingMonOrigBoxId = boxId; sMovingMonOrigBoxPos = position; } @@ -6365,44 +6425,44 @@ static bool8 TryStorePartyMonInBox(u8 boxId) } else { - SetMovedMonData(TOTAL_BOXES_COUNT, sBoxCursorPosition); + SetMovingMonData(TOTAL_BOXES_COUNT, sCursorPosition); SetPlacedMonData(boxId, boxPosition); - DestroyPartyMonIcon(sBoxCursorPosition); + DestroyPartyMonIcon(sCursorPosition); } if (boxId == StorageGetCurrentBox()) - sub_80CB140(boxPosition); + CreateBoxMonIconAtPos(boxPosition); - StartSpriteAnim(sPSSData->field_CB4, 1); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_STILL); return TRUE; } -static void sub_80CE22C(void) +static void ResetSelectionAfterDeposit(void) { - StartSpriteAnim(sPSSData->field_CB4, 0); - sub_80CEB40(); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_BOUNCE); + TryRefreshDisplayMon(); } -static void sub_80CE250(void) +static void InitReleaseMon(void) { u8 mode; if (sIsMonBeingMoved) mode = MODE_MOVE; - else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + else if (sCursorArea == CURSOR_AREA_IN_PARTY) mode = MODE_PARTY; else mode = MODE_BOX; - sub_80CBF14(mode, sBoxCursorPosition); - StringCopy(sPSSData->field_21E0, sPSSData->cursorMonNick); + SetReleaseMon(mode, sCursorPosition); + StringCopy(sStorage->releaseMonName, sStorage->displayMonName); } -static bool8 sub_80CE2A8(void) +static bool8 TryHideReleaseMon(void) { - if (!sub_80CBFD8()) + if (!TryHideReleaseMonSprite()) { - StartSpriteAnim(sPSSData->field_CB4, 0); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_BOUNCE); return FALSE; } else @@ -6415,35 +6475,39 @@ static void ReleaseMon(void) { u8 boxId; - sub_80CC020(); + DestroyReleaseMonIcon(); if (sIsMonBeingMoved) { sIsMonBeingMoved = FALSE; } else { - if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + if (sCursorArea == CURSOR_AREA_IN_PARTY) boxId = TOTAL_BOXES_COUNT; else boxId = StorageGetCurrentBox(); - PurgeMonOrBoxMon(boxId, sBoxCursorPosition); + PurgeMonOrBoxMon(boxId, sCursorPosition); } - sub_80CEB40(); + TryRefreshDisplayMon(); } -static void sub_80CE324(void) +static void TrySetCursorFistAnim(void) { if (sIsMonBeingMoved) - StartSpriteAnim(sPSSData->field_CB4, 3); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_FIST); } +// If the player is on the listed map (or any map, if none is specified), +// they may not release their last Pokémon that knows the specified move. +// This is to stop the player from softlocking themselves by not having +// a Pokémon that knows a required field move. struct { s8 mapGroup; s8 mapNum; u16 move; -} static const gUnknown_0857B9A4[] = +} static const sRestrictedReleaseMoves[] = { {MAP_GROUPS_COUNT, 0, MOVE_SURF}, {MAP_GROUPS_COUNT, 0, MOVE_DIVE}, @@ -6453,73 +6517,79 @@ struct {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_ROCK_SMASH}, }; -static void sub_80CE350(u16 *moves) +static void GetRestrictedReleaseMoves(u16 *moves) { s32 i; - for (i = 0; i < ARRAY_COUNT(gUnknown_0857B9A4); i++) + for (i = 0; i < ARRAY_COUNT(sRestrictedReleaseMoves); i++) { - if (gUnknown_0857B9A4[i].mapGroup == MAP_GROUPS_COUNT - || (gUnknown_0857B9A4[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gUnknown_0857B9A4[i].mapNum == gSaveBlock1Ptr->location.mapNum)) + if (sRestrictedReleaseMoves[i].mapGroup == MAP_GROUPS_COUNT + || (sRestrictedReleaseMoves[i].mapGroup == gSaveBlock1Ptr->location.mapGroup + && sRestrictedReleaseMoves[i].mapNum == gSaveBlock1Ptr->location.mapNum)) { - *moves = gUnknown_0857B9A4[i].move; + *moves = sRestrictedReleaseMoves[i].move; moves++; } } - *moves = MOVES_COUNT; } -static void InitCanRelaseMonVars(void) +static void InitCanReleaseMonVars(void) { if (!AtLeastThreeUsableMons()) { - sPSSData->field_216D = 1; - sPSSData->field_216C = 0; + // The player only has 1 or 2 usable + // Pokémon, this one can't be released + sStorage->releaseStatusResolved = TRUE; + sStorage->canReleaseMon = FALSE; return; } if (sIsMonBeingMoved) { - sPSSData->field_2108 = sPSSData->movingMon; - sPSSData->field_2170 = -1; - sPSSData->field_2171 = -1; + sStorage->tempMon = sStorage->movingMon; + sStorage->releaseBoxId = -1; + sStorage->releaseBoxPos = -1; } else { - if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + if (sCursorArea == CURSOR_AREA_IN_PARTY) { - sPSSData->field_2108 = gPlayerParty[sBoxCursorPosition]; - sPSSData->field_2170 = TOTAL_BOXES_COUNT; + sStorage->tempMon = gPlayerParty[sCursorPosition]; + sStorage->releaseBoxId = TOTAL_BOXES_COUNT; } else { - BoxMonAtToMon(StorageGetCurrentBox(), sBoxCursorPosition, &sPSSData->field_2108); - sPSSData->field_2170 = StorageGetCurrentBox(); + BoxMonAtToMon(StorageGetCurrentBox(), sCursorPosition, &sStorage->tempMon); + sStorage->releaseBoxId = StorageGetCurrentBox(); } - sPSSData->field_2171 = sBoxCursorPosition; + sStorage->releaseBoxPos = sCursorPosition; } - sub_80CE350(sPSSData->field_2176); - sPSSData->field_2174 = GetMonData(&sPSSData->field_2108, MON_DATA_KNOWN_MOVES, (u8*)sPSSData->field_2176); - if (sPSSData->field_2174 != 0) + GetRestrictedReleaseMoves(sStorage->restrictedMoveList); + sStorage->restrictedReleaseMonMoves = GetMonData(&sStorage->tempMon, MON_DATA_KNOWN_MOVES, (u8*)sStorage->restrictedMoveList); + if (sStorage->restrictedReleaseMonMoves != 0) { - sPSSData->field_216D = 0; + // Pokémon knows at least one restricted release move + // Need to check if another Pokémon has this move first + sStorage->releaseStatusResolved = FALSE; } else { - sPSSData->field_216D = 1; - sPSSData->field_216C = 1; + // Pokémon knows no restricted moves, can be released + sStorage->releaseStatusResolved = TRUE; + sStorage->canReleaseMon = TRUE; } - sPSSData->field_2172 = 0; + sStorage->releaseCheckState = 0; } static bool32 AtLeastThreeUsableMons(void) { - s32 i, j, count; - - count = (sIsMonBeingMoved != FALSE); + s32 i, j; + s32 count = (sIsMonBeingMoved != FALSE); + + // Check party for usable Pokémon for (j = 0; j < PARTY_SIZE; j++) { if (GetMonData(&gPlayerParty[j], MON_DATA_SANITY_HAS_SPECIES)) @@ -6529,6 +6599,7 @@ static bool32 AtLeastThreeUsableMons(void) if (count >= 3) return TRUE; + // Check PC for usable Pokémon for (i = 0; i < TOTAL_BOXES_COUNT; i++) { for (j = 0; j < IN_BOX_COUNT; j++) @@ -6549,54 +6620,69 @@ static s8 RunCanReleaseMon(void) u16 i; u16 knownMoves; - if (sPSSData->field_216D) - return sPSSData->field_216C; + if (sStorage->releaseStatusResolved) + return sStorage->canReleaseMon; - switch (sPSSData->field_2172) + switch (sStorage->releaseCheckState) { case 0: + // Check party for other Pokémon that know any restricted + // moves the release Pokémon knows for (i = 0; i < PARTY_SIZE; i++) { - if (sPSSData->field_2170 != TOTAL_BOXES_COUNT || sPSSData->field_2171 != i) + // Make sure party Pokémon isn't the one we're releasing first + if (sStorage->releaseBoxId != TOTAL_BOXES_COUNT || sStorage->releaseBoxPos != i) { - knownMoves = GetMonData(gPlayerParty + i, MON_DATA_KNOWN_MOVES, (u8*)sPSSData->field_2176); - sPSSData->field_2174 &= ~(knownMoves); + knownMoves = GetMonData(&gPlayerParty[i], MON_DATA_KNOWN_MOVES, (u8*)sStorage->restrictedMoveList); + sStorage->restrictedReleaseMonMoves &= ~(knownMoves); } } - if (sPSSData->field_2174 == 0) + if (sStorage->restrictedReleaseMonMoves == 0) { - sPSSData->field_216D = 1; - sPSSData->field_216C = 1; + // No restricted moves on release Pokémon that + // aren't resolved by the party, it can be released. + sStorage->releaseStatusResolved = TRUE; + sStorage->canReleaseMon = TRUE; } else { - sPSSData->field_216E = 0; - sPSSData->field_216F = 0; - sPSSData->field_2172++; + // Release Pokémon has restricted moves not resolved by the party. + // Continue and check the PC next + sStorage->releaseCheckBoxId = 0; + sStorage->releaseCheckBoxPos = 0; + sStorage->releaseCheckState++; } break; case 1: + // Check PC for other Pokémon that know any restricted + // moves the release Pokémon knows for (i = 0; i < IN_BOX_COUNT; i++) { - knownMoves = GetAndCopyBoxMonDataAt(sPSSData->field_216E, sPSSData->field_216F, MON_DATA_KNOWN_MOVES, (u8*)sPSSData->field_2176); - if (knownMoves != 0 - && !(sPSSData->field_2170 == sPSSData->field_216E && sPSSData->field_2171 == sPSSData->field_216F)) + knownMoves = GetAndCopyBoxMonDataAt(sStorage->releaseCheckBoxId, sStorage->releaseCheckBoxPos, MON_DATA_KNOWN_MOVES, (u8*)sStorage->restrictedMoveList); + if (knownMoves != 0 && !(sStorage->releaseBoxId == sStorage->releaseCheckBoxId + && sStorage->releaseBoxPos == sStorage->releaseCheckBoxPos)) { - sPSSData->field_2174 &= ~(knownMoves); - if (sPSSData->field_2174 == 0) + // Found PC Pokémon with restricted move, clear move from list + sStorage->restrictedReleaseMonMoves &= ~(knownMoves); + if (sStorage->restrictedReleaseMonMoves == 0) { - sPSSData->field_216D = 1; - sPSSData->field_216C = 1; + // No restricted moves on release Pokémon that + // aren't resolved, it can be released. + sStorage->releaseStatusResolved = TRUE; + sStorage->canReleaseMon = TRUE; break; } } - if (++sPSSData->field_216F >= IN_BOX_COUNT) + if (++sStorage->releaseCheckBoxPos >= IN_BOX_COUNT) { - sPSSData->field_216F = 0; - if (++sPSSData->field_216E >= TOTAL_BOXES_COUNT) + sStorage->releaseCheckBoxPos = 0; + if (++sStorage->releaseCheckBoxId >= TOTAL_BOXES_COUNT) { - sPSSData->field_216D = 1; - sPSSData->field_216C = 0; + // Checked every Pokémon in the PC, release Pokémon is + // the sole owner of at least one restricted move. + // It cannot be released. + sStorage->releaseStatusResolved = TRUE; + sStorage->canReleaseMon = FALSE; } } } @@ -6606,55 +6692,57 @@ static s8 RunCanReleaseMon(void) return -1; } -static void sub_80CE760(void) +static void SaveMovingMon(void) { if (sIsMonBeingMoved) - gUnknown_02039D14 = sPSSData->movingMon; + sSavedMovingMon = sStorage->movingMon; } -static void sub_80CE790(void) +static void LoadSavedMovingMon(void) { if (sIsMonBeingMoved) { + // If it came from the party load a struct Pokemon, + // otherwise load a BoxPokemon if (sMovingMonOrigBoxId == TOTAL_BOXES_COUNT) - sPSSData->movingMon = gUnknown_02039D14; + sStorage->movingMon = sSavedMovingMon; else - sPSSData->movingMon.box = gUnknown_02039D14.box; + sStorage->movingMon.box = sSavedMovingMon.box; } } -static void sub_80CE7E8(void) +static void InitSummaryScreenData(void) { if (sIsMonBeingMoved) { - sub_80CE760(); - sPSSData->field_218C.mon = &gUnknown_02039D14; - sPSSData->field_2187 = 0; - sPSSData->field_2186 = 0; - sPSSData->pokemonSummaryScreenMode = PSS_MODE_NORMAL; + SaveMovingMon(); + sStorage->summaryMon.mon = &sSavedMovingMon; + sStorage->summaryStartPos = 0; + sStorage->summaryMaxPos = 0; + sStorage->summaryScreenMode = SUMMARY_MODE_NORMAL; } - else if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + else if (sCursorArea == CURSOR_AREA_IN_PARTY) { - sPSSData->field_218C.mon = gPlayerParty; - sPSSData->field_2187 = sBoxCursorPosition; - sPSSData->field_2186 = CountPartyMons() - 1; - sPSSData->pokemonSummaryScreenMode = PSS_MODE_NORMAL; + sStorage->summaryMon.mon = gPlayerParty; + sStorage->summaryStartPos = sCursorPosition; + sStorage->summaryMaxPos = CountPartyMons() - 1; + sStorage->summaryScreenMode = SUMMARY_MODE_NORMAL; } else { - sPSSData->field_218C.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0); - sPSSData->field_2187 = sBoxCursorPosition; - sPSSData->field_2186 = IN_BOX_COUNT - 1; - sPSSData->pokemonSummaryScreenMode = PSS_MODE_BOX; + sStorage->summaryMon.box = GetBoxedMonPtr(StorageGetCurrentBox(), 0); + sStorage->summaryStartPos = sCursorPosition; + sStorage->summaryMaxPos = IN_BOX_COUNT - 1; + sStorage->summaryScreenMode = SUMMARY_MODE_BOX; } } -static void sub_80CE8E4(void) +static void SetSelectionAfterSummaryScreen(void) { if (sIsMonBeingMoved) - sub_80CE790(); + LoadSavedMovingMon(); else - sBoxCursorPosition = gLastViewedMonIndex; + sCursorPosition = gLastViewedMonIndex; } s16 CompactPartySlots(void) @@ -6664,7 +6752,7 @@ s16 CompactPartySlots(void) for (i = 0, last = 0; i < PARTY_SIZE; i++) { - u16 species = GetMonData(gPlayerParty + i, MON_DATA_SPECIES); + u16 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); if (species != SPECIES_NONE) { if (i != last) @@ -6677,30 +6765,30 @@ s16 CompactPartySlots(void) } } for (; last < PARTY_SIZE; last++) - ZeroMonData(gPlayerParty + last); + ZeroMonData(&gPlayerParty[last]); return retVal; } static void SetMonMarkings(u8 markings) { - sPSSData->cursorMonMarkings = markings; + sStorage->displayMonMarkings = markings; if (sIsMonBeingMoved) { - SetMonData(&sPSSData->movingMon, MON_DATA_MARKINGS, &markings); + SetMonData(&sStorage->movingMon, MON_DATA_MARKINGS, &markings); } else { - if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) - SetMonData(gPlayerParty + sBoxCursorPosition, MON_DATA_MARKINGS, &markings); - if (sBoxCursorArea == CURSOR_AREA_IN_BOX) - SetCurrentBoxMonData(sBoxCursorPosition, MON_DATA_MARKINGS, &markings); + if (sCursorArea == CURSOR_AREA_IN_PARTY) + SetMonData(&gPlayerParty[sCursorPosition], MON_DATA_MARKINGS, &markings); + if (sCursorArea == CURSOR_AREA_IN_BOX) + SetCurrentBoxMonData(sCursorPosition, MON_DATA_MARKINGS, &markings); } } -static bool8 CanMovePartyMon(void) +static bool8 IsRemovingLastPartyMon(void) { - if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0) + if (sCursorArea == CURSOR_AREA_IN_PARTY && !sIsMonBeingMoved && CountPartyAliveNonEggMonsExcept(sCursorPosition) == 0) return TRUE; else return FALSE; @@ -6710,9 +6798,9 @@ static bool8 CanShiftMon(void) { if (sIsMonBeingMoved) { - if (sBoxCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sBoxCursorPosition) == 0) + if (sCursorArea == CURSOR_AREA_IN_PARTY && CountPartyAliveNonEggMonsExcept(sCursorPosition) == 0) { - if (sPSSData->cursorMonIsEgg || GetMonData(&sPSSData->movingMon, MON_DATA_HP) == 0) + if (sStorage->displayMonIsEgg || GetMonData(&sStorage->movingMon, MON_DATA_HP) == 0) return FALSE; } return TRUE; @@ -6725,148 +6813,152 @@ static bool8 IsMonBeingMoved(void) return sIsMonBeingMoved; } -static bool8 IsCursorOnBox(void) +static bool8 IsCursorOnBoxTitle(void) { - return (sBoxCursorArea == CURSOR_AREA_BOX); + return (sCursorArea == CURSOR_AREA_BOX_TITLE); } static bool8 IsCursorOnCloseBox(void) { - return (sBoxCursorArea == CURSOR_AREA_BUTTONS && sBoxCursorPosition == 1); + return (sCursorArea == CURSOR_AREA_BUTTONS && sCursorPosition == 1); } static bool8 IsCursorInBox(void) { - return (sBoxCursorArea == CURSOR_AREA_IN_BOX); + return (sCursorArea == CURSOR_AREA_IN_BOX); } -static void sub_80CEB40(void) +static void TryRefreshDisplayMon(void) { - sPSSData->setMosaic = (sIsMonBeingMoved == FALSE); + // If a Pokémon is currently being moved, don't start + // mosaic or update display. Keep displaying the + // currently held Pokémon. + sStorage->setMosaic = (sIsMonBeingMoved == FALSE); if (!sIsMonBeingMoved) { - switch (sBoxCursorArea) + // Update display Pokémon + switch (sCursorArea) { case CURSOR_AREA_IN_PARTY: - if (sBoxCursorPosition < PARTY_SIZE) + if (sCursorPosition < PARTY_SIZE) { - SetCursorMonData(&gPlayerParty[sBoxCursorPosition], MODE_PARTY); + SetDisplayMonData(&gPlayerParty[sCursorPosition], MODE_PARTY); break; } // fallthrough case CURSOR_AREA_BUTTONS: - case CURSOR_AREA_BOX: - SetCursorMonData(NULL, MODE_MOVE); + case CURSOR_AREA_BOX_TITLE: + SetDisplayMonData(NULL, MODE_MOVE); break; case CURSOR_AREA_IN_BOX: - SetCursorMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sBoxCursorPosition), MODE_BOX); + SetDisplayMonData(GetBoxedMonPtr(StorageGetCurrentBox(), sCursorPosition), MODE_BOX); break; } } } -static void sub_80CEBDC(void) +static void ReshowDisplayMon(void) { if (sIsMonBeingMoved) - SetCursorMonData(&gUnknown_02039D14, MODE_PARTY); + SetDisplayMonData(&sSavedMovingMon, MODE_PARTY); else - sub_80CEB40(); + TryRefreshDisplayMon(); } -static void SetCursorMonData(void *pokemon, u8 mode) +static void SetDisplayMonData(void *pokemon, u8 mode) { u8 *txtPtr; u16 gender; bool8 sanityIsBadEgg; - sPSSData->cursorMonItem = 0; + sStorage->displayMonItemId = ITEM_NONE; gender = MON_MALE; sanityIsBadEgg = FALSE; if (mode == MODE_PARTY) { struct Pokemon *mon = (struct Pokemon *)pokemon; - sPSSData->cursorMonSpecies = GetMonData(mon, MON_DATA_SPECIES2); - if (sPSSData->cursorMonSpecies != SPECIES_NONE) + sStorage->displayMonSpecies = GetMonData(mon, MON_DATA_SPECIES2); + if (sStorage->displayMonSpecies != SPECIES_NONE) { sanityIsBadEgg = GetMonData(mon, MON_DATA_SANITY_IS_BAD_EGG); if (sanityIsBadEgg) - sPSSData->cursorMonIsEgg = TRUE; + sStorage->displayMonIsEgg = TRUE; else - sPSSData->cursorMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG); - - GetMonData(mon, MON_DATA_NICKNAME, sPSSData->cursorMonNick); - StringGetEnd10(sPSSData->cursorMonNick); - sPSSData->cursorMonLevel = GetMonData(mon, MON_DATA_LEVEL); - sPSSData->cursorMonMarkings = GetMonData(mon, MON_DATA_MARKINGS); - sPSSData->cursorMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - sPSSData->cursorMonPalette = GetMonFrontSpritePal(mon); + sStorage->displayMonIsEgg = GetMonData(mon, MON_DATA_IS_EGG); + + GetMonData(mon, MON_DATA_NICKNAME, sStorage->displayMonName); + StringGetEnd10(sStorage->displayMonName); + sStorage->displayMonLevel = GetMonData(mon, MON_DATA_LEVEL); + sStorage->displayMonMarkings = GetMonData(mon, MON_DATA_MARKINGS); + sStorage->displayMonPersonality = GetMonData(mon, MON_DATA_PERSONALITY); + sStorage->displayMonPalette = GetMonFrontSpritePal(mon); gender = GetMonGender(mon); - sPSSData->cursorMonItem = GetMonData(mon, MON_DATA_HELD_ITEM); + sStorage->displayMonItemId = GetMonData(mon, MON_DATA_HELD_ITEM); } } else if (mode == MODE_BOX) { struct BoxPokemon *boxMon = (struct BoxPokemon *)pokemon; - sPSSData->cursorMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES2); - if (sPSSData->cursorMonSpecies != SPECIES_NONE) + sStorage->displayMonSpecies = GetBoxMonData(pokemon, MON_DATA_SPECIES2); + if (sStorage->displayMonSpecies != SPECIES_NONE) { u32 otId = GetBoxMonData(boxMon, MON_DATA_OT_ID); sanityIsBadEgg = GetBoxMonData(boxMon, MON_DATA_SANITY_IS_BAD_EGG); if (sanityIsBadEgg) - sPSSData->cursorMonIsEgg = TRUE; + sStorage->displayMonIsEgg = TRUE; else - sPSSData->cursorMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG); + sStorage->displayMonIsEgg = GetBoxMonData(boxMon, MON_DATA_IS_EGG); - GetBoxMonData(boxMon, MON_DATA_NICKNAME, sPSSData->cursorMonNick); - StringGetEnd10(sPSSData->cursorMonNick); - sPSSData->cursorMonLevel = GetLevelFromBoxMonExp(boxMon); - sPSSData->cursorMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS); - sPSSData->cursorMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); - sPSSData->cursorMonPalette = GetMonSpritePalFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, otId, sPSSData->cursorMonPersonality); - gender = GetGenderFromSpeciesAndPersonality(sPSSData->cursorMonSpecies, sPSSData->cursorMonPersonality); - sPSSData->cursorMonItem = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM); + GetBoxMonData(boxMon, MON_DATA_NICKNAME, sStorage->displayMonName); + StringGetEnd10(sStorage->displayMonName); + sStorage->displayMonLevel = GetLevelFromBoxMonExp(boxMon); + sStorage->displayMonMarkings = GetBoxMonData(boxMon, MON_DATA_MARKINGS); + sStorage->displayMonPersonality = GetBoxMonData(boxMon, MON_DATA_PERSONALITY); + sStorage->displayMonPalette = GetMonSpritePalFromSpeciesAndPersonality(sStorage->displayMonSpecies, otId, sStorage->displayMonPersonality); + gender = GetGenderFromSpeciesAndPersonality(sStorage->displayMonSpecies, sStorage->displayMonPersonality); + sStorage->displayMonItemId = GetBoxMonData(boxMon, MON_DATA_HELD_ITEM); } } else { - sPSSData->cursorMonSpecies = SPECIES_NONE; - sPSSData->cursorMonItem = 0; + sStorage->displayMonSpecies = SPECIES_NONE; + sStorage->displayMonItemId = ITEM_NONE; } - if (sPSSData->cursorMonSpecies == SPECIES_NONE) + if (sStorage->displayMonSpecies == SPECIES_NONE) { - StringFill(sPSSData->cursorMonNick, CHAR_SPACE, 5); - StringFill(sPSSData->cursorMonNickText, CHAR_SPACE, 8); - StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8); - StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8); - StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8); + StringFill(sStorage->displayMonName, CHAR_SPACE, 5); + StringFill(sStorage->displayMonNameText, CHAR_SPACE, 8); + StringFill(sStorage->displayMonSpeciesName, CHAR_SPACE, 8); + StringFill(sStorage->displayMonGenderLvlText, CHAR_SPACE, 8); + StringFill(sStorage->displayMonItemName, CHAR_SPACE, 8); } - else if (sPSSData->cursorMonIsEgg) + else if (sStorage->displayMonIsEgg) { if (sanityIsBadEgg) - StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5); + StringCopyPadded(sStorage->displayMonNameText, sStorage->displayMonName, CHAR_SPACE, 5); else - StringCopyPadded(sPSSData->cursorMonNickText, gText_EggNickname, CHAR_SPACE, 8); + StringCopyPadded(sStorage->displayMonNameText, gText_EggNickname, CHAR_SPACE, 8); - StringFill(sPSSData->cursorMonSpeciesName, CHAR_SPACE, 8); - StringFill(sPSSData->cursorMonGenderLvlText, CHAR_SPACE, 8); - StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8); + StringFill(sStorage->displayMonSpeciesName, CHAR_SPACE, 8); + StringFill(sStorage->displayMonGenderLvlText, CHAR_SPACE, 8); + StringFill(sStorage->displayMonItemName, CHAR_SPACE, 8); } else { - if (sPSSData->cursorMonSpecies == SPECIES_NIDORAN_F || sPSSData->cursorMonSpecies == SPECIES_NIDORAN_M) + if (sStorage->displayMonSpecies == SPECIES_NIDORAN_F || sStorage->displayMonSpecies == SPECIES_NIDORAN_M) gender = MON_GENDERLESS; - StringCopyPadded(sPSSData->cursorMonNickText, sPSSData->cursorMonNick, CHAR_SPACE, 5); + StringCopyPadded(sStorage->displayMonNameText, sStorage->displayMonName, CHAR_SPACE, 5); - txtPtr = sPSSData->cursorMonSpeciesName; + txtPtr = sStorage->displayMonSpeciesName; *(txtPtr)++ = CHAR_SLASH; - StringCopyPadded(txtPtr, gSpeciesNames[sPSSData->cursorMonSpecies], CHAR_SPACE, 5); + StringCopyPadded(txtPtr, gSpeciesNames[sStorage->displayMonSpecies], CHAR_SPACE, 5); - txtPtr = sPSSData->cursorMonGenderLvlText; + txtPtr = sStorage->displayMonGenderLvlText; *(txtPtr)++ = EXT_CTRL_CODE_BEGIN; *(txtPtr)++ = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW; switch (gender) @@ -6884,43 +6976,51 @@ static void SetCursorMonData(void *pokemon, u8 mode) *(txtPtr)++ = CHAR_FEMALE; break; default: - *(txtPtr)++ = TEXT_COLOR_DARK_GREY; + *(txtPtr)++ = TEXT_COLOR_DARK_GRAY; *(txtPtr)++ = TEXT_COLOR_WHITE; - *(txtPtr)++ = TEXT_COLOR_LIGHT_GREY; - *(txtPtr)++ = CHAR_UNK_SPACER; + *(txtPtr)++ = TEXT_COLOR_LIGHT_GRAY; + *(txtPtr)++ = CHAR_GENDERLESS; break; } *(txtPtr++) = EXT_CTRL_CODE_BEGIN; *(txtPtr++) = EXT_CTRL_CODE_COLOR_HIGHLIGHT_SHADOW; - *(txtPtr++) = TEXT_COLOR_DARK_GREY; + *(txtPtr++) = TEXT_COLOR_DARK_GRAY; *(txtPtr++) = TEXT_COLOR_WHITE; - *(txtPtr++) = TEXT_COLOR_LIGHT_GREY; + *(txtPtr++) = TEXT_COLOR_LIGHT_GRAY; *(txtPtr++) = CHAR_SPACE; *(txtPtr++) = CHAR_EXTRA_SYMBOL; *(txtPtr++) = CHAR_LV_2; - txtPtr = ConvertIntToDecimalStringN(txtPtr, sPSSData->cursorMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); + txtPtr = ConvertIntToDecimalStringN(txtPtr, sStorage->displayMonLevel, STR_CONV_MODE_LEFT_ALIGN, 3); txtPtr[0] = CHAR_SPACE; txtPtr[1] = EOS; - if (sPSSData->cursorMonItem != 0) - StringCopyPadded(sPSSData->cursorMonItemName, ItemId_GetName(sPSSData->cursorMonItem), CHAR_SPACE, 8); + if (sStorage->displayMonItemId != ITEM_NONE) + StringCopyPadded(sStorage->displayMonItemName, ItemId_GetName(sStorage->displayMonItemId), CHAR_SPACE, 8); else - StringFill(sPSSData->cursorMonItemName, CHAR_SPACE, 8); + StringFill(sStorage->displayMonItemName, CHAR_SPACE, 8); } } + +//------------------------------------------------------------------------------ +// SECTION: Input handlers +// +// The functions below process context-dependent input +//------------------------------------------------------------------------------ + + static u8 HandleInput_InBox(void) { - switch (sPSSData->inBoxMovingMode) + switch (sStorage->inBoxMovingMode) { - case 0: + case MOVE_MODE_NORMAL: default: return InBoxInput_Normal(); - case 1: - return InBoxInput_GrabbingMultiple(); - case 2: + case MOVE_MODE_MULTIPLE_SELECTING: + return InBoxInput_SelectingMultiple(); + case MOVE_MODE_MULTIPLE_MOVING: return InBoxInput_MovingMultiple(); } } @@ -6933,208 +7033,209 @@ static u8 InBoxInput_Normal(void) do { - cursorArea = sBoxCursorArea; - cursorPosition = sBoxCursorPosition; - sPSSData->field_CD2 = 0; - sPSSData->field_CD3 = 0; - sPSSData->field_CD7 = 0; + cursorArea = sCursorArea; + cursorPosition = sCursorPosition; + sStorage->cursorVerticalWrap = 0; + sStorage->cursorHorizontalWrap = 0; + sStorage->cursorFlipTimer = 0; if (JOY_REPEAT(DPAD_UP)) { - retVal = TRUE; - if (sBoxCursorPosition >= IN_BOX_ROWS) + retVal = INPUT_MOVE_CURSOR; + if (sCursorPosition >= IN_BOX_COLUMNS) { - cursorPosition -= IN_BOX_ROWS; + cursorPosition -= IN_BOX_COLUMNS; } else { - cursorArea = CURSOR_AREA_BOX; + cursorArea = CURSOR_AREA_BOX_TITLE; cursorPosition = 0; } break; } else if (JOY_REPEAT(DPAD_DOWN)) { - retVal = TRUE; - cursorPosition += IN_BOX_ROWS; + retVal = INPUT_MOVE_CURSOR; + cursorPosition += IN_BOX_COLUMNS; if (cursorPosition >= IN_BOX_COUNT) { cursorArea = CURSOR_AREA_BUTTONS; cursorPosition -= IN_BOX_COUNT; cursorPosition /= 3; - sPSSData->field_CD2 = 1; - sPSSData->field_CD7 = 1; + sStorage->cursorVerticalWrap = 1; + sStorage->cursorFlipTimer = 1; } break; } else if (JOY_REPEAT(DPAD_LEFT)) { - retVal = TRUE; - if (sBoxCursorPosition % IN_BOX_ROWS != 0) + retVal = INPUT_MOVE_CURSOR; + if (sCursorPosition % IN_BOX_COLUMNS != 0) { cursorPosition--; } else { - sPSSData->field_CD3 = -1; - cursorPosition += (IN_BOX_ROWS - 1); + sStorage->cursorHorizontalWrap = -1; + cursorPosition += (IN_BOX_COLUMNS - 1); } break; } else if (JOY_REPEAT(DPAD_RIGHT)) { - retVal = TRUE; - if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0) + retVal = INPUT_MOVE_CURSOR; + if ((sCursorPosition + 1) % IN_BOX_COLUMNS != 0) { cursorPosition++; } else { - sPSSData->field_CD3 = 1; - cursorPosition -= (IN_BOX_ROWS - 1); + sStorage->cursorHorizontalWrap = 1; + cursorPosition -= (IN_BOX_COLUMNS - 1); } break; } else if (JOY_NEW(START_BUTTON)) { - retVal = TRUE; - cursorArea = CURSOR_AREA_BOX; + retVal = INPUT_MOVE_CURSOR; + cursorArea = CURSOR_AREA_BOX_TITLE; cursorPosition = 0; break; } - if ((JOY_NEW(A_BUTTON)) && sub_80CFA5C()) + if ((JOY_NEW(A_BUTTON)) && SetSelectionMenuTexts()) { - if (!sCanOnlyMove) - return 8; + if (!sAutoActionOn) + return INPUT_IN_MENU; - if (sPSSData->boxOption != BOX_OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE) + if (sStorage->boxOption != OPTION_MOVE_MONS || sIsMonBeingMoved == TRUE) { - switch (sub_80CFF98(0)) + switch (GetMenuItemTextId(0)) { - case 1: - return 11; - case 2: - return 12; - case 3: - return 13; - case 4: - return 14; - case 5: - return 15; - case 12: - return 16; - case 13: - return 17; - case 15: - return 18; + case MENU_STORE: + return INPUT_DEPOSIT; + case MENU_WITHDRAW: + return INPUT_WITHDRAW; + case MENU_MOVE: + return INPUT_MOVE_MON; + case MENU_SHIFT: + return INPUT_SHIFT_MON; + case MENU_PLACE: + return INPUT_PLACE_MON; + case MENU_TAKE: + return INPUT_TAKE_ITEM; + case MENU_GIVE: + return INPUT_GIVE_ITEM; + case MENU_SWITCH: + return INPUT_SWITCH_ITEMS; } } else { - sPSSData->inBoxMovingMode = 1; - return 20; + sStorage->inBoxMovingMode = MOVE_MODE_MULTIPLE_SELECTING; + return INPUT_MULTIMOVE_START; } } if (JOY_NEW(B_BUTTON)) - return 19; + return INPUT_PRESSED_B; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) - return 10; + return INPUT_SCROLL_LEFT; if (JOY_HELD(R_BUTTON)) - return 9; + return INPUT_SCROLL_RIGHT; } if (JOY_NEW(SELECT_BUTTON)) { - sub_80CFDC4(); - return 0; + ToggleCursorAutoAction(); + return INPUT_NONE; } - retVal = 0; + retVal = INPUT_NONE; } while (0); if (retVal) - sub_80CD894(cursorArea, cursorPosition); + SetCursorPosition(cursorArea, cursorPosition); return retVal; } -static u8 InBoxInput_GrabbingMultiple(void) +static u8 InBoxInput_SelectingMultiple(void) { if (JOY_HELD(A_BUTTON)) { if (JOY_REPEAT(DPAD_UP)) { - if (sBoxCursorPosition / IN_BOX_ROWS != 0) + if (sCursorPosition / IN_BOX_COLUMNS != 0) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS); - return 21; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - IN_BOX_COLUMNS); + return INPUT_MULTIMOVE_CHANGE_SELECTION; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else if (JOY_REPEAT(DPAD_DOWN)) { - if (sBoxCursorPosition + IN_BOX_ROWS < IN_BOX_COUNT) + if (sCursorPosition + IN_BOX_COLUMNS < IN_BOX_COUNT) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS); - return 21; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + IN_BOX_COLUMNS); + return INPUT_MULTIMOVE_CHANGE_SELECTION; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else if (JOY_REPEAT(DPAD_LEFT)) { - if (sBoxCursorPosition % IN_BOX_ROWS != 0) + if (sCursorPosition % IN_BOX_COLUMNS != 0) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1); - return 21; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - 1); + return INPUT_MULTIMOVE_CHANGE_SELECTION; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else if (JOY_REPEAT(DPAD_RIGHT)) { - if ((sBoxCursorPosition + 1) % IN_BOX_ROWS != 0) + if ((sCursorPosition + 1) % IN_BOX_COLUMNS != 0) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1); - return 21; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + 1); + return INPUT_MULTIMOVE_CHANGE_SELECTION; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else { - return 0; + return INPUT_NONE; } } else { - if (sub_80D0BA4() == sBoxCursorPosition) + if (MultiMove_GetOrigin() == sCursorPosition) { - sPSSData->inBoxMovingMode = 0; - sPSSData->field_CB8->invisible = FALSE; - return 22; + // Doing a multiple mon selection but only chose 1 mon + sStorage->inBoxMovingMode = MOVE_MODE_NORMAL; + sStorage->cursorShadowSprite->invisible = FALSE; + return INPUT_MULTIMOVE_SINGLE; } else { - sIsMonBeingMoved = (sPSSData->cursorMonSpecies != SPECIES_NONE); - sPSSData->inBoxMovingMode = 2; + sIsMonBeingMoved = (sStorage->displayMonSpecies != SPECIES_NONE); + sStorage->inBoxMovingMode = MOVE_MODE_MULTIPLE_MOVING; sMovingMonOrigBoxId = StorageGetCurrentBox(); - return 23; + return INPUT_MULTIMOVE_GRAB_SELECTION; } } } @@ -7143,80 +7244,80 @@ static u8 InBoxInput_MovingMultiple(void) { if (JOY_REPEAT(DPAD_UP)) { - if (sub_80D0580(0)) + if (MultiMove_TryMoveGroup(0)) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - IN_BOX_ROWS); - return 25; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - IN_BOX_COLUMNS); + return INPUT_MULTIMOVE_MOVE_MONS; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else if (JOY_REPEAT(DPAD_DOWN)) { - if (sub_80D0580(1)) + if (MultiMove_TryMoveGroup(1)) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + IN_BOX_ROWS); - return 25; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + IN_BOX_COLUMNS); + return INPUT_MULTIMOVE_MOVE_MONS; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else if (JOY_REPEAT(DPAD_LEFT)) { - if (sub_80D0580(2)) + if (MultiMove_TryMoveGroup(2)) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition - 1); - return 25; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition - 1); + return INPUT_MULTIMOVE_MOVE_MONS; } else { - return 10; + return INPUT_SCROLL_LEFT; } } else if (JOY_REPEAT(DPAD_RIGHT)) { - if (sub_80D0580(3)) + if (MultiMove_TryMoveGroup(3)) { - sub_80CD894(CURSOR_AREA_IN_BOX, sBoxCursorPosition + 1); - return 25; + SetCursorPosition(CURSOR_AREA_IN_BOX, sCursorPosition + 1); + return INPUT_MULTIMOVE_MOVE_MONS; } else { - return 9; + return INPUT_SCROLL_RIGHT; } } else if (JOY_NEW(A_BUTTON)) { - if (sub_80D0BC0()) + if (MultiMove_CanPlaceSelection()) { sIsMonBeingMoved = FALSE; - sPSSData->inBoxMovingMode = 0; - return 26; + sStorage->inBoxMovingMode = MOVE_MODE_NORMAL; + return INPUT_MULTIMOVE_PLACE_MONS; } else { - return 24; + return INPUT_MULTIMOVE_UNABLE; } } else if (JOY_NEW(B_BUTTON)) { - return 24; + return INPUT_MULTIMOVE_UNABLE; } else { if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) - return 10; + return INPUT_SCROLL_LEFT; if (JOY_HELD(R_BUTTON)) - return 9; + return INPUT_SCROLL_RIGHT; } - return 0; + return INPUT_NONE; } } @@ -7229,47 +7330,47 @@ static u8 HandleInput_InParty(void) do { - cursorArea = sBoxCursorArea; - cursorPosition = sBoxCursorPosition; - sPSSData->field_CD3 = 0; - sPSSData->field_CD2 = 0; - sPSSData->field_CD7 = 0; + cursorArea = sCursorArea; + cursorPosition = sCursorPosition; + sStorage->cursorHorizontalWrap = 0; + sStorage->cursorVerticalWrap = 0; + sStorage->cursorFlipTimer = 0; gotoBox = FALSE; - retVal = 0; + retVal = INPUT_NONE; if (JOY_REPEAT(DPAD_UP)) { if (--cursorPosition < 0) cursorPosition = PARTY_SIZE; - if (cursorPosition != sBoxCursorPosition) - retVal = 1; + if (cursorPosition != sCursorPosition) + retVal = INPUT_MOVE_CURSOR; break; } else if (JOY_REPEAT(DPAD_DOWN)) { if (++cursorPosition > PARTY_SIZE) cursorPosition = 0; - if (cursorPosition != sBoxCursorPosition) - retVal = 1; + if (cursorPosition != sCursorPosition) + retVal = INPUT_MOVE_CURSOR; break; } - else if (JOY_REPEAT(DPAD_LEFT) && sBoxCursorPosition != 0) + else if (JOY_REPEAT(DPAD_LEFT) && sCursorPosition != 0) { - retVal = 1; - sPSSData->field_CD6 = sBoxCursorPosition; + retVal = INPUT_MOVE_CURSOR; + sStorage->cursorPrevHorizPos = sCursorPosition; cursorPosition = 0; break; } else if (JOY_REPEAT(DPAD_RIGHT)) { - if (sBoxCursorPosition == 0) + if (sCursorPosition == 0) { - retVal = 1; - cursorPosition = sPSSData->field_CD6; + retVal = INPUT_MOVE_CURSOR; + cursorPosition = sStorage->cursorPrevHorizPos; } else { - retVal = 6; + retVal = INPUT_HIDE_PARTY; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 0; } @@ -7278,66 +7379,66 @@ static u8 HandleInput_InParty(void) if (JOY_NEW(A_BUTTON)) { - if (sBoxCursorPosition == PARTY_SIZE) + if (sCursorPosition == PARTY_SIZE) { - if (sPSSData->boxOption == BOX_OPTION_DEPOSIT) - return 4; + if (sStorage->boxOption == OPTION_DEPOSIT) + return INPUT_CLOSE_BOX; gotoBox = TRUE; } - else if (sub_80CFA5C()) + else if (SetSelectionMenuTexts()) { - if (!sCanOnlyMove) - return 8; + if (!sAutoActionOn) + return INPUT_IN_MENU; - switch (sub_80CFF98(0)) + switch (GetMenuItemTextId(0)) { - case 1: - return 11; - case 2: - return 12; - case 3: - return 13; - case 4: - return 14; - case 5: - return 15; - case 12: - return 16; - case 13: - return 17; - case 15: - return 18; + case MENU_STORE: + return INPUT_DEPOSIT; + case MENU_WITHDRAW: + return INPUT_WITHDRAW; + case MENU_MOVE: + return INPUT_MOVE_MON; + case MENU_SHIFT: + return INPUT_SHIFT_MON; + case MENU_PLACE: + return INPUT_PLACE_MON; + case MENU_TAKE: + return INPUT_TAKE_ITEM; + case MENU_GIVE: + return INPUT_GIVE_ITEM; + case MENU_SWITCH: + return INPUT_SWITCH_ITEMS; } } } if (JOY_NEW(B_BUTTON)) { - if (sPSSData->boxOption == BOX_OPTION_DEPOSIT) - return 19; + if (sStorage->boxOption == OPTION_DEPOSIT) + return INPUT_PRESSED_B; gotoBox = TRUE; } if (gotoBox) { - retVal = 6; + retVal = INPUT_HIDE_PARTY; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 0; } else if (JOY_NEW(SELECT_BUTTON)) { - sub_80CFDC4(); - return 0; + ToggleCursorAutoAction(); + return INPUT_NONE; } } while (0); - if (retVal != 0) + if (retVal != INPUT_NONE) { - if (retVal != 6) - sub_80CD894(cursorArea, cursorPosition); + if (retVal != INPUT_HIDE_PARTY) + SetCursorPosition(cursorArea, cursorPosition); } return retVal; @@ -7351,64 +7452,64 @@ static u8 HandleInput_OnBox(void) do { - sPSSData->field_CD3 = 0; - sPSSData->field_CD2 = 0; - sPSSData->field_CD7 = 0; + sStorage->cursorHorizontalWrap = 0; + sStorage->cursorVerticalWrap = 0; + sStorage->cursorFlipTimer = 0; if (JOY_REPEAT(DPAD_UP)) { - retVal = 1; + retVal = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_BUTTONS; cursorPosition = 0; - sPSSData->field_CD7 = 1; + sStorage->cursorFlipTimer = 1; break; } else if (JOY_REPEAT(DPAD_DOWN)) { - retVal = 1; + retVal = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_IN_BOX; cursorPosition = 2; break; } if (JOY_HELD(DPAD_LEFT)) - return 10; + return INPUT_SCROLL_LEFT; if (JOY_HELD(DPAD_RIGHT)) - return 9; + return INPUT_SCROLL_RIGHT; if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) { if (JOY_HELD(L_BUTTON)) - return 10; + return INPUT_SCROLL_LEFT; if (JOY_HELD(R_BUTTON)) - return 9; + return INPUT_SCROLL_RIGHT; } if (JOY_NEW(A_BUTTON)) { - sub_80CD1A8(FALSE); - AddBoxMenu(); - return 7; + AnimateBoxScrollArrows(FALSE); + AddBoxOptionsMenu(); + return INPUT_BOX_OPTIONS; } if (JOY_NEW(B_BUTTON)) - return 19; + return INPUT_PRESSED_B; if (JOY_NEW(SELECT_BUTTON)) { - sub_80CFDC4(); - return 0; + ToggleCursorAutoAction(); + return INPUT_NONE; } - retVal = 0; + retVal = INPUT_NONE; } while (0); - if (retVal) + if (retVal != INPUT_NONE) { - if (cursorArea != CURSOR_AREA_BOX) - sub_80CD1A8(FALSE); - sub_80CD894(cursorArea, cursorPosition); + if (cursorArea != CURSOR_AREA_BOX_TITLE) + AnimateBoxScrollArrows(FALSE); + SetCursorPosition(cursorArea, cursorPosition); } return retVal; @@ -7422,65 +7523,67 @@ static u8 HandleInput_OnButtons(void) do { - cursorArea = sBoxCursorArea; - cursorPosition = sBoxCursorPosition; - sPSSData->field_CD3 = 0; - sPSSData->field_CD2 = 0; - sPSSData->field_CD7 = 0; + cursorArea = sCursorArea; + cursorPosition = sCursorPosition; + sStorage->cursorHorizontalWrap = 0; + sStorage->cursorVerticalWrap = 0; + sStorage->cursorFlipTimer = 0; if (JOY_REPEAT(DPAD_UP)) { - retVal = 1; + retVal = INPUT_MOVE_CURSOR; cursorArea = CURSOR_AREA_IN_BOX; - sPSSData->field_CD2 = -1; - if (sBoxCursorPosition == 0) + sStorage->cursorVerticalWrap = -1; + if (sCursorPosition == 0) cursorPosition = IN_BOX_COUNT - 1 - 5; else cursorPosition = IN_BOX_COUNT - 1; - sPSSData->field_CD7 = 1; + sStorage->cursorFlipTimer = 1; break; } if (JOY_REPEAT(DPAD_DOWN | START_BUTTON)) { - retVal = 1; - cursorArea = CURSOR_AREA_BOX; + retVal = INPUT_MOVE_CURSOR; + cursorArea = CURSOR_AREA_BOX_TITLE; cursorPosition = 0; - sPSSData->field_CD7 = 1; + sStorage->cursorFlipTimer = 1; break; } if (JOY_REPEAT(DPAD_LEFT)) { - retVal = 1; + retVal = INPUT_MOVE_CURSOR; if (--cursorPosition < 0) cursorPosition = 1; break; } else if (JOY_REPEAT(DPAD_RIGHT)) { - retVal = 1; + retVal = INPUT_MOVE_CURSOR; if (++cursorPosition > 1) cursorPosition = 0; break; } + // Button was pressed, determine which if (JOY_NEW(A_BUTTON)) - return (cursorPosition == 0) ? 5 : 4; + return (cursorPosition == 0) ? INPUT_SHOW_PARTY : INPUT_CLOSE_BOX; + if (JOY_NEW(B_BUTTON)) - return 19; + return INPUT_PRESSED_B; if (JOY_NEW(SELECT_BUTTON)) { - sub_80CFDC4(); - return 0; + ToggleCursorAutoAction(); + return INPUT_NONE; } - retVal = 0; + retVal = INPUT_NONE; } while (0); - if (retVal != 0) - sub_80CD894(cursorArea, cursorPosition); + if (retVal != INPUT_NONE) + SetCursorPosition(cursorArea, cursorPosition); return retVal; } @@ -7491,255 +7594,262 @@ static u8 HandleInput(void) { u8 (*func)(void); s8 area; - } - static const inputFuncs[] = + } static const inputFuncs[] = { - {HandleInput_InBox, CURSOR_AREA_IN_BOX}, - {HandleInput_InParty, CURSOR_AREA_IN_PARTY}, - {HandleInput_OnBox, CURSOR_AREA_BOX}, + {HandleInput_InBox, CURSOR_AREA_IN_BOX}, + {HandleInput_InParty, CURSOR_AREA_IN_PARTY}, + {HandleInput_OnBox, CURSOR_AREA_BOX_TITLE}, {HandleInput_OnButtons, CURSOR_AREA_BUTTONS}, - {NULL, 0}, + {}, }; u16 i = 0; while (inputFuncs[i].func != NULL) { - if (inputFuncs[i].area == sBoxCursorArea) + if (inputFuncs[i].area == sCursorArea) return inputFuncs[i].func(); i++; } - return 0; + return INPUT_NONE; } -static void AddBoxMenu(void) +static void AddBoxOptionsMenu(void) { InitMenu(); - SetMenuText(9); - SetMenuText(10); - SetMenuText(11); - SetMenuText(0); + SetMenuText(MENU_JUMP); + SetMenuText(MENU_WALLPAPER); + SetMenuText(MENU_NAME); + SetMenuText(MENU_CANCEL); } -static u8 sub_80CFA5C(void) +static u8 SetSelectionMenuTexts(void) { InitMenu(); - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) - return sub_80CFA84(); + if (sStorage->boxOption != OPTION_MOVE_ITEMS) + return SetMenuTexts_Mon(); else - return sub_80CFB44(); + return SetMenuTexts_Item(); } -static bool8 sub_80CFA84(void) +static bool8 SetMenuTexts_Mon(void) { - u16 var0 = sub_80CD504(); + u16 species = GetSpeciesAtCursorPosition(); - switch (sPSSData->boxOption) + switch (sStorage->boxOption) { - case BOX_OPTION_DEPOSIT: - if (var0) - SetMenuText(1); + case OPTION_DEPOSIT: + if (species != SPECIES_NONE) + SetMenuText(MENU_STORE); else return FALSE; break; - case BOX_OPTION_WITHDRAW: - if (var0) - SetMenuText(2); + case OPTION_WITHDRAW: + if (species != SPECIES_NONE) + SetMenuText(MENU_WITHDRAW); else return FALSE; break; - case BOX_OPTION_MOVE_MONS: + case OPTION_MOVE_MONS: if (sIsMonBeingMoved) { - if (var0) - SetMenuText(4); + if (species != SPECIES_NONE) + SetMenuText(MENU_SHIFT); else - SetMenuText(5); + SetMenuText(MENU_PLACE); } else { - if (var0) - SetMenuText(3); + if (species != SPECIES_NONE) + SetMenuText(MENU_MOVE); else return FALSE; } break; - case BOX_OPTION_MOVE_ITEMS: + case OPTION_MOVE_ITEMS: default: return FALSE; } - SetMenuText(6); - if (sPSSData->boxOption == BOX_OPTION_MOVE_MONS) + SetMenuText(MENU_SUMMARY); + if (sStorage->boxOption == OPTION_MOVE_MONS) { - if (!sBoxCursorArea) - SetMenuText(2); + if (sCursorArea == CURSOR_AREA_IN_BOX) + SetMenuText(MENU_WITHDRAW); else - SetMenuText(1); + SetMenuText(MENU_STORE); } - SetMenuText(8); - SetMenuText(7); - SetMenuText(0); + SetMenuText(MENU_MARK); + SetMenuText(MENU_RELEASE); + SetMenuText(MENU_CANCEL); return TRUE; } -static bool8 sub_80CFB44(void) +static bool8 SetMenuTexts_Item(void) { - if (sPSSData->cursorMonSpecies == SPECIES_EGG) + if (sStorage->displayMonSpecies == SPECIES_EGG) return FALSE; - if (!IsActiveItemMoving()) + if (!IsMovingItem()) { - if (sPSSData->cursorMonItem == 0) + if (sStorage->displayMonItemId == ITEM_NONE) { - if (sPSSData->cursorMonSpecies == SPECIES_NONE) + if (sStorage->displayMonSpecies == SPECIES_NONE) return FALSE; - SetMenuText(14); + SetMenuText(MENU_GIVE_2); } else { - if (!ItemIsMail(sPSSData->cursorMonItem)) + if (!ItemIsMail(sStorage->displayMonItemId)) { - SetMenuText(12); - SetMenuText(16); + SetMenuText(MENU_TAKE); + SetMenuText(MENU_BAG); } - SetMenuText(17); + SetMenuText(MENU_INFO); } } else { - if (sPSSData->cursorMonItem == 0) + if (sStorage->displayMonItemId == ITEM_NONE) { - if (sPSSData->cursorMonSpecies == SPECIES_NONE) + if (sStorage->displayMonSpecies == SPECIES_NONE) return FALSE; - SetMenuText(13); + SetMenuText(MENU_GIVE); } else { - if (ItemIsMail(sPSSData->cursorMonItem) == TRUE) + if (ItemIsMail(sStorage->displayMonItemId) == TRUE) return FALSE; - SetMenuText(15); + SetMenuText(MENU_SWITCH); } } - SetMenuText(0); + SetMenuText(MENU_CANCEL); return TRUE; } -static void sub_80CFBF4(struct Sprite *sprite) + +//------------------------------------------------------------------------------ +// SECTION: Cursor +// +// The functions below handle a few of the generic cursor features. +//------------------------------------------------------------------------------ + + +static void SpriteCB_CursorShadow(struct Sprite *sprite) { - sprite->pos1.x = sPSSData->field_CB4->pos1.x; - sprite->pos1.y = sPSSData->field_CB4->pos1.y + 20; + sprite->pos1.x = sStorage->cursorSprite->pos1.x; + sprite->pos1.y = sStorage->cursorSprite->pos1.y + 20; } -static void sub_80CFC14(void) +static void CreateCursorSprites(void) { u16 x, y; u8 spriteId; u8 priority, subpriority; struct SpriteSheet spriteSheets[] = { - {gHandCursorTiles, 0x800, 0}, - {gHandCursorShadowTiles, 0x80, 1}, + {sHandCursor_Gfx, 0x800, GFXTAG_CURSOR}, + {sHandCursorShadow_Gfx, 0x80, GFXTAG_CURSOR_SHADOW}, {} }; struct SpritePalette spritePalettes[] = { - {gHandCursorPalette, TAG_PAL_DAC7}, + {sHandCursor_Pal, PALTAG_MISC_1}, {} }; - static const struct OamData sOamData_857BA0C = + static const struct OamData sOamData_Cursor = { .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, }; - static const struct OamData sOamData_857BA14 = + static const struct OamData sOamData_CursorShadow = { .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 1, }; - static const union AnimCmd sSpriteAnim_857BA1C[] = + static const union AnimCmd sAnim_Cursor_Bouncing[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_FRAME(16, 30), ANIMCMD_JUMP(0) }; - static const union AnimCmd sSpriteAnim_857BA28[] = + static const union AnimCmd sAnim_Cursor_Still[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_END }; - static const union AnimCmd sSpriteAnim_857BA30[] = + static const union AnimCmd sAnim_Cursor_Open[] = { ANIMCMD_FRAME(32, 5), ANIMCMD_END }; - static const union AnimCmd sSpriteAnim_857BA38[] = + static const union AnimCmd sAnim_Cursor_Fist[] = { ANIMCMD_FRAME(48, 5), ANIMCMD_END }; - static const union AnimCmd *const sSpriteAnimTable_857BA40[] = + static const union AnimCmd *const sAnims_Cursor[] = { - sSpriteAnim_857BA1C, - sSpriteAnim_857BA28, - sSpriteAnim_857BA30, - sSpriteAnim_857BA38 + [CURSOR_ANIM_BOUNCE] = sAnim_Cursor_Bouncing, + [CURSOR_ANIM_STILL] = sAnim_Cursor_Still, + [CURSOR_ANIM_OPEN] = sAnim_Cursor_Open, + [CURSOR_ANIM_FIST] = sAnim_Cursor_Fist }; - static const struct SpriteTemplate gSpriteTemplate_857BA50 = + static const struct SpriteTemplate sSpriteTemplate_Cursor = { - .tileTag = TAG_TILE_0, - .paletteTag = TAG_PAL_WAVEFORM, - .oam = &sOamData_857BA0C, - .anims = sSpriteAnimTable_857BA40, + .tileTag = GFXTAG_CURSOR, + .paletteTag = PALTAG_MISC_2, + .oam = &sOamData_Cursor, + .anims = sAnims_Cursor, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; - static const struct SpriteTemplate gSpriteTemplate_857BA68 = + static const struct SpriteTemplate sSpriteTemplate_CursorShadow = { - .tileTag = TAG_TILE_1, - .paletteTag = TAG_PAL_WAVEFORM, - .oam = &sOamData_857BA14, + .tileTag = GFXTAG_CURSOR_SHADOW, + .paletteTag = PALTAG_MISC_2, + .oam = &sOamData_CursorShadow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80CFBF4, + .callback = SpriteCB_CursorShadow, }; LoadSpriteSheets(spriteSheets); LoadSpritePalettes(spritePalettes); - sPSSData->field_CD8[0] = IndexOfSpritePaletteTag(TAG_PAL_WAVEFORM); - sPSSData->field_CD8[1] = IndexOfSpritePaletteTag(TAG_PAL_DAC7); + sStorage->cursorPalNums[0] = IndexOfSpritePaletteTag(PALTAG_MISC_2); // White hand, normal + sStorage->cursorPalNums[1] = IndexOfSpritePaletteTag(PALTAG_MISC_1); // Yellow hand, when auto-action is on - sub_80CD444(sBoxCursorArea, sBoxCursorPosition, &x, &y); - spriteId = CreateSprite(&gSpriteTemplate_857BA50, x, y, 6); + GetCursorCoordsByPos(sCursorArea, sCursorPosition, &x, &y); + spriteId = CreateSprite(&sSpriteTemplate_Cursor, x, y, 6); if (spriteId != MAX_SPRITES) { - sPSSData->field_CB4 = &gSprites[spriteId]; - sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove]; - sPSSData->field_CB4->oam.priority = 1; + sStorage->cursorSprite = &gSprites[spriteId]; + sStorage->cursorSprite->oam.paletteNum = sStorage->cursorPalNums[sAutoActionOn]; + sStorage->cursorSprite->oam.priority = 1; if (sIsMonBeingMoved) - StartSpriteAnim(sPSSData->field_CB4, 3); + StartSpriteAnim(sStorage->cursorSprite, CURSOR_ANIM_FIST); } else { - sPSSData->field_CB4 = NULL; + sStorage->cursorSprite = NULL; } - if (sBoxCursorArea == CURSOR_AREA_IN_PARTY) + if (sCursorArea == CURSOR_AREA_IN_PARTY) { subpriority = 13; priority = 1; @@ -7750,184 +7860,197 @@ static void sub_80CFC14(void) priority = 2; } - spriteId = CreateSprite(&gSpriteTemplate_857BA68, 0, 0, subpriority); + spriteId = CreateSprite(&sSpriteTemplate_CursorShadow, 0, 0, subpriority); if (spriteId != MAX_SPRITES) { - sPSSData->field_CB8 = &gSprites[spriteId]; - sPSSData->field_CB8->oam.priority = priority; - if (sBoxCursorArea) - sPSSData->field_CB8->invisible = 1; + sStorage->cursorShadowSprite = &gSprites[spriteId]; + sStorage->cursorShadowSprite->oam.priority = priority; + if (sCursorArea) + sStorage->cursorShadowSprite->invisible = TRUE; } else { - sPSSData->field_CB8 = NULL; + sStorage->cursorShadowSprite = NULL; } } -static void sub_80CFDC4(void) +static void ToggleCursorAutoAction(void) { - sCanOnlyMove = !sCanOnlyMove; - sPSSData->field_CB4->oam.paletteNum = sPSSData->field_CD8[sCanOnlyMove]; + sAutoActionOn = !sAutoActionOn; + sStorage->cursorSprite->oam.paletteNum = sStorage->cursorPalNums[sAutoActionOn]; } -static u8 GetBoxCursorPosition(void) +static u8 GetCursorPosition(void) { - return sBoxCursorPosition; + return sCursorPosition; } -static void sub_80CFE14(u8 *arg0, u8 *arg1) +static void GetCursorBoxColumnAndRow(u8 *column, u8 *row) { - if (sBoxCursorArea == CURSOR_AREA_IN_BOX) + if (sCursorArea == CURSOR_AREA_IN_BOX) { - *arg0 = sBoxCursorPosition % IN_BOX_ROWS; - *arg1 = sBoxCursorPosition / IN_BOX_ROWS; + *column = sCursorPosition % IN_BOX_COLUMNS; + *row = sCursorPosition / IN_BOX_COLUMNS; } else { - *arg0 = 0; - *arg1 = 0; + *column = 0; + *row = 0; } } -static void sub_80CFE54(u8 animNum) +static void StartCursorAnim(u8 animNum) { - StartSpriteAnim(sPSSData->field_CB4, animNum); + StartSpriteAnim(sStorage->cursorSprite, animNum); } -static u8 sub_80CFE78(void) +// Unused +static u8 GetMovingMonOriginalBoxId(void) { return sMovingMonOrigBoxId; } -static void sub_80CFE84(void) +static void SetCursorPriorityTo1(void) { - sPSSData->field_CB4->oam.priority = 1; + sStorage->cursorSprite->oam.priority = 1; } -static void sub_80CFEA8(void) +static void TryHideItemAtCursor(void) { - if (sBoxCursorArea == CURSOR_AREA_IN_BOX) - sub_80D0E50(CURSOR_AREA_IN_BOX, sBoxCursorPosition); + if (sCursorArea == CURSOR_AREA_IN_BOX) + TryHideItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); } -static void sub_80CFECC(void) +static void TryShowItemAtCursor(void) { - if (sBoxCursorArea == CURSOR_AREA_IN_BOX) - sub_80D0D8C(CURSOR_AREA_IN_BOX, sBoxCursorPosition); + if (sCursorArea == CURSOR_AREA_IN_BOX) + TryLoadItemIconAtPos(CURSOR_AREA_IN_BOX, sCursorPosition); } + +//------------------------------------------------------------------------------ +// SECTION: Menu +// +// The functions below handle the generic options menu that comes up whenever +// something in the PC is selected. +//------------------------------------------------------------------------------ + + static void InitMenu(void) { - sPSSData->menuItemsCount = 0; - sPSSData->menuWidth = 0; - sPSSData->menuWindow.bg = 0; - sPSSData->menuWindow.paletteNum = 15; - sPSSData->menuWindow.baseBlock = 92; -} - -static const u8 *const gUnknown_0857BA80[] = -{ - gPCText_Cancel, - gPCText_Store, - gPCText_Withdraw, - gPCText_Move, - gPCText_Shift, - gPCText_Place, - gPCText_Summary, - gPCText_Release, - gPCText_Mark, - gPCText_Jump, - gPCText_Wallpaper, - gPCText_Name, - gPCText_Take, - gPCText_Give, - gPCText_Give, - gPCText_Switch, - gPCText_Bag, - gPCText_Info, - gPCText_Scenery1, - gPCText_Scenery2, - gPCText_Scenery3, - gPCText_Etcetera, - gPCText_Friends, - gPCText_Forest, - gPCText_City, - gPCText_Desert, - gPCText_Savanna, - gPCText_Crag, - gPCText_Volcano, - gPCText_Snow, - gPCText_Cave, - gPCText_Beach, - gPCText_Seafloor, - gPCText_River, - gPCText_Sky, - gPCText_PolkaDot, - gPCText_Pokecenter, - gPCText_Machine, - gPCText_Simple, + sStorage->menuItemsCount = 0; + sStorage->menuWidth = 0; + sStorage->menuWindow.bg = 0; + sStorage->menuWindow.paletteNum = 15; + sStorage->menuWindow.baseBlock = 92; +} + +static const u8 *const sMenuTexts[] = +{ + [MENU_CANCEL] = gPCText_Cancel, + [MENU_STORE] = gPCText_Store, + [MENU_WITHDRAW] = gPCText_Withdraw, + [MENU_MOVE] = gPCText_Move, + [MENU_SHIFT] = gPCText_Shift, + [MENU_PLACE] = gPCText_Place, + [MENU_SUMMARY] = gPCText_Summary, + [MENU_RELEASE] = gPCText_Release, + [MENU_MARK] = gPCText_Mark, + [MENU_JUMP] = gPCText_Jump, + [MENU_WALLPAPER] = gPCText_Wallpaper, + [MENU_NAME] = gPCText_Name, + [MENU_TAKE] = gPCText_Take, + [MENU_GIVE] = gPCText_Give, + [MENU_GIVE_2] = gPCText_Give, + [MENU_SWITCH] = gPCText_Switch, + [MENU_BAG] = gPCText_Bag, + [MENU_INFO] = gPCText_Info, + [MENU_SCENERY_1] = gPCText_Scenery1, + [MENU_SCENERY_2] = gPCText_Scenery2, + [MENU_SCENERY_3] = gPCText_Scenery3, + [MENU_ETCETERA] = gPCText_Etcetera, + [MENU_FRIENDS] = gPCText_Friends, + [MENU_FOREST] = gPCText_Forest, + [MENU_CITY] = gPCText_City, + [MENU_DESERT] = gPCText_Desert, + [MENU_SAVANNA] = gPCText_Savanna, + [MENU_CRAG] = gPCText_Crag, + [MENU_VOLCANO] = gPCText_Volcano, + [MENU_SNOW] = gPCText_Snow, + [MENU_CAVE] = gPCText_Cave, + [MENU_BEACH] = gPCText_Beach, + [MENU_SEAFLOOR] = gPCText_Seafloor, + [MENU_RIVER] = gPCText_River, + [MENU_SKY] = gPCText_Sky, + [MENU_POLKADOT] = gPCText_PolkaDot, + [MENU_POKECENTER] = gPCText_Pokecenter, + [MENU_MACHINE] = gPCText_Machine, + [MENU_SIMPLE] = gPCText_Simple, }; static void SetMenuText(u8 textId) { - if (sPSSData->menuItemsCount < 7) + if (sStorage->menuItemsCount < ARRAY_COUNT(sStorage->menuItems)) { u8 len; - struct StorageMenu *menu = &sPSSData->menuItems[sPSSData->menuItemsCount]; + struct StorageMenu *menu = &sStorage->menuItems[sStorage->menuItemsCount]; - menu->text = gUnknown_0857BA80[textId]; + menu->text = sMenuTexts[textId]; menu->textId = textId; len = StringLength(menu->text); - if (len > sPSSData->menuWidth) - sPSSData->menuWidth = len; + if (len > sStorage->menuWidth) + sStorage->menuWidth = len; - sPSSData->menuItemsCount++; + sStorage->menuItemsCount++; } } -static s8 sub_80CFF98(u8 arg0) +static s8 GetMenuItemTextId(u8 menuIdx) { - if (arg0 >= sPSSData->menuItemsCount) + if (menuIdx >= sStorage->menuItemsCount) return -1; else - return sPSSData->menuItems[arg0].textId; + return sStorage->menuItems[menuIdx].textId; } static void AddMenu(void) { - sPSSData->menuWindow.width = sPSSData->menuWidth + 2; - sPSSData->menuWindow.height = 2 * sPSSData->menuItemsCount; - sPSSData->menuWindow.tilemapLeft = 29 - sPSSData->menuWindow.width; - sPSSData->menuWindow.tilemapTop = 15 - sPSSData->menuWindow.height; - sPSSData->field_CB0 = AddWindow(&sPSSData->menuWindow); - ClearWindowTilemap(sPSSData->field_CB0); - DrawStdFrameWithCustomTileAndPalette(sPSSData->field_CB0, FALSE, 11, 14); - PrintMenuTable(sPSSData->field_CB0, sPSSData->menuItemsCount, (void*)sPSSData->menuItems); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sPSSData->field_CB0, sPSSData->menuItemsCount, 0); + sStorage->menuWindow.width = sStorage->menuWidth + 2; + sStorage->menuWindow.height = 2 * sStorage->menuItemsCount; + sStorage->menuWindow.tilemapLeft = 29 - sStorage->menuWindow.width; + sStorage->menuWindow.tilemapTop = 15 - sStorage->menuWindow.height; + sStorage->menuWindowId = AddWindow(&sStorage->menuWindow); + ClearWindowTilemap(sStorage->menuWindowId); + DrawStdFrameWithCustomTileAndPalette(sStorage->menuWindowId, FALSE, 11, 14); + PrintMenuTable(sStorage->menuWindowId, sStorage->menuItemsCount, (void*)sStorage->menuItems); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sStorage->menuWindowId, sStorage->menuItemsCount, 0); ScheduleBgCopyTilemapToVram(0); - sPSSData->field_CAE = 0; + sStorage->menuUnusedField = 0; } -static bool8 sub_80D00A8(void) +// Called after AddMenu to determine whether or not the handler callback should +// wait to move on to the next state. Evidently there was no need to wait, and +// now it always returns FALSE +static bool8 IsMenuLoading(void) { return FALSE; } -static s16 sub_80D00AC(void) +static s16 HandleMenuInput(void) { - s32 textId = -2; + s32 input = MENU_NOTHING_CHOSEN; do { if (JOY_NEW(A_BUTTON)) { - textId = Menu_GetCursorPos(); + input = Menu_GetCursorPos(); break; } else if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - textId = -1; + input = MENU_B_PRESSED; } if (JOY_NEW(DPAD_UP)) @@ -7942,26 +8065,32 @@ static s16 sub_80D00AC(void) } } while (0); - if (textId != -2) - sub_80D013C(); + if (input != MENU_NOTHING_CHOSEN) + RemoveMenu(); - if (textId >= 0) - textId = sPSSData->menuItems[textId].textId; + if (input >= 0) + input = sStorage->menuItems[input].textId; - return textId; + return input; } -static void sub_80D013C(void) +static void RemoveMenu(void) { - ClearStdWindowAndFrameToTransparent(sPSSData->field_CB0, TRUE); - RemoveWindow(sPSSData->field_CB0); + ClearStdWindowAndFrameToTransparent(sStorage->menuWindowId, TRUE); + RemoveWindow(sStorage->menuWindowId); } -// The functions below handle moving and grabbing multiple mons at once. -// The icons are converted to background 0 which coordinates are changed while moving mons. -// There is also a bit of math involved in determining how many column/rows of mons to grab/move. -static const struct WindowTemplate gUnknown_0857BB1C = +//------------------------------------------------------------------------------ +// SECTION: MultiMove +// +// The functions below handle moving and selecting multiple Pokémon at once. +// The icon sprites are moved to bg 0, and this bg is manipulated to move +// them as a group. +//------------------------------------------------------------------------------ + + +static const struct WindowTemplate sWindowTemplate_MultiMove = { .bg = 0, .tilemapLeft = 10, @@ -7974,34 +8103,33 @@ static const struct WindowTemplate gUnknown_0857BB1C = EWRAM_DATA static struct { - u8 field_0; + u8 funcId; u8 state; - u8 fromRow; u8 fromColumn; - u8 toRow; + u8 fromRow; u8 toColumn; - u8 field_6; - u8 field_7; - u8 minRow; + u8 toRow; + u8 cursorColumn; + u8 cursorRow; u8 minColumn; + u8 minRow; + u8 columnsTotal; u8 rowsTotal; - u8 columsTotal; u16 bgX; u16 bgY; - u16 field_10; + u16 bgMoveSteps; struct BoxPokemon boxMons[IN_BOX_COUNT]; -} -*sMoveMonsPtr = NULL; +} *sMultiMove = NULL; -static bool8 sub_80D0164(void) +static bool8 MultiMove_Init(void) { - sMoveMonsPtr = Alloc(sizeof(*sMoveMonsPtr)); - if (sMoveMonsPtr != NULL) + sMultiMove = Alloc(sizeof(*sMultiMove)); + if (sMultiMove != NULL) { - sPSSData->field_2200 = AddWindow8Bit(&gUnknown_0857BB1C); - if (sPSSData->field_2200 != 0xFF) + sStorage->multiMoveWindowId = AddWindow8Bit(&sWindowTemplate_MultiMove); + if (sStorage->multiMoveWindowId != WINDOW_NONE) { - FillWindowPixelBuffer(sPSSData->field_2200, PIXEL_FILL(0)); + FillWindowPixelBuffer(sStorage->multiMoveWindowId, PIXEL_FILL(0)); return TRUE; } } @@ -8009,64 +8137,64 @@ static bool8 sub_80D0164(void) return FALSE; } -static void sub_80D01B8(void) +static void MultiMove_Free(void) { - if (sMoveMonsPtr != NULL) - Free(sMoveMonsPtr); + if (sMultiMove != NULL) + Free(sMultiMove); } -static void sub_80D01D0(u8 arg0) +static void MultiMove_SetFunction(u8 id) { - sMoveMonsPtr->field_0 = arg0; - sMoveMonsPtr->state = 0; + sMultiMove->funcId = id; + sMultiMove->state = 0; } -static bool8 sub_80D01E4(void) +// Returns TRUE if the called function has more to do, FALSE otherwise +static bool8 MultiMove_RunFunction(void) { - switch (sMoveMonsPtr->field_0) + switch (sMultiMove->funcId) { - case 0: - return sub_80D024C(); - case 1: - return sub_80D0344(); - case 2: - return sub_80D03B0(); - case 3: - return sub_80D0420(); - case 4: - return sub_80D04A0(); - case 5: - return sub_80D04C8(); + case MULTIMOVE_START: + return MultiMove_Start(); + case MULTIMOVE_CANCEL: + return MultiMove_Cancel(); + case MULTIMOVE_CHANGE_SELECTION: + return MultiMove_ChangeSelection(); + case MULTIMOVE_GRAB_SELECTION: + return MultiMove_GrabSelection(); + case MULTIMOVE_MOVE_MONS: + return MultiMove_MoveMons(); + case MULTIMOVE_PLACE_MONS: + return MultiMove_PlaceMons(); } - return FALSE; } -static bool8 sub_80D024C(void) +static bool8 MultiMove_Start(void) { - switch (sMoveMonsPtr->state) + switch (sMultiMove->state) { case 0: HideBg(0); sub_80D304C(0x80); - sMoveMonsPtr->state++; + sMultiMove->state++; break; case 1: - sub_80CFE14(&sMoveMonsPtr->fromRow, &sMoveMonsPtr->fromColumn); - sMoveMonsPtr->toRow = sMoveMonsPtr->fromRow; - sMoveMonsPtr->toColumn = sMoveMonsPtr->fromColumn; + GetCursorBoxColumnAndRow(&sMultiMove->fromColumn, &sMultiMove->fromRow); + sMultiMove->toColumn = sMultiMove->fromColumn; + sMultiMove->toRow = sMultiMove->fromRow; ChangeBgX(0, -1024, 0); ChangeBgY(0, -1024, 0); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); - FillWindowPixelBuffer8Bit(sPSSData->field_2200, PIXEL_FILL(0)); - sub_80D07B0(sMoveMonsPtr->fromRow, sMoveMonsPtr->fromColumn); + FillWindowPixelBuffer8Bit(sStorage->multiMoveWindowId, PIXEL_FILL(0)); + MultiMove_SetIconToBg(sMultiMove->fromColumn, sMultiMove->fromRow); SetBgAttribute(0, BG_ATTR_PALETTEMODE, 1); - PutWindowTilemap(sPSSData->field_2200); - CopyWindowToVram8Bit(sPSSData->field_2200, 3); + PutWindowTilemap(sStorage->multiMoveWindowId); + CopyWindowToVram8Bit(sStorage->multiMoveWindowId, 3); BlendPalettes(0x3F00, 8, RGB_WHITE); - sub_80CFE54(2); + StartCursorAnim(CURSOR_ANIM_OPEN); SetGpuRegBits(REG_OFFSET_BG0CNT, BGCNT_256COLOR); - sMoveMonsPtr->state++; + sMultiMove->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) @@ -8080,23 +8208,23 @@ static bool8 sub_80D024C(void) return TRUE; } -static bool8 sub_80D0344(void) +static bool8 MultiMove_Cancel(void) { - switch (sMoveMonsPtr->state) + switch (sMultiMove->state) { case 0: HideBg(0); - sMoveMonsPtr->state++; + sMultiMove->state++; break; case 1: - sub_80D0B5C(); - sub_80CFE54(0); - sMoveMonsPtr->state++; + MultiMove_ResetBg(); + StartCursorAnim(CURSOR_ANIM_BOUNCE); + sMultiMove->state++; break; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - sub_80CFE84(); + SetCursorPriorityTo1(); LoadPalette(GetTextWindowPalette(3), 0xD0, 0x20); ShowBg(0); return FALSE; @@ -8107,19 +8235,19 @@ static bool8 sub_80D0344(void) return TRUE; } -static bool8 sub_80D03B0(void) +static bool8 MultiMove_ChangeSelection(void) { - switch (sMoveMonsPtr->state) + switch (sMultiMove->state) { case 0: - if (!sub_80CD554()) + if (!UpdateCursorPos()) { - sub_80CFE14(&sMoveMonsPtr->field_6, &sMoveMonsPtr->field_7); - sub_80D062C(); - sMoveMonsPtr->toRow = sMoveMonsPtr->field_6; - sMoveMonsPtr->toColumn = sMoveMonsPtr->field_7; - CopyWindowToVram8Bit(sPSSData->field_2200, 2); - sMoveMonsPtr->state++; + GetCursorBoxColumnAndRow(&sMultiMove->cursorColumn, &sMultiMove->cursorRow); + MultiMove_UpdateSelectedIcons(); + sMultiMove->toColumn = sMultiMove->cursorColumn; + sMultiMove->toRow = sMultiMove->cursorRow; + CopyWindowToVram8Bit(sStorage->multiMoveWindowId, 2); + sMultiMove->state++; } break; case 1: @@ -8129,207 +8257,198 @@ static bool8 sub_80D03B0(void) return TRUE; } -static bool8 sub_80D0420(void) +static bool8 MultiMove_GrabSelection(void) { - u8 var1, var2; + bool8 movingBg, movingMon; - switch (sMoveMonsPtr->state) + switch (sMultiMove->state) { case 0: - sub_80D08CC(); - sub_80D09A4(); - sub_80CDC64(FALSE); - sMoveMonsPtr->state++; + MultiMove_GetMonsFromSelection(); + MultiMove_RemoveMonsFromBox(); + InitMultiMonPlaceChange(FALSE); + sMultiMove->state++; break; case 1: if (!DoMonPlaceChange()) { - sub_80CFE54(3); - sub_80D0884(0, 256, 8); - sub_80CDC64(TRUE); - sMoveMonsPtr->state++; + StartCursorAnim(CURSOR_ANIM_FIST); + MultiMove_InitMove(0, 256, 8); + InitMultiMonPlaceChange(TRUE); + sMultiMove->state++; } break; case 2: - var1 = sub_80D0894(); - var2 = DoMonPlaceChange(); - if (!var1 && !var2) - return FALSE; + movingBg = MultiMove_UpdateMove(); + movingMon = DoMonPlaceChange(); + if (!movingBg && !movingMon) + return FALSE; // Finished break; } return TRUE; } -static bool8 sub_80D04A0(void) +static bool8 MultiMove_MoveMons(void) { - u8 var1 = sub_80CD554(); - u8 var2 = sub_80D0894(); + bool8 movingCursor = UpdateCursorPos(); + bool8 movingBg = MultiMove_UpdateMove(); - if (!var1 && !var2) + if (!movingCursor && !movingBg) return FALSE; else return TRUE; } -static bool8 sub_80D04C8(void) +static bool8 MultiMove_PlaceMons(void) { - switch (sMoveMonsPtr->state) + switch (sMultiMove->state) { case 0: - sub_80D0AAC(); - sub_80D0884(0, -256, 8); - sub_80CDC64(FALSE); - sMoveMonsPtr->state++; + MultiMove_SetPlacedMonData(); + MultiMove_InitMove(0, -256, 8); + InitMultiMonPlaceChange(FALSE); + sMultiMove->state++; break; case 1: - if (!DoMonPlaceChange() && !sub_80D0894()) + if (!DoMonPlaceChange() && !MultiMove_UpdateMove()) { - sub_80D0A1C(); - sub_80CFE54(2); - sub_80CDC64(TRUE); + MultiMove_CreatePlacedMonIcons(); + StartCursorAnim(CURSOR_ANIM_OPEN); + InitMultiMonPlaceChange(TRUE); HideBg(0); - sMoveMonsPtr->state++; + sMultiMove->state++; } break; case 2: if (!DoMonPlaceChange()) { - sub_80CFE54(0); - sub_80D0B5C(); - sMoveMonsPtr->state++; + StartCursorAnim(CURSOR_ANIM_BOUNCE); + MultiMove_ResetBg(); + sMultiMove->state++; } break; case 3: if (!IsDma3ManagerBusyWithBgCopy()) { LoadPalette(GetTextWindowPalette(3), 0xD0, 0x20); - sub_80CFE84(); + SetCursorPriorityTo1(); ShowBg(0); return FALSE; } break; } - return TRUE; } -static bool8 sub_80D0580(u8 arg0) +// Returns TRUE if the movement was successful, FALSE otherwise +static bool8 MultiMove_TryMoveGroup(u8 dir) { - switch (arg0) + switch (dir) { - case 0: - if (sMoveMonsPtr->minColumn == 0) + case 0: // Up + if (sMultiMove->minRow == 0) return FALSE; - sMoveMonsPtr->minColumn--; - sub_80D0884(0, 1024, 6); + sMultiMove->minRow--; + MultiMove_InitMove(0, 1024, 6); break; - case 1: - if (sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal >= 5) + case 1: // Down + if (sMultiMove->minRow + sMultiMove->rowsTotal >= IN_BOX_ROWS) return FALSE; - sMoveMonsPtr->minColumn++; - sub_80D0884(0, -1024, 6); + sMultiMove->minRow++; + MultiMove_InitMove(0, -1024, 6); break; - case 2: - if (sMoveMonsPtr->minRow == 0) + case 2: // Left + if (sMultiMove->minColumn == 0) return FALSE; - sMoveMonsPtr->minRow--; - sub_80D0884(1024, 0, 6); + sMultiMove->minColumn--; + MultiMove_InitMove(1024, 0, 6); break; - case 3: - if (sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal > 5) + case 3: // Right + if (sMultiMove->minColumn + sMultiMove->columnsTotal >= IN_BOX_COLUMNS) return FALSE; - sMoveMonsPtr->minRow++; - sub_80D0884(-1024, 0, 6); + sMultiMove->minColumn++; + MultiMove_InitMove(-1024, 0, 6); break; } - return TRUE; } -static void sub_80D062C(void) +static void MultiMove_UpdateSelectedIcons(void) { - s16 var = (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->field_6)) - (abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow)); - s16 var2 = (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->field_7)) - (abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn)); + s16 columnChange = (abs(sMultiMove->fromColumn - sMultiMove->cursorColumn)) - (abs(sMultiMove->fromColumn - sMultiMove->toColumn)); + s16 rowChange = (abs(sMultiMove->fromRow - sMultiMove->cursorRow)) - (abs(sMultiMove->fromRow - sMultiMove->toRow)); - if (var > 0) - sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); + if (columnChange > 0) + MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); - if (var < 0) + if (columnChange < 0) { - sub_80D0740(sMoveMonsPtr->toRow, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); - sub_80D06D0(sMoveMonsPtr->field_6, sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); + MultiMove_DeselectColumn(sMultiMove->toColumn, sMultiMove->fromRow, sMultiMove->toRow); + MultiMove_SelectColumn(sMultiMove->cursorColumn, sMultiMove->fromRow, sMultiMove->toRow); } - if (var2 > 0) - sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); + if (rowChange > 0) + MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); - if (var2 < 0) + if (rowChange < 0) { - sub_80D0778(sMoveMonsPtr->toColumn, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); - sub_80D0708(sMoveMonsPtr->field_7, sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); + MultiMove_DeselectRow(sMultiMove->toRow, sMultiMove->fromColumn, sMultiMove->toColumn); + MultiMove_SelectRow(sMultiMove->cursorRow, sMultiMove->fromColumn, sMultiMove->toColumn); } } -static void sub_80D06D0(u8 arg0, u8 arg1, u8 arg2) +static void MultiMove_SelectColumn(u8 column, u8 minRow, u8 maxRow) { - u8 var1 = arg1; - - if (arg1 > arg2) + if (minRow > maxRow) { - arg1 = arg2; - arg2 = var1; + u8 temp; + SWAP(minRow, maxRow, temp); } - while (arg1 <= arg2) - sub_80D07B0(arg0, arg1++); + while (minRow <= maxRow) + MultiMove_SetIconToBg(column, minRow++); } -static void sub_80D0708(u8 arg0, u8 arg1, u8 arg2) +static void MultiMove_SelectRow(u8 row, u8 minColumn, u8 maxColumn) { - u8 var1 = arg1; - - if (arg1 > arg2) + if (minColumn > maxColumn) { - arg1 = arg2; - arg2 = var1; + u8 temp; + SWAP(minColumn, maxColumn, temp); } - while (arg1 <= arg2) - sub_80D07B0(arg1++, arg0); + while (minColumn <= maxColumn) + MultiMove_SetIconToBg(minColumn++, row); } -static void sub_80D0740(u8 arg0, u8 arg1, u8 arg2) +static void MultiMove_DeselectColumn(u8 column, u8 minRow, u8 maxRow) { - u8 var1 = arg1; - - if (arg1 > arg2) + if (minRow > maxRow) { - arg1 = arg2; - arg2 = var1; + u8 temp; + SWAP(minRow, maxRow, temp); } - while (arg1 <= arg2) - sub_80D0834(arg0, arg1++); + while (minRow <= maxRow) + MultiMove_ClearIconFromBg(column, minRow++); } -static void sub_80D0778(u8 arg0, u8 arg1, u8 arg2) +static void MultiMove_DeselectRow(u8 row, u8 minColumn, u8 maxColumn) { - u8 var1 = arg1; - - if (arg1 > arg2) + if (minColumn > maxColumn) { - arg1 = arg2; - arg2 = var1; + u8 temp; + SWAP(minColumn, maxColumn, temp); } - while (arg1 <= arg2) - sub_80D0834(arg1++, arg0); + while (minColumn <= maxColumn) + MultiMove_ClearIconFromBg(minColumn++, row); } -static void sub_80D07B0(u8 arg0, u8 arg1) +static void MultiMove_SetIconToBg(u8 x, u8 y) { - u8 position = arg0 + (6 * arg1); + u8 position = x + (IN_BOX_COLUMNS * y); u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); u32 personality = GetCurrentBoxMonData(position, MON_DATA_PERSONALITY); @@ -8338,95 +8457,102 @@ static void sub_80D07B0(u8 arg0, u8 arg1) const u8 *iconGfx = GetMonIconPtr(species, personality, 1); u8 index = GetValidMonIconPalIndex(species) + 8; - BlitBitmapRectToWindow4BitTo8Bit(sPSSData->field_2200, + BlitBitmapRectToWindow4BitTo8Bit(sStorage->multiMoveWindowId, iconGfx, 0, 0, 32, 32, - 24 * arg0, - 24 * arg1, + 24 * x, + 24 * y, 32, 32, index); } } -static void sub_80D0834(u8 arg0, u8 arg1) +static void MultiMove_ClearIconFromBg(u8 x, u8 y) { - u8 position = arg0 + (6 * arg1); + u8 position = x + (IN_BOX_COLUMNS * y); u16 species = GetCurrentBoxMonData(position, MON_DATA_SPECIES2); if (species != SPECIES_NONE) { - FillWindowPixelRect8Bit(sPSSData->field_2200, + FillWindowPixelRect8Bit(sStorage->multiMoveWindowId, PIXEL_FILL(0), - 24 * arg0, - 24 * arg1, + 24 * x, + 24 * y, 32, 32); } } -static void sub_80D0884(u16 arg0, u16 arg1, u16 arg2) +static void MultiMove_InitMove(u16 x, u16 y, u16 arg2) { - sMoveMonsPtr->bgX = arg0; - sMoveMonsPtr->bgY = arg1; - sMoveMonsPtr->field_10 = arg2; + sMultiMove->bgX = x; + sMultiMove->bgY = y; + sMultiMove->bgMoveSteps = arg2; } -static u8 sub_80D0894(void) +static u8 MultiMove_UpdateMove(void) { - if (sMoveMonsPtr->field_10 != 0) + if (sMultiMove->bgMoveSteps != 0) { - ChangeBgX(0, sMoveMonsPtr->bgX, 1); - ChangeBgY(0, sMoveMonsPtr->bgY, 1); - sMoveMonsPtr->field_10--; + ChangeBgX(0, sMultiMove->bgX, 1); + ChangeBgY(0, sMultiMove->bgY, 1); + sMultiMove->bgMoveSteps--; } - return sMoveMonsPtr->field_10; + return sMultiMove->bgMoveSteps; } -static void sub_80D08CC(void) +// Store the Pokémon that the player is picking up +static void MultiMove_GetMonsFromSelection(void) { - s32 i, j, r8, r9; - s32 rowCount, columnCount; + s32 i, j; + s32 columnCount, rowCount; u8 boxId; u8 monArrayId; - sMoveMonsPtr->minRow = min(sMoveMonsPtr->fromRow, sMoveMonsPtr->toRow); - sMoveMonsPtr->minColumn = min(sMoveMonsPtr->fromColumn, sMoveMonsPtr->toColumn); - sMoveMonsPtr->rowsTotal = abs(sMoveMonsPtr->fromRow - sMoveMonsPtr->toRow) + 1; - sMoveMonsPtr->columsTotal = abs(sMoveMonsPtr->fromColumn - sMoveMonsPtr->toColumn) + 1; + sMultiMove->minColumn = min(sMultiMove->fromColumn, sMultiMove->toColumn); + sMultiMove->minRow = min(sMultiMove->fromRow, sMultiMove->toRow); + sMultiMove->columnsTotal = abs(sMultiMove->fromColumn - sMultiMove->toColumn) + 1; + sMultiMove->rowsTotal = abs(sMultiMove->fromRow - sMultiMove->toRow) + 1; boxId = StorageGetCurrentBox(); monArrayId = 0; - rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; - columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; - for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; + for (i = sMultiMove->minRow; i < rowCount; i++) { - u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; - for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) { struct BoxPokemon *boxMon = GetBoxedMonPtr(boxId, boxPosition); + // UB: possible null dereference +#ifdef UBFIX + if (boxMon != NULL) +#endif + sMultiMove->boxMons[monArrayId] = *boxMon; - sMoveMonsPtr->boxMons[monArrayId] = *boxMon; monArrayId++; boxPosition++; } } } -static void sub_80D09A4(void) +// The Pokémon the player has picked up have been stored, now delete +// them from their original positions +static void MultiMove_RemoveMonsFromBox(void) { s32 i, j; - s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; - s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 boxId = StorageGetCurrentBox(); - for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + for (i = sMultiMove->minRow; i < rowCount; i++) { - u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; - for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) { DestroyBoxMonIconAtPosition(boxPosition); ZeroBoxMonAt(boxId, boxPosition); @@ -8435,48 +8561,48 @@ static void sub_80D09A4(void) } } -static void sub_80D0A1C(void) +static void MultiMove_CreatePlacedMonIcons(void) { s32 i, j; - s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; - s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 monArrayId = 0; - for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + for (i = sMultiMove->minRow; i < rowCount; i++) { - u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; - for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) { - if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) - sub_80CB140(boxPosition); + if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) + CreateBoxMonIconAtPos(boxPosition); monArrayId++; boxPosition++; } } } -static void sub_80D0AAC(void) +static void MultiMove_SetPlacedMonData(void) { s32 i, j; - s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; - s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 boxId = StorageGetCurrentBox(); u8 monArrayId = 0; - for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + for (i = sMultiMove->minRow; i < rowCount; i++) { - u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; - for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) { - if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) - SetBoxMonAt(boxId, boxPosition, &sMoveMonsPtr->boxMons[monArrayId]); + if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES)) + SetBoxMonAt(boxId, boxPosition, &sMultiMove->boxMons[monArrayId]); boxPosition++; monArrayId++; } } } -static void sub_80D0B5C(void) +static void MultiMove_ResetBg(void) { ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); @@ -8486,24 +8612,24 @@ static void sub_80D0B5C(void) CopyBgTilemapBufferToVram(0); } -static u8 sub_80D0BA4(void) +static u8 MultiMove_GetOrigin(void) { - return (IN_BOX_ROWS * sMoveMonsPtr->fromColumn) + sMoveMonsPtr->fromRow; + return (IN_BOX_COLUMNS * sMultiMove->fromRow) + sMultiMove->fromColumn; } -static bool8 sub_80D0BC0(void) +static bool8 MultiMove_CanPlaceSelection(void) { s32 i, j; - s32 rowCount = sMoveMonsPtr->minRow + sMoveMonsPtr->rowsTotal; - s32 columnCount = sMoveMonsPtr->minColumn + sMoveMonsPtr->columsTotal; + s32 columnCount = sMultiMove->minColumn + sMultiMove->columnsTotal; + s32 rowCount = sMultiMove->minRow + sMultiMove->rowsTotal; u8 monArrayId = 0; - for (i = sMoveMonsPtr->minColumn; i < columnCount; i++) + for (i = sMultiMove->minRow; i < rowCount; i++) { - u8 boxPosition = (IN_BOX_ROWS * i) + sMoveMonsPtr->minRow; - for (j = sMoveMonsPtr->minRow; j < rowCount; j++) + u8 boxPosition = (IN_BOX_COLUMNS * i) + sMultiMove->minColumn; + for (j = sMultiMove->minColumn; j < columnCount; j++) { - if (GetBoxMonData(&sMoveMonsPtr->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES) + if (GetBoxMonData(&sMultiMove->boxMons[monArrayId], MON_DATA_SANITY_HAS_SPECIES) && GetCurrentBoxMonData(boxPosition, MON_DATA_SANITY_HAS_SPECIES)) return FALSE; @@ -8511,13 +8637,20 @@ static bool8 sub_80D0BC0(void) boxPosition++; } } - return TRUE; } -static const u32 gUnknown_0857BB24[] = INCBIN_U32("graphics/pokemon_storage/unknown_frame.4bpp"); -static const struct OamData sOamData_857BBA4 = +//------------------------------------------------------------------------------ +// SECTION: Item mode +// +// The functions below handle the Move Items mode +//------------------------------------------------------------------------------ + + +static const u32 sItemInfoFrame_Gfx[] = INCBIN_U32("graphics/pokemon_storage/item_info_frame.4bpp"); + +static const struct OamData sOamData_ItemIcon = { .y = 0, .affineMode = ST_OAM_AFFINE_NORMAL, @@ -8534,27 +8667,27 @@ static const struct OamData sOamData_857BBA4 = .affineParam = 0 }; -static const union AffineAnimCmd sSpriteAffineAnim_857BBAC[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_Small[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_857BBBC[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_Appear[] = { AFFINEANIMCMD_FRAME(88, 88, 0, 0), AFFINEANIMCMD_FRAME(5, 5, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_857BBD4[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_Disappear[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(-5, -5, 0, 8), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_857BBEC[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_PickUp[] = { AFFINEANIMCMD_FRAME(128, 128, 0, 0), AFFINEANIMCMD_FRAME(10, 10, 0, 12), @@ -8562,7 +8695,7 @@ static const union AffineAnimCmd sSpriteAffineAnim_857BBEC[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_857BC0C[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_PutDown[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(-10, -10, 0, 12), @@ -8570,99 +8703,82 @@ static const union AffineAnimCmd sSpriteAffineAnim_857BC0C[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_857BC2C[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_PutAway[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(-5, -5, 0, 16), AFFINEANIMCMD_END }; -static const union AffineAnimCmd sSpriteAffineAnim_857BC44[] = +static const union AffineAnimCmd sAffineAnim_ItemIcon_Large[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_857BC44[] = +static const union AffineAnimCmd *const sAffineAnims_ItemIcon[] = { - sSpriteAffineAnim_857BBAC, - sSpriteAffineAnim_857BBBC, - sSpriteAffineAnim_857BBD4, - sSpriteAffineAnim_857BBEC, - sSpriteAffineAnim_857BC0C, - sSpriteAffineAnim_857BC2C, - sSpriteAffineAnim_857BC44 + [ITEM_ANIM_NONE] = sAffineAnim_ItemIcon_Small, + [ITEM_ANIM_APPEAR] = sAffineAnim_ItemIcon_Appear, + [ITEM_ANIM_DISAPPEAR] = sAffineAnim_ItemIcon_Disappear, + [ITEM_ANIM_PICK_UP] = sAffineAnim_ItemIcon_PickUp, + [ITEM_ANIM_PUT_DOWN] = sAffineAnim_ItemIcon_PutDown, + [ITEM_ANIM_PUT_AWAY] = sAffineAnim_ItemIcon_PutAway, + [ITEM_ANIM_LARGE] = sAffineAnim_ItemIcon_Large }; -static const struct SpriteTemplate gSpriteTemplate_857BC70 = +static const struct SpriteTemplate sSpriteTemplate_ItemIcon = { - .tileTag = TAG_TILE_7, - .paletteTag = TAG_PAL_DACB, - .oam = &sOamData_857BBA4, + .tileTag = GFXTAG_ITEM_ICON_0, + .paletteTag = PALTAG_ITEM_ICON_0, + .oam = &sOamData_ItemIcon, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = sSpriteAffineAnimTable_857BC44, + .affineAnims = sAffineAnims_ItemIcon, .callback = SpriteCallbackDummy, }; -static void sub_80D0C60(void) +static void CreateItemIconSprites(void) { s32 i; u8 spriteId; struct CompressedSpriteSheet spriteSheet; struct SpriteTemplate spriteTemplate; - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { - spriteSheet.data = gUnknown_03000F78; + spriteSheet.data = sItemIconGfxBuffer; spriteSheet.size = 0x200; - spriteTemplate = gSpriteTemplate_857BC70; + spriteTemplate = sSpriteTemplate_ItemIcon; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - spriteSheet.tag = TAG_TILE_7 + i; + spriteSheet.tag = GFXTAG_ITEM_ICON_0 + i; LoadCompressedSpriteSheet(&spriteSheet); - sPSSData->field_2204[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0); - sPSSData->field_2204[i].palIndex = AllocSpritePalette(TAG_PAL_DACB + i); - sPSSData->field_2204[i].palIndex *= 16; - sPSSData->field_2204[i].palIndex += 0x100; - spriteTemplate.tileTag = TAG_TILE_7 + i; - spriteTemplate.paletteTag = TAG_PAL_DACB + i; + sStorage->itemIcons[i].tiles = GetSpriteTileStartByTag(spriteSheet.tag) * 32 + (void*)(OBJ_VRAM0); + sStorage->itemIcons[i].palIndex = AllocSpritePalette(PALTAG_ITEM_ICON_0 + i); + sStorage->itemIcons[i].palIndex *= 16; + sStorage->itemIcons[i].palIndex += 0x100; + spriteTemplate.tileTag = GFXTAG_ITEM_ICON_0 + i; + spriteTemplate.paletteTag = PALTAG_ITEM_ICON_0 + i; spriteId = CreateSprite(&spriteTemplate, 0, 0, 11); - sPSSData->field_2204[i].sprite = &gSprites[spriteId]; - sPSSData->field_2204[i].sprite->invisible = TRUE; - sPSSData->field_2204[i].unk10 = 0; - } - } - sPSSData->movingItem = 0; -} - -// The functions below handle new features of MOVE_ITEMS box option. -static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos); -static const u32 *GetItemIconPic(u16 itemId); -static const u32 *GetItemIconPalette(u16 itemId); -static u8 sub_80D12E8(void); -static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos); -static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal); -static void sub_80D15D4(u8 id, u8 animNum); -static void sub_80D1740(u8 id, bool8 arg1); -static u8 sub_80D1370(u8 cursorArea, u8 cursorPos); -static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3); -static void sub_80D1AD8(struct Sprite *sprite); -static void sub_80D1A48(struct Sprite *sprite); -static void sub_80D1A74(struct Sprite *sprite); -static void sub_80D1B14(struct Sprite *sprite); -static void sub_80D1B94(struct Sprite *sprite); -static void sub_80D1CCC(struct Sprite *sprite); -static void sub_80D1C30(struct Sprite *sprite); - -static void sub_80D0D8C(u8 cursorArea, u8 cursorPos) + sStorage->itemIcons[i].sprite = &gSprites[spriteId]; + sStorage->itemIcons[i].sprite->invisible = TRUE; + sStorage->itemIcons[i].active = FALSE; + } + } + sStorage->movingItemId = ITEM_NONE; +} + +static void TryLoadItemIconAtPos(u8 cursorArea, u8 cursorPos) { u16 heldItem; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - if (sub_80D1324(cursorArea, cursorPos)) + + // If we've already loaded the item here, stop + if (IsItemIconAtPosition(cursorArea, cursorPos)) return; switch (cursorArea) @@ -8681,381 +8797,389 @@ static void sub_80D0D8C(u8 cursorArea, u8 cursorPos) return; } - if (heldItem != 0) + if (heldItem != ITEM_NONE) { const u32 *tiles = GetItemIconPic(heldItem); const u32 *pal = GetItemIconPalette(heldItem); - u8 id = sub_80D12E8(); + u8 id = GetNewItemIconIdx(); - sub_80D140C(id, cursorArea, cursorPos); - sub_80D1524(id, tiles, pal); - sub_80D15D4(id, 1); - sub_80D1740(id, TRUE); + SetItemIconPosition(id, cursorArea, cursorPos); + LoadItemIconGfx(id, tiles, pal); + SetItemIconAffineAnim(id, ITEM_ANIM_APPEAR); + SetItemIconActive(id, TRUE); } } -static void sub_80D0E50(u8 cursorArea, u8 cursorPos) +static void TryHideItemIconAtPos(u8 cursorArea, u8 cursorPos) { u8 id; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - id = sub_80D1370(cursorArea, cursorPos); - sub_80D15D4(id, 2); - sub_80D1604(id, 0, cursorArea, cursorPos); + id = GetItemIconIdxByPosition(cursorArea, cursorPos); + SetItemIconAffineAnim(id, ITEM_ANIM_DISAPPEAR); + SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, cursorArea, cursorPos); } -static void Item_FromMonToMoving(u8 cursorArea, u8 cursorPos) +static void TakeItemFromMon(u8 cursorArea, u8 cursorPos) { u8 id; - u16 item; + u16 itemId; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - id = sub_80D1370(cursorArea, cursorPos); - item = 0; - sub_80D15D4(id, 3); - sub_80D1604(id, 1, cursorArea, cursorPos); - sub_80D140C(id, 2, 0); - if (cursorArea == CURSOR_AREA_IN_BOX) + id = GetItemIconIdxByPosition(cursorArea, cursorPos); + itemId = ITEM_NONE; + SetItemIconAffineAnim(id, ITEM_ANIM_PICK_UP); + SetItemIconCallback(id, ITEM_CB_TO_HAND, cursorArea, cursorPos); + SetItemIconPosition(id, CURSOR_AREA_IN_HAND, 0); + if (cursorArea == CURSOR_AREA_IN_BOX) { - SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item); + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &itemId); SetBoxMonIconObjMode(cursorPos, 1); } else { - SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item); + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &itemId); SetPartyMonIconObjMode(cursorPos, 1); } - sPSSData->movingItem = sPSSData->cursorMonItem; + sStorage->movingItemId = sStorage->displayMonItemId; } -static void sub_80D0F38(u16 item) +static void InitItemIconInCursor(u16 itemId) { - const u32 *tiles = GetItemIconPic(item); - const u32 *pal = GetItemIconPalette(item); - u8 id = sub_80D12E8(); - - sub_80D1524(id, tiles, pal); - sub_80D15D4(id, 6); - sub_80D1604(id, 1, 0, 0); - sub_80D140C(id, 2, 0); - sub_80D1740(id, TRUE); - sPSSData->movingItem = item; + const u32 *tiles = GetItemIconPic(itemId); + const u32 *pal = GetItemIconPalette(itemId); + u8 id = GetNewItemIconIdx(); + LoadItemIconGfx(id, tiles, pal); + SetItemIconAffineAnim(id, ITEM_ANIM_LARGE); + SetItemIconCallback(id, ITEM_CB_TO_HAND, CURSOR_AREA_IN_BOX, 0); + SetItemIconPosition(id, CURSOR_AREA_IN_HAND, 0); + SetItemIconActive(id, TRUE); + sStorage->movingItemId = itemId; } -static void Item_SwitchMonsWithMoving(u8 cursorArea, u8 cursorPos) +static void SwapItemsWithMon(u8 cursorArea, u8 cursorPos) { u8 id; - u16 item; + u16 itemId; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - id = sub_80D1370(cursorArea, cursorPos); - sub_80D15D4(id, 3); - sub_80D1604(id, 3, 2, 0); + id = GetItemIconIdxByPosition(cursorArea, cursorPos); + SetItemIconAffineAnim(id, ITEM_ANIM_PICK_UP); + SetItemIconCallback(id, ITEM_CB_SWAP_TO_HAND, CURSOR_AREA_IN_HAND, 0); if (cursorArea == CURSOR_AREA_IN_BOX) { - item = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); - SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem); - sPSSData->movingItem = item; + itemId = GetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM); + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sStorage->movingItemId); + sStorage->movingItemId = itemId; } else { - item = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); - SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem); - sPSSData->movingItem = item; + itemId = GetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM); + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sStorage->movingItemId); + sStorage->movingItemId = itemId; } - id = sub_80D1370(2, 0); - sub_80D15D4(id, 4); - sub_80D1604(id, 4, cursorArea, cursorPos); + id = GetItemIconIdxByPosition(CURSOR_AREA_IN_HAND, 0); + SetItemIconAffineAnim(id, ITEM_ANIM_PUT_DOWN); + SetItemIconCallback(id, ITEM_CB_SWAP_TO_MON, cursorArea, cursorPos); } -static void Item_GiveMovingToMon(u8 cursorArea, u8 cursorPos) +static void GiveItemToMon(u8 cursorArea, u8 cursorPos) { u8 id; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - id = sub_80D1370(2, 0); - sub_80D15D4(id, 4); - sub_80D1604(id, 2, cursorArea, cursorPos); + id = GetItemIconIdxByPosition(CURSOR_AREA_IN_HAND, 0); + SetItemIconAffineAnim(id, ITEM_ANIM_PUT_DOWN); + SetItemIconCallback(id, ITEM_CB_TO_MON, cursorArea, cursorPos); if (cursorArea == CURSOR_AREA_IN_BOX) { - SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sPSSData->movingItem); + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &sStorage->movingItemId); SetBoxMonIconObjMode(cursorPos, 0); } else { - SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sPSSData->movingItem); + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &sStorage->movingItemId); SetPartyMonIconObjMode(cursorPos, 0); } } -static void Item_TakeMons(u8 cursorArea, u8 cursorPos) +static void MoveItemFromMonToBag(u8 cursorArea, u8 cursorPos) { u8 id; - u16 item; + u16 itemId; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - item = 0; - id = sub_80D1370(cursorArea, cursorPos); - sub_80D15D4(id, 2); - sub_80D1604(id, 0, cursorArea, cursorPos); - if (cursorArea == CURSOR_AREA_IN_BOX) + itemId = ITEM_NONE; + id = GetItemIconIdxByPosition(cursorArea, cursorPos); + SetItemIconAffineAnim(id, ITEM_ANIM_DISAPPEAR); + SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, cursorArea, cursorPos); + if (cursorArea == CURSOR_AREA_IN_BOX) { - SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &item); + SetCurrentBoxMonData(cursorPos, MON_DATA_HELD_ITEM, &itemId); SetBoxMonIconObjMode(cursorPos, 1); } else { - SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &item); + SetMonData(&gPlayerParty[cursorPos], MON_DATA_HELD_ITEM, &itemId); SetPartyMonIconObjMode(cursorPos, 1); } } -static void sub_80D1194(void) +static void MoveItemFromCursorToBag(void) { - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { - u8 id = sub_80D1370(2, 0); - sub_80D15D4(id, 5); - sub_80D1604(id, 0, 2, 0); + u8 id = GetItemIconIdxByPosition(CURSOR_AREA_IN_HAND, 0); + SetItemIconAffineAnim(id, ITEM_ANIM_PUT_AWAY); + SetItemIconCallback(id, ITEM_CB_WAIT_ANIM, CURSOR_AREA_IN_HAND, 0); } } -static void sub_80D11CC(void) +// The party menu is being closed, if the cursor is on +// a Pokémon that has a held item make sure it slides +// up along with the closing menu. +static void MoveHeldItemWithPartyMenu(void) { s32 i; - if (sPSSData->boxOption != BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption != OPTION_MOVE_ITEMS) return; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 1) - sub_80D1604(i, 7, 2, 0); + if (sStorage->itemIcons[i].active + && sStorage->itemIcons[i].area == CURSOR_AREA_IN_PARTY) + SetItemIconCallback(i, ITEM_CB_HIDE_PARTY, CURSOR_AREA_IN_HAND, 0); } } -static bool8 sub_80D1218(void) +static bool8 IsItemIconAnimActive(void) { s32 i; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10) + if (sStorage->itemIcons[i].active) { - if (!sPSSData->field_2204[i].sprite->affineAnimEnded && sPSSData->field_2204[i].sprite->affineAnimBeginning) + if (!sStorage->itemIcons[i].sprite->affineAnimEnded + && sStorage->itemIcons[i].sprite->affineAnimBeginning) return TRUE; - if (sPSSData->field_2204[i].sprite->callback != SpriteCallbackDummy && sPSSData->field_2204[i].sprite->callback != sub_80D1AD8) + if (sStorage->itemIcons[i].sprite->callback != SpriteCallbackDummy + && sStorage->itemIcons[i].sprite->callback != SpriteCB_ItemIcon_SetPosToCursor) return TRUE; } } - return FALSE; } -static bool8 IsActiveItemMoving(void) +static bool8 IsMovingItem(void) { s32 i; - if (sPSSData->boxOption == BOX_OPTION_MOVE_ITEMS) + if (sStorage->boxOption == OPTION_MOVE_ITEMS) { - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10 && sPSSData->field_2204[i].unk8 == 2) + if (sStorage->itemIcons[i].active + && sStorage->itemIcons[i].area == CURSOR_AREA_IN_HAND) return TRUE; } } - return FALSE; } static const u8 *GetMovingItemName(void) { - return ItemId_GetName(sPSSData->movingItem); + return ItemId_GetName(sStorage->movingItemId); } -static u16 GetMovingItem(void) +static u16 GetMovingItemId(void) { - return sPSSData->movingItem; + return sStorage->movingItemId; } -static u8 sub_80D12E8(void) +static u8 GetNewItemIconIdx(void) { u8 i; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10 == 0) + if (!sStorage->itemIcons[i].active) { - sPSSData->field_2204[i].unk10 = 1; + sStorage->itemIcons[i].active = TRUE; return i; } } - - return 3; + return MAX_ITEM_ICONS; } -static bool32 sub_80D1324(u8 cursorArea, u8 cursorPos) +static bool32 IsItemIconAtPosition(u8 cursorArea, u8 cursorPos) { s32 i; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10 - && sPSSData->field_2204[i].unk8 == cursorArea - && sPSSData->field_2204[i].unk9 == cursorPos) + if (sStorage->itemIcons[i].active + && sStorage->itemIcons[i].area == cursorArea + && sStorage->itemIcons[i].pos == cursorPos) return TRUE; } - return FALSE; } -static u8 sub_80D1370(u8 cursorArea, u8 cursorPos) +static u8 GetItemIconIdxByPosition(u8 cursorArea, u8 cursorPos) { u8 i; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10 - && sPSSData->field_2204[i].unk8 == cursorArea - && sPSSData->field_2204[i].unk9 == cursorPos) + if (sStorage->itemIcons[i].active + && sStorage->itemIcons[i].area == cursorArea + && sStorage->itemIcons[i].pos == cursorPos) return i; } - - return 3; + return MAX_ITEM_ICONS; } -static u8 sub_80D13C4(struct Sprite *sprite) +static u8 GetItemIconIdxBySprite(struct Sprite *sprite) { u8 i; - for (i = 0; i < 3; i++) + for (i = 0; i < MAX_ITEM_ICONS; i++) { - if (sPSSData->field_2204[i].unk10 - && sPSSData->field_2204[i].sprite == sprite) + if (sStorage->itemIcons[i].active + && sStorage->itemIcons[i].sprite == sprite) return i; } - - return 3; + return MAX_ITEM_ICONS; } -static void sub_80D140C(u8 id, u8 cursorArea, u8 cursorPos) +static void SetItemIconPosition(u8 id, u8 cursorArea, u8 cursorPos) { - u8 row, column; + u8 x, y; - if (id >= 3) + if (id >= MAX_ITEM_ICONS) return; switch (cursorArea) { case CURSOR_AREA_IN_BOX: - row = cursorPos % IN_BOX_ROWS; - column = cursorPos / IN_BOX_ROWS; - sPSSData->field_2204[id].sprite->pos1.x = (24 * row) + 112; - sPSSData->field_2204[id].sprite->pos1.y = (24 * column) + 56; - sPSSData->field_2204[id].sprite->oam.priority = 2; + x = cursorPos % IN_BOX_COLUMNS; + y = cursorPos / IN_BOX_COLUMNS; + sStorage->itemIcons[id].sprite->pos1.x = (24 * x) + 112; + sStorage->itemIcons[id].sprite->pos1.y = (24 * y) + 56; + sStorage->itemIcons[id].sprite->oam.priority = 2; break; case CURSOR_AREA_IN_PARTY: if (cursorPos == 0) { - sPSSData->field_2204[id].sprite->pos1.x = 116; - sPSSData->field_2204[id].sprite->pos1.y = 76; + sStorage->itemIcons[id].sprite->pos1.x = 116; + sStorage->itemIcons[id].sprite->pos1.y = 76; } else { - sPSSData->field_2204[id].sprite->pos1.x = 164; - sPSSData->field_2204[id].sprite->pos1.y = 24 * (cursorPos - 1) + 28; + sStorage->itemIcons[id].sprite->pos1.x = 164; + sStorage->itemIcons[id].sprite->pos1.y = 24 * (cursorPos - 1) + 28; } - sPSSData->field_2204[id].sprite->oam.priority = 1; + sStorage->itemIcons[id].sprite->oam.priority = 1; break; } - sPSSData->field_2204[id].unk8 = cursorArea; - sPSSData->field_2204[id].unk9 = cursorPos; + sStorage->itemIcons[id].area = cursorArea; + sStorage->itemIcons[id].pos = cursorPos; } -static void sub_80D1524(u8 id, const u32 *itemTiles, const u32 *itemPal) +static void LoadItemIconGfx(u8 id, const u32 *itemTiles, const u32 *itemPal) { s32 i; - if (id >= 3) + if (id >= MAX_ITEM_ICONS) return; - CpuFastFill(0, sPSSData->field_42C4, 0x200); - LZ77UnCompWram(itemTiles, sPSSData->field_22C4); + CpuFastFill(0, sStorage->itemIconBuffer, 0x200); + LZ77UnCompWram(itemTiles, sStorage->tileBuffer); for (i = 0; i < 3; i++) - CpuFastCopy(sPSSData->field_22C4 + (i * 0x60), sPSSData->field_42C4 + (i * 0x80), 0x60); + CpuFastCopy(&sStorage->tileBuffer[i * 0x60], &sStorage->itemIconBuffer[i * 0x80], 0x60); - CpuFastCopy(sPSSData->field_42C4, sPSSData->field_2204[id].tiles, 0x200); - LZ77UnCompWram(itemPal, sPSSData->field_42C4); - LoadPalette(sPSSData->field_42C4, sPSSData->field_2204[id].palIndex, 0x20); + CpuFastCopy(sStorage->itemIconBuffer, sStorage->itemIcons[id].tiles, 0x200); + LZ77UnCompWram(itemPal, sStorage->itemIconBuffer); + LoadPalette(sStorage->itemIconBuffer, sStorage->itemIcons[id].palIndex, 0x20); } -static void sub_80D15D4(u8 id, u8 animNum) +static void SetItemIconAffineAnim(u8 id, u8 animNum) { - if (id >= 3) + if (id >= MAX_ITEM_ICONS) return; - StartSpriteAffineAnim(sPSSData->field_2204[id].sprite, animNum); + StartSpriteAffineAnim(sStorage->itemIcons[id].sprite, animNum); } -static void sub_80D1604(u8 id, u8 arg1, u8 arg2, u8 arg3) +#define sItemIconId data[0] +#define sState data[0] +#define sCursorArea data[6] +#define sCursorPos data[7] + +static void SetItemIconCallback(u8 id, u8 callbackId, u8 cursorArea, u8 cursorPos) { - if (id >= 3) + if (id >= MAX_ITEM_ICONS) return; - switch (arg1) + switch (callbackId) { - case 0: - sPSSData->field_2204[id].sprite->data[0] = id; - sPSSData->field_2204[id].sprite->callback = sub_80D1A48; + case ITEM_CB_WAIT_ANIM: + sStorage->itemIcons[id].sprite->sItemIconId = id; + sStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_WaitAnim; break; - case 1: - sPSSData->field_2204[id].sprite->data[0] = 0; - sPSSData->field_2204[id].sprite->callback = sub_80D1A74; + case ITEM_CB_TO_HAND: + sStorage->itemIcons[id].sprite->sState = 0; + sStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_ToHand; break; - case 2: - sPSSData->field_2204[id].sprite->data[0] = 0; - sPSSData->field_2204[id].sprite->data[6] = arg2; - sPSSData->field_2204[id].sprite->data[7] = arg3; - sPSSData->field_2204[id].sprite->callback = sub_80D1B14; + case ITEM_CB_TO_MON: + sStorage->itemIcons[id].sprite->sState = 0; + sStorage->itemIcons[id].sprite->sCursorArea = cursorArea; + sStorage->itemIcons[id].sprite->sCursorPos = cursorPos; + sStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_ToMon; break; - case 3: - sPSSData->field_2204[id].sprite->data[0] = 0; - sPSSData->field_2204[id].sprite->callback = sub_80D1B94; - sPSSData->field_2204[id].sprite->data[6] = arg2; - sPSSData->field_2204[id].sprite->data[7] = arg3; + case ITEM_CB_SWAP_TO_HAND: + sStorage->itemIcons[id].sprite->sState = 0; + sStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_SwapToHand; + sStorage->itemIcons[id].sprite->sCursorArea = cursorArea; + sStorage->itemIcons[id].sprite->sCursorPos = cursorPos; break; - case 4: - sPSSData->field_2204[id].sprite->data[0] = 0; - sPSSData->field_2204[id].sprite->data[6] = arg2; - sPSSData->field_2204[id].sprite->data[7] = arg3; - sPSSData->field_2204[id].sprite->callback = sub_80D1C30; + case ITEM_CB_SWAP_TO_MON: + sStorage->itemIcons[id].sprite->sState = 0; + sStorage->itemIcons[id].sprite->sCursorArea = cursorArea; + sStorage->itemIcons[id].sprite->sCursorPos = cursorPos; + sStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_SwapToMon; break; - case 7: - sPSSData->field_2204[id].sprite->callback = sub_80D1CCC; + case ITEM_CB_HIDE_PARTY: + // If cursor is on a Pokémon with a held item and + // the player closes the party menu, have the held + // item follow the Pokémon as the menu slides out + sStorage->itemIcons[id].sprite->callback = SpriteCB_ItemIcon_HideParty; break; } } -static void sub_80D1740(u8 id, bool8 arg1) +static void SetItemIconActive(u8 id, bool8 active) { - if (id >= 3) + if (id >= MAX_ITEM_ICONS) return; - sPSSData->field_2204[id].unk10 = arg1; - sPSSData->field_2204[id].sprite->invisible = (arg1 == FALSE); + sStorage->itemIcons[id].active = active; + sStorage->itemIcons[id].sprite->invisible = (active == FALSE); } static const u32 *GetItemIconPic(u16 itemId) @@ -9072,90 +9196,88 @@ static void PrintItemDescription(void) { const u8 *description; - if (IsActiveItemMoving()) - description = ItemId_GetDescription(sPSSData->movingItem); + if (IsMovingItem()) + description = ItemId_GetDescription(sStorage->movingItemId); else - description = ItemId_GetDescription(sPSSData->cursorMonItem); + description = ItemId_GetDescription(sStorage->displayMonItemId); FillWindowPixelBuffer(2, PIXEL_FILL(1)); AddTextPrinterParameterized5(2, 1, description, 4, 0, 0, NULL, 0, 1); } -static void sub_80D1818(void) +static void InitItemInfoWindow(void) { - sPSSData->field_2236 = 0x15; - LoadBgTiles(0, gUnknown_0857BB24, 0x80, 0x13A); - sub_80D19B4(0); + sStorage->itemInfoWindowOffset = 21; + LoadBgTiles(0, sItemInfoFrame_Gfx, 0x80, 0x13A); + DrawItemInfoWindow(0); } -static bool8 sub_80D184C(void) +static bool8 UpdateItemInfoWindowSlideIn(void) { - s32 i, var; + s32 i, pos; - if (sPSSData->field_2236 == 0) + if (sStorage->itemInfoWindowOffset == 0) return FALSE; - sPSSData->field_2236--; - var = 0x15 - sPSSData->field_2236; - for (i = 0; i < var; i++) - { - WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21); - } + sStorage->itemInfoWindowOffset--; + pos = 21 - sStorage->itemInfoWindowOffset; + for (i = 0; i < pos; i++) + WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sStorage->itemInfoWindowOffset + i, i, 13, 1, 7, 15, 21); - sub_80D19B4(var); - return (sPSSData->field_2236 != 0); + DrawItemInfoWindow(pos); + return (sStorage->itemInfoWindowOffset != 0); } -static bool8 sub_80D18E4(void) +static bool8 UpdateItemInfoWindowSlideOut(void) { - s32 i, var; + s32 i, pos; - if (sPSSData->field_2236 == 0x16) + if (sStorage->itemInfoWindowOffset == 22) return FALSE; - if (sPSSData->field_2236 == 0) + if (sStorage->itemInfoWindowOffset == 0) FillBgTilemapBufferRect(0, 0, 21, 12, 1, 9, 17); - sPSSData->field_2236++; - var = 0x15 - sPSSData->field_2236; - for (i = 0; i < var; i++) + sStorage->itemInfoWindowOffset++; + pos = 21 - sStorage->itemInfoWindowOffset; + for (i = 0; i < pos; i++) { - WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sPSSData->field_2236 + i, i, 13, 1, 7, 15, 21); + WriteSequenceToBgTilemapBuffer(0, GetBgAttribute(0, BG_ATTR_BASETILE) + 0x14 + sStorage->itemInfoWindowOffset + i, i, 13, 1, 7, 15, 21); } - if (var >= 0) - sub_80D19B4(var); + if (pos >= 0) + DrawItemInfoWindow(pos); - FillBgTilemapBufferRect(0, 0, var + 1, 12, 1, 9, 0x11); + FillBgTilemapBufferRect(0, 0, pos + 1, 12, 1, 9, 0x11); ScheduleBgCopyTilemapToVram(0); return TRUE; } -static void sub_80D19B4(u32 arg0) +static void DrawItemInfoWindow(u32 pos) { - if (arg0 != 0) + if (pos != 0) { - FillBgTilemapBufferRect(0, 0x13A, 0, 0xC, arg0, 1, 0xFu); - FillBgTilemapBufferRect(0, 0x93A, 0, 0x14, arg0, 1, 0xFu); + FillBgTilemapBufferRect(0, 0x13A, 0, 0xC, pos, 1, 0xFu); + FillBgTilemapBufferRect(0, 0x93A, 0, 0x14, pos, 1, 0xFu); } - FillBgTilemapBufferRect(0, 0x13B, arg0, 0xD, 1, 7, 0xFu); - FillBgTilemapBufferRect(0, 0x13C, arg0, 0xC, 1, 1, 0xFu); - FillBgTilemapBufferRect(0, 0x13D, arg0, 0x14, 1, 1, 0xFu); + FillBgTilemapBufferRect(0, 0x13B, pos, 0xD, 1, 7, 0xFu); + FillBgTilemapBufferRect(0, 0x13C, pos, 0xC, 1, 1, 0xFu); + FillBgTilemapBufferRect(0, 0x13D, pos, 0x14, 1, 1, 0xFu); ScheduleBgCopyTilemapToVram(0); } -static void sub_80D1A48(struct Sprite *sprite) +static void SpriteCB_ItemIcon_WaitAnim(struct Sprite *sprite) { if (sprite->affineAnimEnded) { - sub_80D1740(sprite->data[0], FALSE); + SetItemIconActive(sprite->sItemIconId, FALSE); sprite->callback = SpriteCallbackDummy; } } -static void sub_80D1A74(struct Sprite *sprite) +static void SpriteCB_ItemIcon_ToHand(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->data[1] = sprite->pos1.x << 4; @@ -9163,28 +9285,28 @@ static void sub_80D1A74(struct Sprite *sprite) sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; - sprite->data[0]++; + sprite->sState++; case 1: sprite->data[1] -= sprite->data[3]; sprite->data[2] -= sprite->data[4]; sprite->pos1.x = sprite->data[1] >> 4; sprite->pos1.y = sprite->data[2] >> 4; if (++sprite->data[5] > 11) - sprite->callback = sub_80D1AD8; + sprite->callback = SpriteCB_ItemIcon_SetPosToCursor; break; } } -static void sub_80D1AD8(struct Sprite *sprite) +static void SpriteCB_ItemIcon_SetPosToCursor(struct Sprite *sprite) { - sprite->pos1.x = sPSSData->field_CB4->pos1.x + 4; - sprite->pos1.y = sPSSData->field_CB4->pos1.y + sPSSData->field_CB4->pos2.y + 8; - sprite->oam.priority = sPSSData->field_CB4->oam.priority; + sprite->pos1.x = sStorage->cursorSprite->pos1.x + 4; + sprite->pos1.y = sStorage->cursorSprite->pos1.y + sStorage->cursorSprite->pos2.y + 8; + sprite->oam.priority = sStorage->cursorSprite->oam.priority; } -static void sub_80D1B14(struct Sprite *sprite) +static void SpriteCB_ItemIcon_ToMon(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->data[1] = sprite->pos1.x << 4; @@ -9192,7 +9314,7 @@ static void sub_80D1B14(struct Sprite *sprite) sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; - sprite->data[0]++; + sprite->sState++; case 1: sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; @@ -9200,16 +9322,16 @@ static void sub_80D1B14(struct Sprite *sprite) sprite->pos1.y = sprite->data[2] >> 4; if (++sprite->data[5] > 11) { - sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]); + SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos); sprite->callback = SpriteCallbackDummy; } break; } } -static void sub_80D1B94(struct Sprite *sprite) +static void SpriteCB_ItemIcon_SwapToHand(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->data[1] = sprite->pos1.x << 4; @@ -9217,7 +9339,7 @@ static void sub_80D1B94(struct Sprite *sprite) sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; - sprite->data[0]++; + sprite->sState++; case 1: sprite->data[1] -= sprite->data[3]; sprite->data[2] -= sprite->data[4]; @@ -9226,17 +9348,17 @@ static void sub_80D1B94(struct Sprite *sprite) sprite->pos2.x = gSineTable[sprite->data[5] * 8] >> 4; if (++sprite->data[5] > 11) { - sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]); + SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos); sprite->pos2.x = 0; - sprite->callback = sub_80D1AD8; + sprite->callback = SpriteCB_ItemIcon_SetPosToCursor; } break; } } -static void sub_80D1C30(struct Sprite *sprite) +static void SpriteCB_ItemIcon_SwapToMon(struct Sprite *sprite) { - switch (sprite->data[0]) + switch (sprite->sState) { case 0: sprite->data[1] = sprite->pos1.x << 4; @@ -9244,7 +9366,7 @@ static void sub_80D1C30(struct Sprite *sprite) sprite->data[3] = 10; sprite->data[4] = 21; sprite->data[5] = 0; - sprite->data[0]++; + sprite->sState++; case 1: sprite->data[1] += sprite->data[3]; sprite->data[2] += sprite->data[4]; @@ -9253,7 +9375,7 @@ static void sub_80D1C30(struct Sprite *sprite) sprite->pos2.x = -(gSineTable[sprite->data[5] * 8] >> 4); if (++sprite->data[5] > 11) { - sub_80D140C(sub_80D13C4(sprite), sprite->data[6], sprite->data[7]); + SetItemIconPosition(GetItemIconIdxBySprite(sprite), sprite->sCursorArea, sprite->sCursorPos); sprite->callback = SpriteCallbackDummy; sprite->pos2.x = 0; } @@ -9261,24 +9383,37 @@ static void sub_80D1C30(struct Sprite *sprite) } } -static void sub_80D1CCC(struct Sprite *sprite) +static void SpriteCB_ItemIcon_HideParty(struct Sprite *sprite) { sprite->pos1.y -= 8; if (sprite->pos1.y + sprite->pos2.y < -16) { sprite->callback = SpriteCallbackDummy; - sub_80D1740(sub_80D13C4(sprite), FALSE); + SetItemIconActive(GetItemIconIdxBySprite(sprite), FALSE); } } -void nullsub_pss(void) -{ +#undef sState +#undef sItemIconId +#undef sCursorArea +#undef sCursorPos -} -void nullsub_98(void) +//------------------------------------------------------------------------------ +// SECTION: General utility +//------------------------------------------------------------------------------ + + +// Unused, leftover from FRLG +static void BackupPokemonStorage(void/*struct PokemonStorage * dest*/) { + //*dest = *gPokemonStoragePtr; +} +// Unused, leftover from FRLG +static void RestorePokemonStorage(void/*struct PokemonStorage * src*/) +{ + //*gPokemonStoragePtr = *src; } // Functions here are general utility functions. @@ -9331,9 +9466,9 @@ u32 GetBoxMonLevelAt(u8 boxId, u8 boxPosition) if (boxId < TOTAL_BOXES_COUNT && boxPosition < IN_BOX_COUNT && GetBoxMonData(&gPokemonStoragePtr->boxes[boxId][boxPosition], MON_DATA_SANITY_HAS_SPECIES)) lvl = GetLevelFromBoxMonExp(&gPokemonStoragePtr->boxes[boxId][boxPosition]); - #ifdef BUGFIX +#ifdef BUGFIX else - #endif +#endif lvl = 0; return lvl; @@ -9406,7 +9541,7 @@ u8 *GetBoxNamePtr(u8 boxId) return NULL; } -u8 GetBoxWallpaper(u8 boxId) +static u8 GetBoxWallpaper(u8 boxId) { if (boxId < TOTAL_BOXES_COUNT) return gPokemonStoragePtr->boxWallpapers[boxId]; @@ -9414,23 +9549,24 @@ u8 GetBoxWallpaper(u8 boxId) return 0; } -void SetBoxWallpaper(u8 boxId, u8 wallpaperId) +static void SetBoxWallpaper(u8 boxId, u8 wallpaperId) { if (boxId < TOTAL_BOXES_COUNT && wallpaperId < WALLPAPER_COUNT) gPokemonStoragePtr->boxWallpapers[boxId] = wallpaperId; } -s16 sub_80D214C(struct BoxPokemon *boxMons, u8 currIndex, u8 maxIndex, u8 arg3) +// For moving to the next Pokémon while viewing the summary screen +s16 AdvanceStorageMonIndex(struct BoxPokemon *boxMons, u8 currIndex, u8 maxIndex, u8 mode) { s16 i; - s16 adder = -1; + s16 direction = -1; - if (arg3 < 2) - adder = 1; + if (mode == 0 || mode == 1) + direction = 1; - if (arg3 == 1 || arg3 == 3) + if (mode == 1 || mode == 3) { - for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder) + for (i = (s8)currIndex + direction; i >= 0 && i <= maxIndex; i += direction) { if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE) return i; @@ -9438,7 +9574,7 @@ s16 sub_80D214C(struct BoxPokemon *boxMons, u8 currIndex, u8 maxIndex, u8 arg3) } else { - for (i = (s8)currIndex + adder; i >= 0 && i <= maxIndex; i += adder) + for (i = (s8)currIndex + direction; i >= 0 && i <= maxIndex; i += direction) { if (GetBoxMonData(&boxMons[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetBoxMonData(&boxMons[i], MON_DATA_IS_EGG)) @@ -9532,6 +9668,12 @@ bool32 AnyStorageMonWithMove(u16 moveId) return FALSE; } + +//------------------------------------------------------------------------------ +// SECTION: Walda +//------------------------------------------------------------------------------ + + void ResetWaldaWallpaper(void) { gSaveBlock1Ptr->waldaPhrase.iconId = 0; @@ -9559,7 +9701,7 @@ u32 GetWaldaWallpaperPatternId(void) void SetWaldaWallpaperPatternId(u8 id) { - if (id < FRIENDS_WALLPAPERS_COUNT) + if (id < ARRAY_COUNT(sWaldaWallpapers)) gSaveBlock1Ptr->waldaPhrase.patternId = id; } @@ -9570,7 +9712,7 @@ u32 GetWaldaWallpaperIconId(void) void SetWaldaWallpaperIconId(u8 id) { - if (id < 30) + if (id < ARRAY_COUNT(sWaldaWallpaperIcons)) gSaveBlock1Ptr->waldaPhrase.iconId = id; } @@ -9600,287 +9742,338 @@ bool32 IsWaldaPhraseEmpty(void) return (gSaveBlock1Ptr->waldaPhrase.text[0] == EOS); } -// Not sure what the purpose of these functions is. -// They seem to only be called while PSS is initialized. -EWRAM_DATA static struct UnkStruct_2039D84 *gUnknown_02039D84 = NULL; -EWRAM_DATA static u16 gUnknown_02039D88 = 0; +//------------------------------------------------------------------------------ +// SECTION: TilemapUtil +// +// Handles 3 particular tilemaps in a somewhat unusual way. +// For example, while the cursor is on the Close Box button it flashes between +// two states alternately. Both these states are their own part of the same +// tilemap that's always present. The utility shifts the tilemap up and down +// to show/hide the states, and limits the view with a rectangle that only +// reveals one at a time. +// Each tilemap is tracked with a TILEMAPID that can be used to reference it. +//------------------------------------------------------------------------------ + -static void sub_80D259C(u8 count) +struct TilemapUtil_RectData +{ + s16 x; + s16 y; + u16 width; + u16 height; + s16 destX; + s16 destY; +}; + +struct TilemapUtil +{ + struct TilemapUtil_RectData prev; // Only read in unused function + struct TilemapUtil_RectData cur; + const void *savedTilemap; // Only written in unused function + const void *tilemap; + u16 altWidth; + u16 altHeight; // Never read + u16 width; + u16 height; // Never read + u16 rowSize; // Never read + u8 tileSize; + u8 bg; + bool8 active; +}; + +EWRAM_DATA static struct TilemapUtil *sTilemapUtil = NULL; +EWRAM_DATA static u16 sNumTilemapUtilIds = 0; + +static void TilemapUtil_Init(u8 count) { u16 i; - gUnknown_02039D84 = Alloc(sizeof(*gUnknown_02039D84) * count); - gUnknown_02039D88 = (gUnknown_02039D84 == NULL) ? 0 : count; - for (i = 0; i < gUnknown_02039D88; i++) + sTilemapUtil = Alloc(sizeof(*sTilemapUtil) * count); + sNumTilemapUtilIds = (sTilemapUtil == NULL) ? 0 : count; + for (i = 0; i < sNumTilemapUtilIds; i++) { - gUnknown_02039D84[i].field_18 = NULL; - gUnknown_02039D84[i].field_2C = 0; + sTilemapUtil[i].savedTilemap = NULL; + sTilemapUtil[i].active = FALSE; } } -static void sub_80D25F0(void) +static void TilemapUtil_Free(void) { - Free(gUnknown_02039D84); + Free(sTilemapUtil); } -static void sub_80D2604(void) +// Unused +static void TilemapUtil_UpdateAll(void) { s32 i; - for (i = 0; i < gUnknown_02039D88; i++) + for (i = 0; i < sNumTilemapUtilIds; i++) { - if (gUnknown_02039D84[i].field_2C == 1) - sub_80D2918(i); + if (sTilemapUtil[i].active == TRUE) + TilemapUtil_Update(i); } } struct { - u16 a; - u16 b; -} -static const sUnkVars[][4] = + u16 width; + u16 height; +} static const sTilemapDimensions[][4] = { { - {0x0100, 0x0100}, - {0x0200, 0x0100}, - {0x0100, 0x0200}, - {0x0200, 0x0200}, + { 256, 256}, + { 512, 256}, + { 256, 512}, + { 512, 512}, }, { - {0x0080, 0x0080}, - {0x0100, 0x0100}, - {0x0200, 0x0200}, - {0x0400, 0x0400}, + { 128, 128}, + { 256, 256}, + { 512, 512}, + {1024, 1024}, }, }; -static void sub_80D2644(u8 id, u8 bg, const void *arg2, u16 arg3, u16 arg4) +static void TilemapUtil_SetMap(u8 id, u8 bg, const void *tilemap, u16 width, u16 height) { u16 bgScreenSize, bgType; - if (id >= gUnknown_02039D88) + if (id >= sNumTilemapUtilIds) return; - gUnknown_02039D84[id].field_18 = NULL; - gUnknown_02039D84[id].field_1C = arg2; - gUnknown_02039D84[id].field_2B = bg; - gUnknown_02039D84[id].field_24 = arg3; - gUnknown_02039D84[id].field_26 = arg4; + sTilemapUtil[id].savedTilemap = NULL; + sTilemapUtil[id].tilemap = tilemap; + sTilemapUtil[id].bg = bg; + sTilemapUtil[id].width = width; + sTilemapUtil[id].height = height; bgScreenSize = GetBgAttribute(bg, BG_ATTR_SCREENSIZE); bgType = GetBgAttribute(bg, BG_ATTR_TYPE); - gUnknown_02039D84[id].field_20 = sUnkVars[bgType][bgScreenSize].a; - gUnknown_02039D84[id].field_22 = sUnkVars[bgType][bgScreenSize].b; + sTilemapUtil[id].altWidth = sTilemapDimensions[bgType][bgScreenSize].width; + sTilemapUtil[id].altHeight = sTilemapDimensions[bgType][bgScreenSize].height; if (bgType != 0) - gUnknown_02039D84[id].field_2A = 1; + sTilemapUtil[id].tileSize = 1; else - gUnknown_02039D84[id].field_2A = 2; + sTilemapUtil[id].tileSize = 2; - gUnknown_02039D84[id].field_28 = gUnknown_02039D84[id].field_2A * arg3; - gUnknown_02039D84[id].field_0[1].field_4 = arg3; - gUnknown_02039D84[id].field_0[1].field_6 = arg4; - gUnknown_02039D84[id].field_0[1].field_0 = 0; - gUnknown_02039D84[id].field_0[1].field_2 = 0; - gUnknown_02039D84[id].field_0[1].field_8 = 0; - gUnknown_02039D84[id].field_0[1].field_A = 0; - gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1]; - gUnknown_02039D84[id].field_2C = 1; + sTilemapUtil[id].rowSize = sTilemapUtil[id].tileSize * width; + sTilemapUtil[id].cur.width = width; + sTilemapUtil[id].cur.height = height; + sTilemapUtil[id].cur.x = 0; + sTilemapUtil[id].cur.y = 0; + sTilemapUtil[id].cur.destX = 0; + sTilemapUtil[id].cur.destY = 0; + sTilemapUtil[id].prev = sTilemapUtil[id].cur; + sTilemapUtil[id].active = TRUE; } -static void sub_80D2740(u8 id, const void *arg1) +// Unused +static void TilemapUtil_SetSavedMap(u8 id, const void *tilemap) { - if (id >= gUnknown_02039D88) + if (id >= sNumTilemapUtilIds) return; - gUnknown_02039D84[id].field_18 = arg1; - gUnknown_02039D84[id].field_2C = 1; + sTilemapUtil[id].savedTilemap = tilemap; + sTilemapUtil[id].active = TRUE; } -static void sub_80D2770(u8 id, u16 arg1, u16 arg2) +static void TilemapUtil_SetPos(u8 id, u16 x, u16 y) { - if (id >= gUnknown_02039D88) + if (id >= sNumTilemapUtilIds) return; - gUnknown_02039D84[id].field_0[1].field_8 = arg1; - gUnknown_02039D84[id].field_0[1].field_A = arg2; - gUnknown_02039D84[id].field_2C = 1; + sTilemapUtil[id].cur.destX = x; + sTilemapUtil[id].cur.destY = y; + sTilemapUtil[id].active = TRUE; } -static void sub_80D27AC(u8 id, u16 arg1, u16 arg2, u16 arg3, u16 arg4) +static void TilemapUtil_SetRect(u8 id, u16 x, u16 y, u16 width, u16 height) { - if (id >= gUnknown_02039D88) + if (id >= sNumTilemapUtilIds) return; - gUnknown_02039D84[id].field_0[1].field_0 = arg1; - gUnknown_02039D84[id].field_0[1].field_2 = arg2; - gUnknown_02039D84[id].field_0[1].field_4 = arg3; - gUnknown_02039D84[id].field_0[1].field_6 = arg4; - gUnknown_02039D84[id].field_2C = 1; + sTilemapUtil[id].cur.x = x; + sTilemapUtil[id].cur.y = y; + sTilemapUtil[id].cur.width = width; + sTilemapUtil[id].cur.height = height; + sTilemapUtil[id].active = TRUE; } -static void sub_80D27F4(u8 id, u8 arg1, s8 arg2) +static void TilemapUtil_Move(u8 id, u8 mode, s8 val) { - if (id >= gUnknown_02039D88) + if (id >= sNumTilemapUtilIds) return; - switch (arg1) + switch (mode) { case 0: - gUnknown_02039D84[id].field_0[1].field_8 += arg2; - gUnknown_02039D84[id].field_0[1].field_4 -= arg2; + sTilemapUtil[id].cur.destX += val; + sTilemapUtil[id].cur.width -= val; break; case 1: - gUnknown_02039D84[id].field_0[1].field_0 += arg2; - gUnknown_02039D84[id].field_0[1].field_4 += arg2; + sTilemapUtil[id].cur.x += val; + sTilemapUtil[id].cur.width += val; break; case 2: - gUnknown_02039D84[id].field_0[1].field_A += arg2; - gUnknown_02039D84[id].field_0[1].field_6 -= arg2; + sTilemapUtil[id].cur.destY += val; + sTilemapUtil[id].cur.height -= val; break; case 3: - gUnknown_02039D84[id].field_0[1].field_2 -= arg2; - gUnknown_02039D84[id].field_0[1].field_6 += arg2; + sTilemapUtil[id].cur.y -= val; + sTilemapUtil[id].cur.height += val; break; case 4: - gUnknown_02039D84[id].field_0[1].field_8 += arg2; + sTilemapUtil[id].cur.destX += val; break; case 5: - gUnknown_02039D84[id].field_0[1].field_A += arg2; + sTilemapUtil[id].cur.destY += val; break; } - gUnknown_02039D84[id].field_2C = 1; + sTilemapUtil[id].active = TRUE; } -static void sub_80D2918(u8 id) +static void TilemapUtil_Update(u8 id) { - if (id >= gUnknown_02039D88) + if (id >= sNumTilemapUtilIds) return; - if (gUnknown_02039D84[id].field_18 != NULL) - sub_80D2960(id); + if (sTilemapUtil[id].savedTilemap != NULL) + TilemapUtil_DrawPrev(id); // Never called, above always FALSE - sub_80D29F8(id); - gUnknown_02039D84[id].field_0[0] = gUnknown_02039D84[id].field_0[1]; + TilemapUtil_Draw(id); + sTilemapUtil[id].prev = sTilemapUtil[id].cur; } -static void sub_80D2960(u8 id) +static void TilemapUtil_DrawPrev(u8 id) { s32 i; - u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_20; - const void *tiles = (gUnknown_02039D84[id].field_18 + (adder * gUnknown_02039D84[id].field_0[0].field_A)) - + (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[0].field_8); + u32 adder = sTilemapUtil[id].tileSize * sTilemapUtil[id].altWidth; + const void *tiles = (sTilemapUtil[id].savedTilemap + (adder * sTilemapUtil[id].prev.destY)) + + (sTilemapUtil[id].tileSize * sTilemapUtil[id].prev.destX); - for (i = 0; i < gUnknown_02039D84[id].field_0[0].field_6; i++) + for (i = 0; i < sTilemapUtil[id].prev.height; i++) { - CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B, + CopyToBgTilemapBufferRect(sTilemapUtil[id].bg, tiles, - gUnknown_02039D84[id].field_0[0].field_8, - gUnknown_02039D84[id].field_0[0].field_A + i, - gUnknown_02039D84[id].field_0[0].field_4, + sTilemapUtil[id].prev.destX, + sTilemapUtil[id].prev.destY + i, + sTilemapUtil[id].prev.width, 1); tiles += adder; } } -static void sub_80D29F8(u8 id) +static void TilemapUtil_Draw(u8 id) { s32 i; - u32 adder = gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_24; - const void *tiles = (gUnknown_02039D84[id].field_1C + (adder * gUnknown_02039D84[id].field_0[1].field_2)) - + (gUnknown_02039D84[id].field_2A * gUnknown_02039D84[id].field_0[1].field_0); + u32 adder = sTilemapUtil[id].tileSize * sTilemapUtil[id].width; + const void *tiles = (sTilemapUtil[id].tilemap + (adder * sTilemapUtil[id].cur.y)) + + (sTilemapUtil[id].tileSize * sTilemapUtil[id].cur.x); - for (i = 0; i < gUnknown_02039D84[id].field_0[1].field_6; i++) + for (i = 0; i < sTilemapUtil[id].cur.height; i++) { - CopyToBgTilemapBufferRect(gUnknown_02039D84[id].field_2B, + CopyToBgTilemapBufferRect(sTilemapUtil[id].bg, tiles, - gUnknown_02039D84[id].field_0[1].field_8, - gUnknown_02039D84[id].field_0[1].field_A + i, - gUnknown_02039D84[id].field_0[1].field_4, + sTilemapUtil[id].cur.destX, + sTilemapUtil[id].cur.destY + i, + sTilemapUtil[id].cur.width, 1); tiles += adder; } } -EWRAM_DATA static struct UnkStruct_2000020 *gUnknown_02039D8C = NULL; -static void sub_80D2A90(struct UnkStruct_2000020 *arg0, struct UnkStruct_2000028 *arg1, u32 arg2) +//------------------------------------------------------------------------------ +// SECTION: UnkUtil +// +// Some data transfer utility that goes functionally unused. +// It gets initialized with UnkUtil_Init, and run every vblank in Pokémon +// Storage with UnkUtil_Run, but neither of the Add functions are ever used, +// so UnkUtil_Run performs no actions. +//------------------------------------------------------------------------------ + + +EWRAM_DATA static struct UnkUtil *sUnkUtil = NULL; + +static void UnkUtil_Init(struct UnkUtil *util, struct UnkUtilData *data, u32 max) { - gUnknown_02039D8C = arg0; - arg0->unk_00 = arg1; - arg0->unk_05 = arg2; - arg0->unk_04 = 0; + sUnkUtil = util; + util->data = data; + util->max = max; + util->numActive = 0; } -static void sub_80D2AA4(void) +static void UnkUtil_Run(void) { u16 i; - - if (gUnknown_02039D8C->unk_04) + if (sUnkUtil->numActive) { - for (i = 0; i < gUnknown_02039D8C->unk_04; i++) + for (i = 0; i < sUnkUtil->numActive; i++) { - struct UnkStruct_2000028 *unkStruct = &gUnknown_02039D8C->unk_00[i]; - unkStruct->unk_0c(unkStruct); + struct UnkUtilData *data = &sUnkUtil->data[i]; + data->func(data); } - - gUnknown_02039D8C->unk_04 = 0; + sUnkUtil->numActive = 0; } } -static bool8 sub_80D2AEC(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg) +// Unused +static bool8 UnkUtil_CpuAdd(u8 *dest, u16 dLeft, u16 dTop, const u8 *src, u16 sLeft, u16 sTop, u16 width, u16 height, u16 unkArg) { - struct UnkStruct_2000028 *unkStruct; + struct UnkUtilData *data; - if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05) + if (sUnkUtil->numActive >= sUnkUtil->max) return FALSE; - unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++]; - unkStruct->unk_08 = width * 2; - unkStruct->unk_04 = dest + 2 * (dTop * 32 + dLeft); - unkStruct->unk_00 = src + 2 * (sTop * unkArg + sLeft); - unkStruct->newField = height; - unkStruct->unk_0a = unkArg; - unkStruct->unk_0c = sub_80D2B88; + data = &sUnkUtil->data[sUnkUtil->numActive++]; + data->size = width * 2; + data->dest = dest + 2 * (dTop * 32 + dLeft); + data->src = src + 2 * (sTop * unkArg + sLeft); + data->height = height; + data->unk = unkArg; + data->func = UnkUtil_CpuRun; return TRUE; } -static void sub_80D2B88(struct UnkStruct_2000028 *unkStruct) +// Functionally unused +static void UnkUtil_CpuRun(struct UnkUtilData *data) { u16 i; - for (i = 0; i < unkStruct->newField; i++) + for (i = 0; i < data->height; i++) { - CpuSet(unkStruct->unk_00, unkStruct->unk_04, (unkStruct->unk_08 / 2)); - unkStruct->unk_04 += 64; - unkStruct->unk_00 += (unkStruct->unk_0a * 2); + CpuSet(data->src, data->dest, data->size / 2); + data->dest += 64; + data->src += data->unk * 2; } } -static bool8 sub_80D2BC0(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) +// Unused +static bool8 UnkUtil_DmaAdd(void *dest, u16 dLeft, u16 dTop, u16 width, u16 height) { - struct UnkStruct_2000028 *unkStruct; + struct UnkUtilData *data; - if (gUnknown_02039D8C->unk_04 >= gUnknown_02039D8C->unk_05) + if (sUnkUtil->numActive >= sUnkUtil->max) return FALSE; - unkStruct = &gUnknown_02039D8C->unk_00[gUnknown_02039D8C->unk_04++]; - unkStruct->unk_08 = width * 2; - unkStruct->unk_04 = dest + ((dTop * 32) + dLeft) * 2; - unkStruct->newField = height; - unkStruct->unk_0c = sub_80D2C1C; + data = &sUnkUtil->data[sUnkUtil->numActive++]; + data->size = width * 2; + data->dest = dest + (dTop * 32 + dLeft) * 2; + data->height = height; + data->func = UnkUtil_DmaRun; return TRUE; } -static void sub_80D2C1C(struct UnkStruct_2000028 *unkStruct) +// Functionally unused +static void UnkUtil_DmaRun(struct UnkUtilData *data) { u16 i; - for (i = 0; i < unkStruct->newField; i++) + for (i = 0; i < data->height; i++) { - Dma3FillLarge_(0, unkStruct->unk_04, unkStruct->unk_08, 16); - unkStruct->unk_04 += 64; + Dma3FillLarge16_(0, data->dest, data->size); + data->dest += 64; } } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index fce2a893c..8f16321b2 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -47,6 +47,14 @@ #include "constants/rgb.h" #include "constants/songs.h" +enum { + PSS_PAGE_INFO, + PSS_PAGE_SKILLS, + PSS_PAGE_BATTLE_MOVES, + PSS_PAGE_CONTEST_MOVES, + PSS_PAGE_COUNT, +}; + // Screen titles (upper left) #define PSS_LABEL_WINDOW_POKEMON_INFO_TITLE 0 #define PSS_LABEL_WINDOW_POKEMON_SKILLS_TITLE 1 @@ -175,7 +183,7 @@ static EWRAM_DATA struct PokemonSummaryScreenData } *sMonSummaryScreen = NULL; EWRAM_DATA u8 gLastViewedMonIndex = 0; static EWRAM_DATA u8 sMoveSlotToReplace = 0; -ALIGNED(4) static EWRAM_DATA u8 sUnknownTaskId = 0; +ALIGNED(4) static EWRAM_DATA u8 sAnimDelayTaskId = 0; // forward declarations static bool8 LoadGraphics(void); @@ -296,6 +304,7 @@ static void SpriteCb_MoveSelector(struct Sprite *sprite); static void DestroyMoveSelectorSprites(u8 firstArrayId); static void SetMainMoveSelectorColor(u8 whichColor); static void KeepMoveSelectorVisible(u8 firstSpriteId); +static void SummaryScreen_DestroyAnimDelayTask(void); // const rom data #include "data/text/move_descriptions.h" @@ -707,7 +716,7 @@ static void (*const sTextPrinterTasks[])(u8 taskId) = }; static const u8 sMemoNatureTextColor[] = _("{COLOR LIGHT_RED}{SHADOW GREEN}"); -static const u8 sMemoMiscTextColor[] = _("{COLOR WHITE}{SHADOW DARK_GREY}"); // This is also affected by palettes, apparently +static const u8 sMemoMiscTextColor[] = _("{COLOR WHITE}{SHADOW DARK_GRAY}"); // This is also affected by palettes, apparently static const u8 sStatsLeftColumnLayout[] = _("{DYNAMIC 0}/{DYNAMIC 1}\n{DYNAMIC 2}\n{DYNAMIC 3}"); static const u8 sStatsRightColumnLayout[] = _("{DYNAMIC 0}\n{DYNAMIC 1}\n{DYNAMIC 2}"); static const u8 sMovesPPLayout[] = _("{PP}{DYNAMIC 0}/{DYNAMIC 1}"); @@ -1069,24 +1078,24 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, sMonSummaryScreen->maxMonIndex = maxMonIndex; sMonSummaryScreen->callback = callback; - if (mode == PSS_MODE_BOX) + if (mode == SUMMARY_MODE_BOX) sMonSummaryScreen->isBoxMon = TRUE; else sMonSummaryScreen->isBoxMon = FALSE; switch (mode) { - case PSS_MODE_NORMAL: - case PSS_MODE_BOX: + case SUMMARY_MODE_NORMAL: + case SUMMARY_MODE_BOX: sMonSummaryScreen->minPageIndex = 0; sMonSummaryScreen->maxPageIndex = PSS_PAGE_COUNT - 1; break; - case PSS_MODE_LOCK_MOVES: + case SUMMARY_MODE_LOCK_MOVES: sMonSummaryScreen->minPageIndex = 0; sMonSummaryScreen->maxPageIndex = PSS_PAGE_COUNT - 1; sMonSummaryScreen->lockMovesFlag = TRUE; break; - case PSS_MODE_SELECT_MOVE: + case SUMMARY_MODE_SELECT_MOVE: sMonSummaryScreen->minPageIndex = PSS_PAGE_BATTLE_MOVES; sMonSummaryScreen->maxPageIndex = PSS_PAGE_COUNT - 1; sMonSummaryScreen->lockMonFlag = TRUE; @@ -1094,7 +1103,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, } sMonSummaryScreen->currPageIndex = sMonSummaryScreen->minPageIndex; - SummaryScreen_SetUnknownTaskId(0xFF); + SummaryScreen_SetAnimDelayTaskId(TASK_NONE); if (gMonSpritesGfxPtr == NULL) sub_806F2AC(0, 0); @@ -1104,7 +1113,7 @@ void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void ShowSelectMovePokemonSummaryScreen(struct Pokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void), u16 newMove) { - ShowPokemonSummaryScreen(PSS_MODE_SELECT_MOVE, mons, monIndex, maxMonIndex, callback); + ShowPokemonSummaryScreen(SUMMARY_MODE_SELECT_MOVE, mons, monIndex, maxMonIndex, callback); sMonSummaryScreen->newMove = newMove; } @@ -1216,7 +1225,7 @@ static bool8 LoadGraphics(void) break; case 17: sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON] = LoadMonGfxAndSprite(&sMonSummaryScreen->currentMon, &sMonSummaryScreen->switchCounter); - if (sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON] != 0xFF) + if (sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON] != SPRITE_NONE) { sMonSummaryScreen->switchCounter = 0; gMain.state++; @@ -1239,18 +1248,18 @@ static bool8 LoadGraphics(void) gMain.state++; break; case 22: - if (sMonSummaryScreen->mode != PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode != SUMMARY_MODE_SELECT_MOVE) CreateTask(Task_HandleInput, 0); else CreateTask(Task_SetHandleReplaceMoveInput, 0); gMain.state++; break; case 23: - BlendPalettes(0xFFFFFFFF, 16, 0); + BlendPalettes(PALETTES_ALL, 16, 0); gMain.state++; break; case 24: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -1392,7 +1401,7 @@ static bool8 ExtractMonDataToSummaryStruct(struct Pokemon *mon) sum->ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); break; case 2: - if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == PSS_MODE_BOX || sMonSummaryScreen->unk40EF == TRUE) + if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == SUMMARY_MODE_BOX || sMonSummaryScreen->unk40EF == TRUE) { sum->nature = GetNature(mon); sum->currentHP = GetMonData(mon, MON_DATA_HP); @@ -1470,7 +1479,7 @@ static void FreeSummaryScreen(void) static void BeginCloseSummaryScreen(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = CloseSummaryScreen; } @@ -1480,7 +1489,7 @@ static void CloseSummaryScreen(u8 taskId) { SetMainCallback2(sMonSummaryScreen->callback); gLastViewedMonIndex = sMonSummaryScreen->curMonIndex; - SummaryScreen_DestroyUnknownTask(); + SummaryScreen_DestroyAnimDelayTask(); ResetSpriteData(); FreeAllSpritePalettes(); StopCryAndClearCrySongs(); @@ -1560,7 +1569,7 @@ static void ChangeSummaryPokemon(u8 taskId, s8 delta) else delta = 3; } - monId = sub_80D214C(sMonSummaryScreen->monList.boxMons, sMonSummaryScreen->curMonIndex, sMonSummaryScreen->maxMonIndex, delta); + monId = AdvanceStorageMonIndex(sMonSummaryScreen->monList.boxMons, sMonSummaryScreen->curMonIndex, sMonSummaryScreen->maxMonIndex, delta); } else if (IsMultiBattle() == TRUE) { @@ -1598,7 +1607,7 @@ static void Task_ChangeSummaryMon(u8 taskId) StopCryAndClearCrySongs(); break; case 1: - SummaryScreen_DestroyUnknownTask(); + SummaryScreen_DestroyAnimDelayTask(); DestroySpriteAndFreeResources(&gSprites[sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON]]); break; case 2: @@ -1626,7 +1635,7 @@ static void Task_ChangeSummaryMon(u8 taskId) break; case 8: sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON] = LoadMonGfxAndSprite(&sMonSummaryScreen->currentMon, &data[1]); - if (sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON] == 0xFF) + if (sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON] == SPRITE_NONE) return; gSprites[sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_MON]].data[2] = 1; TryDrawExperienceProgressBar(); @@ -2401,7 +2410,7 @@ static void HandlePowerAccTilemap(u16 a, s16 b) else { u8 taskId = FindTaskIdByFunc(Task_ShowPowerAccWindow); - if (taskId == 0xFF) + if (taskId == TASK_NONE) taskId = CreateTask(Task_ShowPowerAccWindow, 8); gTasks[taskId].data[0] = b; gTasks[taskId].data[1] = a; @@ -2453,7 +2462,7 @@ static void HandleAppealJamTilemap(u16 a, s16 b, u16 move) else { u8 taskId = FindTaskIdByFunc(Task_ShowAppealJamWindow); - if (taskId == 0xFF) + if (taskId == TASK_NONE) taskId = CreateTask(Task_ShowAppealJamWindow, 8); gTasks[taskId].data[0] = b; gTasks[taskId].data[1] = a; @@ -2680,7 +2689,7 @@ static void ResetWindows(void) for (i = 0; i < PSS_LABEL_WINDOW_END; i++) FillWindowPixelBuffer(i, PIXEL_FILL(0)); for (i = 0; i < ARRAY_COUNT(sMonSummaryScreen->windowIds); i++) - sMonSummaryScreen->windowIds[i] = 0xFF; + sMonSummaryScreen->windowIds[i] = WINDOW_NONE; } static void PrintTextOnWindow(u8 windowId, const u8 *string, u8 x, u8 y, u8 lineSpacing, u8 colorId) @@ -2858,7 +2867,7 @@ static void PutPageWindowTilemaps(u8 page) break; case PSS_PAGE_BATTLE_MOVES: PutWindowTilemap(PSS_LABEL_WINDOW_BATTLE_MOVES_TITLE); - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) PutWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC); @@ -2870,7 +2879,7 @@ static void PutPageWindowTilemaps(u8 page) break; case PSS_PAGE_CONTEST_MOVES: PutWindowTilemap(PSS_LABEL_WINDOW_CONTEST_MOVES_TITLE); - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) PutWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM); @@ -2906,7 +2915,7 @@ static void ClearPageWindowTilemaps(u8 page) ClearWindowTilemap(PSS_LABEL_WINDOW_POKEMON_SKILLS_EXP); break; case PSS_PAGE_BATTLE_MOVES: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_POWER_ACC); @@ -2917,7 +2926,7 @@ static void ClearPageWindowTilemaps(u8 page) } break; case PSS_PAGE_CONTEST_MOVES: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) ClearWindowTilemap(PSS_LABEL_WINDOW_MOVES_APPEAL_JAM); @@ -2938,7 +2947,7 @@ static void ClearPageWindowTilemaps(u8 page) static u8 AddWindowFromTemplateList(const struct WindowTemplate *template, u8 templateId) { u8 *windowIdPtr = &sMonSummaryScreen->windowIds[templateId]; - if (*windowIdPtr == 0xFF) + if (*windowIdPtr == WINDOW_NONE) { *windowIdPtr = AddWindow(&template[templateId]); FillWindowPixelBuffer(*windowIdPtr, PIXEL_FILL(0)); @@ -2949,11 +2958,11 @@ static u8 AddWindowFromTemplateList(const struct WindowTemplate *template, u8 te static void RemoveWindowByIndex(u8 windowIndex) { u8 *windowIdPtr = &sMonSummaryScreen->windowIds[windowIndex]; - if (*windowIdPtr != 0xFF) + if (*windowIdPtr != WINDOW_NONE) { ClearWindowTilemap(*windowIdPtr); RemoveWindow(*windowIdPtr); - *windowIdPtr = 0xFF; + *windowIdPtr = WINDOW_NONE; } } @@ -2962,7 +2971,7 @@ static void PrintPageSpecificText(u8 pageIndex) u16 i; for (i = 0; i < ARRAY_COUNT(sMonSummaryScreen->windowIds); i++) { - if (sMonSummaryScreen->windowIds[i] != 0xFF) + if (sMonSummaryScreen->windowIds[i] != WINDOW_NONE) FillWindowPixelBuffer(sMonSummaryScreen->windowIds[i], PIXEL_FILL(0)); } sTextPrinterFunctions[pageIndex](); @@ -3412,7 +3421,7 @@ static void PrintBattleMoves(void) PrintMoveNameAndPP(2); PrintMoveNameAndPP(3); - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { PrintNewMoveDetailsOrCancelText(); if (sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES) @@ -3446,11 +3455,11 @@ static void Task_PrintBattleMoves(u8 taskId) PrintMoveNameAndPP(3); break; case 5: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) PrintNewMoveDetailsOrCancelText(); break; case 6: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->firstMoveIndex == MAX_MON_MOVES) data[1] = sMonSummaryScreen->newMove; @@ -3459,7 +3468,7 @@ static void Task_PrintBattleMoves(u8 taskId) } break; case 7: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) PrintMoveDetails(data[1]); @@ -3547,7 +3556,7 @@ static void PrintContestMoves(void) PrintMoveNameAndPP(2); PrintMoveNameAndPP(3); - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { PrintNewMoveDetailsOrCancelText(); PrintContestMoveDescription(sMonSummaryScreen->firstMoveIndex); @@ -3573,11 +3582,11 @@ static void Task_PrintContestMoves(u8 taskId) PrintMoveNameAndPP(3); break; case 5: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) PrintNewMoveDetailsOrCancelText(); break; case 6: - if (sMonSummaryScreen->mode == PSS_MODE_SELECT_MOVE) + if (sMonSummaryScreen->mode == SUMMARY_MODE_SELECT_MOVE) { if (sMonSummaryScreen->newMove != MOVE_NONE || sMonSummaryScreen->firstMoveIndex != MAX_MON_MOVES) PrintContestMoveDescription(sMonSummaryScreen->firstMoveIndex); @@ -3612,7 +3621,7 @@ static void PrintMoveDetails(u16 move) FillWindowPixelBuffer(windowId, PIXEL_FILL(0)); if (move != MOVE_NONE) { - if (sMonSummaryScreen->currPageIndex == PSS_MODE_BOX) + if (sMonSummaryScreen->currPageIndex == SUMMARY_MODE_BOX) { PrintMovePowerAndAccuracy(move); PrintTextOnWindow(windowId, gMoveDescriptionPointers[move - 1], 6, 1, 0, 0); @@ -3692,15 +3701,15 @@ static void ResetSpriteIds(void) u8 i; for (i = 0; i < ARRAY_COUNT(sMonSummaryScreen->spriteIds); i++) - sMonSummaryScreen->spriteIds[i] = 0xFF; + sMonSummaryScreen->spriteIds[i] = SPRITE_NONE; } static void DestroySpriteInArray(u8 spriteArrayId) { - if (sMonSummaryScreen->spriteIds[spriteArrayId] != 0xFF) + if (sMonSummaryScreen->spriteIds[spriteArrayId] != SPRITE_NONE) { DestroySprite(&gSprites[sMonSummaryScreen->spriteIds[spriteArrayId]]); - sMonSummaryScreen->spriteIds[spriteArrayId] = 0xFF; + sMonSummaryScreen->spriteIds[spriteArrayId] = SPRITE_NONE; } } @@ -3716,7 +3725,7 @@ static void HidePageSpecificSprites(void) for (i = SPRITE_ARR_ID_TYPE; i < ARRAY_COUNT(sMonSummaryScreen->spriteIds); i++) { - if (sMonSummaryScreen->spriteIds[i] != 0xFF) + if (sMonSummaryScreen->spriteIds[i] != SPRITE_NONE) SetSpriteInvisibility(i, TRUE); } } @@ -3745,7 +3754,7 @@ static void CreateMoveTypeIcons(void) for (i = SPRITE_ARR_ID_TYPE; i < SPRITE_ARR_ID_TYPE + 5; i++) { - if (sMonSummaryScreen->spriteIds[i] == 0xFF) + if (sMonSummaryScreen->spriteIds[i] == SPRITE_NONE) sMonSummaryScreen->spriteIds[i] = CreateSprite(&sSpriteTemplate_MoveTypes, 0, 0, 2); SetSpriteInvisibility(i, TRUE); @@ -3857,7 +3866,7 @@ static u8 LoadMonGfxAndSprite(struct Pokemon *mon, s16 *state) case 0: if (gMain.inBattle) { - if (sub_80688F8(3, sMonSummaryScreen->curMonIndex)) + if (ShouldIgnoreDeoxysForm(3, sMonSummaryScreen->curMonIndex)) HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[summary->species2], gMonSpritesGfxPtr->sprites.ptr[1], summary->species2, summary->pid); else HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], gMonSpritesGfxPtr->sprites.ptr[1], summary->species2, summary->pid); @@ -3866,14 +3875,14 @@ static u8 LoadMonGfxAndSprite(struct Pokemon *mon, s16 *state) { if (gMonSpritesGfxPtr != NULL) { - if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == PSS_MODE_BOX || sMonSummaryScreen->unk40EF == TRUE) + if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == SUMMARY_MODE_BOX || sMonSummaryScreen->unk40EF == TRUE) HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], gMonSpritesGfxPtr->sprites.ptr[1], summary->species2, summary->pid); else HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[summary->species2], gMonSpritesGfxPtr->sprites.ptr[1], summary->species2, summary->pid); } else { - if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == PSS_MODE_BOX || sMonSummaryScreen->unk40EF == TRUE) + if (sMonSummaryScreen->monList.mons == gPlayerParty || sMonSummaryScreen->mode == SUMMARY_MODE_BOX || sMonSummaryScreen->unk40EF == TRUE) HandleLoadSpecialPokePic_2(&gMonFrontPicTable[summary->species2], sub_806F4F8(0, 1), summary->species2, summary->pid); else HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[summary->species2], sub_806F4F8(0, 1), summary->species2, summary->pid); @@ -3933,17 +3942,19 @@ static void SpriteCB_Pokemon(struct Sprite *sprite) } } -void SummaryScreen_SetUnknownTaskId(u8 taskId) +// Track and then destroy Task_PokemonSummaryAnimateAfterDelay +// Normally destroys itself but it can be interrupted before the animation starts +void SummaryScreen_SetAnimDelayTaskId(u8 taskId) { - sUnknownTaskId = taskId; + sAnimDelayTaskId = taskId; } -void SummaryScreen_DestroyUnknownTask(void) +static void SummaryScreen_DestroyAnimDelayTask(void) { - if (sUnknownTaskId != 0xFF) + if (sAnimDelayTaskId != TASK_NONE) { - DestroyTask(sUnknownTaskId); - sUnknownTaskId = 0xFF; + DestroyTask(sAnimDelayTaskId); + sAnimDelayTaskId = TASK_NONE; } } @@ -3976,7 +3987,7 @@ static void StopPokemonAnimations(void) // A subtle effect, this function stops static void CreateMonMarkingsSprite(struct Pokemon *mon) { - struct Sprite *sprite = CreateMonMarkingsSpriteWithPal(TAG_MON_MARKINGS, TAG_MON_MARKINGS, sSummaryMarkingsPalette); + struct Sprite *sprite = CreateMonMarkingAllCombosSprite(TAG_MON_MARKINGS, TAG_MON_MARKINGS, sSummaryMarkingsPalette); sMonSummaryScreen->markingsSprite = sprite; if (sprite != NULL) @@ -4010,7 +4021,7 @@ static void CreateSetStatusSprite(void) u8 *spriteId = &sMonSummaryScreen->spriteIds[SPRITE_ARR_ID_STATUS]; u8 statusAnim; - if (*spriteId == 0xFF) + if (*spriteId == SPRITE_NONE) *spriteId = CreateSprite(&sSpriteTemplate_StatusCondition, 64, 152, 0); statusAnim = GetMonAilment(&sMonSummaryScreen->currentMon); diff --git a/src/pokenav.c b/src/pokenav.c index eac0c85b4..881411b9e 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -288,7 +288,7 @@ static void Task_RunLoopedTask_LinkMode(u8 taskId) s16 *state; u32 action; - if (sub_8087598()) + if (Overworld_LinkRecvQueueLengthMoreThan2()) return; task = (LoopedTask)GetWordTaskArg(taskId, 1); diff --git a/src/pokenav_conditions_1.c b/src/pokenav_conditions_1.c index c27cd410c..61b289ae1 100644 --- a/src/pokenav_conditions_1.c +++ b/src/pokenav_conditions_1.c @@ -17,7 +17,7 @@ struct PokenavSub11 { u32 monPal[3][0x20]; u8 fill[0x180]; - u32 monPicGfx[3][0x800]; + u32 monPicGfx[3][MON_PIC_SIZE]; u8 searchMode; s16 monIndex; u32 (*callback)(struct PokenavSub11 *); @@ -123,7 +123,7 @@ u32 ConditionMenu_OpenMarkingsMenu(struct PokenavSub11 *structPtr) u8 markings; u32 ret = PARTY_CONDITION_FUNC_NONE, boxId, monId; - if (!MonMarkingsMenuHandleInput()) + if (!HandleMonMarkingsMenuInput()) { structPtr->monMarks[structPtr->mark] = GetMonMarkingsData(); monListPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_LIST); @@ -372,7 +372,7 @@ u8 *CopyMonConditionNameGender(u8 *str, u16 id, bool8 arg3) switch (gender) { default: - *(str_++) = CHAR_UNK_SPACER; + *(str_++) = CHAR_GENDERLESS; break; case MON_MALE: *(str_++) = EXT_CTRL_CODE_BEGIN; diff --git a/src/pokenav_conditions_2.c b/src/pokenav_conditions_2.c index c0e8c7d6d..dc07dd44c 100644 --- a/src/pokenav_conditions_2.c +++ b/src/pokenav_conditions_2.c @@ -132,7 +132,7 @@ struct Pokenav7Struct u8 listIndexWindowId; u8 unusedWindowId1; u8 unusedWindowId2; - struct PokemonMarkMenu monMarks; + struct MonMarkingsMenu monMarks; struct Sprite *monMarksSprite; struct Sprite *conditionSparkleSprites[MAX_CONDITION_SPARKLES]; u8 windowModeState; @@ -161,7 +161,7 @@ bool32 OpenPartyConditionMenu(void) if (structPtr == NULL) return FALSE; - structPtr->monPicSpriteId = 0xFF; + structPtr->monPicSpriteId = SPRITE_NONE; structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_OpenPartyConditionGraph, 1); structPtr->callback = GetPartyConditionLoopedTaskActive; structPtr->windowModeState = 0; @@ -514,7 +514,7 @@ u32 LoopedTask_OpenMonMarkingsWindow(s32 state) switch (state) { case 0: - sub_811FAA4(TryGetMonMarkId(), 176, 32); + OpenMonMarkingsMenu(TryGetMonMarkId(), 176, 32); return LT_INC_AND_CONTINUE; case 1: PrintHelpBarText(HELPBAR_CONDITION_MARKINGS); @@ -533,7 +533,7 @@ u32 LoopedTask_CloseMonMarkingsWindow(s32 state) switch (state) { case 0: - sub_811FAF8(); + FreeMonMarkingsMenu(); return LT_INC_AND_CONTINUE; case 1: PrintHelpBarText(HELPBAR_CONDITION_MON_STATUS); @@ -668,9 +668,9 @@ void CreateMonMarkingsOrPokeballIndicators(void) { structPtr->monMarks.baseTileTag = 0x6A; structPtr->monMarks.basePaletteTag = 0x6A; - sub_811F90C(&structPtr->monMarks); - sub_811FA90(); - sprite = CreateMonMarkingsSpriteWithPal(0x69, 0x69, sConditionGraphMonMarkingsPal); + InitMonMarkingsMenu(&structPtr->monMarks); + BufferMonMarkingsMenuTiles(); + sprite = CreateMonMarkingAllCombosSprite(0x69, 0x69, sConditionGraphMonMarkingsPal); sprite->oam.priority = 3; sprite->pos1.x = 192; sprite->pos1.y = 32; @@ -694,7 +694,7 @@ void CreateMonMarkingsOrPokeballIndicators(void) } else { - structPtr->partyPokeballSpriteIds[i] = 0xFF; + structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE; } } @@ -710,7 +710,7 @@ void CreateMonMarkingsOrPokeballIndicators(void) } else { - structPtr->partyPokeballSpriteIds[i] = 0xFF; + structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE; } } @@ -725,7 +725,7 @@ void CreateMonMarkingsOrPokeballIndicators(void) } else { - structPtr->partyPokeballSpriteIds[i] = 0xFF; + structPtr->partyPokeballSpriteIds[i] = SPRITE_NONE; } } @@ -759,7 +759,7 @@ void sub_81CEBF4(struct Pokenav7Struct *structPtr) FreeSpritePaletteByTag(0x66); } - if (structPtr->monPicSpriteId != 0xFF) + if (structPtr->monPicSpriteId != SPRITE_NONE) { DestroySprite(&gSprites[structPtr->monPicSpriteId]); FreeSpriteTilesByTag(0x64); @@ -803,7 +803,7 @@ void CreateConditionMonPic(u8 id) u8 spriteId; struct Pokenav7Struct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MON_MARK_MENU); - if (structPtr->monPicSpriteId == 0xFF) + if (structPtr->monPicSpriteId == SPRITE_NONE) { LoadConditionMonPicTemplate(&sprSheet, &sprTemplate, &sprPal); sprSheet.data = GetConditionMonPicGfx(id); @@ -816,7 +816,7 @@ void CreateConditionMonPic(u8 id) { FreeSpriteTilesByTag(0x64); FreeSpritePaletteByTag(0x64); - structPtr->monPicSpriteId = 0xFF; + structPtr->monPicSpriteId = SPRITE_NONE; } else { @@ -828,7 +828,7 @@ void CreateConditionMonPic(u8 id) } else { - DmaCopy16Defvars(3, GetConditionMonPicGfx(id), structPtr->unk181C, 0x800); + DmaCopy16Defvars(3, GetConditionMonPicGfx(id), structPtr->unk181C, MON_PIC_SIZE); LoadPalette(GetConditionMonPal(id), structPtr->monPalIndex, 0x20); } } diff --git a/src/pokenav_conditions_3.c b/src/pokenav_conditions_3.c index d02d844d0..712be6f69 100644 --- a/src/pokenav_conditions_3.c +++ b/src/pokenav_conditions_3.c @@ -124,8 +124,8 @@ static const struct WindowTemplate sSearchResultListMenuWindowTemplate = .baseBlock = 20 }; -static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); -static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); +static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); +static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); bool32 PokenavCallback_Init_ConditionSearch(void) @@ -419,7 +419,7 @@ static u32 LoopedTask_OpenConditionSearchResults(s32 state) switch (state) { case 0: - InitBgTemplates(sConditionSearchResultBgTemplates, NELEMS(sConditionSearchResultBgTemplates)); + InitBgTemplates(sConditionSearchResultBgTemplates, ARRAY_COUNT(sConditionSearchResultBgTemplates)); DecompressAndCopyTileDataToVram(1, sConditionSearchResultTiles, 0, 0, 0); SetBgTilemapBuffer(1, searchList->buff); CopyToBgTilemapBuffer(1, sConditionSearchResultTilemap, 0, 0); diff --git a/src/pokenav_main_menu.c b/src/pokenav_main_menu.c index 009cf783f..9c4d15286 100644 --- a/src/pokenav_main_menu.c +++ b/src/pokenav_main_menu.c @@ -102,7 +102,7 @@ static const u8 *const sHelpBarTexts[HELPBAR_COUNT] = static const u8 sHelpBarTextColors[3] = { - TEXT_COLOR_RED, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY + TEXT_COLOR_RED, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; static const struct CompressedSpriteSheet gSpinningPokenavSpriteSheet[] = @@ -314,7 +314,7 @@ void ShutdownPokenav(void) { PlaySE(SE_POKENAV_OFF); ResetBldCnt_(); - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); } bool32 WaitForPokenavShutdownFade(void) @@ -496,7 +496,7 @@ void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a g1 = ((((GET_G(*dest) << 8) - (g << 8)) / a3) * a4) >> 8; b1 = ((((GET_B(*dest) << 8) - (b << 8)) / a3) * a4) >> 8; - r = (r + r1) & 0x1F; //_RGB(r + r1, g + g1, b + b1); doesn't match; I have to assign the value of ((r + r1) & 0x1F) to r1 + r = (r + r1) & 0x1F; //_RGB(r + r1, g + g1, b + b1); doesn't match; I have to assign the value of ((r + r1) & 0x1F) to r g = (g + g1) & 0x1F; //See above b = (b + b1) & 0x1F; //See above @@ -521,10 +521,10 @@ void PokenavFadeScreen(s32 fadeType) BeginNormalPaletteFade(structPtr->palettes, -2, 16, 0, RGB_BLACK); break; case 2: - BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -2, 0, 16, RGB_BLACK); break; case 3: - BeginNormalPaletteFade(0xFFFFFFFF, -2, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -2, 16, 0, RGB_BLACK); break; } } @@ -536,7 +536,7 @@ bool32 IsPaletteFadeActive(void) void sub_81C7B40(void) { - BlendPalettes(0xFFFEFFFE, 16, RGB_BLACK); + BlendPalettes(PALETTES_ALL & ~(0x10000 | 0x1), 16, RGB_BLACK); } void InitBgTemplates(const struct BgTemplate *templates, int count) @@ -702,7 +702,7 @@ static void LoadLeftHeaderGfxForSubMenu(u32 menuGfxId) size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data); LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20); LZ77UnCompWram(sPokenavSubMenuLeftHeaderSpriteSheets[menuGfxId].data, &gDecompressionBuffer[0x1000]); - RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)VRAM + 0x10800 + (GetSpriteTileStartByTag(2) * 32), size, 1); + RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)OBJ_VRAM0 + 0x800 + (GetSpriteTileStartByTag(2) * 32), size, 1); } void ShowLeftHeaderGfx(u32 menuGfxId, bool32 isMain, bool32 isOnRightSide) diff --git a/src/pokenav_match_call_2.c b/src/pokenav_match_call_2.c index adcd889d3..398e174d8 100755 --- a/src/pokenav_match_call_2.c +++ b/src/pokenav_match_call_2.c @@ -890,7 +890,7 @@ static void sub_81CBC1C(void) static void sub_81CBC38(int arg0) { u8 taskId = FindTaskIdByFunc(sub_81CBC64); - if (taskId != 0xFF) + if (taskId != TASK_NONE) gTasks[taskId].data[15] = arg0; } @@ -1061,15 +1061,15 @@ static void UpdateWindowsToShowCheckPage(struct Pokenav4Struct *state) static void sub_81CC034(struct Pokenav4Struct *state) { state->msgBoxWindowId = AddWindow(&sCallMsgBoxWindowTemplate); - sub_8197184(state->msgBoxWindowId, 1, 4); + LoadMatchCallWindowGfx(state->msgBoxWindowId, 1, 4); sub_81C7B40(); } static void DrawMsgBoxForMatchCallMsg(struct Pokenav4Struct *state) { struct Sprite *sprite; - sub_8197184(state->msgBoxWindowId, 1, 4); - sub_81971C4(state->msgBoxWindowId, 1, 4); + LoadMatchCallWindowGfx(state->msgBoxWindowId, 1, 4); + DrawMatchCallTextBoxBorder(state->msgBoxWindowId, 1, 4); FillWindowPixelBuffer(state->msgBoxWindowId, PIXEL_FILL(1)); PutWindowTilemap(state->msgBoxWindowId); CopyWindowToVram(state->msgBoxWindowId, 3); diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 2d89f9c39..b3f9331b7 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -708,7 +708,7 @@ void sub_81C8C64(struct PokenavListMenuWindow *listWindow, u32 a1) void sub_81C8CB4(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list) { - u8 colors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_RED}; + u8 colors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_RED}; list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer); list->unk38(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA); @@ -987,7 +987,7 @@ bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const str window.baseBlock = a3 + 2; dest->listWindow.windowId = AddWindow(&window); - if (dest->listWindow.windowId == 0xFF) + if (dest->listWindow.windowId == WINDOW_NONE) return FALSE; dest->listWindow.unkA = 0; diff --git a/src/pokenav_menu_handler_2.c b/src/pokenav_menu_handler_2.c index 3fcd41dc9..8cd2a6b2f 100644 --- a/src/pokenav_menu_handler_2.c +++ b/src/pokenav_menu_handler_2.c @@ -750,7 +750,7 @@ static void LoadPokenavOptionPalettes(void) { s32 i; - for (i = 0; i < NELEMS(sPokenavOptionsSpriteSheets); i++) + for (i = 0; i < ARRAY_COUNT(sPokenavOptionsSpriteSheets); i++) LoadCompressedSpriteSheet(&sPokenavOptionsSpriteSheets[i]); Pokenav_AllocAndLoadPalettes(sPokenavOptionsSpritePalettes); } @@ -1221,9 +1221,9 @@ static void SetupPokenavMenuScanlineEffects(void) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuRegBits(REG_OFFSET_WININ, 0x3F); - SetGpuRegBits(REG_OFFSET_WINOUT, 0x1F); - SetGpuRegBits(REG_OFFSET_WIN0V, 0xA0); + SetGpuRegBits(REG_OFFSET_WININ, WININ_WIN0_ALL); + SetGpuRegBits(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ); + SetGpuRegBits(REG_OFFSET_WIN0V, DISPLAY_HEIGHT); ScanlineEffect_Stop(); SetMenuOptionGlow(); ScanlineEffect_SetParams(sPokenavMainMenuScanlineEffectParams); diff --git a/src/pokenav_ribbons_1.c b/src/pokenav_ribbons_1.c index 9c171dd45..69326ad23 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[] = { @@ -119,8 +119,8 @@ static const struct WindowTemplate sRibbonsMonListWindowTemplate = .baseBlock = 20 }; -static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); -static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); +static const u8 sText_MaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); +static const u8 sText_FemaleSymbol[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); static const u8 sText_NoGenderSymbol[] = _("{UNK_SPACER}"); bool32 PokenavCallback_Init_MonRibbonList(void) @@ -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; @@ -427,7 +427,7 @@ static u32 LoopedTask_OpenRibbonsMonList(s32 state) switch (state) { case 0: - InitBgTemplates(sMonRibbonListBgTemplates, NELEMS(sMonRibbonListBgTemplates)); + InitBgTemplates(sMonRibbonListBgTemplates, ARRAY_COUNT(sMonRibbonListBgTemplates)); DecompressAndCopyTileDataToVram(1, sMonRibbonListFrameTiles, 0, 0, 0); SetBgTilemapBuffer(1, monMenu->buff); CopyToBgTilemapBuffer(1, sMonRibbonListFrameTilemap, 0, 0); @@ -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..8a9061ace 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,16 +793,16 @@ 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}; + u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; ConvertIntToDecimalStringN(gStringVar1, GetCurrMonRibbonCount(), STR_CONV_MODE_LEFT_ALIGN, 2); DynamicPlaceholderTextUtil_Reset(); @@ -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(); - u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; + u32 ribbonId = GetRibbonId(); + u8 color[] = {TEXT_COLOR_RED, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; 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,18 +857,18 @@ 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); PrintRibbbonsSummaryMonInfo(structPtr); } -static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); -static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GREY}{WHITE}{LIGHT_GREY}"); +static const u8 sMaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_RED}{WHITE}{GREEN}♂{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); +static const u8 sFemaleIconString[] = _("{COLOR_HIGHLIGHT_SHADOW}{LIGHT_GREEN}{WHITE}{BLUE}♀{COLOR_HIGHLIGHT_SHADOW}{DARK_GRAY}{WHITE}{LIGHT_GRAY}"); 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/post_battle_event_funcs.c b/src/post_battle_event_funcs.c index 78ebe02e4..081a40218 100644 --- a/src/post_battle_event_funcs.c +++ b/src/post_battle_event_funcs.c @@ -8,7 +8,6 @@ #include "script_pokemon_util.h" #include "tv.h" #include "constants/heal_locations.h" -#include "constants/tv.h" int GameClear(void) { diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index bc6758cae..24e76e1c9 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -1627,8 +1627,8 @@ static void Task_DuoFightAnim(u8 taskId) StopMapMusic(); } - BlendPalettes(-1, 0x10, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 0x10, 0); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_DuoFight); PlaySE(SE_DOWNPOUR); } @@ -1738,21 +1738,21 @@ static void Task_HandleDuoFight(u8 taskId) static void DuoFight_Lightning1(void) { PlaySE(SE_THUNDER); - BlendPalettesGradually(0x00007FFF, 0, 16, 0, RGB_WHITEALPHA, 0, 0); - BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); + BlendPalettesGradually(PALETTES_BG & ~(0x8000), 0, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(PALETTES_OBJECTS, 0, 16, 0, RGB_BLACK, 0, 1); } static void DuoFight_Lightning2(void) { PlaySE(SE_THUNDER); - BlendPalettesGradually(0x00007FFF, 0, 16, 16, RGB_WHITEALPHA, 0, 0); - BlendPalettesGradually(0xFFFF0000, 0, 16, 16, RGB_BLACK, 0, 1); + BlendPalettesGradually(PALETTES_BG & ~(0x8000), 0, 16, 16, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(PALETTES_OBJECTS, 0, 16, 16, RGB_BLACK, 0, 1); } static void DuoFight_LightningLong(void) { - BlendPalettesGradually(0x00007FFF, 4, 16, 0, RGB_WHITEALPHA, 0, 0); - BlendPalettesGradually(0xFFFF0000, 4, 16, 0, RGB_BLACK, 0, 1); + BlendPalettesGradually(PALETTES_BG & ~(0x8000), 4, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(PALETTES_OBJECTS, 4, 16, 0, RGB_BLACK, 0, 1); } static void DuoFight_AnimateRain(void) @@ -1784,7 +1784,7 @@ static void DuoFight_PanOffScene(u8 taskId) static void DuoFightEnd(u8 taskId, s8 palDelay) { PlaySE(SE_DOWNPOUR_STOP); - BeginNormalPaletteFade(0xFFFFFFFF, palDelay, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, palDelay, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_DuoFightEnd; } @@ -1860,7 +1860,7 @@ static void SpriteCB_DuoFight_Groudon(struct Sprite *sprite) static void DuoFight_SlideGroudonDown(struct Sprite *sprite) { s16 *data = sprite->data; - if (sprite->pos1.y <= 160) + if (sprite->pos1.y <= DISPLAY_HEIGHT) { sprite->pos1.y += 8; gSprites[sprite->sGroudonBodySpriteId].pos1.y += 8; @@ -1965,7 +1965,7 @@ static void SpriteCB_DuoFight_Kyogre(struct Sprite *sprite) static void DuoFight_SlideKyogreDown(struct Sprite *sprite) { s16 *data = sprite->data; - if (sprite->pos1.y <= 160) + if (sprite->pos1.y <= DISPLAY_HEIGHT) { sprite->pos1.y += 8; gSprites[sprite->data[0] >> 8].pos1.y += 8; @@ -2045,7 +2045,7 @@ static void Task_RayTakesFlightAnim(u8 taskId) LoadTakesFlightSceneGfx(); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_OBJ | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8)); - BlendPalettes(-1, 16, 0); + BlendPalettes(PALETTES_ALL, 16, 0); SetVBlankCallback(VBlankCB_RayquazaScene); CreateTask(Task_TakesFlight_CreateSmoke, 0); tState = 0; @@ -2064,7 +2064,7 @@ static void Task_HandleRayTakesFlight(u8 taskId) // Delay, then fade in if (tTimer == 8) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); tScale = 0; tScaleSpeed = 30; tYCoord = 0; @@ -2110,7 +2110,7 @@ static void Task_HandleRayTakesFlight(u8 taskId) if (tTimer > 295) { tState++; - BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 6, 0, 0x10, RGB_BLACK); } } break; @@ -2284,7 +2284,7 @@ static void Task_RayDescendsAnim(u8 taskId) LoadDescendsSceneGfx(); SetGpuRegBits(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); - BlendPalettes(-1, 0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); sRayScene->revealedLightLine = 0; sRayScene->revealedLightTimer = 0; @@ -2305,7 +2305,7 @@ static void Task_HandleRayDescends(u8 taskId) // Delay, then fade in if (tTimer == 8) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); tTimer = 0; tState++; } @@ -2354,7 +2354,7 @@ static void Task_HandleRayDescends(u8 taskId) break; case 4: // Fade out - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayDescendsEnd; break; } @@ -2501,7 +2501,7 @@ static void Task_RayChargesAnim(u8 taskId) InitChargesSceneBgs(); LoadChargesSceneGfx(); SetWindowsHideVertBorders(); - BlendPalettes(-1, 0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); tState = 0; tTimer = 0; @@ -2523,7 +2523,7 @@ static void Task_HandleRayCharges(u8 taskId) // Delay, then fade in if (tTimer == 8) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); tTimer = 0; tState++; } @@ -2559,7 +2559,7 @@ static void Task_HandleRayCharges(u8 taskId) break; case 3: // Fade out - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayChargesEnd; break; } @@ -2697,7 +2697,7 @@ static void Task_RayChasesAwayAnim(u8 taskId) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(9, 14)); - BlendPalettes(-1, 0x10, 0); + BlendPalettes(PALETTES_ALL, 0x10, 0); SetVBlankCallback(VBlankCB_RayquazaScene); tState = 0; tTimer = 0; @@ -2720,7 +2720,7 @@ static void Task_HandleRayChasesAway(u8 taskId) if (tTimer == 8) { ChasesAway_CreateTrioSprites(taskId); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); tTimer = 0; tState++; } @@ -2760,14 +2760,14 @@ static void Task_HandleRayChasesAway(u8 taskId) tTimer++; if (tTimer % 144 == 0) { - BlendPalettesGradually(0x0000FFFE, 0, 16, 0, RGB_WHITEALPHA, 0, 0); - BlendPalettesGradually(0xFFFF0000, 0, 16, 0, RGB_BLACK, 0, 1); + BlendPalettesGradually(PALETTES_BG & ~1, 0, 16, 0, RGB_WHITEALPHA, 0, 0); + BlendPalettesGradually(PALETTES_OBJECTS, 0, 16, 0, RGB_BLACK, 0, 1); } } break; case 3: // Fade out - BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 4, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_RayChasesAwayEnd; break; } diff --git a/src/record_mixing.c b/src/record_mixing.c index 898459c0a..aa6e4eef2 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -50,8 +50,8 @@ struct PlayerRecordsRS TVShow tvShows[TV_SHOWS_COUNT]; PokeNews pokeNews[POKE_NEWS_COUNT]; OldMan oldMan; - struct EasyChatPair easyChatPairs[5]; - struct RecordMixingDayCareMail dayCareMail; + struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT]; + struct RecordMixingDaycareMail daycareMail; struct RSBattleTowerRecord battleTowerRecord; u16 giftItem; u16 filler11C8[0x32]; @@ -63,8 +63,8 @@ struct PlayerRecordsEmerald /* 0x0c80 */ TVShow tvShows[TV_SHOWS_COUNT]; /* 0x1004 */ PokeNews pokeNews[POKE_NEWS_COUNT]; /* 0x1044 */ OldMan oldMan; - /* 0x1084 */ struct EasyChatPair easyChatPairs[5]; - /* 0x10ac */ struct RecordMixingDayCareMail dayCareMail; + /* 0x1084 */ struct DewfordTrend dewfordTrends[SAVED_TRENDS_COUNT]; + /* 0x10ac */ struct RecordMixingDaycareMail daycareMail; /* 0x1124 */ struct EmeraldBattleTowerRecord battleTowerRecord; /* 0x1210 */ u16 giftItem; /* 0x1214 */ LilycoveLady lilycoveLady; @@ -86,18 +86,17 @@ static struct SecretBase *sSecretBasesSave; static TVShow *sTvShowsSave; static PokeNews *sPokeNewsSave; static OldMan *sOldManSave; -static struct EasyChatPair *sEasyChatPairsSave; -static struct RecordMixingDayCareMail *gUnknown_03001148; +static struct DewfordTrend *sDewfordTrendsSave; +static struct RecordMixingDaycareMail *sDaycareMailSave; static void *sBattleTowerSave; static LilycoveLady *sLilycoveLadySave; static void *sApprenticesSave; static void *sBattleTowerSave_Duplicate; static u32 sRecordStructSize; static u8 gUnknown_03001160; -static u32 filler_03001164; static struct PlayerHallRecords *gUnknown_03001168[3]; -static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0}; +static EWRAM_DATA struct RecordMixingDaycareMail sDaycareMail = {0}; static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL; static EWRAM_DATA union PlayerRecords *sSentRecord = NULL; @@ -116,14 +115,14 @@ static void ReceiveOldManData(OldMan *, size_t, u8); static void ReceiveBattleTowerData(void *battleTowerRecord, size_t, u8); static void ReceiveLilycoveLadyData(LilycoveLady *, size_t, u8); static void sub_80E7B2C(const u8 *); -static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *, size_t, u8, TVShow *); +static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *, size_t, u8, TVShow *); static void ReceiveGiftItem(u16 *item, u8 which); static void Task_DoRecordMixing(u8 taskId); static void GetSavedApprentices(struct Apprentice *dst, struct Apprentice *src); static void ReceiveApprenticeData(struct Apprentice *mixApprentice, size_t recordSize, u32 multiplayerId); static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, size_t arg1, u32 arg2); -static void sub_80E89F8(struct RecordMixingDayCareMail *dst); -static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src); +static void GetRecordMixingDaycareMail(struct RecordMixingDaycareMail *dst); +static void SanitizeDaycareMailForRuby(struct RecordMixingDaycareMail *src); static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *arg0); static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src); @@ -180,8 +179,8 @@ static void SetSrcLookupPointers(void) sTvShowsSave = gSaveBlock1Ptr->tvShows; sPokeNewsSave = gSaveBlock1Ptr->pokeNews; sOldManSave = &gSaveBlock1Ptr->oldMan; - sEasyChatPairsSave = gSaveBlock1Ptr->easyChatPairs; - gUnknown_03001148 = &gUnknown_02039F9C; + sDewfordTrendsSave = gSaveBlock1Ptr->dewfordTrends; + sDaycareMailSave = &sDaycareMail; sBattleTowerSave = &gSaveBlock2Ptr->frontier.towerPlayer; sLilycoveLadySave = &gSaveBlock1Ptr->lilycoveLady; sApprenticesSave = gSaveBlock2Ptr->apprentices; @@ -192,11 +191,11 @@ static void PrepareUnknownExchangePacket(struct PlayerRecordsRS *dest) { memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases)); memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows)); - sub_80F14F8(dest->tvShows); + SanitizeTVShowLocationsForRuby(dest->tvShows); memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews)); memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan)); - memcpy(dest->easyChatPairs, sEasyChatPairsSave, sizeof(dest->easyChatPairs)); - sub_80E89F8(&dest->dayCareMail); + memcpy(dest->dewfordTrends, sDewfordTrendsSave, sizeof(dest->dewfordTrends)); + GetRecordMixingDaycareMail(&dest->daycareMail); EmeraldBattleTowerRecordToRuby(sBattleTowerSave, &dest->battleTowerRecord); if (GetMultiplayerId() == 0) @@ -208,13 +207,13 @@ static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest) memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases)); ClearJapaneseSecretBases(dest->secretBases); memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows)); - sub_80F1208(dest->tvShows); + SanitizeTVShowsForRuby(dest->tvShows); memcpy(dest->pokeNews, sPokeNewsSave, sizeof(dest->pokeNews)); memcpy(&dest->oldMan, sOldManSave, sizeof(dest->oldMan)); - sub_8120B70(&dest->oldMan); - memcpy(dest->easyChatPairs, sEasyChatPairsSave, sizeof(dest->easyChatPairs)); - sub_80E89F8(&dest->dayCareMail); - SanitizeDayCareMailForRuby(&dest->dayCareMail); + SanitizeMauvilleOldManForRuby(&dest->oldMan); + memcpy(dest->dewfordTrends, sDewfordTrendsSave, sizeof(dest->dewfordTrends)); + GetRecordMixingDaycareMail(&dest->daycareMail); + SanitizeDaycareMailForRuby(&dest->daycareMail); EmeraldBattleTowerRecordToRuby(sBattleTowerSave, &dest->battleTowerRecord); SanitizeRubyBattleTowerRecord(&dest->battleTowerRecord); @@ -225,7 +224,7 @@ static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest) static void PrepareExchangePacket(void) { SetPlayerSecretBaseParty(); - sub_80F0BB8(); + DeactivateAllNormalTVShows(); SetSrcLookupPointers(); if (Link_AnyPartnersPlayingRubyOrSapphire()) @@ -242,8 +241,8 @@ static void PrepareExchangePacket(void) memcpy(sSentRecord->emerald.pokeNews, sPokeNewsSave, sizeof(sSentRecord->emerald.pokeNews)); memcpy(&sSentRecord->emerald.oldMan, sOldManSave, sizeof(sSentRecord->emerald.oldMan)); memcpy(&sSentRecord->emerald.lilycoveLady, sLilycoveLadySave, sizeof(sSentRecord->emerald.lilycoveLady)); - memcpy(sSentRecord->emerald.easyChatPairs, sEasyChatPairsSave, sizeof(sSentRecord->emerald.easyChatPairs)); - sub_80E89F8(&sSentRecord->emerald.dayCareMail); + memcpy(sSentRecord->emerald.dewfordTrends, sDewfordTrendsSave, sizeof(sSentRecord->emerald.dewfordTrends)); + GetRecordMixingDaycareMail(&sSentRecord->emerald.daycareMail); memcpy(&sSentRecord->emerald.battleTowerRecord, sBattleTowerSave, sizeof(sSentRecord->emerald.battleTowerRecord)); SanitizeEmeraldBattleTowerRecord(&sSentRecord->emerald.battleTowerRecord); @@ -262,12 +261,12 @@ static void ReceiveExchangePacket(u32 which) // Ruby/Sapphire sub_80E7B2C((void *)sReceivedRecords->ruby.tvShows); ReceiveSecretBasesData(sReceivedRecords->ruby.secretBases, sizeof(struct PlayerRecordsRS), which); - ReceiveDaycareMailData(&sReceivedRecords->ruby.dayCareMail, sizeof(struct PlayerRecordsRS), which, sReceivedRecords->ruby.tvShows); + ReceiveDaycareMailData(&sReceivedRecords->ruby.daycareMail, sizeof(struct PlayerRecordsRS), which, sReceivedRecords->ruby.tvShows); ReceiveBattleTowerData(&sReceivedRecords->ruby.battleTowerRecord, sizeof(struct PlayerRecordsRS), which); ReceiveTvShowsData(sReceivedRecords->ruby.tvShows, sizeof(struct PlayerRecordsRS), which); ReceivePokeNewsData(sReceivedRecords->ruby.pokeNews, sizeof(struct PlayerRecordsRS), which); ReceiveOldManData(&sReceivedRecords->ruby.oldMan, sizeof(struct PlayerRecordsRS), which); - ReceiveEasyChatPairsData(sReceivedRecords->ruby.easyChatPairs, sizeof(struct PlayerRecordsRS), which); + ReceiveDewfordTrendData(sReceivedRecords->ruby.dewfordTrends, sizeof(struct PlayerRecordsRS), which); ReceiveGiftItem(&sReceivedRecords->ruby.giftItem, which); } else @@ -278,8 +277,8 @@ static void ReceiveExchangePacket(u32 which) ReceiveTvShowsData(sReceivedRecords->emerald.tvShows, sizeof(struct PlayerRecordsEmerald), which); ReceivePokeNewsData(sReceivedRecords->emerald.pokeNews, sizeof(struct PlayerRecordsEmerald), which); ReceiveOldManData(&sReceivedRecords->emerald.oldMan, sizeof(struct PlayerRecordsEmerald), which); - ReceiveEasyChatPairsData(sReceivedRecords->emerald.easyChatPairs, sizeof(struct PlayerRecordsEmerald), which); - ReceiveDaycareMailData(&sReceivedRecords->emerald.dayCareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows); + ReceiveDewfordTrendData(sReceivedRecords->emerald.dewfordTrends, sizeof(struct PlayerRecordsEmerald), which); + ReceiveDaycareMailData(&sReceivedRecords->emerald.daycareMail, sizeof(struct PlayerRecordsEmerald), which, sReceivedRecords->emerald.tvShows); ReceiveBattleTowerData(&sReceivedRecords->emerald.battleTowerRecord, sizeof(struct PlayerRecordsEmerald), which); ReceiveGiftItem(&sReceivedRecords->emerald.giftItem, which); ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which); @@ -320,7 +319,7 @@ static void Task_RecordMixing_Main(u8 taskId) { case 0: // init sSentRecord = malloc(sizeof(union PlayerRecords)); - sReceivedRecords = malloc(sizeof(union PlayerRecords) * 4); + sReceivedRecords = malloc(sizeof(union PlayerRecords) * MAX_LINK_PLAYERS); SetLocalLinkPlayerId(gSpecialVar_0x8005); VarSet(VAR_TEMP_0, 1); gUnknown_03001130 = FALSE; @@ -364,7 +363,7 @@ static void Task_RecordMixing_Main(u8 taskId) { free(sReceivedRecords); free(sSentRecord); - sub_808729C(); + SetLinkWaitingForScript(); if (gWirelessCommType != 0) { CreateTask(Task_ReturnToFieldRecordMixing, 10); @@ -666,7 +665,7 @@ static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u { memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(struct EmeraldBattleTowerRecord)); dest = (void *)battleTowerRecord + recordSize * which; - for (i = 0; i < 4; i ++) + for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++) { btPokemon = &dest->party[i]; if (btPokemon->species != SPECIES_NONE && IsStringJapanese(btPokemon->nickname)) @@ -707,22 +706,22 @@ static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSiz } } -static u8 sub_80E7A9C(struct DayCareMail *rmMail) +static u8 sub_80E7A9C(struct DaycareMail *rmMail) { return rmMail->message.itemId; } -static void sub_80E7AA4(struct RecordMixingDayCareMail *src, size_t recordSize, u8 (*idxs)[2], u8 which0, u8 which1) +static void sub_80E7AA4(struct RecordMixingDaycareMail *src, size_t recordSize, u8 (*idxs)[2], u8 which0, u8 which1) { - struct DayCareMail buffer; - struct RecordMixingDayCareMail *mail1; - struct RecordMixingDayCareMail *mail2; + struct DaycareMail buffer; + struct RecordMixingDaycareMail *mail1; + struct RecordMixingDaycareMail *mail2; mail1 = (void *)src + recordSize * idxs[which0][0]; - memcpy(&buffer, &mail1->mail[idxs[which0][1]], sizeof(struct DayCareMail)); + memcpy(&buffer, &mail1->mail[idxs[which0][1]], sizeof(struct DaycareMail)); mail2 = (void *)src + recordSize * idxs[which1][0]; - memcpy(&mail1->mail[idxs[which0][1]], &mail2->mail[idxs[which1][1]], sizeof(struct DayCareMail)); - memcpy(&mail2->mail[idxs[which1][1]], &buffer, sizeof(struct DayCareMail)); + memcpy(&mail1->mail[idxs[which0][1]], &mail2->mail[idxs[which1][1]], sizeof(struct DaycareMail)); + memcpy(&mail2->mail[idxs[which1][1]], &buffer, sizeof(struct DaycareMail)); } static void sub_80E7B2C(const u8 *src) @@ -731,7 +730,7 @@ static void sub_80E7B2C(const u8 *src) s32 i; sum = 0; - for (i = 0; i < 256; i ++) + for (i = 0; i < 256; i++) sum += src[i]; gUnknown_03001160 = sum; @@ -742,17 +741,17 @@ static u8 sub_80E7B54(void) return gUnknown_03001160; } -static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows) +static void ReceiveDaycareMailData(struct RecordMixingDaycareMail *src, size_t recordSize, u8 which, TVShow *shows) { u16 i, j; u8 linkPlayerCount; u8 tableId; - struct RecordMixingDayCareMail *_src; + struct RecordMixingDaycareMail *_src; u8 which0, which1; void *ptr; u8 sp04[4]; u8 sp08[4]; - struct RecordMixingDayCareMail *sp0c[4]; + struct RecordMixingDaycareMail *sp0c[4]; u8 sp1c[4][2]; u8 sp24[4][2]; u8 sp34; @@ -778,10 +777,10 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r _src = (void *)src + i * recordSize; language = gLinkPlayers[i].language; version = gLinkPlayers[i].version & 0xFF; - for (j = 0; j < _src->numDaycareMons; j ++) + for (j = 0; j < _src->numDaycareMons; j++) { u16 otNameLanguage, nicknameLanguage; - struct DayCareMail *recordMixingMail = &_src->mail[j]; + struct DaycareMail *recordMixingMail = &_src->mail[j]; if (!recordMixingMail->message.itemId) continue; @@ -836,7 +835,7 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r if (_src->numDaycareMons == 0) continue; - for (j = 0; j < _src->numDaycareMons; j ++) + for (j = 0; j < _src->numDaycareMons; j++) { if (!_src->holdsItem[j]) sp1c[i][j] = 1; @@ -914,8 +913,8 @@ static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t r } _src = (void *)src + which * recordSize; - memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DayCareMail)); - memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DayCareMail)); + memcpy(&gSaveBlock1Ptr->daycare.mons[0].mail, &_src->mail[0], sizeof(struct DaycareMail)); + memcpy(&gSaveBlock1Ptr->daycare.mons[1].mail, &_src->mail[1], sizeof(struct DaycareMail)); SeedRng(oldSeed); } @@ -958,7 +957,7 @@ static void Task_DoRecordMixing(u8 taskId) case 2: SetContinueGameWarpStatusToDynamicWarp(); FullSaveGame(); - task->data[0] ++; + task->data[0]++; break; case 3: if (CheckSaveFile()) @@ -972,7 +971,7 @@ static void Task_DoRecordMixing(u8 taskId) if (++task->data[1] > 10) { SetCloseLinkCallback(); - task->data[0] ++; + task->data[0]++; } break; case 5: @@ -985,7 +984,7 @@ static void Task_DoRecordMixing(u8 taskId) if (!sub_801048C(FALSE)) { CreateTask(Task_LinkSave, 5); - task->data[0] ++; + task->data[0]++; } break; case 7: // wait for Task_LinkSave to finish. @@ -1004,7 +1003,7 @@ static void Task_DoRecordMixing(u8 taskId) break; case 8: SetLinkStandbyCallback(); - task->data[0] ++; + task->data[0]++; break; case 9: if (IsLinkTaskFinished()) @@ -1062,13 +1061,9 @@ static void GetSavedApprentices(struct Apprentice *dst, struct Apprentice *src) break; case 2: if (Random2() > 0x3333) - { dst[1] = src[gSaveBlock2Ptr->playerApprentice.saveId + 1]; - } else - { dst[1] = src[((gSaveBlock2Ptr->playerApprentice.saveId + 1) % (APPRENTICE_COUNT - 1) + 1)]; - } break; } } @@ -1222,7 +1217,7 @@ static void sub_80E8578(struct RecordMixingHallRecords *dst, void *hallRecords, for (l = 0; l < 3; l++) { if (GetTrainerId(dst->hallRecords2P[j][l].id1) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id1) - && GetTrainerId(dst->hallRecords2P[j][l].id2) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id2)) + && GetTrainerId(dst->hallRecords2P[j][l].id2) == GetTrainerId(gUnknown_03001168[k]->twoPlayers[j].id2)) { var_68++; if (dst->hallRecords2P[j][l].winStreak < gUnknown_03001168[k]->twoPlayers[j].winStreak) @@ -1309,21 +1304,21 @@ static void ReceiveRankingHallRecords(struct PlayerHallRecords *hallRecords, siz Free(largeStructPtr); } -static void sub_80E89F8(struct RecordMixingDayCareMail *dst) +static void GetRecordMixingDaycareMail(struct RecordMixingDaycareMail *dst) { - gUnknown_02039F9C.mail[0] = gSaveBlock1Ptr->daycare.mons[0].mail; - gUnknown_02039F9C.mail[1] = gSaveBlock1Ptr->daycare.mons[1].mail; - InitDaycareMailRecordMixing(&gSaveBlock1Ptr->daycare, &gUnknown_02039F9C); - *dst = *gUnknown_03001148; + sDaycareMail.mail[0] = gSaveBlock1Ptr->daycare.mons[0].mail; + sDaycareMail.mail[1] = gSaveBlock1Ptr->daycare.mons[1].mail; + InitDaycareMailRecordMixing(&gSaveBlock1Ptr->daycare, &sDaycareMail); + *dst = *sDaycareMailSave; } -static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src) +static void SanitizeDaycareMailForRuby(struct RecordMixingDaycareMail *src) { s32 i; for (i = 0; i < src->numDaycareMons; i++) { - struct DayCareMail *mail = &src->mail[i]; + struct DaycareMail *mail = &src->mail[i]; if (mail->message.itemId != 0) { if (mail->gameLanguage != LANGUAGE_JAPANESE) @@ -1343,10 +1338,10 @@ static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *ds { s32 i; - for (i = 0; i < 4; i++) + for (i = 0; i < MAX_FRONTIER_PARTY_SIZE; i++) { struct BattleTowerPokemon *towerMon = &dst->party[i]; - if (towerMon->species != 0) + if (towerMon->species != SPECIES_NONE) StripExtCtrlCodes(towerMon->nickname); } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 5a0579f70..e29792766 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -55,7 +55,7 @@ struct RecordedBattleSave u16 opponentA; u16 opponentB; u16 partnerId; - u16 field_4FA; + u16 multiplayerId; u8 lvlMode; u8 frontierFacility; u8 frontierBrainSymbol; @@ -75,16 +75,16 @@ struct RecordedBattleSave EWRAM_DATA u32 gRecordedBattleRngSeed = 0; EWRAM_DATA u32 gBattlePalaceMoveSelectionRngValue = 0; EWRAM_DATA static u8 sBattleRecords[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE] = {0}; -EWRAM_DATA static u16 sRecordedBytesNo[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA static u16 sUnknown_0203C79C[4] = {0}; -EWRAM_DATA static u16 sUnknown_0203C7A4[4] = {0}; -EWRAM_DATA static u8 sUnknown_0203C7AC = 0; +EWRAM_DATA static u16 sBattlerRecordSizes[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA static u16 sBattlerPrevRecordSizes[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA static u16 sBattlerSavedRecordSizes[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA static u8 sRecordMode = 0; EWRAM_DATA static u8 sLvlMode = 0; EWRAM_DATA static u8 sFrontierFacility = 0; EWRAM_DATA static u8 sFrontierBrainSymbol = 0; EWRAM_DATA static MainCallback sCallback2_AfterRecordedBattle = NULL; -EWRAM_DATA u8 gUnknown_0203C7B4 = 0; -EWRAM_DATA static u8 sUnknown_0203C7B5 = 0; +EWRAM_DATA u8 gRecordedBattleMultiplayerId = 0; +EWRAM_DATA static u8 sFrontierPassFlag = 0; EWRAM_DATA static u8 sBattleScene = 0; EWRAM_DATA static u8 sTextSpeed = 0; EWRAM_DATA static u32 sBattleFlags = 0; @@ -93,7 +93,7 @@ EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0}; EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0}; EWRAM_DATA static u16 sPlayerMonMoves[2][MAX_MON_MOVES] = {0}; EWRAM_DATA static struct PlayerInfo sPlayers[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA static u8 sUnknown_0203CCD0 = 0; +EWRAM_DATA static bool8 sUnknown_0203CCD0 = 0; EWRAM_DATA static u8 sRecordMixFriendName[PLAYER_NAME_LENGTH + 1] = {0}; EWRAM_DATA static u8 sRecordMixFriendClass = 0; EWRAM_DATA static u8 sApprenticeId = 0; @@ -103,26 +103,25 @@ EWRAM_DATA static u8 sBattleOutcome = 0; static u8 sRecordMixFriendLanguage; static u8 sApprenticeLanguage; -// this file's functions -static u8 sub_8185278(u8 *arg0, u8 *arg1, u8 *arg2); -static bool32 CopyRecordedBattleFromSave(struct RecordedBattleSave *dst); +static u8 GetNextRecordedDataByte(u8 *, u8 *, u8 *); +static bool32 CopyRecordedBattleFromSave(struct RecordedBattleSave *); static void RecordedBattle_RestoreSavedParties(void); static void CB2_RecordedBattle(void); -void sub_8184DA4(u8 arg0) +void RecordedBattle_Init(u8 mode) { s32 i, j; - sUnknown_0203C7AC = arg0; - sUnknown_0203CCD0 = 0; + sRecordMode = mode; + sUnknown_0203CCD0 = FALSE; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - sRecordedBytesNo[i] = 0; - sUnknown_0203C79C[i] = 0; - sUnknown_0203C7A4[i] = 0; + sBattlerRecordSizes[i] = 0; + sBattlerPrevRecordSizes[i] = 0; + sBattlerSavedRecordSizes[i] = 0; - if (arg0 == 1) + if (mode == B_RECORD_MODE_RECORDING) { for (j = 0; j < BATTLER_RECORD_SIZE; j++) { @@ -138,13 +137,13 @@ void sub_8184E58(void) { s32 i, j; - if (sUnknown_0203C7AC == 1) + if (sRecordMode == B_RECORD_MODE_RECORDING) { gRecordedBattleRngSeed = gRngValue; sFrontierFacility = VarGet(VAR_FRONTIER_FACILITY); sFrontierBrainSymbol = GetFronterBrainSymbol(); } - else if (sUnknown_0203C7AC == 2) + else if (sRecordMode == B_RECORD_MODE_PLAYBACK) { gRngValue = gRecordedBattleRngSeed; } @@ -154,7 +153,7 @@ void sub_8184E58(void) u8 linkPlayersCount; u8 text[30]; - gUnknown_0203C7B4 = GetMultiplayerId(); + gRecordedBattleMultiplayerId = GetMultiplayerId(); linkPlayersCount = GetLinkPlayerCount(); for (i = 0; i < MAX_BATTLERS_COUNT; i++) @@ -195,9 +194,9 @@ void sub_8184E58(void) void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action) { - if (sRecordedBytesNo[battlerId] < BATTLER_RECORD_SIZE && sUnknown_0203C7AC != 2) + if (sBattlerRecordSizes[battlerId] < BATTLER_RECORD_SIZE && sRecordMode != B_RECORD_MODE_PLAYBACK) { - sBattleRecords[battlerId][sRecordedBytesNo[battlerId]++] = action; + sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]++] = action; } } @@ -207,9 +206,9 @@ void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear) for (i = 0; i < bytesToClear; i++) { - sRecordedBytesNo[battlerId]--; - sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] = 0xFF; - if (sRecordedBytesNo[battlerId] == 0) + sBattlerRecordSizes[battlerId]--; + sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]] = 0xFF; + if (sBattlerRecordSizes[battlerId] == 0) break; } } @@ -217,54 +216,55 @@ void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear) u8 RecordedBattle_GetBattlerAction(u8 battlerId) { // Trying to read past array or invalid action byte, battle is over. - if (sRecordedBytesNo[battlerId] >= BATTLER_RECORD_SIZE || sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == 0xFF) + if (sBattlerRecordSizes[battlerId] >= BATTLER_RECORD_SIZE || sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]] == 0xFF) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; // hah ResetPaletteFadeControl(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); SetMainCallback2(CB2_QuitRecordedBattle); return 0xFF; } else { - return sBattleRecords[battlerId][sRecordedBytesNo[battlerId]++]; + return sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]++]; } } -u8 sub_81850D0(void) +// Unused +static u8 GetRecordedBattleMode(void) { - return sUnknown_0203C7AC; + return sRecordMode; } -u8 sub_81850DC(u8 *arg0) +u8 RecordedBattle_BufferNewBattlerData(u8 *dst) { u8 i, j; - u8 ret = 0; + u8 idx = 0; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - if (sRecordedBytesNo[i] != sUnknown_0203C79C[i]) + if (sBattlerRecordSizes[i] != sBattlerPrevRecordSizes[i]) { - arg0[ret++] = i; - arg0[ret++] = sRecordedBytesNo[i] - sUnknown_0203C79C[i]; + dst[idx++] = i; + dst[idx++] = sBattlerRecordSizes[i] - sBattlerPrevRecordSizes[i]; - for (j = 0; j < sRecordedBytesNo[i] - sUnknown_0203C79C[i]; j++) + for (j = 0; j < sBattlerRecordSizes[i] - sBattlerPrevRecordSizes[i]; j++) { - arg0[ret++] = sBattleRecords[i][sUnknown_0203C79C[i] + j]; + dst[idx++] = sBattleRecords[i][sBattlerPrevRecordSizes[i] + j]; } - sUnknown_0203C79C[i] = sRecordedBytesNo[i]; + sBattlerPrevRecordSizes[i] = sBattlerRecordSizes[i]; } } - return ret; + return idx; } -void sub_81851A8(u8 *arg0) +void RecordedBattle_RecordAllBattlerData(u8 *src) { s32 i; - u8 var1 = 2; - u8 var2; + u8 idx = 2; + u8 size; if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) return; @@ -277,23 +277,23 @@ void sub_81851A8(u8 *arg0) if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { - for (var2 = *arg0; var2 != 0;) + for (size = *src; size != 0;) { - u8 unkVar = sub_8185278(arg0, &var1, &var2); - u8 unkVar2 = sub_8185278(arg0, &var1, &var2); + u8 battlerId = GetNextRecordedDataByte(src, &idx, &size); + u8 numActions = GetNextRecordedDataByte(src, &idx, &size); - for (i = 0; i < unkVar2; i++) + for (i = 0; i < numActions; i++) { - sBattleRecords[unkVar][sUnknown_0203C7A4[unkVar]++] = sub_8185278(arg0, &var1, &var2); + sBattleRecords[battlerId][sBattlerSavedRecordSizes[battlerId]++] = GetNextRecordedDataByte(src, &idx, &size); } } } } -static u8 sub_8185278(u8 *arg0, u8 *arg1, u8 *arg2) +static u8 GetNextRecordedDataByte(u8 *data, u8 *idx, u8 *size) { - (*arg2)--; - return arg0[(*arg1)++]; + (*size)--; + return data[(*idx)++]; } bool32 CanCopyRecordedBattleSaveData(void) @@ -362,11 +362,14 @@ bool32 MoveRecordedBattleToSaveData(void) if (sBattleFlags & BATTLE_TYPE_LINK) { - battleSave->battleFlags = (sBattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20)) | BATTLE_TYPE_x2000000; + battleSave->battleFlags = (sBattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_LINK_IN_BATTLE)) | BATTLE_TYPE_RECORDED_LINK; + // BATTLE_TYPE_RECORDED_IS_MASTER set indicates battle will play + // out from player's perspective (i.e. player with back to camera) + // Otherwise player will appear on "opponent" side if (sBattleFlags & BATTLE_TYPE_IS_MASTER) { - battleSave->battleFlags |= BATTLE_TYPE_x80000000; + battleSave->battleFlags |= BATTLE_TYPE_RECORDED_IS_MASTER; } else if (sBattleFlags & BATTLE_TYPE_MULTI) { @@ -374,13 +377,13 @@ bool32 MoveRecordedBattleToSaveData(void) { case 0: case 2: - if (!(sPlayers[gUnknown_0203C7B4].battlerId & 1)) - battleSave->battleFlags |= BATTLE_TYPE_x80000000; + if (!(sPlayers[gRecordedBattleMultiplayerId].battlerId & 1)) + battleSave->battleFlags |= BATTLE_TYPE_RECORDED_IS_MASTER; break; case 1: case 3: - if ((sPlayers[gUnknown_0203C7B4].battlerId & 1)) - battleSave->battleFlags |= BATTLE_TYPE_x80000000; + if ((sPlayers[gRecordedBattleMultiplayerId].battlerId & 1)) + battleSave->battleFlags |= BATTLE_TYPE_RECORDED_IS_MASTER; break; } } @@ -393,7 +396,7 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->opponentA = gTrainerBattleOpponent_A; battleSave->opponentB = gTrainerBattleOpponent_B; battleSave->partnerId = gPartnerTrainerId; - battleSave->field_4FA = gUnknown_0203C7B4; + battleSave->multiplayerId = gRecordedBattleMultiplayerId; battleSave->lvlMode = gSaveBlock2Ptr->frontier.lvlMode; battleSave->frontierFacility = sFrontierFacility; battleSave->frontierBrainSymbol = sFrontierBrainSymbol; @@ -573,7 +576,7 @@ static void SetVariablesForRecordedBattle(struct RecordedBattleSave *src) gTrainerBattleOpponent_A = src->opponentA; gTrainerBattleOpponent_B = src->opponentB; gPartnerTrainerId = src->partnerId; - gUnknown_0203C7B4 = src->field_4FA; + gRecordedBattleMultiplayerId = src->multiplayerId; sLvlMode = gSaveBlock2Ptr->frontier.lvlMode; sFrontierFacility = src->frontierFacility; sFrontierBrainSymbol = src->frontierBrainSymbol; @@ -684,19 +687,20 @@ u8 GetActiveBattlerLinkPlayerGender(void) return 0; } -void sub_8185F84(void) +void RecordedBattle_ClearFrontierPassFlag(void) { - sUnknown_0203C7B5 = 0; + sFrontierPassFlag = 0; } -void sub_8185F90(u16 arg0) +// Set sFrontierPassFlag to received state of FLAG_SYS_FRONTIER_PASS +void RecordedBattle_SetFrontierPassFlagFromHword(u16 arg0) { - sUnknown_0203C7B5 |= (arg0 & 0x8000) >> 0xF; + sFrontierPassFlag |= (arg0 & 0x8000) >> 15; } -u8 sub_8185FAC(void) +u8 RecordedBattle_GetFrontierPassFlag(void) { - return sUnknown_0203C7B5; + return sFrontierPassFlag; } u8 GetBattleSceneInRecordedBattle(void) @@ -715,9 +719,9 @@ void RecordedBattle_CopyBattlerMoves(void) if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT) return; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return; - if (sUnknown_0203C7AC == 2) + if (sRecordMode == B_RECORD_MODE_PLAYBACK) return; for (i = 0; i < MAX_MON_MOVES; i++) @@ -732,7 +736,7 @@ void sub_818603C(u8 arg0) { s32 battlerId, j, k; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return; for (battlerId = 0; battlerId < gBattlersCount; battlerId++) @@ -764,7 +768,7 @@ void sub_818603C(u8 arg0) } else { - if (sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == ACTION_MOVE_CHANGE) + if (sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]] == ACTION_MOVE_CHANGE) { u8 ppBonuses[MAX_MON_MOVES]; u8 array1[MAX_MON_MOVES]; @@ -838,15 +842,15 @@ u32 GetAiScriptsInRecordedBattle(void) void sub_8186444(void) { - sUnknown_0203CCD0 = 1; + sUnknown_0203CCD0 = TRUE; } bool8 sub_8186450(void) { - return (sUnknown_0203CCD0 == 0); + return (sUnknown_0203CCD0 == FALSE); } -void sub_8186468(u8 *dst) +void GetRecordedBattleRecordMixFriendName(u8 *dst) { s32 i; diff --git a/src/region_map.c b/src/region_map.c index c2a5b4e9c..bec51ebf0 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -1677,7 +1677,7 @@ void CB2_OpenFlyMap(void) break; case 1: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sFlyMapBgTemplates, 3); + InitBgsFromTemplates(1, sFlyMapBgTemplates, ARRAY_COUNT(sFlyMapBgTemplates)); gMain.state++; break; case 2: @@ -1721,7 +1721,7 @@ void CB2_OpenFlyMap(void) gMain.state++; break; case 9: - BlendPalettes(-1, 16, 0); + BlendPalettes(PALETTES_ALL, 16, 0); SetVBlankCallback(VBlankCB_FlyMap); gMain.state++; break; @@ -1936,7 +1936,7 @@ static void CB_FadeInFlyMap(void) switch (sFlyMap->state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sFlyMap->state++; break; case 1: @@ -1983,7 +1983,7 @@ static void CB_ExitFlyMap(void) switch (sFlyMap->state) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sFlyMap->state++; break; case 1: diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c index d0e815816..cc4da7e16 100644 --- a/src/reset_rtc_screen.c +++ b/src/reset_rtc_screen.c @@ -19,24 +19,52 @@ #include "gpu_regs.h" #include "constants/rgb.h" -struct ResetRtcStruct +#define PALTAG_ARROW 0x1000 + +// Task data for the Task_ResetRtc_* series of tasks, when setting the time on the clock +// Data from these tasks is also used by the cursors and the main task (Task_ResetRtcScreen) +enum { + DATAIDX_DAYS = 3, + DATAIDX_HOURS, + DATAIDX_MINS, + DATAIDX_SECS, + DATAIDX_CONFIRM, +}; +#define tFinished data[0] +#define tSetTime data[1] +#define tSelection data[2] +#define tDays data[DATAIDX_DAYS] +#define tHours data[DATAIDX_HOURS] +#define tMinutes data[DATAIDX_MINS] +#define tSeconds data[DATAIDX_SECS] +#define tConfirm data[DATAIDX_CONFIRM] +#define tWindowId data[8] + +enum { + SELECTION_DAYS = 1, + SELECTION_HOURS, + SELECTION_MINS, + SELECTION_SECS, + SELECTION_CONFIRM, + SELECTION_NONE +}; + +struct ResetRtcInputMap { /*0x0*/ u8 dataIndex; /*0x2*/ u16 minVal; /*0x4*/ u16 maxVal; /*0x6*/ u8 left; /*0x7*/ u8 right; - /*0x8*/ u8 unk8; + /*0x8*/ u8 unk; // never read }; -// this file's functions static void CB2_ResetRtcScreen(void); static void VBlankCB(void); static void Task_ResetRtcScreen(u8 taskId); -static void sub_809F048(void); +static void InitResetRtcScreenBgAndWindows(void); -// const rom data -static const struct BgTemplate sBackgroundTemplates[] = +static const struct BgTemplate sBgTemplates[] = { { .bg = 0, @@ -49,60 +77,84 @@ static const struct BgTemplate sBackgroundTemplates[] = } }; -static const struct WindowTemplate sUnknown_08510408[] = +static const struct WindowTemplate sWindowTemplates[] = { - {0x00, 0x01, 0x01, 0x13, 0x09, 0x0f, 0x0155}, - {0x00, 0x02, 0x0f, 0x1b, 0x04, 0x0f, 0x00e9}, + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 19, + .height = 9, + .paletteNum = 15, + .baseBlock = 0x155 + }, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 27, + .height = 4, + .paletteNum = 15, + .baseBlock = 0xE9 + }, DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate sUnknown_08510420 = {0x00, 0x04, 0x09, 0x15, 0x02, 0x0f, 0x00bf}; +static const struct WindowTemplate sInputTimeWindow = { + .bg = 0, + .tilemapLeft = 4, + .tilemapTop = 9, + .width = 21, + .height = 2, + .paletteNum = 15, + .baseBlock = 0xBF +}; -static const struct ResetRtcStruct sUnknown_08510428[5] = +static const struct ResetRtcInputMap sInputMap[] = { - { - .dataIndex = 3, + [SELECTION_DAYS - 1] = { + .dataIndex = DATAIDX_DAYS, .minVal = 1, .maxVal = 9999, .left = 0, .right = 2, - .unk8 = 0, + .unk = 0, }, - { - .dataIndex = 4, + [SELECTION_HOURS - 1] = { + .dataIndex = DATAIDX_HOURS, .minVal = 0, .maxVal = 23, .left = 1, .right = 3, - .unk8 = 0, + .unk = 0, }, - { - .dataIndex = 5, + [SELECTION_MINS - 1] = { + .dataIndex = DATAIDX_MINS, .minVal = 0, .maxVal = 59, .left = 2, .right = 4, - .unk8 = 0, + .unk = 0, }, - { - .dataIndex = 6, + [SELECTION_SECS - 1] = { + .dataIndex = DATAIDX_SECS, .minVal = 0, .maxVal = 59, .left = 3, .right = 5, - .unk8 = 0, + .unk = 0, }, - { - .dataIndex = 7, + [SELECTION_CONFIRM - 1] = { + .dataIndex = DATAIDX_CONFIRM, .minVal = 0, .maxVal = 0, .left = 4, .right = 0, - .unk8 = 6, + .unk = 6, }, }; -static const struct OamData sOamData_08510464 = +static const struct OamData sOamData_Arrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -119,148 +171,158 @@ static const struct OamData sOamData_08510464 = .affineParam = 0, }; -static const u8 sResetRtcScreen_DownArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_downarrow.4bpp"); -static const u8 sResetRtcScreen_RightArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_rightarrow.4bpp"); -static const u16 sResetRtcScreen_ArrowPal[] = INCBIN_U16("graphics/misc/reset_rtc_screen_arrow.gbapal"); +static const u8 sArrowDown_Gfx[] = INCBIN_U8("graphics/reset_rtc_screen/arrow_down.4bpp"); +static const u8 sArrowRight_Gfx[] = INCBIN_U8("graphics/reset_rtc_screen/arrow_right.4bpp"); +static const u16 sArrow_Pal[] = INCBIN_U16("graphics/reset_rtc_screen/arrow.gbapal"); -static const struct SpriteFrameImage sSpriteImageTable_85104B4[] = +static const struct SpriteFrameImage sPicTable_Arrow[] = { - obj_frame_tiles(sResetRtcScreen_DownArrowGfx), - obj_frame_tiles(sResetRtcScreen_RightArrowGfx) + obj_frame_tiles(sArrowDown_Gfx), + obj_frame_tiles(sArrowRight_Gfx) }; static const struct SpritePalette sSpritePalette_Arrow = { - sResetRtcScreen_ArrowPal, 0x1000 + sArrow_Pal, PALTAG_ARROW }; -static const union AnimCmd sSpriteAnim_85104CC[] = +static const union AnimCmd sAnim_Arrow_Down[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_85104D4[] = +static const union AnimCmd sAnim_Arrow_Up[] = { ANIMCMD_FRAME(0, 30, .vFlip = TRUE), ANIMCMD_JUMP(0), }; -static const union AnimCmd sSpriteAnim_85104DC[] = +static const union AnimCmd sAnim_Arrow_Right[] = { ANIMCMD_FRAME(1, 30), ANIMCMD_JUMP(0), }; -static const union AnimCmd *const sSpriteAnimTable_85104E4[] = +enum { + ARROW_DOWN, + ARROW_UP, + ARROW_RIGHT, +}; + +static const union AnimCmd *const sAnims_Arrow[] = { - sSpriteAnim_85104CC, - sSpriteAnim_85104D4, - sSpriteAnim_85104DC, + [ARROW_DOWN] = sAnim_Arrow_Down, + [ARROW_UP] = sAnim_Arrow_Up, + [ARROW_RIGHT] = sAnim_Arrow_Right, }; -static const struct SpriteTemplate sSpriteTemplate_85104F0 = +static const struct SpriteTemplate sSpriteTemplate_Arrow = { .tileTag = 0xFFFF, - .paletteTag = 0x1000, - .oam = &sOamData_08510464, - .anims = sSpriteAnimTable_85104E4, - .images = sSpriteImageTable_85104B4, + .paletteTag = PALTAG_ARROW, + .oam = &sOamData_Arrow, + .anims = sAnims_Arrow, + .images = sPicTable_Arrow, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy, }; -// code -static void SpriteCB_ResetRtcCursor0(struct Sprite *sprite) +#define sTaskId data[0] +#define sState data[1] + +static void SpriteCB_Cursor_UpOrRight(struct Sprite *sprite) { - int state = gTasks[sprite->data[0]].data[2]; - if (state != sprite->data[1]) + int state = gTasks[sprite->sTaskId].tSelection; + if (state != sprite->sState) { - sprite->data[1] = state; + sprite->sState = state; switch (state) { - case 1: + case SELECTION_DAYS: sprite->invisible = FALSE; - sprite->animNum = 1; + sprite->animNum = ARROW_UP; sprite->animDelayCounter = 0; sprite->pos1.x = 53; sprite->pos1.y = 68; break; - case 2: + case SELECTION_HOURS: sprite->invisible = FALSE; - sprite->animNum = 1; + sprite->animNum = ARROW_UP; sprite->animDelayCounter = 0; sprite->pos1.x = 86; sprite->pos1.y = 68; break; - case 3: + case SELECTION_MINS: sprite->invisible = FALSE; - sprite->animNum = 1; + sprite->animNum = ARROW_UP; sprite->animDelayCounter = 0; sprite->pos1.x = 101; sprite->pos1.y = 68; break; - case 4: + case SELECTION_SECS: sprite->invisible = FALSE; - sprite->animNum = 1; + sprite->animNum = ARROW_UP; sprite->animDelayCounter = 0; sprite->pos1.x = 116; sprite->pos1.y = 68; break; - case 5: + case SELECTION_CONFIRM: sprite->invisible = FALSE; - sprite->animNum = 2; + sprite->animNum = ARROW_RIGHT; sprite->animDelayCounter = 0; sprite->pos1.x = 153; sprite->pos1.y = 80; break; - case 6: + case SELECTION_NONE: DestroySprite(sprite); break; } } } -static void SpriteCB_ResetRtcCursor1(struct Sprite *sprite) +static void SpriteCB_Cursor_Down(struct Sprite *sprite) { - int state = gTasks[sprite->data[0]].data[2]; - if (state != sprite->data[1]) + int state = gTasks[sprite->sTaskId].tSelection; + if (state != sprite->sState) { - sprite->data[1] = state; + sprite->sState = state; switch (state) { - case 1: + case SELECTION_DAYS: sprite->invisible = FALSE; - sprite->animNum = 0; + sprite->animNum = ARROW_DOWN; sprite->animDelayCounter = 0; sprite->pos1.x = 53; sprite->pos1.y = 92; break; - case 2: + case SELECTION_HOURS: sprite->invisible = FALSE; - sprite->animNum = 0; + sprite->animNum = ARROW_DOWN; sprite->animDelayCounter = 0; sprite->pos1.x = 86; sprite->pos1.y = 92; break; - case 3: + case SELECTION_MINS: sprite->invisible = FALSE; - sprite->animNum = 0; + sprite->animNum = ARROW_DOWN; sprite->animDelayCounter = 0; sprite->pos1.x = 101; sprite->pos1.y = 92; break; - case 4: + case SELECTION_SECS: sprite->invisible = FALSE; - sprite->animNum = 0; + sprite->animNum = ARROW_DOWN; sprite->animDelayCounter = 0; sprite->pos1.x = 116; sprite->pos1.y = 92; break; - case 5: + case SELECTION_CONFIRM: + // The up arrow is used as a right arrow when Confirm is selected + // Hide the down arrow sprite->invisible = TRUE; break; - case 6: + case SELECTION_NONE: DestroySprite(sprite); break; } @@ -273,15 +335,15 @@ static void CreateCursor(u8 taskId) LoadSpritePalette(&sSpritePalette_Arrow); - spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0); - gSprites[spriteId].callback = SpriteCB_ResetRtcCursor0; - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = -1; + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Arrow, 53, 68, 0); + gSprites[spriteId].callback = SpriteCB_Cursor_UpOrRight; + gSprites[spriteId].sTaskId = taskId; + gSprites[spriteId].sState = -1; - spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0); - gSprites[spriteId].callback = SpriteCB_ResetRtcCursor1; - gSprites[spriteId].data[0] = taskId; - gSprites[spriteId].data[1] = -1; + spriteId = CreateSpriteAtEnd(&sSpriteTemplate_Arrow, 53, 68, 0); + gSprites[spriteId].callback = SpriteCB_Cursor_Down; + gSprites[spriteId].sTaskId = taskId; + gSprites[spriteId].sState = -1; } static void FreeCursorPalette(void) @@ -300,18 +362,22 @@ static void PrintTime(u8 windowId, u8 x, u8 y, u16 days, u8 hours, u8 minutes, u { u8 *dest = gStringVar4; + // Print days ConvertIntToDecimalStringN(gStringVar1, days, STR_CONV_MODE_RIGHT_ALIGN, 4); dest = StringCopy(dest, gStringVar1); dest = StringCopy(dest, gText_Day); + // Print hours ConvertIntToDecimalStringN(gStringVar1, hours, STR_CONV_MODE_RIGHT_ALIGN, 3); dest = StringCopy(dest, gStringVar1); dest = StringCopy(dest, gText_Colon3); + // Print minutes ConvertIntToDecimalStringN(gStringVar1, minutes, STR_CONV_MODE_LEADING_ZEROS, 2); dest = StringCopy(dest, gStringVar1); dest = StringCopy(dest, gText_Colon3); + // Print seconds ConvertIntToDecimalStringN(gStringVar1, seconds, STR_CONV_MODE_LEADING_ZEROS, 2); dest = StringCopy(dest, gStringVar1); @@ -360,31 +426,31 @@ static bool32 MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys) return TRUE; } -static void Task_ResetRtc_3(u8 taskId) +static void Task_ResetRtc_SetFinished(u8 taskId) { - gTasks[taskId].data[0] = 1; + gTasks[taskId].tFinished = TRUE; } -static void Task_ResetRtc_2(u8 taskId) +static void Task_ResetRtc_Exit(u8 taskId) { s16 *data = gTasks[taskId].data; - HideChooseTimeWindow(data[8]); + HideChooseTimeWindow(tWindowId); FreeCursorPalette(); - gTasks[taskId].func = Task_ResetRtc_3; + gTasks[taskId].func = Task_ResetRtc_SetFinished; } -static void Task_ResetRtc_1(u8 taskId) +static void Task_ResetRtc_HandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; - u8 selection = data[2]; - const struct ResetRtcStruct *selectionInfo = &sUnknown_08510428[selection - 1]; + u8 selection = tSelection; + const struct ResetRtcInputMap *selectionInfo = &sInputMap[selection - 1]; if (JOY_NEW(B_BUTTON)) { - gTasks[taskId].func = Task_ResetRtc_2; - data[1] = 0; - data[2] = 6; + gTasks[taskId].func = Task_ResetRtc_Exit; + tSetTime = FALSE; + tSelection = SELECTION_NONE; PlaySE(SE_SELECT); return; } @@ -393,7 +459,7 @@ static void Task_ResetRtc_1(u8 taskId) { if (selectionInfo->right) { - data[2] = selectionInfo->right; + tSelection = selectionInfo->right; PlaySE(SE_SELECT); return; } @@ -403,47 +469,47 @@ static void Task_ResetRtc_1(u8 taskId) { if (selectionInfo->left) { - data[2] = selectionInfo->left; + tSelection = selectionInfo->left; PlaySE(SE_SELECT); return; } } - if (selection == 5) + if (selection == SELECTION_CONFIRM) { if (JOY_NEW(A_BUTTON)) { - gLocalTime.days = data[3]; - gLocalTime.hours = data[4]; - gLocalTime.minutes = data[5]; - gLocalTime.seconds = data[6]; + gLocalTime.days = tDays; + gLocalTime.hours = tHours; + gLocalTime.minutes = tMinutes; + gLocalTime.seconds = tSeconds; PlaySE(SE_SELECT); - gTasks[taskId].func = Task_ResetRtc_2; - data[1] = 1; - data[2] = 6; + gTasks[taskId].func = Task_ResetRtc_Exit; + tSetTime = TRUE; + tSelection = SELECTION_NONE; } } else if (MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, JOY_REPEAT(DPAD_UP | DPAD_DOWN))) { PlaySE(SE_SELECT); - PrintTime(data[8], 0, 1, data[3], data[4], data[5], data[6]); - CopyWindowToVram(data[8], 2); + PrintTime(tWindowId, 0, 1, tDays, tHours, tMinutes, tSeconds); + CopyWindowToVram(tWindowId, 2); } } -static void Task_ResetRtc_0(u8 taskId) +static void Task_ResetRtc_Init(u8 taskId) { s16 *data = gTasks[taskId].data; - data[0] = 0; - data[3] = gLocalTime.days; - data[4] = gLocalTime.hours; - data[5] = gLocalTime.minutes; - data[6] = gLocalTime.seconds; - data[8] = AddWindow(&sUnknown_08510420); - ShowChooseTimeWindow(data[8], data[3], data[4], data[5], data[6]); + tFinished = FALSE; + tDays = gLocalTime.days; + tHours = gLocalTime.hours; + tMinutes = gLocalTime.minutes; + tSeconds = gLocalTime.seconds; + tWindowId = AddWindow(&sInputTimeWindow); + ShowChooseTimeWindow(tWindowId, tDays, tHours, tMinutes, tSeconds); CreateCursor(taskId); - data[2] = 2; - gTasks[taskId].func = Task_ResetRtc_1; + tSelection = SELECTION_HOURS; + gTasks[taskId].func = Task_ResetRtc_HandleInput; } void CB2_InitResetRtcScreen(void) @@ -451,7 +517,7 @@ void CB2_InitResetRtcScreen(void) SetGpuReg(REG_OFFSET_DISPCNT, 0); SetVBlankCallback(NULL); DmaClear16(3, PLTT, PLTT_SIZE); - DmaFillLarge16(3, 0, (u8 *)VRAM, 0x18000, 0x1000); + DmaFillLarge16(3, 0, (u8 *)VRAM, VRAM_SIZE, 0x1000); ResetOamRange(0, 128); LoadOam(); ScanlineEffect_Stop(); @@ -459,21 +525,21 @@ void CB2_InitResetRtcScreen(void) ResetSpriteData(); ResetTasks(); ResetPaletteFade(); - sub_809F048(); + InitResetRtcScreenBgAndWindows(); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_ResetRtcScreen); CreateTask(Task_ResetRtcScreen, 80); } -static void sub_809F048(void) +static void InitResetRtcScreenBgAndWindows(void) { ClearScheduledBgCopiesToVram(); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates)); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ScheduleBgCopyTilemapToVram(0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); - InitWindows(sUnknown_08510408); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); LoadMessageBoxAndBorderGfx(); } @@ -501,14 +567,17 @@ static void ShowMessage(const u8 *str) ScheduleBgCopyTilemapToVram(0); } +#define tState data[0] + static void Task_ShowResetRtcPrompt(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { case 0: DrawStdFrameWithCustomTileAndPalette(0, FALSE, 0x214, 0xE); + AddTextPrinterParameterized(0, 1, gText_PresentTime, 0, 1, TEXT_SPEED_FF, 0); PrintTime( 0, @@ -518,6 +587,7 @@ static void Task_ShowResetRtcPrompt(u8 taskId) gLocalTime.hours, gLocalTime.minutes, gLocalTime.seconds); + AddTextPrinterParameterized(0, 1, gText_PreviousTime, 0, 33, TEXT_SPEED_FF, 0); PrintTime( 0, @@ -527,18 +597,21 @@ static void Task_ShowResetRtcPrompt(u8 taskId) gSaveBlock2Ptr->lastBerryTreeUpdate.hours, gSaveBlock2Ptr->lastBerryTreeUpdate.minutes, gSaveBlock2Ptr->lastBerryTreeUpdate.seconds); + ShowMessage(gText_ResetRTCConfirmCancel); CopyWindowToVram(0, 2); ScheduleBgCopyTilemapToVram(0); - data[0]++; + tState++; case 1: if (JOY_NEW(B_BUTTON)) { + // Cancel, exit without resetting RTC DestroyTask(taskId); DoSoftReset(); } else if (JOY_NEW(A_BUTTON)) { + // Confirm PlaySE(SE_SELECT); DestroyTask(taskId); } @@ -546,53 +619,73 @@ static void Task_ShowResetRtcPrompt(u8 taskId) } } +#undef tState + +// Task states for Task_ResetRtcScreen +enum { + MAINSTATE_FADE_IN, + MAINSTATE_CHECK_SAVE, + MAINSTATE_START_SET_TIME, + MAINSTATE_WAIT_SET_TIME, + MAINSTATE_SAVE, + MAINSTATE_WAIT_EXIT, + MAINSTATE_EXIT, +}; + +#define tState data[0] +#define tSubTaskId data[1] + static void Task_ResetRtcScreen(u8 taskId) { s16 *data = gTasks[taskId].data; - switch (data[0]) + switch (tState) { - case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, RGB_WHITEALPHA); - data[0] = 1; + case MAINSTATE_FADE_IN: + BeginNormalPaletteFade(PALETTES_ALL, 1, 0x10, 0, RGB_WHITEALPHA); + tState = MAINSTATE_CHECK_SAVE; break; - case 1: + case MAINSTATE_CHECK_SAVE: if (!gPaletteFade.active) { - if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT) + if (gSaveFileStatus == SAVE_STATUS_EMPTY + || gSaveFileStatus == SAVE_STATUS_CORRUPT) { ShowMessage(gText_NoSaveFileCantSetTime); - data[0] = 5; + tState = MAINSTATE_WAIT_EXIT; } else { RtcCalcLocalTime(); - data[1] = CreateTask(Task_ShowResetRtcPrompt, 80); - data[0] = 2; + tSubTaskId = CreateTask(Task_ShowResetRtcPrompt, 80); + tState = MAINSTATE_START_SET_TIME; } } break; - case 2: - if (gTasks[data[1]].isActive != TRUE) + case MAINSTATE_START_SET_TIME: + // Wait for A or B press on prompt first + if (gTasks[tSubTaskId].isActive != TRUE) { ClearStdWindowAndFrameToTransparent(0, FALSE); ShowMessage(gText_PleaseResetTime); gLocalTime = gSaveBlock2Ptr->lastBerryTreeUpdate; - data[1] = CreateTask(Task_ResetRtc_0, 80); - data[0] = 3; + tSubTaskId = CreateTask(Task_ResetRtc_Init, 80); + tState = MAINSTATE_WAIT_SET_TIME; } break; - case 3: - if (gTasks[data[1]].data[0]) + case MAINSTATE_WAIT_SET_TIME: + if (gTasks[tSubTaskId].tFinished) { - if (!gTasks[data[1]].data[1]) + if (!gTasks[tSubTaskId].tSetTime) { - DestroyTask(data[1]); - data[0] = 2; + // Exited without setting time, return to "Please reset time" + DestroyTask(tSubTaskId); + tState = MAINSTATE_START_SET_TIME; } else { - DestroyTask(data[1]); + // Time has been chosen, reset rtc and save + DestroyTask(tSubTaskId); RtcReset(); RtcCalcLocalTimeOffset( gLocalTime.days, @@ -603,11 +696,11 @@ static void Task_ResetRtcScreen(u8 taskId) VarSet(VAR_DAYS, gLocalTime.days); DisableResetRTC(); ShowMessage(gText_ClockHasBeenReset); - data[0] = 4; + tState = MAINSTATE_SAVE; } } break; - case 4: + case MAINSTATE_SAVE: if (TrySavingData(SAVE_NORMAL) == SAVE_STATUS_OK) { ShowMessage(gText_SaveCompleted); @@ -618,18 +711,20 @@ static void Task_ResetRtcScreen(u8 taskId) ShowMessage(gText_SaveFailed); PlaySE(SE_BOO); } - data[0] = 5; - case 5: + tState = MAINSTATE_WAIT_EXIT; + // fallthrough + case MAINSTATE_WAIT_EXIT: if (JOY_NEW(A_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, RGB_WHITEALPHA); - data[0] = 6; + BeginNormalPaletteFade(PALETTES_ALL, 1, 0, 0x10, RGB_WHITEALPHA); + tState = MAINSTATE_EXIT; + // fallthrough } else { break; } - case 6: + case MAINSTATE_EXIT: if (!gPaletteFade.active) { DestroyTask(taskId); diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index d8d75a0e0..58de22f05 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -23,7 +23,7 @@ static void CreateBattlerSprite(u8 battlerId); static void CreateHealthboxSprite(u8 battlerId); static void sub_80A95F4(void); -void nullsub_35(void) +void ReshowBattleScreenDummy(void) { } diff --git a/src/rotating_gate.c b/src/rotating_gate.c index 162eb3e6d..36c23c2a5 100644 --- a/src/rotating_gate.c +++ b/src/rotating_gate.c @@ -670,7 +670,8 @@ static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection) } else { - orientation = ++orientation % GATE_ORIENTATION_MAX; + orientation++; + orientation = orientation % GATE_ORIENTATION_MAX; } RotatingGate_SetGateOrientation(gateId, orientation); } @@ -754,7 +755,7 @@ static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) sprite->data[0] = gateId; sprite->coordOffsetEnabled = 1; - sub_8092FF0(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); + GetMapCoordsFromSpritePos(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); RotatingGate_HideGatesOutsideViewport(sprite); StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId)); diff --git a/src/roulette.c b/src/roulette.c index 4173edcdb..adde16199 100644 --- a/src/roulette.c +++ b/src/roulette.c @@ -275,7 +275,7 @@ struct RouletteTable struct Taillow taillow; u16 ballSpeed; u16 baseTravelDist; - float var1C; + f32 var1C; }; struct GridSelection @@ -340,13 +340,13 @@ static EWRAM_DATA struct Roulette s16 ballTravelDistFast; u16 ballTravelDistMed; u16 ballTravelDistSlow; - float ballAngle; - float ballAngleSpeed; - float ballAngleAccel; - float ballDistToCenter; - float ballFallSpeed; - float ballFallAccel; - float varA0; + f32 ballAngle; + f32 ballAngleSpeed; + f32 ballAngleAccel; + f32 ballDistToCenter; + f32 ballFallSpeed; + f32 ballFallAccel; + f32 varA0; u8 playTaskId; u8 spinTaskId; u8 filler_1[2]; @@ -1968,7 +1968,7 @@ static void ExitRoulette(u8 taskId) gSpecialVar_0x8004 = TRUE; else gSpecialVar_0x8004 = FALSE; - AlertTVOfNewCoinTotal(GetCoins()); + TryPutFindThatGamerOnAir(GetCoins()); BeginHardwarePaletteFade(0xFF, 0, 0, 16, 0); gTasks[taskId].func = Task_ExitRoulette; } @@ -2896,7 +2896,9 @@ static const union AnimCmd sAnim_CreditDigit[] = ANIMCMD_FRAME(18, 0), // 9 // BUG: Animation not terminated properly // Doesn't matter in practice, the frames are set directly and not looped - //ANIMCMD_END +#ifdef BUGFIX + ANIMCMD_END +#endif }; static const union AnimCmd *const sAnims_CreditDigit[] = @@ -3389,7 +3391,7 @@ static void Task_AcceptMinBet(u8 taskId) ClearStdWindowAndFrame(0, TRUE); HideCoinsWindow(); FreeAllWindowBuffers(); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gPaletteFade.delayCounter = gPaletteFade.multipurpose2; UpdatePaletteFade(); gTasks[taskId].func = Task_FadeToRouletteGame; @@ -3948,7 +3950,7 @@ static s16 UpdateBallRelativeWheelAngle(struct Sprite *sprite) static u8 UpdateSlotBelowBall(struct Sprite *sprite) { - sRoulette->hitSlot = UpdateBallRelativeWheelAngle(sprite) / (float) DEGREES_PER_SLOT; + sRoulette->hitSlot = UpdateBallRelativeWheelAngle(sprite) / (f32)DEGREES_PER_SLOT; return sRoulette->hitSlot; } @@ -4050,7 +4052,7 @@ static void SpriteCB_UnstickBall_ShroomishBallFall(struct Sprite *sprite) static void SpriteCB_UnstickBall_Shroomish(struct Sprite *sprite) { - float slotOffset, ballFallDist, ballFallSpeed; + f32 slotOffset, ballFallDist, ballFallSpeed; UpdateBallPos(sprite); switch (sprite->sBallAngle) @@ -4233,7 +4235,7 @@ static void SpriteCB_RollBall_TryLand(struct Sprite *sprite) } else // fall left { - float temp; + f32 temp; sRoulette->ballAngleSpeed = (temp = sRouletteTables[sRoulette->tableId].var1C) * 2.0f; slotId = (sRoulette->hitSlot + NUM_ROULETTE_SLOTS - 1) % NUM_ROULETTE_SLOTS; sRoulette->stuckHitSlot = sRoulette->hitSlot; @@ -4279,7 +4281,7 @@ static void SpriteCB_RollBall_Slow(struct Sprite *sprite) { // Reached slot to land in sRoulette->ballAngleAccel = 0.0f; - sRoulette->ballAngleSpeed -= (float)(sRouletteTables[sRoulette->tableId].wheelSpeed) + sRoulette->ballAngleSpeed -= (f32)(sRouletteTables[sRoulette->tableId].wheelSpeed) / (sRouletteTables[sRoulette->tableId].wheelDelay + 1); sprite->sState = 4; sprite->callback = SpriteCB_RollBall_TryLand; @@ -4304,8 +4306,8 @@ static void SpriteCB_RollBall_Medium(struct Sprite *sprite) if (sRoulette->ballDistToCenter > 40.0f) return; - sRoulette->ballFallSpeed = -(4.0f / (float)(sRoulette->ballTravelDistSlow)); - sRoulette->ballAngleAccel = -(sRoulette->ballAngleSpeed / (float)(sRoulette->ballTravelDistSlow)); + sRoulette->ballFallSpeed = -(4.0f / (f32)(sRoulette->ballTravelDistSlow)); + sRoulette->ballAngleAccel = -(sRoulette->ballAngleSpeed / (f32)(sRoulette->ballTravelDistSlow)); sprite->animNum = 2; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; @@ -4320,8 +4322,8 @@ static void SpriteCB_RollBall_Fast(struct Sprite *sprite) return; m4aSongNumStartOrChange(SE_ROULETTE_BALL2); - sRoulette->ballFallSpeed = -(20.0f / (float)(sRoulette->ballTravelDistMed)); - sRoulette->ballAngleAccel = ((1.0f - sRoulette->ballAngleSpeed) / (float)(sRoulette->ballTravelDistMed)); + sRoulette->ballFallSpeed = -(20.0f / (f32)(sRoulette->ballTravelDistMed)); + sRoulette->ballAngleAccel = ((1.0f - sRoulette->ballAngleSpeed) / (f32)(sRoulette->ballTravelDistMed)); sprite->animNum = 1; sprite->animBeginning = TRUE; sprite->animEnded = FALSE; @@ -4558,7 +4560,7 @@ static void SpriteCB_ShroomishShakeScreen(struct Sprite *sprite) static void SpriteCB_ShroomishFall(struct Sprite *sprite) { - float timer; + f32 timer; sprite->data[1]++; timer = sprite->data[1]; sprite->pos2.y = timer * 0.039f * timer; diff --git a/src/safari_zone.c b/src/safari_zone.c index e8827e124..1f1397656 100644 --- a/src/safari_zone.c +++ b/src/safari_zone.c @@ -65,7 +65,7 @@ void EnterSafariMode(void) void ExitSafariMode(void) { - sub_80EE44C(sSafariZoneCaughtMons, sSafariZonePkblkUses); + TryPutSafariFanClubOnAir(sSafariZoneCaughtMons, sSafariZonePkblkUses); ResetSafariZoneFlag(); ClearAllPokeblockFeeders(); gNumSafariBalls = 0; @@ -107,7 +107,7 @@ void CB2_EndSafariBattle(void) { ScriptContext2_RunNewScript(SafariZone_EventScript_OutOfBallsMidBattle); WarpIntoMap(); - gFieldCallback = sub_80AF6F0; + gFieldCallback = FieldCB_ReturnToFieldNoScriptCheckMusic; SetMainCallback2(CB2_LoadMap); } else if (gBattleOutcome == B_OUTCOME_CAUGHT) diff --git a/src/save.c b/src/save.c index 680f33de0..52301df03 100644 --- a/src/save.c +++ b/src/save.c @@ -23,10 +23,6 @@ static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location); // Divide save blocks into individual chunks to be written to flash sectors -// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer -#define SECTOR_DATA_SIZE 3968 -#define SECTOR_FOOTER_SIZE 128 - /* * Sector Layout: * @@ -917,7 +913,7 @@ void Task_LinkSave(u8 taskId) if (IsLinkTaskFinished()) { if (!tPartialSave) - save_serialize_map(); + SaveMapView(); tState = 3; } break; diff --git a/src/save_failed_screen.c b/src/save_failed_screen.c index 9bf0e7ed4..8f727310c 100644 --- a/src/save_failed_screen.c +++ b/src/save_failed_screen.c @@ -25,29 +25,29 @@ extern const u8 gText_SaveCompleteGameCannotContinue[]; extern const u8 gText_SaveCompletePressA[]; extern const u8 gText_GamePlayCannotBeContinued[]; -// gSaveFailedClockInfo enum +// sClockInfo enum enum { CLOCK_RUNNING, DEBUG_TIMER }; -// gSaveFailedWindowIds enum +// sWindowIds enum enum { TEXT_WIN_ID, CLOCK_WIN_ID }; -EWRAM_DATA u16 gSaveFailedType = {0}; -EWRAM_DATA u16 gSaveFailedClockInfo[2] = {0}; -EWRAM_DATA u8 gSaveFailedUnused1[12] = {0}; -EWRAM_DATA u8 gSaveFailedWindowIds[2] = {0}; -EWRAM_DATA u8 gSaveFailedUnused2[4] = {0}; +static EWRAM_DATA u16 sSaveFailedType = {0}; +static EWRAM_DATA u16 sClockInfo[2] = {0}; +static EWRAM_DATA u8 sUnused1[12] = {0}; +static EWRAM_DATA u8 sWindowIds[2] = {0}; +static EWRAM_DATA u8 sUnused2[4] = {0}; static const struct OamData sClockOamData = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -62,7 +62,7 @@ static const struct OamData sClockOamData = .affineParam = 0 }; -static const struct BgTemplate gUnknown_085EFD88[3] = +static const struct BgTemplate sBgTemplates[3] = { { .bg = 0, @@ -93,20 +93,9 @@ static const struct BgTemplate gUnknown_085EFD88[3] = }, }; -static const struct WindowTemplate gUnknown_085EFD94[] = -{ - { - .bg = 255, - .tilemapLeft = 0, - .tilemapTop = 0, - .width = 0, - .height = 0, - .paletteNum = 0, - .baseBlock = 0, - } -}; +static const struct WindowTemplate sDummyWindowTemplate[] = { DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate gUnknown_085EFD9C[] = +static const struct WindowTemplate sWindowTemplate_Text[] = { { .bg = 0, @@ -119,7 +108,7 @@ static const struct WindowTemplate gUnknown_085EFD9C[] = } }; -static const struct WindowTemplate gUnknown_085EFDA4[] = +static const struct WindowTemplate sWindowTemplate_Clock[] = { { .bg = 0, @@ -157,24 +146,24 @@ static bool8 VerifySectorWipe(u16 sector); static bool8 WipeSectors(u32); // Although this is a general text printer, it's only used in this file. -static void SaveFailedScreenTextPrint(const u8 *text, u8 var1, u8 var2) +static void SaveFailedScreenTextPrint(const u8 *text, u8 x, u8 y) { u8 color[3]; - color[0] = 0; - color[1] = 15; - color[2] = 3; - AddTextPrinterParameterized4(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, color, 0, text); + color[0] = TEXT_COLOR_TRANSPARENT; + color[1] = TEXT_DYNAMIC_COLOR_6; + color[2] = TEXT_COLOR_LIGHT_GRAY; + AddTextPrinterParameterized4(sWindowIds[TEXT_WIN_ID], 1, x * 8, y * 8 + 1, 0, 0, color, 0, text); } void DoSaveFailedScreen(u8 saveType) { SetMainCallback2(CB2_SaveFailedScreen); - gSaveFailedType = saveType; - gSaveFailedClockInfo[CLOCK_RUNNING] = FALSE; - gSaveFailedClockInfo[DEBUG_TIMER] = 0; - gSaveFailedWindowIds[TEXT_WIN_ID] = 0; - gSaveFailedWindowIds[CLOCK_WIN_ID] = 0; + sSaveFailedType = saveType; + sClockInfo[CLOCK_RUNNING] = FALSE; + sClockInfo[DEBUG_TIMER] = 0; + sWindowIds[TEXT_WIN_ID] = 0; + sWindowIds[CLOCK_WIN_ID] = 0; } static void VBlankCB(void) @@ -210,17 +199,17 @@ static void CB2_SaveFailedScreen(void) LZ77UnCompVram(gBirchHelpGfx, (void *)VRAM); LZ77UnCompVram(gBirchBagTilemap, (void *)(BG_SCREEN_ADDR(14))); LZ77UnCompVram(gBirchGrassTilemap, (void *)(BG_SCREEN_ADDR(15))); - LZ77UnCompVram(sSaveFailedClockGfx, (void *)(VRAM + 0x10020)); + LZ77UnCompVram(sSaveFailedClockGfx, (void *)(OBJ_VRAM0 + 0x20)); ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_085EFD88, 3); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(0, (void *)&gDecompressionBuffer[0x2000]); CpuFill32(0, &gDecompressionBuffer[0x2000], 0x800); LoadBgTiles(0, gTextWindowFrame1_Gfx, 0x120, 0x214); - InitWindows(gUnknown_085EFD94); - gSaveFailedWindowIds[TEXT_WIN_ID] = AddWindowWithoutTileMap(gUnknown_085EFD9C); - SetWindowAttribute(gSaveFailedWindowIds[TEXT_WIN_ID], 7, (u32)&gDecompressionBuffer[0x2800]); - gSaveFailedWindowIds[CLOCK_WIN_ID] = AddWindowWithoutTileMap(gUnknown_085EFDA4); - SetWindowAttribute(gSaveFailedWindowIds[CLOCK_WIN_ID], 7, (u32)&gDecompressionBuffer[0x3D00]); + InitWindows(sDummyWindowTemplate); + sWindowIds[TEXT_WIN_ID] = AddWindowWithoutTileMap(sWindowTemplate_Text); + SetWindowAttribute(sWindowIds[TEXT_WIN_ID], 7, (u32)&gDecompressionBuffer[0x2800]); + sWindowIds[CLOCK_WIN_ID] = AddWindowWithoutTileMap(sWindowTemplate_Clock); + SetWindowAttribute(sWindowIds[CLOCK_WIN_ID], 7, (u32)&gDecompressionBuffer[0x3D00]); DeactivateAllTextPrinters(); ResetSpriteData(); ResetTasks(); @@ -229,14 +218,14 @@ static void CB2_SaveFailedScreen(void) LoadPalette(sSaveFailedClockPal, 0x100, 0x20); LoadPalette(gTextWindowFrame1_Pal, 0xE0, 0x20); LoadPalette(gUnknown_0860F074, 0xF0, 0x20); - DrawStdFrameWithCustomTileAndPalette(gSaveFailedWindowIds[TEXT_WIN_ID], FALSE, 0x214, 0xE); - DrawStdFrameWithCustomTileAndPalette(gSaveFailedWindowIds[CLOCK_WIN_ID], FALSE, 0x214, 0xE); - FillWindowPixelBuffer(gSaveFailedWindowIds[CLOCK_WIN_ID], PIXEL_FILL(1)); // backwards? - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); - CopyWindowToVram(gSaveFailedWindowIds[CLOCK_WIN_ID], 2); // again? - CopyWindowToVram(gSaveFailedWindowIds[TEXT_WIN_ID], 1); + DrawStdFrameWithCustomTileAndPalette(sWindowIds[TEXT_WIN_ID], FALSE, 0x214, 0xE); + DrawStdFrameWithCustomTileAndPalette(sWindowIds[CLOCK_WIN_ID], FALSE, 0x214, 0xE); + FillWindowPixelBuffer(sWindowIds[CLOCK_WIN_ID], PIXEL_FILL(1)); // backwards? + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + CopyWindowToVram(sWindowIds[CLOCK_WIN_ID], 2); // again? + CopyWindowToVram(sWindowIds[TEXT_WIN_ID], 1); SaveFailedScreenTextPrint(gText_SaveFailedCheckingBackup, 1, 0); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); EnableInterrupts(1); SetVBlankCallback(VBlankCB); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); @@ -259,25 +248,25 @@ static void CB2_WipeSave(void) { u8 wipeTries = 0; - gSaveFailedClockInfo[CLOCK_RUNNING] = TRUE; + sClockInfo[CLOCK_RUNNING] = TRUE; while (gDamagedSaveSectors != 0 && wipeTries < 3) { - if (WipeSectors(gDamagedSaveSectors) != FALSE) + if (WipeSectors(gDamagedSaveSectors)) { - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); SaveFailedScreenTextPrint(gText_BackupMemoryDamaged, 1, 0); SetMainCallback2(CB2_GameplayCannotBeContinued); return; } - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); SaveFailedScreenTextPrint(gText_CheckCompleted, 1, 0); - HandleSavingData(gSaveFailedType); + HandleSavingData(sSaveFailedType); if (gDamagedSaveSectors != 0) { - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); SaveFailedScreenTextPrint(gText_SaveFailedCheckingBackup, 1, 0); } @@ -286,12 +275,12 @@ static void CB2_WipeSave(void) if (wipeTries == 3) { - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); SaveFailedScreenTextPrint(gText_BackupMemoryDamaged, 1, 0); } else { - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); if (gGameContinueCallback == NULL) SaveFailedScreenTextPrint(gText_SaveCompleteGameCannotContinue, 1, 0); @@ -304,11 +293,11 @@ static void CB2_WipeSave(void) static void CB2_GameplayCannotBeContinued(void) { - gSaveFailedClockInfo[CLOCK_RUNNING] = FALSE; + sClockInfo[CLOCK_RUNNING] = FALSE; if (JOY_NEW(A_BUTTON)) { - FillWindowPixelBuffer(gSaveFailedWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); + FillWindowPixelBuffer(sWindowIds[TEXT_WIN_ID], PIXEL_FILL(1)); SaveFailedScreenTextPrint(gText_GamePlayCannotBeContinued, 1, 0); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_FadeAndReturnToTitleScreen); @@ -317,11 +306,11 @@ static void CB2_GameplayCannotBeContinued(void) static void CB2_FadeAndReturnToTitleScreen(void) { - gSaveFailedClockInfo[CLOCK_RUNNING] = FALSE; + sClockInfo[CLOCK_RUNNING] = FALSE; if (JOY_NEW(A_BUTTON)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); SetVBlankCallback(VBlankCB); SetMainCallback2(CB2_ReturnToTitleScreen); } @@ -351,7 +340,7 @@ static void VBlankCB_UpdateClockGraphics(void) gMain.oamBuffer[0].x = 112; gMain.oamBuffer[0].y = (CLOCK_WIN_TOP + 1) * 8; - if (gSaveFailedClockInfo[CLOCK_RUNNING] != FALSE) + if (sClockInfo[CLOCK_RUNNING]) { gMain.oamBuffer[0].tileNum = sClockFrames[n][0]; gMain.oamBuffer[0].matrixNum = (sClockFrames[n][2] << 4) | (sClockFrames[n][1] << 3); @@ -363,8 +352,8 @@ static void VBlankCB_UpdateClockGraphics(void) CpuFastCopy(gMain.oamBuffer, (void *)OAM, 4); - if (gSaveFailedClockInfo[DEBUG_TIMER]) - gSaveFailedClockInfo[DEBUG_TIMER]--; + if (sClockInfo[DEBUG_TIMER]) + sClockInfo[DEBUG_TIMER]--; } static bool8 VerifySectorWipe(u16 sector) @@ -372,7 +361,7 @@ static bool8 VerifySectorWipe(u16 sector) u32 *ptr = (u32 *)&gSaveDataBuffer; u16 i; - ReadFlash(sector, 0, (u8 *)ptr, 4096); + ReadFlash(sector, 0, (u8 *)ptr, SECTOR_SIZE); for (i = 0; i < 0x400; i++, ptr++) if (*ptr) @@ -388,7 +377,7 @@ static bool8 WipeSector(u16 sector) for (i = 0; failed && i < 130; i++) { - for (j = 0; j < 0x1000; j++) + for (j = 0; j < SECTOR_SIZE; j++) ProgramFlashByte(sector, j, 0); failed = VerifySectorWipe(sector); @@ -401,7 +390,7 @@ static bool8 WipeSectors(u32 sectorBits) { u16 i; - for (i = 0; i < 0x20; i++) + for (i = 0; i < SECTORS_COUNT; i++) if ((sectorBits & (1 << i)) && !WipeSector(i)) sectorBits &= ~(1 << i); diff --git a/src/scanline_effect.c b/src/scanline_effect.c index 1d5814429..dc3ca03f4 100644 --- a/src/scanline_effect.c +++ b/src/scanline_effect.c @@ -22,10 +22,10 @@ void ScanlineEffect_Stop(void) { gScanlineEffect.state = 0; DmaStop(0); - if (gScanlineEffect.waveTaskId != 0xFF) + if (gScanlineEffect.waveTaskId != TASK_NONE) { DestroyTask(gScanlineEffect.waveTaskId); - gScanlineEffect.waveTaskId = 0xFF; + gScanlineEffect.waveTaskId = TASK_NONE; } } @@ -40,7 +40,7 @@ void ScanlineEffect_Clear(void) gScanlineEffect.state = 0; gScanlineEffect.unused16 = 0; gScanlineEffect.unused17 = 0; - gScanlineEffect.waveTaskId = 0xFF; + gScanlineEffect.waveTaskId = TASK_NONE; } void ScanlineEffect_SetParams(struct ScanlineEffectParams params) @@ -132,7 +132,7 @@ static void TaskFunc_UpdateWavePerFrame(u8 taskId) if (sShouldStopWaveTask) { DestroyTask(taskId); - gScanlineEffect.waveTaskId = 0xFF; + gScanlineEffect.waveTaskId = TASK_NONE; } else { diff --git a/src/scrcmd.c b/src/scrcmd.c index ef0b3f86b..0ee20d1c6 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -53,8 +53,8 @@ typedef u16 (*SpecialFunc)(void); typedef void (*NativeFunc)(void); -EWRAM_DATA const u8 *gUnknown_020375C0 = NULL; -static EWRAM_DATA u32 gUnknown_020375C4 = 0; +EWRAM_DATA const u8 *gRamScriptRetAddr = NULL; +static EWRAM_DATA u32 sAddressOffset = 0; // For relative addressing in vgoto etc., used by saved scripts (e.g. Mystery Event) static EWRAM_DATA u16 sPauseCounter = 0; static EWRAM_DATA u16 sMovingNpcId = 0; static EWRAM_DATA u16 sMovingNpcMapBank = 0; @@ -192,7 +192,7 @@ bool8 ScrCmd_setvaddress(struct ScriptContext *ctx) u32 addr1 = (u32)ctx->scriptPtr - 1; u32 addr2 = ScriptReadWord(ctx); - gUnknown_020375C4 = addr2 - addr1; + sAddressOffset = addr2 - addr1; return FALSE; } @@ -200,7 +200,7 @@ bool8 ScrCmd_vgoto(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); - ScriptJump(ctx, (u8 *)(addr - gUnknown_020375C4)); + ScriptJump(ctx, (u8 *)(addr - sAddressOffset)); return FALSE; } @@ -208,14 +208,14 @@ bool8 ScrCmd_vcall(struct ScriptContext *ctx) { u32 addr = ScriptReadWord(ctx); - ScriptCall(ctx, (u8 *)(addr - gUnknown_020375C4)); + ScriptCall(ctx, (u8 *)(addr - sAddressOffset)); return FALSE; } bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); - const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - gUnknown_020375C4); + const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - sAddressOffset); if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptJump(ctx, ptr); @@ -225,7 +225,7 @@ bool8 ScrCmd_vgoto_if(struct ScriptContext *ctx) bool8 ScrCmd_vcall_if(struct ScriptContext *ctx) { u8 condition = ScriptReadByte(ctx); - const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - gUnknown_020375C4); + const u8 *ptr = (const u8 *)(ScriptReadWord(ctx) - sAddressOffset); if (sScriptConditionTable[condition][ctx->comparisonResult] == 1) ScriptCall(ctx, ptr); @@ -282,7 +282,7 @@ bool8 ScrCmd_callstd_if(struct ScriptContext *ctx) bool8 ScrCmd_returnram(struct ScriptContext *ctx) { - ScriptJump(ctx, gUnknown_020375C0); + ScriptJump(ctx, gRamScriptRetAddr); return FALSE; } @@ -378,32 +378,30 @@ bool8 ScrCmd_setorcopyvar(struct ScriptContext *ctx) return FALSE; } -u8 compare_012(u16 a1, u16 a2) +u8 Compare(u16 a, u16 b) { - if (a1 < a2) + if (a < b) return 0; - if (a1 == a2) + if (a == b) return 1; return 2; } -// comparelocaltolocal bool8 ScrCmd_compare_local_to_local(struct ScriptContext *ctx) { const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = ctx->data[ScriptReadByte(ctx)]; - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } -// comparelocaltoimm bool8 ScrCmd_compare_local_to_value(struct ScriptContext *ctx) { const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = ScriptReadByte(ctx); - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -412,7 +410,7 @@ bool8 ScrCmd_compare_local_to_addr(struct ScriptContext *ctx) const u8 value1 = ctx->data[ScriptReadByte(ctx)]; const u8 value2 = *(const u8 *)ScriptReadWord(ctx); - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -421,7 +419,7 @@ bool8 ScrCmd_compare_addr_to_local(struct ScriptContext *ctx) const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = ctx->data[ScriptReadByte(ctx)]; - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -430,7 +428,7 @@ bool8 ScrCmd_compare_addr_to_value(struct ScriptContext *ctx) const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = ScriptReadByte(ctx); - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -439,7 +437,7 @@ bool8 ScrCmd_compare_addr_to_addr(struct ScriptContext *ctx) const u8 value1 = *(const u8 *)ScriptReadWord(ctx); const u8 value2 = *(const u8 *)ScriptReadWord(ctx); - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -448,7 +446,7 @@ bool8 ScrCmd_compare_var_to_value(struct ScriptContext *ctx) const u16 value1 = *GetVarPointer(ScriptReadHalfword(ctx)); const u16 value2 = ScriptReadHalfword(ctx); - ctx->comparisonResult = compare_012(value1, value2); + ctx->comparisonResult = Compare(value1, value2); return FALSE; } @@ -457,7 +455,7 @@ bool8 ScrCmd_compare_var_to_var(struct ScriptContext *ctx) const u16 *ptr1 = GetVarPointer(ScriptReadHalfword(ctx)); const u16 *ptr2 = GetVarPointer(ScriptReadHalfword(ctx)); - ctx->comparisonResult = compare_012(*ptr1, *ptr2); + ctx->comparisonResult = Compare(*ptr1, *ptr2); return FALSE; } @@ -1120,7 +1118,7 @@ bool8 ScrCmd_showobject_at(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 0); + SetObjectInvisibility(localId, mapNum, mapGroup, FALSE); return FALSE; } @@ -1130,7 +1128,7 @@ bool8 ScrCmd_hideobject_at(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); - npc_by_local_id_and_map_set_field_1_bit_x20(localId, mapNum, mapGroup, 1); + SetObjectInvisibility(localId, mapNum, mapGroup, TRUE); return FALSE; } @@ -1141,7 +1139,7 @@ bool8 ScrCmd_setobjectpriority(struct ScriptContext *ctx) u8 mapNum = ScriptReadByte(ctx); u8 priority = ScriptReadByte(ctx); - sub_808E78C(localId, mapNum, mapGroup, priority + 83); + SetObjectPriority(localId, mapNum, mapGroup, priority + 83); return FALSE; } @@ -1151,7 +1149,7 @@ bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); - sub_808E7E4(localId, mapNum, mapGroup); + ResetObjectPriority(localId, mapNum, mapGroup); return FALSE; } @@ -1214,7 +1212,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx) else { ScriptFreezeObjectEvents(); - SetupNativeScript(ctx, sub_80983C4); + SetupNativeScript(ctx, IsFreezePlayerFinished); return TRUE; } } @@ -1230,12 +1228,12 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) if (gObjectEvents[gSelectedObjectEvent].active) { LockSelectedObjectEvent(); - SetupNativeScript(ctx, sub_809847C); + SetupNativeScript(ctx, IsFreezeSelectedObjectAndPlayerFinished); } else { ScriptFreezeObjectEvents(); - SetupNativeScript(ctx, sub_80983C4); + SetupNativeScript(ctx, IsFreezePlayerFinished); } return TRUE; } @@ -1299,7 +1297,8 @@ bool8 ScrCmd_messageautoscroll(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_cmdDB(struct ScriptContext *ctx) +// Prints all at once. Skips waiting for player input. Only used by link contests +bool8 ScrCmd_messageinstant(struct ScriptContext *ctx) { const u8 *msg = (const u8 *)ScriptReadWord(ctx); @@ -1359,7 +1358,7 @@ bool8 ScrCmd_multichoice(struct ScriptContext *ctx) u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); + bool8 ignoreBPress = ScriptReadByte(ctx); if (ScriptMenu_Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { @@ -1378,7 +1377,7 @@ bool8 ScrCmd_multichoicedefault(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 defaultChoice = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); + bool8 ignoreBPress = ScriptReadByte(ctx); if (ScriptMenu_MultichoiceWithDefault(left, top, multichoiceId, ignoreBPress, defaultChoice) == TRUE) { @@ -1408,7 +1407,7 @@ bool8 ScrCmd_multichoicegrid(struct ScriptContext *ctx) u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); u8 numColumns = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); + bool8 ignoreBPress = ScriptReadByte(ctx); if (ScriptMenu_MultichoiceGrid(left, top, multichoiceId, ignoreBPress, numColumns) == TRUE) { @@ -1428,7 +1427,7 @@ bool8 ScrCmd_erasebox(struct ScriptContext *ctx) u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); - // MenuZeroFillWindowRect(left, top, right, bottom); + // Menu_EraseWindowRect(left, top, right, bottom); return FALSE; } @@ -1437,7 +1436,7 @@ bool8 ScrCmd_drawboxtext(struct ScriptContext *ctx) u8 left = ScriptReadByte(ctx); u8 top = ScriptReadByte(ctx); u8 multichoiceId = ScriptReadByte(ctx); - u8 ignoreBPress = ScriptReadByte(ctx); + bool8 ignoreBPress = ScriptReadByte(ctx); /*if (Multichoice(left, top, multichoiceId, ignoreBPress) == TRUE) { @@ -1467,15 +1466,15 @@ bool8 ScrCmd_hidemonpic(struct ScriptContext *ctx) return TRUE; } -bool8 ScrCmd_showcontestwinner(struct ScriptContext *ctx) +bool8 ScrCmd_showcontestpainting(struct ScriptContext *ctx) { u8 contestWinnerId = ScriptReadByte(ctx); - // Don't save artist's painting yet + // Artist's painting is temporary and already has its data loaded if (contestWinnerId != CONTEST_WINNER_ARTIST) SetContestWinnerForPainting(contestWinnerId); - ShowContestWinnerPainting(); + ShowContestPainting(); ScriptContext1_Stop(); return TRUE; } @@ -1489,27 +1488,30 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) u8 xWindow, yWindow, xText, yText; u8 temp; + // + 6 for the 6 bytes at the start of a braille message (brailleformat macro) + // In RS these bytes are used to position the text and window, but + // in Emerald they are unused and position is calculated below instead StringExpandPlaceholders(gStringVar4, ptr + 6); width = GetStringWidth(6, gStringVar4, -1) / 8u; - if (width > 0x1C) - width = 0x1C; + if (width > 28) + width = 28; - for (i = 0, height = 4; gStringVar4[i] != 0xFF;) + for (i = 0, height = 4; gStringVar4[i] != EOS;) { - if (gStringVar4[i++] == 0xFE) + if (gStringVar4[i++] == CHAR_NEWLINE) height += 3; } - if (height > 0x12) - height = 0x12; + if (height > 18) + height = 18; temp = width + 2; - xWindow = (0x1E - temp) / 2; + xWindow = (30 - temp) / 2; temp = height + 2; - yText = (0x14 - temp) / 2; + yText = (20 - temp) / 2; xText = xWindow; xWindow += 1; @@ -1539,9 +1541,9 @@ bool8 ScrCmd_closebraillemessage(struct ScriptContext *ctx) bool8 ScrCmd_vmessage(struct ScriptContext *ctx) { - u32 v1 = ScriptReadWord(ctx); + u32 msg = ScriptReadWord(ctx); - ShowFieldMessage((u8 *)(v1 - gUnknown_020375C4)); + ShowFieldMessage((u8 *)(msg - sAddressOffset)); return FALSE; } @@ -1651,7 +1653,7 @@ bool8 ScrCmd_bufferstring(struct ScriptContext *ctx) bool8 ScrCmd_vloadword(struct ScriptContext *ctx) { - const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - gUnknown_020375C4); + const u8 *ptr = (u8 *)(ScriptReadWord(ctx) - sAddressOffset); StringExpandPlaceholders(gStringVar4, ptr); return FALSE; @@ -1662,7 +1664,7 @@ bool8 ScrCmd_vbufferstring(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u32 addr = ScriptReadWord(ctx); - const u8 *src = (u8 *)(addr - gUnknown_020375C4); + const u8 *src = (u8 *)(addr - sAddressOffset); u8 *dest = sScriptStringVars[stringVarIndex]; StringCopy(dest, src); return FALSE; @@ -1900,6 +1902,7 @@ bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx) return TRUE; } +// Changes clerk dialogue slightly from above. See MART_TYPE_DECOR2 bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx) { const void *ptr = (void *)ScriptReadWord(ctx); @@ -2104,6 +2107,7 @@ bool8 ScrCmd_setdoorclosed(struct ScriptContext *ctx) return FALSE; } +// Below two are functions for elevators in RS, do nothing in Emerald bool8 ScrCmd_addelevmenuitem(struct ScriptContext *ctx) { u8 v3 = ScriptReadByte(ctx); @@ -2135,9 +2139,9 @@ bool8 ScrCmd_addcoins(struct ScriptContext *ctx) u16 coins = VarGet(ScriptReadHalfword(ctx)); if (AddCoins(coins) == TRUE) - gSpecialVar_Result = 0; + gSpecialVar_Result = FALSE; else - gSpecialVar_Result = 1; + gSpecialVar_Result = TRUE; return FALSE; } @@ -2146,9 +2150,9 @@ bool8 ScrCmd_removecoins(struct ScriptContext *ctx) u16 coins = VarGet(ScriptReadHalfword(ctx)); if (RemoveCoins(coins) == TRUE) - gSpecialVar_Result = 0; + gSpecialVar_Result = FALSE; else - gSpecialVar_Result = 1; + gSpecialVar_Result = TRUE; return FALSE; } @@ -2180,13 +2184,13 @@ bool8 ScrCmd_freerotatingtilepuzzle(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_cmdD8(struct ScriptContext *ctx) +bool8 ScrCmd_selectapproachingtrainer(struct ScriptContext *ctx) { gSelectedObjectEvent = GetCurrentApproachingTrainerObjectEventId(); return FALSE; } -bool8 ScrCmd_cmdD9(struct ScriptContext *ctx) +bool8 ScrCmd_lockfortrainer(struct ScriptContext *ctx) { if (IsUpdateLinkStateCBActive()) { @@ -2196,28 +2200,28 @@ bool8 ScrCmd_cmdD9(struct ScriptContext *ctx) { if (gObjectEvents[gSelectedObjectEvent].active) { - sub_8098630(); - SetupNativeScript(ctx, sub_8098734); + FreezeForApproachingTrainers(); + SetupNativeScript(ctx, IsFreezeObjectAndPlayerFinished); } return TRUE; } } -// This command will force the Pokémon to be obedient, you don't get to make it disobedient. -bool8 ScrCmd_setmonobedient(struct ScriptContext *ctx) +// This command will set a Pokémon's eventLegal bit; there is no similar command to clear it. +bool8 ScrCmd_setmoneventlegal(struct ScriptContext *ctx) { - bool8 obedient = TRUE; + bool8 isEventLegal = TRUE; u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); - SetMonData(&gPlayerParty[partyIndex], MON_DATA_OBEDIENCE, &obedient); + SetMonData(&gPlayerParty[partyIndex], MON_DATA_EVENT_LEGAL, &isEventLegal); return FALSE; } -bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx) +bool8 ScrCmd_checkmoneventlegal(struct ScriptContext *ctx) { u16 partyIndex = VarGet(ScriptReadHalfword(ctx)); - gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OBEDIENCE, NULL); + gSpecialVar_Result = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EVENT_LEGAL, NULL); return FALSE; } @@ -2225,17 +2229,19 @@ bool8 ScrCmd_checkmonobedience(struct ScriptContext *ctx) // See GetSavedRamScriptIfValid, which is NULL if ValidateReceivedWonderCard returns FALSE bool8 ScrCmd_gotoram(struct ScriptContext *ctx) { - const u8* v1 = GetSavedRamScriptIfValid(); + const u8* script = GetSavedRamScriptIfValid(); - if (v1) + if (script) { - gUnknown_020375C0 = ctx->scriptPtr; - ScriptJump(ctx, v1); + gRamScriptRetAddr = ctx->scriptPtr; + ScriptJump(ctx, script); } return FALSE; } -bool8 ScrCmd_warpD1(struct ScriptContext *ctx) +// Unused +// For the warp used by the Aqua Hideout, see DoTeleportTileWarp +bool8 ScrCmd_warpspinenter(struct ScriptContext *ctx) { u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); @@ -2244,8 +2250,8 @@ bool8 ScrCmd_warpD1(struct ScriptContext *ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_808D074(GetPlayerFacingDirection()); - sub_80B0244(); + SetSpinStartFacingDir(GetPlayerFacingDirection()); + DoSpinEnterWarp(); ResetInitialPlayerAvatarState(); return TRUE; } diff --git a/src/script.c b/src/script.c index 9ba1a7429..726c06543 100644 --- a/src/script.c +++ b/src/script.c @@ -7,13 +7,16 @@ #define RAM_SCRIPT_MAGIC 51 -extern const u8* gUnknown_020375C0; +enum { + SCRIPT_MODE_STOPPED, + SCRIPT_MODE_BYTECODE, + SCRIPT_MODE_NATIVE, +}; + +extern const u8* gRamScriptRetAddr; -// ewram bss static u8 sScriptContext1Status; -static u32 sUnusedVariable1; static struct ScriptContext sScriptContext1; -static u32 sUnusedVariable2; static struct ScriptContext sScriptContext2; static bool8 sScriptContext2Enabled; @@ -25,57 +28,60 @@ void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTable { s32 i; - ctx->mode = 0; - ctx->scriptPtr = 0; + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; ctx->stackDepth = 0; - ctx->nativePtr = 0; + ctx->nativePtr = NULL; ctx->cmdTable = cmdTable; ctx->cmdTableEnd = cmdTableEnd; - for (i = 0; i < 4; i++) + for (i = 0; i < (int)ARRAY_COUNT(ctx->data); i++) ctx->data[i] = 0; - for (i = 0; i < 20; i++) - ctx->stack[i] = 0; + for (i = 0; i < (int)ARRAY_COUNT(ctx->stack); i++) + ctx->stack[i] = NULL; } u8 SetupBytecodeScript(struct ScriptContext *ctx, const u8 *ptr) { ctx->scriptPtr = ptr; - ctx->mode = 1; + ctx->mode = SCRIPT_MODE_BYTECODE; return 1; } void SetupNativeScript(struct ScriptContext *ctx, bool8 (*ptr)(void)) { - ctx->mode = 2; + ctx->mode = SCRIPT_MODE_NATIVE; ctx->nativePtr = ptr; } void StopScript(struct ScriptContext *ctx) { - ctx->mode = 0; - ctx->scriptPtr = 0; + ctx->mode = SCRIPT_MODE_STOPPED; + ctx->scriptPtr = NULL; } bool8 RunScriptCommand(struct ScriptContext *ctx) { - if (ctx->mode == 0) + if (ctx->mode == SCRIPT_MODE_STOPPED) return FALSE; switch (ctx->mode) { - case 0: + case SCRIPT_MODE_STOPPED: return FALSE; - case 2: + case SCRIPT_MODE_NATIVE: + // Try to call a function in C + // Continue to bytecode if no function or it returns TRUE if (ctx->nativePtr) { if (ctx->nativePtr() == TRUE) - ctx->mode = 1; + ctx->mode = SCRIPT_MODE_BYTECODE; return TRUE; } - ctx->mode = 1; - case 1: + ctx->mode = SCRIPT_MODE_BYTECODE; + // fallthrough + case SCRIPT_MODE_BYTECODE: while (1) { u8 cmdCode; @@ -83,7 +89,7 @@ bool8 RunScriptCommand(struct ScriptContext *ctx) if (!ctx->scriptPtr) { - ctx->mode = 0; + ctx->mode = SCRIPT_MODE_STOPPED; return FALSE; } @@ -99,11 +105,11 @@ bool8 RunScriptCommand(struct ScriptContext *ctx) if (func >= ctx->cmdTableEnd) { - ctx->mode = 0; + ctx->mode = SCRIPT_MODE_STOPPED; return FALSE; } - if ((*func)(ctx) == 1) + if ((*func)(ctx) == TRUE) return TRUE; } } @@ -111,21 +117,21 @@ bool8 RunScriptCommand(struct ScriptContext *ctx) return TRUE; } -u8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) +static bool8 ScriptPush(struct ScriptContext *ctx, const u8 *ptr) { - if (ctx->stackDepth + 1 >= 20) + if (ctx->stackDepth + 1 >= (int)ARRAY_COUNT(ctx->stack)) { - return 1; + return TRUE; } else { ctx->stack[ctx->stackDepth] = ptr; ctx->stackDepth++; - return 0; + return FALSE; } } -const u8 *ScriptPop(struct ScriptContext *ctx) +static const u8 *ScriptPop(struct ScriptContext *ctx) { if (ctx->stackDepth == 0) return NULL; @@ -198,10 +204,10 @@ void ScriptContext1_Init(void) bool8 ScriptContext2_RunScript(void) { if (sScriptContext1Status == 2) - return 0; + return FALSE; if (sScriptContext1Status == 1) - return 0; + return FALSE; ScriptContext2_Enable(); @@ -209,10 +215,10 @@ bool8 ScriptContext2_RunScript(void) { sScriptContext1Status = 2; ScriptContext2_Disable(); - return 0; + return FALSE; } - return 1; + return TRUE; } void ScriptContext1_SetupScript(const u8 *ptr) @@ -236,7 +242,7 @@ void EnableBothScriptContexts(void) void ScriptContext2_RunNewScript(const u8 *ptr) { - InitScriptContext(&sScriptContext2, &gScriptCmdTable, &gScriptCmdTableEnd); + InitScriptContext(&sScriptContext2, gScriptCmdTable, gScriptCmdTableEnd); SetupBytecodeScript(&sScriptContext2, ptr); while (RunScriptCommand(&sScriptContext2) == TRUE); } @@ -255,7 +261,7 @@ u8 *MapHeaderGetScriptTable(u8 tag) if (*mapScripts == tag) { mapScripts++; - return (u8 *)(mapScripts[0] + (mapScripts[1] << 8) + (mapScripts[2] << 16) + (mapScripts[3] << 24)); + return T2_READ_PTR(mapScripts); } mapScripts += 5; } @@ -279,14 +285,20 @@ u8 *MapHeaderCheckScriptTable(u8 tag) { u16 varIndex1; u16 varIndex2; - varIndex1 = ptr[0] | (ptr[1] << 8); + + // Read first var (or .2byte terminal value) + varIndex1 = T1_READ_16(ptr); if (!varIndex1) - return NULL; + return NULL; // Reached end of table ptr += 2; - varIndex2 = ptr[0] | (ptr[1] << 8); + + // Read second var + varIndex2 = T1_READ_16(ptr); ptr += 2; + + // Run map script if vars are equal if (VarGet(varIndex1) == VarGet(varIndex2)) - return (u8 *)(ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24)); + return T2_READ_PTR(ptr); ptr += 4; } } @@ -365,7 +377,7 @@ bool8 InitRamScript(const u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 const u8 *GetRamScript(u8 objectId, const u8 *script) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; - gUnknown_020375C0 = NULL; + gRamScriptRetAddr = NULL; if (scriptData->magic != RAM_SCRIPT_MAGIC) return script; if (scriptData->mapGroup != gSaveBlock1Ptr->location.mapGroup) @@ -381,7 +393,7 @@ const u8 *GetRamScript(u8 objectId, const u8 *script) } else { - gUnknown_020375C0 = script; + gRamScriptRetAddr = script; return scriptData->script; } } diff --git a/src/script_menu.c b/src/script_menu.c index 425cdc251..f3317773a 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -279,7 +279,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignore gTasks[taskId].tWindowId = CreateWindowFromRect(left, top, columnCount * newWidth, rowCount * 2); SetStandardWindowBorderStyle(gTasks[taskId].tWindowId, 0); PrintMenuGridTable(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, sMultichoiceLists[multichoiceId].list); - sub_8199944(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, 0); + InitMenuActionGrid(gTasks[taskId].tWindowId, newWidth * 8, columnCount, rowCount, 0); CopyWindowToVram(gTasks[taskId].tWindowId, 3); return TRUE; } @@ -580,7 +580,7 @@ bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y) u8 taskId; u8 spriteId; - if (FindTaskIdByFunc(Task_PokemonPicWindow) != 0xFF) + if (FindTaskIdByFunc(Task_PokemonPicWindow) != TASK_NONE) { return FALSE; } @@ -604,7 +604,7 @@ bool8 (*ScriptMenu_GetPicboxWaitFunc(void))(void) { u8 taskId = FindTaskIdByFunc(Task_PokemonPicWindow); - if (taskId == 0xFF) + if (taskId == TASK_NONE) return NULL; gTasks[taskId].tState++; return IsPicboxClosed; @@ -612,7 +612,7 @@ bool8 (*ScriptMenu_GetPicboxWaitFunc(void))(void) static bool8 IsPicboxClosed(void) { - if (FindTaskIdByFunc(Task_PokemonPicWindow) == 0xFF) + if (FindTaskIdByFunc(Task_PokemonPicWindow) == TASK_NONE) return TRUE; else return FALSE; diff --git a/src/script_movement.c b/src/script_movement.c index 4eb305980..013270697 100644 --- a/src/script_movement.c +++ b/src/script_movement.c @@ -52,7 +52,7 @@ void ScriptMovement_UnfreezeObjectEvents(void) u8 taskId; taskId = GetMoveObjectsTaskId(); - if (taskId != 0xFF) + if (taskId != TASK_NONE) { ScriptMovement_UnfreezeActiveObjects(taskId); DestroyTask(taskId); diff --git a/src/script_pokemon_util.c b/src/script_pokemon_util.c index c9a2127ac..93a747772 100755 --- a/src/script_pokemon_util.c +++ b/src/script_pokemon_util.c @@ -22,7 +22,6 @@ #include "string_util.h" #include "tv.h" #include "constants/items.h" -#include "constants/tv.h" #include "constants/battle_frontier.h" static void CB2_ReturnFromChooseHalfParty(void); @@ -66,7 +65,7 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u u8 heldItem[2]; struct Pokemon mon; - CreateMon(&mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0); + CreateMon(&mon, species, level, USE_RANDOM_IVS, 0, 0, OT_ID_PLAYER_ID, 0); heldItem[0] = item; heldItem[1] = item >> 8; SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); @@ -139,7 +138,7 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item) u8 heldItem[2]; ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0); + CreateMon(&gEnemyParty[0], species, level, USE_RANDOM_IVS, 0, 0, OT_ID_PLAYER_ID, 0); if (item) { heldItem[0] = item; diff --git a/src/secret_base.c b/src/secret_base.c index 8e0929593..e1c62e2f2 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -47,7 +47,13 @@ #include "constants/secret_bases.h" #include "constants/songs.h" #include "constants/trainers.h" -#include "constants/tv.h" + +// Values for registryStatus +enum { + UNREGISTERED, + REGISTERED, + NEW, // Temporary, so new secret bases mixed at the same time don't overwrite each other +}; struct SecretBaseRegistryMenu { @@ -72,21 +78,21 @@ static EWRAM_DATA u8 sCurSecretBaseId = 0; static EWRAM_DATA bool8 sInFriendSecretBase = FALSE; static EWRAM_DATA struct SecretBaseRegistryMenu *sRegistryMenu = NULL; -static void Task_ShowSecretBaseRegistryMenu(u8 taskId); -static void BuildRegistryMenuItems(u8 taskId); -static void RegistryMenu_OnCursorMove(s32 unused, bool8 flag, struct ListMenu *menu); -static void FinalizeRegistryMenu(u8 taskId); -static void AddRegistryMenuScrollArrows(u8 taskId); -static void HandleRegistryMenuInput(u8 taskId); -static void ShowRegistryMenuActions(u8 taskId); -static void HandleRegistryMenuActionsInput(u8 taskId); -static void ShowRegistryMenuDeleteConfirmation(u8 taskId); -static void ShowRegistryMenuDeleteYesNo(u8 taskId); -static void DeleteRegistry_Yes(u8 taskId); -static void DeleteRegistry_No(u8 taskId); -static void ReturnToMainRegistryMenu(u8 taskId); -static void GoToSecretBasePCRegisterMenu(u8 taskId); -static u8 GetSecretBaseOwnerType(u8 secretBaseId); +static void Task_ShowSecretBaseRegistryMenu(u8); +static void BuildRegistryMenuItems(u8); +static void RegistryMenu_OnCursorMove(s32, bool8, struct ListMenu *); +static void FinalizeRegistryMenu(u8); +static void AddRegistryMenuScrollArrows(u8); +static void HandleRegistryMenuInput(u8); +static void ShowRegistryMenuActions(u8); +static void HandleRegistryMenuActionsInput(u8); +static void ShowRegistryMenuDeleteConfirmation(u8); +static void ShowRegistryMenuDeleteYesNo(u8); +static void DeleteRegistry_Yes(u8); +static void DeleteRegistry_No(u8); +static void ReturnToMainRegistryMenu(u8); +static void GoToSecretBasePCRegisterMenu(u8); +static u8 GetSecretBaseOwnerType(u8); static const struct SecretBaseEntranceMetatiles sSecretBaseEntranceMetatiles[] = { @@ -101,34 +107,39 @@ static const struct SecretBaseEntranceMetatiles sSecretBaseEntranceMetatiles[] = // mapNum, warpId, x, y // x, y positions are for when the player warps in for the first time (in front of the computer) -static const u8 sSecretBaseEntrancePositions[] = -{ - MAP_NUM(SECRET_BASE_RED_CAVE1), 0, 1, 3, - MAP_NUM(SECRET_BASE_RED_CAVE2), 0, 5, 9, - MAP_NUM(SECRET_BASE_RED_CAVE3), 0, 1, 3, - MAP_NUM(SECRET_BASE_RED_CAVE4), 0, 7, 13, - MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0, 2, 3, - MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0, 9, 2, - MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0, 13, 4, - MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0, 1, 2, - MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0, 1, 3, - MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0, 1, 2, - MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0, 3, 15, - MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0, 3, 14, - MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0, 9, 3, - MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0, 8, 7, - MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0, 3, 6, - MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0, 5, 9, - MAP_NUM(SECRET_BASE_TREE1), 0, 2, 3, - MAP_NUM(SECRET_BASE_TREE2), 0, 5, 6, - MAP_NUM(SECRET_BASE_TREE3), 0, 15, 3, - MAP_NUM(SECRET_BASE_TREE4), 0, 4, 10, - MAP_NUM(SECRET_BASE_SHRUB1), 0, 3, 3, - MAP_NUM(SECRET_BASE_SHRUB2), 0, 1, 2, - MAP_NUM(SECRET_BASE_SHRUB3), 0, 7, 8, - MAP_NUM(SECRET_BASE_SHRUB4), 0, 9, 6, +static const u8 sSecretBaseEntrancePositions[NUM_SECRET_BASE_GROUPS * 4] = +{ + [SECRET_BASE_RED_CAVE1] = MAP_NUM(SECRET_BASE_RED_CAVE1), 0, 1, 3, + [SECRET_BASE_RED_CAVE2] = MAP_NUM(SECRET_BASE_RED_CAVE2), 0, 5, 9, + [SECRET_BASE_RED_CAVE3] = MAP_NUM(SECRET_BASE_RED_CAVE3), 0, 1, 3, + [SECRET_BASE_RED_CAVE4] = MAP_NUM(SECRET_BASE_RED_CAVE4), 0, 7, 13, + [SECRET_BASE_BROWN_CAVE1] = MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0, 2, 3, + [SECRET_BASE_BROWN_CAVE2] = MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0, 9, 2, + [SECRET_BASE_BROWN_CAVE3] = MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0, 13, 4, + [SECRET_BASE_BROWN_CAVE4] = MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0, 1, 2, + [SECRET_BASE_BLUE_CAVE1] = MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0, 1, 3, + [SECRET_BASE_BLUE_CAVE2] = MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0, 1, 2, + [SECRET_BASE_BLUE_CAVE3] = MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0, 3, 15, + [SECRET_BASE_BLUE_CAVE4] = MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0, 3, 14, + [SECRET_BASE_YELLOW_CAVE1] = MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0, 9, 3, + [SECRET_BASE_YELLOW_CAVE2] = MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0, 8, 7, + [SECRET_BASE_YELLOW_CAVE3] = MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0, 3, 6, + [SECRET_BASE_YELLOW_CAVE4] = MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0, 5, 9, + [SECRET_BASE_TREE1] = MAP_NUM(SECRET_BASE_TREE1), 0, 2, 3, + [SECRET_BASE_TREE2] = MAP_NUM(SECRET_BASE_TREE2), 0, 5, 6, + [SECRET_BASE_TREE3] = MAP_NUM(SECRET_BASE_TREE3), 0, 15, 3, + [SECRET_BASE_TREE4] = MAP_NUM(SECRET_BASE_TREE4), 0, 4, 10, + [SECRET_BASE_SHRUB1] = MAP_NUM(SECRET_BASE_SHRUB1), 0, 3, 3, + [SECRET_BASE_SHRUB2] = MAP_NUM(SECRET_BASE_SHRUB2), 0, 1, 2, + [SECRET_BASE_SHRUB3] = MAP_NUM(SECRET_BASE_SHRUB3), 0, 7, 8, + [SECRET_BASE_SHRUB4] = MAP_NUM(SECRET_BASE_SHRUB4), 0, 9, 6, }; +#define GET_BASE_MAP_NUM(group) (sSecretBaseEntrancePositions[(group) + 0]) +#define GET_BASE_WARP_ID(group) (sSecretBaseEntrancePositions[(group) + 1]) +#define GET_BASE_COMPUTER_X(group) (sSecretBaseEntrancePositions[(group) + 2]) +#define GET_BASE_COMPUTER_Y(group) (sSecretBaseEntrancePositions[(group) + 3]) + static const struct MenuAction sRegistryMenuActions[] = { { @@ -314,6 +325,8 @@ void ToggleSecretBaseEntranceMetatile(void) GetXYCoordsOneStepInFrontOfPlayer(&x, &y); metatileId = MapGridGetMetatileIdAt(x, y); + + // Look for entrance metatiles to open for (i = 0; i < ARRAY_COUNT(sSecretBaseEntranceMetatiles); i++) { if (sSecretBaseEntranceMetatiles[i].closedMetatileId == metatileId) @@ -324,6 +337,7 @@ void ToggleSecretBaseEntranceMetatile(void) } } + // Look for entrance metatiles to close for (i = 0; i < ARRAY_COUNT(sSecretBaseEntranceMetatiles); i++) { if (sSecretBaseEntranceMetatiles[i].openMetatileId == metatileId) @@ -362,6 +376,7 @@ void SetPlayerSecretBase(void) VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); } +// Set the 'open' entrance metatile for any occupied secret base on this map void SetOccupiedSecretBaseEntranceMetatiles(struct MapEvents const *events) { u16 bgId; @@ -395,24 +410,26 @@ void SetOccupiedSecretBaseEntranceMetatiles(struct MapEvents const *events) static void SetSecretBaseWarpDestination(void) { - s8 offset = (sCurSecretBaseId / 10) * 4; - SetWarpDestinationToMapWarp(MAP_GROUP(SECRET_BASE_RED_CAVE1), sSecretBaseEntrancePositions[offset], sSecretBaseEntrancePositions[offset + 1]); + s8 secretBaseGroup = SECRET_BASE_ID_TO_GROUP(sCurSecretBaseId); + SetWarpDestinationToMapWarp(MAP_GROUP(SECRET_BASE_RED_CAVE1), GET_BASE_MAP_NUM(secretBaseGroup), GET_BASE_WARP_ID(secretBaseGroup)); } +#define tState data[0] + static void Task_EnterSecretBase(u8 taskId) { - u16 secretBaseId; + u16 secretBaseIdx; - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tState) { case 0: if (!gPaletteFade.active) - gTasks[taskId].data[0] = 1; + gTasks[taskId].tState = 1; break; case 1: - secretBaseId = VarGet(VAR_CURRENT_SECRET_BASE); - if (gSaveBlock1Ptr->secretBases[secretBaseId].numTimesEntered < 255) - gSaveBlock1Ptr->secretBases[secretBaseId].numTimesEntered++; + secretBaseIdx = VarGet(VAR_CURRENT_SECRET_BASE); + if (gSaveBlock1Ptr->secretBases[secretBaseIdx].numTimesEntered < 255) + gSaveBlock1Ptr->secretBases[secretBaseIdx].numTimesEntered++; SetSecretBaseWarpDestination(); WarpIntoMap(); @@ -423,6 +440,8 @@ static void Task_EnterSecretBase(u8 taskId) } } +#undef tState + void EnterSecretBase(void) { CreateTask(Task_EnterSecretBase, 0); @@ -467,13 +486,13 @@ static void Task_EnterNewlyCreatedSecretBase(u8 taskId) { if (!gPaletteFade.active) { - s8 offset = sCurSecretBaseId / 10 * 4; + s8 secretBaseGroup = SECRET_BASE_ID_TO_GROUP(sCurSecretBaseId); SetWarpDestination( gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, - sSecretBaseEntrancePositions[offset + 2], - sSecretBaseEntrancePositions[offset + 3]); + GET_BASE_COMPUTER_X(secretBaseGroup), + GET_BASE_COMPUTER_Y(secretBaseGroup)); WarpIntoMap(); gFieldCallback = EnterNewlyCreatedSecretBase_StartFadeIn; SetMainCallback2(CB2_LoadMap); @@ -498,23 +517,23 @@ bool8 CurMapIsSecretBase(void) void InitSecretBaseAppearance(bool8 hidePC) { - u16 secretBaseId; + u16 secretBaseIdx; u16 x, y; u8 *decorations; u8 *decorPos; if (CurMapIsSecretBase()) { - secretBaseId = VarGet(VAR_CURRENT_SECRET_BASE); - decorations = gSaveBlock1Ptr->secretBases[secretBaseId].decorations; - decorPos = gSaveBlock1Ptr->secretBases[secretBaseId].decorationPositions; + secretBaseIdx = VarGet(VAR_CURRENT_SECRET_BASE); + decorations = gSaveBlock1Ptr->secretBases[secretBaseIdx].decorations; + decorPos = gSaveBlock1Ptr->secretBases[secretBaseIdx].decorationPositions; for (x = 0; x < DECOR_MAX_SECRET_BASE; x++) { if (decorations[x] > 0 && decorations[x] <= NUM_DECORATIONS && gDecorations[decorations[x]].permission != DECORPERM_SPRITE) ShowDecorationOnMap((decorPos[x] >> 4) + 7, (decorPos[x] & 0xF) + 7, decorations[x]); } - if (secretBaseId != 0) + if (secretBaseIdx != 0) { // Another player's secret base. Change PC type to the "Register" PC. FindMetatileIdMapCoords(&x, &y, METATILE_SecretBase_PC); @@ -549,9 +568,9 @@ void InitSecretBaseDecorationSprites(void) } else { - u16 secretBaseId = VarGet(VAR_CURRENT_SECRET_BASE); - decorations = gSaveBlock1Ptr->secretBases[secretBaseId].decorations; - decorationPositions = gSaveBlock1Ptr->secretBases[secretBaseId].decorationPositions; + u16 secretBaseIdx = VarGet(VAR_CURRENT_SECRET_BASE); + decorations = gSaveBlock1Ptr->secretBases[secretBaseIdx].decorations; + decorationPositions = gSaveBlock1Ptr->secretBases[secretBaseIdx].decorationPositions; numDecorations = DECOR_MAX_SECRET_BASE; } @@ -703,10 +722,10 @@ void IsCurSecretBaseOwnedByAnotherPlayer(void) gSpecialVar_Result = FALSE; } -static u8 *GetSecretBaseName(u8 *dest, u8 secretBaseId) +static u8 *GetSecretBaseName(u8 *dest, u8 secretBaseIdx) { - *StringCopyN(dest, gSaveBlock1Ptr->secretBases[secretBaseId].trainerName, GetNameLength(gSaveBlock1Ptr->secretBases[secretBaseId].trainerName)) = EOS; - ConvertInternationalString(dest, gSaveBlock1Ptr->secretBases[secretBaseId].language); + *StringCopyN(dest, gSaveBlock1Ptr->secretBases[secretBaseIdx].trainerName, GetNameLength(gSaveBlock1Ptr->secretBases[secretBaseIdx].trainerName)) = EOS; + ConvertInternationalString(dest, gSaveBlock1Ptr->secretBases[secretBaseIdx].language); return StringAppend(dest, gText_ApostropheSBase); } @@ -717,18 +736,18 @@ u8 *GetSecretBaseMapName(u8 *dest) void CopyCurSecretBaseOwnerName_StrVar1(void) { - u8 secretBaseId; + u8 secretBaseIdx; const u8 *name; - secretBaseId = VarGet(VAR_CURRENT_SECRET_BASE); - name = gSaveBlock1Ptr->secretBases[secretBaseId].trainerName; + secretBaseIdx = VarGet(VAR_CURRENT_SECRET_BASE); + name = gSaveBlock1Ptr->secretBases[secretBaseIdx].trainerName; *StringCopyN(gStringVar1, name, GetNameLength(name)) = EOS; - ConvertInternationalString(gStringVar1, gSaveBlock1Ptr->secretBases[secretBaseId].language); + ConvertInternationalString(gStringVar1, gSaveBlock1Ptr->secretBases[secretBaseIdx].language); } -static bool8 IsSecretBaseRegistered(u8 secretBaseId) +static bool8 IsSecretBaseRegistered(u8 secretBaseIdx) { - if (gSaveBlock1Ptr->secretBases[secretBaseId].registryStatus) + if (gSaveBlock1Ptr->secretBases[secretBaseIdx].registryStatus) return TRUE; return FALSE; @@ -812,7 +831,7 @@ static void ClosePlayerSecretBaseEntrance(void) && gSaveBlock1Ptr->secretBases[0].secretBaseId == events->bgEvents[i].bgUnion.secretBaseId) { metatileId = MapGridGetMetatileIdAt(events->bgEvents[i].x + 7, events->bgEvents[i].y + 7); - for (j = 0; j < 7; j++) + for (j = 0; j < ARRAY_COUNT(sSecretBaseEntranceMetatiles); j++) { if (sSecretBaseEntranceMetatiles[j].openMetatileId == metatileId) { @@ -879,18 +898,28 @@ void ShowSecretBaseRegistryMenu(void) CreateTask(Task_ShowSecretBaseRegistryMenu, 0); } +#define tNumBases data[0] +#define tSelectedRow data[1] +#define tScrollOffset data[2] +#define tMaxShownItems data[3] +#define tSelectedBaseId data[4] +#define tListTaskId data[5] +#define tMainWindowId data[6] +#define tActionWindowId data[7] +#define tArrowTaskId data[8] + static void Task_ShowSecretBaseRegistryMenu(u8 taskId) { s16 *data = gTasks[taskId].data; ScriptContext2_Enable(); - data[0] = GetNumRegisteredSecretBases(); - if (data[0] != 0) + tNumBases = GetNumRegisteredSecretBases(); + if (tNumBases != 0) { - data[1] = 0; - data[2] = 0; + tSelectedRow = 0; + tScrollOffset = 0; ClearDialogWindowAndFrame(0, 0); sRegistryMenu = calloc(1, sizeof(*sRegistryMenu)); - data[6] = AddWindow(&sRegistryWindowTemplates[0]); + tMainWindowId = AddWindow(&sRegistryWindowTemplates[0]); BuildRegistryMenuItems(taskId); FinalizeRegistryMenu(taskId); gTasks[taskId].func = HandleRegistryMenuInput; @@ -922,17 +951,17 @@ static void BuildRegistryMenuItems(u8 taskId) sRegistryMenu->items[count].name = gText_Cancel; sRegistryMenu->items[count].id = -2; - data[0] = count + 1; - if (data[0] < 8) - data[3] = data[0]; + tNumBases = count + 1; + if (tNumBases < 8) + tMaxShownItems = tNumBases; else - data[3] = 8; + tMaxShownItems = 8; gMultiuseListMenuTemplate = sRegistryListMenuTemplate; - gMultiuseListMenuTemplate.windowId = data[6]; - gMultiuseListMenuTemplate.totalItems = data[0]; + gMultiuseListMenuTemplate.windowId = tMainWindowId; + gMultiuseListMenuTemplate.totalItems = tNumBases; gMultiuseListMenuTemplate.items = sRegistryMenu->items; - gMultiuseListMenuTemplate.maxShowed = data[3]; + gMultiuseListMenuTemplate.maxShowed = tMaxShownItems; } static void RegistryMenu_OnCursorMove(s32 unused, bool8 flag, struct ListMenu *menu) @@ -944,8 +973,8 @@ static void RegistryMenu_OnCursorMove(s32 unused, bool8 flag, struct ListMenu *m static void FinalizeRegistryMenu(u8 taskId) { s16 *data = gTasks[taskId].data; - SetStandardWindowBorderStyle(data[6], 0); - data[5] = ListMenuInit(&gMultiuseListMenuTemplate, data[2], data[1]); + SetStandardWindowBorderStyle(tMainWindowId, 0); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, tScrollOffset, tSelectedRow); AddRegistryMenuScrollArrows(taskId); ScheduleBgCopyTilemapToVram(0); } @@ -953,35 +982,33 @@ static void FinalizeRegistryMenu(u8 taskId) static void AddRegistryMenuScrollArrows(u8 taskId) { s16 *data = gTasks[taskId].data; - data[8] = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xbc, 0x0c, 0x94, data[0] - data[3], 0x13f8, 0x13f8, &data[2]); + tArrowTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 188, 12, 148, tNumBases - tMaxShownItems, 0x13f8, 0x13f8, &tScrollOffset); } static void HandleRegistryMenuInput(u8 taskId) { - s16 *data; - s32 input; + s16 *data = gTasks[taskId].data; + s32 input = ListMenu_ProcessInput(tListTaskId); + ListMenuGetScrollAndRow(tListTaskId, &tScrollOffset, &tSelectedRow); - data = gTasks[taskId].data; - input = ListMenu_ProcessInput(data[5]); - ListMenuGetScrollAndRow(data[5], &data[2], &data[1]); switch (input) { case LIST_NOTHING_CHOSEN: break; case LIST_CANCEL: PlaySE(SE_SELECT); - DestroyListMenuTask(data[5], NULL, NULL); - RemoveScrollIndicatorArrowPair(data[8]); - ClearStdWindowAndFrame(data[6], 0); - ClearWindowTilemap(data[6]); - RemoveWindow(data[6]); + DestroyListMenuTask(tListTaskId, NULL, NULL); + RemoveScrollIndicatorArrowPair(tArrowTaskId); + ClearStdWindowAndFrame(tMainWindowId, 0); + ClearWindowTilemap(tMainWindowId); + RemoveWindow(tMainWindowId); ScheduleBgCopyTilemapToVram(0); free(sRegistryMenu); GoToSecretBasePCRegisterMenu(taskId); break; default: PlaySE(SE_SELECT); - data[4] = input; + tSelectedBaseId = input; ShowRegistryMenuActions(taskId); break; } @@ -991,13 +1018,13 @@ static void ShowRegistryMenuActions(u8 taskId) { struct WindowTemplate template; s16 *data = gTasks[taskId].data; - RemoveScrollIndicatorArrowPair(data[8]); + RemoveScrollIndicatorArrowPair(tArrowTaskId); template = sRegistryWindowTemplates[1]; template.width = GetMaxWidthInMenuTable(sRegistryMenuActions, 2); - data[7] = AddWindow(&template); - SetStandardWindowBorderStyle(data[7], 0); - PrintMenuTable(data[7], 2, sRegistryMenuActions); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[7], 2, 0); + tActionWindowId = AddWindow(&template); + SetStandardWindowBorderStyle(tActionWindowId, 0); + PrintMenuTable(tActionWindowId, ARRAY_COUNT(sRegistryMenuActions), sRegistryMenuActions); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(tActionWindowId, 2, 0); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = HandleRegistryMenuActionsInput; } @@ -1023,13 +1050,13 @@ static void HandleRegistryMenuActionsInput(u8 taskId) static void ShowRegistryMenuDeleteConfirmation(u8 taskId) { s16 *data = gTasks[taskId].data; - ClearStdWindowAndFrame(data[6], FALSE); - ClearStdWindowAndFrame(data[7], FALSE); - ClearWindowTilemap(data[6]); - ClearWindowTilemap(data[7]); - RemoveWindow(data[7]); + ClearStdWindowAndFrame(tMainWindowId, FALSE); + ClearStdWindowAndFrame(tActionWindowId, FALSE); + ClearWindowTilemap(tMainWindowId); + ClearWindowTilemap(tActionWindowId); + RemoveWindow(tActionWindowId); ScheduleBgCopyTilemapToVram(0); - GetSecretBaseName(gStringVar1, data[4]); + GetSecretBaseName(gStringVar1, tSelectedBaseId); StringExpandPlaceholders(gStringVar4, gText_OkayToDeleteFromRegistry); DisplayItemMessageOnField(taskId, gStringVar4, ShowRegistryMenuDeleteYesNo); } @@ -1044,10 +1071,10 @@ void DeleteRegistry_Yes_Callback(u8 taskId) { s16 *data = gTasks[taskId].data; ClearDialogWindowAndFrame(0, 0); - DestroyListMenuTask(data[5], &data[2], &data[1]); - gSaveBlock1Ptr->secretBases[data[4]].registryStatus = 0; + DestroyListMenuTask(tListTaskId, &tScrollOffset, &tSelectedRow); + gSaveBlock1Ptr->secretBases[tSelectedBaseId].registryStatus = UNREGISTERED; BuildRegistryMenuItems(taskId); - sub_812225C(&data[2], &data[1], data[3], data[0]); + sub_812225C(&tScrollOffset, &tSelectedRow, tMaxShownItems, tNumBases); FinalizeRegistryMenu(taskId); gTasks[taskId].func = HandleRegistryMenuInput; } @@ -1061,7 +1088,7 @@ static void DeleteRegistry_No(u8 taskId) { s16 *data = gTasks[taskId].data; ClearDialogWindowAndFrame(0, 0); - DestroyListMenuTask(data[5], &data[2], &data[1]); + DestroyListMenuTask(tListTaskId, &tScrollOffset, &tSelectedRow); FinalizeRegistryMenu(taskId); gTasks[taskId].func = HandleRegistryMenuInput; } @@ -1070,9 +1097,9 @@ static void ReturnToMainRegistryMenu(u8 taskId) { s16 *data = gTasks[taskId].data; AddRegistryMenuScrollArrows(taskId); - ClearStdWindowAndFrame(data[7], 0); - ClearWindowTilemap(data[7]); - RemoveWindow(data[7]); + ClearStdWindowAndFrame(tActionWindowId, 0); + ClearWindowTilemap(tActionWindowId); + RemoveWindow(tActionWindowId); ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = HandleRegistryMenuInput; } @@ -1087,10 +1114,20 @@ static void GoToSecretBasePCRegisterMenu(u8 taskId) DestroyTask(taskId); } -static u8 GetSecretBaseOwnerType(u8 secretBaseId) +#undef tNumBases +#undef tSelectedRow +#undef tScrollOffset +#undef tMaxShownItems +#undef tSelectedBaseId +#undef tListTaskId +#undef tMainWindowId +#undef tActionWindowId +#undef tArrowTaskId + +static u8 GetSecretBaseOwnerType(u8 secretBaseIdx) { - return (gSaveBlock1Ptr->secretBases[secretBaseId].trainerId[0] % 5) - + (gSaveBlock1Ptr->secretBases[secretBaseId].gender * 5); + return (gSaveBlock1Ptr->secretBases[secretBaseIdx].trainerId[0] % 5) + + (gSaveBlock1Ptr->secretBases[secretBaseIdx].gender * 5); } const u8 *GetSecretBaseTrainerLoseText(void) @@ -1132,10 +1169,10 @@ void SetBattledOwnerFromResult(void) void GetSecretBaseOwnerAndState(void) { - u16 secretBaseId; + u16 secretBaseIdx; u8 i; - secretBaseId = VarGet(VAR_CURRENT_SECRET_BASE); + secretBaseIdx = VarGet(VAR_CURRENT_SECRET_BASE); if (!FlagGet(FLAG_DAILY_SECRET_BASE)) { for (i = 0; i < SECRET_BASES_COUNT; i++) @@ -1143,10 +1180,16 @@ void GetSecretBaseOwnerAndState(void) FlagSet(FLAG_DAILY_SECRET_BASE); } - gSpecialVar_0x8004 = GetSecretBaseOwnerType(secretBaseId); - gSpecialVar_Result = gSaveBlock1Ptr->secretBases[secretBaseId].battledOwnerToday; + gSpecialVar_0x8004 = GetSecretBaseOwnerType(secretBaseIdx); + gSpecialVar_Result = gSaveBlock1Ptr->secretBases[secretBaseIdx].battledOwnerToday; } +#define tStepCb data[0] // See Task_RunPerStepCallback +#define tState data[1] +#define tPlayerX data[2] +#define tPlayerY data[3] +#define tFldEff data[4] + void SecretBasePerStepCallback(u8 taskId) { s16 x; @@ -1156,23 +1199,23 @@ void SecretBasePerStepCallback(u8 taskId) s16 *data; data = gTasks[taskId].data; - switch (data[1]) + switch (tState) { case 0: - if (VarGet(VAR_CURRENT_SECRET_BASE) != 0) + if (VarGet(VAR_CURRENT_SECRET_BASE)) sInFriendSecretBase = TRUE; else sInFriendSecretBase = FALSE; - PlayerGetDestCoords(&data[2], &data[3]); - data[1] = 1; + PlayerGetDestCoords(&tPlayerX, &tPlayerY); + tState = 1; break; case 1: PlayerGetDestCoords(&x, &y); - if (x != data[2] || y != data[3]) + if (x != tPlayerX || y != tPlayerY) { - data[2] = x; - data[3] = y; + tPlayerX = x; + tPlayerY = y; VarSet(VAR_SECRET_BASE_STEP_COUNTER, VarGet(VAR_SECRET_BASE_STEP_COUNTER) + 1); behavior = MapGridGetMetatileBehaviorAt(x, y); tileId = MapGridGetMetatileIdAt(x, y); @@ -1273,33 +1316,40 @@ void SecretBasePerStepCallback(u8 taskId) } break; case 2: - if (!FieldEffectActiveListContains(data[4])) - data[1] = 1; + // This state is never reached, and tFldEff is never set + if (!FieldEffectActiveListContains(tFldEff)) + tState = 1; break; } } -static void SetSecretBaseDataAndLanguage(u8 secretBaseId, struct SecretBase *secretBase, u32 version, u32 language) +#undef tStepCb +#undef tState +#undef tPlayerX +#undef tPlayerY +#undef tFldEff + +static void SaveSecretBase(u8 secretBaseIdx, struct SecretBase *secretBase, u32 version, u32 language) { int stringLength; u8 *name; - gSaveBlock1Ptr->secretBases[secretBaseId] = *secretBase; - gSaveBlock1Ptr->secretBases[secretBaseId].registryStatus = 2; + gSaveBlock1Ptr->secretBases[secretBaseIdx] = *secretBase; + gSaveBlock1Ptr->secretBases[secretBaseIdx].registryStatus = NEW; if (version == VERSION_SAPPHIRE || version == VERSION_RUBY) - gSaveBlock1Ptr->secretBases[secretBaseId].language = LANGUAGE_ENGLISH; + gSaveBlock1Ptr->secretBases[secretBaseIdx].language = GAME_LANGUAGE; if (version == VERSION_EMERALD && language == LANGUAGE_JAPANESE) { - name = gSaveBlock1Ptr->secretBases[secretBaseId].trainerName; - for (stringLength = 0; stringLength < 7; stringLength++) + name = gSaveBlock1Ptr->secretBases[secretBaseIdx].trainerName; + for (stringLength = 0; stringLength < PLAYER_NAME_LENGTH; stringLength++) { if (name[stringLength] == EOS) break; } if (stringLength > 5) - gSaveBlock1Ptr->secretBases[secretBaseId].language = LANGUAGE_ENGLISH; + gSaveBlock1Ptr->secretBases[secretBaseIdx].language = GAME_LANGUAGE; } } @@ -1363,56 +1413,67 @@ static u8 FindAvailableSecretBaseIndex(void) return 0; } -static u8 sub_80EAA18(void) +static u8 FindUnregisteredSecretBaseIndex(void) { s16 i; for (i = 1; i < SECRET_BASES_COUNT; i++) { - if (gSaveBlock1Ptr->secretBases[i].registryStatus == 0 && gSaveBlock1Ptr->secretBases[i].sbr_field_1_0 == 0) + if (gSaveBlock1Ptr->secretBases[i].registryStatus == UNREGISTERED && gSaveBlock1Ptr->secretBases[i].toRegister == FALSE) return i; } return 0; } -static u8 sub_80EAA64(struct SecretBase *secretBase, u32 version, u32 language) +static u8 TrySaveFriendsSecretBase(struct SecretBase *secretBase, u32 version, u32 language) { s16 index; + // Secret base has no location if (!secretBase->secretBaseId) return 0; index = GetSecretBaseIndexFromId(secretBase->secretBaseId); if (index != 0) { + // An existing secret base is using this location if (index != -1) { - if (gSaveBlock1Ptr->secretBases[index].sbr_field_1_0 == 1) + if (gSaveBlock1Ptr->secretBases[index].toRegister == TRUE) return 0; - if (gSaveBlock1Ptr->secretBases[index].registryStatus != 2 || secretBase->sbr_field_1_0 == 1) + if (gSaveBlock1Ptr->secretBases[index].registryStatus != NEW || secretBase->toRegister == TRUE) { - SetSecretBaseDataAndLanguage(index, secretBase, version, language); + // Overwrite unregistered base at this location + SaveSecretBase(index, secretBase, version, language); return index; } } + // No secret base is using this location, find a spot to save it else { index = FindAvailableSecretBaseIndex(); if (index != 0) { - SetSecretBaseDataAndLanguage(index, secretBase, version, language); + // Save in empty space + SaveSecretBase(index, secretBase, version, language); return index; } - index = sub_80EAA18(); + index = FindUnregisteredSecretBaseIndex(); if (index != 0) { - SetSecretBaseDataAndLanguage(index, secretBase, version, language); + // Overwrite unregistered base + SaveSecretBase(index, secretBase, version, language); return index; } } } + + // Unable to save. Either... + // - This was the player's base + // - A registered base exists at this location + // - The secret base limit has been filled with registered bases return 0; } @@ -1425,11 +1486,12 @@ static void SortSecretBasesByRegistryStatus(void) struct SecretBase *secretBases; secretBases = gSaveBlock1Ptr->secretBases; - for (i = 1; i < 19; i++) + for (i = 1; i < SECRET_BASES_COUNT - 1; i++) { for (j = i + 1; j < SECRET_BASES_COUNT; j++) { - if ((secretBases[i].registryStatus == 0 && secretBases[j].registryStatus == 1) || (secretBases[i].registryStatus == 2 && secretBases[j].registryStatus != 2)) + if ((secretBases[i].registryStatus == UNREGISTERED && secretBases[j].registryStatus == REGISTERED) + || (secretBases[i].registryStatus == NEW && secretBases[j].registryStatus != NEW)) { struct SecretBase temp; SWAP(secretBases[i], secretBases[j], temp) @@ -1438,17 +1500,19 @@ static void SortSecretBasesByRegistryStatus(void) } } -void sub_80EABA4(struct SecretBaseRecordMixer *mixer, u8 registryStatus) +// Used to save a record mixing friends' bases other than their own +// registryStatus is so registered bases can be attempted first +static void TrySaveFriendsSecretBases(struct SecretBaseRecordMixer *mixer, u8 registryStatus) { u16 i; for (i = 1; i < SECRET_BASES_COUNT; i++) { if (mixer->secretBases[i].registryStatus == registryStatus) - sub_80EAA64(&mixer->secretBases[i], mixer->version, mixer->language); + TrySaveFriendsSecretBase(&mixer->secretBases[i], mixer->version, mixer->language); } } -bool8 SecretBaseBelongsToPlayer(struct SecretBase *secretBase) +static bool8 SecretBaseBelongsToPlayer(struct SecretBase *secretBase) { u8 i; @@ -1478,7 +1542,7 @@ bool8 SecretBaseBelongsToPlayer(struct SecretBase *secretBase) #define DELETED_BASE_B (1 << 1) #define DELETED_BASE_C (1 << 2) -void DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords(struct SecretBase *basesA, struct SecretBase *basesB, struct SecretBase *basesC) +static void DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords(struct SecretBase *basesA, struct SecretBase *basesB, struct SecretBase *basesC) { u8 i; u8 sbFlags = 0; @@ -1524,7 +1588,7 @@ void DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords(struct SecretBase #undef DELETED_BASE_C // returns TRUE if secretBase was deleted, FALSE otherwise -static bool8 ClearDuplicateOwnedSecretBases(struct SecretBase *secretBase, struct SecretBase *secretBases, u8 c) +static bool8 ClearDuplicateOwnedSecretBase(struct SecretBase *secretBase, struct SecretBase *secretBases, u8 idx) { u8 i; @@ -1534,7 +1598,7 @@ static bool8 ClearDuplicateOwnedSecretBases(struct SecretBase *secretBase, struc { if (SecretBasesBelongToSamePlayer(secretBase, &secretBases[i]) == TRUE) { - if (c == 0) + if (idx == 0) { ClearSecretBase(&secretBases[i]); return FALSE; @@ -1546,7 +1610,7 @@ static bool8 ClearDuplicateOwnedSecretBases(struct SecretBase *secretBase, struc return FALSE; } - secretBases[i].sbr_field_1_0 = secretBase->sbr_field_1_0; + secretBases[i].toRegister = secretBase->toRegister; ClearSecretBase(secretBase); return TRUE; } @@ -1556,87 +1620,97 @@ static bool8 ClearDuplicateOwnedSecretBases(struct SecretBase *secretBase, struc return FALSE; } -void sub_80EAD94(struct SecretBase *basesA, struct SecretBase *basesB, struct SecretBase *basesC, struct SecretBase *basesD) +static void ClearDuplicateOwnedSecretBases(struct SecretBase *playersBases, struct SecretBase *friendsBasesA, struct SecretBase *friendsBasesB, struct SecretBase *friendsBasesC) { u8 i; for (i = 1; i < SECRET_BASES_COUNT; i++) { - if (basesA[i].secretBaseId) + if (playersBases[i].secretBaseId) { - if (basesA[i].registryStatus == 1) + if (playersBases[i].registryStatus == REGISTERED) { - basesA[i].sbr_field_1_0 = 1; + // Mark registered bases, so if they're deleted as a duplicate they + // will be re-registered later + playersBases[i].toRegister = TRUE; } - if (!ClearDuplicateOwnedSecretBases(&basesA[i], basesB, i)) + if (!ClearDuplicateOwnedSecretBase(&playersBases[i], friendsBasesA, i)) { - if (!ClearDuplicateOwnedSecretBases(&basesA[i], basesC, i)) + if (!ClearDuplicateOwnedSecretBase(&playersBases[i], friendsBasesB, i)) { - ClearDuplicateOwnedSecretBases(&basesA[i], basesD, i); + ClearDuplicateOwnedSecretBase(&playersBases[i], friendsBasesC, i); } } } } for (i = 0; i < SECRET_BASES_COUNT; i++) { - if (basesB[i].secretBaseId) + if (friendsBasesA[i].secretBaseId) { - basesB[i].battledOwnerToday = 0; - if (!ClearDuplicateOwnedSecretBases(&basesB[i], basesC, i)) + friendsBasesA[i].battledOwnerToday = 0; + if (!ClearDuplicateOwnedSecretBase(&friendsBasesA[i], friendsBasesB, i)) { - ClearDuplicateOwnedSecretBases(&basesB[i], basesD, i); + ClearDuplicateOwnedSecretBase(&friendsBasesA[i], friendsBasesC, i); } } } for (i = 0; i < SECRET_BASES_COUNT; i++) { - if (basesC[i].secretBaseId) + if (friendsBasesB[i].secretBaseId) { - basesC[i].battledOwnerToday = 0; - ClearDuplicateOwnedSecretBases(&basesC[i], basesD, i); + friendsBasesB[i].battledOwnerToday = 0; + ClearDuplicateOwnedSecretBase(&friendsBasesB[i], friendsBasesC, i); } - if (basesD[i].secretBaseId) + if (friendsBasesC[i].secretBaseId) { - basesD[i].battledOwnerToday = 0; + friendsBasesC[i].battledOwnerToday = 0; } } } -void sub_80EAE90(struct SecretBase *base, u32 version, u32 language) +static void TrySaveRegisteredDuplicate(struct SecretBase *base, u32 version, u32 language) { - if (base->sbr_field_1_0 == 1) + if (base->toRegister == TRUE) { - sub_80EAA64(base, version, language); + TrySaveFriendsSecretBase(base, version, language); ClearSecretBase(base); } } -void sub_80EAEB4(struct SecretBaseRecordMixer *mixers) +static void TrySaveRegisteredDuplicates(struct SecretBaseRecordMixer *mixers) { u16 i; for (i = 0; i < SECRET_BASES_COUNT; i++) { - sub_80EAE90(&mixers[0].secretBases[i], mixers[0].version, mixers[0].language); - sub_80EAE90(&mixers[1].secretBases[i], mixers[1].version, mixers[1].language); - sub_80EAE90(&mixers[2].secretBases[i], mixers[2].version, mixers[2].language); + TrySaveRegisteredDuplicate(&mixers[0].secretBases[i], mixers[0].version, mixers[0].language); + TrySaveRegisteredDuplicate(&mixers[1].secretBases[i], mixers[1].version, mixers[1].language); + TrySaveRegisteredDuplicate(&mixers[2].secretBases[i], mixers[2].version, mixers[2].language); } } -void sub_80EAEF4(struct SecretBaseRecordMixer *mixers) +static void SaveRecordMixBases(struct SecretBaseRecordMixer *mixers) { DeleteFirstOldBaseFromPlayerInRecordMixingFriendsRecords(mixers[0].secretBases, mixers[1].secretBases, mixers[2].secretBases); - sub_80EAD94(gSaveBlock1Ptr->secretBases, mixers[0].secretBases, mixers[1].secretBases, mixers[2].secretBases); - sub_80EAEB4(mixers); - sub_80EAA64(mixers[0].secretBases, mixers[0].version, mixers[0].language); - sub_80EAA64(mixers[1].secretBases, mixers[1].version, mixers[1].language); - sub_80EAA64(mixers[2].secretBases, mixers[2].version, mixers[2].language); - sub_80EABA4(&mixers[0], 1); - sub_80EABA4(&mixers[1], 1); - sub_80EABA4(&mixers[2], 1); - sub_80EABA4(&mixers[0], 0); - sub_80EABA4(&mixers[1], 0); - sub_80EABA4(&mixers[2], 0); + ClearDuplicateOwnedSecretBases(gSaveBlock1Ptr->secretBases, mixers[0].secretBases, mixers[1].secretBases, mixers[2].secretBases); + + // First, save any registered secret bases that were deleted as duplicates + TrySaveRegisteredDuplicates(mixers); + + // Then try to save the record mixing friends' own bases + TrySaveFriendsSecretBase(mixers[0].secretBases, mixers[0].version, mixers[0].language); + TrySaveFriendsSecretBase(mixers[1].secretBases, mixers[1].version, mixers[1].language); + TrySaveFriendsSecretBase(mixers[2].secretBases, mixers[2].version, mixers[2].language); + + // Then try to save as many of their registered bases as possible + TrySaveFriendsSecretBases(&mixers[0], REGISTERED); + TrySaveFriendsSecretBases(&mixers[1], REGISTERED); + TrySaveFriendsSecretBases(&mixers[2], REGISTERED); + + // Lastly save as many of their unregistered bases as possible + TrySaveFriendsSecretBases(&mixers[0], UNREGISTERED); + TrySaveFriendsSecretBases(&mixers[1], UNREGISTERED); + TrySaveFriendsSecretBases(&mixers[2], UNREGISTERED); } #define INIT_SECRET_BASE_RECORD_MIXER(linkId1, linkId2, linkId3) \ @@ -1684,23 +1758,25 @@ void ReceiveSecretBasesData(void *secretBases, size_t recordSize, u8 linkIdx) break; } - sub_80EAEF4(mixers); + SaveRecordMixBases(mixers); + for (i = 1; i < SECRET_BASES_COUNT; i++) { - if (gSaveBlock1Ptr->secretBases[i].sbr_field_1_0 == 1) + // In the process of deleting duplicate bases, if a base the player has registered is deleted it is + // flagged with the temporary toRegister flag, so it can be re-registered after it has been newly saved + if (gSaveBlock1Ptr->secretBases[i].toRegister == TRUE) { - gSaveBlock1Ptr->secretBases[i].registryStatus = 1; - gSaveBlock1Ptr->secretBases[i].sbr_field_1_0 = 0; + gSaveBlock1Ptr->secretBases[i].registryStatus = REGISTERED; + gSaveBlock1Ptr->secretBases[i].toRegister = FALSE; } } SortSecretBasesByRegistryStatus(); for (i = 1; i < SECRET_BASES_COUNT; i++) { - if (gSaveBlock1Ptr->secretBases[i].registryStatus == 2) - { - gSaveBlock1Ptr->secretBases[i].registryStatus = 0; - } + // Unmark "new" bases, they've been saved now and are no longer important + if (gSaveBlock1Ptr->secretBases[i].registryStatus == NEW) + gSaveBlock1Ptr->secretBases[i].registryStatus = UNREGISTERED; } if (gSaveBlock1Ptr->secretBases[0].secretBaseId != 0 diff --git a/src/shop.c b/src/shop.c index 44ab0885c..55b421928 100755 --- a/src/shop.c +++ b/src/shop.c @@ -38,14 +38,16 @@ #include "constants/metatile_behaviors.h" #include "constants/rgb.h" #include "constants/songs.h" -#include "constants/tv.h" -EWRAM_DATA struct MartInfo gMartInfo = {0}; -EWRAM_DATA struct ShopData *gShopDataPtr = NULL; -EWRAM_DATA struct ListMenuItem *gUnknown_02039F74 = NULL; -EWRAM_DATA u8 (*gUnknown_02039F78)[16] = {0}; -EWRAM_DATA u8 gMartPurchaseHistoryId = 0; -EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0}; +#define TAG_SCROLL_ARROW 2100 +#define TAG_ITEM_ICON_BASE 2110 + +static EWRAM_DATA struct MartInfo sMartInfo = {0}; +static EWRAM_DATA struct ShopData *sShopData = NULL; +static EWRAM_DATA struct ListMenuItem *sListMenuItems = NULL; +static EWRAM_DATA u8 (*sItemNames)[16] = {0}; +static EWRAM_DATA u8 sPurchaseHistoryId = 0; +EWRAM_DATA struct ItemSlot gMartPurchaseHistory[SMARTSHOPPER_NUM_ITEMS] = {0}; static void Task_ShopMenu(u8 taskId); static void Task_HandleShopMenuQuit(u8 taskId); @@ -276,15 +278,15 @@ static u8 CreateShopMenu(u8 martType) int numMenuItems; ScriptContext2_Enable(); - gMartInfo.martType = martType; + sMartInfo.martType = martType; if (martType == MART_TYPE_NORMAL) { struct WindowTemplate winTemplate; winTemplate = sShopMenuWindowTemplates[0]; winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuySellQuit, ARRAY_COUNT(sShopMenuActions_BuySellQuit)); - gMartInfo.windowId = AddWindow(&winTemplate); - gMartInfo.menuActions = sShopMenuActions_BuySellQuit; + sMartInfo.windowId = AddWindow(&winTemplate); + sMartInfo.menuActions = sShopMenuActions_BuySellQuit; numMenuItems = ARRAY_COUNT(sShopMenuActions_BuySellQuit); } else @@ -292,35 +294,35 @@ static u8 CreateShopMenu(u8 martType) struct WindowTemplate winTemplate; winTemplate = sShopMenuWindowTemplates[1]; winTemplate.width = GetMaxWidthInMenuTable(sShopMenuActions_BuyQuit, ARRAY_COUNT(sShopMenuActions_BuyQuit)); - gMartInfo.windowId = AddWindow(&winTemplate); - gMartInfo.menuActions = sShopMenuActions_BuyQuit; + sMartInfo.windowId = AddWindow(&winTemplate); + sMartInfo.menuActions = sShopMenuActions_BuyQuit; numMenuItems = ARRAY_COUNT(sShopMenuActions_BuyQuit); } - SetStandardWindowBorderStyle(gMartInfo.windowId, 0); - PrintMenuTable(gMartInfo.windowId, numMenuItems, gMartInfo.menuActions); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gMartInfo.windowId, numMenuItems, 0); - PutWindowTilemap(gMartInfo.windowId); - CopyWindowToVram(gMartInfo.windowId, 1); + SetStandardWindowBorderStyle(sMartInfo.windowId, 0); + PrintMenuTable(sMartInfo.windowId, numMenuItems, sMartInfo.menuActions); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sMartInfo.windowId, numMenuItems, 0); + PutWindowTilemap(sMartInfo.windowId); + CopyWindowToVram(sMartInfo.windowId, 1); return CreateTask(Task_ShopMenu, 8); } static void SetShopMenuCallback(void (* callback)(void)) { - gMartInfo.callback = callback; + sMartInfo.callback = callback; } static void SetShopItemsForSale(const u16 *items) { u16 i = 0; - gMartInfo.itemList = items; - gMartInfo.itemCount = 0; + sMartInfo.itemList = items; + sMartInfo.itemCount = 0; - while (gMartInfo.itemList[i]) + while (sMartInfo.itemList[i]) { - gMartInfo.itemCount++; + sMartInfo.itemCount++; i++; } } @@ -337,7 +339,7 @@ static void Task_ShopMenu(u8 taskId) Task_HandleShopMenuQuit(taskId); break; default: - gMartInfo.menuActions[inputCode].func.void_u8(taskId); + sMartInfo.menuActions[inputCode].func.void_u8(taskId); break; } } @@ -368,14 +370,14 @@ void CB2_ExitSellMenu(void) static void Task_HandleShopMenuQuit(u8 taskId) { - ClearStdWindowAndFrameToTransparent(gMartInfo.windowId, 2); - RemoveWindow(gMartInfo.windowId); - SaveRecordedItemPurchasesForTVShow(); + ClearStdWindowAndFrameToTransparent(sMartInfo.windowId, 2); + RemoveWindow(sMartInfo.windowId); + TryPutSmartShopperOnAir(); ScriptContext2_Disable(); DestroyTask(taskId); - if (gMartInfo.callback) - gMartInfo.callback(); + if (sMartInfo.callback) + sMartInfo.callback(); } static void Task_GoToBuyOrSellMenu(u8 taskId) @@ -398,7 +400,7 @@ static void Task_ReturnToShopMenu(u8 taskId) { if (IsWeatherNotFadingIn() == TRUE) { - if (gMartInfo.martType == MART_TYPE_DECOR2) + if (sMartInfo.martType == MART_TYPE_DECOR2) DisplayItemMessageOnField(taskId, gText_CanIHelpWithAnythingElse, ShowShopMenuAfterExitingBuyOrSellMenu); else DisplayItemMessageOnField(taskId, gText_AnythingElseICanHelp, ShowShopMenuAfterExitingBuyOrSellMenu); @@ -407,7 +409,7 @@ static void Task_ReturnToShopMenu(u8 taskId) static void ShowShopMenuAfterExitingBuyOrSellMenu(u8 taskId) { - CreateShopMenu(gMartInfo.martType); + CreateShopMenu(sMartInfo.martType); DestroyTask(taskId); } @@ -447,10 +449,10 @@ static void CB2_InitBuyMenu(void) ResetSpriteData(); ResetTasks(); ClearScheduledBgCopiesToVram(); - gShopDataPtr = AllocZeroed(sizeof(struct ShopData)); - gShopDataPtr->scrollIndicatorsTaskId = 0xFF; - gShopDataPtr->itemSpriteIds[0] = 0xFF; - gShopDataPtr->itemSpriteIds[1] = 0xFF; + sShopData = AllocZeroed(sizeof(struct ShopData)); + sShopData->scrollIndicatorsTaskId = TASK_NONE; + sShopData->itemSpriteIds[0] = SPRITE_NONE; + sShopData->itemSpriteIds[1] = SPRITE_NONE; BuyMenuBuildListMenuTemplate(); BuyMenuInitBgs(); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20); @@ -470,8 +472,8 @@ static void CB2_InitBuyMenu(void) BuyMenuAddScrollIndicatorArrows(); taskId = CreateTask(Task_BuyMenu, 8); gTasks[taskId].tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); - BlendPalettes(0xFFFFFFFF, 0x10, RGB_BLACK); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_BuyMenu); SetMainCallback2(CB2_BuyMenu); break; @@ -480,40 +482,39 @@ static void CB2_InitBuyMenu(void) static void BuyMenuFreeMemory(void) { - Free(gShopDataPtr); - Free(gUnknown_02039F74); - Free(gUnknown_02039F78); + Free(sShopData); + Free(sListMenuItems); + Free(sItemNames); FreeAllWindowBuffers(); } static void BuyMenuBuildListMenuTemplate(void) { u16 i; - u16 itemCount; - gUnknown_02039F74 = Alloc((gMartInfo.itemCount + 1) * sizeof(*gUnknown_02039F74)); - gUnknown_02039F78 = Alloc((gMartInfo.itemCount + 1) * sizeof(*gUnknown_02039F78)); - for (i = 0; i < gMartInfo.itemCount; i++) - BuyMenuSetListEntry(&gUnknown_02039F74[i], gMartInfo.itemList[i], gUnknown_02039F78[i]); + sListMenuItems = Alloc((sMartInfo.itemCount + 1) * sizeof(*sListMenuItems)); + sItemNames = Alloc((sMartInfo.itemCount + 1) * sizeof(*sItemNames)); + for (i = 0; i < sMartInfo.itemCount; i++) + BuyMenuSetListEntry(&sListMenuItems[i], sMartInfo.itemList[i], sItemNames[i]); - StringCopy(gUnknown_02039F78[i], gText_Cancel2); - gUnknown_02039F74[i].name = gUnknown_02039F78[i]; - gUnknown_02039F74[i].id = -2; + StringCopy(sItemNames[i], gText_Cancel2); + sListMenuItems[i].name = sItemNames[i]; + sListMenuItems[i].id = LIST_CANCEL; gMultiuseListMenuTemplate = sShopBuyMenuListTemplate; - gMultiuseListMenuTemplate.items = gUnknown_02039F74; - gMultiuseListMenuTemplate.totalItems = gMartInfo.itemCount + 1; + gMultiuseListMenuTemplate.items = sListMenuItems; + gMultiuseListMenuTemplate.totalItems = sMartInfo.itemCount + 1; if (gMultiuseListMenuTemplate.totalItems > 8) gMultiuseListMenuTemplate.maxShowed = 8; else gMultiuseListMenuTemplate.maxShowed = gMultiuseListMenuTemplate.totalItems; - gShopDataPtr->itemsShowed = gMultiuseListMenuTemplate.maxShowed; + sShopData->itemsShowed = gMultiuseListMenuTemplate.maxShowed; } static void BuyMenuSetListEntry(struct ListMenuItem *menuItem, u16 item, u8 *name) { - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) CopyItemName(item, name); else StringCopy(name, gDecorations[item].name); @@ -528,16 +529,16 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, s if (onInit != TRUE) PlaySE(SE_SELECT); - if (item != -2) - BuyMenuAddItemIcon(item, gShopDataPtr->iconSlot); + if (item != LIST_CANCEL) + BuyMenuAddItemIcon(item, sShopData->iconSlot); else - BuyMenuAddItemIcon(-1, gShopDataPtr->iconSlot); + BuyMenuAddItemIcon(-1, sShopData->iconSlot); - BuyMenuRemoveItemIcon(item, gShopDataPtr->iconSlot ^ 1); - gShopDataPtr->iconSlot ^= 1; - if (item != -2) + BuyMenuRemoveItemIcon(item, sShopData->iconSlot ^ 1); + sShopData->iconSlot ^= 1; + if (item != LIST_CANCEL) { - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) description = ItemId_GetDescription(item); else description = gDecorations[item].description; @@ -555,9 +556,9 @@ static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y) { u8 x; - if (item != -2) + if (item != LIST_CANCEL) { - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) { ConvertIntToDecimalStringN( gStringVar1, @@ -582,26 +583,26 @@ static void BuyMenuPrintPriceInList(u8 windowId, s32 item, u8 y) static void BuyMenuAddScrollIndicatorArrows(void) { - if (gShopDataPtr->scrollIndicatorsTaskId == 0xFF && gMartInfo.itemCount + 1 > 8) + if (sShopData->scrollIndicatorsTaskId == TASK_NONE && sMartInfo.itemCount + 1 > 8) { - gShopDataPtr->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized( + sShopData->scrollIndicatorsTaskId = AddScrollIndicatorArrowPairParameterized( SCROLL_ARROW_UP, - 0xAC, - 0xC, - 0x94, - gMartInfo.itemCount - 7, - 2100, - 2100, - &gShopDataPtr->scrollOffset); + 172, + 12, + 148, + sMartInfo.itemCount - 7, + TAG_SCROLL_ARROW, + TAG_SCROLL_ARROW, + &sShopData->scrollOffset); } } static void BuyMenuRemoveScrollIndicatorArrows(void) { - if (gShopDataPtr->scrollIndicatorsTaskId != 0xFF) + if (sShopData->scrollIndicatorsTaskId != TASK_NONE) { - RemoveScrollIndicatorArrowPair(gShopDataPtr->scrollIndicatorsTaskId); - gShopDataPtr->scrollIndicatorsTaskId = 0xFF; + RemoveScrollIndicatorArrowPair(sShopData->scrollIndicatorsTaskId); + sShopData->scrollIndicatorsTaskId = TASK_NONE; } } @@ -614,13 +615,13 @@ static void BuyMenuPrintCursor(u8 scrollIndicatorsTaskId, u8 colorSet) static void BuyMenuAddItemIcon(u16 item, u8 iconSlot) { u8 spriteId; - u8 *spriteIdPtr = &gShopDataPtr->itemSpriteIds[iconSlot]; - if (*spriteIdPtr != 0xFF) + u8 *spriteIdPtr = &sShopData->itemSpriteIds[iconSlot]; + if (*spriteIdPtr != SPRITE_NONE) return; - if (gMartInfo.martType == MART_TYPE_NORMAL || item == 0xFFFF) + if (sMartInfo.martType == MART_TYPE_NORMAL || item == 0xFFFF) { - spriteId = AddItemIconSprite(iconSlot + 2110, iconSlot + 2110, item); + spriteId = AddItemIconSprite(iconSlot + TAG_ITEM_ICON_BASE, iconSlot + TAG_ITEM_ICON_BASE, item); if (spriteId != MAX_SPRITES) { *spriteIdPtr = spriteId; @@ -630,7 +631,7 @@ static void BuyMenuAddItemIcon(u16 item, u8 iconSlot) } else { - spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + 2110, iconSlot + 2110); + spriteId = AddDecorationIconObject(item, 20, 84, 1, iconSlot + TAG_ITEM_ICON_BASE, iconSlot + TAG_ITEM_ICON_BASE); if (spriteId != MAX_SPRITES) *spriteIdPtr = spriteId; } @@ -638,23 +639,23 @@ static void BuyMenuAddItemIcon(u16 item, u8 iconSlot) static void BuyMenuRemoveItemIcon(u16 item, u8 iconSlot) { - u8 *spriteIdPtr = &gShopDataPtr->itemSpriteIds[iconSlot]; - if (*spriteIdPtr == 0xFF) + u8 *spriteIdPtr = &sShopData->itemSpriteIds[iconSlot]; + if (*spriteIdPtr == SPRITE_NONE) return; - FreeSpriteTilesByTag(iconSlot + 2110); - FreeSpritePaletteByTag(iconSlot + 2110); + FreeSpriteTilesByTag(iconSlot + TAG_ITEM_ICON_BASE); + FreeSpritePaletteByTag(iconSlot + TAG_ITEM_ICON_BASE); DestroySprite(&gSprites[*spriteIdPtr]); - *spriteIdPtr = 0xFF; + *spriteIdPtr = SPRITE_NONE; } static void BuyMenuInitBgs(void) { ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sShopBuyMenuBgTemplates, ARRAY_COUNT(sShopBuyMenuBgTemplates)); - SetBgTilemapBuffer(1, gShopDataPtr->tilemapBuffers[1]); - SetBgTilemapBuffer(2, gShopDataPtr->tilemapBuffers[3]); - SetBgTilemapBuffer(3, gShopDataPtr->tilemapBuffers[2]); + SetBgTilemapBuffer(1, sShopData->tilemapBuffers[1]); + SetBgTilemapBuffer(2, sShopData->tilemapBuffers[3]); + SetBgTilemapBuffer(3, sShopData->tilemapBuffers[2]); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); SetGpuReg(REG_OFFSET_BG1HOFS, 0); @@ -674,7 +675,7 @@ static void BuyMenuInitBgs(void) static void BuyMenuDecompressBgGraphics(void) { DecompressAndCopyTileDataToVram(1, gBuyMenuFrame_Gfx, 0x3A0, 0x3E3, 0); - LZDecompressWram(gBuyMenuFrame_Tilemap, gShopDataPtr->tilemapBuffers[0]); + LZDecompressWram(gBuyMenuFrame_Tilemap, sShopData->tilemapBuffers[0]); LoadCompressedPalette(gMenuMoneyPal, 0xC0, 0x20); } @@ -764,16 +765,16 @@ static void BuyMenuDrawMapMetatile(s16 x, s16 y, const u16 *src, u8 metatileLaye switch (metatileLayerType) { case 0: - BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[3], offset1, offset2, src); - BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[1], offset1, offset2, src + 4); + BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[3], offset1, offset2, src); + BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[1], offset1, offset2, src + 4); break; case 1: - BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[2], offset1, offset2, src); - BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[3], offset1, offset2, src + 4); + BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[2], offset1, offset2, src); + BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[3], offset1, offset2, src + 4); break; case 2: - BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[2], offset1, offset2, src); - BuyMenuDrawMapMetatileLayer(gShopDataPtr->tilemapBuffers[1], offset1, offset2, src + 4); + BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[2], offset1, offset2, src); + BuyMenuDrawMapMetatileLayer(sShopData->tilemapBuffers[1], offset1, offset2, src + 4); break; } } @@ -797,7 +798,7 @@ static void BuyMenuCollectObjectEventData(void) GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); for (y = 0; y < OBJECT_EVENTS_COUNT; y++) - gShopDataPtr->viewportObjects[y][OBJ_EVENT_ID] = OBJECT_EVENTS_COUNT; + sShopData->viewportObjects[y][OBJ_EVENT_ID] = OBJECT_EVENTS_COUNT; for (y = 0; y < 5; y++) { for (x = 0; x < 7; x++) @@ -806,25 +807,25 @@ static void BuyMenuCollectObjectEventData(void) if (objEventId != OBJECT_EVENTS_COUNT) { - gShopDataPtr->viewportObjects[r8][OBJ_EVENT_ID] = objEventId; - gShopDataPtr->viewportObjects[r8][X_COORD] = x; - gShopDataPtr->viewportObjects[r8][Y_COORD] = y; - gShopDataPtr->viewportObjects[r8][LAYER_TYPE] = MapGridGetMetatileLayerTypeAt(facingX - 4 + x, facingY - 2 + y); + sShopData->viewportObjects[r8][OBJ_EVENT_ID] = objEventId; + sShopData->viewportObjects[r8][X_COORD] = x; + sShopData->viewportObjects[r8][Y_COORD] = y; + sShopData->viewportObjects[r8][LAYER_TYPE] = MapGridGetMetatileLayerTypeAt(facingX - 4 + x, facingY - 2 + y); switch (gObjectEvents[objEventId].facingDirection) { case DIR_SOUTH: - gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 0; + sShopData->viewportObjects[r8][ANIM_NUM] = 0; break; case DIR_NORTH: - gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 1; + sShopData->viewportObjects[r8][ANIM_NUM] = 1; break; case DIR_WEST: - gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 2; + sShopData->viewportObjects[r8][ANIM_NUM] = 2; break; case DIR_EAST: default: - gShopDataPtr->viewportObjects[r8][ANIM_NUM] = 3; + sShopData->viewportObjects[r8][ANIM_NUM] = 3; break; } r8++; @@ -841,25 +842,25 @@ static void BuyMenuDrawObjectEvents(void) for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { - if (gShopDataPtr->viewportObjects[i][OBJ_EVENT_ID] == OBJECT_EVENTS_COUNT) + if (sShopData->viewportObjects[i][OBJ_EVENT_ID] == OBJECT_EVENTS_COUNT) continue; - graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[gShopDataPtr->viewportObjects[i][OBJ_EVENT_ID]].graphicsId); + graphicsInfo = GetObjectEventGraphicsInfo(gObjectEvents[sShopData->viewportObjects[i][OBJ_EVENT_ID]].graphicsId); spriteId = AddPseudoObjectEvent( - gObjectEvents[gShopDataPtr->viewportObjects[i][OBJ_EVENT_ID]].graphicsId, + gObjectEvents[sShopData->viewportObjects[i][OBJ_EVENT_ID]].graphicsId, SpriteCallbackDummy, - (u16)gShopDataPtr->viewportObjects[i][X_COORD] * 16 + 8, - (u16)gShopDataPtr->viewportObjects[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2, + (u16)sShopData->viewportObjects[i][X_COORD] * 16 + 8, + (u16)sShopData->viewportObjects[i][Y_COORD] * 16 + 48 - graphicsInfo->height / 2, 2); - if (BuyMenuCheckIfObjectEventOverlapsMenuBg(gShopDataPtr->viewportObjects[i]) == TRUE) + if (BuyMenuCheckIfObjectEventOverlapsMenuBg(sShopData->viewportObjects[i]) == TRUE) { gSprites[spriteId].subspriteTableNum = 4; gSprites[spriteId].subspriteMode = SUBSPRITES_ON; } - StartSpriteAnim(&gSprites[spriteId], gShopDataPtr->viewportObjects[i][ANIM_NUM]); + StartSpriteAnim(&gSprites[spriteId], sShopData->viewportObjects[i][ANIM_NUM]); } } @@ -878,8 +879,8 @@ static bool8 BuyMenuCheckIfObjectEventOverlapsMenuBg(s16 *object) static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void) { s16 i; - u16 *dest = gShopDataPtr->tilemapBuffers[1]; - const u16 *src = gShopDataPtr->tilemapBuffers[0]; + u16 *dest = sShopData->tilemapBuffers[1]; + const u16 *src = sShopData->tilemapBuffers[0]; for (i = 0; i < 1024; i++) { @@ -892,7 +893,7 @@ static void BuyMenuCopyMenuBgToBg1TilemapBuffer(void) static bool8 BuyMenuCheckForOverlapWithMenuBg(int x, int y) { - const u16 *metatile = gShopDataPtr->tilemapBuffers[0]; + const u16 *metatile = sShopData->tilemapBuffers[0]; int offset1 = x * 2; int offset2 = y * 64; @@ -914,7 +915,7 @@ static void Task_BuyMenu(u8 taskId) if (!gPaletteFade.active) { s32 itemId = ListMenu_ProcessInput(tListTaskId); - ListMenuGetScrollAndRow(tListTaskId, &gShopDataPtr->scrollOffset, &gShopDataPtr->selectedRow); + ListMenuGetScrollAndRow(tListTaskId, &sShopData->scrollOffset, &sShopData->selectedRow); switch (itemId) { @@ -931,22 +932,22 @@ static void Task_BuyMenu(u8 taskId) BuyMenuRemoveScrollIndicatorArrows(); BuyMenuPrintCursor(tListTaskId, 2); - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) { - gShopDataPtr->totalCost = (ItemId_GetPrice(itemId) >> GetPriceReduction(POKENEWS_SLATEPORT)); + sShopData->totalCost = (ItemId_GetPrice(itemId) >> GetPriceReduction(POKENEWS_SLATEPORT)); } else { - gShopDataPtr->totalCost = gDecorations[itemId].price; + sShopData->totalCost = gDecorations[itemId].price; } - if (!IsEnoughMoney(&gSaveBlock1Ptr->money, gShopDataPtr->totalCost)) + if (!IsEnoughMoney(&gSaveBlock1Ptr->money, sShopData->totalCost)) { BuyMenuDisplayMessage(taskId, gText_YouDontHaveMoney, BuyMenuReturnToItemList); } else { - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) { CopyItemName(itemId, gStringVar1); if (ItemId_GetPocket(itemId) == POCKET_TM_HM) @@ -962,12 +963,13 @@ static void Task_BuyMenu(u8 taskId) else { StringCopy(gStringVar1, gDecorations[itemId].name); - ConvertIntToDecimalStringN(gStringVar2, gShopDataPtr->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + ConvertIntToDecimalStringN(gStringVar2, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); - if (gMartInfo.martType == MART_TYPE_DECOR) + if (sMartInfo.martType == MART_TYPE_DECOR) StringExpandPlaceholders(gStringVar4, gText_Var1IsItThatllBeVar2); - else + else // MART_TYPE_DECOR2 StringExpandPlaceholders(gStringVar4, gText_YouWantedVar1ThatllBeVar2); + BuyMenuDisplayMessage(taskId, gStringVar4, BuyMenuConfirmPurchase); } } @@ -992,15 +994,15 @@ static void Task_BuyHowManyDialogueInit(u8 taskId) BuyMenuPrintItemQuantityAndPrice(taskId); ScheduleBgCopyTilemapToVram(0); - maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / gShopDataPtr->totalCost; + maxQuantity = GetMoney(&gSaveBlock1Ptr->money) / sShopData->totalCost; if (maxQuantity > MAX_BAG_ITEM_CAPACITY) { - gShopDataPtr->maxQuantity = MAX_BAG_ITEM_CAPACITY; + sShopData->maxQuantity = MAX_BAG_ITEM_CAPACITY; } else { - gShopDataPtr->maxQuantity = maxQuantity; + sShopData->maxQuantity = maxQuantity; } gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; @@ -1010,9 +1012,9 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) { s16 *data = gTasks[taskId].data; - if (AdjustQuantityAccordingToDPadInput(&tItemCount, gShopDataPtr->maxQuantity) == TRUE) + if (AdjustQuantityAccordingToDPadInput(&tItemCount, sShopData->maxQuantity) == TRUE) { - gShopDataPtr->totalCost = (ItemId_GetPrice(tItemId) >> GetPriceReduction(POKENEWS_SLATEPORT)) * tItemCount; + sShopData->totalCost = (ItemId_GetPrice(tItemId) >> GetPriceReduction(POKENEWS_SLATEPORT)) * tItemCount; BuyMenuPrintItemQuantityAndPrice(taskId); } else @@ -1027,7 +1029,7 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) PutWindowTilemap(1); CopyItemName(tItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, tItemCount, STR_CONV_MODE_LEFT_ALIGN, BAG_ITEM_CAPACITY_DIGITS); - ConvertIntToDecimalStringN(gStringVar3, gShopDataPtr->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); + ConvertIntToDecimalStringN(gStringVar3, sShopData->totalCost, STR_CONV_MODE_LEFT_ALIGN, 6); BuyMenuDisplayMessage(taskId, gText_Var1AndYouWantedVar2, BuyMenuConfirmPurchase); } else if (JOY_NEW(B_BUTTON)) @@ -1053,7 +1055,7 @@ static void BuyMenuTryMakePurchase(u8 taskId) PutWindowTilemap(1); - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) { if (AddBagItem(tItemId, tItemCount) == TRUE) { @@ -1069,14 +1071,10 @@ static void BuyMenuTryMakePurchase(u8 taskId) { if (DecorationAdd(tItemId)) { - if (gMartInfo.martType == MART_TYPE_DECOR) - { + if (sMartInfo.martType == MART_TYPE_DECOR) BuyMenuDisplayMessage(taskId, gText_ThankYouIllSendItHome, BuyMenuSubtractMoney); - } - else - { + else // MART_TYPE_DECOR2 BuyMenuDisplayMessage(taskId, gText_ThanksIllSendItHome, BuyMenuSubtractMoney); - } } else { @@ -1088,11 +1086,11 @@ static void BuyMenuTryMakePurchase(u8 taskId) static void BuyMenuSubtractMoney(u8 taskId) { IncrementGameStat(GAME_STAT_SHOPPED); - RemoveMoney(&gSaveBlock1Ptr->money, gShopDataPtr->totalCost); + RemoveMoney(&gSaveBlock1Ptr->money, sShopData->totalCost); PlaySE(SE_SHOP); PrintMoneyAmountInMoneyBox(0, GetMoney(&gSaveBlock1Ptr->money), 0); - if (gMartInfo.martType == MART_TYPE_NORMAL) + if (sMartInfo.martType == MART_TYPE_NORMAL) { gTasks[taskId].func = Task_ReturnToItemListAfterItemPurchase; } @@ -1147,7 +1145,7 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) s16 *data = gTasks[taskId].data; FillWindowPixelBuffer(4, PIXEL_FILL(1)); - PrintMoneyAmount(4, 38, 1, gShopDataPtr->totalCost, TEXT_SPEED_FF); + PrintMoneyAmount(4, 38, 1, sShopData->totalCost, TEXT_SPEED_FF); ConvertIntToDecimalStringN(gStringVar1, tItemCount, STR_CONV_MODE_LEADING_ZEROS, BAG_ITEM_CAPACITY_DIGITS); StringExpandPlaceholders(gStringVar4, gText_xVar1); BuyMenuPrint(4, gStringVar4, 0, 1, 0, 0); @@ -1156,7 +1154,7 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) static void ExitBuyMenu(u8 taskId) { gFieldCallback = MapPostLoadHook_ReturnToShopMenu; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ExitBuyMenu; } @@ -1173,7 +1171,7 @@ static void Task_ExitBuyMenu(u8 taskId) static void ClearItemPurchases(void) { - gMartPurchaseHistoryId = 0; + sPurchaseHistoryId = 0; memset(gMartPurchaseHistory, 0, sizeof(gMartPurchaseHistory)); } @@ -1183,27 +1181,23 @@ static void RecordItemPurchase(u8 taskId) u16 i; - for (i = 0; i < 3; i++) + for (i = 0; i < ARRAY_COUNT(gMartPurchaseHistory); i++) { if (gMartPurchaseHistory[i].itemId == tItemId && gMartPurchaseHistory[i].quantity != 0) { if (gMartPurchaseHistory[i].quantity + tItemCount > 255) - { gMartPurchaseHistory[i].quantity = 255; - } else - { gMartPurchaseHistory[i].quantity += tItemCount; - } return; } } - if (gMartPurchaseHistoryId < 3) + if (sPurchaseHistoryId < ARRAY_COUNT(gMartPurchaseHistory)) { - gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = tItemId; - gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = tItemCount; - gMartPurchaseHistoryId++; + gMartPurchaseHistory[sPurchaseHistoryId].itemId = tItemId; + gMartPurchaseHistory[sPurchaseHistoryId].quantity = tItemCount; + sPurchaseHistoryId++; } } diff --git a/src/siirtc.c b/src/siirtc.c index 5c153a841..01d2e0e72 100644 --- a/src/siirtc.c +++ b/src/siirtc.c @@ -417,6 +417,9 @@ static u8 ReadData() u8 i; u8 temp; u8 value; + #ifdef UBFIX + value = 0; + #endif for (i = 0; i < 8; i++) { @@ -428,7 +431,7 @@ static u8 ReadData() GPIO_PORT_DATA = SCK_HI | CS_HI; temp = ((GPIO_PORT_DATA & SIO_HI) >> 1); - value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var + value = (value >> 1) | (temp << 7); // UB: value is uninitialized on first iteration } return value; diff --git a/src/slot_machine.c b/src/slot_machine.c index 7cfd7d22e..9a3a9ee06 100644 --- a/src/slot_machine.c +++ b/src/slot_machine.c @@ -682,7 +682,7 @@ static const struct WindowTemplate sWindowTemplate_InfoBox = .baseBlock = 1 }; -static const u8 sColors_ReeltimeHelp[] = {TEXT_COLOR_LIGHT_GREY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY}; +static const u8 sColors_ReeltimeHelp[] = {TEXT_COLOR_LIGHT_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY}; static bool8 (*const sSlotActions[])(struct Task *task) = { @@ -876,7 +876,7 @@ static void Task_FadeToSlotMachine(u8 taskId) switch (gTasks[taskId].tState) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].tState++; break; case 1: @@ -1149,7 +1149,7 @@ static void Task_SlotMachine(u8 taskId) // SLOT_ACTION_UNFADE static bool8 SlotAction_UnfadeScreen(struct Task *task) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0)); LoadPikaPowerMeter(sSlotMachine->pikaPower); sSlotMachine->state++; // SLOT_ACTION_WAIT_FADE return FALSE; @@ -1592,8 +1592,8 @@ static bool8 SlotAction_WaitMsg_NoMoreCoins(struct Task *task) static bool8 SlotAction_EndGame(struct Task *task) { SetCoins(sSlotMachine->coins); - AlertTVOfNewCoinTotal(GetCoins()); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); + TryPutFindThatGamerOnAir(GetCoins()); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); sSlotMachine->state++; // SLOT_ACTION_FREE return FALSE; } @@ -3409,7 +3409,7 @@ static void OpenInfoBox(u8 digDisplayId) static bool8 IsInfoBoxClosed(void) { - if (FindTaskIdByFunc(RunInfoBoxActions) == 0xFF) + if (FindTaskIdByFunc(RunInfoBoxActions) == TASK_NONE) return TRUE; else return FALSE; @@ -3422,7 +3422,7 @@ static void RunInfoBoxActions(u8 taskId) static void InfoBox_FadeIn(struct Task *task) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); task->tState++; } @@ -3446,7 +3446,7 @@ static void InfoBox_AddText(struct Task *task) { AddTextPrinterParameterized3(1, 1, 2, 5, sColors_ReeltimeHelp, 0, gText_ReelTimeHelp); CopyWindowToVram(1, 3); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0)); task->tState++; } @@ -3458,7 +3458,7 @@ static void InfoBox_AwaitPlayerInput(struct Task *task) ClearWindowTilemap(1); CopyWindowToVram(1, 1); RemoveWindow(1); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB(0, 0, 0)); task->tState++; } } @@ -3479,7 +3479,7 @@ static void InfoBox_CreateDigitalDisplay(struct Task *task) static void InfoBox_LoadPikaPowerMeter(struct Task *task) { LoadPikaPowerMeter(sSlotMachine->pikaPower); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0)); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB(0, 0, 0)); task->tState++; } diff --git a/src/sound.c b/src/sound.c index ee1753bb3..42f507b7c 100644 --- a/src/sound.c +++ b/src/sound.c @@ -41,24 +41,24 @@ static void Task_DuckBGMForPokemonCry(u8 taskId); static void RestoreBGMVolumeAfterPokemonCry(void); static const struct Fanfare sFanfares[] = { - { MUS_LEVEL_UP, 80 }, - { MUS_OBTAIN_ITEM, 160 }, - { MUS_EVOLVED, 220 }, - { MUS_OBTAIN_TMHM, 220 }, - { MUS_HEAL, 160 }, - { MUS_OBTAIN_BADGE, 340 }, - { MUS_MOVE_DELETED, 180 }, - { MUS_OBTAIN_BERRY, 120 }, - { MUS_AWAKEN_LEGEND, 710 }, - { MUS_SLOTS_JACKPOT, 250 }, - { MUS_SLOTS_WIN, 150 }, - { MUS_TOO_BAD, 160 }, - { MUS_RG_POKE_FLUTE, 450 }, - { MUS_RG_OBTAIN_KEY_ITEM, 170 }, - { MUS_RG_DEX_RATING, 196 }, - { MUS_OBTAIN_B_POINTS, 313 }, - { MUS_OBTAIN_SYMBOL, 318 }, - { MUS_REGISTER_MATCH_CALL, 135 }, + [FANFARE_LEVEL_UP] = { MUS_LEVEL_UP, 80 }, + [FANFARE_OBTAIN_ITEM] = { MUS_OBTAIN_ITEM, 160 }, + [FANFARE_EVOLVED] = { MUS_EVOLVED, 220 }, + [FANFARE_OBTAIN_TMHM] = { MUS_OBTAIN_TMHM, 220 }, + [FANFARE_HEAL] = { MUS_HEAL, 160 }, + [FANFARE_OBTAIN_BADGE] = { MUS_OBTAIN_BADGE, 340 }, + [FANFARE_MOVE_DELETED] = { MUS_MOVE_DELETED, 180 }, + [FANFARE_OBTAIN_BERRY] = { MUS_OBTAIN_BERRY, 120 }, + [FANFARE_AWAKEN_LEGEND] = { MUS_AWAKEN_LEGEND, 710 }, + [FANFARE_SLOTS_JACKPOT] = { MUS_SLOTS_JACKPOT, 250 }, + [FANFARE_SLOTS_WIN] = { MUS_SLOTS_WIN, 150 }, + [FANFARE_TOO_BAD] = { MUS_TOO_BAD, 160 }, + [FANFARE_RG_POKE_FLUTE] = { MUS_RG_POKE_FLUTE, 450 }, + [FANFARE_RG_OBTAIN_KEY_ITEM] = { MUS_RG_OBTAIN_KEY_ITEM, 170 }, + [FANFARE_RG_DEX_RATING] = { MUS_RG_DEX_RATING, 196 }, + [FANFARE_OBTAIN_B_POINTS] = { MUS_OBTAIN_B_POINTS, 313 }, + [FANFARE_OBTAIN_SYMBOL] = { MUS_OBTAIN_SYMBOL, 318 }, + [FANFARE_REGISTER_MATCH_CALL] = { MUS_REGISTER_MATCH_CALL, 135 }, }; #define CRY_VOLUME 120 // was 125 in R/S @@ -212,6 +212,7 @@ bool8 WaitFanfare(bool8 stop) } } +// Unused void StopFanfareByFanfareNum(u8 fanfareNum) { m4aSongNumStop(sFanfares[fanfareNum].songNum); @@ -220,7 +221,7 @@ void StopFanfareByFanfareNum(u8 fanfareNum) void PlayFanfare(u16 songNum) { s32 i; - for (i = 0; (u32)i < 18; i++) + for (i = 0; (u32)i < ARRAY_COUNT(sFanfares); i++) { if (sFanfares[i].songNum == songNum) { @@ -230,6 +231,8 @@ void PlayFanfare(u16 songNum) } } + // songNum is not in sFanfares + // Play first fanfare in table instead PlayFanfareByFanfareNum(0); CreateFanfareTask(); } diff --git a/src/start_menu.c b/src/start_menu.c index 35eb53475..3fcb5aa7b 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -138,7 +138,7 @@ static bool8 FieldCB_ReturnToFieldStartMenu(void); static const struct WindowTemplate sSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8}; -static const u8* const sPyramindFloorNames[] = +static const u8* const sPyramidFloorNames[] = { gText_Floor1, gText_Floor2, @@ -170,7 +170,7 @@ static const struct MenuAction sStartMenuItems[] = {gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}} }; -static const struct BgTemplate sUnknown_085105A8[] = +static const struct BgTemplate sBgTemplates_LinkBattleSave[] = { { .bg = 0, @@ -183,13 +183,29 @@ static const struct BgTemplate sUnknown_085105A8[] = } }; -static const struct WindowTemplate sUnknown_085105AC[] = +static const struct WindowTemplate sWindowTemplates_LinkBattleSave[] = { - {0, 2, 0xF, 0x1A, 4, 0xF, 0x194}, + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 15, + .width = 26, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x194 + }, DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate sSaveInfoWindowTemplate = {0, 1, 1, 0xE, 0xA, 0xF, 8}; +static const struct WindowTemplate sSaveInfoWindowTemplate = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 14, + .height = 10, + .paletteNum = 15, + .baseBlock = 8 +}; // Local functions static void BuildStartMenuActions(void); @@ -211,13 +227,13 @@ static void CreateStartMenuTask(TaskFunc followupFunc); static void InitSave(void); static u8 RunSaveCallback(void); static void ShowSaveMessage(const u8 *message, u8 (*saveCallback)(void)); -static void sub_80A0014(void); +static void HideSaveMessageWindow(void); static void HideSaveInfoWindow(void); static void SaveStartTimer(void); static bool8 SaveSuccesTimer(void); static bool8 SaveErrorTimer(void); static void InitBattlePyramidRetire(void); -static void sub_80A03D8(void); +static void VBlankCB_LinkBattleSave(void); static bool32 InitSaveWindowAfterLinkBattle(u8 *par1); static void CB2_SaveAfterLinkBattle(void); static void ShowSaveInfoWindow(void); @@ -383,7 +399,7 @@ static void ShowPyramidFloorWindow(void) PutWindowTilemap(sBattlePyramidFloorWindowId); DrawStdWindowFrame(sBattlePyramidFloorWindowId, FALSE); - StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->frontier.curChallengeBattleNum]); + StringCopy(gStringVar1, sPyramidFloorNames[gSaveBlock2Ptr->frontier.curChallengeBattleNum]); StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor); AddTextPrinterParameterized(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL); CopyWindowToVram(sBattlePyramidFloorWindowId, 2); @@ -541,7 +557,7 @@ void ShowStartMenu(void) if (!IsUpdateLinkStateCBActive()) { FreezeObjectEvents(); - sub_808B864(); + PlayerFreeze(); sub_808BCF4(); } CreateStartMenuTask(Task_ShowStartMenu); @@ -834,7 +850,7 @@ static bool8 BattlePyramidRetireCallback(void) static void InitSave(void) { - save_serialize_map(); + SaveMapView(); sSaveDialogCallback = SaveConfirmSaveCallback; sSavingComplete = FALSE; } @@ -887,7 +903,7 @@ static void SaveGameTask(u8 taskId) EnableBothScriptContexts(); } -static void sub_80A0014(void) +static void HideSaveMessageWindow(void) { ClearDialogWindowAndFrame(0, TRUE); } @@ -982,7 +998,7 @@ static u8 SaveConfirmInputCallback(void) case -1: // B Button case 1: // No HideSaveInfoWindow(); - sub_80A0014(); + HideSaveMessageWindow(); return SAVE_CANCELED; } @@ -1028,7 +1044,7 @@ static u8 SaveOverwriteInputCallback(void) case -1: // B Button case 1: // No HideSaveInfoWindow(); - sub_80A0014(); + HideSaveMessageWindow(); return SAVE_CANCELED; } @@ -1146,14 +1162,14 @@ static u8 BattlePyramidRetireInputCallback(void) return SAVE_CANCELED; case -1: // B Button case 1: // No - sub_80A0014(); + HideSaveMessageWindow(); return SAVE_SUCCESS; } return SAVE_IN_PROGRESS; } -static void sub_80A03D8(void) +static void VBlankCB_LinkBattleSave(void) { TransferPlttBuffer(); } @@ -1167,7 +1183,7 @@ static bool32 InitSaveWindowAfterLinkBattle(u8 *state) SetVBlankCallback(NULL); ScanlineEffect_Stop(); DmaClear16(3, PLTT, PLTT_SIZE); - DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + DmaFillLarge16(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000); break; case 1: ResetSpriteData(); @@ -1177,15 +1193,15 @@ static bool32 InitSaveWindowAfterLinkBattle(u8 *state) break; case 2: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, sUnknown_085105A8, ARRAY_COUNT(sUnknown_085105A8)); - InitWindows(sUnknown_085105AC); + InitBgsFromTemplates(0, sBgTemplates_LinkBattleSave, ARRAY_COUNT(sBgTemplates_LinkBattleSave)); + InitWindows(sWindowTemplates_LinkBattleSave); LoadUserWindowBorderGfx_(0, 8, 224); Menu_LoadStdPalAt(240); break; case 3: ShowBg(0); BlendPalettes(-1, 16, 0); - SetVBlankCallback(sub_80A03D8); + SetVBlankCallback(VBlankCB_LinkBattleSave); EnableInterrupts(1); break; case 4: @@ -1226,13 +1242,13 @@ static void Task_SaveAfterLinkBattle(u8 taskId) gText_SavingDontTurnOffPower, TEXT_SPEED_FF, NULL, - TEXT_COLOR_DARK_GREY, + TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, - TEXT_COLOR_LIGHT_GREY); + TEXT_COLOR_LIGHT_GRAY); DrawTextBorderOuter(0, 8, 14); PutWindowTilemap(0); CopyWindowToVram(0, 3); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); if (gWirelessCommType != 0 && InUnionRoom()) { @@ -1265,7 +1281,7 @@ static void Task_SaveAfterLinkBattle(u8 taskId) } break; case 3: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); *state = 4; break; case 4: diff --git a/src/starter_choose.c b/src/starter_choose.c index 771db961e..92cb2d48c 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -153,11 +153,11 @@ static const struct BgTemplate sBgTemplates[3] = }, }; -static const u8 sTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GREY}; +static const u8 sTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY}; static const struct OamData sOam_Hand = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -174,7 +174,7 @@ static const struct OamData sOam_Hand = static const struct OamData sOam_Pokeball = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -191,7 +191,7 @@ static const struct OamData sOam_Pokeball = static const struct OamData sOam_StarterCircle = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -378,7 +378,6 @@ static void VblankCB_StarterChoose(void) void CB2_ChooseStarter(void) { - u16 savedIme; u8 taskId; u8 spriteId; @@ -426,7 +425,7 @@ void CB2_ChooseStarter(void) LoadCompressedSpriteSheet(&sSpriteSheet_PokeballSelect[0]); LoadCompressedSpriteSheet(&sSpriteSheet_StarterCircle[0]); LoadSpritePalettes(sSpritePalettes_StarterChoose); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0x10, 0, RGB_BLACK); EnableInterrupts(DISPSTAT_VBLANK); SetVBlankCallback(VblankCB_StarterChoose); @@ -465,7 +464,7 @@ void CB2_ChooseStarter(void) gSprites[spriteId].sTaskId = taskId; gSprites[spriteId].sBallId = 2; - sStarterLabelWindowId = 0xFF; + sStarterLabelWindowId = WINDOW_NONE; } static void CB2_StarterChoose(void) @@ -614,7 +613,7 @@ static void ClearStarterLabel(void) FillWindowPixelBuffer(sStarterLabelWindowId, PIXEL_FILL(0)); ClearWindowTilemap(sStarterLabelWindowId); RemoveWindow(sStarterLabelWindowId); - sStarterLabelWindowId = 0xFF; + sStarterLabelWindowId = WINDOW_NONE; SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); ScheduleBgCopyTilemapToVram(0); diff --git a/src/strings.c b/src/strings.c index fe5051d71..18cf31fb7 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1,5 +1,6 @@ #include "global.h" #include "strings.h" +#include "battle_pyramid_bag.h" ALIGNED(4) const u8 gText_ExpandedPlaceholder_Empty[] = _(""); @@ -252,7 +253,7 @@ const u8 gText_ThePokemonList[] = _("the POKéMON LIST"); const u8 gText_TheShop[] = _("the shop"); const u8 gText_ThePC[] = _("the PC"); -const u8 *const gReturnToXStringsTable[] = +const u8 *const gBagMenu_ReturnToStrings[] = { gText_TheField, gText_TheBattle, @@ -268,12 +269,12 @@ const u8 *const gReturnToXStringsTable[] = gText_ThePC }; -const u8 *const gReturnToXStringsTable2[] = +const u8 *const gPyramidBagMenu_ReturnToStrings[] = { - gText_TheField, - gText_TheBattle, - gText_ThePokemonList, - gText_TheField + [PYRAMIDBAG_LOC_FIELD] = gText_TheField, + [PYRAMIDBAG_LOC_BATTLE] = gText_TheBattle, + [PYRAMIDBAG_LOC_PARTY] = gText_ThePokemonList, + [PYRAMIDBAG_LOC_CHOOSE_TOSS] = gText_TheField }; const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}."); @@ -981,8 +982,8 @@ const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAI const u8 gText_InParty[] = _("IN PARTY"); const u8 gText_Number2[] = _("No. "); const u8 gText_Ribbons[] = _("RIBBONS"); // Unused -const u8 gText_PokemonMaleLv[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{DYNAMIC 1}"); // Unused -const u8 gText_PokemonFemaleLv[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{DYNAMIC 1}"); // Unused +const u8 gText_PokemonMaleLv[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}"); // Unused +const u8 gText_PokemonFemaleLv[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}"); // Unused const u8 gText_PokemonNoGenderLv[] = _("{DYNAMIC 0}/{LV}{DYNAMIC 1}"); // Unused const u8 gText_Unknown[] = _("UNKNOWN"); const u8 gText_Call[] = _("CALL"); @@ -990,8 +991,8 @@ const u8 gText_Check[] = _("CHECK"); const u8 gText_Cancel6[] = _("CANCEL"); const u8 gText_NumberF700[] = _("No. {DYNAMIC 0}"); const u8 gText_RibbonsF700[] = _("RIBBONS {DYNAMIC 0}"); -const u8 gText_PokemonMaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused -const u8 gText_PokemonFemaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused +const u8 gText_PokemonMaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused +const u8 gText_PokemonFemaleLv2[] = _("{DYNAMIC 0}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GRAY WHITE LIGHT_GRAY}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused const u8 gText_PokemonNoGenderLv2[] = _("{DYNAMIC 0}/{LV}{DYNAMIC 1}{DYNAMIC 2}"); // Unused const u8 gText_CombineFourWordsOrPhrases[] = _("Combine four words or phrases"); const u8 gText_AndMakeYourProfile[] = _("and make your profile."); @@ -1200,18 +1201,18 @@ const u8 gText_Var1sTrainerCard[] = _("{STR_VAR_1}'s TRAINER CARD"); const u8 gText_HallOfFameDebut[] = _("HALL OF FAME DEBUT "); const u8 gText_LinkBattles[] = _("LINK BATTLES"); const u8 gText_LinkCableBattles[] = _("LINK CABLE BATTLES"); -const u8 gText_WinsLosses[] = _("W:{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} L:{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}"); +const u8 gText_WinsLosses[] = _("W:{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY} L:{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}"); const u8 gText_PokemonTrades[] = _("POKéMON TRADES"); const u8 gText_UnionTradesAndBattles[] = _("UNION TRADES & BATTLES"); const u8 gText_BerryCrush[] = _("BERRY CRUSH"); const u8 gText_WaitingTrainerFinishReading[] = _("Waiting for the other TRAINER to\nfinish reading your TRAINER CARD."); const u8 gText_PokeblocksWithFriends[] = _("{POKEBLOCK}S W/FRIENDS"); -const u8 gText_NumPokeblocks[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}"); +const u8 gText_NumPokeblocks[] = _("{STR_VAR_1}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}"); const u8 gText_WonContestsWFriends[] = _("WON CONTESTS W/FRIENDS"); const u8 gText_BattlePtsWon[] = _("BATTLE POINTS WON"); -const u8 gText_NumBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP"); +const u8 gText_NumBP[] = _("{STR_VAR_1}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}BP"); const u8 gText_BattleTower[] = _("BATTLE TOWER"); -const u8 gText_WinsStraight[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}"); +const u8 gText_WinsStraight[] = _("W/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_1}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY} STRAIGHT/{COLOR RED}{SHADOW LIGHT_RED}{STR_VAR_2}"); const u8 gText_BattleTower2[] = _("BATTLE TOWER"); const u8 gText_BattleDome[] = _("BATTLE DOME"); const u8 gText_BattlePalace[] = _("BATTLE PALACE"); @@ -1228,7 +1229,7 @@ ALIGNED(4) const u8 gText_Facility[] = _("{STR_VAR_1}"); const u8 gText_Give[] = _("Give"); const u8 gText_NoNeed[] = _("No need"); -const u8 gText_ColorLightShadowDarkGrey[] = _("{COLOR LIGHT_GREY}{SHADOW DARK_GREY}"); +const u8 gText_ColorLightShadowDarkGrey[] = _("{COLOR LIGHT_GRAY}{SHADOW DARK_GRAY}"); const u8 gText_ColorBlue[] = _("{COLOR BLUE}"); const u8 gText_ColorTransparent[] = _("{HIGHLIGHT TRANSPARENT}{COLOR TRANSPARENT}"); const u8 gText_CDot[] = _("C."); @@ -1238,9 +1239,9 @@ const u8 gText_PreliminaryResults[] = _("The preliminary results!"); const u8 gText_Round2Results[] = _("Round 2 results!"); const u8 gText_ContestantsMonWon[] = _("{STR_VAR_1}'s {STR_VAR_2} won!"); const u8 gText_CommunicationStandby[] = _("Communication standby…"); -const u8 gText_ColorDarkGrey[] = _("{COLOR DARK_GREY}"); +const u8 gText_ColorDarkGrey[] = _("{COLOR DARK_GRAY}"); const u8 gText_ColorDynamic6WhiteDynamic5[] = _("{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR6 WHITE DYNAMIC_COLOR5}"); // Unused -const u8 gText_HighlightDarkGrey[] = _("{HIGHLIGHT DARK_GREY}"); +const u8 gText_HighlightDarkGrey[] = _("{HIGHLIGHT DARK_GRAY}"); const u8 gText_EmptySpace2[] = _(" "); // Unused const u8 gText_DynColor2Male[] = _("{COLOR DYNAMIC_COLOR2}♂"); const u8 gText_DynColor1Female[] = _("{COLOR DYNAMIC_COLOR1}♀"); @@ -1292,7 +1293,7 @@ const u8 gText_MatchCallMay_Intro1[] = _("My POKéMON and I help"); const u8 gText_MatchCallMay_Intro2[] = _("my father's research."); const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!"); const u8 gText_NicknameHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?"); -ALIGNED(4) const u8 gText_ReadyToBerryCrush[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); +ALIGNED(4) const u8 gText_ReadyPickBerry[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); ALIGNED(4) const u8 gText_WaitForAllChooseBerry[] = _("Please wait while each member\nchooses a BERRY."); ALIGNED(4) const u8 gText_EndedWithXUnitsPowder[] = _("{PAUSE_MUSIC}{PLAY_BGM MUS_LEVEL_UP}You ended up with {STR_VAR_1} units of\nsilky-smooth BERRY POWDER.{RESUME_MUSIC}\pYour total amount of BERRY POWDER\nis {STR_VAR_2}.\p"); ALIGNED(4) const u8 gText_RecordingGameResults[] = _("Recording your game results in the\nsave file.\lPlease wait."); @@ -1535,7 +1536,7 @@ const u8 gJPText_Player[] = _("プレイヤー"); // Unused const u8 gJPText_Sama[] = _("さま"); // Unused const u8 gText_DexHoenn[] = _("HOENN"); const u8 gText_DexNational[] = _("NATIONAL"); -const u8 gText_PokedexDiploma[] = _("PLAYER: {CLEAR 0x10}{COLOR RED}{SHADOW LIGHT_RED}{PLAYER}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}\n\nThis document certifies\nthat you have successfully\ncompleted your\n{STR_VAR_1} POKéDEX.\n\n{CLEAR_TO 0x42}{COLOR RED}{SHADOW LIGHT_RED}GAME FREAK"); +const u8 gText_PokedexDiploma[] = _("PLAYER: {CLEAR 0x10}{COLOR RED}{SHADOW LIGHT_RED}{PLAYER}{COLOR DARK_GRAY}{SHADOW LIGHT_GRAY}\n\nThis document certifies\nthat you have successfully\ncompleted your\n{STR_VAR_1} POKéDEX.\n\n{CLEAR_TO 0x42}{COLOR RED}{SHADOW LIGHT_RED}GAME FREAK"); const u8 gJPText_GameFreak[] = _("{COLOR RED}{SHADOW LIGHT_RED}ゲ-ムフリ-ク"); // Unused const u8 gText_DiplomaEmpty[] = _("{COLOR RED}{SHADOW LIGHT_RED}"); // Unused const u8 gText_Hoenn[] = _("HOENN"); diff --git a/src/task.c b/src/task.c index a97496009..68fb679b3 100644 --- a/src/task.c +++ b/src/task.c @@ -136,32 +136,20 @@ void TaskDummy(u8 taskId) { } -#define TASK_DATA_OP(taskId, offset, op) \ -{ \ - u32 tasksAddr = (u32)gTasks; \ - u32 addr = taskId * sizeof(struct Task) + offset; \ - u32 dataAddr = tasksAddr + offsetof(struct Task, data); \ - addr += dataAddr; \ - op; \ -} - void SetTaskFuncWithFollowupFunc(u8 taskId, TaskFunc func, TaskFunc followupFunc) { - TASK_DATA_OP(taskId, 28, *((u16 *)addr) = (u32)followupFunc) - TASK_DATA_OP(taskId, 30, *((u16 *)addr) = (u32)followupFunc >> 16) + u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const. + + gTasks[taskId].data[followupFuncIndex] = (s16)((u32)followupFunc); + gTasks[taskId].data[followupFuncIndex + 1] = (s16)((u32)followupFunc >> 16); // Store followupFunc as two half-words in the data array. gTasks[taskId].func = func; } void SwitchTaskToFollowupFunc(u8 taskId) { - s32 func; - - gTasks[taskId].func = NULL; - - TASK_DATA_OP(taskId, 28, func = *((u16 *)addr)) - TASK_DATA_OP(taskId, 30, func |= *((s16 *)addr) << 16) + u8 followupFuncIndex = NUM_TASK_DATA - 2; // Should be const. - gTasks[taskId].func = (TaskFunc)func; + gTasks[taskId].func = (TaskFunc)((u16)(gTasks[taskId].data[followupFuncIndex]) | (gTasks[taskId].data[followupFuncIndex + 1] << 16)); } bool8 FuncIsActiveTask(TaskFunc func) @@ -183,7 +171,7 @@ u8 FindTaskIdByFunc(TaskFunc func) if (gTasks[i].isActive == TRUE && gTasks[i].func == func) return (u8)i; - return 0xFF; + return TASK_NONE; // No task was found. } u8 GetTaskCount(void) diff --git a/src/tileset_anims.c b/src/tileset_anims.c index 087b75b7c..f566fe3e0 100644 --- a/src/tileset_anims.c +++ b/src/tileset_anims.c @@ -1169,7 +1169,7 @@ static void BlendAnimPalette_BattleDome_FloorLights(u16 timer) { CpuCopy16(gTilesetAnims_BattleDomeFloorLightPals[timer % 4], gPlttBufferUnfaded + 0x80, 32); BlendPalette(0x80, 16, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF); - if ((u8)FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) != 0xFF ) + if ((u8)FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) != TASK_NONE) { sSecondaryTilesetAnimCallback = TilesetAnim_BattleDome2; sSecondaryTilesetAnimCounterMax = 32; @@ -1179,7 +1179,7 @@ static void BlendAnimPalette_BattleDome_FloorLights(u16 timer) static void BlendAnimPalette_BattleDome_FloorLightsNoBlend(u16 timer) { CpuCopy16(gTilesetAnims_BattleDomeFloorLightPals[timer % 4], gPlttBufferUnfaded + 0x80, 32); - if ((u8)FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == 0xFF ) + if ((u8)FindTaskIdByFunc(TransitionPhase1_Task_RunFuncs) == TASK_NONE) { BlendPalette(0x80, 16, gPaletteFade.y, gPaletteFade.blendColor & 0x7FFF); if (!--sSecondaryTilesetAnimCounterMax) diff --git a/src/title_screen.c b/src/title_screen.c index 1d6f90d74..cf356cefa 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -64,7 +64,9 @@ static const u32 sTitleScreenCloudsGfx[] = INCBIN_U32("graphics/title_screen/clo -const u16 gIntroWaterDropAlphaBlend[] = +// Used to blend "Emerald Version" as it passes over over the Pokémon banner. +// Also used by the intro to blend the Game Freak name/logo in and out as they appear and disappear +const u16 gTitleScreenAlphaBlend[64] = { BLDALPHA_BLEND(16, 0), BLDALPHA_BLEND(16, 1), @@ -103,7 +105,7 @@ const u16 gIntroWaterDropAlphaBlend[] = static const struct OamData sVersionBannerLeftOamData = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -120,7 +122,7 @@ static const struct OamData sVersionBannerLeftOamData = static const struct OamData sVersionBannerRightOamData = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -191,7 +193,7 @@ static const struct CompressedSpriteSheet sSpriteSheet_EmeraldVersion[] = static const struct OamData sOamData_CopyrightBanner = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -303,7 +305,7 @@ static const struct SpritePalette sSpritePalette_PressStart[] = static const struct OamData sPokemonLogoShineOamData = { - .y = 160, + .y = DISPLAY_HEIGHT, .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .mosaic = 0, @@ -364,7 +366,7 @@ static void SpriteCB_VersionBannerLeft(struct Sprite *sprite) sprite->pos1.y++; if (sprite->data[0] != 0) sprite->data[0]--; - SetGpuReg(REG_OFFSET_BLDALPHA, gIntroWaterDropAlphaBlend[sprite->data[0]]); + SetGpuReg(REG_OFFSET_BLDALPHA, gTitleScreenAlphaBlend[sprite->data[0]]); } } @@ -388,7 +390,7 @@ static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite) { sprite->data[1]++; // Alternate between hidden and shown every 16th frame - if (sprite->data[1] & 0x10) + if (sprite->data[1] & 16) sprite->invisible = FALSE; else sprite->invisible = TRUE; @@ -428,7 +430,7 @@ static void CreateCopyrightBanner(s16 x, s16 y) static void SpriteCB_PokemonLogoShine(struct Sprite *sprite) { - if (sprite->pos1.x < 272) + if (sprite->pos1.x < DISPLAY_WIDTH + 32) { if (sprite->data[0]) // Flash background { @@ -471,7 +473,7 @@ static void SpriteCB_PokemonLogoShine(struct Sprite *sprite) static void SpriteCB_PokemonLogoShine2(struct Sprite *sprite) { - if (sprite->pos1.x < 272) + if (sprite->pos1.x < DISPLAY_WIDTH + 32) sprite->pos1.x += 8; else DestroySprite(sprite); @@ -580,7 +582,7 @@ void CB2_InitTitleScreen(void) break; } case 3: - BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 1, 0x10, 0, RGB_WHITEALPHA); SetVBlankCallback(VBlankCB); gMain.state = 4; break; @@ -594,11 +596,11 @@ void CB2_InitTitleScreen(void) SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WIN1H, 0); SetGpuReg(REG_OFFSET_WIN1V, 0); - SetGpuReg(REG_OFFSET_WININ, 0x1F1F); - SetGpuReg(REG_OFFSET_WINOUT, 0x3F1F); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WINOBJ_ALL); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_LIGHTEN); SetGpuReg(REG_OFFSET_BLDALPHA, 0); - SetGpuReg(REG_OFFSET_BLDY, 0xC); + SetGpuReg(REG_OFFSET_BLDY, 12); SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_16COLOR | BGCNT_TXT256x256); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(27) | BGCNT_16COLOR | BGCNT_TXT256x256); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256); @@ -730,7 +732,7 @@ static void Task_TitleScreenPhase3(u8 taskId) if ((JOY_NEW(A_BUTTON)) || (JOY_NEW(START_BUTTON))) { FadeOutBGM(4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); SetMainCallback2(CB2_GoToMainMenu); } else if (JOY_HELD(CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) @@ -741,13 +743,13 @@ static void Task_TitleScreenPhase3(u8 taskId) && CanResetRTC() == TRUE) { FadeOutBGM(4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); SetMainCallback2(CB2_GoToResetRtcScreen); } else if (JOY_HELD(BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO) { FadeOutBGM(4); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); SetMainCallback2(CB2_GoToBerryFixScreen); } else @@ -764,7 +766,7 @@ static void Task_TitleScreenPhase3(u8 taskId) UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_WHITEALPHA); SetMainCallback2(CB2_GoToCopyrightScreen); } } diff --git a/src/trade.c b/src/trade.c index 6696c23eb..78d7399fa 100644 --- a/src/trade.c +++ b/src/trade.c @@ -52,7 +52,29 @@ #include "constants/songs.h" #include "constants/union_room.h" -#define Trade_SendData(ptr) (SendBlock(bitmask_all_link_players_but_self(), ptr->linkData, 20)) +// The following tags are offsets from GFXTAG_MENU_TEXT +// They're looped over in CB2_CreateTradeMenu and CB2_ReturnToTradeMenu +// and used as indexes into sMenuTextTileBuffers +enum { + GFXTAG_PLAYER_NAME_L, + GFXTAG_PLAYER_NAME_M, + GFXTAG_PLAYER_NAME_R, + GFXTAG_PARTNER_NAME_L, + GFXTAG_PARTNER_NAME_M, + GFXTAG_PARTNER_NAME_R, + GFXTAG_CANCEL_L, + GFXTAG_CANCEL_R, + GFXTAG_CHOOSE_PKMN_L, + GFXTAG_CHOOSE_PKMN_M, + GFXTAG_CHOOSE_PKMN_R, + GFXTAG_CHOOSE_PKMN_EMPTY_1, // 6 sprites to cover the full bottom bar, but only first 3 are needed + GFXTAG_CHOOSE_PKMN_EMPTY_2, + GFXTAG_CHOOSE_PKMN_EMPTY_3, + GFXTAG_MENU_TEXT_COUNT +}; +#define GFXTAG_PLAYER_NAME (1 + GFXTAG_PLAYER_NAME_R - GFXTAG_PLAYER_NAME_L) +#define GFXTAG_PARTNER_NAME (1 + GFXTAG_PARTNER_NAME_R - GFXTAG_PARTNER_NAME_L) +#define GFXTAG_CHOOSE_PKMN (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L) struct InGameTrade { /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; @@ -70,22 +92,23 @@ struct InGameTrade { /*0x38*/ u16 requestedSpecies; }; -static EWRAM_DATA u8 *sMessageBoxAllocBuffer = NULL; +static EWRAM_DATA u8 *sMenuTextAllocBuffer = NULL; -// Bytes 0-2 are used for the player's name box -// Bytes 3-5 are used for the partner's name box -// Bytes 6-7 are used for the Cancel box -// Bytes 8-13 are used for the Choose a Pokemon box -static EWRAM_DATA u8 *sMessageBoxTileBuffers[14] = {NULL}; +// Bytes 0-2 are used for the player's name text +// Bytes 3-5 are used for the partner's name text +// Bytes 6-7 are used for the Cancel text +// Bytes 8-13 are used for the Choose a Pokemon text +// See the corresponding GFXTAGs in src/data/trade.h +static EWRAM_DATA u8 *sMenuTextTileBuffers[GFXTAG_MENU_TEXT_COUNT] = {NULL}; EWRAM_DATA struct MailStruct gTradeMail[PARTY_SIZE] = {0}; EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0}; static EWRAM_DATA struct { /*0x0000*/ u8 bg2hofs; /*0x0001*/ u8 bg3hofs; - /*0x0002*/ u8 filler_2[0x28 - 2]; + /*0x0002*/ u8 filler_2[38]; /*0x0028*/ u8 partySpriteIds[2][PARTY_SIZE]; - /*0x0034*/ u8 cursorSpriteIdx; + /*0x0034*/ u8 cursorSpriteId; /*0x0035*/ u8 cursorPosition; /*0x0036*/ u8 partyCounts[2]; /*0x0038*/ bool8 monPresent[PARTY_SIZE * 2]; @@ -94,7 +117,7 @@ static EWRAM_DATA struct { /*0x0051*/ bool8 isEgg[2][PARTY_SIZE]; /*0x005D*/ u8 hpBarLevels[2][PARTY_SIZE]; /*0x0069*/ u8 bufferPartyState; - /*0x006A*/ u8 filler_6A[0x6F - 0x6A]; + /*0x006A*/ u8 filler_6A[5]; /*0x006F*/ u8 tradeMenuFunc; /*0x0070*/ u8 neverRead_70; /*0x0071*/ u8 filler_71; @@ -105,13 +128,13 @@ static EWRAM_DATA struct { /*0x0079*/ u8 partnerLinkFlagChoseAction; /*0x007A*/ u8 playerLinkFlagStatus; /*0x007B*/ u8 partnerLinkFlagStatus; - /*0x007C*/ u8 filler_7C[0x7E - 0x7C]; + /*0x007C*/ u8 filler_7C[2]; /*0x007E*/ u8 partnerCursorPosition; /*0x007F*/ u8 unused_7F; /*0x0080*/ u16 linkData[20]; /*0x00A8*/ u8 timer; - /*0x00A9*/ u8 giftRibbons[11]; - /*0x00B4*/ u8 filler_B4[0x8D0-0xB4]; + /*0x00A9*/ u8 giftRibbons[GIFT_RIBBONS_COUNT]; + /*0x00B4*/ u8 filler_B4[0x81C]; /*0x08D0*/ struct { bool8 queued; u16 queueDelay; @@ -119,6 +142,7 @@ static EWRAM_DATA struct { } queuedActions[4]; /*0x08F0*/ u16 tilemapBuffer[0x400]; } *sTradeMenuData = {NULL}; + static EWRAM_DATA struct { /*0x00*/ struct Pokemon mon; /*0x64*/ u32 timer; @@ -127,19 +151,19 @@ static EWRAM_DATA struct { /*0x72*/ u8 playerLinkFlagFinishTrade; /*0x73*/ u8 partnerLinkFlagFinishTrade; /*0x74*/ u16 linkData[10]; - /*0x88*/ u8 alwaysZero_88; - /*0x89*/ u8 alwaysZero_89; + /*0x88*/ u8 linkTimeoutZero1; + /*0x89*/ u8 linkTimeoutZero2; /*0x8A*/ u16 linkTimeoutCounter; /*0x8C*/ u16 neverRead_8C; - /*0x8E*/ u8 pokePicSpriteIdxs[2]; - /*0x90*/ u8 unk_90; //sprite id - /*0x91*/ u8 unk_91; //sprite id - /*0x92*/ u8 unk_92; //sprite id + /*0x8E*/ u8 monSpriteIds[2]; + /*0x90*/ u8 connectionSpriteId1; // Multi-purpose sprite ids used during the transfer sequence + /*0x91*/ u8 connectionSpriteId2; + /*0x92*/ u8 cableEndSpriteId; /*0x93*/ u8 sendTradeFinishState; /*0x94*/ u16 state; /*0x96*/ u8 filler_96[0xD2 - 0x96]; - /*0xD2*/ u8 pokeballSpriteId; - /*0xD3*/ u8 unk_D3; //sprite id + /*0xD2*/ u8 releasePokeballSpriteId; + /*0xD3*/ u8 bouncingPokeballSpriteId; /*0xD4*/ u16 texX; /*0xD6*/ u16 texY; /*0xD8*/ u16 neverRead_D8; @@ -151,7 +175,7 @@ static EWRAM_DATA struct { /*0xE4*/ s16 bg2vofs; /*0xE6*/ s16 bg2hofs; /*0xE8*/ u16 sXY; - /*0xEA*/ u16 unk_EA; //sXY divisor + /*0xEA*/ u16 gbaScale; /*0xEC*/ u16 alpha; /*0xEE*/ bool8 isLinkTrade; /*0xF0*/ u16 monSpecies[2]; @@ -165,9 +189,6 @@ static EWRAM_DATA struct { /*0xFE*/ u8 wirelessWinBottom; } *sTradeData = {NULL}; -#if !defined(NONMATCHING) && MODERN -#define static -#endif static bool32 IsWirelessTrade(void); static void CB2_CreateTradeMenu(void); static void VBlankCB_TradeMenu(void); @@ -186,24 +207,24 @@ static void DrawTradeMenuPartyMonInfo(u8, u8, u8, u8, u8, u8); static void DrawTradeMenuPartyInfo(u8); static void PrintNicknamesForTradeMenu(void); static void RedrawTradeMenuParty(u8); -static void Task_DrawSelectionSummary(u8 taskId); -static void Task_DrawSelectionTrade(u8 taskId); +static void Task_DrawSelectionSummary(u8); +static void Task_DrawSelectionTrade(u8); static void QueueAction(u16, u8); static u32 GetNumQueuedActions(void); static void DoQueuedActions(void); static void PrintTradeMessage(u8); static bool8 LoadTradeMenuSpriteSheetsAndPalettes(void); -static void DrawTextWindowAndBuffer6Bytes(const u8 *, u8 *, u8); +static void DrawBottomRowText(const u8 *, u8 *, u8); static void SetTradePartyLiveStatuses(u8); static void GetTradePartyHPBarLevels(u8); static void SetTradePartyHPBarSprites(void); static void SaveTradeGiftRibbons(void); static u32 CanTradeSelectedMon(struct Pokemon *, int, int); -static void sub_807AA28(struct Sprite *sprite); -static void sub_807AA7C(struct Sprite *sprite); -static void sub_807AABC(struct Sprite *sprite); -static void sub_807AAE0(struct Sprite *sprite); -static void sub_807AB04(struct Sprite *sprite); +static void SpriteCB_LinkMonGlow(struct Sprite *); +static void SpriteCB_LinkMonShadow(struct Sprite *); +static void SpriteCB_CableEndSending(struct Sprite *); +static void SpriteCB_CableEndReceiving(struct Sprite *); +static void SpriteCB_GbaScreen(struct Sprite *); static void InitTradeBgInternal(void); static void CB2_UpdateInGameTrade(void); static void SetTradeSequenceBgGpuRegs(u8); @@ -212,12 +233,12 @@ static void BufferTradeSceneStrings(void); static bool8 AnimateTradeSequence(void); static bool8 AnimateTradeSequenceCable(void); static bool8 AnimateTradeSequenceWireless(void); -static void sub_807E55C(struct Sprite *sprite); -static void sub_807E5D8(struct Sprite *sprite); -static void sub_807E64C(struct Sprite *sprite); -static void sub_807E6AC(struct Sprite *sprite); +static void SpriteCB_BouncingPokeball(struct Sprite *); +static void SpriteCB_BouncingPokeballDepart(struct Sprite *); +static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *); +static void SpriteCB_BouncingPokeballArrive(struct Sprite *); static void BufferInGameTradeMonName(void); -static void SetInGameTradeMail(struct MailStruct *mail, const struct InGameTrade *trade); +static void SetInGameTradeMail(struct MailStruct *, const struct InGameTrade *); static void CB2_UpdateLinkTrade(void); static void CB2_TryFinishTrade(void); static void CB2_SaveAndEndTrade(void); @@ -225,8 +246,8 @@ static void CB2_FreeTradeData(void); static void Task_InGameTrade(u8); static void CheckPartnersMonForRibbons(void); static void Task_AnimateWirelessSignal(u8); -static void c3_0805465C(u8); -static void sub_807F39C(u8); +static void Task_NarrowWindowForCrossing_Wireless(u8); +static void Task_NarrowWindowForCrossing_Cable(u8); static void CB2_SaveAndEndWirelessTrade(void); #include "data/trade.h" @@ -249,7 +270,7 @@ static void RequestLinkData(u8 type) SendBlockRequest(type); } -static bool32 sub_80771BC(void) +static bool32 IsLinkTradeTaskFinished(void) { if (gPlayerCurrActivity == ACTIVITY_29) { @@ -365,12 +386,10 @@ static void CB2_CreateTradeMenu(void) case 0: sTradeMenuData = AllocZeroed(sizeof(*sTradeMenuData)); InitTradeMenu(); - sMessageBoxAllocBuffer = AllocZeroed(ARRAY_COUNT(sMessageBoxTileBuffers) * 256); + sMenuTextAllocBuffer = AllocZeroed(GFXTAG_MENU_TEXT_COUNT * 256); - for (i = 0; i < (int)ARRAY_COUNT(sMessageBoxTileBuffers); i++) - { - sMessageBoxTileBuffers[i] = &sMessageBoxAllocBuffer[i * 256]; - } + for (i = 0; i < GFXTAG_MENU_TEXT_COUNT; i++) + sMenuTextTileBuffers[i] = &sMenuTextAllocBuffer[i * 256]; gMain.state++; break; @@ -378,9 +397,7 @@ static void CB2_CreateTradeMenu(void) gPaletteFade.bufferTransferDisabled = FALSE; for (i = 0; i < PARTY_SIZE; i++) - { - CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 32, FALSE, 0, OT_ID_PLAYER_ID, 0); - } + CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); PrintTradeMessage(TRADE_MSG_STANDBY); ShowBg(0); @@ -511,11 +528,11 @@ static void CB2_CreateTradeMenu(void) gMain.state++; break; case 10: - DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMessageBoxTileBuffers[0], 0, 0, 3); + DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, 3); id = GetMultiplayerId(); - DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMessageBoxTileBuffers[3], 0, 0, 3); - DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMessageBoxTileBuffers[6], 0, 0, 2); - DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMessageBoxTileBuffers[8], 24); + DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, 3); + DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, 2); + DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24); gMain.state++; sTradeMenuData->timer = 0; break; @@ -524,39 +541,43 @@ static void CB2_CreateTradeMenu(void) gMain.state++; break; case 12: + // Create player's name text sprites xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120); - for (i = 0; i < 3; i++) + for (i = 0; i < GFXTAG_PLAYER_NAME; i++) { - temp = gSpriteTemplate_832DCAC; - temp.tileTag += i; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PLAYER_NAME_L; CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1); } + // Create partner's name text sprites xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120); - for (i = 0; i < 3; i++) + for (i = 0; i < GFXTAG_PARTNER_NAME; i++) { - temp = gSpriteTemplate_832DCAC; - temp.tileTag += i + 3; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PARTNER_NAME_L; CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1); } gMain.state++; break; case 13: - temp = gSpriteTemplate_832DCAC; - temp.tileTag += 6; + // Create Cancel text sprites + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_L; CreateSprite(&temp, 215, 152, 1); - temp = gSpriteTemplate_832DCAC; - temp.tileTag += 7; + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_R; CreateSprite(&temp, 247, 152, 1); - for (i = 0; i < PARTY_SIZE; i++) + // Create Choose a Pokémon text sprites (only 3 are needed, other 3 are empty) + for (i = 0; i < GFXTAG_CHOOSE_PKMN; i++) { - temp = gSpriteTemplate_832DCAC; - temp.tileTag += i + 8; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L; CreateSprite(&temp, (i * 32) + 24, 150, 1); } - sTradeMenuData->cursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2); + sTradeMenuData->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2); sTradeMenuData->cursorPosition = 0; gMain.state++; rbox_fill_rectangle(0); @@ -584,7 +605,7 @@ static void CB2_CreateTradeMenu(void) gMain.state++; break; case 18: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 19: @@ -698,11 +719,11 @@ static void CB2_ReturnToTradeMenu(void) gMain.state++; break; case 10: - DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMessageBoxTileBuffers[0], 0, 0, 3); + DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, 3); id = GetMultiplayerId(); - DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMessageBoxTileBuffers[3], 0, 0, 3); - DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMessageBoxTileBuffers[6], 0, 0, 2); - DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMessageBoxTileBuffers[8], 24); + DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, 3); + DrawTextWindowAndBufferTiles(sTradeActionTexts[TRADE_TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, 2); + DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24); gMain.state++; sTradeMenuData->timer = 0; break; @@ -711,35 +732,39 @@ static void CB2_ReturnToTradeMenu(void) gMain.state++; break; case 12: + // Create player's name text sprites xPos = GetStringCenterAlignXOffset(1, gSaveBlock2Ptr->playerName, 120); - for (i = 0; i < 3; i++) + for (i = 0; i < GFXTAG_PLAYER_NAME; i++) { - temp = gSpriteTemplate_832DCAC; - temp.tileTag += i; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PLAYER_NAME_L; CreateSprite(&temp, xPos + (i * 32) + 16, 10, 1); } + // Create partner's name text sprites xPos = GetStringCenterAlignXOffset(1, gLinkPlayers[GetMultiplayerId() ^ 1].name, 120); - for (i = 0; i < 3; i++) + for (i = 0; i < GFXTAG_PARTNER_NAME; i++) { - temp = gSpriteTemplate_832DCAC; - temp.tileTag += i + 3; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PARTNER_NAME_L; CreateSprite(&temp, xPos + (i * 32) + 136, 10, 1); } gMain.state++; break; case 13: - temp = gSpriteTemplate_832DCAC; - temp.tileTag += 6; + // Create Cancel text sprites + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_L; CreateSprite(&temp, 215, 152, 1); - temp = gSpriteTemplate_832DCAC; - temp.tileTag += 7; + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_R; CreateSprite(&temp, 247, 152, 1); - for (i = 0; i < PARTY_SIZE; i++) + // Create Choose a Pokémon text sprites + for (i = 0; i < GFXTAG_CHOOSE_PKMN; i++) { - temp = gSpriteTemplate_832DCAC; - temp.tileTag += i + 8; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L; CreateSprite(&temp, (i * 32) + 24, 150, 1); } @@ -748,7 +773,9 @@ static void CB2_ReturnToTradeMenu(void) else sTradeMenuData->cursorPosition = gLastViewedMonIndex + PARTY_SIZE; - sTradeMenuData->cursorSpriteIdx = CreateSprite(&gSpriteTemplate_832DC94, sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][0] * 8 + 32, sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][1] * 8, 2); + sTradeMenuData->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, + sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][0] * 8 + 32, + sTradeMonSpriteCoords[sTradeMenuData->cursorPosition][1] * 8, 2); gMain.state = 16; break; case 16: @@ -764,8 +791,8 @@ static void CB2_ReturnToTradeMenu(void) break; case 18: gPaletteFade.bufferTransferDisabled = FALSE; - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); gMain.state++; break; case 19: @@ -805,7 +832,7 @@ static void LinkTradeFadeOut(void) { if (++sTradeMenuData->timer > 15) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_LINK_TRADE_WAIT_FADE; } } @@ -838,7 +865,7 @@ static void SetLinkTradeCallbacks(void) { if (IsLinkRfuTaskFinished()) { - Free(sMessageBoxAllocBuffer); + Free(sMenuTextAllocBuffer); FreeAllWindowBuffers(); Free(sTradeMenuData); gMain.callback1 = NULL; @@ -851,7 +878,7 @@ static void SetLinkTradeCallbacks(void) { if (!gReceivedRemoteLinkPlayers) { - Free(sMessageBoxAllocBuffer); + Free(sMenuTextAllocBuffer); FreeAllWindowBuffers(); Free(sTradeMenuData); gMain.callback1 = NULL; @@ -960,12 +987,13 @@ static bool8 BufferTradeParties(void) switch (sTradeMenuData->bufferPartyState) { case 0: + // The parties are sent in pairs rather than all at once Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); sTradeMenuData->bufferPartyState++; sTradeMenuData->timer = 0; break; case 1: - if (sub_80771BC()) + if (IsLinkTradeTaskFinished()) { if (_GetBlockReceivedStatus() == 0) { @@ -1007,13 +1035,13 @@ static bool8 BufferTradeParties(void) case 8: if (_GetBlockReceivedStatus() == 3) { - Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 200); + Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); TradeResetReceivedFlags(); sTradeMenuData->bufferPartyState++; } break; case 9: - Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 200); + Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon)); sTradeMenuData->bufferPartyState++; break; case 11: @@ -1026,13 +1054,13 @@ static bool8 BufferTradeParties(void) case 12: if (_GetBlockReceivedStatus() == 3) { - Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 200); + Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); TradeResetReceivedFlags(); sTradeMenuData->bufferPartyState++; } break; case 13: - Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, 220); + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, PARTY_SIZE * sizeof(struct MailStruct) + 4); sTradeMenuData->bufferPartyState++; break; case 15: @@ -1045,13 +1073,13 @@ static bool8 BufferTradeParties(void) case 16: if (_GetBlockReceivedStatus() == 3) { - Trade_Memcpy(gTradeMail, gBlockRecvBuffer[id ^ 1], 216); + Trade_Memcpy(gTradeMail, gBlockRecvBuffer[id ^ 1], PARTY_SIZE * sizeof(struct MailStruct)); TradeResetReceivedFlags(); sTradeMenuData->bufferPartyState++; } break; case 17: - Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, ARRAY_COUNT(sTradeMenuData->giftRibbons)); + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, sizeof(sTradeMenuData->giftRibbons)); sTradeMenuData->bufferPartyState++; break; case 19: @@ -1064,7 +1092,7 @@ static bool8 BufferTradeParties(void) case 20: if (_GetBlockReceivedStatus() == 3) { - Trade_Memcpy(sTradeMenuData->giftRibbons, gBlockRecvBuffer[id ^ 1], ARRAY_COUNT(sTradeMenuData->giftRibbons)); + Trade_Memcpy(sTradeMenuData->giftRibbons, gBlockRecvBuffer[id ^ 1], sizeof(sTradeMenuData->giftRibbons)); TradeResetReceivedFlags(); sTradeMenuData->bufferPartyState++; } @@ -1106,9 +1134,9 @@ static bool8 BufferTradeParties(void) return FALSE; } -static void PrintAndBufferIsThisTradeOkay(void) +static void DrawIsThisTradeOkay(void) { - DrawTextWindowAndBuffer6Bytes(sText_IsThisTradeOkay, (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24); + DrawBottomRowText(sText_IsThisTradeOkay, (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24); } // mpId is unused @@ -1163,12 +1191,12 @@ static void ReactToLinkTradeData(u8 mpId, u8 status) { switch (gBlockRecvBuffer[0][0]) { - case LINKCMD_CANCEL_TRADE: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + case LINKCMD_BOTH_CANCEL_TRADE: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); PrintTradeMessage(TRADE_MSG_WAITING_FOR_FRIEND); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_1; break; - case LINKCMD_0xEECC: + case LINKCMD_PARTNER_CANCEL_TRADE: PrintTradeMessage(TRADE_MSG_FRIEND_WANTS_TO_TRADE); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_REDRAW_MAIN_MENU; break; @@ -1180,10 +1208,10 @@ static void ReactToLinkTradeData(u8 mpId, u8 status) sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CONFIRM_TRADE_PROMPT; break; case LINKCMD_START_TRADE: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_LINK_TRADE_WAIT_FADE; break; - case LINKCMD_0xDDEE: + case LINKCMD_PLAYER_CANCEL_TRADE: PrintTradeMessage(TRADE_MSG_CANCELED); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_REDRAW_MAIN_MENU; } @@ -1211,7 +1239,7 @@ static void QueueLinkTradeData(void) && sTradeMenuData->partnerLinkFlagChoseAction == WANTS_TO_CANCEL) { PrintTradeMessage(TRADE_MSG_CANCELED); - sTradeMenuData->linkData[0] = LINKCMD_0xEECC; + sTradeMenuData->linkData[0] = LINKCMD_PARTNER_CANCEL_TRADE; sTradeMenuData->linkData[1] = 0; QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); sTradeMenuData->playerLinkFlagStatus = sTradeMenuData->partnerLinkFlagStatus = 0; @@ -1222,7 +1250,7 @@ static void QueueLinkTradeData(void) && sTradeMenuData->partnerLinkFlagChoseAction == WANTS_TO_TRADE) { PrintTradeMessage(TRADE_MSG_FRIEND_WANTS_TO_TRADE); - sTradeMenuData->linkData[0] = LINKCMD_0xDDEE; + sTradeMenuData->linkData[0] = LINKCMD_PLAYER_CANCEL_TRADE; sTradeMenuData->linkData[1] = 0; QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); sTradeMenuData->playerLinkFlagStatus = sTradeMenuData->partnerLinkFlagStatus = 0; @@ -1232,10 +1260,10 @@ static void QueueLinkTradeData(void) else if (sTradeMenuData->playerLinkFlagChoseAction == WANTS_TO_CANCEL && sTradeMenuData->partnerLinkFlagChoseAction == WANTS_TO_CANCEL) { - sTradeMenuData->linkData[0] = LINKCMD_CANCEL_TRADE; + sTradeMenuData->linkData[0] = LINKCMD_BOTH_CANCEL_TRADE; sTradeMenuData->linkData[1] = 0; QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenuData->playerLinkFlagChoseAction = sTradeMenuData->partnerLinkFlagChoseAction = 0; sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_1; } @@ -1258,7 +1286,7 @@ static void QueueLinkTradeData(void) || sTradeMenuData->partnerLinkFlagStatus == CANCEL_TRADE) { PrintTradeMessage(TRADE_MSG_CANCELED); - sTradeMenuData->linkData[0] = LINKCMD_0xDDEE; + sTradeMenuData->linkData[0] = LINKCMD_PLAYER_CANCEL_TRADE; sTradeMenuData->linkData[1] = 0; QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); sTradeMenuData->playerLinkFlagStatus = 0; @@ -1320,15 +1348,15 @@ static void TradeMenuMoveCursor(u8 *cursorPosition, u8 direction) if (newPosition == (PARTY_SIZE * 2)) // CANCEL { - StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteIdx], 1); - gSprites[sTradeMenuData->cursorSpriteIdx].pos1.x = 224; - gSprites[sTradeMenuData->cursorSpriteIdx].pos1.y = 160; + StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteId], CURSOR_ANIM_ON_CANCEL); + gSprites[sTradeMenuData->cursorSpriteId].pos1.x = DISPLAY_WIDTH - 16; + gSprites[sTradeMenuData->cursorSpriteId].pos1.y = DISPLAY_HEIGHT; } else { - StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteIdx], 0); - gSprites[sTradeMenuData->cursorSpriteIdx].pos1.x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32; - gSprites[sTradeMenuData->cursorSpriteIdx].pos1.y = sTradeMonSpriteCoords[newPosition][1] * 8; + StartSpriteAnim(&gSprites[sTradeMenuData->cursorSpriteId], CURSOR_ANIM_NORMAL); + gSprites[sTradeMenuData->cursorSpriteId].pos1.x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32; + gSprites[sTradeMenuData->cursorSpriteId].pos1.y = sTradeMonSpriteCoords[newPosition][1] * 8; } if (*cursorPosition != newPosition) @@ -1387,7 +1415,7 @@ static void TradeMenuProcessInput(void) // Cursor is in partner's party else if (sTradeMenuData->cursorPosition < PARTY_SIZE * 2) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_SHOW_MON_SUMMARY; } // Cursor is on Cancel @@ -1395,7 +1423,7 @@ static void TradeMenuProcessInput(void) { CreateYesNoMenu(&sTradeYesNoWindowTemplate, 1, 14, 0); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_CANCEL_TRADE_PROMPT; - DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CANCEL_TRADE], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24); + DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CANCEL_TRADE], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24); } } } @@ -1404,8 +1432,8 @@ static void TradeMenuChooseMon(void) { PrintNicknamesForTradeMenu(); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_MAIN_MENU; - gSprites[sTradeMenuData->cursorSpriteIdx].invisible = FALSE; - DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24); + gSprites[sTradeMenuData->cursorSpriteId].invisible = FALSE; + DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + sTradeMenuData->bottomTextTileStart * 32), 24); } static void TradeMenuProcessInput_SelectedMon(void) @@ -1419,7 +1447,7 @@ static void TradeMenuProcessInput_SelectedMon(void) case MENU_NOTHING_CHOSEN: break; case 0: // Summary - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_SHOW_MON_SUMMARY; break; case 1: // Trade @@ -1427,7 +1455,7 @@ static void TradeMenuProcessInput_SelectedMon(void) { case CAN_TRADE_MON: SetReadyToTrade(); - gSprites[sTradeMenuData->cursorSpriteIdx].invisible = TRUE; + gSprites[sTradeMenuData->cursorSpriteId].invisible = TRUE; break; case CANT_TRADE_LAST_MON: QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2); @@ -1463,10 +1491,10 @@ static void TradeMenuShowMonSummaryScreen(void) { // Player's party if (sTradeMenuData->cursorPosition < PARTY_SIZE) - ShowPokemonSummaryScreen(PSS_MODE_LOCK_MOVES, gPlayerParty, sTradeMenuData->cursorPosition, sTradeMenuData->partyCounts[TRADE_PLAYER] - 1, CB2_ReturnToTradeMenu); + ShowPokemonSummaryScreen(SUMMARY_MODE_LOCK_MOVES, gPlayerParty, sTradeMenuData->cursorPosition, sTradeMenuData->partyCounts[TRADE_PLAYER] - 1, CB2_ReturnToTradeMenu); // Partner's party else - ShowPokemonSummaryScreen(PSS_MODE_LOCK_MOVES, gEnemyParty, sTradeMenuData->cursorPosition - PARTY_SIZE, sTradeMenuData->partyCounts[TRADE_PARTNER] - 1, CB2_ReturnToTradeMenu); + ShowPokemonSummaryScreen(SUMMARY_MODE_LOCK_MOVES, gEnemyParty, sTradeMenuData->cursorPosition - PARTY_SIZE, sTradeMenuData->partyCounts[TRADE_PARTNER] - 1, CB2_ReturnToTradeMenu); FreeAllWindowBuffers(); } } @@ -1489,7 +1517,7 @@ static u8 CheckValidityOfTradeMons(u8 *aliveMons, u8 playerPartyCount, u8 player // Partner cant trade illegitimate Deoxys or Mew if (partnerSpecies == SPECIES_DEOXYS || partnerSpecies == SPECIES_MEW) { - if (!GetMonData(&gEnemyParty[partnerMonIdx], MON_DATA_OBEDIENCE)) + if (!GetMonData(&gEnemyParty[partnerMonIdx], MON_DATA_EVENT_LEGAL)) return PARTNER_MON_INVALID; } @@ -1517,7 +1545,9 @@ static bool32 CheckMonsBeforeTrade(void) aliveMons[i] = sTradeMenuData->isLiveMon[TRADE_PLAYER][i]; } - switch (CheckValidityOfTradeMons(aliveMons, sTradeMenuData->partyCounts[TRADE_PLAYER], sTradeMenuData->cursorPosition, sTradeMenuData->partnerCursorPosition)) + switch (CheckValidityOfTradeMons(aliveMons, sTradeMenuData->partyCounts[TRADE_PLAYER], + sTradeMenuData->cursorPosition, + sTradeMenuData->partnerCursorPosition)) { case PLAYER_MON_INVALID: QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2); @@ -1550,7 +1580,7 @@ static void ConfirmOrCancelTrade(void) case 1: // Cancel Trade case MENU_B_PRESSED: QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY); - if (sub_80771BC()) + if (IsLinkTradeTaskFinished()) SetLinkData(LINKCMD_READY_CANCEL_TRADE, 0); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_STANDBY; PutWindowTilemap(17); @@ -1558,7 +1588,8 @@ static void ConfirmOrCancelTrade(void) } } -static void sub_807929C(void) +// Only when choosing Yes to cancel, when No is chosen all are redrawn anyway +static void RestoreNicknamesCoveredByYesNo(void) { int i; @@ -1576,9 +1607,9 @@ static void CancelTradeYesNo(void) case 0: // YES, Cancel PrintTradeMessage(TRADE_MSG_WAITING_FOR_FRIEND); SetLinkData(LINKCMD_REQUEST_CANCEL, 0); - gSprites[sTradeMenuData->cursorSpriteIdx].invisible = TRUE; + gSprites[sTradeMenuData->cursorSpriteId].invisible = TRUE; sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_STANDBY; - sub_807929C(); + RestoreNicknamesCoveredByYesNo(); break; case 1: // NO, Continue case MENU_B_PRESSED: @@ -1604,7 +1635,7 @@ static void ConfirmTradePrompt(void) if (sTradeMenuData->drawPartyState[TRADE_PLAYER] == DRAW_PARTY_FINISH && sTradeMenuData->drawPartyState[TRADE_PARTNER] == DRAW_PARTY_FINISH) { - PrintAndBufferIsThisTradeOkay(); + DrawIsThisTradeOkay(); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_DELAY_TRADE_CONFIRM; } } @@ -1640,7 +1671,7 @@ static void RedrawTradeMenuAfterPressA(void) RedrawTradeMenuParty(TRADE_PLAYER); RedrawTradeMenuParty(TRADE_PARTNER); sTradeMenuData->tradeMenuFunc = TRADEMENUFUNC_MAIN_MENU; - gSprites[sTradeMenuData->cursorSpriteIdx].invisible = FALSE; + gSprites[sTradeMenuData->cursorSpriteId].invisible = FALSE; } } @@ -1665,9 +1696,9 @@ static void CancelTrade_2(void) { if (gWirelessCommType) { - if (sub_80771BC() && GetNumQueuedActions() == 0) + if (IsLinkTradeTaskFinished() && GetNumQueuedActions() == 0) { - Free(sMessageBoxAllocBuffer); + Free(sMenuTextAllocBuffer); Free(sTradeMenuData); FreeAllWindowBuffers(); DestroyWirelessStatusIndicatorSprite(); @@ -1678,7 +1709,7 @@ static void CancelTrade_2(void) { if (!gReceivedRemoteLinkPlayers) { - Free(sMessageBoxAllocBuffer); + Free(sMenuTextAllocBuffer); Free(sTradeMenuData); FreeAllWindowBuffers(); SetMainCallback2(CB2_ReturnToFieldFromMultiplayer); @@ -1806,7 +1837,8 @@ static void DrawTradeMenuParty(u8 whichParty) gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].invisible = FALSE; gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[0] = 20; - gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; + gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].data[4] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12; StoreSpriteCallbackInData6(&gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]], SpriteCB_MonIcon); sTradeMenuData->drawPartyState[whichParty]++; @@ -1825,7 +1857,8 @@ static void DrawTradeMenuParty(u8 whichParty) case 3: CopyToBgTilemapBufferRect_ChangePalette(1, sTradeMovesBoxTilemap, selectedMonParty * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); - gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos1.x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; + gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos1.x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos1.y = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12; gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos2.x = 0; gSprites[sTradeMenuData->partySpriteIds[0][partyIdx + (selectedMonParty * PARTY_SIZE)]].pos2.y = 0; @@ -2038,7 +2071,7 @@ static void RedrawTradeMenuParty(u8 whichParty) DrawTradeMenuPartyInfo(whichParty); PrintPartyNicknamesForTradeMenu(whichParty); ResetTradeMenuPartyPositions(whichParty); - DrawTextWindowAndBuffer6Bytes(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24); + DrawBottomRowText(sTradeActionTexts[TRADE_TEXT_CHOOSE_MON], (void *)(OBJ_VRAM0 + (sTradeMenuData->bottomTextTileStart * 32)), 24); sTradeMenuData->drawPartyState[whichParty] = 0; } @@ -2142,40 +2175,51 @@ static bool8 LoadTradeMenuSpriteSheetsAndPalettes(void) { struct SpriteSheet sheet; - if (sTradeMenuData->timer < (int)ARRAY_COUNT(sMessageBoxTileBuffers)) + if (sTradeMenuData->timer < GFXTAG_MENU_TEXT_COUNT) { - sheet.data = sMessageBoxTileBuffers[sTradeMenuData->timer]; + sheet.data = sMenuTextTileBuffers[sTradeMenuData->timer]; sheet.size = 0x100; - sheet.tag = 200 + sTradeMenuData->timer; + sheet.tag = GFXTAG_MENU_TEXT + sTradeMenuData->timer; } switch (sTradeMenuData->timer) { - case 0 ... 7: + case GFXTAG_PLAYER_NAME_L: + case GFXTAG_PLAYER_NAME_M: + case GFXTAG_PLAYER_NAME_R: + case GFXTAG_PARTNER_NAME_L: + case GFXTAG_PARTNER_NAME_M: + case GFXTAG_PARTNER_NAME_R: + case GFXTAG_CANCEL_L: + case GFXTAG_CANCEL_R: LoadSpriteSheet(&sheet); sTradeMenuData->timer++; break; - case 8: + case GFXTAG_CHOOSE_PKMN_L: sTradeMenuData->bottomTextTileStart = LoadSpriteSheet(&sheet); sTradeMenuData->timer++; break; - case 9 ... 13: + case GFXTAG_CHOOSE_PKMN_M: + case GFXTAG_CHOOSE_PKMN_R: + case GFXTAG_CHOOSE_PKMN_EMPTY_1: + case GFXTAG_CHOOSE_PKMN_EMPTY_2: + case GFXTAG_CHOOSE_PKMN_EMPTY_3: LoadSpriteSheet(&sheet); sTradeMenuData->timer++; break; - case 14: + case GFXTAG_MENU_TEXT_COUNT: LoadSpritePalette(&gSpritePalette_TradeScreenText); sTradeMenuData->timer++; break; - case 15: - LoadSpritePalette(&gUnknown_0832DC44); + case GFXTAG_MENU_TEXT_COUNT + 1: + LoadSpritePalette(&sCursor_SpritePalette); sTradeMenuData->timer++; break; - case 16: - LoadSpriteSheet(&sTradeButtonsSpriteSheet); + case GFXTAG_MENU_TEXT_COUNT + 2: + LoadSpriteSheet(&sCursor_SpriteSheet); sTradeMenuData->timer++; break; - case 17: + case GFXTAG_MENU_TEXT_COUNT + 3: sTradeMenuData->timer = 0; return TRUE; } @@ -2183,7 +2227,7 @@ static bool8 LoadTradeMenuSpriteSheetsAndPalettes(void) return FALSE; } -static void DrawTextWindowAndBuffer6Bytes(const u8 *str, u8 *dest, u8 unused) +static void DrawBottomRowText(const u8 *str, u8 *dest, u8 unused) { DrawTextWindowAndBufferTiles(str, dest, 0, 0, 6); } @@ -2329,7 +2373,7 @@ static u32 CanTradeSelectedMon(struct Pokemon *playerParty, int partyCount, int if (species[monIdx] == SPECIES_DEOXYS || species[monIdx] == SPECIES_MEW) { - if (!GetMonData(&playerParty[monIdx], MON_DATA_OBEDIENCE)) + if (!GetMonData(&playerParty[monIdx], MON_DATA_EVENT_LEGAL)) return CANT_TRADE_INVALID_MON; } @@ -2394,17 +2438,17 @@ s32 GetGameProgressForLinkTrade(void) return TRADE_BOTH_PLAYERS_READY; } -static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isObedientBitSet) +static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isEventLegal) { if (species == SPECIES_DEOXYS || species == SPECIES_MEW) { - if (!isObedientBitSet) + if (!isEventLegal) return TRUE; } return FALSE; } -int GetUnionRoomTradeMessageId(struct GFtgtGnameSub rfuPlayer, struct GFtgtGnameSub rfuPartner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, u8 isObedientBitSet) +int GetUnionRoomTradeMessageId(struct GFtgtGnameSub rfuPlayer, struct GFtgtGnameSub rfuPartner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, u8 isEventLegal) { bool8 playerHasNationalDex = rfuPlayer.hasNationalDex; bool8 playerIsChampion = rfuPlayer.isChampion; @@ -2424,7 +2468,7 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub rfuPlayer, struct GFtgtGname } } - if (IsDeoxysOrMewUntradable(playerSpecies, isObedientBitSet)) + if (IsDeoxysOrMewUntradable(playerSpecies, isEventLegal)) { return UR_TRADE_MSG_MON_CANT_BE_TRADED_2; } @@ -2475,11 +2519,11 @@ int GetUnionRoomTradeMessageId(struct GFtgtGnameSub rfuPlayer, struct GFtgtGname return UR_TRADE_MSG_NONE; } -int CanRegisterMonForTradingBoard(struct GFtgtGnameSub rfuPlayer, u16 species2, u16 species, u8 isObedientBitSet) +int CanRegisterMonForTradingBoard(struct GFtgtGnameSub rfuPlayer, u16 species2, u16 species, u8 isEventLegal) { bool8 hasNationalDex = rfuPlayer.hasNationalDex; - if (IsDeoxysOrMewUntradable(species, isObedientBitSet)) + if (IsDeoxysOrMewUntradable(species, isEventLegal)) return CANT_REGISTER_MON; if (hasNationalDex) @@ -2567,7 +2611,7 @@ int CanSpinTradeMon(struct Pokemon *mon, u16 monIdx) return CAN_TRADE_MON; } -static void sub_807AA28(struct Sprite *sprite) +static void SpriteCB_LinkMonGlow(struct Sprite *sprite) { if (++sprite->data[0] == 10) { @@ -2576,7 +2620,7 @@ static void sub_807AA28(struct Sprite *sprite) } } -static void sub_807AA4C(struct Sprite *sprite) +static void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite) { if (!sprite->invisible && ++sprite->data[0] == 10) { @@ -2585,18 +2629,19 @@ static void sub_807AA4C(struct Sprite *sprite) } } -static void sub_807AA7C(struct Sprite *sprite) +static void SpriteCB_LinkMonShadow(struct Sprite *sprite) { if (!sprite->data[1]) { if (++sprite->data[0] == 12) sprite->data[0] = 0; - LoadPalette(&gUnknown_08338EA4[sprite->data[0]], (sprite->oam.paletteNum + 16) * 16 + 4, 2); + LoadPalette(&sLinkMonShadow_Pal[sprite->data[0]], (sprite->oam.paletteNum + 16) * 16 + 4, 2); } } -static void sub_807AABC(struct Sprite *sprite) +// Move cable down offscreen +static void SpriteCB_CableEndSending(struct Sprite *sprite) { sprite->data[0]++; sprite->pos2.y++; @@ -2605,7 +2650,8 @@ static void sub_807AABC(struct Sprite *sprite) DestroySprite(sprite); } -static void sub_807AAE0(struct Sprite *sprite) +// Move cable up onscreen +static void SpriteCB_CableEndReceiving(struct Sprite *sprite) { sprite->data[0]++; sprite->pos2.y--; @@ -2614,7 +2660,7 @@ static void sub_807AAE0(struct Sprite *sprite) DestroySprite(sprite); } -static void sub_807AB04(struct Sprite *sprite) +static void SpriteCB_GbaScreen(struct Sprite *sprite) { if (++sprite->data[0] == 15) { @@ -2668,13 +2714,13 @@ static void VBlankCB_Trade(void) static void ClearLinkTimeoutCounter(void) { sTradeData->linkTimeoutCounter = 0; - sTradeData->alwaysZero_88 = 0; - sTradeData->alwaysZero_89 = 0; + sTradeData->linkTimeoutZero1 = 0; + sTradeData->linkTimeoutZero2 = 0; } static void CheckForLinkTimeout(void) { - if (sTradeData->alwaysZero_88 == sTradeData->alwaysZero_89) + if (sTradeData->linkTimeoutZero1 == sTradeData->linkTimeoutZero2) sTradeData->linkTimeoutCounter++; else sTradeData->linkTimeoutCounter = 0; @@ -2684,11 +2730,11 @@ static void CheckForLinkTimeout(void) CloseLink(); SetMainCallback2(CB2_LinkError); sTradeData->linkTimeoutCounter = 0; - sTradeData->alwaysZero_89 = 0; - sTradeData->alwaysZero_88 = 0; + sTradeData->linkTimeoutZero2 = 0; + sTradeData->linkTimeoutZero1 = 0; } - sTradeData->alwaysZero_89 = sTradeData->alwaysZero_88; + sTradeData->linkTimeoutZero2 = sTradeData->linkTimeoutZero1; } static u32 TradeGetMultiplayerId(void) @@ -2734,9 +2780,9 @@ static void LoadTradeMonPic(u8 whichParty, u8 state) break; case 1: SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); - sTradeData->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); - gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + sTradeData->monSpriteIds[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); + gSprites[sTradeData->monSpriteIds[whichParty]].invisible = TRUE; + gSprites[sTradeData->monSpriteIds[whichParty]].callback = SpriteCallbackDummy; break; } } @@ -2845,7 +2891,7 @@ void CB2_LinkTrade(void) gMain.state++; break; case 10: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); gMain.state++; break; @@ -2893,9 +2939,9 @@ static void InitTradeBgInternal(void) InitBgsFromTemplates(0, sTradeSequenceBgTemplates, ARRAY_COUNT(sTradeSequenceBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); - SetBgTilemapBuffer(0, Alloc(0x800)); - SetBgTilemapBuffer(1, Alloc(0x800)); - SetBgTilemapBuffer(3, Alloc(0x800)); + SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(3, Alloc(BG_SCREEN_SIZE)); DeactivateAllTextPrinters(); DecompressAndLoadBgGfxUsingHeap(0, gBattleTextboxTiles, 0, 0, 0); LZDecompressWram(gBattleTextboxTilemap, gDecompressionBuffer); @@ -2920,7 +2966,7 @@ static void CB2_InGameTrade(void) StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); StringCopy(gLinkPlayers[1].name, otName); - gLinkPlayers[0].language = LANGUAGE_ENGLISH; + gLinkPlayers[0].language = GAME_LANGUAGE; gLinkPlayers[1].language = GetMonData(&gEnemyParty[0], MON_DATA_LANGUAGE); sTradeData = AllocZeroed(sizeof(*sTradeData)); AllocateMonSpritesGfx(); @@ -3024,7 +3070,7 @@ static void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) struct Pokemon *partnerMon = &gEnemyParty[partnerPartyIdx]; u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); - if (playerMail != 0xFF) + if (playerMail != MAIL_NONE) ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); sTradeData->mon = *playerMon; @@ -3035,7 +3081,7 @@ static void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) if (!GetMonData(playerMon, MON_DATA_IS_EGG)) SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship); - if (partnerMail != 0xFF) + if (partnerMail != MAIL_NONE) GiveMailToMon2(playerMon, &gTradeMail[partnerMail]); UpdatePokedexForReceivedMon(playerPartyIdx); @@ -3050,7 +3096,7 @@ static void TrySendTradeFinishData(void) case 1: if (IsLinkTaskFinished()) { - Trade_SendData(sTradeData); + SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, sizeof(sTradeData->linkData)); sTradeData->sendTradeFinishState++; } // fallthrough @@ -3089,7 +3135,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state) BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 16, 0x60); DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000); - DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000); + DmaCopy16Defvars(3, gTradePlatform_Tilemap, (void *) BG_SCREEN_ADDR(18), 0x1000); break; case 1: sTradeData->bg1hofs = 0; @@ -3108,11 +3154,11 @@ static void SetTradeSequenceBgGpuRegs(u8 state) if (sTradeData->isCableTrade) { - DmaCopy16Defvars(3, sTradeTilemap_GbaCable, (void *) BG_SCREEN_ADDR(5), 0x1000); + DmaCopy16Defvars(3, sGbaCable_Tilemap, (void *) BG_SCREEN_ADDR(5), 0x1000); } else { - DmaCopy16Defvars(3, sTradeTilemap_GbaWireless, (void *) BG_SCREEN_ADDR(5), 0x1000); + DmaCopy16Defvars(3, sGbaWireless_Tilemap, (void *) BG_SCREEN_ADDR(5), 0x1000); } DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(0), 0x1420, 0x1000); @@ -3130,7 +3176,7 @@ static void SetTradeSequenceBgGpuRegs(u8 state) DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - LZ77UnCompVram(gUnknown_083379A0, (void *) BG_SCREEN_ADDR(5)); + LZ77UnCompVram(sCrossingHighlightWireless_Tilemap, (void *) BG_SCREEN_ADDR(5)); BlendPalettes(0x8, 16, RGB_BLACK); } else @@ -3139,14 +3185,14 @@ static void SetTradeSequenceBgGpuRegs(u8 state) DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - DmaCopy16Defvars(3, sTradeTilemap_Cable, (void *) BG_SCREEN_ADDR(5), 0x800); + DmaCopy16Defvars(3, sCrossingHighlightCable_Tilemap, (void *) BG_SCREEN_ADDR(5), 0x800); BlendPalettes(0x1, 16, RGB_BLACK); } break; case 3: - LoadPalette(sTradePal_Black, 48, 0x20); - LZ77UnCompVram(sTradeGfx_WirelessSignal, (void *) BG_CHAR_ADDR(1)); - LZ77UnCompVram(sTradeTilemap_WirelessSignal, (void *) BG_SCREEN_ADDR(18)); + LoadPalette(sWirelessSignalNone_Pal, 48, 0x20); + LZ77UnCompVram(sWirelessSignal_Gfx, (void *) BG_CHAR_ADDR(1)); + LZ77UnCompVram(sWirelessSignal_Tilemap, (void *) BG_SCREEN_ADDR(18)); sTradeData->bg2vofs = 80; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | @@ -3167,18 +3213,18 @@ static void SetTradeSequenceBgGpuRegs(u8 state) sTradeData->texX = 64; sTradeData->texY = 92; sTradeData->sXY = 32; - sTradeData->unk_EA = 1024; + sTradeData->gbaScale = 1024; sTradeData->alpha = 0; - DmaCopyLarge16(3, sTradeAffine_Gba, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000); + DmaCopyLarge16(3, sGbaAffine_Gfx, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000); if (sTradeData->isCableTrade) { - DmaCopy16Defvars(3, sTradeAffineMap_GbaCable, (void *) BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaCable_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100); } else { - DmaCopy16Defvars(3, sTradeAffineMap_GbaWireless, (void *) BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaWireless_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100); } break; case 5: @@ -3198,20 +3244,20 @@ static void SetTradeSequenceBgGpuRegs(u8 state) sTradeData->texX = 64; sTradeData->texY = 92; sTradeData->sXY = 256; - sTradeData->unk_EA = 128; + sTradeData->gbaScale = 128; sTradeData->scrX = 120; sTradeData->scrY = 80; sTradeData->alpha = 0; - DmaCopyLarge16(3, sTradeAffine_Gba, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000); + DmaCopyLarge16(3, sGbaAffine_Gfx, (void *) BG_CHAR_ADDR(1), 0x2840, 0x1000); if (sTradeData->isCableTrade) { - DmaCopy16Defvars(3, sTradeAffineMap_GbaCable, (void *) BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaCable_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100); } else { - DmaCopy16Defvars(3, sTradeAffineMap_GbaWireless, (void *) BG_SCREEN_ADDR(18), 0x100); + DmaCopy16Defvars(3, sGbaWireless_AffineTilemap, (void *) BG_SCREEN_ADDR(18), 0x100); } break; case 7: @@ -3225,19 +3271,19 @@ static void SetTradeSequenceBgGpuRegs(u8 state) BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 16, 0x60); DmaCopyLarge16(3, gTradeGba_Gfx, (void *) BG_CHAR_ADDR(1), 0x1420, 0x1000); - DmaCopy16Defvars(3, gUnknown_08331F60, (void *) BG_SCREEN_ADDR(18), 0x1000); + DmaCopy16Defvars(3, gTradePlatform_Tilemap, (void *) BG_SCREEN_ADDR(18), 0x1000); break; } } static void LoadTradeSequenceSpriteSheetsAndPalettes(void) { - LoadSpriteSheet(&sGlow1SpriteSheet); - LoadSpriteSheet(&sGlow2SpriteSheet); - LoadSpriteSheet(&sCableEndSpriteSheet); - LoadSpriteSheet(&sGbaScreenSpriteSheet); - LoadSpritePalette(&sMiscTradeSpritePalette); - LoadSpritePalette(&sGbaSpritePalette); + LoadSpriteSheet(&sSpriteSheet_LinkMonGlow); + LoadSpriteSheet(&sSpriteSheet_LinkMonShadow); + LoadSpriteSheet(&sSpriteSheet_CableEnd); + LoadSpriteSheet(&sSpriteSheet_GbaScreen); + LoadSpritePalette(&sSpritePalette_LinkMon); + LoadSpritePalette(&sSpritePalette_Gba); } // Buffers "[Pokemon] will be sent to [Trainer]" strings @@ -3266,7 +3312,7 @@ static void BufferTradeSceneStrings(void) } } -// returns TRUE if it was a link trade, FALSE if it was an in-game trade +// returns TRUE if it finished a link trade, FALSE if it finished an in-game trade or if sequence is still going static bool8 AnimateTradeSequence(void) { if (sTradeData->isCableTrade) @@ -3275,71 +3321,146 @@ static bool8 AnimateTradeSequence(void) return AnimateTradeSequenceWireless(); } +// Below are the states for the main switch in AnimateTradeSequenceCable and AnimateTradeSequenceWireless +// When AnimateTradeSequenceWireless has a unique version of a +// state used by AnimateTradeSequenceCable, it adds the below modifier +#define TS_WIRELESS_STATE 100 +enum { + TS_STATE_START, + TS_STATE_MON_SLIDE_IN, + // 2-9 unused + TS_STATE_SEND_MSG = 10, + TS_STATE_BYE_BYE, + TS_STATE_POKEBALL_DEPART, + TS_STATE_POKEBALL_DEPART_WAIT, + TS_STATE_FADE_OUT_TO_GBA_SEND, + // 15-19 unused + TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND = 20, + TS_STATE_FADE_IN_TO_GBA_SEND, + TS_STATE_WAIT_FADE_IN_TO_GBA_SEND, + TS_STATE_GBA_ZOOM_OUT, + TS_STATE_GBA_FLASH_SEND, + TS_STATE_GBA_STOP_FLASH_SEND, + TS_STATE_PAN_AWAY_GBA, + TS_STATE_CREATE_LINK_MON_LEAVING, + TS_STATE_LINK_MON_TRAVEL_OUT, + TS_STATE_FADE_OUT_TO_CROSSING, + TS_STATE_WAIT_FADE_OUT_TO_CROSSING, + TS_STATE_FADE_IN_TO_CROSSING, + TS_STATE_WAIT_FADE_IN_TO_CROSSING, + TS_STATE_CROSSING_LINK_MONS_ENTER, + TS_STATE_CROSSING_BLEND_WHITE_1, + TS_STATE_CROSSING_BLEND_WHITE_2, + TS_STATE_CROSSING_BLEND_WHITE_3, + TS_STATE_CROSSING_CREATE_MON_PICS, + TS_STATE_CROSSING_MON_PICS_MOVE, + TS_STATE_CROSSING_LINK_MONS_EXIT, + TS_STATE_CREATE_LINK_MON_ARRIVING, + TS_STATE_FADE_OUT_TO_GBA_RECV, + TS_STATE_WAIT_FADE_OUT_TO_GBA_RECV, + TS_STATE_LINK_MON_TRAVEL_IN, + TS_STATE_PAN_TO_GBA, + TS_STATE_DESTROY_LINK_MON, + TS_STATE_LINK_MON_ARRIVED_DELAY, + TS_STATE_MOVE_GBA_TO_CENTER, + TS_STATE_GBA_FLASH_RECV, + TS_STATE_UNUSED, + TS_STATE_GBA_STOP_FLASH_RECV, + TS_STATE_GBA_ZOOM_IN, + TS_STATE_FADE_OUT_TO_NEW_MON, + // 53-59 unused + TS_STATE_WAIT_FADE_OUT_TO_NEW_MON = 60, + TS_STATE_FADE_IN_TO_NEW_MON, + TS_STATE_WAIT_FADE_IN_TO_NEW_MON, + TS_STATE_POKEBALL_ARRIVE, + TS_STATE_FADE_POKEBALL_TO_NORMAL, + TS_STATE_POKEBALL_ARRIVE_WAIT, + TS_STATE_SHOW_NEW_MON, + TS_STATE_NEW_MON_MSG, + TS_STATE_TAKE_CARE_OF_MON, + TS_STATE_AFTER_NEW_MON_DELAY, + TS_STATE_CHECK_RIBBONS, + TS_STATE_END_LINK_TRADE, + TS_STATE_TRY_EVOLUTION, + TS_STATE_FADE_OUT_END, + TS_STATE_WAIT_FADE_OUT_END, + // Special states + TS_STATE_GBA_FLASH_SEND_WIRELESS = TS_STATE_GBA_FLASH_SEND + TS_WIRELESS_STATE, + TS_STATE_GBA_STOP_FLASH_SEND_WIRELESS, + TS_STATE_WAIT_WIRELESS_SIGNAL_SEND, + TS_STATE_PAN_TO_GBA_WIRELESS = TS_STATE_PAN_TO_GBA + TS_WIRELESS_STATE, + TS_STATE_DESTROY_LINK_MON_WIRELESS, + TS_STATE_WAIT_WIRELESS_SIGNAL_RECV, + TS_STATE_DELAY_FOR_MON_ANIM = 167, + TS_STATE_LINK_MON_TRAVEL_OFFSCREEN = 200, + TS_STATE_WAIT_FOR_MON_CRY = 267, +}; + static bool8 AnimateTradeSequenceCable(void) { u16 evoTarget; switch (sTradeData->state) { - case 0: - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = -180; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset; + case TS_STATE_START: + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = -180; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset; sTradeData->state++; sTradeData->cachedMapMusic = GetCurrentMapMusic(); PlayNewMapMusic(MUS_EVOLUTION); break; - case 1: + case TS_STATE_MON_SLIDE_IN: if (sTradeData->bg2hofs > 0) { - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x += 3; + // Sliding + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x += 3; sTradeData->bg2hofs -= 3; } else { - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = 0; + // Pokémon has arrived onscreen + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = 0; sTradeData->bg2hofs = 0; - sTradeData->state = 10; + sTradeData->state = TS_STATE_SEND_MSG; } break; - case 10: + case TS_STATE_SEND_MSG: StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); DrawTextOnTradeWindow(0, gStringVar4, 0); if (sTradeData->monSpecies[TRADE_PLAYER] != SPECIES_EGG) - { PlayCry1(sTradeData->monSpecies[TRADE_PLAYER], 0); - } - sTradeData->state = 11; + sTradeData->state = TS_STATE_BYE_BYE; sTradeData->timer = 0; break; - case 11: + case TS_STATE_BYE_BYE: if (++sTradeData->timer == 80) { - sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeData->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeData->monSpriteIds[0], gSprites[sTradeData->monSpriteIds[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); sTradeData->state++; StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); DrawTextOnTradeWindow(0, gStringVar4, 0); } break; - case 12: - if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + case TS_STATE_POKEBALL_DEPART: + if (gSprites[sTradeData->releasePokeballSpriteId].callback == SpriteCallbackDummy) { - sTradeData->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0); - gSprites[sTradeData->unk_D3].callback = sub_807E5D8; - DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); + sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0); + gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart; + DestroySprite(&gSprites[sTradeData->releasePokeballSpriteId]); sTradeData->state++; } break; - case 13: + case TS_STATE_POKEBALL_DEPART_WAIT: // The game waits here for the sprite to finish its animation sequence. break; - case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 20; + case TS_STATE_FADE_OUT_TO_GBA_SEND: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND; break; - case 20: + case TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(4); @@ -3348,42 +3469,40 @@ static bool8 AnimateTradeSequenceCable(void) sTradeData->state++; } break; - case 21: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + case TS_STATE_FADE_IN_TO_GBA_SEND: + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeData->state++; break; - case 22: + case TS_STATE_WAIT_FADE_IN_TO_GBA_SEND: if (!gPaletteFade.active) - { - sTradeData->state = 23; - } + sTradeData->state = TS_STATE_GBA_ZOOM_OUT; break; - case 23: - if (sTradeData->unk_EA > 0x100) + case TS_STATE_GBA_ZOOM_OUT: + if (sTradeData->gbaScale > 0x100) { - sTradeData->unk_EA -= 0x34; + sTradeData->gbaScale -= 0x34; } else { SetTradeSequenceBgGpuRegs(1); - sTradeData->unk_EA = 0x80; + sTradeData->gbaScale = 0x80; sTradeData->state++; sTradeData->timer = 0; } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + sTradeData->sXY = 0x8000 / sTradeData->gbaScale; break; - case 24: + case TS_STATE_GBA_FLASH_SEND: if (++sTradeData->timer > 20) { SetTradeBGAffine(); - sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0); + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); sTradeData->state++; } break; - case 25: - if (gSprites[sTradeData->unk_91].animEnded) + case TS_STATE_GBA_STOP_FLASH_SEND: + if (gSprites[sTradeData->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2); @@ -3391,192 +3510,183 @@ static bool8 AnimateTradeSequenceCable(void) sTradeData->state++; } break; - case 26: + case TS_STATE_PAN_AWAY_GBA: if (--sTradeData->bg1vofs == 316) - { sTradeData->state++; - } + if (sTradeData->bg1vofs == 328) - { - sTradeData->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0); - } + sTradeData->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0); break; - case 27: - sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 128, 80, 3); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, 80, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + case TS_STATE_CREATE_LINK_MON_LEAVING: + sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, 80, 3); + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, 80, 0); + StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL); sTradeData->state++; break; - case 28: + case TS_STATE_LINK_MON_TRAVEL_OUT: if ((sTradeData->bg1vofs -= 2) == 166) - { - sTradeData->state = 200; - } + sTradeData->state = TS_STATE_LINK_MON_TRAVEL_OFFSCREEN; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; - case 200: - gSprites[sTradeData->unk_90].pos1.y -= 2; - gSprites[sTradeData->unk_91].pos1.y -= 2; - if (gSprites[sTradeData->unk_90].pos1.y < -8) - { - sTradeData->state = 29; - } + case TS_STATE_LINK_MON_TRAVEL_OFFSCREEN: + gSprites[sTradeData->connectionSpriteId1].pos1.y -= 2; + gSprites[sTradeData->connectionSpriteId2].pos1.y -= 2; + if (gSprites[sTradeData->connectionSpriteId1].pos1.y < -8) + sTradeData->state = TS_STATE_FADE_OUT_TO_CROSSING; break; - case 29: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - sTradeData->state = 30; + case TS_STATE_FADE_OUT_TO_CROSSING: + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); + sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_CROSSING; break; - case 30: + case TS_STATE_WAIT_FADE_OUT_TO_CROSSING: if (!gPaletteFade.active) { - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(2); sTradeData->state++; } break; - case 31: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); + case TS_STATE_FADE_IN_TO_CROSSING: + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); + sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0); + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0); sTradeData->state++; break; - case 32: + case TS_STATE_WAIT_FADE_IN_TO_CROSSING: if (!gPaletteFade.active) { PlaySE(SE_WARP_OUT); sTradeData->state++; } - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; + gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; break; - case 33: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -90) + case TS_STATE_CROSSING_LINK_MONS_ENTER: + gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; + if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -90) { - gSprites[sTradeData->unk_90].data[1] = 1; - gSprites[sTradeData->unk_91].data[1] = 1; + gSprites[sTradeData->connectionSpriteId1].data[1] = 1; + gSprites[sTradeData->connectionSpriteId2].data[1] = 1; sTradeData->state++; } break; - case 34: + case TS_STATE_CROSSING_BLEND_WHITE_1: BlendPalettes(0x1, 16, RGB_WHITEALPHA); sTradeData->state++; break; - case 35: + case TS_STATE_CROSSING_BLEND_WHITE_2: BlendPalettes(0x1, 0, RGB_WHITEALPHA); sTradeData->state++; break; - case 36: + case TS_STATE_CROSSING_BLEND_WHITE_3: BlendPalettes(0x1, 16, RGB_WHITEALPHA); sTradeData->state++; break; - case 37: + case TS_STATE_CROSSING_CREATE_MON_PICS: if (!IsMonSpriteNotFlipped(sTradeData->monSpecies[TRADE_PLAYER])) { - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].affineAnims = gSpriteAffineAnimTable_8338ECC; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; - CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0); + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + CalcCenterToCornerVec(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); + StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0); } else { - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0); + StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0); } - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0); - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.x = 60; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 180; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.y = 192; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = -32; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = FALSE; + StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0); + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.x = 60; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 180; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.y = 192; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = -32; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = FALSE; sTradeData->state++; break; - case 38: - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y -= 3; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y += 3; - if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y >= -163) + case TS_STATE_CROSSING_MON_PICS_MOVE: + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y -= 3; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y += 3; + if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -DISPLAY_HEIGHT + && gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y >= -DISPLAY_HEIGHT - 3) { PlaySE(SE_WARP_IN); } - if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -222) + if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -222) { - gSprites[sTradeData->unk_90].data[1] = 0; - gSprites[sTradeData->unk_91].data[1] = 0; + gSprites[sTradeData->connectionSpriteId1].data[1] = 0; + gSprites[sTradeData->connectionSpriteId2].data[1] = 0; sTradeData->state++; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = TRUE; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = TRUE; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = TRUE; BlendPalettes(0x1, 0, RGB_WHITEALPHA); } break; - case 39: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -222) + case TS_STATE_CROSSING_LINK_MONS_EXIT: + gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; + if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -222) { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sTradeData->state++; - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); } break; - case 40: + case TS_STATE_CREATE_LINK_MON_ARRIVING: if (!gPaletteFade.active) { sTradeData->state++; SetTradeSequenceBgGpuRegs(1); sTradeData->bg1vofs = 166; - sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 128, -20, 3); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 128, -20, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, -20, 3); + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, -20, 0); + StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL); } break; - case 41: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + case TS_STATE_FADE_OUT_TO_GBA_RECV: + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeData->state++; break; - case 42: + case TS_STATE_WAIT_FADE_OUT_TO_GBA_RECV: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) - { sTradeData->state++; - } break; - case 43: - gSprites[sTradeData->unk_90].pos2.y += 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) + case TS_STATE_LINK_MON_TRAVEL_IN: + gSprites[sTradeData->connectionSpriteId1].pos2.y += 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; + if (gSprites[sTradeData->connectionSpriteId1].pos2.y + gSprites[sTradeData->connectionSpriteId1].pos1.y == 64) { sTradeData->state++; } break; - case 44: + case TS_STATE_PAN_TO_GBA: if ((sTradeData->bg1vofs += 2) > 316) { sTradeData->bg1vofs = 316; sTradeData->state++; } break; - case 45: - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); + case TS_STATE_DESTROY_LINK_MON: + DestroySprite(&gSprites[sTradeData->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); sTradeData->state++; sTradeData->timer = 0; break; - case 46: + case TS_STATE_LINK_MON_ARRIVED_DELAY: if (++sTradeData->timer == 10) - { sTradeData->state++; - } break; - case 47: + case TS_STATE_MOVE_GBA_TO_CENTER: if (++sTradeData->bg1vofs > 348) { sTradeData->bg1vofs = 348; @@ -3584,41 +3694,41 @@ static bool8 AnimateTradeSequenceCable(void) } if (sTradeData->bg1vofs == 328 && sTradeData->isCableTrade) { - sTradeData->unk_92 = CreateSprite(&gSpriteTemplate_8338DFC, 128, 65, 0); - gSprites[sTradeData->unk_92].callback = sub_807AAE0; + sTradeData->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0); + gSprites[sTradeData->cableEndSpriteId].callback = SpriteCB_CableEndReceiving; } break; - case 48: - sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0); - sTradeData->state = 50; + case TS_STATE_GBA_FLASH_RECV: + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); + sTradeData->state = TS_STATE_GBA_STOP_FLASH_RECV; break; - case 50: - if (gSprites[sTradeData->unk_91].animEnded) + case TS_STATE_GBA_STOP_FLASH_RECV: + if (gSprites[sTradeData->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(6); sTradeData->state++; PlaySE(SE_M_SAND_ATTACK); } break; - case 51: - if (sTradeData->unk_EA < 0x400) + case TS_STATE_GBA_ZOOM_IN: + if (sTradeData->gbaScale < 0x400) { - sTradeData->unk_EA += 0x34; + sTradeData->gbaScale += 0x34; } else { - sTradeData->unk_EA = 0x400; + sTradeData->gbaScale = 0x400; sTradeData->state++; } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + sTradeData->sXY = 0x8000 / sTradeData->gbaScale; break; - case 52: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 60; + case TS_STATE_FADE_OUT_TO_NEW_MON: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_NEW_MON; break; - case 60: + case TS_STATE_WAIT_FADE_OUT_TO_NEW_MON: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(5); @@ -3627,54 +3737,52 @@ static bool8 AnimateTradeSequenceCable(void) sTradeData->state++; } break; - case 61: + case TS_STATE_FADE_IN_TO_NEW_MON: gPaletteFade.bufferTransferDisabled = FALSE; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sTradeData->state++; break; - case 62: + case TS_STATE_WAIT_FADE_IN_TO_NEW_MON: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) - { sTradeData->state++; - } break; - case 63: - sTradeData->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0); - gSprites[sTradeData->unk_D3].data[3] = 74; - gSprites[sTradeData->unk_D3].callback = sub_807E6AC; - StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); - StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); - BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + case TS_STATE_POKEBALL_ARRIVE: + sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0); + gSprites[sTradeData->bouncingPokeballSpriteId].data[3] = 74; + gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive; + StartSpriteAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 1); + StartSpriteAffineAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 2); + BlendPalettes(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA); sTradeData->state++; sTradeData->timer = 0; break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + case TS_STATE_FADE_POKEBALL_TO_NORMAL: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); sTradeData->state++; break; - case 65: - if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) + case TS_STATE_POKEBALL_ARRIVE_WAIT: + if (gSprites[sTradeData->bouncingPokeballSpriteId].callback == SpriteCallbackDummy) { HandleLoadSpecialPokePic_2(&gMonFrontPicTable[sTradeData->monSpecies[TRADE_PARTNER]], gMonSpritesGfxPtr->sprites.ptr[3], sTradeData->monSpecies[TRADE_PARTNER], sTradeData->monPersonalities[TRADE_PARTNER]); sTradeData->state++; } break; - case 66: - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 120; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.x = 0; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y = 0; - StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0); - CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]); - FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); - DestroySprite(&gSprites[sTradeData->unk_D3]); + case TS_STATE_SHOW_NEW_MON: + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 120; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.x = 0; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y = 0; + StartSpriteAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0); + CreatePokeballSpriteToReleaseMon(sTradeData->monSpriteIds[TRADE_PARTNER], gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]); + FreeSpriteOamMatrix(&gSprites[sTradeData->bouncingPokeballSpriteId]); + DestroySprite(&gSprites[sTradeData->bouncingPokeballSpriteId]); sTradeData->state++; break; - case 67: + case TS_STATE_NEW_MON_MSG: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | @@ -3682,28 +3790,24 @@ static bool8 AnimateTradeSequenceCable(void) DISPCNT_OBJ_ON); StringExpandPlaceholders(gStringVar4, gText_XSentOverY); DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->state = 167; + sTradeData->state = TS_STATE_DELAY_FOR_MON_ANIM; sTradeData->timer = 0; break; - // 167 and 267 are extra cases added in for animations - case 167: + case TS_STATE_DELAY_FOR_MON_ANIM: if (++sTradeData->timer > 60) { - sTradeData->state = 267; + sTradeData->state = TS_STATE_WAIT_FOR_MON_CRY; sTradeData->timer = 0; } break; - case 267: + case TS_STATE_WAIT_FOR_MON_CRY: if (IsCryFinished()) - { - sTradeData->state = 68; - } + sTradeData->state = TS_STATE_TAKE_CARE_OF_MON; break; - case 68: + case TS_STATE_TAKE_CARE_OF_MON: if (++sTradeData->timer == 10) - { PlayFanfare(MUS_EVOLVED); - } + if (sTradeData->timer == 250) { sTradeData->state++; @@ -3712,17 +3816,15 @@ static bool8 AnimateTradeSequenceCable(void) sTradeData->timer = 0; } break; - case 69: + case TS_STATE_AFTER_NEW_MON_DELAY: if (++sTradeData->timer == 60) - { sTradeData->state++; - } break; - case 70: + case TS_STATE_CHECK_RIBBONS: CheckPartnersMonForRibbons(); sTradeData->state++; break; - case 71: + case TS_STATE_END_LINK_TRADE: if (sTradeData->isLinkTrade) { return TRUE; @@ -3732,21 +3834,21 @@ static bool8 AnimateTradeSequenceCable(void) sTradeData->state++; } break; - case 72: // Only if in-game trade + case TS_STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); gCB2_AfterEvolution = CB2_UpdateInGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], TRUE, ITEM_NONE); + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) { - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); } sTradeData->state++; break; - case 73: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + case TS_STATE_FADE_OUT_END: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeData->state++; break; - case 74: + case TS_STATE_WAIT_FADE_OUT_END: if (!gPaletteFade.active) { PlayNewMapMusic(sTradeData->cachedMapMusic); @@ -3773,65 +3875,63 @@ static bool8 AnimateTradeSequenceWireless(void) switch (sTradeData->state) { - case 0: - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = -180; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset; + case TS_STATE_START: + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = -180; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PLAYER]].y_offset; sTradeData->state++; sTradeData->cachedMapMusic = GetCurrentMapMusic(); PlayNewMapMusic(MUS_EVOLUTION); break; - case 1: + case TS_STATE_MON_SLIDE_IN: if (sTradeData->bg2hofs > 0) { - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x += 3; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x += 3; sTradeData->bg2hofs -= 3; } else { - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.x = 0; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.x = 0; sTradeData->bg2hofs = 0; - sTradeData->state = 10; + sTradeData->state = TS_STATE_SEND_MSG; } break; - case 10: + case TS_STATE_SEND_MSG: StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); DrawTextOnTradeWindow(0, gStringVar4, 0); if (sTradeData->monSpecies[TRADE_PLAYER] != SPECIES_EGG) - { PlayCry1(sTradeData->monSpecies[TRADE_PLAYER], 0); - } - sTradeData->state = 11; + sTradeData->state = TS_STATE_BYE_BYE; sTradeData->timer = 0; break; - case 11: + case TS_STATE_BYE_BYE: if (++sTradeData->timer == 80) { - sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeData->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeData->monSpriteIds[0], gSprites[sTradeData->monSpriteIds[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); sTradeData->state++; StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); DrawTextOnTradeWindow(0, gStringVar4, 0); } break; - case 12: - if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + case TS_STATE_POKEBALL_DEPART: + if (gSprites[sTradeData->releasePokeballSpriteId].callback == SpriteCallbackDummy) { - sTradeData->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, 32, 0); - gSprites[sTradeData->unk_D3].callback = sub_807E5D8; - DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); + sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0); + gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart; + DestroySprite(&gSprites[sTradeData->releasePokeballSpriteId]); sTradeData->state++; } break; - case 13: + case TS_STATE_POKEBALL_DEPART_WAIT: // The game waits here for the sprite to finish its animation sequence. break; - case 14: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 20; + case TS_STATE_FADE_OUT_TO_GBA_SEND: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND; break; - case 20: + case TS_STATE_WAIT_FADE_OUT_TO_GBA_SEND: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(4); @@ -3840,189 +3940,185 @@ static bool8 AnimateTradeSequenceWireless(void) sTradeData->state++; } break; - case 21: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + case TS_STATE_FADE_IN_TO_GBA_SEND: + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeData->state++; break; - case 22: + case TS_STATE_WAIT_FADE_IN_TO_GBA_SEND: if (!gPaletteFade.active) - { - sTradeData->state = 23; - } + sTradeData->state = TS_STATE_GBA_ZOOM_OUT; break; - case 23: - if (sTradeData->unk_EA > 0x100) + case TS_STATE_GBA_ZOOM_OUT: + if (sTradeData->gbaScale > 0x100) { - sTradeData->unk_EA -= 0x34; + sTradeData->gbaScale -= 0x34; } else { SetTradeSequenceBgGpuRegs(1); - sTradeData->unk_EA = 0x80; - sTradeData->state = 124; + sTradeData->gbaScale = 0x80; + sTradeData->state = TS_STATE_GBA_FLASH_SEND_WIRELESS; sTradeData->timer = 0; } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + sTradeData->sXY = 0x8000 / sTradeData->gbaScale; break; - case 124: + case TS_STATE_GBA_FLASH_SEND_WIRELESS: if (++sTradeData->timer > 20) { SetTradeSequenceBgGpuRegs(3); - sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E8C, 120, 80, 0); + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Short, 120, 80, 0); sTradeData->state++; } break; - case 125: - if (gSprites[sTradeData->unk_91].animEnded) + case TS_STATE_GBA_STOP_FLASH_SEND_WIRELESS: + if (gSprites[sTradeData->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); + + // Start wireless signal effect CreateTask(Task_AnimateWirelessSignal, 5); sTradeData->state++; } break; - case 126: + case TS_STATE_WAIT_WIRELESS_SIGNAL_SEND: if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) - { - sTradeData->state = 26; - } + sTradeData->state = TS_STATE_PAN_AWAY_GBA; break; - case 26: + case TS_STATE_PAN_AWAY_GBA: if (--sTradeData->bg1vofs == 316) - { sTradeData->state++; - } break; - case 27: - sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 120, 80, 3); - gSprites[sTradeData->unk_90].callback = sub_807AA4C; - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, 80, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + case TS_STATE_CREATE_LINK_MON_LEAVING: + sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, 80, 3); + gSprites[sTradeData->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless; + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, 80, 0); + StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL); sTradeData->state++; break; - case 28: + case TS_STATE_LINK_MON_TRAVEL_OUT: if ((sTradeData->bg1vofs -= 3) == 166) - { - sTradeData->state = 200; - } + sTradeData->state = TS_STATE_LINK_MON_TRAVEL_OFFSCREEN; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; - case 200: - gSprites[sTradeData->unk_90].pos1.y -= 2; - gSprites[sTradeData->unk_91].pos1.y -= 2; - if (gSprites[sTradeData->unk_90].pos1.y < -8) + case TS_STATE_LINK_MON_TRAVEL_OFFSCREEN: + gSprites[sTradeData->connectionSpriteId1].pos1.y -= 2; + gSprites[sTradeData->connectionSpriteId2].pos1.y -= 2; + if (gSprites[sTradeData->connectionSpriteId1].pos1.y < -8) { - sTradeData->state = 29; + sTradeData->state = TS_STATE_FADE_OUT_TO_CROSSING; } break; - case 29: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); - sTradeData->state = 30; + case TS_STATE_FADE_OUT_TO_CROSSING: + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); + sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_CROSSING; break; - case 30: + case TS_STATE_WAIT_FADE_OUT_TO_CROSSING: if (!gPaletteFade.active) { - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(2); sTradeData->state++; } break; - case 31: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); - sTradeData->unk_90 = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); + case TS_STATE_FADE_IN_TO_CROSSING: + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); + sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0); + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0); sTradeData->state++; break; - case 32: + case TS_STATE_WAIT_FADE_IN_TO_CROSSING: if (!gPaletteFade.active) { PlaySE(SE_WARP_OUT); sTradeData->state++; } - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; + gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; break; - case 33: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -90) + case TS_STATE_CROSSING_LINK_MONS_ENTER: + gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; + if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -90) { - gSprites[sTradeData->unk_90].data[1] = 1; - gSprites[sTradeData->unk_91].data[1] = 1; + gSprites[sTradeData->connectionSpriteId1].data[1] = 1; + gSprites[sTradeData->connectionSpriteId2].data[1] = 1; sTradeData->state++; - CreateTask(c3_0805465C, 5); + CreateTask(Task_NarrowWindowForCrossing_Wireless, 5); } break; - case 34: + case TS_STATE_CROSSING_BLEND_WHITE_1: BlendPalettes(0x8, 16, RGB_WHITEALPHA); sTradeData->state++; break; - case 35: + case TS_STATE_CROSSING_BLEND_WHITE_2: BlendPalettes(0x8, 16, RGB_WHITEALPHA); sTradeData->state++; break; - case 36: + case TS_STATE_CROSSING_BLEND_WHITE_3: BlendPalettes(0x8, 16, RGB_WHITEALPHA); sTradeData->state++; break; - case 37: + case TS_STATE_CROSSING_CREATE_MON_PICS: if (!IsMonSpriteNotFlipped(sTradeData->monSpecies[TRADE_PLAYER])) { - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].affineAnims = gSpriteAffineAnimTable_8338ECC; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; - CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0); + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + CalcCenterToCornerVec(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); + StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0); } else { - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]], 0); + StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]], 0); } - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0); - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.x = 40; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 200; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos1.y = 192; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = -32; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = FALSE; + StartSpriteAffineAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0); + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.x = 40; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 200; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos1.y = 192; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = -32; + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = FALSE; sTradeData->state++; break; - case 38: - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y -= 3; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y += 3; - if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -160 && gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y >= -163) + case TS_STATE_CROSSING_MON_PICS_MOVE: + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y -= 3; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y += 3; + if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -DISPLAY_HEIGHT + && gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y >= -DISPLAY_HEIGHT - 3) { PlaySE(SE_WARP_IN); } - if (gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].pos2.y < -222) + if (gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].pos2.y < -222) { - gSprites[sTradeData->unk_90].data[1] = 0; - gSprites[sTradeData->unk_91].data[1] = 0; + gSprites[sTradeData->connectionSpriteId1].data[1] = 0; + gSprites[sTradeData->connectionSpriteId2].data[1] = 0; sTradeData->state++; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].invisible = TRUE; - CreateTask(sub_807F39C, 5); + gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]].invisible = TRUE; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].invisible = TRUE; + CreateTask(Task_NarrowWindowForCrossing_Cable, 5); } break; - case 39: - gSprites[sTradeData->unk_90].pos2.y -= 3; - gSprites[sTradeData->unk_91].pos2.y += 3; - if (gSprites[sTradeData->unk_90].pos2.y <= -222) + case TS_STATE_CROSSING_LINK_MONS_EXIT: + gSprites[sTradeData->connectionSpriteId1].pos2.y -= 3; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 3; + if (gSprites[sTradeData->connectionSpriteId1].pos2.y <= -222) { - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sTradeData->state++; - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); } break; - case 40: + case TS_STATE_CREATE_LINK_MON_ARRIVING: if (!gPaletteFade.active) { sTradeData->state++; @@ -4030,36 +4126,34 @@ static bool8 AnimateTradeSequenceWireless(void) sTradeData->bg1vofs = 166; SetTradeSequenceBgGpuRegs(3); sTradeData->bg2vofs = 412; - sTradeData->unk_90 = CreateSprite(&gUnknown_08338D88, 120, -20, 3); - gSprites[sTradeData->unk_90].callback = sub_807AA4C; - sTradeData->unk_91 = CreateSprite(&sGlowBallSpriteTemplate, 120, -20, 0); - StartSpriteAnim(&gSprites[sTradeData->unk_91], 1); + sTradeData->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, -20, 3); + gSprites[sTradeData->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless; + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, -20, 0); + StartSpriteAnim(&gSprites[sTradeData->connectionSpriteId2], ANIM_LINKMON_SMALL); } break; - case 41: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + case TS_STATE_FADE_OUT_TO_GBA_RECV: + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); sTradeData->state++; break; - case 42: + case TS_STATE_WAIT_FADE_OUT_TO_GBA_RECV: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) - { sTradeData->state++; - } break; - case 43: - gSprites[sTradeData->unk_90].pos2.y += 4; - gSprites[sTradeData->unk_91].pos2.y += 4; - if (gSprites[sTradeData->unk_90].pos2.y + gSprites[sTradeData->unk_90].pos1.y == 64) + case TS_STATE_LINK_MON_TRAVEL_IN: + gSprites[sTradeData->connectionSpriteId1].pos2.y += 4; + gSprites[sTradeData->connectionSpriteId2].pos2.y += 4; + if (gSprites[sTradeData->connectionSpriteId1].pos2.y + gSprites[sTradeData->connectionSpriteId1].pos1.y == 64) { - sTradeData->state = 144; + sTradeData->state = TS_STATE_PAN_TO_GBA_WIRELESS; sTradeData->timer = 0; } break; - case 144: + case TS_STATE_PAN_TO_GBA_WIRELESS: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | @@ -4078,62 +4172,60 @@ static bool8 AnimateTradeSequenceWireless(void) sTradeData->state++; } break; - case 145: - DestroySprite(&gSprites[sTradeData->unk_90]); - DestroySprite(&gSprites[sTradeData->unk_91]); + case TS_STATE_DESTROY_LINK_MON_WIRELESS: + DestroySprite(&gSprites[sTradeData->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); sTradeData->state++; sTradeData->timer = 0; break; - case 146: + case TS_STATE_WAIT_WIRELESS_SIGNAL_RECV: if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) { - sTradeData->state = 46; + sTradeData->state = TS_STATE_LINK_MON_ARRIVED_DELAY; sTradeData->timer = 0; } break; - case 46: + case TS_STATE_LINK_MON_ARRIVED_DELAY: if (++sTradeData->timer == 10) - { sTradeData->state++; - } break; - case 47: + case TS_STATE_MOVE_GBA_TO_CENTER: if (++sTradeData->bg1vofs > 348) { sTradeData->bg1vofs = 348; sTradeData->state++; } break; - case 48: - sTradeData->unk_91 = CreateSprite(&gSpriteTemplate_8338E74, 120, 80, 0); - sTradeData->state = 50; + case TS_STATE_GBA_FLASH_RECV: + sTradeData->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); + sTradeData->state = TS_STATE_GBA_STOP_FLASH_RECV; break; - case 50: - if (gSprites[sTradeData->unk_91].animEnded) + case TS_STATE_GBA_STOP_FLASH_RECV: + if (gSprites[sTradeData->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->unk_91]); + DestroySprite(&gSprites[sTradeData->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(6); sTradeData->state++; PlaySE(SE_M_SAND_ATTACK); } break; - case 51: - if (sTradeData->unk_EA < 0x400) + case TS_STATE_GBA_ZOOM_IN: + if (sTradeData->gbaScale < 0x400) { - sTradeData->unk_EA += 0x34; + sTradeData->gbaScale += 0x34; } else { - sTradeData->unk_EA = 0x400; + sTradeData->gbaScale = 0x400; sTradeData->state++; } - sTradeData->sXY = 0x8000 / sTradeData->unk_EA; + sTradeData->sXY = 0x8000 / sTradeData->gbaScale; break; - case 52: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); - sTradeData->state = 60; + case TS_STATE_FADE_OUT_TO_NEW_MON: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + sTradeData->state = TS_STATE_WAIT_FADE_OUT_TO_NEW_MON; break; - case 60: + case TS_STATE_WAIT_FADE_OUT_TO_NEW_MON: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(5); @@ -4142,54 +4234,55 @@ static bool8 AnimateTradeSequenceWireless(void) sTradeData->state++; } break; - case 61: + case TS_STATE_FADE_IN_TO_NEW_MON: gPaletteFade.bufferTransferDisabled = FALSE; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sTradeData->state++; break; - case 62: + case TS_STATE_WAIT_FADE_IN_TO_NEW_MON: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) - { sTradeData->state++; - } break; - case 63: - sTradeData->unk_D3 = CreateSprite(&gSpriteTemplate_8338D28, 120, -8, 0); - gSprites[sTradeData->unk_D3].data[3] = 74; - gSprites[sTradeData->unk_D3].callback = sub_807E6AC; - StartSpriteAnim(&gSprites[sTradeData->unk_D3], 1); - StartSpriteAffineAnim(&gSprites[sTradeData->unk_D3], 2); - BlendPalettes(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 16, RGB_WHITEALPHA); + case TS_STATE_POKEBALL_ARRIVE: + sTradeData->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0); + gSprites[sTradeData->bouncingPokeballSpriteId].data[3] = 74; + gSprites[sTradeData->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive; + StartSpriteAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 1); + StartSpriteAffineAnim(&gSprites[sTradeData->bouncingPokeballSpriteId], 2); + BlendPalettes(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA); sTradeData->state++; sTradeData->timer = 0; break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->unk_D3].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + case TS_STATE_FADE_POKEBALL_TO_NORMAL: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); sTradeData->state++; break; - case 65: - if (gSprites[sTradeData->unk_D3].callback == SpriteCallbackDummy) + case TS_STATE_POKEBALL_ARRIVE_WAIT: + if (gSprites[sTradeData->bouncingPokeballSpriteId].callback == SpriteCallbackDummy) { - HandleLoadSpecialPokePic_2(&gMonFrontPicTable[sTradeData->monSpecies[TRADE_PARTNER]], gMonSpritesGfxPtr->sprites.ptr[3], sTradeData->monSpecies[TRADE_PARTNER], sTradeData->monPersonalities[TRADE_PARTNER]); + HandleLoadSpecialPokePic_2(&gMonFrontPicTable[sTradeData->monSpecies[TRADE_PARTNER]], + gMonSpritesGfxPtr->sprites.ptr[3], + sTradeData->monSpecies[TRADE_PARTNER], + sTradeData->monPersonalities[TRADE_PARTNER]); sTradeData->state++; } break; - case 66: - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.x = 120; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.x = 0; - gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].pos2.y = 0; - StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]], 0); - CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]); - FreeSpriteOamMatrix(&gSprites[sTradeData->unk_D3]); - DestroySprite(&gSprites[sTradeData->unk_D3]); + case TS_STATE_SHOW_NEW_MON: + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.x = 120; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos1.y = gMonFrontPicCoords[sTradeData->monSpecies[TRADE_PARTNER]].y_offset + 60; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.x = 0; + gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].pos2.y = 0; + StartSpriteAnim(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]], 0); + CreatePokeballSpriteToReleaseMon(sTradeData->monSpriteIds[TRADE_PARTNER], gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF, sTradeData->monSpecies[TRADE_PARTNER]); + FreeSpriteOamMatrix(&gSprites[sTradeData->bouncingPokeballSpriteId]); + DestroySprite(&gSprites[sTradeData->bouncingPokeballSpriteId]); sTradeData->state++; break; - case 67: + case TS_STATE_NEW_MON_MSG: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | @@ -4197,28 +4290,24 @@ static bool8 AnimateTradeSequenceWireless(void) DISPCNT_OBJ_ON); StringExpandPlaceholders(gStringVar4, gText_XSentOverY); DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->state = 167; + sTradeData->state = TS_STATE_DELAY_FOR_MON_ANIM; sTradeData->timer = 0; break; - // 167 and 267 are extra cases added in for animations - case 167: + case TS_STATE_DELAY_FOR_MON_ANIM: if (++sTradeData->timer > 60) { - sTradeData->state = 267; + sTradeData->state = TS_STATE_WAIT_FOR_MON_CRY; sTradeData->timer = 0; } break; - case 267: + case TS_STATE_WAIT_FOR_MON_CRY: if (IsCryFinished()) - { - sTradeData->state = 68; - } + sTradeData->state = TS_STATE_TAKE_CARE_OF_MON; break; - case 68: + case TS_STATE_TAKE_CARE_OF_MON: if (++sTradeData->timer == 10) - { PlayFanfare(MUS_EVOLVED); - } + if (sTradeData->timer == 250) { sTradeData->state++; @@ -4227,17 +4316,15 @@ static bool8 AnimateTradeSequenceWireless(void) sTradeData->timer = 0; } break; - case 69: + case TS_STATE_AFTER_NEW_MON_DELAY: if (++sTradeData->timer == 60) - { sTradeData->state++; - } break; - case 70: + case TS_STATE_CHECK_RIBBONS: CheckPartnersMonForRibbons(); sTradeData->state++; break; - case 71: + case TS_STATE_END_LINK_TRADE: if (sTradeData->isLinkTrade) { return TRUE; @@ -4247,21 +4334,21 @@ static bool8 AnimateTradeSequenceWireless(void) sTradeData->state++; } break; - case 72: // Only if in-game trade + case TS_STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); gCB2_AfterEvolution = CB2_UpdateInGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], TRUE, ITEM_NONE); + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) { - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); } sTradeData->state++; break; - case 73: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + case TS_STATE_FADE_OUT_END: + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sTradeData->state++; break; - case 74: + case TS_STATE_WAIT_FADE_OUT_END: if (!gPaletteFade.active) { PlayNewMapMusic(sTradeData->cachedMapMusic); @@ -4282,7 +4369,9 @@ static bool8 AnimateTradeSequenceWireless(void) return FALSE; } -static void CB2_TryTradeEvolution(void) +// Try to evolve a Pokémon received in a link trade +// In-game trades resolve evolution during the trade sequence, in TS_STATE_TRY_EVOLUTION +static void CB2_TryLinkTradeEvolution(void) { u16 evoTarget; switch (gMain.state) @@ -4293,9 +4382,9 @@ static void CB2_TryTradeEvolution(void) break; case 4: gCB2_AfterEvolution = CB2_SaveAndEndTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], TRUE, ITEM_NONE); + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->pokePicSpriteIdxs[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeData->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); else if (IsWirelessTrade()) SetMainCallback2(CB2_SaveAndEndWirelessTrade); else @@ -4318,7 +4407,7 @@ static void UpdateTradeFinishFlags(void) if (blockReceivedStatus & 0x01) { if (gBlockRecvBuffer[0][0] == LINKCMD_CONFIRM_FINISH_TRADE) - SetMainCallback2(CB2_TryTradeEvolution); + SetMainCallback2(CB2_TryLinkTradeEvolution); if (gBlockRecvBuffer[0][0] == LINKCMD_READY_FINISH_TRADE) sTradeData->playerLinkFlagFinishTrade = READY_FINISH_TRADE; @@ -4334,7 +4423,7 @@ static void UpdateTradeFinishFlags(void) } } -static void sub_807E55C(struct Sprite *sprite) +static void SpriteCB_BouncingPokeball(struct Sprite *sprite) { sprite->pos1.y += sprite->data[0] / 10; sprite->data[5] += sprite->data[1]; @@ -4355,7 +4444,7 @@ static void sub_807E55C(struct Sprite *sprite) } } -static void sub_807E5D8(struct Sprite *sprite) +static void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite) { sprite->pos2.y += sTradeBallVerticalVelocityTable[sprite->data[0]]; if (sprite->data[0] == 22) @@ -4363,13 +4452,13 @@ static void sub_807E5D8(struct Sprite *sprite) if (++ sprite->data[0] == 44) { PlaySE(SE_M_MEGA_KICK); - sprite->callback = sub_807E64C; + sprite->callback = SpriteCB_BouncingPokeballDepartEnd; sprite->data[0] = 0; BeginNormalPaletteFade(1 << (16 + sprite->oam.paletteNum), -1, 0, 16, RGB_WHITEALPHA); } } -static void sub_807E64C(struct Sprite *sprite) +static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite) { if (sprite->data[1] == 20) StartSpriteAffineAnim(sprite, 1); @@ -4379,12 +4468,12 @@ static void sub_807E64C(struct Sprite *sprite) if (++ sprite->data[0] == 23) { DestroySprite(sprite); - sTradeData->state = 14; // Resume the master trade animation + sTradeData->state = TS_STATE_FADE_OUT_TO_GBA_SEND; // Resume the master trade animation } } } -static void sub_807E6AC(struct Sprite *sprite) +static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -4436,7 +4525,7 @@ static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade) u8 isMail; struct Pokemon *pokemon = &gEnemyParty[0]; - CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, OT_ID_PRESET, inGameTrade->otId); + CreateMon(pokemon, inGameTrade->species, level, USE_RANDOM_IVS, TRUE, inGameTrade->personality, OT_ID_PRESET, inGameTrade->otId); SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); @@ -4509,8 +4598,8 @@ static void CB2_UpdateLinkTrade(void) { if (AnimateTradeSequence() == TRUE) { - DestroySprite(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PLAYER]]); - FreeSpriteOamMatrix(&gSprites[sTradeData->pokePicSpriteIdxs[TRADE_PARTNER]]); + DestroySprite(&gSprites[sTradeData->monSpriteIds[TRADE_PLAYER]]); + FreeSpriteOamMatrix(&gSprites[sTradeData->monSpriteIds[TRADE_PARTNER]]); TradeMons(gSelectedTradeMonPositions[TRADE_PLAYER], gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE); if (!IsWirelessTrade()) { @@ -4533,7 +4622,7 @@ static void CB2_TryFinishTrade(void) u8 mpId = TradeGetMultiplayerId(); if (IsWirelessTrade()) { - SetMainCallback2(CB2_TryTradeEvolution); + SetMainCallback2(CB2_TryLinkTradeEvolution); } else { @@ -4543,7 +4632,7 @@ static void CB2_TryFinishTrade(void) && sTradeData->partnerLinkFlagFinishTrade == READY_FINISH_TRADE) { sTradeData->linkData[0] = LINKCMD_CONFIRM_FINISH_TRADE; - Trade_SendData(sTradeData); + SendBlock(bitmask_all_link_players_but_self(), sTradeData->linkData, sizeof(sTradeData->linkData)); sTradeData->playerLinkFlagFinishTrade = FINISH_TRADE; sTradeData->partnerLinkFlagFinishTrade = FINISH_TRADE; } @@ -4667,7 +4756,7 @@ static void CB2_SaveAndEndTrade(void) case 6: if (_IsLinkTaskFinished()) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state ++; } break; @@ -4741,7 +4830,7 @@ void DoInGameTradeScene(void) { ScriptContext2_Enable(); CreateTask(Task_InGameTrade, 10); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); } static void Task_InGameTrade(u8 taskId) @@ -4794,16 +4883,16 @@ static void Task_AnimateWirelessSignal(u8 taskId) if (!signalComingBack) { if (paletteIdx == 256) - LoadPalette(sTradePal_Black, 0x30, 32); + LoadPalette(sWirelessSignalNone_Pal, 0x30, 32); else - LoadPalette(&sTradePal_WirelessSignalSend[paletteIdx], 0x30, 32); + LoadPalette(&sWirelessSignalSend_Pal[paletteIdx], 0x30, 32); } else { if (paletteIdx == 256) - LoadPalette(sTradePal_Black, 0x30, 32); + LoadPalette(sWirelessSignalNone_Pal, 0x30, 32); else - LoadPalette(&sTradePal_WirelessSignalReceive[paletteIdx], 0x30, 32); + LoadPalette(&sWirelessSignalRecv_Pal[paletteIdx], 0x30, 32); } if (sWirelessSignalTiming[idx][0] == 0 && counter == 0) @@ -4828,15 +4917,15 @@ static void Task_AnimateWirelessSignal(u8 taskId) #undef counter #undef signalComingBack -static void c3_0805465C(u8 taskId) +static void Task_NarrowWindowForCrossing_Wireless(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { - sTradeData->wirelessWinLeft = sTradeData->wirelessWinRight = 120; + sTradeData->wirelessWinLeft = sTradeData->wirelessWinRight = DISPLAY_WIDTH / 2; sTradeData->wirelessWinTop = 0; - sTradeData->wirelessWinBottom = 160; + sTradeData->wirelessWinBottom = DISPLAY_HEIGHT; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | @@ -4852,19 +4941,17 @@ static void c3_0805465C(u8 taskId) sTradeData->wirelessWinRight += 5; if (sTradeData->wirelessWinLeft < 80) - { DestroyTask(taskId); - } } -static void sub_807F39C(u8 taskId) +static void Task_NarrowWindowForCrossing_Cable(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { sTradeData->wirelessWinLeft = 80; - sTradeData->wirelessWinRight = 160; + sTradeData->wirelessWinRight = DISPLAY_WIDTH - 80; SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG1 | @@ -4874,13 +4961,13 @@ static void sub_807F39C(u8 taskId) SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->wirelessWinLeft, sTradeData->wirelessWinRight)); SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->wirelessWinTop, sTradeData->wirelessWinBottom)); - if (sTradeData->wirelessWinLeft != 120) + if (sTradeData->wirelessWinLeft != DISPLAY_WIDTH / 2) { data[0]++; sTradeData->wirelessWinLeft += 5; sTradeData->wirelessWinRight -= 5; - if (sTradeData->wirelessWinLeft >= 116) + if (sTradeData->wirelessWinLeft > DISPLAY_WIDTH / 2 - 5) BlendPalettes(0x8, 0, RGB_WHITEALPHA); } else @@ -4974,7 +5061,7 @@ static void CB2_SaveAndEndWirelessTrade(void) if (_IsLinkTaskFinished()) { FadeOutBGM(3); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state = 11; } break; diff --git a/src/trainer_card.c b/src/trainer_card.c index 2d9ec2b09..1ec519c90 100755 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -80,7 +80,7 @@ struct TrainerCardData u8 cardTiles[0x2300]; u16 cardTilemapBuffer[0x1000]; u16 bgTilemapBuffer[0x1000]; - u16 var_7CA8; + u16 cardTop; u8 language; }; @@ -113,7 +113,7 @@ static void SetPlayerCardData(struct TrainerCard*, u8); static void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard*); static u8 VersionToCardType(u8); static void SetDataFromTrainerCard(void); -static void HandleGpuRegs(void); +static void InitGpuRegs(void); static void ResetGpuRegs(void); static void InitBgsAndWindows(void); static void SetTrainerCardCb2(void); @@ -158,31 +158,30 @@ static bool8 Task_DrawFlippedCardSide(struct Task* task); static bool8 Task_SetCardFlipped(struct Task* task); static bool8 Task_AnimateCardFlipUp(struct Task* task); static bool8 Task_EndCardFlip(struct Task* task); -static void sub_80C32EC(u16); +static void UpdateCardFlipRegs(u16); static void LoadMonIconGfx(void); -// const rom data -static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz"); -static const u16 sUnused_0856F18C[] = INCBIN_U16("graphics/trainer_card/unknown_56F18C.gbapal"); -static const u16 sHoennTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal"); -static const u16 sKantoTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal"); -static const u16 sHoennTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal"); -static const u16 sKantoTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal"); -static const u16 sHoennTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal"); -static const u16 sKantoTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal"); -static const u16 sHoennTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal"); -static const u16 sKantoTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal"); +static const u32 sTrainerCardStickers_Gfx[] = INCBIN_U32("graphics/trainer_card/stickers_fr.4bpp.lz"); +static const u16 sUnused_Pal[] = INCBIN_U16("graphics/trainer_card/unused.gbapal"); +static const u16 sHoennTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star.gbapal"); +static const u16 sKantoTrainerCard1Star_Pal[] = INCBIN_U16("graphics/trainer_card/one_star_fr.gbapal"); +static const u16 sHoennTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars.gbapal"); +static const u16 sKantoTrainerCard2Star_Pal[] = INCBIN_U16("graphics/trainer_card/two_stars_fr.gbapal"); +static const u16 sHoennTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars.gbapal"); +static const u16 sKantoTrainerCard3Star_Pal[] = INCBIN_U16("graphics/trainer_card/three_stars_fr.gbapal"); +static const u16 sHoennTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars.gbapal"); +static const u16 sKantoTrainerCard4Star_Pal[] = INCBIN_U16("graphics/trainer_card/four_stars_fr.gbapal"); static const u16 sHoennTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg.gbapal"); static const u16 sKantoTrainerCardFemaleBg_Pal[] = INCBIN_U16("graphics/trainer_card/female_bg_fr.gbapal"); -static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); -static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal"); -static const u16 sTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal"); -static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal"); -static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal"); -static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal"); -static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal"); -static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); -static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz"); +static const u16 sHoennTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges.gbapal"); +static const u16 sKantoTrainerCardBadges_Pal[] = INCBIN_U16("graphics/trainer_card/badges_fr.gbapal"); +static const u16 sTrainerCardGold_Pal[] = INCBIN_U16("graphics/trainer_card/gold.gbapal"); +static const u16 sTrainerCardSticker1_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr1.gbapal"); +static const u16 sTrainerCardSticker2_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr2.gbapal"); +static const u16 sTrainerCardSticker3_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr3.gbapal"); +static const u16 sTrainerCardSticker4_Pal[] = INCBIN_U16("graphics/trainer_card/stickers_fr4.gbapal"); +static const u32 sHoennTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges.4bpp.lz"); +static const u32 sKantoTrainerCardBadges_Gfx[] = INCBIN_U32("graphics/trainer_card/badges_fr.4bpp.lz"); static const struct BgTemplate sTrainerCardBgTemplates[4] = { @@ -274,7 +273,7 @@ static const u16 *const sKantoTrainerCardStarPals[] = sKantoTrainerCard4Star_Pal, }; -static const u8 sTrainerCardTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; +static const u8 sTrainerCardTextColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; static const u8 sTrainerCardStatColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}; static const u8 sTimeColonInvisibleTextColors[6] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT, TEXT_COLOR_TRANSPARENT}; @@ -321,7 +320,6 @@ static bool8 (*const sTrainerCardFlipTasks[])(struct Task *) = Task_EndCardFlip, }; -// code static void VblankCb_TrainerCard(void) { LoadOam(); @@ -414,8 +412,8 @@ static void Task_TrainerCard(u8 taskId) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(230, 150); } - BlendPalettes(0xFFFFFFFF, 16, sData->blendColor); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, sData->blendColor); + BlendPalettes(PALETTES_ALL, 16, sData->blendColor); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, sData->blendColor); SetVBlankCallback(VblankCb_TrainerCard); sData->mainState++; break; @@ -452,13 +450,13 @@ static void Task_TrainerCard(u8 taskId) } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, sData->blendColor); sData->mainState = STATE_CLOSE_CARD; } } break; case STATE_WAIT_FLIP_TO_BACK: - if (IsCardFlipTaskActive() && sub_8087598() != TRUE) + if (IsCardFlipTaskActive() && Overworld_LinkRecvQueueLengthMoreThan2() != TRUE) { PlaySE(SE_RG_CARD_OPEN); sData->mainState = STATE_HANDLE_INPUT_BACK; @@ -473,7 +471,7 @@ static void Task_TrainerCard(u8 taskId) } else if (gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, sData->blendColor); sData->mainState = STATE_CLOSE_CARD; } else @@ -491,7 +489,7 @@ static void Task_TrainerCard(u8 taskId) } else { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, sData->blendColor); sData->mainState = STATE_CLOSE_CARD; } } @@ -506,7 +504,7 @@ static void Task_TrainerCard(u8 taskId) case STATE_CLOSE_CARD_LINK: if (!gReceivedRemoteLinkPlayers) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, sData->blendColor); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, sData->blendColor); sData->mainState = STATE_CLOSE_CARD; } break; @@ -515,7 +513,7 @@ static void Task_TrainerCard(u8 taskId) CloseTrainerCard(taskId); break; case STATE_WAIT_FLIP_TO_FRONT: - if (IsCardFlipTaskActive() && sub_8087598() != TRUE) + if (IsCardFlipTaskActive() && Overworld_LinkRecvQueueLengthMoreThan2() != TRUE) { sData->mainState = STATE_HANDLE_INPUT_FRONT; PlaySE(SE_RG_CARD_OPEN); @@ -620,7 +618,7 @@ static void CB2_InitTrainerCard(void) gMain.state++; break; case 8: - HandleGpuRegs(); + InitGpuRegs(); gMain.state++; break; case 9: @@ -663,7 +661,7 @@ u32 CountPlayerTrainerStars(void) stars++; if (HasAllHoennMons()) stars++; - if (CountPlayerContestPaintings() > 4) + if (CountPlayerMuseumPaintings() >= CONTEST_CATEGORIES_COUNT) stars++; if (HasAllFrontierSymbols()) stars++; @@ -737,7 +735,7 @@ static void SetPlayerCardData(struct TrainerCard *trainerCard, u8 cardType) case CARD_TYPE_FRLG: trainerCard->contestsWithFriends = GetCappedGameStat(GAME_STAT_WON_LINK_CONTEST, 999); trainerCard->pokeblocksWithFriends = GetCappedGameStat(GAME_STAT_POKEBLOCKS_WITH_FRIENDS, 0xFFFF); - if (CountPlayerContestPaintings() > 4) + if (CountPlayerMuseumPaintings() >= CONTEST_CATEGORIES_COUNT) trainerCard->hasAllPaintings = TRUE; trainerCard->stars = GetRubyTrainerStars(trainerCard); break; @@ -841,7 +839,7 @@ static void SetDataFromTrainerCard(void) } } -static void HandleGpuRegs(void) +static void InitGpuRegs(void) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); @@ -852,24 +850,23 @@ static void HandleGpuRegs(void) SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ); - SetGpuReg(REG_OFFSET_WIN0V, 160); - SetGpuReg(REG_OFFSET_WIN0H, 240); + SetGpuReg(REG_OFFSET_WIN0V, DISPLAY_HEIGHT); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); if (gReceivedRemoteLinkPlayers) EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); else EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_HBLANK); } -// Part of animating card flip -static void sub_80C32EC(u16 arg0) +static void UpdateCardFlipRegs(u16 cardTop) { - s8 quotient = (arg0 + 40) / 10; + s8 blendY = (cardTop + 40) / 10; - if (quotient <= 4) - quotient = 0; - sData->flipBlendY = quotient; + if (blendY <= 4) + blendY = 0; + sData->flipBlendY = blendY; SetGpuReg(REG_OFFSET_BLDY, sData->flipBlendY); - SetGpuReg(REG_OFFSET_WIN0V, (sData->var_7CA8 * 256) | (160 - sData->var_7CA8)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(sData->cardTop, DISPLAY_HEIGHT - sData->cardTop)); } static void ResetGpuRegs(void) @@ -1578,6 +1575,7 @@ u8 GetTrainerCardStars(u8 cardId) } #define tFlipState data[0] +#define tCardTop data[1] static void FlipTrainerCard(void) { @@ -1588,7 +1586,7 @@ static void FlipTrainerCard(void) static bool8 IsCardFlipTaskActive(void) { - if (FindTaskIdByFunc(Task_DoCardFlipTask) == 0xFF) + if (FindTaskIdByFunc(Task_DoCardFlipTask) == TASK_NONE) return TRUE; else return FALSE; @@ -1608,41 +1606,43 @@ static bool8 Task_BeginCardFlip(struct Task* task) HideBg(3); ScanlineEffect_Stop(); ScanlineEffect_Clear(); - for (i = 0; i < 160; i++) + for (i = 0; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[1][i] = 0; task->tFlipState++; return FALSE; } +// Note: Cannot be DISPLAY_HEIGHT / 2, or cardHeight will be 0 +#define CARD_FLIP_Y ((DISPLAY_HEIGHT / 2) - 3) + static bool8 Task_AnimateCardFlipDown(struct Task* task) { - u32 r4, r5, r10, r7, r6, var_24, r9, var; + u32 cardHeight, r5, r10, cardTop, r6, var_24, cardBottom, var; s16 i; sData->allowDMACopy = FALSE; - if (task->data[1] >= 77) - task->data[1] = 77; + if (task->tCardTop >= CARD_FLIP_Y) + task->tCardTop = CARD_FLIP_Y; else - task->data[1] += 7; - - sData->var_7CA8 = task->data[1]; - sub_80C32EC(task->data[1]); - - // ??? - r7 = task->data[1]; - r9 = 160 - r7; - r4 = r9 - r7; - r6 = -r7 << 16; - r5 = 0xA00000 / r4; - r5 += 0xFFFF0000; + task->tCardTop += 7; + + sData->cardTop = task->tCardTop; + UpdateCardFlipRegs(task->tCardTop); + + cardTop = task->tCardTop; + cardBottom = DISPLAY_HEIGHT - cardTop; + cardHeight = cardBottom - cardTop; + r6 = -cardTop << 16; + r5 = (DISPLAY_HEIGHT << 16) / cardHeight; + r5 -= 1 << 16; var_24 = r6; - var_24 += r5 * r4; - r10 = r5 / r4; + var_24 += r5 * cardHeight; + r10 = r5 / cardHeight; r5 *= 2; - for (i = 0; i < r7; i++) + for (i = 0; i < cardTop; i++) gScanlineEffectRegBuffers[0][i] = -i; - for (; i < (s16)(r9); i++) + for (; i < (s16)cardBottom; i++) { var = r6 >> 16; r6 += r5; @@ -1650,11 +1650,11 @@ static bool8 Task_AnimateCardFlipDown(struct Task* task) gScanlineEffectRegBuffers[0][i] = var; } var = var_24 >> 16; - for (; i < 160; i++) + for (; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[0][i] = var; sData->allowDMACopy = TRUE; - if (task->data[1] >= 77) + if (task->tCardTop >= CARD_FLIP_Y) task->tFlipState++; return FALSE; @@ -1663,7 +1663,7 @@ static bool8 Task_AnimateCardFlipDown(struct Task* task) static bool8 Task_DrawFlippedCardSide(struct Task* task) { sData->allowDMACopy = FALSE; - if (sub_8087598() == TRUE) + if (Overworld_LinkRecvQueueLengthMoreThan2() == TRUE) return FALSE; do @@ -1736,33 +1736,32 @@ static bool8 Task_SetCardFlipped(struct Task* task) static bool8 Task_AnimateCardFlipUp(struct Task* task) { - u32 r4, r5, r10, r7, r6, var_24, r9, var; + u32 cardHeight, r5, r10, cardTop, r6, var_24, cardBottom, var; s16 i; sData->allowDMACopy = FALSE; - if (task->data[1] <= 5) - task->data[1] = 0; + if (task->tCardTop <= 5) + task->tCardTop = 0; else - task->data[1] -= 5; - - sData->var_7CA8 = task->data[1]; - sub_80C32EC(task->data[1]); - - // ??? - r7 = task->data[1]; - r9 = 160 - r7; - r4 = r9 - r7; - r6 = -r7 << 16; - r5 = 0xA00000 / r4; - r5 += 0xFFFF0000; + task->tCardTop -= 5; + + sData->cardTop = task->tCardTop; + UpdateCardFlipRegs(task->tCardTop); + + cardTop = task->tCardTop; + cardBottom = DISPLAY_HEIGHT - cardTop; + cardHeight = cardBottom - cardTop; + r6 = -cardTop << 16; + r5 = (DISPLAY_HEIGHT << 16) / cardHeight; + r5 -= 1 << 16; var_24 = r6; - var_24 += r5 * r4; - r10 = r5 / r4; + var_24 += r5 * cardHeight; + r10 = r5 / cardHeight; r5 /= 2; - for (i = 0; i < r7; i++) + for (i = 0; i < cardTop; i++) gScanlineEffectRegBuffers[0][i] = -i; - for (; i < (s16)(r9); i++) + for (; i < (s16)cardBottom; i++) { var = r6 >> 16; r6 += r5; @@ -1770,11 +1769,11 @@ static bool8 Task_AnimateCardFlipUp(struct Task* task) gScanlineEffectRegBuffers[0][i] = var; } var = var_24 >> 16; - for (; i < 160; i++) + for (; i < DISPLAY_HEIGHT; i++) gScanlineEffectRegBuffers[0][i] = var; sData->allowDMACopy = TRUE; - if (task->data[1] <= 0) + if (task->tCardTop <= 0) task->tFlipState++; return FALSE; diff --git a/src/trainer_hill.c b/src/trainer_hill.c index 18d56723c..3ce90c430 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -74,7 +74,7 @@ static void GetChallengeWon(void); static void TrainerHillSetTag(void); static void SetUpDataStruct(void); static void FreeDataStruct(void); -static void nullsub_2(void); +static void TrainerHillDummy(void); static void SetTimerValue(u32 *dst, u32 val); static u32 GetTimerValue(u32 *src); static void SetTrainerHillMonLevel(struct Pokemon *mon, u8 level); @@ -202,7 +202,7 @@ static const u16 *const *const sPrizeListSets[] = }; static const u16 sEReader_Pal[] = INCBIN_U16("graphics/misc/trainer_hill_ereader.gbapal"); -static const u8 sRecordWinColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY}; +static const u8 sRecordWinColors[] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY}; static const struct TrHillTag *const sDataPerTag[] = { @@ -358,7 +358,7 @@ static void SetUpDataStruct(void) sHillData = AllocZeroed(sizeof(*sHillData)); sHillData->floorId = gMapHeader.mapLayoutId - LAYOUT_TRAINER_HILL_1F; CpuCopy32(sDataPerTag[gSaveBlock1Ptr->trainerHill.tag], &sHillData->tag, sizeof(sHillData->tag) + 4 * sizeof(struct TrHillFloor)); - nullsub_2(); + TrainerHillDummy(); } } @@ -397,7 +397,7 @@ void CopyTrainerHillTrainerText(u8 which, u16 trainerId) static void TrainerHillStartChallenge(void) { - nullsub_2(); + TrainerHillDummy(); if (!ReadTrainerHillAndValidate()) gSaveBlock1Ptr->trainerHill.field_3D6E_0f = 1; else @@ -573,12 +573,12 @@ static void IsTrainerHillChallengeActive(void) gSpecialVar_Result = TRUE; } -void nullsub_129(void) +static void TrainerHillDummy_Unused(void) { } -static void nullsub_2(void) +static void TrainerHillDummy(void) { } @@ -678,10 +678,10 @@ static u16 GetMetatileForFloor(u8 floorId, u32 x, u32 y, u32 stride) // stride i u16 elevation; impassable = (sHillData->floors[floorId].display.collisionData[y] >> (15 - x) & 1); - metatile = sHillData->floors[floorId].display.metatileData[stride * y + x] + 0x200; - elevation = 0x3000; + metatile = sHillData->floors[floorId].display.metatileData[stride * y + x] + NUM_METATILES_IN_PRIMARY; + elevation = 3 << METATILE_ELEVATION_SHIFT; - return (((impassable << 10) & METATILE_COLLISION_MASK) | elevation) | (metatile & METATILE_ID_MASK); + return ((impassable << METATILE_COLLISION_SHIFT) & METATILE_COLLISION_MASK) | elevation | (metatile & METATILE_ID_MASK); } void GenerateTrainerHillFloorLayout(u16 *mapArg) @@ -710,6 +710,8 @@ void GenerateTrainerHillFloorLayout(u16 *mapArg) gBackupMapLayout.width = 31; gBackupMapLayout.height = 35; dst = mapArg + 224; + + // First 5 rows of the map (Entrance / Exit) are always the same for (i = 0; i < 5; i++) { for (j = 0; j < 16; j++) @@ -718,10 +720,11 @@ void GenerateTrainerHillFloorLayout(u16 *mapArg) src += 16; } + // Load the 16x16 floor-specific layout for (i = 0; i < 16; i++) { for (j = 0; j < 16; j++) - dst[j] = GetMetatileForFloor(mapId, j, i, 0x10); + dst[j] = GetMetatileForFloor(mapId, j, i, 16); dst += 31; } diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index c23047b01..477c11faf 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -137,7 +137,7 @@ static void LoadPicPaletteBySlot(u16 species, u32 otId, u32 personality, u8 pale static void AssignSpriteAnimsTable(bool8 isTrainer) { if (!isTrainer) - sCreatingSpriteTemplate.anims = gUnknown_082FF70C; + sCreatingSpriteTemplate.anims = gAnims_MonPic; else sCreatingSpriteTemplate.anims = gTrainerFrontAnimsPtrTable[0]; } @@ -262,12 +262,12 @@ u16 CreatePicSprite2(u16 species, u32 otId, u32 personality, u8 flags, s16 x, s1 sCreatingSpriteTemplate.images = images; if (flags2 == 0x01) { - sCreatingSpriteTemplate.affineAnims = gUnknown_082FF694; + sCreatingSpriteTemplate.affineAnims = gAffineAnims_BattleSpriteOpponentSide; sCreatingSpriteTemplate.oam = &gUnknown_0860B06C; } else if (flags2 == 0x00) { - sCreatingSpriteTemplate.affineAnims = gUnknown_082FF618; + sCreatingSpriteTemplate.affineAnims = gAffineAnims_BattleSpritePlayerSide; sCreatingSpriteTemplate.oam = &gUnknown_0860B06C; } else diff --git a/src/trainer_see.c b/src/trainer_see.c index 46fafa7e3..155c84cbe 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -23,9 +23,9 @@ static u8 CheckTrainer(u8 objectEventId); static u8 GetTrainerApproachDistance(struct ObjectEvent *trainerObj); static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction); -static void TrainerApproachPlayer(struct ObjectEvent *trainerObj, u8 range); +static void InitTrainerApproachTask(struct ObjectEvent *trainerObj, u8 range); static void Task_RunTrainerSeeFuncList(u8 taskId); -static void Task_DestroyTrainerApproachTask(u8 taskId); +static void Task_EndTrainerApproach(u8 taskId); static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum); static u8 GetTrainerApproachDistanceSouth(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y); @@ -33,7 +33,7 @@ static u8 GetTrainerApproachDistanceNorth(struct ObjectEvent *trainerObj, s16 ra static u8 GetTrainerApproachDistanceWest(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y); static u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 range, s16 x, s16 y); -static bool8 sub_80B4178(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); +static bool8 TrainerSeeIdle(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); static bool8 TrainerExclamationMark(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); static bool8 WaitTrainerExclamationMark(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); static bool8 TrainerMoveToPlayer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); @@ -41,10 +41,10 @@ static bool8 PlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct O static bool8 WaitPlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); static bool8 RevealDisguisedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); static bool8 WaitRevealDisguisedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); -static bool8 RevealHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); -static bool8 PopOutOfAshHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); -static bool8 JumpInPlaceHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); -static bool8 WaitRevealHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); +static bool8 RevealBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); +static bool8 PopOutOfAshBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); +static bool8 JumpInPlaceBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); +static bool8 WaitRevealBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj); static void SpriteCB_TrainerIcons(struct Sprite *sprite); @@ -71,28 +71,43 @@ static u8 (*const sDirectionalApproachDistanceFuncs[])(struct ObjectEvent *train GetTrainerApproachDistanceEast, }; +enum { + TRSEE_NONE, + TRSEE_EXCLAMATION, + TRSEE_EXCLAMATION_WAIT, + TRSEE_MOVE_TO_PLAYER, + TRSEE_PLAYER_FACE, + TRSEE_PLAYER_FACE_WAIT, + TRSEE_REVEAL_DISGUISE, + TRSEE_REVEAL_DISGUISE_WAIT, + TRSEE_REVEAL_BURIED, + TRSEE_BURIED_POP_OUT, + TRSEE_BURIED_JUMP, + TRSEE_REVEAL_BURIED_WAIT, +}; + static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) = { - sub_80B4178, - TrainerExclamationMark, - WaitTrainerExclamationMark, - TrainerMoveToPlayer, - PlayerFaceApproachingTrainer, - WaitPlayerFaceApproachingTrainer, - RevealDisguisedTrainer, - WaitRevealDisguisedTrainer, - RevealHiddenTrainer, - PopOutOfAshHiddenTrainer, - JumpInPlaceHiddenTrainer, - WaitRevealHiddenTrainer, + [TRSEE_NONE] = TrainerSeeIdle, + [TRSEE_EXCLAMATION] = TrainerExclamationMark, + [TRSEE_EXCLAMATION_WAIT] = WaitTrainerExclamationMark, + [TRSEE_MOVE_TO_PLAYER] = TrainerMoveToPlayer, + [TRSEE_PLAYER_FACE] = PlayerFaceApproachingTrainer, + [TRSEE_PLAYER_FACE_WAIT] = WaitPlayerFaceApproachingTrainer, + [TRSEE_REVEAL_DISGUISE] = RevealDisguisedTrainer, + [TRSEE_REVEAL_DISGUISE_WAIT] = WaitRevealDisguisedTrainer, + [TRSEE_REVEAL_BURIED] = RevealBuriedTrainer, + [TRSEE_BURIED_POP_OUT] = PopOutOfAshBuriedTrainer, + [TRSEE_BURIED_JUMP] = JumpInPlaceBuriedTrainer, + [TRSEE_REVEAL_BURIED_WAIT] = WaitRevealBuriedTrainer, }; static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) = { - RevealHiddenTrainer, - PopOutOfAshHiddenTrainer, - JumpInPlaceHiddenTrainer, - WaitRevealHiddenTrainer, + RevealBuriedTrainer, + PopOutOfAshBuriedTrainer, + JumpInPlaceBuriedTrainer, + WaitRevealBuriedTrainer, }; static const struct OamData sOamData_Icons = @@ -164,7 +179,7 @@ static const struct SpriteTemplate sSpriteTemplate_ExclamationQuestionMark = static const struct SpriteTemplate sSpriteTemplate_HeartIcon = { .tileTag = 0xffff, - .paletteTag = 0x1004, + .paletteTag = FLDEFF_PAL_TAG_GENERAL_0, .oam = &sOamData_Icons, .anims = sSpriteAnimTable_Icons, .images = sSpriteImageTable_HeartIcon, @@ -233,7 +248,7 @@ bool8 CheckForTrainersWantingBattle(void) static u8 CheckTrainer(u8 objectEventId) { const u8 *scriptPtr; - u8 ret = 1; + u8 numTrainers = 1; u8 approachDistance; if (InTrainerHill() == TRUE) @@ -268,16 +283,16 @@ static u8 CheckTrainer(u8 objectEventId) if (GetMonsStateToDoubles_2() != 0) return 0; - ret = 2; + numTrainers = 2; } gApproachingTrainers[gNoOfApproachingTrainers].objectEventId = objectEventId; gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr; gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance; - TrainerApproachPlayer(&gObjectEvents[objectEventId], approachDistance - 1); + InitTrainerApproachTask(&gObjectEvents[objectEventId], approachDistance - 1); gNoOfApproachingTrainers++; - return ret; + return numTrainers; } return 0; @@ -357,8 +372,7 @@ static u8 GetTrainerApproachDistanceEast(struct ObjectEvent *trainerObj, s16 ran static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 approachDistance, u8 direction) { s16 x, y; - u8 unk19_temp; - u8 unk19b_temp; + u8 rangeX, rangeY; u8 i; u8 collision; @@ -376,17 +390,16 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap return 0; } - // preserve mapobj_unk_19 before clearing. - unk19_temp = trainerObj->rangeX; - unk19b_temp = trainerObj->rangeY; + rangeX = trainerObj->rangeX; + rangeY = trainerObj->rangeY; trainerObj->rangeX = 0; trainerObj->rangeY = 0; collision = GetCollisionAtCoords(trainerObj, x, y, direction); - trainerObj->rangeX = unk19_temp; - trainerObj->rangeY = unk19b_temp; - if (collision == 4) + trainerObj->rangeX = rangeX; + trainerObj->rangeY = rangeY; + if (collision == COLLISION_OBJECT_EVENT) return approachDistance; return 0; @@ -397,7 +410,7 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap #define tOutOfAshSpriteId data[4] #define tTrainerObjectEventId data[7] -static void TrainerApproachPlayer(struct ObjectEvent *trainerObj, u8 range) +static void InitTrainerApproachTask(struct ObjectEvent *trainerObj, u8 range) { struct Task *task; @@ -407,7 +420,7 @@ static void TrainerApproachPlayer(struct ObjectEvent *trainerObj, u8 range) task->tTrainerObjectEventId = gApproachingTrainers[gNoOfApproachingTrainers].objectEventId; } -static void sub_80B40C8(TaskFunc followupFunc) +static void StartTrainerApproach(TaskFunc followupFunc) { u8 taskId; TaskFunc taskFunc; @@ -419,7 +432,7 @@ static void sub_80B40C8(TaskFunc followupFunc) taskFunc = Task_RunTrainerSeeFuncList; SetTaskFuncWithFollowupFunc(taskId, taskFunc, followupFunc); - gTasks[taskId].tFuncId = 1; + gTasks[taskId].tFuncId = TRSEE_EXCLAMATION; taskFunc(taskId); } @@ -438,11 +451,12 @@ static void Task_RunTrainerSeeFuncList(u8 taskId) } } -static bool8 sub_80B4178(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +static bool8 TrainerSeeIdle(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { return FALSE; } +// TRSEE_EXCLAMATION static bool8 TrainerExclamationMark(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { u8 direction; @@ -451,10 +465,11 @@ static bool8 TrainerExclamationMark(u8 taskId, struct Task *task, struct ObjectE FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); direction = GetFaceDirectionMovementAction(trainerObj->facingDirection); ObjectEventSetHeldMovement(trainerObj, direction); - task->tFuncId++; + task->tFuncId++; // TRSEE_EXCLAMATION_WAIT return TRUE; } +// TRSEE_EXCLAMATION_WAIT static bool8 WaitTrainerExclamationMark(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON)) @@ -463,15 +478,16 @@ static bool8 WaitTrainerExclamationMark(u8 taskId, struct Task *task, struct Obj } else { - task->tFuncId++; + task->tFuncId++; // TRSEE_MOVE_TO_PLAYER if (trainerObj->movementType == MOVEMENT_TYPE_TREE_DISGUISE || trainerObj->movementType == MOVEMENT_TYPE_MOUNTAIN_DISGUISE) - task->tFuncId = 6; - if (trainerObj->movementType == MOVEMENT_TYPE_HIDDEN) - task->tFuncId = 8; + task->tFuncId = TRSEE_REVEAL_DISGUISE; + if (trainerObj->movementType == MOVEMENT_TYPE_BURIED) + task->tFuncId = TRSEE_REVEAL_BURIED; return TRUE; } } +// TRSEE_MOVE_TO_PLAYER static bool8 TrainerMoveToPlayer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) @@ -484,12 +500,13 @@ static bool8 TrainerMoveToPlayer(u8 taskId, struct Task *task, struct ObjectEven else { ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_FACE_PLAYER); - task->tFuncId++; + task->tFuncId++; // TRSEE_PLAYER_FACE } } return FALSE; } +// TRSEE_PLAYER_FACE static bool8 PlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { struct ObjectEvent *playerObj; @@ -497,6 +514,7 @@ static bool8 PlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct O if (ObjectEventIsMovementOverridden(trainerObj) && !ObjectEventClearHeldMovementIfFinished(trainerObj)) return FALSE; + // Set trainer's movement type so they stop and remain facing that direction SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); TryOverrideTemplateCoordsForObjectEvent(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); OverrideTemplateCoordsForObjectEvent(trainerObj); @@ -507,10 +525,11 @@ static bool8 PlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct O sub_808BCE8(); ObjectEventSetHeldMovement(&gObjectEvents[gPlayerAvatar.objectEventId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection))); - task->tFuncId++; + task->tFuncId++; // TRSEE_PLAYER_FACE_WAIT return FALSE; } +// TRSEE_PLAYER_FACE_WAIT static bool8 WaitPlayerFaceApproachingTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { struct ObjectEvent *playerObj = &gObjectEvents[gPlayerAvatar.objectEventId]; @@ -521,26 +540,29 @@ static bool8 WaitPlayerFaceApproachingTrainer(u8 taskId, struct Task *task, stru return FALSE; } +// TRSEE_REVEAL_DISGUISE static bool8 RevealDisguisedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) { ObjectEventSetHeldMovement(trainerObj, MOVEMENT_ACTION_REVEAL_TRAINER); - task->tFuncId++; + task->tFuncId++; // TRSEE_REVEAL_DISGUISE_WAIT } return FALSE; } +// TRSEE_REVEAL_DISGUISE_WAIT static bool8 WaitRevealDisguisedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (ObjectEventClearHeldMovementIfFinished(trainerObj)) - task->tFuncId = 3; + task->tFuncId = TRSEE_MOVE_TO_PLAYER; return FALSE; } -static bool8 RevealHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +// TRSEE_REVEAL_BURIED +static bool8 RevealBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (!ObjectEventIsMovementOverridden(trainerObj) || ObjectEventClearHeldMovementIfFinished(trainerObj)) @@ -551,7 +573,8 @@ static bool8 RevealHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEven return FALSE; } -static bool8 PopOutOfAshHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +// TRSEE_BURIED_POP_OUT +static bool8 PopOutOfAshBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (ObjectEventCheckHeldMovementStatus(trainerObj)) { @@ -565,7 +588,8 @@ static bool8 PopOutOfAshHiddenTrainer(u8 taskId, struct Task *task, struct Objec return FALSE; } -static bool8 JumpInPlaceHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +// TRSEE_BURIED_JUMP +static bool8 JumpInPlaceBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { struct Sprite *sprite; @@ -584,33 +608,34 @@ static bool8 JumpInPlaceHiddenTrainer(u8 taskId, struct Task *task, struct Objec return FALSE; } -static bool8 WaitRevealHiddenTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) +// TRSEE_REVEAL_BURIED_WAIT +static bool8 WaitRevealBuriedTrainer(u8 taskId, struct Task *task, struct ObjectEvent *trainerObj) { if (!FieldEffectActiveListContains(FLDEFF_ASH_PUFF)) - task->tFuncId = 3; + task->tFuncId = TRSEE_MOVE_TO_PLAYER; return FALSE; } -#undef tFuncId #undef tTrainerRange #undef tOutOfAshSpriteId #undef tTrainerObjectEventId -static void sub_80B44C8(u8 taskId) +#define tObjEvent data[1] + +static void Task_SetBuriedTrainerMovement(u8 taskId) { struct Task *task = &gTasks[taskId]; struct ObjectEvent *objEvent; - // another objEvent loaded into by loadword? - LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&objEvent); + LoadWordFromTwoHalfwords(&task->tObjEvent, (u32 *)&objEvent); if (!task->data[7]) { ObjectEventClearHeldMovement(objEvent); task->data[7]++; } - sTrainerSeeFuncList2[task->data[0]](taskId, task, objEvent); - if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_ASH_PUFF)) + sTrainerSeeFuncList2[task->tFuncId](taskId, task, objEvent); + if (task->tFuncId == ((int)ARRAY_COUNT(sTrainerSeeFuncList2) - 1) && !FieldEffectActiveListContains(FLDEFF_ASH_PUFF)) { SetTrainerMovementType(objEvent, GetTrainerFacingDirectionMovementType(objEvent->facingDirection)); TryOverrideTemplateCoordsForObjectEvent(objEvent, GetTrainerFacingDirectionMovementType(objEvent->facingDirection)); @@ -622,17 +647,18 @@ static void sub_80B44C8(u8 taskId) } } -void sub_80B4578(struct ObjectEvent *var) +// Called when a buried Trainer has the reveal_trainer movement applied, from direct interaction +void SetBuriedTrainerMovement(struct ObjectEvent *objEvent) { - StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80B44C8, 0)].data[1], (u32)var); + StoreWordInTwoHalfwords(&gTasks[CreateTask(Task_SetBuriedTrainerMovement, 0)].tObjEvent, (u32)objEvent); } -void EndTrainerApproach(void) +void DoTrainerApproach(void) { - sub_80B40C8(Task_DestroyTrainerApproachTask); + StartTrainerApproach(Task_EndTrainerApproach); } -static void Task_DestroyTrainerApproachTask(u8 taskId) +static void Task_EndTrainerApproach(u8 taskId) { DestroyTask(taskId); EnableBothScriptContexts(); @@ -38,20 +38,30 @@ #include "constants/contest.h" #include "constants/items.h" #include "constants/layouts.h" +#include "constants/lilycove_lady.h" #include "constants/maps.h" #include "constants/metatile_behaviors.h" +#include "constants/metatile_labels.h" #include "constants/moves.h" #include "constants/region_map_sections.h" #include "constants/script_menu.h" -#include "constants/tv.h" - -// Static type declarations #define LAST_TVSHOW_IDX (TV_SHOWS_COUNT - 1) -#define rbernoulli(num, den) TV_BernoulliTrial(0xFFFF * (num) / (den)) +#define rbernoulli(num, den) BernoulliTrial(0xFFFF * (num) / (den)) -// Static RAM declarations +enum { + TVGROUP_NONE, + TVGROUP_UNUSED, + TVGROUP_NORMAL, + TVGROUP_RECORD_MIX, + TVGROUP_OUTBREAK, +}; + +enum { + SLOT_MACHINE, + ROULETTE, +}; s8 sCurTVShowSlot; u16 sTV_SecretBaseVisitMovesTemp[8]; @@ -66,82 +76,77 @@ static u8 sTVShowMixingNumPlayers; static u8 sTVShowNewsMixingNumPlayers; static s8 sTVShowMixingCurSlot; -EWRAM_DATA u16 sPokemonAnglerSpecies = 0; -EWRAM_DATA u16 sPokemonAnglerAttemptCounters = 0; -EWRAM_DATA u16 sFindThatGamerCoinsSpent = 0; -EWRAM_DATA u8 sFindThatGamerWhichGame = SLOT_MACHINE; -EWRAM_DATA ALIGNED(4) u8 sRecordMixingPartnersWithoutShowsToShare = 0; -EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0; -EWRAM_DATA u8 sTVSecretBaseSecretsRandomValues[3] = {}; - -// Static ROM declarations -#if !defined(NONMATCHING) && MODERN -#define static -#endif -void ClearPokemonNews(void); -u8 GetTVChannelByShowType(u8 kind); -u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void); -u8 CheckForBigMovieOrEmergencyNewsOnTV(void); -void SetTVMetatilesOnMap(int width, int height, u16 tileId); -u8 FindAnyTVNewsOnTheAir(void); -bool8 IsTVShowInSearchOfTrainersAiring(void); -void TakeTVShowInSearchOfTrainersOffTheAir(void); -bool8 TV_BernoulliTrial(u16 ratio); -s8 FindEmptyTVSlotBeyondFirstFiveShowsOfArray(TVShow *shows); -bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag); -void tv_store_id_3x(TVShow *show); -void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx); -s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows); -void FindActiveBroadcastByShowType_SetScriptResult(u8 kind); +static EWRAM_DATA u16 sPokemonAnglerSpecies = 0; +static EWRAM_DATA u16 sPokemonAnglerAttemptCounters = 0; +static EWRAM_DATA u16 sFindThatGamerCoinsSpent = 0; +static EWRAM_DATA u8 sFindThatGamerWhichGame = SLOT_MACHINE; +static EWRAM_DATA ALIGNED(4) u8 sRecordMixingPartnersWithoutShowsToShare = 0; +static EWRAM_DATA ALIGNED(4) u8 sTVShowState = 0; +static EWRAM_DATA u8 sTVSecretBaseSecretsRandomValues[3] = {}; + +static void ClearPokeNews(void); +static u8 GetTVGroupByShowId(u8); +static u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void); +static void SetTVMetatilesOnMap(int, int, u16); +static u8 FindAnyPokeNewsOnTheAir(void); +static void TakeGabbyAndTyOffTheAir(void); +static bool8 BernoulliTrial(u16 ratio); +static s8 FindFirstEmptyRecordMixTVShowSlot(TVShow *); +static bool8 IsRecordMixShowAlreadySpawned(u8, bool8); +static void StorePlayerIdInRecordMixShow(TVShow *); +static void DeleteTVShowInArrayByIdx(TVShow *, u8); +static s8 FindFirstEmptyNormalTVShowSlot(TVShow *); +static void TryReplaceOldTVShowOfKind(u8); static void InterviewBefore_BravoTrainerPkmnProfile(void); static void InterviewBefore_NameRater(void); -u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies); -static void sub_80EFA88(void); -static void sub_80EF93C(TVShow *shows); -s8 sub_80EEE30(PokeNews *pokeNews); -bool8 sub_80EF0E4(u8 newsKind); -void ClearPokemonNewsI(u8 i); -static void sub_80F1254(TVShow *shows); -static void sub_80F12A4(TVShow *shows); -static void sub_80F0358(TVShow *player1, TVShow *player2, TVShow *player3, TVShow *player4); -static void sub_80F0C04(void); -static void sub_80F0708(void); -static void sub_80F0B64(void); -static s8 sub_80F06D0(TVShow *tvShows); -static bool8 sub_80F049C(TVShow *dest[], TVShow *src[], u8 idx); -static bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx); -static bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx); -static bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx); -void SetTvShowInactive(u8 showIdx); -static void sub_80F0B24(u16 species, u8 showIdx); -static void sub_80F0D60(PokeNews *player1, PokeNews *player2, PokeNews *player3, PokeNews *player4); -static void sub_80F0EEC(void); -static void sub_80F0F24(void); -static s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx); -static void sub_80F0E58(PokeNews *dest[], PokeNews *src[]); -static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot); -void TVShowDone(void); +static u16 GetRandomDifferentSpeciesSeenByPlayer(u16); +static void Script_FindFirstEmptyNormalTVShowSlot(void); +static void CompactTVShowArray(TVShow *); +static s8 GetFirstEmptyPokeNewsSlot(PokeNews *); +static bool8 IsAddingPokeNewsDisallowed(u8); +static void ClearPokeNewsBySlot(u8); +static void TranslateRubyShows(TVShow *); +static void TranslateJapaneseEmeraldShows(TVShow *); +static void SetMixedTVShows(TVShow *, TVShow *, TVShow *, TVShow *); +static void DeleteExcessMixedShows(void); +static void DeactivateShowsWithUnseenSpecies(void); +static void DeactivateGameCompleteShowsIfNotUnlocked(void); +static s8 FindInactiveShowInArray(TVShow *); +static bool8 TryMixTVShow(TVShow *[], TVShow *[], u8); +static bool8 TryMixNormalTVShow(TVShow *, TVShow *, u8); +static bool8 TryMixRecordMixTVShow(TVShow *, TVShow *, u8); +static bool8 TryMixOutbreakTVShow(TVShow *, TVShow *, u8); +static void DeactivateShow(u8 showIdx); +static void DeactivateShowIfNotSeenSpecies(u16, u8); +static void SetMixedPokeNews(PokeNews *, PokeNews *, PokeNews *, PokeNews *); +static void ClearInvalidPokeNews(void); +static void ClearPokeNewsIfGameNotComplete(void); +static s8 GetPokeNewsSlotIfActive(PokeNews *, u8); +static void InitTryMixPokeNewsShow(PokeNews *[], PokeNews *[]); +static bool8 TryMixPokeNewsShow(PokeNews *, PokeNews *, s8); +static void TVShowDone(void); static void InterviewAfter_FanClubLetter(void); static void InterviewAfter_RecentHappenings(void); static void InterviewAfter_PkmnFanClubOpinions(void); -static void InterviewAfter_DummyShow4(void); +static void InterviewAfter_Dummy(void); static void InterviewAfter_BravoTrainerPokemonProfile(void); static void InterviewAfter_BravoTrainerBattleTowerProfile(void); static void InterviewAfter_ContestLiveUpdates(void); -void UpdateWorldOfMastersAndPutItOnTheAir(void); -void PutPokemonTodayFailedOnTheAir(void); -static void sub_80ED718(void); -static void sub_80EED88(void); -void TV_SortPurchasesByQuantity(void); -static void UpdateMassOutbreakTimeLeft(u16 days); -static void TryEndMassOutbreak(u16 days); -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 void sub_80EEBF4(u8 actionIdx); -bool8 IsPriceDiscounted(u8 newsKind); +static void InitWorldOfMastersShowAttempt(void); +static void TryPutPokemonTodayFailedOnTheAir(void); +static void TryStartRandomMassOutbreak(void); +static void TryPutRandomPokeNewsOnAir(void); +static void SortPurchasesByQuantity(void); +static void UpdateMassOutbreakTimeLeft(u16); +static void TryEndMassOutbreak(u16); +static void UpdatePokeNewsTimeLeft(u16); +static void ResolveWorldOfMastersShow(u16); +static void ResolveNumberOneShow(u16); +static void TryPutFishingAdviceOnAir(void); +static u8 MonDataIdxToRibbon(u8); +static void TryPutNumberOneOnAir(u8); +static bool8 IsPriceDiscounted(u8); +static void TryPutWorldOfMastersOnAir(void); static void InterviewBefore_FanClubLetter(void); static void InterviewBefore_RecentHappenings(void); static void InterviewBefore_PkmnFanClubOpinions(void); @@ -150,7 +155,7 @@ static void InterviewBefore_BravoTrainerBTProfile(void); static void InterviewBefore_ContestLiveUpdates(void); static void InterviewBefore_3CheersForPokeblocks(void); static void InterviewBefore_FanClubSpecial(void); -void ChangeBoxPokemonNickname_CB(void); +static void ChangeBoxPokemonNickname_CB(void); static void DoTVShowPokemonFanClubLetter(void); static void DoTVShowRecentHappenings(void); static void DoTVShowPokemonFanClubOpinions(void); @@ -182,9 +187,7 @@ static void DoTVShowPokemonNewsBattleFrontier(void); static void DoTVShowWhatsNo1InHoennToday(void); static void DoTVShowSecretBaseSecrets(void); static void DoTVShowSafariFanClub(void); -static void DoTVShowPokemonContestLiveUpdates2(void); - -// .rodata +static void DoTVShowLilycoveContestLady(void); static const struct { u16 species; @@ -464,11 +467,11 @@ static const u8 *const sTVNameRaterTextGroup[] = { gTVNameRaterText18 }; -static const u8 *const sTVPokemonContestLiveUpdates2TextGroup[] = { - gTVPokemonContestLiveUpdates2Text00, - gTVPokemonContestLiveUpdates2Text01, - gTVPokemonContestLiveUpdates2Text02, - gTVPokemonContestLiveUpdates2Text03 +static const u8 *const sTVLilycoveContestLadyTextGroup[] = { + [CONTESTLADYLIVE_STATE_INTRO] = ContestLadyShow_Text_Intro, + [CONTESTLADYLIVE_STATE_WON] = ContestLadyShow_Text_Won, + [CONTESTLADYLIVE_STATE_LOST] = ContestLadyShow_Text_Lost, + [CONTESTLADYLIVE_STATE_LOST_BADLY] = ContestLadyShow_Text_LostBadly }; static const u8 *const sTVPokemonTodayFailedTextGroup[] = { @@ -507,13 +510,13 @@ static const u8 *const sTVTodaysRivalTrainerTextGroup[] = { }; static const u8 *const sTVDewfordTrendWatcherNetworkTextGroup[] = { - gTVDewfordTrendWatcherNetworkText00, - gTVDewfordTrendWatcherNetworkText01, - gTVDewfordTrendWatcherNetworkText02, - gTVDewfordTrendWatcherNetworkText03, - gTVDewfordTrendWatcherNetworkText04, - gTVDewfordTrendWatcherNetworkText05, - gTVDewfordTrendWatcherNetworkText06 + [TRENDWATCHER_STATE_INTRO] = TrendWatcher_Text_Intro, + [TRENDWATCHER_STATE_TAUGHT_MALE] = TrendWatcher_Text_MaleTaughtMePhrase, + [TRENDWATCHER_STATE_TAUGHT_FEMALE] = TrendWatcher_Text_FemaleTaughtMePhrase, + [TRENDWATCHER_STATE_PHRASE_HOPELESS] = TrendWatcher_Text_PhraseWasHopeless, + [TRENDWATCHER_STATE_BIGGER_MALE] = TrendWatcher_Text_MaleTellMeBigger, + [TRENDWATCHER_STATE_BIGGER_FEMALE] = TrendWatcher_Text_FemaleTellMeBigger, + [TRENDWATCHER_STATE_OUTRO] = TrendWatcher_Text_Outro }; static const u8 *const sTVHoennTreasureInvestisatorsTextGroup[] = { @@ -592,22 +595,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[] = { @@ -755,23 +758,18 @@ const u8 sTVSecretBaseSecretsActions[NUM_SECRET_BASE_FLAGS] = SBSECRETS_NUM_STATES // SECRET_BASE_UNUSED_FLAG. Odd that this is included, if it were used it would overflow sTVSecretBaseSecretsTextGroup }; -// .text - void ClearTVShowData(void) { - u8 i; - u8 j; + u8 i, j; - for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows); i ++) + for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows); i++) { gSaveBlock1Ptr->tvShows[i].commonInit.kind = 0; gSaveBlock1Ptr->tvShows[i].commonInit.active = 0; - for (j = 0; j < ARRAY_COUNT(gSaveBlock1Ptr->tvShows[i].commonInit.pad02); j ++) - { - gSaveBlock1Ptr->tvShows[i].commonInit.pad02[j] = 0; - } + for (j = 0; j < ARRAY_COUNT(gSaveBlock1Ptr->tvShows[i].commonInit.data); j++) + gSaveBlock1Ptr->tvShows[i].commonInit.data[j] = 0; } - ClearPokemonNews(); + ClearPokeNews(); } u8 GetRandomActiveShowIdx(void) @@ -781,7 +779,8 @@ u8 GetRandomActiveShowIdx(void) u8 selIdx; TVShow *show; - for (i = 5; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i ++) + // Include all normal TV shows, and up through any present Record Mix shows + for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++) { if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_OFF_AIR) break; @@ -790,7 +789,7 @@ u8 GetRandomActiveShowIdx(void) selIdx = j; do { - if (GetTVChannelByShowType(gSaveBlock1Ptr->tvShows[j].common.kind) != 4) + if (GetTVGroupByShowId(gSaveBlock1Ptr->tvShows[j].common.kind) != TVGROUP_OUTBREAK) { if (gSaveBlock1Ptr->tvShows[j].common.active == TRUE) return j; @@ -805,7 +804,7 @@ u8 GetRandomActiveShowIdx(void) if (j == 0) j = ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 2; else - j --; + j--; } while (j != selIdx); return 0xFF; @@ -813,88 +812,88 @@ u8 GetRandomActiveShowIdx(void) u8 FindAnyTVShowOnTheAir(void) { - u8 show; - - show = GetRandomActiveShowIdx(); - if (show == 0xFF) - { + u8 slot = GetRandomActiveShowIdx(); + if (slot == 0xFF) return 0xFF; - } - if (gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE && gSaveBlock1Ptr->tvShows[show].common.kind == TVSHOW_MASS_OUTBREAK) - { + + if (gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE + && gSaveBlock1Ptr->tvShows[slot].common.kind == TVSHOW_MASS_OUTBREAK) return FindFirstActiveTVShowThatIsNotAMassOutbreak(); - } - return show; + + return slot; } void UpdateTVScreensOnMap(int width, int height) { FlagSet(FLAG_SYS_TV_WATCH); - switch (CheckForBigMovieOrEmergencyNewsOnTV()) + switch (CheckForPlayersHouseNews()) { - case 1: - SetTVMetatilesOnMap(width, height, 0x3); - break; - case 2: - break; - default: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) - { - SetTVMetatilesOnMap(width, height, 0x3); - } - else if (FlagGet(FLAG_SYS_TV_START) && (FindAnyTVShowOnTheAir() != 0xFF || FindAnyTVNewsOnTheAir() != 0xFF || IsTVShowInSearchOfTrainersAiring())) - { - FlagClear(FLAG_SYS_TV_WATCH); - SetTVMetatilesOnMap(width, height, 0x3); - } - break; + case PLAYERS_HOUSE_TV_LATI: + SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On); + break; + case PLAYERS_HOUSE_TV_MOVIE: + // Don't flash TV for movie text in player's house + break; +// case PLAYERS_HOUSE_TV_NONE: + default: + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) + { + // NPC in Lilycove Hotel is always watching TV + SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On); + } + else if (FlagGet(FLAG_SYS_TV_START) && (FindAnyTVShowOnTheAir() != 0xFF || FindAnyPokeNewsOnTheAir() != 0xFF || IsGabbyAndTyShowOnTheAir())) + { + FlagClear(FLAG_SYS_TV_WATCH); + SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On); + } + break; } } -void SetTVMetatilesOnMap(int width, int height, u16 tileId) +static void SetTVMetatilesOnMap(int width, int height, u16 tileId) { int x; int y; - for (y = 0; y < height; y ++) + for (y = 0; y < height; y++) { - for (x = 0; x < width; x ++) + for (x = 0; x < width; x++) { if (MapGridGetMetatileBehaviorAt(x, y) == MB_TELEVISION) - { MapGridSetMetatileIdAt(x, y, tileId | METATILE_COLLISION_MASK); - } } } } void TurnOffTVScreen(void) { - SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0002); + SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, METATILE_Building_TV_Off); DrawWholeMapView(); } void TurnOnTVScreen(void) { - SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, 0x0003); + SetTVMetatilesOnMap(gBackupMapLayout.width, gBackupMapLayout.height, METATILE_Building_TV_On); DrawWholeMapView(); } +// gSpecialVar_0x8004 here is set from GetRandomActiveShowIdx in EventScript_TryDoTVShow u8 GetSelectedTVShow(void) { return gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.kind; } -u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void) +static u8 FindFirstActiveTVShowThatIsNotAMassOutbreak(void) { u8 i; - for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i ++) + for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->tvShows) - 1; i++) { - if (gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_OFF_AIR && gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->tvShows[i].common.active == TRUE) - { + if (gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_OFF_AIR + && gSaveBlock1Ptr->tvShows[i].common.kind != TVSHOW_MASS_OUTBREAK + && gSaveBlock1Ptr->tvShows[i].common.active == TRUE) return i; - } } return 0xFF; } @@ -905,9 +904,8 @@ u8 GetNextActiveShowIfMassOutbreak(void) tvShow = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; if (tvShow->common.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->outbreakPokemonSpecies != SPECIES_NONE) - { return FindFirstActiveTVShowThatIsNotAMassOutbreak(); - } + return gSpecialVar_0x8004; } @@ -943,28 +941,23 @@ void GabbyAndTyBeforeInterview(void) gSaveBlock1Ptr->gabbyAndTyData.lastMove = gBattleResults.lastUsedMovePlayer; if (gSaveBlock1Ptr->gabbyAndTyData.battleNum != 0xFF) { - gSaveBlock1Ptr->gabbyAndTyData.battleNum ++; + gSaveBlock1Ptr->gabbyAndTyData.battleNum++; } gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn = gBattleResults.playerMonWasDamaged; + if (gBattleResults.playerFaintCounter != 0) - { gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = TRUE; - } else - { gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon = FALSE; - } + if (gBattleResults.numHealingItemsUsed != 0) - { gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = TRUE; - } else - { gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem = FALSE; - } + if (!gBattleResults.usedMasterBall) { - for (i = 0; i < POKEBALL_COUNT - 1; i ++) + for (i = 0; i < POKEBALL_COUNT - 1; i++) { if (gBattleResults.catchAttempts[i]) { @@ -975,9 +968,11 @@ void GabbyAndTyBeforeInterview(void) } else { + // Player threw a Master Ball at Gabby and Ty gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall = TRUE; } - TakeTVShowInSearchOfTrainersOffTheAir(); + + TakeGabbyAndTyOffTheAir(); if (gSaveBlock1Ptr->gabbyAndTyData.lastMove == MOVE_NONE) { FlagSet(FLAG_TEMP_1); @@ -995,7 +990,7 @@ void GabbyAndTyAfterInterview(void) IncrementGameStat(GAME_STAT_GOT_INTERVIEWED); } -void TakeTVShowInSearchOfTrainersOffTheAir(void) +static void TakeGabbyAndTyOffTheAir(void) { gSaveBlock1Ptr->gabbyAndTyData.onAir = FALSE; } @@ -1003,20 +998,19 @@ void TakeTVShowInSearchOfTrainersOffTheAir(void) u8 GabbyAndTyGetBattleNum(void) { if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 5) - { return (gSaveBlock1Ptr->gabbyAndTyData.battleNum % 3) + 6; - } + return gSaveBlock1Ptr->gabbyAndTyData.battleNum; } -bool8 IsTVShowInSearchOfTrainersAiring(void) +bool8 IsGabbyAndTyShowOnTheAir(void) { return gSaveBlock1Ptr->gabbyAndTyData.onAir; } bool8 GabbyAndTyGetLastQuote(void) { - if (gSaveBlock1Ptr->gabbyAndTyData.quote[0] == 0xFFFF) + if (gSaveBlock1Ptr->gabbyAndTyData.quote[0] == EC_EMPTY_WORD) { return FALSE; } @@ -1028,60 +1022,56 @@ bool8 GabbyAndTyGetLastQuote(void) u8 GabbyAndTyGetLastBattleTrivia(void) { if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn2) - { return 1; - } + if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall2) - { return 2; - } + if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem2) - { return 3; - } + if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon2) - { return 4; - } + return 0; } -void GabbyAndTySetScriptVarsToObjectEventLocalIds(void) +void GetGabbyAndTyLocalIds(void) { switch (GabbyAndTyGetBattleNum()) { - case 1: - gSpecialVar_0x8004 = 14; - gSpecialVar_0x8005 = 13; - break; - case 2: - gSpecialVar_0x8004 = 5; - gSpecialVar_0x8005 = 6; - break; - case 3: - gSpecialVar_0x8004 = 18; - gSpecialVar_0x8005 = 17; - break; - case 4: - gSpecialVar_0x8004 = 21; - gSpecialVar_0x8005 = 22; - break; - case 5: - gSpecialVar_0x8004 = 8; - gSpecialVar_0x8005 = 9; - break; - case 6: - gSpecialVar_0x8004 = 19; - gSpecialVar_0x8005 = 20; - break; - case 7: - gSpecialVar_0x8004 = 23; - gSpecialVar_0x8005 = 24; - break; - case 8: - gSpecialVar_0x8004 = 10; - gSpecialVar_0x8005 = 11; - break; + case 1: + gSpecialVar_0x8004 = 14; + gSpecialVar_0x8005 = 13; + break; + case 2: + gSpecialVar_0x8004 = 5; + gSpecialVar_0x8005 = 6; + break; + case 3: + gSpecialVar_0x8004 = 18; + gSpecialVar_0x8005 = 17; + break; + case 4: + gSpecialVar_0x8004 = 21; + gSpecialVar_0x8005 = 22; + break; + case 5: + gSpecialVar_0x8004 = 8; + gSpecialVar_0x8005 = 9; + break; + case 6: + gSpecialVar_0x8004 = 19; + gSpecialVar_0x8005 = 20; + break; + case 7: + gSpecialVar_0x8004 = 23; + gSpecialVar_0x8005 = 24; + break; + case 8: + gSpecialVar_0x8004 = 10; + gSpecialVar_0x8005 = 11; + break; } } @@ -1089,88 +1079,85 @@ void InterviewAfter(void) { switch (gSpecialVar_0x8005) { - case TVSHOW_FAN_CLUB_LETTER: - InterviewAfter_FanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - InterviewAfter_RecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - InterviewAfter_PkmnFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - InterviewAfter_DummyShow4(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - InterviewAfter_BravoTrainerPokemonProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - InterviewAfter_BravoTrainerBattleTowerProfile(); - break; - case TVSHOW_CONTEST_LIVE_UPDATES: - InterviewAfter_ContestLiveUpdates(); - break; + case TVSHOW_FAN_CLUB_LETTER: + InterviewAfter_FanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + InterviewAfter_RecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + InterviewAfter_PkmnFanClubOpinions(); + break; + case TVSHOW_DUMMY: + InterviewAfter_Dummy(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + InterviewAfter_BravoTrainerPokemonProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + InterviewAfter_BravoTrainerBattleTowerProfile(); + break; + case TVSHOW_CONTEST_LIVE_UPDATES: + InterviewAfter_ContestLiveUpdates(); + break; } } -void PutPokemonTodayCaughtOnAir(void) +void TryPutPokemonTodayOnAir(void) { u8 i; - u16 ct; + u16 ballsUsed; TVShow *show; u32 language2; u16 itemLastUsed; - ct = 0; - sub_80EED88(); - sub_80ED718(); + ballsUsed = 0; + TryPutRandomPokeNewsOnAir(); + TryStartRandomMassOutbreak(); + + // Try either the Failed or Caught version of the show if (gBattleResults.caughtMonSpecies == SPECIES_NONE) { - PutPokemonTodayFailedOnTheAir(); + TryPutPokemonTodayFailedOnTheAir(); } else { - UpdateWorldOfMastersAndPutItOnTheAir(); + InitWorldOfMastersShowAttempt(); if (!rbernoulli(1, 1) && StringCompare(gSpeciesNames[gBattleResults.caughtMonSpecies], gBattleResults.caughtMonNick)) { - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_CAUGHT, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_POKEMON_TODAY_CAUGHT, FALSE) != TRUE) { - for (i = 0; i < POKEBALL_COUNT - 1; i ++) - { - ct += gBattleResults.catchAttempts[i]; - } - if (ct != 0 || gBattleResults.usedMasterBall) + for (i = 0; i < POKEBALL_COUNT - 1; i++) + ballsUsed += gBattleResults.catchAttempts[i]; + + if (ballsUsed != 0 || gBattleResults.usedMasterBall) { - ct = 0; + ballsUsed = 0; show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->pokemonToday.kind = TVSHOW_POKEMON_TODAY_CAUGHT; - show->pokemonToday.active = FALSE; + show->pokemonToday.active = FALSE; // NOTE: Show is not active until passed via Record Mix. if (gBattleResults.usedMasterBall) { - ct = 1; + ballsUsed = 1; itemLastUsed = ITEM_MASTER_BALL; } else { - for (i = 0; i < POKEBALL_COUNT - 1; i ++) - { - ct += gBattleResults.catchAttempts[i]; - } - if (ct > 0xFF) - { - ct = 0xFF; - } + for (i = 0; i < POKEBALL_COUNT - 1; i++) + ballsUsed += gBattleResults.catchAttempts[i]; + if (ballsUsed > 255) + ballsUsed = 255; itemLastUsed = gLastUsedItem; } - show->pokemonToday.nBallsUsed = ct; + show->pokemonToday.nBallsUsed = ballsUsed; show->pokemonToday.ball = itemLastUsed; StringCopy(show->pokemonToday.playerName, gSaveBlock2Ptr->playerName); StringCopy(show->pokemonToday.nickname, gBattleResults.caughtMonNick); language2 = sub_81DB604(show->pokemonToday.nickname); StripExtCtrlCodes(show->pokemonToday.nickname); show->pokemonToday.species = gBattleResults.caughtMonSpecies; - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->pokemonToday.language = gGameLanguage; show->pokemonToday.language2 = language2; } @@ -1179,65 +1166,60 @@ void PutPokemonTodayCaughtOnAir(void) } } -void UpdateWorldOfMastersAndPutItOnTheAir(void) +// Show is initialized in last slot and updated there until it's +// either triggered or deleted at the end of the day by ResolveWorldOfMastersShow +static void InitWorldOfMastersShowAttempt(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; - if (show->worldOfMasters.kind != TVSHOW_WORLD_OF_MASTERS) + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + if (show->common.kind != TVSHOW_WORLD_OF_MASTERS) { DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); show->worldOfMasters.steps = GetGameStat(GAME_STAT_STEPS); show->worldOfMasters.kind = TVSHOW_WORLD_OF_MASTERS; } - show->worldOfMasters.numPokeCaught ++; + show->worldOfMasters.numPokeCaught++; show->worldOfMasters.caughtPoke = gBattleResults.caughtMonSpecies; show->worldOfMasters.species = gBattleResults.playerMon1Species; show->worldOfMasters.location = gMapHeader.regionMapSectionId; } -void PutPokemonTodayFailedOnTheAir(void) +static void TryPutPokemonTodayFailedOnTheAir(void) { - u16 ct; + u16 ballsUsed; u8 i; TVShow *show; if (!rbernoulli(1, 1)) { - for (i = 0, ct = 0; i < POKEBALL_COUNT - 1; i ++) - { - ct += gBattleResults.catchAttempts[i]; - } - if (ct > 0xFF) - { - ct = 0xFF; - } - if (ct > 2 && (gBattleOutcome == B_OUTCOME_MON_FLED || gBattleOutcome == B_OUTCOME_WON)) + for (i = 0, ballsUsed = 0; i < POKEBALL_COUNT - 1; i++) + ballsUsed += gBattleResults.catchAttempts[i]; + if (ballsUsed > 255) + ballsUsed = 255; + + if (ballsUsed > 2 && (gBattleOutcome == B_OUTCOME_MON_FLED || gBattleOutcome == B_OUTCOME_WON)) { - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->pokemonTodayFailed.kind = TVSHOW_POKEMON_TODAY_FAILED; - show->pokemonTodayFailed.active = FALSE; + show->pokemonTodayFailed.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show->pokemonTodayFailed.species = gBattleResults.playerMon1Species; show->pokemonTodayFailed.species2 = gBattleResults.lastOpponentSpecies; - show->pokemonTodayFailed.nBallsUsed = ct; + show->pokemonTodayFailed.nBallsUsed = ballsUsed; show->pokemonTodayFailed.outcome = gBattleOutcome; show->pokemonTodayFailed.location = gMapHeader.regionMapSectionId; StringCopy(show->pokemonTodayFailed.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->pokemonTodayFailed.language = gGameLanguage; } } } } -void tv_store_id_3x(TVShow *show) +static void StorePlayerIdInRecordMixShow(TVShow *show) { - u32 id; - - id = GetPlayerIDAsU32(); + u32 id = GetPlayerIDAsU32(); show->common.srcTrainerId2Lo = id; show->common.srcTrainerId2Hi = id >> 8; show->common.srcTrainerIdLo = id; @@ -1246,11 +1228,9 @@ void tv_store_id_3x(TVShow *show) show->common.trainerIdHi = id >> 8; } -void tv_store_id_2x(TVShow *show) +static void StorePlayerIdInNormalShow(TVShow *show) { - u32 id; - - id = GetPlayerIDAsU32(); + u32 id = GetPlayerIDAsU32(); show->common.srcTrainerIdLo = id; show->common.srcTrainerIdHi = id >> 8; show->common.trainerIdLo = id; @@ -1278,7 +1258,7 @@ static void InterviewAfter_ContestLiveUpdates(void) show2->contestLiveUpdates.move = show->contestLiveUpdates.move; show2->contestLiveUpdates.winnerAppealFlag = show->contestLiveUpdates.winnerAppealFlag; StringCopy(show2->contestLiveUpdates.losingTrainerName, show->contestLiveUpdates.losingTrainerName); - tv_store_id_2x(show2); + StorePlayerIdInNormalShow(show2); show2->contestLiveUpdates.winningTrainerLanguage = gGameLanguage; show2->contestLiveUpdates.losingTrainerLanguage = show->contestLiveUpdates.losingTrainerLanguage; DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); @@ -1290,44 +1270,36 @@ void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlaye TVShow *show; u8 name[32]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BATTLE_UPDATE); - if (gSpecialVar_Result != 1) + TryReplaceOldTVShowOfKind(TVSHOW_BATTLE_UPDATE); + if (gSpecialVar_Result != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->battleUpdate.kind = TVSHOW_BATTLE_UPDATE; show->battleUpdate.active = TRUE; StringCopy(show->battleUpdate.playerName, gSaveBlock2Ptr->playerName); + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - { show->battleUpdate.battleType = 2; - } else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - { show->battleUpdate.battleType = 1; - } else - { show->battleUpdate.battleType = 0; - } + show->battleUpdate.move = move; show->battleUpdate.speciesPlayer = speciesPlayer; show->battleUpdate.speciesOpponent = speciesOpponent; StringCopy(name, gLinkPlayers[opponentLinkPlayerId].name); StripExtCtrlCodes(name); StringCopy(show->battleUpdate.linkOpponentName, name); - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->battleUpdate.language = gGameLanguage; if (show->battleUpdate.language == LANGUAGE_JAPANESE || gLinkPlayers[opponentLinkPlayerId].language == LANGUAGE_JAPANESE) - { show->battleUpdate.linkOpponentLanguage = LANGUAGE_JAPANESE; - } else - { show->battleUpdate.linkOpponentLanguage = gLinkPlayers[opponentLinkPlayerId].language; - } } } } @@ -1337,16 +1309,14 @@ bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 colo TVShow *show; u8 name[32]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot == -1) - { return FALSE; - } - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS); - if (gSpecialVar_Result == 1) - { - return FALSE; - } + + TryReplaceOldTVShowOfKind(TVSHOW_3_CHEERS_FOR_POKEBLOCKS); + if (gSpecialVar_Result == TRUE) + return FALSE; // Old show is still active + show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->threeCheers.kind = TVSHOW_3_CHEERS_FOR_POKEBLOCKS; show->threeCheers.active = TRUE; @@ -1357,16 +1327,12 @@ bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 colo show->threeCheers.flavor = flavor; show->threeCheers.color = color; show->threeCheers.sheen = sheen; - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->threeCheers.language = gGameLanguage; if (show->threeCheers.language == LANGUAGE_JAPANESE || language == LANGUAGE_JAPANESE) - { show->threeCheers.worstBlenderLanguage = LANGUAGE_JAPANESE; - } else - { show->threeCheers.worstBlenderLanguage = language; - } return TRUE; } @@ -1387,16 +1353,12 @@ void PutFanClubSpecialOnTheAir(void) StringCopy(name, gStringVar1); StripExtCtrlCodes(name); StringCopy(show->fanClubSpecial.idolName, name); - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->fanClubSpecial.language = gGameLanguage; if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->linkBattleRecords.languages[0] == LANGUAGE_JAPANESE) - { show->fanClubSpecial.idolNameLanguage = LANGUAGE_JAPANESE; - } else - { show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->linkBattleRecords.languages[0]; - } } void ContestLiveUpdates_Init(u8 round1Placing) @@ -1404,7 +1366,7 @@ void ContestLiveUpdates_Init(u8 round1Placing) TVShow *show; DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; @@ -1415,64 +1377,45 @@ void ContestLiveUpdates_Init(u8 round1Placing) void ContestLiveUpdates_SetRound2Placing(u8 round2Placing) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) - { show->contestLiveUpdates.round2Placing = round2Placing; - } } void ContestLiveUpdates_SetWinnerAppealFlag(u8 flag) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) - { show->contestLiveUpdates.winnerAppealFlag = flag; - } } void ContestLiveUpdates_SetWinnerMoveUsed(u16 move) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) - { show->contestLiveUpdates.move = move; - } } void ContestLiveUpdates_SetLoserData(u8 flag, u8 loser) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show->contestLiveUpdates.losingSpecies = gContestMons[loser].species; StringCopy(show->contestLiveUpdates.losingTrainerName, gContestMons[loser].trainerName); StripExtCtrlCodes(show->contestLiveUpdates.losingTrainerName); show->contestLiveUpdates.loserAppealFlag = flag; + if (loser + 1 > gNumLinkContestPlayers) - { show->contestLiveUpdates.losingTrainerLanguage = gLinkPlayers[0].language; - } else if (gGameLanguage == LANGUAGE_JAPANESE || gLinkPlayers[loser].language == LANGUAGE_JAPANESE) - { show->contestLiveUpdates.losingTrainerLanguage = LANGUAGE_JAPANESE; - } else - { show->contestLiveUpdates.losingTrainerLanguage = gLinkPlayers[loser].language; - } } } @@ -1495,27 +1438,21 @@ static void InterviewAfter_BravoTrainerPokemonProfile(void) show2->bravoTrainer.move = show->bravoTrainer.move; show2->bravoTrainer.contestResult = show->bravoTrainer.contestResult; show2->bravoTrainer.contestCategory = show->bravoTrainer.contestCategory; - tv_store_id_2x(show2); + StorePlayerIdInNormalShow(show2); show2->bravoTrainer.language = gGameLanguage; if (show2->bravoTrainer.language == LANGUAGE_JAPANESE || show->bravoTrainer.pokemonNameLanguage == LANGUAGE_JAPANESE) - { show2->bravoTrainer.pokemonNameLanguage = LANGUAGE_JAPANESE; - } else - { show2->bravoTrainer.pokemonNameLanguage = show->bravoTrainer.pokemonNameLanguage; - } DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); } } void BravoTrainerPokemonProfile_BeforeInterview1(u16 a0) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; InterviewBefore_BravoTrainerPkmnProfile(); - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); @@ -1526,10 +1463,8 @@ void BravoTrainerPokemonProfile_BeforeInterview1(u16 a0) void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + TVShow *show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show->bravoTrainer.contestResult = contestStandingPlace; @@ -1544,9 +1479,7 @@ void BravoTrainerPokemonProfile_BeforeInterview2(u8 contestStandingPlace) static void InterviewAfter_BravoTrainerBattleTowerProfile(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; + TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->bravoTrainerTower.kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; show->bravoTrainerTower.active = TRUE; StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2Ptr->playerName); @@ -1556,27 +1489,19 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void) show->bravoTrainerTower.numFights = GetCurrentBattleTowerWinStreak(gSaveBlock2Ptr->frontier.towerLvlMode, 0); show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->frontier.towerBattleOutcome; if (gSaveBlock2Ptr->frontier.towerLvlMode == FRONTIER_LVL_50) - { show->bravoTrainerTower.btLevel = 50; - } else - { show->bravoTrainerTower.btLevel = 100; - } show->bravoTrainerTower.interviewResponse = gSpecialVar_0x8004; - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->bravoTrainerTower.language = gGameLanguage; if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage == LANGUAGE_JAPANESE) - { show->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE; - } else - { show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->frontier.towerInterview.opponentLanguage; - } } -void SaveRecordedItemPurchasesForTVShow(void) +void TryPutSmartShopperOnAir(void) { TVShow *show; u8 i; @@ -1585,24 +1510,24 @@ void SaveRecordedItemPurchasesForTVShow(void) && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_MART) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_MART)) && !rbernoulli(1, 3)) { - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SMART_SHOPPER, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_SMART_SHOPPER, FALSE) != TRUE) { - TV_SortPurchasesByQuantity(); + SortPurchasesByQuantity(); if (gMartPurchaseHistory[0].quantity >= 20) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->smartshopperShow.kind = TVSHOW_SMART_SHOPPER; - show->smartshopperShow.active = FALSE; + show->smartshopperShow.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show->smartshopperShow.shopLocation = gMapHeader.regionMapSectionId; - for (i = 0; i < 3; i ++) + for (i = 0; i < SMARTSHOPPER_NUM_ITEMS; i++) { show->smartshopperShow.itemIds[i] = gMartPurchaseHistory[i].itemId; show->smartshopperShow.itemAmounts[i] = gMartPurchaseHistory[i].quantity; } show->smartshopperShow.priceReduced = GetPriceReduction(POKENEWS_SLATEPORT); StringCopy(show->smartshopperShow.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->smartshopperShow.language = gGameLanguage; } } @@ -1625,11 +1550,11 @@ void PutNameRaterShowOnTheAir(void) show->nameRaterShow.species = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES, NULL); show->nameRaterShow.random = Random() % 3; show->nameRaterShow.random2 = Random() % 2; - show->nameRaterShow.randomSpecies = TV_GetSomeOtherSpeciesAlreadySeenByPlayer(show->nameRaterShow.species); + show->nameRaterShow.randomSpecies = GetRandomDifferentSpeciesSeenByPlayer(show->nameRaterShow.species); StringCopy(show->nameRaterShow.trainerName, gSaveBlock2Ptr->playerName); GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, show->nameRaterShow.pokemonName); StripExtCtrlCodes(show->nameRaterShow.pokemonName); - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->nameRaterShow.language = gGameLanguage; show->nameRaterShow.pokemonNameLanguage = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_LANGUAGE); } @@ -1638,9 +1563,7 @@ void PutNameRaterShowOnTheAir(void) void StartMassOutbreak(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; + TVShow *show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; gSaveBlock1Ptr->outbreakPokemonSpecies = show->massOutbreak.species; gSaveBlock1Ptr->outbreakLocationMapNum = show->massOutbreak.locationMapNum; gSaveBlock1Ptr->outbreakLocationMapGroup = show->massOutbreak.locationMapGroup; @@ -1660,52 +1583,46 @@ void PutLilycoveContestLadyShowOnTheAir(void) { TVShow *show; - sub_80EFA88(); + Script_FindFirstEmptyNormalTVShowSlot(); if (gSpecialVar_Result != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; - BufferContestLadyLanguage(&show->contestLiveUpdates2.language); - show->contestLiveUpdates2.pokemonNameLanguage = LANGUAGE_ENGLISH; - show->contestLiveUpdates2.kind = TVSHOW_CONTEST_LIVE_UPDATES_2; - show->contestLiveUpdates2.active = TRUE; - BufferContestLadyPlayerName(show->contestLiveUpdates2.playerName); - BufferContestLadyMonName(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname); - show->contestLiveUpdates2.pokeblockState = sub_818E880(); - tv_store_id_2x(show); + BufferContestLadyLanguage(&show->contestLady.language); + show->contestLady.pokemonNameLanguage = GAME_LANGUAGE; + show->contestLady.kind = TVSHOW_LILYCOVE_CONTEST_LADY; + show->contestLady.active = TRUE; + BufferContestLadyPlayerName(show->contestLady.playerName); + BufferContestLadyMonName(&show->contestLady.contestCategory, show->contestLady.nickname); + show->contestLady.pokeblockState = GetContestLadyPokeblockState(); + StorePlayerIdInNormalShow(show); } } static void InterviewAfter_FanClubLetter(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; + TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->fanclubLetter.kind = TVSHOW_FAN_CLUB_LETTER; show->fanclubLetter.active = TRUE; StringCopy(show->fanclubLetter.playerName, gSaveBlock2Ptr->playerName); show->fanclubLetter.species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->fanclubLetter.language = gGameLanguage; } static void InterviewAfter_RecentHappenings(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; + TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->recentHappenings.kind = TVSHOW_RECENT_HAPPENINGS; show->recentHappenings.active = TRUE; StringCopy(show->recentHappenings.playerName, gSaveBlock2Ptr->playerName); - show->recentHappenings.var02 = 0; - tv_store_id_2x(show); + show->recentHappenings.species = SPECIES_NONE; + StorePlayerIdInNormalShow(show); show->recentHappenings.language = gGameLanguage; } static void InterviewAfter_PkmnFanClubOpinions(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; + TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->fanclubOpinions.kind = TVSHOW_PKMN_FAN_CLUB_OPINIONS; show->fanclubOpinions.active = TRUE; show->fanclubOpinions.friendshipHighNybble = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_FRIENDSHIP, NULL) >> 4; @@ -1714,26 +1631,20 @@ static void InterviewAfter_PkmnFanClubOpinions(void) GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_NICKNAME, show->fanclubOpinions.nickname); StripExtCtrlCodes(show->fanclubOpinions.nickname); show->fanclubOpinions.species = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL); - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->fanclubOpinions.language = gGameLanguage; if (gGameLanguage == LANGUAGE_JAPANESE || GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE) - { show->fanclubOpinions.pokemonNameLanguage = LANGUAGE_JAPANESE; - } else - { show->fanclubOpinions.pokemonNameLanguage = GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_LANGUAGE); - } } -static void InterviewAfter_DummyShow4(void) +static void InterviewAfter_Dummy(void) { - TVShow *show; - - show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; + TVShow *show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; } -static void sub_80ED718(void) +static void TryStartRandomMassOutbreak(void) { u8 i; u16 outbreakIdx; @@ -1741,16 +1652,14 @@ static void sub_80ED718(void) if (FlagGet(FLAG_SYS_GAME_CLEAR)) { - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + for (i = 0; i < LAST_TVSHOW_IDX; i++) { if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK) - { return; - } } if (!rbernoulli(1, 200)) { - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { outbreakIdx = Random() % ARRAY_COUNT(sPokeOutbreakSpeciesList); @@ -1772,7 +1681,7 @@ static void sub_80ED718(void) show->massOutbreak.probability = 50; show->massOutbreak.var15 = 0; show->massOutbreak.daysLeft = 1; - tv_store_id_2x(show); + StorePlayerIdInNormalShow(show); show->massOutbreak.language = gGameLanguage; } } @@ -1800,9 +1709,9 @@ void UpdateTVShowsPerDay(u16 days) { UpdateMassOutbreakTimeLeft(days); TryEndMassOutbreak(days); - sub_80EF120(days); - sub_80EDA48(days); - sub_80EEB98(days); + UpdatePokeNewsTimeLeft(days); + ResolveWorldOfMastersShow(days); + ResolveNumberOneShow(days); } static void UpdateMassOutbreakTimeLeft(u16 days) @@ -1812,7 +1721,7 @@ static void UpdateMassOutbreakTimeLeft(u16 days) if (gSaveBlock1Ptr->outbreakPokemonSpecies == SPECIES_NONE) { - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + for (i = 0; i < LAST_TVSHOW_IDX; i++) { if (gSaveBlock1Ptr->tvShows[i].massOutbreak.kind == TVSHOW_MASS_OUTBREAK && gSaveBlock1Ptr->tvShows[i].massOutbreak.active == TRUE) { @@ -1841,7 +1750,7 @@ void RecordFishingAttemptForTV(bool8 caughtFish) if (caughtFish) { if (sPokemonAnglerAttemptCounters >> 8 > 4) - PutFishingAdviceShowOnTheAir(); + TryPutFishingAdviceOnAir(); sPokemonAnglerAttemptCounters &= 0xFF; if (sPokemonAnglerAttemptCounters != 0xFF) @@ -1850,7 +1759,7 @@ void RecordFishingAttemptForTV(bool8 caughtFish) else { if ((u8)sPokemonAnglerAttemptCounters > 4) - PutFishingAdviceShowOnTheAir(); + TryPutFishingAdviceOnAir(); sPokemonAnglerAttemptCounters &= 0xFF00; if (sPokemonAnglerAttemptCounters >> 8 != 0xFF) @@ -1858,21 +1767,21 @@ void RecordFishingAttemptForTV(bool8 caughtFish) } } -void PutFishingAdviceShowOnTheAir(void) +static void TryPutFishingAdviceOnAir(void) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FISHING_ADVICE, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_FISHING_ADVICE, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->pokemonAngler.kind = TVSHOW_FISHING_ADVICE; - show->pokemonAngler.active = FALSE; + show->pokemonAngler.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show->pokemonAngler.nBites = sPokemonAnglerAttemptCounters; show->pokemonAngler.nFails = sPokemonAnglerAttemptCounters >> 8; show->pokemonAngler.species = sPokemonAnglerSpecies; StringCopy(show->pokemonAngler.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->pokemonAngler.language = gGameLanguage; } } @@ -1882,7 +1791,11 @@ void SetPokemonAnglerSpecies(u16 species) sPokemonAnglerSpecies = species; } -static void sub_80EDA48(u16 days) +// World of Masters is initialized in the last slot by InitWorldOfMastersShowAttempt +// If enough Pokémon were caught during the day the show can be put on air (and will +// be moved out of the last slot). +// Either way the temporary version of the show in the last slot is deleted. +static void ResolveWorldOfMastersShow(u16 days) { TVShow *show; @@ -1890,14 +1803,13 @@ static void sub_80EDA48(u16 days) if (show->worldOfMasters.kind == TVSHOW_WORLD_OF_MASTERS) { if (show->worldOfMasters.numPokeCaught >= 20) - { - sub_80EDA80(); - } + TryPutWorldOfMastersOnAir(); + DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); } } -void sub_80EDA80(void) +static void TryPutWorldOfMastersOnAir(void) { TVShow *show; TVShow *show2; @@ -1905,19 +1817,19 @@ void sub_80EDA80(void) show = &gSaveBlock1Ptr->tvShows[LAST_TVSHOW_IDX]; if (!rbernoulli(1, 1)) { - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_WORLD_OF_MASTERS, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_WORLD_OF_MASTERS, FALSE) != TRUE) { show2 = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show2->worldOfMasters.kind = TVSHOW_WORLD_OF_MASTERS; - show2->worldOfMasters.active = FALSE; + show2->worldOfMasters.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show2->worldOfMasters.numPokeCaught = show->worldOfMasters.numPokeCaught; show2->worldOfMasters.steps = GetGameStat(GAME_STAT_STEPS) - show->worldOfMasters.steps; show2->worldOfMasters.caughtPoke = show->worldOfMasters.caughtPoke; show2->worldOfMasters.species = show->worldOfMasters.species; show2->worldOfMasters.location = show->worldOfMasters.location; StringCopy(show2->worldOfMasters.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show2); + StorePlayerIdInRecordMixShow(show2); show2->worldOfMasters.language = gGameLanguage; DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, LAST_TVSHOW_IDX); } @@ -1930,66 +1842,57 @@ void TryPutTodaysRivalTrainerOnAir(void) u32 i; u8 nBadges; - HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TODAYS_RIVAL_TRAINER, TRUE); - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + IsRecordMixShowAlreadySpawned(TVSHOW_TODAYS_RIVAL_TRAINER, TRUE); // Delete old version of show + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->rivalTrainer.kind = TVSHOW_TODAYS_RIVAL_TRAINER; - show->rivalTrainer.active = FALSE; - for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + NUM_BADGES; i ++) + show->rivalTrainer.active = FALSE; // NOTE: Show is not active until passed via Record Mix. + for (i = FLAG_BADGE01_GET, nBadges = 0; i < FLAG_BADGE01_GET + NUM_BADGES; i++) { if (FlagGet(i)) - { - nBadges ++; - } + nBadges++; } show->rivalTrainer.badgeCount = nBadges; if (IsNationalPokedexEnabled()) - { show->rivalTrainer.dexCount = GetNationalPokedexCount(FLAG_GET_CAUGHT); - } else - { show->rivalTrainer.dexCount = GetHoennPokedexCount(FLAG_GET_CAUGHT); - } show->rivalTrainer.location = gMapHeader.regionMapSectionId; show->rivalTrainer.mapLayoutId = gMapHeader.mapLayoutId; show->rivalTrainer.nSilverSymbols = 0; show->rivalTrainer.nGoldSymbols = 0; - for (i = 0; i < 7; i ++) + for (i = 0; i < 7; i++) { if (FlagGet(sSilverSymbolFlags[i]) == TRUE) - { - show->rivalTrainer.nSilverSymbols ++; - } + show->rivalTrainer.nSilverSymbols++; + if (FlagGet(sGoldSymbolFlags[i]) == TRUE) - { - show->rivalTrainer.nGoldSymbols ++; - } + show->rivalTrainer.nGoldSymbols++; } show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontier.battlePoints; StringCopy(show->rivalTrainer.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->rivalTrainer.language = gGameLanguage; } } -void sub_80EDC60(const u16 *words) +void TryPutTrendWatcherOnAir(const u16 *words) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TREND_WATCHER, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_TREND_WATCHER, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->trendWatcher.kind = TVSHOW_TREND_WATCHER; - show->trendWatcher.active = FALSE; + show->trendWatcher.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show->trendWatcher.gender = gSaveBlock2Ptr->playerGender; show->trendWatcher.words[0] = words[0]; show->trendWatcher.words[1] = words[1]; StringCopy(show->trendWatcher.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->trendWatcher.language = gGameLanguage; } } @@ -1998,70 +1901,70 @@ void TryPutTreasureInvestigatorsOnAir(void) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TREASURE_INVESTIGATORS, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_TREASURE_INVESTIGATORS, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->treasureInvestigators.kind = TVSHOW_TREASURE_INVESTIGATORS; - show->treasureInvestigators.active = FALSE; + show->treasureInvestigators.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show->treasureInvestigators.item = gSpecialVar_0x8005; show->treasureInvestigators.location = gMapHeader.regionMapSectionId; show->treasureInvestigators.mapLayoutId = gMapHeader.mapLayoutId; StringCopy(show->treasureInvestigators.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->treasureInvestigators.language = gGameLanguage; } } -void AlertTVOfNewCoinTotal(u16 nCoinsPaidOut) +void TryPutFindThatGamerOnAir(u16 nCoinsPaidOut) { TVShow *show; bool8 flag; u16 nCoinsWon; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FIND_THAT_GAMER, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_FIND_THAT_GAMER, FALSE) != TRUE) { flag = FALSE; switch (sFindThatGamerWhichGame) { - case SLOT_MACHINE: - if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 200) - { - flag = TRUE; - nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent; - break; - } - if (sFindThatGamerCoinsSpent >= 100 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 100) - { - nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut; - break; - } - return; - case ROULETTE: - if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 50) - { - flag = TRUE; - nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent; - break; - } - if (sFindThatGamerCoinsSpent >= 50 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 50) - { - nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut; - break; - } - return; - default: - return; + case SLOT_MACHINE: + if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 200) + { + flag = TRUE; + nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent; + break; + } + if (sFindThatGamerCoinsSpent >= 100 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 100) + { + nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut; + break; + } + return; + case ROULETTE: + if (nCoinsPaidOut >= sFindThatGamerCoinsSpent + 50) + { + flag = TRUE; + nCoinsWon = nCoinsPaidOut - sFindThatGamerCoinsSpent; + break; + } + if (sFindThatGamerCoinsSpent >= 50 && nCoinsPaidOut <= sFindThatGamerCoinsSpent - 50) + { + nCoinsWon = sFindThatGamerCoinsSpent - nCoinsPaidOut; + break; + } + return; + default: + return; } show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->findThatGamer.kind = TVSHOW_FIND_THAT_GAMER; - show->findThatGamer.active = FALSE; + show->findThatGamer.active = FALSE; // NOTE: Show is not active until passed via Record Mix. show->findThatGamer.nCoins = nCoinsWon; show->findThatGamer.whichGame = sFindThatGamerWhichGame; show->findThatGamer.won = flag; StringCopy(show->findThatGamer.playerName, gSaveBlock2Ptr->playerName); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->findThatGamer.language = gGameLanguage; } } @@ -2078,72 +1981,64 @@ void AlertTVThatPlayerPlayedRoulette(u16 nCoinsSpent) sFindThatGamerCoinsSpent = nCoinsSpent; } -static void sub_80EDE98(TVShow *show) +static void SecretBaseVisit_CalculateDecorationData(TVShow *show) { - u8 i; - u8 j; + u8 i, j; u16 k; u8 n; - u8 deco; - u8 x; + u8 decoration; - for (i = 0; i < DECOR_MAX_SECRET_BASE; i ++) - { + for (i = 0; i < DECOR_MAX_SECRET_BASE; i++) sTV_DecorationsBuffer[i] = 0; - } - for (i = 0, n = 0; i < DECOR_MAX_SECRET_BASE; i ++) + + for (i = 0, n = 0; i < DECOR_MAX_SECRET_BASE; i++) { - deco = gSaveBlock1Ptr->secretBases[0].decorations[i]; - if (deco) + decoration = gSaveBlock1Ptr->secretBases[0].decorations[i]; + if (decoration) { - for (j = 0; j < DECOR_MAX_SECRET_BASE; j ++) + for (j = 0; j < DECOR_MAX_SECRET_BASE; j++) { if (sTV_DecorationsBuffer[j] == 0) { - sTV_DecorationsBuffer[j] = deco; - n ++; + sTV_DecorationsBuffer[j] = decoration; + n++; break; } - if (sTV_DecorationsBuffer[j] == deco) - { + if (sTV_DecorationsBuffer[j] == decoration) break; - } } } } + if (n > 4) - { show->secretBaseVisit.nDecorations = 4; - } else - { show->secretBaseVisit.nDecorations = n; - } + switch (show->secretBaseVisit.nDecorations) { - case 0: - break; - case 1: - show->secretBaseVisit.decorations[0] = sTV_DecorationsBuffer[0]; - break; - default: - for (k = 0; k < n * n; k ++) - { - deco = Random() % n; - j = Random() % n; - i = sTV_DecorationsBuffer[deco]; - sTV_DecorationsBuffer[deco] = sTV_DecorationsBuffer[j]; - sTV_DecorationsBuffer[j] = i; - } - for (i = 0; i < show->secretBaseVisit.nDecorations; i ++) - { - show->secretBaseVisit.decorations[i] = sTV_DecorationsBuffer[i]; - } - break; + case 0: + break; + case 1: + show->secretBaseVisit.decorations[0] = sTV_DecorationsBuffer[0]; + break; + default: + for (k = 0; k < n * n; k++) + { + decoration = Random() % n; + j = Random() % n; + i = sTV_DecorationsBuffer[decoration]; + sTV_DecorationsBuffer[decoration] = sTV_DecorationsBuffer[j]; + sTV_DecorationsBuffer[j] = i; + } + + for (i = 0; i < show->secretBaseVisit.nDecorations; i++) + show->secretBaseVisit.decorations[i] = sTV_DecorationsBuffer[i]; + break; } } -static void sub_80EDFB4(TVShow *show) +static void SecretBaseVisit_CalculatePartyData(TVShow *show) { u8 i; u16 move; @@ -2152,7 +2047,7 @@ static void sub_80EDFB4(TVShow *show) u8 nPokemon; u16 sum; - for (i = 0, nPokemon = 0; i < PARTY_SIZE; i ++) + for (i = 0, nPokemon = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { @@ -2163,128 +2058,119 @@ static void sub_80EDFB4(TVShow *show) if (move != MOVE_NONE) { sTV_SecretBaseVisitMovesTemp[nMoves] = move; - nMoves ++; + nMoves++; } move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE2); if (move != MOVE_NONE) { sTV_SecretBaseVisitMovesTemp[nMoves] = move; - nMoves ++; + nMoves++; } move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE3); if (move != MOVE_NONE) { sTV_SecretBaseVisitMovesTemp[nMoves] = move; - nMoves ++; + nMoves++; } move = GetMonData(&gPlayerParty[i], MON_DATA_MOVE4); if (move != MOVE_NONE) { sTV_SecretBaseVisitMovesTemp[nMoves] = move; - nMoves ++; + nMoves++; } sTV_SecretBaseVisitMonsTemp[nPokemon].move = sTV_SecretBaseVisitMovesTemp[Random() % nMoves]; - nPokemon ++; + nPokemon++; } } - for (i = 0, sum = 0; i < nPokemon; i ++) - { + for (i = 0, sum = 0; i < nPokemon; i++) sum += sTV_SecretBaseVisitMonsTemp[i].level; - } + show->secretBaseVisit.avgLevel = sum / nPokemon; j = Random() % nPokemon; show->secretBaseVisit.species = sTV_SecretBaseVisitMonsTemp[j].species; show->secretBaseVisit.move = sTV_SecretBaseVisitMonsTemp[j].move; } -void TV_PutSecretBaseVisitOnTheAir(void) +void TryPutSecretBaseVisitOnAir(void) { TVShow *show; - HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SECRET_BASE_VISIT, TRUE); - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + IsRecordMixShowAlreadySpawned(TVSHOW_SECRET_BASE_VISIT, TRUE); // Delete old version of show + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->secretBaseVisit.kind = TVSHOW_SECRET_BASE_VISIT; - show->secretBaseVisit.active = FALSE; + show->secretBaseVisit.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->secretBaseVisit.playerName, gSaveBlock2Ptr->playerName); - sub_80EDE98(show); - sub_80EDFB4(show); - tv_store_id_3x(show); + SecretBaseVisit_CalculateDecorationData(show); + SecretBaseVisit_CalculatePartyData(show); + StorePlayerIdInRecordMixShow(show); show->secretBaseVisit.language = gGameLanguage; } } -void sub_80EE184(void) +void TryPutBreakingNewsOnAir(void) { TVShow *show; u8 i; u16 balls; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_BREAKING_NEWS, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_BREAKING_NEWS, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->breakingNews.kind = TVSHOW_BREAKING_NEWS; - show->breakingNews.active = FALSE; + show->breakingNews.active = FALSE; // NOTE: Show is not active until passed via Record Mix. balls = 0; - for (i = 0; i < POKEBALL_COUNT - 1; i ++) - { + for (i = 0; i < POKEBALL_COUNT - 1; i++) balls += gBattleResults.catchAttempts[i]; - } + if (gBattleResults.usedMasterBall) - { - balls ++; - } + balls++; show->breakingNews.location = gMapHeader.regionMapSectionId; StringCopy(show->breakingNews.playerName, gSaveBlock2Ptr->playerName); show->breakingNews.poke1Species = gBattleResults.playerMon1Species; switch (gBattleOutcome) { - case B_OUTCOME_LOST: - case B_OUTCOME_DREW: - show->breakingNews.kind = TVSHOW_OFF_AIR; - return; - case B_OUTCOME_CAUGHT: - show->breakingNews.outcome = 0; - break; - case B_OUTCOME_WON: - show->breakingNews.outcome = 1; - break; - case B_OUTCOME_RAN: - case B_OUTCOME_PLAYER_TELEPORTED: - case B_OUTCOME_NO_SAFARI_BALLS: - show->breakingNews.outcome = 2; - break; - case B_OUTCOME_MON_FLED: - case B_OUTCOME_MON_TELEPORTED: - show->breakingNews.outcome = 3; - break; + case B_OUTCOME_LOST: + case B_OUTCOME_DREW: + show->breakingNews.kind = TVSHOW_OFF_AIR; + return; + case B_OUTCOME_CAUGHT: + show->breakingNews.outcome = 0; + break; + case B_OUTCOME_WON: + show->breakingNews.outcome = 1; + break; + case B_OUTCOME_RAN: + case B_OUTCOME_PLAYER_TELEPORTED: + case B_OUTCOME_NO_SAFARI_BALLS: + show->breakingNews.outcome = 2; + break; + case B_OUTCOME_MON_FLED: + case B_OUTCOME_MON_TELEPORTED: + show->breakingNews.outcome = 3; + break; } show->breakingNews.lastOpponentSpecies = gBattleResults.lastOpponentSpecies; switch (show->breakingNews.outcome) { - case 0: - if (gBattleResults.usedMasterBall) - { - show->breakingNews.caughtMonBall = ITEM_MASTER_BALL; - } - else - { - show->breakingNews.caughtMonBall = gBattleResults.caughtMonBall; - } - show->breakingNews.balls = balls; - break; - case 1: - show->breakingNews.lastUsedMove = gBattleResults.lastUsedMovePlayer; - break; - case 2: - break; - case 3: - break; + case 0: + if (gBattleResults.usedMasterBall) + show->breakingNews.caughtMonBall = ITEM_MASTER_BALL; + else + show->breakingNews.caughtMonBall = gBattleResults.caughtMonBall; + show->breakingNews.balls = balls; + break; + case 1: + show->breakingNews.lastUsedMove = gBattleResults.lastUsedMovePlayer; + break; + case 2: + case 3: + break; } - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->breakingNews.language = gGameLanguage; } } @@ -2293,65 +2179,65 @@ void TryPutLotteryWinnerReportOnAir(void) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_LOTTO_WINNER, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_LOTTO_WINNER, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->lottoWinner.kind = TVSHOW_LOTTO_WINNER; - show->lottoWinner.active = FALSE; + show->lottoWinner.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->lottoWinner.playerName, gSaveBlock2Ptr->playerName); show->lottoWinner.whichPrize = 4 - gSpecialVar_0x8004; show->lottoWinner.item = gSpecialVar_0x8005; - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->lottoWinner.language = gGameLanguage; } } -void sub_80EE35C(u16 foeSpecies, u16 species, u8 moveIdx, const u16 *movePtr, u16 betterMove) +void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIdx, const u16 *movePtr, u16 betterMove) { TVShow *show; u8 i; u8 j; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_BATTLE_SEMINAR, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_BATTLE_SEMINAR, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->battleSeminar.kind = TVSHOW_BATTLE_SEMINAR; - show->battleSeminar.active = FALSE; + show->battleSeminar.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->battleSeminar.playerName, gSaveBlock2Ptr->playerName); show->battleSeminar.foeSpecies = foeSpecies; show->battleSeminar.species = species; show->battleSeminar.move = movePtr[moveIdx]; - for (i = 0, j = 0; i < MAX_MON_MOVES; i ++) + for (i = 0, j = 0; i < MAX_MON_MOVES; i++) { if (i != moveIdx && movePtr[i]) { show->battleSeminar.otherMoves[j] = movePtr[i]; - j ++; + j++; } } show->battleSeminar.nOtherMoves = j; show->battleSeminar.betterMove = betterMove; - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->battleSeminar.language = gGameLanguage; } } -void sub_80EE44C(u8 nMonsCaught, u8 nPkblkUsed) +void TryPutSafariFanClubOnAir(u8 nMonsCaught, u8 nPkblkUsed) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SAFARI_FAN_CLUB, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_SAFARI_FAN_CLUB, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->safariFanClub.kind = TVSHOW_SAFARI_FAN_CLUB; - show->safariFanClub.active = FALSE; + show->safariFanClub.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->safariFanClub.playerName, gSaveBlock2Ptr->playerName); show->safariFanClub.nMonsCaught = nMonsCaught; show->safariFanClub.nPkblkUsed = nPkblkUsed; - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->safariFanClub.language = gGameLanguage; } } @@ -2360,27 +2246,23 @@ void TryPutSpotTheCutiesOnAir(struct Pokemon *pokemon, u8 ribbonMonDataIdx) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_CUTIES, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_CUTIES, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->cuties.kind = TVSHOW_CUTIES; - show->cuties.active = FALSE; + show->cuties.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->cuties.playerName, gSaveBlock2Ptr->playerName); GetMonData(pokemon, MON_DATA_NICKNAME, show->cuties.nickname); StripExtCtrlCodes(show->cuties.nickname); show->cuties.nRibbons = GetRibbonCount(pokemon); - show->cuties.selectedRibbon = TV_MonDataIdxToRibbon(ribbonMonDataIdx); - tv_store_id_3x(show); + show->cuties.selectedRibbon = MonDataIdxToRibbon(ribbonMonDataIdx); + StorePlayerIdInRecordMixShow(show); show->cuties.language = gGameLanguage; if (show->cuties.language == LANGUAGE_JAPANESE || GetMonData(pokemon, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE) - { show->cuties.pokemonNameLanguage = LANGUAGE_JAPANESE; - } else - { show->cuties.pokemonNameLanguage = GetMonData(pokemon, MON_DATA_LANGUAGE); - } } } @@ -2399,63 +2281,63 @@ u8 GetRibbonCount(struct Pokemon *pokemon) nRibbons += GetMonData(pokemon, MON_DATA_VICTORY_RIBBON); nRibbons += GetMonData(pokemon, MON_DATA_ARTIST_RIBBON); nRibbons += GetMonData(pokemon, MON_DATA_EFFORT_RIBBON); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_1); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_2); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_3); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_4); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_5); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_6); - nRibbons += GetMonData(pokemon, MON_DATA_GIFT_RIBBON_7); + nRibbons += GetMonData(pokemon, MON_DATA_MARINE_RIBBON); + nRibbons += GetMonData(pokemon, MON_DATA_LAND_RIBBON); + nRibbons += GetMonData(pokemon, MON_DATA_SKY_RIBBON); + nRibbons += GetMonData(pokemon, MON_DATA_COUNTRY_RIBBON); + nRibbons += GetMonData(pokemon, MON_DATA_NATIONAL_RIBBON); + nRibbons += GetMonData(pokemon, MON_DATA_EARTH_RIBBON); + nRibbons += GetMonData(pokemon, MON_DATA_WORLD_RIBBON); 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_GIFT_RIBBON_1) return 25; - if (monDataIdx == MON_DATA_GIFT_RIBBON_2) return 26; - if (monDataIdx == MON_DATA_GIFT_RIBBON_3) return 27; - if (monDataIdx == MON_DATA_GIFT_RIBBON_4) return 28; - if (monDataIdx == MON_DATA_GIFT_RIBBON_5) return 29; - if (monDataIdx == MON_DATA_GIFT_RIBBON_6) return 30; - if (monDataIdx == MON_DATA_GIFT_RIBBON_7) 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) +void TryPutTrainerFanClubOnAir(void) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); - if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_TRAINER_FAN_CLUB, FALSE) != TRUE) + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); + if (sCurTVShowSlot != -1 && IsRecordMixShowAlreadySpawned(TVSHOW_TRAINER_FAN_CLUB, FALSE) != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->trainerFanClub.kind = TVSHOW_TRAINER_FAN_CLUB; - show->trainerFanClub.active = FALSE; + show->trainerFanClub.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->trainerFanClub.playerName, gSaveBlock2Ptr->playerName); show->trainerFanClub.words[0] = gSaveBlock1Ptr->easyChatProfile[0]; show->trainerFanClub.words[1] = gSaveBlock1Ptr->easyChatProfile[1]; - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->trainerFanClub.language = gGameLanguage; } } bool8 ShouldHideFanClubInterviewer(void) { - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot == -1) return TRUE; - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL); + TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_SPECIAL); if (gSpecialVar_Result == TRUE) return TRUE; @@ -2471,25 +2353,24 @@ bool8 ShouldAirFrontierTVShow(void) u8 showIdx; TVShow *shows; - if (HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_FRONTIER, FALSE) == TRUE) + if (IsRecordMixShowAlreadySpawned(TVSHOW_FRONTIER, FALSE) == TRUE) { shows = gSaveBlock1Ptr->tvShows; playerId = GetPlayerIDAsU32(); - for (showIdx = 5; showIdx < LAST_TVSHOW_IDX; showIdx ++) + for (showIdx = NUM_NORMAL_TVSHOW_SLOTS; showIdx < LAST_TVSHOW_IDX; showIdx++) { if (shows[showIdx].common.kind == TVSHOW_FRONTIER && (playerId & 0xFF) == shows[showIdx].common.trainerIdLo && ((playerId >> 8) & 0xFF) == shows[showIdx].common.trainerIdHi) { DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, showIdx); - sub_80EF93C(gSaveBlock1Ptr->tvShows); + CompactTVShowArray(gSaveBlock1Ptr->tvShows); return TRUE; } } } - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot == -1) - { return FALSE; - } + return TRUE; } @@ -2497,47 +2378,47 @@ void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facilityAndMode) { TVShow *show; - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->frontier.kind = TVSHOW_FRONTIER; - show->frontier.active = FALSE; + show->frontier.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->frontier.playerName, gSaveBlock2Ptr->playerName); show->frontier.winStreak = winStreak; - show->frontier.facility = facilityAndMode; + show->frontier.facilityAndMode = facilityAndMode; switch (facilityAndMode) { - case 1: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); - show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL); - break; - case 2: - show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); - show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL); - show->frontier.species4 = GetMonData(&gPlayerParty[3], MON_DATA_SPECIES, NULL); - break; - case 3: - show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); - break; - case 4: - show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1], MON_DATA_SPECIES, NULL); - break; + case FRONTIER_SHOW_TOWER_SINGLES: + case FRONTIER_SHOW_DOME_SINGLES: + case FRONTIER_SHOW_DOME_DOUBLES: + case FRONTIER_SHOW_FACTORY_SINGLES: + case FRONTIER_SHOW_FACTORY_DOUBLES: + case FRONTIER_SHOW_PIKE: + case FRONTIER_SHOW_ARENA: + case FRONTIER_SHOW_PALACE_SINGLES: + case FRONTIER_SHOW_PALACE_DOUBLES: + case FRONTIER_SHOW_PYRAMID: + show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); + show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL); + break; + case FRONTIER_SHOW_TOWER_DOUBLES: + show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); + show->frontier.species3 = GetMonData(&gPlayerParty[2], MON_DATA_SPECIES, NULL); + show->frontier.species4 = GetMonData(&gPlayerParty[3], MON_DATA_SPECIES, NULL); + break; + case FRONTIER_SHOW_TOWER_MULTIS: + show->frontier.species1 = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); + break; + case FRONTIER_SHOW_TOWER_LINK_MULTIS: + show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[0] - 1], MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.selectedPartyMons[1] - 1], MON_DATA_SPECIES, NULL); + break; } - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->frontier.language = gGameLanguage; } } @@ -2547,14 +2428,14 @@ void TryPutSecretBaseSecretsOnAir(void) TVShow *show; u8 strbuf[32]; - if (HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_SECRET_BASE_SECRETS, FALSE) != TRUE) + if (IsRecordMixShowAlreadySpawned(TVSHOW_SECRET_BASE_SECRETS, FALSE) != TRUE) { - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->secretBaseSecrets.kind = TVSHOW_SECRET_BASE_SECRETS; - show->secretBaseSecrets.active = FALSE; + show->secretBaseSecrets.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->secretBaseSecrets.playerName, gSaveBlock2Ptr->playerName); show->secretBaseSecrets.stepsInBase = VarGet(VAR_SECRET_BASE_STEP_COUNTER); CopyCurSecretBaseOwnerName_StrVar1(); @@ -2563,53 +2444,50 @@ void TryPutSecretBaseSecretsOnAir(void) StringCopy(show->secretBaseSecrets.baseOwnersName, strbuf); show->secretBaseSecrets.item = VarGet(VAR_SECRET_BASE_LAST_ITEM_USED); show->secretBaseSecrets.flags = VarGet(VAR_SECRET_BASE_LOW_TV_FLAGS) + (VarGet(VAR_SECRET_BASE_HIGH_TV_FLAGS) << 16); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->secretBaseSecrets.language = gGameLanguage; if (show->secretBaseSecrets.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].language == LANGUAGE_JAPANESE) - { show->secretBaseSecrets.baseOwnersNameLanguage = LANGUAGE_JAPANESE; - } else - { show->secretBaseSecrets.baseOwnersNameLanguage = gSaveBlock1Ptr->secretBases[VarGet(VAR_CURRENT_SECRET_BASE)].language; - } } } } -static void sub_80EEB98(u16 days) +// Check var thresholds required to trigger the Number One show +// The vars are reset afterwards regardless +static void ResolveNumberOneShow(u16 days) { u8 i; - for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i ++) + for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i++) { if (VarGet(sNumberOneVarsAndThresholds[i][0]) >= sNumberOneVarsAndThresholds[i][1]) { - sub_80EEBF4(i); + TryPutNumberOneOnAir(i); break; } } - for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i ++) - { + + for (i = 0; i < ARRAY_COUNT(sNumberOneVarsAndThresholds); i++) VarSet(sNumberOneVarsAndThresholds[i][0], 0); - } } -static void sub_80EEBF4(u8 actionIdx) +static void TryPutNumberOneOnAir(u8 actionIdx) { TVShow *show; - HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_NUMBER_ONE, TRUE); - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + IsRecordMixShowAlreadySpawned(TVSHOW_NUMBER_ONE, TRUE); // Delete old version of show + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); if (sCurTVShowSlot != -1) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; show->numberOne.kind = TVSHOW_NUMBER_ONE; - show->numberOne.active = FALSE; + show->numberOne.active = FALSE; // NOTE: Show is not active until passed via Record Mix. StringCopy(show->numberOne.playerName, gSaveBlock2Ptr->playerName); show->numberOne.actionIdx = actionIdx; show->numberOne.count = VarGet(sNumberOneVarsAndThresholds[actionIdx][0]); - tv_store_id_3x(show); + StorePlayerIdInRecordMixShow(show); show->numberOne.language = gGameLanguage; } } @@ -2651,72 +2529,66 @@ void IncrementDailyBattlePoints(u16 delta) // PokeNews -static void sub_80EED88(void) +static void TryPutRandomPokeNewsOnAir(void) { - u8 newsKind; - if (FlagGet(FLAG_SYS_GAME_CLEAR)) { - sCurTVShowSlot = sub_80EEE30(gSaveBlock1Ptr->pokeNews); + sCurTVShowSlot = GetFirstEmptyPokeNewsSlot(gSaveBlock1Ptr->pokeNews); if (sCurTVShowSlot != -1 && rbernoulli(1, 100) != TRUE) { - newsKind = (Random() % 4) + POKENEWS_SLATEPORT; - if (sub_80EF0E4(newsKind) != TRUE) + u8 newsKind = (Random() % NUM_POKENEWS_TYPES) + POKENEWS_SLATEPORT; + if (IsAddingPokeNewsDisallowed(newsKind) != TRUE) { gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].kind = newsKind; gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].days = 4; - gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].state = TRUE; + gSaveBlock1Ptr->pokeNews[sCurTVShowSlot].state = 1; } } } } -s8 sub_80EEE30(PokeNews *pokeNews) +static s8 GetFirstEmptyPokeNewsSlot(PokeNews *pokeNews) { s8 i; - for (i = 0; i < POKE_NEWS_COUNT; i ++) + for (i = 0; i < POKE_NEWS_COUNT; i++) { - if (pokeNews[i].kind == 0) - { + if (pokeNews[i].kind == POKENEWS_NONE) return i; - } } return -1; } -void ClearPokemonNews(void) +static void ClearPokeNews(void) { u8 i; - for (i = 0; i < POKE_NEWS_COUNT; i ++) - { - ClearPokemonNewsI(i); - } + for (i = 0; i < POKE_NEWS_COUNT; i++) + ClearPokeNewsBySlot(i); } -void ClearPokemonNewsI(u8 i) +static void ClearPokeNewsBySlot(u8 i) { gSaveBlock1Ptr->pokeNews[i].kind = POKENEWS_NONE; gSaveBlock1Ptr->pokeNews[i].state = FALSE; gSaveBlock1Ptr->pokeNews[i].days = 0; } -static void sub_80EEEB8(void) +static void CompactPokeNews(void) { u8 i; u8 j; - for (i = 0; i < POKE_NEWS_COUNT - 1; i ++) + for (i = 0; i < POKE_NEWS_COUNT - 1; i++) { if (gSaveBlock1Ptr->pokeNews[i].kind == POKENEWS_NONE) { - for (j = i + 1; j < POKE_NEWS_COUNT; j ++) + for (j = i + 1; j < POKE_NEWS_COUNT; j++) { if (gSaveBlock1Ptr->pokeNews[j].kind != POKENEWS_NONE) { gSaveBlock1Ptr->pokeNews[i] = gSaveBlock1Ptr->pokeNews[j]; - ClearPokemonNewsI(j); + ClearPokeNewsBySlot(j); break; } } @@ -2724,16 +2596,16 @@ static void sub_80EEEB8(void) } } -u8 FindAnyTVNewsOnTheAir(void) +static u8 FindAnyPokeNewsOnTheAir(void) { u8 i; - for (i = 0; i < POKE_NEWS_COUNT; i ++) + for (i = 0; i < POKE_NEWS_COUNT; i++) { - if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE && gSaveBlock1Ptr->pokeNews[i].state == TRUE && gSaveBlock1Ptr->pokeNews[i].days < 3) - { + if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE + && gSaveBlock1Ptr->pokeNews[i].state == 1 + && gSaveBlock1Ptr->pokeNews[i].days < 3) return i; - } } return 0xFF; } @@ -2743,7 +2615,7 @@ void DoPokeNews(void) u8 i; u16 n; - i = FindAnyTVNewsOnTheAir(); + i = FindAnyPokeNewsOnTheAir(); if (i == 0xFF) { gSpecialVar_Result = FALSE; @@ -2754,13 +2626,9 @@ void DoPokeNews(void) { gSaveBlock1Ptr->pokeNews[i].state = 2; if (gLocalTime.hours < 20) - { ShowFieldMessage(sPokeNewsTextGroup_Ongoing[gSaveBlock1Ptr->pokeNews[i].kind]); - } else - { ShowFieldMessage(sPokeNewsTextGroup_Ending[gSaveBlock1Ptr->pokeNews[i].kind]); - } } else { @@ -2778,101 +2646,92 @@ bool8 GetPriceReduction(u8 newsKind) u8 i; if (newsKind == POKENEWS_NONE) - { return FALSE; - } - for (i = 0; i < POKE_NEWS_COUNT; i ++) + + for (i = 0; i < POKE_NEWS_COUNT; i++) { if (gSaveBlock1Ptr->pokeNews[i].kind == newsKind) { if (gSaveBlock1Ptr->pokeNews[i].state == 2 && IsPriceDiscounted(newsKind)) - { return TRUE; - } + return FALSE; } } return FALSE; } -bool8 IsPriceDiscounted(u8 newsKind) +static bool8 IsPriceDiscounted(u8 newsKind) { switch (newsKind) { - case POKENEWS_SLATEPORT: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) && gSpecialVar_LastTalked == 25) - { - return TRUE; - } - return FALSE; - case POKENEWS_LILYCOVE: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) - { - return TRUE; - } - return FALSE; + case POKENEWS_SLATEPORT: + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) && gSpecialVar_LastTalked == 25) + return TRUE; + return FALSE; + case POKENEWS_LILYCOVE: + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) + return TRUE; + return FALSE; } return TRUE; } -bool8 sub_80EF0E4(u8 newsKind) +static bool8 IsAddingPokeNewsDisallowed(u8 newsKind) { u8 i; if (newsKind == POKENEWS_NONE) - { return TRUE; - } - for (i = 0; i < POKE_NEWS_COUNT; i ++) + + // Check if this type of news is already active + for (i = 0; i < POKE_NEWS_COUNT; i++) { if (gSaveBlock1Ptr->pokeNews[i].kind == newsKind) - { return TRUE; - } } return FALSE; } -static void sub_80EF120(u16 days) +static void UpdatePokeNewsTimeLeft(u16 days) { u8 i; - for (i = 0; i < POKE_NEWS_COUNT; i ++) + for (i = 0; i < POKE_NEWS_COUNT; i++) { if (gSaveBlock1Ptr->pokeNews[i].kind != POKENEWS_NONE) { if (gSaveBlock1Ptr->pokeNews[i].days < days) { - ClearPokemonNewsI(i); + ClearPokeNewsBySlot(i); } else { if (gSaveBlock1Ptr->pokeNews[i].state == 0 && FlagGet(FLAG_SYS_GAME_CLEAR) == TRUE) - { gSaveBlock1Ptr->pokeNews[i].state = 1; - } + gSaveBlock1Ptr->pokeNews[i].days -= days; } } } - sub_80EEEB8(); + CompactPokeNews(); } void CopyContestRankToStringVar(u8 varIdx, u8 rank) { switch (rank) { - case CONTEST_RANK_NORMAL: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_NORMAL]); - break; - case CONTEST_RANK_SUPER: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SUPER]); - break; - case CONTEST_RANK_HYPER: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_HYPER]); - break; - case CONTEST_RANK_MASTER: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_MASTER]); - break; + case CONTEST_RANK_NORMAL: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_NORMAL]); + break; + case CONTEST_RANK_SUPER: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SUPER]); + break; + case CONTEST_RANK_HYPER: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_HYPER]); + break; + case CONTEST_RANK_MASTER: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_MASTER]); + break; } } @@ -2880,21 +2739,21 @@ void CopyContestCategoryToStringVar(u8 varIdx, u8 category) { switch (category) { - case CONTEST_CATEGORY_COOL: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_COOL]); - break; - case CONTEST_CATEGORY_BEAUTY: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_BEAUTY]); - break; - case CONTEST_CATEGORY_CUTE: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_CUTE]); - break; - case CONTEST_CATEGORY_SMART: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SMART]); - break; - case CONTEST_CATEGORY_TOUGH: - StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_TOUGH]); - break; + case CONTEST_CATEGORY_COOL: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_COOL]); + break; + case CONTEST_CATEGORY_BEAUTY: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_BEAUTY]); + break; + case CONTEST_CATEGORY_CUTE: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_CUTE]); + break; + case CONTEST_CATEGORY_SMART: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_SMART]); + break; + case CONTEST_CATEGORY_TOUGH: + StringCopy(gTVStringVarPtrs[varIdx], gStdStrings[STDSTRING_TOUGH]); + break; } } @@ -2906,11 +2765,9 @@ void SetContestCategoryStringVarForInterview(void) CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory); } -void TV_PrintIntToStringVar(u8 varIdx, int value) +void ConvertIntToDecimalString(u8 varIdx, int value) { - int nDigits; - - nDigits = CountDigits(value); + int nDigits = CountDigits(value); ConvertIntToDecimalStringN(gTVStringVarPtrs[varIdx], value, STR_CONV_MODE_LEFT_ALIGN, nDigits); } @@ -2934,24 +2791,19 @@ static void sub_80EF40C(u8 varIdx, TVShow *show) int price; price = 0; - for (i = 0; i < 3; i ++) + for (i = 0; i < SMARTSHOPPER_NUM_ITEMS; i++) { if (show->smartshopperShow.itemIds[i] != ITEM_NONE) - { price += ItemId_GetPrice(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i]; - } } + if (show->smartshopperShow.priceReduced == TRUE) - { - TV_PrintIntToStringVar(varIdx, price >> 1); - } + ConvertIntToDecimalString(varIdx, price >> 1); else - { - TV_PrintIntToStringVar(varIdx, price); - } + ConvertIntToDecimalString(varIdx, price); } -bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag) +static bool8 IsRecordMixShowAlreadySpawned(u8 kind, bool8 delete) { u32 playerId; TVShow *shows; @@ -2959,14 +2811,16 @@ bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag) shows = gSaveBlock1Ptr->tvShows; playerId = GetPlayerIDAsU32(); - for (i = 5; i < LAST_TVSHOW_IDX; i ++) + for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++) { - if (shows[i].common.kind == kind && (playerId & 0xFF) == shows[i].common.trainerIdLo && ((playerId >> 8) & 0xFF) == shows[i].common.trainerIdHi) + if (shows[i].common.kind == kind + && (playerId & 0xFF) == shows[i].common.trainerIdLo + && ((playerId >> 8) & 0xFF) == shows[i].common.trainerIdHi) { - if (flag == TRUE) + if (delete == TRUE) { DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i); - sub_80EF93C(gSaveBlock1Ptr->tvShows); + CompactTVShowArray(gSaveBlock1Ptr->tvShows); } return TRUE; } @@ -2974,16 +2828,15 @@ bool8 HasMixableShowAlreadyBeenSpawnedWithPlayerID(u8 kind, bool8 flag) return FALSE; } -void TV_SortPurchasesByQuantity(void) +static void SortPurchasesByQuantity(void) { - u8 i; - u8 j; + u8 i, j; u16 tmpId; u16 tmpQn; - for (i = 0; i < 2; i ++) + for (i = 0; i < SMARTSHOPPER_NUM_ITEMS - 1; i++) { - for (j = i + 1; j < 3; j ++) + for (j = i + 1; j < SMARTSHOPPER_NUM_ITEMS; j++) { if (gMartPurchaseHistory[i].quantity < gMartPurchaseHistory[j].quantity) { @@ -2998,27 +2851,31 @@ void TV_SortPurchasesByQuantity(void) } } -void FindActiveBroadcastByShowType_SetScriptResult(u8 kind) +static void TryReplaceOldTVShowOfKind(u8 kind) { u8 i; - for (i = 0; i < 5; i ++) + for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++) { if (gSaveBlock1Ptr->tvShows[i].common.kind == kind) { if (gSaveBlock1Ptr->tvShows[i].common.active == TRUE) { + // Old TV show is still active, don't replace gSpecialVar_Result = TRUE; } else { + // Old TV show is inactive, replace it and get new slot DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i); - sub_80EF93C(gSaveBlock1Ptr->tvShows); - sub_80EFA88(); + CompactTVShowArray(gSaveBlock1Ptr->tvShows); + Script_FindFirstEmptyNormalTVShowSlot(); } return; } } - sub_80EFA88(); + + // Old TV show doesn't exist, just get new slot + Script_FindFirstEmptyNormalTVShowSlot(); } void InterviewBefore(void) @@ -3026,42 +2883,42 @@ void InterviewBefore(void) gSpecialVar_Result = FALSE; switch (gSpecialVar_0x8005) { - case TVSHOW_FAN_CLUB_LETTER: - InterviewBefore_FanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - InterviewBefore_RecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - InterviewBefore_PkmnFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - InterviewBefore_Dummy(); - break; - case TVSHOW_NAME_RATER_SHOW: - InterviewBefore_NameRater(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - InterviewBefore_BravoTrainerPkmnProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - InterviewBefore_BravoTrainerBTProfile(); - break; - case TVSHOW_CONTEST_LIVE_UPDATES: - InterviewBefore_ContestLiveUpdates(); - break; - case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: - InterviewBefore_3CheersForPokeblocks(); - break; - case TVSHOW_FAN_CLUB_SPECIAL: - InterviewBefore_FanClubSpecial(); - break; + case TVSHOW_FAN_CLUB_LETTER: + InterviewBefore_FanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + InterviewBefore_RecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + InterviewBefore_PkmnFanClubOpinions(); + break; + case TVSHOW_DUMMY: + InterviewBefore_Dummy(); + break; + case TVSHOW_NAME_RATER_SHOW: + InterviewBefore_NameRater(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + InterviewBefore_BravoTrainerPkmnProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + InterviewBefore_BravoTrainerBTProfile(); + break; + case TVSHOW_CONTEST_LIVE_UPDATES: + InterviewBefore_ContestLiveUpdates(); + break; + case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: + InterviewBefore_3CheersForPokeblocks(); + break; + case TVSHOW_FAN_CLUB_SPECIAL: + InterviewBefore_FanClubSpecial(); + break; } } static void InterviewBefore_FanClubLetter(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_LETTER); + TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_LETTER); if (!gSpecialVar_Result) { StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]); @@ -3071,7 +2928,7 @@ static void InterviewBefore_FanClubLetter(void) static void InterviewBefore_RecentHappenings(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_RECENT_HAPPENINGS); + TryReplaceOldTVShowOfKind(TVSHOW_RECENT_HAPPENINGS); if (!gSpecialVar_Result) { InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].recentHappenings.words, 6); @@ -3080,7 +2937,7 @@ static void InterviewBefore_RecentHappenings(void) static void InterviewBefore_PkmnFanClubOpinions(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_PKMN_FAN_CLUB_OPINIONS); + TryReplaceOldTVShowOfKind(TVSHOW_PKMN_FAN_CLUB_OPINIONS); if (!gSpecialVar_Result) { StringCopy(gStringVar1, gSpeciesNames[GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SPECIES, NULL)]); @@ -3097,44 +2954,38 @@ static void InterviewBefore_Dummy(void) static void InterviewBefore_NameRater(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_NAME_RATER_SHOW); + TryReplaceOldTVShowOfKind(TVSHOW_NAME_RATER_SHOW); } static void InterviewBefore_BravoTrainerPkmnProfile(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); + TryReplaceOldTVShowOfKind(TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE); if (!gSpecialVar_Result) - { InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].bravoTrainer.words, 2); - } } static void InterviewBefore_ContestLiveUpdates(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_CONTEST_LIVE_UPDATES); + TryReplaceOldTVShowOfKind(TVSHOW_CONTEST_LIVE_UPDATES); } static void InterviewBefore_3CheersForPokeblocks(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_3_CHEERS_FOR_POKEBLOCKS); + TryReplaceOldTVShowOfKind(TVSHOW_3_CHEERS_FOR_POKEBLOCKS); } static void InterviewBefore_BravoTrainerBTProfile(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); + TryReplaceOldTVShowOfKind(TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE); if (!gSpecialVar_Result) - { InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].bravoTrainerTower.words, 1); - } } static void InterviewBefore_FanClubSpecial(void) { - FindActiveBroadcastByShowType_SetScriptResult(TVSHOW_FAN_CLUB_SPECIAL); + TryReplaceOldTVShowOfKind(TVSHOW_FAN_CLUB_SPECIAL); if (!gSpecialVar_Result) - { InitializeEasyChatWordArray(gSaveBlock1Ptr->tvShows[sCurTVShowSlot].fanClubSpecial.words, 1); - } } static bool8 IsPartyMonNicknamedOrNotEnglish(u8 monIdx) @@ -3145,10 +2996,9 @@ static bool8 IsPartyMonNicknamedOrNotEnglish(u8 monIdx) pokemon = &gPlayerParty[monIdx]; GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1); language = GetMonData(pokemon, MON_DATA_LANGUAGE, &language); - if (language == LANGUAGE_ENGLISH && !StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1)) - { + if (language == GAME_LANGUAGE && !StringCompare(gSpeciesNames[GetMonData(pokemon, MON_DATA_SPECIES, NULL)], gStringVar1)) return FALSE; - } + return TRUE; } @@ -3157,28 +3007,27 @@ bool8 IsLeadMonNicknamedOrNotEnglish(void) return IsPartyMonNicknamedOrNotEnglish(GetLeadMonIndex()); } -void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx) +static void DeleteTVShowInArrayByIdx(TVShow *shows, u8 idx) { u8 i; shows[idx].commonInit.kind = TVSHOW_OFF_AIR; shows[idx].commonInit.active = FALSE; - for (i = 0; i < ARRAY_COUNT(shows[idx].commonInit.pad02); i++) - { - shows[idx].commonInit.pad02[i] = 0; - } + for (i = 0; i < ARRAY_COUNT(shows[idx].commonInit.data); i++) + shows[idx].commonInit.data[i] = 0; } -static void sub_80EF93C(TVShow *shows) +static void CompactTVShowArray(TVShow *shows) { u8 i; u8 j; - for (i = 0; i < 4; i ++) + // Compact normal TV shows + for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS - 1; i++) { if (shows[i].common.kind == TVSHOW_OFF_AIR) { - for (j = i + 1; j < 5; j ++) + for (j = i + 1; j < NUM_NORMAL_TVSHOW_SLOTS; j++) { if (shows[j].common.kind != TVSHOW_OFF_AIR) { @@ -3189,11 +3038,13 @@ static void sub_80EF93C(TVShow *shows) } } } - for (i = 5; i < LAST_TVSHOW_IDX; i ++) + + // Compact Record Mix TV shows + for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++) { if (shows[i].common.kind == TVSHOW_OFF_AIR) { - for (j = i + 1; j < LAST_TVSHOW_IDX; j ++) + for (j = i + 1; j < LAST_TVSHOW_IDX; j++) { if (shows[j].common.kind != TVSHOW_OFF_AIR) { @@ -3206,16 +3057,16 @@ static void sub_80EF93C(TVShow *shows) } } -u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer_AndPrintName(u8 varIdx, u16 passedSpecies) +static u16 GetRandomDifferentSpeciesAndNameSeenByPlayer(u8 varIdx, u16 passedSpecies) { u16 species; - species = TV_GetSomeOtherSpeciesAlreadySeenByPlayer(passedSpecies); + species = GetRandomDifferentSpeciesSeenByPlayer(passedSpecies); StringCopy(gTVStringVarPtrs[varIdx], gSpeciesNames[species]); return species; } -u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies) +static u16 GetRandomDifferentSpeciesSeenByPlayer(u16 passedSpecies) { u16 species; u16 initSpecies; @@ -3225,13 +3076,10 @@ u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies) while (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN) != TRUE || species == passedSpecies) { if (species == SPECIES_NONE + 1) - { species = NUM_SPECIES - 1; - } else - { - species --; - } + species--; + if (species == initSpecies) { species = passedSpecies; @@ -3241,104 +3089,94 @@ u16 TV_GetSomeOtherSpeciesAlreadySeenByPlayer(u16 passedSpecies) return species; } -static void sub_80EFA88(void) +static void Script_FindFirstEmptyNormalTVShowSlot(void) { - sCurTVShowSlot = FindEmptyTVSlotWithinFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows); + sCurTVShowSlot = FindFirstEmptyNormalTVShowSlot(gSaveBlock1Ptr->tvShows); gSpecialVar_0x8006 = sCurTVShowSlot; if (sCurTVShowSlot == -1) - { - gSpecialVar_Result = TRUE; - } + gSpecialVar_Result = TRUE; // Failed to find empty slot else - { - gSpecialVar_Result = FALSE; - } + gSpecialVar_Result = FALSE; // Found empty slot } -s8 FindEmptyTVSlotWithinFirstFiveShowsOfArray(TVShow *shows) +static s8 FindFirstEmptyNormalTVShowSlot(TVShow *shows) { u8 i; - for (i = 0; i < 5; i ++) + for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++) { if (shows[i].common.kind == TVSHOW_OFF_AIR) - { return i; - } } return -1; } -s8 FindEmptyTVSlotBeyondFirstFiveShowsOfArray(TVShow *shows) +static s8 FindFirstEmptyRecordMixTVShowSlot(TVShow *shows) { s8 i; - for (i = 5; i < LAST_TVSHOW_IDX; i ++) + for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++) { if (shows[i].common.kind == TVSHOW_OFF_AIR) - { return i; - } } return -1; } -bool8 TV_BernoulliTrial(u16 ratio) +static bool8 BernoulliTrial(u16 ratio) { if (Random() <= ratio) - { return FALSE; - } + return TRUE; } -void TV_FanClubLetter_RandomWordToStringVar3(TVShow *show) +// For TVSHOW_FAN_CLUB_LETTER / TVSHOW_RECENT_HAPPENINGS +// Both are assumed to have the same struct layout +static void GetRandomWordFromShow(TVShow *show) { u8 i; - i = Random() % 6; + i = Random() % ARRAY_COUNT(show->fanclubLetter.words); + + // From random point, get first non-empty word while (TRUE) { - if (i == 6) - { + if (i == ARRAY_COUNT(show->fanclubLetter.words)) i = 0; - } - if (show->fanclubLetter.words[i] != 0xFFFF) - { + + if (show->fanclubLetter.words[i] != EC_EMPTY_WORD) break; - } - i ++; + i++; } CopyEasyChatWord(gStringVar3, show->fanclubLetter.words[i]); } -u8 TV_GetNicknameSumMod8(TVShow *show) +static u8 GetRandomNameRaterStateFromName(TVShow *show) { u8 i; - u16 ct; + u16 nameSum; - ct = 0; - for (i = 0; i < 11; i ++) + nameSum = 0; + for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++) { if (show->nameRaterShow.pokemonName[i] == EOS) - { break; - } - ct += show->nameRaterShow.pokemonName[i]; + + nameSum += show->nameRaterShow.pokemonName[i]; } - return ct & 7; + return nameSum & 7; } -void TV_GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whichString, u16 species, TVShow *show) +static void GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whichString, u16 species, TVShow *show) { u8 buff[16]; u8 i; u16 strlen; - for (i = 0; i < 3; i ++) - { + for (i = 0; i < 3; i++) buff[i] = EOS; - } + if (whichString == 0) { strlen = StringLength(show->nameRaterShow.trainerName); @@ -3410,16 +3248,15 @@ void TV_GetNicknameSubstring(u8 varIdx, u8 whichPosition, u8 charParam, u16 whic StringCopy(gTVStringVarPtrs[varIdx], buff); } -bool8 TV_IsScriptShowKindAlreadyInQueue(void) +// Unused script special +bool8 IsTVShowAlreadyInQueue(void) { u8 i; - for (i = 0; i < 5; i ++) + for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++) { if (gSaveBlock1Ptr->tvShows[i].common.kind == gSpecialVar_0x8004) - { return TRUE; - } } return FALSE; } @@ -3461,7 +3298,7 @@ void ChangeBoxPokemonNickname(void) DoNamingScreen(NAMING_SCREEN_NICKNAME, gStringVar2, GetBoxMonData(boxMon, MON_DATA_SPECIES, NULL), GetBoxMonGender(boxMon), GetBoxMonData(boxMon, MON_DATA_PERSONALITY, NULL), ChangeBoxPokemonNickname_CB); } -void ChangeBoxPokemonNickname_CB(void) +static void ChangeBoxPokemonNickname_CB(void) { SetBoxMonNickAt(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2); CB2_ReturnToFieldContinueScriptPlayMapMusic(); @@ -3481,25 +3318,21 @@ void IsMonOTIDNotPlayers(void) gSpecialVar_Result = TRUE; } -u8 GetTVChannelByShowType(u8 kind) +static u8 GetTVGroupByShowId(u8 kind) { if (kind == TVSHOW_OFF_AIR) - { - return 0; - } - if (kind >= TVSHOW_FAN_CLUB_LETTER && kind < TVSHOW_POKEMON_TODAY_CAUGHT) - { - return 2; - } - if (kind >= TVSHOW_POKEMON_TODAY_CAUGHT && kind < TVSHOW_MASS_OUTBREAK) - { - return 3; - } - if (kind >= TVSHOW_MASS_OUTBREAK && kind < 61) - { - return 4; - } - return 0; + return TVGROUP_NONE; + + if (kind >= TVGROUP_NORMAL_START && kind <= TVGROUP_NORMAL_END) + return TVGROUP_NORMAL; + + if (kind >= TVGROUP_RECORD_MIX_START && kind <= TVGROUP_RECORD_MIX_END) + return TVGROUP_RECORD_MIX; + + if (kind >= TVGROUP_OUTBREAK_START && kind <= TVGROUP_OUTBREAK_END) + return TVGROUP_OUTBREAK; + + return TVGROUP_NONE; } u32 GetPlayerIDAsU32(void) @@ -3507,35 +3340,31 @@ u32 GetPlayerIDAsU32(void) return (gSaveBlock2Ptr->playerTrainerId[3] << 24) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; } -u8 CheckForBigMovieOrEmergencyNewsOnTV(void) +u8 CheckForPlayersHouseNews(void) { + // Check if not in Littleroot house map group if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) - { - return 0; - } + return PLAYERS_HOUSE_TV_NONE; + + // Check if not in player's house (dependent on gender) if (gSaveBlock2Ptr->playerGender == MALE) { if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) - { - return 0; - } + return PLAYERS_HOUSE_TV_NONE; } else { if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) - { - return 0; - } + return PLAYERS_HOUSE_TV_NONE; } + if (FlagGet(FLAG_SYS_TV_LATIAS_LATIOS) == TRUE) - { - return 1; - } + return PLAYERS_HOUSE_TV_LATI; + if (FlagGet(FLAG_SYS_TV_HOME) == TRUE) - { - return 2; - } - return 1; + return PLAYERS_HOUSE_TV_MOVIE; + + return PLAYERS_HOUSE_TV_LATI; } void GetMomOrDadStringForTVMessage(void) @@ -3596,129 +3425,120 @@ void HideBattleTowerReporter(void) FlagSet(FLAG_HIDE_BATTLE_TOWER_REPORTER); } -void ReceiveTvShowsData(void *src, u32 size, u8 masterIdx) +void ReceiveTvShowsData(void *src, u32 size, u8 playersLinkId) { u8 i; u16 version; - TVShow (*rmBuffer2)[4][25]; - TVShow (*rmBuffer)[4][25]; + TVShow (*rmBuffer2)[MAX_LINK_PLAYERS][TV_SHOWS_COUNT]; + TVShow (*rmBuffer)[MAX_LINK_PLAYERS][TV_SHOWS_COUNT]; - rmBuffer2 = malloc(4 * 25 * sizeof(TVShow)); + rmBuffer2 = malloc(MAX_LINK_PLAYERS * TV_SHOWS_COUNT * sizeof(TVShow)); if (rmBuffer2 != NULL) { - for (i = 0; i < 4; i ++) - { + for (i = 0; i < MAX_LINK_PLAYERS; i++) memcpy((*rmBuffer2)[i], src + i * size, sizeof((*rmBuffer2)[i])); - } + rmBuffer = rmBuffer2; - for (i = 0; i < GetLinkPlayerCount(); i ++) + for (i = 0; i < GetLinkPlayerCount(); i++) { version = (u8)gLinkPlayers[i].version; if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) - { - sub_80F1254((*rmBuffer)[i]); - } + TranslateRubyShows((*rmBuffer)[i]); else if (version == VERSION_EMERALD && gLinkPlayers[i].language == LANGUAGE_JAPANESE) - { - sub_80F12A4((*rmBuffer)[i]); - } + TranslateJapaneseEmeraldShows((*rmBuffer)[i]); } - switch (masterIdx) + + // Position player's TV shows in argument list depending on link id + switch (playersLinkId) { - case 0: - sub_80F0358(gSaveBlock1Ptr->tvShows, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]); - break; - case 1: - sub_80F0358((*rmBuffer)[0], gSaveBlock1Ptr->tvShows, (*rmBuffer)[2], (*rmBuffer)[3]); - break; - case 2: - sub_80F0358((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->tvShows, (*rmBuffer)[3]); - break; - case 3: - sub_80F0358((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->tvShows); - break; + case 0: + SetMixedTVShows(gSaveBlock1Ptr->tvShows, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]); + break; + case 1: + SetMixedTVShows((*rmBuffer)[0], gSaveBlock1Ptr->tvShows, (*rmBuffer)[2], (*rmBuffer)[3]); + break; + case 2: + SetMixedTVShows((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->tvShows, (*rmBuffer)[3]); + break; + case 3: + SetMixedTVShows((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->tvShows); + break; } - sub_80EF93C(gSaveBlock1Ptr->tvShows); - sub_80F0C04(); - sub_80EF93C(gSaveBlock1Ptr->tvShows); - sub_80F0708(); - sub_80F0B64(); + + CompactTVShowArray(gSaveBlock1Ptr->tvShows); + DeleteExcessMixedShows(); + CompactTVShowArray(gSaveBlock1Ptr->tvShows); + DeactivateShowsWithUnseenSpecies(); + DeactivateGameCompleteShowsIfNotUnlocked(); free(rmBuffer2); } } -static void sub_80F0358(TVShow player1[25], TVShow player2[25], TVShow player3[25], TVShow player4[25]) +static void SetMixedTVShows(TVShow player1[TV_SHOWS_COUNT], TVShow player2[TV_SHOWS_COUNT], TVShow player3[TV_SHOWS_COUNT], TVShow player4[TV_SHOWS_COUNT]) { u8 i; u8 j; - TVShow **argslist[4]; + TVShow **tvShows[MAX_LINK_PLAYERS]; - argslist[0] = &player1; - argslist[1] = &player2; - argslist[2] = &player3; - argslist[3] = &player4; + tvShows[0] = &player1; + tvShows[1] = &player2; + tvShows[2] = &player3; + tvShows[3] = &player4; sTVShowMixingNumPlayers = GetLinkPlayerCount(); while (1) { - for (i = 0; i < sTVShowMixingNumPlayers; i ++) + for (i = 0; i < sTVShowMixingNumPlayers; i++) { if (i == 0) - { - sRecordMixingPartnersWithoutShowsToShare = i; - } - sTVShowMixingCurSlot = sub_80F06D0(argslist[i][0]); + sRecordMixingPartnersWithoutShowsToShare = 0; + + sTVShowMixingCurSlot = FindInactiveShowInArray(tvShows[i][0]); if (sTVShowMixingCurSlot == -1) { - sRecordMixingPartnersWithoutShowsToShare ++; + sRecordMixingPartnersWithoutShowsToShare++; if (sRecordMixingPartnersWithoutShowsToShare == sTVShowMixingNumPlayers) - { return; - } } else { - for (j = 0; j < sTVShowMixingNumPlayers - 1; j ++) + for (j = 0; j < sTVShowMixingNumPlayers - 1; j++) { - sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(argslist[(i + j + 1) % sTVShowMixingNumPlayers][0]); + sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(tvShows[(i + j + 1) % sTVShowMixingNumPlayers][0]); if (sCurTVShowSlot != -1 - && sub_80F049C(&argslist[(i + j + 1) % sTVShowMixingNumPlayers][0], &argslist[i][0], (i + j + 1) % sTVShowMixingNumPlayers) == 1) - { + && TryMixTVShow(&tvShows[(i + j + 1) % sTVShowMixingNumPlayers][0], &tvShows[i][0], (i + j + 1) % sTVShowMixingNumPlayers) == 1) break; - } } if (j == sTVShowMixingNumPlayers - 1) - { - DeleteTVShowInArrayByIdx(argslist[i][0], sTVShowMixingCurSlot); - } + DeleteTVShowInArrayByIdx(tvShows[i][0], sTVShowMixingCurSlot); } } } } -static bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx) +static bool8 TryMixTVShow(TVShow *dest[TV_SHOWS_COUNT], TVShow *src[TV_SHOWS_COUNT], u8 idx) { - u8 value; - u8 switchval; - TVShow *tv1; - TVShow *tv2; + bool8 success; + u8 type; + TVShow *tv1 = *dest; + TVShow *tv2 = *src; - tv1 = *dest; - tv2 = *src; - value = FALSE; - switchval = GetTVChannelByShowType(tv2[sTVShowMixingCurSlot].common.kind); - switch (switchval) + success = FALSE; + type = GetTVGroupByShowId(tv2[sTVShowMixingCurSlot].common.kind); + switch (type) { - case 2: - value = sub_80F0580(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx); - break; - case 3: - value = sub_80F05E8(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx); - break; - case 4: - value = sub_80F0668(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx); - break; + case TVGROUP_NORMAL: + success = TryMixNormalTVShow(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx); + break; + case TVGROUP_RECORD_MIX: + success = TryMixRecordMixTVShow(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx); + break; + case TVGROUP_OUTBREAK: + success = TryMixOutbreakTVShow(&tv1[sCurTVShowSlot], &tv2[sTVShowMixingCurSlot], idx); + break; } - if (value == TRUE) + + // Show was mixed, delete from array + if (success == TRUE) { DeleteTVShowInArrayByIdx(tv2, sTVShowMixingCurSlot); return TRUE; @@ -3726,387 +3546,354 @@ static bool8 sub_80F049C(TVShow *dest[25], TVShow *src[25], u8 idx) return FALSE; } -static bool8 sub_80F0580(TVShow *tv1, TVShow *tv2, u8 idx) +static bool8 TryMixNormalTVShow(TVShow *dest, TVShow *src, u8 idx) { u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - { + if ((linkTrainerId & 0xFF) == src->common.trainerIdLo + && ((linkTrainerId >> 8) & 0xFF) == src->common.trainerIdHi) return FALSE; - } - tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; - tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; - tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; - tv2->common.srcTrainerIdHi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.active = TRUE; + + src->common.trainerIdLo = src->common.srcTrainerIdLo; + src->common.trainerIdHi = src->common.srcTrainerIdHi; + src->common.srcTrainerIdLo = linkTrainerId & 0xFF; + src->common.srcTrainerIdHi = linkTrainerId >> 8; + *dest = *src; + dest->common.active = TRUE; return TRUE; } -static bool8 sub_80F05E8(TVShow *tv1, TVShow *tv2, u8 idx) +static bool8 TryMixRecordMixTVShow(TVShow *dest, TVShow *src, u8 idx) { u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.srcTrainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.srcTrainerIdHi) - { + + if ((linkTrainerId & 0xFF) == src->common.srcTrainerIdLo + && ((linkTrainerId >> 8) & 0xFF) == src->common.srcTrainerIdHi) return FALSE; - } - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - { + + if ((linkTrainerId & 0xFF) == src->common.trainerIdLo + && ((linkTrainerId >> 8) & 0xFF) == src->common.trainerIdHi) return FALSE; - } - tv2->common.srcTrainerIdLo = tv2->common.srcTrainerId2Lo; - tv2->common.srcTrainerIdHi = tv2->common.srcTrainerId2Hi; - tv2->common.srcTrainerId2Lo = linkTrainerId & 0xFF; - tv2->common.srcTrainerId2Hi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.active = TRUE; + + src->common.srcTrainerIdLo = src->common.srcTrainerId2Lo; + src->common.srcTrainerIdHi = src->common.srcTrainerId2Hi; + src->common.srcTrainerId2Lo = linkTrainerId & 0xFF; + src->common.srcTrainerId2Hi = linkTrainerId >> 8; + *dest = *src; + dest->common.active = TRUE; return TRUE; } -static bool8 sub_80F0668(TVShow *tv1, TVShow *tv2, u8 idx) +static bool8 TryMixOutbreakTVShow(TVShow *dest, TVShow *src, u8 idx) { u32 linkTrainerId = GetLinkPlayerTrainerId(idx); - if ((linkTrainerId & 0xFF) == tv2->common.trainerIdLo && ((linkTrainerId >> 8) & 0xFF) == tv2->common.trainerIdHi) - { + + if ((linkTrainerId & 0xFF) == src->common.trainerIdLo + && ((linkTrainerId >> 8) & 0xFF) == src->common.trainerIdHi) return FALSE; - } - tv2->common.trainerIdLo = tv2->common.srcTrainerIdLo; - tv2->common.trainerIdHi = tv2->common.srcTrainerIdHi; - tv2->common.srcTrainerIdLo = linkTrainerId & 0xFF; - tv2->common.srcTrainerIdHi = linkTrainerId >> 8; - *tv1 = *tv2; - tv1->common.active = TRUE; - tv1->massOutbreak.daysLeft = 1; + + src->common.trainerIdLo = src->common.srcTrainerIdLo; + src->common.trainerIdHi = src->common.srcTrainerIdHi; + src->common.srcTrainerIdLo = linkTrainerId & 0xFF; + src->common.srcTrainerIdHi = linkTrainerId >> 8; + *dest = *src; + dest->common.active = TRUE; + dest->massOutbreak.daysLeft = 1; return TRUE; } -static s8 sub_80F06D0(TVShow *tvShows) +static s8 FindInactiveShowInArray(TVShow *tvShows) { u8 i; - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + for (i = 0; i < LAST_TVSHOW_IDX; i++) { - if (tvShows[i].common.active == FALSE && (u8)(tvShows[i].common.kind - 1) < 60) - { + // Second check is to make sure its a valid show (not too high, not TVSHOW_OFF_AIR) + if (tvShows[i].common.active == FALSE && (u8)(tvShows[i].common.kind - 1) < TVGROUP_OUTBREAK_END) return i; - } } return -1; } -static void sub_80F0708(void) // FIXME: register allocation shenanigans +static void DeactivateShowsWithUnseenSpecies(void) { u16 i; - u16 j; + u16 species; - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + for (i = 0; i < LAST_TVSHOW_IDX; i++) { switch (gSaveBlock1Ptr->tvShows[i].common.kind) { - case TVSHOW_CONTEST_LIVE_UPDATES: - j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.winningSpecies; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.losingSpecies; - sub_80F0B24(j, i); - break; - case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: - break; - case TVSHOW_BATTLE_UPDATE: - j = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesPlayer; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesOpponent; - sub_80F0B24(j, i); - break; - case TVSHOW_FAN_CLUB_SPECIAL: - break; - case TVSHOW_CONTEST_LIVE_UPDATES_2: - break; - - case TVSHOW_OFF_AIR: - break; - case TVSHOW_FAN_CLUB_LETTER: - j = (&gSaveBlock1Ptr->tvShows[i])->fanclubLetter.species; - sub_80F0B24(j, i); - break; - case TVSHOW_RECENT_HAPPENINGS: - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - j = (&gSaveBlock1Ptr->tvShows[i])->fanclubOpinions.species; - sub_80F0B24(j, i); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - j = (&gSaveBlock1Ptr->tvShows[i])->unkShow04.var06; - sub_80F0B24(j, i); - break; - case TVSHOW_NAME_RATER_SHOW: - j = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.species; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.randomSpecies; - sub_80F0B24(j, i); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - j = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainer.species; - sub_80F0B24(j, i); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - j = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.species; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.defeatedSpecies; - sub_80F0B24(j, i); - break; - - case TVSHOW_POKEMON_TODAY_CAUGHT: - j = (&gSaveBlock1Ptr->tvShows[i])->pokemonToday.species; - sub_80F0B24(j, i); - break; - case TVSHOW_SMART_SHOPPER: - break; - case TVSHOW_POKEMON_TODAY_FAILED: - j = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species2; - sub_80F0B24(j, i); - break; - case TVSHOW_FISHING_ADVICE: - j = (&gSaveBlock1Ptr->tvShows[i])->pokemonAngler.species; - sub_80F0B24(j, i); - break; - case TVSHOW_WORLD_OF_MASTERS: - j = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.species; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.caughtPoke; - sub_80F0B24(j, i); - break; - - case TVSHOW_TODAYS_RIVAL_TRAINER: - break; - case TVSHOW_TREND_WATCHER: - break; - case TVSHOW_TREASURE_INVESTIGATORS: - break; - case TVSHOW_FIND_THAT_GAMER: - break; - case TVSHOW_BREAKING_NEWS: - j = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.lastOpponentSpecies; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.poke1Species; - sub_80F0B24(j, i); - break; - case TVSHOW_SECRET_BASE_VISIT: - j = (&gSaveBlock1Ptr->tvShows[i])->secretBaseVisit.species; - sub_80F0B24(j, i); - break; - case TVSHOW_LOTTO_WINNER: - break; - case TVSHOW_BATTLE_SEMINAR: - j = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.species; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.foeSpecies; - sub_80F0B24(j, i); - break; - case TVSHOW_TRAINER_FAN_CLUB: - break; - case TVSHOW_CUTIES: - break; - case TVSHOW_FRONTIER: - j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species1; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species2; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->frontier.facility; - switch (j) - { - case 3: - case 4: - break; - case 1: - case 5 ... 13: - j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3; - sub_80F0B24(j, i); - break; - case 2: - j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3; - sub_80F0B24(j, i); - j = (&gSaveBlock1Ptr->tvShows[i])->frontier.species4; - sub_80F0B24(j, i); - break; - } - break; - case TVSHOW_NUMBER_ONE: - break; - case TVSHOW_SECRET_BASE_SECRETS: - break; - case TVSHOW_SAFARI_FAN_CLUB: - break; - - case TVSHOW_MASS_OUTBREAK: - break; - - default: - SetTvShowInactive(i); - break; + case TVSHOW_CONTEST_LIVE_UPDATES: + species = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.winningSpecies; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->contestLiveUpdates.losingSpecies; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_BATTLE_UPDATE: + species = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesPlayer; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->battleUpdate.speciesOpponent; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_FAN_CLUB_LETTER: + species = (&gSaveBlock1Ptr->tvShows[i])->fanclubLetter.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + species = (&gSaveBlock1Ptr->tvShows[i])->fanclubOpinions.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_DUMMY: + species = (&gSaveBlock1Ptr->tvShows[i])->dummy.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_NAME_RATER_SHOW: + species = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.species; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->nameRaterShow.randomSpecies; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + species = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainer.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + species = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.species; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->bravoTrainerTower.defeatedSpecies; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + species = (&gSaveBlock1Ptr->tvShows[i])->pokemonToday.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + species = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->pokemonTodayFailed.species2; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_FISHING_ADVICE: + species = (&gSaveBlock1Ptr->tvShows[i])->pokemonAngler.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_WORLD_OF_MASTERS: + species = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.species; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->worldOfMasters.caughtPoke; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_BREAKING_NEWS: + species = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.lastOpponentSpecies; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->breakingNews.poke1Species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_SECRET_BASE_VISIT: + species = (&gSaveBlock1Ptr->tvShows[i])->secretBaseVisit.species; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_BATTLE_SEMINAR: + species = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.species; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->battleSeminar.foeSpecies; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case TVSHOW_FRONTIER: + species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species1; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species2; + DeactivateShowIfNotSeenSpecies(species, i); + // Species var re-used here + species = (&gSaveBlock1Ptr->tvShows[i])->frontier.facilityAndMode; + switch (species) + { + case FRONTIER_SHOW_TOWER_MULTIS: + case FRONTIER_SHOW_TOWER_LINK_MULTIS: + break; + case FRONTIER_SHOW_TOWER_SINGLES: + case FRONTIER_SHOW_DOME_SINGLES: + case FRONTIER_SHOW_DOME_DOUBLES: + case FRONTIER_SHOW_FACTORY_SINGLES: + case FRONTIER_SHOW_FACTORY_DOUBLES: + case FRONTIER_SHOW_PIKE: + case FRONTIER_SHOW_ARENA: + case FRONTIER_SHOW_PALACE_SINGLES: + case FRONTIER_SHOW_PALACE_DOUBLES: + case FRONTIER_SHOW_PYRAMID: + species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3; + DeactivateShowIfNotSeenSpecies(species, i); + break; + case FRONTIER_SHOW_TOWER_DOUBLES: + species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species3; + DeactivateShowIfNotSeenSpecies(species, i); + species = (&gSaveBlock1Ptr->tvShows[i])->frontier.species4; + DeactivateShowIfNotSeenSpecies(species, i); + break; + } + break; + // Shows with no species + case TVSHOW_OFF_AIR: + case TVSHOW_RECENT_HAPPENINGS: + case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: + case TVSHOW_TODAYS_RIVAL_TRAINER: + case TVSHOW_TREND_WATCHER: + case TVSHOW_TREASURE_INVESTIGATORS: + case TVSHOW_FIND_THAT_GAMER: + case TVSHOW_TRAINER_FAN_CLUB: + case TVSHOW_CUTIES: + case TVSHOW_SMART_SHOPPER: + case TVSHOW_FAN_CLUB_SPECIAL: + case TVSHOW_LILYCOVE_CONTEST_LADY: + case TVSHOW_LOTTO_WINNER: + case TVSHOW_NUMBER_ONE: + case TVSHOW_SECRET_BASE_SECRETS: + case TVSHOW_SAFARI_FAN_CLUB: + case TVSHOW_MASS_OUTBREAK: + break; + default: + DeactivateShow(i); + break; } } } -void SetTvShowInactive(u8 showIdx) +static void DeactivateShow(u8 showIdx) { gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE; } -static void sub_80F0B24(u16 species, u8 showIdx) +static void DeactivateShowIfNotSeenSpecies(u16 species, u8 showIdx) { if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_SEEN)) - { gSaveBlock1Ptr->tvShows[showIdx].common.active = FALSE; - } } -static void sub_80F0B64(void) +static void DeactivateGameCompleteShowsIfNotUnlocked(void) { u16 i; if (FlagGet(FLAG_SYS_GAME_CLEAR) != TRUE) { - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + for (i = 0; i < LAST_TVSHOW_IDX; i++) { if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) - { gSaveBlock1Ptr->tvShows[i].common.active = FALSE; - } else if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_MASS_OUTBREAK) - { gSaveBlock1Ptr->tvShows[i].common.active = FALSE; - } } } } -void sub_80F0BB8(void) +void DeactivateAllNormalTVShows(void) { u8 i; - for (i = 0; i < 5; i ++) + for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS; i++) { - if (GetTVChannelByShowType(gSaveBlock1Ptr->tvShows[i].common.kind) == 2) - { + if (GetTVGroupByShowId(gSaveBlock1Ptr->tvShows[i].common.kind) == TVGROUP_NORMAL) gSaveBlock1Ptr->tvShows[i].common.active = FALSE; - } } } -static void sub_80F0C04(void) +// Ensures a minimum of 5 empty mixed show slots +static void DeleteExcessMixedShows(void) { s8 i; - s8 ct; - - ct = 0; - for (i = 5; i < LAST_TVSHOW_IDX; i ++) + s8 numEmptyMixSlots = 0; + for (i = NUM_NORMAL_TVSHOW_SLOTS; i < LAST_TVSHOW_IDX; i++) { if (gSaveBlock1Ptr->tvShows[i].common.kind == TVSHOW_OFF_AIR) - { - ct ++; - } - } - for (i = 0; i < 5 - ct; i ++) - { - DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i + 5); + numEmptyMixSlots++; } + for (i = 0; i < NUM_NORMAL_TVSHOW_SLOTS - numEmptyMixSlots; i++) + DeleteTVShowInArrayByIdx(gSaveBlock1Ptr->tvShows, i + NUM_NORMAL_TVSHOW_SLOTS); } -void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx) +void ReceivePokeNewsData(void *src, u32 size, u8 playersLinkId) { u8 i; - PokeNews (*rmBuffer2)[4][16]; - PokeNews (*rmBuffer)[4][16]; + PokeNews (*rmBuffer2)[MAX_LINK_PLAYERS][POKE_NEWS_COUNT]; + PokeNews (*rmBuffer)[MAX_LINK_PLAYERS][POKE_NEWS_COUNT]; - rmBuffer2 = malloc(4 * 16 * sizeof(PokeNews)); + rmBuffer2 = malloc(MAX_LINK_PLAYERS * POKE_NEWS_COUNT * sizeof(PokeNews)); if (rmBuffer2 != NULL) { - for (i = 0; i < 4; i ++) - { + for (i = 0; i < MAX_LINK_PLAYERS; i++) memcpy((*rmBuffer2)[i], src + i * size, sizeof((*rmBuffer2)[i])); - } + rmBuffer = rmBuffer2; - switch (masterIdx) + + // Position player's PokeNews in argument list depending on link id + switch (playersLinkId) { - case 0: - sub_80F0D60(gSaveBlock1Ptr->pokeNews, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]); - break; - case 1: - sub_80F0D60((*rmBuffer)[0], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[2], (*rmBuffer)[3]); - break; - case 2: - sub_80F0D60((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[3]); - break; - case 3: - sub_80F0D60((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->pokeNews); - break; + case 0: + SetMixedPokeNews(gSaveBlock1Ptr->pokeNews, (*rmBuffer)[1], (*rmBuffer)[2], (*rmBuffer)[3]); + break; + case 1: + SetMixedPokeNews((*rmBuffer)[0], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[2], (*rmBuffer)[3]); + break; + case 2: + SetMixedPokeNews((*rmBuffer)[0], (*rmBuffer)[1], gSaveBlock1Ptr->pokeNews, (*rmBuffer)[3]); + break; + case 3: + SetMixedPokeNews((*rmBuffer)[0], (*rmBuffer)[1], (*rmBuffer)[2], gSaveBlock1Ptr->pokeNews); + break; } - sub_80F0EEC(); - sub_80F0F24(); + ClearInvalidPokeNews(); + ClearPokeNewsIfGameNotComplete(); free(rmBuffer2); } } -static void sub_80F0D60(PokeNews player1[16], PokeNews player2[16], PokeNews player3[16], PokeNews player4[16]) +static void SetMixedPokeNews(PokeNews player1[POKE_NEWS_COUNT], PokeNews player2[POKE_NEWS_COUNT], PokeNews player3[POKE_NEWS_COUNT], PokeNews player4[POKE_NEWS_COUNT]) { - u8 i; - u8 j; - u8 k; - PokeNews **argslist[4]; + u8 i, j, k; + PokeNews **pokeNews[MAX_LINK_PLAYERS]; - argslist[0] = &player1; - argslist[1] = &player2; - argslist[2] = &player3; - argslist[3] = &player4; + pokeNews[0] = &player1; + pokeNews[1] = &player2; + pokeNews[2] = &player3; + pokeNews[3] = &player4; sTVShowNewsMixingNumPlayers = GetLinkPlayerCount(); - for (i = 0; i < POKE_NEWS_COUNT; i ++) + for (i = 0; i < POKE_NEWS_COUNT; i++) { - for (j = 0; j < sTVShowNewsMixingNumPlayers; j ++) + for (j = 0; j < sTVShowNewsMixingNumPlayers; j++) { - sTVShowMixingCurSlot = sub_80F0ECC(*argslist[j], i); + sTVShowMixingCurSlot = GetPokeNewsSlotIfActive(*pokeNews[j], i); if (sTVShowMixingCurSlot != -1) { for (k = 0; k < sTVShowNewsMixingNumPlayers - 1; k++) { - sCurTVShowSlot = sub_80EEE30(*argslist[(j + k + 1) % sTVShowNewsMixingNumPlayers]); + sCurTVShowSlot = GetFirstEmptyPokeNewsSlot(*pokeNews[(j + k + 1) % sTVShowNewsMixingNumPlayers]); if (sCurTVShowSlot != -1) - { - sub_80F0E58(argslist[(j + k + 1) % sTVShowNewsMixingNumPlayers], argslist[j]); - } + InitTryMixPokeNewsShow(pokeNews[(j + k + 1) % sTVShowNewsMixingNumPlayers], pokeNews[j]); } } } } } -static void sub_80F0E58(PokeNews *dest[16], PokeNews *src[16]) +static void InitTryMixPokeNewsShow(PokeNews *dest[POKE_NEWS_COUNT], PokeNews *src[POKE_NEWS_COUNT]) { - PokeNews *ptr1; - PokeNews *ptr2; - - ptr1 = *dest; - ptr2 = *src; + PokeNews *ptr1 = *dest; + PokeNews *ptr2 = *src; ptr2 += sTVShowMixingCurSlot; - sub_80F0E84(ptr1, ptr2, sCurTVShowSlot); + TryMixPokeNewsShow(ptr1, ptr2, sCurTVShowSlot); } -static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot) +static bool8 TryMixPokeNewsShow(PokeNews *dest, PokeNews *src, s8 slot) { u8 i; - u8 kind; if (src->kind == POKENEWS_NONE) - { return FALSE; - } - for (i = 0; i < POKE_NEWS_COUNT; i ++) + + for (i = 0; i < POKE_NEWS_COUNT; i++) { if (dest[i].kind == src->kind) - { return FALSE; - } } dest[slot].kind = src->kind; dest[slot].state = 1; @@ -4114,43 +3901,38 @@ static bool8 sub_80F0E84(PokeNews *dest, PokeNews *src, s8 slot) return TRUE; } -static s8 sub_80F0ECC(PokeNews *pokeNews, u8 idx) +static s8 GetPokeNewsSlotIfActive(PokeNews *pokeNews, u8 idx) { if (pokeNews[idx].kind == POKENEWS_NONE) - { return -1; - } + return idx; } -static void sub_80F0EEC(void) +static void ClearInvalidPokeNews(void) { u8 i; - for (i = 0; i < POKE_NEWS_COUNT; i ++) + for (i = 0; i < POKE_NEWS_COUNT; i++) { if (gSaveBlock1Ptr->pokeNews[i].kind > POKENEWS_BLENDMASTER) - { - ClearPokemonNewsI(i); - } + ClearPokeNewsBySlot(i); } - sub_80EEEB8(); + CompactPokeNews(); } -static void sub_80F0F24(void) +static void ClearPokeNewsIfGameNotComplete(void) { u8 i; if (FlagGet(FLAG_SYS_GAME_CLEAR) != TRUE) { - for (i = 0; i < POKE_NEWS_COUNT; i ++) - { + for (i = 0; i < POKE_NEWS_COUNT; i++) gSaveBlock1Ptr->pokeNews[i].state = 0; - } } } -#define tvlangfix(strptr, langptr, langfix) \ +#define SetStrLanguage(strptr, langptr, langfix) \ if (IsStringJapanese(strptr)) \ { \ (langptr) = LANGUAGE_JAPANESE; \ @@ -4160,349 +3942,341 @@ else \ (langptr) = langfix; \ } -static void sub_80F0F64(TVShow *show, u32 language) +// Unused +static void TranslateShowNames(TVShow *show, u32 language) { int i; - TVShow **r4; + TVShow **shows; - r4 = calloc(11, sizeof(TVShow *)); - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + shows = calloc(11, sizeof(TVShow *)); + for (i = 0; i < LAST_TVSHOW_IDX; i++) { switch (show[i].common.kind) { - case TVSHOW_FAN_CLUB_LETTER: - case TVSHOW_RECENT_HAPPENINGS: - r4[0] = &show[i]; - tvlangfix(r4[0]->fanclubLetter.playerName, r4[0]->fanclubLetter.language, language); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - r4[1] = &show[i]; - tvlangfix(r4[1]->fanclubOpinions.playerName, r4[1]->fanclubOpinions.language, language); - tvlangfix(r4[1]->fanclubOpinions.nickname, r4[1]->fanclubOpinions.pokemonNameLanguage, language); - break; - case TVSHOW_POKEMON_TODAY_CAUGHT: - r4[6] = &show[i]; - tvlangfix(r4[6]->pokemonToday.playerName, r4[6]->pokemonToday.language, language); - tvlangfix(r4[6]->pokemonToday.nickname, r4[6]->pokemonToday.language2, language); - break; - case TVSHOW_SMART_SHOPPER: - r4[7] = &show[i]; - tvlangfix(r4[7]->smartshopperShow.playerName, r4[7]->smartshopperShow.language, language); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - r4[5] = &show[i]; - tvlangfix(r4[5]->bravoTrainerTower.trainerName, r4[5]->bravoTrainerTower.language, language); - tvlangfix(r4[5]->bravoTrainerTower.pokemonName, r4[5]->bravoTrainerTower.pokemonNameLanguage, language); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - r4[4] = &show[i]; - tvlangfix(r4[4]->bravoTrainer.playerName, r4[4]->bravoTrainer.language, language); - tvlangfix(r4[4]->bravoTrainer.pokemonNickname, r4[4]->bravoTrainer.pokemonNameLanguage, language); - break; - case TVSHOW_NAME_RATER_SHOW: - r4[3] = &show[i]; - tvlangfix(r4[3]->nameRaterShow.trainerName, r4[3]->nameRaterShow.language, language); - tvlangfix(r4[3]->nameRaterShow.pokemonName, r4[3]->nameRaterShow.pokemonNameLanguage, language); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - r4[2] = &show[i]; - tvlangfix(r4[2]->pokemonTodayFailed.playerName, r4[2]->pokemonTodayFailed.language, language); - break; - case TVSHOW_FISHING_ADVICE: - r4[8] = &show[i]; - tvlangfix(r4[8]->pokemonAngler.playerName, r4[8]->pokemonAngler.language, language); - break; - case TVSHOW_WORLD_OF_MASTERS: - r4[9] = &show[i]; - tvlangfix(r4[9]->worldOfMasters.playerName, r4[9]->worldOfMasters.language, language); - break; - case TVSHOW_MASS_OUTBREAK: - r4[10] = &show[i]; - r4[10]->massOutbreak.language = language; - break; + case TVSHOW_FAN_CLUB_LETTER: + case TVSHOW_RECENT_HAPPENINGS: // NOTE: These two shows are assumed to have the same struct layout + shows[0] = &show[i]; + SetStrLanguage(shows[0]->fanclubLetter.playerName, shows[0]->fanclubLetter.language, language); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + shows[1] = &show[i]; + SetStrLanguage(shows[1]->fanclubOpinions.playerName, shows[1]->fanclubOpinions.language, language); + SetStrLanguage(shows[1]->fanclubOpinions.nickname, shows[1]->fanclubOpinions.pokemonNameLanguage, language); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + shows[6] = &show[i]; + SetStrLanguage(shows[6]->pokemonToday.playerName, shows[6]->pokemonToday.language, language); + SetStrLanguage(shows[6]->pokemonToday.nickname, shows[6]->pokemonToday.language2, language); + break; + case TVSHOW_SMART_SHOPPER: + shows[7] = &show[i]; + SetStrLanguage(shows[7]->smartshopperShow.playerName, shows[7]->smartshopperShow.language, language); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + shows[5] = &show[i]; + SetStrLanguage(shows[5]->bravoTrainerTower.trainerName, shows[5]->bravoTrainerTower.language, language); + SetStrLanguage(shows[5]->bravoTrainerTower.pokemonName, shows[5]->bravoTrainerTower.pokemonNameLanguage, language); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + shows[4] = &show[i]; + SetStrLanguage(shows[4]->bravoTrainer.playerName, shows[4]->bravoTrainer.language, language); + SetStrLanguage(shows[4]->bravoTrainer.pokemonNickname, shows[4]->bravoTrainer.pokemonNameLanguage, language); + break; + case TVSHOW_NAME_RATER_SHOW: + shows[3] = &show[i]; + SetStrLanguage(shows[3]->nameRaterShow.trainerName, shows[3]->nameRaterShow.language, language); + SetStrLanguage(shows[3]->nameRaterShow.pokemonName, shows[3]->nameRaterShow.pokemonNameLanguage, language); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + shows[2] = &show[i]; + SetStrLanguage(shows[2]->pokemonTodayFailed.playerName, shows[2]->pokemonTodayFailed.language, language); + break; + case TVSHOW_FISHING_ADVICE: + shows[8] = &show[i]; + SetStrLanguage(shows[8]->pokemonAngler.playerName, shows[8]->pokemonAngler.language, language); + break; + case TVSHOW_WORLD_OF_MASTERS: + shows[9] = &show[i]; + SetStrLanguage(shows[9]->worldOfMasters.playerName, shows[9]->worldOfMasters.language, language); + break; + case TVSHOW_MASS_OUTBREAK: + shows[10] = &show[i]; + shows[10]->massOutbreak.language = language; + break; } } - free(r4); + free(shows); } -void sub_80F1208(TVShow *shows) +void SanitizeTVShowsForRuby(TVShow *shows) { TVShow *curShow; - sub_80F14F8(shows); - for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow ++) + SanitizeTVShowLocationsForRuby(shows); + for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow++) { if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) { - if ((curShow->bravoTrainerTower.language == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage != LANGUAGE_JAPANESE) || (curShow->bravoTrainerTower.language != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage == LANGUAGE_JAPANESE)) - { + if ((curShow->bravoTrainerTower.language == LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage != LANGUAGE_JAPANESE) + || (curShow->bravoTrainerTower.language != LANGUAGE_JAPANESE && curShow->bravoTrainerTower.pokemonNameLanguage == LANGUAGE_JAPANESE)) memset(curShow, 0, sizeof(TVShow)); - } } } } -static void sub_80F1254(TVShow *shows) +static void TranslateRubyShows(TVShow *shows) { TVShow *curShow; - for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow ++) + for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow++) { if (curShow->bravoTrainerTower.kind == TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE) { if (IsStringJapanese(curShow->bravoTrainerTower.pokemonName)) - { curShow->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE; - } else - { - curShow->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_ENGLISH; - } + curShow->bravoTrainerTower.pokemonNameLanguage = GAME_LANGUAGE; } } } -u8 TV_GetStringLanguage(u8 *str) +static u8 GetStringLanguage(u8 *str) { - return IsStringJapanese(str) ? LANGUAGE_JAPANESE : LANGUAGE_ENGLISH; + return IsStringJapanese(str) ? LANGUAGE_JAPANESE : GAME_LANGUAGE; } -static void sub_80F12A4(TVShow *shows) +static void TranslateJapaneseEmeraldShows(TVShow *shows) { TVShow *curShow; - for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow ++) + for (curShow = shows; curShow < shows + LAST_TVSHOW_IDX; curShow++) { switch(curShow->common.kind) { - case TVSHOW_FAN_CLUB_LETTER: - curShow->fanclubLetter.language = TV_GetStringLanguage(curShow->fanclubLetter.playerName); - break; - case TVSHOW_RECENT_HAPPENINGS: - curShow->recentHappenings.language = TV_GetStringLanguage(curShow->recentHappenings.playerName); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - curShow->fanclubOpinions.language = TV_GetStringLanguage(curShow->fanclubOpinions.playerName); - curShow->fanclubOpinions.pokemonNameLanguage = TV_GetStringLanguage(curShow->fanclubOpinions.nickname); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - curShow->unkShow04.language = TV_GetStringLanguage(curShow->unkShow04.string_0b); - break; - case TVSHOW_NAME_RATER_SHOW: - curShow->nameRaterShow.language = TV_GetStringLanguage(curShow->nameRaterShow.trainerName); - curShow->nameRaterShow.pokemonNameLanguage = TV_GetStringLanguage(curShow->nameRaterShow.pokemonName); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - curShow->bravoTrainer.language = TV_GetStringLanguage(curShow->bravoTrainer.playerName); - curShow->bravoTrainer.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainer.pokemonNickname); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - curShow->bravoTrainerTower.language = TV_GetStringLanguage(curShow->bravoTrainerTower.trainerName); - curShow->bravoTrainerTower.pokemonNameLanguage = TV_GetStringLanguage(curShow->bravoTrainerTower.pokemonName); - break; - case TVSHOW_CONTEST_LIVE_UPDATES: - curShow->contestLiveUpdates.winningTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName); - curShow->contestLiveUpdates.losingTrainerLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates.losingTrainerName); - break; - case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: - curShow->threeCheers.language = TV_GetStringLanguage(curShow->threeCheers.playerName); - curShow->threeCheers.worstBlenderLanguage = TV_GetStringLanguage(curShow->threeCheers.worstBlenderName); - break; - case TVSHOW_BATTLE_UPDATE: - curShow->battleUpdate.language = TV_GetStringLanguage(curShow->battleUpdate.playerName); - curShow->battleUpdate.linkOpponentLanguage = TV_GetStringLanguage(curShow->battleUpdate.linkOpponentName); - break; - case TVSHOW_FAN_CLUB_SPECIAL: - curShow->fanClubSpecial.language = TV_GetStringLanguage(curShow->fanClubSpecial.playerName); - curShow->fanClubSpecial.idolNameLanguage = TV_GetStringLanguage(curShow->fanClubSpecial.idolName); - break; - case TVSHOW_CONTEST_LIVE_UPDATES_2: - curShow->contestLiveUpdates2.language = TV_GetStringLanguage(curShow->contestLiveUpdates2.playerName); - curShow->contestLiveUpdates2.pokemonNameLanguage = TV_GetStringLanguage(curShow->contestLiveUpdates2.nickname); - break; - - case TVSHOW_POKEMON_TODAY_CAUGHT: - curShow->pokemonToday.language = TV_GetStringLanguage(curShow->pokemonToday.playerName); - curShow->pokemonToday.language2 = TV_GetStringLanguage(curShow->pokemonToday.nickname); - break; - case TVSHOW_SMART_SHOPPER: - curShow->smartshopperShow.language = TV_GetStringLanguage(curShow->smartshopperShow.playerName); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - curShow->pokemonTodayFailed.language = TV_GetStringLanguage(curShow->pokemonTodayFailed.playerName); - break; - case TVSHOW_FISHING_ADVICE: - curShow->pokemonAngler.language = TV_GetStringLanguage(curShow->pokemonAngler.playerName); - break; - case TVSHOW_WORLD_OF_MASTERS: - curShow->worldOfMasters.language = TV_GetStringLanguage(curShow->worldOfMasters.playerName); - break; - case TVSHOW_TREND_WATCHER: - curShow->trendWatcher.language = TV_GetStringLanguage(curShow->trendWatcher.playerName); - break; - case TVSHOW_BREAKING_NEWS: - curShow->breakingNews.language = TV_GetStringLanguage(curShow->breakingNews.playerName); - break; - case TVSHOW_BATTLE_SEMINAR: - curShow->battleSeminar.language = TV_GetStringLanguage(curShow->battleSeminar.playerName); - break; - case TVSHOW_FIND_THAT_GAMER: - case TVSHOW_TRAINER_FAN_CLUB: - curShow->trainerFanClub.language = TV_GetStringLanguage(curShow->trainerFanClub.playerName); - break; - case TVSHOW_CUTIES: - curShow->cuties.language = TV_GetStringLanguage(curShow->cuties.playerName); - curShow->cuties.pokemonNameLanguage = TV_GetStringLanguage(curShow->cuties.nickname); - break; - case TVSHOW_TODAYS_RIVAL_TRAINER: - case TVSHOW_SECRET_BASE_VISIT: - case TVSHOW_FRONTIER: - curShow->rivalTrainer.language = TV_GetStringLanguage(curShow->rivalTrainer.playerName); - break; - case TVSHOW_TREASURE_INVESTIGATORS: - case TVSHOW_LOTTO_WINNER: - case TVSHOW_NUMBER_ONE: - curShow->treasureInvestigators.language = TV_GetStringLanguage(curShow->treasureInvestigators.playerName); - break; - case TVSHOW_SECRET_BASE_SECRETS: - curShow->secretBaseSecrets.language = TV_GetStringLanguage(curShow->secretBaseSecrets.playerName); - curShow->secretBaseSecrets.baseOwnersNameLanguage = TV_GetStringLanguage(curShow->secretBaseSecrets.baseOwnersName); - break; - case TVSHOW_SAFARI_FAN_CLUB: - curShow->safariFanClub.language = TV_GetStringLanguage(curShow->safariFanClub.playerName); - break; - case TVSHOW_MASS_OUTBREAK: - break; + case TVSHOW_FAN_CLUB_LETTER: + curShow->fanclubLetter.language = GetStringLanguage(curShow->fanclubLetter.playerName); + break; + case TVSHOW_RECENT_HAPPENINGS: + curShow->recentHappenings.language = GetStringLanguage(curShow->recentHappenings.playerName); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + curShow->fanclubOpinions.language = GetStringLanguage(curShow->fanclubOpinions.playerName); + curShow->fanclubOpinions.pokemonNameLanguage = GetStringLanguage(curShow->fanclubOpinions.nickname); + break; + case TVSHOW_DUMMY: + curShow->dummy.language = GetStringLanguage(curShow->dummy.name); + break; + case TVSHOW_NAME_RATER_SHOW: + curShow->nameRaterShow.language = GetStringLanguage(curShow->nameRaterShow.trainerName); + curShow->nameRaterShow.pokemonNameLanguage = GetStringLanguage(curShow->nameRaterShow.pokemonName); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + curShow->bravoTrainer.language = GetStringLanguage(curShow->bravoTrainer.playerName); + curShow->bravoTrainer.pokemonNameLanguage = GetStringLanguage(curShow->bravoTrainer.pokemonNickname); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + curShow->bravoTrainerTower.language = GetStringLanguage(curShow->bravoTrainerTower.trainerName); + curShow->bravoTrainerTower.pokemonNameLanguage = GetStringLanguage(curShow->bravoTrainerTower.pokemonName); + break; + case TVSHOW_CONTEST_LIVE_UPDATES: + curShow->contestLiveUpdates.winningTrainerLanguage = GetStringLanguage(curShow->contestLiveUpdates.winningTrainerName); + curShow->contestLiveUpdates.losingTrainerLanguage = GetStringLanguage(curShow->contestLiveUpdates.losingTrainerName); + break; + case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: + curShow->threeCheers.language = GetStringLanguage(curShow->threeCheers.playerName); + curShow->threeCheers.worstBlenderLanguage = GetStringLanguage(curShow->threeCheers.worstBlenderName); + break; + case TVSHOW_BATTLE_UPDATE: + curShow->battleUpdate.language = GetStringLanguage(curShow->battleUpdate.playerName); + curShow->battleUpdate.linkOpponentLanguage = GetStringLanguage(curShow->battleUpdate.linkOpponentName); + break; + case TVSHOW_FAN_CLUB_SPECIAL: + curShow->fanClubSpecial.language = GetStringLanguage(curShow->fanClubSpecial.playerName); + curShow->fanClubSpecial.idolNameLanguage = GetStringLanguage(curShow->fanClubSpecial.idolName); + break; + case TVSHOW_LILYCOVE_CONTEST_LADY: + curShow->contestLady.language = GetStringLanguage(curShow->contestLady.playerName); + curShow->contestLady.pokemonNameLanguage = GetStringLanguage(curShow->contestLady.nickname); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + curShow->pokemonToday.language = GetStringLanguage(curShow->pokemonToday.playerName); + curShow->pokemonToday.language2 = GetStringLanguage(curShow->pokemonToday.nickname); + break; + case TVSHOW_SMART_SHOPPER: + curShow->smartshopperShow.language = GetStringLanguage(curShow->smartshopperShow.playerName); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + curShow->pokemonTodayFailed.language = GetStringLanguage(curShow->pokemonTodayFailed.playerName); + break; + case TVSHOW_FISHING_ADVICE: + curShow->pokemonAngler.language = GetStringLanguage(curShow->pokemonAngler.playerName); + break; + case TVSHOW_WORLD_OF_MASTERS: + curShow->worldOfMasters.language = GetStringLanguage(curShow->worldOfMasters.playerName); + break; + case TVSHOW_TREND_WATCHER: + curShow->trendWatcher.language = GetStringLanguage(curShow->trendWatcher.playerName); + break; + case TVSHOW_BREAKING_NEWS: + curShow->breakingNews.language = GetStringLanguage(curShow->breakingNews.playerName); + break; + case TVSHOW_BATTLE_SEMINAR: + curShow->battleSeminar.language = GetStringLanguage(curShow->battleSeminar.playerName); + break; + case TVSHOW_FIND_THAT_GAMER: + case TVSHOW_TRAINER_FAN_CLUB: + curShow->trainerFanClub.language = GetStringLanguage(curShow->trainerFanClub.playerName); + break; + case TVSHOW_CUTIES: + curShow->cuties.language = GetStringLanguage(curShow->cuties.playerName); + curShow->cuties.pokemonNameLanguage = GetStringLanguage(curShow->cuties.nickname); + break; + case TVSHOW_TODAYS_RIVAL_TRAINER: + case TVSHOW_SECRET_BASE_VISIT: + case TVSHOW_FRONTIER: + curShow->rivalTrainer.language = GetStringLanguage(curShow->rivalTrainer.playerName); + break; + case TVSHOW_TREASURE_INVESTIGATORS: + case TVSHOW_LOTTO_WINNER: + case TVSHOW_NUMBER_ONE: + curShow->treasureInvestigators.language = GetStringLanguage(curShow->treasureInvestigators.playerName); + break; + case TVSHOW_SECRET_BASE_SECRETS: + curShow->secretBaseSecrets.language = GetStringLanguage(curShow->secretBaseSecrets.playerName); + curShow->secretBaseSecrets.baseOwnersNameLanguage = GetStringLanguage(curShow->secretBaseSecrets.baseOwnersName); + break; + case TVSHOW_SAFARI_FAN_CLUB: + curShow->safariFanClub.language = GetStringLanguage(curShow->safariFanClub.playerName); + break; + case TVSHOW_MASS_OUTBREAK: + break; } } } -void sub_80F14F8(TVShow *shows) +void SanitizeTVShowLocationsForRuby(TVShow *shows) { int i; - for (i = 0; i < LAST_TVSHOW_IDX; i ++) + for (i = 0; i < LAST_TVSHOW_IDX; i++) { switch (shows[i].common.kind) { - case TVSHOW_WORLD_OF_MASTERS: - if (shows[i].worldOfMasters.location > KANTO_MAPSEC_START) - { - memset(&shows[i], 0, sizeof(TVShow)); - } - break; - case TVSHOW_POKEMON_TODAY_FAILED: - if (shows[i].pokemonTodayFailed.location > KANTO_MAPSEC_START) - { - memset(&shows[i], 0, sizeof(TVShow)); - } - break; + case TVSHOW_WORLD_OF_MASTERS: + if (shows[i].worldOfMasters.location > KANTO_MAPSEC_START) + memset(&shows[i], 0, sizeof(TVShow)); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + if (shows[i].pokemonTodayFailed.location > KANTO_MAPSEC_START) + memset(&shows[i], 0, sizeof(TVShow)); + break; } } } +// gSpecialVar_0x8004 here is set from GetRandomActiveShowIdx in EventScript_TryDoTVShow void DoTVShow(void) { if (gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.active) { switch (gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004].common.kind) { - case TVSHOW_FAN_CLUB_LETTER: - DoTVShowPokemonFanClubLetter(); - break; - case TVSHOW_RECENT_HAPPENINGS: - DoTVShowRecentHappenings(); - break; - case TVSHOW_PKMN_FAN_CLUB_OPINIONS: - DoTVShowPokemonFanClubOpinions(); - break; - case TVSHOW_UNKN_SHOWTYPE_04: - DoTVShowDummiedOut(); - break; - case TVSHOW_MASS_OUTBREAK: - DoTVShowPokemonNewsMassOutbreak(); - break; - case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: - DoTVShowBravoTrainerPokemonProfile(); - break; - case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: - DoTVShowBravoTrainerBattleTower(); - break; - case TVSHOW_POKEMON_TODAY_CAUGHT: - DoTVShowPokemonTodaySuccessfulCapture(); - break; - case TVSHOW_SMART_SHOPPER: - DoTVShowTodaysSmartShopper(); - break; - case TVSHOW_NAME_RATER_SHOW: - DoTVShowTheNameRaterShow(); - break; - case TVSHOW_CONTEST_LIVE_UPDATES: - DoTVShowPokemonContestLiveUpdates(); - break; - case TVSHOW_BATTLE_UPDATE: - DoTVShowPokemonBattleUpdate(); - break; - case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: - DoTVShow3CheersForPokeblocks(); - break; - case TVSHOW_POKEMON_TODAY_FAILED: - DoTVShowPokemonTodayFailedCapture(); - break; - case TVSHOW_FISHING_ADVICE: - DoTVShowPokemonAngler(); - break; - case TVSHOW_WORLD_OF_MASTERS: - DoTVShowTheWorldOfMasters(); - break; - case TVSHOW_TODAYS_RIVAL_TRAINER: - DoTVShowTodaysRivalTrainer(); - break; - case TVSHOW_TREND_WATCHER: - DoTVShowDewfordTrendWatcherNetwork(); - break; - case TVSHOW_TREASURE_INVESTIGATORS: - DoTVShowHoennTreasureInvestigators(); - break; - case TVSHOW_FIND_THAT_GAMER: - DoTVShowFindThatGamer(); - break; - case TVSHOW_BREAKING_NEWS: - DoTVShowBreakingNewsTV(); - break; - case TVSHOW_SECRET_BASE_VISIT: - DoTVShowSecretBaseVisit(); - break; - case TVSHOW_LOTTO_WINNER: - DoTVShowPokemonLotteryWinnerFlashReport(); - break; - case TVSHOW_BATTLE_SEMINAR: - DoTVShowThePokemonBattleSeminar(); - break; - case TVSHOW_FAN_CLUB_SPECIAL: - DoTVShowTrainerFanClubSpecial(); - break; - case TVSHOW_TRAINER_FAN_CLUB: - DoTVShowTrainerFanClub(); - break; - case TVSHOW_CUTIES: - DoTVShowSpotTheCuties(); - break; - case TVSHOW_FRONTIER: - DoTVShowPokemonNewsBattleFrontier(); - break; - case TVSHOW_NUMBER_ONE: - DoTVShowWhatsNo1InHoennToday(); - break; - case TVSHOW_SECRET_BASE_SECRETS: - DoTVShowSecretBaseSecrets(); - break; - case TVSHOW_SAFARI_FAN_CLUB: - DoTVShowSafariFanClub(); - break; - case TVSHOW_CONTEST_LIVE_UPDATES_2: - DoTVShowPokemonContestLiveUpdates2(); - break; + case TVSHOW_FAN_CLUB_LETTER: + DoTVShowPokemonFanClubLetter(); + break; + case TVSHOW_RECENT_HAPPENINGS: + DoTVShowRecentHappenings(); + break; + case TVSHOW_PKMN_FAN_CLUB_OPINIONS: + DoTVShowPokemonFanClubOpinions(); + break; + case TVSHOW_DUMMY: + DoTVShowDummiedOut(); + break; + case TVSHOW_MASS_OUTBREAK: + DoTVShowPokemonNewsMassOutbreak(); + break; + case TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE: + DoTVShowBravoTrainerPokemonProfile(); + break; + case TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE: + DoTVShowBravoTrainerBattleTower(); + break; + case TVSHOW_POKEMON_TODAY_CAUGHT: + DoTVShowPokemonTodaySuccessfulCapture(); + break; + case TVSHOW_SMART_SHOPPER: + DoTVShowTodaysSmartShopper(); + break; + case TVSHOW_NAME_RATER_SHOW: + DoTVShowTheNameRaterShow(); + break; + case TVSHOW_CONTEST_LIVE_UPDATES: + DoTVShowPokemonContestLiveUpdates(); + break; + case TVSHOW_BATTLE_UPDATE: + DoTVShowPokemonBattleUpdate(); + break; + case TVSHOW_3_CHEERS_FOR_POKEBLOCKS: + DoTVShow3CheersForPokeblocks(); + break; + case TVSHOW_POKEMON_TODAY_FAILED: + DoTVShowPokemonTodayFailedCapture(); + break; + case TVSHOW_FISHING_ADVICE: + DoTVShowPokemonAngler(); + break; + case TVSHOW_WORLD_OF_MASTERS: + DoTVShowTheWorldOfMasters(); + break; + case TVSHOW_TODAYS_RIVAL_TRAINER: + DoTVShowTodaysRivalTrainer(); + break; + case TVSHOW_TREND_WATCHER: + DoTVShowDewfordTrendWatcherNetwork(); + break; + case TVSHOW_TREASURE_INVESTIGATORS: + DoTVShowHoennTreasureInvestigators(); + break; + case TVSHOW_FIND_THAT_GAMER: + DoTVShowFindThatGamer(); + break; + case TVSHOW_BREAKING_NEWS: + DoTVShowBreakingNewsTV(); + break; + case TVSHOW_SECRET_BASE_VISIT: + DoTVShowSecretBaseVisit(); + break; + case TVSHOW_LOTTO_WINNER: + DoTVShowPokemonLotteryWinnerFlashReport(); + break; + case TVSHOW_BATTLE_SEMINAR: + DoTVShowThePokemonBattleSeminar(); + break; + case TVSHOW_FAN_CLUB_SPECIAL: + DoTVShowTrainerFanClubSpecial(); + break; + case TVSHOW_TRAINER_FAN_CLUB: + DoTVShowTrainerFanClub(); + break; + case TVSHOW_CUTIES: + DoTVShowSpotTheCuties(); + break; + case TVSHOW_FRONTIER: + DoTVShowPokemonNewsBattleFrontier(); + break; + case TVSHOW_NUMBER_ONE: + DoTVShowWhatsNo1InHoennToday(); + break; + case TVSHOW_SECRET_BASE_SECRETS: + DoTVShowSecretBaseSecrets(); + break; + case TVSHOW_SAFARI_FAN_CLUB: + DoTVShowSafariFanClub(); + break; + case TVSHOW_LILYCOVE_CONTEST_LADY: + DoTVShowLilycoveContestLady(); + break; } } } @@ -4517,64 +4291,64 @@ static void DoTVShowBravoTrainerPokemonProfile(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory); - CopyContestRankToStringVar(2, show->bravoTrainer.contestRank); - if (!StringCompare(gSpeciesNames[show->bravoTrainer.species], show->bravoTrainer.pokemonNickname)) - sTVShowState = 8; - else - sTVShowState = 1; - break; - case 1: - StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); - TVShowConvertInternationalString(gStringVar2, show->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNameLanguage); - CopyContestCategoryToStringVar(2, show->bravoTrainer.contestCategory); - sTVShowState = 2; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - if (show->bravoTrainer.contestResult == 0) // placed first - sTVShowState = 3; - else - sTVShowState = 4; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]); - TV_PrintIntToStringVar(2, show->bravoTrainer.contestResult + 1); - sTVShowState = 5; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]); - TV_PrintIntToStringVar(2, show->bravoTrainer.contestResult + 1); - sTVShowState = 5; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory); - CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]); - if (show->bravoTrainer.move) - sTVShowState = 6; - else - sTVShowState = 7; - break; - case 6: - StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); - StringCopy(gStringVar2, gMoveNames[show->bravoTrainer.move]); - CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]); + case 0: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); + CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory); + CopyContestRankToStringVar(2, show->bravoTrainer.contestRank); + if (!StringCompare(gSpeciesNames[show->bravoTrainer.species], show->bravoTrainer.pokemonNickname)) + sTVShowState = 8; + else + sTVShowState = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); + TVShowConvertInternationalString(gStringVar2, show->bravoTrainer.pokemonNickname, show->bravoTrainer.pokemonNameLanguage); + CopyContestCategoryToStringVar(2, show->bravoTrainer.contestCategory); + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); + if (show->bravoTrainer.contestResult == 0) // placed first + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); + CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]); + ConvertIntToDecimalString(2, show->bravoTrainer.contestResult + 1); + sTVShowState = 5; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); + CopyEasyChatWord(gStringVar2, show->bravoTrainer.words[0]); + ConvertIntToDecimalString(2, show->bravoTrainer.contestResult + 1); + sTVShowState = 5; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); + CopyContestCategoryToStringVar(1, show->bravoTrainer.contestCategory); + CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]); + if (show->bravoTrainer.move) + sTVShowState = 6; + else sTVShowState = 7; - break; - case 7: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainer.species]); - TVShowDone(); - break; - case 8: - StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); - sTVShowState = 2; - break; + break; + case 6: + StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); + StringCopy(gStringVar2, gMoveNames[show->bravoTrainer.move]); + CopyEasyChatWord(gStringVar3, show->bravoTrainer.words[1]); + sTVShowState = 7; + break; + case 7: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainer.playerName, show->bravoTrainer.language); + StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainer.species]); + TVShowDone(); + break; + case 8: + StringCopy(gStringVar1, gSpeciesNames[show->bravoTrainer.species]); + sTVShowState = 2; + break; } ShowFieldMessage(sTVBravoTrainerTextGroup[state]); } @@ -4589,89 +4363,89 @@ static void DoTVShowBravoTrainerBattleTower(void) state = sTVShowState; switch(state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); - if (show->bravoTrainerTower.numFights >= 7) - sTVShowState = 1; - else - sTVShowState = 2; - break; - case 1: - if (show->bravoTrainerTower.btLevel == 50) - { - StringCopy(gStringVar1, gText_Lv50); - } - else - { - StringCopy(gStringVar1, gText_OpenLevel); - } - TV_PrintIntToStringVar(1, show->bravoTrainerTower.numFights); - if (show->bravoTrainerTower.wonTheChallenge == TRUE) - sTVShowState = 3; - else - sTVShowState = 4; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - TV_PrintIntToStringVar(1, show->bravoTrainerTower.numFights + 1); - if (show->bravoTrainerTower.interviewResponse == 0) - sTVShowState = 5; - else - sTVShowState = 6; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); - if (show->bravoTrainerTower.interviewResponse == 0) - sTVShowState = 5; - else - sTVShowState = 6; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); - if (show->bravoTrainerTower.interviewResponse == 0) - sTVShowState = 5; - else - sTVShowState = 6; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - sTVShowState = 11; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - sTVShowState = 11; - break; - case 7: - sTVShowState = 11; - break; - case 8: - case 9: - case 10: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - sTVShowState = 11; - break; - case 11: - CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]); - if (show->bravoTrainerTower.interviewResponse == 0) - sTVShowState = 12; - else - sTVShowState = 13; - break; - case 12: - case 13: - CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]); - TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); - sTVShowState = 14; - break; - case 14: - TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); - StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); + if (show->bravoTrainerTower.numFights >= 7) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 1: + if (show->bravoTrainerTower.btLevel == 50) + { + StringCopy(gStringVar1, gText_Lv50); + } + else + { + StringCopy(gStringVar1, gText_OpenLevel); + } + ConvertIntToDecimalString(1, show->bravoTrainerTower.numFights); + if (show->bravoTrainerTower.wonTheChallenge == TRUE) + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + ConvertIntToDecimalString(1, show->bravoTrainerTower.numFights + 1); + if (show->bravoTrainerTower.interviewResponse == 0) + sTVShowState = 5; + else + sTVShowState = 6; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); + if (show->bravoTrainerTower.interviewResponse == 0) + sTVShowState = 5; + else + sTVShowState = 6; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.defeatedSpecies]); + if (show->bravoTrainerTower.interviewResponse == 0) + sTVShowState = 5; + else + sTVShowState = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + sTVShowState = 11; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + sTVShowState = 11; + break; + case 7: + sTVShowState = 11; + break; + case 8: + case 9: + case 10: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + sTVShowState = 11; + break; + case 11: + CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]); + if (show->bravoTrainerTower.interviewResponse == 0) + sTVShowState = 12; + else + sTVShowState = 13; + break; + case 12: + case 13: + CopyEasyChatWord(gStringVar1, show->bravoTrainerTower.words[0]); + TVShowConvertInternationalString(gStringVar2, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + TVShowConvertInternationalString(gStringVar3, show->bravoTrainerTower.pokemonName, show->bravoTrainerTower.pokemonNameLanguage); + sTVShowState = 14; + break; + case 14: + TVShowConvertInternationalString(gStringVar1, show->bravoTrainerTower.trainerName, show->bravoTrainerTower.language); + StringCopy(gStringVar2, gSpeciesNames[show->bravoTrainerTower.species]); + TVShowDone(); + break; } ShowFieldMessage(sTVBravoTrainerBattleTowerTextGroup[state]); } @@ -4686,115 +4460,81 @@ static void DoTVShowTodaysSmartShopper(void) state = sTVShowState; switch(state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - GetMapName(gStringVar2, show->smartshopperShow.shopLocation, 0); - if (show->smartshopperShow.itemAmounts[0] >= 255) - { - sTVShowState = 11; - } - else - { - sTVShowState = 1; - } - break; - case 1: - TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); - TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0]); - sTVShowState += 1 + (Random() % 4); - break; - case 2: - case 4: - case 5: - if (show->smartshopperShow.itemIds[1] != ITEM_NONE) - { - sTVShowState = 6; - } - else - { - sTVShowState = 10; - } - break; - case 3: - TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0] + 1); - if (show->smartshopperShow.itemIds[1] != ITEM_NONE) - { - sTVShowState = 6; - } - else - { - sTVShowState = 10; - } - break; - case 6: - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1])); - TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[1]); - if (show->smartshopperShow.itemIds[2] != ITEM_NONE) - { - sTVShowState = 7; - } - else if (show->smartshopperShow.priceReduced == TRUE) - { - sTVShowState = 8; - } - else - { - sTVShowState = 9; - } - break; - case 7: - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2])); - TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[2]); - if (show->smartshopperShow.priceReduced == TRUE) - { - sTVShowState = 8; - } - else - { - sTVShowState = 9; - } - break; - case 8: - if (show->smartshopperShow.itemAmounts[0] >= 255) - { - sTVShowState = 12; - } - else - { - sTVShowState = 9; - } - break; - case 9: - sub_80EF40C(1, show); - TVShowDone(); - break; - case 10: - if (show->smartshopperShow.priceReduced == TRUE) - { - sTVShowState = 8; - } - else - { - sTVShowState = 9; - } - break; - case 11: - TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); - if (show->smartshopperShow.priceReduced == TRUE) - { - sTVShowState = 8; - } - else - { - sTVShowState = 12; - } - break; - case 12: - TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); + GetMapName(gStringVar2, show->smartshopperShow.shopLocation, 0); + if (show->smartshopperShow.itemAmounts[0] >= 255) + sTVShowState = 11; + else + sTVShowState = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); + ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[0]); + sTVShowState += 1 + (Random() % 4); + break; + case 2: + case 4: + case 5: + if (show->smartshopperShow.itemIds[1] != ITEM_NONE) + sTVShowState = 6; + else + sTVShowState = 10; + break; + case 3: + ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[0] + 1); + if (show->smartshopperShow.itemIds[1] != ITEM_NONE) + sTVShowState = 6; + else + sTVShowState = 10; + break; + case 6: + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1])); + ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[1]); + if (show->smartshopperShow.itemIds[2] != ITEM_NONE) + sTVShowState = 7; + else if (show->smartshopperShow.priceReduced == TRUE) + sTVShowState = 8; + else + sTVShowState = 9; + break; + case 7: + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2])); + ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[2]); + if (show->smartshopperShow.priceReduced == TRUE) + sTVShowState = 8; + else + sTVShowState = 9; + break; + case 8: + if (show->smartshopperShow.itemAmounts[0] >= 255) + sTVShowState = 12; + else + sTVShowState = 9; + break; + case 9: + sub_80EF40C(1, show); + TVShowDone(); + break; + case 10: + if (show->smartshopperShow.priceReduced == TRUE) + sTVShowState = 8; + else + sTVShowState = 9; + break; + case 11: + TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); + if (show->smartshopperShow.priceReduced == TRUE) + sTVShowState = 8; + else + sTVShowState = 12; + break; + case 12: + TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); + TVShowDone(); + break; } ShowFieldMessage(sTVTodaysSmartShopperTextGroup[state]); } @@ -4809,90 +4549,78 @@ static void DoTVShowTheNameRaterShow(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); - StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]); - TVShowConvertInternationalString(gStringVar3, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); - sTVShowState = TV_GetNicknameSumMod8(show) + 1; - break; - case 1: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - if (show->nameRaterShow.random == 0) - { - sTVShowState = 9; - } - else if (show->nameRaterShow.random == 1) - { - sTVShowState = 10; - } - else if (show->nameRaterShow.random == 2) - { - sTVShowState = 11; - } - break; - case 2: - TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); - if (show->nameRaterShow.random == 0) - { - sTVShowState = 9; - } - else if (show->nameRaterShow.random == 1) - { - sTVShowState = 10; - } - else if (show->nameRaterShow.random == 2) - { - sTVShowState = 11; - } - break; - case 9: - case 10: - case 11: - TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); - TV_GetNicknameSubstring(1, 0, 0, 1, 0, show); - TV_GetNicknameSubstring(2, 1, 0, 1, 0, show); - sTVShowState = 12; - break; - case 13: - TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); - TV_GetNicknameSubstring(1, 0, 2, 0, 0, show); - TV_GetNicknameSubstring(2, 0, 3, 1, 0, show); - sTVShowState = 14; - break; - case 14: - TV_GetNicknameSubstring(1, 0, 2, 1, 0, show); - TV_GetNicknameSubstring(2, 0, 3, 0, 0, show); - sTVShowState = 18; - break; - case 15: - TV_GetNicknameSubstring(0, 0, 2, 1, 0, show); - StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]); - TV_GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.species, show); - sTVShowState = 16; - break; - case 16: - TV_GetNicknameSubstring(0, 0, 2, 2, show->nameRaterShow.species, show); - TV_GetNicknameSubstring(2, 0, 3, 1, 0, show); - sTVShowState = 17; - break; - case 17: - TV_GetNicknameSubstring(0, 0, 2, 1, 0, show); - StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.randomSpecies]); - TV_GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.randomSpecies, show); - sTVShowState = 18; - break; - case 12: - state = 18; - sTVShowState = 18; - case 18: - TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); + StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]); + TVShowConvertInternationalString(gStringVar3, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); + sTVShowState = GetRandomNameRaterStateFromName(show) + 1; + break; + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + if (show->nameRaterShow.random == 0) + sTVShowState = 9; + else if (show->nameRaterShow.random == 1) + sTVShowState = 10; + else if (show->nameRaterShow.random == 2) + sTVShowState = 11; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); + if (show->nameRaterShow.random == 0) + sTVShowState = 9; + else if (show->nameRaterShow.random == 1) + sTVShowState = 10; + else if (show->nameRaterShow.random == 2) + sTVShowState = 11; + break; + case 9: + case 10: + case 11: + TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); + GetNicknameSubstring(1, 0, 0, 1, 0, show); + GetNicknameSubstring(2, 1, 0, 1, 0, show); + sTVShowState = 12; + break; + case 13: + TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.trainerName, show->nameRaterShow.language); + GetNicknameSubstring(1, 0, 2, 0, 0, show); + GetNicknameSubstring(2, 0, 3, 1, 0, show); + sTVShowState = 14; + break; + case 14: + GetNicknameSubstring(1, 0, 2, 1, 0, show); + GetNicknameSubstring(2, 0, 3, 0, 0, show); + sTVShowState = 18; + break; + case 15: + GetNicknameSubstring(0, 0, 2, 1, 0, show); + StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.species]); + GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.species, show); + sTVShowState = 16; + break; + case 16: + GetNicknameSubstring(0, 0, 2, 2, show->nameRaterShow.species, show); + GetNicknameSubstring(2, 0, 3, 1, 0, show); + sTVShowState = 17; + break; + case 17: + GetNicknameSubstring(0, 0, 2, 1, 0, show); + StringCopy(gStringVar2, gSpeciesNames[show->nameRaterShow.randomSpecies]); + GetNicknameSubstring(2, 0, 3, 2, show->nameRaterShow.randomSpecies, show); + sTVShowState = 18; + break; + case 12: + state = 18; + sTVShowState = 18; + case 18: + TVShowConvertInternationalString(gStringVar1, show->nameRaterShow.pokemonName, show->nameRaterShow.pokemonNameLanguage); + TVShowDone(); + break; } ShowFieldMessage(sTVNameRaterTextGroup[state]); } @@ -4907,70 +4635,62 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); - TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); - if (show->pokemonToday.ball == ITEM_MASTER_BALL) - { - sTVShowState = 5; - } - else - { - sTVShowState = 1; - } - break; - case 1: - sTVShowState = 2; - break; - case 2: - StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball)); - TV_PrintIntToStringVar(2, show->pokemonToday.nBallsUsed); - if (show->pokemonToday.nBallsUsed < 4) - { - sTVShowState = 3; - } - else - { - sTVShowState = 4; - } - break; - case 3: - TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); - TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); - sTVShowState = 6; - break; - case 4: - sTVShowState = 6; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); - sTVShowState = 6; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); - TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); - sTVShowState += 1 + (Random() % 4); - break; - case 7: - case 8: - StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]); - TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2); - TV_GetSomeOtherSpeciesAlreadySeenByPlayer_AndPrintName(2, show->pokemonToday.species); - sTVShowState = 11; - break; - case 9: - case 10: - StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]); - TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2); - sTVShowState = 11; - break; - case 11: - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); + if (show->pokemonToday.ball == ITEM_MASTER_BALL) + sTVShowState = 5; + else + sTVShowState = 1; + break; + case 1: + sTVShowState = 2; + break; + case 2: + StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball)); + ConvertIntToDecimalString(2, show->pokemonToday.nBallsUsed); + if (show->pokemonToday.nBallsUsed < 4) + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); + sTVShowState = 6; + break; + case 4: + sTVShowState = 6; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + sTVShowState = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->pokemonToday.playerName, show->pokemonToday.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar3, show->pokemonToday.nickname, show->pokemonToday.language2); + sTVShowState += 1 + (Random() % 4); + break; + case 7: + case 8: + StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2); + GetRandomDifferentSpeciesAndNameSeenByPlayer(2, show->pokemonToday.species); + sTVShowState = 11; + break; + case 9: + case 10: + StringCopy(gStringVar1, gSpeciesNames[show->pokemonToday.species]); + TVShowConvertInternationalString(gStringVar2, show->pokemonToday.nickname, show->pokemonToday.language2); + sTVShowState = 11; + break; + case 11: + TVShowDone(); + break; } ShowFieldMessage(sTVPokemonTodaySuccessfulTextGroup[state]); } @@ -4985,45 +4705,37 @@ static void DoTVShowPokemonTodayFailedCapture(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonTodayFailed.species]); - sTVShowState = 1; - break; - case 1: - TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); - GetMapName(gStringVar2, show->pokemonTodayFailed.location, 0); - StringCopy(gStringVar3, gSpeciesNames[show->pokemonTodayFailed.species2]); - if (show->pokemonTodayFailed.outcome == 1) - { - sTVShowState = 3; - } - else - { - sTVShowState = 2; - } - break; - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); - TV_PrintIntToStringVar(1, show->pokemonTodayFailed.nBallsUsed); - if (Random() % 3 == 0) - { - sTVShowState = 5; - } - else - { - sTVShowState = 4; - } - break; - case 4: - case 5: - TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); - sTVShowState = 6; - break; - case 6: - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonTodayFailed.species]); + sTVShowState = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); + GetMapName(gStringVar2, show->pokemonTodayFailed.location, 0); + StringCopy(gStringVar3, gSpeciesNames[show->pokemonTodayFailed.species2]); + if (show->pokemonTodayFailed.outcome == 1) + sTVShowState = 3; + else + sTVShowState = 2; + break; + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); + ConvertIntToDecimalString(1, show->pokemonTodayFailed.nBallsUsed); + if (Random() % 3 == 0) + sTVShowState = 5; + else + sTVShowState = 4; + break; + case 4: + case 5: + TVShowConvertInternationalString(gStringVar1, show->pokemonTodayFailed.playerName, show->pokemonTodayFailed.language); + sTVShowState = 6; + break; + case 6: + TVShowDone(); + break; } ShowFieldMessage(sTVPokemonTodayFailedTextGroup[state]); } @@ -5039,45 +4751,45 @@ static void DoTVShowPokemonFanClubLetter(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->fanclubLetter.playerName, show->fanclubLetter.language); - StringCopy(gStringVar2, gSpeciesNames[show->fanclubLetter.species]); - sTVShowState = 50; - break; - case 1: - rval = (Random() % 4) + 1; - if (rval == 1) - sTVShowState = 2; - else - sTVShowState = rval + 2; - break; - case 2: - sTVShowState = 51; - break; - case 3: - sTVShowState += (Random() % 3) + 1; - break; - case 4: - case 5: - case 6: - TV_FanClubLetter_RandomWordToStringVar3(show); - sTVShowState = 7; - break; - case 7: - rval = (Random() % 0x1f) + 0x46; - TV_PrintIntToStringVar(2, rval); - TVShowDone(); - break; - case 50: - ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2); - ShowFieldMessage(gStringVar4); - sTVShowState = 1; - return; - case 51: - ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2); - ShowFieldMessage(gStringVar4); - sTVShowState = 3; - return; + case 0: + TVShowConvertInternationalString(gStringVar1, show->fanclubLetter.playerName, show->fanclubLetter.language); + StringCopy(gStringVar2, gSpeciesNames[show->fanclubLetter.species]); + sTVShowState = 50; + break; + case 1: + rval = (Random() % 4) + 1; + if (rval == 1) + sTVShowState = 2; + else + sTVShowState = rval + 2; + break; + case 2: + sTVShowState = 51; + break; + case 3: + sTVShowState += (Random() % 3) + 1; + break; + case 4: + case 5: + case 6: + GetRandomWordFromShow(show); + sTVShowState = 7; + break; + case 7: + rval = (Random() % 0x1f) + 0x46; + ConvertIntToDecimalString(2, rval); + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2); + ShowFieldMessage(gStringVar4); + sTVShowState = 1; + return; + case 51: + ConvertEasyChatWordsToString(gStringVar4, show->fanclubLetter.words, 2, 2); + ShowFieldMessage(gStringVar4); + sTVShowState = 3; + return; } ShowFieldMessage(sTVFanClubTextGroup[state]); } @@ -5092,27 +4804,27 @@ static void DoTVShowRecentHappenings(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->recentHappenings.playerName, show->recentHappenings.language); - TV_FanClubLetter_RandomWordToStringVar3(show); - sTVShowState = 50; - break; - case 1: - sTVShowState += 1 + (Random() % 3); - break; - case 2: - case 3: - case 4: - sTVShowState = 5; - break; - case 5: - TVShowDone(); - break; - case 50: - ConvertEasyChatWordsToString(gStringVar4, show->recentHappenings.words, 2, 2); - ShowFieldMessage(gStringVar4); - sTVShowState = 1; - return; + case 0: + TVShowConvertInternationalString(gStringVar1, show->recentHappenings.playerName, show->recentHappenings.language); + GetRandomWordFromShow(show); + sTVShowState = 50; + break; + case 1: + sTVShowState += 1 + (Random() % 3); + break; + case 2: + case 3: + case 4: + sTVShowState = 5; + break; + case 5: + TVShowDone(); + break; + case 50: + ConvertEasyChatWordsToString(gStringVar4, show->recentHappenings.words, 2, 2); + ShowFieldMessage(gStringVar4); + sTVShowState = 1; + return; } ShowFieldMessage(sTVRecentHappeninssTextGroup[state]); } @@ -5127,25 +4839,25 @@ static void DoTVShowPokemonFanClubOpinions(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); - StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]); - TVShowConvertInternationalString(gStringVar3, show->fanclubOpinions.nickname, show->fanclubOpinions.pokemonNameLanguage); - sTVShowState = show->fanclubOpinions.questionAsked + 1; - break; - case 1: - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); - StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]); - CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[0]); - sTVShowState = 4; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); - CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[1]); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); + StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]); + TVShowConvertInternationalString(gStringVar3, show->fanclubOpinions.nickname, show->fanclubOpinions.pokemonNameLanguage); + sTVShowState = show->fanclubOpinions.questionAsked + 1; + break; + case 1: + case 2: + case 3: + TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); + StringCopy(gStringVar2, gSpeciesNames[show->fanclubOpinions.species]); + CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[0]); + sTVShowState = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->fanclubOpinions.playerName, show->fanclubOpinions.language); + CopyEasyChatWord(gStringVar3, show->fanclubOpinions.words[1]); + TVShowDone(); + break; } ShowFieldMessage(sTVFanClubOpinionsTextGroup[state]); } @@ -5190,13 +4902,9 @@ static void DoTVShowPokemonContestLiveUpdates(void) if (show->contestLiveUpdates.round1Placing == show->contestLiveUpdates.round2Placing) { if (show->contestLiveUpdates.round1Placing == 0) - { sTVShowState = CONTESTLIVE_STATE_WON_BOTH_ROUNDS; - } else - { sTVShowState = CONTESTLIVE_STATE_EQUAL_ROUNDS; - } } else if (show->contestLiveUpdates.round1Placing > show->contestLiveUpdates.round2Placing) { @@ -5529,64 +5237,64 @@ static void DoTVShowPokemonBattleUpdate(void) state = sTVShowState; switch (state) { + case 0: + switch (show->battleUpdate.battleType) + { case 0: - switch (show->battleUpdate.battleType) - { - case 0: - case 1: - sTVShowState = 1; - break; - case 2: - sTVShowState = 5; - break; - } - break; case 1: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - if (show->battleUpdate.battleType == 0) - { - StringCopy(gStringVar3, gText_Single); - } - else - { - StringCopy(gStringVar3, gText_Double); - } - sTVShowState = 2; + sTVShowState = 1; break; case 2: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]); - StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]); - sTVShowState = 3; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesOpponent]); - sTVShowState = 4; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - TVShowDone(); - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - sTVShowState = 6; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]); - StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]); - sTVShowState = 7; - break; - case 7: - TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); - TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); - StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.speciesOpponent]); - TVShowDone(); + sTVShowState = 5; break; + } + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); + TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); + if (show->battleUpdate.battleType == 0) + { + StringCopy(gStringVar3, gText_Single); + } + else + { + StringCopy(gStringVar3, gText_Double); + } + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); + StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]); + StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]); + sTVShowState = 3; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); + StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesOpponent]); + sTVShowState = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); + TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); + TVShowDone(); + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); + TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); + sTVShowState = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); + StringCopy(gStringVar2, gSpeciesNames[show->battleUpdate.speciesPlayer]); + StringCopy(gStringVar3, gMoveNames[show->battleUpdate.move]); + sTVShowState = 7; + break; + case 7: + TVShowConvertInternationalString(gStringVar1, show->battleUpdate.playerName, show->battleUpdate.language); + TVShowConvertInternationalString(gStringVar2, show->battleUpdate.linkOpponentName, show->battleUpdate.linkOpponentLanguage); + StringCopy(gStringVar3, gSpeciesNames[show->battleUpdate.speciesOpponent]); + TVShowDone(); + break; } ShowFieldMessage(sTVPokemonBattleUpdateTextGroup[state]); } @@ -5601,95 +5309,88 @@ static void DoTVShow3CheersForPokeblocks(void) state = sTVShowState; switch (state) { + case 0: + TVShowConvertInternationalString(gStringVar1, show->threeCheers.playerName, show->threeCheers.language); + if (show->threeCheers.sheen > 20) + sTVShowState = 1; + else + sTVShowState = 3; + break; + case 1: + switch (show->threeCheers.flavor) + { case 0: - TVShowConvertInternationalString(gStringVar1, show->threeCheers.playerName, show->threeCheers.language); - if (show->threeCheers.sheen > 20) - { - sTVShowState = 1; - } - else - { - sTVShowState = 3; - } + StringCopy(gStringVar1, gText_Spicy2); break; case 1: - switch (show->threeCheers.flavor) - { - case 0: - StringCopy(gStringVar1, gText_Spicy2); - break; - case 1: - StringCopy(gStringVar1, gText_Dry2); - break; - case 2: - StringCopy(gStringVar1, gText_Sweet2); - break; - case 3: - StringCopy(gStringVar1, gText_Bitter2); - break; - case 4: - StringCopy(gStringVar1, gText_Sour2); - break; - } - if (show->threeCheers.sheen > 24) - { - StringCopy(gStringVar2, gText_Excellent); - } else if (show->threeCheers.sheen > 22) - { - StringCopy(gStringVar2, gText_VeryGood); - } - else - { - StringCopy(gStringVar2, gText_Good); - } - TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language); - sTVShowState = 2; + StringCopy(gStringVar1, gText_Dry2); break; case 2: - TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage); - sTVShowState = 5; + StringCopy(gStringVar1, gText_Sweet2); break; case 3: - switch (show->threeCheers.flavor) - { - case 0: - StringCopy(gStringVar1, gText_Spicy2); - break; - case 1: - StringCopy(gStringVar1, gText_Dry2); - break; - case 2: - StringCopy(gStringVar1, gText_Sweet2); - break; - case 3: - StringCopy(gStringVar1, gText_Bitter2); - break; - case 4: - StringCopy(gStringVar1, gText_Sour2); - break; - } - if (show->threeCheers.sheen > 16) - { - StringCopy(gStringVar2, gText_SoSo); - } else if (show->threeCheers.sheen > 13) - { - StringCopy(gStringVar2, gText_Bad); - } - else - { - StringCopy(gStringVar2, gText_TheWorst); - } - TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language); - sTVShowState = 4; + StringCopy(gStringVar1, gText_Bitter2); break; case 4: - TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage); - TVShowConvertInternationalString(gStringVar2, show->threeCheers.playerName, show->threeCheers.language); - sTVShowState = 5; + StringCopy(gStringVar1, gText_Sour2); break; - case 5: - TVShowDone(); + } + if (show->threeCheers.sheen > 24) + { + StringCopy(gStringVar2, gText_Excellent); + } else if (show->threeCheers.sheen > 22) + { + StringCopy(gStringVar2, gText_VeryGood); + } + else + { + StringCopy(gStringVar2, gText_Good); + } + TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language); + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage); + sTVShowState = 5; + break; + case 3: + switch (show->threeCheers.flavor) + { + case 0: + StringCopy(gStringVar1, gText_Spicy2); break; + case 1: + StringCopy(gStringVar1, gText_Dry2); + break; + case 2: + StringCopy(gStringVar1, gText_Sweet2); + break; + case 3: + StringCopy(gStringVar1, gText_Bitter2); + break; + case 4: + StringCopy(gStringVar1, gText_Sour2); + break; + } + + if (show->threeCheers.sheen > 16) + StringCopy(gStringVar2, gText_SoSo); + else if (show->threeCheers.sheen > 13) + StringCopy(gStringVar2, gText_Bad); + else + StringCopy(gStringVar2, gText_TheWorst); + + TVShowConvertInternationalString(gStringVar3, show->threeCheers.playerName, show->threeCheers.language); + sTVShowState = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->threeCheers.worstBlenderName, show->threeCheers.worstBlenderLanguage); + TVShowConvertInternationalString(gStringVar2, show->threeCheers.playerName, show->threeCheers.language); + sTVShowState = 5; + break; + case 5: + TVShowDone(); + break; } ShowFieldMessage(sTV3CheersForPokeblocksTextGroup[state]); } @@ -5702,62 +5403,48 @@ void DoTVShowInSearchOfTrainers(void) state = sTVShowState; switch (state) { - case 0: - GetMapName(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.mapnum, 0); - if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 1) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } - break; - case 1: + case 0: + GetMapName(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.mapnum, 0); + if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 1) + sTVShowState = 1; + else sTVShowState = 2; - break; - case 2: - if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn) - { - sTVShowState = 4; - } - else if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall) - { - sTVShowState = 5; - } - else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem) - { - sTVShowState = 6; - } - else if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon) - { - sTVShowState = 7; - } - else - { - sTVShowState = 3; - } - break; - case 3: - StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]); - StringCopy(gStringVar2, gMoveNames[gSaveBlock1Ptr->gabbyAndTyData.lastMove]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]); - sTVShowState = 8; - break; - case 4: - case 5: - case 6: - case 7: - sTVShowState = 8; - break; - case 8: - CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]); - StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]); - StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]); - gSpecialVar_Result = TRUE; - sTVShowState = 0; - TakeTVShowInSearchOfTrainersOffTheAir(); - break; + break; + case 1: + sTVShowState = 2; + break; + case 2: + if (!gSaveBlock1Ptr->gabbyAndTyData.battleTookMoreThanOneTurn) + sTVShowState = 4; + else if (gSaveBlock1Ptr->gabbyAndTyData.playerThrewABall) + sTVShowState = 5; + else if (gSaveBlock1Ptr->gabbyAndTyData.playerUsedHealingItem) + sTVShowState = 6; + else if (gSaveBlock1Ptr->gabbyAndTyData.playerLostAMon) + sTVShowState = 7; + else + sTVShowState = 3; + break; + case 3: + StringCopy(gStringVar1, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]); + StringCopy(gStringVar2, gMoveNames[gSaveBlock1Ptr->gabbyAndTyData.lastMove]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]); + sTVShowState = 8; + break; + case 4: + case 5: + case 6: + case 7: + sTVShowState = 8; + break; + case 8: + CopyEasyChatWord(gStringVar1, gSaveBlock1Ptr->gabbyAndTyData.quote[0]); + StringCopy(gStringVar2, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon1]); + StringCopy(gStringVar3, gSpeciesNames[gSaveBlock1Ptr->gabbyAndTyData.mon2]); + gSpecialVar_Result = TRUE; + sTVShowState = 0; + TakeGabbyAndTyOffTheAir(); + break; } ShowFieldMessage(sTVInSearchOfTrainersTextGroup[state]); } @@ -5770,28 +5457,24 @@ static void DoTVShowPokemonAngler(void) show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; gSpecialVar_Result = FALSE; if (show->pokemonAngler.nBites < show->pokemonAngler.nFails) - { sTVShowState = 0; - } else - { sTVShowState = 1; - } state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]); - TV_PrintIntToStringVar(2, show->pokemonAngler.nFails); - TVShowDone(); - break; - case 1: - TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language); - StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]); - TV_PrintIntToStringVar(2, show->pokemonAngler.nBites); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]); + ConvertIntToDecimalString(2, show->pokemonAngler.nFails); + TVShowDone(); + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->pokemonAngler.playerName, show->pokemonAngler.language); + StringCopy(gStringVar2, gSpeciesNames[show->pokemonAngler.species]); + ConvertIntToDecimalString(2, show->pokemonAngler.nBites); + TVShowDone(); + break; } ShowFieldMessage(sTVPokemonAnslerTextGroup[state]); } @@ -5806,22 +5489,22 @@ static void DoTVShowTheWorldOfMasters(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language); - TV_PrintIntToStringVar(1, show->worldOfMasters.steps); - TV_PrintIntToStringVar(2, show->worldOfMasters.numPokeCaught); - sTVShowState = 1; - break; - case 1: - StringCopy(gStringVar1, gSpeciesNames[show->worldOfMasters.species]); - sTVShowState = 2; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language); - GetMapName(gStringVar2, show->worldOfMasters.location, 0); - StringCopy(gStringVar3, gSpeciesNames[show->worldOfMasters.caughtPoke]); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language); + ConvertIntToDecimalString(1, show->worldOfMasters.steps); + ConvertIntToDecimalString(2, show->worldOfMasters.numPokeCaught); + sTVShowState = 1; + break; + case 1: + StringCopy(gStringVar1, gSpeciesNames[show->worldOfMasters.species]); + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->worldOfMasters.playerName, show->worldOfMasters.language); + GetMapName(gStringVar2, show->worldOfMasters.location, 0); + StringCopy(gStringVar3, gSpeciesNames[show->worldOfMasters.caughtPoke]); + TVShowDone(); + break; } ShowFieldMessage(sTVWorldOfMastersTextGroup[state]); } @@ -5836,143 +5519,111 @@ static void DoTVShowTodaysRivalTrainer(void) state = sTVShowState; switch (state) { - case 0: - switch (show->rivalTrainer.location) - { - default: - sTVShowState = 7; - break; - case MAPSEC_SECRET_BASE: - sTVShowState = 8; - break; - case MAPSEC_DYNAMIC: - switch (show->rivalTrainer.mapLayoutId) - { - case LAYOUT_SS_TIDAL_CORRIDOR: - case LAYOUT_SS_TIDAL_LOWER_DECK: - case LAYOUT_SS_TIDAL_ROOMS: - sTVShowState = 10; - break; - default: - sTVShowState = 9; - break; - } - break; - } - break; - case 7: - TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); - TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount); - GetMapName(gStringVar3, show->rivalTrainer.location, 0); - if (show->rivalTrainer.badgeCount != 0) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } - break; - case 8: - TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); - TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount); - if (show->rivalTrainer.badgeCount != 0) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } - break; - case 9: - TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); - TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount); - if (show->rivalTrainer.badgeCount != 0) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } - break; - case 10: - TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); - TV_PrintIntToStringVar(1, show->rivalTrainer.dexCount); - if (show->rivalTrainer.badgeCount != 0) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } + case 0: + switch (show->rivalTrainer.location) + { + default: + sTVShowState = 7; break; - case 1: - TV_PrintIntToStringVar(0, show->rivalTrainer.badgeCount); - if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) - { - if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols) - { - sTVShowState = 4; - } - else - { - sTVShowState = 3; - } - } - else - { - sTVShowState = 6; - } + case MAPSEC_SECRET_BASE: + sTVShowState = 8; break; - case 2: - if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) - { - if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols) - { - sTVShowState = 4; - } - else - { - sTVShowState = 3; - } - } - else + case MAPSEC_DYNAMIC: + switch (show->rivalTrainer.mapLayoutId) { - sTVShowState = 6; + case LAYOUT_SS_TIDAL_CORRIDOR: + case LAYOUT_SS_TIDAL_LOWER_DECK: + case LAYOUT_SS_TIDAL_ROOMS: + sTVShowState = 10; + break; + default: + sTVShowState = 9; + break; } break; - case 3: - if (show->rivalTrainer.battlePoints == 0) - { - sTVShowState = 6; - } + } + break; + case 7: + TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); + ConvertIntToDecimalString(1, show->rivalTrainer.dexCount); + GetMapName(gStringVar3, show->rivalTrainer.location, 0); + if (show->rivalTrainer.badgeCount != 0) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 8: + TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); + ConvertIntToDecimalString(1, show->rivalTrainer.dexCount); + if (show->rivalTrainer.badgeCount != 0) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 9: + TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); + ConvertIntToDecimalString(1, show->rivalTrainer.dexCount); + if (show->rivalTrainer.badgeCount != 0) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 10: + TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); + ConvertIntToDecimalString(1, show->rivalTrainer.dexCount); + if (show->rivalTrainer.badgeCount != 0) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 1: + ConvertIntToDecimalString(0, show->rivalTrainer.badgeCount); + if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) + { + if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols) + sTVShowState = 4; else - { - sTVShowState = 5; - } - break; - case 4: - TV_PrintIntToStringVar(0, show->rivalTrainer.nGoldSymbols); - TV_PrintIntToStringVar(1, show->rivalTrainer.nSilverSymbols); - if (show->rivalTrainer.battlePoints == 0) - { - sTVShowState = 6; - } + sTVShowState = 3; + } + else + { + sTVShowState = 6; + } + break; + case 2: + if (FlagGet(FLAG_LANDMARK_BATTLE_FRONTIER)) + { + if (show->rivalTrainer.nSilverSymbols || show->rivalTrainer.nGoldSymbols) + sTVShowState = 4; else - { - sTVShowState = 5; - } - break; - case 5: - TV_PrintIntToStringVar(0, show->rivalTrainer.battlePoints); + sTVShowState = 3; + } + else + { sTVShowState = 6; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); - TVShowDone(); + } + break; + case 3: + if (show->rivalTrainer.battlePoints == 0) + sTVShowState = 6; + else + sTVShowState = 5; + break; + case 4: + ConvertIntToDecimalString(0, show->rivalTrainer.nGoldSymbols); + ConvertIntToDecimalString(1, show->rivalTrainer.nSilverSymbols); + if (show->rivalTrainer.battlePoints == 0) + sTVShowState = 6; + else + sTVShowState = 5; + break; + case 5: + ConvertIntToDecimalString(0, show->rivalTrainer.battlePoints); + sTVShowState = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->rivalTrainer.playerName, show->rivalTrainer.language); + TVShowDone(); } ShowFieldMessage(sTVTodaysRivalTrainerTextGroup[state]); } @@ -5987,48 +5638,40 @@ static void DoTVShowDewfordTrendWatcherNetwork(void) state = sTVShowState; switch (state) { - case 0: - CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); - CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); - if (show->trendWatcher.gender == MALE) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } - break; - case 1: - case 2: - CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); - CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); - TVShowConvertInternationalString(gStringVar3, show->trendWatcher.playerName, show->trendWatcher.language); - sTVShowState = 3; - break; - case 3: - CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); - CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); - if (show->trendWatcher.gender == MALE) - { - sTVShowState = 4; - } - else - { - sTVShowState = 5; - } - break; - case 4: - case 5: - CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); - CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); - TVShowConvertInternationalString(gStringVar3, show->trendWatcher.playerName, show->trendWatcher.language); - sTVShowState = 6; - break; - case 6: - CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); - CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); - TVShowDone(); + case TRENDWATCHER_STATE_INTRO: + CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); + CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); + if (show->trendWatcher.gender == MALE) + sTVShowState = TRENDWATCHER_STATE_TAUGHT_MALE; + else + sTVShowState = TRENDWATCHER_STATE_TAUGHT_FEMALE; + break; + case TRENDWATCHER_STATE_TAUGHT_MALE: + case TRENDWATCHER_STATE_TAUGHT_FEMALE: + CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); + CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); + TVShowConvertInternationalString(gStringVar3, show->trendWatcher.playerName, show->trendWatcher.language); + sTVShowState = TRENDWATCHER_STATE_PHRASE_HOPELESS; + break; + case TRENDWATCHER_STATE_PHRASE_HOPELESS: + CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); + CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); + if (show->trendWatcher.gender == MALE) + sTVShowState = TRENDWATCHER_STATE_BIGGER_MALE; + else + sTVShowState = TRENDWATCHER_STATE_BIGGER_FEMALE; + break; + case TRENDWATCHER_STATE_BIGGER_MALE: + case TRENDWATCHER_STATE_BIGGER_FEMALE: + CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); + CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); + TVShowConvertInternationalString(gStringVar3, show->trendWatcher.playerName, show->trendWatcher.language); + sTVShowState = TRENDWATCHER_STATE_OUTRO; + break; + case TRENDWATCHER_STATE_OUTRO: + CopyEasyChatWord(gStringVar1, show->trendWatcher.words[0]); + CopyEasyChatWord(gStringVar2, show->trendWatcher.words[1]); + TVShowDone(); } ShowFieldMessage(sTVDewfordTrendWatcherNetworkTextGroup[state]); } @@ -6043,38 +5686,38 @@ static void DoTVShowHoennTreasureInvestigators(void) state = sTVShowState; switch (state) { - case 0: - StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); - if (show->treasureInvestigators.location == MAPSEC_DYNAMIC) - { - switch (show->treasureInvestigators.mapLayoutId) - { - case LAYOUT_SS_TIDAL_CORRIDOR: - case LAYOUT_SS_TIDAL_LOWER_DECK: - case LAYOUT_SS_TIDAL_ROOMS: - sTVShowState = 2; - break; - default: - sTVShowState = 1; - break; - } - } - else + case 0: + StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); + if (show->treasureInvestigators.location == MAPSEC_DYNAMIC) + { + switch (show->treasureInvestigators.mapLayoutId) { + case LAYOUT_SS_TIDAL_CORRIDOR: + case LAYOUT_SS_TIDAL_LOWER_DECK: + case LAYOUT_SS_TIDAL_ROOMS: + sTVShowState = 2; + break; + default: sTVShowState = 1; + break; } - break; - case 1: - StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); - TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); - GetMapName(gStringVar3, show->treasureInvestigators.location, 0); - TVShowDone(); - break; - case 2: - StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); - TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); - TVShowDone(); - break; + } + else + { + sTVShowState = 1; + } + break; + case 1: + StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); + TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); + GetMapName(gStringVar3, show->treasureInvestigators.location, 0); + TVShowDone(); + break; + case 2: + StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); + TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); + TVShowDone(); + break; } ShowFieldMessage(sTVHoennTreasureInvestisatorsTextGroup[state]); } @@ -6089,66 +5732,62 @@ static void DoTVShowFindThatGamer(void) state = sTVShowState; switch (state) { + case 0: + TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); + switch (show->findThatGamer.whichGame) + { case 0: - TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); - switch (show->findThatGamer.whichGame) - { - case 0: - StringCopy(gStringVar2, gText_Slots); - break; - case 1: - StringCopy(gStringVar2, gText_Roulette); - break; - } - if (show->findThatGamer.won == TRUE) - { - sTVShowState = 1; - } - else - { - sTVShowState = 2; - } + StringCopy(gStringVar2, gText_Slots); break; case 1: - TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); - switch (show->findThatGamer.whichGame) - { - case 0: - StringCopy(gStringVar2, gText_Slots); - break; - case 1: - StringCopy(gStringVar2, gText_Roulette); - break; - } - TV_PrintIntToStringVar(2, show->findThatGamer.nCoins); - TVShowDone(); break; - case 2: - TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); - switch (show->findThatGamer.whichGame) - { - case 0: - StringCopy(gStringVar2, gText_Slots); - break; - case 1: - StringCopy(gStringVar2, gText_Roulette); - break; - } - TV_PrintIntToStringVar(2, show->findThatGamer.nCoins); - sTVShowState = 3; + StringCopy(gStringVar2, gText_Roulette); break; - case 3: - TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); - switch (show->findThatGamer.whichGame) - { - case 0: - StringCopy(gStringVar2, gText_Roulette); - break; - case 1: - StringCopy(gStringVar2, gText_Slots); - break; - } - TVShowDone(); + } + if (show->findThatGamer.won == TRUE) + sTVShowState = 1; + else + sTVShowState = 2; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); + switch (show->findThatGamer.whichGame) + { + case 0: + StringCopy(gStringVar2, gText_Slots); break; + case 1: + StringCopy(gStringVar2, gText_Roulette); + break; + } + ConvertIntToDecimalString(2, show->findThatGamer.nCoins); + TVShowDone(); break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); + switch (show->findThatGamer.whichGame) + { + case 0: + StringCopy(gStringVar2, gText_Slots); + break; + case 1: + StringCopy(gStringVar2, gText_Roulette); + break; + } + ConvertIntToDecimalString(2, show->findThatGamer.nCoins); + sTVShowState = 3; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->findThatGamer.playerName, show->findThatGamer.language); + switch (show->findThatGamer.whichGame) + { + case 0: + StringCopy(gStringVar2, gText_Roulette); + break; + case 1: + StringCopy(gStringVar2, gText_Slots); + break; + } + TVShowDone(); + break; } ShowFieldMessage(sTVFindThatGamerTextGroup[state]); } @@ -6163,95 +5802,87 @@ static void DoTVShowBreakingNewsTV(void) state = sTVShowState; switch (state) { - case 0: - if (show->breakingNews.outcome == 0) - { - sTVShowState = 1; - } - else - { - sTVShowState = 5; - } - break; + case 0: + if (show->breakingNews.outcome == 0) + sTVShowState = 1; + else + sTVShowState = 5; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + GetMapName(gStringVar3, show->breakingNews.location, 0); + sTVShowState = 2; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); + sTVShowState = 3; + break; + case 3: + ConvertIntToDecimalString(0, show->breakingNews.balls); + StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall)); + sTVShowState = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + GetMapName(gStringVar2, show->breakingNews.location, 0); + TVShowDone(); + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + GetMapName(gStringVar3, show->breakingNews.location, 0); + sTVShowState = 6; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); + switch (show->breakingNews.outcome) + { case 1: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - GetMapName(gStringVar3, show->breakingNews.location, 0); - sTVShowState = 2; + if (show->breakingNews.lastUsedMove == MOVE_NONE) + sTVShowState = 12; + else + sTVShowState = 7; break; case 2: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); - sTVShowState = 3; + sTVShowState = 9; break; case 3: - TV_PrintIntToStringVar(0, show->breakingNews.balls); - StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall)); - sTVShowState = 4; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - GetMapName(gStringVar2, show->breakingNews.location, 0); - TVShowDone(); - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - GetMapName(gStringVar3, show->breakingNews.location, 0); - sTVShowState = 6; - break; - case 6: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); - switch (show->breakingNews.outcome) - { - case 1: - if (show->breakingNews.lastUsedMove == MOVE_NONE) - { - sTVShowState = 12; - } - else - { - sTVShowState = 7; - } - break; - case 2: - sTVShowState = 9; - break; - case 3: - sTVShowState = 10; - break; - } - break; - case 7: - StringCopy(gStringVar1, gMoveNames[show->breakingNews.lastUsedMove]); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.poke1Species]); - sTVShowState = 8; - break; - case 12: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); - sTVShowState = 8; - break; - case 8: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - GetMapName(gStringVar2, show->breakingNews.location, 0); - sTVShowState = 11; - break; - case 9: - case 10: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); - GetMapName(gStringVar3, show->breakingNews.location, 0); - sTVShowState = 11; - break; - case 11: - TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); - TVShowDone(); + sTVShowState = 10; break; + } + break; + case 7: + StringCopy(gStringVar1, gMoveNames[show->breakingNews.lastUsedMove]); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.poke1Species]); + sTVShowState = 8; + break; + case 12: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + StringCopy(gStringVar3, gSpeciesNames[show->breakingNews.poke1Species]); + sTVShowState = 8; + break; + case 8: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + GetMapName(gStringVar2, show->breakingNews.location, 0); + sTVShowState = 11; + break; + case 9: + case 10: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + StringCopy(gStringVar2, gSpeciesNames[show->breakingNews.lastOpponentSpecies]); + GetMapName(gStringVar3, show->breakingNews.location, 0); + sTVShowState = 11; + break; + case 11: + TVShowConvertInternationalString(gStringVar1, show->breakingNews.playerName, show->breakingNews.language); + TVShowDone(); + break; } ShowFieldMessage(sTVBreakingNewsTextGroup[state]); } @@ -6266,88 +5897,72 @@ static void DoTVShowSecretBaseVisit(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); - if (show->secretBaseVisit.nDecorations == 0) - { - sTVShowState = 2; - } - else - { - sTVShowState = 1; - } - break; - case 1: - StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[0]].name); - if (show->secretBaseVisit.nDecorations == 1) - { - sTVShowState = 4; - } - else - { - sTVShowState = 3; - } + case 0: + TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); + if (show->secretBaseVisit.nDecorations == 0) + sTVShowState = 2; + else + sTVShowState = 1; + break; + case 1: + StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[0]].name); + if (show->secretBaseVisit.nDecorations == 1) + sTVShowState = 4; + else + sTVShowState = 3; + break; + case 3: + StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[1]].name); + switch (show->secretBaseVisit.nDecorations) + { + case 2: + sTVShowState = 7; break; case 3: - StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[1]].name); - switch (show->secretBaseVisit.nDecorations) - { - case 2: - sTVShowState = 7; - break; - case 3: - sTVShowState = 6; - break; - case 4: - sTVShowState = 5; - break; - } - break; - case 5: - StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name); - StringCopy(gStringVar3, gDecorations[show->secretBaseVisit.decorations[3]].name); - sTVShowState = 8; - break; - case 6: - StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name); - sTVShowState = 8; + sTVShowState = 6; break; - case 2: case 4: - case 7: - sTVShowState = 8; - break; - case 8: - TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); - if (show->secretBaseVisit.avgLevel < 25) - { - sTVShowState = 12; - } - else if (show->secretBaseVisit.avgLevel < 50) - { - sTVShowState = 11; - } - else if (show->secretBaseVisit.avgLevel < 70) - { - sTVShowState = 10; - } - else - { - sTVShowState = 9; - } - break; - case 9: - case 10: - case 11: - case 12: - TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); - StringCopy(gStringVar2, gSpeciesNames[show->secretBaseVisit.species]); - StringCopy(gStringVar3, gMoveNames[show->secretBaseVisit.move]); - sTVShowState = 13; - break; - case 13: - TVShowDone(); + sTVShowState = 5; break; + } + break; + case 5: + StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name); + StringCopy(gStringVar3, gDecorations[show->secretBaseVisit.decorations[3]].name); + sTVShowState = 8; + break; + case 6: + StringCopy(gStringVar2, gDecorations[show->secretBaseVisit.decorations[2]].name); + sTVShowState = 8; + break; + case 2: + case 4: + case 7: + sTVShowState = 8; + break; + case 8: + TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); + if (show->secretBaseVisit.avgLevel < 25) + sTVShowState = 12; + else if (show->secretBaseVisit.avgLevel < 50) + sTVShowState = 11; + else if (show->secretBaseVisit.avgLevel < 70) + sTVShowState = 10; + else + sTVShowState = 9; + break; + case 9: + case 10: + case 11: + case 12: + TVShowConvertInternationalString(gStringVar1, show->secretBaseVisit.playerName, show->secretBaseVisit.language); + StringCopy(gStringVar2, gSpeciesNames[show->secretBaseVisit.species]); + StringCopy(gStringVar3, gMoveNames[show->secretBaseVisit.move]); + sTVShowState = 13; + break; + case 13: + TVShowDone(); + break; } ShowFieldMessage(sTVSecretBaseVisitTextGroup[state]); } @@ -6392,56 +6007,56 @@ static void DoTVShowThePokemonBattleSeminar(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.species]); - StringCopy(gStringVar3, gSpeciesNames[show->battleSeminar.foeSpecies]); - sTVShowState = 1; - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language); + StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.species]); + StringCopy(gStringVar3, gSpeciesNames[show->battleSeminar.foeSpecies]); + sTVShowState = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language); + StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.foeSpecies]); + StringCopy(gStringVar3, gMoveNames[show->battleSeminar.move]); + sTVShowState = 2; + break; + case 2: + StringCopy(gStringVar1, gSpeciesNames[show->battleSeminar.species]); + switch (show->battleSeminar.nOtherMoves) + { case 1: - TVShowConvertInternationalString(gStringVar1, show->battleSeminar.playerName, show->battleSeminar.language); - StringCopy(gStringVar2, gSpeciesNames[show->battleSeminar.foeSpecies]); - StringCopy(gStringVar3, gMoveNames[show->battleSeminar.move]); - sTVShowState = 2; + sTVShowState = 5; break; case 2: - StringCopy(gStringVar1, gSpeciesNames[show->battleSeminar.species]); - switch (show->battleSeminar.nOtherMoves) - { - case 1: - sTVShowState = 5; - break; - case 2: - sTVShowState = 4; - break; - case 3: - sTVShowState = 3; - break; - default: - sTVShowState = 6; - break; - } + sTVShowState = 4; break; case 3: - StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]); - StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]); - StringCopy(gStringVar3, gMoveNames[show->battleSeminar.otherMoves[2]]); - sTVShowState = 6; - break; - case 4: - StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]); - StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]); - sTVShowState = 6; + sTVShowState = 3; break; - case 5: - StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[0]]); + default: sTVShowState = 6; break; - case 6: - StringCopy(gStringVar1, gMoveNames[show->battleSeminar.betterMove]); - StringCopy(gStringVar2, gMoveNames[show->battleSeminar.move]); - TVShowDone(); - break; + } + break; + case 3: + StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]); + StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]); + StringCopy(gStringVar3, gMoveNames[show->battleSeminar.otherMoves[2]]); + sTVShowState = 6; + break; + case 4: + StringCopy(gStringVar1, gMoveNames[show->battleSeminar.otherMoves[0]]); + StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[1]]); + sTVShowState = 6; + break; + case 5: + StringCopy(gStringVar2, gMoveNames[show->battleSeminar.otherMoves[0]]); + sTVShowState = 6; + break; + case 6: + StringCopy(gStringVar1, gMoveNames[show->battleSeminar.betterMove]); + StringCopy(gStringVar2, gMoveNames[show->battleSeminar.move]); + TVShowDone(); + break; } ShowFieldMessage(sTVThePokemonBattleSeminarTextGroup[state]); } @@ -6456,57 +6071,49 @@ static void DoTVShowTrainerFanClubSpecial(void) state = sTVShowState; switch (state) { - case 0: - TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); - CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]); - if (show->fanClubSpecial.score >= 90) - { - sTVShowState = 1; - } - else if (show->fanClubSpecial.score >= 70) - { - sTVShowState = 2; - } - else if (show->fanClubSpecial.score >= 30) - { - sTVShowState = 3; - } - else - { - sTVShowState = 4; - } - break; - case 1: - TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); - TV_PrintIntToStringVar(2, show->fanClubSpecial.score); - sTVShowState = 5; - break; - case 2: - TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); - TV_PrintIntToStringVar(2, show->fanClubSpecial.score); - sTVShowState = 5; - break; - case 3: - TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); - TV_PrintIntToStringVar(2, show->fanClubSpecial.score); - sTVShowState = 5; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); - TV_PrintIntToStringVar(2, show->fanClubSpecial.score); - sTVShowState = 5; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); - CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]); - TVShowDone(); - break; + case 0: + TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); + CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]); + if (show->fanClubSpecial.score >= 90) + sTVShowState = 1; + else if (show->fanClubSpecial.score >= 70) + sTVShowState = 2; + else if (show->fanClubSpecial.score >= 30) + sTVShowState = 3; + else + sTVShowState = 4; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); + ConvertIntToDecimalString(2, show->fanClubSpecial.score); + sTVShowState = 5; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); + ConvertIntToDecimalString(2, show->fanClubSpecial.score); + sTVShowState = 5; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); + ConvertIntToDecimalString(2, show->fanClubSpecial.score); + sTVShowState = 5; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); + ConvertIntToDecimalString(2, show->fanClubSpecial.score); + sTVShowState = 5; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->fanClubSpecial.idolName, show->fanClubSpecial.idolNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->fanClubSpecial.playerName, show->fanClubSpecial.language); + CopyEasyChatWord(gStringVar3, show->fanClubSpecial.words[0]); + TVShowDone(); + break; } ShowFieldMessage(sTVTrainerFanClubSpecialTextGroup[state]); } @@ -6522,78 +6129,79 @@ static void DoTVShowTrainerFanClub(void) state = sTVShowState; switch (state) { + case 0: + TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language); + playerId = ((show->common.trainerIdHi << 8) + show->common.trainerIdLo); + switch (playerId % 10) + { case 0: - TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language); - playerId = ((show->common.trainerIdHi << 8) + show->common.trainerIdLo); - switch (playerId % 10) - { - case 0: - sTVShowState = 1; - break; - case 1: - sTVShowState = 2; - break; - case 2: - sTVShowState = 3; - break; - case 3: - sTVShowState = 4; - break; - case 4: - sTVShowState = 5; - break; - case 5: - sTVShowState = 6; - break; - case 6: - sTVShowState = 7; - break; - case 7: - sTVShowState = 8; - break; - case 8: - sTVShowState = 9; - break; - case 9: - sTVShowState = 10; - break; - } + sTVShowState = 1; break; case 1: - sTVShowState = 11; + sTVShowState = 2; break; case 2: - sTVShowState = 11; + sTVShowState = 3; break; case 3: - sTVShowState = 11; + sTVShowState = 4; break; case 4: - sTVShowState = 11; + sTVShowState = 5; break; case 5: - sTVShowState = 11; + sTVShowState = 6; break; case 6: - sTVShowState = 11; + sTVShowState = 7; break; case 7: - sTVShowState = 11; + sTVShowState = 8; break; case 8: - sTVShowState = 11; + sTVShowState = 9; break; case 9: - sTVShowState = 11; - break; - case 10: - sTVShowState = 11; + sTVShowState = 10; break; - case 11: - TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language); - CopyEasyChatWord(gStringVar2, show->trainerFanClub.words[0]); - CopyEasyChatWord(gStringVar3, show->trainerFanClub.words[1]); - TVShowDone(); + } + break; + case 1: + sTVShowState = 11; + break; + case 2: + sTVShowState = 11; + break; + case 3: + sTVShowState = 11; + break; + case 4: + sTVShowState = 11; + break; + case 5: + sTVShowState = 11; + break; + case 6: + sTVShowState = 11; + break; + case 7: + sTVShowState = 11; + break; + case 8: + sTVShowState = 11; + break; + case 9: + sTVShowState = 11; + break; + case 10: + sTVShowState = 11; + break; + case 11: + TVShowConvertInternationalString(gStringVar1, show->trainerFanClub.playerName, show->trainerFanClub.language); + CopyEasyChatWord(gStringVar2, show->trainerFanClub.words[0]); + CopyEasyChatWord(gStringVar3, show->trainerFanClub.words[1]); + TVShowDone(); + break; } ShowFieldMessage(sTVTrainerFanClubTextGroup[state]); } @@ -6602,103 +6210,104 @@ static void DoTVShowSpotTheCuties(void) { TVShow *show; u8 state; - u32 playerId; 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: - TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language); - TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); - if (show->cuties.nRibbons < 10) - { - sTVShowState = 1; - } - else if (show->cuties.nRibbons < 20) - { - sTVShowState = 2; - } - else - { - sTVShowState = 3; - } - break; - case 1: - case 2: - case 3: - TVShowConvertInternationalString(gStringVar1, show->cuties.playerName, show->cuties.language); - TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); - TV_PrintIntToStringVar(2, show->cuties.nRibbons); - sTVShowState = 4; - break; - case 4: - 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: - TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); - sTVShowState = 15; - break; - case 15: - TVShowDone(); + 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 = SPOTCUTIES_STATE_RIBBONS_LOW; + else if (show->cuties.nRibbons < 20) + sTVShowState = SPOTCUTIES_STATE_RIBBONS_MID; + else + sTVShowState = SPOTCUTIES_STATE_RIBBONS_HIGH; + break; + 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); + ConvertIntToDecimalString(2, show->cuties.nRibbons); + sTVShowState = SPOTCUTIES_STATE_RIBBON_INTRO; + break; + case SPOTCUTIES_STATE_RIBBON_INTRO: + TVShowConvertInternationalString(gStringVar2, show->cuties.nickname, show->cuties.pokemonNameLanguage); + switch (show->cuties.selectedRibbon) + { + 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 = SPOTCUTIES_STATE_OUTRO; + break; + case SPOTCUTIES_STATE_OUTRO: + TVShowDone(); } ShowFieldMessage(sTVCutiesTextGroup[state]); } @@ -6707,147 +6316,146 @@ static void DoTVShowPokemonNewsBattleFrontier(void) { TVShow *show; u8 state; - u32 playerId; show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; gSpecialVar_Result = FALSE; state = sTVShowState; switch (state) { - case 0: - switch (show->frontier.facility) - { - case 1: - sTVShowState = 1; - break; - case 2: - sTVShowState = 2; - break; - case 3: - sTVShowState = 3; - break; - case 4: - sTVShowState = 4; - break; - case 5: - sTVShowState = 5; - break; - case 6: - sTVShowState = 6; - break; - case 7: - sTVShowState = 7; - break; - case 8: - sTVShowState = 8; - break; - case 9: - sTVShowState = 9; - break; - case 10: - sTVShowState = 10; - break; - case 11: - sTVShowState = 11; - break; - case 12: - sTVShowState = 12; - break; - case 13: - sTVShowState = 13; - break; - } - break; + case 0: + switch (show->frontier.facilityAndMode) + { case 1: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 1; break; case 2: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 16; + sTVShowState = 2; break; case 3: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 15; + sTVShowState = 3; break; case 4: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 15; + sTVShowState = 4; break; case 5: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 5; break; case 6: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 6; break; case 7: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 7; break; case 8: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 8; break; case 9: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 9; break; case 10: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 10; break; case 11: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 11; break; case 12: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; + sTVShowState = 12; break; case 13: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TV_PrintIntToStringVar(1, show->frontier.winStreak); - sTVShowState = 14; - break; - case 14: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); - StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); - StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]); - sTVShowState = 18; - break; - case 15: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); - StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); - sTVShowState = 18; - break; - case 16: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); - StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); - StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]); - sTVShowState = 17; - break; - case 17: - StringCopy(gStringVar1, gSpeciesNames[show->frontier.species4]); - sTVShowState = 18; - break; - case 18: - TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); - TVShowDone(); + sTVShowState = 13; break; + } + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 16; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 15; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 15; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 7: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 8: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 9: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 10: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 11: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 12: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 13: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + ConvertIntToDecimalString(1, show->frontier.winStreak); + sTVShowState = 14; + break; + case 14: + StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); + StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); + StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]); + sTVShowState = 18; + break; + case 15: + StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); + StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); + sTVShowState = 18; + break; + case 16: + StringCopy(gStringVar1, gSpeciesNames[show->frontier.species1]); + StringCopy(gStringVar2, gSpeciesNames[show->frontier.species2]); + StringCopy(gStringVar3, gSpeciesNames[show->frontier.species3]); + sTVShowState = 17; + break; + case 17: + StringCopy(gStringVar1, gSpeciesNames[show->frontier.species4]); + sTVShowState = 18; + break; + case 18: + TVShowConvertInternationalString(gStringVar1, show->frontier.playerName, show->frontier.language); + TVShowDone(); + break; } ShowFieldMessage(sTVPokemonNewsBattleFrontierTextGroup[state]); } @@ -6856,79 +6464,78 @@ static void DoTVShowWhatsNo1InHoennToday(void) { TVShow *show; u8 state; - u32 playerId; show = &gSaveBlock1Ptr->tvShows[gSpecialVar_0x8004]; gSpecialVar_Result = FALSE; state = sTVShowState; switch (state) { + case 0: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + switch (show->numberOne.actionIdx) + { case 0: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - switch (show->numberOne.actionIdx) - { - case 0: - sTVShowState = 1; - break; - case 1: - sTVShowState = 2; - break; - case 2: - sTVShowState = 3; - break; - case 3: - sTVShowState = 4; - break; - case 4: - sTVShowState = 5; - break; - case 5: - sTVShowState = 6; - break; - case 6: - sTVShowState = 7; - break; - } + sTVShowState = 1; break; case 1: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; + sTVShowState = 2; break; case 2: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; + sTVShowState = 3; break; case 3: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; + sTVShowState = 4; break; case 4: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; + sTVShowState = 5; break; case 5: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; + sTVShowState = 6; break; case 6: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; - break; - case 7: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TV_PrintIntToStringVar(1, show->numberOne.count); - sTVShowState = 8; - break; - case 8: - TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); - TVShowDone(); + sTVShowState = 7; break; + } + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 2: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 3: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 7: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + ConvertIntToDecimalString(1, show->numberOne.count); + sTVShowState = 8; + break; + case 8: + TVShowConvertInternationalString(gStringVar1, show->numberOne.playerName, show->numberOne.language); + TVShowDone(); + break; } ShowFieldMessage(sTVWhatsNo1InHoennTodayTextGroup[state]); } @@ -6938,7 +6545,7 @@ u8 SecretBaseSecrets_GetNumActionsTaken(TVShow *show) u8 i; u8 flagsSet; - for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i ++) + for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i++) { if ((show->secretBaseSecrets.flags >> i) & 1) flagsSet++; @@ -6951,7 +6558,7 @@ static u8 SecretBaseSecrets_GetStateByFlagNumber(TVShow *show, u8 flagId) u8 i; u8 flagsSet; - for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i ++) + for (i = 0, flagsSet = 0; i < NUM_SECRET_BASE_FLAGS; i++) { if ((show->secretBaseSecrets.flags >> i) & 1) { @@ -6976,130 +6583,112 @@ static void DoTVShowSecretBaseSecrets(void) state = sTVShowState; switch (state) { - case SBSECRETS_STATE_INTRO: - TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); - numActions = SecretBaseSecrets_GetNumActionsTaken(show); - if (numActions == 0) - { - sTVShowState = SBSECRETS_STATE_NOTHING_USED1; - } - else - { - show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT1; - sTVSecretBaseSecretsRandomValues[0] = Random() % numActions; - sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[0]); - } - break; - case SBSECRETS_STATE_DO_NEXT1: - TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); - numActions = SecretBaseSecrets_GetNumActionsTaken(show); - switch (numActions) - { - case 1: - sTVShowState = SBSECRETS_STATE_NOTHING_USED2; - break; - case 2: - show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2; - if (sTVSecretBaseSecretsRandomValues[0] == 0) - { - sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 1); - } - else - { - sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 0); - } - break; - default: - for (i = 0; i < 0xFFFF; i ++) - { - sTVSecretBaseSecretsRandomValues[1] = Random() % numActions; - if (sTVSecretBaseSecretsRandomValues[1] != sTVSecretBaseSecretsRandomValues[0]) - { - break; - } - } - show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2; - sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[1]); - break; - } + case SBSECRETS_STATE_INTRO: + TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); + numActions = SecretBaseSecrets_GetNumActionsTaken(show); + if (numActions == 0) + { + sTVShowState = SBSECRETS_STATE_NOTHING_USED1; + } + else + { + show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT1; + sTVSecretBaseSecretsRandomValues[0] = Random() % numActions; + sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[0]); + } + break; + case SBSECRETS_STATE_DO_NEXT1: + TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); + numActions = SecretBaseSecrets_GetNumActionsTaken(show); + switch (numActions) + { + case 1: + sTVShowState = SBSECRETS_STATE_NOTHING_USED2; break; - case SBSECRETS_STATE_DO_NEXT2: - TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); - numActions = SecretBaseSecrets_GetNumActionsTaken(show); - if (numActions == 2) - { - sTVShowState = SBSECRETS_STATE_NOTHING_USED2; - } + case 2: + show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2; + if (sTVSecretBaseSecretsRandomValues[0] == 0) + sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 1); else - { - for (i = 0; i < 0xFFFF; i ++) - { - sTVSecretBaseSecretsRandomValues[2] = Random() % numActions; - if (sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[0] && sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[1]) - { - break; - } - } - show->secretBaseSecrets.savedState = SBSECRETS_STATE_TOOK_X_STEPS; - sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[2]); - } + sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, 0); break; - case SBSECRETS_STATE_TOOK_X_STEPS: - TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); - TV_PrintIntToStringVar(2, show->secretBaseSecrets.stepsInBase); - if (show->secretBaseSecrets.stepsInBase <= 30) - { - sTVShowState = SBSECRETS_STATE_BASE_INTEREST_LOW; - } - else if (show->secretBaseSecrets.stepsInBase <= 100) - { - sTVShowState = SBSECRETS_STATE_BASE_INTEREST_MED; - } - else + default: + for (i = 0; i < 0xFFFF; i++) { - sTVShowState = SBSECRETS_STATE_BASE_INTEREST_HIGH; + sTVSecretBaseSecretsRandomValues[1] = Random() % numActions; + if (sTVSecretBaseSecretsRandomValues[1] != sTVSecretBaseSecretsRandomValues[0]) + break; } + show->secretBaseSecrets.savedState = SBSECRETS_STATE_DO_NEXT2; + sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[1]); break; - case SBSECRETS_STATE_BASE_INTEREST_LOW ... SBSECRETS_STATE_BASE_INTEREST_HIGH: - TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); - sTVShowState = SBSECRETS_STATE_OUTRO; - break; - case SBSECRETS_STATE_OUTRO: - TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); - TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); - TVShowDone(); - break; - // All below states are descriptions of what the player interacted with while in the secret base - case SBSECRETS_STATE_NOTHING_USED1: - sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS; - break; - case SBSECRETS_STATE_NOTHING_USED2: - sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS; - break; - case SBSECRETS_STATE_USED_CHAIR ... SBSECRETS_STATE_USED_MUD_BALL: - sTVShowState = show->secretBaseSecrets.savedState; - break; - case SBSECRETS_STATE_USED_BAG: - StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item)); - sTVShowState = show->secretBaseSecrets.savedState; - break; - case SBSECRETS_STATE_USED_CUSHION: - // Randomly decide based on trainer ID if the player hugged or hit the cushion - if (show->common.trainerIdLo & 1) - { - sTVShowState = SBSECRETS_STATE_HUGGED_CUSHION; - } - else + } + break; + case SBSECRETS_STATE_DO_NEXT2: + TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); + numActions = SecretBaseSecrets_GetNumActionsTaken(show); + if (numActions == 2) + { + sTVShowState = SBSECRETS_STATE_NOTHING_USED2; + } + else + { + for (i = 0; i < 0xFFFF; i++) { - sTVShowState = SBSECRETS_STATE_HIT_CUSHION; + sTVSecretBaseSecretsRandomValues[2] = Random() % numActions; + if (sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[0] && sTVSecretBaseSecretsRandomValues[2] != sTVSecretBaseSecretsRandomValues[1]) + break; } - break; - case SBSECRETS_STATE_HIT_CUSHION ... SBSECRETS_NUM_STATES: - sTVShowState = show->secretBaseSecrets.savedState; - break; + show->secretBaseSecrets.savedState = SBSECRETS_STATE_TOOK_X_STEPS; + sTVShowState = SecretBaseSecrets_GetStateByFlagNumber(show, sTVSecretBaseSecretsRandomValues[2]); + } + break; + case SBSECRETS_STATE_TOOK_X_STEPS: + TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); + ConvertIntToDecimalString(2, show->secretBaseSecrets.stepsInBase); + if (show->secretBaseSecrets.stepsInBase <= 30) + sTVShowState = SBSECRETS_STATE_BASE_INTEREST_LOW; + else if (show->secretBaseSecrets.stepsInBase <= 100) + sTVShowState = SBSECRETS_STATE_BASE_INTEREST_MED; + else + sTVShowState = SBSECRETS_STATE_BASE_INTEREST_HIGH; + break; + case SBSECRETS_STATE_BASE_INTEREST_LOW ... SBSECRETS_STATE_BASE_INTEREST_HIGH: + TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); + sTVShowState = SBSECRETS_STATE_OUTRO; + break; + case SBSECRETS_STATE_OUTRO: + TVShowConvertInternationalString(gStringVar1, show->secretBaseSecrets.baseOwnersName, show->secretBaseSecrets.baseOwnersNameLanguage); + TVShowConvertInternationalString(gStringVar2, show->secretBaseSecrets.playerName, show->secretBaseSecrets.language); + TVShowDone(); + break; + // All below states are descriptions of what the player interacted with while in the secret base + case SBSECRETS_STATE_NOTHING_USED1: + sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS; + break; + case SBSECRETS_STATE_NOTHING_USED2: + sTVShowState = SBSECRETS_STATE_TOOK_X_STEPS; + break; + case SBSECRETS_STATE_USED_CHAIR ... SBSECRETS_STATE_USED_MUD_BALL: + sTVShowState = show->secretBaseSecrets.savedState; + break; + case SBSECRETS_STATE_USED_BAG: + StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item)); + sTVShowState = show->secretBaseSecrets.savedState; + break; + case SBSECRETS_STATE_USED_CUSHION: + // Randomly decide based on trainer ID if the player hugged or hit the cushion + if (show->common.trainerIdLo & 1) + sTVShowState = SBSECRETS_STATE_HUGGED_CUSHION; + else + sTVShowState = SBSECRETS_STATE_HIT_CUSHION; + break; + case SBSECRETS_STATE_HIT_CUSHION ... SBSECRETS_NUM_STATES: + sTVShowState = show->secretBaseSecrets.savedState; + break; } ShowFieldMessage(sTVSecretBaseSecretsTextGroup[state]); } @@ -7114,84 +6703,68 @@ static void DoTVShowSafariFanClub(void) state = sTVShowState; switch (state) { - case 0: - if (show->safariFanClub.nMonsCaught == 0) - { - sTVShowState = 6; - } - else if (show->safariFanClub.nMonsCaught < 4) - { - sTVShowState = 5; - } - else - { - sTVShowState = 1; - } - break; - case 1: - TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); - TV_PrintIntToStringVar(1, show->safariFanClub.nMonsCaught); - if (show->safariFanClub.nPkblkUsed == 0) - { - sTVShowState = 3; - } - else - { - sTVShowState = 2; - } - break; - case 2: - TV_PrintIntToStringVar(1, show->safariFanClub.nPkblkUsed); - sTVShowState = 4; - break; - case 3: - sTVShowState = 4; - break; - case 4: - TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); - sTVShowState = 10; - break; - case 5: - TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); - TV_PrintIntToStringVar(1, show->safariFanClub.nMonsCaught); - if (show->safariFanClub.nPkblkUsed == 0) - { - sTVShowState = 8; - } - else - { - sTVShowState = 7; - } - break; - case 6: - TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); - if (show->safariFanClub.nPkblkUsed == 0) - { - sTVShowState = 8; - } - else - { - sTVShowState = 7; - } - break; - case 7: - TV_PrintIntToStringVar(1, show->safariFanClub.nPkblkUsed); - sTVShowState = 9; - break; - case 8: - sTVShowState = 9; - break; - case 9: - TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); - sTVShowState = 10; - break; - case 10: - TVShowDone(); + case 0: + if (show->safariFanClub.nMonsCaught == 0) + sTVShowState = 6; + else if (show->safariFanClub.nMonsCaught < 4) + sTVShowState = 5; + else + sTVShowState = 1; + break; + case 1: + TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); + ConvertIntToDecimalString(1, show->safariFanClub.nMonsCaught); + if (show->safariFanClub.nPkblkUsed == 0) + sTVShowState = 3; + else + sTVShowState = 2; + break; + case 2: + ConvertIntToDecimalString(1, show->safariFanClub.nPkblkUsed); + sTVShowState = 4; + break; + case 3: + sTVShowState = 4; + break; + case 4: + TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); + sTVShowState = 10; + break; + case 5: + TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); + ConvertIntToDecimalString(1, show->safariFanClub.nMonsCaught); + if (show->safariFanClub.nPkblkUsed == 0) + sTVShowState = 8; + else + sTVShowState = 7; + break; + case 6: + TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); + if (show->safariFanClub.nPkblkUsed == 0) + sTVShowState = 8; + else + sTVShowState = 7; + break; + case 7: + ConvertIntToDecimalString(1, show->safariFanClub.nPkblkUsed); + sTVShowState = 9; + break; + case 8: + sTVShowState = 9; + break; + case 9: + TVShowConvertInternationalString(gStringVar1, show->safariFanClub.playerName, show->safariFanClub.language); + sTVShowState = 10; + break; + case 10: + TVShowDone(); + break; } ShowFieldMessage(sTVSafariFanClubTextGroup[state]); } -static void DoTVShowPokemonContestLiveUpdates2(void) +// This show is a version of Contest Live Updates for the Lilycove Contest Lady +static void DoTVShowLilycoveContestLady(void) { TVShow *show; u8 state; @@ -7201,33 +6774,27 @@ static void DoTVShowPokemonContestLiveUpdates2(void) state = sTVShowState; switch (state) { - case 0: - BufferContestName(gStringVar1, show->contestLiveUpdates2.contestCategory); - if (show->contestLiveUpdates2.pokeblockState == 1) - { - sTVShowState = 1; - } - else if (show->contestLiveUpdates2.pokeblockState == 0) - { - sTVShowState = 2; - } - else - { - sTVShowState = 3; - } - break; - case 1: - case 2: - TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates2.playerName, show->contestLiveUpdates2.language); - case 3: - TVShowConvertInternationalString(gStringVar2, show->contestLiveUpdates2.nickname, show->contestLiveUpdates2.pokemonNameLanguage); - TVShowDone(); - break; + case CONTESTLADYLIVE_STATE_INTRO: + BufferContestName(gStringVar1, show->contestLady.contestCategory); + if (show->contestLady.pokeblockState == CONTEST_LADY_GOOD) + sTVShowState = CONTESTLADYLIVE_STATE_WON; + else if (show->contestLady.pokeblockState == CONTEST_LADY_NORMAL) + sTVShowState = CONTESTLADYLIVE_STATE_LOST; + else // CONTEST_LADY_BAD + sTVShowState = CONTESTLADYLIVE_STATE_LOST_BADLY; + break; + case CONTESTLADYLIVE_STATE_WON: + case CONTESTLADYLIVE_STATE_LOST: + TVShowConvertInternationalString(gStringVar3, show->contestLady.playerName, show->contestLady.language); + case CONTESTLADYLIVE_STATE_LOST_BADLY: + TVShowConvertInternationalString(gStringVar2, show->contestLady.nickname, show->contestLady.pokemonNameLanguage); + TVShowDone(); + break; } - ShowFieldMessage(sTVPokemonContestLiveUpdates2TextGroup[state]); + ShowFieldMessage(sTVLilycoveContestLadyTextGroup[state]); } -void TVShowDone(void) +static void TVShowDone(void) { gSpecialVar_Result = TRUE; sTVShowState = 0; diff --git a/src/union_room.c b/src/union_room.c index 479792a7c..bd6b303b9 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -319,8 +319,13 @@ static void StringExpandPlaceholders_AwaitingCommFromAnother(u8 *dst, u8 caseId) case ACTIVITY_CONTEST_CUTE: case ACTIVITY_CONTEST_SMART: case ACTIVITY_CONTEST_TOUGH: - // UB: argument *dst isn't used, instead it always prints to gStringVar4 + // BUG: argument *dst isn't used, instead it always prints to gStringVar4 + // not an issue in practice since Gamefreak never used any other arguments here besides gStringVar4 + #ifndef BUGFIX StringExpandPlaceholders(gStringVar4, sText_AwaitingCommunication); + #else + StringExpandPlaceholders(dst, sText_AwaitingCommunication); + #endif break; } } @@ -2986,7 +2991,7 @@ static void Task_RunUnionRoom(u8 taskId) uroom->state = UR_STATE_START_ACTIVITY_FADE; break; case UR_STATE_START_ACTIVITY_FADE: - BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); uroom->state = UR_STATE_START_ACTIVITY; break; case UR_STATE_START_ACTIVITY: @@ -3050,7 +3055,7 @@ static void Task_RunUnionRoom(u8 taskId) } break; case UR_STATE_REGISTER_SELECT_MON_FADE: - BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 0x10, RGB_BLACK); uroom->state = UR_STATE_REGISTER_SELECT_MON; break; case UR_STATE_REGISTER_SELECT_MON: @@ -3769,9 +3774,9 @@ static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str case UR_COLOR_DKE_WHT_LTE: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; - printerTemplate.fgColor = TEXT_COLOR_DARK_GREY; + printerTemplate.fgColor = TEXT_COLOR_DARK_GRAY; printerTemplate.bgColor = TEXT_COLOR_WHITE; - printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY; + printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY; break; case UR_COLOR_RED_WHT_LTR: printerTemplate.letterSpacing = 0; @@ -3792,14 +3797,14 @@ static void UR_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; printerTemplate.bgColor = TEXT_COLOR_WHITE; - printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY; + printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY; break; case UR_COLOR_WHT_DKE_LTE: printerTemplate.letterSpacing = 0; printerTemplate.lineSpacing = 0; printerTemplate.fgColor = TEXT_COLOR_WHITE; - printerTemplate.bgColor = TEXT_COLOR_DARK_GREY; - printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GREY; + printerTemplate.bgColor = TEXT_COLOR_DARK_GRAY; + printerTemplate.shadowColor = TEXT_COLOR_LIGHT_GRAY; break; case UR_COLOR_GRN_DN6_LTB: printerTemplate.letterSpacing = 0; diff --git a/src/union_room_battle.c b/src/union_room_battle.c index b9ddd74a7..2d1274f6e 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -49,7 +49,7 @@ static const struct WindowTemplate sWindowTemplates[] = { DUMMY_WIN_TEMPLATE }; -static const u8 sTextColors[] = { TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY }; +static const u8 sTextColors[] = { TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_GRAY }; static void CB2_SetUpPartiesAndStartBattle(void) { @@ -143,7 +143,7 @@ void CB2_UnionRoomBattle(void) } break; case 2: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); gMain.state++; break; @@ -169,7 +169,7 @@ void CB2_UnionRoomBattle(void) if (gBlockRecvBuffer[0][0] == (ACTIVITY_ACCEPT | IN_UNION_ROOM) && gBlockRecvBuffer[1][0] == (ACTIVITY_ACCEPT | IN_UNION_ROOM)) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gMain.state = 50; } else diff --git a/src/union_room_chat.c b/src/union_room_chat.c index 75464529f..fb875bbb4 100755 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -930,8 +930,8 @@ static void CB2_LoadInterface(void) RunDisplaySubtasks(); if (!IsDisplaySubtask0Active()) { - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); - BeginNormalPaletteFade(0xFFFFFFFF, -1, 16, 0, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_UnionRoomChatMain); gMain.state++; } @@ -1567,7 +1567,7 @@ static void Chat_SaveAndExit(void) sChat->funcState = 12; break; case 12: - BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); sChat->funcState = 13; break; case 13: @@ -2157,8 +2157,8 @@ static void FreeDisplay(void) static void InitDisplay(struct UnionRoomChatDisplay *display) { - display->yesNoMenuWindowId = 0xFF; - display->messageWindowId = 0xFF; + display->yesNoMenuWindowId = WINDOW_NONE; + display->messageWindowId = WINDOW_NONE; display->currLine = 0; } @@ -2724,7 +2724,7 @@ static void AddYesNoMenuAt(u8 left, u8 top, u8 initialCursorPos) template.paletteNum = 14; template.baseBlock = 0x52; sDisplay->yesNoMenuWindowId = AddWindow(&template); - if (sDisplay->yesNoMenuWindowId != 0xFF) + if (sDisplay->yesNoMenuWindowId != WINDOW_NONE) { FillWindowPixelBuffer(sDisplay->yesNoMenuWindowId, PIXEL_FILL(1)); PutWindowTilemap(sDisplay->yesNoMenuWindowId); @@ -2737,7 +2737,7 @@ static void AddYesNoMenuAt(u8 left, u8 top, u8 initialCursorPos) static void HideYesNoMenuWindow(void) { - if (sDisplay->yesNoMenuWindowId != 0xFF) + if (sDisplay->yesNoMenuWindowId != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(sDisplay->yesNoMenuWindowId, FALSE); ClearWindowTilemap(sDisplay->yesNoMenuWindowId); @@ -2746,10 +2746,10 @@ static void HideYesNoMenuWindow(void) static void DestroyYesNoMenuWindow(void) { - if (sDisplay->yesNoMenuWindowId != 0xFF) + if (sDisplay->yesNoMenuWindowId != WINDOW_NONE) { RemoveWindow(sDisplay->yesNoMenuWindowId); - sDisplay->yesNoMenuWindowId = 0xFF; + sDisplay->yesNoMenuWindowId = WINDOW_NONE; } } @@ -2778,7 +2778,7 @@ static void AddStdMessageWindow(int msgId, u16 bg0vofs) sDisplay->messageWindowId = AddWindow(&template); windowId = sDisplay->messageWindowId; - if (sDisplay->messageWindowId == 0xFF) + if (sDisplay->messageWindowId == WINDOW_NONE) return; if (sDisplayStdMessages[msgId].hasPlaceholders) @@ -2828,7 +2828,7 @@ static void AddStdMessageWindow(int msgId, u16 bg0vofs) static void HideStdMessageWindow(void) { - if (sDisplay->messageWindowId != 0xFF) + if (sDisplay->messageWindowId != WINDOW_NONE) { ClearStdWindowAndFrameToTransparent(sDisplay->messageWindowId, FALSE); ClearWindowTilemap(sDisplay->messageWindowId); @@ -2839,10 +2839,10 @@ static void HideStdMessageWindow(void) static void DestroyStdMessageWindow(void) { - if (sDisplay->messageWindowId != 0xFF) + if (sDisplay->messageWindowId != WINDOW_NONE) { RemoveWindow(sDisplay->messageWindowId); - sDisplay->messageWindowId = 0xFF; + sDisplay->messageWindowId = WINDOW_NONE; } } @@ -3011,8 +3011,8 @@ static void ResetGpuBgState(void) SetGpuReg(REG_OFFSET_BLDCNT, 0); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON | DISPCNT_OBJWIN_ON); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(64, 240)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 144)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(64, DISPLAY_WIDTH)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT - 16)); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); diff --git a/src/unk_text_util_2.c b/src/unk_text_util_2.c index b92b34fbd..3459dde85 100644 --- a/src/unk_text_util_2.c +++ b/src/unk_text_util_2.c @@ -5,7 +5,7 @@ #include "sound.h" ALIGNED(4) -static const u8 sUnknown_08616124[] = {1, 2, 4}; +static const u8 sScrollDistances[] = {1, 2, 4}; static const u16 sFont6BrailleGlyphs[] = INCBIN_U16("graphics/fonts/font6.fwjpnfont"); static void DecompressGlyphFont6(u16); @@ -135,7 +135,7 @@ u16 Font6Func(struct TextPrinter *textPrinter) } DecompressGlyphFont6(char_); CopyGlyphToWindow(textPrinter); - textPrinter->printerTemplate.currentX += gUnknown_03002F90.width + textPrinter->printerTemplate.letterSpacing; + textPrinter->printerTemplate.currentX += gCurGlyph.width + textPrinter->printerTemplate.letterSpacing; return 0; case 1: if (TextPrinterWait(textPrinter)) @@ -164,15 +164,15 @@ u16 Font6Func(struct TextPrinter *textPrinter) case 4: if (textPrinter->scrollDistance) { - if (textPrinter->scrollDistance < sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed]) + if (textPrinter->scrollDistance < sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed]) { ScrollWindow(textPrinter->printerTemplate.windowId, 0, textPrinter->scrollDistance, PIXEL_FILL(textPrinter->printerTemplate.bgColor)); textPrinter->scrollDistance = 0; } else { - ScrollWindow(textPrinter->printerTemplate.windowId, 0, sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor)); - textPrinter->scrollDistance -= sUnknown_08616124[gSaveBlock2Ptr->optionsTextSpeed]; + ScrollWindow(textPrinter->printerTemplate.windowId, 0, sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed], PIXEL_FILL(textPrinter->printerTemplate.bgColor)); + textPrinter->scrollDistance -= sScrollDistances[gSaveBlock2Ptr->optionsTextSpeed]; } CopyWindowToVram(textPrinter->printerTemplate.windowId, 2); } @@ -206,12 +206,12 @@ static void DecompressGlyphFont6(u16 glyph) const u16 *glyphs; glyphs = sFont6BrailleGlyphs + 0x100 * (glyph / 8) + 0x10 * (glyph % 8); - DecompressGlyphTile(glyphs, (u16 *)gUnknown_03002F90.unk0); - DecompressGlyphTile(glyphs + 0x8, (u16 *)(gUnknown_03002F90.unk20)); - DecompressGlyphTile(glyphs + 0x80, (u16 *)(gUnknown_03002F90.unk40)); - DecompressGlyphTile(glyphs + 0x88, (u16 *)(gUnknown_03002F90.unk60)); - gUnknown_03002F90.width = 0x10; - gUnknown_03002F90.height = 0x10; + DecompressGlyphTile(glyphs, gCurGlyph.gfxBufferTop); + DecompressGlyphTile(glyphs + 0x8, gCurGlyph.gfxBufferTop + 8); + DecompressGlyphTile(glyphs + 0x80, gCurGlyph.gfxBufferBottom); + DecompressGlyphTile(glyphs + 0x88, gCurGlyph.gfxBufferBottom + 8); + gCurGlyph.width = 0x10; + gCurGlyph.height = 0x10; } u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese) diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index b4ccbfe06..669b6ab25 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -486,7 +486,7 @@ static void LoadUsePokeblockMenu(void) switch (sInfo->mainState) { case 0: - sMenu->curMonSpriteId = 0xFF; + sMenu->curMonSpriteId = SPRITE_NONE; InitConditionGraphData(&sMenu->graph); sInfo->mainState++; break; @@ -569,7 +569,7 @@ static void ShowUsePokeblockMenu(void) switch (sInfo->mainState) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetVBlankCallback(VBlankCB_UsePokeblockMenu); ShowBg(0); ShowBg(1); @@ -695,7 +695,7 @@ static void FeedPokeblockToMon(void) gPokeblockMonId = GetPartyIdFromSelectionId(sMenu->info.curSelection); sExitCallback = sInfo->exitCallback; sPokeblock = sInfo->pokeblock; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sInfo->mainState++; break; case 1: @@ -708,7 +708,7 @@ static void FeedPokeblockToMon(void) FREE_AND_SET_NULL(sMenu); FreeAllWindowBuffers(); gMain.savedCallback = CB2_ReturnAndChooseMonToGivePokeblock; - CB2_PreparePokeblockFeedScene(); + PreparePokeblockFeedScene(); } break; } @@ -739,7 +739,7 @@ static void ShowUsePokeblockMenuForResults(void) case 2: break; case 3: - BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); sInfo->mainState++; break; case 4: @@ -751,7 +751,7 @@ static void ShowUsePokeblockMenuForResults(void) break; case 5: SetVBlankCallback(VBlankCB_UsePokeblockMenu); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); sInfo->mainState++; break; case 6: @@ -827,7 +827,7 @@ static void CloseUsePokeblockMenu(void) switch (sInfo->mainState) { case 0: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sInfo->mainState++; break; case 1: @@ -853,7 +853,7 @@ static void CloseUsePokeblockMenu(void) for (i = 0; i < ARRAY_COUNT(sMenu->condition); i++) DestroySprite(sMenu->condition[i]); - if (sMenu->curMonSpriteId != 0xFF) + if (sMenu->curMonSpriteId != SPRITE_NONE) DestroySprite(&gSprites[sMenu->curMonSpriteId]); SetVBlankCallback(NULL); @@ -1215,7 +1215,7 @@ static void UpdateMonPic(u8 loadId) struct SpriteSheet spriteSheet; struct SpritePalette spritePal; - if (sMenu->curMonSpriteId == 0xFF) + if (sMenu->curMonSpriteId == SPRITE_NONE) { LoadConditionMonPicTemplate(&spriteSheet, &spriteTemplate, &spritePal); spriteSheet.data = sMenu->partySheets[loadId]; @@ -1228,7 +1228,7 @@ static void UpdateMonPic(u8 loadId) { FreeSpriteTilesByTag(TAG_CONDITION_MON); FreeSpritePaletteByTag(TAG_CONDITION_MON); - sMenu->curMonSpriteId = 0xFF; + sMenu->curMonSpriteId = SPRITE_NONE; } else { @@ -1241,7 +1241,7 @@ static void UpdateMonPic(u8 loadId) } else { - Dma3CopyLarge16_(sMenu->partySheets[loadId], sMenu->curMonTileStart, 0x800); + Dma3CopyLarge16_(sMenu->partySheets[loadId], sMenu->curMonTileStart, MON_PIC_SIZE); LoadPalette(sMenu->partyPalettes[loadId], sMenu->curMonPalette, 32); } } diff --git a/src/util.c b/src/util.c index 8aa54857a..a4e3fa4cf 100644 --- a/src/util.c +++ b/src/util.c @@ -2,6 +2,7 @@ #include "util.h" #include "sprite.h" #include "palette.h" +#include "constants/rgb.h" const u32 gBitTable[] = { @@ -271,8 +272,8 @@ void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor) s8 g = data1->g; s8 b = data1->b; struct PlttData *data2 = (struct PlttData *)&blendColor; - gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0) - | ((g + (((data2->g - g) * coeff) >> 4)) << 5) - | ((b + (((data2->b - b) * coeff) >> 4)) << 10); + gPlttBufferFaded[index] = RGB(r + (((data2->r - r) * coeff) >> 4), + g + (((data2->g - g) * coeff) >> 4), + b + (((data2->b - b) * coeff) >> 4)); } } diff --git a/src/wallclock.c b/src/wallclock.c index c38dd99e3..70888ac5f 100644 --- a/src/wallclock.c +++ b/src/wallclock.c @@ -147,7 +147,7 @@ static const struct SpritePalette sSpritePalettes_Clock[] = static const struct OamData sOam_ClockHand = { - .y = 160, + .y = DISPLAY_HEIGHT, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 1, @@ -199,7 +199,7 @@ static const struct SpriteTemplate sSpriteTemplate_HourHand = static const struct OamData sOam_PeriodIndicator = { - .y = 160, + .y = DISPLAY_HEIGHT, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 3, @@ -665,7 +665,7 @@ static void LoadWallClockGraphics(void) static void WallClockInit(void) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(VBlankCB_WallClock); SetMainCallback2(CB2_WallClock); @@ -856,7 +856,7 @@ static void Task_SetClock_HandleConfirmInput(u8 taskId) static void Task_SetClock_Confirmed(u8 taskId) { RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_SetClock_Exit; } @@ -884,7 +884,7 @@ static void Task_ViewClock_HandleInput(u8 taskId) static void Task_ViewClock_FadeOut(u8 taskId) { - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_ViewClock_Exit; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 9f81a3b3e..767fbe4e7 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -108,7 +108,7 @@ static bool8 CheckFeebas(void) if (Random() % 100 > 49) // 50% chance of encountering Feebas return FALSE; - FeebasSeedRng(gSaveBlock1Ptr->easyChatPairs[0].unk2); + FeebasSeedRng(gSaveBlock1Ptr->dewfordTrends[0].rand); for (i = 0; i != NUM_FEEBAS_SPOTS;) { feebasSpots[i] = FeebasRandom() % 447; diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 87b200f14..dbc71d634 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -174,8 +174,8 @@ static void CB2_InitWirelessCommunicationScreen(void) SetVBlankCallback(NULL); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); - SetBgTilemapBuffer(1, Alloc(0x800)); - SetBgTilemapBuffer(0, Alloc(0x800)); + SetBgTilemapBuffer(1, Alloc(BG_SCREEN_SIZE)); + SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); DecompressAndLoadBgGfxUsingHeap(1, sBgTiles_Gfx, 0, 0, 0); CopyToBgTilemapBuffer(1, sBgTiles_Tilemap, 0, 0); InitWindows(sWindowTemplates); @@ -260,7 +260,7 @@ static void Task_WirelessCommunicationScreen(u8 taskId) gTasks[taskId].tState++; break; case 1: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, 0); ShowBg(1); CopyBgTilemapBufferToVram(0); ShowBg(0); @@ -296,7 +296,7 @@ static void Task_WirelessCommunicationScreen(u8 taskId) WCSS_CyclePalette(&gTasks[taskId].data[7], &gTasks[taskId].data[8]); break; case 4: - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); gTasks[taskId].tState++; break; case 5: @@ -319,13 +319,13 @@ static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * { case COLORMODE_NORMAL: color[0] = TEXT_COLOR_TRANSPARENT; - color[1] = TEXT_COLOR_DARK_GREY; - color[2] = TEXT_COLOR_LIGHT_GREY; + color[1] = TEXT_COLOR_DARK_GRAY; + color[2] = TEXT_COLOR_LIGHT_GRAY; break; case COLORMODE_WHITE_LGRAY: color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_COLOR_WHITE; - color[2] = TEXT_COLOR_LIGHT_GREY; + color[2] = TEXT_COLOR_LIGHT_GRAY; break; case COLORMODE_RED: color[0] = TEXT_COLOR_TRANSPARENT; @@ -340,7 +340,7 @@ static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * case COLORMODE_WHITE_DGRAY: color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_COLOR_WHITE; - color[2] = TEXT_COLOR_DARK_GREY; + color[2] = TEXT_COLOR_DARK_GRAY; break; } |