diff options
Diffstat (limited to 'src')
155 files changed, 86652 insertions, 10809 deletions
diff --git a/src/bard_music.c b/src/bard_music.c index 6fb1496e5..6c2578071 100644 --- a/src/bard_music.c +++ b/src/bard_music.c @@ -2,6 +2,7 @@ // Includes #include "global.h" #include "bard_music.h" +#include "constants/easy_chat.h" #include "easy_chat.h" #include "data/bard_music/bard_sounds.h" diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index e1a9168a9..74247f8a2 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -3,6 +3,7 @@ #include "pokemon.h" #include "battle.h" #include "battle_setup.h" +#include "recorded_battle.h" #include "constants/species.h" #include "constants/abilities.h" #include "random.h" @@ -41,13 +42,12 @@ in order to read the next command correctly. refer to battle_ai_scripts.s for th AI scripts. */ -extern const u8 * const gBattleAI_ScriptsTable[]; +extern const u8 *const gBattleAI_ScriptsTable[]; -extern u32 GetAiScriptsInRecordedBattle(); extern u32 GetAiScriptsInBattleFactory(); -static u8 BattleAI_ChooseMoveOrAction_Singles(void); -static u8 BattleAI_ChooseMoveOrAction_Doubles(void); +static u8 ChooseMoveOrAction_Singles(void); +static u8 ChooseMoveOrAction_Doubles(void); static void RecordLastUsedMoveByTarget(void); static void BattleAI_DoAIProcessing(void); static void AIStackPushVar(const u8 *); @@ -90,7 +90,7 @@ static void BattleAICmd_get_turn_count(void); static void BattleAICmd_get_type(void); static void BattleAICmd_get_considered_move_power(void); static void BattleAICmd_get_how_powerful_move_is(void); -static void BattleAICmd_get_last_used_bank_move(void); +static void BattleAICmd_get_last_used_battler_move(void); static void BattleAICmd_if_equal_(void); static void BattleAICmd_if_not_equal_(void); static void BattleAICmd_if_user_goes(void); @@ -154,115 +154,113 @@ static void BattleAICmd_if_flash_fired(void); static void BattleAICmd_if_holds_item(void); // ewram - EWRAM_DATA const u8 *gAIScriptPtr = NULL; EWRAM_DATA static u8 sBattler_AI = 0; // const rom data - typedef void (*BattleAICmdFunc)(void); static const BattleAICmdFunc sBattleAICmdTable[] = { - BattleAICmd_if_random_less_than, // 0x0 - BattleAICmd_if_random_greater_than, // 0x1 - BattleAICmd_if_random_equal, // 0x2 - BattleAICmd_if_random_not_equal, // 0x3 - BattleAICmd_score, // 0x4 - BattleAICmd_if_hp_less_than, // 0x5 - BattleAICmd_if_hp_more_than, // 0x6 - BattleAICmd_if_hp_equal, // 0x7 - BattleAICmd_if_hp_not_equal, // 0x8 - BattleAICmd_if_status, // 0x9 - BattleAICmd_if_not_status, // 0xA - BattleAICmd_if_status2, // 0xB - BattleAICmd_if_not_status2, // 0xC - BattleAICmd_if_status3, // 0xD - BattleAICmd_if_not_status3, // 0xE - BattleAICmd_if_side_affecting, // 0xF - BattleAICmd_if_not_side_affecting, // 0x10 - BattleAICmd_if_less_than, // 0x11 - BattleAICmd_if_more_than, // 0x12 - BattleAICmd_if_equal, // 0x13 - BattleAICmd_if_not_equal, // 0x14 - BattleAICmd_if_less_than_ptr, // 0x15 - BattleAICmd_if_more_than_ptr, // 0x16 - BattleAICmd_if_equal_ptr, // 0x17 - BattleAICmd_if_not_equal_ptr, // 0x18 - BattleAICmd_if_move, // 0x19 - BattleAICmd_if_not_move, // 0x1A - BattleAICmd_if_in_bytes, // 0x1B - BattleAICmd_if_not_in_bytes, // 0x1C - BattleAICmd_if_in_hwords, // 0x1D - BattleAICmd_if_not_in_hwords, // 0x1E - BattleAICmd_if_user_has_attacking_move, // 0x1F - BattleAICmd_if_user_has_no_attacking_moves, // 0x20 - BattleAICmd_get_turn_count, // 0x21 - BattleAICmd_get_type, // 0x22 - BattleAICmd_get_considered_move_power, // 0x23 - BattleAICmd_get_how_powerful_move_is, // 0x24 - BattleAICmd_get_last_used_bank_move, // 0x25 - BattleAICmd_if_equal_, // 0x26 - BattleAICmd_if_not_equal_, // 0x27 - BattleAICmd_if_user_goes, // 0x28 - BattleAICmd_if_user_doesnt_go, // 0x29 - BattleAICmd_nullsub_2A, // 0x2A - BattleAICmd_nullsub_2B, // 0x2B - BattleAICmd_count_usable_party_mons, // 0x2C - BattleAICmd_get_considered_move, // 0x2D - BattleAICmd_get_considered_move_effect, // 0x2E - BattleAICmd_get_ability, // 0x2F - BattleAICmd_get_highest_type_effectiveness, // 0x30 - BattleAICmd_if_type_effectiveness, // 0x31 - BattleAICmd_nullsub_32, // 0x32 - BattleAICmd_nullsub_33, // 0x33 - BattleAICmd_if_status_in_party, // 0x34 - BattleAICmd_if_status_not_in_party, // 0x35 - BattleAICmd_get_weather, // 0x36 - BattleAICmd_if_effect, // 0x37 - BattleAICmd_if_not_effect, // 0x38 - BattleAICmd_if_stat_level_less_than, // 0x39 - BattleAICmd_if_stat_level_more_than, // 0x3A - BattleAICmd_if_stat_level_equal, // 0x3B - BattleAICmd_if_stat_level_not_equal, // 0x3C - BattleAICmd_if_can_faint, // 0x3D - BattleAICmd_if_cant_faint, // 0x3E - BattleAICmd_if_has_move, // 0x3F - BattleAICmd_if_doesnt_have_move, // 0x40 - BattleAICmd_if_has_move_with_effect, // 0x41 - BattleAICmd_if_doesnt_have_move_with_effect, // 0x42 + BattleAICmd_if_random_less_than, // 0x0 + BattleAICmd_if_random_greater_than, // 0x1 + BattleAICmd_if_random_equal, // 0x2 + BattleAICmd_if_random_not_equal, // 0x3 + BattleAICmd_score, // 0x4 + BattleAICmd_if_hp_less_than, // 0x5 + BattleAICmd_if_hp_more_than, // 0x6 + BattleAICmd_if_hp_equal, // 0x7 + BattleAICmd_if_hp_not_equal, // 0x8 + BattleAICmd_if_status, // 0x9 + BattleAICmd_if_not_status, // 0xA + BattleAICmd_if_status2, // 0xB + BattleAICmd_if_not_status2, // 0xC + BattleAICmd_if_status3, // 0xD + BattleAICmd_if_not_status3, // 0xE + BattleAICmd_if_side_affecting, // 0xF + BattleAICmd_if_not_side_affecting, // 0x10 + BattleAICmd_if_less_than, // 0x11 + BattleAICmd_if_more_than, // 0x12 + BattleAICmd_if_equal, // 0x13 + BattleAICmd_if_not_equal, // 0x14 + BattleAICmd_if_less_than_ptr, // 0x15 + BattleAICmd_if_more_than_ptr, // 0x16 + BattleAICmd_if_equal_ptr, // 0x17 + BattleAICmd_if_not_equal_ptr, // 0x18 + BattleAICmd_if_move, // 0x19 + BattleAICmd_if_not_move, // 0x1A + BattleAICmd_if_in_bytes, // 0x1B + BattleAICmd_if_not_in_bytes, // 0x1C + BattleAICmd_if_in_hwords, // 0x1D + BattleAICmd_if_not_in_hwords, // 0x1E + BattleAICmd_if_user_has_attacking_move, // 0x1F + BattleAICmd_if_user_has_no_attacking_moves, // 0x20 + BattleAICmd_get_turn_count, // 0x21 + BattleAICmd_get_type, // 0x22 + BattleAICmd_get_considered_move_power, // 0x23 + BattleAICmd_get_how_powerful_move_is, // 0x24 + BattleAICmd_get_last_used_battler_move, // 0x25 + BattleAICmd_if_equal_, // 0x26 + BattleAICmd_if_not_equal_, // 0x27 + BattleAICmd_if_user_goes, // 0x28 + BattleAICmd_if_user_doesnt_go, // 0x29 + BattleAICmd_nullsub_2A, // 0x2A + BattleAICmd_nullsub_2B, // 0x2B + BattleAICmd_count_usable_party_mons, // 0x2C + BattleAICmd_get_considered_move, // 0x2D + BattleAICmd_get_considered_move_effect, // 0x2E + BattleAICmd_get_ability, // 0x2F + BattleAICmd_get_highest_type_effectiveness, // 0x30 + BattleAICmd_if_type_effectiveness, // 0x31 + BattleAICmd_nullsub_32, // 0x32 + BattleAICmd_nullsub_33, // 0x33 + BattleAICmd_if_status_in_party, // 0x34 + BattleAICmd_if_status_not_in_party, // 0x35 + BattleAICmd_get_weather, // 0x36 + BattleAICmd_if_effect, // 0x37 + BattleAICmd_if_not_effect, // 0x38 + BattleAICmd_if_stat_level_less_than, // 0x39 + BattleAICmd_if_stat_level_more_than, // 0x3A + BattleAICmd_if_stat_level_equal, // 0x3B + BattleAICmd_if_stat_level_not_equal, // 0x3C + BattleAICmd_if_can_faint, // 0x3D + BattleAICmd_if_cant_faint, // 0x3E + BattleAICmd_if_has_move, // 0x3F + BattleAICmd_if_doesnt_have_move, // 0x40 + BattleAICmd_if_has_move_with_effect, // 0x41 + BattleAICmd_if_doesnt_have_move_with_effect, // 0x42 BattleAICmd_if_any_move_disabled_or_encored, // 0x43 BattleAICmd_if_curr_move_disabled_or_encored, // 0x44 - BattleAICmd_flee, // 0x45 - BattleAICmd_if_random_safari_flee, // 0x46 - BattleAICmd_watch, // 0x47 - BattleAICmd_get_hold_effect, // 0x48 - BattleAICmd_get_gender, // 0x49 - BattleAICmd_is_first_turn_for, // 0x4A - BattleAICmd_get_stockpile_count, // 0x4B - BattleAICmd_is_double_battle, // 0x4C - BattleAICmd_get_used_held_item, // 0x4D - BattleAICmd_get_move_type_from_result, // 0x4E - BattleAICmd_get_move_power_from_result, // 0x4F - BattleAICmd_get_move_effect_from_result, // 0x50 - BattleAICmd_get_protect_count, // 0x51 - BattleAICmd_nullsub_52, // 0x52 - BattleAICmd_nullsub_53, // 0x53 - BattleAICmd_nullsub_54, // 0x54 - BattleAICmd_nullsub_55, // 0x55 - BattleAICmd_nullsub_56, // 0x56 - BattleAICmd_nullsub_57, // 0x57 - BattleAICmd_call, // 0x58 - BattleAICmd_goto, // 0x59 - BattleAICmd_end, // 0x5A - BattleAICmd_if_level_cond, // 0x5B - BattleAICmd_if_target_taunted, // 0x5C - BattleAICmd_if_target_not_taunted, // 0x5D - BattleAICmd_if_target_is_ally, // 0x5E - BattleAICmd_is_of_type, // 0x5F - BattleAICmd_check_ability, // 0x60 - BattleAICmd_if_flash_fired, // 0x61 - BattleAICmd_if_holds_item, // 0x62 + BattleAICmd_flee, // 0x45 + BattleAICmd_if_random_safari_flee, // 0x46 + BattleAICmd_watch, // 0x47 + BattleAICmd_get_hold_effect, // 0x48 + BattleAICmd_get_gender, // 0x49 + BattleAICmd_is_first_turn_for, // 0x4A + BattleAICmd_get_stockpile_count, // 0x4B + BattleAICmd_is_double_battle, // 0x4C + BattleAICmd_get_used_held_item, // 0x4D + BattleAICmd_get_move_type_from_result, // 0x4E + BattleAICmd_get_move_power_from_result, // 0x4F + BattleAICmd_get_move_effect_from_result, // 0x50 + BattleAICmd_get_protect_count, // 0x51 + BattleAICmd_nullsub_52, // 0x52 + BattleAICmd_nullsub_53, // 0x53 + BattleAICmd_nullsub_54, // 0x54 + BattleAICmd_nullsub_55, // 0x55 + BattleAICmd_nullsub_56, // 0x56 + BattleAICmd_nullsub_57, // 0x57 + BattleAICmd_call, // 0x58 + BattleAICmd_goto, // 0x59 + BattleAICmd_end, // 0x5A + BattleAICmd_if_level_cond, // 0x5B + BattleAICmd_if_target_taunted, // 0x5C + BattleAICmd_if_target_not_taunted, // 0x5D + BattleAICmd_if_target_is_ally, // 0x5E + BattleAICmd_is_of_type, // 0x5F + BattleAICmd_check_ability, // 0x60 + BattleAICmd_if_flash_fired, // 0x61 + BattleAICmd_if_holds_item, // 0x62 }; static const u16 sDiscouragedPowerfulMoveEffects[] = @@ -282,26 +280,29 @@ static const u16 sDiscouragedPowerfulMoveEffects[] = 0xFFFF }; +// code void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves) { s32 i; - u8 *data = (u8 *)gBattleResources->battleHistory; + u8 *data = (u8 *)BATTLE_HISTORY; for (i = 0; i < sizeof(struct BattleHistory); i++) data[i] = 0; - // items are allowed to use in ONLY trainer battles - if ((gBattleTypeFlags & - (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | - BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER | BATTLE_TYPE_FRONTIER - | BATTLE_TYPE_INGAME_PARTNER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_SECRET_BASE)) - == BATTLE_TYPE_TRAINER) + + // Items are allowed to use in ONLY trainer battles. + 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) + ) + ) { for (i = 0; i < 4; i++) { if (gTrainers[gTrainerBattleOpponent_A].items[i] != 0) { - gBattleResources->battleHistory->trainerItems[gBattleResources->battleHistory->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i]; - gBattleResources->battleHistory->itemsNo++; + BATTLE_HISTORY->trainerItems[BATTLE_HISTORY->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i]; + BATTLE_HISTORY->itemsNo++; } } } @@ -315,23 +316,24 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) u8 *data = (u8 *)AI_THINKING_STRUCT; u8 moveLimitations; - // clear AI data. + // Clear AI data. for (i = 0; i < sizeof(struct AI_ThinkingStruct); i++) data[i] = 0; - // conditional score reset, unlike Ruby. + // Conditional score reset, unlike Ruby. for (i = 0; i < 4; i++) { if (defaultScoreMoves & 1) AI_THINKING_STRUCT->score[i] = 100; else AI_THINKING_STRUCT->score[i] = 0; + defaultScoreMoves >>= 1; } moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF); - // ignore moves that aren't possible to use + // Ignore moves that aren't possible to use. for (i = 0; i < 4; i++) { if (gBitTable[i] & moveLimitations) @@ -339,21 +341,24 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16); } + gBattleResources->AI_ScriptsStack->size = 0; sBattler_AI = gActiveBattler; - // decide a random target battlerId in doubles + + // Decide a random target battlerId in doubles. if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE); if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget ^= BIT_FLANK; } - // in singles there's only one choice + // There's only one choice in single battles. else { gBattlerTarget = sBattler_AI ^ BIT_SIDE; } + // Choose proper trainer ai scripts. if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) AI_THINKING_STRUCT->aiFlags = GetAiScriptsInRecordedBattle(); else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) @@ -370,6 +375,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags | gTrainers[gTrainerBattleOpponent_B].aiFlags; else AI_THINKING_STRUCT->aiFlags = gTrainers[gTrainerBattleOpponent_A].aiFlags; + if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) AI_THINKING_STRUCT->aiFlags |= AI_SCRIPT_DOUBLE_BATTLE; // act smart in doubles and don't attack your partner } @@ -380,15 +386,15 @@ u8 BattleAI_ChooseMoveOrAction(void) u8 ret; if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) - ret = BattleAI_ChooseMoveOrAction_Singles(); + ret = ChooseMoveOrAction_Singles(); else - ret = BattleAI_ChooseMoveOrAction_Doubles(); + ret = ChooseMoveOrAction_Doubles(); gCurrentMove = savedCurrentMove; return ret; } -static u8 BattleAI_ChooseMoveOrAction_Singles(void) +static u8 ChooseMoveOrAction_Singles(void) { u8 currentMoveArray[4]; u8 consideredMoveArray[4]; @@ -409,11 +415,11 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void) AI_THINKING_STRUCT->movesetIndex = 0; } - // special flags for safari + // Check special AI actions. if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) - return 4; + return AI_CHOICE_FLEE; if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) - return 5; + return AI_CHOICE_WATCH; numOfBestMoves = 1; currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; @@ -421,9 +427,9 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void) for (i = 1; i < 4; i++) { - if (gBattleMons[sBattler_AI].moves[i] != 0) // emerald adds an extra move ID check for some reason. + if (gBattleMons[sBattler_AI].moves[i] != MOVE_NONE) { - // in ruby, the order of these if statements are reversed. + // In ruby, the order of these if statements is reversed. if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i]) { currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i]; @@ -440,7 +446,7 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void) return consideredMoveArray[Random() % numOfBestMoves]; } -static u8 BattleAI_ChooseMoveOrAction_Doubles(void) +static u8 ChooseMoveOrAction_Doubles(void) { s32 i; s32 j; @@ -487,10 +493,15 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void) AI_THINKING_STRUCT->aiLogicId++; AI_THINKING_STRUCT->movesetIndex = 0; } + if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) - actionOrMoveIndex[i] = 4; + { + actionOrMoveIndex[i] = AI_CHOICE_FLEE; + } else if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) - actionOrMoveIndex[i] = 5; + { + actionOrMoveIndex[i] = AI_CHOICE_WATCH; + } else { mostViableMovesScores[0] = AI_THINKING_STRUCT->score[0]; @@ -513,18 +524,16 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void) mostViableMovesNo = 1; } } - //_08130E72 } actionOrMoveIndex[i] = mostViableMovesIndices[Random() % mostViableMovesNo]; bestMovePointsForTarget[i] = mostViableMovesScores[0]; - // don't use a move against ally if it has less than 100 pts + // Don't use a move against ally if it has less than 100 points. if (i == (sBattler_AI ^ BIT_FLANK) && bestMovePointsForTarget[i] < 100) { bestMovePointsForTarget[i] = -1; - mostViableMovesScores[0] = mostViableMovesScores[0]; // needed to match + mostViableMovesScores[0] = mostViableMovesScores[0]; // Needed to match. } - } } } @@ -535,13 +544,11 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void) for (i = 1; i < 4; i++) { - //_08130EDA if (mostMovePoints == bestMovePointsForTarget[i]) { mostViableTargetsArray[mostViableTargetsNo] = i; mostViableTargetsNo++; } - //_08130EEE if (mostMovePoints < bestMovePointsForTarget[i]) { mostMovePoints = bestMovePointsForTarget[i]; @@ -576,7 +583,9 @@ static void BattleAI_DoAIProcessing(void) break; case AIState_Processing: if (AI_THINKING_STRUCT->moveConsidered != 0) + { sBattleAICmdTable[*gAIScriptPtr](); // Run AI command. + } else { AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; @@ -604,12 +613,12 @@ static void RecordLastUsedMoveByTarget(void) for (i = 0; i < 4; i++) { - if (gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget]) break; - if (gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] != gLastMoves[gBattlerTarget] // HACK: This redundant condition is a hack to make the asm match. - && gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] == 0) + if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] != gLastMoves[gBattlerTarget] // HACK: This redundant condition is a hack to make the asm match. + && BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == MOVE_NONE) { - gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] = gLastMoves[gBattlerTarget]; + BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] = gLastMoves[gBattlerTarget]; break; } } @@ -620,27 +629,27 @@ void ClearBattlerMoveHistory(u8 battlerId) s32 i; for (i = 0; i < 4; i++) - gBattleResources->battleHistory->usedMoves[battlerId].moves[i] = 0; + BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE; } void RecordAbilityBattle(u8 battlerId, u8 abilityId) { - gBattleResources->battleHistory->abilities[battlerId] = abilityId; + BATTLE_HISTORY->abilities[battlerId] = abilityId; } void ClearBattlerAbilityHistory(u8 battlerId) { - gBattleResources->battleHistory->abilities[battlerId] = 0; + BATTLE_HISTORY->abilities[battlerId] = ABILITY_NONE; } void RecordItemEffectBattle(u8 battlerId, u8 itemEffect) { - gBattleResources->battleHistory->itemEffects[battlerId] = itemEffect; + BATTLE_HISTORY->itemEffects[battlerId] = itemEffect; } -void ClearBankItemEffectHistory(u8 battlerId) +void ClearBattlerItemEffectHistory(u8 battlerId) { - gBattleResources->battleHistory->itemEffects[battlerId] = 0; + BATTLE_HISTORY->itemEffects[battlerId] = 0; } static void BattleAICmd_if_random_less_than(void) @@ -685,9 +694,9 @@ static void BattleAICmd_if_random_not_equal(void) static void BattleAICmd_score(void) { - AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += gAIScriptPtr[1]; // add the result to the array of the move consider's score. + AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] += gAIScriptPtr[1]; // Add the result to the array of the move consider's score. - if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // if the score is negative, flatten it to 0. + if (AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] < 0) // If the score is negative, flatten it to 0. AI_THINKING_STRUCT->score[AI_THINKING_STRUCT->movesetIndex] = 0; gAIScriptPtr += 2; // AI return. @@ -765,7 +774,7 @@ static void BattleAICmd_if_status(void) status = T1_READ_32(gAIScriptPtr + 2); - if ((gBattleMons[battlerId].status1 & status) != 0) + if (gBattleMons[battlerId].status1 & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -783,7 +792,7 @@ static void BattleAICmd_if_not_status(void) status = T1_READ_32(gAIScriptPtr + 2); - if ((gBattleMons[battlerId].status1 & status) == 0) + if (!(gBattleMons[battlerId].status1 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -801,7 +810,7 @@ static void BattleAICmd_if_status2(void) status = T1_READ_32(gAIScriptPtr + 2); - if ((gBattleMons[battlerId].status2 & status) != 0) + if ((gBattleMons[battlerId].status2 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -819,7 +828,7 @@ static void BattleAICmd_if_not_status2(void) status = T1_READ_32(gAIScriptPtr + 2); - if ((gBattleMons[battlerId].status2 & status) == 0) + if (!(gBattleMons[battlerId].status2 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -837,7 +846,7 @@ static void BattleAICmd_if_status3(void) status = T1_READ_32(gAIScriptPtr + 2); - if ((gStatuses3[battlerId] & status) != 0) + if (gStatuses3[battlerId] & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -855,7 +864,7 @@ static void BattleAICmd_if_not_status3(void) status = T1_READ_32(gAIScriptPtr + 2); - if ((gStatuses3[battlerId] & status) == 0) + if (!(gStatuses3[battlerId] & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -874,7 +883,7 @@ static void BattleAICmd_if_side_affecting(void) side = GET_BATTLER_SIDE(battlerId); status = T1_READ_32(gAIScriptPtr + 2); - if ((gSideStatuses[side] & status) != 0) + if (gSideStatuses[side] & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -893,7 +902,7 @@ static void BattleAICmd_if_not_side_affecting(void) side = GET_BATTLER_SIDE(battlerId); status = T1_READ_32(gAIScriptPtr + 2); - if ((gSideStatuses[side] & status) == 0) + if (!(gSideStatuses[side] & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -1041,7 +1050,7 @@ static void BattleAICmd_if_in_hwords(void) static void BattleAICmd_if_not_in_hwords(void) { - const u16 *ptr = (u16 *)T1_READ_PTR(gAIScriptPtr + 1); + const u16 *ptr = (const u16 *)T1_READ_PTR(gAIScriptPtr + 1); while (*ptr != 0xFFFF) { @@ -1065,6 +1074,7 @@ static void BattleAICmd_if_user_has_attacking_move(void) && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0) break; } + if (i == 4) gAIScriptPtr += 5; else @@ -1081,6 +1091,7 @@ static void BattleAICmd_if_user_has_no_attacking_moves(void) && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0) break; } + if (i != 4) gAIScriptPtr += 5; else @@ -1118,34 +1129,30 @@ static void BattleAICmd_get_type(void) gAIScriptPtr += 2; } -static u8 BattleAI_GetWantedBank(u8 battlerId) +static u8 BattleAI_GetWantedBattler(u8 wantedBattler) { - switch (battlerId) + switch (wantedBattler) { - case AI_USER: - return sBattler_AI; - case AI_TARGET: - default: - return gBattlerTarget; - case AI_USER_PARTNER: - return sBattler_AI ^ BIT_FLANK; - case AI_TARGET_PARTNER: - return gBattlerTarget ^ BIT_FLANK; + case AI_USER: + return sBattler_AI; + case AI_TARGET: + default: + return gBattlerTarget; + case AI_USER_PARTNER: + return sBattler_AI ^ BIT_FLANK; + case AI_TARGET_PARTNER: + return gBattlerTarget ^ BIT_FLANK; } } static void BattleAICmd_is_of_type(void) { - u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]); + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - if(gBattleMons[battlerId].type1 == gAIScriptPtr[2] || gBattleMons[battlerId].type2 == gAIScriptPtr[2]) - { + if (IS_BATTLER_OF_TYPE(battlerId, gAIScriptPtr[2])) AI_THINKING_STRUCT->funcResult = TRUE; - } else - { AI_THINKING_STRUCT->funcResult = FALSE; - } gAIScriptPtr += 3; } @@ -1208,19 +1215,19 @@ static void BattleAICmd_get_how_powerful_move_is(void) } if (checkedMove == 4) - AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // is the most powerful + AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful. else - AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // not most powerful + AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful. } else { - AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // highly discouraged in terms of power + AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power. } gAIScriptPtr++; } -static void BattleAICmd_get_last_used_bank_move(void) +static void BattleAICmd_get_last_used_battler_move(void) { if (gAIScriptPtr[1] == AI_USER) AI_THINKING_STRUCT->funcResult = gLastMoves[sBattler_AI]; @@ -1230,7 +1237,7 @@ static void BattleAICmd_get_last_used_bank_move(void) gAIScriptPtr += 2; } -static void BattleAICmd_if_equal_(void) // same as if_equal +static void BattleAICmd_if_equal_(void) // Same as if_equal. { if (gAIScriptPtr[1] == AI_THINKING_STRUCT->funcResult) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); @@ -1238,7 +1245,7 @@ static void BattleAICmd_if_equal_(void) // same as if_equal gAIScriptPtr += 6; } -static void BattleAICmd_if_not_equal_(void) // same as if_not_equal +static void BattleAICmd_if_not_equal_(void) // Same as if_not_equal. { if (gAIScriptPtr[1] != AI_THINKING_STRUCT->funcResult) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); @@ -1273,9 +1280,9 @@ static void BattleAICmd_nullsub_2B(void) static void BattleAICmd_count_usable_party_mons(void) { u8 battlerId; - u8 bankOnField1, bankOnField2; + u8 battlerOnField1, battlerOnField2; struct Pokemon *party; - int i; + s32 i; AI_THINKING_STRUCT->funcResult = 0; @@ -1292,19 +1299,19 @@ static void BattleAICmd_count_usable_party_mons(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { u32 position; - bankOnField1 = gBattlerPartyIndexes[battlerId]; + battlerOnField1 = gBattlerPartyIndexes[battlerId]; position = GetBattlerPosition(battlerId) ^ BIT_FLANK; - bankOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; + battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; } - else // in singles there's only one battlerId by side + else // In singles there's only one battlerId by side. { - bankOnField1 = gBattlerPartyIndexes[battlerId]; - bankOnField2 = gBattlerPartyIndexes[battlerId]; + battlerOnField1 = gBattlerPartyIndexes[battlerId]; + battlerOnField2 = gBattlerPartyIndexes[battlerId]; } for (i = 0; i < PARTY_SIZE; i++) { - if (i != bankOnField1 && i != bankOnField2 + if (i != battlerOnField1 && i != battlerOnField2 && GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) @@ -1362,22 +1369,18 @@ static void BattleAICmd_get_ability(void) { // AI has no knowledge of opponent, so it guesses which ability. if (Random() & 1) - { AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1; - } else - { AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2; - } } else { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1; // it's definitely ability 1. + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1; // It's definitely ability 1. } } else { - AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. + AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. } } else @@ -1385,22 +1388,23 @@ static void BattleAICmd_get_ability(void) // The AI knows its own ability. AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; } + gAIScriptPtr += 2; } static void BattleAICmd_check_ability(void) { - u32 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]); + u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u32 ability = gAIScriptPtr[2]; if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER) { - if (BATTLE_HISTORY->abilities[battlerId] != 0) + if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE) { ability = BATTLE_HISTORY->abilities[battlerId]; AI_THINKING_STRUCT->funcResult = ability; } - // abilities that prevent fleeing. + // Abilities that prevent fleeing. else if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) @@ -1411,14 +1415,16 @@ static void BattleAICmd_check_ability(void) { if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE) { - u8 abilityDummyVariable = ability; // needed to match + u8 abilityDummyVariable = ability; // Needed to match. if (gBaseStats[gBattleMons[battlerId].species].ability1 != abilityDummyVariable && gBaseStats[gBattleMons[battlerId].species].ability2 != abilityDummyVariable) { ability = gBaseStats[gBattleMons[battlerId].species].ability1; } else - ability = 0; + { + ability = ABILITY_NONE; + } } else { @@ -1427,7 +1433,7 @@ static void BattleAICmd_check_ability(void) } else { - ability = gBaseStats[gBattleMons[battlerId].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability. + ability = gBaseStats[gBattleMons[battlerId].species].ability2; // AI can't actually reach this part since no pokemon has ability 2 and no ability 1. } } else @@ -1435,25 +1441,21 @@ static void BattleAICmd_check_ability(void) // The AI knows its own or partner's ability. ability = gBattleMons[battlerId].ability; } + if (ability == 0) - { - AI_THINKING_STRUCT->funcResult = 2; // unable to answer - } + AI_THINKING_STRUCT->funcResult = 2; // Unable to answer. else if (ability == gAIScriptPtr[2]) - { - AI_THINKING_STRUCT->funcResult = 1; // pokemon has the ability we wanted to check - } + AI_THINKING_STRUCT->funcResult = 1; // Pokemon has the ability we wanted to check. else - { - AI_THINKING_STRUCT->funcResult = 0; // pokemon doesn't have the ability we wanted to check - } + AI_THINKING_STRUCT->funcResult = 0; // Pokemon doesn't have the ability we wanted to check. + gAIScriptPtr += 3; } static void BattleAICmd_get_highest_type_effectiveness(void) { s32 i; - u8* dynamicMoveType; + u8 *dynamicMoveType; gDynamicBasePower = 0; dynamicMoveType = &gBattleStruct->dynamicMoveType; @@ -1465,19 +1467,18 @@ static void BattleAICmd_get_highest_type_effectiveness(void) for (i = 0; i < 4; i++) { - gBattleMoveDamage = AI_EFFECTIVENESS_x1; + gBattleMoveDamage = 40; gCurrentMove = gBattleMons[sBattler_AI].moves[i]; - if (gCurrentMove) + if (gCurrentMove != MOVE_NONE) { TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); - // reduce by 1/3. - if (gBattleMoveDamage == 120) + if (gBattleMoveDamage == 120) // Super effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x2; if (gBattleMoveDamage == 240) gBattleMoveDamage = AI_EFFECTIVENESS_x4; - if (gBattleMoveDamage == 30) + if (gBattleMoveDamage == 30) // Not very effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; if (gBattleMoveDamage == 15) gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; @@ -1489,6 +1490,7 @@ static void BattleAICmd_get_highest_type_effectiveness(void) AI_THINKING_STRUCT->funcResult = gBattleMoveDamage; } } + gAIScriptPtr += 1; } @@ -1507,11 +1509,11 @@ static void BattleAICmd_if_type_effectiveness(void) TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); - if (gBattleMoveDamage == 120) + if (gBattleMoveDamage == 120) // Super effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x2; if (gBattleMoveDamage == 240) gBattleMoveDamage = AI_EFFECTIVENESS_x4; - if (gBattleMoveDamage == 30) + if (gBattleMoveDamage == 30) // Not very effective STAB. gBattleMoveDamage = AI_EFFECTIVENESS_x0_5; if (gBattleMoveDamage == 15) gBattleMoveDamage = AI_EFFECTIVENESS_x0_25; @@ -1519,7 +1521,7 @@ static void BattleAICmd_if_type_effectiveness(void) if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE) gBattleMoveDamage = AI_EFFECTIVENESS_x0; - // store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8. + // Store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8. damageVar = gBattleMoveDamage; if (damageVar == gAIScriptPtr[1]) @@ -1539,18 +1541,18 @@ static void BattleAICmd_nullsub_33(void) static void BattleAICmd_if_status_in_party(void) { struct Pokemon *party; - int i; + s32 i; u32 statusToCompareTo; u8 battlerId; - switch(gAIScriptPtr[1]) + switch (gAIScriptPtr[1]) { - case AI_USER: - battlerId = sBattler_AI; - break; - default: - battlerId = gBattlerTarget; - break; + case AI_USER: + battlerId = sBattler_AI; + break; + default: + battlerId = gBattlerTarget; + break; } party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; @@ -1576,18 +1578,18 @@ static void BattleAICmd_if_status_in_party(void) static void BattleAICmd_if_status_not_in_party(void) { struct Pokemon *party; - int i; + s32 i; u32 statusToCompareTo; u8 battlerId; switch(gAIScriptPtr[1]) { - case 1: - battlerId = sBattler_AI; - break; - default: - battlerId = gBattlerTarget; - break; + case 1: + battlerId = sBattler_AI; + break; + default: + battlerId = gBattlerTarget; + break; } party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; @@ -1602,7 +1604,8 @@ static void BattleAICmd_if_status_not_in_party(void) if (species != SPECIES_NONE && species != SPECIES_EGG && hp != 0 && status == statusToCompareTo) { - gAIScriptPtr += 10; // still bugged in Emerald + gAIScriptPtr += 10; // UB: Still bugged in Emerald. Uncomment the return statement to fix. + // return; } } @@ -1718,7 +1721,7 @@ static void BattleAICmd_if_can_faint(void) gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - // moves always do at least 1 damage. + // Moves always do at least 1 damage. if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -1747,7 +1750,7 @@ static void BattleAICmd_if_cant_faint(void) gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100; - // this macro is missing the damage 0 = 1 assumption. + // This macro is missing the damage 0 = 1 assumption. if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); @@ -1757,118 +1760,93 @@ static void BattleAICmd_if_cant_faint(void) static void BattleAICmd_if_has_move(void) { - int i; + s32 i; const u16 *movePtr = (u16 *)(gAIScriptPtr + 2); switch (gAIScriptPtr[1]) { - case AI_USER: - for (i = 0; i < 4; i++) - { - if (gBattleMons[sBattler_AI].moves[i] == *movePtr) - break; - } - if (i == 4) - { - gAIScriptPtr += 8; - return; - } - else - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - return; - } - case AI_USER_PARTNER: - if (gBattleMons[sBattler_AI ^ BIT_FLANK].hp == 0) - { - gAIScriptPtr += 8; - return; - } - else - { - for (i = 0; i < 4; i++) - { - if (gBattleMons[sBattler_AI ^ BIT_FLANK].moves[i] == *movePtr) - break; - } - } - if (i == 4) - { - gAIScriptPtr += 8; - return; - } - else - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - return; - } - case AI_TARGET: - case AI_TARGET_PARTNER: + case AI_USER: + for (i = 0; i < 4; i++) + { + if (gBattleMons[sBattler_AI].moves[i] == *movePtr) + break; + } + if (i == 4) + gAIScriptPtr += 8; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + break; + case AI_USER_PARTNER: + if (gBattleMons[sBattler_AI ^ BIT_FLANK].hp == 0) + { + gAIScriptPtr += 8; + break; + } + else + { for (i = 0; i < 4; i++) { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) + if (gBattleMons[sBattler_AI ^ BIT_FLANK].moves[i] == *movePtr) break; } - if (i == 4) - { - gAIScriptPtr += 8; - return; - } - else - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - return; - } + } + if (i == 4) + gAIScriptPtr += 8; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + break; + case AI_TARGET: + case AI_TARGET_PARTNER: + for (i = 0; i < 4; i++) + { + if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) + break; + } + if (i == 4) + gAIScriptPtr += 8; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + break; } } static void BattleAICmd_if_doesnt_have_move(void) { - int i; + s32 i; const u16 *movePtr = (u16 *)(gAIScriptPtr + 2); switch(gAIScriptPtr[1]) { - case AI_USER: - case AI_USER_PARTNER: // UB: no separate check for user partner - for (i = 0; i < 4; i++) - { - if (gBattleMons[sBattler_AI].moves[i] == *movePtr) - break; - } - if (i != 4) - { - gAIScriptPtr += 8; - return; - } - else - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - return; - } - case AI_TARGET: - case AI_TARGET_PARTNER: - for (i = 0; i < 4; i++) - { - if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) - break; - } - if (i != 4) - { - gAIScriptPtr += 8; - return; - } - else - { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); - return; - } + case AI_USER: + case AI_USER_PARTNER: // UB: no separate check for user partner. + for (i = 0; i < 4; i++) + { + if (gBattleMons[sBattler_AI].moves[i] == *movePtr) + break; + } + if (i != 4) + gAIScriptPtr += 8; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + break; + case AI_TARGET: + case AI_TARGET_PARTNER: + for (i = 0; i < 4; i++) + { + if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr) + break; + } + if (i != 4) + gAIScriptPtr += 8; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); + break; } } static void BattleAICmd_if_has_move_with_effect(void) { - int i; + s32 i; switch (gAIScriptPtr[1]) { @@ -1888,7 +1866,7 @@ static void BattleAICmd_if_has_move_with_effect(void) case AI_TARGET_PARTNER: for (i = 0; i < 4; i++) { - // UB: checks sBattler_AI instead of gBattlerTarget + // UB: checks sBattler_AI instead of gBattlerTarget. if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2]) break; } @@ -1902,7 +1880,7 @@ static void BattleAICmd_if_has_move_with_effect(void) static void BattleAICmd_if_doesnt_have_move_with_effect(void) { - int i; + s32 i; switch (gAIScriptPtr[1]) { @@ -1944,25 +1922,22 @@ static void BattleAICmd_if_any_move_disabled_or_encored(void) if (gAIScriptPtr[2] == 0) { - if (gDisableStructs[battlerId].disabledMove == 0) - { + if (gDisableStructs[battlerId].disabledMove == MOVE_NONE) gAIScriptPtr += 7; - return; - } - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - return; + else + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); } - else if (gAIScriptPtr[2] != 1) // ignore the macro if its not 0 or 1. + else if (gAIScriptPtr[2] != 1) { gAIScriptPtr += 7; - return; } - else if (gDisableStructs[battlerId].encoredMove != 0) + else { - gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); - return; + if (gDisableStructs[battlerId].encoredMove != MOVE_NONE) + gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); + else + gAIScriptPtr += 7; } - gAIScriptPtr += 7; } static void BattleAICmd_if_curr_move_disabled_or_encored(void) @@ -1971,23 +1946,19 @@ static void BattleAICmd_if_curr_move_disabled_or_encored(void) { case 0: if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered) - { gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; + else + gAIScriptPtr += 6; + break; case 1: if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered) - { gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; + else + gAIScriptPtr += 6; + break; default: gAIScriptPtr += 6; - return; + break; } } @@ -1998,7 +1969,7 @@ static void BattleAICmd_flee(void) static void BattleAICmd_if_random_safari_flee(void) { - u8 safariFleeRate = gBattleStruct->field_7B * 5; // safari flee rate, from 0-20 + u8 safariFleeRate = gBattleStruct->safariEscapeFactor * 5; // Safari flee rate, from 0-20. if ((u8)(Random() % 100) < safariFleeRate) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 1); @@ -2030,7 +2001,7 @@ static void BattleAICmd_get_hold_effect(void) static void BattleAICmd_if_holds_item(void) { - u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]); + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u16 item; u8 var1, var2; @@ -2107,7 +2078,7 @@ static void BattleAICmd_get_used_held_item(void) else battlerId = gBattlerTarget; - // This is likely a leftover from Ruby's code and its ugly ewram access + // This is likely a leftover from Ruby's code and its ugly ewram access. #ifdef NONMATCHING AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId]; #else @@ -2199,28 +2170,22 @@ static void BattleAICmd_if_level_cond(void) { case 0: // greater than if (gBattleMons[sBattler_AI].level > gBattleMons[gBattlerTarget].level) - { gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; + else + gAIScriptPtr += 6; + break; case 1: // less than if (gBattleMons[sBattler_AI].level < gBattleMons[gBattlerTarget].level) - { gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; + else + gAIScriptPtr += 6; + break; case 2: // equal if (gBattleMons[sBattler_AI].level == gBattleMons[gBattlerTarget].level) - { gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); - return; - } - gAIScriptPtr += 6; - return; + else + gAIScriptPtr += 6; + break; } } @@ -2250,7 +2215,7 @@ static void BattleAICmd_if_target_is_ally(void) static void BattleAICmd_if_flash_fired(void) { - u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]); + u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); if (gBattleResources->flags->flags[battlerId] & UNKNOWN_FLAG_FLASH_FIRE) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); @@ -2277,5 +2242,7 @@ static bool8 AIStackPop(void) return TRUE; } else + { return FALSE; + } } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 83ad2b4fd..a105e7edf 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -19,18 +19,20 @@ static bool8 ShouldSwitchIfPerishSong(void) if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG && gDisableStructs[gActiveBattler].perishSongTimer1 == 0) { - *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6; + *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } - - return FALSE; + else + { + return FALSE; + } } static bool8 ShouldSwitchIfWonderGuard(void) { u8 opposingPosition; - u8 opposingBank; + u8 opposingBattler; u8 moveFlags; s32 i, j; s32 firstId; @@ -46,22 +48,22 @@ static bool8 ShouldSwitchIfWonderGuard(void) if (gBattleMons[GetBattlerAtPosition(opposingPosition)].ability != ABILITY_WONDER_GUARD) return FALSE; - // check if pokemon has a super effective move - for (opposingBank = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++) + // Check if Pokemon has a super effective move. + for (opposingBattler = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++) { move = gBattleMons[gActiveBattler].moves[i]; if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability); + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) return FALSE; } - // get party information + // Get party information. if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) { - if ((gActiveBattler & BIT_FLANK) == 0) + if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; else firstId = 3, lastId = 6; @@ -76,7 +78,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) else party = gEnemyParty; - // find a pokemon in the party that has a super effective move + // Find a Pokemon in the party that has a super effective move. for (i = firstId; i < lastId; i++) { if (GetMonData(&party[i], MON_DATA_HP) == 0) @@ -88,19 +90,19 @@ static bool8 ShouldSwitchIfWonderGuard(void) if (i == gBattlerPartyIndexes[gActiveBattler]) continue; - GetMonData(&party[i], MON_DATA_SPECIES); // unused return value - GetMonData(&party[i], MON_DATA_ALT_ABILITY); // unused return value + GetMonData(&party[i], MON_DATA_SPECIES); // Unused return value. + GetMonData(&party[i], MON_DATA_ALT_ABILITY); // Unused return value. - for (opposingBank = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++) + for (opposingBattler = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++) { move = GetMonData(&party[i], MON_DATA_MOVE1 + j); if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability); + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2) { - // we found a mon + // We found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; @@ -108,12 +110,12 @@ static bool8 ShouldSwitchIfWonderGuard(void) } } - return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard + return FALSE; // There is not a single Pokemon in the party that has a super effective move against a mon with Wonder Guard. } static bool8 FindMonThatAbsorbsOpponentsMove(void) { - u8 bankIn1, bankIn2; + u8 battlerIn1, battlerIn2; u8 absorbingTypeAbility; s32 firstId; s32 lastId; // + 1 @@ -131,16 +133,16 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - bankIn1 = gActiveBattler; + battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) - bankIn2 = gActiveBattler; + battlerIn2 = gActiveBattler; else - bankIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); + battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); } else { - bankIn1 = gActiveBattler; - bankIn2 = gActiveBattler; + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; } if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE) @@ -157,7 +159,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) { - if ((gActiveBattler & BIT_FLANK) == 0) + if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; else firstId = 3, lastId = 6; @@ -183,13 +185,13 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) continue; if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) continue; - if (i == gBattlerPartyIndexes[bankIn1]) + if (i == gBattlerPartyIndexes[battlerIn1]) continue; - if (i == gBattlerPartyIndexes[bankIn2]) + if (i == gBattlerPartyIndexes[battlerIn2]) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) continue; species = GetMonData(&party[i], MON_DATA_SPECIES); @@ -200,7 +202,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) if (absorbingTypeAbility == monAbility && Random() & 1) { - // we found a mon + // we found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; @@ -221,13 +223,13 @@ static bool8 ShouldSwitchIfNaturalCure(void) if ((gLastLandedMoves[gActiveBattler] == 0 || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1) { - *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6; + *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) { - *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6; + *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } @@ -236,9 +238,10 @@ static bool8 ShouldSwitchIfNaturalCure(void) return TRUE; if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1)) return TRUE; + if (Random() & 1) { - *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6; + *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0); return TRUE; } @@ -249,15 +252,15 @@ static bool8 ShouldSwitchIfNaturalCure(void) static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) { u8 opposingPosition; - u8 opposingBank; + u8 opposingBattler; s32 i; u8 moveFlags; u16 move; opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler)); - opposingBank = GetBattlerAtPosition(opposingPosition); + opposingBattler = GetBattlerAtPosition(opposingPosition); - if (!(gAbsentBattlerFlags & gBitTable[opposingBank])) + if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) { for (i = 0; i < 4; i++) { @@ -265,7 +268,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability); + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) { if (noRng) @@ -278,9 +281,9 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return FALSE; - opposingBank = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition)); + opposingBattler = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition)); - if (!(gAbsentBattlerFlags & gBitTable[opposingBank])) + if (!(gAbsentBattlerFlags & gBitTable[opposingBattler])) { for (i = 0; i < 4; i++) { @@ -288,7 +291,7 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng) if (move == MOVE_NONE) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability); + moveFlags = AI_TypeCalc(move, gBattleMons[opposingBattler].species, gBattleMons[opposingBattler].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE) { if (noRng) @@ -318,7 +321,7 @@ static bool8 AreStatsRaised(void) static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) { - u8 bankIn1, bankIn2; + u8 battlerIn1, battlerIn2; s32 firstId; s32 lastId; // + 1 struct Pokemon *party; @@ -337,16 +340,16 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - bankIn1 = gActiveBattler; + battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))]) - bankIn2 = gActiveBattler; + battlerIn2 = gActiveBattler; else - bankIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); + battlerIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))); } else { - bankIn1 = gActiveBattler; - bankIn2 = gActiveBattler; + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; } if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) @@ -377,13 +380,13 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) continue; if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) continue; - if (i == gBattlerPartyIndexes[bankIn1]) + if (i == gBattlerPartyIndexes[battlerIn1]) continue; - if (i == gBattlerPartyIndexes[bankIn2]) + if (i == gBattlerPartyIndexes[battlerIn2]) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) continue; species = GetMonData(&party[i], MON_DATA_SPECIES); @@ -395,7 +398,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility); if (moveFlags & flags) { - bankIn1 = gLastHitBy[gActiveBattler]; + battlerIn1 = gLastHitBy[gActiveBattler]; for (j = 0; j < 4; j++) { @@ -403,7 +406,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (move == 0) continue; - moveFlags = AI_TypeCalc(move, gBattleMons[bankIn1].species, gBattleMons[bankIn1].ability); + moveFlags = AI_TypeCalc(move, gBattleMons[battlerIn1].species, gBattleMons[battlerIn1].ability); if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; @@ -419,23 +422,23 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) static bool8 ShouldSwitch(void) { - u8 bankIn1, bankIn2; - u8 *activeBankPtr; // needed to match + u8 battlerIn1, battlerIn2; + u8 *activeBattlerPtr; // Needed to match. s32 firstId; s32 lastId; // + 1 struct Pokemon *party; s32 i; s32 availableToSwitch; - if (gBattleMons[*(activeBankPtr = &gActiveBattler)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) + if (gBattleMons[*(activeBattlerPtr = &gActiveBattler)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION)) return FALSE; if (gStatuses3[gActiveBattler] & STATUS3_ROOTED) return FALSE; - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0)) + if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) return FALSE; - if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0)) - return FALSE; // misses the flying or levitate check - if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0)) + if (ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) // Misses the flying type and Levitate check. + return FALSE; + if (ABILITY_ON_FIELD2(ABILITY_MAGNET_PULL)) { if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL) return FALSE; @@ -448,21 +451,21 @@ static bool8 ShouldSwitch(void) availableToSwitch = 0; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - bankIn1 = *activeBankPtr; - if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(*activeBankPtr) ^ BIT_FLANK)]) - bankIn2 = *activeBankPtr; + battlerIn1 = *activeBattlerPtr; + if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(*activeBattlerPtr) ^ BIT_FLANK)]) + battlerIn2 = *activeBattlerPtr; else - bankIn2 = GetBattlerAtPosition(GetBattlerPosition(*activeBankPtr) ^ BIT_FLANK); + battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(*activeBattlerPtr) ^ BIT_FLANK); } else { - bankIn1 = *activeBankPtr; - bankIn2 = *activeBankPtr; + battlerIn1 = *activeBattlerPtr; + battlerIn2 = *activeBattlerPtr; } if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) { - if ((gActiveBattler & BIT_FLANK) == 0) + if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; else firstId = 3, lastId = 6; @@ -485,13 +488,13 @@ static bool8 ShouldSwitch(void) continue; if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) continue; - if (i == gBattlerPartyIndexes[bankIn1]) + if (i == gBattlerPartyIndexes[battlerIn1]) continue; - if (i == gBattlerPartyIndexes[bankIn2]) + if (i == gBattlerPartyIndexes[battlerIn2]) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) continue; availableToSwitch++; @@ -521,10 +524,10 @@ static bool8 ShouldSwitch(void) void AI_TrySwitchOrUseItem(void) { struct Pokemon *party; - u8 bankIn1, bankIn2; + u8 battlerIn1, battlerIn2; s32 firstId; s32 lastId; // + 1 - u8 bankIdentity = GetBattlerPosition(gActiveBattler); + u8 battlerIdentity = GetBattlerPosition(gActiveBattler); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) party = gPlayerParty; @@ -535,25 +538,25 @@ void AI_TrySwitchOrUseItem(void) { if (ShouldSwitch()) { - if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == 6) + if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == PARTY_SIZE) { s32 monToSwitchId = GetMostSuitableMonToSwitchInto(); - if (monToSwitchId == 6) + if (monToSwitchId == PARTY_SIZE) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { - bankIn1 = GetBattlerAtPosition(bankIdentity); - bankIn2 = bankIn1; + battlerIn1 = GetBattlerAtPosition(battlerIdentity); + battlerIn2 = battlerIn1; } else { - bankIn1 = GetBattlerAtPosition(bankIdentity); - bankIn2 = GetBattlerAtPosition(bankIdentity ^ BIT_FLANK); + battlerIn1 = GetBattlerAtPosition(battlerIdentity); + battlerIn2 = GetBattlerAtPosition(battlerIdentity ^ BIT_FLANK); } if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) { - if ((gActiveBattler & BIT_FLANK) == 0) + if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; else firstId = 3, lastId = 6; @@ -567,13 +570,13 @@ void AI_TrySwitchOrUseItem(void) { if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0) continue; - if (monToSwitchId == gBattlerPartyIndexes[bankIn1]) + if (monToSwitchId == gBattlerPartyIndexes[battlerIn1]) continue; - if (monToSwitchId == gBattlerPartyIndexes[bankIn2]) + if (monToSwitchId == gBattlerPartyIndexes[battlerIn2]) continue; - if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn1)) + if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) continue; - if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn2)) + if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) continue; break; @@ -608,10 +611,10 @@ static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 } else if (TYPE_EFFECT_ATK_TYPE(i) == atkType) { - // check type1 + // Check type1. if (TYPE_EFFECT_DEF_TYPE(i) == defType1) *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; - // check type2 + // Check type2. if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2) *var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10; } @@ -621,10 +624,10 @@ static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 u8 GetMostSuitableMonToSwitchInto(void) { - u8 opposingBank; - u8 bestDmg; // note : should be changed to u32 for obvious reasons + u8 opposingBattler; + u8 bestDmg; // Note : should be changed to u32 for obvious reasons. u8 bestMonId; - u8 bankIn1, bankIn2; + u8 battlerIn1, battlerIn2; s32 firstId; s32 lastId; // + 1 struct Pokemon *party; @@ -632,34 +635,34 @@ u8 GetMostSuitableMonToSwitchInto(void) u8 invalidMons; u16 move; - if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != 6) + if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != PARTY_SIZE) return *(gBattleStruct->monToSwitchIntoId + gActiveBattler); if (gBattleTypeFlags & BATTLE_TYPE_ARENA) return gBattlerPartyIndexes[gActiveBattler] + 1; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - bankIn1 = gActiveBattler; + battlerIn1 = gActiveBattler; if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)]) - bankIn2 = gActiveBattler; + battlerIn2 = gActiveBattler; else - bankIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); + battlerIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK); - // UB: It considers the opponent only player's side even though it can battle alongside player; - opposingBank = Random() & BIT_FLANK; - if (gAbsentBattlerFlags & gBitTable[opposingBank]) - opposingBank ^= BIT_FLANK; + // UB: It considers the opponent only player's side even though it can battle alongside player. + opposingBattler = Random() & BIT_FLANK; + if (gAbsentBattlerFlags & gBitTable[opposingBattler]) + opposingBattler ^= BIT_FLANK; } else { - opposingBank = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_SIDE); - bankIn1 = gActiveBattler; - bankIn2 = gActiveBattler; + opposingBattler = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_SIDE); + battlerIn1 = gActiveBattler; + battlerIn2 = gActiveBattler; } if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000)) { - if ((gActiveBattler & BIT_FLANK) == 0) + if ((gActiveBattler & BIT_FLANK) == B_FLANK_LEFT) firstId = 0, lastId = 3; else firstId = 3, lastId = 6; @@ -676,27 +679,27 @@ u8 GetMostSuitableMonToSwitchInto(void) invalidMons = 0; - while (invalidMons != 0x3F) // all mons are invalid + while (invalidMons != 0x3F) // All mons are invalid. { bestDmg = 0; bestMonId = 6; - // find the mon which type is the most suitable offensively + // Find the mon whose type is the most suitable offensively. for (i = firstId; i < lastId; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES); if (species != SPECIES_NONE && GetMonData(&party[i], MON_DATA_HP) != 0 && !(gBitTable[i] & invalidMons) - && gBattlerPartyIndexes[bankIn1] != i - && gBattlerPartyIndexes[bankIn2] != i - && i != *(gBattleStruct->monToSwitchIntoId + bankIn1) - && i != *(gBattleStruct->monToSwitchIntoId + bankIn2)) + && gBattlerPartyIndexes[battlerIn1] != i + && gBattlerPartyIndexes[battlerIn2] != i + && i != *(gBattleStruct->monToSwitchIntoId + battlerIn1) + && i != *(gBattleStruct->monToSwitchIntoId + battlerIn2)) { u8 type1 = gBaseStats[species].type1; u8 type2 = gBaseStats[species].type2; u8 typeDmg = 10; - ModulateByTypeEffectiveness(gBattleMons[opposingBank].type1, type1, type2, &typeDmg); - ModulateByTypeEffectiveness(gBattleMons[opposingBank].type2, type1, type2, &typeDmg); + ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type1, type1, type2, &typeDmg); + ModulateByTypeEffectiveness(gBattleMons[opposingBattler].type2, type1, type2, &typeDmg); if (bestDmg < typeDmg) { bestDmg = typeDmg; @@ -709,24 +712,24 @@ u8 GetMostSuitableMonToSwitchInto(void) } } - // ok, we know the mon has the right typing but does it have at least one super effective move? - if (bestMonId != 6) + // Ok, we know the mon has the right typing but does it have at least one super effective move? + if (bestMonId != PARTY_SIZE) { for (i = 0; i < 4; i++) { move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i); - if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBank) & MOVE_RESULT_SUPER_EFFECTIVE) + if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBattler) & MOVE_RESULT_SUPER_EFFECTIVE) break; } if (i != 4) - return bestMonId; // has both the typing and at least one super effective move + return bestMonId; // Has both the typing and at least one super effective move. - invalidMons |= gBitTable[bestMonId]; // sorry buddy, we want something better + invalidMons |= gBitTable[bestMonId]; // Sorry buddy, we want something better. } else { - invalidMons = 0x3F; // no viable mon to switch + invalidMons = 0x3F; // No viable mon to switch. } } @@ -738,20 +741,20 @@ u8 GetMostSuitableMonToSwitchInto(void) bestDmg = 0; bestMonId = 6; - // if we couldn't find the best mon in terms of typing, find the one that deals most damage + // If we couldn't find the best mon in terms of typing, find the one that deals most damage. for (i = firstId; i < lastId; i++) { if ((u16)(GetMonData(&party[i], MON_DATA_SPECIES)) == SPECIES_NONE) continue; if (GetMonData(&party[i], MON_DATA_HP) == 0) continue; - if (gBattlerPartyIndexes[bankIn1] == i) + if (gBattlerPartyIndexes[battlerIn1] == i) continue; - if (gBattlerPartyIndexes[bankIn2] == i) + if (gBattlerPartyIndexes[battlerIn2] == i) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn1)) continue; - if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2)) + if (i == *(gBattleStruct->monToSwitchIntoId + battlerIn2)) continue; for (j = 0; j < 4; j++) @@ -760,8 +763,8 @@ u8 GetMostSuitableMonToSwitchInto(void) gBattleMoveDamage = 0; if (move != MOVE_NONE && gBattleMoves[move].power != 1) { - AI_CalcDmg(gActiveBattler, opposingBank); - TypeCalc(move, gActiveBattler, opposingBank); + AI_CalcDmg(gActiveBattler, opposingBattler); + TypeCalc(move, gActiveBattler, opposingBattler); } if (bestDmg < gBattleMoveDamage) { @@ -774,21 +777,21 @@ u8 GetMostSuitableMonToSwitchInto(void) return bestMonId; } -// TODO: use PokemonItemEffect struct instead of u8 once it's documented +// TODO: use PokemonItemEffect struct instead of u8 once it's documented. static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument { if (itemId == ITEM_FULL_RESTORE) return AI_ITEM_FULL_RESTORE; - if (itemEffect[4] & 4) + else if (itemEffect[4] & 4) return AI_ITEM_HEAL_HP; - if (itemEffect[3] & 0x3F) + else if (itemEffect[3] & 0x3F) return AI_ITEM_CURE_CONDITION; - if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0) + else if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0) return AI_ITEM_X_STAT; - if (itemEffect[3] & 0x80) + else if (itemEffect[3] & 0x80) return AI_ITEM_GUARD_SPECS; - - return AI_ITEM_NOT_RECOGNIZABLE; + else + return AI_ITEM_NOT_RECOGNIZABLE; } static bool8 ShouldUseItem(void) @@ -806,7 +809,7 @@ static bool8 ShouldUseItem(void) else party = gEnemyParty; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE @@ -821,7 +824,7 @@ static bool8 ShouldUseItem(void) u16 item; const u8 *itemEffects; u8 paramOffset; - u8 bankSide; + u8 battlerSide; if (i != 0 && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1) continue; @@ -908,8 +911,8 @@ static bool8 ShouldUseItem(void) shouldUse = TRUE; break; case AI_ITEM_GUARD_SPECS: - bankSide = GetBattlerSide(gActiveBattler); - if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0) + battlerSide = GetBattlerSide(gActiveBattler); + if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[battlerSide].mistTimer == 0) shouldUse = TRUE; break; case AI_ITEM_NOT_RECOGNIZABLE: diff --git a/src/battle_anim.c b/src/battle_anim.c index 7a5197740..b6f726897 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -120,10 +120,10 @@ EWRAM_DATA static u16 sSoundAnimFramesToWait = 0; EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0}; EWRAM_DATA u8 gAnimMoveTurn = 0; EWRAM_DATA static u8 sAnimBackgroundFadeState = 0; -EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused. +EWRAM_DATA static u16 sAnimMoveIndex = 0; // Set but unused. EWRAM_DATA u8 gBattleAnimAttacker = 0; EWRAM_DATA u8 gBattleAnimTarget = 0; -EWRAM_DATA u16 gAnimSpeciesByBanks[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gUnknown_02038440 = 0; // const rom data @@ -179,6 +179,7 @@ static void (* const sScriptCmdTable[])(void) = ScriptCmd_stopsound }; +// code void ClearBattleAnimationVars(void) { s32 i; @@ -192,11 +193,11 @@ void ClearBattleAnimationVars(void) gAnimMovePower = 0; gAnimFriendship = 0; - // clear index array. + // Clear index array. for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) sAnimSpriteIndexArray[i] |= 0xFFFF; - // clear anim args. + // Clear anim args. for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; @@ -228,15 +229,15 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo for (i = 0; i < MAX_BATTLERS_COUNT; i++) { if (GetBattlerSide(i) != 0) - gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); + gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else - gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); + gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); } } else { for (i = 0; i < 4; i++) - gAnimSpeciesByBanks[i] = gContestResources->field_18->field_0; + gAnimBattlerSpecies[i] = gContestResources->field_18->field_0; } if (!isMoveAnim) @@ -459,7 +460,7 @@ static void ScriptCmd_delay(void) gAnimScriptCallback = WaitAnimFrameCount; } -// wait for visual tasks to finish. +// Wait for visual tasks to finish. static void ScriptCmd_waitforvisualfinish(void) { if (gAnimVisualTaskCount == 0) @@ -486,7 +487,7 @@ static void ScriptCmd_end(void) s32 i; bool32 continuousAnim = FALSE; - // keep waiting as long as there is animations to be done. + // Keep waiting as long as there are animations to be done. if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 || sMonAnimTaskIdArray[0] != 0xFF || sMonAnimTaskIdArray[1] != 0xFF) { @@ -495,10 +496,10 @@ static void ScriptCmd_end(void) return; } - // finish the sound effects. + // Finish the sound effects. if (IsSEPlaying()) { - if (++sSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. + if (++sSoundAnimFramesToWait <= 90) // Wait 90 frames, then halt the sound effect. { gAnimFramesToWait = 1; return; @@ -510,7 +511,7 @@ static void ScriptCmd_end(void) } } - // the SE has halted, so set the SE Frame Counter to 0 and continue. + // The SE has halted, so set the SE Frame Counter to 0 and continue. sSoundAnimFramesToWait = 0; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) @@ -523,7 +524,7 @@ static void ScriptCmd_end(void) } } - if (!continuousAnim) // may have been used for debug? + if (!continuousAnim) // May have been used for debug? { m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256); if (!IsContest()) @@ -592,12 +593,12 @@ static void ScriptCmd_monbg(void) bool8 toBG_2; u8 taskId; u8 battlerId; - u8 animBank; + u8 animBattler; sBattleAnimScriptPtr++; - animBank = sBattleAnimScriptPtr[0]; - if (animBank & ANIM_TARGET) + animBattler = sBattleAnimScriptPtr[0]; + if (animBattler & ANIM_TARGET) battlerId = gBattleAnimTarget; else battlerId = gBattleAnimAttacker; @@ -655,7 +656,7 @@ bool8 IsBattlerSpriteVisible(u8 battlerId) if (!IsBattlerSpritePresent(battlerId)) return FALSE; if (IsContest()) - return TRUE; // this line wont ever be reached. + return TRUE; // This line won't ever be reached. if (!gBattleSpritesDataPtr->battlerData[battlerId].invisible || !gSprites[gBattlerSpriteIds[battlerId]].invisible) return TRUE; @@ -847,32 +848,32 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) static void ScriptCmd_clearmonbg(void) { - u8 animBankId; + u8 animBattlerId; u8 battlerId; u8 taskId; sBattleAnimScriptPtr++; - animBankId = sBattleAnimScriptPtr[0]; + animBattlerId = sBattleAnimScriptPtr[0]; - if (animBankId == ANIM_ATTACKER) - animBankId = ANIM_ATK_PARTNER; - else if (animBankId == ANIM_TARGET) - animBankId = ANIM_DEF_PARTNER; + if (animBattlerId == ANIM_ATTACKER) + animBattlerId = ANIM_ATK_PARTNER; + else if (animBattlerId == ANIM_TARGET) + animBattlerId = ANIM_DEF_PARTNER; - if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER) + if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; if (sMonAnimTaskIdArray[0] != 0xFF) gSprites[gBattlerSpriteIds[battlerId]].invisible = 0; - if (animBankId > 1 && sMonAnimTaskIdArray[1] != 0xFF) + if (animBattlerId > 1 && sMonAnimTaskIdArray[1] != 0xFF) gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = 0; else - animBankId = 0; + animBattlerId = 0; taskId = CreateTask(sub_80A4980, 5); - gTasks[taskId].data[0] = animBankId; + gTasks[taskId].data[0] = animBattlerId; gTasks[taskId].data[2] = battlerId; sBattleAnimScriptPtr++; @@ -910,18 +911,18 @@ static void ScriptCmd_monbg_22(void) { bool8 toBG_2; u8 battlerId; - u8 animBankId; + u8 animBattlerId; sBattleAnimScriptPtr++; - animBankId = sBattleAnimScriptPtr[0]; + animBattlerId = sBattleAnimScriptPtr[0]; - if (animBankId == ANIM_ATTACKER) - animBankId = ANIM_ATK_PARTNER; - else if (animBankId == ANIM_TARGET) - animBankId = ANIM_DEF_PARTNER; + if (animBattlerId == ANIM_ATTACKER) + animBattlerId = ANIM_ATK_PARTNER; + else if (animBattlerId == ANIM_TARGET) + animBattlerId = ANIM_DEF_PARTNER; - if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER) + if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; @@ -938,7 +939,7 @@ static void ScriptCmd_monbg_22(void) } battlerId ^= BIT_FLANK; - if (animBankId > 1 && IsBattlerSpriteVisible(battlerId)) + if (animBattlerId > 1 && IsBattlerSpriteVisible(battlerId)) { u8 position = GetBattlerPosition(battlerId); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest()) @@ -954,32 +955,32 @@ static void ScriptCmd_monbg_22(void) static void ScriptCmd_clearmonbg_23(void) { - u8 animBankId; + u8 animBattlerId; u8 battlerId; u8 taskId; sBattleAnimScriptPtr++; - animBankId = sBattleAnimScriptPtr[0]; + animBattlerId = sBattleAnimScriptPtr[0]; - if (animBankId == ANIM_ATTACKER) - animBankId = ANIM_ATK_PARTNER; - else if (animBankId == ANIM_TARGET) - animBankId = ANIM_DEF_PARTNER; + if (animBattlerId == ANIM_ATTACKER) + animBattlerId = ANIM_ATK_PARTNER; + else if (animBattlerId == ANIM_TARGET) + animBattlerId = ANIM_DEF_PARTNER; - if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER) + if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) battlerId = gBattleAnimAttacker; else battlerId = gBattleAnimTarget; if (IsBattlerSpriteVisible(battlerId)) gSprites[gBattlerSpriteIds[battlerId]].invisible = 0; - if (animBankId > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK)) + if (animBattlerId > 1 && IsBattlerSpriteVisible(battlerId ^ BIT_FLANK)) gSprites[gBattlerSpriteIds[battlerId ^ BIT_FLANK]].invisible = 0; else - animBankId = 0; + animBattlerId = 0; taskId = CreateTask(sub_80A4BB0, 5); - gTasks[taskId].data[0] = animBankId; + gTasks[taskId].data[0] = animBattlerId; gTasks[taskId].data[2] = battlerId; sBattleAnimScriptPtr++; @@ -1318,16 +1319,16 @@ s8 BattleAnimAdjustPanning2(s8 pan) return pan; } -s16 sub_80A52EC(s16 a) +s16 KeepPanInRange(s16 panArg) { - s16 var = a; + s16 pan = panArg; - if (var > 63) - var = 63; - else if (var < -64) - var = -64; + if (pan > PAN_SIDE_OPPONENT) + pan = PAN_SIDE_OPPONENT; + else if (pan < PAN_SIDE_PLAYER) + pan = PAN_SIDE_PLAYER; - return var; + return pan; } s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) @@ -1419,18 +1420,18 @@ void Task_PanFromInitialToTarget(u8 taskId) pan = currentPan + incrementPan; gTasks[taskId].tCurrentPan = pan; - if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately + if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately. { destroyTask = TRUE; } - else if (initialPanning < targetPanning) // Panning increasing + else if (initialPanning < targetPanning) // Panning increasing. { - if (pan >= targetPanning) // Target reached + if (pan >= targetPanning) // Target reached. destroyTask = TRUE; } - else // Panning decreasing + else // Panning decreasing. { - if (pan <= targetPanning) // Target reached + if (pan <= targetPanning) // Target reached. destroyTask = TRUE; } @@ -1684,14 +1685,14 @@ static void ScriptCmd_jumpifcontest(void) static void ScriptCmd_monbgprio_28(void) { - u8 wantedBank; + u8 wantedBattler; u8 battlerId; u8 battlerPosition; - wantedBank = sBattleAnimScriptPtr[1]; + wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; - if (wantedBank != ANIM_ATTACKER) + if (wantedBattler != ANIM_ATTACKER) battlerId = gBattleAnimTarget; else battlerId = gBattleAnimAttacker; @@ -1716,15 +1717,15 @@ static void ScriptCmd_monbgprio_29(void) static void ScriptCmd_monbgprio_2A(void) { - u8 wantedBank; + u8 wantedBattler; u8 battlerPosition; u8 battlerId; - wantedBank = sBattleAnimScriptPtr[1]; + wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget)) { - if (wantedBank != ANIM_ATTACKER) + if (wantedBattler != ANIM_ATTACKER) battlerId = gBattleAnimTarget; else battlerId = gBattleAnimAttacker; @@ -1762,16 +1763,16 @@ static void ScriptCmd_visible(void) static void ScriptCmd_doublebattle_2D(void) { - u8 wantedBank; + u8 wantedBattler; u8 r4; u8 spriteId; - wantedBank = sBattleAnimScriptPtr[1]; + wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; if (!IsContest() && IsDoubleBattle() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { - if (wantedBank == ANIM_ATTACKER) + if (wantedBattler == ANIM_ATTACKER) { r4 = sub_80A8364(gBattleAnimAttacker); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); @@ -1797,16 +1798,16 @@ static void ScriptCmd_doublebattle_2D(void) static void ScriptCmd_doublebattle_2E(void) { - u8 wantedBank; + u8 wantedBattler; u8 r4; u8 spriteId; - wantedBank = sBattleAnimScriptPtr[1]; + wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; if (!IsContest() && IsDoubleBattle() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { - if (wantedBank == ANIM_ATTACKER) + if (wantedBattler == ANIM_ATTACKER) { r4 = sub_80A8364(gBattleAnimAttacker); spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c new file mode 100644 index 000000000..5a829171e --- /dev/null +++ b/src/battle_anim_sound_tasks.c @@ -0,0 +1,438 @@ +#include "global.h" +#include "battle.h" +#include "constants/battle_anim.h" +#include "constants/species.h" +#include "battle_anim.h" +#include "task.h" +#include "sound.h" +#include "contest.h" + +// this file's functions +static void sub_8158B98(u8 taskId); +static void sub_8158C04(u8 taskId); +static void sub_8158D08(u8 taskId); +static void sub_8158FF4(u8 taskId); +static void sub_815913C(u8 taskId); +static void sub_8159308(u8 taskId); + +// task start +void sub_8158B30(u8 taskId) +{ + s8 pan1, pan2, panIncrement; + + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + gTasks[taskId].data[1] = gBattleAnimArgs[1]; + + pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT); + panIncrement = CalculatePanIncrement(pan1, pan2, 2); + + gTasks[taskId].data[2] = pan1; + gTasks[taskId].data[3] = pan2; + gTasks[taskId].data[4] = panIncrement; + gTasks[taskId].data[10] = 10; + + gTasks[taskId].func = sub_8158B98; +} + +static void sub_8158B98(u8 taskId) +{ + s16 pan = gTasks[taskId].data[2]; + s8 panIncrement = gTasks[taskId].data[4]; + if (++gTasks[taskId].data[11] == 111) + { + gTasks[taskId].data[10] = 5; + gTasks[taskId].data[11] = 0; + gTasks[taskId].func = sub_8158C04; + } + else + { + if (++gTasks[taskId].data[10] == 11) + { + gTasks[taskId].data[10] = 0; + PlaySE12WithPanning(gTasks[taskId].data[0], pan); + } + pan += panIncrement; + gTasks[taskId].data[2] = KeepPanInRange(pan); + } +} + +static void sub_8158C04(u8 taskId) +{ + if (++gTasks[taskId].data[10] == 6) + { + s8 pan; + + gTasks[taskId].data[10] = 0; + pan = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT); + PlaySE12WithPanning(gTasks[taskId].data[1], pan); + if (++gTasks[taskId].data[11] == 2) + DestroyAnimSoundTask(taskId); + } +} +// task end + +// task start +void sub_8158C58(u8 taskId) +{ + u16 songId = gBattleAnimArgs[0]; + s8 targetPan = gBattleAnimArgs[2]; + s8 panIncrement = gBattleAnimArgs[3]; + u8 r10 = gBattleAnimArgs[4]; + u8 r7 = gBattleAnimArgs[5]; + u8 r9 = gBattleAnimArgs[6]; + s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + + targetPan = BattleAnimAdjustPanning(targetPan); + panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); + + gTasks[taskId].data[0] = songId; + gTasks[taskId].data[1] = sourcePan; + gTasks[taskId].data[2] = targetPan; + gTasks[taskId].data[3] = panIncrement; + gTasks[taskId].data[4] = r10; + gTasks[taskId].data[5] = r7; + gTasks[taskId].data[6] = r9; + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] = sourcePan; + gTasks[taskId].data[12] = r9; + + gTasks[taskId].func = sub_8158D08; + sub_8158D08(taskId); +} + +static void sub_8158D08(u8 taskId) +{ + if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6]) + { + gTasks[taskId].data[12] = 0; + PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]); + if (--gTasks[taskId].data[4] == 0) + { + DestroyAnimSoundTask(taskId); + return; + } + } + + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5]) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] += gTasks[taskId].data[3]; + gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]); + } +} +// task end + +// task start +void sub_8158D8C(u8 taskId) +{ + u16 species = 0; + s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + if (IsContest()) + { + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + species = gContestResources->field_18->field_0; + else + DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task. + } + else + { + u8 battlerId; + + // Get wanted battler. + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + battlerId = gBattleAnimAttacker; + else if (gBattleAnimArgs[0] == ANIM_TARGET) + battlerId = gBattleAnimTarget; + else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) + battlerId = BATTLE_PARTNER(gBattleAnimAttacker); + else + battlerId = BATTLE_PARTNER(gBattleAnimTarget); + + // Check if battler is visible. + if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) + { + DestroyAnimVisualTask(taskId); + return; + } + + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + } + + if (species != SPECIES_NONE) + PlayCry3(species, pan, 3); + + DestroyAnimVisualTask(taskId); +} +// task end + +// task start +void sub_8158E9C(u8 taskId) +{ + u16 species = 0; + s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + if (IsContest()) + { + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + species = gContestResources->field_18->field_0; + else + DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task. + } + else + { + u8 battlerId; + + // Get wanted battler. + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + battlerId = gBattleAnimAttacker; + else if (gBattleAnimArgs[0] == ANIM_TARGET) + battlerId = gBattleAnimTarget; + else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) + battlerId = BATTLE_PARTNER(gBattleAnimAttacker); + else + battlerId = BATTLE_PARTNER(gBattleAnimTarget); + + // Check if battler is visible. + if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) + { + DestroyAnimVisualTask(taskId); + return; + } + + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + } + + gTasks[taskId].data[0] = gBattleAnimArgs[1]; + gTasks[taskId].data[1] = species; + gTasks[taskId].data[2] = pan; + + if (species != SPECIES_NONE) + { + if (gBattleAnimArgs[1] == 0xFF) + PlayCry3(species, pan, 9); + else + PlayCry3(species, pan, 7); + + gTasks[taskId].func = sub_8158FF4; + } + else + { + DestroyAnimVisualTask(taskId); + } +} + +static void sub_8158FF4(u8 taskId) +{ + u16 species = gTasks[taskId].data[1]; + s8 pan = gTasks[taskId].data[2]; + + if (gTasks[taskId].data[9] < 2) + { + gTasks[taskId].data[9]++; + } + else + { + if (gTasks[taskId].data[0] == 0xFF) + { + if (!IsCryPlaying()) + { + PlayCry3(species, pan, 10); + DestroyAnimVisualTask(taskId); + } + } + else + { + if (!IsCryPlaying()) + { + PlayCry3(species, pan, 8); + DestroyAnimVisualTask(taskId); + } + } + } +} +// task end + +void sub_8159078(u8 taskId) +{ + if (gTasks[taskId].data[9] < 2) + { + gTasks[taskId].data[9]++; + } + else + { + if (!IsCryPlaying()) + DestroyAnimVisualTask(taskId); + } +} + +// task start +void sub_81590B8(u8 taskId) +{ + u16 species; + s8 pan; + + gTasks[taskId].data[10] = gBattleAnimArgs[0]; + pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + + if (IsContest()) + species = gContestResources->field_18->field_0; + else + species = gAnimBattlerSpecies[gBattleAnimAttacker]; + + gTasks[taskId].data[1] = species; + gTasks[taskId].data[2] = pan; + + if (species != SPECIES_NONE) + gTasks[taskId].func = sub_815913C; + else + DestroyAnimVisualTask(taskId); +} + +static void sub_815913C(u8 taskId) +{ + u16 species = gTasks[taskId].data[1]; + s8 pan = gTasks[taskId].data[2]; + + switch (gTasks[taskId].data[9]) + { + case 2: + PlayCry6(species, pan, 4); + gTasks[taskId].data[9]++; + break; + case 1: + case 3: + case 4: + gTasks[taskId].data[9]++; + break; + case 5: + if (IsCryPlaying()) + break; + case 0: + StopCryAndClearCrySongs(); + gTasks[taskId].data[9]++; + break; + default: + if (gTasks[taskId].data[10] == 0) + PlayCry6(species, pan, 6); + else + PlayCry3(species, pan, 6); + + DestroyAnimVisualTask(taskId); + break; + } +} +// task end + +void sub_8159210(u8 taskId) +{ + u16 songId = gBattleAnimArgs[0]; + s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + + PlaySE1WithPanning(songId, pan); + DestroyAnimVisualTask(taskId); +} + +void sub_8159244(u8 taskId) +{ + u16 songId = gBattleAnimArgs[0]; + s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + + PlaySE2WithPanning(songId, pan); + DestroyAnimVisualTask(taskId); +} + +void sub_8159278(u8 taskId) +{ + s8 targetPan = gBattleAnimArgs[1]; + s8 panIncrement = gBattleAnimArgs[2]; + u16 r9 = gBattleAnimArgs[3]; + s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]); + + targetPan = BattleAnimAdjustPanning(targetPan); + panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); + + gTasks[taskId].data[1] = sourcePan; + gTasks[taskId].data[2] = targetPan; + gTasks[taskId].data[3] = panIncrement; + gTasks[taskId].data[5] = r9; + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] = sourcePan; + + gTasks[taskId].func = sub_8159308; + sub_8159308(taskId); +} + +#ifdef NONMATCHING +void sub_8159308(u8 taskId) +{ + s16 panIncrement = gTasks[taskId].data[3]; + + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5]) + { + gTasks[taskId].data[10] = 0; + + gTasks[taskId].data[11] += panIncrement; + gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]); + } + + gUnknown_02038440 = gTasks[taskId].data[11]; + if (gTasks[taskId].data[11] == gTasks[taskId].data[2]) + DestroyAnimVisualTask(taskId); +} +#else +NAKED +void sub_8159308(u8 taskId) +{ + asm_unified(" push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r5, r0, 0\n\ + ldr r1, =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r4, r0, r1\n\ + ldrh r2, [r4, 0xE]\n\ + ldrh r0, [r4, 0x1C]\n\ + adds r1, r0, 0x1\n\ + strh r1, [r4, 0x1C]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r3, 0x12\n\ + ldrsh r1, [r4, r3]\n\ + cmp r0, r1\n\ + bne _08159342\n\ + movs r0, 0\n\ + strh r0, [r4, 0x1C]\n\ + ldrh r1, [r4, 0x1E]\n\ + adds r0, r2, r1\n\ + strh r0, [r4, 0x1E]\n\ + movs r2, 0x1E\n\ + ldrsh r0, [r4, r2]\n\ + bl KeepPanInRange\n\ + strh r0, [r4, 0x1E]\n\ +_08159342:\n\ + ldr r1, =gUnknown_02038440\n\ + ldrh r0, [r4, 0x1E]\n\ + strb r0, [r1]\n\ + movs r3, 0x1E\n\ + ldrsh r1, [r4, r3]\n\ + movs r2, 0xC\n\ + ldrsh r0, [r4, r2]\n\ + cmp r1, r0\n\ + bne _0815935A\n\ + adds r0, r5, 0\n\ + bl DestroyAnimVisualTask\n\ +_0815935A:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif diff --git a/src/battle_bg.c b/src/battle_bg.c index d4bfd297a..999b64a54 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -18,6 +18,7 @@ #include "text_window.h" #include "menu.h" #include "battle_setup.h" +#include "constants/map_types.h" struct BattleBackground { @@ -31,8 +32,8 @@ struct BattleBackground extern const struct SpriteTemplate gUnknown_0831A9D0; extern const struct SpriteTemplate gUnknown_0831A9E8; extern const struct CompressedSpriteSheet gUnknown_0831AA00; -extern const struct BgTemplate gUnknown_0831AA08[4]; -extern const struct WindowTemplate *gUnknown_0831ABA0[]; +extern const struct BgTemplate gBattleBgTemplates[4]; +extern const struct WindowTemplate *const gBattleWindowTemplates[]; extern const struct BattleBackground gBattleTerrainTable[]; extern u16 gBattle_BG1_X; @@ -42,23 +43,23 @@ extern u16 gBattle_BG2_Y; extern u8 GetCurrentMapBattleScene(void); -void sub_8035658(void) +void BattleInitBgsAndWindows(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_0831AA08, ARRAY_COUNT(gUnknown_0831AA08)); + InitBgsFromTemplates(0, gBattleBgTemplates, ARRAY_COUNT(gBattleBgTemplates)); if (gBattleTypeFlags & BATTLE_TYPE_ARENA) { - gBattleScripting.field_24 = 1; + gBattleScripting.windowsType = 1; SetBgTilemapBuffer(1, gUnknown_02023060); SetBgTilemapBuffer(2, gUnknown_02023060); } else { - gBattleScripting.field_24 = 0; + gBattleScripting.windowsType = 0; } - InitWindows(gUnknown_0831ABA0[gBattleScripting.field_24]); + InitWindows(gBattleWindowTemplates[gBattleScripting.windowsType]); DeactivateAllTextPrinters(); } @@ -66,23 +67,23 @@ void sub_80356D0(void) { DisableInterrupts(INTR_FLAG_HBLANK); EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); - sub_8035658(); + BattleInitBgsAndWindows(); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); } -void ApplyPlayerChosenFrameToBattleMenu(void) +void LoadBattleMenuWindowGfx(void) { - sub_809882C(2, 0x12, 0x10); - sub_809882C(2, 0x22, 0x10); + LoadUserWindowBorderGfx(2, 0x12, 0x10); + LoadUserWindowBorderGfx(2, 0x22, 0x10); LoadCompressedPalette(gUnknown_08D85600, 0x50, 0x20); if (gBattleTypeFlags & BATTLE_TYPE_ARENA) { sub_81978B0(0x70); - copy_textbox_border_tile_patterns_to_vram(0, 0x30, 0x70); + LoadMessageBoxGfx(0, 0x30, 0x70); gPlttBufferUnfaded[0x76] = 0; CpuCopy16(&gPlttBufferUnfaded[0x76], &gPlttBufferFaded[0x76], 2); } @@ -193,12 +194,12 @@ void LoadBattleTextboxAndBackground(void) CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0); CopyBgTilemapBufferToVram(0); LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40); - ApplyPlayerChosenFrameToBattleMenu(); + LoadBattleMenuWindowGfx(); DrawMainBattleBackground(); } -static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY) +static void sub_8035AE4(u8 taskId, u8 battlerId, u8 bgId, u8 destX, u8 destY) { s32 i; u16 var = 0; @@ -208,7 +209,7 @@ static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY) { if (gTasks[taskId].data[5] != 0) { - switch (bank) + switch (battlerId) { case 0: var = 0x3F & gTasks[taskId].data[3]; @@ -226,7 +227,7 @@ static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY) } else { - switch (bank) + switch (battlerId) { case 0: var = 0x3F & gTasks[taskId].data[3]; @@ -253,7 +254,7 @@ static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY) } else { - if (bank == gBattleScripting.multiplayerId) + if (battlerId == gBattleScripting.multiplayerId) var = gTasks[taskId].data[3]; else var = gTasks[taskId].data[4]; @@ -272,79 +273,79 @@ static void sub_8035C4C(void) { if (gBattleOutcome == B_OUTCOME_DREW) { - BattleHandleAddTextPrinter(gText_Draw, 0x15); + BattlePutTextOnWindow(gText_Draw, 0x15); } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { if (gBattleOutcome == B_OUTCOME_WON) { - switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18) + switch (gLinkPlayers[gBattleScripting.multiplayerId].id) { case 0: - BattleHandleAddTextPrinter(gText_Win, 0x16); - BattleHandleAddTextPrinter(gText_Loss, 0x17); + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); break; case 1: - BattleHandleAddTextPrinter(gText_Win, 0x17); - BattleHandleAddTextPrinter(gText_Loss, 0x16); + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); break; case 2: - BattleHandleAddTextPrinter(gText_Win, 0x16); - BattleHandleAddTextPrinter(gText_Loss, 0x17); + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); break; case 3: - BattleHandleAddTextPrinter(gText_Win, 0x17); - BattleHandleAddTextPrinter(gText_Loss, 0x16); + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); break; } } else { - switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18) + switch (gLinkPlayers[gBattleScripting.multiplayerId].id) { case 0: - BattleHandleAddTextPrinter(gText_Win, 0x17); - BattleHandleAddTextPrinter(gText_Loss, 0x16); + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); break; case 1: - BattleHandleAddTextPrinter(gText_Win, 0x16); - BattleHandleAddTextPrinter(gText_Loss, 0x17); + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); break; case 2: - BattleHandleAddTextPrinter(gText_Win, 0x17); - BattleHandleAddTextPrinter(gText_Loss, 0x16); + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); break; case 3: - BattleHandleAddTextPrinter(gText_Win, 0x16); - BattleHandleAddTextPrinter(gText_Loss, 0x17); + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); break; } } } else if (gBattleOutcome == B_OUTCOME_WON) { - if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0) + if (gLinkPlayers[gBattleScripting.multiplayerId].id != 0) { - BattleHandleAddTextPrinter(gText_Win, 0x17); - BattleHandleAddTextPrinter(gText_Loss, 0x16); + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); } else { - BattleHandleAddTextPrinter(gText_Win, 0x16); - BattleHandleAddTextPrinter(gText_Loss, 0x17); + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); } } else { - if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0) + if (gLinkPlayers[gBattleScripting.multiplayerId].id != 0) { - BattleHandleAddTextPrinter(gText_Win, 0x16); - BattleHandleAddTextPrinter(gText_Loss, 0x17); + BattlePutTextOnWindow(gText_Win, 0x16); + BattlePutTextOnWindow(gText_Loss, 0x17); } else { - BattleHandleAddTextPrinter(gText_Win, 0x17); - BattleHandleAddTextPrinter(gText_Loss, 0x16); + BattlePutTextOnWindow(gText_Win, 0x17); + BattlePutTextOnWindow(gText_Loss, 0x16); } } } @@ -365,23 +366,23 @@ void sub_8035D74(u8 taskId) name = gLinkPlayers[i].name; linkPlayer = &gLinkPlayers[i]; - switch (linkPlayer->lp_field_18) + switch (linkPlayer->id) { case 0: - BattleHandleAddTextPrinter(name, 0x11); - sub_8035AE4(taskId, linkPlayer->lp_field_18, 1, 2, 4); + BattlePutTextOnWindow(name, 0x11); + sub_8035AE4(taskId, linkPlayer->id, 1, 2, 4); break; case 1: - BattleHandleAddTextPrinter(name, 0x12); - sub_8035AE4(taskId, linkPlayer->lp_field_18, 2, 2, 4); + BattlePutTextOnWindow(name, 0x12); + sub_8035AE4(taskId, linkPlayer->id, 2, 2, 4); break; case 2: - BattleHandleAddTextPrinter(name, 0x13); - sub_8035AE4(taskId, linkPlayer->lp_field_18, 1, 2, 8); + BattlePutTextOnWindow(name, 0x13); + sub_8035AE4(taskId, linkPlayer->id, 1, 2, 8); break; case 3: - BattleHandleAddTextPrinter(name, 0x14); - sub_8035AE4(taskId, linkPlayer->lp_field_18, 2, 2, 8); + BattlePutTextOnWindow(name, 0x14); + sub_8035AE4(taskId, linkPlayer->id, 2, 2, 8); break; } } @@ -392,14 +393,14 @@ void sub_8035D74(u8 taskId) u8 opponentId = playerId ^ BIT_SIDE; u8 opponentId_copy = opponentId; - if (gLinkPlayers[playerId].lp_field_18 != 0) + if (gLinkPlayers[playerId].id != 0) opponentId = playerId, playerId = opponentId_copy; name = gLinkPlayers[playerId].name; - BattleHandleAddTextPrinter(name, 0xF); + BattlePutTextOnWindow(name, 0xF); name = gLinkPlayers[opponentId].name; - BattleHandleAddTextPrinter(name, 0x10); + BattlePutTextOnWindow(name, 0x10); sub_8035AE4(taskId, playerId, 1, 2, 7); sub_8035AE4(taskId, opponentId, 2, 2, 7); @@ -457,7 +458,7 @@ void sub_8035D74(u8 taskId) } } -void LoadBattleEntryBackground(void) +void DrawBattleEntryBackground(void) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) { @@ -478,7 +479,7 @@ void LoadBattleEntryBackground(void) } else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER)) { - if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == STEVEN_PARTNER_ID) + if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000)); LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000)); @@ -740,7 +741,7 @@ bool8 LoadChosenBattleElement(u8 caseId) } break; case 6: - ApplyPlayerChosenFrameToBattleMenu(); + LoadBattleMenuWindowGfx(); break; default: ret = TRUE; diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index a4aac55e2..d786dacd1 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -34,7 +34,6 @@ extern struct UnusedControllerStruct gUnknown_02022D0C; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); extern void sub_81851A8(u8 *); extern u16 sub_8068B48(void); extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); @@ -89,8 +88,8 @@ static void LinkOpponentHandleFaintingCry(void); static void LinkOpponentHandleIntroSlide(void); static void LinkOpponentHandleIntroTrainerBallThrow(void); static void LinkOpponentHandleDrawPartyStatusSummary(void); -static void LinkOpponentHandleCmd49(void); -static void LinkOpponentHandleCmd50(void); +static void LinkOpponentHandleHidePartyStatusSummary(void); +static void LinkOpponentHandleEndBounceEffect(void); static void LinkOpponentHandleSpriteInvisibility(void); static void LinkOpponentHandleBattleAnimation(void); static void LinkOpponentHandleLinkStandbyMsg(void); @@ -161,8 +160,8 @@ static void (*const sLinkOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkOpponentHandleIntroSlide, LinkOpponentHandleIntroTrainerBallThrow, LinkOpponentHandleDrawPartyStatusSummary, - LinkOpponentHandleCmd49, - LinkOpponentHandleCmd50, + LinkOpponentHandleHidePartyStatusSummary, + LinkOpponentHandleEndBounceEffect, LinkOpponentHandleSpriteInvisibility, LinkOpponentHandleBattleAnimation, LinkOpponentHandleLinkStandbyMsg, @@ -191,7 +190,7 @@ static void LinkOpponentBufferRunCommand(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) LinkOpponentBufferExecCompleted(); @@ -395,7 +394,7 @@ static void sub_8064B04(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1135,9 +1134,9 @@ static void LinkOpponentHandleLoadMonSprite(void) u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_806A068(species, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), sub_80A82E4(gActiveBattler)); @@ -1168,10 +1167,10 @@ static void sub_8066494(u8 battlerId, bool8 dontClearSubstituteBit) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( - &gUnknown_0202499C, + &gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1302,8 +1301,8 @@ static void LinkOpponentHandleDrawTrainerPic(void) } DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, sub_80A82E4(gActiveBattler)); @@ -1314,7 +1313,7 @@ static void LinkOpponentHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void LinkOpponentHandleTrainerSlide(void) @@ -1327,8 +1326,8 @@ static void LinkOpponentHandleTrainerSlide(void) trainerPicId = GetFrontierTrainerFrontSpriteId(gTrainerBattleOpponent_B); DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E); gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 96; gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.x += 32; @@ -1366,7 +1365,7 @@ static void LinkOpponentHandleFaintAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_OPPONENT); - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039934; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; gBattlerControllerFuncs[gActiveBattler] = sub_8064C14; } } @@ -1475,7 +1474,7 @@ static void LinkOpponentHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; BattleTv_SetDataBasedOnString(*stringId); } @@ -1716,8 +1715,8 @@ static void LinkOpponentHandleIntroTrainerBallThrow(void) taskId = CreateTask(sub_8067618, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_28; @@ -1762,7 +1761,7 @@ static void LinkOpponentHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; if (gBattleBufferA[gActiveBattler][2] != 0) { @@ -1796,14 +1795,14 @@ static void sub_806782C(void) } } -static void LinkOpponentHandleCmd49(void) +static void LinkOpponentHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; LinkOpponentBufferExecCompleted(); } -static void LinkOpponentHandleCmd50(void) +static void LinkOpponentHandleEndBounceEffect(void) { LinkOpponentBufferExecCompleted(); } @@ -1854,7 +1853,7 @@ static void LinkOpponentHandleCmd55(void) else gBattleOutcome = gBattleBufferA[gActiveBattler][1] ^ B_OUTCOME_DREW; - gSaveBlock2Ptr->field_CA9_b = gBattleBufferA[gActiveBattler][2]; + gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkOpponentBufferExecCompleted(); diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index d742d5df2..9867c14e4 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -12,6 +12,7 @@ #include "util.h" #include "main.h" #include "constants/songs.h" +#include "constants/trainers.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -33,7 +34,6 @@ extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); extern void sub_81851A8(u8 *); extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); @@ -87,8 +87,8 @@ static void LinkPartnerHandleFaintingCry(void); static void LinkPartnerHandleIntroSlide(void); static void LinkPartnerHandleIntroTrainerBallThrow(void); static void LinkPartnerHandleDrawPartyStatusSummary(void); -static void LinkPartnerHandleCmd49(void); -static void LinkPartnerHandleCmd50(void); +static void LinkPartnerHandleHidePartyStatusSummary(void); +static void LinkPartnerHandleEndBounceEffect(void); static void LinkPartnerHandleSpriteInvisibility(void); static void LinkPartnerHandleBattleAnimation(void); static void LinkPartnerHandleLinkStandbyMsg(void); @@ -158,8 +158,8 @@ static void (*const sLinkPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = LinkPartnerHandleIntroSlide, LinkPartnerHandleIntroTrainerBallThrow, LinkPartnerHandleDrawPartyStatusSummary, - LinkPartnerHandleCmd49, - LinkPartnerHandleCmd50, + LinkPartnerHandleHidePartyStatusSummary, + LinkPartnerHandleEndBounceEffect, LinkPartnerHandleSpriteInvisibility, LinkPartnerHandleBattleAnimation, LinkPartnerHandleLinkStandbyMsg, @@ -188,7 +188,7 @@ static void LinkPartnerBufferRunCommand(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) LinkPartnerBufferExecCompleted(); @@ -279,7 +279,7 @@ static void sub_814B290(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1023,9 +1023,9 @@ static void LinkPartnerHandleLoadMonSprite(void) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - sub_806A068(species, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), sub_80A82E4(gActiveBattler)); @@ -1053,10 +1053,10 @@ static void sub_814CC98(u8 battlerId, bool8 dontClearSubstituteBit) gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( - &gUnknown_0202499C, + &gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1133,12 +1133,12 @@ static void LinkPartnerHandleDrawTrainerPic(void) if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_FIRE_RED || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_LEAF_GREEN) { - trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + BACK_PIC_RED; + trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RED; } else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE) { - trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + BACK_PIC_RS_BRENDAN; + trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; } else { @@ -1146,15 +1146,15 @@ static void LinkPartnerHandleDrawTrainerPic(void) } DecompressTrainerBackPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, sub_80A82E4(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; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void LinkPartnerHandleTrainerSlide(void) @@ -1299,7 +1299,7 @@ static void LinkPartnerHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; BattleTv_SetDataBasedOnString(*stringId); } @@ -1545,12 +1545,12 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void) if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_FIRE_RED || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_LEAF_GREEN) { - trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + BACK_PIC_RED; + trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RED; } else if ((gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].version & 0xFF) == VERSION_SAPPHIRE) { - trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + BACK_PIC_RS_BRENDAN; + trainerPicId = gLinkPlayers[GetBattlerMultiplayerId(gActiveBattler)].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; } else { @@ -1564,8 +1564,8 @@ static void LinkPartnerHandleIntroTrainerBallThrow(void) taskId = CreateTask(sub_814DCCC, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_112; @@ -1611,7 +1611,7 @@ static void LinkPartnerHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + 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; @@ -1631,14 +1631,14 @@ static void sub_814DE9C(void) } } -static void LinkPartnerHandleCmd49(void) +static void LinkPartnerHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; LinkPartnerBufferExecCompleted(); } -static void LinkPartnerHandleCmd50(void) +static void LinkPartnerHandleEndBounceEffect(void) { LinkPartnerBufferExecCompleted(); } @@ -1684,7 +1684,7 @@ static void LinkPartnerHandleCmd55(void) { sub_81851A8(&gBattleBufferA[gActiveBattler][4]); gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - gSaveBlock2Ptr->field_CA9_b = gBattleBufferA[gActiveBattler][2]; + gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); LinkPartnerBufferExecCompleted(); diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 64cf16b86..1eaa9da18 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -16,6 +16,7 @@ #include "constants/songs.h" #include "sound.h" #include "constants/moves.h" +#include "constants/trainers.h" #include "window.h" #include "m4a.h" #include "palette.h" @@ -37,9 +38,8 @@ extern struct UnusedControllerStruct gUnknown_02022D0C; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); extern void sub_81A57E4(u8 battlerId, u16 stringId); -extern u8 sub_81A4CB0(void); +extern u8 GetFrontierBrainTrainerPicIndex(void); extern u8 sub_81D5588(u16 trainerId); extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); extern u8 GetEreaderTrainerFrontSpriteId(void); @@ -94,8 +94,8 @@ static void OpponentHandleFaintingCry(void); static void OpponentHandleIntroSlide(void); static void OpponentHandleIntroTrainerBallThrow(void); static void OpponentHandleDrawPartyStatusSummary(void); -static void OpponentHandleCmd49(void); -static void OpponentHandleCmd50(void); +static void OpponentHandleHidePartyStatusSummary(void); +static void OpponentHandleEndBounceEffect(void); static void OpponentHandleSpriteInvisibility(void); static void OpponentHandleBattleAnimation(void); static void OpponentHandleLinkStandbyMsg(void); @@ -166,8 +166,8 @@ static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = OpponentHandleIntroSlide, OpponentHandleIntroTrainerBallThrow, OpponentHandleDrawPartyStatusSummary, - OpponentHandleCmd49, - OpponentHandleCmd50, + OpponentHandleHidePartyStatusSummary, + OpponentHandleEndBounceEffect, OpponentHandleSpriteInvisibility, OpponentHandleBattleAnimation, OpponentHandleLinkStandbyMsg, @@ -199,7 +199,7 @@ static void OpponentBufferRunCommand(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) OpponentBufferExecCompleted(); @@ -391,7 +391,7 @@ static void sub_805F994(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); if (hpValue != -1) { @@ -1127,9 +1127,9 @@ static void OpponentHandleLoadMonSprite(void) u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_806A068(species, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), sub_80A82E4(gActiveBattler)); @@ -1162,9 +1162,9 @@ static void sub_80613DC(u8 battlerId, bool8 dontClearSubstituteBit) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1232,9 +1232,9 @@ static void OpponentHandleDrawTrainerPic(void) { trainerPicId = GetSecretBaseTrainerPicIndex(); } - else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE) + else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) { - trainerPicId = sub_81A4CB0(); + trainerPicId = GetFrontierBrainTrainerPicIndex(); } else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) { @@ -1293,8 +1293,8 @@ static void OpponentHandleDrawTrainerPic(void) } DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, sub_80A82E4(gActiveBattler)); @@ -1305,7 +1305,7 @@ static void OpponentHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void OpponentHandleTrainerSlide(void) @@ -1316,9 +1316,9 @@ static void OpponentHandleTrainerSlide(void) { trainerPicId = GetSecretBaseTrainerPicIndex(); } - else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE) + else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) { - trainerPicId = sub_81A4CB0(); + trainerPicId = GetFrontierBrainTrainerPicIndex(); } else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) { @@ -1365,8 +1365,8 @@ static void OpponentHandleTrainerSlide(void) } DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 176, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, 0x1E); gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 96; gSprites[gBattlerSpriteIds[gActiveBattler]].pos1.x += 32; @@ -1403,7 +1403,7 @@ static void OpponentHandleFaintAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_OPPONENT); - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039934; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; gBattlerControllerFuncs[gActiveBattler] = sub_805FAC4; } } @@ -1511,7 +1511,7 @@ static void OpponentHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; sub_81A57E4(gActiveBattler, *stringId); } @@ -1865,8 +1865,8 @@ static void OpponentHandleIntroTrainerBallThrow(void) taskId = CreateTask(sub_8062828, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_26; @@ -1916,7 +1916,7 @@ static void OpponentHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; if (gBattleBufferA[gActiveBattler][2] != 0) { @@ -1950,14 +1950,14 @@ static void sub_8062A2C(void) } } -static void OpponentHandleCmd49(void) +static void OpponentHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; OpponentBufferExecCompleted(); } -static void OpponentHandleCmd50(void) +static void OpponentHandleEndBounceEffect(void) { OpponentBufferExecCompleted(); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e0694029a..6ab19e368 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -15,6 +15,7 @@ #include "constants/songs.h" #include "sound.h" #include "constants/moves.h" +#include "constants/trainers.h" #include "window.h" #include "m4a.h" #include "palette.h" @@ -29,6 +30,7 @@ #include "battle_setup.h" #include "item_use.h" #include "recorded_battle.h" +#include "party_menu.h" extern u8 gUnknown_0203CEE8; extern u8 gUnknown_0203CEE9; @@ -38,15 +40,13 @@ extern u16 gBattle_BG0_Y; extern s32 gUnknown_0203CD70; extern struct UnusedControllerStruct gUnknown_02022D0C; extern struct MusicPlayerInfo gMPlayInfo_BGM; -extern struct SpriteTemplate gUnknown_0202499C; +extern struct SpriteTemplate gMultiuseSpriteTemplate; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_81B89AC(u8 arg0); extern void sub_81AABB0(void); -extern void sub_806A068(u16, u8); extern void sub_81A57E4(u8 battlerId, u16 stringId); extern void sub_81851A8(u8 *); @@ -100,8 +100,8 @@ static void PlayerHandleFaintingCry(void); static void PlayerHandleIntroSlide(void); static void PlayerHandleIntroTrainerBallThrow(void); static void PlayerHandleDrawPartyStatusSummary(void); -static void PlayerHandleCmd49(void); -static void PlayerHandleCmd50(void); +static void PlayerHandleHidePartyStatusSummary(void); +static void PlayerHandleEndBounceEffect(void); static void PlayerHandleSpriteInvisibility(void); static void PlayerHandleBattleAnimation(void); static void PlayerHandleLinkStandbyMsg(void); @@ -120,13 +120,13 @@ static void MoveSelectionDisplayMoveType(void); static void MoveSelectionDisplayMoveNames(void); static void HandleMoveSwitchting(void); static void sub_8058FC0(void); -static void sub_8059828(void); +static void WaitForMonSelection(void); static void CompleteWhenChoseItem(void); -static void sub_8059544(u8 taskId); +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 sub_80595A4(u8 taskId); +static void Task_UpdateLvlInHealthbox(u8 taskId); static void PrintLinkStandbyMsg(void); static u32 CopyPlayerMonData(u8 monId, u8 *dst); static void SetPlayerMonData(u8 monId); @@ -187,8 +187,8 @@ static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerHandleIntroSlide, PlayerHandleIntroTrainerBallThrow, PlayerHandleDrawPartyStatusSummary, - PlayerHandleCmd49, - PlayerHandleCmd50, + PlayerHandleHidePartyStatusSummary, + PlayerHandleEndBounceEffect, PlayerHandleSpriteInvisibility, PlayerHandleBattleAnimation, PlayerHandleLinkStandbyMsg, @@ -250,10 +250,10 @@ static void HandleInputChooseAction(void) { u16 itemId = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); - dp11b_obj_instanciate(gActiveBattler, 1, 7, 1); - dp11b_obj_instanciate(gActiveBattler, 0, 7, 1); + DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); + DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); - if (gMain.newAndRepeatedKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == 2) + if (gMain.newAndRepeatedKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) gPlayerDpadHoldFrames++; else gPlayerDpadHoldFrames = 0; @@ -347,8 +347,8 @@ static void HandleInputChooseAction(void) static void sub_80577F0(void) // unused { - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); + EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); + EndBounceEffect(gActiveBattler, BOUNCE_MON); gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget; } @@ -358,7 +358,7 @@ static void HandleInputChooseTarget(void) u8 identities[4]; memcpy(identities, sTargetIdentities, ARRAY_COUNT(sTargetIdentities)); - dp11b_obj_instanciate(gMultiUsePlayerCursor, 1, 0xF, 1); + DoBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX, 15, 1); // what a weird loop i = 0; @@ -367,7 +367,7 @@ static void HandleInputChooseTarget(void) do { if (i != gMultiUsePlayerCursor) - dp11b_obj_free(i, 1); + EndBounceEffect(i, BOUNCE_HEALTHBOX); i++; } while (i < gBattlersCount); } @@ -382,7 +382,7 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; BtlController_EmitTwoReturnValues(1, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); - dp11b_obj_free(gMultiUsePlayerCursor, 1); + EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } else if (gMain.newKeys & B_BUTTON || gPlayerDpadHoldFrames > 59) @@ -390,9 +390,9 @@ static void HandleInputChooseTarget(void) PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = sub_8039B2C; gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseMove; - dp11b_obj_instanciate(gActiveBattler, 1, 7, 1); - dp11b_obj_instanciate(gActiveBattler, 0, 7, 1); - dp11b_obj_free(gMultiUsePlayerCursor, 1); + DoBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX, 7, 1); + DoBounceEffect(gActiveBattler, BOUNCE_MON, 7, 1); + EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); } else if (gMain.newKeys & (DPAD_LEFT | DPAD_UP)) { @@ -485,7 +485,7 @@ static void HandleInputChooseMove(void) bool32 canSelectTarget = FALSE; struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]); - if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == 2) + if (gMain.heldKeys & DPAD_ANY && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_L_EQUALS_A) gPlayerDpadHoldFrames++; else gPlayerDpadHoldFrames = 0; @@ -620,7 +620,7 @@ static void HandleInputChooseMove(void) gMultiUsePlayerCursor = gMoveSelectionCursor[gActiveBattler] + 1; MoveSelectionCreateCursorAt(gMultiUsePlayerCursor, 27); - BattleHandleAddTextPrinter(gText_BattleSwitchWhich, 0xB); + BattlePutTextOnWindow(gText_BattleSwitchWhich, 0xB); gBattlerControllerFuncs[gActiveBattler] = HandleMoveSwitchting; } } @@ -916,7 +916,7 @@ void sub_80587B0(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) PlayerBufferExecCompleted(); @@ -1120,7 +1120,7 @@ void c3_0802FDF4(u8 taskId) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1143,16 +1143,16 @@ static void CompleteOnInactiveTextPrinter(void) #define tExpTask_monId data[0] #define tExpTask_gainedExp data[1] -#define tExpTask_bank data[2] +#define tExpTask_battler data[2] #define tExpTask_frames data[10] static void Task_GiveExpToMon(u8 taskId) { u32 monId = (u8)(gTasks[taskId].tExpTask_monId); - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battlerId = gTasks[taskId].tExpTask_battler; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; - if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // give exp without the expbar + if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -1162,19 +1162,19 @@ static void Task_GiveExpToMon(u8 taskId) if (currExp + gainedExp >= nextLvlExp) { - u8 savedActiveBank; + u8 savedActiveBattler; SetMonData(mon, MON_DATA_EXP, &nextLvlExp); CalculateMonStats(mon); gainedExp -= nextLvlExp - currExp; - savedActiveBank = gActiveBattler; + savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); - gActiveBattler = savedActiveBank; + BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); + gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[battlerId ^ BIT_FLANK])) - gTasks[taskId].func = sub_8059544; + gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } @@ -1196,7 +1196,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; s32 gainedExp = gTasks[taskId].tExpTask_gainedExp; - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battlerId = gTasks[taskId].tExpTask_battler; struct Pokemon *mon = &gPlayerParty[monIndex]; u8 level = GetMonData(mon, MON_DATA_LEVEL); u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -1221,12 +1221,12 @@ static void sub_8059400(u8 taskId) { u8 monId = gTasks[taskId].tExpTask_monId; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; - u8 battlerId = gTasks[taskId].tExpTask_bank; - s16 r4; + u8 battlerId = gTasks[taskId].tExpTask_battler; + s16 newExpPoints; - r4 = sub_8074AA0(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); + newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); - if (r4 == -1) + if (newExpPoints == -1) // The bar has been filled with given exp points. { u8 level; s32 currExp; @@ -1241,16 +1241,16 @@ static void sub_8059400(u8 taskId) if (currExp + gainedExp >= expOnNextLvl) { - u8 savedActiveBank; + u8 savedActiveBattler; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &expOnNextLvl); CalculateMonStats(&gPlayerParty[monId]); gainedExp -= expOnNextLvl - currExp; - savedActiveBank = gActiveBattler; + savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); - gActiveBattler = savedActiveBank; - gTasks[taskId].func = sub_8059544; + BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); + gActiveBattler = savedActiveBattler; + gTasks[taskId].func = Task_LaunchLvlUpAnim; } else { @@ -1263,27 +1263,27 @@ static void sub_8059400(u8 taskId) } } -static void sub_8059544(u8 taskId) +static void Task_LaunchLvlUpAnim(u8 taskId) { - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battlerId = gTasks[taskId].tExpTask_battler; u8 monIndex = gTasks[taskId].tExpTask_monId; if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) battlerId ^= BIT_FLANK; InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); - gTasks[taskId].func = sub_80595A4; + gTasks[taskId].func = Task_UpdateLvlInHealthbox; } -static void sub_80595A4(u8 taskId) +static void Task_UpdateLvlInHealthbox(u8 taskId) { - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battlerId = gTasks[taskId].tExpTask_battler; if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive) { u8 monIndex = gTasks[taskId].tExpTask_monId; - GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value + GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[battlerId ^ BIT_FLANK]) UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId ^ BIT_FLANK], &gPlayerParty[monIndex], HEALTHBOX_ALL); @@ -1300,8 +1300,8 @@ static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) u8 battlerId; monIndex = gTasks[taskId].tExpTask_monId; - GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value - battlerId = gTasks[taskId].tExpTask_bank; + GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. + battlerId = gTasks[taskId].tExpTask_battler; gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } @@ -1337,21 +1337,21 @@ static void CompleteOnInactiveTextPrinter2(void) PlayerBufferExecCompleted(); } -static void sub_80597CC(void) +static void OpenPartyMenuToChooseMon(void) { if (!gPaletteFade.active) { - u8 r4; + u8 caseId; - gBattlerControllerFuncs[gActiveBattler] = sub_8059828; - r4 = gTasks[gUnknown_03005D7C[gActiveBattler]].data[0]; + gBattlerControllerFuncs[gActiveBattler] = WaitForMonSelection; + caseId = gTasks[gUnknown_03005D7C[gActiveBattler]].data[0]; DestroyTask(gUnknown_03005D7C[gActiveBattler]); FreeAllWindowBuffers(); - sub_81B89AC(r4); + OpenPartyMenuInBattle(caseId); } } -static void sub_8059828(void) +static void WaitForMonSelection(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { @@ -1458,7 +1458,7 @@ static void MoveSelectionDisplayMoveNames(void) { MoveSelectionDestroyCursorAt(i); StringCopy(gDisplayedStringBattle, gMoveNames[moveInfo->moves[i]]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, i + 3); + BattlePutTextOnWindow(gDisplayedStringBattle, i + 3); if (moveInfo->moves[i] != MOVE_NONE) gNumberOfMovesToChoose++; } @@ -1467,7 +1467,7 @@ static void MoveSelectionDisplayMoveNames(void) static void MoveSelectionDisplayPpString(void) { StringCopy(gDisplayedStringBattle, gText_MoveInterfacePP); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 7); + BattlePutTextOnWindow(gDisplayedStringBattle, 7); } static void MoveSelectionDisplayPpNumber(void) @@ -1485,7 +1485,7 @@ static void MoveSelectionDisplayPpNumber(void) txtPtr++; ConvertIntToDecimalStringN(txtPtr, moveInfo->maxPp[gMoveSelectionCursor[gActiveBattler]], STR_CONV_MODE_RIGHT_ALIGN, 2); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 9); + BattlePutTextOnWindow(gDisplayedStringBattle, 9); } static void MoveSelectionDisplayMoveType(void) @@ -1502,7 +1502,7 @@ static void MoveSelectionDisplayMoveType(void) txtPtr++; StringCopy(txtPtr, gTypeNames[gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].type]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 10); + BattlePutTextOnWindow(gDisplayedStringBattle, 10); } static void MoveSelectionCreateCursorAt(u8 cursorPosition, u8 arg1) @@ -1573,7 +1573,7 @@ static void PrintLinkStandbyMsg(void) { gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - BattleHandleAddTextPrinter(gText_LinkStandby, 0); + BattlePutTextOnWindow(gText_LinkStandby, 0); } } @@ -2199,10 +2199,10 @@ static void sub_805B258(u8 battlerId, bool8 dontClearSubstituteBit) gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( - &gUnknown_0202499C, + &gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -2259,9 +2259,9 @@ static void DoSwitchOutAnimation(void) } } -// 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 +// 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. static void PlayerHandleDrawTrainerPic(void) { s16 xPos, yPos; @@ -2272,16 +2272,16 @@ static void PlayerHandleDrawTrainerPic(void) if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_FIRE_RED || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_LEAF_GREEN) { - trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RED; + trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RED; } else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE) { - trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RS_BRENDAN; + trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; } else { - trainerPicId = gLinkPlayers[GetMultiplayerId()].gender; + trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_BRENDAN; } } else @@ -2291,12 +2291,12 @@ static void PlayerHandleDrawTrainerPic(void) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != 0) // second mon + if ((GetBattlerPosition(gActiveBattler) & BIT_FLANK) != B_FLANK_LEFT) // Second mon, on the right. xPos = 90; - else // first mon + else // First mon, on the left. xPos = 32; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != STEVEN_PARTNER_ID) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) { xPos = 90; yPos = (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 80; @@ -2314,12 +2314,12 @@ static void PlayerHandleDrawTrainerPic(void) } // Use front pic table for any tag battles unless your partner is Steven. - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != STEVEN_PARTNER_ID) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) { trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender); DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A1C0(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; @@ -2329,12 +2329,12 @@ static void PlayerHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineMode = 0; gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; } - // use the back pic in any other scenario + // Use the back pic in any other scenario. else { DecompressTrainerBackPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; @@ -2342,7 +2342,7 @@ static void PlayerHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; } - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void PlayerHandleTrainerSlide(void) @@ -2354,26 +2354,26 @@ static void PlayerHandleTrainerSlide(void) if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_FIRE_RED || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_LEAF_GREEN) { - trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RED; + trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RED; } else if ((gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_RUBY || (gLinkPlayers[GetMultiplayerId()].version & 0xFF) == VERSION_SAPPHIRE) { - trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + BACK_PIC_RS_BRENDAN; + trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_RUBY_SAPPHIRE_BRENDAN; } else { - trainerPicId = gLinkPlayers[GetMultiplayerId()].gender; + trainerPicId = gLinkPlayers[GetMultiplayerId()].gender + TRAINER_BACK_PIC_BRENDAN; } } else { - trainerPicId = gSaveBlock2Ptr->playerGender; + trainerPicId = gSaveBlock2Ptr->playerGender + TRAINER_BACK_PIC_BRENDAN; } DecompressTrainerBackPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, 80, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, 30); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80, 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -96; @@ -2420,7 +2420,7 @@ static void PlayerHandleFaintAnimation(void) static void PlayerHandlePaletteFade(void) { - BeginNormalPaletteFade(-1, 2, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); PlayerBufferExecCompleted(); } @@ -2466,7 +2466,7 @@ static void PlayerHandleMoveAnimation(void) gWeatherMoveAnim = gBattleBufferA[gActiveBattler][12] | (gBattleBufferA[gActiveBattler][13] << 8); gAnimDisableStructPtr = (struct DisableStruct *)&gBattleBufferA[gActiveBattler][16]; gTransformedPersonalities[gActiveBattler] = gAnimDisableStructPtr->transformedMonPersonality; - if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // always returns FALSE + if (IsMoveWithoutAnimation(move, gAnimMoveTurn)) // Always returns FALSE. { PlayerBufferExecCompleted(); } @@ -2536,7 +2536,7 @@ static void PlayerHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2; BattleTv_SetDataBasedOnString(*stringId); sub_81A57E4(gActiveBattler, *stringId); @@ -2566,14 +2566,14 @@ static void PlayerHandleChooseAction(void) gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; BattleTv_ClearExplosionFaintCause(); - BattleHandleAddTextPrinter(gText_BattleMenu, 2); + BattlePutTextOnWindow(gText_BattleMenu, 2); for (i = 0; i < 4; i++) ActionSelectionDestroyCursorAt(i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 1); + BattlePutTextOnWindow(gDisplayedStringBattle, 1); } static void PlayerHandleUnknownYesNoBox(void) @@ -2581,7 +2581,7 @@ static void PlayerHandleUnknownYesNoBox(void) if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 12); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 12); gMultiUsePlayerCursor = 1; BattleCreateYesNoCursorAt(1); gBattlerControllerFuncs[gActiveBattler] = PlayerHandleUnknownYesNoInput; @@ -2640,7 +2640,7 @@ static void PlayerHandleChooseItem(void) { s32 i; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gBattlerControllerFuncs[gActiveBattler] = OpenBagAndChooseItem; gBattlerInMenuId = gActiveBattler; @@ -2655,7 +2655,7 @@ static void PlayerHandleChoosePokemon(void) for (i = 0; i < 3; i++) gUnknown_0203CF00[i] = gBattleBufferA[gActiveBattler][4 + i]; - if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != 2) + if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_CANT_SWITCH) { BtlController_EmitChosenMonReturnValue(1, gBattlerPartyIndexes[gActiveBattler] + 1, gUnknown_0203CF00); PlayerBufferExecCompleted(); @@ -2664,11 +2664,11 @@ static void PlayerHandleChoosePokemon(void) { gUnknown_03005D7C[gActiveBattler] = CreateTask(TaskDummy, 0xFF); gTasks[gUnknown_03005D7C[gActiveBattler]].data[0] = gBattleBufferA[gActiveBattler][1] & 0xF; - *(&gBattleStruct->field_49) = gBattleBufferA[gActiveBattler][1] >> 4; + *(&gBattleStruct->battlerPreventingSwitchout) = gBattleBufferA[gActiveBattler][1] >> 4; *(&gBattleStruct->field_8B) = gBattleBufferA[gActiveBattler][2]; - *(&gBattleStruct->field_B0) = gBattleBufferA[gActiveBattler][3]; - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gBattlerControllerFuncs[gActiveBattler] = sub_80597CC; + *(&gBattleStruct->abilityPreventingSwitchout) = gBattleBufferA[gActiveBattler][3]; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gBattlerControllerFuncs[gActiveBattler] = OpenPartyMenuToChooseMon; gBattlerInMenuId = gActiveBattler; } } @@ -2676,7 +2676,7 @@ static void PlayerHandleChoosePokemon(void) static void PlayerHandleCmd23(void) { BattleStopLowHpSound(); - BeginNormalPaletteFade(-1, 2, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); PlayerBufferExecCompleted(); } @@ -2722,19 +2722,19 @@ static void PlayerHandleExpUpdate(void) u8 taskId; LoadBattleBarGfx(1); - GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // unused return value - expPointsToGive = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8); + GetMonData(&gPlayerParty[monId], MON_DATA_SPECIES); // Unused return value. + expPointsToGive = T1_READ_16(&gBattleBufferA[gActiveBattler][2]); taskId = CreateTask(Task_GiveExpToMon, 10); gTasks[taskId].tExpTask_monId = monId; gTasks[taskId].tExpTask_gainedExp = expPointsToGive; - gTasks[taskId].tExpTask_bank = gActiveBattler; + gTasks[taskId].tExpTask_battler = gActiveBattler; gBattlerControllerFuncs[gActiveBattler] = nullsub_21; } } #undef tExpTask_monId #undef tExpTask_gainedExp -#undef tExpTask_bank +#undef tExpTask_battler #undef tExpTask_frames static void PlayerHandleStatusIconUpdate(void) @@ -2945,8 +2945,8 @@ static void PlayerHandleIntroTrainerBallThrow(void) taskId = CreateTask(task05_08033660, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_21; @@ -2971,7 +2971,7 @@ static void task05_08033660(u8 taskId) } else { - u8 savedActiveBank = gActiveBattler; + u8 savedActiveBattler = gActiveBattler; gActiveBattler = gTasks[taskId].data[0]; if (!IsDoubleBattle() || (gBattleTypeFlags & BATTLE_TYPE_MULTI)) @@ -2990,7 +2990,7 @@ static void task05_08033660(u8 taskId) gActiveBattler ^= BIT_FLANK; } gBattlerControllerFuncs[gActiveBattler] = sub_8058B40; - gActiveBattler = savedActiveBank; + gActiveBattler = savedActiveBattler; DestroyTask(taskId); } } @@ -3003,7 +3003,7 @@ static void PlayerHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + 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; @@ -3023,17 +3023,17 @@ static void sub_805CE38(void) } } -static void PlayerHandleCmd49(void) +static void PlayerHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; PlayerBufferExecCompleted(); } -static void PlayerHandleCmd50(void) +static void PlayerHandleEndBounceEffect(void) { - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); + EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); + EndBounceEffect(gActiveBattler, BOUNCE_MON); PlayerBufferExecCompleted(); } @@ -3072,8 +3072,8 @@ static void PlayerHandleLinkStandbyMsg(void) PrintLinkStandbyMsg(); // fall through case 1: - dp11b_obj_free(gActiveBattler, 1); - dp11b_obj_free(gActiveBattler, 0); + EndBounceEffect(gActiveBattler, BOUNCE_HEALTHBOX); + EndBounceEffect(gActiveBattler, BOUNCE_MON); break; case 2: PrintLinkStandbyMsg(); @@ -3104,7 +3104,7 @@ static void PlayerHandleCmd55(void) { sub_81851A8(&gBattleBufferA[gActiveBattler][4]); gBattleOutcome = gBattleBufferA[gActiveBattler][1]; - gSaveBlock2Ptr->field_CA9_b = gBattleBufferA[gActiveBattler][2]; + gSaveBlock2Ptr->frontier.field_CA9_b = gBattleBufferA[gActiveBattler][2]; FadeOutMapMusic(5); BeginFastPaletteFade(3); PlayerBufferExecCompleted(); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index f18f582f7..601b8dcc1 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -11,6 +11,7 @@ #include "util.h" #include "main.h" #include "constants/songs.h" +#include "constants/trainers.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -34,7 +35,7 @@ extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern void sub_81358F4(void); extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); +extern void SetMultiuseSpriteTemplateToPokemon(u16, u8); extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); // this file's functions @@ -87,8 +88,8 @@ static void PlayerPartnerHandleFaintingCry(void); static void PlayerPartnerHandleIntroSlide(void); static void PlayerPartnerHandleIntroTrainerBallThrow(void); static void PlayerPartnerHandleDrawPartyStatusSummary(void); -static void PlayerPartnerHandleCmd49(void); -static void PlayerPartnerHandleCmd50(void); +static void PlayerPartnerHandleHidePartyStatusSummary(void); +static void PlayerPartnerHandleEndBounceEffect(void); static void PlayerPartnerHandleSpriteInvisibility(void); static void PlayerPartnerHandleBattleAnimation(void); static void PlayerPartnerHandleLinkStandbyMsg(void); @@ -164,8 +165,8 @@ static void (*const sPlayerPartnerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = PlayerPartnerHandleIntroSlide, PlayerPartnerHandleIntroTrainerBallThrow, PlayerPartnerHandleDrawPartyStatusSummary, - PlayerPartnerHandleCmd49, - PlayerPartnerHandleCmd50, + PlayerPartnerHandleHidePartyStatusSummary, + PlayerPartnerHandleEndBounceEffect, PlayerPartnerHandleSpriteInvisibility, PlayerPartnerHandleBattleAnimation, PlayerPartnerHandleLinkStandbyMsg, @@ -203,7 +204,7 @@ static void PlayerPartnerBufferRunCommand(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) PlayerPartnerBufferExecCompleted(); @@ -294,7 +295,7 @@ static void sub_81BB1D4(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -344,7 +345,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); + BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; if (IsDoubleBattle() == TRUE @@ -399,7 +400,7 @@ static void sub_81BB4E4(u8 taskId) u8 battlerId = gTasks[taskId].tExpTask_bank; s16 r4; - r4 = sub_8074AA0(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); + r4 = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); if (r4 == -1) { @@ -423,7 +424,7 @@ static void sub_81BB4E4(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELLED_UP, gainedExp); + BtlController_EmitTwoReturnValues(1, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; gTasks[taskId].func = sub_81BB628; } @@ -1210,9 +1211,9 @@ static void PlayerPartnerHandleLoadMonSprite(void) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - sub_806A068(species, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), sub_80A82E4(gActiveBattler)); @@ -1240,10 +1241,10 @@ static void sub_81BD0E4(u8 battlerId, bool8 dontClearSubstituteBit) gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( - &gUnknown_0202499C, + &gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1308,9 +1309,9 @@ static void PlayerPartnerHandleDrawTrainerPic(void) s16 xPos, yPos; u32 trainerPicId; - if (gPartnerTrainerId == STEVEN_PARTNER_ID) + if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { - trainerPicId = BACK_PIC_STEVEN; + trainerPicId = TRAINER_BACK_PIC_STEVEN; xPos = 90; yPos = (8 - gTrainerBackPicCoords[trainerPicId].coords) * 4 + 80; } @@ -1322,11 +1323,11 @@ static void PlayerPartnerHandleDrawTrainerPic(void) } // Use back pic only if the partner is Steven - if (gPartnerTrainerId == STEVEN_PARTNER_ID) + if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { DecompressTrainerBackPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; @@ -1336,8 +1337,8 @@ static void PlayerPartnerHandleDrawTrainerPic(void) else // otherwise use front sprite { DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A1C0(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; @@ -1348,7 +1349,7 @@ static void PlayerPartnerHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].hFlip = 1; } - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void PlayerPartnerHandleTrainerSlide(void) @@ -1492,7 +1493,7 @@ static void PlayerPartnerHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2; } @@ -1793,9 +1794,9 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void) StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F9); - if (gPartnerTrainerId == STEVEN_PARTNER_ID) + if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { - u8 spriteId = BACK_PIC_STEVEN; + u8 spriteId = TRAINER_BACK_PIC_STEVEN; LoadCompressedPalette(gTrainerBackPicPaletteTable[spriteId].data, 0x100 + paletteNum * 16, 32); } else @@ -1810,8 +1811,8 @@ static void PlayerPartnerHandleIntroTrainerBallThrow(void) taskId = CreateTask(sub_81BE2C8, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_77; @@ -1857,7 +1858,7 @@ static void PlayerPartnerHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + 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; @@ -1877,14 +1878,14 @@ static void sub_81BE498(void) } } -static void PlayerPartnerHandleCmd49(void) +static void PlayerPartnerHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; PlayerPartnerBufferExecCompleted(); } -static void PlayerPartnerHandleCmd50(void) +static void PlayerPartnerHandleEndBounceEffect(void) { PlayerPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 4d1ccbaca..affcb09ab 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -13,6 +13,7 @@ #include "util.h" #include "main.h" #include "constants/songs.h" +#include "constants/trainers.h" #include "sound.h" #include "window.h" #include "m4a.h" @@ -36,7 +37,6 @@ extern u8 gUnknown_0203C7B4; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); extern u16 sub_8068B48(void); extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); @@ -90,8 +90,8 @@ static void RecordedOpponentHandleFaintingCry(void); static void RecordedOpponentHandleIntroSlide(void); static void RecordedOpponentHandleIntroTrainerBallThrow(void); static void RecordedOpponentHandleDrawPartyStatusSummary(void); -static void RecordedOpponentHandleCmd49(void); -static void RecordedOpponentHandleCmd50(void); +static void RecordedOpponentHandleHidePartyStatusSummary(void); +static void RecordedOpponentHandleEndBounceEffect(void); static void RecordedOpponentHandleSpriteInvisibility(void); static void RecordedOpponentHandleBattleAnimation(void); static void RecordedOpponentHandleLinkStandbyMsg(void); @@ -162,8 +162,8 @@ static void (*const sRecordedOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void RecordedOpponentHandleIntroSlide, RecordedOpponentHandleIntroTrainerBallThrow, RecordedOpponentHandleDrawPartyStatusSummary, - RecordedOpponentHandleCmd49, - RecordedOpponentHandleCmd50, + RecordedOpponentHandleHidePartyStatusSummary, + RecordedOpponentHandleEndBounceEffect, RecordedOpponentHandleSpriteInvisibility, RecordedOpponentHandleBattleAnimation, RecordedOpponentHandleLinkStandbyMsg, @@ -192,7 +192,7 @@ static void RecordedOpponentBufferRunCommand(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) RecordedOpponentBufferExecCompleted(); @@ -377,7 +377,7 @@ static void sub_8186C48(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1118,9 +1118,9 @@ static void RecordedOpponentHandleLoadMonSprite(void) u16 species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); - sub_806A068(species, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), sub_80A82E4(gActiveBattler)); @@ -1153,9 +1153,9 @@ static void sub_81885D8(u8 battlerId, bool8 dontClearSubstituteBit) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1251,8 +1251,8 @@ static void RecordedOpponentHandleDrawTrainerPic(void) } DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, (8 - gTrainerFrontPicCoords[trainerPicId].coords) * 4 + 40, sub_80A82E4(gActiveBattler)); @@ -1263,7 +1263,7 @@ static void RecordedOpponentHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void RecordedOpponentHandleTrainerSlide(void) @@ -1296,7 +1296,7 @@ static void RecordedOpponentHandleFaintAnimation(void) { gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0; PlaySE12WithPanning(SE_POKE_DEAD, PAN_SIDE_OPPONENT); - gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_8039934; + gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_FaintOpponentMon; gBattlerControllerFuncs[gActiveBattler] = sub_8186D58; } } @@ -1404,7 +1404,7 @@ static void RecordedOpponentHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } @@ -1658,8 +1658,8 @@ static void RecordedOpponentHandleIntroTrainerBallThrow(void) taskId = CreateTask(sub_8189548, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_70; @@ -1704,7 +1704,7 @@ static void RecordedOpponentHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; if (gBattleBufferA[gActiveBattler][2] != 0) { @@ -1738,14 +1738,14 @@ static void sub_818975C(void) } } -static void RecordedOpponentHandleCmd49(void) +static void RecordedOpponentHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; RecordedOpponentBufferExecCompleted(); } -static void RecordedOpponentHandleCmd50(void) +static void RecordedOpponentHandleEndBounceEffect(void) { RecordedOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index b16c3f307..4f224bc67 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -36,7 +36,6 @@ extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); extern u8 GetFrontierTrainerFrontSpriteId(u16 trainerId); // this file's functions @@ -89,8 +88,8 @@ static void RecordedPlayerHandleFaintingCry(void); static void RecordedPlayerHandleIntroSlide(void); static void RecordedPlayerHandleIntroTrainerBallThrow(void); static void RecordedPlayerHandleDrawPartyStatusSummary(void); -static void RecordedPlayerHandleCmd49(void); -static void RecordedPlayerHandleCmd50(void); +static void RecordedPlayerHandleHidePartyStatusSummary(void); +static void RecordedPlayerHandleEndBounceEffect(void); static void RecordedPlayerHandleSpriteInvisibility(void); static void RecordedPlayerHandleBattleAnimation(void); static void RecordedPlayerHandleLinkStandbyMsg(void); @@ -160,8 +159,8 @@ static void (*const sRecordedPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) RecordedPlayerHandleIntroSlide, RecordedPlayerHandleIntroTrainerBallThrow, RecordedPlayerHandleDrawPartyStatusSummary, - RecordedPlayerHandleCmd49, - RecordedPlayerHandleCmd50, + RecordedPlayerHandleHidePartyStatusSummary, + RecordedPlayerHandleEndBounceEffect, RecordedPlayerHandleSpriteInvisibility, RecordedPlayerHandleBattleAnimation, RecordedPlayerHandleLinkStandbyMsg, @@ -190,7 +189,7 @@ static void RecordedPlayerBufferRunCommand(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) RecordedPlayerBufferExecCompleted(); @@ -363,7 +362,7 @@ static void sub_818A064(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1107,9 +1106,9 @@ static void RecordedPlayerHandleLoadMonSprite(void) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES); - sub_806A068(species, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(gActiveBattler, 2), GetBattlerSpriteDefault_Y(gActiveBattler), sub_80A82E4(gActiveBattler)); @@ -1137,10 +1136,10 @@ static void sub_818BA6C(u8 battlerId, bool8 dontClearSubstituteBit) gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); - sub_806A068(species, GetBattlerPosition(battlerId)); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); gBattlerSpriteIds[battlerId] = CreateSprite( - &gUnknown_0202499C, + &gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1242,8 +1241,8 @@ static void RecordedPlayerHandleDrawTrainerPic(void) { trainerPicId = PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender); DecompressTrainerFrontPic(trainerPicId, gActiveBattler); - sub_806A1C0(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerFront(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = IndexOfSpritePaletteTag(gTrainerFrontPicPaletteTable[trainerPicId].tag); gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; @@ -1256,8 +1255,8 @@ static void RecordedPlayerHandleDrawTrainerPic(void) else { DecompressTrainerBackPic(trainerPicId, gActiveBattler); - sub_806A12C(trainerPicId, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, xPos, yPos, sub_80A82E4(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerBack(trainerPicId, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, xPos, yPos, sub_80A82E4(gActiveBattler)); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; @@ -1265,7 +1264,7 @@ static void RecordedPlayerHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; } - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void RecordedPlayerHandleTrainerSlide(void) @@ -1409,7 +1408,7 @@ static void RecordedPlayerHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } @@ -1693,8 +1692,8 @@ static void RecordedPlayerHandleIntroTrainerBallThrow(void) taskId = CreateTask(sub_818CC24, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_120; @@ -1740,7 +1739,7 @@ static void RecordedPlayerHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + 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; @@ -1760,14 +1759,14 @@ static void sub_818CDF4(void) } } -static void RecordedPlayerHandleCmd49(void) +static void RecordedPlayerHandleHidePartyStatusSummary(void) { - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; RecordedPlayerBufferExecCompleted(); } -static void RecordedPlayerHandleCmd50(void) +static void RecordedPlayerHandleEndBounceEffect(void) { RecordedPlayerBufferExecCompleted(); } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 09776f150..bc97c01f9 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -80,8 +80,8 @@ static void SafariHandleFaintingCry(void); static void SafariHandleIntroSlide(void); static void SafariHandleIntroTrainerBallThrow(void); static void SafariHandleDrawPartyStatusSummary(void); -static void SafariHandleCmd49(void); -static void SafariHandleCmd50(void); +static void SafariHandleHidePartyStatusSummary(void); +static void SafariHandleEndBounceEffect(void); static void SafariHandleSpriteInvisibility(void); static void SafariHandleBattleAnimation(void); static void SafariHandleLinkStandbyMsg(void); @@ -144,8 +144,8 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = SafariHandleIntroSlide, SafariHandleIntroTrainerBallThrow, SafariHandleDrawPartyStatusSummary, - SafariHandleCmd49, - SafariHandleCmd50, + SafariHandleHidePartyStatusSummary, + SafariHandleEndBounceEffect, SafariHandleSpriteInvisibility, SafariHandleBattleAnimation, SafariHandleLinkStandbyMsg, @@ -239,7 +239,7 @@ static void HandleInputChooseAction(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) SafariBufferExecCompleted(); @@ -358,9 +358,9 @@ static void SafariHandleReturnMonToBall(void) static void SafariHandleDrawTrainerPic(void) { DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBattler); - sub_806A12C(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler)); + SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler)); gBattlerSpriteIds[gActiveBattler] = CreateSprite( - &gUnknown_0202499C, + &gMultiuseSpriteTemplate, 80, (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80, 30); @@ -368,7 +368,7 @@ static void SafariHandleDrawTrainerPic(void) gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240; gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void SafariHandleTrainerSlide(void) @@ -427,7 +427,7 @@ static void SafariHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } @@ -454,14 +454,14 @@ static void SafariHandleChooseAction(void) s32 i; gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; - BattleHandleAddTextPrinter(gText_SafariZoneMenu, 2); + BattlePutTextOnWindow(gText_SafariZoneMenu, 2); for (i = 0; i < 4; i++) ActionSelectionDestroyCursorAt(i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo2); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 1); + BattlePutTextOnWindow(gDisplayedStringBattle, 1); } static void SafariHandleUnknownYesNoBox(void) @@ -478,7 +478,7 @@ static void SafariHandleChooseItem(void) { s32 i; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase; gBattlerInMenuId = gActiveBattler; } @@ -645,12 +645,12 @@ static void SafariHandleDrawPartyStatusSummary(void) SafariBufferExecCompleted(); } -static void SafariHandleCmd49(void) +static void SafariHandleHidePartyStatusSummary(void) { SafariBufferExecCompleted(); } -static void SafariHandleCmd50(void) +static void SafariHandleEndBounceEffect(void) { SafariBufferExecCompleted(); } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index ca7b2fd44..960181fbc 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -15,6 +15,7 @@ #include "constants/songs.h" #include "sound.h" #include "constants/moves.h" +#include "constants/trainers.h" #include "window.h" #include "m4a.h" #include "palette.h" @@ -38,7 +39,6 @@ extern struct UnusedControllerStruct gUnknown_02022D0C; extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[]; extern void sub_8172EF0(u8 battlerId, struct Pokemon *mon); -extern void sub_806A068(u16, u8); // this file's functions static void WallyHandleGetMonData(void); @@ -90,8 +90,8 @@ static void WallyHandleFaintingCry(void); static void WallyHandleIntroSlide(void); static void WallyHandleIntroTrainerBallThrow(void); static void WallyHandleDrawPartyStatusSummary(void); -static void WallyHandleCmd49(void); -static void WallyHandleCmd50(void); +static void WallyHandleHidePartyStatusSummary(void); +static void WallyHandleEndBounceEffect(void); static void WallyHandleSpriteInvisibility(void); static void WallyHandleBattleAnimation(void); static void WallyHandleLinkStandbyMsg(void); @@ -159,8 +159,8 @@ static void (*const sWallyBufferCommands[CONTROLLER_CMDS_COUNT])(void) = WallyHandleIntroSlide, WallyHandleIntroTrainerBallThrow, WallyHandleDrawPartyStatusSummary, - WallyHandleCmd49, - WallyHandleCmd50, + WallyHandleHidePartyStatusSummary, + WallyHandleEndBounceEffect, WallyHandleSpriteInvisibility, WallyHandleBattleAnimation, WallyHandleLinkStandbyMsg, @@ -253,7 +253,7 @@ static void WallyHandleActions(void) } } -static void CompleteOnBankSpriteCallbackDummy(void) +static void CompleteOnBattlerSpriteCallbackDummy(void) { if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy) WallyBufferExecCompleted(); @@ -349,7 +349,7 @@ static void sub_8168818(void) static void CompleteOnHealthbarDone(void) { - s16 hpValue = sub_8074AA0(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); + s16 hpValue = MoveBattleBar(gActiveBattler, gHealthboxSpriteIds[gActiveBattler], HEALTH_BAR, 0); SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]); @@ -1037,26 +1037,26 @@ static void WallyHandleReturnMonToBall(void) static void WallyHandleDrawTrainerPic(void) { - DecompressTrainerBackPic(BACK_PIC_WALLY, gActiveBattler); - sub_806A12C(BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, - 80 + 4 * (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords), + 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].coords), 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; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy; + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBattlerSpriteCallbackDummy; } static void WallyHandleTrainerSlide(void) { - DecompressTrainerBackPic(BACK_PIC_WALLY, gActiveBattler); - sub_806A12C(BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); - gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gUnknown_0202499C, + DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, gActiveBattler); + SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(gActiveBattler)); + gBattlerSpriteIds[gActiveBattler] = CreateSprite(&gMultiuseSpriteTemplate, 80, - 80 + 4 * (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords), + 80 + 4 * (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].coords), 30); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler; gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = -96; @@ -1179,7 +1179,7 @@ static void WallyHandlePrintString(void) gBattle_BG0_Y = 0; stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]); BufferStringBattle(*stringId); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter; } @@ -1206,14 +1206,14 @@ static void WallyHandleChooseAction(void) s32 i; gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3; - BattleHandleAddTextPrinter(gText_BattleMenu, 2); + BattlePutTextOnWindow(gText_BattleMenu, 2); for (i = 0; i < 4; i++) ActionSelectionDestroyCursorAt(i); ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0); BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillWallyDo); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 1); + BattlePutTextOnWindow(gDisplayedStringBattle, 1); } static void WallyHandleUnknownYesNoBox(void) @@ -1251,7 +1251,7 @@ static void WallyHandleChooseMove(void) static void WallyHandleChooseItem(void) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gBattlerControllerFuncs[gActiveBattler] = OpenBagAfterPaletteFade; gBattlerInMenuId = gActiveBattler; } @@ -1444,14 +1444,14 @@ static void WallyHandleIntroTrainerBallThrow(void) StartSpriteAnim(&gSprites[gBattlerSpriteIds[gActiveBattler]], 1); paletteNum = AllocSpritePalette(0xD6F8); - LoadCompressedPalette(gTrainerBackPicPaletteTable[BACK_PIC_WALLY].data, 0x100 + paletteNum * 16, 32); + LoadCompressedPalette(gTrainerBackPicPaletteTable[TRAINER_BACK_PIC_WALLY].data, 0x100 + paletteNum * 16, 32); gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = paletteNum; taskId = CreateTask(sub_816AC04, 5); gTasks[taskId].data[0] = gActiveBattler; - if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1) - gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = sub_8073C30; + if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown) + gTasks[gBattlerStatusSummaryTaskId[gActiveBattler]].func = Task_HidePartyStatusSummary; gBattleSpritesDataPtr->animationData->field_9_x1 = 1; gBattlerControllerFuncs[gActiveBattler] = nullsub_21; @@ -1465,8 +1465,8 @@ static void sub_816AA80(u8 battlerId) gBattlerPartyIndexes[battlerId] = gBattleBufferA[battlerId][1]; species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); gUnknown_03005D7C[battlerId] = CreateInvisibleSpriteWithCallback(sub_805D714); - sub_806A068(species, GetBattlerPosition(battlerId)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gUnknown_0202499C, + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battlerId)); + gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battlerId, 2), GetBattlerSpriteDefault_Y(battlerId), sub_80A82E4(battlerId)); @@ -1511,18 +1511,18 @@ static void WallyHandleDrawPartyStatusSummary(void) } else { - gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].flag_x1 = 1; + gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].partyStatusSummaryShown = 1; gBattlerStatusSummaryTaskId[gActiveBattler] = CreatePartyStatusSummarySprites(gActiveBattler, (struct HpAndStatus *)&gBattleBufferA[gActiveBattler][4], gBattleBufferA[gActiveBattler][1], gBattleBufferA[gActiveBattler][2]); WallyBufferExecCompleted(); } } -static void WallyHandleCmd49(void) +static void WallyHandleHidePartyStatusSummary(void) { WallyBufferExecCompleted(); } -static void WallyHandleCmd50(void) +static void WallyHandleEndBounceEffect(void) { WallyBufferExecCompleted(); } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 2b918d018..4d714ca81 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -264,67 +264,67 @@ static void InitSinglePlayerBtlControllers(void) for (var = gUnknown_0203C7B4, i = 0; i < MAX_BATTLERS_COUNT; i++) { - switch (gLinkPlayers[i].lp_field_18) + switch (gLinkPlayers[i].id) { case 0: case 3: - sub_81B8D64(gLinkPlayers[i].lp_field_18, 0); + sub_81B8D64(gLinkPlayers[i].id, 0); break; case 1: case 2: - sub_81B8D64(gLinkPlayers[i].lp_field_18, 1); + sub_81B8D64(gLinkPlayers[i].id, 1); break; } if (i == var) { - gBattlerControllerFuncs[gLinkPlayers[i].lp_field_18] = SetControllerToRecordedPlayer; - switch (gLinkPlayers[i].lp_field_18) + gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; + switch (gLinkPlayers[i].id) { case 0: case 3: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 0; + gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 3; + gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } - else if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[var].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[var].lp_field_18 & 1))) + else if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[var].id & 1)) + || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[var].id & 1))) { - gBattlerControllerFuncs[gLinkPlayers[i].lp_field_18] = SetControllerToRecordedPlayer; - switch (gLinkPlayers[i].lp_field_18) + gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedPlayer; + switch (gLinkPlayers[i].id) { case 0: case 3: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = B_POSITION_PLAYER_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 0; + gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_LEFT; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = B_POSITION_PLAYER_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 3; + gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_PLAYER_RIGHT; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } else { - gBattlerControllerFuncs[gLinkPlayers[i].lp_field_18] = SetControllerToRecordedOpponent; - switch (gLinkPlayers[i].lp_field_18) + gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToRecordedOpponent; + switch (gLinkPlayers[i].id) { case 0: case 3: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = B_POSITION_OPPONENT_LEFT; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 0; + gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_LEFT; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = B_POSITION_OPPONENT_RIGHT; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 3; + gBattlerPositions[gLinkPlayers[i].id] = B_POSITION_OPPONENT_RIGHT; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } @@ -506,69 +506,69 @@ static void InitLinkBtlControllers(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - switch (gLinkPlayers[i].lp_field_18) + switch (gLinkPlayers[i].id) { case 0: case 3: - sub_81B8D64(gLinkPlayers[i].lp_field_18, 0); + sub_81B8D64(gLinkPlayers[i].id, 0); break; case 1: case 2: - sub_81B8D64(gLinkPlayers[i].lp_field_18, 1); + sub_81B8D64(gLinkPlayers[i].id, 1); break; } if (i == multiplayerId) { - gBattlerControllerFuncs[gLinkPlayers[i].lp_field_18] = SetControllerToPlayer; - switch (gLinkPlayers[i].lp_field_18) + gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToPlayer; + switch (gLinkPlayers[i].id) { case 0: case 3: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = 0; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 0; + gBattlerPositions[gLinkPlayers[i].id] = 0; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = 2; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 3; + gBattlerPositions[gLinkPlayers[i].id] = 2; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } else { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) - || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) + if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[multiplayerId].id & 1)) + || ((gLinkPlayers[i].id & 1) && (gLinkPlayers[multiplayerId].id & 1))) { - gBattlerControllerFuncs[gLinkPlayers[i].lp_field_18] = SetControllerToLinkPartner; - switch (gLinkPlayers[i].lp_field_18) + gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkPartner; + switch (gLinkPlayers[i].id) { case 0: case 3: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = 0; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 0; + gBattlerPositions[gLinkPlayers[i].id] = 0; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = 2; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 3; + gBattlerPositions[gLinkPlayers[i].id] = 2; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } else { - gBattlerControllerFuncs[gLinkPlayers[i].lp_field_18] = SetControllerToLinkOpponent; - switch (gLinkPlayers[i].lp_field_18) + gBattlerControllerFuncs[gLinkPlayers[i].id] = SetControllerToLinkOpponent; + switch (gLinkPlayers[i].id) { case 0: case 3: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = 1; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 0; + gBattlerPositions[gLinkPlayers[i].id] = 1; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 0; break; case 1: case 2: - gBattlerPositions[gLinkPlayers[i].lp_field_18] = 3; - gBattlerPartyIndexes[gLinkPlayers[i].lp_field_18] = 3; + gBattlerPositions[gLinkPlayers[i].id] = 3; + gBattlerPartyIndexes[gLinkPlayers[i].id] = 3; break; } } @@ -587,7 +587,7 @@ static void SetBattlePartyIds(void) { for (i = 0; i < gBattlersCount; i++) { - for (j = 0; j < 6; j++) + for (j = 0; j < PARTY_SIZE; j++) { if (i < 2) { @@ -1082,14 +1082,14 @@ void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 m void BtlController_EmitPrintString(u8 bufferId, u16 stringID) { s32 i; - struct StringInfoBattle* stringInfo; + struct BattleMsgData* stringInfo; sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRING; sBattleBuffersTransferData[1] = gBattleOutcome; sBattleBuffersTransferData[2] = stringID; sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; - stringInfo = (struct StringInfoBattle*)(&sBattleBuffersTransferData[4]); + stringInfo = (struct BattleMsgData*)(&sBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; stringInfo->originallyUsedMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; @@ -1097,7 +1097,7 @@ void BtlController_EmitPrintString(u8 bufferId, u16 stringID) stringInfo->scrActive = gBattleScripting.battler; stringInfo->unk1605E = gBattleStruct->field_52; stringInfo->hpScale = gBattleStruct->hpScale; - stringInfo->StringBank = gPotentialItemEffectBattler; + stringInfo->itemEffectBattler = gPotentialItemEffectBattler; stringInfo->moveType = gBattleMoves[gCurrentMove].type; for (i = 0; i < MAX_BATTLERS_COUNT; i++) @@ -1108,20 +1108,20 @@ void BtlController_EmitPrintString(u8 bufferId, u16 stringID) stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; } - PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); + PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4); } void BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringID) { s32 i; - struct StringInfoBattle *stringInfo; + struct BattleMsgData *stringInfo; sBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY; sBattleBuffersTransferData[1] = CONTROLLER_PRINTSTRINGPLAYERONLY; sBattleBuffersTransferData[2] = stringID; sBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; - stringInfo = (struct StringInfoBattle*)(&sBattleBuffersTransferData[4]); + stringInfo = (struct BattleMsgData*)(&sBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; stringInfo->originallyUsedMove = gChosenMove; stringInfo->lastItem = gLastUsedItem; @@ -1137,7 +1137,7 @@ void BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringID) stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; } - PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); + PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4); } void BtlController_EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2) @@ -1181,7 +1181,7 @@ void BtlController_EmitChooseItem(u8 bufferId, u8 *arg1) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8* arg4) +void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8 *arg4) { s32 i; @@ -1191,7 +1191,7 @@ void BtlController_EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 ability sBattleBuffersTransferData[3] = abilityId; for (i = 0; i < 3; i++) sBattleBuffersTransferData[4 + i] = arg4[i]; - PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8); // but only 7 bytes were written + PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 8); // Only 7 bytes were written. } void BtlController_EmitCmd23(u8 bufferId) @@ -1449,26 +1449,26 @@ void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* h sBattleBuffersTransferData[1] = arg2 & 0x7F; sBattleBuffersTransferData[2] = (arg2 & 0x80) >> 7; sBattleBuffersTransferData[3] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; - for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * 6); i++) + for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * PARTY_SIZE); i++) sBattleBuffersTransferData[4 + i] = *(i + (u8*)(hpAndStatus)); - PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct HpAndStatus) * 6 + 4); + PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct HpAndStatus) * PARTY_SIZE + 4); } -void BtlController_EmitCmd49(u8 bufferId) +void BtlController_EmitHidePartyStatusSummary(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_49; - sBattleBuffersTransferData[1] = CONTROLLER_49; - sBattleBuffersTransferData[2] = CONTROLLER_49; - sBattleBuffersTransferData[3] = CONTROLLER_49; + sBattleBuffersTransferData[0] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; + sBattleBuffersTransferData[1] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; + sBattleBuffersTransferData[2] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; + sBattleBuffersTransferData[3] = CONTROLLER_HIDEPARTYSTATUSSUMMARY; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitCmd50(u8 bufferId) +void BtlController_EmitEndBounceEffect(u8 bufferId) { - sBattleBuffersTransferData[0] = CONTROLLER_50; - sBattleBuffersTransferData[1] = CONTROLLER_50; - sBattleBuffersTransferData[2] = CONTROLLER_50; - sBattleBuffersTransferData[3] = CONTROLLER_50; + sBattleBuffersTransferData[0] = CONTROLLER_ENDBOUNCE; + sBattleBuffersTransferData[1] = CONTROLLER_ENDBOUNCE; + sBattleBuffersTransferData[2] = CONTROLLER_ENDBOUNCE; + sBattleBuffersTransferData[3] = CONTROLLER_ENDBOUNCE; PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } @@ -1511,12 +1511,12 @@ void BtlController_EmitResetActionMoveSelection(u8 bufferId, u8 caseId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 2); } -void BtlController_EmitCmd55(u8 bufferId, u8 arg1) +void BtlController_EmitCmd55(u8 bufferId, u8 battleOutcome) { sBattleBuffersTransferData[0] = CONTROLLER_55; - sBattleBuffersTransferData[1] = arg1; - sBattleBuffersTransferData[2] = gSaveBlock2Ptr->field_CA9_b; - sBattleBuffersTransferData[3] = gSaveBlock2Ptr->field_CA9_b; + sBattleBuffersTransferData[1] = battleOutcome; + sBattleBuffersTransferData[2] = gSaveBlock2Ptr->frontier.field_CA9_b; + sBattleBuffersTransferData[3] = gSaveBlock2Ptr->frontier.field_CA9_b; sBattleBuffersTransferData[5] = sBattleBuffersTransferData[4] = sub_81850DC(&sBattleBuffersTransferData[6]); PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sBattleBuffersTransferData[4] + 6); } diff --git a/src/battle_data.c b/src/battle_data.c new file mode 100644 index 000000000..f3719ac2d --- /dev/null +++ b/src/battle_data.c @@ -0,0 +1,13 @@ +#include "global.h" +#include "battle.h" +#include "data2.h" +#include "constants/items.h" +#include "constants/moves.h" +#include "constants/species.h" +#include "constants/trainers.h" + +#include "data/trainer_parties.h" +#include "data/text/trainer_class_names.h" +#include "data/trainers.h" +#include "data/text/species_names.h" +#include "data/text/move_names.h" diff --git a/src/battle_dome_cards.c b/src/battle_dome_cards.c index 076a4d342..5e659a2e8 100644 --- a/src/battle_dome_cards.c +++ b/src/battle_dome_cards.c @@ -16,14 +16,15 @@ extern const struct CompressedSpriteSheet gTrainerBackPicTable[]; extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[]; extern const union AffineAnimCmd *const gUnknown_082FF618[]; extern const union AffineAnimCmd *const gUnknown_082FF694[]; -extern const union AnimCmd *const gUnknown_082FF70C[]; +extern const union AnimCmd *const gPlayerMonSpriteAnimsTable[]; extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES]; extern const union AnimCmd *const *const gUnknown_0830536C[]; extern const u8 gFacilityClassToPicIndex[]; // Static type declarations -struct BattleDomeCard { +struct BattleDomeCard +{ u8 *frames; struct SpriteFrameImage *images; u16 paletteTag; @@ -41,10 +42,12 @@ static EWRAM_DATA struct BattleDomeCard gUnknown_0203CD04[8] = {}; // .rodata static const struct BattleDomeCard gUnknown_0860B058 = {}; -static const struct OamData gUnknown_0860B064 = { +static const struct OamData gUnknown_0860B064 = +{ .size = 3 }; -static const struct OamData gUnknown_0860B06C = { +static const struct OamData gUnknown_0860B06C = +{ .affineMode = 1, .size = 3 }; @@ -158,7 +161,7 @@ static void uns_builder_assign_animtable1(bool8 isTrainer) { if (!isTrainer) { - gUnknown_0203CCEC.anims = gUnknown_082FF70C; + gUnknown_0203CCEC.anims = gPlayerMonSpriteAnimsTable; } else { diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index d2c242553..8f17d488e 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -67,48 +67,48 @@ static void sub_805D7EC(struct Sprite *sprite); static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId); static void Task_ClearBitWhenBattleTableAnimDone(u8 taskId); static void Task_ClearBitWhenSpecialAnimDone(u8 taskId); -static void ClearSpritesBankHealthboxAnimData(void); +static void ClearSpritesBattlerHealthboxAnimData(void); // const rom data -static const struct CompressedSpriteSheet gUnknown_0832C0D0 = +static const struct CompressedSpriteSheet sSpriteSheet_SinglesPlayerHealthbox = { gUnknown_08C1F1C8, 0x1000, TAG_HEALTHBOX_PLAYER1_TILE }; -static const struct CompressedSpriteSheet gUnknown_0832C0D8 = +static const struct CompressedSpriteSheet sSpriteSheet_SinglesOpponentHealthbox = { gUnknown_08C1F46C, 0x1000, TAG_HEALTHBOX_OPPONENT1_TILE }; -static const struct CompressedSpriteSheet gUnknown_0832C0E0[2] = +static const struct CompressedSpriteSheet sSpriteSheets_DoublesPlayerHealthbox[2] = { {gUnknown_08C1F5E8, 0x800, TAG_HEALTHBOX_PLAYER1_TILE}, {gUnknown_08C1F5E8, 0x800, TAG_HEALTHBOX_PLAYER2_TILE} }; -static const struct CompressedSpriteSheet gUnknown_0832C0F0[2] = +static const struct CompressedSpriteSheet sSpriteSheets_DoublesOpponentHealthbox[2] = { {gUnknown_08C1F76C, 0x800, TAG_HEALTHBOX_OPPONENT1_TILE}, {gUnknown_08C1F76C, 0x800, TAG_HEALTHBOX_OPPONENT2_TILE} }; -static const struct CompressedSpriteSheet gUnknown_0832C100 = +static const struct CompressedSpriteSheet sSpriteSheet_SafariHealthbox = { gUnknown_08C1F8E8, 0x1000, TAG_HEALTHBOX_SAFARI_TILE }; -static const struct CompressedSpriteSheet gUnknown_0832C108[MAX_BATTLERS_COUNT] = +static const struct CompressedSpriteSheet sSpriteSheets_HealthBar[MAX_BATTLERS_COUNT] = { - {gBlankGfxCompressed, 0x0100, 0xd704}, - {gBlankGfxCompressed, 0x0120, 0xd705}, - {gBlankGfxCompressed, 0x0100, 0xd706}, - {gBlankGfxCompressed, 0x0120, 0xd707} + {gBlankGfxCompressed, 0x0100, TAG_HEALTHBAR_PLAYER1_TILE}, + {gBlankGfxCompressed, 0x0120, TAG_HEALTHBAR_OPPONENT1_TILE}, + {gBlankGfxCompressed, 0x0100, TAG_HEALTHBAR_PLAYER2_TILE}, + {gBlankGfxCompressed, 0x0120, TAG_HEALTHBAR_OPPONENT2_TILE} }; -static const struct SpritePalette gUnknown_0832C128[2] = +static const struct SpritePalette sSpritePalettes_HealthBoxHealthBar[2] = { {gBattleInterface_BallStatusBarPal, TAG_HEALTHBOX_PAL}, - {gBattleInterface_BallDisplayPal, 0xd704} + {gBattleInterface_BallDisplayPal, TAG_HEALTHBAR_PAL} }; // code @@ -411,35 +411,35 @@ void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status) #define tBattlerId data[0] -bool8 TryHandleLaunchBattleTableAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId, u16 argument) +bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId, u16 argument) { u8 taskId; if (tableId == B_ANIM_CASTFORM_CHANGE && (argument & 0x80)) { - gBattleMonForms[activeBank] = (argument & ~(0x80)); + gBattleMonForms[activeBattler] = (argument & ~(0x80)); return TRUE; } - if (gBattleSpritesDataPtr->battlerData[activeBank].behindSubstitute + if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute && !ShouldAnimBeDoneRegardlessOfSubsitute(tableId)) { return TRUE; } - if (gBattleSpritesDataPtr->battlerData[activeBank].behindSubstitute + if (gBattleSpritesDataPtr->battlerData[activeBattler].behindSubstitute && tableId == B_ANIM_SUBSTITUTE_FADE - && gSprites[gBattlerSpriteIds[activeBank]].invisible) + && gSprites[gBattlerSpriteIds[activeBattler]].invisible) { - LoadBattleMonGfxAndAnimate(activeBank, TRUE, gBattlerSpriteIds[activeBank]); - ClearBehindSubstituteBit(activeBank); + LoadBattleMonGfxAndAnimate(activeBattler, TRUE, gBattlerSpriteIds[activeBattler]); + ClearBehindSubstituteBit(activeBattler); return TRUE; } - gBattleAnimAttacker = atkBank; - gBattleAnimTarget = defBank; + gBattleAnimAttacker = atkBattler; + gBattleAnimTarget = defBattler; gBattleSpritesDataPtr->animationData->animArg = argument; LaunchBattleAnimation(gBattleAnims_VariousTable, tableId, FALSE); taskId = CreateTask(Task_ClearBitWhenBattleTableAnimDone, 10); - gTasks[taskId].tBattlerId = activeBank; + gTasks[taskId].tBattlerId = activeBattler; gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].animFromTableActive = 1; return FALSE; @@ -475,15 +475,15 @@ static bool8 ShouldAnimBeDoneRegardlessOfSubsitute(u8 animId) #define tBattlerId data[0] -void InitAndLaunchSpecialAnimation(u8 activeBank, u8 atkBank, u8 defBank, u8 tableId) +void InitAndLaunchSpecialAnimation(u8 activeBattler, u8 atkBattler, u8 defBattler, u8 tableId) { u8 taskId; - gBattleAnimAttacker = atkBank; - gBattleAnimTarget = defBank; + gBattleAnimAttacker = atkBattler; + gBattleAnimTarget = defBattler; LaunchBattleAnimation(gBattleAnims_Special, tableId, FALSE); taskId = CreateTask(Task_ClearBitWhenSpecialAnimDone, 10); - gTasks[taskId].tBattlerId = activeBank; + gTasks[taskId].tBattlerId = activeBattler; gBattleSpritesDataPtr->healthBoxesData[gTasks[taskId].tBattlerId].specialAnimActive = 1; } @@ -499,7 +499,7 @@ static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) #undef tBattlerId -// great function to include newly added moves that don't have animation yet +// Great function to include newly added moves that don't have animation yet. bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) { return FALSE; @@ -679,29 +679,30 @@ void FreeTrainerFrontPicPalette(u16 frontPicId) FreeSpritePaletteByTag(gTrainerFrontPicPaletteTable[frontPicId].tag); } -void sub_805DFFC(void) +// Unused. +void BattleLoadAllHealthBoxesGfxAtOnce(void) { - u8 numberOfBanks = 0; + u8 numberOfBattlers = 0; u8 i; - LoadSpritePalette(&gUnknown_0832C128[0]); - LoadSpritePalette(&gUnknown_0832C128[1]); + LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); + LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); if (!IsDoubleBattle()) { - LoadCompressedObjectPic(&gUnknown_0832C0D0); - LoadCompressedObjectPic(&gUnknown_0832C0D8); - numberOfBanks = 2; + LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox); + LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox); + numberOfBattlers = 2; } else { - LoadCompressedObjectPic(&gUnknown_0832C0E0[0]); - LoadCompressedObjectPic(&gUnknown_0832C0E0[1]); - LoadCompressedObjectPic(&gUnknown_0832C0F0[0]); - LoadCompressedObjectPic(&gUnknown_0832C0F0[1]); - numberOfBanks = 4; + LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]); + numberOfBattlers = 4; } - for (i = 0; i < numberOfBanks; i++) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[i]]); + for (i = 0; i < numberOfBattlers; i++) + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[i]]); } bool8 BattleLoadAllHealthBoxesGfx(u8 state) @@ -712,45 +713,45 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) { if (state == 1) { - LoadSpritePalette(&gUnknown_0832C128[0]); - LoadSpritePalette(&gUnknown_0832C128[1]); + LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); + LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); } else if (!IsDoubleBattle()) { if (state == 2) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - LoadCompressedObjectPic(&gUnknown_0832C100); + LoadCompressedObjectPic(&sSpriteSheet_SafariHealthbox); else - LoadCompressedObjectPic(&gUnknown_0832C0D0); + LoadCompressedObjectPic(&sSpriteSheet_SinglesPlayerHealthbox); } else if (state == 3) - LoadCompressedObjectPic(&gUnknown_0832C0D8); + LoadCompressedObjectPic(&sSpriteSheet_SinglesOpponentHealthbox); else if (state == 4) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[0]]); + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); else if (state == 5) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[1]]); + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); else retVal = TRUE; } else { if (state == 2) - LoadCompressedObjectPic(&gUnknown_0832C0E0[0]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[0]); else if (state == 3) - LoadCompressedObjectPic(&gUnknown_0832C0E0[1]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesPlayerHealthbox[1]); else if (state == 4) - LoadCompressedObjectPic(&gUnknown_0832C0F0[0]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[0]); else if (state == 5) - LoadCompressedObjectPic(&gUnknown_0832C0F0[1]); + LoadCompressedObjectPic(&sSpriteSheets_DoublesOpponentHealthbox[1]); else if (state == 6) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[0]]); + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); else if (state == 7) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[1]]); + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); else if (state == 8) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[2]]); + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[2]]); else if (state == 9) - LoadCompressedObjectPic(&gUnknown_0832C108[gBattlerPositions[3]]); + LoadCompressedObjectPic(&sSpriteSheets_HealthBar[gBattlerPositions[3]]); else retVal = TRUE; } @@ -771,7 +772,7 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId) switch (*state1) { case 0: - ClearSpritesBankHealthboxAnimData(); + ClearSpritesBattlerHealthboxAnimData(); (*state1)++; break; case 1: @@ -849,7 +850,7 @@ void ClearSpritesHealthboxAnimData(void) memset(gBattleSpritesDataPtr->animationData, 0, sizeof(struct BattleAnimationInfo)); } -static void ClearSpritesBankHealthboxAnimData(void) +static void ClearSpritesBattlerHealthboxAnimData(void) { ClearSpritesHealthboxAnimData(); memset(gBattleSpritesDataPtr->battlerData, 0, sizeof(struct BattleSpriteInfo) * MAX_BATTLERS_COUNT); @@ -868,7 +869,7 @@ void CopyBattleSpriteInvisibility(u8 battlerId) gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible; } -void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform) +void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 notTransform) { u16 paletteOffset; u32 personalityValue; @@ -878,16 +879,16 @@ void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform) if (notTransform) { - StartSpriteAnim(&gSprites[gBattlerSpriteIds[bankAtk]], gBattleSpritesDataPtr->animationData->animArg); - paletteOffset = 0x100 + bankAtk * 16; + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleSpritesDataPtr->animationData->animArg); + paletteOffset = 0x100 + battlerAtk * 16; LoadPalette(gBattleStruct->castformPalette[gBattleSpritesDataPtr->animationData->animArg], paletteOffset, 32); - gBattleMonForms[bankAtk] = gBattleSpritesDataPtr->animationData->animArg; - if (gBattleSpritesDataPtr->battlerData[bankAtk].transformSpecies != SPECIES_NONE) + gBattleMonForms[battlerAtk] = gBattleSpritesDataPtr->animationData->animArg; + if (gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, 32); } - gSprites[gBattlerSpriteIds[bankAtk]].pos1.y = GetBattlerSpriteDefault_Y(bankAtk); + gSprites[gBattlerSpriteIds[battlerAtk]].pos1.y = GetBattlerSpriteDefault_Y(battlerAtk); } else { @@ -909,48 +910,48 @@ void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform) } else { - position = GetBattlerPosition(bankAtk); + position = GetBattlerPosition(battlerAtk); - if (GetBattlerSide(bankDef) == B_SIDE_OPPONENT) - targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bankDef]], MON_DATA_SPECIES); + if (GetBattlerSide(battlerDef) == B_SIDE_OPPONENT) + targetSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); else - targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bankDef]], MON_DATA_SPECIES); + targetSpecies = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerDef]], MON_DATA_SPECIES); - if (GetBattlerSide(bankAtk) == B_SIDE_PLAYER) + if (GetBattlerSide(battlerAtk) == B_SIDE_PLAYER) { - personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bankAtk]], MON_DATA_PERSONALITY); - otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bankAtk]], MON_DATA_OT_ID); + personalityValue = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); + otId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[targetSpecies], gMonSpritesGfxPtr->sprites[position], targetSpecies, - gTransformedPersonalities[bankAtk]); + gTransformedPersonalities[battlerAtk]); } else { - personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bankAtk]], MON_DATA_PERSONALITY); - otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bankAtk]], MON_DATA_OT_ID); + personalityValue = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_PERSONALITY); + otId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerAtk]], MON_DATA_OT_ID); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[targetSpecies], gMonSpritesGfxPtr->sprites[position], targetSpecies, - gTransformedPersonalities[bankAtk]); + gTransformedPersonalities[battlerAtk]); } } src = gMonSpritesGfxPtr->sprites[position]; - dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[bankAtk]].oam.tileNum * 32); + dst = (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[battlerAtk]].oam.tileNum * 32); DmaCopy32(3, src, dst, 0x800); - paletteOffset = 0x100 + bankAtk * 16; + paletteOffset = 0x100 + battlerAtk * 16; lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(targetSpecies, otId, personalityValue); LZDecompressWram(lzPaletteData, gDecompressionBuffer); LoadPalette(gDecompressionBuffer, paletteOffset, 32); if (targetSpecies == SPECIES_CASTFORM) { - gSprites[gBattlerSpriteIds[bankAtk]].anims = gMonAnimationsSpriteAnimsPtrTable[targetSpecies]; + gSprites[gBattlerSpriteIds[battlerAtk]].anims = gMonAnimationsSpriteAnimsPtrTable[targetSpecies]; LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette[0]); - LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[bankDef] * 16, paletteOffset, 32); + LoadPalette(gBattleStruct->castformPalette[0] + gBattleMonForms[battlerDef] * 16, paletteOffset, 32); } BlendPalette(paletteOffset, 16, 6, RGB_WHITE); @@ -958,12 +959,12 @@ void HandleSpeciesGfxDataChange(u8 bankAtk, u8 bankDef, bool8 notTransform) if (!IsContest()) { - gBattleSpritesDataPtr->battlerData[bankAtk].transformSpecies = targetSpecies; - gBattleMonForms[bankAtk] = gBattleMonForms[bankDef]; + gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies = targetSpecies; + gBattleMonForms[battlerAtk] = gBattleMonForms[battlerDef]; } - gSprites[gBattlerSpriteIds[bankAtk]].pos1.y = GetBattlerSpriteDefault_Y(bankAtk); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[bankAtk]], gBattleMonForms[bankAtk]); + gSprites[gBattlerSpriteIds[battlerAtk]].pos1.y = GetBattlerSpriteDefault_Y(battlerAtk); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], gBattleMonForms[battlerAtk]); } } @@ -1068,11 +1069,11 @@ void HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId) void BattleStopLowHpSound(void) { - u8 playerBank = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + u8 playerBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - gBattleSpritesDataPtr->battlerData[playerBank].lowHpSong = 0; + gBattleSpritesDataPtr->battlerData[playerBattler].lowHpSong = 0; if (IsDoubleBattle()) - gBattleSpritesDataPtr->battlerData[playerBank ^ BIT_FLANK].lowHpSong = 0; + gBattleSpritesDataPtr->battlerData[playerBattler ^ BIT_FLANK].lowHpSong = 0; m4aSongNumStop(SE_HINSI); } @@ -1085,19 +1086,19 @@ u8 GetMonHPBarLevel(struct Pokemon *mon) return GetHPBarLevel(hp, maxHP); } -void sub_805EAE8(void) +void HandleBattleLowHpMusicChange(void) { if (gMain.inBattle) { - u8 playerBank1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - u8 playerBank2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); - u8 bank1PartyId = pokemon_order_func(gBattlerPartyIndexes[playerBank1]); - u8 bank2PartyId = pokemon_order_func(gBattlerPartyIndexes[playerBank2]); - - if (GetMonData(&gPlayerParty[bank1PartyId], MON_DATA_HP) != 0) - HandleLowHpMusicChange(&gPlayerParty[bank1PartyId], playerBank1); - if (IsDoubleBattle() && GetMonData(&gPlayerParty[bank2PartyId], MON_DATA_HP) != 0) - HandleLowHpMusicChange(&gPlayerParty[bank2PartyId], playerBank2); + u8 playerBattler1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + u8 playerBattler2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + u8 battler1PartyId = pokemon_order_func(gBattlerPartyIndexes[playerBattler1]); + u8 battler2PartyId = pokemon_order_func(gBattlerPartyIndexes[playerBattler2]); + + if (GetMonData(&gPlayerParty[battler1PartyId], MON_DATA_HP) != 0) + HandleLowHpMusicChange(&gPlayerParty[battler1PartyId], playerBattler1); + if (IsDoubleBattle() && GetMonData(&gPlayerParty[battler2PartyId], MON_DATA_HP) != 0) + HandleLowHpMusicChange(&gPlayerParty[battler2PartyId], playerBattler2); } } @@ -1147,14 +1148,14 @@ void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) { bool8 invisible = FALSE; u8 battlerId = shadowSprite->tBattlerId; - struct Sprite *bankSprite = &gSprites[gBattlerSpriteIds[battlerId]]; + struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battlerId]]; - if (!bankSprite->inUse || !IsBattlerSpritePresent(battlerId)) + if (!battlerSprite->inUse || !IsBattlerSpritePresent(battlerId)) { shadowSprite->callback = SpriteCB_SetInvisible; return; } - if (gAnimScriptActive || bankSprite->invisible) + if (gAnimScriptActive || battlerSprite->invisible) invisible = TRUE; else if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE && gEnemyMonElevation[gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies] == 0) @@ -1163,8 +1164,8 @@ void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) if (gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute) invisible = TRUE; - shadowSprite->pos1.x = bankSprite->pos1.x; - shadowSprite->pos2.x = bankSprite->pos2.x; + shadowSprite->pos1.x = battlerSprite->pos1.x; + shadowSprite->pos2.x = battlerSprite->pos2.x; shadowSprite->invisible = invisible; } @@ -1177,7 +1178,7 @@ void SpriteCB_SetInvisible(struct Sprite *sprite) void SetBattlerShadowSpriteCallback(u8 battlerId, u16 species) { - // The player's shadow is never seen + // The player's shadow is never seen. if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return; @@ -1270,7 +1271,7 @@ void FreeMonSpritesGfx(void) FREE_AND_SET_NULL(gMonSpritesGfxPtr); } -bool32 ShouldPlayNormalPokeCry(struct Pokemon *mon) +bool32 ShouldPlayNormalMonCry(struct Pokemon *mon) { s16 hp, maxHP; s32 barLevel; diff --git a/src/battle_interface.c b/src/battle_interface.c index 0a8bf3ed7..278edb6f4 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -26,7 +26,7 @@ struct TestingBar { s32 maxValue; - s32 currValue; + s32 oldValue; s32 receivedValue; u32 unkC_0:5; u32 unk10; @@ -37,7 +37,7 @@ enum HEALTHBOX_GFX_0, HEALTHBOX_GFX_1, HEALTHBOX_GFX_2, - HEALTHBOX_GFX_3, + HEALTHBOX_GFX_HP_BAR_GREEN, HEALTHBOX_GFX_4, HEALTHBOX_GFX_5, HEALTHBOX_GFX_6, @@ -55,19 +55,19 @@ enum HEALTHBOX_GFX_18, HEALTHBOX_GFX_19, HEALTHBOX_GFX_20, - HEALTHBOX_GFX_STATUS_PSN_BANK0, + HEALTHBOX_GFX_STATUS_PSN_BATTLER0, HEALTHBOX_GFX_22, HEALTHBOX_GFX_23, - HEALTHBOX_GFX_STATUS_PRZ_BANK0, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, HEALTHBOX_GFX_25, HEALTHBOX_GFX_26, - HEALTHBOX_GFX_STATUS_SLP_BANK0, + HEALTHBOX_GFX_STATUS_SLP_BATTLER0, HEALTHBOX_GFX_28, HEALTHBOX_GFX_29, - HEALTHBOX_GFX_STATUS_FRZ_BANK0, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, HEALTHBOX_GFX_31, HEALTHBOX_GFX_32, - HEALTHBOX_GFX_STATUS_BRN_BANK0, + HEALTHBOX_GFX_STATUS_BRN_BATTLER0, HEALTHBOX_GFX_34, HEALTHBOX_GFX_35, HEALTHBOX_GFX_36, @@ -81,7 +81,7 @@ enum HEALTHBOX_GFX_44, HEALTHBOX_GFX_45, HEALTHBOX_GFX_46, - HEALTHBOX_GFX_47, + HEALTHBOX_GFX_HP_BAR_YELLOW, HEALTHBOX_GFX_48, HEALTHBOX_GFX_49, HEALTHBOX_GFX_50, @@ -90,7 +90,7 @@ enum HEALTHBOX_GFX_53, HEALTHBOX_GFX_54, HEALTHBOX_GFX_55, - HEALTHBOX_GFX_56, + HEALTHBOX_GFX_HP_BAR_RED, HEALTHBOX_GFX_57, HEALTHBOX_GFX_58, HEALTHBOX_GFX_59, @@ -105,56 +105,56 @@ enum HEALTHBOX_GFX_68, HEALTHBOX_GFX_69, HEALTHBOX_GFX_70, - HEALTHBOX_GFX_STATUS_PSN_BANK1, + HEALTHBOX_GFX_STATUS_PSN_BATTLER1, HEALTHBOX_GFX_72, HEALTHBOX_GFX_73, - HEALTHBOX_GFX_STATUS_PRZ_BANK1, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER1, HEALTHBOX_GFX_75, HEALTHBOX_GFX_76, - HEALTHBOX_GFX_STATUS_SLP_BANK1, + HEALTHBOX_GFX_STATUS_SLP_BATTLER1, HEALTHBOX_GFX_78, HEALTHBOX_GFX_79, - HEALTHBOX_GFX_STATUS_FRZ_BANK1, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER1, HEALTHBOX_GFX_81, HEALTHBOX_GFX_82, - HEALTHBOX_GFX_STATUS_BRN_BANK1, + HEALTHBOX_GFX_STATUS_BRN_BATTLER1, HEALTHBOX_GFX_84, HEALTHBOX_GFX_85, - HEALTHBOX_GFX_STATUS_PSN_BANK2, + HEALTHBOX_GFX_STATUS_PSN_BATTLER2, HEALTHBOX_GFX_87, HEALTHBOX_GFX_88, - HEALTHBOX_GFX_STATUS_PRZ_BANK2, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER2, HEALTHBOX_GFX_90, HEALTHBOX_GFX_91, - HEALTHBOX_GFX_STATUS_SLP_BANK2, + HEALTHBOX_GFX_STATUS_SLP_BATTLER2, HEALTHBOX_GFX_93, HEALTHBOX_GFX_94, - HEALTHBOX_GFX_STATUS_FRZ_BANK2, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER2, HEALTHBOX_GFX_96, HEALTHBOX_GFX_97, - HEALTHBOX_GFX_STATUS_BRN_BANK2, + HEALTHBOX_GFX_STATUS_BRN_BATTLER2, HEALTHBOX_GFX_99, HEALTHBOX_GFX_100, - HEALTHBOX_GFX_STATUS_PSN_BANK3, + HEALTHBOX_GFX_STATUS_PSN_BATTLER3, HEALTHBOX_GFX_102, HEALTHBOX_GFX_103, - HEALTHBOX_GFX_STATUS_PRZ_BANK3, + HEALTHBOX_GFX_STATUS_PRZ_BATTLER3, HEALTHBOX_GFX_105, HEALTHBOX_GFX_106, - HEALTHBOX_GFX_STATUS_SLP_BANK3, + HEALTHBOX_GFX_STATUS_SLP_BATTLER3, HEALTHBOX_GFX_108, HEALTHBOX_GFX_109, - HEALTHBOX_GFX_STATUS_FRZ_BANK3, + HEALTHBOX_GFX_STATUS_FRZ_BATTLER3, HEALTHBOX_GFX_111, HEALTHBOX_GFX_112, - HEALTHBOX_GFX_STATUS_BRN_BANK3, + HEALTHBOX_GFX_STATUS_BRN_BATTLER3, HEALTHBOX_GFX_114, HEALTHBOX_GFX_115, HEALTHBOX_GFX_116, HEALTHBOX_GFX_117, }; -extern const u8 * const gNatureNamePointers[]; +extern const u8 *const gNatureNamePointers[]; // strings extern const u8 gText_Slash[]; @@ -179,28 +179,28 @@ static void RemoveWindowOnHealthbox(u32 windowId); static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId); -static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2); -static void sub_80751E4(void *dest, u8 *windowTileData, u32 arg2); -static void sub_8075170(void *dest, u8 *windowTileData, u32 arg2); -static void sub_807513C(void *dest, u32 arg1, u32 arg2); +static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 arg2); +static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2); +static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2); +static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2); static void sub_8073E08(u8 taskId); static void sub_8073F98(u8 taskId); static void sub_8073E64(u8 taskId); -static void sub_8072924(struct Sprite *sprite); -static void sub_80728B4(struct Sprite *sprite); +static void SpriteCB_HealthBoxOther(struct Sprite *sprite); +static void SpriteCB_HealthBar(struct Sprite *sprite); static void sub_8074158(struct Sprite *sprite); static void sub_8074090(struct Sprite *sprite); static void SpriteCB_StatusSummaryBar(struct Sprite *sprite); static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite); static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite); -static u8 GetStatusIconForBankId(u8 statusElementId, u8 battlerId); -static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5); +static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId); +static s32 CalcNewBarValue(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5); static u8 GetScaledExpFraction(s32 currValue, s32 receivedValue, s32 maxValue, u8 scale); -static void sub_8074B9C(u8 battlerId, u8 whichBar); -static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 *arg4, u8 arg5); +static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar); +static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale); static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2); // const rom data @@ -276,7 +276,7 @@ static const struct SpriteTemplate sHealthboxSafariSpriteTemplate = .callback = SpriteCallbackDummy }; -static const struct OamData sUnknown_0832C1B8 = +static const struct OamData sOamData_Healthbar = { .y = 0, .affineMode = 0, @@ -293,43 +293,43 @@ static const struct OamData sUnknown_0832C1B8 = .affineParam = 0, }; -static const struct SpriteTemplate sUnknown_0832C1C0[4] = +static const struct SpriteTemplate sHealthbarSpriteTemplates[MAX_BATTLERS_COUNT] = { { - .tileTag = 0xd704, - .paletteTag = 0xd704, - .oam = &sUnknown_0832C1B8, + .tileTag = TAG_HEALTHBAR_PLAYER1_TILE, + .paletteTag = TAG_HEALTHBAR_PAL, + .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80728B4 + .callback = SpriteCB_HealthBar }, { - .tileTag = 0xd705, - .paletteTag = 0xd704, - .oam = &sUnknown_0832C1B8, + .tileTag = TAG_HEALTHBAR_OPPONENT1_TILE, + .paletteTag = TAG_HEALTHBAR_PAL, + .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80728B4 + .callback = SpriteCB_HealthBar }, { - .tileTag = 0xd706, - .paletteTag = 0xd704, - .oam = &sUnknown_0832C1B8, + .tileTag = TAG_HEALTHBAR_PLAYER2_TILE, + .paletteTag = TAG_HEALTHBAR_PAL, + .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80728B4 + .callback = SpriteCB_HealthBar }, { - .tileTag = 0xd707, - .paletteTag = 0xd704, - .oam = &sUnknown_0832C1B8, + .tileTag = TAG_HEALTHBAR_OPPONENT2_TILE, + .paletteTag = TAG_HEALTHBAR_PAL, + .oam = &sOamData_Healthbar, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80728B4 + .callback = SpriteCB_HealthBar } }; @@ -648,7 +648,7 @@ static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) } #else -ASM_DIRECT +NAKED static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) { asm(".syntax unified\n\ @@ -883,112 +883,126 @@ void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2) sub_8072308(arg0, arg2 + 5, 1); } -// because the healthbox is too large to fit into one sprite, it is divided into two sprites -// healthboxSpriteId_1 or healthboxSpriteId refers to the 'main' healthbox -// healthboxSpriteId_2 refers to the other part -// there's also one other sprite that appears to be a black square? dont fully understand its role +// Because the healthbox is too large to fit into one sprite, it is divided into two sprites. +// healthboxLeft or healthboxMain is the left part that is used as the 'main' sprite. +// healthboxRight or healthboxOther is the right part of the healthbox. +// There's also the third sprite under name of healthbarSprite that refers to the healthbar visible on the healtbox. -u8 CreateBattlerHealthboxSprites(u8 battler) +// data fields for healthboxMain +// oam.affineParam holds healthboxRight spriteId +#define hMain_HealthBarSpriteId data[5] +#define hMain_Battler data[6] +#define hMain_Data7 data[7] + +// data fields for healthboxRight +#define hOther_HealthBoxSpriteId data[5] + +// data fields for healthbar +#define hBar_HealthBoxSpriteId data[5] +#define hBar_Data6 data[6] + +u8 CreateBattlerHealthboxSprites(u8 battlerId) { s16 data6 = 0; - u8 healthboxSpriteId_1, healthboxSpriteId_2; - u8 unkSpriteId; - struct Sprite *unkSpritePtr; + u8 healthboxLeftSpriteId, healthboxRightSpriteId; + u8 healthbarSpriteId; + struct Sprite *healthBarSpritePtr; if (!IsDoubleBattle()) { - if (GetBattlerSide(battler) == B_SIDE_PLAYER) + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { - healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); - gSprites[healthboxSpriteId_1].oam.shape = 0; + gSprites[healthboxLeftSpriteId].oam.shape = 0; - gSprites[healthboxSpriteId_2].oam.shape = 0; - gSprites[healthboxSpriteId_2].oam.tileNum += 64; + gSprites[healthboxRightSpriteId].oam.shape = 0; + gSprites[healthboxRightSpriteId].oam.tileNum += 64; } else { - healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); - gSprites[healthboxSpriteId_2].oam.tileNum += 32; + gSprites[healthboxRightSpriteId].oam.tileNum += 32; data6 = 2; } - gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; - gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; - gSprites[healthboxSpriteId_2].callback = sub_8072924; + gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; + + gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId; + gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther; } else { - if (GetBattlerSide(battler) == B_SIDE_PLAYER) + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { - healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); - gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; + gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; - gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; - gSprites[healthboxSpriteId_2].oam.tileNum += 32; - gSprites[healthboxSpriteId_2].callback = sub_8072924; + gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId; + gSprites[healthboxRightSpriteId].oam.tileNum += 32; + gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther; data6 = 1; } else { - healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], 240, 160, 1); - gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; + gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; - gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; - gSprites[healthboxSpriteId_2].oam.tileNum += 32; - gSprites[healthboxSpriteId_2].callback = sub_8072924; + gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId; + gSprites[healthboxRightSpriteId].oam.tileNum += 32; + gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther; data6 = 2; } } - unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBattlerPositions[battler]], 140, 60, 0); - unkSpritePtr = &gSprites[unkSpriteId]; - SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBattlerSide(battler)]); - unkSpritePtr->subspriteMode = 2; - unkSpritePtr->oam.priority = 1; + healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battlerId]], 140, 60, 0); + healthBarSpritePtr = &gSprites[healthbarSpriteId]; + SetSubspriteTables(healthBarSpritePtr, &sUnknown_0832C28C[GetBattlerSide(battlerId)]); + healthBarSpritePtr->subspriteMode = 2; + healthBarSpritePtr->oam.priority = 1; - CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + healthBarSpritePtr->oam.tileNum * 32), 64); - gSprites[healthboxSpriteId_1].data[5] = unkSpriteId; - gSprites[healthboxSpriteId_1].data[6] = battler; - gSprites[healthboxSpriteId_1].invisible = 1; + gSprites[healthboxLeftSpriteId].hMain_HealthBarSpriteId = healthbarSpriteId; + gSprites[healthboxLeftSpriteId].hMain_Battler = battlerId; + gSprites[healthboxLeftSpriteId].invisible = 1; - gSprites[healthboxSpriteId_2].invisible = 1; + gSprites[healthboxRightSpriteId].invisible = 1; - unkSpritePtr->data[5] = healthboxSpriteId_1; - unkSpritePtr->data[6] = data6; - unkSpritePtr->invisible = 1; + healthBarSpritePtr->hBar_HealthBoxSpriteId = healthboxLeftSpriteId; + healthBarSpritePtr->hBar_Data6 = data6; + healthBarSpritePtr->invisible = 1; - return healthboxSpriteId_1; + return healthboxLeftSpriteId; } u8 CreateSafariPlayerHealthboxSprites(void) { - u8 healthboxSpriteId_1, healthboxSpriteId_2; + u8 healthboxLeftSpriteId, healthboxRightSpriteId; - healthboxSpriteId_1 = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1); - gSprites[healthboxSpriteId_1].oam.shape = 0; - gSprites[healthboxSpriteId_2].oam.shape = 0; + gSprites[healthboxLeftSpriteId].oam.shape = 0; + gSprites[healthboxRightSpriteId].oam.shape = 0; - gSprites[healthboxSpriteId_2].oam.tileNum += 64; + gSprites[healthboxRightSpriteId].oam.tileNum += 64; - gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; - gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1; + gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; + gSprites[healthboxRightSpriteId].hOther_HealthBoxSpriteId = healthboxLeftSpriteId; - gSprites[healthboxSpriteId_2].callback = sub_8072924; + gSprites[healthboxRightSpriteId].callback = SpriteCB_HealthBoxOther; - return healthboxSpriteId_1; + return healthboxLeftSpriteId; } static const u8 *GetHealthboxElementGfxPtr(u8 elementId) @@ -996,62 +1010,63 @@ static const u8 *GetHealthboxElementGfxPtr(u8 elementId) return gHealthboxElementsGfxTable[elementId]; } -static void sub_80728B4(struct Sprite *sprite) +// Syncs the position of healthbar accordingly with the healthbox. +static void SpriteCB_HealthBar(struct Sprite *sprite) { - u8 var = sprite->data[5]; + u8 healthboxSpriteId = sprite->hBar_HealthBoxSpriteId; - switch (sprite->data[6]) + switch (sprite->hBar_Data6) { case 0: - sprite->pos1.x = gSprites[var].pos1.x + 16; - sprite->pos1.y = gSprites[var].pos1.y; + sprite->pos1.x = gSprites[healthboxSpriteId].pos1.x + 16; + sprite->pos1.y = gSprites[healthboxSpriteId].pos1.y; break; case 1: - sprite->pos1.x = gSprites[var].pos1.x + 16; - sprite->pos1.y = gSprites[var].pos1.y; + sprite->pos1.x = gSprites[healthboxSpriteId].pos1.x + 16; + sprite->pos1.y = gSprites[healthboxSpriteId].pos1.y; break; case 2: default: - sprite->pos1.x = gSprites[var].pos1.x + 8; - sprite->pos1.y = gSprites[var].pos1.y; + sprite->pos1.x = gSprites[healthboxSpriteId].pos1.x + 8; + sprite->pos1.y = gSprites[healthboxSpriteId].pos1.y; break; } - sprite->pos2.x = gSprites[var].pos2.x; - sprite->pos2.y = gSprites[var].pos2.y; + sprite->pos2.x = gSprites[healthboxSpriteId].pos2.x; + sprite->pos2.y = gSprites[healthboxSpriteId].pos2.y; } -static void sub_8072924(struct Sprite *sprite) +static void SpriteCB_HealthBoxOther(struct Sprite *sprite) { - u8 otherSpriteId = sprite->data[5]; + u8 healthboxMainSpriteId = sprite->hOther_HealthBoxSpriteId; - sprite->pos1.x = gSprites[otherSpriteId].pos1.x + 64; - sprite->pos1.y = gSprites[otherSpriteId].pos1.y; + sprite->pos1.x = gSprites[healthboxMainSpriteId].pos1.x + 64; + sprite->pos1.y = gSprites[healthboxMainSpriteId].pos1.y; - sprite->pos2.x = gSprites[otherSpriteId].pos2.x; - sprite->pos2.y = gSprites[otherSpriteId].pos2.y; + sprite->pos2.x = gSprites[healthboxMainSpriteId].pos2.x; + sprite->pos2.y = gSprites[healthboxMainSpriteId].pos2.y; } -void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue) +void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue) { gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId = healthboxSpriteId; gBattleSpritesDataPtr->battleBars[battlerId].maxValue = maxVal; - gBattleSpritesDataPtr->battleBars[battlerId].currentValue = currVal; + gBattleSpritesDataPtr->battleBars[battlerId].oldValue = oldVal; gBattleSpritesDataPtr->battleBars[battlerId].receivedValue = receivedValue; - gBattleSpritesDataPtr->battleBars[battlerId].field_10 = -32768; + gBattleSpritesDataPtr->battleBars[battlerId].currValue = -32768; } void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) { gSprites[healthboxSpriteId].invisible = 1; - gSprites[gSprites[healthboxSpriteId].data[5]].invisible = 1; + gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = 1; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 1; } void SetHealthboxSpriteVisible(u8 healthboxSpriteId) { gSprites[healthboxSpriteId].invisible = 0; - gSprites[gSprites[healthboxSpriteId].data[5]].invisible = 0; + gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId].invisible = 0; gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 0; } @@ -1064,11 +1079,11 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) void DestoryHealthboxSprite(u8 healthboxSpriteId) { DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]); - DestroySprite(&gSprites[gSprites[healthboxSpriteId].data[5]]); + DestroySprite(&gSprites[gSprites[healthboxSpriteId].hMain_HealthBarSpriteId]); DestroySprite(&gSprites[healthboxSpriteId]); } -void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly) +void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerOnly) { } @@ -1079,13 +1094,13 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority) for (i = 0; i < gBattlersCount; i++) { - u8 healthboxSpriteId_1 = gHealthboxSpriteIds[i]; - u8 healthboxSpriteId_2 = gSprites[gHealthboxSpriteIds[i]].oam.affineParam; - u8 healthboxSpriteId_3 = gSprites[gHealthboxSpriteIds[i]].data[5]; + u8 healthboxLeftSpriteId = gHealthboxSpriteIds[i]; + u8 healthboxRightSpriteId = gSprites[gHealthboxSpriteIds[i]].oam.affineParam; + u8 healthbarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId; - gSprites[healthboxSpriteId_1].oam.priority = priority; - gSprites[healthboxSpriteId_2].oam.priority = priority; - gSprites[healthboxSpriteId_3].oam.priority = priority; + gSprites[healthboxLeftSpriteId].oam.priority = priority; + gSprites[healthboxRightSpriteId].oam.priority = priority; + gSprites[healthbarSpriteId].oam.priority = priority; } } @@ -1146,7 +1161,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; - if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER) + if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) { objVram = (void*)(OBJ_VRAM0); if (!IsDoubleBattle()) @@ -1159,7 +1174,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) objVram = (void*)(OBJ_VRAM0); objVram += spriteTileNum + 0x400; } - sub_8075198(objVram, windowTileData, 3); + TextIntoHealthboxObject(objVram, windowTileData, 3); RemoveWindowOnHealthbox(windowId); } @@ -1170,7 +1185,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) u8 text[32]; void *objVram; - if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER && !IsDoubleBattle()) + if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER && !IsDoubleBattle()) { spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; if (maxOrCurrent != HP_CURRENT) // singles, max @@ -1179,7 +1194,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 2, &windowId); objVram = (void*)(OBJ_VRAM0); objVram += spriteTileNum + 0xB40; - sub_8075170(objVram, windowTileData, 2); + HpTextIntoHealthboxObject(objVram, windowTileData, 2); RemoveWindowOnHealthbox(windowId); } else // singles, current @@ -1190,20 +1205,19 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 2, &windowId); objVram = (void*)(OBJ_VRAM0); objVram += spriteTileNum + 0x3E0; - sub_8075170(objVram, windowTileData, 1); + HpTextIntoHealthboxObject(objVram, windowTileData, 1); objVram = (void*)(OBJ_VRAM0); objVram += spriteTileNum + 0xB00; - sub_8075170(objVram, windowTileData + 0x20, 2); + HpTextIntoHealthboxObject(objVram, windowTileData + 0x20, 2); RemoveWindowOnHealthbox(windowId); } - } else { u8 battler; memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); - battler = gSprites[healthboxSpriteId].data[6]; + battler = gSprites[healthboxSpriteId].hMain_Battler; if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT) { UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); @@ -1248,7 +1262,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 u8 text[32]; void *objVram; - if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER) + if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) { if (gBattleSpritesDataPtr->battlerData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible { @@ -1259,7 +1273,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 { ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 0, &windowId); - sub_8075170((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2); + HpTextIntoHealthboxObject((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2); RemoveWindowOnHealthbox(windowId); CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116), (void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * 32), @@ -1271,8 +1285,8 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 text[3] = CHAR_SLASH; text[4] = EOS; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 0, &windowId); - sub_807513C(objVram, 0, 3); - sub_8075170((void*)(OBJ_VRAM0 + 0x60) + spriteTileNum, windowTileData, 3); + FillHealthboxObject(objVram, 0, 3); // Erases HP bar leftover. + HpTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x60) + spriteTileNum, windowTileData, 3); RemoveWindowOnHealthbox(windowId); } } @@ -1282,7 +1296,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 u8 battlerId; memcpy(text, sUnknown_0832C3D8, sizeof(sUnknown_0832C3D8)); - battlerId = gSprites[healthboxSpriteId].data[6]; + battlerId = gSprites[healthboxSpriteId].hMain_Battler; if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) // don't print text if only bars are visible { @@ -1325,7 +1339,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 } else { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) // impossible to reach part, because the battlerId is from the opponent's side + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) // Impossible to reach part, because the battlerId is from the opponent's side. { CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116), (void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32), @@ -1336,15 +1350,16 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 } } -static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) +// Prints mon's nature, catch and flee rate. Probably used to test pokeblock-related features. +static void PrintSafariMonInfo(u8 healthboxSpriteId, struct Pokemon *mon) { u8 text[20]; s32 j, var2; u8 *barFontGfx; - u8 i, var, nature, healthboxSpriteId_2; + u8 i, var, nature, healthBarSpriteId; memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); - barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].data[6]) * 384)]; + barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].hMain_Battler) * 384)]; var = 5; nature = GetNature(mon); StringCopy(text + 6, gNatureNamePointers[nature]); @@ -1375,26 +1390,26 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) barFontGfx += 0x20; } - healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5]; - ConvertIntToDecimalStringN(text + 6, gBattleStruct->field_7C, STR_CONV_MODE_RIGHT_ALIGN, 2); - ConvertIntToDecimalStringN(text + 9, gBattleStruct->field_7B, STR_CONV_MODE_RIGHT_ALIGN, 2); + healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; + ConvertIntToDecimalStringN(text + 6, gBattleStruct->safariCatchFactor, STR_CONV_MODE_RIGHT_ALIGN, 2); + ConvertIntToDecimalStringN(text + 9, gBattleStruct->safariEscapeFactor, STR_CONV_MODE_RIGHT_ALIGN, 2); text[5] = CHAR_SPACE; text[8] = CHAR_SLASH; RenderTextFont9(gMonSpritesGfxPtr->barFontGfx, 9, text); - j = healthboxSpriteId_2; // needed to match for some reason + j = healthBarSpriteId; // Needed to match for some reason. for (j = 0; j < 5; j++) { if (j <= 1) { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20], - (void*)(OBJ_VRAM0) + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + j) * 32, + (void*)(OBJ_VRAM0) + (gSprites[healthBarSpriteId].oam.tileNum + 2 + j) * 32, 32); } else { CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20], - (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthboxSpriteId_2].oam.tileNum) * 32, + (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthBarSpriteId].oam.tileNum) * 32, 32); } } @@ -1403,7 +1418,7 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) void SwapHpBarsWithHpText(void) { s32 i; - u8 spriteId; + u8 healthBarSpriteId; for (i = 0; i < gBattlersCount; i++) { @@ -1424,9 +1439,9 @@ void SwapHpBarsWithHpText(void) if (noBars == TRUE) // bars to text { - spriteId = gSprites[gHealthboxSpriteIds[i]].data[5]; + healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId; - CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 0x100); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX); } @@ -1443,13 +1458,14 @@ void SwapHpBarsWithHpText(void) { if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { - sub_80730D4(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]); + // Most likely a debug function. + PrintSafariMonInfo(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]); } else { - spriteId = gSprites[gHealthboxSpriteIds[i]].data[5]; + healthBarSpriteId = gSprites[gHealthboxSpriteIds[i]].hMain_HealthBarSpriteId; - CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 0x100); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT); UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX); } @@ -1462,18 +1478,24 @@ void SwapHpBarsWithHpText(void) UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_NICK); } } - gSprites[gHealthboxSpriteIds[i]].data[7] ^= 1; + gSprites[gHealthboxSpriteIds[i]].hMain_Data7 ^= 1; } } } +#define tBattler data[0] +#define tSummaryBarSpriteId data[1] +#define tBallIconSpriteId(n) data[3 + n] +#define tIsBattleStart data[10] +#define tData15 data[15] + u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart) { bool8 isOpponent; s16 bar_X, bar_Y, bar_pos2_X, bar_data0; s32 i, j, var; - u8 barSpriteId; - u8 ballIconSpritesIds[6]; + u8 summaryBarSpriteId; + u8 ballIconSpritesIds[PARTY_SIZE]; u8 taskId; if (!arg2 || GetBattlerPosition(battlerId) != B_POSITION_OPPONENT_RIGHT) @@ -1511,19 +1533,19 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, LoadSpritePalette(&sStatusSummaryBarSpritePal); LoadSpritePalette(&sStatusSummaryBallsSpritePal); - barSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10); - SetSubspriteTables(&gSprites[barSpriteId], sStatusSummaryBar_SubspriteTable); - gSprites[barSpriteId].pos2.x = bar_pos2_X; - gSprites[barSpriteId].data[0] = bar_data0; + summaryBarSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10); + SetSubspriteTables(&gSprites[summaryBarSpriteId], sStatusSummaryBar_SubspriteTable); + gSprites[summaryBarSpriteId].pos2.x = bar_pos2_X; + gSprites[summaryBarSpriteId].data[0] = bar_data0; if (isOpponent) { - gSprites[barSpriteId].pos1.x -= 96; - gSprites[barSpriteId].oam.matrixNum = 8; + gSprites[summaryBarSpriteId].pos1.x -= 96; + gSprites[summaryBarSpriteId].oam.matrixNum = 8; } else { - gSprites[barSpriteId].pos1.x += 96; + gSprites[summaryBarSpriteId].pos1.x += 96; } for (i = 0; i < PARTY_SIZE; i++) @@ -1539,7 +1561,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, gSprites[ballIconSpritesIds[i]].pos2.y = 0; } - gSprites[ballIconSpritesIds[i]].data[0] = barSpriteId; + gSprites[ballIconSpritesIds[i]].data[0] = summaryBarSpriteId; if (!isOpponent) { @@ -1561,7 +1583,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg { @@ -1580,7 +1602,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } else { - for (i = 0, var = 5, j = 0; j < 6; j++) + for (i = 0, var = 5, j = 0; j < PARTY_SIZE; j++) { if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg { @@ -1609,7 +1631,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, { if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) { - for (var = 5, i = 0; i < 6; i++) + for (var = 5, i = 0; i < PARTY_SIZE; i++) { if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg { @@ -1629,7 +1651,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } else { - for (var = 0, i = 0, j = 0; j < 6; j++) + for (var = 0, i = 0, j = 0; j < PARTY_SIZE; j++) { if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg { @@ -1656,13 +1678,13 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } taskId = CreateTask(TaskDummy, 5); - gTasks[taskId].data[0] = battlerId; - gTasks[taskId].data[1] = barSpriteId; + gTasks[taskId].tBattler = battlerId; + gTasks[taskId].tSummaryBarSpriteId = summaryBarSpriteId; - for (i = 0; i < 6; i++) - gTasks[taskId].data[3 + i] = ballIconSpritesIds[i]; + for (i = 0; i < PARTY_SIZE; i++) + gTasks[taskId].tBallIconSpriteId(i) = ballIconSpritesIds[i]; - gTasks[taskId].data[10] = isBattleStart; + gTasks[taskId].tIsBattleStart = isBattleStart; if (isBattleStart) { @@ -1673,54 +1695,54 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, return taskId; } -void sub_8073C30(u8 taskId) +void Task_HidePartyStatusSummary(u8 taskId) { - u8 sp[6]; - u8 r7; - u8 r10; + u8 ballIconSpriteIds[PARTY_SIZE]; + bool8 isBattleStart; + u8 summaryBarSpriteId; u8 battlerId; s32 i; - r7 = gTasks[taskId].data[10]; - r10 = gTasks[taskId].data[1]; - battlerId = gTasks[taskId].data[0]; + isBattleStart = gTasks[taskId].tIsBattleStart; + summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; + battlerId = gTasks[taskId].tBattler; - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; + for (i = 0; i < PARTY_SIZE; i++) + ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); - SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); - gTasks[taskId].data[15] = 16; + gTasks[taskId].tData15 = 16; - for (i = 0; i < 6; i++) - gSprites[sp[i]].oam.objMode = 1; + for (i = 0; i < PARTY_SIZE; i++) + gSprites[ballIconSpriteIds[i]].oam.objMode = 1; - gSprites[r10].oam.objMode = 1; + gSprites[summaryBarSpriteId].oam.objMode = 1; - if (r7 != 0) + if (isBattleStart) { - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) { - gSprites[sp[5 - i]].data[1] = 7 * i; - gSprites[sp[5 - i]].data[3] = 0; - gSprites[sp[5 - i]].data[4] = 0; - gSprites[sp[5 - i]].callback = sub_8074158; + gSprites[ballIconSpriteIds[5 - i]].data[1] = 7 * i; + gSprites[ballIconSpriteIds[5 - i]].data[3] = 0; + gSprites[ballIconSpriteIds[5 - i]].data[4] = 0; + gSprites[ballIconSpriteIds[5 - i]].callback = sub_8074158; } else { - gSprites[sp[i]].data[1] = 7 * i; - gSprites[sp[i]].data[3] = 0; - gSprites[sp[i]].data[4] = 0; - gSprites[sp[i]].callback = sub_8074158; + gSprites[ballIconSpriteIds[i]].data[1] = 7 * i; + gSprites[ballIconSpriteIds[i]].data[3] = 0; + gSprites[ballIconSpriteIds[i]].data[4] = 0; + gSprites[ballIconSpriteIds[i]].callback = sub_8074158; } } - gSprites[r10].data[0] /= 2; - gSprites[r10].data[1] = 0; - gSprites[r10].callback = sub_8074090; - SetSubspriteTables(&gSprites[r10], sUnknown_0832C2CC); + gSprites[summaryBarSpriteId].data[0] /= 2; + gSprites[summaryBarSpriteId].data[1] = 0; + gSprites[summaryBarSpriteId].callback = sub_8074090; + SetSubspriteTables(&gSprites[summaryBarSpriteId], sUnknown_0832C2CC); gTasks[taskId].func = sub_8073E08; } else @@ -1731,54 +1753,50 @@ void sub_8073C30(u8 taskId) static void sub_8073E08(u8 taskId) { - u16 temp = gTasks[taskId].data[11]++; - - if (!(temp & 1)) + if ((gTasks[taskId].data[11]++ % 2) == 0) { - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] < 0) + if (--gTasks[taskId].tData15 < 0) return; SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8)); } - if (gTasks[taskId].data[15] == 0) + if (gTasks[taskId].tData15 == 0) gTasks[taskId].func = sub_8073E64; } static void sub_8073E64(u8 taskId) { - u8 sp[6]; + u8 ballIconSpriteIds[PARTY_SIZE]; s32 i; - u8 battlerId = gTasks[taskId].data[0]; - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] == -1) + u8 battlerId = gTasks[taskId].tBattler; + if (--gTasks[taskId].tData15 == -1) { - u8 var = gTasks[taskId].data[1]; + u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; + for (i = 0; i < PARTY_SIZE; i++) + ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); gBattleSpritesDataPtr->animationData->field_9_x1C--; - if (!gBattleSpritesDataPtr->animationData->field_9_x1C) + if (gBattleSpritesDataPtr->animationData->field_9_x1C == 0) { - DestroySpriteAndFreeResources(&gSprites[var]); - DestroySpriteAndFreeResources(&gSprites[sp[0]]); + DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]); + DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]); } else { - FreeSpriteOamMatrix(&gSprites[var]); - DestroySprite(&gSprites[var]); - FreeSpriteOamMatrix(&gSprites[sp[0]]); - DestroySprite(&gSprites[sp[0]]); + FreeSpriteOamMatrix(&gSprites[summaryBarSpriteId]); + DestroySprite(&gSprites[summaryBarSpriteId]); + FreeSpriteOamMatrix(&gSprites[ballIconSpriteIds[0]]); + DestroySprite(&gSprites[ballIconSpriteIds[0]]); } - for (i = 1; i < 6; i++) - DestroySprite(&gSprites[sp[i]]); + for (i = 1; i < PARTY_SIZE; i++) + DestroySprite(&gSprites[ballIconSpriteIds[i]]); } - else if (gTasks[taskId].data[15] == -3) + else if (gTasks[taskId].tData15 == -3) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].flag_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyTask(taskId); @@ -1787,37 +1805,42 @@ static void sub_8073E64(u8 taskId) static void sub_8073F98(u8 taskId) { - u8 sp[6]; + u8 ballIconSpriteIds[PARTY_SIZE]; s32 i; + u8 battlerId = gTasks[taskId].tBattler; - u8 battlerId = gTasks[taskId].data[0]; - gTasks[taskId].data[15]--; - if (gTasks[taskId].data[15] >= 0) + if (--gTasks[taskId].tData15 >= 0) { - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8)); + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tData15) | ((16 - gTasks[taskId].tData15) << 8)); } - else if (gTasks[taskId].data[15] == -1) + else if (gTasks[taskId].tData15 == -1) { - u8 var = gTasks[taskId].data[1]; + u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; - for (i = 0; i < 6; i++) - sp[i] = gTasks[taskId].data[3 + i]; + for (i = 0; i < PARTY_SIZE; i++) + ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); - DestroySpriteAndFreeResources(&gSprites[var]); - DestroySpriteAndFreeResources(&gSprites[sp[0]]); + DestroySpriteAndFreeResources(&gSprites[summaryBarSpriteId]); + DestroySpriteAndFreeResources(&gSprites[ballIconSpriteIds[0]]); - for (i = 1; i < 6; i++) - DestroySprite(&gSprites[sp[i]]); + for (i = 1; i < PARTY_SIZE; i++) + DestroySprite(&gSprites[ballIconSpriteIds[i]]); } - else if (gTasks[taskId].data[15] == -3) + else if (gTasks[taskId].tData15 == -3) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].flag_x1 = 0; + gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyTask(taskId); } } +#undef tBattler +#undef tSummaryBarSpriteId +#undef tBallIconSpriteId +#undef tIsBattleStart +#undef tData15 + static void SpriteCB_StatusSummaryBar(struct Sprite *sprite) { if (sprite->pos2.x != 0) @@ -1956,17 +1979,17 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER) { - sub_8075198((void*)(0x6010040 + spriteTileNum), windowTileData, 6); + TextIntoHealthboxObject((void*)(VRAM + 0x10040 + spriteTileNum), windowTileData, 6); ptr = (void*)(OBJ_VRAM0); if (!IsDoubleBattle()) ptr += spriteTileNum + 0x800; else ptr += spriteTileNum + 0x400; - sub_8075198(ptr, windowTileData + 0xC0, 1); + TextIntoHealthboxObject(ptr, windowTileData + 0xC0, 1); } else { - sub_8075198((void*)(0x6010020 + spriteTileNum), windowTileData, 7); + TextIntoHealthboxObject((void*)(VRAM + 0x10020 + spriteTileNum), windowTileData, 7); } RemoveWindowOnHealthbox(windowId); @@ -1974,38 +1997,38 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) { - u8 battlerId, healthboxSpriteId_2; + u8 battlerId, healthBarSpriteId; if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) return; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) return; - battlerId = gSprites[healthboxSpriteId].data[6]; + battlerId = gSprites[healthboxSpriteId].hMain_Battler; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) return; if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) return; - healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5]; + healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; if (noStatus) - CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * 32), 32); else - CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); + CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 8) * 32), 32); } static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) { s32 i; - u8 battlerId, healthboxSpriteId_2; + u8 battlerId, healthBarSpriteId; u32 status, pltAdder; const u8 *statusGfxPtr; s16 tileNumAdder; u8 statusPalId; - battlerId = gSprites[healthboxSpriteId].data[6]; - healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5]; + battlerId = gSprites[healthboxSpriteId].hMain_Battler; + healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) { status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); @@ -2022,27 +2045,27 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) if (status & STATUS1_SLEEP) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_SLP_BANK0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_SLP_BATTLER0, battlerId)); statusPalId = PAL_STATUS_SLP; } else if (status & STATUS1_PSN_ANY) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PSN_BANK0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PSN_BATTLER0, battlerId)); statusPalId = PAL_STATUS_PSN; } else if (status & STATUS1_BURN) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_BRN_BANK0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_BRN_BATTLER0, battlerId)); statusPalId = PAL_STATUS_BRN; } else if (status & STATUS1_FREEZE) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_FRZ_BANK0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, battlerId)); statusPalId = PAL_STATUS_FRZ; } else if (status & STATUS1_PARALYSIS) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PRZ_BANK0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, battlerId)); statusPalId = PAL_STATUS_PAR; } else @@ -2053,7 +2076,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32); if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) - CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 64); TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE); return; @@ -2069,68 +2092,68 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) { if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) { - CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32); - CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * 32), 32); } } TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); } -static u8 GetStatusIconForBankId(u8 statusElementId, u8 battlerId) +static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId) { u8 ret = statusElementId; switch (statusElementId) { - case HEALTHBOX_GFX_STATUS_PSN_BANK0: + case HEALTHBOX_GFX_STATUS_PSN_BATTLER0: if (battlerId == 0) - ret = HEALTHBOX_GFX_STATUS_PSN_BANK0; + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER0; else if (battlerId == 1) - ret = HEALTHBOX_GFX_STATUS_PSN_BANK1; + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER1; else if (battlerId == 2) - ret = HEALTHBOX_GFX_STATUS_PSN_BANK2; + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER2; else - ret = HEALTHBOX_GFX_STATUS_PSN_BANK3; + ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER3; break; - case HEALTHBOX_GFX_STATUS_PRZ_BANK0: + case HEALTHBOX_GFX_STATUS_PRZ_BATTLER0: if (battlerId == 0) - ret = HEALTHBOX_GFX_STATUS_PRZ_BANK0; + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER0; else if (battlerId == 1) - ret = HEALTHBOX_GFX_STATUS_PRZ_BANK1; + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER1; else if (battlerId == 2) - ret = HEALTHBOX_GFX_STATUS_PRZ_BANK2; + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER2; else - ret = HEALTHBOX_GFX_STATUS_PRZ_BANK3; + ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER3; break; - case HEALTHBOX_GFX_STATUS_SLP_BANK0: + case HEALTHBOX_GFX_STATUS_SLP_BATTLER0: if (battlerId == 0) - ret = HEALTHBOX_GFX_STATUS_SLP_BANK0; + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER0; else if (battlerId == 1) - ret = HEALTHBOX_GFX_STATUS_SLP_BANK1; + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER1; else if (battlerId == 2) - ret = HEALTHBOX_GFX_STATUS_SLP_BANK2; + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER2; else - ret = HEALTHBOX_GFX_STATUS_SLP_BANK3; + ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER3; break; - case HEALTHBOX_GFX_STATUS_FRZ_BANK0: + case HEALTHBOX_GFX_STATUS_FRZ_BATTLER0: if (battlerId == 0) - ret = HEALTHBOX_GFX_STATUS_FRZ_BANK0; + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER0; else if (battlerId == 1) - ret = HEALTHBOX_GFX_STATUS_FRZ_BANK1; + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER1; else if (battlerId == 2) - ret = HEALTHBOX_GFX_STATUS_FRZ_BANK2; + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER2; else - ret = HEALTHBOX_GFX_STATUS_FRZ_BANK3; + ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER3; break; - case HEALTHBOX_GFX_STATUS_BRN_BANK0: + case HEALTHBOX_GFX_STATUS_BRN_BATTLER0: if (battlerId == 0) - ret = HEALTHBOX_GFX_STATUS_BRN_BANK0; + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER0; else if (battlerId == 1) - ret = HEALTHBOX_GFX_STATUS_BRN_BANK1; + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER1; else if (battlerId == 2) - ret = HEALTHBOX_GFX_STATUS_BRN_BANK2; + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER2; else - ret = HEALTHBOX_GFX_STATUS_BRN_BANK3; + ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER3; break; } return ret; @@ -2143,8 +2166,8 @@ static void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; - sub_8075198((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6); - sub_8075198((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2); + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6); + TextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2); RemoveWindowOnHealthbox(windowId); } @@ -2160,20 +2183,20 @@ static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, text, 0x2F), 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; - sub_80751E4((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2); - sub_80751E4((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4); + SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2); + SafariTextIntoHealthboxObject((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4); RemoveWindowOnHealthbox(windowId); } void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) { s32 maxHp, currHp; - u8 battlerId = gSprites[healthboxSpriteId].data[6]; + u8 battlerId = gSprites[healthboxSpriteId].hMain_Battler; if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) - GetBattlerSide(battlerId); // pointless function call + GetBattlerSide(battlerId); // Pointless function call. - if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER) + if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) { u8 isDoubles; @@ -2189,7 +2212,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem maxHp = GetMonData(mon, MON_DATA_MAX_HP); currHp = GetMonData(mon, MON_DATA_HP); SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); - sub_8074AA0(battlerId, healthboxSpriteId, HEALTH_BAR, 0); + MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); } isDoubles = IsDoubleBattle(); if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) @@ -2207,7 +2230,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem currExpBarValue = exp - currLevelExp; maxExpBarValue = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; SetBattleBarStruct(battlerId, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles); - sub_8074AA0(battlerId, healthboxSpriteId, EXP_BAR, 0); + MoveBattleBar(battlerId, healthboxSpriteId, EXP_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); @@ -2228,7 +2251,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem maxHp = GetMonData(mon, MON_DATA_MAX_HP); currHp = GetMonData(mon, MON_DATA_HP); SetBattleBarStruct(battlerId, healthboxSpriteId, maxHp, currHp, 0); - sub_8074AA0(battlerId, healthboxSpriteId, HEALTH_BAR, 0); + MoveBattleBar(battlerId, healthboxSpriteId, HEALTH_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); @@ -2237,82 +2260,86 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem } } -s32 sub_8074AA0(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 arg3) +#define B_EXPBAR_PIXELS 64 +#define B_HEALTHBAR_PIXELS 48 + +s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused) { - s32 var; + s32 currentBarValue; if (whichBar == HEALTH_BAR) // health bar { - var = sub_8074DB8(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].currentValue, + currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].field_10, - 6, 1); + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + B_HEALTHBAR_PIXELS / 8, 1); } else // exp bar { - u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[battlerId].currentValue, + u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, gBattleSpritesDataPtr->battleBars[battlerId].maxValue, 8); if (expFraction == 0) expFraction = 1; expFraction = abs(gBattleSpritesDataPtr->battleBars[battlerId].receivedValue / expFraction); - var = sub_8074DB8(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].currentValue, + currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].field_10, - 8, expFraction); + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + B_EXPBAR_PIXELS / 8, expFraction); } if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)) - sub_8074B9C(battlerId, whichBar); + MoveBattleBarGraphically(battlerId, whichBar); - if (var == -1) - gBattleSpritesDataPtr->battleBars[battlerId].field_10 = 0; + if (currentBarValue == -1) + gBattleSpritesDataPtr->battleBars[battlerId].currValue = 0; - return var; + return currentBarValue; } -static void sub_8074B9C(u8 battlerId, u8 whichBar) +static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) { u8 array[8]; - u8 subRet, level; + u8 filledPixelsCount, level; u8 barElementId; u8 i; switch (whichBar) { case HEALTH_BAR: - subRet = sub_8074E8C(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].currentValue, + filledPixelsCount = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].field_10, - array, 6); - barElementId = 3; - if (subRet <= 0x18) - { - barElementId = 0x38; - if (subRet > 9) - barElementId = 0x2F; - } + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + array, B_HEALTHBAR_PIXELS / 8); + + if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp + barElementId = HEALTHBOX_GFX_HP_BAR_GREEN; + else if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 20 / 100)) // more than 20% hp + barElementId = HEALTHBOX_GFX_HP_BAR_YELLOW; + else + barElementId = HEALTHBOX_GFX_HP_BAR_RED; // 20 % or less + for (i = 0; i < 6; i++) { - u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].data[5]; + u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].hMain_HealthBarSpriteId; if (i < 2) CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, - (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + i) * 32), 32); + (void*)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * 32), 32); else CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, - (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthboxSpriteId_2].oam.tileNum) * 32), 32); + (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthbarSpriteId].oam.tileNum) * 32), 32); } break; case EXP_BAR: - sub_8074E8C(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].currentValue, + CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, + gBattleSpritesDataPtr->battleBars[battlerId].oldValue, gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].field_10, - array, 8); + &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + array, B_EXPBAR_PIXELS / 8); level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_LEVEL); if (level == MAX_MON_LEVEL) { @@ -2332,166 +2359,162 @@ static void sub_8074B9C(u8 battlerId, u8 whichBar) } } -static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 arg4, u16 arg5) +static s32 CalcNewBarValue(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 scale, u16 toAdd) { - s32 r6; - s32 ret; - arg4 <<= 3; + s32 ret, newValue; + scale *= 8; - if (*arg3 == -32768) + if (*currValue == -32768) // first function call { - if (maxValue < arg4) - *arg3 = currValue << 8; + if (maxValue < scale) + *currValue = Q_24_8(oldValue); else - *arg3 = currValue; + *currValue = oldValue; } - currValue -= receivedValue; - if (currValue < 0) - currValue = 0; - else if (currValue > maxValue) - currValue = maxValue; + newValue = oldValue - receivedValue; + if (newValue < 0) + newValue = 0; + else if (newValue > maxValue) + newValue = maxValue; - if (maxValue < arg4) + if (maxValue < scale) { - s32 var = *arg3 >> 8; - - r6 = *arg3; - if (currValue == var && (r6 & 0xFF) == 0) + if (newValue == Q_24_8_TO_INT(*currValue) && (*currValue & 0xFF) == 0) return -1; } else { - r6 = *arg3; - if (currValue == r6) + if (newValue == *currValue) // we're done, the bar's value has been updated return -1; } - if (maxValue < arg4) + if (maxValue < scale) // handle cases of max var having less pixels than the whole bar { - s32 var = (maxValue << 8) / arg4; + s32 toAdd = Q_24_8(maxValue) / scale; - if (receivedValue < 0) + if (receivedValue < 0) // fill bar right { - *arg3 = r6 + var; - ret = *arg3 >> 8; - if (ret >= currValue) + *currValue += toAdd; + ret = Q_24_8_TO_INT(*currValue); + if (ret >= newValue) { - *arg3 = currValue << 8; - ret = currValue; + *currValue = Q_24_8(newValue); + ret = newValue; } } - else + else // move bar left { - *arg3 = r6 - var; - ret = *arg3 >> 8; - if ((*arg3 & 0xFF) > 0) + *currValue -= toAdd; + ret = Q_24_8_TO_INT(*currValue); + // try round up + if ((*currValue & 0xFF) > 0) ret++; - if (ret <= currValue) + if (ret <= newValue) { - *arg3 = currValue << 8; - ret = currValue; + *currValue = Q_24_8(newValue); + ret = newValue; } } } else { - if (receivedValue < 0) + if (receivedValue < 0) // fill bar right { - *arg3 += arg5; - if (*arg3 > currValue) - *arg3 = currValue; - ret = *arg3; + *currValue += toAdd; + if (*currValue > newValue) + *currValue = newValue; + ret = *currValue; } - else + else // move bar left { - *arg3 -= arg5; - if (*arg3 < currValue) - *arg3 = currValue; - ret = *arg3; + *currValue -= toAdd; + if (*currValue < newValue) + *currValue = newValue; + ret = *currValue; } } return ret; } -static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 receivedValue, s32 *arg3, u8 *arg4, u8 arg5) +static u8 CalcBarFilledPixels(s32 maxValue, s32 oldValue, s32 receivedValue, s32 *currValue, u8 *arg4, u8 scale) { - s32 r5 = currValue - receivedValue; - u8 ret; + u8 pixels, filledPixels, totalPixels; u8 i; - u8 r2; - if (r5 < 0) - r5 = 0; - else if (r5 > maxValue) - r5 = maxValue; + s32 newValue = oldValue - receivedValue; + if (newValue < 0) + newValue = 0; + else if (newValue > maxValue) + newValue = maxValue; - ret = arg5 << 3; + totalPixels = scale * 8; - for (i = 0; i < arg5; i++) + for (i = 0; i < scale; i++) arg4[i] = 0; - if (maxValue < ret) - r2 = (*arg3 * ret / maxValue) >> 8; + if (maxValue < totalPixels) + pixels = (*currValue * totalPixels / maxValue) >> 8; else - r2 = *arg3 * ret / maxValue; + pixels = *currValue * totalPixels / maxValue; - ret = r2; + filledPixels = pixels; - if (ret == 0 && r5 > 0) + if (filledPixels == 0 && newValue > 0) { arg4[0] = 1; - ret = 1; + filledPixels = 1; } else { - for (i = 0; i < arg5; i++) + for (i = 0; i < scale; i++) { - if (r2 >= 8) + if (pixels >= 8) { arg4[i] = 8; } else { - arg4[i] = r2; + arg4[i] = pixels; break; } - r2 -= 8; + pixels -= 8; } } - return ret; + return filledPixels; } -static s16 sub_8074F28(struct TestingBar *barInfo, s32 *arg1, u16 *arg2, s32 arg3) +// These two functions seem as if they were made for testing the health bar. +static s16 sub_8074F28(struct TestingBar *barInfo, s32 *currValue, u16 *arg2, s32 arg3) { s16 ret, var; - ret = sub_8074DB8(barInfo->maxValue, - barInfo->currValue, + ret = CalcNewBarValue(barInfo->maxValue, + barInfo->oldValue, barInfo->receivedValue, - arg1, 6, 1); - sub_8074F88(barInfo, arg1, arg2); + currValue, B_HEALTHBAR_PIXELS / 8, 1); + sub_8074F88(barInfo, currValue, arg2); - if (barInfo->maxValue < 0x30) - var = *arg1 >> 8; + if (barInfo->maxValue < B_HEALTHBAR_PIXELS) + var = *currValue >> 8; else - var = *arg1; + var = *currValue; DummiedOutFunction(barInfo->maxValue, var, arg3); return ret; } -static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2) +static void sub_8074F88(struct TestingBar *barInfo, s32 *currValue, u16 *arg2) { u8 sp8[6]; u16 sp10[6]; u8 i; - sub_8074E8C(barInfo->maxValue, barInfo->currValue, - barInfo->receivedValue, arg1, sp8, 6); + CalcBarFilledPixels(barInfo->maxValue, barInfo->oldValue, + barInfo->receivedValue, currValue, sp8, B_HEALTHBAR_PIXELS / 8); for (i = 0; i < 6; i++) sp10[i] = (barInfo->unkC_0 << 12) | (barInfo->unk10 + sp8[i]); @@ -2499,22 +2522,22 @@ static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2) CpuCopy16(sp10, arg2, sizeof(sp10)); } -static u8 GetScaledExpFraction(s32 currValue, s32 receivedValue, s32 maxValue, u8 scale) +static u8 GetScaledExpFraction(s32 oldValue, s32 receivedValue, s32 maxValue, u8 scale) { - s32 r5, result; - s8 r4, r0; + s32 newVal, result; + s8 oldToMax, newToMax; scale *= 8; - r5 = currValue - receivedValue; + newVal = oldValue - receivedValue; - if (r5 < 0) - r5 = 0; - else if (r5 > maxValue) - r5 = maxValue; + if (newVal < 0) + newVal = 0; + else if (newVal > maxValue) + newVal = maxValue; - r4 = currValue * scale / maxValue; - r0 = r5 * scale / maxValue; - result = r4 - r0; + oldToMax = oldValue * scale / maxValue; + newToMax = newVal * scale / maxValue; + result = oldToMax - newToMax; return abs(result); } @@ -2531,7 +2554,7 @@ u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) u8 GetHPBarLevel(s16 hp, s16 maxhp) { - s32 result; + u8 result; if (hp == maxhp) { @@ -2539,10 +2562,10 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp) } else { - u8 fraction = GetScaledHPFraction(hp, maxhp, 48); - if (fraction > 24) + u8 fraction = GetScaledHPFraction(hp, maxhp, B_HEALTHBAR_PIXELS); + if (fraction > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp result = HP_BAR_GREEN; - else if (fraction > 9) + else if (fraction > (B_HEALTHBAR_PIXELS * 20 / 100)) // more than 20% hp result = HP_BAR_YELLOW; else if (fraction > 0) result = HP_BAR_RED; @@ -2577,17 +2600,17 @@ static void RemoveWindowOnHealthbox(u32 windowId) RemoveWindow(windowId); } -static void sub_807513C(void *dest, u32 arg1, u32 arg2) +static void FillHealthboxObject(void *dest, u32 arg1, u32 arg2) { CpuFill32(0x11111111 * arg1, dest, arg2 * 32); } -static void sub_8075170(void *dest, u8 *windowTileData, u32 arg2) +static void HpTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2) { CpuCopy32(windowTileData + 256, dest, arg2 * 32); } -static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2) +static void TextIntoHealthboxObject(void *dest, u8 *windowTileData, s32 arg2) { CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); @@ -2596,13 +2619,13 @@ static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2) do { CpuCopy32(windowTileData + 20, dest + 20, 12); - dest += 32, windowTileData+= 32; + dest += 32, windowTileData += 32; arg2--; } while (arg2 != 0); } } -static void sub_80751E4(void *dest, u8 *windowTileData, u32 arg2) +static void SafariTextIntoHealthboxObject(void *dest, u8 *windowTileData, u32 arg2) { CpuCopy32(windowTileData, dest, arg2 * 32); CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); diff --git a/src/battle_main.c b/src/battle_main.c index 70eebed85..86937f85f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -41,6 +41,7 @@ #include "pokedex.h" #include "constants/abilities.h" #include "constants/moves.h" +#include "constants/rgb.h" #include "evolution_scene.h" #include "roamer.h" #include "tv.h" @@ -50,6 +51,7 @@ #include "decompress.h" #include "international_string_util.h" #include "pokeball.h" +#include "party_menu.h" struct UnknownPokemonStruct4 { @@ -81,15 +83,14 @@ extern struct MusicPlayerInfo gMPlayInfo_SE1; extern struct MusicPlayerInfo gMPlayInfo_SE2; extern u8 gUnknown_0203CF00[]; -extern const u16 gBattleTextboxPalette[]; // battle textbox palette -extern const struct BgTemplate gUnknown_0831AA08[]; -extern const struct WindowTemplate * const gUnknown_0831ABA0[]; -extern const u8 gUnknown_0831ACE0[]; -extern const u8 * const gBattleScriptsForMoveEffects[]; -extern const u8 * const gBattlescriptsForBallThrow[]; -extern const u8 * const gBattlescriptsForRunningByItem[]; -extern const u8 * const gBattlescriptsForUsingItem[]; -extern const u8 * const gBattlescriptsForSafariActions[]; +extern const u16 gBattleTextboxPalette[]; +extern const struct BgTemplate gBattleBgTemplates[]; +extern const struct WindowTemplate *const gBattleWindowTemplates[]; +extern const u8 *const gBattleScriptsForMoveEffects[]; +extern const u8 *const gBattlescriptsForBallThrow[]; +extern const u8 *const gBattlescriptsForRunningByItem[]; +extern const u8 *const gBattlescriptsForUsingItem[]; +extern const u8 *const gBattlescriptsForSafariActions[]; extern const struct ScanlineEffectParams gUnknown_0831AC70; // strings @@ -137,13 +138,13 @@ static void sub_803980C(struct Sprite *sprite); static void sub_8039838(struct Sprite *sprite); static void sub_8039894(struct Sprite *sprite); static void sub_80398D0(struct Sprite *sprite); -static void sub_8039A48(struct Sprite *sprite); +static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite); static void sub_8039AF4(struct Sprite *sprite); static void SpriteCallbackDummy_3(struct Sprite *sprite); static void oac_poke_ally_(struct Sprite *sprite); static void SpecialStatusesClear(void); static void TurnValuesCleanUp(bool8 var0); -static void SpriteCB_HealthBoxBounce(struct Sprite *sprite); +static void SpriteCB_BounceEffect(struct Sprite *sprite); static void BattleStartClearSetData(void); static void BattleIntroGetMonsData(void); static void BattleIntroPrepareBackgroundSlide(void); @@ -162,7 +163,7 @@ static void HandleTurnActionSelectionState(void); static void RunTurnActionsFunctions(void); static void SetActionsAndBattlersTurnOrder(void); static void sub_803CDF8(void); -static bool8 sub_803CDB8(void); +static bool8 AllAtActionConfirmed(void); static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void); static void FreeResetData_ReturnToOvOrDoEvolutions(void); static void ReturnFromBattleToOverworld(void); @@ -183,12 +184,16 @@ static void HandleAction_SafariZoneBallThrow(void); static void HandleAction_ThrowPokeblock(void); static void HandleAction_GoNear(void); static void HandleAction_SafriZoneRun(void); -static void HandleAction_Action9(void); +static void HandleAction_WallyBallThrow(void); static void HandleAction_Action11(void); static void HandleAction_NothingIsFainted(void); static void HandleAction_ActionFinished(void); // EWRAM vars +EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; +EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0}; +EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; +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; @@ -205,7 +210,7 @@ EWRAM_DATA u8 gBattlersCount = 0; EWRAM_DATA u16 gBattlerPartyIndexes[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gBattlerPositions[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gActionsByTurnOrder[MAX_BATTLERS_COUNT] = {0}; -EWRAM_DATA u8 gBattleTurnOrder[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA u8 gBattlerByTurnOrder[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u8 gCurrentTurnActionNumber = 0; EWRAM_DATA u8 gCurrentActionFuncId = 0; EWRAM_DATA struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT] = {0}; @@ -296,6 +301,7 @@ u8 gNumberOfMovesToChoose; u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT]; // rom const data +static const s8 gUnknown_0831ACE0[] ={-32, -16, -16, -32, -32, 0, 0, 0}; // format: attacking type, defending type, damage multiplier // the multiplier is a (decimal) fixed-point number: @@ -515,7 +521,7 @@ static void (* const sTurnActionsFuncsTable[])(void) = HandleAction_ThrowPokeblock, // B_ACTION_SAFARI_POKEBLOCK HandleAction_GoNear, // B_ACTION_SAFARI_GO_NEAR HandleAction_SafriZoneRun, // B_ACTION_SAFARI_RUN - HandleAction_Action9, // B_ACTION_UNKNOWN9 + HandleAction_WallyBallThrow, // B_ACTION_WALLY_THROW HandleAction_RunBattleScript, // B_ACTION_EXEC_SCRIPT HandleAction_Action11, // not sure about this one HandleAction_ActionFinished, // B_ACTION_FINISHED @@ -532,7 +538,7 @@ static void (* const sEndTurnFuncsTable[])(void) = HandleEndTurn_FinishBattle, // B_OUTCOME_PLAYER_TELEPORTED HandleEndTurn_MonFled, // B_OUTCOME_MON_FLED HandleEndTurn_FinishBattle, // B_OUTCOME_CAUGHT - HandleEndTurn_FinishBattle, // battle outcome 8 + HandleEndTurn_FinishBattle, // B_OUTCOME_NO_SAFARI_BALLS HandleEndTurn_FinishBattle, // B_OUTCOME_FORFEITED HandleEndTurn_FinishBattle, // B_OUTCOME_MON_TELEPORTED }; @@ -556,10 +562,11 @@ const u8 * const gStatusConditionStringsTable[7][2] = {gStatusConditionString_LoveJpn, gText_Love} }; -static const u8 sUnknown_0831BCE0[][3] = {{0, 0, 0}, {3, 5, 0}, {2, 3, 0}, {1, 2, 0}, {1, 1, 0}}; -static const u8 sUnknown_0831BCEF[] = {4, 3, 2, 1}; -static const u8 sUnknown_0831BCF3[] = {4, 4, 4, 4}; +static const u8 sPkblToEscapeFactor[][3] = {{0, 0, 0}, {3, 5, 0}, {2, 3, 0}, {1, 2, 0}, {1, 1, 0}}; +static const u8 sGoNearCounterToCatchFactor[] = {4, 3, 2, 1}; +static const u8 sGoNearCounterToEscapeFactor[] = {4, 4, 4, 4}; +// code void CB2_InitBattle(void) { MoveSaveBlocks_ResetHeap(); @@ -608,7 +615,7 @@ static void CB2_InitBattleInternal(void) gBattle_WIN0H = 240; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != STEVEN_PARTNER_ID) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId != TRAINER_STEVEN_PARTNER) { gBattle_WIN0V = 159; gBattle_WIN1H = 240; @@ -652,7 +659,7 @@ static void CB2_InitBattleInternal(void) LoadBattleTextboxAndBackground(); ResetSpriteData(); ResetTasks(); - LoadBattleEntryBackground(); + DrawBattleEntryBackground(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); @@ -676,9 +683,9 @@ static void CB2_InitBattleInternal(void) } gMain.inBattle = TRUE; - gSaveBlock2Ptr->field_CA9_b = 0; + gSaveBlock2Ptr->frontier.field_CA9_b = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) AdjustFriendship(&gPlayerParty[i], 3); gBattleCommunication[MULTIUSE_STATE] = 0; @@ -739,7 +746,7 @@ static void SetPlayerBerryDataInBattleStruct(void) } else { - const struct Berry* berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); + const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); for (i = 0; i < BERRY_NAME_COUNT - 1; i++) battleBerry->name[i] = berryData->name[i]; @@ -783,7 +790,7 @@ static void SetAllPlayersBerryData(void) } else { - const struct Berry* berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); + const struct Berry *berryData = GetBerryInfo(ItemIdToBerryType(ITEM_ENIGMA_BERRY)); for (i = 0; i < BERRY_NAME_COUNT - 1; i++) { @@ -809,7 +816,7 @@ static void SetAllPlayersBerryData(void) { s32 numPlayers; struct BattleEnigmaBerry *src; - u8 r4; + u8 battlerId; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -821,17 +828,17 @@ static void SetAllPlayersBerryData(void) for (i = 0; i < numPlayers; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); - r4 = gLinkPlayers[i].lp_field_18; + battlerId = gLinkPlayers[i].id; for (j = 0; j < BERRY_NAME_COUNT - 1; j++) - gEnigmaBerries[r4].name[j] = src->name[j]; - gEnigmaBerries[r4].name[j] = EOS; + gEnigmaBerries[battlerId].name[j] = src->name[j]; + gEnigmaBerries[battlerId].name[j] = EOS; for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) - gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j]; + gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j]; - gEnigmaBerries[r4].holdEffect = src->holdEffect; - gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam; + gEnigmaBerries[battlerId].holdEffect = src->holdEffect; + gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam; } } else @@ -958,8 +965,8 @@ static void CB2_HandleStartBattle(void) if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00) { - gLinkPlayers[0].lp_field_18 = 0; - gLinkPlayers[1].lp_field_18 = 1; + gLinkPlayers[0].id = 0; + gLinkPlayers[1].id = 1; } SendBlock(bitmask_all_link_players_but_self(), &gBattleStruct->field_180, 32); @@ -1146,10 +1153,10 @@ static void CB2_HandleStartMultiPartnerBattle(void) { u8 language; - gLinkPlayers[0].lp_field_18 = 0; - gLinkPlayers[1].lp_field_18 = 2; - gLinkPlayers[2].lp_field_18 = 1; - gLinkPlayers[3].lp_field_18 = 3; + gLinkPlayers[0].id = 0; + gLinkPlayers[1].id = 2; + gLinkPlayers[2].id = 1; + gLinkPlayers[3].id = 3; GetFrontierTrainerName(gLinkPlayers[2].name, gTrainerBattleOpponent_A); GetFrontierTrainerName(gLinkPlayers[3].name, gTrainerBattleOpponent_B); sub_8165B88(&language, gTrainerBattleOpponent_A); @@ -1207,7 +1214,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) if ((GetBlockReceivedStatus() & 3) == 3) { ResetBlockReceivedFlags(); - if (gLinkPlayers[playerMultiplayerId].lp_field_18 != 0) + if (gLinkPlayers[playerMultiplayerId].id != 0) { memcpy(gPlayerParty, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon) * 2); memcpy(gPlayerParty + 3, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon) * 2); @@ -1231,7 +1238,7 @@ static void CB2_HandleStartMultiPartnerBattle(void) if ((GetBlockReceivedStatus() & 3) == 3) { ResetBlockReceivedFlags(); - if (gLinkPlayers[playerMultiplayerId].lp_field_18 != 0) + if (gLinkPlayers[playerMultiplayerId].id != 0) { memcpy(gPlayerParty + 2, gBlockRecvBuffer[enemyMultiplayerId], sizeof(struct Pokemon)); memcpy(gPlayerParty + 5, gBlockRecvBuffer[playerMultiplayerId], sizeof(struct Pokemon)); @@ -1382,7 +1389,7 @@ static void CB2_PreInitMultiBattle(void) u8 playerMultiplierId; s32 numPlayers = 4; u8 r4 = 0xF; - u32* savedBattleTypeFlags; + u32 *savedBattleTypeFlags; void (**savedCallback)(void); if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) @@ -1422,8 +1429,8 @@ static void CB2_PreInitMultiBattle(void) if (numPlayers == 4) { - if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerMultiplierId].lp_field_18 & 1)) - || (gLinkPlayers[i].lp_field_18 & 1 && gLinkPlayers[playerMultiplierId].lp_field_18 & 1)) + if ((!(gLinkPlayers[i].id & 1) && !(gLinkPlayers[playerMultiplierId].id & 1)) + || (gLinkPlayers[i].id & 1 && gLinkPlayers[playerMultiplierId].id & 1)) { memcpy(gUnknown_02022FF8, gBlockRecvBuffer[i], sizeof(struct UnknownPokemonStruct4) * 3); } @@ -1476,7 +1483,7 @@ static void CB2_PreInitMultiBattle(void) static void CB2_PreInitIngamePlayerPartnerBattle(void) { - u32* savedBattleTypeFlags; + u32 *savedBattleTypeFlags; void (**savedCallback)(void); savedCallback = &gBattleStruct->savedCallback; @@ -1583,7 +1590,7 @@ static void CB2_HandleStartMultiBattle(void) for (id = 0; id < MAX_LINK_PLAYERS; id++) { sub_8185F90(gBlockRecvBuffer[id][1]); - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: gTasks[var].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; @@ -1620,7 +1627,7 @@ static void CB2_HandleStartMultiBattle(void) { if (id == playerMultiplayerId) { - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: case 3: @@ -1634,10 +1641,10 @@ static void CB2_HandleStartMultiBattle(void) } else { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerMultiplayerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerMultiplayerId].lp_field_18 & 1))) + if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1)) + || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1))) { - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: case 3: @@ -1651,7 +1658,7 @@ static void CB2_HandleStartMultiBattle(void) } else { - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: case 3: @@ -1683,7 +1690,7 @@ static void CB2_HandleStartMultiBattle(void) { if (id == playerMultiplayerId) { - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: case 3: @@ -1697,10 +1704,10 @@ static void CB2_HandleStartMultiBattle(void) } else { - if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerMultiplayerId].lp_field_18 & 1)) - || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerMultiplayerId].lp_field_18 & 1))) + if ((!(gLinkPlayers[id].id & 1) && !(gLinkPlayers[playerMultiplayerId].id & 1)) + || ((gLinkPlayers[id].id & 1) && (gLinkPlayers[playerMultiplayerId].id & 1))) { - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: case 3: @@ -1714,7 +1721,7 @@ static void CB2_HandleStartMultiBattle(void) } else { - switch (gLinkPlayers[id].lp_field_18) + switch (gLinkPlayers[id].id) { case 0: case 3: @@ -1799,7 +1806,7 @@ static void CB2_HandleStartMultiBattle(void) SetMainCallback2(BattleMainCB2); if (gBattleTypeFlags & BATTLE_TYPE_LINK) { - gTrainerBattleOpponent_A = TRAINER_OPPONENT_800; + gTrainerBattleOpponent_A = TRAINER_LINK_OPPONENT; gBattleTypeFlags |= BATTLE_TYPE_20; } } @@ -1819,7 +1826,7 @@ void BattleMainCB2(void) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; ResetPaletteFadeControl(); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); SetMainCallback2(CB2_QuitRecordedBattle); } } @@ -1830,7 +1837,7 @@ static void FreeRestoreBattleData(void) gScanlineEffect.state = 3; gMain.inBattle = 0; ZeroEnemyPartyMons(); - m4aSongNumStop(0x5A); + m4aSongNumStop(SE_HINSI); FreeMonSpritesGfx(); FreeBattleSpritesData(); FreeBattleResources(); @@ -1908,7 +1915,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir s32 i, j; u8 monsCount; - if (trainerNum == SECRET_BASE_OPPONENT) + if (trainerNum == TRAINER_SECRET_BASE) return 0; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && !(gBattleTypeFlags & (BATTLE_TYPE_FRONTIER @@ -2026,7 +2033,7 @@ void sub_8038A04(void) // unused void VBlankCB_Battle(void) { - // change gRngSeed every vblank unless the battle could be recorded + // Change gRngSeed every vblank unless the battle could be recorded. if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_RECORDED))) Random(); @@ -2088,7 +2095,7 @@ static void sub_8038B94(u8 taskId) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - switch (gLinkPlayers[r2].lp_field_18) + switch (gLinkPlayers[r2].id) { case 0: case 2: @@ -2192,7 +2199,7 @@ void sub_8038D64(void) } for (i = 80; i < 160; i++) { - asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter + asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter. gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; } @@ -2210,10 +2217,10 @@ void sub_8038D64(void) sub_80356D0(); LoadCompressedPalette(gBattleTextboxPalette, 0, 64); - ApplyPlayerChosenFrameToBattleMenu(); + LoadBattleMenuWindowGfx(); ResetSpriteData(); ResetTasks(); - LoadBattleEntryBackground(); + DrawBattleEntryBackground(); SetGpuReg(REG_OFFSET_WINOUT, 0x37); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; @@ -2255,7 +2262,7 @@ static void sub_8038F34(void) case 1: if (--gBattleCommunication[1] == 0) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -2273,7 +2280,7 @@ static void sub_8038F34(void) for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++); - if (!gSaveBlock2Ptr->field_CA9_b && i == monsCount) + if (!gSaveBlock2Ptr->frontier.field_CA9_b && i == monsCount) { if (FlagGet(FLAG_SYS_FRONTIER_PASS)) { @@ -2312,7 +2319,7 @@ static void sub_8038F34(void) for (i = 0; i < 2; i++) LoadChosenBattleElement(i); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE]++; break; case 4: @@ -2327,7 +2334,7 @@ static void sub_8038F34(void) if (sub_800A520() == TRUE) { sub_800ADF8(); - BattleHandleAddTextPrinter(gText_LinkStandby3, 0); + BattlePutTextOnWindow(gText_LinkStandby3, 0); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -2363,25 +2370,25 @@ u32 sub_80391E0(u8 arrayId, u8 caseId) switch (caseId) { case 0: - ret = gUnknown_0831AA08[arrayId].bg; + ret = gBattleBgTemplates[arrayId].bg; break; case 1: - ret = gUnknown_0831AA08[arrayId].charBaseIndex; + ret = gBattleBgTemplates[arrayId].charBaseIndex; break; case 2: - ret = gUnknown_0831AA08[arrayId].mapBaseIndex; + ret = gBattleBgTemplates[arrayId].mapBaseIndex; break; case 3: - ret = gUnknown_0831AA08[arrayId].screenSize; + ret = gBattleBgTemplates[arrayId].screenSize; break; case 4: - ret = gUnknown_0831AA08[arrayId].paletteMode; + ret = gBattleBgTemplates[arrayId].paletteMode; break; case 5: - ret = gUnknown_0831AA08[arrayId].priority; + ret = gBattleBgTemplates[arrayId].priority; break; case 6: - ret = gUnknown_0831AA08[arrayId].baseTile; + ret = gBattleBgTemplates[arrayId].baseTile; break; } @@ -2406,7 +2413,7 @@ static void sub_80392A8(void) gBattle_BG3_Y = 0; sub_80356D0(); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); - ApplyPlayerChosenFrameToBattleMenu(); + LoadBattleMenuWindowGfx(); for (i = 0; i < 2; i++) LoadChosenBattleElement(i); @@ -2417,7 +2424,7 @@ static void sub_80392A8(void) gReservedSpritePaletteCount = 4; SetVBlankCallback(VBlankCB_Battle); SetMainCallback2(sub_803937C); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); gBattleCommunication[MULTIUSE_STATE] = 0; } @@ -2453,7 +2460,7 @@ static void sub_803939C(void) case 3: if (!gPaletteFade.active) { - BattleHandleAddTextPrinter(gText_RecordBattleToPass, 0); + BattlePutTextOnWindow(gText_RecordBattleToPass, 0); gBattleCommunication[MULTIUSE_STATE]++; } break; @@ -2461,7 +2468,7 @@ static void sub_803939C(void) if (!IsTextPrinterActive(0)) { HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); gBattleCommunication[CURSOR_POSITION] = 1; BattleCreateYesNoCursorAt(1); gBattleCommunication[MULTIUSE_STATE]++; @@ -2515,7 +2522,7 @@ static void sub_803939C(void) if (gMain.field_439_x4) { sub_800ADF8(); - BattleHandleAddTextPrinter(gText_LinkStandby3, 0); + BattlePutTextOnWindow(gText_LinkStandby3, 0); } gBattleCommunication[MULTIUSE_STATE]++; } @@ -2546,14 +2553,14 @@ static void sub_803939C(void) { PlaySE(SE_SAVE); BattleStringExpandPlaceholdersToDisplayedString(gText_BattleRecordedOnPass); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattleCommunication[1] = 0x80; gBattleCommunication[MULTIUSE_STATE]++; } else { BattleStringExpandPlaceholdersToDisplayedString(gText_BattleRecordCouldntBeSaved); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gBattleCommunication[1] = 0x80; gBattleCommunication[MULTIUSE_STATE]++; } @@ -2564,7 +2571,7 @@ static void sub_803939C(void) if (gMain.field_439_x4) { sub_800ADF8(); - BattleHandleAddTextPrinter(gText_LinkStandby3, 0); + BattlePutTextOnWindow(gText_LinkStandby3, 0); } gBattleCommunication[MULTIUSE_STATE]++; } @@ -2577,7 +2584,7 @@ static void sub_803939C(void) { if (sub_800A520() == TRUE) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; gBattleCommunication[MULTIUSE_STATE] = 8; } @@ -2585,7 +2592,7 @@ static void sub_803939C(void) } else { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gBattleCommunication[1] = 0x20; gBattleCommunication[MULTIUSE_STATE] = 8; } @@ -2610,7 +2617,7 @@ static void TryCorrectShedinjaLanguage(struct Pokemon *mon) u32 sub_80397C4(u32 setId, u32 tableId) { - return gUnknown_0831ABA0[setId][tableId].width * 8; + return gBattleWindowTemplates[setId][tableId].width * 8; } #define sBattler data[0] @@ -2620,7 +2627,7 @@ void oac_poke_opponent(struct Sprite *sprite) { sprite->callback = sub_803980C; StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x20000, 0, 10, 10, 0x2108); + BeginNormalPaletteFade(0x20000, 0, 10, 10, RGB(8, 8, 8)); } static void sub_803980C(struct Sprite *sprite) @@ -2643,7 +2650,7 @@ static void sub_8039838(struct Sprite *sprite) SetHealthboxSpriteVisible(gHealthboxSpriteIds[sprite->sBattler]); sprite->callback = sub_8039894; StartSpriteAnimIfDifferent(sprite, 0); - BeginNormalPaletteFade(0x20000, 0, 10, 0, 0x2108); + BeginNormalPaletteFade(0x20000, 0, 10, 0, RGB(8, 8, 8)); } } @@ -2687,7 +2694,7 @@ static void sub_80398D0(struct Sprite *sprite) extern const struct MonCoords gMonFrontPicCoords[]; extern const struct MonCoords gCastformFrontSpriteCoords[]; -void sub_8039934(struct Sprite *sprite) +void SpriteCB_FaintOpponentMon(struct Sprite *sprite) { u8 battler = sprite->sBattler; u16 species; @@ -2698,7 +2705,7 @@ void sub_8039934(struct Sprite *sprite) else species = sprite->sSpeciesId; - GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value + GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); // Unused return value. if (species == SPECIES_UNOWN) { @@ -2707,9 +2714,9 @@ void sub_8039934(struct Sprite *sprite) u16 unownSpecies; if (unownForm == 0) - unownSpecies = SPECIES_UNOWN; // Use the A Unown form + unownSpecies = SPECIES_UNOWN; // Use the A Unown form. else - unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters + unownSpecies = NUM_SPECIES + unownForm; // Use one of the other Unown letters. yOffset = gMonFrontPicCoords[unownSpecies].y_offset; } @@ -2728,25 +2735,23 @@ void sub_8039934(struct Sprite *sprite) sprite->data[3] = 8 - yOffset / 8; sprite->data[4] = 1; - sprite->callback = sub_8039A48; + sprite->callback = SpriteCB_AnimFaintOpponent; } -static void sub_8039A48(struct Sprite *sprite) +static void SpriteCB_AnimFaintOpponent(struct Sprite *sprite) { s32 i; - sprite->data[4]--; - if (sprite->data[4] == 0) + if (--sprite->data[4] == 0) { sprite->data[4] = 2; - sprite->pos2.y += 8; - sprite->data[3]--; - if (sprite->data[3] < 0) + sprite->pos2.y += 8; // Move the sprite down. + if (--sprite->data[3] < 0) { FreeSpriteOamMatrix(sprite); DestroySprite(sprite); } - else + else // Erase bottom part of the sprite to create a smooth illusion of mon falling down. { u8 *dst = (u8 *)gMonSpritesGfxPtr->sprites[GetBattlerPosition(sprite->sBattler)] + (gBattleMonForms[sprite->sBattler] << 11) + (sprite->data[3] << 8); @@ -2802,7 +2807,7 @@ void sub_8039BB4(struct Sprite *sprite) static void oac_poke_ally_(struct Sprite *sprite) { - if ((gIntroSlideFlags & 1) == 0) + if (!(gIntroSlideFlags & 1)) { sprite->pos2.x -= 2; if (sprite->pos2.x == 0) @@ -2831,85 +2836,100 @@ void sub_8039C00(struct Sprite *sprite) } } -void dp11b_obj_instanciate(u8 battler, u8 b, s8 c, s8 d) +#define sSinIndex data[0] +#define sDelta data[1] +#define sAmplitude data[2] +#define sBouncerSpriteId data[3] +#define sWhich data[4] + +void DoBounceEffect(u8 battler, u8 which, s8 delta, s8 amplitude) { - u8 bounceHealthBoxSpriteId; - u8 spriteId2; + u8 invisibleSpriteId; + u8 bouncerSpriteId; - if (b) + switch (which) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2) + case BOUNCE_HEALTHBOX: + default: + if (gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing) return; - } - else - { - if (gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4) + break; + case BOUNCE_MON: + if (gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing) return; + break; } - bounceHealthBoxSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HealthBoxBounce); - if (b == TRUE) + invisibleSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_BounceEffect); + if (which == BOUNCE_HEALTHBOX) { - spriteId2 = gHealthboxSpriteIds[battler]; - gBattleSpritesDataPtr->healthBoxesData[battler].field_2 = bounceHealthBoxSpriteId; - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2 = 1; - gSprites[bounceHealthBoxSpriteId].data[0] = 0x80; + bouncerSpriteId = gHealthboxSpriteIds[battler]; + gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId = invisibleSpriteId; + gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 1; + gSprites[invisibleSpriteId].sSinIndex = 128; // 0 } else { - spriteId2 = gBattlerSpriteIds[battler]; - gBattleSpritesDataPtr->healthBoxesData[battler].field_3 = bounceHealthBoxSpriteId; - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4 = 1; - gSprites[bounceHealthBoxSpriteId].data[0] = 0xC0; - } - gSprites[bounceHealthBoxSpriteId].data[1] = c; - gSprites[bounceHealthBoxSpriteId].data[2] = d; - gSprites[bounceHealthBoxSpriteId].data[3] = spriteId2; - gSprites[bounceHealthBoxSpriteId].data[4] = b; - gSprites[spriteId2].pos2.x = 0; - gSprites[spriteId2].pos2.y = 0; + bouncerSpriteId = gBattlerSpriteIds[battler]; + gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId = invisibleSpriteId; + gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 1; + gSprites[invisibleSpriteId].sSinIndex = 192; // -1 + } + gSprites[invisibleSpriteId].sDelta = delta; + gSprites[invisibleSpriteId].sAmplitude = amplitude; + gSprites[invisibleSpriteId].sBouncerSpriteId = bouncerSpriteId; + gSprites[invisibleSpriteId].sWhich = which; + gSprites[bouncerSpriteId].pos2.x = 0; + gSprites[bouncerSpriteId].pos2.y = 0; } -void dp11b_obj_free(u8 battler, bool8 b) +void EndBounceEffect(u8 battler, u8 which) { - u8 r4; + u8 bouncerSpriteId; - if (b == TRUE) + if (which == BOUNCE_HEALTHBOX) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2) + if (!gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing) return; - r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_2].data[3]; - DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_2]); - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x2 = 0; + bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId].sBouncerSpriteId; + DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].healthboxBounceSpriteId]); + gBattleSpritesDataPtr->healthBoxesData[battler].healthboxIsBouncing = 0; } else { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4) + if (!gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing) return; - r4 = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_3].data[3]; - DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].field_3]); - gBattleSpritesDataPtr->healthBoxesData[battler].flag_x4 = 0; + bouncerSpriteId = gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId].sBouncerSpriteId; + DestroySprite(&gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].battlerBounceSpriteId]); + gBattleSpritesDataPtr->healthBoxesData[battler].battlerIsBouncing = 0; } - gSprites[r4].pos2.x = 0; - gSprites[r4].pos2.y = 0; + + gSprites[bouncerSpriteId].pos2.x = 0; + gSprites[bouncerSpriteId].pos2.y = 0; } -static void SpriteCB_HealthBoxBounce(struct Sprite *sprite) +static void SpriteCB_BounceEffect(struct Sprite *sprite) { - u8 spriteId = sprite->data[3]; - s32 var; + u8 bouncerSpriteId = sprite->sBouncerSpriteId; + s32 index; - if (sprite->data[4] == 1) - var = sprite->data[0]; + if (sprite->sWhich == BOUNCE_HEALTHBOX) + index = sprite->sSinIndex; else - var = sprite->data[0]; + index = sprite->sSinIndex; - gSprites[spriteId].pos2.y = Sin(var, sprite->data[2]) + sprite->data[2]; - sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF; + gSprites[bouncerSpriteId].pos2.y = Sin(index, sprite->sAmplitude) + sprite->sAmplitude; + sprite->sSinIndex = (sprite->sSinIndex + sprite->sDelta) & 0xFF; } +#undef sSinIndex +#undef sDelta +#undef sAmplitude +#undef sBouncerSpriteId +#undef sWhich + void sub_8039E44(struct Sprite *sprite) { if (sprite->affineAnimEnded) @@ -3032,10 +3052,10 @@ static void BattleStartClearSetData(void) gLeveledUpInBattle = 0; gAbsentBattlerFlags = 0; gBattleStruct->runTries = 0; - gBattleStruct->field_79 = 0; - gBattleStruct->field_7A = 0; - *(&gBattleStruct->field_7C) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; - gBattleStruct->field_7B = 3; + gBattleStruct->safariGoNearCounter = 0; + gBattleStruct->safariPkblThrowCounter = 0; + *(&gBattleStruct->safariCatchFactor) = gBaseStats[GetMonData(&gEnemyParty[0], MON_DATA_SPECIES)].catchRate * 100 / 1275; + gBattleStruct->safariEscapeFactor = 3; gBattleStruct->wildVictorySong = 0; gBattleStruct->moneyMultiplier = 1; @@ -3053,7 +3073,7 @@ static void BattleStartClearSetData(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - *(gBattleStruct->AI_monToSwitchIntoId + i) = 6; + *(gBattleStruct->AI_monToSwitchIntoId + i) = PARTY_SIZE; } gBattleStruct->field_DF = 0; @@ -3065,7 +3085,7 @@ static void BattleStartClearSetData(void) for (i = 0; i < sizeof(struct BattleResults); i++) dataPtr[i] = 0; - gBattleResults.unk5_6 = IsMonShiny(&gEnemyParty[0]); + gBattleResults.shinyWildMon = IsMonShiny(&gEnemyParty[0]); gBattleStruct->field_2A0 = 0; gBattleStruct->field_2A1 = 0; @@ -3095,7 +3115,7 @@ void SwitchInClearSetData(void) if (gBattleMoves[gCurrentMove].effect == EFFECT_BATON_PASS) { gBattleMons[gActiveBattler].status2 &= (STATUS2_CONFUSION | STATUS2_FOCUS_ENERGY | STATUS2_SUBSTITUTE | STATUS2_ESCAPE_PREVENTION | STATUS2_CURSED); - gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BANK | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); + gStatuses3[gActiveBattler] &= (STATUS3_LEECHSEED_BATTLER | STATUS3_LEECHSEED | STATUS3_ALWAYS_HITS | STATUS3_PERISH_SONG | STATUS3_ROOTED | STATUS3_MUDSPORT | STATUS3_WATERSPORT); for (i = 0; i < gBattlersCount; i++) { @@ -3213,7 +3233,7 @@ void FaintClearSetData(void) gProtectStructs[gActiveBattler].protected = 0; gProtectStructs[gActiveBattler].endured = 0; - gProtectStructs[gActiveBattler].onlyStruggle = 0; + gProtectStructs[gActiveBattler].noValidMoves = 0; gProtectStructs[gActiveBattler].helpingHand = 0; gProtectStructs[gActiveBattler].bounceMove = 0; gProtectStructs[gActiveBattler].stealMove = 0; @@ -3413,7 +3433,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) static void BattleIntroDrawPartySummaryScreens(void) { s32 i; - struct HpAndStatus hpStatus[6]; + struct HpAndStatus hpStatus[PARTY_SIZE]; if (gBattleControllerExecFlags) return; @@ -3464,7 +3484,7 @@ static void BattleIntroDrawPartySummaryScreens(void) // wild battles don't show the party summary. // Still, there's no point in having dead code. - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2) == SPECIES_EGG) @@ -3591,7 +3611,7 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void) gBattleMainFunc = BattleIntroRecordMonsToDex; } #else -ASM_DIRECT +NAKED static void BattleIntroOpponent1SendsOutMonAnimation(void) { asm(".syntax unified\n\ @@ -3834,12 +3854,12 @@ static void TryDoEventsBeforeFirstTurn(void) if (gBattleStruct->switchInAbilitiesCounter == 0) { for (i = 0; i < gBattlersCount; i++) - gBattleTurnOrder[i] = i; + gBattlerByTurnOrder[i] = i; for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - if (GetWhoStrikesFirst(gBattleTurnOrder[i], gBattleTurnOrder[j], TRUE) != 0) + if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], TRUE) != 0) SwapTurnOrder(i, j); } } @@ -3850,10 +3870,10 @@ static void TryDoEventsBeforeFirstTurn(void) gBattleStruct->overworldWeatherDone = TRUE; return; } - // check all switch in abilities happening from the fastest mon to slowest + // Check all switch in abilities happening from the fastest mon to slowest. while (gBattleStruct->switchInAbilitiesCounter < gBattlersCount) { - if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattleTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0) + if (AbilityBattleEffects(ABILITYEFFECT_ON_SWITCHIN, gBattlerByTurnOrder[gBattleStruct->switchInAbilitiesCounter], 0, 0, 0) != 0) effect++; gBattleStruct->switchInAbilitiesCounter++; @@ -3865,10 +3885,10 @@ static void TryDoEventsBeforeFirstTurn(void) return; if (AbilityBattleEffects(ABILITYEFFECT_TRACE, 0, 0, 0, 0) != 0) return; - // check all switch in items having effect from the fastest mon to slowest + // Check all switch in items having effect from the fastest mon to slowest. while (gBattleStruct->switchInItemsCounter < gBattlersCount) { - if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattleTurnOrder[gBattleStruct->switchInItemsCounter], 0) != 0) + if (ItemBattleEffects(ITEMEFFECT_ON_SWITCH_IN, gBattlerByTurnOrder[gBattleStruct->switchInItemsCounter], 0) != 0) effect++; gBattleStruct->switchInItemsCounter++; @@ -3878,14 +3898,14 @@ static void TryDoEventsBeforeFirstTurn(void) } for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - *(gBattleStruct->monToSwitchIntoId + i) = 6; + *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; gChosenActionByBattler[i] = B_ACTION_NONE; gChosenMoveByBattler[i] = MOVE_NONE; } TurnValuesCleanUp(FALSE); SpecialStatusesClear(); *(&gBattleStruct->field_91) = gAbsentBattlerFlags; - BattleHandleAddTextPrinter(gText_EmptyString3, 0); + BattlePutTextOnWindow(gText_EmptyString3, 0); gBattleMainFunc = HandleTurnActionSelectionState; ResetSentPokesToOpponentValue(); @@ -3944,15 +3964,15 @@ void BattleTurnPassed(void) TurnValuesCleanUp(TRUE); if (gBattleOutcome == 0) { - if (UpdateTurnCounters() != 0) + if (DoFieldEndTurnEffects()) return; - if (TurnBasedEffects() != 0) + if (DoBattlerEndTurnEffects()) return; } - if (HandleFaintedMonActions() != 0) + if (HandleFaintedMonActions()) return; gBattleStruct->faintedActionsState = 0; - if (HandleWishPerishSongOnTurnEnd() != 0) + if (HandleWishPerishSongOnTurnEnd()) return; TurnValuesCleanUp(FALSE); @@ -3988,11 +4008,11 @@ void BattleTurnPassed(void) gChosenMoveByBattler[i] = MOVE_NONE; } - for (i = 0; i < 4; i++) - *(gBattleStruct->monToSwitchIntoId + i) = 6; + for (i = 0; i < MAX_BATTLERS_COUNT; i++) + *(gBattleStruct->monToSwitchIntoId + i) = PARTY_SIZE; *(&gBattleStruct->field_91) = gAbsentBattlerFlags; - BattleHandleAddTextPrinter(gText_EmptyString3, 0); + BattlePutTextOnWindow(gText_EmptyString3, 0); gBattleMainFunc = HandleTurnActionSelectionState; gRandomTurnNumber = Random(); @@ -4045,7 +4065,7 @@ u8 IsRunningFromBattleImpossible(void) return 2; } } - i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0); + i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0); if (i != 0 && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL)) { gBattleScripting.battler = i - 1; @@ -4122,16 +4142,16 @@ static void HandleTurnActionSelectionState(void) u8 position = GetBattlerPosition(gActiveBattler); switch (gBattleCommunication[gActiveBattler]) { - case STATE_TURN_START_RECORD: // recorded battle related on start of every turn + case STATE_TURN_START_RECORD: // Recorded battle related action on start of every turn. RecordedBattle_CopyBattlerMoves(); gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; break; - case STATE_BEFORE_ACTION_CHOSEN: // choose an action - *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6; + case STATE_BEFORE_ACTION_CHOSEN: // Choose an action. + *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI - || !(position & BIT_FLANK) + || (position & BIT_FLANK) == B_FLANK_LEFT || gBattleStruct->field_91 & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))] - || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == 5) + || gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(position))] == STATE_WAIT_ACTION_CONFIRMED) { if (gBattleStruct->field_91 & gBitTable[gActiveBattler]) { @@ -4158,7 +4178,7 @@ static void HandleTurnActionSelectionState(void) } } break; - case STATE_WAIT_ACTION_CHOSEN: // try to perform an action + case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]); @@ -4229,25 +4249,25 @@ static void HandleTurnActionSelectionState(void) || gBattleTypeFlags & BATTLE_TYPE_ARENA || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { - BtlController_EmitChoosePokemon(0, 2, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, PARTY_CANT_SWITCH, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); } - else if ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0)) - || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0)) + else if ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_SHADOW_TAG)) + || ((i = ABILITY_ON_OPPOSING_FIELD(gActiveBattler, ABILITY_ARENA_TRAP)) && !IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_FLYING) && gBattleMons[gActiveBattler].ability != ABILITY_LEVITATE) - || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) + || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) { - BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | 4, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, ((i - 1) << 4) | PARTY_ABILITY_PREVENTS, 6, gLastUsedAbility, gBattleStruct->field_60[gActiveBattler]); } else { if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(0, 0, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(0, 0, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); else - BtlController_EmitChoosePokemon(0, 0, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, PARTY_CHOOSE_MON, 6, ABILITY_NONE, gBattleStruct->field_60[gActiveBattler]); } MarkBattlerForControllerExec(gActiveBattler); break; @@ -4266,13 +4286,13 @@ static void HandleTurnActionSelectionState(void) MarkBattlerForControllerExec(gActiveBattler); break; case B_ACTION_CANCEL_PARTNER: - gBattleCommunication[gActiveBattler] = 7; - gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] = 1; + gBattleCommunication[gActiveBattler] = STATE_WAIT_SET_BEFORE_ACTION; + gBattleCommunication[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(gActiveBattler, 1); if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_MULTIPLETURNS || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_RECHARGE) { - BtlController_EmitCmd50(0); + BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4285,7 +4305,7 @@ static void HandleTurnActionSelectionState(void) RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 1); } else if (gChosenActionByBattler[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))] == B_ACTION_USE_MOVE - && (gProtectStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].onlyStruggle + && (gProtectStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].noValidMoves || gDisableStructs[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].encoredMove)) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 1); @@ -4300,7 +4320,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } - BtlController_EmitCmd50(0); + BtlController_EmitEndBounceEffect(0); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4310,7 +4330,7 @@ static void HandleTurnActionSelectionState(void) && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) { gSelectionBattleScripts[gActiveBattler] = BattleScript_AskIfWantsToForfeitMatch; - gBattleCommunication[gActiveBattler] = 8; + gBattleCommunication[gActiveBattler] = STATE_SELECTION_SCRIPT_MAY_RUN; *(gBattleStruct->selectionScriptFinished + gActiveBattler) = FALSE; *(gBattleStruct->stateIdAfterSelScript + gActiveBattler) = STATE_BEFORE_ACTION_CHOSEN; return; @@ -4320,7 +4340,7 @@ static void HandleTurnActionSelectionState(void) && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) { BattleScriptExecute(BattleScript_PrintCantRunFromTrainer); - gBattleCommunication[gActiveBattler] = 1; + gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else if (IsRunningFromBattleImpossible() && gBattleBufferB[gActiveBattler][1] == B_ACTION_RUN) @@ -4362,7 +4382,7 @@ static void HandleTurnActionSelectionState(void) sub_818603C(2); if ((gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8)) == 0xFFFF) { - gBattleCommunication[gActiveBattler] = 1; + gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(gActiveBattler, 1); } else if (TrySetCantSelectMoveBattleScript()) @@ -4392,7 +4412,7 @@ static void HandleTurnActionSelectionState(void) case B_ACTION_USE_ITEM: if ((gBattleBufferB[gActiveBattler][1] | (gBattleBufferB[gActiveBattler][2] << 8)) == 0) { - gBattleCommunication[gActiveBattler] = 1; + gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } else { @@ -4401,9 +4421,9 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_SWITCH: - if (gBattleBufferB[gActiveBattler][1] == 6) + if (gBattleBufferB[gActiveBattler][1] == PARTY_SIZE) { - gBattleCommunication[gActiveBattler] = 1; + gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; RecordedBattle_ClearBattlerAction(gActiveBattler, 1); } else @@ -4439,7 +4459,7 @@ static void HandleTurnActionSelectionState(void) gHitMarker |= HITMARKER_RUN; gBattleCommunication[gActiveBattler]++; break; - case B_ACTION_UNKNOWN9: + case B_ACTION_WALLY_THROW: gBattleCommunication[gActiveBattler]++; break; } @@ -4448,10 +4468,13 @@ static void HandleTurnActionSelectionState(void) case STATE_WAIT_ACTION_CONFIRMED_STANDBY: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { - i = (sub_803CDB8() != 0); + if (AllAtActionConfirmed()) + i = TRUE; + else + i = FALSE; if (((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) != BATTLE_TYPE_DOUBLE) - || (position & BIT_FLANK) + || (position & BIT_FLANK) != B_FLANK_LEFT || (*(&gBattleStruct->field_91) & gBitTable[GetBattlerAtPosition(position ^ BIT_FLANK)])) { BtlController_EmitLinkStandbyMsg(0, 0, i); @@ -4489,7 +4512,7 @@ static void HandleTurnActionSelectionState(void) case STATE_WAIT_SET_BEFORE_ACTION: if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF0000000) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 0xC)))) { - gBattleCommunication[gActiveBattler] = 1; + gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } break; case STATE_SELECTION_SCRIPT_MAY_RUN: @@ -4521,7 +4544,7 @@ static void HandleTurnActionSelectionState(void) } } - // check if everyone chose actions + // Check if everyone chose actions. if (gBattleCommunication[ACTIONS_CONFIRMED_COUNT] == gBattlersCount) { sub_818603C(1); @@ -4538,17 +4561,17 @@ static void HandleTurnActionSelectionState(void) } } -static bool8 sub_803CDB8(void) +static bool8 AllAtActionConfirmed(void) { - s32 i, var; + s32 i, count; - for (var = 0, i = 0; i < gBattlersCount; i++) + for (count = 0, i = 0; i < gBattlersCount; i++) { - if (gBattleCommunication[i] == 5) - var++; + if (gBattleCommunication[i] == STATE_WAIT_ACTION_CONFIRMED) + count++; } - if (var + 1 == gBattlersCount) + if (count + 1 == gBattlersCount) return TRUE; else return FALSE; @@ -4577,9 +4600,9 @@ void SwapTurnOrder(u8 id1, u8 id2) gActionsByTurnOrder[id1] = gActionsByTurnOrder[id2]; gActionsByTurnOrder[id2] = temp; - temp = gBattleTurnOrder[id1]; - gBattleTurnOrder[id1] = gBattleTurnOrder[id2]; - gBattleTurnOrder[id2] = temp; + temp = gBattlerByTurnOrder[id1]; + gBattlerByTurnOrder[id1] = gBattlerByTurnOrder[id2]; + gBattlerByTurnOrder[id2] = temp; } u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) @@ -4686,7 +4709,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) { if (gChosenActionByBattler[battler1] == B_ACTION_USE_MOVE) { - if (gProtectStructs[battler1].onlyStruggle) + if (gProtectStructs[battler1].noValidMoves) moveBattler1 = MOVE_STRUGGLE; else moveBattler1 = gBattleMons[battler1].moves[*(gBattleStruct->chosenMovePositions + battler1)]; @@ -4696,7 +4719,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) if (gChosenActionByBattler[battler2] == B_ACTION_USE_MOVE) { - if (gProtectStructs[battler2].onlyStruggle) + if (gProtectStructs[battler2].noValidMoves) moveBattler2 = MOVE_STRUGGLE; else moveBattler2 = gBattleMons[battler2].moves[*(gBattleStruct->chosenMovePositions + battler2)]; @@ -4739,16 +4762,16 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) static void SetActionsAndBattlersTurnOrder(void) { - s32 var = 0; + s32 turnOrderId = 0; s32 i, j; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { - gActionsByTurnOrder[var] = gChosenActionByBattler[gActiveBattler]; - gBattleTurnOrder[var] = gActiveBattler; - var++; + gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; + gBattlerByTurnOrder[turnOrderId] = gActiveBattler; + turnOrderId++; } } else @@ -4759,7 +4782,7 @@ static void SetActionsAndBattlersTurnOrder(void) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_RUN) { - var = 5; + turnOrderId = 5; break; } } @@ -4769,27 +4792,27 @@ static void SetActionsAndBattlersTurnOrder(void) if (gChosenActionByBattler[0] == B_ACTION_RUN) { gActiveBattler = 0; - var = 5; + turnOrderId = 5; } if (gChosenActionByBattler[2] == B_ACTION_RUN) { gActiveBattler = 2; - var = 5; + turnOrderId = 5; } } - if (var == 5) + if (turnOrderId == 5) // One of battlers wants to run. { gActionsByTurnOrder[0] = gChosenActionByBattler[gActiveBattler]; - gBattleTurnOrder[0] = gActiveBattler; - var = 1; + gBattlerByTurnOrder[0] = gActiveBattler; + turnOrderId = 1; for (i = 0; i < gBattlersCount; i++) { if (i != gActiveBattler) { - gActionsByTurnOrder[var] = gChosenActionByBattler[i]; - gBattleTurnOrder[var] = i; - var++; + gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[i]; + gBattlerByTurnOrder[turnOrderId] = i; + turnOrderId++; } } gBattleMainFunc = CheckFocusPunch_ClearVarsBeforeTurnStarts; @@ -4802,26 +4825,26 @@ static void SetActionsAndBattlersTurnOrder(void) { if (gChosenActionByBattler[gActiveBattler] == B_ACTION_USE_ITEM || gChosenActionByBattler[gActiveBattler] == B_ACTION_SWITCH) { - gActionsByTurnOrder[var] = gChosenActionByBattler[gActiveBattler]; - gBattleTurnOrder[var] = gActiveBattler; - var++; + gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; + gBattlerByTurnOrder[turnOrderId] = gActiveBattler; + turnOrderId++; } } for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { if (gChosenActionByBattler[gActiveBattler] != B_ACTION_USE_ITEM && gChosenActionByBattler[gActiveBattler] != B_ACTION_SWITCH) { - gActionsByTurnOrder[var] = gChosenActionByBattler[gActiveBattler]; - gBattleTurnOrder[var] = gActiveBattler; - var++; + gActionsByTurnOrder[turnOrderId] = gChosenActionByBattler[gActiveBattler]; + gBattlerByTurnOrder[turnOrderId] = gActiveBattler; + turnOrderId++; } } for (i = 0; i < gBattlersCount - 1; i++) { for (j = i + 1; j < gBattlersCount; j++) { - u8 battler1 = gBattleTurnOrder[i]; - u8 battler2 = gBattleTurnOrder[j]; + u8 battler1 = gBattlerByTurnOrder[i]; + u8 battler2 = gBattlerByTurnOrder[j]; if (gActionsByTurnOrder[i] != B_ACTION_USE_ITEM && gActionsByTurnOrder[j] != B_ACTION_USE_ITEM && gActionsByTurnOrder[i] != B_ACTION_SWITCH @@ -4868,7 +4891,7 @@ static void TurnValuesCleanUp(bool8 var0) } if (gDisableStructs[gActiveBattler].substituteHP == 0) - gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); + gBattleMons[gActiveBattler].status2 &= ~(STATUS2_SUBSTITUTE); } gSideTimers[0].followmeTimer = 0; @@ -4898,7 +4921,7 @@ static void CheckFocusPunch_ClearVarsBeforeTurnStarts(void) if (gChosenMoveByBattler[gActiveBattler] == MOVE_FOCUS_PUNCH && !(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) && !(gDisableStructs[gBattlerAttacker].truantCounter) - && !(gProtectStructs[gActiveBattler].onlyStruggle)) + && !(gProtectStructs[gActiveBattler].noValidMoves)) { BattleScriptExecute(BattleScript_FocusPunchSetUp); return; @@ -4963,7 +4986,7 @@ static void HandleEndTurn_BattleWon(void) BattleStopLowHpSound(); gBattlescriptCurrInstr = BattleScript_FrontierTrainerBattleWon; - if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE) + if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) PlayBGM(MUS_KACHI3); else PlayBGM(MUS_KACHI1); @@ -5015,7 +5038,7 @@ static void HandleEndTurn_BattleLost(void) { gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeitedLinkBattle; gBattleOutcome &= ~(B_OUTCOME_LINK_BATTLE_RAN); - gSaveBlock2Ptr->field_CA9_b = 1; + gSaveBlock2Ptr->frontier.field_CA9_b = 1; } else { @@ -5047,7 +5070,7 @@ static void HandleEndTurn_RanFromBattle(void) { gBattlescriptCurrInstr = BattleScript_PrintPlayerForfeited; gBattleOutcome = B_OUTCOME_FORFEITED; - gSaveBlock2Ptr->field_CA9_b = 1; + gSaveBlock2Ptr->frontier.field_CA9_b = 1; } else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) { @@ -5122,7 +5145,7 @@ static void HandleEndTurn_FinishBattle(void) | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_WALLY_TUTORIAL)) - && gBattleResults.unk5_6) + && gBattleResults.shinyWildMon) { sub_80EE184(); } @@ -5224,7 +5247,7 @@ static void ReturnFromBattleToOverworld(void) SetRoamerInactive(); } - m4aSongNumStop(0x5A); + m4aSongNumStop(SE_HINSI); SetMainCallback2(gMain.savedCallback); } @@ -5254,7 +5277,7 @@ static void HandleAction_UseMove(void) u8 side; u8 var = 4; - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; if (*(&gBattleStruct->field_91) & gBitTable[gBattlerAttacker]) { @@ -5271,9 +5294,9 @@ static void HandleAction_UseMove(void) gCurrMovePos = gChosenMovePos = *(gBattleStruct->chosenMovePositions + gBattlerAttacker); // choose move - if (gProtectStructs[gBattlerAttacker].onlyStruggle) + if (gProtectStructs[gBattlerAttacker].noValidMoves) { - gProtectStructs[gBattlerAttacker].onlyStruggle = 0; + gProtectStructs[gBattlerAttacker].noValidMoves = 0; gCurrentMove = gChosenMove = MOVE_STRUGGLE; gHitMarker |= HITMARKER_NO_PPDEDUCT; *(gBattleStruct->moveTarget + gBattlerAttacker) = GetMoveTarget(MOVE_STRUGGLE, 0); @@ -5386,7 +5409,7 @@ static void HandleAction_UseMove(void) } else { - gActiveBattler = gBattleTurnOrder[var]; + gActiveBattler = gBattlerByTurnOrder[var]; RecordAbilityBattle(gActiveBattler, gBattleMons[gActiveBattler].ability); gSpecialStatuses[gActiveBattler].lightningRodRedirected = 1; gBattlerTarget = gActiveBattler; @@ -5468,7 +5491,7 @@ static void HandleAction_UseMove(void) static void HandleAction_Switch(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gActionSelectionCursor[gBattlerAttacker] = 0; @@ -5486,7 +5509,7 @@ static void HandleAction_Switch(void) static void HandleAction_UseItem(void) { - gBattlerAttacker = gBattlerTarget = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); @@ -5645,7 +5668,7 @@ bool8 TryRunFromBattle(u8 battler) static void HandleAction_Run(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) { @@ -5666,7 +5689,7 @@ static void HandleAction_Run(void) } gBattleOutcome |= B_OUTCOME_LINK_BATTLE_RAN; - gSaveBlock2Ptr->field_CA9_b = 1; + gSaveBlock2Ptr->frontier.field_CA9_b = 1; } else { @@ -5699,7 +5722,7 @@ static void HandleAction_Run(void) static void HandleAction_WatchesCarefully(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattlescriptCurrInstr = gBattlescriptsForSafariActions[0]; @@ -5708,7 +5731,7 @@ static void HandleAction_WatchesCarefully(void) static void HandleAction_SafariZoneBallThrow(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gNumSafariBalls--; @@ -5719,22 +5742,22 @@ static void HandleAction_SafariZoneBallThrow(void) static void HandleAction_ThrowPokeblock(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; gBattleCommunication[MULTISTRING_CHOOSER] = gBattleBufferB[gBattlerAttacker][1] - 1; gLastUsedItem = gBattleBufferB[gBattlerAttacker][2]; - if (gBattleResults.field_1F < 0xFF) - gBattleResults.field_1F++; - if (gBattleStruct->field_7A < 3) - gBattleStruct->field_7A++; - if (gBattleStruct->field_7B > 1) + if (gBattleResults.pokeblockThrows < 0xFF) + gBattleResults.pokeblockThrows++; + if (gBattleStruct->safariPkblThrowCounter < 3) + gBattleStruct->safariPkblThrowCounter++; + if (gBattleStruct->safariEscapeFactor > 1) { - if (gBattleStruct->field_7B < sUnknown_0831BCE0[gBattleStruct->field_7A][gBattleCommunication[MULTISTRING_CHOOSER]]) - gBattleStruct->field_7B = 1; + if (gBattleStruct->safariEscapeFactor < sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]]) + gBattleStruct->safariEscapeFactor = 1; else - gBattleStruct->field_7B -= sUnknown_0831BCE0[gBattleStruct->field_7A][gBattleCommunication[MULTISTRING_CHOOSER]]; + gBattleStruct->safariEscapeFactor -= sPkblToEscapeFactor[gBattleStruct->safariPkblThrowCounter][gBattleCommunication[MULTISTRING_CHOOSER]]; } gBattlescriptCurrInstr = gBattlescriptsForSafariActions[2]; @@ -5743,26 +5766,26 @@ static void HandleAction_ThrowPokeblock(void) static void HandleAction_GoNear(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; - gBattleStruct->field_7C += sUnknown_0831BCEF[gBattleStruct->field_79]; - if (gBattleStruct->field_7C > 20) - gBattleStruct->field_7C = 20; + gBattleStruct->safariCatchFactor += sGoNearCounterToCatchFactor[gBattleStruct->safariGoNearCounter]; + if (gBattleStruct->safariCatchFactor > 20) + gBattleStruct->safariCatchFactor = 20; - gBattleStruct->field_7B +=sUnknown_0831BCF3[gBattleStruct->field_79]; - if (gBattleStruct->field_7B > 20) - gBattleStruct->field_7B = 20; + gBattleStruct->safariEscapeFactor += sGoNearCounterToEscapeFactor[gBattleStruct->safariGoNearCounter]; + if (gBattleStruct->safariEscapeFactor > 20) + gBattleStruct->safariEscapeFactor = 20; - if (gBattleStruct->field_79 < 3) + if (gBattleStruct->safariGoNearCounter < 3) { - gBattleStruct->field_79++; + gBattleStruct->safariGoNearCounter++; gBattleCommunication[MULTISTRING_CHOOSER] = 0; } else { - gBattleCommunication[MULTISTRING_CHOOSER] = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; // Can't get closer. } gBattlescriptCurrInstr = gBattlescriptsForSafariActions[1]; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; @@ -5770,15 +5793,15 @@ static void HandleAction_GoNear(void) static void HandleAction_SafriZoneRun(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; PlaySE(SE_NIGERU); gCurrentTurnActionNumber = gBattlersCount; gBattleOutcome = B_OUTCOME_RAN; } -static void HandleAction_Action9(void) +static void HandleAction_WallyBallThrow(void) { - gBattlerAttacker = gBattleTurnOrder[gCurrentTurnActionNumber]; + gBattlerAttacker = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; @@ -5811,7 +5834,7 @@ static void HandleAction_NothingIsFainted(void) static void HandleAction_ActionFinished(void) { - *(gBattleStruct->monToSwitchIntoId + gBattleTurnOrder[gCurrentTurnActionNumber]) = 6; + *(gBattleStruct->monToSwitchIntoId + gBattlerByTurnOrder[gCurrentTurnActionNumber]) = 6; gCurrentTurnActionNumber++; gCurrentActionFuncId = gActionsByTurnOrder[gCurrentTurnActionNumber]; SpecialStatusesClear(); diff --git a/src/battle_message.c b/src/battle_message.c index 1f338db92..13502d6f2 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -6,6 +6,7 @@ #include "text.h" #include "string_util.h" #include "constants/items.h" +#include "constants/trainers.h" #include "event_data.h" #include "link.h" #include "item.h" @@ -17,11 +18,23 @@ #include "recorded_battle.h" #include "international_string_util.h" -extern u8 gBattlerAbilities[MAX_BATTLERS_COUNT]; +struct BattleWindowText +{ + u8 fillValue; + u8 fontId; + u8 x; + u8 y; + u8 letterSpacing; + u8 lineSpacing; + u8 speed; + u8 fgColor; + u8 bgColor; + u8 shadowColor; +}; + extern u8 gUnknown_0203C7B4; -extern struct StringInfoBattle *gStringInfo; -extern const u8 gMoveNames[LAST_MOVE_INDEX + 1][13]; +extern const u8 gMoveNames[MOVES_COUNT][13]; extern const u8 gTrainerClassNames[][13]; extern const u16 gUnknown_08D85620[]; @@ -31,12 +44,11 @@ extern const u8 gText_PkmnBoxLanettesPCFull[]; extern const u8 gText_PkmnTransferredSomeonesPC[]; extern const u8 gText_PkmnTransferredLanettesPC[]; -extern u16 sub_8068BB0(void); // pokemon_1 -extern u8 sub_81A4D00(void); // battle_frontier_2 +extern u8 GetFrontierBrainTrainerClass(void); // battle_frontier_2 extern u8 GetFrontierOpponentClass(u16 trainerId); // battle_tower extern u8 sub_81D5530(u16 trainerId); // pokenav extern u8 GetEreaderTrainerClassId(void); // battle_tower -extern void sub_81A4D50(u8 *txtPtr); // battle_frontier_2 +extern void CopyFrontierBrainTrainerName(u8 *txtPtr); // battle_frontier_2 extern void sub_81D5554(u8 *txtPtr, u16 trainerId); // pokenav extern void GetEreaderTrainerName(u8 *txtPtr); extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2 @@ -44,15 +56,13 @@ extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav extern void GetFrontierTrainerName(u8 *dst, u16 trainerId); // this file's functions -static void sub_814F8F8(u8 *textPtr); -static void sub_814F950(u8 *dst); +static void ChooseMoveUsedParticle(u8 *textPtr); +static void ChooseTypeOfMoveUsedString(u8 *dst); static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst); -// ewram variables -EWRAM_DATA u8 gDisplayedStringBattle[300] = {0}; -EWRAM_DATA u8 gBattleTextBuff1[TEXT_BUFF_ARRAY_COUNT] = {0}; -EWRAM_DATA u8 gBattleTextBuff2[TEXT_BUFF_ARRAY_COUNT] = {0}; -EWRAM_DATA u8 gBattleTextBuff3[TEXT_BUFF_ARRAY_COUNT] = {0}; +// EWRAM vars +static EWRAM_DATA u8 sBattlerAbilities[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA struct BattleMsgData *gBattleMsgDataPtr = NULL; // const rom data // todo: make some of those names less vague: attacker/target vs pkmn, etc. @@ -1187,7 +1197,14 @@ const u8 * const gStatNamesTable2[] = }; const u8 gText_SafariBalls[] = _("{HIGHLIGHT DARK_GREY}SAFARI BALLS"); -const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GREY}Left: $" "{HIGHLIGHT DARK_GREY}");const u8 gText_Sleep[] = _( "sleep");const u8 gText_Poison[] = _( "poison");const u8 gText_Burn[] = _( "burn");const u8 gText_Paralysis[] = _( "paralysis");const u8 gText_Ice[] = _( "ice");const u8 gText_Confusion[] = _( "confusion");const u8 gText_Love[] = _( "love"); +const u8 gText_SafariBallLeft[] = _("{HIGHLIGHT DARK_GREY}Left: $" "{HIGHLIGHT DARK_GREY}"); +const u8 gText_Sleep[] = _("sleep"); +const u8 gText_Poison[] = _("poison"); +const u8 gText_Burn[] = _("burn"); +const u8 gText_Paralysis[] = _("paralysis"); +const u8 gText_Ice[] = _("ice"); +const u8 gText_Confusion[] = _("confusion"); +const u8 gText_Love[] = _("love"); const u8 gText_SpaceAndSpace[] = _(" and "); const u8 gText_CommaSpace[] = _(", "); const u8 gText_Space2[] = _(" "); @@ -1308,8 +1325,8 @@ static const u8 sText_LinkTrainerWantsToBattlePause[] = _("{B_20}\nwants to batt static const u8 sText_TwoLinkTrainersWantToBattlePause[] = _("{B_20} and {B_21}\nwant to battle!{PAUSE 49}"); // This is four lists of moves which use a different attack string in Japanese -// to the default. See the documentation for sub_814F950 for more detail. -static const u16 sUnknownMoveTable[] = +// to the default. See the documentation for ChooseTypeOfMoveUsedString for more detail. +static const u16 sGrammarMoveUsedTable[] = { MOVE_SWORDS_DANCE, MOVE_STRENGTH, MOVE_GROWTH, MOVE_HARDEN, MOVE_MINIMIZE, MOVE_SMOKESCREEN, @@ -1351,86 +1368,609 @@ static const u16 sUnknownMoveTable[] = static const u8 sDummyWeirdStatusString[] = {EOS, EOS, EOS, EOS, EOS, EOS, EOS, EOS, 0, 0}; -static const u8 sUnknown_085CD42C[] = -{ - 0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1, - 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, - 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, - 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, - 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, - 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, - 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, 0xEE, 0x7, 0x0, - 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, - 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0x20, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, - 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, - 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, - 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, - 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, - 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF, - 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, - 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, - 0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0 +static const struct BattleWindowText sTextOnWindowsInfo_Normal[] = +{ + { // 0 + .fillValue = 0xFF, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 1, + .fgColor = 1, + .bgColor = 15, + .shadowColor = 6, + }, + { // 1 + .fillValue = 0xFF, + .fontId = 1, + .x = 1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 15, + .shadowColor = 6, + }, + { // 2 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 3 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 4 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 5 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 6 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 7 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 12, + .bgColor = 14, + .shadowColor = 11, + }, + { // 8 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 9 + .fillValue = 0xEE, + .fontId = 1, + .x = 2, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 12, + .bgColor = 14, + .shadowColor = 11, + }, + { // 10 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 11 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 12 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 13 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 14 + .fillValue = 0x0, + .fontId = 1, + .x = 32, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 0, + .shadowColor = 2, + }, + { // 15 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 16 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 17 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 18 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 19 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 20 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 21 + .fillValue = 0x0, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 0, + .shadowColor = 6, + }, + { // 22 + .fillValue = 0x0, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 0, + .shadowColor = 6, + }, + { // 23 + .fillValue = 0x0, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 0, + .shadowColor = 6, + }, }; -static const u8 sUnknown_085CD54C[] = -{ - 0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1, - 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, - 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, - 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, - 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, - 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, - 0x1, 0x2, 0x1, 0x0, 0x0, 0x0, 0xC, 0xE, 0xB, 0x0, 0x0, 0xEE, 0x7, 0x0, - 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x7, 0x0, 0x1, 0x0, - 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, - 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0xD, - 0xE, 0xF, 0x0, 0x0, 0x0, 0x1, 0x20, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, - 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0xE, 0xF, 0x0, - 0x0, 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, - 0xEE, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, - 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, - 0xFF, 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF, - 0x1, 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0xEE, 0x1, 0xFF, 0x1, - 0x0, 0x0, 0x0, 0xD, 0xE, 0xF, 0x0, 0x0, 0x11, 0x1, 0x0, 0x1, 0x0, 0x0, - 0x1, 0x2, 0x1, 0x3, 0x0, 0x0 +static const struct BattleWindowText sTextOnWindowsInfo_Arena[] = +{ + { // 0 + .fillValue = 0xFF, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 1, + .fgColor = 1, + .bgColor = 15, + .shadowColor = 6, + }, + { // 1 + .fillValue = 0xFF, + .fontId = 1, + .x = 1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 15, + .shadowColor = 6, + }, + { // 2 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 3 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 4 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 5 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 6 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 7 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 12, + .bgColor = 14, + .shadowColor = 11, + }, + { // 8 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 9 + .fillValue = 0xEE, + .fontId = 1, + .x = 2, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 12, + .bgColor = 14, + .shadowColor = 11, + }, + { // 10 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 11 + .fillValue = 0xEE, + .fontId = 7, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 12 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 13 + .fillValue = 0xEE, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 14 + .fillValue = 0x0, + .fontId = 1, + .x = 32, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 0, + .shadowColor = 2, + }, + { // 15 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 1, + .bgColor = 14, + .shadowColor = 15, + }, + { // 16 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 17 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 18 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 19 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 20 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 21 + .fillValue = 0xEE, + .fontId = 1, + .x = -1, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = 13, + .bgColor = 14, + .shadowColor = 15, + }, + { // 22 + .fillValue = 0x11, + .fontId = 1, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 1, + .fgColor = 2, + .bgColor = 1, + .shadowColor = 3, + }, }; -static const u8 * const gUnknown_085CD660[] = +static const struct BattleWindowText *const sBattleTextOnWindowsInfo[] = { - sUnknown_085CD42C, sUnknown_085CD54C + sTextOnWindowsInfo_Normal, sTextOnWindowsInfo_Arena }; static const u8 sRecordedBattleTextSpeeds[] = {8, 4, 1, 0}; +// code void BufferStringBattle(u16 stringID) { s32 i; - const u8* stringPtr = NULL; + const u8 *stringPtr = NULL; - gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBattler][4]); - gLastUsedItem = gStringInfo->lastItem; - gLastUsedAbility = gStringInfo->lastAbility; - gBattleScripting.battler = gStringInfo->scrActive; - *(&gBattleStruct->field_52) = gStringInfo->unk1605E; - *(&gBattleStruct->hpScale) = gStringInfo->hpScale; - gPotentialItemEffectBattler = gStringInfo->StringBank; - *(&gBattleStruct->stringMoveType) = gStringInfo->moveType; + gBattleMsgDataPtr = (struct BattleMsgData*)(&gBattleBufferA[gActiveBattler][4]); + gLastUsedItem = gBattleMsgDataPtr->lastItem; + gLastUsedAbility = gBattleMsgDataPtr->lastAbility; + gBattleScripting.battler = gBattleMsgDataPtr->scrActive; + *(&gBattleStruct->field_52) = gBattleMsgDataPtr->unk1605E; + *(&gBattleStruct->hpScale) = gBattleMsgDataPtr->hpScale; + gPotentialItemEffectBattler = gBattleMsgDataPtr->itemEffectBattler; + *(&gBattleStruct->stringMoveType) = gBattleMsgDataPtr->moveType; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - gBattlerAbilities[i] = gStringInfo->abilities[i]; + sBattlerAbilities[i] = gBattleMsgDataPtr->abilities[i]; } for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++) { - gBattleTextBuff1[i] = gStringInfo->textBuffs[0][i]; - gBattleTextBuff2[i] = gStringInfo->textBuffs[1][i]; - gBattleTextBuff3[i] = gStringInfo->textBuffs[2][i]; + gBattleTextBuff1[i] = gBattleMsgDataPtr->textBuffs[0][i]; + gBattleTextBuff2[i] = gBattleMsgDataPtr->textBuffs[1][i]; + gBattleTextBuff3[i] = gBattleMsgDataPtr->textBuffs[2][i]; } switch (stringID) @@ -1542,7 +2082,7 @@ void BufferStringBattle(u16 stringID) } else { - if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_800 || gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gTrainerBattleOpponent_A == TRAINER_LINK_OPPONENT || gBattleTypeFlags & BATTLE_TYPE_x2000000) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) stringPtr = sText_LinkTrainer2WithdrewPkmn; @@ -1605,14 +2145,14 @@ void BufferStringBattle(u16 stringID) } break; case STRINGID_USEDMOVE: // pokemon used a move msg - sub_814F8F8(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names? + ChooseMoveUsedParticle(gBattleTextBuff1); // buff1 doesn't appear in the string, leftover from japanese move names - if (gStringInfo->currentMove > LAST_MOVE_INDEX) + if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) StringCopy(gBattleTextBuff2, sATypeMove_Table[*(&gBattleStruct->stringMoveType)]); else - StringCopy(gBattleTextBuff2, gMoveNames[gStringInfo->currentMove]); + StringCopy(gBattleTextBuff2, gMoveNames[gBattleMsgDataPtr->currentMove]); - sub_814F950(gBattleTextBuff2); + ChooseTypeOfMoveUsedString(gBattleTextBuff2); stringPtr = sText_AttackerUsedX; break; case STRINGID_BATTLEEND: // battle end @@ -1843,25 +2383,25 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = text; break; case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18]], + GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]], + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 1]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name - GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]], + GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 2]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; break; case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name - GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]], + GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].id ^ 3]], MON_DATA_NICKNAME, text); StringGetEnd10(text); toCpy = text; @@ -1895,16 +2435,16 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler]) break; case B_TXT_CURRENT_MOVE: // current move name - if (gStringInfo->currentMove > LAST_MOVE_INDEX) + if (gBattleMsgDataPtr->currentMove >= MOVES_COUNT) toCpy = sATypeMove_Table[gBattleStruct->stringMoveType]; else - toCpy = gMoveNames[gStringInfo->currentMove]; + toCpy = gMoveNames[gBattleMsgDataPtr->currentMove]; break; case B_TXT_LAST_MOVE: // originally used move name - if (gStringInfo->originallyUsedMove > LAST_MOVE_INDEX) + if (gBattleMsgDataPtr->originallyUsedMove >= MOVES_COUNT) toCpy = sATypeMove_Table[gBattleStruct->stringMoveType]; else - toCpy = gMoveNames[gStringInfo->originallyUsedMove]; + toCpy = gMoveNames[gBattleMsgDataPtr->originallyUsedMove]; break; case B_TXT_LAST_ITEM: // last used item if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) @@ -1927,7 +2467,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) } else { - if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gPotentialItemEffectBattler) + if (gLinkPlayers[gBattleScripting.multiplayerId].id == gPotentialItemEffectBattler) { StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name); StringAppend(text, sText_BerrySuffix); @@ -1953,24 +2493,24 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gAbilityNames[gLastUsedAbility]; break; case B_TXT_ATK_ABILITY: // attacker ability - toCpy = gAbilityNames[gBattlerAbilities[gBattlerAttacker]]; + toCpy = gAbilityNames[sBattlerAbilities[gBattlerAttacker]]; break; case B_TXT_DEF_ABILITY: // target ability - toCpy = gAbilityNames[gBattlerAbilities[gBattlerTarget]]; + toCpy = gAbilityNames[sBattlerAbilities[gBattlerTarget]]; break; case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability - toCpy = gAbilityNames[gBattlerAbilities[gBattleScripting.battler]]; + toCpy = gAbilityNames[sBattlerAbilities[gBattleScripting.battler]]; break; case B_TXT_EFF_ABILITY: // effect battlerId ability - toCpy = gAbilityNames[gBattlerAbilities[gEffectBattler]]; + toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]]; break; case B_TXT_TRAINER1_CLASS: // trainer class name if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE) toCpy = gTrainerClassNames[GetSecretBaseTrainerClass()]; else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_C00) toCpy = gTrainerClassNames[sub_8068BB0()]; - else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE) - toCpy = gTrainerClassNames[sub_81A4D00()]; + else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) + toCpy = gTrainerClassNames[GetFrontierBrainTrainerClass()]; else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) toCpy = gTrainerClassNames[GetFrontierOpponentClass(gTrainerBattleOpponent_A)]; else if (gBattleTypeFlags & BATTLE_TYPE_x4000000) @@ -1993,9 +2533,9 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) { toCpy = gLinkPlayers[multiplayerID ^ BIT_SIDE].name; } - else if (gTrainerBattleOpponent_A == TRAINER_OPPONENT_3FE) + else if (gTrainerBattleOpponent_A == TRAINER_FRONTIER_BRAIN) { - sub_81A4D50(text); + CopyFrontierBrainTrainerName(text); toCpy = text; } else if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER) @@ -2022,13 +2562,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) toCpy = gLinkPlayers[multiplayerID].name; break; case B_TXT_1F: // link partner name? - toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; + toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].id)].name; break; case B_TXT_20: // link opponent 1 name? - toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; + toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].id)].name; break; case B_TXT_21: // link opponent 2 name? - toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name; + toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].id)].name; break; case B_TXT_22: // link scripting active name toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name; @@ -2203,10 +2743,6 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) return dstID; } -// TODO: move these to a general header like util.h -#define ByteRead16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) -#define ByteRead32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) - static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) { u32 srcID = 1; @@ -2220,7 +2756,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) switch (src[srcID]) { case B_BUFF_STRING: // battle string - hword = ByteRead16(&src[srcID + 1]); + hword = T1_READ_16(&src[srcID + 1]); StringAppend(dst, gBattleStringsTable[hword - BATTLESTRINGS_ID_ADDER]); srcID += 3; break; @@ -2231,17 +2767,17 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) value = src[srcID + 3]; break; case 2: - value = ByteRead16(&src[srcID + 3]); + value = T1_READ_16(&src[srcID + 3]); break; case 4: - value = ByteRead32(&src[srcID + 3]); + value = T1_READ_32(&src[srcID + 3]); break; } ConvertIntToDecimalStringN(dst, value, 0, src[srcID + 2]); srcID += src[srcID + 1] + 3; break; case B_BUFF_MOVE: // move name - StringAppend(dst, gMoveNames[ByteRead16(&src[srcID + 1])]); + StringAppend(dst, gMoveNames[T1_READ_16(&src[srcID + 1])]); srcID += 3; break; case B_BUFF_TYPE: // type name @@ -2271,7 +2807,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) srcID += 2; break; case B_BUFF_SPECIES: // species name - GetSpeciesName(dst, ByteRead16(&src[srcID + 1])); + GetSpeciesName(dst, T1_READ_16(&src[srcID + 1])); srcID += 3; break; case B_BUFF_MON_NICK: // poke nick without prefix @@ -2291,24 +2827,30 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) srcID += 2; break; case B_BUFF_ITEM: // item name - hword = ByteRead16(&src[srcID + 1]); + hword = T1_READ_16(&src[srcID + 1]); if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) { if (hword == ITEM_ENIGMA_BERRY) { - if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gPotentialItemEffectBattler) + if (gLinkPlayers[gBattleScripting.multiplayerId].id == gPotentialItemEffectBattler) { StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name); StringAppend(dst, sText_BerrySuffix); } else + { StringAppend(dst, sText_EnigmaBerry); + } } else + { CopyItemName(hword, dst); + } } else + { CopyItemName(hword, dst); + } srcID += 3; break; } @@ -2317,18 +2859,18 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst) // Loads one of two text strings into the provided buffer. This is functionally // unused, since the value loaded into the buffer is not read; it loaded one of -// two particles (either "は" or "の") which works in tandem with sub_814F950 +// two particles (either "は" or "の") which works in tandem with ChooseTypeOfMoveUsedString // below to effect changes in the meaning of the line. -static void sub_814F8F8(u8* textBuff) +static void ChooseMoveUsedParticle(u8* textBuff) { s32 counter = 0; u32 i = 0; while (counter != 4) { - if (sUnknownMoveTable[i] == 0) + if (sGrammarMoveUsedTable[i] == 0) counter++; - if (sUnknownMoveTable[i++] == gStringInfo->currentMove) + if (sGrammarMoveUsedTable[i++] == gBattleMsgDataPtr->currentMove) break; } @@ -2342,7 +2884,7 @@ static void sub_814F8F8(u8* textBuff) } // Appends "!" to the text buffer `dst`. In the original Japanese this looked -// into the table of moves at sUnknownMoveTable and varied the line accordingly. +// into the table of moves at sGrammarMoveUsedTable and varied the line accordingly. // // sText_ExclamationMark was a plain "!", used for any attack not on the list. // It resulted in the translation "<NAME>'s <ATTACK>!". @@ -2359,7 +2901,7 @@ static void sub_814F8F8(u8* textBuff) // // sText_ExclamationMark5 was " こうげき!" This resulted in a translation of // "<NAME>'s <ATTACK> attack!". -static void sub_814F950(u8* dst) +static void ChooseTypeOfMoveUsedString(u8* dst) { s32 counter = 0; s32 i = 0; @@ -2369,9 +2911,9 @@ static void sub_814F950(u8* dst) while (counter != 4) { - if (sUnknownMoveTable[i] == MOVE_NONE) + if (sGrammarMoveUsedTable[i] == MOVE_NONE) counter++; - if (sUnknownMoveTable[i++] == gStringInfo->currentMove) + if (sGrammarMoveUsedTable[i++] == gBattleMsgDataPtr->currentMove) break; } @@ -2395,47 +2937,46 @@ static void sub_814F950(u8* dst) } } -void BattleHandleAddTextPrinter(const u8 *text, u8 arg1) +void BattlePutTextOnWindow(const u8 *text, u8 windowId) { - const u8 *r8 = gUnknown_085CD660[gBattleScripting.field_24]; - bool32 r9; + const struct BattleWindowText *textInfo = sBattleTextOnWindowsInfo[gBattleScripting.windowsType]; + bool32 copyToVram; struct TextSubPrinter textSubPrinter; u8 speed; - if (arg1 & 0x80) + if (windowId & 0x80) { - arg1 &= ~(0x80); - r9 = FALSE; + windowId &= ~(0x80); + copyToVram = FALSE; } else { - FillWindowPixelBuffer(arg1, r8[12 * arg1]); - r9 = TRUE; + FillWindowPixelBuffer(windowId, textInfo[windowId].fillValue); + copyToVram = TRUE; } textSubPrinter.current_text_offset = text; - textSubPrinter.windowId = arg1; - textSubPrinter.fontId = r8[(12 * arg1) + 1]; - textSubPrinter.x = r8[(12 * arg1) + 2]; - textSubPrinter.y = r8[(12 * arg1) + 3]; + textSubPrinter.windowId = windowId; + textSubPrinter.fontId = textInfo[windowId].fontId; + textSubPrinter.x = textInfo[windowId].x; + textSubPrinter.y = textInfo[windowId].y; textSubPrinter.currentX = textSubPrinter.x; textSubPrinter.currentY = textSubPrinter.y; - textSubPrinter.letterSpacing = r8[(12 * arg1) + 4]; - textSubPrinter.lineSpacing = r8[(12 * arg1) + 5]; + textSubPrinter.letterSpacing = textInfo[windowId].letterSpacing; + textSubPrinter.lineSpacing = textInfo[windowId].lineSpacing; textSubPrinter.fontColor_l = 0; - textSubPrinter.fgColor = r8[(12 * arg1) + 7]; - textSubPrinter.bgColor = r8[(12 * arg1) + 8]; - textSubPrinter.shadowColor = r8[(12 * arg1) + 9]; + textSubPrinter.fgColor = textInfo[windowId].fgColor; + textSubPrinter.bgColor = textInfo[windowId].bgColor; + textSubPrinter.shadowColor = textInfo[windowId].shadowColor; if (textSubPrinter.x == 0xFF) { - s32 var2; - u32 var = sub_80397C4(gBattleScripting.field_24, arg1); - var2 = GetStringCenterAlignXOffsetWithLetterSpacing(textSubPrinter.fontId, textSubPrinter.current_text_offset, var, textSubPrinter.letterSpacing); - textSubPrinter.x = textSubPrinter.currentX = var2; + u32 width = sub_80397C4(gBattleScripting.windowsType, windowId); + s32 alignX = GetStringCenterAlignXOffsetWithLetterSpacing(textSubPrinter.fontId, textSubPrinter.current_text_offset, width, textSubPrinter.letterSpacing); + textSubPrinter.x = textSubPrinter.currentX = alignX; } - if (arg1 == 0x16) + if (windowId == 0x16) gTextFlags.flag_1 = 0; else gTextFlags.flag_1 = 1; @@ -2445,7 +2986,7 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1) else gTextFlags.flag_2 = 0; - if (arg1 == 0 || arg1 == 0x16) + if (windowId == 0 || windowId == 0x16) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) speed = 1; @@ -2458,16 +2999,16 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1) } else { - speed = r8[(12 * arg1) + 6]; + speed = textInfo[windowId].speed; gTextFlags.flag_0 = 0; } AddTextPrinter(&textSubPrinter, speed, NULL); - if (r9) + if (copyToVram) { - PutWindowTilemap(arg1); - CopyWindowToVram(arg1, 3); + PutWindowTilemap(windowId); + CopyWindowToVram(windowId, 3); } } diff --git a/src/battle_records.c b/src/battle_records.c new file mode 100644 index 000000000..8e9d045cb --- /dev/null +++ b/src/battle_records.c @@ -0,0 +1,510 @@ +#include "global.h" +#include "battle_records.h" +#include "bg.h" +#include "window.h" +#include "link.h" +#include "battle.h" +#include "overworld.h" +#include "text.h" +#include "text_window.h" +#include "strings.h" +#include "string_util.h" +#include "trainer_card.h" +#include "menu.h" +#include "menu_helpers.h" +#include "palette.h" +#include "main.h" +#include "scanline_effect.h" +#include "international_string_util.h" +#include "sound.h" +#include "constants/songs.h" +#include "malloc.h" +#include "gpu_regs.h" +#include "constants/game_stat.h" + +extern void PrintOnTrainerHillRecordsWindow(void); // pokenav.s + +// this file's functions +static void Task_CloseTrainerHillRecordsOnButton(u8 taskId); +static void Task_BeginPaletteFade(u8 taskId); +static void Task_ExitTrainerHillRecords(u8 taskId); +static void RemoveTrainerHillRecordsWindow(u8 windowId); +static void CB2_ShowTrainerHillRecords(void); + +// EWRAM variables +EWRAM_DATA u8 gRecordsWindowId = 0; +EWRAM_DATA static u8 *sTilemapBuffer = NULL; + +// const rom data +static const u32 sTrainerHillWindowTileset[] = INCBIN_U32("graphics/unknown/unknown_5B3484.4bpp"); +static const u16 sTrainerHillWindowPalette[] = INCBIN_U16("graphics/unknown/unknown_5B3484.gbapal"); +static const u32 sTrainerHillWindowTilemap[] = INCBIN_U32("graphics/unknown/unknown_5B3564.bin"); + +static const struct BgTemplate sTrainerHillRecordsBgTemplates[] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0 + }, + { + .bg = 3, + .charBaseIndex = 1, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0 + } +}; + +static const struct WindowTemplate sTrainerHillRecordsWindowTemplates[] = +{ + {0x0, 0x2, 0x1, 0x1A, 0x12, 0xF, 0x14}, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sLinkBattleRecordsWindow = {0x0, 0x2, 0x1, 0x1A, 0x11, 0xF, 0x1}; + +static const u8 sText_DashesNoPlayer[] = _("-------"); +static const u8 sText_DashesNoScore[] = _("----"); + +// code +static void ClearLinkBattleRecord(struct LinkBattleRecord *record) +{ + CpuFill16(0, record, sizeof(struct LinkBattleRecord)); + record->name[0] = EOS; + record->trainerId = 0; + record->wins = 0; + record->losses = 0; + record->draws = 0; +} + +static void ClearLinkBattleRecords(struct LinkBattleRecord *records) +{ + s32 i; + for (i = 0; i < LINK_B_RECORDS_COUNT; i++) + { + ClearLinkBattleRecord(records + i); + } + SetGameStat(GAME_STAT_LINK_BATTLE_WINS, 0); + SetGameStat(GAME_STAT_LINK_BATTLE_LOSSES, 0); + SetGameStat(GAME_STAT_LINK_BATTLE_DRAWS, 0); +} + +static s32 GetLinkBattleRecordTotalBattles(struct LinkBattleRecord *record) +{ + return record->wins + record->losses + record->draws; +} + +static s32 FindLinkBattleRecord(struct LinkBattleRecord *records, const u8 *name, u16 trainerId) +{ + s32 i; + + for (i = 0; i < LINK_B_RECORDS_COUNT; i++) + { + if (!StringCompareN(records[i].name, name, OT_NAME_LENGTH) && records[i].trainerId == trainerId) + return i; + } + + return LINK_B_RECORDS_COUNT; +} + +static void SortLinkBattleRecords(struct LinkBattleRecords *records) +{ + s32 i, j; + + for (i = LINK_B_RECORDS_COUNT - 1; i > 0; i--) + { + for (j = i - 1; j >= 0; j--) + { + s32 totalBattlesI = GetLinkBattleRecordTotalBattles(&records->entries[i]); + s32 totalBattlesJ = GetLinkBattleRecordTotalBattles(&records->entries[j]); + + if (totalBattlesI > totalBattlesJ) + { + struct LinkBattleRecord temp1; + u8 temp2; + + temp1 = records->entries[i]; + records->entries[i] = records->entries[j]; + records->entries[j] = temp1; + + temp2 = records->languages[i]; + records->languages[i] = records->languages[j]; + records->languages[j] = temp2; + } + } + } +} + +static void UpdateLinkBattleRecord(struct LinkBattleRecord *record, s32 battleOutcome) +{ + switch (battleOutcome) + { + case B_OUTCOME_WON: + record->wins++; + if (record->wins > 9999) + record->wins = 9999; + break; + case B_OUTCOME_LOST: + record->losses++; + if (record->losses > 9999) + record->losses = 9999; + break; + case B_OUTCOME_DREW: + record->draws++; + if (record->draws > 9999) + record->draws = 9999; + break; + } +} + +static void UpdateLinkBattleGameStats(s32 battleOutcome) +{ + u8 stat; + + switch (battleOutcome) + { + case B_OUTCOME_WON: + stat = GAME_STAT_LINK_BATTLE_WINS; + break; + case B_OUTCOME_LOST: + stat = GAME_STAT_LINK_BATTLE_LOSSES; + break; + case B_OUTCOME_DREW: + stat = GAME_STAT_LINK_BATTLE_DRAWS; + break; + default: + return; + } + + if (GetGameStat(stat) < 9999) + IncrementGameStat(stat); +} + +static void UpdateLinkBattleRecords(struct LinkBattleRecords *records, const u8 *name, u16 trainerId, s32 battleOutcome, u8 battlerId) +{ + s32 index; + + UpdateLinkBattleGameStats(battleOutcome); + SortLinkBattleRecords(records); + index = FindLinkBattleRecord(records->entries, name, trainerId); + if (index == LINK_B_RECORDS_COUNT) + { + index = LINK_B_RECORDS_COUNT - 1; + ClearLinkBattleRecord(&records->entries[index]); + StringCopyN(records->entries[index].name, name, OT_NAME_LENGTH); + records->entries[index].trainerId = trainerId; + records->languages[index] = gLinkPlayers[battlerId].language; + } + UpdateLinkBattleRecord(&records->entries[index], battleOutcome); + SortLinkBattleRecords(records); +} + +void ClearPlayerLinkBattleRecords(void) +{ + ClearLinkBattleRecords(gSaveBlock1Ptr->linkBattleRecords.entries); +} + +static void IncTrainerCardWins(s32 battlerId) +{ + u16 *wins = &gTrainerCards[battlerId].linkBattleWins; + (*wins)++; + if (*wins > 9999) + *wins = 9999; +} + +static void IncTrainerCardLosses(s32 battlerId) +{ + u16 *losses = &gTrainerCards[battlerId].linkBattleLosses; + (*losses)++; + if (*losses > 9999) + *losses = 9999; +} + +static void UpdateTrainerCardWinsLosses(s32 battlerId) +{ + switch (gBattleOutcome) + { + case B_OUTCOME_WON: + IncTrainerCardWins(BATTLE_OPPOSITE(battlerId)); + IncTrainerCardLosses(battlerId); + break; + case B_OUTCOME_LOST: + IncTrainerCardLosses(BATTLE_OPPOSITE(battlerId)); + IncTrainerCardWins(battlerId); + break; + } +} + +void UpdatePlayerLinkBattleRecords(s32 battlerId) +{ + if (InUnionRoom() != TRUE) + { + UpdateTrainerCardWinsLosses(battlerId); + UpdateLinkBattleRecords( + &gSaveBlock1Ptr->linkBattleRecords, + gTrainerCards[battlerId].playerName, + gTrainerCards[battlerId].trainerId, + gBattleOutcome, + battlerId); + } +} + +static void PrintLinkBattleWinsLossesDraws(struct LinkBattleRecord *records) +{ + s32 x; + + ConvertIntToDecimalStringN(gStringVar1, GetGameStat(GAME_STAT_LINK_BATTLE_WINS), STR_CONV_MODE_LEFT_ALIGN, 4); + ConvertIntToDecimalStringN(gStringVar2, GetGameStat(GAME_STAT_LINK_BATTLE_LOSSES), STR_CONV_MODE_LEFT_ALIGN, 4); + ConvertIntToDecimalStringN(gStringVar3, GetGameStat(GAME_STAT_LINK_BATTLE_DRAWS), STR_CONV_MODE_LEFT_ALIGN, 4); + StringExpandPlaceholders(gStringVar4, gText_TotalRecordWLD); + + x = GetStringCenterAlignXOffset(1, gStringVar4, 0xD0); + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar4, x, 0x11, 0, NULL); +} + +static void PrintLinkBattleRecord(struct LinkBattleRecord *record, u8 y, s32 language) +{ + if (record->wins == 0 && record->losses == 0 && record->draws == 0) + { + // empty slot + PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoPlayer, 8, (y * 8) + 1, 0, NULL); + PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoScore, 80, (y * 8) + 1, 0, NULL); + PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoScore, 128, (y * 8) + 1, 0, NULL); + PrintTextOnWindow(gRecordsWindowId, 1, sText_DashesNoScore, 176, (y * 8) + 1, 0, NULL); + } + else + { + StringFillWithTerminator(gStringVar1, 8); + StringCopyN(gStringVar1, record->name, 7); + ConvertInternationalString(gStringVar1, language); + + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 8, (y * 8) + 1, 0, NULL); + + ConvertIntToDecimalStringN(gStringVar1, record->wins, STR_CONV_MODE_RIGHT_ALIGN, 4); + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 80, (y * 8) + 1, 0, NULL); + + ConvertIntToDecimalStringN(gStringVar1, record->losses, STR_CONV_MODE_RIGHT_ALIGN, 4); + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 128, (y * 8) + 1, 0, NULL); + + ConvertIntToDecimalStringN(gStringVar1, record->draws, STR_CONV_MODE_RIGHT_ALIGN, 4); + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar1, 176, (y * 8) + 1, 0, NULL); + } +} + +void ShowLinkBattleRecords(void) +{ + s32 i, x; + + gRecordsWindowId = AddWindow(&sLinkBattleRecordsWindow); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, FALSE); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); + StringExpandPlaceholders(gStringVar4, gText_PlayersBattleResults); + + x = GetStringCenterAlignXOffset(1, gStringVar4, 208); + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar4, x, 1, 0, NULL); + PrintLinkBattleWinsLossesDraws(gSaveBlock1Ptr->linkBattleRecords.entries); + + StringExpandPlaceholders(gStringVar4, gText_WinLoseDraw); + PrintTextOnWindow(gRecordsWindowId, 1, gStringVar4, 0, 41, 0, NULL); + + for (i = 0; i < LINK_B_RECORDS_COUNT; i++) + { + PrintLinkBattleRecord(&gSaveBlock1Ptr->linkBattleRecords.entries[i], 7 + (i * 2), gSaveBlock1Ptr->linkBattleRecords.languages[i]); + } + + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); +} + +void RemoveRecordsWindow(void) +{ + sub_819746C(gRecordsWindowId, FALSE); + RemoveWindow(gRecordsWindowId); +} + +static void Task_TrainerHillWaitForPaletteFade(u8 taskId) +{ + if (!gPaletteFade.active) + gTasks[taskId].func = Task_CloseTrainerHillRecordsOnButton; +} + +static void Task_CloseTrainerHillRecordsOnButton(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + task->func = Task_BeginPaletteFade; + } +} + +static void Task_BeginPaletteFade(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + gTasks[taskId].func = Task_ExitTrainerHillRecords; +} + +static void Task_ExitTrainerHillRecords(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); + Free(sTilemapBuffer); + RemoveTrainerHillRecordsWindow(0); + FreeAllWindowBuffers(); + DestroyTask(taskId); + } +} + +static void RemoveTrainerHillRecordsWindow(u8 windowId) +{ + FillWindowPixelBuffer(windowId, 0); + ClearWindowTilemap(windowId); + CopyWindowToVram(windowId, 2); + RemoveWindow(windowId); +} + +static void ClearVramOamPlttRegs(void) +{ + DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000); + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + SetGpuReg(REG_OFFSET_BG3CNT, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); +} + +static void ClearTasksAndGraphicalStructs(void) +{ + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); +} + +static void ResetBgCoordinates(void) +{ + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); +} + +static void SetDispcntReg(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_BG0_ON | DISPCNT_BG3_ON | DISPCNT_OBJ_1D_MAP); +} + +static void LoadTrainerHillRecordsWindowGfx(u8 bgId) +{ + LoadBgTiles(bgId, sTrainerHillWindowTileset, sizeof(sTrainerHillWindowTileset), 0); + CopyToBgTilemapBufferRect(bgId, sTrainerHillWindowTilemap, 0, 0, 0x20, 0x20); + LoadPalette(sTrainerHillWindowPalette, 0, 0x20); +} + +static void VblankCB_TrainerHillRecords(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void MainCB2_TrainerHillRecords(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void ShowTrainerHillRecords(void) +{ + SetVBlankCallback(NULL); + SetMainCallback2(CB2_ShowTrainerHillRecords); +} + +static void CB2_ShowTrainerHillRecords(void) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ClearVramOamPlttRegs(); + gMain.state++; + break; + case 1: + ClearTasksAndGraphicalStructs(); + gMain.state++; + break; + case 2: + sTilemapBuffer = AllocZeroed(0x800); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sTrainerHillRecordsBgTemplates, ARRAY_COUNT(sTrainerHillRecordsBgTemplates)); + SetBgTilemapBuffer(3, sTilemapBuffer); + ResetBgCoordinates(); + gMain.state++; + break; + case 3: + LoadTrainerHillRecordsWindowGfx(3); + LoadPalette(stdpal_get(0), 0xF0, 0x20); + gMain.state++; + break; + case 4: + if (IsDma3ManagerBusyWithBgCopy() != TRUE) + { + ShowBg(0); + ShowBg(3); + CopyBgTilemapBufferToVram(3); + gMain.state++; + } + break; + case 5: + InitWindows(sTrainerHillRecordsWindowTemplates); + DeactivateAllTextPrinters(); + gMain.state++; + break; + case 6: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); + gMain.state++; + break; + case 7: + SetDispcntReg(); + SetVBlankCallback(VblankCB_TrainerHillRecords); + PrintOnTrainerHillRecordsWindow(); + CreateTask(Task_TrainerHillWaitForPaletteFade, 8); + SetMainCallback2(MainCB2_TrainerHillRecords); + gMain.state = 0; + break; + } +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index d1a18e38f..7f5a4fb48 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -19,6 +19,7 @@ #include "constants/songs.h" #include "constants/trainers.h" #include "constants/battle_anim.h" +#include "constants/map_types.h" #include "text.h" #include "sound.h" #include "pokedex.h" @@ -40,6 +41,7 @@ #include "constants/battle_string_ids.h" #include "battle_setup.h" #include "overworld.h" +#include "party_menu.h" extern u16 gBattle_BG1_X; extern u16 gBattle_BG1_Y; @@ -67,7 +69,6 @@ extern bool8 sub_81B1250(void); // ? extern bool8 InBattlePike(void); extern bool8 InBattlePyramid(void); extern u16 GetBattlePyramidPickupItemId(void); -extern u8 Overworld_GetMapTypeOfSaveblockLocation(void); extern u8 sub_813B21C(void); extern u16 get_unknown_box_id(void); @@ -185,10 +186,10 @@ static void atk5B_yesnoboxstoplearningmove(void); static void atk5C_hitanimation(void); static void atk5D_getmoneyreward(void); static void atk5E(void); -static void atk5F(void); +static void atk5F_swapattackerwithtarget(void); static void atk60_incrementgamestat(void); static void atk61_drawpartystatussummary(void); -static void atk62(void); +static void atk62_hidepartystatussummary(void); static void atk63_jumptorandomattack(void); static void atk64_statusanimation(void); static void atk65_status2animation(void); @@ -327,7 +328,7 @@ static void atkE9_setweatherballtype(void); static void atkEA_tryrecycleitem(void); static void atkEB_settypetoterrain(void); static void atkEC_pursuitrelated(void); -static void atkEF_snatchsetbanks(void); +static void atkEF_snatchsetbattlers(void); static void atkEE_removelightscreenreflect(void); static void atkEF_handleballthrow(void); static void atkF0_givecaughtmon(void); @@ -437,10 +438,10 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk5C_hitanimation, atk5D_getmoneyreward, atk5E, - atk5F, + atk5F_swapattackerwithtarget, atk60_incrementgamestat, atk61_drawpartystatussummary, - atk62, + atk62_hidepartystatussummary, atk63_jumptorandomattack, atk64_statusanimation, atk65_status2animation, @@ -579,7 +580,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atkEA_tryrecycleitem, atkEB_settypetoterrain, atkEC_pursuitrelated, - atkEF_snatchsetbanks, + atkEF_snatchsetbattlers, atkEE_removelightscreenreflect, atkEF_handleballthrow, atkF0_givecaughtmon, @@ -989,11 +990,11 @@ static void atk00_attackcanceler(void) for (i = 0; i < gBattlersCount; i++) { - if ((gProtectStructs[gBattleTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) + if ((gProtectStructs[gBattlerByTurnOrder[i]].stealMove) && gBattleMoves[gCurrentMove].flags & FLAG_SNATCH_AFFECTED) { - PressurePPLose(gBattlerAttacker, gBattleTurnOrder[i], MOVE_SNATCH); - gProtectStructs[gBattleTurnOrder[i]].stealMove = 0; - gBattleScripting.battler = gBattleTurnOrder[i]; + PressurePPLose(gBattlerAttacker, gBattlerByTurnOrder[i], MOVE_SNATCH); + gProtectStructs[gBattlerByTurnOrder[i]].stealMove = 0; + gBattleScripting.battler = gBattlerByTurnOrder[i]; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_SnatchedMove; return; @@ -1119,9 +1120,9 @@ static void atk01_accuracycheck(void) { u16 move = T2_READ_16(gBattlescriptCurrInstr + 5); - if (move == 0xFFFE || move == 0xFFFF) + if (move == NO_ACC_CALC || move == NO_ACC_CALC_CHECK_LOCK_ON) { - if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == 0xFFFF && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) + if (gStatuses3[gBattlerTarget] & STATUS3_ALWAYS_HITS && move == NO_ACC_CALC_CHECK_LOCK_ON && gDisableStructs[gBattlerTarget].battlerWithSureHit == gBattlerAttacker) gBattlescriptCurrInstr += 7; else if (gStatuses3[gBattlerTarget] & (STATUS3_ON_AIR | STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); @@ -1172,7 +1173,7 @@ static void atk01_accuracycheck(void) calc = (calc * 130) / 100; // 1.3 compound eyes boost if (WEATHER_HAS_EFFECT && gBattleMons[gBattlerTarget].ability == ABILITY_SAND_VEIL && gBattleWeather & WEATHER_SANDSTORM_ANY) calc = (calc * 80) / 100; // 1.2 sand veil loss - if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && type < 9) + if (gBattleMons[gBattlerAttacker].ability == ABILITY_HUSTLE && IS_TYPE_PHYSICAL(type)) calc = (calc * 80) / 100; // 1.2 hustle loss if (gBattleMons[gBattlerTarget].item == ITEM_ENIGMA_BERRY) @@ -1944,7 +1945,7 @@ static void atk0C_datahpupdate(void) if (!gSpecialStatuses[gActiveBattler].dmg && !(gHitMarker & HITMARKER_x100000)) gSpecialStatuses[gActiveBattler].dmg = gHpDealt; - if (IS_MOVE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) + if (IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000) && gCurrentMove != MOVE_PAIN_SPLIT) { gProtectStructs[gActiveBattler].physicalDmg = gHpDealt; gSpecialStatuses[gActiveBattler].physicalDmg = gHpDealt; @@ -1959,7 +1960,7 @@ static void atk0C_datahpupdate(void) gSpecialStatuses[gActiveBattler].physicalBattlerId = gBattlerTarget; } } - else if (!IS_MOVE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000)) + else if (!IS_TYPE_PHYSICAL(moveType) && !(gHitMarker & HITMARKER_x100000)) { gProtectStructs[gActiveBattler].specialDmg = gHpDealt; gSpecialStatuses[gActiveBattler].specialDmg = gHpDealt; @@ -2216,7 +2217,7 @@ u8 GetBattlerTurnOrderNum(u8 battlerId) s32 i; for (i = 0; i < gBattlersCount; i++) { - if (gBattleTurnOrder[i] == battlerId) + if (gBattlerByTurnOrder[i] == battlerId) break; } return i; @@ -3112,7 +3113,7 @@ static void atk1E_jumpifability(void) if (gBattlescriptCurrInstr[1] == BS_ATTACKER_SIDE) { - battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BANK_SIDE, gBattlerAttacker, ability, 0, 0); + battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0); if (battlerId) { gLastUsedAbility = ability; @@ -3357,7 +3358,7 @@ static void atk23_getexp(void) if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong) { BattleStopLowHpSound(); - PlayBGM(0x161); + PlayBGM(MUS_KACHI2); gBattleStruct->wildVictorySong++; } @@ -3448,7 +3449,7 @@ static void atk23_getexp(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = gBattleStruct->expGetterBattlerId; - if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP) + if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELED_UP) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterMonId) HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler); @@ -3534,7 +3535,7 @@ static void atk24(void) if (gBattleControllerExecFlags) return; - if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == STEVEN_PARTNER_ID) + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { for (i = 0; i < 3; i++) { @@ -3608,7 +3609,7 @@ static void atk24(void) } } #else -ASM_DIRECT +NAKED static void atk24(void) { asm("\n\ @@ -4377,22 +4378,22 @@ static void atk46_playanimation2(void) // animation Id is stored in the first po static void atk47_setgraphicalstatchangevalues(void) { u8 value = 0; - switch (gBattleScripting.statChanger & 0xF0) + switch (GET_STAT_BUFF_VALUE2(gBattleScripting.statChanger)) { - case 0x10: // +1 + case SET_STAT_BUFF_VALUE(1): // +1 value = 0xF; break; - case 0x20: // +2 + case SET_STAT_BUFF_VALUE(2): // +2 value = 0x27; break; - case 0x90: // -1 + case SET_STAT_BUFF_VALUE(1) | STAT_BUFF_NEGATIVE: // -1 value = 0x16; break; - case 0xA0: // -2 + case SET_STAT_BUFF_VALUE(2) | STAT_BUFF_NEGATIVE: // -2 value = 0x2E; break; } - gBattleScripting.animArg1 = (gBattleScripting.statChanger & 0xF) + value - 1; + gBattleScripting.animArg1 = GET_STAT_BUFF_ID(gBattleScripting.statChanger) + value - 1; gBattleScripting.animArg2 = 0; gBattlescriptCurrInstr++; } @@ -4478,16 +4479,16 @@ static void atk48_playstatchangeanimation(void) } } - if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStatsCount < 2) + if (gBattlescriptCurrInstr[3] & ATK48_ONLY_MULTIPLE && changeableStatsCount < 2) { gBattlescriptCurrInstr += 4; } - else if (changeableStatsCount != 0 && gBattleScripting.field_1B == 0) + else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) { BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); - if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStatsCount > 1) - gBattleScripting.field_1B = 1; + if (gBattlescriptCurrInstr[3] & ATK48_ONLY_MULTIPLE && changeableStatsCount > 1) + gBattleScripting.statAnimPlayed = TRUE; gBattlescriptCurrInstr += 4; } else @@ -4648,14 +4649,14 @@ static void atk49_moveend(void) BtlController_EmitSpriteInvisibility(0, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerAttacker] &= ~(STATUS3_SEMI_INVULNERABLE); - gSpecialStatuses[gBattlerAttacker].restoredBankSprite = 1; + gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; gBattleScripting.atk49_state++; return; } gBattleScripting.atk49_state++; break; case 10: // make target sprite visible - if (!gSpecialStatuses[gBattlerTarget].restoredBankSprite && gBattlerTarget < gBattlersCount + if (!gSpecialStatuses[gBattlerTarget].restoredBattlerSprite && gBattlerTarget < gBattlersCount && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) { gActiveBattler = gBattlerTarget; @@ -4676,12 +4677,12 @@ static void atk49_moveend(void) gBattleScripting.atk49_state++; break; case 14: // This case looks interesting, although I am not certain what it does. Probably fine tunes edge cases. - if (gHitMarker & HITMARKER_PURSUIT_TRAP) + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) { gActiveBattler = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = gActiveBattler; - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); + gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); } if (gHitMarker & HITMARKER_ATTACKSTRING_PRINTED) { @@ -5034,7 +5035,7 @@ static void atk4F_jumpifcantswitch(void) party = gPlayerParty; i = 0; - if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) + if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) i = 3; } else @@ -5055,7 +5056,7 @@ static void atk4F_jumpifcantswitch(void) party = gPlayerParty; i = 0; - if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) + if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gActiveBattler)) == TRUE) i = 3; } @@ -5144,7 +5145,7 @@ static void sub_804CF10(u8 arg0) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = 6; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(0, 1, arg0, 0, gBattleStruct->field_60[gActiveBattler]); + BtlController_EmitChoosePokemon(0, PARTY_MUST_CHOOSE_MON, arg0, 0, gBattleStruct->field_60[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } @@ -5167,7 +5168,7 @@ static void atk50_openpartyscreen(void) { if (gHitMarker & HITMARKER_FAINTED(gActiveBattler)) { - if (sub_80423F4(gActiveBattler, 6, 6)) + if (HasNoMonsToSwitch(gActiveBattler, 6, 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5196,7 +5197,7 @@ static void atk50_openpartyscreen(void) if (gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 0; - if (sub_80423F4(0, 6, 6)) + if (HasNoMonsToSwitch(0, 6, 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5218,7 +5219,7 @@ static void atk50_openpartyscreen(void) if (gBitTable[2] & hitmarkerFaintBits && !(gBitTable[0] & hitmarkerFaintBits)) { gActiveBattler = 2; - if (sub_80423F4(2, 6, 6)) + if (HasNoMonsToSwitch(2, 6, 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5239,7 +5240,7 @@ static void atk50_openpartyscreen(void) if (gBitTable[1] & hitmarkerFaintBits) { gActiveBattler = 1; - if (sub_80423F4(1, 6, 6)) + if (HasNoMonsToSwitch(1, 6, 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5261,7 +5262,7 @@ static void atk50_openpartyscreen(void) if (gBitTable[3] & hitmarkerFaintBits && !(gBitTable[1] & hitmarkerFaintBits)) { gActiveBattler = 3; - if (sub_80423F4(3, 6, 6)) + if (HasNoMonsToSwitch(3, 6, 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5324,7 +5325,7 @@ static void atk50_openpartyscreen(void) if (gBitTable[2] & hitmarkerFaintBits && gBitTable[0] & hitmarkerFaintBits) { gActiveBattler = 2; - if (sub_80423F4(2, gBattleBufferB[0][1], 6)) + if (HasNoMonsToSwitch(2, gBattleBufferB[0][1], 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5340,7 +5341,7 @@ static void atk50_openpartyscreen(void) if (gBitTable[3] & hitmarkerFaintBits && hitmarkerFaintBits & gBitTable[1]) { gActiveBattler = 3; - if (sub_80423F4(3, gBattleBufferB[1][1], 6)) + if (HasNoMonsToSwitch(3, gBattleBufferB[1][1], 6)) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBattler)); @@ -5383,16 +5384,16 @@ static void atk50_openpartyscreen(void) else { if (gBattlescriptCurrInstr[1] & 0x80) - hitmarkerFaintBits = 0; // used here as the caseId for the EmitChoose function + hitmarkerFaintBits = PARTY_CHOOSE_MON; // Used here as the caseId for the EmitChoose function. else - hitmarkerFaintBits = 1; + hitmarkerFaintBits = PARTY_MUST_CHOOSE_MON; battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(0x80)); if (gSpecialStatuses[battlerId].flag40) { gBattlescriptCurrInstr += 6; } - else if (sub_80423F4(battlerId, 6, 6)) + else if (HasNoMonsToSwitch(battlerId, 6, 6)) { gActiveBattler = battlerId; gAbsentBattlerFlags |= gBitTable[gActiveBattler]; @@ -5556,7 +5557,7 @@ static void atk52_switchineffects(void) for (i = 0; i < gBattlersCount; i++) { - if (gBattleTurnOrder[i] == gActiveBattler) + if (gBattlerByTurnOrder[i] == gActiveBattler) gActionsByTurnOrder[i] = B_ACTION_CANCEL_PARTNER; } @@ -5687,7 +5688,7 @@ static void atk5A_yesnoboxlearnmove(void) { case 0: HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); gBattleScripting.learnMoveState++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(0); @@ -5713,7 +5714,7 @@ static void atk5A_yesnoboxlearnmove(void) if (gBattleCommunication[1] == 0) { HandleBattleWindow(0x18, 0x8, 0x1D, 0xD, WINDOW_CLEAR); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gBattleScripting.learnMoveState++; } else @@ -5804,7 +5805,7 @@ static void atk5B_yesnoboxstoplearningmove(void) { case 0: HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); gBattleScripting.learnMoveState++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(0); @@ -5871,7 +5872,7 @@ static u32 GetTrainerMoneyToGive(u16 trainerId) u32 lastMonLevel = 0; u32 moneyReward = 0; - if (trainerId == SECRET_BASE_OPPONENT) + if (trainerId == TRAINER_SECRET_BASE) { moneyReward = 20 * gBattleResources->secretBase->party.levels[0] * gBattleStruct->moneyMultiplier; } @@ -5950,7 +5951,7 @@ static void atk5E(void) if (gBattleControllerExecFlags == 0) { s32 i; - struct BattlePokemon* bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; + struct BattlePokemon *bufferPoke = (struct BattlePokemon*) &gBattleBufferB[gActiveBattler][4]; for (i = 0; i < 4; i++) { gBattleMons[gActiveBattler].moves[i] = bufferPoke->moves[i]; @@ -5962,16 +5963,16 @@ static void atk5E(void) } } -static void atk5F(void) +static void atk5F_swapattackerwithtarget(void) { gActiveBattler = gBattlerAttacker; gBattlerAttacker = gBattlerTarget; gBattlerTarget = gActiveBattler; - if (gHitMarker & HITMARKER_PURSUIT_TRAP) - gHitMarker &= ~(HITMARKER_PURSUIT_TRAP); + if (gHitMarker & HITMARKER_SWAP_ATTACKER_TARGET) + gHitMarker &= ~(HITMARKER_SWAP_ATTACKER_TARGET); else - gHitMarker |= HITMARKER_PURSUIT_TRAP; + gHitMarker |= HITMARKER_SWAP_ATTACKER_TARGET; gBattlescriptCurrInstr++; } @@ -5987,8 +5988,8 @@ static void atk60_incrementgamestat(void) static void atk61_drawpartystatussummary(void) { s32 i; - struct Pokemon* party; - struct HpAndStatus hpStatuses[6]; + struct Pokemon *party; + struct HpAndStatus hpStatuses[PARTY_SIZE]; if (gBattleControllerExecFlags) return; @@ -6000,7 +6001,7 @@ static void atk61_drawpartystatussummary(void) else party = gEnemyParty; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE || GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG) @@ -6021,10 +6022,10 @@ static void atk61_drawpartystatussummary(void) gBattlescriptCurrInstr += 2; } -static void atk62(void) +static void atk62_hidepartystatussummary(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitCmd49(0); + BtlController_EmitHidePartyStatusSummary(0); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6100,7 +6101,7 @@ static void atk67_yesnobox(void) { case 0: HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); gBattleCommunication[0]++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(0); @@ -6631,7 +6632,7 @@ static void atk76_various(void) gBattleCommunication[0] = 0; break; case VARIOUS_RESET_INTIMIDATE_TRACE_BITS: - gSpecialStatuses[gActiveBattler].intimidatedPoke = 0; + gSpecialStatuses[gActiveBattler].intimidatedMon = 0; gSpecialStatuses[gActiveBattler].traced = 0; break; case VARIOUS_UPDATE_CHOICE_MOVE_ON_LVL_UP: @@ -6720,7 +6721,7 @@ static void atk76_various(void) break; case 16: BattleStringExpandPlaceholdersToDisplayedString(gRefereeStringsTable[gBattlescriptCurrInstr[1]]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0x16); + BattlePutTextOnWindow(gDisplayedStringBattle, 0x16); break; case 17: if (IsTextPrinterActive(0x16)) @@ -7229,7 +7230,7 @@ static u8 ChangeStatBuffs(s8 statValue, u8 statId, u8 flags, const u8 *BS_ptr) PREPARE_STAT_BUFFER(gBattleTextBuff1, statId) - if ((statValue << 0x18) < 0) // stat decrease + if (statValue <= -1) // Stat decrease. { if (gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer && !certain && gCurrentMove != MOVE_CURSE) @@ -7507,7 +7508,7 @@ static void atk8F_forcerandomswitch(void) else if ((gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) || (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_x2000000)) { - if (sub_806D82C(GetBattlerMultiplayerId(gBattlerTarget)) == 1) + if (GetLinkTrainerFlankId(GetBattlerMultiplayerId(gBattlerTarget)) == 1) { firstMonId = 3; lastMonId = 6; @@ -8125,7 +8126,7 @@ static void atk9E_metronome(void) s32 i; gCurrentMove = (Random() & 0x1FF) + 1; - if (gCurrentMove > LAST_MOVE_INDEX) + if (gCurrentMove >= MOVES_COUNT) continue; for (i = 0; i < 4; i++); // ? @@ -8595,7 +8596,7 @@ static void atkAE_healpartystatus(void) if (gCurrentMove == MOVE_HEAL_BELL) { - struct Pokemon* party; + struct Pokemon *party; s32 i; gBattleCommunication[MULTISTRING_CHOOSER] = 0; @@ -8633,7 +8634,7 @@ static void atkAE_healpartystatus(void) } } - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { u16 species = GetMonData(&party[i], MON_DATA_SPECIES2); u8 abilityBit = GetMonData(&party[i], MON_DATA_ALT_ABILITY); @@ -8957,7 +8958,7 @@ static void atkBA_jumpifnopursuitswitchdmg(void) for (i = 0; i < gBattlersCount; i++) { - if (gBattleTurnOrder[i] == gBattlerTarget) + if (gBattlerByTurnOrder[i] == gBattlerTarget) gActionsByTurnOrder[i] = 11; } @@ -9045,7 +9046,7 @@ static void atkBE_rapidspinfree(void) else if (gStatuses3[gBattlerAttacker] & STATUS3_LEECHSEED) { gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED); - gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED_BANK); + gStatuses3[gBattlerAttacker] &= ~(STATUS3_LEECHSEED_BATTLER); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_LeechSeedFree; } @@ -9761,7 +9762,7 @@ static void atkE1_trygetintimidatetarget(void) { u8 side; - gBattleScripting.battler = gBattleStruct->intimidateBank; + gBattleScripting.battler = gBattleStruct->intimidateBattler; side = GetBattlerSide(gBattleScripting.battler); PREPARE_ABILITY_BUFFER(gBattleTextBuff1, gBattleMons[gBattleScripting.battler].ability) @@ -10053,7 +10054,7 @@ static void atkEC_pursuitrelated(void) } } -static void atkEF_snatchsetbanks(void) +static void atkEF_snatchsetbattlers(void) { gEffectBattler = gBattlerAttacker; @@ -10116,7 +10117,7 @@ static void atkEF_handleballthrow(void) u8 catchRate; if (gLastUsedItem == ITEM_SAFARI_BALL) - catchRate = gBattleStruct->field_7C * 1275 / 100; + catchRate = gBattleStruct->safariCatchFactor * 1275 / 100; else catchRate = gBaseStats[gBattleMons[gBattlerTarget].species].catchRate; @@ -10131,7 +10132,7 @@ static void atkEF_handleballthrow(void) ballMultiplier = 10; break; case ITEM_DIVE_BALL: - if (Overworld_GetMapTypeOfSaveblockLocation() == 5) + if (Overworld_GetMapTypeOfSaveblockLocation() == MAP_TYPE_UNDERWATER) ballMultiplier = 35; else ballMultiplier = 10; @@ -10288,7 +10289,7 @@ static void atkF2_displaydexinfo(void) switch (gBattleCommunication[0]) { case 0: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gBattleCommunication[0]++; break; case 1: @@ -10406,7 +10407,7 @@ static void atkF3_trygivecaughtmonnick(void) { case 0: HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); gBattleCommunication[MULTIUSE_STATE]++; gBattleCommunication[CURSOR_POSITION] = 0; BattleCreateYesNoCursorAt(0); diff --git a/src/battle_setup.c b/src/battle_setup.c index 97e8f7041..2955a33fc 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -21,7 +21,7 @@ #include "constants/items.h" #include "palette.h" #include "window.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "event_scripts.h" #include "trainer_see.h" #include "field_message_box.h" @@ -32,7 +32,7 @@ #include "overworld.h" #include "field_weather.h" #include "gym_leader_rematch.h" -#include "field_map_obj_helpers.h" +#include "constants/map_types.h" enum { @@ -51,8 +51,6 @@ struct TrainerBattleParameter u8 ptrType; }; -extern void (*gFieldCallback)(void); - extern bool8 InBattlePyramid(void); extern bool8 InBattlePike(void); extern bool32 InTrainerHill(void); @@ -65,8 +63,8 @@ extern void sub_80EECC8(void); extern void sub_80AF6F0(void); extern u16 sub_81A9AA8(u8 localId); extern u16 sub_81D6180(u8 localId); -extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjId); -extern bool8 GetTrainerHillTrainerFlag(u8 mapObjId); +extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjId); +extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId); extern bool8 sub_81D5C18(void); extern void sub_816306C(u8 a0); extern void sub_8163048(u8 a0); @@ -104,7 +102,7 @@ EWRAM_DATA static u16 sTrainerBattleMode = 0; EWRAM_DATA u16 gTrainerBattleOpponent_A = 0; EWRAM_DATA u16 gTrainerBattleOpponent_B = 0; EWRAM_DATA u16 gPartnerTrainerId = 0; -EWRAM_DATA static u16 sTrainerMapObjectLocalId = 0; +EWRAM_DATA static u16 sTrainerEventObjectLocalId = 0; EWRAM_DATA static u8 *sTrainerAIntroSpeech = NULL; EWRAM_DATA static u8 *sTrainerBIntroSpeech = NULL; EWRAM_DATA static u8 *sTrainerADefeatSpeech = NULL; @@ -158,7 +156,7 @@ static const struct TrainerBattleParameter sOrdinaryBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -171,7 +169,7 @@ static const struct TrainerBattleParameter sContinueScriptBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -184,7 +182,7 @@ static const struct TrainerBattleParameter sDoubleBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -197,7 +195,7 @@ static const struct TrainerBattleParameter sOrdinaryNoIntroBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -210,7 +208,7 @@ static const struct TrainerBattleParameter sContinueScriptDoubleBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_A, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerAIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerADefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -223,7 +221,7 @@ static const struct TrainerBattleParameter sTrainerBOrdinaryBattleParams[] = { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -236,7 +234,7 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] { {&sTrainerBattleMode, TRAINER_PARAM_LOAD_VAL_8BIT}, {&gTrainerBattleOpponent_B, TRAINER_PARAM_LOAD_VAL_16BIT}, - {&sTrainerMapObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, + {&sTrainerEventObjectLocalId, TRAINER_PARAM_LOAD_VAL_16BIT}, {&sTrainerBIntroSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerBDefeatSpeech, TRAINER_PARAM_LOAD_VAL_32BIT}, {&sTrainerVictorySpeech, TRAINER_PARAM_CLEAR_VAL_32BIT}, @@ -390,13 +388,13 @@ void BattleSetup_StartBattlePikeWildBattle(void) static void DoStandardWildBattle(void) { ScriptContext2_Enable(); - FreezeMapObjects(); + FreezeEventObjects(); sub_808BCF4(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = 0; if (InBattlePyramid()) { - VarSet(VAR_0x400E, 0); + VarSet(VAR_TEMP_E, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; } CreateBattleStartTask(GetWildBattleTransition(), 0); @@ -409,7 +407,7 @@ static void DoStandardWildBattle(void) void BattleSetup_StartRoamerBattle(void) { ScriptContext2_Enable(); - FreezeMapObjects(); + FreezeEventObjects(); sub_808BCF4(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = BATTLE_TYPE_ROAMER; @@ -423,7 +421,7 @@ void BattleSetup_StartRoamerBattle(void) static void DoSafariBattle(void) { ScriptContext2_Enable(); - FreezeMapObjects(); + FreezeEventObjects(); sub_808BCF4(); gMain.savedCallback = CB2_EndSafariBattle; gBattleTypeFlags = BATTLE_TYPE_SAFARI; @@ -433,7 +431,7 @@ static void DoSafariBattle(void) static void DoBattlePikeWildBattle(void) { ScriptContext2_Enable(); - FreezeMapObjects(); + FreezeEventObjects(); sub_808BCF4(); gMain.savedCallback = CB2_EndWildBattle; gBattleTypeFlags = BATTLE_TYPE_PIKE; @@ -469,7 +467,7 @@ void StartWallyTutorialBattle(void) { CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5); ScriptContext2_Enable(); - gMain.savedCallback = CB2_ReturnToFieldContinueScript; + gMain.savedCallback = CB2_ReturnToFieldContinueScriptPlayMapMusic; gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL; CreateBattleStartTask(B_TRANSITION_SLICE, 0); } @@ -611,13 +609,13 @@ static void CB2_EndScriptedWildBattle(void) if (IsPlayerDefeated(gBattleOutcome) == TRUE) { if (InBattlePyramid()) - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else SetMainCallback2(CB2_WhiteOut); } else { - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } } @@ -801,7 +799,7 @@ static u8 GetTrainerBattleTransition(void) u8 enemyLevel; u8 playerLevel; - if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) return B_TRANSITION_CHAMPION; if (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR) @@ -886,8 +884,8 @@ u8 sub_80B100C(s32 arg0) return sUnknown_0854FE98[Random() % ARRAY_COUNT(sUnknown_0854FE98)]; } - var = gSaveBlock2Ptr->field_CB4[gSaveBlock2Ptr->battlePyramidWildHeaderId * 2 + 0] - + gSaveBlock2Ptr->field_CB4[gSaveBlock2Ptr->battlePyramidWildHeaderId * 2 + 1]; + var = gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2 * 2 + 0] + + gSaveBlock2Ptr->frontier.field_CB4[gSaveBlock2Ptr->frontier.field_CB2 * 2 + 1]; return sUnknown_0854FE98[var % ARRAY_COUNT(sUnknown_0854FE98)]; } @@ -902,7 +900,7 @@ static void CB2_GiveStarter(void) { u16 starterMon; - *GetVarPointer(VAR_FIRST_POKE) = gSpecialVar_Result; + *GetVarPointer(VAR_STARTER_MON) = gSpecialVar_Result; starterMon = GetStarterPokemon(gSpecialVar_Result); ScriptGiveMon(starterMon, 5, 0, 0, 0, 0); ResetTasks(); @@ -934,7 +932,7 @@ static void CB2_StartFirstBattle(void) static void CB2_EndFirstBattle(void) { Overworld_ClearSavedMusic(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } static void sub_80B1218(void) @@ -1014,7 +1012,7 @@ static void InitTrainerBattleVariables(void) sTrainerBDefeatSpeech = NULL; sTrainerBBattleScriptRetAddr = NULL; } - sTrainerMapObjectLocalId = 0; + sTrainerEventObjectLocalId = 0; sTrainerVictorySpeech = NULL; sTrainerCannotBattleSpeech = NULL; sTrainerBattleEndScript = NULL; @@ -1077,10 +1075,10 @@ static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, co void SetMapVarsToTrainer(void) { - if (sTrainerMapObjectLocalId != 0) + if (sTrainerEventObjectLocalId != 0) { - gSpecialVar_LastTalked = sTrainerMapObjectLocalId; - gSelectedMapObject = GetFieldObjectIdByLocalIdAndMap(sTrainerMapObjectLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + gSpecialVar_LastTalked = sTrainerEventObjectLocalId; + gSelectedEventObject = GetEventObjectIdByLocalIdAndMap(sTrainerEventObjectLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } } @@ -1091,14 +1089,14 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) switch (sTrainerBattleMode) { - case 3: + case TRAINER_BATTLE_NORMAL_NO_INTRO_TEXT: TrainerBattleLoadArgs(sOrdinaryNoIntroBattleParams, data); return EventScript_2713C2; - case 4: + case TRAINER_BATTLE_DOUBLE: TrainerBattleLoadArgs(sDoubleBattleParams, data); SetMapVarsToTrainer(); return EventScript_TryDoDoubleTrainerBattle; - case 2: + case TRAINER_BATTLE_CONTINUE_SCRIPT: if (gApproachingTrainerId == 0) { TrainerBattleLoadArgs(sContinueScriptBattleParams, data); @@ -1109,26 +1107,26 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) TrainerBattleLoadArgs(sTrainerBContinueScriptBattleParams, data); } return EventScript_271362; - case 1: + case TRAINER_BATTLE_CONTINUE_SCRIPT_NO_MUSIC: TrainerBattleLoadArgs(sContinueScriptBattleParams, data); SetMapVarsToTrainer(); return EventScript_271362; - case 6: - case 8: + case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE: + case TRAINER_BATTLE_CONTINUE_SCRIPT_DOUBLE_NO_MUSIC: TrainerBattleLoadArgs(sContinueScriptDoubleBattleParams, data); SetMapVarsToTrainer(); return EventScript_TryDoDoubleTrainerBattle; - case 7: + case TRAINER_BATTLE_REMATCH_DOUBLE: TrainerBattleLoadArgs(sDoubleBattleParams, data); SetMapVarsToTrainer(); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); return EventScript_TryDoDoubleRematchBattle; - case 5: + case TRAINER_BATTLE_REMATCH: TrainerBattleLoadArgs(sOrdinaryBattleParams, data); SetMapVarsToTrainer(); gTrainerBattleOpponent_A = GetRematchTrainerId(gTrainerBattleOpponent_A); return EventScript_2713D1; - case 9: + case TRAINER_BATTLE_9: if (gApproachingTrainerId == 0) { TrainerBattleLoadArgs(sOrdinaryBattleParams, data); @@ -1141,13 +1139,13 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) gTrainerBattleOpponent_B = sub_81A9AA8(gSpecialVar_LastTalked); } return EventScript_271362; - case 10: + case TRAINER_BATTLE_SET_TRAINER_A: TrainerBattleLoadArgs(sOrdinaryBattleParams, data); return NULL; - case 11: + case TRAINER_BATTLE_SET_TRAINER_B: TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); return NULL; - case 12: + case TRAINER_BATTLE_12: if (gApproachingTrainerId == 0) { TrainerBattleLoadArgs(sOrdinaryBattleParams, data); @@ -1174,19 +1172,19 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) } } -void ConfigureAndSetUpOneTrainerBattle(u8 trainerMapObjId, const u8 *trainerScript) +void ConfigureAndSetUpOneTrainerBattle(u8 trainerEventObjId, const u8 *trainerScript) { - gSelectedMapObject = trainerMapObjId; - gSpecialVar_LastTalked = gMapObjects[trainerMapObjId].localId; + gSelectedEventObject = trainerEventObjId; + gSpecialVar_LastTalked = gEventObjects[trainerEventObjId].localId; BattleSetup_ConfigureTrainerBattle(trainerScript + 1); ScriptContext1_SetupScript(EventScript_271354); ScriptContext2_Enable(); } -void ConfigureTwoTrainersBattle(u8 trainerMapObjId, const u8 *trainerScript) +void ConfigureTwoTrainersBattle(u8 trainerEventObjId, const u8 *trainerScript) { - gSelectedMapObject = trainerMapObjId; - gSpecialVar_LastTalked = gMapObjects[trainerMapObjId].localId; + gSelectedEventObject = trainerEventObjId; + gSpecialVar_LastTalked = gEventObjects[trainerEventObjId].localId; BattleSetup_ConfigureTrainerBattle(trainerScript + 1); } @@ -1204,9 +1202,9 @@ bool32 GetTrainerFlagFromScriptPointer(const u8 *data) void sub_80B16D8(void) { - struct MapObject *mapObject = &gMapObjects[gSelectedMapObject]; + struct EventObject *eventObject = &gEventObjects[gSelectedEventObject]; - npc_set_running_behaviour_etc(mapObject, npc_running_behaviour_by_direction(mapObject->mapobj_unk_18)); + SetTrainerMovementType(eventObject, GetTrainerFacingDirectionMovementType(eventObject->facingDirection)); } u8 GetTrainerBattleMode(void) @@ -1217,9 +1215,9 @@ u8 GetTrainerBattleMode(void) bool8 GetTrainerFlag(void) { if (InBattlePyramid()) - return GetBattlePyramidTrainerFlag(gSelectedMapObject); + return GetBattlePyramidTrainerFlag(gSelectedEventObject); else if (InTrainerHill()) - return GetTrainerHillTrainerFlag(gSelectedMapObject); + return GetTrainerHillTrainerFlag(gSelectedEventObject); else return FlagGet(GetTrainerAFlag()); } @@ -1260,7 +1258,7 @@ void BattleSetup_StartTrainerBattle(void) if (InBattlePyramid()) { - VarSet(VAR_0x400E, 0); + VarSet(VAR_TEMP_E, 0); gBattleTypeFlags |= BATTLE_TYPE_PYRAMID; if (gNoOfApproachingTrainers == 2) @@ -1308,20 +1306,20 @@ void BattleSetup_StartTrainerBattle(void) static void CB2_EndTrainerBattle(void) { - if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { if (InBattlePyramid() || sub_81D5C18()) - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else SetMainCallback2(CB2_WhiteOut); } else { - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); if (!InBattlePyramid() && !sub_81D5C18()) { RegisterTrainerInMatchCall(); @@ -1332,9 +1330,9 @@ static void CB2_EndTrainerBattle(void) static void CB2_EndRematchBattle(void) { - if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) { - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { @@ -1342,7 +1340,7 @@ static void CB2_EndRematchBattle(void) } else { - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); RegisterTrainerInMatchCall(); SetBattledTrainersFlags(); HandleRematchVarsOnBattleEnd(); @@ -1364,7 +1362,7 @@ void ShowTrainerIntroSpeech(void) if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1) sub_81A9EDC(sub_81A9AA8(gSpecialVar_LastTalked)); else - sub_81A9EDC(sub_81A9AA8(gMapObjects[gApproachingTrainers[gApproachingTrainerId].mapObjectId].localId)); + sub_81A9EDC(sub_81A9AA8(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId)); sub_80982B8(); } @@ -1373,7 +1371,7 @@ void ShowTrainerIntroSpeech(void) if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1) sub_81D572C(2, sub_81D6180(gSpecialVar_LastTalked)); else - sub_81D572C(2, sub_81D6180(gMapObjects[gApproachingTrainers[gApproachingTrainerId].mapObjectId].localId)); + sub_81D572C(2, sub_81D6180(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId)); sub_80982B8(); } @@ -1500,7 +1498,7 @@ const u8 *GetTrainerALoseText(void) { const u8 *string; - if (gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + if (gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) string = GetSecretBaseTrainerLoseText(); else string = sTrainerADefeatSpeech; @@ -1594,11 +1592,11 @@ static bool32 UpdateRandomTrainerRematches(const struct RematchTrainer *table, u { if (gSaveBlock1Ptr->trainerRematches[i] != 0) { - // Trainer already wants a rematch. Don't bother updating it + // Trainer already wants a rematch. Don't bother updating it. ret = TRUE; } else if (FlagGet(FLAG_MATCH_CALL_REGISTERED + i) - && (Random() % 100) <= 30) // 31% chance of getting a rematch + && (Random() % 100) <= 30) // 31% chance of getting a rematch. { SetRematchIdForTrainer(table, i); ret = TRUE; diff --git a/src/battle_tent.c b/src/battle_tent.c new file mode 100644 index 000000000..68d7c5e83 --- /dev/null +++ b/src/battle_tent.c @@ -0,0 +1,268 @@ +#include "global.h" +#include "overworld.h" +#include "event_data.h" +#include "region_map.h" +#include "battle.h" +#include "battle_setup.h" +#include "battle_tower.h" +#include "battle_frontier_2.h" +#include "random.h" +#include "item.h" +#include "constants/items.h" +#include "constants/region_map_sections.h" + +// this file's functions +void sub_81B99D4(void); +void sub_81B9A28(void); +void sub_81B9A44(void); +void sub_81B9A60(void); +void sub_81B9A90(void); +void sub_81B9ABC(void); +void sub_81B9B00(void); +void sub_81B9B28(void); +void sub_81B9BA0(void); +void sub_81B9BF4(void); +void sub_81B9C10(void); +void sub_81B9C2C(void); +void sub_81B9C70(void); +void sub_81B9C98(void); +void sub_81B9CF0(void); +void sub_81B9D28(void); +void sub_81B9D7C(void); +void sub_81B9D98(void); +void sub_81B9DB4(void); +void sub_81B9DF8(void); +void sub_81B9E20(void); +void sub_81B9E78(void); +void sub_81B9E88(void); +void sub_81BA040(void); +void sub_81B9EC0(void); + +// const rom data +void (*const gUnknown_086160B4[])(void) = +{ + sub_81B99D4, + sub_81B9A28, + sub_81B9A44, + sub_81B9A60, + sub_81B9A90, + sub_81B9ABC, + sub_81B9B00, + sub_81B9B28 +}; + +const u16 gUnknown_086160D4[] = {ITEM_NEST_BALL, ITEM_NONE}; + +void (*const gUnknown_086160D8[])(void) = +{ + sub_81B9BA0, + sub_81B9BF4, + sub_81B9C10, + sub_81B9C2C, + sub_81B9C70, + sub_81B9C98, + sub_81B9CF0 +}; + +const u16 gUnknown_086160F4[] = {ITEM_HYPER_POTION, ITEM_NONE}; + +void (*const gUnknown_086160F8[])(void) = +{ + sub_81B9D28, + sub_81B9D7C, + sub_81B9D98, + sub_81B9DB4, + sub_81B9DF8, + sub_81B9E20, + sub_81B9E78, + sub_81B9E88, + sub_81BA040, + sub_81B9EC0 +}; + +const u16 gUnknown_08616120[] = {ITEM_FULL_HEAL, ITEM_NONE}; + +// code +void sub_81B99B4(void) +{ + gUnknown_086160B4[gSpecialVar_0x8004](); +} + +void sub_81B99D4(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.field_CB2 = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = FALSE; + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); +} + +void sub_81B9A28(void) +{ + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E6A; +} + +void sub_81B9A44(void) +{ + gSaveBlock2Ptr->frontier.field_E6A = gSpecialVar_0x8006; +} + +void sub_81B9A60(void) +{ + gTrainerBattleOpponent_A = (u32)((Random() % 255) * 5) / 64; + sub_8162614(gTrainerBattleOpponent_A, 0); +} + +void sub_81B9A90(void) +{ + if (gTrainerBattleOpponent_A < 300) + ConvertBattleFrontierTrainerSpeechToString(gUnknown_0203BC88[gTrainerBattleOpponent_A].speechBefore); +} + +void sub_81B9ABC(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = TRUE; + sub_81A4C30(); +} + +void sub_81B9B00(void) +{ + gSaveBlock2Ptr->frontier.field_E6A = gUnknown_086160D4[Random() % 1]; +} + +void sub_81B9B28(void) +{ + if (AddBagItem(gSaveBlock2Ptr->frontier.field_E6A, 1) == TRUE) + { + CopyItemName(gSaveBlock2Ptr->frontier.field_E6A, gStringVar1); + gSaveBlock2Ptr->frontier.field_E6A = ITEM_NONE; + gSpecialVar_Result = TRUE; + } + else + { + gSpecialVar_Result = FALSE; + } +} + +void sub_81B9B80(void) +{ + gUnknown_086160D8[gSpecialVar_0x8004](); +} + +void sub_81B9BA0(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.field_CB2 = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = FALSE; + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); +} + +void sub_81B9BF4(void) +{ + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E6C; +} + +void sub_81B9C10(void) +{ + gSaveBlock2Ptr->frontier.field_E6C = gSpecialVar_0x8006; +} + +void sub_81B9C2C(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = TRUE; + sub_81A4C30(); +} + +void sub_81B9C70(void) +{ + gSaveBlock2Ptr->frontier.field_E6C = gUnknown_086160F4[Random() % 1]; +} + +void sub_81B9C98(void) +{ + if (AddBagItem(gSaveBlock2Ptr->frontier.field_E6C, 1) == TRUE) + { + CopyItemName(gSaveBlock2Ptr->frontier.field_E6C, gStringVar1); + gSaveBlock2Ptr->frontier.field_E6C = ITEM_NONE; + gSpecialVar_Result = TRUE; + } + else + { + gSpecialVar_Result = FALSE; + } +} + +void sub_81B9CF0(void) +{ + GetFrontierTrainerName(gStringVar1, gTrainerBattleOpponent_A); +} + +void sub_81B9D08(void) +{ + gUnknown_086160F8[gSpecialVar_0x8004](); +} + +void sub_81B9D28(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = 0; + gSaveBlock2Ptr->frontier.field_CB2 = 0; + gSaveBlock2Ptr->frontier.field_CA9_a = FALSE; + saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); +} + +void sub_81B9D7C(void) +{ + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_E6E; +} + +void sub_81B9D98(void) +{ + gSaveBlock2Ptr->frontier.field_E6E = gSpecialVar_0x8006; +} + +void sub_81B9DB4(void) +{ + gSaveBlock2Ptr->frontier.field_CA8 = gSpecialVar_0x8005; + VarSet(VAR_TEMP_0, 0); + gSaveBlock2Ptr->frontier.field_CA9_a = TRUE; + sub_81A4C30(); +} + +void sub_81B9DF8(void) +{ + gSaveBlock2Ptr->frontier.field_E6E = gUnknown_08616120[Random() % 1]; +} + +void sub_81B9E20(void) +{ + if (AddBagItem(gSaveBlock2Ptr->frontier.field_E6E, 1) == TRUE) + { + CopyItemName(gSaveBlock2Ptr->frontier.field_E6E, gStringVar1); + gSaveBlock2Ptr->frontier.field_E6E = ITEM_NONE; + gSpecialVar_Result = TRUE; + } + else + { + gSpecialVar_Result = FALSE; + } +} + +void sub_81B9E78(void) +{ + ZeroPlayerPartyMons(); + sub_819A4F8(); +} + +void sub_81B9E88(void) +{ + sub_819DC00(); +} + +bool8 sub_81B9E94(void) +{ + return (gMapHeader.regionMapSectionId == MAPSEC_SLATEPORT_CITY + && ((gMapHeader.mapLayoutId == 385) | (gMapHeader.mapLayoutId == 386))); +} diff --git a/src/battle_transition.c b/src/battle_transition.c index 8b9b50140..d1d92cb50 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -59,7 +59,7 @@ typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite); extern u16 gBattle_BG0_X; extern u16 gBattle_BG0_Y; -extern const struct OamData gFieldObjectBaseOam_32x32; +extern const struct OamData gEventObjectBaseOam_32x32; extern void sub_80AC3D0(void); @@ -753,7 +753,7 @@ static const struct SpriteTemplate gUnknown_085C8E68 = { .tileTag = 0xFFFF, .paletteTag = 4105, - .oam = &gFieldObjectBaseOam_32x32, + .oam = &gEventObjectBaseOam_32x32, .anims = sSpriteAnimTable_85C8E3C, .images = sSpriteImageTable_85C8E2C, .affineAnims = sSpriteAffineAnimTable_85C8E60, @@ -820,7 +820,7 @@ static const struct SpriteTemplate sSpriteTemplate_85C8EBC = .callback = sub_8148380 }; -static const u16 gFieldEffectObjectPalette10[] = INCBIN_U16("graphics/map_objects/palettes/field_effect_object_palette_10.gbapal"); +static const u16 gFieldEffectObjectPalette10[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_10.gbapal"); const struct SpritePalette gFieldEffectObjectPaletteInfo10 = { @@ -1080,7 +1080,7 @@ static bool8 Phase2_Blur_Func2(struct Task *task) { task->tData1 = 4; if (++task->tData2 == 10) - BeginNormalPaletteFade(-1, -1, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0); SetGpuReg(REG_OFFSET_MOSAIC, (task->tData2 & 15) * 17); if (task->tData2 > 14) task->tState++; @@ -1107,7 +1107,7 @@ static bool8 Phase2_Swirl_Func1(struct Task *task) { sub_8149F08(); ScanlineEffect_Clear(); - BeginNormalPaletteFade(-1, 4, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0); sub_8149F98(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_14, 0, 2, 0, 160); SetVBlankCallback(VBlankCB_Phase2_Swirl); @@ -1162,7 +1162,7 @@ static bool8 Phase2_Shuffle_Func1(struct Task *task) sub_8149F08(); ScanlineEffect_Clear(); - BeginNormalPaletteFade(-1, 4, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0); memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_16, 0x140); SetVBlankCallback(VBlankCB_Phase2_Shuffle); @@ -1973,7 +1973,7 @@ static bool8 Phase2_Ripple_Func2(struct Task *task) if (++task->tData3 == 81) { task->tData4++; - BeginNormalPaletteFade(-1, -2, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 0x10, 0); } if (task->tData4 != 0 && !gPaletteFade.active) @@ -3982,7 +3982,7 @@ static bool8 Phase2_30_Func4(struct Task *task) if (++task->tData3 == 101) { task->tData4++; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); } if (task->tData4 != 0 && !gPaletteFade.active) diff --git a/src/battle_tv.c b/src/battle_tv.c index 777b4846f..6f9ee414e 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -9,8 +9,6 @@ #include "battle_message.h" #include "tv.h" -extern struct StringInfoBattle *gStringInfo; - // this file's functions static bool8 sub_817E0B8(u16 stringId); static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3); @@ -223,7 +221,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) atkSide = GetBattlerSide(gBattlerAttacker); defSide = GetBattlerSide(gBattlerTarget); effSide = GetBattlerSide(gEffectBattler); - scriptingSide = GetBattlerSide(gStringInfo->scrActive); + scriptingSide = GetBattlerSide(gBattleMsgDataPtr->scrActive); if (atkSide == B_SIDE_PLAYER) atkMon = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]; @@ -235,7 +233,7 @@ void BattleTv_SetDataBasedOnString(u16 stringId) else defMon = &gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]]; - moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, gStringInfo->currentMove); + moveSlot = GetBattlerMoveSlotId(gBattlerAttacker, gBattleMsgDataPtr->currentMove); if (moveSlot >= 4 && sub_817E0B8(stringId) && stringId > BATTLESTRINGS_ID_ADDER) { @@ -480,8 +478,8 @@ void BattleTv_SetDataBasedOnString(u16 stringId) break; case STRINGID_PKMNFASTASLEEP: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId != 0 - && gStringInfo->currentMove != MOVE_SNORE - && gStringInfo->currentMove != MOVE_SLEEP_TALK) + && 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); break; case STRINGID_PKMNWASFROZEN: @@ -798,8 +796,8 @@ void TryPutLinkBattleTvShowOnAir(void) if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if ((playerBestMonId < 3 && !sub_806D82C(gBattleScripting.multiplayerId)) - || (playerBestMonId >= 3 && sub_806D82C(gBattleScripting.multiplayerId))) + if ((playerBestMonId < 3 && !GetLinkTrainerFlankId(gBattleScripting.multiplayerId)) + || (playerBestMonId >= 3 && GetLinkTrainerFlankId(gBattleScripting.multiplayerId))) { j = (opponentBestMonId < 3) ? 0 : 1; PutBattleUpdateOnTheAir(sub_806EF84(j, gBattleScripting.multiplayerId), moveId, playerBestSpecies, opponentBestSpecies); @@ -812,7 +810,7 @@ void TryPutLinkBattleTvShowOnAir(void) } #else -ASM_DIRECT +NAKED void TryPutLinkBattleTvShowOnAir(void) { asm_unified( @@ -1080,7 +1078,7 @@ _0817E5C8:\n\ ldr r0, =gBattleScripting\n\ adds r0, 0x25\n\ ldrb r0, [r0]\n\ - bl sub_806D82C\n\ + bl GetLinkTrainerFlankId\n\ lsls r0, 16\n\ cmp r0, 0\n\ beq _0817E630\n\ @@ -1090,7 +1088,7 @@ _0817E620:\n\ ldr r0, =gBattleScripting\n\ adds r0, 0x25\n\ ldrb r0, [r0]\n\ - bl sub_806D82C\n\ + bl GetLinkTrainerFlankId\n\ lsls r0, 16\n\ cmp r0, 0\n\ beq _0817E670\n\ diff --git a/src/battle_util.c b/src/battle_util.c index 172ec6659..875244d79 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -46,7 +46,7 @@ u8 GetBattlerForBattleScript(u8 caseId) case BS_EFFECT_BATTLER: ret = gEffectBattler; break; - case BS_BANK_0: + case BS_BATTLER_0: ret = 0; break; case BS_SCRIPTING: @@ -292,7 +292,7 @@ void sub_803FA70(u8 battler) } } -void BattleScriptPush(const u8* bsPtr) +void BattleScriptPush(const u8 *bsPtr) { gBattleResources->battleScriptsStack->ptr[gBattleResources->battleScriptsStack->size++] = bsPtr; } @@ -426,7 +426,7 @@ u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) gPotentialItemEffectBattler = battlerId; - for (i = 0; i < MAX_BATTLERS_COUNT; i++) + for (i = 0; i < 4; i++) { if (gBattleMons[battlerId].moves[i] == 0 && check & MOVE_LIMITATION_ZEROMOVE) unusableMoves |= gBitTable[i]; @@ -453,14 +453,14 @@ bool8 AreAllMovesUnusable(void) u8 unusable; unusable = CheckMoveLimitations(gActiveBattler, 0, 0xFF); - if (unusable == 0xF) // all moves are unusable + if (unusable == 0xF) // All moves are unusable. { - gProtectStructs[gActiveBattler].onlyStruggle = 1; + gProtectStructs[gActiveBattler].noValidMoves = 1; gSelectionBattleScripts[gActiveBattler] = BattleScript_NoMovesLeft; } else { - gProtectStructs[gActiveBattler].onlyStruggle = 0; + gProtectStructs[gActiveBattler].noValidMoves = 0; } return (unusable == 0xF); @@ -470,11 +470,11 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) { s32 i; u8 imprisionedMoves = 0; - u8 bankSide = GetBattlerSide(battlerId); + u8 battlerSide = GetBattlerSide(battlerId); for (i = 0; i < gBattlersCount; i++) { - if (bankSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) + if (battlerSide != GetBattlerSide(i) && gStatuses3[i] & STATUS3_IMPRISONED_OTHERS) { s32 j; for (j = 0; j < 4; j++) @@ -490,7 +490,22 @@ u8 GetImprisonedMovesCount(u8 battlerId, u16 move) return imprisionedMoves; } -u8 UpdateTurnCounters(void) +enum +{ + ENDTURN_ORDER, + ENDTURN_REFLECT, + ENDTURN_LIGHT_SCREEN, + ENDTURN_MIST, + ENDTURN_SAFEGUARD, + ENDTURN_WISH, + ENDTURN_RAIN, + ENDTURN_SANDSTORM, + ENDTURN_SUN, + ENDTURN_HAIL, + ENDTURN_FIELD_COUNT, +}; + +u8 DoFieldEndTurnEffects(void) { u8 effect = 0; s32 i; @@ -504,21 +519,21 @@ u8 UpdateTurnCounters(void) do { - u8 sideBank; + u8 side; switch (gBattleStruct->turnCountersTracker) { - case 0: + case ENDTURN_ORDER: for (i = 0; i < gBattlersCount; i++) { - gBattleTurnOrder[i] = i; + gBattlerByTurnOrder[i] = i; } for (i = 0; i < gBattlersCount - 1; i++) { s32 j; for (j = i + 1; j < gBattlersCount; j++) { - if (GetWhoStrikesFirst(gBattleTurnOrder[i], gBattleTurnOrder[j], 0)) + if (GetWhoStrikesFirst(gBattlerByTurnOrder[i], gBattlerByTurnOrder[j], 0)) SwapTurnOrder(i, j); } } @@ -530,16 +545,16 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnSideTracker = 0; } // fall through - case 1: + case ENDTURN_REFLECT: while (gBattleStruct->turnSideTracker < 2) { - sideBank = gBattleStruct->turnSideTracker; - gActiveBattler = gBattlerAttacker = gSideTimers[sideBank].reflectBattlerId; - if (gSideStatuses[sideBank] & SIDE_STATUS_REFLECT) + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].reflectBattlerId; + if (gSideStatuses[side] & SIDE_STATUS_REFLECT) { - if (--gSideTimers[sideBank].reflectTimer == 0) + if (--gSideTimers[side].reflectTimer == 0) { - gSideStatuses[sideBank] &= ~SIDE_STATUS_REFLECT; + gSideStatuses[side] &= ~SIDE_STATUS_REFLECT; BattleScriptExecute(BattleScript_SideStatusWoreOff); PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_REFLECT); effect++; @@ -555,18 +570,18 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnSideTracker = 0; } break; - case 2: + case ENDTURN_LIGHT_SCREEN: while (gBattleStruct->turnSideTracker < 2) { - sideBank = gBattleStruct->turnSideTracker; - gActiveBattler = gBattlerAttacker = gSideTimers[sideBank].lightscreenBattlerId; - if (gSideStatuses[sideBank] & SIDE_STATUS_LIGHTSCREEN) + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].lightscreenBattlerId; + if (gSideStatuses[side] & SIDE_STATUS_LIGHTSCREEN) { - if (--gSideTimers[sideBank].lightscreenTimer == 0) + if (--gSideTimers[side].lightscreenTimer == 0) { - gSideStatuses[sideBank] &= ~SIDE_STATUS_LIGHTSCREEN; + gSideStatuses[side] &= ~SIDE_STATUS_LIGHTSCREEN; BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; + gBattleCommunication[MULTISTRING_CHOOSER] = side; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_LIGHT_SCREEN); effect++; } @@ -581,17 +596,17 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnSideTracker = 0; } break; - case 3: + case ENDTURN_MIST: while (gBattleStruct->turnSideTracker < 2) { - sideBank = gBattleStruct->turnSideTracker; - gActiveBattler = gBattlerAttacker = gSideTimers[sideBank].mistBattlerId; - if (gSideTimers[sideBank].mistTimer != 0 - && --gSideTimers[sideBank].mistTimer == 0) + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].mistBattlerId; + if (gSideTimers[side].mistTimer != 0 + && --gSideTimers[side].mistTimer == 0) { - gSideStatuses[sideBank] &= ~SIDE_STATUS_MIST; + gSideStatuses[side] &= ~SIDE_STATUS_MIST; BattleScriptExecute(BattleScript_SideStatusWoreOff); - gBattleCommunication[MULTISTRING_CHOOSER] = sideBank; + gBattleCommunication[MULTISTRING_CHOOSER] = side; PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_MIST); effect++; } @@ -605,16 +620,16 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnSideTracker = 0; } break; - case 4: + case ENDTURN_SAFEGUARD: while (gBattleStruct->turnSideTracker < 2) { - sideBank = gBattleStruct->turnSideTracker; - gActiveBattler = gBattlerAttacker = gSideTimers[sideBank].safeguardBattlerId; - if (gSideStatuses[sideBank] & SIDE_STATUS_SAFEGUARD) + side = gBattleStruct->turnSideTracker; + gActiveBattler = gBattlerAttacker = gSideTimers[side].safeguardBattlerId; + if (gSideStatuses[side] & SIDE_STATUS_SAFEGUARD) { - if (--gSideTimers[sideBank].safeguardTimer == 0) + if (--gSideTimers[side].safeguardTimer == 0) { - gSideStatuses[sideBank] &= ~SIDE_STATUS_SAFEGUARD; + gSideStatuses[side] &= ~SIDE_STATUS_SAFEGUARD; BattleScriptExecute(BattleScript_SafeguardEnds); effect++; } @@ -629,10 +644,10 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnSideTracker = 0; } break; - case 5: + case ENDTURN_WISH: while (gBattleStruct->turnSideTracker < gBattlersCount) { - gActiveBattler = gBattleTurnOrder[gBattleStruct->turnSideTracker]; + gActiveBattler = gBattlerByTurnOrder[gBattleStruct->turnSideTracker]; if (gWishFutureKnock.wishCounter[gActiveBattler] != 0 && --gWishFutureKnock.wishCounter[gActiveBattler] == 0 && gBattleMons[gActiveBattler].hp != 0) @@ -650,7 +665,7 @@ u8 UpdateTurnCounters(void) gBattleStruct->turnCountersTracker++; } break; - case 6: + case ENDTURN_RAIN: if (gBattleWeather & WEATHER_RAIN_ANY) { if (!(gBattleWeather & WEATHER_RAIN_PERMANENT)) @@ -680,7 +695,7 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 7: + case ENDTURN_SANDSTORM: if (gBattleWeather & WEATHER_SANDSTORM_ANY) { if (!(gBattleWeather & WEATHER_SANDSTORM_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) @@ -700,7 +715,7 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 8: + case ENDTURN_SUN: if (gBattleWeather & WEATHER_SUN_ANY) { if (!(gBattleWeather & WEATHER_SUN_PERMANENT) && --gWishFutureKnock.weatherDuration == 0) @@ -718,8 +733,8 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 9: - if (gBattleWeather & WEATHER_HAIL) + case ENDTURN_HAIL: + if (gBattleWeather & WEATHER_HAIL_ANY) { if (--gWishFutureKnock.weatherDuration == 0) { @@ -738,7 +753,7 @@ u8 UpdateTurnCounters(void) } gBattleStruct->turnCountersTracker++; break; - case 10: + case ENDTURN_FIELD_COUNT: effect++; break; } @@ -746,16 +761,38 @@ u8 UpdateTurnCounters(void) return (gBattleMainFunc != BattleTurnPassed); } -#define TURNBASED_MAX_CASE 19 +enum +{ + ENDTURN_INGRAIN, + ENDTURN_ABILITIES, + ENDTURN_ITEMS1, + ENDTURN_LEECH_SEED, + ENDTURN_POISON, + ENDTURN_BAD_POISON, + ENDTURN_BURN, + ENDTURN_NIGHTMARES, + ENDTURN_CURSE, + ENDTURN_WRAP, + ENDTURN_UPROAR, + ENDTURN_THRASH, + ENDTURN_DISABLE, + ENDTURN_ENCORE, + ENDTURN_LOCK_ON, + ENDTURN_CHARGE, + ENDTURN_TAUNT, + ENDTURN_YAWN, + ENDTURN_ITEMS2, + ENDTURN_BATTLER_COUNT +}; -u8 TurnBasedEffects(void) +u8 DoBattlerEndTurnEffects(void) { u8 effect = 0; gHitMarker |= (HITMARKER_GRUDGE | HITMARKER_x20); - while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= TURNBASED_MAX_CASE) + while (gBattleStruct->turnEffectsBattlerId < gBattlersCount && gBattleStruct->turnEffectsTracker <= ENDTURN_BATTLER_COUNT) { - gActiveBattler = gBattlerAttacker = gBattleTurnOrder[gBattleStruct->turnEffectsBattlerId]; + gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->turnEffectsBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->turnEffectsBattlerId++; @@ -764,7 +801,7 @@ u8 TurnBasedEffects(void) { switch (gBattleStruct->turnEffectsTracker) { - case 0: // ingrain + case ENDTURN_INGRAIN: // ingrain if ((gStatuses3[gActiveBattler] & STATUS3_ROOTED) && gBattleMons[gActiveBattler].hp != gBattleMons[gActiveBattler].maxHP && gBattleMons[gActiveBattler].hp != 0) @@ -778,27 +815,27 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 1: // end turn abilities + case ENDTURN_ABILITIES: // end turn abilities if (AbilityBattleEffects(ABILITYEFFECT_ENDTURN, gActiveBattler, 0, 0, 0)) effect++; gBattleStruct->turnEffectsTracker++; break; - case 2: // item effects + case ENDTURN_ITEMS1: // item effects if (ItemBattleEffects(1, gActiveBattler, 0)) effect++; gBattleStruct->turnEffectsTracker++; break; - case 18: // item effects again + case ENDTURN_ITEMS2: // item effects again if (ItemBattleEffects(1, gActiveBattler, 1)) effect++; gBattleStruct->turnEffectsTracker++; break; - case 3: // leech seed + case ENDTURN_LEECH_SEED: // leech seed if ((gStatuses3[gActiveBattler] & STATUS3_LEECHSEED) - && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BANK].hp != 0 + && gBattleMons[gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER].hp != 0 && gBattleMons[gActiveBattler].hp != 0) { - gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BANK; //funny how the 'target' is actually the battlerId that receives HP + gBattlerTarget = gStatuses3[gActiveBattler] & STATUS3_LEECHSEED_BATTLER; // Notice gBattlerTarget is actually the HP receiver. gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; @@ -809,7 +846,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 4: // poison + case ENDTURN_POISON: // poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_POISON) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; @@ -820,7 +857,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 5: // toxic poison + case ENDTURN_BAD_POISON: // toxic poison if ((gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 16; @@ -834,7 +871,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 6: // burn + case ENDTURN_BURN: // burn if ((gBattleMons[gActiveBattler].status1 & STATUS1_BURN) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 8; @@ -845,11 +882,11 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 7: // spooky nightmares + case ENDTURN_NIGHTMARES: // spooky nightmares if ((gBattleMons[gActiveBattler].status2 & STATUS2_NIGHTMARE) && gBattleMons[gActiveBattler].hp != 0) { - // R/S does not perform this sleep check, which causes the nighmare effect to - // persist even after the affected Pokemon has been awakened by Shed Skin + // R/S does not perform this sleep check, which causes the nightmare effect to + // persist even after the affected Pokemon has been awakened by Shed Skin. if (gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; @@ -865,7 +902,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 8: // curse + case ENDTURN_CURSE: // curse if ((gBattleMons[gActiveBattler].status2 & STATUS2_CURSED) && gBattleMons[gActiveBattler].hp != 0) { gBattleMoveDamage = gBattleMons[gActiveBattler].maxHP / 4; @@ -876,7 +913,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 9: // wrap + case ENDTURN_WRAP: // wrap if ((gBattleMons[gActiveBattler].status2 & STATUS2_WRAPPED) && gBattleMons[gActiveBattler].hp != 0) { gBattleMons[gActiveBattler].status2 -= 0x2000; @@ -909,7 +946,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 10: // uproar + case ENDTURN_UPROAR: // uproar if (gBattleMons[gActiveBattler].status2 & STATUS2_UPROAR) { for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++) @@ -958,7 +995,7 @@ u8 TurnBasedEffects(void) if (effect != 2) gBattleStruct->turnEffectsTracker++; break; - case 11: // thrash + case ENDTURN_THRASH: // thrash if (gBattleMons[gActiveBattler].status2 & STATUS2_LOCK_CONFUSE) { gBattleMons[gActiveBattler].status2 -= 0x400; @@ -980,10 +1017,10 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 12: // disable + case ENDTURN_DISABLE: // disable if (gDisableStructs[gActiveBattler].disableTimer1 != 0) { - int i; + s32 i; for (i = 0; i < 4; i++) { if (gDisableStructs[gActiveBattler].disabledMove == gBattleMons[gActiveBattler].moves[i]) @@ -1003,7 +1040,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 13: // encore + case ENDTURN_ENCORE: // encore if (gDisableStructs[gActiveBattler].encoreTimer1 != 0) { if (gBattleMons[gActiveBattler].moves[gDisableStructs[gActiveBattler].encoredMovePos] != gDisableStructs[gActiveBattler].encoredMove) // pokemon does not have the encored move anymore @@ -1022,22 +1059,22 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 14: // lock-on decrement + case ENDTURN_LOCK_ON: // lock-on decrement if (gStatuses3[gActiveBattler] & STATUS3_ALWAYS_HITS) gStatuses3[gActiveBattler] -= 0x8; gBattleStruct->turnEffectsTracker++; break; - case 15: // charge + case ENDTURN_CHARGE: // charge if (gDisableStructs[gActiveBattler].chargeTimer1 && --gDisableStructs[gActiveBattler].chargeTimer1 == 0) gStatuses3[gActiveBattler] &= ~STATUS3_CHARGED_UP; gBattleStruct->turnEffectsTracker++; break; - case 16: // taunt + case ENDTURN_TAUNT: // taunt if (gDisableStructs[gActiveBattler].tauntTimer1) gDisableStructs[gActiveBattler].tauntTimer1--; gBattleStruct->turnEffectsTracker++; break; - case 17: // yawn + case ENDTURN_YAWN: // yawn if (gStatuses3[gActiveBattler] & STATUS3_YAWN) { gStatuses3[gActiveBattler] -= 0x800; @@ -1056,7 +1093,7 @@ u8 TurnBasedEffects(void) } gBattleStruct->turnEffectsTracker++; break; - case 19: // done + case ENDTURN_BATTLER_COUNT: // done gBattleStruct->turnEffectsTracker = 0; gBattleStruct->turnEffectsBattlerId++; break; @@ -1121,7 +1158,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void) case 1: while (gBattleStruct->wishPerishSongBattlerId < gBattlersCount) { - gActiveBattler = gBattlerAttacker = gBattleTurnOrder[gBattleStruct->wishPerishSongBattlerId]; + gActiveBattler = gBattlerAttacker = gBattlerByTurnOrder[gBattleStruct->wishPerishSongBattlerId]; if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) { gBattleStruct->wishPerishSongBattlerId++; @@ -1184,7 +1221,7 @@ bool8 HandleFaintedMonActions(void) return FALSE; do { - int i; + s32 i; switch (gBattleStruct->faintedActionsState) { case 0: @@ -1192,7 +1229,7 @@ bool8 HandleFaintedMonActions(void) gBattleStruct->faintedActionsState++; for (i = 0; i < gBattlersCount; i++) { - if (gAbsentBattlerFlags & gBitTable[i] && !sub_80423F4(i, 6, 6)) + if (gAbsentBattlerFlags & gBitTable[i] && !HasNoMonsToSwitch(i, 6, 6)) gAbsentBattlerFlags &= ~(gBitTable[i]); } // fall through @@ -1256,7 +1293,7 @@ bool8 HandleFaintedMonActions(void) void TryClearRageStatuses(void) { - int i; + s32 i; for (i = 0; i < gBattlersCount; i++) { if ((gBattleMons[i].status2 & STATUS2_RAGE) && gChosenMoveByBattler[i] != MOVE_RAGE) @@ -1264,7 +1301,24 @@ void TryClearRageStatuses(void) } } -#define ATKCANCELLER_MAX_CASE 14 +enum +{ + CANCELLER_FLAGS, + CANCELLER_ASLEEP, + CANCELLER_FROZEN, + CANCELLER_TRUANT, + CANCELLER_RECHARGE, + CANCELLER_FLINCH, + CANCELLER_DISABLED, + CANCELLER_TAUNTED, + CANCELLER_IMPRISONED, + CANCELLER_CONFUSED, + CANCELLER_PARALYSED, + CANCELLER_IN_LOVE, + CANCELLER_BIDE, + CANCELLER_THAW, + CANCELLER_END, +}; u8 AtkCanceller_UnableToUseMove(void) { @@ -1274,12 +1328,12 @@ u8 AtkCanceller_UnableToUseMove(void) { switch (gBattleStruct->atkCancellerTracker) { - case 0: // flags clear + case CANCELLER_FLAGS: // flags clear gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_DESTINY_BOND); gStatuses3[gBattlerAttacker] &= ~(STATUS3_GRUDGE); gBattleStruct->atkCancellerTracker++; break; - case 1: // check being asleep + case CANCELLER_ASLEEP: // check being asleep if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP) { if (UproarWakeUpCheck(gBattlerAttacker)) @@ -1323,7 +1377,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 2: // check being frozen + case CANCELLER_FROZEN: // check being frozen if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (Random() % 5) @@ -1350,7 +1404,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 3: // truant + case CANCELLER_TRUANT: // truant if (gBattleMons[gBattlerAttacker].ability == ABILITY_TRUANT && gDisableStructs[gBattlerAttacker].truantCounter) { CancelMultiTurnMoves(gBattlerAttacker); @@ -1362,7 +1416,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 4: // recharge + case CANCELLER_RECHARGE: // recharge if (gBattleMons[gBattlerAttacker].status2 & STATUS2_RECHARGE) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_RECHARGE); @@ -1374,7 +1428,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 5: // flinch + case CANCELLER_FLINCH: // flinch if (gBattleMons[gBattlerAttacker].status2 & STATUS2_FLINCHED) { gBattleMons[gBattlerAttacker].status2 &= ~(STATUS2_FLINCHED); @@ -1386,7 +1440,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 6: // disabled move + case CANCELLER_DISABLED: // disabled move if (gDisableStructs[gBattlerAttacker].disabledMove == gCurrentMove && gDisableStructs[gBattlerAttacker].disabledMove != 0) { gProtectStructs[gBattlerAttacker].usedDisabledMove = 1; @@ -1398,7 +1452,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 7: // taunt + case CANCELLER_TAUNTED: // taunt if (gDisableStructs[gBattlerAttacker].tauntTimer1 && gBattleMoves[gCurrentMove].power == 0) { gProtectStructs[gBattlerAttacker].usedTauntedMove = 1; @@ -1409,7 +1463,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 8: // imprisoned + case CANCELLER_IMPRISONED: // imprisoned if (GetImprisonedMovesCount(gBattlerAttacker, gCurrentMove)) { gProtectStructs[gBattlerAttacker].usedImprisionedMove = 1; @@ -1420,7 +1474,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 9: // confusion + case CANCELLER_CONFUSED: // confusion if (gBattleMons[gBattlerAttacker].status2 & STATUS2_CONFUSION) { gBattleMons[gBattlerAttacker].status2--; @@ -1450,7 +1504,7 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 10: // paralysis + case CANCELLER_PARALYSED: // paralysis if ((gBattleMons[gBattlerAttacker].status1 & STATUS1_PARALYSIS) && (Random() % 4) == 0) { gProtectStructs[gBattlerAttacker].prlzImmobility = 1; @@ -1462,12 +1516,14 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 11: // infatuation + case CANCELLER_IN_LOVE: // infatuation if (gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) { gBattleScripting.battler = CountTrailingZeroBits((gBattleMons[gBattlerAttacker].status2 & STATUS2_INFATUATION) >> 0x10); if (Random() & 1) + { BattleScriptPushCursor(); + } else { BattleScriptPush(BattleScript_MoveUsedIsParalyzedCantAttack); @@ -1480,12 +1536,14 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case 12: // bide + case CANCELLER_BIDE: // bide if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) { gBattleMons[gBattlerAttacker].status2 -= 0x100; if (gBattleMons[gBattlerAttacker].status2 & STATUS2_BIDE) + { gBattlescriptCurrInstr = BattleScript_BideStoringEnergy; + } else { // This is removed in Emerald for some reason @@ -1500,13 +1558,15 @@ u8 AtkCanceller_UnableToUseMove(void) gBattlescriptCurrInstr = BattleScript_BideAttack; } else + { gBattlescriptCurrInstr = BattleScript_BideNoEnergyToAttack; + } } effect = 1; } gBattleStruct->atkCancellerTracker++; break; - case 13: // move thawing + case CANCELLER_THAW: // move thawing if (gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE) { if (gBattleMoves[gCurrentMove].effect == EFFECT_THAW_HIT) @@ -1520,11 +1580,11 @@ u8 AtkCanceller_UnableToUseMove(void) } gBattleStruct->atkCancellerTracker++; break; - case ATKCANCELLER_MAX_CASE: + case CANCELLER_END: break; } - } while (gBattleStruct->atkCancellerTracker != ATKCANCELLER_MAX_CASE && effect == 0); + } while (gBattleStruct->atkCancellerTracker != CANCELLER_END && effect == 0); if (effect == 2) { @@ -1535,29 +1595,31 @@ u8 AtkCanceller_UnableToUseMove(void) return effect; } -bool8 sub_80423F4(u8 battler, u8 r1, u8 r2) +bool8 HasNoMonsToSwitch(u8 battler, u8 partyIdBattlerOn1, u8 partyIdBattlerOn2) { - struct Pokemon* party; - u8 r7; - u8 r6; + struct Pokemon *party; + u8 id1, id2; s32 i; + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return FALSE; + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; - r6 = ((battler & 2) / 2); - for (i = r6 * 3; i < r6 * 3 + 3; i++) + + id1 = ((battler & BIT_FLANK) / 2); + for (i = id1 * 3; i < id1 * 3 + 3; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) break; } - return (i == r6 * 3 + 3); + return (i == id1 * 3 + 3); } else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -1566,86 +1628,95 @@ bool8 sub_80423F4(u8 battler, u8 r1, u8 r2) if (GetBattlerSide(battler) == B_SIDE_PLAYER) { party = gPlayerParty; - r7 = GetBattlerMultiplayerId(battler); - r6 = sub_806D82C(r7); + id2 = GetBattlerMultiplayerId(battler); + id1 = GetLinkTrainerFlankId(id2); } else { - // FIXME: Compiler insists on moving r4 into r1 before doing the eor + // FIXME: Compiler insists on moving r4 into r1 before doing the eor. #ifndef NONMATCHING - register u32 var asm("r1"); + register u32 var asm("r1"); #else - u32 var; + u32 var; #endif // NONMATCHING party = gEnemyParty; - var = battler ^ 1; - r6 = (var != 0) ? 1 : 0; + var = battler ^ BIT_SIDE; + if (var == 0) + id1 = 0; + else + id1 = 1; } } else { - r7 = GetBattlerMultiplayerId(battler); + id2 = GetBattlerMultiplayerId(battler); + if (GetBattlerSide(battler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; - r6 = sub_806D82C(r7); + + id1 = GetLinkTrainerFlankId(id2); } - for (i = r6 * 3; i < r6 * 3 + 3; i++) + + for (i = id1 * 3; i < id1 * 3 + 3; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) break; } - return (i == r6 * 3 + 3); + return (i == id1 * 3 + 3); } else if ((gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) && GetBattlerSide(battler) == B_SIDE_OPPONENT) { party = gEnemyParty; if (battler == 1) - r6 = 0; + id1 = 0; else - r6 = 3; - for (i = r6; i < r6 + 3; i++) + id1 = 3; + + for (i = id1; i < id1 + 3; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG) break; } - return (i == r6 + 3); + return (i == id1 + 3); } else { if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { - r7 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - r6 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + id2 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + id1 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); party = gEnemyParty; } else { - r7 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - r6 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + id2 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + id1 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); party = gPlayerParty; } - if (r1 == 6) - r1 = gBattlerPartyIndexes[r7]; - if (r2 == 6) - r2 = gBattlerPartyIndexes[r6]; - for (i = 0; i < 6; i++) + + if (partyIdBattlerOn1 == PARTY_SIZE) + partyIdBattlerOn1 = gBattlerPartyIndexes[id2]; + if (partyIdBattlerOn2 == PARTY_SIZE) + partyIdBattlerOn2 = gBattlerPartyIndexes[id1]; + + for (i = 0; i < PARTY_SIZE; i++) { if (GetMonData(&party[i], MON_DATA_HP) != 0 - && GetMonData(&party[i], MON_DATA_SPECIES2) != 0 + && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE && GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG - // FIXME: Using index[array] instead of array[index] is BAD! - && i != r1 && i != r2 && i != r7[gBattleStruct->monToSwitchIntoId] && i != r6[gBattleStruct->monToSwitchIntoId]) + && i != partyIdBattlerOn1 && i != partyIdBattlerOn2 + && i != *(gBattleStruct->monToSwitchIntoId + id2) && i != id1[gBattleStruct->monToSwitchIntoId]) break; } - return (i == 6); + return (i == PARTY_SIZE); } } @@ -1706,6 +1777,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattlerAttacker >= gBattlersCount) gBattlerAttacker = battler; + if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) pokeAtk = &gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]; else @@ -1713,6 +1785,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA if (gBattlerTarget >= gBattlersCount) gBattlerTarget = battler; + if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER) pokeDef = &gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]; else @@ -1724,7 +1797,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA speciesDef = GetMonData(pokeDef, MON_DATA_SPECIES); pidDef = GetMonData(pokeDef, MON_DATA_PERSONALITY); - if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // why isn't that check done at the beginning? + if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) // Why isn't that check done at the beginning? { u8 moveType; s32 i; @@ -1821,10 +1894,10 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } break; case ABILITY_INTIMIDATE: - if (!(gSpecialStatuses[battler].intimidatedPoke)) + if (!(gSpecialStatuses[battler].intimidatedMon)) { gStatuses3[battler] |= STATUS3_INTIMIDATE_POKES; - gSpecialStatuses[battler].intimidatedPoke = 1; + gSpecialStatuses[battler].intimidatedMon = 1; } break; case ABILITY_FORECAST: @@ -2271,7 +2344,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gLastUsedAbility = ABILITY_INTIMIDATE; gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); BattleScriptPushCursorAndCallback(BattleScript_82DB4B8); - gBattleStruct->intimidateBank = i; + gBattleStruct->intimidateBattler = i; effect++; break; } @@ -2343,7 +2416,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gStatuses3[i] &= ~(STATUS3_INTIMIDATE_POKES); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_82DB4C1; - gBattleStruct->intimidateBank = i; + gBattleStruct->intimidateBattler = i; effect++; break; } @@ -2360,7 +2433,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; - case ABILITYEFFECT_CHECK_BANK_SIDE: // 13 + case ABILITYEFFECT_CHECK_BATTLER_SIDE: // 13 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { @@ -2410,7 +2483,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; - case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BANK: // 15 + case ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER: // 15 for (i = 0; i < gBattlersCount; i++) { if (gBattleMons[i].ability == ability && i != battler) @@ -2431,7 +2504,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA } } break; - case ABILITYEFFECT_COUNT_BANK_SIDE: // 17 + case ABILITYEFFECT_COUNT_BATTLER_SIDE: // 17 side = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { @@ -2492,32 +2565,32 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) int i = 0; u8 effect = ITEM_NO_EFFECT; u8 changedPP = 0; - u8 bankHoldEffect, atkHoldEffect, defHoldEffect; - u8 bankQuality, atkQuality, defQuality; + u8 battlerHoldEffect, atkHoldEffect, defHoldEffect; + u8 battlerHoldEffectParam, atkHoldEffectParam, defHoldEffectParam; u16 atkItem, defItem; gLastUsedItem = gBattleMons[battlerId].item; if (gLastUsedItem == ITEM_ENIGMA_BERRY) { - bankHoldEffect = gEnigmaBerries[battlerId].holdEffect; - bankQuality = gEnigmaBerries[battlerId].holdEffectParam; + battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; + battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; } else { - bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); + battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); + battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); } atkItem = gBattleMons[gBattlerAttacker].item; if (atkItem == ITEM_ENIGMA_BERRY) { atkHoldEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; - atkQuality = gEnigmaBerries[gBattlerAttacker].holdEffectParam; + atkHoldEffectParam = gEnigmaBerries[gBattlerAttacker].holdEffectParam; } else { atkHoldEffect = ItemId_GetHoldEffect(atkItem); - atkQuality = ItemId_GetHoldEffectParam(atkItem); + atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem); } // def variables are unused @@ -2525,18 +2598,18 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (defItem == ITEM_ENIGMA_BERRY) { defHoldEffect = gEnigmaBerries[gBattlerTarget].holdEffect; - defQuality = gEnigmaBerries[gBattlerTarget].holdEffectParam; + defHoldEffectParam = gEnigmaBerries[gBattlerTarget].holdEffectParam; } else { defHoldEffect = ItemId_GetHoldEffect(defItem); - defQuality = ItemId_GetHoldEffectParam(defItem); + defHoldEffectParam = ItemId_GetHoldEffectParam(defItem); } switch (caseID) { case ITEMEFFECT_ON_SWITCH_IN: - switch (bankHoldEffect) + switch (battlerHoldEffect) { case HOLD_EFFECT_DOUBLE_PRIZE: if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) @@ -2564,13 +2637,13 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case 1: if (gBattleMons[battlerId].hp) { - switch (bankHoldEffect) + switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) { - gBattleMoveDamage = bankQuality; - if (gBattleMons[battlerId].hp + bankQuality > gBattleMons[battlerId].maxHP) + gBattleMoveDamage = battlerHoldEffectParam; + if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP) gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); @@ -2599,10 +2672,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) if (i != 4) { u8 maxPP = CalculatePPWithBonus(move, ppBonuses, i); - if (changedPP + bankQuality > maxPP) + if (changedPP + battlerHoldEffectParam > maxPP) changedPP = maxPP; else - changedPP = changedPP + bankQuality; + changedPP = changedPP + battlerHoldEffectParam; PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); @@ -2641,7 +2714,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battlerId, bankHoldEffect); + RecordItemEffectBattle(battlerId, battlerHoldEffect); } break; // nice copy/paste there gamefreak, making a function for confuse berries was too much eh? @@ -2650,7 +2723,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SPICY); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / bankQuality; + gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) @@ -2668,7 +2741,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_DRY); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / bankQuality; + gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) @@ -2686,7 +2759,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SWEET); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / bankQuality; + gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) @@ -2704,7 +2777,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_BITTER); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / bankQuality; + gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) @@ -2722,7 +2795,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) { PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, FLAVOR_SOUR); - gBattleMoveDamage = gBattleMons[battlerId].maxHP / bankQuality; + gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) @@ -2737,7 +2810,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) break; // copy/paste again, smh case HOLD_EFFECT_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_ATK] < 0xC) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK); PREPARE_STRING_BUFFER(gBattleTextBuff2, STRINGID_STATROSE); @@ -2751,7 +2824,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_DEF] < 0xC) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_DEF); @@ -2764,7 +2837,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_SPEED_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPEED] < 0xC) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPEED); @@ -2777,7 +2850,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_SP_ATTACK_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPATK] < 0xC) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPATK); @@ -2790,7 +2863,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_SP_DEFENSE_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && gBattleMons[battlerId].statStages[STAT_SPDEF] < 0xC) { PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_SPDEF); @@ -2803,7 +2876,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CRITICAL_UP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) + if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam && !moveTurn && !(gBattleMons[battlerId].status2 & STATUS2_FOCUS_ENERGY)) { gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; BattleScriptExecute(BattleScript_BerryFocusEnergyEnd2); @@ -2811,7 +2884,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_RANDOM_STAT_UP: - if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / bankQuality) + if (!moveTurn && gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam) { for (i = 0; i < 5; i++) { @@ -2977,15 +3050,15 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gLastUsedItem = gBattleMons[battlerId].item; if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) { - bankHoldEffect = gEnigmaBerries[battlerId].holdEffect; - bankQuality = gEnigmaBerries[battlerId].holdEffectParam; + battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; + battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; } else { - bankHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - bankQuality = ItemId_GetHoldEffectParam(gLastUsedItem); + battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); + battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); } - switch (bankHoldEffect) + switch (battlerHoldEffect) { case HOLD_EFFECT_CURE_PAR: if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) @@ -3127,7 +3200,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_FLINCH: if (!(gMoveResultFlags & MOVE_RESULT_NO_EFFECT) && TARGET_TURN_DAMAGED - && (Random() % 100) < atkQuality + && (Random() % 100) < atkHoldEffectParam && gBattleMoves[gCurrentMove].flags & FLAG_KINGSROCK_AFFECTED && gBattleMons[gBattlerTarget].hp) { @@ -3148,7 +3221,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gLastUsedItem = atkItem; gPotentialItemEffectBattler = gBattlerAttacker; gBattleScripting.battler = gBattlerAttacker; - gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkQuality) * -1; + gBattleMoveDamage = (gSpecialStatuses[gBattlerTarget].dmg / atkHoldEffectParam) * -1; if (gBattleMoveDamage == 0) gBattleMoveDamage = -1; gSpecialStatuses[gBattlerTarget].dmg = 0; @@ -3180,7 +3253,7 @@ void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands u8 GetMoveTarget(u16 move, u8 setTarget) { - u8 targetBank = 0; + u8 targetBattler = 0; u8 moveTarget; u8 side; @@ -3194,21 +3267,21 @@ u8 GetMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_SELECTED: side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - targetBank = gSideTimers[side].followmeTarget; + targetBattler = gSideTimers[side].followmeTarget; else { side = GetBattlerSide(gBattlerAttacker); do { - targetBank = Random() % gBattlersCount; - } while (targetBank == gBattlerAttacker || side == GetBattlerSide(targetBank) || gAbsentBattlerFlags & gBitTable[targetBank]); + targetBattler = Random() % gBattlersCount; + } while (targetBattler == gBattlerAttacker || side == GetBattlerSide(targetBattler) || gAbsentBattlerFlags & gBitTable[targetBattler]); if (gBattleMoves[move].type == TYPE_ELECTRIC && AbilityBattleEffects(ABILITYEFFECT_COUNT_OTHER_SIDE, gBattlerAttacker, ABILITY_LIGHTNING_ROD, 0, 0) - && gBattleMons[targetBank].ability != ABILITY_LIGHTNING_ROD) + && gBattleMons[targetBattler].ability != ABILITY_LIGHTNING_ROD) { - targetBank ^= BIT_FLANK; - RecordAbilityBattle(targetBank, gBattleMons[targetBank].ability); - gSpecialStatuses[targetBank].lightningRodRedirected = 1; + targetBattler ^= BIT_FLANK; + RecordAbilityBattle(targetBattler, gBattleMons[targetBattler].ability); + gSpecialStatuses[targetBattler].lightningRodRedirected = 1; } } break; @@ -3216,45 +3289,45 @@ u8 GetMoveTarget(u16 move, u8 setTarget) case MOVE_TARGET_BOTH: case MOVE_TARGET_FOES_AND_ALLY: case MOVE_TARGET_OPPONENTS_FIELD: - targetBank = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); - if (gAbsentBattlerFlags & gBitTable[targetBank]) - targetBank ^= BIT_FLANK; + targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); + if (gAbsentBattlerFlags & gBitTable[targetBattler]) + targetBattler ^= BIT_FLANK; break; case MOVE_TARGET_RANDOM: side = GetBattlerSide(gBattlerAttacker) ^ BIT_SIDE; if (gSideTimers[side].followmeTimer && gBattleMons[gSideTimers[side].followmeTarget].hp) - targetBank = gSideTimers[side].followmeTarget; + targetBattler = gSideTimers[side].followmeTarget; else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE && moveTarget & MOVE_TARGET_RANDOM) { if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER) { if (Random() & 1) - targetBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); else - targetBank = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + targetBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } else { if (Random() & 1) - targetBank = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); else - targetBank = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + targetBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - if (gAbsentBattlerFlags & gBitTable[targetBank]) - targetBank ^= BIT_FLANK; + if (gAbsentBattlerFlags & gBitTable[targetBattler]) + targetBattler ^= BIT_FLANK; } else - targetBank = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); + targetBattler = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE); break; case MOVE_TARGET_USER_OR_SELECTED: case MOVE_TARGET_USER: - targetBank = gBattlerAttacker; + targetBattler = gBattlerAttacker; break; } - *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBank; + *(gBattleStruct->moveTarget + gBattlerAttacker) = targetBattler; - return targetBank; + return targetBattler; } static bool32 HasObedientBitSet(u8 battlerId) diff --git a/src/berry.c b/src/berry.c index 74b7090c0..f8a0204c4 100644 --- a/src/berry.c +++ b/src/berry.c @@ -8,11 +8,11 @@ #include "event_data.h" #include "fieldmap.h" -extern u8 FieldObjectGetBerryTreeId(u8 mapObjectId); +extern u8 EventObjectGetBerryTreeId(u8 eventObjectId); extern void sub_8092EF0(u8 mapId, u8 mapNumber, u8 mapGroup); extern void CB2_ChooseBerry(void); -extern const u8* GetFieldObjectScriptPointerForComparison(void); -extern bool8 sub_8092E9C(u8, u8, u8); +extern const u8* GetEventObjectScriptPointerForComparison(void); +extern bool8 IsBerryTreeSparkling(u8, u8, u8); extern u16 gSpecialVar_ItemId; @@ -904,9 +904,9 @@ struct BerryTree *GetBerryTreeInfo(u8 id) return &gSaveBlock1Ptr->berryTrees[id]; } -bool32 FieldObjectInteractionWaterBerryTree(void) +bool32 EventObjectInteractionWaterBerryTree(void) { - struct BerryTree *tree = GetBerryTreeInfo(FieldObjectGetBerryTreeId(gSelectedMapObject)); + struct BerryTree *tree = GetBerryTreeInfo(EventObjectGetBerryTreeId(gSelectedEventObject)); switch (tree->stage) { @@ -930,8 +930,8 @@ bool32 FieldObjectInteractionWaterBerryTree(void) bool8 IsPlayerFacingPlantedBerryTree(void) { - if (GetFieldObjectScriptPointerForComparison() == BerryTreeScript - && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0) + if (GetEventObjectScriptPointerForComparison() == BerryTreeScript + && GetStageByBerryTreeId(EventObjectGetBerryTreeId(gSelectedEventObject)) == 0) return TRUE; else return FALSE; @@ -939,10 +939,10 @@ bool8 IsPlayerFacingPlantedBerryTree(void) bool8 TryToWaterBerryTree(void) { - if (GetFieldObjectScriptPointerForComparison() != BerryTreeScript) + if (GetEventObjectScriptPointerForComparison() != BerryTreeScript) return FALSE; else - return FieldObjectInteractionWaterBerryTree(); + return EventObjectInteractionWaterBerryTree(); } void ClearBerryTrees(void) @@ -1152,7 +1152,7 @@ u16 GetStageDurationByBerryType(u8 berry) return GetBerryInfo(berry)->stageDuration * 60; } -void FieldObjectInteractionGetBerryTreeData(void) +void EventObjectInteractionGetBerryTreeData(void) { u8 id; u8 berry; @@ -1160,13 +1160,13 @@ void FieldObjectInteractionGetBerryTreeData(void) u8 group; u8 num; - id = FieldObjectGetBerryTreeId(gSelectedMapObject); + id = EventObjectGetBerryTreeId(gSelectedEventObject); berry = GetBerryTypeByBerryTreeId(id); ResetBerryTreeSparkleFlag(id); unk = gSpecialVar_LastTalked; num = gSaveBlock1Ptr->location.mapNum; group = gSaveBlock1Ptr->location.mapGroup; - if (sub_8092E9C(unk, num, group)) + if (IsBerryTreeSparkling(unk, num, group)) gSpecialVar_0x8004 = 0xFF; else gSpecialVar_0x8004 = GetStageByBerryTreeId(id); @@ -1175,15 +1175,15 @@ void FieldObjectInteractionGetBerryTreeData(void) GetBerryCountStringByBerryType(berry, gStringVar1, gSpecialVar_0x8006); } -void FieldObjectInteractionGetBerryName(void) +void EventObjectInteractionGetBerryName(void) { - u8 berryType = GetBerryTypeByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)); + u8 berryType = GetBerryTypeByBerryTreeId(EventObjectGetBerryTreeId(gSelectedEventObject)); GetBerryNameByBerryType(berryType, gStringVar1); } -void FieldObjectInteractionGetBerryCountString(void) +void EventObjectInteractionGetBerryCountString(void) { - u8 treeId = FieldObjectGetBerryTreeId(gSelectedMapObject); + u8 treeId = EventObjectGetBerryTreeId(gSelectedEventObject); u8 berry = GetBerryTypeByBerryTreeId(treeId); u8 count = GetBerryCountByBerryTreeId(treeId); GetBerryCountStringByBerryType(berry, gStringVar1, count); @@ -1194,31 +1194,31 @@ void Bag_ChooseBerry(void) SetMainCallback2(CB2_ChooseBerry); } -void FieldObjectInteractionPlantBerryTree(void) +void EventObjectInteractionPlantBerryTree(void) { u8 berry = ItemIdToBerryType(gSpecialVar_ItemId); - PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE); - FieldObjectInteractionGetBerryTreeData(); + PlantBerryTree(EventObjectGetBerryTreeId(gSelectedEventObject), berry, 1, TRUE); + EventObjectInteractionGetBerryTreeData(); } -void FieldObjectInteractionPickBerryTree(void) +void EventObjectInteractionPickBerryTree(void) { - u8 id = FieldObjectGetBerryTreeId(gSelectedMapObject); + u8 id = EventObjectGetBerryTreeId(gSelectedEventObject); u8 berry = GetBerryTypeByBerryTreeId(id); gSpecialVar_0x8004 = AddBagItem(BerryTypeToItemId(berry), GetBerryCountByBerryTreeId(id)); } -void FieldObjectInteractionRemoveBerryTree(void) +void EventObjectInteractionRemoveBerryTree(void) { - RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject)); + RemoveBerryTree(EventObjectGetBerryTreeId(gSelectedEventObject)); sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } u8 PlayerHasBerries(void) { - return IsBagPocketNonEmpty(BAG_BERRIES); + return IsBagPocketNonEmpty(POCKET_BERRIES); } void ResetBerryTreeSparkleFlags(void) @@ -1236,14 +1236,14 @@ void ResetBerryTreeSparkleFlags(void) top = cam_top + 3; right = cam_left + 14; bottom = top + 8; - for (i = 0; i < MAP_OBJECTS_COUNT; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { - if (gMapObjects[i].active && gMapObjects[i].animPattern == 12) + if (gEventObjects[i].active && gEventObjects[i].movementType == 12) { - cam_left = gMapObjects[i].coords2.x; - cam_top = gMapObjects[i].coords2.y; + cam_left = gEventObjects[i].currentCoords.x; + cam_top = gEventObjects[i].currentCoords.y; if (left <= cam_left && cam_left <= right && top <= cam_top && cam_top <= bottom) - ResetBerryTreeSparkleFlag(gMapObjects[i].trainerRange_berryTreeId); + ResetBerryTreeSparkleFlag(gEventObjects[i].trainerRange_berryTreeId); } } } diff --git a/src/berry_blender.c b/src/berry_blender.c index 9e6a0fef7..257c7233f 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -15,6 +15,7 @@ #include "malloc.h" #include "gpu_regs.h" #include "text.h" +#include "text_window.h" #include "event_data.h" #include "main.h" #include "link.h" @@ -30,6 +31,7 @@ #include "trig.h" #include "tv.h" #include "item_menu.h" +#include "battle_records.h" #define BLENDER_SCORE_BEST 0 #define BLENDER_SCORE_GOOD 1 @@ -131,7 +133,6 @@ extern struct MusicPlayerInfo gMPlayInfo_SE2; extern struct MusicPlayerInfo gMPlayInfo_BGM; extern u8 gInGameOpponentsNo; extern u8 gUnknown_020322D5; -extern u8 gResultsWindowId; // graphics extern const u8 gBerryBlenderArrowTiles[]; @@ -151,15 +152,12 @@ extern const u8 gText_Space[]; extern const u8 gText_BlenderMaxSpeedRecord[]; extern const u8 gText_234Players[]; -extern void sub_81978B0(u16); extern void sub_800A418(void); extern u8 sub_800A9D8(void); -extern bool8 sub_800A4D8(u8); -extern void sub_809882C(u8, u16, u8); -extern void copy_textbox_border_tile_patterns_to_vram(u8, u16, u8); extern void sub_81AABF0(void (*callback)(void)); extern void sub_800B4C0(void); extern void ClearLinkCallback(void); +extern void sub_8009F8C(void); extern void sub_8153430(void); extern bool8 sub_8153474(void); extern void sub_80EECEC(void); @@ -818,7 +816,7 @@ static bool8 LoadBerryBlenderGfx(void) switch (sBerryBlenderData->loadGfxState) { case 0: - sBerryBlenderData->tilesBuffer = AllocZeroed(sub_8034974(sBlenderCenterGfx) + 100); + sBerryBlenderData->tilesBuffer = AllocZeroed(GetDecompressedDataSize(sBlenderCenterGfx) + 100); LZDecompressWram(sBlenderCenterGfx, sBerryBlenderData->tilesBuffer); sBerryBlenderData->loadGfxState++; break; @@ -829,7 +827,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlenderData->loadGfxState++; break; case 2: - LoadBgTiles(2, sBerryBlenderData->tilesBuffer, sub_8034974(sBlenderCenterGfx), 0); + LoadBgTiles(2, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(sBlenderCenterGfx), 0); sBerryBlenderData->loadGfxState++; break; case 3: @@ -837,7 +835,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlenderData->loadGfxState++; break; case 4: - LoadBgTiles(1, sBerryBlenderData->tilesBuffer, sub_8034974(gUnknown_08D91DB8), 0); + LoadBgTiles(1, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(gUnknown_08D91DB8), 0); sBerryBlenderData->loadGfxState++; break; case 5: @@ -845,7 +843,7 @@ static bool8 LoadBerryBlenderGfx(void) sBerryBlenderData->loadGfxState++; break; case 6: - CopyToBgTilemapBuffer(1, sBerryBlenderData->tilesBuffer, sub_8034974(gUnknown_08D927EC), 0); + CopyToBgTilemapBuffer(1, sBerryBlenderData->tilesBuffer, GetDecompressedDataSize(gUnknown_08D927EC), 0); CopyBgTilemapBufferToVram(1); sBerryBlenderData->loadGfxState++; break; @@ -928,8 +926,8 @@ static void sub_807FAC8(void) InitBgsFromTemplates(1, sBerryBlenderBgTemplates, ARRAY_COUNT(sBerryBlenderBgTemplates)); SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]); SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]); - sub_809882C(0, 1, 0xD0); - copy_textbox_border_tile_patterns_to_vram(0, 0x14, 0xF0); + LoadUserWindowBorderGfx(0, 1, 0xD0); + LoadMessageBoxGfx(0, 0x14, 0xF0); InitBerryBlenderWindows(); sBerryBlenderData->mainState++; @@ -960,7 +958,7 @@ static void sub_807FAC8(void) } break; case 2: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); sub_8082D28(); sBerryBlenderData->mainState++; break; @@ -974,7 +972,7 @@ static void sub_807FAC8(void) sBerryBlenderData->mainState++; break; case 5: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); sBerryBlenderData->mainState++; break; case 6: @@ -1164,7 +1162,7 @@ static void sub_8080018(void) sBerryBlenderData->mainState++; break; case 3: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); sBerryBlenderData->mainState++; break; case 4: @@ -1331,9 +1329,8 @@ static void sub_8080588(void) SetBgTilemapBuffer(1, sBerryBlenderData->tilemapBuffers[0]); SetBgTilemapBuffer(2, sBerryBlenderData->tilemapBuffers[1]); - - sub_809882C(0, 1, 0xD0); - copy_textbox_border_tile_patterns_to_vram(0, 0x14, 0xF0); + LoadUserWindowBorderGfx(0, 1, 0xD0); + LoadMessageBoxGfx(0, 0x14, 0xF0); InitBerryBlenderWindows(); sBerryBlenderData->field_44 = 0; @@ -1491,7 +1488,7 @@ static void sub_80808D4(void) sBerryBlenderData->mainState++; break; case 3: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); sBerryBlenderData->mainState++; sBerryBlenderData->framesToWait = 0; break; @@ -2472,7 +2469,7 @@ static void CB2_HandleBlenderEndGame(void) sub_8081F94(&gSendCmd[0]); if (sBerryBlenderData->yesNoAnswer == 0) { - if (IsBagPocketNonEmpty(BAG_BERRIES) == FALSE) // no berries + if (IsBagPocketNonEmpty(POCKET_BERRIES) == FALSE) // no berries { sBerryBlenderData->playAgainState = CANT_PLAY_NO_BERRIES; gSendCmd[1] = 0x9999; @@ -2657,7 +2654,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void) case 9: if (sub_800A520()) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); sBerryBlenderData->gameEndState++; } break; @@ -2690,7 +2687,7 @@ static void CB2_HandlePlayerLinkPlayAgainChoice(void) if (gReceivedRemoteLinkPlayers == 0) { FREE_AND_SET_NULL(sBerryBlenderData); - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } break; } @@ -2740,7 +2737,7 @@ static void CB2_HandlePlayerPlayAgainChoice(void) if (sBerryBlenderData->playAgainState == PLAY_AGAIN_OK) SetMainCallback2(DoBerryBlending); else - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); FreeAllWindowBuffers(); UnsetBgTilemapBuffer(2); @@ -3485,13 +3482,13 @@ void ShowBerryBlenderRecordWindow(void) u8 text[32]; winTemplate = sBlenderRecordWindowTemplate; - gResultsWindowId = AddWindow(&winTemplate); - NewMenuHelpers_DrawStdWindowFrame(gResultsWindowId, 0); - FillWindowPixelBuffer(gResultsWindowId, 0x11); + gRecordsWindowId = AddWindow(&winTemplate); + NewMenuHelpers_DrawStdWindowFrame(gRecordsWindowId, 0); + FillWindowPixelBuffer(gRecordsWindowId, 0x11); xPos = GetStringCenterAlignXOffset(1, gText_BlenderMaxSpeedRecord, 0x90); - PrintTextOnWindow(gResultsWindowId, 1, gText_BlenderMaxSpeedRecord, xPos, 1, 0, NULL); - PrintTextOnWindow(gResultsWindowId, 1, gText_234Players, 4, 0x29, 0, NULL); + PrintTextOnWindow(gRecordsWindowId, 1, gText_BlenderMaxSpeedRecord, xPos, 1, 0, NULL); + PrintTextOnWindow(gRecordsWindowId, 1, gText_234Players, 4, 0x29, 0, NULL); for (i = 0, yPos = 0x29; i < BLENDER_SCORES_NO; i++) { @@ -3506,11 +3503,11 @@ void ShowBerryBlenderRecordWindow(void) txtPtr = StringAppend(txtPtr, sText_RPM); xPos = GetStringRightAlignXOffset(1, text, 0x8C); - PrintTextOnWindow(gResultsWindowId, 1, text, xPos, yPos + (i * 16), 0, NULL); + PrintTextOnWindow(gRecordsWindowId, 1, text, xPos, yPos + (i * 16), 0, NULL); } - PutWindowTilemap(gResultsWindowId); - CopyWindowToVram(gResultsWindowId, 3); + PutWindowTilemap(gRecordsWindowId); + CopyWindowToVram(gRecordsWindowId, 3); } static void sub_8083F3C(u8 taskId) diff --git a/src/berry_tag_screen.c b/src/berry_tag_screen.c index 1a0d1bce0..fb4bf6817 100644 --- a/src/berry_tag_screen.c +++ b/src/berry_tag_screen.c @@ -2,7 +2,7 @@ #include "berry_tag_screen.h" #include "berry.h" #include "decompress.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "item_menu.h" #include "constants/items.h" #include "item.h" @@ -247,7 +247,7 @@ static bool8 InitBerryTagScreen(void) gMain.state++; break; case 15: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -481,7 +481,7 @@ static void DestroyFlavorCircleSprites(void) static void PrepareToCloseBerryTagScreen(u8 taskId) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskId].func = Task_CloseBerryTagScreen; } @@ -517,7 +517,7 @@ static void TryChangeDisplayedBerry(u8 taskId, s8 toMove) s16 *data = gTasks[taskId].data; s16 currPocketPosition = gUnknown_0203CE58.scrollPosition[3] + gUnknown_0203CE58.cursorPosition[3]; u32 newPocketPosition = currPocketPosition + toMove; - if (newPocketPosition < 46 && BagGetItemIdByPocketPosition(BAG_BERRIES, newPocketPosition) != 0) + if (newPocketPosition < 46 && BagGetItemIdByPocketPosition(POCKET_BERRIES, newPocketPosition) != 0) { if (toMove < 0) data[1] = 2; @@ -537,7 +537,7 @@ static void HandleBagCursorPositionChange(s8 toMove) u16 *cursorPos = &gUnknown_0203CE58.cursorPosition[3]; if (toMove > 0) { - if (*cursorPos < 4 || BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + 8) == 0) + if (*cursorPos < 4 || BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + 8) == 0) *cursorPos += toMove; else *scrollPos += toMove; @@ -550,7 +550,7 @@ static void HandleBagCursorPositionChange(s8 toMove) *scrollPos += toMove; } - sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + *cursorPos)); + sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(POCKET_BERRIES, *scrollPos + *cursorPos)); } static void Task_DisplayAnotherBerry(u8 taskId) @@ -463,7 +463,7 @@ bool8 IsDma3ManagerBusyWithBgCopy(void) return FALSE; } #else -ASM_DIRECT +NAKED bool8 IsDma3ManagerBusyWithBgCopy(void) { asm("push {r4-r7,lr}\n\ @@ -965,9 +965,9 @@ void CopyBgTilemapBufferToVram(u8 bg) } } -void CopyToBgTilemapBufferRect(u8 bg, void* src, u8 destX, u8 destY, u8 width, u8 height) +void CopyToBgTilemapBufferRect(u8 bg, const void* src, u8 destX, u8 destY, u8 width, u8 height) { - void* srcCopy; + const void* srcCopy; u16 destX16; u16 destY16; u16 mode; @@ -1048,7 +1048,7 @@ void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 } } }*/ -ASM_DIRECT +NAKED void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2) { asm("push {r4-r7,lr}\n\ @@ -1495,7 +1495,7 @@ void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 pal *dest = test; } #else -ASM_DIRECT +NAKED void CopyTileMapEntry(u16 *src, u16 *dest, s32 palette1, u32 tileOffset, u32 palette2) { asm("push {r4-r6,lr}\n\ diff --git a/src/bike.c b/src/bike.c index 64af7c711..6ffd479f7 100644 --- a/src/bike.c +++ b/src/bike.c @@ -1,6 +1,6 @@ #include "global.h" #include "bike.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "fieldmap.h" #include "constants/flags.h" @@ -9,12 +9,11 @@ #include "overworld.h" #include "constants/songs.h" #include "sound.h" +#include "constants/map_types.h" extern bool8 gBikeCyclingChallenge; extern u8 gBikeCollisions; -extern bool8 gUnknown_02037348; -extern u8 sub_8093514(u8 direction); extern u8 sub_808B980(u8 direction); extern u8 sub_808B9BC(u8 direction); extern u8 sub_808B9A4(u8 direction); @@ -58,7 +57,7 @@ static void Bike_UpdateDirTimerHistory(u8); static void Bike_UpdateABStartSelectHistory(u8); static u8 Bike_DPadToDirection(u16); static u8 get_some_collision(u8); -static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *, s16, s16, u8, u8); +static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct EventObject *, s16, s16, u8, u8); static bool8 IsRunningDisallowedByMetatile(u8); static void Bike_TryAdvanceCyclingRoadCollisions(); static u8 CanBikeFaceDirOnMetatile(u8, u8); @@ -154,7 +153,7 @@ static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) static u8 GetMachBikeTransition(u8 *dirTraveling) { // if the dir updated before this function, get the relevent new direction to check later. - u8 direction = player_get_direction_upper_nybble(); + u8 direction = GetPlayerMovementDirection(); // is the player standing still? if (*dirTraveling == 0) @@ -198,31 +197,31 @@ static void MachBikeTransition_FaceDirection(u8 direction) static void MachBikeTransition_TurnDirection(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E)) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior)) { PlayerTurnInPlace(direction); Bike_SetBikeStill(); } else { - MachBikeTransition_FaceDirection(playerMapObj->mapobj_unk_18); + MachBikeTransition_FaceDirection(playerEventObj->facingDirection); } } static void MachBikeTransition_TrySpeedUp(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; u8 collision; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == FALSE) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == FALSE) { // we cannot go forward, so either slow down or, if we are stopped, idle face direction. if (gPlayerAvatar.bikeSpeed) - MachBikeTransition_TrySlowDown(playerMapObj->placeholder18); + MachBikeTransition_TrySlowDown(playerEventObj->movementDirection); else - MachBikeTransition_FaceDirection(playerMapObj->placeholder18); + MachBikeTransition_FaceDirection(playerEventObj->movementDirection); } else { @@ -298,7 +297,7 @@ static u8 CheckMovementInputAcroBike(u8 *newDirection, u16 newKeys, u16 heldKeys static u8 AcroBikeHandleInputNormal(u8 *newDirection, u16 newKeys, u16 heldKeys) { - u8 direction = player_get_direction_upper_nybble(); + u8 direction = GetPlayerMovementDirection(); gPlayerAvatar.bikeFrameCounter = 0; if (*newDirection == DIR_NONE) @@ -351,7 +350,7 @@ static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys Bike_SetBikeStill(); return ACRO_TRANS_TURN_DIRECTION; } - direction = player_get_direction_upper_nybble(); + direction = GetPlayerMovementDirection(); if (*newDirection == AcroBike_GetJumpDirection()) { Bike_SetBikeStill(); // Bike_SetBikeStill sets speed to standing, but the next line immediately overrides it. could have just reset acroBikeState to 0 here instead of wasting a jump. @@ -378,10 +377,10 @@ static u8 AcroBikeHandleInputTurning(u8 *newDirection, u16 newKeys, u16 heldKeys static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 heldKeys) { u8 direction; - struct MapObject *playerMapObj; + struct EventObject *playerEventObj; - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + direction = GetPlayerMovementDirection(); + playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; gPlayerAvatar.runningState = NOT_MOVING; if (heldKeys & B_BUTTON) @@ -390,7 +389,7 @@ static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 { // B button was released. gPlayerAvatar.bikeFrameCounter = 0; - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + if (!MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior)) { // Go back to normal on flat ground *newDirection = direction; @@ -425,15 +424,15 @@ static u8 AcroBikeHandleInputWheelieStanding(u8 *newDirection, u16 newKeys, u16 static u8 AcroBikeHandleInputBunnyHop(u8 *newDirection, u16 newKeys, u16 heldKeys) { u8 direction; - struct MapObject *playerMapObj; + struct EventObject *playerEventObj; - direction = player_get_direction_upper_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + direction = GetPlayerMovementDirection(); + playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; if (!(heldKeys & B_BUTTON)) { // B button was released Bike_SetBikeStill(); - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + if (MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior)) { // even though B was released, dont undo the wheelie on the bumpy slope. gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; @@ -472,15 +471,15 @@ static u8 AcroBikeHandleInputBunnyHop(u8 *newDirection, u16 newKeys, u16 heldKey static u8 AcroBikeHandleInputWheelieMoving(u8 *newDirection, u16 newKeys, u16 heldKeys) { u8 direction; - struct MapObject *playerMapObj; + struct EventObject *playerEventObj; - direction = player_get_direction_lower_nybble(); - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + direction = GetPlayerFacingDirection(); + playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; if (!(heldKeys & B_BUTTON)) { // we were moving on a wheelie, but we let go while moving. reset bike still status Bike_SetBikeStill(); - if (!MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + if (!MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior)) { // we let go of B and arent on a bumpy slope, set state to normal because now we need to handle this gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; @@ -526,10 +525,10 @@ static u8 AcroBikeHandleInputWheelieMoving(u8 *newDirection, u16 newKeys, u16 he static u8 AcroBikeHandleInputSidewaysJump(u8 *ptr, u16 newKeys, u16 heldKeys) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - playerMapObj->mapobj_bit_9 = 0; - FieldObjectSetDirection(playerMapObj, playerMapObj->mapobj_unk_18); + playerEventObj->facingDirectionLocked = 0; + SetEventObjectDirection(playerEventObj, playerEventObj->facingDirection); gPlayerAvatar.acroBikeState = ACRO_STATE_NORMAL; return CheckMovementInputAcroBike(ptr, newKeys, heldKeys); } @@ -547,21 +546,21 @@ static void AcroBikeTransition_FaceDirection(u8 direction) static void AcroBikeTransition_TurnDirection(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) + direction = playerEventObj->movementDirection; PlayerFaceDirection(direction); } static void AcroBikeTransition_Moving(u8 direction) { u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) { - AcroBikeTransition_FaceDirection(playerMapObj->placeholder18); + AcroBikeTransition_FaceDirection(playerEventObj->movementDirection); return; } collision = get_some_collision(direction); @@ -582,48 +581,48 @@ static void AcroBikeTransition_Moving(u8 direction) static void AcroBikeTransition_NormalToWheelie(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) + direction = playerEventObj->movementDirection; PlayerStartWheelie(direction); } static void AcroBikeTransition_WheelieToNormal(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) + direction = playerEventObj->movementDirection; PlayerEndWheelie(direction); } static void AcroBikeTransition_WheelieIdle(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) + direction = playerEventObj->movementDirection; PlayerIdleWheelie(direction); } static void AcroBikeTransition_WheelieHoppingStanding(u8 direction) { - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) - direction = playerMapObj->placeholder18; + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) + direction = playerEventObj->movementDirection; PlayerStandingHoppingWheelie(direction); } static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) { u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) { - AcroBikeTransition_WheelieHoppingStanding(playerMapObj->placeholder18); + AcroBikeTransition_WheelieHoppingStanding(playerEventObj->movementDirection); return; } collision = get_some_collision(direction); @@ -653,7 +652,7 @@ static void AcroBikeTransition_WheelieHoppingMoving(u8 direction) static void AcroBikeTransition_SideJump(u8 direction) { u8 collision; - struct MapObject *playerMapObj; + struct EventObject *playerEventObj; collision = get_some_collision(direction); if (collision != 0) @@ -671,10 +670,10 @@ static void AcroBikeTransition_SideJump(u8 direction) return; } } - playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; PlaySE(SE_JITE_PYOKO); - playerMapObj->mapobj_bit_9 = 1; - PlayerSetAnimId(sub_8093514(direction), 2); + playerEventObj->facingDirectionLocked = 1; + PlayerSetAnimId(GetJumpMovementAction(direction), 2); } static void AcroBikeTransition_TurnJump(u8 direction) @@ -685,11 +684,11 @@ static void AcroBikeTransition_TurnJump(u8 direction) static void AcroBikeTransition_WheelieMoving(u8 direction) { u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) { - PlayerIdleWheelie(playerMapObj->placeholder18); + PlayerIdleWheelie(playerEventObj->movementDirection); return; } collision = get_some_collision(direction); @@ -705,7 +704,7 @@ static void AcroBikeTransition_WheelieMoving(u8 direction) } else if (collision <= 4) { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + if (MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior)) PlayerIdleWheelie(direction); else sub_808B980(direction); //hit wall? @@ -719,11 +718,11 @@ static void AcroBikeTransition_WheelieMoving(u8 direction) static void AcroBikeTransition_WheelieRisingMoving(u8 direction) { u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) { - PlayerStartWheelie(playerMapObj->placeholder18); + PlayerStartWheelie(playerEventObj->movementDirection); return; } collision = get_some_collision(direction); @@ -739,7 +738,7 @@ static void AcroBikeTransition_WheelieRisingMoving(u8 direction) } else if (collision <= 4) { - if (MetatileBehavior_IsBumpySlope(playerMapObj->mapobj_unk_1E)) + if (MetatileBehavior_IsBumpySlope(playerEventObj->currentMetatileBehavior)) PlayerIdleWheelie(direction); else sub_808B980(direction); //hit wall? @@ -753,11 +752,11 @@ static void AcroBikeTransition_WheelieRisingMoving(u8 direction) static void AcroBikeTransition_WheelieLoweringMoving(u8 direction) { u8 collision; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (CanBikeFaceDirOnMetatile(direction, playerMapObj->mapobj_unk_1E) == 0) + if (CanBikeFaceDirOnMetatile(direction, playerEventObj->currentMetatileBehavior) == 0) { - PlayerEndWheelie(playerMapObj->placeholder18); + PlayerEndWheelie(playerEventObj->movementDirection); return; } collision = get_some_collision(direction); @@ -882,18 +881,18 @@ static u8 get_some_collision(u8 direction) s16 x; s16 y; u8 metatitleBehavior; - struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerEventObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - x = playerMapObj->coords2.x; - y = playerMapObj->coords2.y; + x = playerEventObj->currentCoords.x; + y = playerEventObj->currentCoords.y; MoveCoords(direction, &x, &y); metatitleBehavior = MapGridGetMetatileBehaviorAt(x, y); - return Bike_CheckCollisionTryAdvanceCollisionCount(playerMapObj, x, y, direction, metatitleBehavior); + return Bike_CheckCollisionTryAdvanceCollisionCount(playerEventObj, x, y, direction, metatitleBehavior); } -static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) +static u8 Bike_CheckCollisionTryAdvanceCollisionCount(struct EventObject *eventObject, s16 x, s16 y, u8 direction, u8 metatitleBehavior) { - u8 collision = CheckForFieldObjectCollision(mapObject, x, y, direction, metatitleBehavior); + u8 collision = CheckForEventObjectCollision(eventObject, x, y, direction, metatitleBehavior); if (collision > 4) return collision; @@ -981,7 +980,7 @@ bool8 IsBikingDisallowedByPlayer(void) bool8 player_should_look_direction_be_enforced_upon_movement(void) { - if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) != FALSE) + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE) != FALSE && MetatileBehavior_IsBumpySlope(gEventObjects[gPlayerAvatar.eventObjectId].currentMetatileBehavior) != FALSE) return FALSE; else return TRUE; @@ -989,7 +988,7 @@ bool8 player_should_look_direction_be_enforced_upon_movement(void) void GetOnOffBike(u8 transitionFlags) { - gUnknown_02037348 = FALSE; + gUnusedBikeCameraAheadPanback = FALSE; if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) { @@ -1064,7 +1063,7 @@ void Bike_HandleBumpySlopeJump(void) if (MetatileBehavior_IsBumpySlope(tileBehavior)) { gPlayerAvatar.acroBikeState = ACRO_STATE_WHEELIE_STANDING; - sub_808C1B4(player_get_direction_upper_nybble()); + sub_808C1B4(GetPlayerMovementDirection()); } } } diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c index 35277fe87..b7ed1f713 100644 --- a/src/braille_puzzles.c +++ b/src/braille_puzzles.c @@ -7,6 +7,7 @@ #include "task.h" #include "field_effect.h" #include "constants/flags.h" +#include "constants/maps.h" extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap extern void DrawWholeMapView(); // field_camera @@ -14,7 +15,6 @@ extern void SetCameraPanningCallback(void ( *callback)()); // field_camera extern void InstallCameraPanAheadCallback(void); extern void SetCameraPanning(s16 x, s16 y); extern u8 GetCursorSelectionMonId(void); -extern void FieldEffectActiveListRemove(u8 id); // field_effect extern u8 oei_task_add(void); // why do this, GF? @@ -24,7 +24,8 @@ enum FLY_PUZZLE }; -extern u8 gBraillePuzzleCallbackFlag; +EWRAM_DATA static u8 sBraillePuzzleCallbackFlag = 0; + extern const u8 gUnknown_085EFE74[][2]; void SealedChamberShakingEffect(u8); @@ -205,14 +206,25 @@ void SealedChamberShakingEffect(u8 taskId) // moved later in the function because it was rewritten. bool8 ShouldDoBrailleStrengthEffect(void) { - if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x06)) + if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(DESERT_RUINS) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(DESERT_RUINS)) { if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23) - { gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; } + { + sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; + return TRUE; + } else if (gSaveBlock1Ptr->pos.x == 5 && gSaveBlock1Ptr->pos.y == 23) - { gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; } + { + sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; + return TRUE; + } else if (gSaveBlock1Ptr->pos.x == 7 && gSaveBlock1Ptr->pos.y == 23) - { gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; } + { + sBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; + return TRUE; + } } return FALSE; @@ -249,7 +261,7 @@ bool8 ShouldDoBrailleFlyEffect(void) if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x44)) { if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 25) - { gBraillePuzzleCallbackFlag = FLY_PUZZLE; return TRUE; } + { sBraillePuzzleCallbackFlag = FLY_PUZZLE; return TRUE; } } return FALSE; } @@ -362,7 +374,7 @@ bool8 FldEff_UsePuzzleEffect(void) { u8 taskId = oei_task_add(); - if (gBraillePuzzleCallbackFlag == FLY_PUZZLE) + if (sBraillePuzzleCallbackFlag == FLY_PUZZLE) { gTasks[taskId].data[8] = (u32)UseFlyAncientTomb_Callback >> 16; gTasks[taskId].data[9] = (u32)UseFlyAncientTomb_Callback; diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c index ca2037d2f..266ea8250 100644 --- a/src/clear_save_data_screen.c +++ b/src/clear_save_data_screen.c @@ -202,6 +202,6 @@ static void InitClearSaveDataScreenWindows(void) InitWindows(sClearSaveTextWindow); DeactivateAllTextPrinters(); FillWindowPixelBuffer(0, 0); - sub_80987D4(0, 0, 2, 224); + LoadWindowGfx(0, 0, 2, 224); LoadPalette(gUnknown_0860F074, 0xF0, 0x20); } diff --git a/src/clock.c b/src/clock.c index 71c433ed2..91eb5f16d 100644 --- a/src/clock.c +++ b/src/clock.c @@ -83,11 +83,11 @@ static void UpdatePerMinute(struct Time *localTime) static void ReturnFromStartWallClock(void) { InitTimeBasedEvents(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } void StartWallClock(void) { - SetMainCallback2(Cb2_StartWallClock); + SetMainCallback2(CB2_StartWallClock); gMain.savedCallback = ReturnFromStartWallClock; } diff --git a/src/credits.c b/src/credits.c index 168f3e8a3..a88e4b549 100644 --- a/src/credits.c +++ b/src/credits.c @@ -2285,7 +2285,7 @@ static void sub_81772B8(struct Sprite *sprite) static void sub_8177388(void) { - u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_FIRST_POKE))); + u16 starter = SpeciesToNationalPokedexNum(GetStarterPokemon(VarGet(VAR_STARTER_MON))); u16 page; u16 dexNum; u16 j; diff --git a/src/data/field_event_obj/base_oam.h b/src/data/field_event_obj/base_oam.h new file mode 100755 index 000000000..1aa6987c3 --- /dev/null +++ b/src/data/field_event_obj/base_oam.h @@ -0,0 +1,52 @@ +#ifndef GUARD_BASE_OAM_H +#define GUARD_BASE_OAM_H + +const struct OamData gEventObjectBaseOam_8x8 = { + .shape = 0, + .size = 0, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_16x8 = { + .shape = 1, + .size = 0, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_16x16 = { + .shape = 0, + .size = 1, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_32x8 = { + .shape = 1, + .size = 1, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_64x32 = { + .shape = 1, + .size = 3, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_16x32 = { + .shape = 2, + .size = 2, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_32x32 = { + .shape = 0, + .size = 2, + .priority = 2 +}; + +const struct OamData gEventObjectBaseOam_64x64 = { + .shape = 0, + .size = 3, + .priority = 2 +}; + +#endif //GUARD_BASE_OAM_H diff --git a/src/data/field_event_obj/berry_tree_graphics_tables.h b/src/data/field_event_obj/berry_tree_graphics_tables.h new file mode 100755 index 000000000..31d515a82 --- /dev/null +++ b/src/data/field_event_obj/berry_tree_graphics_tables.h @@ -0,0 +1,570 @@ +#ifndef GUARD_BERRY_TREE_GRAPHICS_TABLES_H +#define GUARD_BERRY_TREE_GRAPHICS_TABLES_H + +const struct SpriteFrameImage gEventObjectPicTable_PechaBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_PechaBerryTree_0), + obj_frame_tiles(gEventObjectPic_PechaBerryTree_1), + obj_frame_tiles(gEventObjectPic_PechaBerryTree_2), + obj_frame_tiles(gEventObjectPic_PechaBerryTree_3), + obj_frame_tiles(gEventObjectPic_PechaBerryTree_4), + obj_frame_tiles(gEventObjectPic_PechaBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Pecha[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_KelpsyBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_0), + obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_1), + obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_2), + obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_3), + obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_4), + obj_frame_tiles(gEventObjectPic_KelpsyBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Kelpsy[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_WepearBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_WepearBerryTree_0), + obj_frame_tiles(gEventObjectPic_WepearBerryTree_1), + obj_frame_tiles(gEventObjectPic_WepearBerryTree_2), + obj_frame_tiles(gEventObjectPic_WepearBerryTree_3), + obj_frame_tiles(gEventObjectPic_WepearBerryTree_4), + obj_frame_tiles(gEventObjectPic_WepearBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Wepear[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_IapapaBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_IapapaBerryTree_0), + obj_frame_tiles(gEventObjectPic_IapapaBerryTree_1), + obj_frame_tiles(gEventObjectPic_IapapaBerryTree_2), + obj_frame_tiles(gEventObjectPic_IapapaBerryTree_3), + obj_frame_tiles(gEventObjectPic_IapapaBerryTree_4), + obj_frame_tiles(gEventObjectPic_IapapaBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Iapapa[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_CheriBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_CheriBerryTree_0), + obj_frame_tiles(gEventObjectPic_CheriBerryTree_1), + obj_frame_tiles(gEventObjectPic_CheriBerryTree_2), + obj_frame_tiles(gEventObjectPic_CheriBerryTree_3), + obj_frame_tiles(gEventObjectPic_CheriBerryTree_4), + obj_frame_tiles(gEventObjectPic_CheriBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Cheri[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_FigyBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_FigyBerryTree_0), + obj_frame_tiles(gEventObjectPic_FigyBerryTree_1), + obj_frame_tiles(gEventObjectPic_FigyBerryTree_2), + obj_frame_tiles(gEventObjectPic_FigyBerryTree_3), + obj_frame_tiles(gEventObjectPic_FigyBerryTree_4), + obj_frame_tiles(gEventObjectPic_FigyBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Figy[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_MagoBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_MagoBerryTree_0), + obj_frame_tiles(gEventObjectPic_MagoBerryTree_1), + obj_frame_tiles(gEventObjectPic_MagoBerryTree_2), + obj_frame_tiles(gEventObjectPic_MagoBerryTree_3), + obj_frame_tiles(gEventObjectPic_MagoBerryTree_4), + obj_frame_tiles(gEventObjectPic_MagoBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Mago[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_LumBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_LumBerryTree_0), + obj_frame_tiles(gEventObjectPic_LumBerryTree_1), + obj_frame_tiles(gEventObjectPic_LumBerryTree_2), + obj_frame_tiles(gEventObjectPic_LumBerryTree_3), + obj_frame_tiles(gEventObjectPic_LumBerryTree_4), + obj_frame_tiles(gEventObjectPic_LumBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Lum[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_RazzBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_RazzBerryTree_0), + obj_frame_tiles(gEventObjectPic_RazzBerryTree_1), + obj_frame_tiles(gEventObjectPic_RazzBerryTree_2), + obj_frame_tiles(gEventObjectPic_RazzBerryTree_3), + obj_frame_tiles(gEventObjectPic_RazzBerryTree_4), + obj_frame_tiles(gEventObjectPic_RazzBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Razz[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_GrepaBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_GrepaBerryTree_0), + obj_frame_tiles(gEventObjectPic_GrepaBerryTree_1), + obj_frame_tiles(gEventObjectPic_GrepaBerryTree_2), + obj_frame_tiles(gEventObjectPic_GrepaBerryTree_3), + obj_frame_tiles(gEventObjectPic_GrepaBerryTree_4), + obj_frame_tiles(gEventObjectPic_GrepaBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Grepa[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_RabutaBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_RabutaBerryTree_0), + obj_frame_tiles(gEventObjectPic_RabutaBerryTree_1), + obj_frame_tiles(gEventObjectPic_RabutaBerryTree_2), + obj_frame_tiles(gEventObjectPic_RabutaBerryTree_3), + obj_frame_tiles(gEventObjectPic_RabutaBerryTree_4), + obj_frame_tiles(gEventObjectPic_RabutaBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Rabuta[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_NomelBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_NomelBerryTree_0), + obj_frame_tiles(gEventObjectPic_NomelBerryTree_1), + obj_frame_tiles(gEventObjectPic_NomelBerryTree_2), + obj_frame_tiles(gEventObjectPic_NomelBerryTree_3), + obj_frame_tiles(gEventObjectPic_NomelBerryTree_4), + obj_frame_tiles(gEventObjectPic_NomelBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Nomel[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_LeppaBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_LeppaBerryTree_0), + obj_frame_tiles(gEventObjectPic_LeppaBerryTree_1), + obj_frame_tiles(gEventObjectPic_LeppaBerryTree_2), + obj_frame_tiles(gEventObjectPic_LeppaBerryTree_3), + obj_frame_tiles(gEventObjectPic_LeppaBerryTree_4), + obj_frame_tiles(gEventObjectPic_LeppaBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Leppa[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_LiechiBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_LiechiBerryTree_0), + obj_frame_tiles(gEventObjectPic_LiechiBerryTree_1), + obj_frame_tiles(gEventObjectPic_LiechiBerryTree_2), + obj_frame_tiles(gEventObjectPic_LiechiBerryTree_3), + obj_frame_tiles(gEventObjectPic_LiechiBerryTree_4), + obj_frame_tiles(gEventObjectPic_LiechiBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Liechi[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_HondewBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_HondewBerryTree_0), + obj_frame_tiles(gEventObjectPic_HondewBerryTree_1), + obj_frame_tiles(gEventObjectPic_HondewBerryTree_2), + obj_frame_tiles(gEventObjectPic_HondewBerryTree_3), + obj_frame_tiles(gEventObjectPic_HondewBerryTree_4), + obj_frame_tiles(gEventObjectPic_HondewBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Hondew[] = {3, 4, 5, 5, 5}; + +const struct SpriteFrameImage gEventObjectPicTable_AguavBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_AguavBerryTree_0), + obj_frame_tiles(gEventObjectPic_AguavBerryTree_1), + obj_frame_tiles(gEventObjectPic_AguavBerryTree_2), + obj_frame_tiles(gEventObjectPic_AguavBerryTree_3), + obj_frame_tiles(gEventObjectPic_AguavBerryTree_4), + obj_frame_tiles(gEventObjectPic_AguavBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Aguav[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_WikiBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_WikiBerryTree_0), + obj_frame_tiles(gEventObjectPic_WikiBerryTree_1), + obj_frame_tiles(gEventObjectPic_WikiBerryTree_2), + obj_frame_tiles(gEventObjectPic_WikiBerryTree_3), + obj_frame_tiles(gEventObjectPic_WikiBerryTree_4), + obj_frame_tiles(gEventObjectPic_WikiBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Wiki[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_PomegBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_PomegBerryTree_0), + obj_frame_tiles(gEventObjectPic_PomegBerryTree_1), + obj_frame_tiles(gEventObjectPic_PomegBerryTree_2), + obj_frame_tiles(gEventObjectPic_PomegBerryTree_3), + obj_frame_tiles(gEventObjectPic_PomegBerryTree_4), + obj_frame_tiles(gEventObjectPic_PomegBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Pomeg[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_RawstBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_RawstBerryTree_0), + obj_frame_tiles(gEventObjectPic_RawstBerryTree_1), + obj_frame_tiles(gEventObjectPic_RawstBerryTree_2), + obj_frame_tiles(gEventObjectPic_RawstBerryTree_3), + obj_frame_tiles(gEventObjectPic_RawstBerryTree_4), + obj_frame_tiles(gEventObjectPic_RawstBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Rawst[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_SpelonBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_SpelonBerryTree_0), + obj_frame_tiles(gEventObjectPic_SpelonBerryTree_1), + obj_frame_tiles(gEventObjectPic_SpelonBerryTree_2), + obj_frame_tiles(gEventObjectPic_SpelonBerryTree_3), + obj_frame_tiles(gEventObjectPic_SpelonBerryTree_4), + obj_frame_tiles(gEventObjectPic_SpelonBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Spelon[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_ChestoBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_ChestoBerryTree_0), + obj_frame_tiles(gEventObjectPic_ChestoBerryTree_1), + obj_frame_tiles(gEventObjectPic_ChestoBerryTree_2), + obj_frame_tiles(gEventObjectPic_ChestoBerryTree_3), + obj_frame_tiles(gEventObjectPic_ChestoBerryTree_4), + obj_frame_tiles(gEventObjectPic_ChestoBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Chesto[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_OranBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_OranBerryTree_0), + obj_frame_tiles(gEventObjectPic_OranBerryTree_1), + obj_frame_tiles(gEventObjectPic_OranBerryTree_2), + obj_frame_tiles(gEventObjectPic_OranBerryTree_3), + obj_frame_tiles(gEventObjectPic_OranBerryTree_4), + obj_frame_tiles(gEventObjectPic_OranBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Oran[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_PersimBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_PersimBerryTree_0), + obj_frame_tiles(gEventObjectPic_PersimBerryTree_1), + obj_frame_tiles(gEventObjectPic_PersimBerryTree_2), + obj_frame_tiles(gEventObjectPic_PersimBerryTree_3), + obj_frame_tiles(gEventObjectPic_PersimBerryTree_4), + obj_frame_tiles(gEventObjectPic_PersimBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Persim[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_SitrusBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_SitrusBerryTree_0), + obj_frame_tiles(gEventObjectPic_SitrusBerryTree_1), + obj_frame_tiles(gEventObjectPic_SitrusBerryTree_2), + obj_frame_tiles(gEventObjectPic_SitrusBerryTree_3), + obj_frame_tiles(gEventObjectPic_SitrusBerryTree_4), + obj_frame_tiles(gEventObjectPic_SitrusBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Sitrus[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_AspearBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_AspearBerryTree_0), + obj_frame_tiles(gEventObjectPic_AspearBerryTree_1), + obj_frame_tiles(gEventObjectPic_AspearBerryTree_2), + obj_frame_tiles(gEventObjectPic_AspearBerryTree_3), + obj_frame_tiles(gEventObjectPic_AspearBerryTree_4), + obj_frame_tiles(gEventObjectPic_AspearBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Aspear[] = {3, 4, 3, 3, 3}; + +const struct SpriteFrameImage gEventObjectPicTable_PamtreBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_PamtreBerryTree_0), + obj_frame_tiles(gEventObjectPic_PamtreBerryTree_1), + obj_frame_tiles(gEventObjectPic_PamtreBerryTree_2), + obj_frame_tiles(gEventObjectPic_PamtreBerryTree_3), + obj_frame_tiles(gEventObjectPic_PamtreBerryTree_4), + obj_frame_tiles(gEventObjectPic_PamtreBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Pamtre[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_CornnBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_CornnBerryTree_0), + obj_frame_tiles(gEventObjectPic_CornnBerryTree_1), + obj_frame_tiles(gEventObjectPic_CornnBerryTree_2), + obj_frame_tiles(gEventObjectPic_CornnBerryTree_3), + obj_frame_tiles(gEventObjectPic_CornnBerryTree_4), + obj_frame_tiles(gEventObjectPic_CornnBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Cornn[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_LansatBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_LansatBerryTree_0), + obj_frame_tiles(gEventObjectPic_LansatBerryTree_1), + obj_frame_tiles(gEventObjectPic_LansatBerryTree_2), + obj_frame_tiles(gEventObjectPic_LansatBerryTree_3), + obj_frame_tiles(gEventObjectPic_LansatBerryTree_4), + obj_frame_tiles(gEventObjectPic_LansatBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Lansat[] = {3, 4, 2, 2, 2}; + +const struct SpriteFrameImage gEventObjectPicTable_DurinBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_DurinBerryTree_0), + obj_frame_tiles(gEventObjectPic_DurinBerryTree_1), + obj_frame_tiles(gEventObjectPic_DurinBerryTree_2), + obj_frame_tiles(gEventObjectPic_DurinBerryTree_3), + obj_frame_tiles(gEventObjectPic_DurinBerryTree_4), + obj_frame_tiles(gEventObjectPic_DurinBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Durin[] = {3, 4, 4, 4, 4}; + +const struct SpriteFrameImage gEventObjectPicTable_TamatoBerryTree[] = { + obj_frame_tiles(gEventObjectPic_BerryTreeDirtPile), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_0), + obj_frame_tiles(gEventObjectPic_BerryTreeSprout_1), + obj_frame_tiles(gEventObjectPic_TamatoBerryTree_0), + obj_frame_tiles(gEventObjectPic_TamatoBerryTree_1), + obj_frame_tiles(gEventObjectPic_TamatoBerryTree_2), + obj_frame_tiles(gEventObjectPic_TamatoBerryTree_3), + obj_frame_tiles(gEventObjectPic_TamatoBerryTree_4), + obj_frame_tiles(gEventObjectPic_TamatoBerryTree_5), +}; + +const u8 gBerryTreePaletteSlotTable_Tamato[] = {3, 4, 2, 2, 2}; + +const u8 gDeadBerryTreeEventObjectGraphicsIdTable[] = {EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES}; + +const u8 gBerryTreeEventObjectGraphicsIdTable[] = {EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES, EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES, EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES, EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES}; + +const struct SpriteFrameImage *const gBerryTreePicTablePointers[] = { + gEventObjectPicTable_CheriBerryTree, + gEventObjectPicTable_ChestoBerryTree, + gEventObjectPicTable_PechaBerryTree, + gEventObjectPicTable_RawstBerryTree, + gEventObjectPicTable_AspearBerryTree, + gEventObjectPicTable_LeppaBerryTree, + gEventObjectPicTable_OranBerryTree, + gEventObjectPicTable_PersimBerryTree, + gEventObjectPicTable_LumBerryTree, + gEventObjectPicTable_SitrusBerryTree, + gEventObjectPicTable_FigyBerryTree, + gEventObjectPicTable_WikiBerryTree, + gEventObjectPicTable_MagoBerryTree, + gEventObjectPicTable_AguavBerryTree, + gEventObjectPicTable_IapapaBerryTree, + gEventObjectPicTable_RazzBerryTree, + gEventObjectPicTable_RazzBerryTree, + gEventObjectPicTable_MagoBerryTree, + gEventObjectPicTable_WepearBerryTree, + gEventObjectPicTable_IapapaBerryTree, + gEventObjectPicTable_PomegBerryTree, + gEventObjectPicTable_KelpsyBerryTree, + gEventObjectPicTable_WepearBerryTree, + gEventObjectPicTable_HondewBerryTree, + gEventObjectPicTable_GrepaBerryTree, + gEventObjectPicTable_TamatoBerryTree, + gEventObjectPicTable_CornnBerryTree, + gEventObjectPicTable_PomegBerryTree, + gEventObjectPicTable_RabutaBerryTree, + gEventObjectPicTable_NomelBerryTree, + gEventObjectPicTable_SpelonBerryTree, + gEventObjectPicTable_PamtreBerryTree, + gEventObjectPicTable_RabutaBerryTree, + gEventObjectPicTable_DurinBerryTree, + gEventObjectPicTable_HondewBerryTree, + gEventObjectPicTable_LiechiBerryTree, + gEventObjectPicTable_HondewBerryTree, + gEventObjectPicTable_AguavBerryTree, + gEventObjectPicTable_PomegBerryTree, + gEventObjectPicTable_GrepaBerryTree, + gEventObjectPicTable_LansatBerryTree, + gEventObjectPicTable_CornnBerryTree, + gEventObjectPicTable_DurinBerryTree, +}; + +const u8 *const gBerryTreePaletteSlotTablePointers[] = { + gBerryTreePaletteSlotTable_Cheri, + gBerryTreePaletteSlotTable_Chesto, + gBerryTreePaletteSlotTable_Pecha, + gBerryTreePaletteSlotTable_Rawst, + gBerryTreePaletteSlotTable_Aspear, + gBerryTreePaletteSlotTable_Leppa, + gBerryTreePaletteSlotTable_Oran, + gBerryTreePaletteSlotTable_Persim, + gBerryTreePaletteSlotTable_Lum, + gBerryTreePaletteSlotTable_Sitrus, + gBerryTreePaletteSlotTable_Figy, + gBerryTreePaletteSlotTable_Wiki, + gBerryTreePaletteSlotTable_Mago, + gBerryTreePaletteSlotTable_Aguav, + gBerryTreePaletteSlotTable_Iapapa, + gBerryTreePaletteSlotTable_Razz, + gBerryTreePaletteSlotTable_Razz, + gBerryTreePaletteSlotTable_Mago, + gBerryTreePaletteSlotTable_Wepear, + gBerryTreePaletteSlotTable_Iapapa, + gBerryTreePaletteSlotTable_Pomeg, + gBerryTreePaletteSlotTable_Kelpsy, + gBerryTreePaletteSlotTable_Wepear, + gBerryTreePaletteSlotTable_Hondew, + gBerryTreePaletteSlotTable_Grepa, + gBerryTreePaletteSlotTable_Tamato, + gBerryTreePaletteSlotTable_Cornn, + gBerryTreePaletteSlotTable_Pomeg, + gBerryTreePaletteSlotTable_Rabuta, + gBerryTreePaletteSlotTable_Nomel, + gBerryTreePaletteSlotTable_Spelon, + gBerryTreePaletteSlotTable_Pamtre, + gBerryTreePaletteSlotTable_Rabuta, + gBerryTreePaletteSlotTable_Durin, + gBerryTreePaletteSlotTable_Hondew, + gBerryTreePaletteSlotTable_Liechi, + gBerryTreePaletteSlotTable_Hondew, + gBerryTreePaletteSlotTable_Aguav, + gBerryTreePaletteSlotTable_Pomeg, + gBerryTreePaletteSlotTable_Grepa, + gBerryTreePaletteSlotTable_Lansat, + gBerryTreePaletteSlotTable_Cornn, + gBerryTreePaletteSlotTable_Durin, +}; + +const u8 *const gBerryTreeEventObjectGraphicsIdTablePointers[] = { + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, + gBerryTreeEventObjectGraphicsIdTable, +}; + + +#endif //GUARD_BERRY_TREE_GRAPHICS_TABLES_H diff --git a/src/data/field_event_obj/event_object_anims.h b/src/data/field_event_obj/event_object_anims.h new file mode 100755 index 000000000..9b897651d --- /dev/null +++ b/src/data/field_event_obj/event_object_anims.h @@ -0,0 +1,1176 @@ +#ifndef GUARD_EVENT_OBJECT_ANIMS_H +#define GUARD_EVENT_OBJECT_ANIMS_H + +const union AnimCmd gEventObjectImageAnim_StayStill[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceSouth[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceNorth[] = +{ + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceWest[] = +{ + ANIMCMD_FRAME(2, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpFaceEast[] = +{ + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoSouth[] = +{ + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(3, 8, .hFlip = TRUE), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoNorth[] = +{ + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(4, 8, .hFlip = TRUE), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoWest[] = +{ + ANIMCMD_FRAME(5, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoEast[] = +{ + ANIMCMD_FRAME(5, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(6, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastSouth[] = +{ + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(3, 4, .hFlip = TRUE), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastNorth[] = +{ + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(4, 4, .hFlip = TRUE), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastWest[] = +{ + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastEast[] = +{ + ANIMCMD_FRAME(5, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(6, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterSouth[] = +{ + ANIMCMD_FRAME(3, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(3, 2, .hFlip = TRUE), + ANIMCMD_FRAME(0, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterNorth[] = +{ + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(4, 2, .hFlip = TRUE), + ANIMCMD_FRAME(1, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterWest[] = +{ + ANIMCMD_FRAME(5, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_FRAME(6, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFasterEast[] = +{ + ANIMCMD_FRAME(5, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_FRAME(6, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestSouth[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(3, 1, .hFlip = TRUE), + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestNorth[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(4, 1, .hFlip = TRUE), + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestWest[] = +{ + ANIMCMD_FRAME(5, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(6, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_QuintyPlumpGoFastestEast[] = +{ + ANIMCMD_FRAME(5, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_FRAME(6, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_FaceSouth[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_FaceNorth[] = +{ + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_FaceWest[] = +{ + ANIMCMD_FRAME(2, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_FaceEast[] = +{ + ANIMCMD_FRAME(2, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoSouth[] = +{ + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoNorth[] = +{ + ANIMCMD_FRAME(5, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(6, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoWest[] = +{ + ANIMCMD_FRAME(7, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(8, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoEast[] = +{ + ANIMCMD_FRAME(7, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(8, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastSouth[] = +{ + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastNorth[] = +{ + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastWest[] = +{ + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastEast[] = +{ + ANIMCMD_FRAME(7, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(8, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFasterSouth[] = +{ + ANIMCMD_FRAME(3, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(4, 2), + ANIMCMD_FRAME(0, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFasterNorth[] = +{ + ANIMCMD_FRAME(5, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_FRAME(6, 2), + ANIMCMD_FRAME(1, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFasterWest[] = +{ + ANIMCMD_FRAME(7, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_FRAME(8, 2), + ANIMCMD_FRAME(2, 2), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFasterEast[] = +{ + ANIMCMD_FRAME(7, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_FRAME(8, 2, .hFlip = TRUE), + ANIMCMD_FRAME(2, 2, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastestSouth[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_FRAME(4, 1), + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastestNorth[] = +{ + ANIMCMD_FRAME(5, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_FRAME(6, 1), + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastestWest[] = +{ + ANIMCMD_FRAME(7, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_FRAME(8, 1), + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GoFastestEast[] = +{ + ANIMCMD_FRAME(7, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_FRAME(8, 1, .hFlip = TRUE), + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_RunSouth[] = +{ + ANIMCMD_FRAME(12, 5), + ANIMCMD_FRAME(9, 3), + ANIMCMD_FRAME(13, 5), + ANIMCMD_FRAME(9, 3), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_RunNorth[] = +{ + ANIMCMD_FRAME(14, 5), + ANIMCMD_FRAME(10, 3), + ANIMCMD_FRAME(15, 5), + ANIMCMD_FRAME(10, 3), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_RunWest[] = +{ + ANIMCMD_FRAME(16, 5), + ANIMCMD_FRAME(11, 3), + ANIMCMD_FRAME(17, 5), + ANIMCMD_FRAME(11, 3), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_RunEast[] = +{ + ANIMCMD_FRAME(16, 5, .hFlip = TRUE), + ANIMCMD_FRAME(11, 3, .hFlip = TRUE), + ANIMCMD_FRAME(17, 5, .hFlip = TRUE), + ANIMCMD_FRAME(11, 3, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_FieldMove[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobSouth[] = +{ + ANIMCMD_FRAME(9, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobNorth[] = +{ + ANIMCMD_FRAME(10, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobWest[] = +{ + ANIMCMD_FRAME(11, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_GetOnOffSurfBlobEast[] = +{ + ANIMCMD_FRAME(11, 32, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelSouth[] = +{ + ANIMCMD_FRAME(9, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelNorth[] = +{ + ANIMCMD_FRAME(13, 4), + ANIMCMD_FRAME(14, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelWest[] = +{ + ANIMCMD_FRAME(17, 4), + ANIMCMD_FRAME(18, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyBackWheelEast[] = +{ + ANIMCMD_FRAME(17, 4, .hFlip = TRUE), + ANIMCMD_FRAME(18, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelSouth[] = +{ + ANIMCMD_FRAME(11, 4), + ANIMCMD_FRAME(12, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelNorth[] = +{ + ANIMCMD_FRAME(15, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelWest[] = +{ + ANIMCMD_FRAME(19, 4), + ANIMCMD_FRAME(20, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BunnyHoppyFrontWheelEast[] = +{ + ANIMCMD_FRAME(19, 4, .hFlip = TRUE), + ANIMCMD_FRAME(20, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelSouth[] = +{ + ANIMCMD_FRAME(9, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelNorth[] = +{ + ANIMCMD_FRAME(13, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelWest[] = +{ + ANIMCMD_FRAME(17, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieBackWheelEast[] = +{ + ANIMCMD_FRAME(17, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelSouth[] = +{ + ANIMCMD_FRAME(11, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelNorth[] = +{ + ANIMCMD_FRAME(15, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelWest[] = +{ + ANIMCMD_FRAME(19, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_StandingWheelieFrontWheelEast[] = +{ + ANIMCMD_FRAME(19, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_MovingWheelieSouth[] = +{ + ANIMCMD_FRAME(21, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_FRAME(22, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_MovingWheelieNorth[] = +{ + ANIMCMD_FRAME(23, 4), + ANIMCMD_FRAME(14, 4), + ANIMCMD_FRAME(24, 4), + ANIMCMD_FRAME(14, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_MovingWheelieWest[] = +{ + ANIMCMD_FRAME(25, 4), + ANIMCMD_FRAME(18, 4), + ANIMCMD_FRAME(26, 4), + ANIMCMD_FRAME(18, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_MovingWheelieEast[] = +{ + ANIMCMD_FRAME(25, 4, .hFlip = TRUE), + ANIMCMD_FRAME(18, 4, .hFlip = TRUE), + ANIMCMD_FRAME(26, 4, .hFlip = TRUE), + ANIMCMD_FRAME(18, 4, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_BerryTreeStage0[] = +{ + ANIMCMD_FRAME(0, 32), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BerryTreeStage1[] = +{ + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(2, 32), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BerryTreeStage2[] = +{ + ANIMCMD_FRAME(3, 48), + ANIMCMD_FRAME(4, 48), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BerryTreeStage3[] = +{ + ANIMCMD_FRAME(5, 32), + ANIMCMD_FRAME(5, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_BerryTreeStage4[] = +{ + ANIMCMD_FRAME(7, 48), + ANIMCMD_FRAME(7, 48), + ANIMCMD_FRAME(8, 48), + ANIMCMD_FRAME(8, 48), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_NurseBow[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(9, 32), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_RockBreak[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_TreeCut[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_TakeOutRodSouth[] = +{ + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(9, 4), + ANIMCMD_FRAME(10, 4), + ANIMCMD_FRAME(11, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_TakeOutRodNorth[] = +{ + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_TakeOutRodWest[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_TakeOutRodEast[] = +{ + ANIMCMD_FRAME(0, 4, .hFlip = TRUE), + ANIMCMD_FRAME(1, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(3, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_PutAwayRodSouth[] = +{ + ANIMCMD_FRAME(11, 4), + ANIMCMD_FRAME(10, 6), + ANIMCMD_FRAME(9, 6), + ANIMCMD_FRAME(8, 6), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_PutAwayRodNorth[] = +{ + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(6, 6), + ANIMCMD_FRAME(5, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_PutAwayRodWest[] = +{ + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_PutAwayRodEast[] = +{ + ANIMCMD_FRAME(3, 4, .hFlip = TRUE), + ANIMCMD_FRAME(2, 4, .hFlip = TRUE), + ANIMCMD_FRAME(1, 4, .hFlip = TRUE), + ANIMCMD_FRAME(0, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_HookedPokemonSouth[] = +{ + ANIMCMD_FRAME(10, 6), + ANIMCMD_FRAME(11, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(11, 30), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_HookedPokemonNorth[] = +{ + ANIMCMD_FRAME(6, 6), + ANIMCMD_FRAME(7, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(7, 30), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_HookedPokemonWest[] = +{ + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(3, 30), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_HookedPokemonEast[] = +{ + ANIMCMD_FRAME(2, 6, .hFlip = TRUE), + ANIMCMD_FRAME(3, 6, .hFlip = TRUE), + ANIMCMD_LOOP(1), + ANIMCMD_FRAME(3, 30, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd gEventObjectRotScalAnim_8508FD8[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_LOOP(7), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd gEventObjectRotScalAnim_8509008[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_LOOP(15), + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_LOOP(15), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd gEventObjectRotScalAnim_8509040[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 10, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gEventObjectRotScalAnim_8509050[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 10, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gEventObjectRotScalAnim_8509060[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 1), + AFFINEANIMCMD_LOOP(8), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gEventObjectRotScalAnim_8509078[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 1), + AFFINEANIMCMD_LOOP(8), + AFFINEANIMCMD_END, +}; + +const union AnimCmd gEventObjectImageAnim_HoOhFlapWings[] = +{ + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_HoOhStayStill[] = +{ + ANIMCMD_FRAME(3, 16), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Inanimate[] = { + gEventObjectImageAnim_StayStill, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_QuintyPlump[] = { + gEventObjectImageAnim_QuintyPlumpFaceSouth, + gEventObjectImageAnim_QuintyPlumpFaceNorth, + gEventObjectImageAnim_QuintyPlumpFaceWest, + gEventObjectImageAnim_QuintyPlumpFaceEast, + gEventObjectImageAnim_QuintyPlumpGoSouth, + gEventObjectImageAnim_QuintyPlumpGoNorth, + gEventObjectImageAnim_QuintyPlumpGoWest, + gEventObjectImageAnim_QuintyPlumpGoEast, + gEventObjectImageAnim_QuintyPlumpGoFastSouth, + gEventObjectImageAnim_QuintyPlumpGoFastNorth, + gEventObjectImageAnim_QuintyPlumpGoFastWest, + gEventObjectImageAnim_QuintyPlumpGoFastEast, + gEventObjectImageAnim_QuintyPlumpGoFasterSouth, + gEventObjectImageAnim_QuintyPlumpGoFasterNorth, + gEventObjectImageAnim_QuintyPlumpGoFasterWest, + gEventObjectImageAnim_QuintyPlumpGoFasterEast, + gEventObjectImageAnim_QuintyPlumpGoFastestSouth, + gEventObjectImageAnim_QuintyPlumpGoFastestNorth, + gEventObjectImageAnim_QuintyPlumpGoFastestWest, + gEventObjectImageAnim_QuintyPlumpGoFastestEast, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Standard[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_GoSouth, + gEventObjectImageAnim_GoNorth, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastNorth, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterNorth, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestNorth, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_HoOh[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_HoOhFlapWings, + gEventObjectImageAnim_HoOhStayStill, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastNorth, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterNorth, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestNorth, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Groudon3[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_GoSouth, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestEast, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, +}; + +const union AnimCmd gEventObjectImageAnim_85091F0[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_85091F8[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509200[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509208[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509210[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509218[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509220[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509228[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gEventObjectImageAnim_8509230[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Rayquaza2[] = { + gEventObjectImageAnim_8509218, + gEventObjectImageAnim_8509220, + gEventObjectImageAnim_8509228, + gEventObjectImageAnim_8509230, + gEventObjectImageAnim_8509200, + gEventObjectImageAnim_85091F8, + gEventObjectImageAnim_8509208, + gEventObjectImageAnim_8509210, + gEventObjectImageAnim_8509200, + gEventObjectImageAnim_85091F8, + gEventObjectImageAnim_85091F0, + gEventObjectImageAnim_8509210, + gEventObjectImageAnim_8509200, + gEventObjectImageAnim_85091F8, + gEventObjectImageAnim_8509208, + gEventObjectImageAnim_8509210, + gEventObjectImageAnim_8509200, + gEventObjectImageAnim_85091F8, + gEventObjectImageAnim_8509208, + gEventObjectImageAnim_8509210, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_BrendanMayNormal[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_GoSouth, + gEventObjectImageAnim_GoNorth, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastNorth, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterNorth, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestNorth, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, + gEventObjectImageAnim_RunSouth, + gEventObjectImageAnim_RunNorth, + gEventObjectImageAnim_RunWest, + gEventObjectImageAnim_RunEast, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_AcroBike[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_GoSouth, + gEventObjectImageAnim_GoNorth, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastNorth, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterNorth, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestNorth, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, + gEventObjectImageAnim_BunnyHoppyBackWheelSouth, + gEventObjectImageAnim_BunnyHoppyBackWheelNorth, + gEventObjectImageAnim_BunnyHoppyBackWheelWest, + gEventObjectImageAnim_BunnyHoppyBackWheelEast, + gEventObjectImageAnim_BunnyHoppyFrontWheelSouth, + gEventObjectImageAnim_BunnyHoppyFrontWheelNorth, + gEventObjectImageAnim_BunnyHoppyFrontWheelWest, + gEventObjectImageAnim_BunnyHoppyFrontWheelEast, + gEventObjectImageAnim_StandingWheelieBackWheelSouth, + gEventObjectImageAnim_StandingWheelieBackWheelNorth, + gEventObjectImageAnim_StandingWheelieBackWheelWest, + gEventObjectImageAnim_StandingWheelieBackWheelEast, + gEventObjectImageAnim_StandingWheelieFrontWheelSouth, + gEventObjectImageAnim_StandingWheelieFrontWheelNorth, + gEventObjectImageAnim_StandingWheelieFrontWheelWest, + gEventObjectImageAnim_StandingWheelieFrontWheelEast, + gEventObjectImageAnim_MovingWheelieSouth, + gEventObjectImageAnim_MovingWheelieNorth, + gEventObjectImageAnim_MovingWheelieWest, + gEventObjectImageAnim_MovingWheelieEast, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Surfing[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_GoSouth, + gEventObjectImageAnim_GoNorth, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastNorth, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterNorth, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestNorth, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, + gEventObjectImageAnim_GetOnOffSurfBlobSouth, + gEventObjectImageAnim_GetOnOffSurfBlobNorth, + gEventObjectImageAnim_GetOnOffSurfBlobWest, + gEventObjectImageAnim_GetOnOffSurfBlobEast, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Nurse[] = { + gEventObjectImageAnim_FaceSouth, + gEventObjectImageAnim_FaceNorth, + gEventObjectImageAnim_FaceWest, + gEventObjectImageAnim_FaceEast, + gEventObjectImageAnim_GoSouth, + gEventObjectImageAnim_GoNorth, + gEventObjectImageAnim_GoWest, + gEventObjectImageAnim_GoEast, + gEventObjectImageAnim_GoFastSouth, + gEventObjectImageAnim_GoFastNorth, + gEventObjectImageAnim_GoFastWest, + gEventObjectImageAnim_GoFastEast, + gEventObjectImageAnim_GoFasterSouth, + gEventObjectImageAnim_GoFasterNorth, + gEventObjectImageAnim_GoFasterWest, + gEventObjectImageAnim_GoFasterEast, + gEventObjectImageAnim_GoFastestSouth, + gEventObjectImageAnim_GoFastestNorth, + gEventObjectImageAnim_GoFastestWest, + gEventObjectImageAnim_GoFastestEast, + gEventObjectImageAnim_NurseBow, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_FieldMove[] = { + gEventObjectImageAnim_FieldMove, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_BerryTree[] = { + gEventObjectImageAnim_BerryTreeStage0, + gEventObjectImageAnim_BerryTreeStage1, + gEventObjectImageAnim_BerryTreeStage2, + gEventObjectImageAnim_BerryTreeStage3, + gEventObjectImageAnim_BerryTreeStage4, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_BreakableRock[] = { + gEventObjectImageAnim_StayStill, + gEventObjectImageAnim_RockBreak, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_CuttableTree[] = { + gEventObjectImageAnim_StayStill, + gEventObjectImageAnim_TreeCut, +}; + +const union AnimCmd *const gEventObjectImageAnimTable_Fishing[] = { + gEventObjectImageAnim_TakeOutRodSouth, + gEventObjectImageAnim_TakeOutRodNorth, + gEventObjectImageAnim_TakeOutRodWest, + gEventObjectImageAnim_TakeOutRodEast, + gEventObjectImageAnim_PutAwayRodSouth, + gEventObjectImageAnim_PutAwayRodNorth, + gEventObjectImageAnim_PutAwayRodWest, + gEventObjectImageAnim_PutAwayRodEast, + gEventObjectImageAnim_HookedPokemonSouth, + gEventObjectImageAnim_HookedPokemonNorth, + gEventObjectImageAnim_HookedPokemonWest, + gEventObjectImageAnim_HookedPokemonEast, +}; + +const union AffineAnimCmd *const gEventObjectRotScalAnimTable_KyogreGroudon[] = { + gEventObjectRotScalAnim_8508FD8, + gEventObjectRotScalAnim_8509008, + gEventObjectRotScalAnim_8509050, + gEventObjectRotScalAnim_8509040, + gEventObjectRotScalAnim_8509078, + gEventObjectRotScalAnim_8509060, +}; + +const struct UnkStruct_085094AC gUnknown_085094AC[] = { + { + .anims = gEventObjectImageAnimTable_QuintyPlump, + .animPos = {1, 3, 0, 2}, + }, + { + .anims = gEventObjectImageAnimTable_Standard, + .animPos = {1, 3, 0, 2}, + }, + { + .anims = gEventObjectImageAnimTable_BrendanMayNormal, + .animPos = {1, 3, 0, 2}, + }, + { + .anims = gEventObjectImageAnimTable_AcroBike, + .animPos = {1, 3, 0, 2}, + }, + { + .anims = gEventObjectImageAnimTable_Surfing, + .animPos = {1, 3, 0, 2}, + }, + { + .anims = gEventObjectImageAnimTable_Nurse, + .animPos = {1, 3, 0, 2}, + }, + { + .anims = gEventObjectImageAnimTable_Fishing, + .animPos = {1, 3, 0, 2}, + }, + { + NULL, + {0, 0, 0, 0}, + }, +}; + +#endif //GUARD_EVENT_OBJECT_ANIMS_H diff --git a/src/data/field_event_obj/event_object_graphics.h b/src/data/field_event_obj/event_object_graphics.h new file mode 100755 index 000000000..b226b066a --- /dev/null +++ b/src/data/field_event_obj/event_object_graphics.h @@ -0,0 +1,1669 @@ +#ifndef GUARD_EVENT_OBJECT_GFX_H +#define GUARD_EVENT_OBJECT_GFX_H + +const u32 gEventObjectPic_BrendanNormal_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/00.4bpp"); +const u32 gEventObjectPic_BrendanNormal_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/01.4bpp"); +const u32 gEventObjectPic_BrendanNormal_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/02.4bpp"); +const u32 gEventObjectPic_BrendanNormal_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/03.4bpp"); +const u32 gEventObjectPic_BrendanNormal_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/04.4bpp"); +const u32 gEventObjectPic_BrendanNormal_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/05.4bpp"); +const u32 gEventObjectPic_BrendanNormal_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/06.4bpp"); +const u32 gEventObjectPic_BrendanNormal_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/07.4bpp"); +const u32 gEventObjectPic_BrendanNormal_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/08.4bpp"); +const u32 gEventObjectPic_BrendanNormal_9[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/09.4bpp"); +const u32 gEventObjectPic_BrendanNormal_10[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/10.4bpp"); +const u32 gEventObjectPic_BrendanNormal_11[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/11.4bpp"); +const u32 gEventObjectPic_BrendanNormal_12[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/12.4bpp"); +const u32 gEventObjectPic_BrendanNormal_13[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/13.4bpp"); +const u32 gEventObjectPic_BrendanNormal_14[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/14.4bpp"); +const u32 gEventObjectPic_BrendanNormal_15[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/15.4bpp"); +const u32 gEventObjectPic_BrendanNormal_16[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/16.4bpp"); +const u32 gEventObjectPic_BrendanNormal_17[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/normal/17.4bpp"); +const u16 gEventObjectPalette8[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_08.gbapal"); +const u32 gEventObjectPic_RubySapphireBrendan_0[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/00.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_1[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/01.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_2[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/02.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_3[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/03.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_4[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/04.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_5[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/05.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_6[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/06.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_7[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/07.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_8[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/08.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_9[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/09.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_10[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/10.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_11[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/11.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_12[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/12.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_13[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/13.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_14[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/14.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_15[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/15.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_16[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/16.4bpp"); +const u32 gEventObjectPic_RubySapphireBrendan_17[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_brendan/17.4bpp"); +const u16 gEventObjectPalette33[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_33.gbapal"); +const u16 NullPalette_8499A38[16] = {}; +const u16 NullPalette_8499A58[16] = {}; +const u16 NullPalette_8499A78[16] = {}; +const u16 NullPalette_8499A98[16] = {}; +const u16 NullPalette_8499AB8[16] = {}; +const u16 NullPalette_8499AD8[16] = {}; +const u16 NullPalette_8499AF8[16] = {}; +const u16 NullPalette_8499B18[16] = {}; +const u16 NullPalette_8499B38[16] = {}; +const u16 NullPalette_8499B58[16] = {}; +const u16 NullPalette_8499B78[16] = {}; +const u16 NullPalette_8499B98[16] = {}; +const u16 NullPalette_8499BB8[16] = {}; +const u16 NullPalette_8499BD8[16] = {}; +const u16 NullPalette_8499BF8[16] = {}; +const u16 gEventObjectPalette9[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_09.gbapal"); +const u16 gEventObjectPalette10[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_10.gbapal"); +const u32 gEventObjectPic_BrendanFieldMove_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/0.4bpp"); +const u32 gEventObjectPic_BrendanFieldMove_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/1.4bpp"); +const u32 gEventObjectPic_BrendanFieldMove_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/2.4bpp"); +const u32 gEventObjectPic_BrendanFieldMove_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/3.4bpp"); +const u32 gEventObjectPic_BrendanFieldMove_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/field_move/4.4bpp"); +const u32 gEventObjectPic_BrendanSurfing_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/0.4bpp"); +const u32 gEventObjectPic_BrendanSurfing_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/3.4bpp"); +const u32 gEventObjectPic_BrendanSurfing_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/1.4bpp"); +const u32 gEventObjectPic_BrendanSurfing_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/4.4bpp"); +const u32 gEventObjectPic_BrendanSurfing_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/2.4bpp"); +const u32 gEventObjectPic_BrendanSurfing_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/surfing/5.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/0.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/1.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/2.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/3.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/4.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/5.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/6.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/7.4bpp"); +const u32 gEventObjectPic_BrendanMachBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/mach_bike/8.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/00.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/01.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/02.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/03.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/04.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/05.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/06.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/07.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/08.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_9[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/09.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_10[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/10.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_11[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/11.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_12[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/12.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_13[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/13.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_14[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/14.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_15[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/15.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_16[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/16.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_17[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/17.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_18[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/18.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_19[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/19.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_20[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/20.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_21[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/21.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_22[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/22.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_23[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/23.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_24[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/24.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_25[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/25.4bpp"); +const u32 gEventObjectPic_BrendanAcroBike_26[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/acro_bike/26.4bpp"); +const u32 gEventObjectPic_BrendanFishing_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/00.4bpp"); +const u32 gEventObjectPic_BrendanFishing_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/01.4bpp"); +const u32 gEventObjectPic_BrendanFishing_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/02.4bpp"); +const u32 gEventObjectPic_BrendanFishing_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/03.4bpp"); +const u32 gEventObjectPic_BrendanFishing_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/04.4bpp"); +const u32 gEventObjectPic_BrendanFishing_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/05.4bpp"); +const u32 gEventObjectPic_BrendanFishing_6[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/06.4bpp"); +const u32 gEventObjectPic_BrendanFishing_7[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/07.4bpp"); +const u32 gEventObjectPic_BrendanFishing_8[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/08.4bpp"); +const u32 gEventObjectPic_BrendanFishing_9[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/09.4bpp"); +const u32 gEventObjectPic_BrendanFishing_10[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/10.4bpp"); +const u32 gEventObjectPic_BrendanFishing_11[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/fishing/11.4bpp"); +const u32 gEventObjectPic_BrendanWatering_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/0.4bpp"); +const u32 gEventObjectPic_BrendanWatering_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/3.4bpp"); +const u32 gEventObjectPic_BrendanWatering_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/1.4bpp"); +const u32 gEventObjectPic_BrendanWatering_4[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/4.4bpp"); +const u32 gEventObjectPic_BrendanWatering_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/2.4bpp"); +const u32 gEventObjectPic_BrendanWatering_5[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/watering/5.4bpp"); +const u32 gEventObjectPic_BrendanDecorating[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/decorating.4bpp"); +const u32 gEventObjectPic_MayDecorating[] = INCBIN_U32("graphics/event_objects/pics/people/may/decorating.4bpp"); +const u32 gEventObjectPic_BrendanUnderwater_0[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/0.4bpp"); +const u32 gEventObjectPic_BrendanUnderwater_1[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/1.4bpp"); +const u32 gEventObjectPic_BrendanUnderwater_2[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/2.4bpp"); +const u32 gEventObjectPic_BrendanUnderwater_3[] = INCBIN_U32("graphics/event_objects/pics/people/brendan/underwater/3.4bpp"); +const u32 gEventObjectPic_MayUnderwater_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/0.4bpp"); +const u32 gEventObjectPic_MayUnderwater_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/1.4bpp"); +const u32 gEventObjectPic_MayUnderwater_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/2.4bpp"); +const u32 gEventObjectPic_MayUnderwater_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/underwater/3.4bpp"); +const u16 gEventObjectPalette11[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_11.gbapal"); +const u32 gEventObjectPic_MayNormal_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/00.4bpp"); +const u32 gEventObjectPic_MayNormal_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/01.4bpp"); +const u32 gEventObjectPic_MayNormal_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/02.4bpp"); +const u32 gEventObjectPic_MayNormal_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/03.4bpp"); +const u32 gEventObjectPic_MayNormal_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/04.4bpp"); +const u32 gEventObjectPic_MayNormal_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/05.4bpp"); +const u32 gEventObjectPic_MayNormal_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/06.4bpp"); +const u32 gEventObjectPic_MayNormal_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/07.4bpp"); +const u32 gEventObjectPic_MayNormal_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/08.4bpp"); +const u32 gEventObjectPic_MayNormal_9[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/09.4bpp"); +const u32 gEventObjectPic_MayNormal_10[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/10.4bpp"); +const u32 gEventObjectPic_MayNormal_11[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/11.4bpp"); +const u32 gEventObjectPic_MayNormal_12[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/12.4bpp"); +const u32 gEventObjectPic_MayNormal_13[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/13.4bpp"); +const u32 gEventObjectPic_MayNormal_14[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/14.4bpp"); +const u32 gEventObjectPic_MayNormal_15[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/15.4bpp"); +const u32 gEventObjectPic_MayNormal_16[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/16.4bpp"); +const u32 gEventObjectPic_MayNormal_17[] = INCBIN_U32("graphics/event_objects/pics/people/may/normal/17.4bpp"); +const u16 gEventObjectPalette17[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_17.gbapal"); +const u16 gEventObjectPalette18[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_18.gbapal"); +const u32 gEventObjectPic_RubySapphireMay_0[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/00.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_1[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/01.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_2[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/02.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_3[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/03.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_4[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/04.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_5[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/05.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_6[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/06.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_7[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/07.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_8[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/08.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_9[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/09.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_10[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/10.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_11[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/11.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_12[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/12.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_13[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/13.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_14[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/14.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_15[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/15.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_16[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/16.4bpp"); +const u32 gEventObjectPic_RubySapphireMay_17[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_may/17.4bpp"); +const u16 gEventObjectPalette34[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_34.gbapal"); +const u16 gUnusedEventObjectPalette[] = INCBIN_U16("graphics/event_objects/palettes/unused_palette.gbapal"); +const u16 NullPalette_84A54F8[16] = {}; +const u16 NullPalette_84A5518[16] = {}; +const u16 NullPalette_84A5538[16] = {}; +const u16 NullPalette_84A5558[16] = {}; +const u16 NullPalette_84A5578[16] = {}; +const u16 NullPalette_84A5598[16] = {}; +const u16 NullPalette_84A55B8[16] = {}; +const u16 NullPalette_84A55D8[16] = {}; +const u16 NullPalette_84A55F8[16] = {}; +const u16 NullPalette_84A5618[16] = {}; +const u16 NullPalette_84A5638[16] = {}; +const u16 NullPalette_84A5658[16] = {}; +const u16 NullPalette_84A5678[16] = {}; +const u16 NullPalette_84A5698[16] = {}; +const u32 gEventObjectPic_MayMachBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/0.4bpp"); +const u32 gEventObjectPic_MayMachBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/1.4bpp"); +const u32 gEventObjectPic_MayMachBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/2.4bpp"); +const u32 gEventObjectPic_MayMachBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/3.4bpp"); +const u32 gEventObjectPic_MayMachBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/4.4bpp"); +const u32 gEventObjectPic_MayMachBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/5.4bpp"); +const u32 gEventObjectPic_MayMachBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/6.4bpp"); +const u32 gEventObjectPic_MayMachBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/7.4bpp"); +const u32 gEventObjectPic_MayMachBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/mach_bike/8.4bpp"); +const u32 gEventObjectPic_MayAcroBike_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/00.4bpp"); +const u32 gEventObjectPic_MayAcroBike_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/01.4bpp"); +const u32 gEventObjectPic_MayAcroBike_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/02.4bpp"); +const u32 gEventObjectPic_MayAcroBike_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/03.4bpp"); +const u32 gEventObjectPic_MayAcroBike_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/04.4bpp"); +const u32 gEventObjectPic_MayAcroBike_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/05.4bpp"); +const u32 gEventObjectPic_MayAcroBike_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/06.4bpp"); +const u32 gEventObjectPic_MayAcroBike_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/07.4bpp"); +const u32 gEventObjectPic_MayAcroBike_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/08.4bpp"); +const u32 gEventObjectPic_MayAcroBike_9[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/09.4bpp"); +const u32 gEventObjectPic_MayAcroBike_10[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/10.4bpp"); +const u32 gEventObjectPic_MayAcroBike_11[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/11.4bpp"); +const u32 gEventObjectPic_MayAcroBike_12[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/12.4bpp"); +const u32 gEventObjectPic_MayAcroBike_13[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/13.4bpp"); +const u32 gEventObjectPic_MayAcroBike_14[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/14.4bpp"); +const u32 gEventObjectPic_MayAcroBike_15[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/15.4bpp"); +const u32 gEventObjectPic_MayAcroBike_16[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/16.4bpp"); +const u32 gEventObjectPic_MayAcroBike_17[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/17.4bpp"); +const u32 gEventObjectPic_MayAcroBike_18[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/18.4bpp"); +const u32 gEventObjectPic_MayAcroBike_19[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/19.4bpp"); +const u32 gEventObjectPic_MayAcroBike_20[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/20.4bpp"); +const u32 gEventObjectPic_MayAcroBike_21[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/21.4bpp"); +const u32 gEventObjectPic_MayAcroBike_22[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/22.4bpp"); +const u32 gEventObjectPic_MayAcroBike_23[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/23.4bpp"); +const u32 gEventObjectPic_MayAcroBike_24[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/24.4bpp"); +const u32 gEventObjectPic_MayAcroBike_25[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/25.4bpp"); +const u32 gEventObjectPic_MayAcroBike_26[] = INCBIN_U32("graphics/event_objects/pics/people/may/acro_bike/26.4bpp"); +const u32 gEventObjectPic_MaySurfing_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/0.4bpp"); +const u32 gEventObjectPic_MaySurfing_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/3.4bpp"); +const u32 gEventObjectPic_MaySurfing_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/1.4bpp"); +const u32 gEventObjectPic_MaySurfing_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/4.4bpp"); +const u32 gEventObjectPic_MaySurfing_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/2.4bpp"); +const u32 gEventObjectPic_MaySurfing_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/surfing/5.4bpp"); +const u32 gEventObjectPic_MayFieldMove_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/0.4bpp"); +const u32 gEventObjectPic_MayFieldMove_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/1.4bpp"); +const u32 gEventObjectPic_MayFieldMove_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/2.4bpp"); +const u32 gEventObjectPic_MayFieldMove_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/3.4bpp"); +const u32 gEventObjectPic_MayFieldMove_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/field_move/4.4bpp"); +const u32 gEventObjectPic_MayFishing_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/00.4bpp"); +const u32 gEventObjectPic_MayFishing_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/01.4bpp"); +const u32 gEventObjectPic_MayFishing_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/02.4bpp"); +const u32 gEventObjectPic_MayFishing_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/03.4bpp"); +const u32 gEventObjectPic_MayFishing_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/04.4bpp"); +const u32 gEventObjectPic_MayFishing_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/05.4bpp"); +const u32 gEventObjectPic_MayFishing_6[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/06.4bpp"); +const u32 gEventObjectPic_MayFishing_7[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/07.4bpp"); +const u32 gEventObjectPic_MayFishing_8[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/08.4bpp"); +const u32 gEventObjectPic_MayFishing_9[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/09.4bpp"); +const u32 gEventObjectPic_MayFishing_10[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/10.4bpp"); +const u32 gEventObjectPic_MayFishing_11[] = INCBIN_U32("graphics/event_objects/pics/people/may/fishing/11.4bpp"); +const u32 gEventObjectPic_MayWatering_0[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/0.4bpp"); +const u32 gEventObjectPic_MayWatering_3[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/3.4bpp"); +const u32 gEventObjectPic_MayWatering_1[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/1.4bpp"); +const u32 gEventObjectPic_MayWatering_4[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/4.4bpp"); +const u32 gEventObjectPic_MayWatering_2[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/2.4bpp"); +const u32 gEventObjectPic_MayWatering_5[] = INCBIN_U32("graphics/event_objects/pics/people/may/watering/5.4bpp"); +const u16 gEventObjectPalette0[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_00.gbapal"); +const u16 gEventObjectPalette1[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_01.gbapal"); +const u16 gEventObjectPalette2[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_02.gbapal"); +const u16 gEventObjectPalette3[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_03.gbapal"); +const u16 gEventObjectPalette4[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_04.gbapal"); +const u16 gEventObjectPalette5[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_05.gbapal"); +const u16 gEventObjectPalette6[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_06.gbapal"); +const u16 gEventObjectPalette7[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_07.gbapal"); +const u32 gEventObjectPic_LittleBoy1_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/0.4bpp"); +const u32 gEventObjectPic_LittleBoy1_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/1.4bpp"); +const u32 gEventObjectPic_LittleBoy1_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/2.4bpp"); +const u32 gEventObjectPic_LittleBoy1_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/3.4bpp"); +const u32 gEventObjectPic_LittleBoy1_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/4.4bpp"); +const u32 gEventObjectPic_LittleBoy1_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/5.4bpp"); +const u32 gEventObjectPic_LittleBoy1_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/6.4bpp"); +const u32 gEventObjectPic_LittleBoy1_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/7.4bpp"); +const u32 gEventObjectPic_LittleBoy1_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_1/8.4bpp"); +const u32 gEventObjectPic_LittleGirl1_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/0.4bpp"); +const u32 gEventObjectPic_LittleGirl1_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/1.4bpp"); +const u32 gEventObjectPic_LittleGirl1_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/2.4bpp"); +const u32 gEventObjectPic_LittleGirl1_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/3.4bpp"); +const u32 gEventObjectPic_LittleGirl1_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/4.4bpp"); +const u32 gEventObjectPic_LittleGirl1_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/5.4bpp"); +const u32 gEventObjectPic_LittleGirl1_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/6.4bpp"); +const u32 gEventObjectPic_LittleGirl1_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/7.4bpp"); +const u32 gEventObjectPic_LittleGirl1_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_1/8.4bpp"); +const u32 gEventObjectPic_Boy1_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/0.4bpp"); +const u32 gEventObjectPic_Boy1_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/1.4bpp"); +const u32 gEventObjectPic_Boy1_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/2.4bpp"); +const u32 gEventObjectPic_Boy1_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/3.4bpp"); +const u32 gEventObjectPic_Boy1_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/4.4bpp"); +const u32 gEventObjectPic_Boy1_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/5.4bpp"); +const u32 gEventObjectPic_Boy1_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/6.4bpp"); +const u32 gEventObjectPic_Boy1_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/7.4bpp"); +const u32 gEventObjectPic_Boy1_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_1/8.4bpp"); +const u32 gEventObjectPic_Girl1_0[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/0.4bpp"); +const u32 gEventObjectPic_Girl1_1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/1.4bpp"); +const u32 gEventObjectPic_Girl1_2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/2.4bpp"); +const u32 gEventObjectPic_Girl1_3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/3.4bpp"); +const u32 gEventObjectPic_Girl1_4[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/4.4bpp"); +const u32 gEventObjectPic_Girl1_5[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/5.4bpp"); +const u32 gEventObjectPic_Girl1_6[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/6.4bpp"); +const u32 gEventObjectPic_Girl1_7[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/7.4bpp"); +const u32 gEventObjectPic_Girl1_8[] = INCBIN_U32("graphics/event_objects/pics/people/girl_1/8.4bpp"); +const u32 gEventObjectPic_Boy2_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/0.4bpp"); +const u32 gEventObjectPic_Boy2_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/1.4bpp"); +const u32 gEventObjectPic_Boy2_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/2.4bpp"); +const u32 gEventObjectPic_Boy2_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/3.4bpp"); +const u32 gEventObjectPic_Boy2_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/4.4bpp"); +const u32 gEventObjectPic_Boy2_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/5.4bpp"); +const u32 gEventObjectPic_Boy2_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/6.4bpp"); +const u32 gEventObjectPic_Boy2_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/7.4bpp"); +const u32 gEventObjectPic_Boy2_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_2/8.4bpp"); +const u32 gEventObjectPic_Girl2_0[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/0.4bpp"); +const u32 gEventObjectPic_Girl2_1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/1.4bpp"); +const u32 gEventObjectPic_Girl2_2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/2.4bpp"); +const u32 gEventObjectPic_Girl2_3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/3.4bpp"); +const u32 gEventObjectPic_Girl2_4[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/4.4bpp"); +const u32 gEventObjectPic_Girl2_5[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/5.4bpp"); +const u32 gEventObjectPic_Girl2_6[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/6.4bpp"); +const u32 gEventObjectPic_Girl2_7[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/7.4bpp"); +const u32 gEventObjectPic_Girl2_8[] = INCBIN_U32("graphics/event_objects/pics/people/girl_2/8.4bpp"); +const u32 gEventObjectPic_LittleBoy2_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/0.4bpp"); +const u32 gEventObjectPic_LittleBoy2_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/1.4bpp"); +const u32 gEventObjectPic_LittleBoy2_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/2.4bpp"); +const u32 gEventObjectPic_LittleBoy2_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/3.4bpp"); +const u32 gEventObjectPic_LittleBoy2_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/4.4bpp"); +const u32 gEventObjectPic_LittleBoy2_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/5.4bpp"); +const u32 gEventObjectPic_LittleBoy2_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/6.4bpp"); +const u32 gEventObjectPic_LittleBoy2_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/7.4bpp"); +const u32 gEventObjectPic_LittleBoy2_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_boy_2/8.4bpp"); +const u32 gEventObjectPic_LittleGirl2_0[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/0.4bpp"); +const u32 gEventObjectPic_LittleGirl2_1[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/1.4bpp"); +const u32 gEventObjectPic_LittleGirl2_2[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/2.4bpp"); +const u32 gEventObjectPic_LittleGirl2_3[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/3.4bpp"); +const u32 gEventObjectPic_LittleGirl2_4[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/4.4bpp"); +const u32 gEventObjectPic_LittleGirl2_5[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/5.4bpp"); +const u32 gEventObjectPic_LittleGirl2_6[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/6.4bpp"); +const u32 gEventObjectPic_LittleGirl2_7[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/7.4bpp"); +const u32 gEventObjectPic_LittleGirl2_8[] = INCBIN_U32("graphics/event_objects/pics/people/little_girl_2/8.4bpp"); +const u32 gEventObjectPic_Boy3_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/0.4bpp"); +const u32 gEventObjectPic_Boy3_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/1.4bpp"); +const u32 gEventObjectPic_Boy3_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/2.4bpp"); +const u32 gEventObjectPic_Boy3_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/3.4bpp"); +const u32 gEventObjectPic_Boy3_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/4.4bpp"); +const u32 gEventObjectPic_Boy3_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/5.4bpp"); +const u32 gEventObjectPic_Boy3_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/6.4bpp"); +const u32 gEventObjectPic_Boy3_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/7.4bpp"); +const u32 gEventObjectPic_Boy3_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_3/8.4bpp"); +const u32 gEventObjectPic_Girl3_0[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/0.4bpp"); +const u32 gEventObjectPic_Girl3_1[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/1.4bpp"); +const u32 gEventObjectPic_Girl3_2[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/2.4bpp"); +const u32 gEventObjectPic_Girl3_3[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/3.4bpp"); +const u32 gEventObjectPic_Girl3_4[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/4.4bpp"); +const u32 gEventObjectPic_Girl3_5[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/5.4bpp"); +const u32 gEventObjectPic_Girl3_6[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/6.4bpp"); +const u32 gEventObjectPic_Girl3_7[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/7.4bpp"); +const u32 gEventObjectPic_Girl3_8[] = INCBIN_U32("graphics/event_objects/pics/people/girl_3/8.4bpp"); +const u32 gEventObjectPic_Boy4_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/0.4bpp"); +const u32 gEventObjectPic_Boy4_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/1.4bpp"); +const u32 gEventObjectPic_Boy4_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/2.4bpp"); +const u32 gEventObjectPic_Boy4_3[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/3.4bpp"); +const u32 gEventObjectPic_Boy4_4[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/4.4bpp"); +const u32 gEventObjectPic_Boy4_5[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/5.4bpp"); +const u32 gEventObjectPic_Boy4_6[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/6.4bpp"); +const u32 gEventObjectPic_Boy4_7[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/7.4bpp"); +const u32 gEventObjectPic_Boy4_8[] = INCBIN_U32("graphics/event_objects/pics/people/boy_4/8.4bpp"); +const u32 gEventObjectPic_Woman1_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/0.4bpp"); +const u32 gEventObjectPic_Woman1_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/1.4bpp"); +const u32 gEventObjectPic_Woman1_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/2.4bpp"); +const u32 gEventObjectPic_Woman1_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/3.4bpp"); +const u32 gEventObjectPic_Woman1_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/4.4bpp"); +const u32 gEventObjectPic_Woman1_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/5.4bpp"); +const u32 gEventObjectPic_Woman1_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/6.4bpp"); +const u32 gEventObjectPic_Woman1_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/7.4bpp"); +const u32 gEventObjectPic_Woman1_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_1/8.4bpp"); +const u32 gEventObjectPic_FatMan_0[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/0.4bpp"); +const u32 gEventObjectPic_FatMan_1[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/1.4bpp"); +const u32 gEventObjectPic_FatMan_2[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/2.4bpp"); +const u32 gEventObjectPic_FatMan_3[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/3.4bpp"); +const u32 gEventObjectPic_FatMan_4[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/4.4bpp"); +const u32 gEventObjectPic_FatMan_5[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/5.4bpp"); +const u32 gEventObjectPic_FatMan_6[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/6.4bpp"); +const u32 gEventObjectPic_FatMan_7[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/7.4bpp"); +const u32 gEventObjectPic_FatMan_8[] = INCBIN_U32("graphics/event_objects/pics/people/fat_man/8.4bpp"); +const u32 gEventObjectPic_Woman2_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/0.4bpp"); +const u32 gEventObjectPic_Woman2_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/1.4bpp"); +const u32 gEventObjectPic_Woman2_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/2.4bpp"); +const u32 gEventObjectPic_Woman2_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/3.4bpp"); +const u32 gEventObjectPic_Woman2_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/4.4bpp"); +const u32 gEventObjectPic_Woman2_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/5.4bpp"); +const u32 gEventObjectPic_Woman2_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/6.4bpp"); +const u32 gEventObjectPic_Woman2_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/7.4bpp"); +const u32 gEventObjectPic_Woman2_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_2/8.4bpp"); +const u32 gEventObjectPic_Man1_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/0.4bpp"); +const u32 gEventObjectPic_Man1_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/1.4bpp"); +const u32 gEventObjectPic_Man1_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/2.4bpp"); +const u32 gEventObjectPic_Man1_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/3.4bpp"); +const u32 gEventObjectPic_Man1_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/4.4bpp"); +const u32 gEventObjectPic_Man1_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/5.4bpp"); +const u32 gEventObjectPic_Man1_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/6.4bpp"); +const u32 gEventObjectPic_Man1_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/7.4bpp"); +const u32 gEventObjectPic_Man1_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_1/8.4bpp"); +const u32 gEventObjectPic_Woman3_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/0.4bpp"); +const u32 gEventObjectPic_Woman3_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/1.4bpp"); +const u32 gEventObjectPic_Woman3_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/2.4bpp"); +const u32 gEventObjectPic_Woman3_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/3.4bpp"); +const u32 gEventObjectPic_Woman3_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/4.4bpp"); +const u32 gEventObjectPic_Woman3_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/5.4bpp"); +const u32 gEventObjectPic_Woman3_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/6.4bpp"); +const u32 gEventObjectPic_Woman3_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/7.4bpp"); +const u32 gEventObjectPic_Woman3_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_3/8.4bpp"); +const u32 gEventObjectPic_OldMan1_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/0.4bpp"); +const u32 gEventObjectPic_OldMan1_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/1.4bpp"); +const u32 gEventObjectPic_OldMan1_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/2.4bpp"); +const u32 gEventObjectPic_OldMan1_3[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/3.4bpp"); +const u32 gEventObjectPic_OldMan1_4[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/4.4bpp"); +const u32 gEventObjectPic_OldMan1_5[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/5.4bpp"); +const u32 gEventObjectPic_OldMan1_6[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/6.4bpp"); +const u32 gEventObjectPic_OldMan1_7[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/7.4bpp"); +const u32 gEventObjectPic_OldMan1_8[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_1/8.4bpp"); +const u32 gEventObjectPic_OldWoman1_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/0.4bpp"); +const u32 gEventObjectPic_OldWoman1_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/1.4bpp"); +const u32 gEventObjectPic_OldWoman1_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/2.4bpp"); +const u32 gEventObjectPic_OldWoman1_3[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/3.4bpp"); +const u32 gEventObjectPic_OldWoman1_4[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/4.4bpp"); +const u32 gEventObjectPic_OldWoman1_5[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/5.4bpp"); +const u32 gEventObjectPic_OldWoman1_6[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/6.4bpp"); +const u32 gEventObjectPic_OldWoman1_7[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/7.4bpp"); +const u32 gEventObjectPic_OldWoman1_8[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_1/8.4bpp"); +const u32 gEventObjectPic_Man2_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/0.4bpp"); +const u32 gEventObjectPic_Man2_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/1.4bpp"); +const u32 gEventObjectPic_Man2_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/2.4bpp"); +const u32 gEventObjectPic_Man2_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/3.4bpp"); +const u32 gEventObjectPic_Man2_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/4.4bpp"); +const u32 gEventObjectPic_Man2_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/5.4bpp"); +const u32 gEventObjectPic_Man2_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/6.4bpp"); +const u32 gEventObjectPic_Man2_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/7.4bpp"); +const u32 gEventObjectPic_Man2_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_2/8.4bpp"); +const u32 gEventObjectPic_Woman4_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/0.4bpp"); +const u32 gEventObjectPic_Woman4_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/1.4bpp"); +const u32 gEventObjectPic_Woman4_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/2.4bpp"); +const u32 gEventObjectPic_Woman4_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/3.4bpp"); +const u32 gEventObjectPic_Woman4_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/4.4bpp"); +const u32 gEventObjectPic_Woman4_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/5.4bpp"); +const u32 gEventObjectPic_Woman4_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/6.4bpp"); +const u32 gEventObjectPic_Woman4_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/7.4bpp"); +const u32 gEventObjectPic_Woman4_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_4/8.4bpp"); +const u32 gEventObjectPic_Man3_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/0.4bpp"); +const u32 gEventObjectPic_Man3_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/1.4bpp"); +const u32 gEventObjectPic_Man3_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/2.4bpp"); +const u32 gEventObjectPic_Man3_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/3.4bpp"); +const u32 gEventObjectPic_Man3_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/4.4bpp"); +const u32 gEventObjectPic_Man3_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/5.4bpp"); +const u32 gEventObjectPic_Man3_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/6.4bpp"); +const u32 gEventObjectPic_Man3_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/7.4bpp"); +const u32 gEventObjectPic_Man3_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_3/8.4bpp"); +const u32 gEventObjectPic_Woman5_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/0.4bpp"); +const u32 gEventObjectPic_Woman5_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/1.4bpp"); +const u32 gEventObjectPic_Woman5_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/2.4bpp"); +const u32 gEventObjectPic_Woman5_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/3.4bpp"); +const u32 gEventObjectPic_Woman5_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/4.4bpp"); +const u32 gEventObjectPic_Woman5_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/5.4bpp"); +const u32 gEventObjectPic_Woman5_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/6.4bpp"); +const u32 gEventObjectPic_Woman5_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/7.4bpp"); +const u32 gEventObjectPic_Woman5_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_5/8.4bpp"); +const u32 gEventObjectPic_Cook_0[] = INCBIN_U32("graphics/event_objects/pics/people/cook/0.4bpp"); +const u32 gEventObjectPic_Cook_1[] = INCBIN_U32("graphics/event_objects/pics/people/cook/1.4bpp"); +const u32 gEventObjectPic_Cook_2[] = INCBIN_U32("graphics/event_objects/pics/people/cook/2.4bpp"); +const u32 gEventObjectPic_Woman6_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/0.4bpp"); +const u32 gEventObjectPic_Woman6_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/1.4bpp"); +const u32 gEventObjectPic_Woman6_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/2.4bpp"); +const u32 gEventObjectPic_Woman6_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/3.4bpp"); +const u32 gEventObjectPic_Woman6_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/4.4bpp"); +const u32 gEventObjectPic_Woman6_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/5.4bpp"); +const u32 gEventObjectPic_Woman6_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/6.4bpp"); +const u32 gEventObjectPic_Woman6_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/7.4bpp"); +const u32 gEventObjectPic_Woman6_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_6/8.4bpp"); +const u32 gEventObjectPic_OldMan2_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_2/0.4bpp"); +const u32 gEventObjectPic_OldMan2_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_2/1.4bpp"); +const u32 gEventObjectPic_OldMan2_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_man_2/2.4bpp"); +const u32 gEventObjectPic_OldWoman2_0[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/0.4bpp"); +const u32 gEventObjectPic_OldWoman2_1[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/1.4bpp"); +const u32 gEventObjectPic_OldWoman2_2[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/2.4bpp"); +const u32 gEventObjectPic_OldWoman2_3[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/3.4bpp"); +const u32 gEventObjectPic_OldWoman2_4[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/4.4bpp"); +const u32 gEventObjectPic_OldWoman2_5[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/5.4bpp"); +const u32 gEventObjectPic_OldWoman2_6[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/6.4bpp"); +const u32 gEventObjectPic_OldWoman2_7[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/7.4bpp"); +const u32 gEventObjectPic_OldWoman2_8[] = INCBIN_U32("graphics/event_objects/pics/people/old_woman_2/8.4bpp"); +const u32 gEventObjectPic_Camper_0[] = INCBIN_U32("graphics/event_objects/pics/people/camper/0.4bpp"); +const u32 gEventObjectPic_Camper_1[] = INCBIN_U32("graphics/event_objects/pics/people/camper/1.4bpp"); +const u32 gEventObjectPic_Camper_2[] = INCBIN_U32("graphics/event_objects/pics/people/camper/2.4bpp"); +const u32 gEventObjectPic_Camper_3[] = INCBIN_U32("graphics/event_objects/pics/people/camper/3.4bpp"); +const u32 gEventObjectPic_Camper_4[] = INCBIN_U32("graphics/event_objects/pics/people/camper/4.4bpp"); +const u32 gEventObjectPic_Camper_5[] = INCBIN_U32("graphics/event_objects/pics/people/camper/5.4bpp"); +const u32 gEventObjectPic_Camper_6[] = INCBIN_U32("graphics/event_objects/pics/people/camper/6.4bpp"); +const u32 gEventObjectPic_Camper_7[] = INCBIN_U32("graphics/event_objects/pics/people/camper/7.4bpp"); +const u32 gEventObjectPic_Camper_8[] = INCBIN_U32("graphics/event_objects/pics/people/camper/8.4bpp"); +const u32 gEventObjectPic_Picnicker_0[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/0.4bpp"); +const u32 gEventObjectPic_Picnicker_1[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/1.4bpp"); +const u32 gEventObjectPic_Picnicker_2[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/2.4bpp"); +const u32 gEventObjectPic_Picnicker_3[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/3.4bpp"); +const u32 gEventObjectPic_Picnicker_4[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/4.4bpp"); +const u32 gEventObjectPic_Picnicker_5[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/5.4bpp"); +const u32 gEventObjectPic_Picnicker_6[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/6.4bpp"); +const u32 gEventObjectPic_Picnicker_7[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/7.4bpp"); +const u32 gEventObjectPic_Picnicker_8[] = INCBIN_U32("graphics/event_objects/pics/people/picnicker/8.4bpp"); +const u32 gEventObjectPic_Man4_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/0.4bpp"); +const u32 gEventObjectPic_Man4_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/1.4bpp"); +const u32 gEventObjectPic_Man4_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/2.4bpp"); +const u32 gEventObjectPic_Man4_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/3.4bpp"); +const u32 gEventObjectPic_Man4_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/4.4bpp"); +const u32 gEventObjectPic_Man4_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/5.4bpp"); +const u32 gEventObjectPic_Man4_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/6.4bpp"); +const u32 gEventObjectPic_Man4_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/7.4bpp"); +const u32 gEventObjectPic_Man4_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_4/8.4bpp"); +const u32 gEventObjectPic_Woman7_0[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/0.4bpp"); +const u32 gEventObjectPic_Woman7_1[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/1.4bpp"); +const u32 gEventObjectPic_Woman7_2[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/2.4bpp"); +const u32 gEventObjectPic_Woman7_3[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/3.4bpp"); +const u32 gEventObjectPic_Woman7_4[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/4.4bpp"); +const u32 gEventObjectPic_Woman7_5[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/5.4bpp"); +const u32 gEventObjectPic_Woman7_6[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/6.4bpp"); +const u32 gEventObjectPic_Woman7_7[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/7.4bpp"); +const u32 gEventObjectPic_Woman7_8[] = INCBIN_U32("graphics/event_objects/pics/people/woman_7/8.4bpp"); +const u32 gEventObjectPic_Youngster_0[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/0.4bpp"); +const u32 gEventObjectPic_Youngster_1[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/1.4bpp"); +const u32 gEventObjectPic_Youngster_2[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/2.4bpp"); +const u32 gEventObjectPic_Youngster_3[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/3.4bpp"); +const u32 gEventObjectPic_Youngster_4[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/4.4bpp"); +const u32 gEventObjectPic_Youngster_5[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/5.4bpp"); +const u32 gEventObjectPic_Youngster_6[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/6.4bpp"); +const u32 gEventObjectPic_Youngster_7[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/7.4bpp"); +const u32 gEventObjectPic_Youngster_8[] = INCBIN_U32("graphics/event_objects/pics/people/youngster/8.4bpp"); +const u32 gEventObjectPic_BugCatcher_0[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/0.4bpp"); +const u32 gEventObjectPic_BugCatcher_1[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/1.4bpp"); +const u32 gEventObjectPic_BugCatcher_2[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/2.4bpp"); +const u32 gEventObjectPic_BugCatcher_3[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/3.4bpp"); +const u32 gEventObjectPic_BugCatcher_4[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/4.4bpp"); +const u32 gEventObjectPic_BugCatcher_5[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/5.4bpp"); +const u32 gEventObjectPic_BugCatcher_6[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/6.4bpp"); +const u32 gEventObjectPic_BugCatcher_7[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/7.4bpp"); +const u32 gEventObjectPic_BugCatcher_8[] = INCBIN_U32("graphics/event_objects/pics/people/bug_catcher/8.4bpp"); +const u32 gEventObjectPic_PsychicM_0[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/0.4bpp"); +const u32 gEventObjectPic_PsychicM_1[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/1.4bpp"); +const u32 gEventObjectPic_PsychicM_2[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/2.4bpp"); +const u32 gEventObjectPic_PsychicM_3[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/3.4bpp"); +const u32 gEventObjectPic_PsychicM_4[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/4.4bpp"); +const u32 gEventObjectPic_PsychicM_5[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/5.4bpp"); +const u32 gEventObjectPic_PsychicM_6[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/6.4bpp"); +const u32 gEventObjectPic_PsychicM_7[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/7.4bpp"); +const u32 gEventObjectPic_PsychicM_8[] = INCBIN_U32("graphics/event_objects/pics/people/psychic_m/8.4bpp"); +const u32 gEventObjectPic_SchoolKidM_0[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/0.4bpp"); +const u32 gEventObjectPic_SchoolKidM_1[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/1.4bpp"); +const u32 gEventObjectPic_SchoolKidM_2[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/2.4bpp"); +const u32 gEventObjectPic_SchoolKidM_3[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/3.4bpp"); +const u32 gEventObjectPic_SchoolKidM_4[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/4.4bpp"); +const u32 gEventObjectPic_SchoolKidM_5[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/5.4bpp"); +const u32 gEventObjectPic_SchoolKidM_6[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/6.4bpp"); +const u32 gEventObjectPic_SchoolKidM_7[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/7.4bpp"); +const u32 gEventObjectPic_SchoolKidM_8[] = INCBIN_U32("graphics/event_objects/pics/people/school_kid_m/8.4bpp"); +const u32 gEventObjectPic_Maniac_0[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/0.4bpp"); +const u32 gEventObjectPic_Maniac_1[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/1.4bpp"); +const u32 gEventObjectPic_Maniac_2[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/2.4bpp"); +const u32 gEventObjectPic_Maniac_3[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/3.4bpp"); +const u32 gEventObjectPic_Maniac_4[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/4.4bpp"); +const u32 gEventObjectPic_Maniac_5[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/5.4bpp"); +const u32 gEventObjectPic_Maniac_6[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/6.4bpp"); +const u32 gEventObjectPic_Maniac_7[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/7.4bpp"); +const u32 gEventObjectPic_Maniac_8[] = INCBIN_U32("graphics/event_objects/pics/people/maniac/8.4bpp"); +const u32 gEventObjectPic_HexManiac_0[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/0.4bpp"); +const u32 gEventObjectPic_HexManiac_1[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/1.4bpp"); +const u32 gEventObjectPic_HexManiac_2[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/2.4bpp"); +const u32 gEventObjectPic_HexManiac_3[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/3.4bpp"); +const u32 gEventObjectPic_HexManiac_4[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/4.4bpp"); +const u32 gEventObjectPic_HexManiac_5[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/5.4bpp"); +const u32 gEventObjectPic_HexManiac_6[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/6.4bpp"); +const u32 gEventObjectPic_HexManiac_7[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/7.4bpp"); +const u32 gEventObjectPic_HexManiac_8[] = INCBIN_U32("graphics/event_objects/pics/people/hex_maniac/8.4bpp"); +const u32 gEventObjectPic_UnusedWoman_0[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/0.4bpp"); +const u32 gEventObjectPic_UnusedWoman_1[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/1.4bpp"); +const u32 gEventObjectPic_UnusedWoman_2[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/2.4bpp"); +const u32 gEventObjectPic_UnusedWoman_3[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/3.4bpp"); +const u32 gEventObjectPic_UnusedWoman_4[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/4.4bpp"); +const u32 gEventObjectPic_UnusedWoman_5[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/5.4bpp"); +const u32 gEventObjectPic_UnusedWoman_6[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/6.4bpp"); +const u32 gEventObjectPic_UnusedWoman_7[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/7.4bpp"); +const u32 gEventObjectPic_UnusedWoman_8[] = INCBIN_U32("graphics/event_objects/pics/people/unused_woman/8.4bpp"); +const u32 gEventObjectPic_SwimmerM_0[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/0.4bpp"); +const u32 gEventObjectPic_SwimmerM_1[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/1.4bpp"); +const u32 gEventObjectPic_SwimmerM_2[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/2.4bpp"); +const u32 gEventObjectPic_SwimmerM_3[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/3.4bpp"); +const u32 gEventObjectPic_SwimmerM_4[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/4.4bpp"); +const u32 gEventObjectPic_SwimmerM_5[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/5.4bpp"); +const u32 gEventObjectPic_SwimmerM_6[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/6.4bpp"); +const u32 gEventObjectPic_SwimmerM_7[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/7.4bpp"); +const u32 gEventObjectPic_SwimmerM_8[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_m/8.4bpp"); +const u32 gEventObjectPic_SwimmerF_0[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/0.4bpp"); +const u32 gEventObjectPic_SwimmerF_1[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/1.4bpp"); +const u32 gEventObjectPic_SwimmerF_2[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/2.4bpp"); +const u32 gEventObjectPic_SwimmerF_3[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/3.4bpp"); +const u32 gEventObjectPic_SwimmerF_4[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/4.4bpp"); +const u32 gEventObjectPic_SwimmerF_5[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/5.4bpp"); +const u32 gEventObjectPic_SwimmerF_6[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/6.4bpp"); +const u32 gEventObjectPic_SwimmerF_7[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/7.4bpp"); +const u32 gEventObjectPic_SwimmerF_8[] = INCBIN_U32("graphics/event_objects/pics/people/swimmer_f/8.4bpp"); +const u32 gEventObjectPic_BlackBelt_0[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/0.4bpp"); +const u32 gEventObjectPic_BlackBelt_1[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/1.4bpp"); +const u32 gEventObjectPic_BlackBelt_2[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/2.4bpp"); +const u32 gEventObjectPic_BlackBelt_3[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/3.4bpp"); +const u32 gEventObjectPic_BlackBelt_4[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/4.4bpp"); +const u32 gEventObjectPic_BlackBelt_5[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/5.4bpp"); +const u32 gEventObjectPic_BlackBelt_6[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/6.4bpp"); +const u32 gEventObjectPic_BlackBelt_7[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/7.4bpp"); +const u32 gEventObjectPic_BlackBelt_8[] = INCBIN_U32("graphics/event_objects/pics/people/black_belt/8.4bpp"); +const u32 gEventObjectPic_Beauty_0[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/0.4bpp"); +const u32 gEventObjectPic_Beauty_1[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/1.4bpp"); +const u32 gEventObjectPic_Beauty_2[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/2.4bpp"); +const u32 gEventObjectPic_Beauty_3[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/3.4bpp"); +const u32 gEventObjectPic_Beauty_4[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/4.4bpp"); +const u32 gEventObjectPic_Beauty_5[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/5.4bpp"); +const u32 gEventObjectPic_Beauty_6[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/6.4bpp"); +const u32 gEventObjectPic_Beauty_7[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/7.4bpp"); +const u32 gEventObjectPic_Beauty_8[] = INCBIN_U32("graphics/event_objects/pics/people/beauty/8.4bpp"); +const u32 gEventObjectPic_Scientist1_0[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/0.4bpp"); +const u32 gEventObjectPic_Scientist1_1[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/1.4bpp"); +const u32 gEventObjectPic_Scientist1_2[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/2.4bpp"); +const u32 gEventObjectPic_Scientist1_3[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/3.4bpp"); +const u32 gEventObjectPic_Scientist1_4[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/4.4bpp"); +const u32 gEventObjectPic_Scientist1_5[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/5.4bpp"); +const u32 gEventObjectPic_Scientist1_6[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/6.4bpp"); +const u32 gEventObjectPic_Scientist1_7[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/7.4bpp"); +const u32 gEventObjectPic_Scientist1_8[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_1/8.4bpp"); +const u32 gEventObjectPic_Lass_0[] = INCBIN_U32("graphics/event_objects/pics/people/lass/0.4bpp"); +const u32 gEventObjectPic_Lass_1[] = INCBIN_U32("graphics/event_objects/pics/people/lass/1.4bpp"); +const u32 gEventObjectPic_Lass_2[] = INCBIN_U32("graphics/event_objects/pics/people/lass/2.4bpp"); +const u32 gEventObjectPic_Lass_3[] = INCBIN_U32("graphics/event_objects/pics/people/lass/3.4bpp"); +const u32 gEventObjectPic_Lass_4[] = INCBIN_U32("graphics/event_objects/pics/people/lass/4.4bpp"); +const u32 gEventObjectPic_Lass_5[] = INCBIN_U32("graphics/event_objects/pics/people/lass/5.4bpp"); +const u32 gEventObjectPic_Lass_6[] = INCBIN_U32("graphics/event_objects/pics/people/lass/6.4bpp"); +const u32 gEventObjectPic_Lass_7[] = INCBIN_U32("graphics/event_objects/pics/people/lass/7.4bpp"); +const u32 gEventObjectPic_Lass_8[] = INCBIN_U32("graphics/event_objects/pics/people/lass/8.4bpp"); +const u32 gEventObjectPic_Gentleman_0[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/0.4bpp"); +const u32 gEventObjectPic_Gentleman_1[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/1.4bpp"); +const u32 gEventObjectPic_Gentleman_2[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/2.4bpp"); +const u32 gEventObjectPic_Gentleman_3[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/3.4bpp"); +const u32 gEventObjectPic_Gentleman_4[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/4.4bpp"); +const u32 gEventObjectPic_Gentleman_5[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/5.4bpp"); +const u32 gEventObjectPic_Gentleman_6[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/6.4bpp"); +const u32 gEventObjectPic_Gentleman_7[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/7.4bpp"); +const u32 gEventObjectPic_Gentleman_8[] = INCBIN_U32("graphics/event_objects/pics/people/gentleman/8.4bpp"); +const u32 gEventObjectPic_Sailor_0[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/0.4bpp"); +const u32 gEventObjectPic_Sailor_1[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/1.4bpp"); +const u32 gEventObjectPic_Sailor_2[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/2.4bpp"); +const u32 gEventObjectPic_Sailor_3[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/3.4bpp"); +const u32 gEventObjectPic_Sailor_4[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/4.4bpp"); +const u32 gEventObjectPic_Sailor_5[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/5.4bpp"); +const u32 gEventObjectPic_Sailor_6[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/6.4bpp"); +const u32 gEventObjectPic_Sailor_7[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/7.4bpp"); +const u32 gEventObjectPic_Sailor_8[] = INCBIN_U32("graphics/event_objects/pics/people/sailor/8.4bpp"); +const u32 gEventObjectPic_Fisherman_0[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/0.4bpp"); +const u32 gEventObjectPic_Fisherman_1[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/1.4bpp"); +const u32 gEventObjectPic_Fisherman_2[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/2.4bpp"); +const u32 gEventObjectPic_Fisherman_3[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/3.4bpp"); +const u32 gEventObjectPic_Fisherman_4[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/4.4bpp"); +const u32 gEventObjectPic_Fisherman_5[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/5.4bpp"); +const u32 gEventObjectPic_Fisherman_6[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/6.4bpp"); +const u32 gEventObjectPic_Fisherman_7[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/7.4bpp"); +const u32 gEventObjectPic_Fisherman_8[] = INCBIN_U32("graphics/event_objects/pics/people/fisherman/8.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_0[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/0.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_1[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/1.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_2[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/2.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_3[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/3.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_4[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/4.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_5[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/5.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_6[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/6.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_7[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/7.4bpp"); +const u32 gEventObjectPic_RunningTriathleteM_8[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_m/8.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_0[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/0.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_1[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/1.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_2[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/2.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_3[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/3.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_4[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/4.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_5[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/5.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_6[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/6.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_7[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/7.4bpp"); +const u32 gEventObjectPic_RunningTriathleteF_8[] = INCBIN_U32("graphics/event_objects/pics/people/running_triathlete_f/8.4bpp"); +const u32 gEventObjectPic_TuberF_0[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/0.4bpp"); +const u32 gEventObjectPic_TuberF_1[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/1.4bpp"); +const u32 gEventObjectPic_TuberF_2[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/2.4bpp"); +const u32 gEventObjectPic_TuberF_3[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/3.4bpp"); +const u32 gEventObjectPic_TuberF_4[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/4.4bpp"); +const u32 gEventObjectPic_TuberF_5[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/5.4bpp"); +const u32 gEventObjectPic_TuberF_6[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/6.4bpp"); +const u32 gEventObjectPic_TuberF_7[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/7.4bpp"); +const u32 gEventObjectPic_TuberF_8[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_f/8.4bpp"); +const u32 gEventObjectPic_TuberM_0[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/0.4bpp"); +const u32 gEventObjectPic_TuberM_1[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/1.4bpp"); +const u32 gEventObjectPic_TuberM_2[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/2.4bpp"); +const u32 gEventObjectPic_TuberM_3[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/3.4bpp"); +const u32 gEventObjectPic_TuberM_4[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/4.4bpp"); +const u32 gEventObjectPic_TuberM_5[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/5.4bpp"); +const u32 gEventObjectPic_TuberM_6[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/6.4bpp"); +const u32 gEventObjectPic_TuberM_7[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/7.4bpp"); +const u32 gEventObjectPic_TuberM_8[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m/8.4bpp"); +const u32 gEventObjectPic_Hiker_0[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/0.4bpp"); +const u32 gEventObjectPic_Hiker_1[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/1.4bpp"); +const u32 gEventObjectPic_Hiker_2[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/2.4bpp"); +const u32 gEventObjectPic_Hiker_3[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/3.4bpp"); +const u32 gEventObjectPic_Hiker_4[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/4.4bpp"); +const u32 gEventObjectPic_Hiker_5[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/5.4bpp"); +const u32 gEventObjectPic_Hiker_6[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/6.4bpp"); +const u32 gEventObjectPic_Hiker_7[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/7.4bpp"); +const u32 gEventObjectPic_Hiker_8[] = INCBIN_U32("graphics/event_objects/pics/people/hiker/8.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_0[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/0.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_1[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/1.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_2[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/2.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_3[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/3.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_4[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/4.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_5[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/5.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_6[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/6.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_7[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/7.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteM_8[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_m/8.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_0[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/0.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_1[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/1.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_2[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/2.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_3[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/3.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_4[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/4.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_5[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/5.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_6[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/6.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_7[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/7.4bpp"); +const u32 gEventObjectPic_CyclingTriathleteF_8[] = INCBIN_U32("graphics/event_objects/pics/people/cycling_triathlete_f/8.4bpp"); +const u32 gEventObjectPic_Man5_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/0.4bpp"); +const u32 gEventObjectPic_Man5_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/1.4bpp"); +const u32 gEventObjectPic_Man5_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/2.4bpp"); +const u32 gEventObjectPic_Man5_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/3.4bpp"); +const u32 gEventObjectPic_Man5_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/4.4bpp"); +const u32 gEventObjectPic_Man5_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/5.4bpp"); +const u32 gEventObjectPic_Man5_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/6.4bpp"); +const u32 gEventObjectPic_Man5_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/7.4bpp"); +const u32 gEventObjectPic_Man5_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_5/8.4bpp"); +const u32 gEventObjectPic_Man6_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/0.4bpp"); +const u32 gEventObjectPic_Man6_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/1.4bpp"); +const u32 gEventObjectPic_Man6_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/2.4bpp"); +const u32 gEventObjectPic_Man6_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/3.4bpp"); +const u32 gEventObjectPic_Man6_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/4.4bpp"); +const u32 gEventObjectPic_Man6_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/5.4bpp"); +const u32 gEventObjectPic_Man6_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/6.4bpp"); +const u32 gEventObjectPic_Man6_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/7.4bpp"); +const u32 gEventObjectPic_Man6_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_6/8.4bpp"); +const u32 gEventObjectPic_Nurse_0[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/0.4bpp"); +const u32 gEventObjectPic_Nurse_1[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/1.4bpp"); +const u32 gEventObjectPic_Nurse_2[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/2.4bpp"); +const u32 gEventObjectPic_Nurse_3[] = INCBIN_U32("graphics/event_objects/pics/people/nurse/3.4bpp"); +const u32 gEventObjectPic_ItemBall[] = INCBIN_U32("graphics/event_objects/pics/misc/item_ball.4bpp"); +const u32 gEventObjectPic_ProfBirch_0[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/0.4bpp"); +const u32 gEventObjectPic_ProfBirch_1[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/1.4bpp"); +const u32 gEventObjectPic_ProfBirch_2[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/2.4bpp"); +const u32 gEventObjectPic_ProfBirch_3[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/3.4bpp"); +const u32 gEventObjectPic_ProfBirch_4[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/4.4bpp"); +const u32 gEventObjectPic_ProfBirch_5[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/5.4bpp"); +const u32 gEventObjectPic_ProfBirch_6[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/6.4bpp"); +const u32 gEventObjectPic_ProfBirch_7[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/7.4bpp"); +const u32 gEventObjectPic_ProfBirch_8[] = INCBIN_U32("graphics/event_objects/pics/people/prof_birch/8.4bpp"); +const u32 gEventObjectPic_ReporterM_0[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/0.4bpp"); +const u32 gEventObjectPic_ReporterM_1[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/1.4bpp"); +const u32 gEventObjectPic_ReporterM_2[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/2.4bpp"); +const u32 gEventObjectPic_ReporterM_3[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/3.4bpp"); +const u32 gEventObjectPic_ReporterM_4[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/4.4bpp"); +const u32 gEventObjectPic_ReporterM_5[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/5.4bpp"); +const u32 gEventObjectPic_ReporterM_6[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/6.4bpp"); +const u32 gEventObjectPic_ReporterM_7[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/7.4bpp"); +const u32 gEventObjectPic_ReporterM_8[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_m/8.4bpp"); +const u32 gEventObjectPic_ReporterF_0[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/0.4bpp"); +const u32 gEventObjectPic_ReporterF_1[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/1.4bpp"); +const u32 gEventObjectPic_ReporterF_2[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/2.4bpp"); +const u32 gEventObjectPic_ReporterF_3[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/3.4bpp"); +const u32 gEventObjectPic_ReporterF_4[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/4.4bpp"); +const u32 gEventObjectPic_ReporterF_5[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/5.4bpp"); +const u32 gEventObjectPic_ReporterF_6[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/6.4bpp"); +const u32 gEventObjectPic_ReporterF_7[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/7.4bpp"); +const u32 gEventObjectPic_ReporterF_8[] = INCBIN_U32("graphics/event_objects/pics/people/reporter_f/8.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_0[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/0.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_1[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/1.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_2[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/2.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_3[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/3.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_4[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/4.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_5[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/5.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_6[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/6.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_7[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/7.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan1_8[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_1/8.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_0[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/0.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_1[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/1.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_2[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/2.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_3[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/3.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_4[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/4.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_5[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/5.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_6[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/6.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_7[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/7.4bpp"); +const u32 gEventObjectPic_MauvilleOldMan2_8[] = INCBIN_U32("graphics/event_objects/pics/people/mauville_old_man_2/8.4bpp"); +const u32 gEventObjectPic_MartEmployee_0[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/0.4bpp"); +const u32 gEventObjectPic_MartEmployee_1[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/1.4bpp"); +const u32 gEventObjectPic_MartEmployee_2[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/2.4bpp"); +const u32 gEventObjectPic_MartEmployee_3[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/3.4bpp"); +const u32 gEventObjectPic_MartEmployee_4[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/4.4bpp"); +const u32 gEventObjectPic_MartEmployee_5[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/5.4bpp"); +const u32 gEventObjectPic_MartEmployee_6[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/6.4bpp"); +const u32 gEventObjectPic_MartEmployee_7[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/7.4bpp"); +const u32 gEventObjectPic_MartEmployee_8[] = INCBIN_U32("graphics/event_objects/pics/people/mart_employee/8.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_0[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/0.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_1[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/1.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_2[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/2.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_3[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/3.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_4[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/4.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_5[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/5.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_6[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/6.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_7[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/7.4bpp"); +const u32 gEventObjectPic_RooftopSaleWoman_8[] = INCBIN_U32("graphics/event_objects/pics/people/rooftop_sale_woman/8.4bpp"); +const u32 gEventObjectPic_Teala_0[] = INCBIN_U32("graphics/event_objects/pics/people/teala/0.4bpp"); +const u32 gEventObjectPic_Teala_1[] = INCBIN_U32("graphics/event_objects/pics/people/teala/1.4bpp"); +const u32 gEventObjectPic_Teala_2[] = INCBIN_U32("graphics/event_objects/pics/people/teala/2.4bpp"); +const u32 gEventObjectPic_Teala_3[] = INCBIN_U32("graphics/event_objects/pics/people/teala/3.4bpp"); +const u32 gEventObjectPic_Teala_4[] = INCBIN_U32("graphics/event_objects/pics/people/teala/4.4bpp"); +const u32 gEventObjectPic_Teala_5[] = INCBIN_U32("graphics/event_objects/pics/people/teala/5.4bpp"); +const u32 gEventObjectPic_Teala_6[] = INCBIN_U32("graphics/event_objects/pics/people/teala/6.4bpp"); +const u32 gEventObjectPic_Teala_7[] = INCBIN_U32("graphics/event_objects/pics/people/teala/7.4bpp"); +const u32 gEventObjectPic_Teala_8[] = INCBIN_U32("graphics/event_objects/pics/people/teala/8.4bpp"); +const u32 gEventObjectPic_Artist_0[] = INCBIN_U32("graphics/event_objects/pics/people/artist/0.4bpp"); +const u32 gEventObjectPic_Artist_1[] = INCBIN_U32("graphics/event_objects/pics/people/artist/1.4bpp"); +const u32 gEventObjectPic_Artist_2[] = INCBIN_U32("graphics/event_objects/pics/people/artist/2.4bpp"); +const u32 gEventObjectPic_Artist_3[] = INCBIN_U32("graphics/event_objects/pics/people/artist/3.4bpp"); +const u32 gEventObjectPic_Artist_4[] = INCBIN_U32("graphics/event_objects/pics/people/artist/4.4bpp"); +const u32 gEventObjectPic_Artist_5[] = INCBIN_U32("graphics/event_objects/pics/people/artist/5.4bpp"); +const u32 gEventObjectPic_Artist_6[] = INCBIN_U32("graphics/event_objects/pics/people/artist/6.4bpp"); +const u32 gEventObjectPic_Artist_7[] = INCBIN_U32("graphics/event_objects/pics/people/artist/7.4bpp"); +const u32 gEventObjectPic_Artist_8[] = INCBIN_U32("graphics/event_objects/pics/people/artist/8.4bpp"); +const u32 gEventObjectPic_Cameraman_0[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/0.4bpp"); +const u32 gEventObjectPic_Cameraman_1[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/1.4bpp"); +const u32 gEventObjectPic_Cameraman_2[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/2.4bpp"); +const u32 gEventObjectPic_Cameraman_3[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/3.4bpp"); +const u32 gEventObjectPic_Cameraman_4[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/4.4bpp"); +const u32 gEventObjectPic_Cameraman_5[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/5.4bpp"); +const u32 gEventObjectPic_Cameraman_6[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/6.4bpp"); +const u32 gEventObjectPic_Cameraman_7[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/7.4bpp"); +const u32 gEventObjectPic_Cameraman_8[] = INCBIN_U32("graphics/event_objects/pics/people/cameraman/8.4bpp"); +const u32 gEventObjectPic_Scientist2_0[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/0.4bpp"); +const u32 gEventObjectPic_Scientist2_1[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/1.4bpp"); +const u32 gEventObjectPic_Scientist2_2[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/2.4bpp"); +const u32 gEventObjectPic_Scientist2_3[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/3.4bpp"); +const u32 gEventObjectPic_Scientist2_4[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/4.4bpp"); +const u32 gEventObjectPic_Scientist2_5[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/5.4bpp"); +const u32 gEventObjectPic_Scientist2_6[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/6.4bpp"); +const u32 gEventObjectPic_Scientist2_7[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/7.4bpp"); +const u32 gEventObjectPic_Scientist2_8[] = INCBIN_U32("graphics/event_objects/pics/people/scientist_2/8.4bpp"); +const u32 gEventObjectPic_Man7_0[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/0.4bpp"); +const u32 gEventObjectPic_Man7_1[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/1.4bpp"); +const u32 gEventObjectPic_Man7_2[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/2.4bpp"); +const u32 gEventObjectPic_Man7_3[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/3.4bpp"); +const u32 gEventObjectPic_Man7_4[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/4.4bpp"); +const u32 gEventObjectPic_Man7_5[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/5.4bpp"); +const u32 gEventObjectPic_Man7_6[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/6.4bpp"); +const u32 gEventObjectPic_Man7_7[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/7.4bpp"); +const u32 gEventObjectPic_Man7_8[] = INCBIN_U32("graphics/event_objects/pics/people/man_7/8.4bpp"); +const u32 gEventObjectPic_AquaMemberM_0[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/0.4bpp"); +const u32 gEventObjectPic_AquaMemberM_1[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/1.4bpp"); +const u32 gEventObjectPic_AquaMemberM_2[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/2.4bpp"); +const u32 gEventObjectPic_AquaMemberM_3[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/3.4bpp"); +const u32 gEventObjectPic_AquaMemberM_4[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/4.4bpp"); +const u32 gEventObjectPic_AquaMemberM_5[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/5.4bpp"); +const u32 gEventObjectPic_AquaMemberM_6[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/6.4bpp"); +const u32 gEventObjectPic_AquaMemberM_7[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/7.4bpp"); +const u32 gEventObjectPic_AquaMemberM_8[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_m/8.4bpp"); +const u32 gEventObjectPic_AquaMemberF_0[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/0.4bpp"); +const u32 gEventObjectPic_AquaMemberF_1[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/1.4bpp"); +const u32 gEventObjectPic_AquaMemberF_2[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/2.4bpp"); +const u32 gEventObjectPic_AquaMemberF_3[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/3.4bpp"); +const u32 gEventObjectPic_AquaMemberF_4[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/4.4bpp"); +const u32 gEventObjectPic_AquaMemberF_5[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/5.4bpp"); +const u32 gEventObjectPic_AquaMemberF_6[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/6.4bpp"); +const u32 gEventObjectPic_AquaMemberF_7[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/7.4bpp"); +const u32 gEventObjectPic_AquaMemberF_8[] = INCBIN_U32("graphics/event_objects/pics/people/aqua_member_f/8.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_0[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/0.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_1[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/1.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_2[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/2.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_3[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/3.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_4[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/4.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_5[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/5.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_6[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/6.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_7[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/7.4bpp"); +const u32 gEventObjectPic_MagmaMemberM_8[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_m/8.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_0[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/0.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_1[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/1.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_2[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/2.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_3[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/3.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_4[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/4.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_5[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/5.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_6[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/6.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_7[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/7.4bpp"); +const u32 gEventObjectPic_MagmaMemberF_8[] = INCBIN_U32("graphics/event_objects/pics/people/magma_member_f/8.4bpp"); +const u32 gEventObjectPic_Sidney_0[] = INCBIN_U32("graphics/event_objects/pics/people/sidney/0.4bpp"); +const u32 gEventObjectPic_Sidney_1[] = INCBIN_U32("graphics/event_objects/pics/people/sidney/1.4bpp"); +const u32 gEventObjectPic_Sidney_2[] = INCBIN_U32("graphics/event_objects/pics/people/sidney/2.4bpp"); +const u32 gEventObjectPic_Phoebe_0[] = INCBIN_U32("graphics/event_objects/pics/people/phoebe/0.4bpp"); +const u32 gEventObjectPic_Phoebe_1[] = INCBIN_U32("graphics/event_objects/pics/people/phoebe/1.4bpp"); +const u32 gEventObjectPic_Phoebe_2[] = INCBIN_U32("graphics/event_objects/pics/people/phoebe/2.4bpp"); +const u32 gEventObjectPic_Glacia_0[] = INCBIN_U32("graphics/event_objects/pics/people/glacia/0.4bpp"); +const u32 gEventObjectPic_Glacia_1[] = INCBIN_U32("graphics/event_objects/pics/people/glacia/1.4bpp"); +const u32 gEventObjectPic_Glacia_2[] = INCBIN_U32("graphics/event_objects/pics/people/glacia/2.4bpp"); +const u32 gEventObjectPic_Drake_0[] = INCBIN_U32("graphics/event_objects/pics/people/drake/0.4bpp"); +const u32 gEventObjectPic_Drake_1[] = INCBIN_U32("graphics/event_objects/pics/people/drake/1.4bpp"); +const u32 gEventObjectPic_Drake_2[] = INCBIN_U32("graphics/event_objects/pics/people/drake/2.4bpp"); +const u32 gEventObjectPic_Roxanne_0[] = INCBIN_U32("graphics/event_objects/pics/people/roxanne/0.4bpp"); +const u32 gEventObjectPic_Roxanne_1[] = INCBIN_U32("graphics/event_objects/pics/people/roxanne/1.4bpp"); +const u32 gEventObjectPic_Roxanne_2[] = INCBIN_U32("graphics/event_objects/pics/people/roxanne/2.4bpp"); +const u32 gEventObjectPic_Brawly_0[] = INCBIN_U32("graphics/event_objects/pics/people/brawly/0.4bpp"); +const u32 gEventObjectPic_Brawly_1[] = INCBIN_U32("graphics/event_objects/pics/people/brawly/1.4bpp"); +const u32 gEventObjectPic_Brawly_2[] = INCBIN_U32("graphics/event_objects/pics/people/brawly/2.4bpp"); +const u32 gEventObjectPic_Wattson_0[] = INCBIN_U32("graphics/event_objects/pics/people/wattson/0.4bpp"); +const u32 gEventObjectPic_Wattson_1[] = INCBIN_U32("graphics/event_objects/pics/people/wattson/1.4bpp"); +const u32 gEventObjectPic_Wattson_2[] = INCBIN_U32("graphics/event_objects/pics/people/wattson/2.4bpp"); +const u32 gEventObjectPic_Flannery_0[] = INCBIN_U32("graphics/event_objects/pics/people/flannery/0.4bpp"); +const u32 gEventObjectPic_Flannery_1[] = INCBIN_U32("graphics/event_objects/pics/people/flannery/1.4bpp"); +const u32 gEventObjectPic_Flannery_2[] = INCBIN_U32("graphics/event_objects/pics/people/flannery/2.4bpp"); +const u32 gEventObjectPic_Norman_0[] = INCBIN_U32("graphics/event_objects/pics/people/norman/0.4bpp"); +const u32 gEventObjectPic_Norman_1[] = INCBIN_U32("graphics/event_objects/pics/people/norman/1.4bpp"); +const u32 gEventObjectPic_Norman_2[] = INCBIN_U32("graphics/event_objects/pics/people/norman/2.4bpp"); +const u32 gEventObjectPic_Norman_3[] = INCBIN_U32("graphics/event_objects/pics/people/norman/3.4bpp"); +const u32 gEventObjectPic_Norman_4[] = INCBIN_U32("graphics/event_objects/pics/people/norman/4.4bpp"); +const u32 gEventObjectPic_Norman_5[] = INCBIN_U32("graphics/event_objects/pics/people/norman/5.4bpp"); +const u32 gEventObjectPic_Norman_6[] = INCBIN_U32("graphics/event_objects/pics/people/norman/6.4bpp"); +const u32 gEventObjectPic_Norman_7[] = INCBIN_U32("graphics/event_objects/pics/people/norman/7.4bpp"); +const u32 gEventObjectPic_Norman_8[] = INCBIN_U32("graphics/event_objects/pics/people/norman/8.4bpp"); +const u32 gEventObjectPic_Winona_0[] = INCBIN_U32("graphics/event_objects/pics/people/winona/0.4bpp"); +const u32 gEventObjectPic_Winona_1[] = INCBIN_U32("graphics/event_objects/pics/people/winona/1.4bpp"); +const u32 gEventObjectPic_Winona_2[] = INCBIN_U32("graphics/event_objects/pics/people/winona/2.4bpp"); +const u32 gEventObjectPic_Liza_0[] = INCBIN_U32("graphics/event_objects/pics/people/liza/0.4bpp"); +const u32 gEventObjectPic_Liza_1[] = INCBIN_U32("graphics/event_objects/pics/people/liza/1.4bpp"); +const u32 gEventObjectPic_Liza_2[] = INCBIN_U32("graphics/event_objects/pics/people/liza/2.4bpp"); +const u32 gEventObjectPic_Tate_0[] = INCBIN_U32("graphics/event_objects/pics/people/tate/0.4bpp"); +const u32 gEventObjectPic_Tate_1[] = INCBIN_U32("graphics/event_objects/pics/people/tate/1.4bpp"); +const u32 gEventObjectPic_Tate_2[] = INCBIN_U32("graphics/event_objects/pics/people/tate/2.4bpp"); +const u32 gEventObjectPic_Wallace_0[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/0.4bpp"); +const u32 gEventObjectPic_Wallace_1[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/1.4bpp"); +const u32 gEventObjectPic_Wallace_2[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/2.4bpp"); +const u32 gEventObjectPic_Wallace_3[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/3.4bpp"); +const u32 gEventObjectPic_Wallace_4[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/4.4bpp"); +const u32 gEventObjectPic_Wallace_5[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/5.4bpp"); +const u32 gEventObjectPic_Wallace_6[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/6.4bpp"); +const u32 gEventObjectPic_Wallace_7[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/7.4bpp"); +const u32 gEventObjectPic_Wallace_8[] = INCBIN_U32("graphics/event_objects/pics/people/wallace/8.4bpp"); +const u32 gEventObjectPic_Steven_0[] = INCBIN_U32("graphics/event_objects/pics/people/steven/0.4bpp"); +const u32 gEventObjectPic_Steven_1[] = INCBIN_U32("graphics/event_objects/pics/people/steven/1.4bpp"); +const u32 gEventObjectPic_Steven_2[] = INCBIN_U32("graphics/event_objects/pics/people/steven/2.4bpp"); +const u32 gEventObjectPic_Steven_3[] = INCBIN_U32("graphics/event_objects/pics/people/steven/3.4bpp"); +const u32 gEventObjectPic_Steven_4[] = INCBIN_U32("graphics/event_objects/pics/people/steven/4.4bpp"); +const u32 gEventObjectPic_Steven_5[] = INCBIN_U32("graphics/event_objects/pics/people/steven/5.4bpp"); +const u32 gEventObjectPic_Steven_6[] = INCBIN_U32("graphics/event_objects/pics/people/steven/6.4bpp"); +const u32 gEventObjectPic_Steven_7[] = INCBIN_U32("graphics/event_objects/pics/people/steven/7.4bpp"); +const u32 gEventObjectPic_Steven_8[] = INCBIN_U32("graphics/event_objects/pics/people/steven/8.4bpp"); +const u32 gEventObjectPic_Wally_0[] = INCBIN_U32("graphics/event_objects/pics/people/wally/0.4bpp"); +const u32 gEventObjectPic_Wally_1[] = INCBIN_U32("graphics/event_objects/pics/people/wally/1.4bpp"); +const u32 gEventObjectPic_Wally_2[] = INCBIN_U32("graphics/event_objects/pics/people/wally/2.4bpp"); +const u32 gEventObjectPic_Wally_3[] = INCBIN_U32("graphics/event_objects/pics/people/wally/3.4bpp"); +const u32 gEventObjectPic_Wally_4[] = INCBIN_U32("graphics/event_objects/pics/people/wally/4.4bpp"); +const u32 gEventObjectPic_Wally_5[] = INCBIN_U32("graphics/event_objects/pics/people/wally/5.4bpp"); +const u32 gEventObjectPic_Wally_6[] = INCBIN_U32("graphics/event_objects/pics/people/wally/6.4bpp"); +const u32 gEventObjectPic_Wally_7[] = INCBIN_U32("graphics/event_objects/pics/people/wally/7.4bpp"); +const u32 gEventObjectPic_Wally_8[] = INCBIN_U32("graphics/event_objects/pics/people/wally/8.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_0[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/0.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_1[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/1.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_2[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/2.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_3[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/3.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_4[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/4.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_5[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/5.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_6[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/6.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_7[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/7.4bpp"); +const u32 gEventObjectPic_RubySapphireLittleBoy_8[] = INCBIN_U32("graphics/event_objects/pics/people/ruby_sapphire_little_boy/8.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_0[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/0.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_1[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/1.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_2[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/2.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_3[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/3.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_4[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/4.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_5[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/5.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_6[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/6.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_7[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/7.4bpp"); +const u32 gEventObjectPic_HotSpringsOldWoman_8[] = INCBIN_U32("graphics/event_objects/pics/people/hot_springs_old_woman/8.4bpp"); +const u32 gEventObjectPic_LatiasLatios_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios/0.4bpp"); +const u32 gEventObjectPic_LatiasLatios_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios/1.4bpp"); +const u32 gEventObjectPic_LatiasLatios_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/latias_latios/2.4bpp"); +const u32 gEventObjectPic_Boy5_0[] = INCBIN_U32("graphics/event_objects/pics/people/boy_5/0.4bpp"); +const u32 gEventObjectPic_Boy5_1[] = INCBIN_U32("graphics/event_objects/pics/people/boy_5/1.4bpp"); +const u32 gEventObjectPic_Boy5_2[] = INCBIN_U32("graphics/event_objects/pics/people/boy_5/2.4bpp"); +const u32 gEventObjectPic_ContestOldMan_0[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/0.4bpp"); +const u32 gEventObjectPic_ContestOldMan_1[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/1.4bpp"); +const u32 gEventObjectPic_ContestOldMan_2[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/2.4bpp"); +const u32 gEventObjectPic_ContestOldMan_3[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/3.4bpp"); +const u32 gEventObjectPic_ContestOldMan_4[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/4.4bpp"); +const u32 gEventObjectPic_ContestOldMan_5[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/5.4bpp"); +const u32 gEventObjectPic_ContestOldMan_6[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/6.4bpp"); +const u32 gEventObjectPic_ContestOldMan_7[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/7.4bpp"); +const u32 gEventObjectPic_ContestOldMan_8[] = INCBIN_U32("graphics/event_objects/pics/people/contest_old_man/8.4bpp"); +const u32 gEventObjectPic_Archie_0[] = INCBIN_U32("graphics/event_objects/pics/people/archie/0.4bpp"); +const u32 gEventObjectPic_Archie_1[] = INCBIN_U32("graphics/event_objects/pics/people/archie/1.4bpp"); +const u32 gEventObjectPic_Archie_2[] = INCBIN_U32("graphics/event_objects/pics/people/archie/2.4bpp"); +const u32 gEventObjectPic_Archie_3[] = INCBIN_U32("graphics/event_objects/pics/people/archie/3.4bpp"); +const u32 gEventObjectPic_Archie_4[] = INCBIN_U32("graphics/event_objects/pics/people/archie/4.4bpp"); +const u32 gEventObjectPic_Archie_5[] = INCBIN_U32("graphics/event_objects/pics/people/archie/5.4bpp"); +const u32 gEventObjectPic_Archie_6[] = INCBIN_U32("graphics/event_objects/pics/people/archie/6.4bpp"); +const u32 gEventObjectPic_Archie_7[] = INCBIN_U32("graphics/event_objects/pics/people/archie/7.4bpp"); +const u32 gEventObjectPic_Archie_8[] = INCBIN_U32("graphics/event_objects/pics/people/archie/8.4bpp"); +const u32 gEventObjectPic_Maxie_0[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/0.4bpp"); +const u32 gEventObjectPic_Maxie_1[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/1.4bpp"); +const u32 gEventObjectPic_Maxie_2[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/2.4bpp"); +const u32 gEventObjectPic_Maxie_3[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/3.4bpp"); +const u32 gEventObjectPic_Maxie_4[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/4.4bpp"); +const u32 gEventObjectPic_Maxie_5[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/5.4bpp"); +const u32 gEventObjectPic_Maxie_6[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/6.4bpp"); +const u32 gEventObjectPic_Maxie_7[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/7.4bpp"); +const u32 gEventObjectPic_Maxie_8[] = INCBIN_U32("graphics/event_objects/pics/people/maxie/8.4bpp"); +const u32 gEventObjectPic_KyogreFront_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_front/0.4bpp"); +const u32 gEventObjectPic_KyogreFront_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_front/1.4bpp"); +const u32 gEventObjectPic_KyogreSide_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_side/0.4bpp"); +const u32 gEventObjectPic_KyogreSide_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kyogre_side/1.4bpp"); +const u32 gEventObjectPic_GroudonFront_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_front/0.4bpp"); +const u32 gEventObjectPic_GroudonFront_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_front/1.4bpp"); +const u32 gEventObjectPic_GroudonSide_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_side/0.4bpp"); +const u32 gEventObjectPic_GroudonSide_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/groudon_side/1.4bpp"); +const u32 gEventObjectPic_Regi[] = INCBIN_U32("graphics/event_objects/pics/pokemon/regi.4bpp"); +const u32 gEventObjectPic_Skitty_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty/0.4bpp"); +const u32 gEventObjectPic_Skitty_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty/1.4bpp"); +const u32 gEventObjectPic_Skitty_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/skitty/2.4bpp"); +const u32 gEventObjectPic_Kecleon_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon/0.4bpp"); +const u32 gEventObjectPic_Kecleon_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon/1.4bpp"); +const u32 gEventObjectPic_Kecleon_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kecleon/2.4bpp"); +const u32 gEventObjectPic_Rayquaza_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/0.4bpp"); +const u32 gEventObjectPic_Rayquaza_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/1.4bpp"); +const u32 gEventObjectPic_Rayquaza_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/2.4bpp"); +const u32 gEventObjectPic_Rayquaza_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/3.4bpp"); +const u32 gEventObjectPic_Rayquaza_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza/4.4bpp"); +const u32 gEventObjectPic_RayquazaStill[] = INCBIN_U32("graphics/event_objects/pics/pokemon/rayquaza_still.4bpp"); +const u32 gEventObjectPic_Zigzagoon_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon/0.4bpp"); +const u32 gEventObjectPic_Zigzagoon_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon/1.4bpp"); +const u32 gEventObjectPic_Zigzagoon_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/zigzagoon/2.4bpp"); +const u32 gEventObjectPic_Pikachu_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu/0.4bpp"); +const u32 gEventObjectPic_Pikachu_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu/1.4bpp"); +const u32 gEventObjectPic_Pikachu_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/pikachu/2.4bpp"); +const u32 gEventObjectPic_Azumarill_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill/0.4bpp"); +const u32 gEventObjectPic_Azumarill_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill/1.4bpp"); +const u32 gEventObjectPic_Azumarill_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azumarill/2.4bpp"); +const u32 gEventObjectPic_Wingull_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/0.4bpp"); +const u32 gEventObjectPic_Wingull_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/3.4bpp"); +const u32 gEventObjectPic_Wingull_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/1.4bpp"); +const u32 gEventObjectPic_Wingull_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/4.4bpp"); +const u32 gEventObjectPic_Wingull_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/2.4bpp"); +const u32 gEventObjectPic_Wingull_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/wingull/5.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_0[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/0.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_1[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/1.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_2[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/2.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_3[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/3.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_4[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/4.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_5[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/5.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_6[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/6.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_7[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/7.4bpp"); +const u32 gEventObjectPic_TuberMSwimming_8[] = INCBIN_U32("graphics/event_objects/pics/people/tuber_m_swimming/8.4bpp"); +const u32 gEventObjectPic_Azurill_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill/0.4bpp"); +const u32 gEventObjectPic_Azurill_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill/1.4bpp"); +const u32 gEventObjectPic_Azurill_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/azurill/2.4bpp"); +const u32 gEventObjectPic_Mom_0[] = INCBIN_U32("graphics/event_objects/pics/people/mom/0.4bpp"); +const u32 gEventObjectPic_Mom_1[] = INCBIN_U32("graphics/event_objects/pics/people/mom/1.4bpp"); +const u32 gEventObjectPic_Mom_2[] = INCBIN_U32("graphics/event_objects/pics/people/mom/2.4bpp"); +const u32 gEventObjectPic_Mom_3[] = INCBIN_U32("graphics/event_objects/pics/people/mom/3.4bpp"); +const u32 gEventObjectPic_Mom_4[] = INCBIN_U32("graphics/event_objects/pics/people/mom/4.4bpp"); +const u32 gEventObjectPic_Mom_5[] = INCBIN_U32("graphics/event_objects/pics/people/mom/5.4bpp"); +const u32 gEventObjectPic_Mom_6[] = INCBIN_U32("graphics/event_objects/pics/people/mom/6.4bpp"); +const u32 gEventObjectPic_Mom_7[] = INCBIN_U32("graphics/event_objects/pics/people/mom/7.4bpp"); +const u32 gEventObjectPic_Mom_8[] = INCBIN_U32("graphics/event_objects/pics/people/mom/8.4bpp"); +const u16 gEventObjectPalette22[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_22.gbapal"); +const u16 gEventObjectPalette23[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_23.gbapal"); +const u16 gEventObjectPalette24[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_24.gbapal"); +const u16 gEventObjectPalette25[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_25.gbapal"); +const u32 gEventObjectPic_UnusedNatuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_natu_doll.4bpp"); +const u32 gEventObjectPic_UnusedMagnemiteDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_magnemite_doll.4bpp"); +const u32 gEventObjectPic_UnusedSquirtleDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_squirtle_doll.4bpp"); +const u32 gEventObjectPic_UnusedWooperDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_wooper_doll.4bpp"); +const u32 gEventObjectPic_UnusedPikachuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_pikachu_doll.4bpp"); +const u32 gEventObjectPic_UnusedPorygon2Doll[] = INCBIN_U32("graphics/event_objects/pics/dolls/unused_porygon2_doll.4bpp"); +const u32 gEventObjectPic_PichuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/pichu_doll.4bpp"); +const u32 gEventObjectPic_PikachuDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/pikachu_doll.4bpp"); +const u32 gEventObjectPic_MarillDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/marill_doll.4bpp"); +const u32 gEventObjectPic_TogepiDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/togepi_doll.4bpp"); +const u32 gEventObjectPic_CyndaquilDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/cyndaquil_doll.4bpp"); +const u32 gEventObjectPic_ChikoritaDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/chikorita_doll.4bpp"); +const u32 gEventObjectPic_TotodileDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/totodile_doll.4bpp"); +const u32 gEventObjectPic_JigglypuffDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/jigglypuff_doll.4bpp"); +const u32 gEventObjectPic_MeowthDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/meowth_doll.4bpp"); +const u32 gEventObjectPic_ClefairyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/clefairy_doll.4bpp"); +const u32 gEventObjectPic_DittoDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/ditto_doll.4bpp"); +const u32 gEventObjectPic_SmoochumDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/smoochum_doll.4bpp"); +const u32 gEventObjectPic_TreeckoDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/treecko_doll.4bpp"); +const u32 gEventObjectPic_TorchicDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/torchic_doll.4bpp"); +const u32 gEventObjectPic_MudkipDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/mudkip_doll.4bpp"); +const u32 gEventObjectPic_DuskullDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/duskull_doll.4bpp"); +const u32 gEventObjectPic_WynautDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/wynaut_doll.4bpp"); +const u32 gEventObjectPic_BaltoyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/baltoy_doll.4bpp"); +const u32 gEventObjectPic_KecleonDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/kecleon_doll.4bpp"); +const u32 gEventObjectPic_AzurillDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/azurill_doll.4bpp"); +const u32 gEventObjectPic_SkittyDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/skitty_doll.4bpp"); +const u32 gEventObjectPic_SwabluDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/swablu_doll.4bpp"); +const u32 gEventObjectPic_GulpinDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/gulpin_doll.4bpp"); +const u32 gEventObjectPic_LotadDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/lotad_doll.4bpp"); +const u32 gEventObjectPic_SeedotDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/seedot_doll.4bpp"); +const u32 gEventObjectPic_PikaCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/pika_cushion.4bpp"); +const u32 gEventObjectPic_RoundCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/round_cushion.4bpp"); +const u32 gEventObjectPic_KissCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/kiss_cushion.4bpp"); +const u32 gEventObjectPic_ZigzagCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/zigzag_cushion.4bpp"); +const u32 gEventObjectPic_SpinCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/spin_cushion.4bpp"); +const u32 gEventObjectPic_DiamondCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/diamond_cushion.4bpp"); +const u32 gEventObjectPic_BallCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/ball_cushion.4bpp"); +const u32 gEventObjectPic_GrassCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/grass_cushion.4bpp"); +const u32 gEventObjectPic_FireCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/fire_cushion.4bpp"); +const u32 gEventObjectPic_WaterCushion[] = INCBIN_U32("graphics/event_objects/pics/cushions/water_cushion.4bpp"); +const u32 gEventObjectPic_BigSnorlaxDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_snorlax_doll.4bpp"); +const u32 gEventObjectPic_BigRhydonDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_rhydon_doll.4bpp"); +const u32 gEventObjectPic_BigLaprasDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_lapras_doll.4bpp"); +const u32 gEventObjectPic_BigVenusaurDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_venusaur_doll.4bpp"); +const u32 gEventObjectPic_BigCharizardDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_charizard_doll.4bpp"); +const u32 gEventObjectPic_BigBlastoiseDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_blastoise_doll.4bpp"); +const u32 gEventObjectPic_BigWailmerDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_wailmer_doll.4bpp"); +const u32 gEventObjectPic_BigRegirockDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_regirock_doll.4bpp"); +const u32 gEventObjectPic_BigRegiceDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_regice_doll.4bpp"); +const u32 gEventObjectPic_BigRegisteelDoll[] = INCBIN_U32("graphics/event_objects/pics/dolls/big_registeel_doll.4bpp"); +const u32 gEventObjectPic_CuttableTree_0[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/0.4bpp"); +const u32 gEventObjectPic_CuttableTree_1[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/1.4bpp"); +const u32 gEventObjectPic_CuttableTree_2[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/2.4bpp"); +const u32 gEventObjectPic_CuttableTree_3[] = INCBIN_U32("graphics/event_objects/pics/misc/cuttable_tree/3.4bpp"); +const u32 gEventObjectPic_BreakableRock_0[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/0.4bpp"); +const u32 gEventObjectPic_BreakableRock_1[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/1.4bpp"); +const u32 gEventObjectPic_BreakableRock_2[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/2.4bpp"); +const u32 gEventObjectPic_BreakableRock_3[] = INCBIN_U32("graphics/event_objects/pics/misc/breakable_rock/3.4bpp"); +const u32 gEventObjectPic_PushableBoulder[] = INCBIN_U32("graphics/event_objects/pics/misc/pushable_boulder.4bpp"); +const u32 gEventObjectPic_MrBrineysBoat_0[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat/0.4bpp"); +const u32 gEventObjectPic_MrBrineysBoat_1[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat/1.4bpp"); +const u32 gEventObjectPic_MrBrineysBoat_2[] = INCBIN_U32("graphics/event_objects/pics/misc/mr_brineys_boat/2.4bpp"); +const u32 gEventObjectPic_Fossil[] = INCBIN_U32("graphics/event_objects/pics/misc/fossil.4bpp"); +const u32 gEventObjectPic_SubmarineShadow[] = INCBIN_U32("graphics/event_objects/pics/misc/submarine_shadow.4bpp"); +const u16 gEventObjectPalette26[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_26.gbapal"); +const u32 gEventObjectPic_Truck[] = INCBIN_U32("graphics/event_objects/pics/misc/truck.4bpp"); +const u16 gEventObjectPalette14[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_14.gbapal"); +const u32 gEventObjectPic_VigorothCarryingBox_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_carrying_box/0.4bpp"); +const u32 gEventObjectPic_VigorothCarryingBox_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_carrying_box/1.4bpp"); +const u32 gEventObjectPic_VigorothCarryingBox_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_carrying_box/2.4bpp"); +const u32 gEventObjectPic_VigorothFacingAway_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_facing_away/0.4bpp"); +const u32 gEventObjectPic_VigorothFacingAway_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/vigoroth_facing_away/1.4bpp"); +const u16 gEventObjectPalette15[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_15.gbapal"); +const u32 gEventObjectPic_BirchsBag[] = INCBIN_U32("graphics/event_objects/pics/misc/birchs_bag.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/0.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/1.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/2.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/3.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/4.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/5.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/6.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/7.4bpp"); +const u32 gEventObjectPic_EnemyZigzagoon_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/enemy_zigzagoon/8.4bpp"); +const u16 gEventObjectPalette16[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_16.gbapal"); +const u32 gEventObjectPic_Poochyena_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/0.4bpp"); +const u32 gEventObjectPic_Poochyena_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/1.4bpp"); +const u32 gEventObjectPic_Poochyena_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/2.4bpp"); +const u32 gEventObjectPic_Poochyena_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/3.4bpp"); +const u32 gEventObjectPic_Poochyena_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/4.4bpp"); +const u32 gEventObjectPic_Poochyena_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/5.4bpp"); +const u32 gEventObjectPic_Poochyena_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/6.4bpp"); +const u32 gEventObjectPic_Poochyena_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/7.4bpp"); +const u32 gEventObjectPic_Poochyena_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/poochyena/8.4bpp"); +const u16 gEventObjectPalette27[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_27.gbapal"); +const u32 gEventObjectPic_CableCar[] = INCBIN_U32("graphics/event_objects/pics/misc/cable_car.4bpp"); +const u16 gEventObjectPalette20[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_20.gbapal"); +const u32 gEventObjectPic_SSTidal[] = INCBIN_U32("graphics/event_objects/pics/misc/ss_tidal.4bpp"); +const u16 gEventObjectPalette21[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_21.gbapal"); +const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_0[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/0.4bpp"); +const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_1[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/1.4bpp"); +const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_2[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/2.4bpp"); +const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_3[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/3.4bpp"); +const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_4[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/4.4bpp"); +const u32 gFieldEffectObjectPic_BerryTreeGrowthSparkle_5[] = INCBIN_U32("graphics/event_objects/pics/effects/berry_tree_growth_sparkle/5.4bpp"); +const u32 gEventObjectPic_BerryTreeDirtPile[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/dirt_pile.4bpp"); +const u32 gEventObjectPic_BerryTreeSprout_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sprout/0.4bpp"); +const u32 gEventObjectPic_BerryTreeSprout_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sprout/1.4bpp"); +const u32 gEventObjectPic_PechaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/0.4bpp"); +const u32 gEventObjectPic_PechaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/1.4bpp"); +const u32 gEventObjectPic_PechaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/2.4bpp"); +const u32 gEventObjectPic_PechaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/3.4bpp"); +const u32 gEventObjectPic_PechaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/4.4bpp"); +const u32 gEventObjectPic_PechaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pecha/5.4bpp"); +const u32 gEventObjectPic_KelpsyBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/0.4bpp"); +const u32 gEventObjectPic_KelpsyBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/1.4bpp"); +const u32 gEventObjectPic_KelpsyBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/2.4bpp"); +const u32 gEventObjectPic_KelpsyBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/3.4bpp"); +const u32 gEventObjectPic_KelpsyBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/4.4bpp"); +const u32 gEventObjectPic_KelpsyBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/kelpsy/5.4bpp"); +const u32 gEventObjectPic_WepearBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/0.4bpp"); +const u32 gEventObjectPic_WepearBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/1.4bpp"); +const u32 gEventObjectPic_WepearBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/2.4bpp"); +const u32 gEventObjectPic_WepearBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/3.4bpp"); +const u32 gEventObjectPic_WepearBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/4.4bpp"); +const u32 gEventObjectPic_WepearBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wepear/5.4bpp"); +const u32 gEventObjectPic_IapapaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/0.4bpp"); +const u32 gEventObjectPic_IapapaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/1.4bpp"); +const u32 gEventObjectPic_IapapaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/2.4bpp"); +const u32 gEventObjectPic_IapapaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/3.4bpp"); +const u32 gEventObjectPic_IapapaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/4.4bpp"); +const u32 gEventObjectPic_IapapaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/iapapa/5.4bpp"); +const u32 gEventObjectPic_CheriBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/0.4bpp"); +const u32 gEventObjectPic_CheriBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/1.4bpp"); +const u32 gEventObjectPic_CheriBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/2.4bpp"); +const u32 gEventObjectPic_CheriBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/3.4bpp"); +const u32 gEventObjectPic_CheriBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/4.4bpp"); +const u32 gEventObjectPic_CheriBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cheri/5.4bpp"); +const u32 gEventObjectPic_FigyBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/0.4bpp"); +const u32 gEventObjectPic_FigyBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/1.4bpp"); +const u32 gEventObjectPic_FigyBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/2.4bpp"); +const u32 gEventObjectPic_FigyBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/3.4bpp"); +const u32 gEventObjectPic_FigyBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/4.4bpp"); +const u32 gEventObjectPic_FigyBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/figy/5.4bpp"); +const u32 gEventObjectPic_MagoBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/0.4bpp"); +const u32 gEventObjectPic_MagoBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/1.4bpp"); +const u32 gEventObjectPic_MagoBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/2.4bpp"); +const u32 gEventObjectPic_MagoBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/3.4bpp"); +const u32 gEventObjectPic_MagoBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/4.4bpp"); +const u32 gEventObjectPic_MagoBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/mago/5.4bpp"); +const u32 gEventObjectPic_LumBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/0.4bpp"); +const u32 gEventObjectPic_LumBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/1.4bpp"); +const u32 gEventObjectPic_LumBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/2.4bpp"); +const u32 gEventObjectPic_LumBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/3.4bpp"); +const u32 gEventObjectPic_LumBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/4.4bpp"); +const u32 gEventObjectPic_LumBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lum/5.4bpp"); +const u32 gEventObjectPic_RazzBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/0.4bpp"); +const u32 gEventObjectPic_RazzBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/1.4bpp"); +const u32 gEventObjectPic_RazzBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/2.4bpp"); +const u32 gEventObjectPic_RazzBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/3.4bpp"); +const u32 gEventObjectPic_RazzBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/4.4bpp"); +const u32 gEventObjectPic_RazzBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/razz/5.4bpp"); +const u32 gEventObjectPic_GrepaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/0.4bpp"); +const u32 gEventObjectPic_GrepaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/1.4bpp"); +const u32 gEventObjectPic_GrepaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/2.4bpp"); +const u32 gEventObjectPic_GrepaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/3.4bpp"); +const u32 gEventObjectPic_GrepaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/4.4bpp"); +const u32 gEventObjectPic_GrepaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/grepa/5.4bpp"); +const u32 gEventObjectPic_RabutaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/0.4bpp"); +const u32 gEventObjectPic_RabutaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/1.4bpp"); +const u32 gEventObjectPic_RabutaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/2.4bpp"); +const u32 gEventObjectPic_RabutaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/3.4bpp"); +const u32 gEventObjectPic_RabutaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/4.4bpp"); +const u32 gEventObjectPic_RabutaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rabuta/5.4bpp"); +const u32 gEventObjectPic_NomelBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/0.4bpp"); +const u32 gEventObjectPic_NomelBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/1.4bpp"); +const u32 gEventObjectPic_NomelBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/2.4bpp"); +const u32 gEventObjectPic_NomelBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/3.4bpp"); +const u32 gEventObjectPic_NomelBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/4.4bpp"); +const u32 gEventObjectPic_NomelBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/nomel/5.4bpp"); +const u32 gEventObjectPic_LeppaBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/0.4bpp"); +const u32 gEventObjectPic_LeppaBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/1.4bpp"); +const u32 gEventObjectPic_LeppaBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/2.4bpp"); +const u32 gEventObjectPic_LeppaBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/3.4bpp"); +const u32 gEventObjectPic_LeppaBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/4.4bpp"); +const u32 gEventObjectPic_LeppaBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/leppa/5.4bpp"); +const u32 gEventObjectPic_LiechiBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/0.4bpp"); +const u32 gEventObjectPic_LiechiBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/1.4bpp"); +const u32 gEventObjectPic_LiechiBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/2.4bpp"); +const u32 gEventObjectPic_LiechiBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/3.4bpp"); +const u32 gEventObjectPic_LiechiBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/4.4bpp"); +const u32 gEventObjectPic_LiechiBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/liechi/5.4bpp"); +const u32 gEventObjectPic_HondewBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/0.4bpp"); +const u32 gEventObjectPic_HondewBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/1.4bpp"); +const u32 gEventObjectPic_HondewBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/2.4bpp"); +const u32 gEventObjectPic_HondewBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/3.4bpp"); +const u32 gEventObjectPic_HondewBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/4.4bpp"); +const u32 gEventObjectPic_HondewBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/hondew/5.4bpp"); +const u32 gEventObjectPic_AguavBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/0.4bpp"); +const u32 gEventObjectPic_AguavBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/1.4bpp"); +const u32 gEventObjectPic_AguavBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/2.4bpp"); +const u32 gEventObjectPic_AguavBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/3.4bpp"); +const u32 gEventObjectPic_AguavBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/4.4bpp"); +const u32 gEventObjectPic_AguavBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aguav/5.4bpp"); +const u32 gEventObjectPic_WikiBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/0.4bpp"); +const u32 gEventObjectPic_WikiBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/1.4bpp"); +const u32 gEventObjectPic_WikiBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/2.4bpp"); +const u32 gEventObjectPic_WikiBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/3.4bpp"); +const u32 gEventObjectPic_WikiBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/4.4bpp"); +const u32 gEventObjectPic_WikiBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/wiki/5.4bpp"); +const u32 gEventObjectPic_PomegBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/0.4bpp"); +const u32 gEventObjectPic_PomegBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/1.4bpp"); +const u32 gEventObjectPic_PomegBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/2.4bpp"); +const u32 gEventObjectPic_PomegBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/3.4bpp"); +const u32 gEventObjectPic_PomegBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/4.4bpp"); +const u32 gEventObjectPic_PomegBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pomeg/5.4bpp"); +const u32 gEventObjectPic_RawstBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/0.4bpp"); +const u32 gEventObjectPic_RawstBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/1.4bpp"); +const u32 gEventObjectPic_RawstBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/2.4bpp"); +const u32 gEventObjectPic_RawstBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/3.4bpp"); +const u32 gEventObjectPic_RawstBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/4.4bpp"); +const u32 gEventObjectPic_RawstBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/rawst/5.4bpp"); +const u32 gEventObjectPic_SpelonBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/0.4bpp"); +const u32 gEventObjectPic_SpelonBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/1.4bpp"); +const u32 gEventObjectPic_SpelonBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/2.4bpp"); +const u32 gEventObjectPic_SpelonBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/3.4bpp"); +const u32 gEventObjectPic_SpelonBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/4.4bpp"); +const u32 gEventObjectPic_SpelonBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/spelon/5.4bpp"); +const u32 gEventObjectPic_ChestoBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/0.4bpp"); +const u32 gEventObjectPic_ChestoBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/1.4bpp"); +const u32 gEventObjectPic_ChestoBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/2.4bpp"); +const u32 gEventObjectPic_ChestoBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/3.4bpp"); +const u32 gEventObjectPic_ChestoBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/4.4bpp"); +const u32 gEventObjectPic_ChestoBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/chesto/5.4bpp"); +const u32 gEventObjectPic_OranBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/0.4bpp"); +const u32 gEventObjectPic_OranBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/1.4bpp"); +const u32 gEventObjectPic_OranBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/2.4bpp"); +const u32 gEventObjectPic_OranBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/3.4bpp"); +const u32 gEventObjectPic_OranBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/4.4bpp"); +const u32 gEventObjectPic_OranBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/oran/5.4bpp"); +const u32 gEventObjectPic_PersimBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/0.4bpp"); +const u32 gEventObjectPic_PersimBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/1.4bpp"); +const u32 gEventObjectPic_PersimBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/2.4bpp"); +const u32 gEventObjectPic_PersimBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/3.4bpp"); +const u32 gEventObjectPic_PersimBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/4.4bpp"); +const u32 gEventObjectPic_PersimBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/persim/5.4bpp"); +const u32 gEventObjectPic_SitrusBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/0.4bpp"); +const u32 gEventObjectPic_SitrusBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/1.4bpp"); +const u32 gEventObjectPic_SitrusBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/2.4bpp"); +const u32 gEventObjectPic_SitrusBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/3.4bpp"); +const u32 gEventObjectPic_SitrusBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/4.4bpp"); +const u32 gEventObjectPic_SitrusBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/sitrus/5.4bpp"); +const u32 gEventObjectPic_AspearBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/0.4bpp"); +const u32 gEventObjectPic_AspearBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/1.4bpp"); +const u32 gEventObjectPic_AspearBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/2.4bpp"); +const u32 gEventObjectPic_AspearBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/3.4bpp"); +const u32 gEventObjectPic_AspearBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/4.4bpp"); +const u32 gEventObjectPic_AspearBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/aspear/5.4bpp"); +const u32 gEventObjectPic_PamtreBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/0.4bpp"); +const u32 gEventObjectPic_PamtreBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/1.4bpp"); +const u32 gEventObjectPic_PamtreBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/2.4bpp"); +const u32 gEventObjectPic_PamtreBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/3.4bpp"); +const u32 gEventObjectPic_PamtreBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/4.4bpp"); +const u32 gEventObjectPic_PamtreBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/pamtre/5.4bpp"); +const u32 gEventObjectPic_CornnBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/0.4bpp"); +const u32 gEventObjectPic_CornnBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/1.4bpp"); +const u32 gEventObjectPic_CornnBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/2.4bpp"); +const u32 gEventObjectPic_CornnBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/3.4bpp"); +const u32 gEventObjectPic_CornnBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/4.4bpp"); +const u32 gEventObjectPic_CornnBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/cornn/5.4bpp"); +const u32 gEventObjectPic_LansatBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/0.4bpp"); +const u32 gEventObjectPic_LansatBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/1.4bpp"); +const u32 gEventObjectPic_LansatBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/2.4bpp"); +const u32 gEventObjectPic_LansatBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/3.4bpp"); +const u32 gEventObjectPic_LansatBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/4.4bpp"); +const u32 gEventObjectPic_LansatBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/lansat/5.4bpp"); +const u32 gEventObjectPic_DurinBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/0.4bpp"); +const u32 gEventObjectPic_DurinBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/1.4bpp"); +const u32 gEventObjectPic_DurinBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/2.4bpp"); +const u32 gEventObjectPic_DurinBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/3.4bpp"); +const u32 gEventObjectPic_DurinBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/4.4bpp"); +const u32 gEventObjectPic_DurinBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/durin/5.4bpp"); +const u32 gEventObjectPic_TamatoBerryTree_0[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/0.4bpp"); +const u32 gEventObjectPic_TamatoBerryTree_1[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/1.4bpp"); +const u32 gEventObjectPic_TamatoBerryTree_2[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/2.4bpp"); +const u32 gEventObjectPic_TamatoBerryTree_3[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/3.4bpp"); +const u32 gEventObjectPic_TamatoBerryTree_4[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/4.4bpp"); +const u32 gEventObjectPic_TamatoBerryTree_5[] = INCBIN_U32("graphics/event_objects/pics/berry_trees/tamato/5.4bpp"); +const u32 gFieldEffectObjectPic_SurfBlob_0[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob/0.4bpp"); +const u32 gFieldEffectObjectPic_SurfBlob_1[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob/1.4bpp"); +const u32 gFieldEffectObjectPic_SurfBlob_2[] = INCBIN_U32("graphics/event_objects/pics/effects/surf_blob/2.4bpp"); +const u32 gEventObjectPic_QuintyPlump_0[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/0.4bpp"); +const u32 gEventObjectPic_QuintyPlump_1[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/1.4bpp"); +const u32 gEventObjectPic_QuintyPlump_2[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/2.4bpp"); +const u32 gEventObjectPic_QuintyPlump_3[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/3.4bpp"); +const u32 gEventObjectPic_QuintyPlump_4[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/4.4bpp"); +const u32 gEventObjectPic_QuintyPlump_5[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/5.4bpp"); +const u32 gEventObjectPic_QuintyPlump_6[] = INCBIN_U32("graphics/event_objects/pics/people/quinty_plump/6.4bpp"); +const u16 gEventObjectPalette12[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_12.gbapal"); +const u16 gEventObjectPalette13[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_13.gbapal"); +const u32 gFieldEffectObjectPic_ShadowSmall[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_small.4bpp"); +const u32 gFieldEffectObjectPic_ShadowMedium[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_medium.4bpp"); +const u32 gFieldEffectObjectPic_ShadowLarge[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_large.4bpp"); +const u32 gFieldEffectObjectPic_ShadowExtraLarge[] = INCBIN_U32("graphics/event_objects/pics/effects/shadow_extra_large.4bpp"); +const u32 filler_8368A08[0x48] = {}; +const u8 gFieldEffectPic_CutGrass[] = INCBIN_U8("graphics/event_objects/pics/effects/cut_grass.4bpp"); +const u32 gFieldEffectPic_CutGrass_Copy[] = INCBIN_U32("graphics/event_objects/pics/effects/cut_grass.4bpp"); +const u16 gFieldEffectObjectPalette6[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_06.gbapal"); +const u32 gFieldEffectObjectPic_Ripple_0[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/0.4bpp"); +const u32 gFieldEffectObjectPic_Ripple_1[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/1.4bpp"); +const u32 gFieldEffectObjectPic_Ripple_2[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/2.4bpp"); +const u32 gFieldEffectObjectPic_Ripple_3[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/3.4bpp"); +const u32 gFieldEffectObjectPic_Ripple_4[] = INCBIN_U32("graphics/event_objects/pics/effects/ripple/4.4bpp"); +const u32 gFieldEffectObjectPic_Ash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/0.4bpp"); +const u32 gFieldEffectObjectPic_Ash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/1.4bpp"); +const u32 gFieldEffectObjectPic_Ash_2[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/2.4bpp"); +const u32 gFieldEffectObjectPic_Ash_3[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/3.4bpp"); +const u32 gFieldEffectObjectPic_Ash_4[] = INCBIN_U32("graphics/event_objects/pics/effects/ash/4.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_0[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/0.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_1[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/1.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_2[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/2.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_3[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/3.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_4[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/4.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_5[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/5.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_6[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/6.4bpp"); +const u32 gFieldEffectObjectPic_Arrow_7[] = INCBIN_U32("graphics/event_objects/pics/effects/arrow/7.4bpp"); +const u16 gFieldEffectObjectPalette0[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_00.gbapal"); +const u16 gFieldEffectObjectPalette1[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_01.gbapal"); +const u32 gFieldEffectObjectPic_GroundImpactDust_0[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust/0.4bpp"); +const u32 gFieldEffectObjectPic_GroundImpactDust_1[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust/1.4bpp"); +const u32 gFieldEffectObjectPic_GroundImpactDust_2[] = INCBIN_U32("graphics/event_objects/pics/effects/ground_impact_dust/2.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopTallGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/0.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopTallGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/1.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopTallGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/2.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopTallGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_tall_grass/3.4bpp"); +const u32 gUnusedGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/0.4bpp"); +const u32 gUnusedGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/1.4bpp"); +const u32 gUnusedGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/2.4bpp"); +const u32 gUnusedGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unused_grass/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown16_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown16_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown16_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown16_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown16_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/4.4bpp"); +const u32 gUnknown_084F7E38[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_4F7E38/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown16_5[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_16/5.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/4.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_5[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/5.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_6[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/6.4bpp"); +const u32 gFieldEffectObjectPic_Unknown17_7[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_17/7.4bpp"); +const u32 gFieldEffectObjectPic_Unknown18_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown18_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown18_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown18_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_18/3.4bpp"); +const u32 gFieldEffectObjectPic_LongGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/0.4bpp"); +const u32 gFieldEffectObjectPic_LongGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/1.4bpp"); +const u32 gFieldEffectObjectPic_LongGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/2.4bpp"); +const u32 gFieldEffectObjectPic_LongGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/long_grass/3.4bpp"); +const u32 gFieldEffectObjectPic_TallGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/0.4bpp"); +const u32 gFieldEffectObjectPic_TallGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/1.4bpp"); +const u32 gFieldEffectObjectPic_TallGrass_2[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/2.4bpp"); +const u32 gFieldEffectObjectPic_TallGrass_3[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/3.4bpp"); +const u32 gFieldEffectObjectPic_TallGrass_4[] = INCBIN_U32("graphics/event_objects/pics/effects/tall_grass/4.4bpp"); +const u32 gFieldEffectObjectPic_ShortGrass_0[] = INCBIN_U32("graphics/event_objects/pics/effects/short_grass/0.4bpp"); +const u32 gFieldEffectObjectPic_ShortGrass_1[] = INCBIN_U32("graphics/event_objects/pics/effects/short_grass/1.4bpp"); +const u32 gFieldEffectObjectPic_SandFootprints_0[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_footprints/0.4bpp"); +const u32 gFieldEffectObjectPic_SandFootprints_1[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_footprints/1.4bpp"); +const u32 gFieldEffectObjectPic_DeepSandFootprints_0[] = INCBIN_U32("graphics/event_objects/pics/effects/deep_sand_footprints/0.4bpp"); +const u32 gFieldEffectObjectPic_DeepSandFootprints_1[] = INCBIN_U32("graphics/event_objects/pics/effects/deep_sand_footprints/1.4bpp"); +const u32 gFieldEffectObjectPic_BikeTireTracks_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/0.4bpp"); +const u32 gFieldEffectObjectPic_BikeTireTracks_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/1.4bpp"); +const u32 gFieldEffectObjectPic_BikeTireTracks_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/2.4bpp"); +const u32 gFieldEffectObjectPic_BikeTireTracks_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_tire_tracks/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown19_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown19_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown19_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown19_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_19/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown29_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown29_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown29_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_29/2.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopBigSplash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/0.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopBigSplash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/1.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopBigSplash_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/2.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopBigSplash_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_big_splash/3.4bpp"); +const u32 gFieldEffectObjectPic_Splash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/splash/0.4bpp"); +const u32 gFieldEffectObjectPic_Splash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/splash/1.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopSmallSplash_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash/0.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopSmallSplash_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash/1.4bpp"); +const u32 gFieldEffectObjectPic_BikeHopSmallSplash_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bike_hop_small_splash/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown20_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown20_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown20_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown20_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown20_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_20/4.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_0[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/0.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_1[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/1.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_2[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/2.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_3[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/3.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_4[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/4.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_5[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/5.4bpp"); +const u32 gFieldEffectObjectPic_TreeDisguise_6[] = INCBIN_U32("graphics/event_objects/pics/effects/tree_disguise/6.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_0[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/0.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_1[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/1.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_2[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/2.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_3[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/3.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_4[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/4.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_5[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/5.4bpp"); +const u32 gFieldEffectObjectPic_MountainDisguise_6[] = INCBIN_U32("graphics/event_objects/pics/effects/mountain_disguise/6.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_0[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/0.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_1[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/1.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_2[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/2.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_3[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/3.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_4[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/4.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_5[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/5.4bpp"); +const u32 gFieldEffectObjectPic_SandDisguisePlaceholder_6[] = INCBIN_U32("graphics/event_objects/pics/effects/sand_disguise_placeholder/6.4bpp"); +const u32 gFieldEffectObjectPic_HotSpringsWater[] = INCBIN_U32("graphics/event_objects/pics/effects/hot_springs_water.4bpp"); +const u16 gFieldEffectObjectPalette2[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_02.gbapal"); +const u32 gFieldEffectObjectPic_JumpOutOfAsh_0[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/0.4bpp"); +const u32 gFieldEffectObjectPic_JumpOutOfAsh_1[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/1.4bpp"); +const u32 gFieldEffectObjectPic_JumpOutOfAsh_2[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/2.4bpp"); +const u32 gFieldEffectObjectPic_JumpOutOfAsh_3[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/3.4bpp"); +const u32 gFieldEffectObjectPic_JumpOutOfAsh_4[] = INCBIN_U32("graphics/event_objects/pics/effects/jump_out_of_ash/4.4bpp"); +const u32 gFieldEffectObjectPic_Unknown33_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown33_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/1.4bpp"); +const u32 gFieldEffectObjectPic_Unknown33_2[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/2.4bpp"); +const u32 gFieldEffectObjectPic_Unknown33_3[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/3.4bpp"); +const u32 gFieldEffectObjectPic_Unknown33_4[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_33/4.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_0[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/0.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_1[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/1.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_2[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/2.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_3[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/3.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_4[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/4.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_5[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/5.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_6[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/6.4bpp"); +const u32 gFieldEffectObjectPic_Bubbles_7[] = INCBIN_U32("graphics/event_objects/pics/effects/bubbles/7.4bpp"); +const u32 gFieldEffectObjectPic_Unknown35_0[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_35/0.4bpp"); +const u32 gFieldEffectObjectPic_Unknown35_1[] = INCBIN_U32("graphics/event_objects/pics/effects/unknown_35/1.4bpp"); +const u16 gFieldEffectObjectPalette3[] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_03.gbapal"); +const u32 gFieldEffectObjectPic_Bird[] = INCBIN_U32("graphics/event_objects/pics/effects/bird.4bpp"); +const u32 gEventObjectPic_Juan_0[] = INCBIN_U32("graphics/event_objects/pics/people/juan/0.4bpp"); +const u32 gEventObjectPic_Juan_1[] = INCBIN_U32("graphics/event_objects/pics/people/juan/1.4bpp"); +const u32 gEventObjectPic_Juan_2[] = INCBIN_U32("graphics/event_objects/pics/people/juan/2.4bpp"); +const u32 gEventObjectPic_Juan_3[] = INCBIN_U32("graphics/event_objects/pics/people/juan/3.4bpp"); +const u32 gEventObjectPic_Juan_4[] = INCBIN_U32("graphics/event_objects/pics/people/juan/4.4bpp"); +const u32 gEventObjectPic_Juan_5[] = INCBIN_U32("graphics/event_objects/pics/people/juan/5.4bpp"); +const u32 gEventObjectPic_Juan_6[] = INCBIN_U32("graphics/event_objects/pics/people/juan/6.4bpp"); +const u32 gEventObjectPic_Juan_7[] = INCBIN_U32("graphics/event_objects/pics/people/juan/7.4bpp"); +const u32 gEventObjectPic_Juan_8[] = INCBIN_U32("graphics/event_objects/pics/people/juan/8.4bpp"); +const u32 gEventObjectPic_Scott_0[] = INCBIN_U32("graphics/event_objects/pics/people/scott/0.4bpp"); +const u32 gEventObjectPic_Scott_1[] = INCBIN_U32("graphics/event_objects/pics/people/scott/1.4bpp"); +const u32 gEventObjectPic_Scott_2[] = INCBIN_U32("graphics/event_objects/pics/people/scott/2.4bpp"); +const u32 gEventObjectPic_Scott_3[] = INCBIN_U32("graphics/event_objects/pics/people/scott/3.4bpp"); +const u32 gEventObjectPic_Scott_4[] = INCBIN_U32("graphics/event_objects/pics/people/scott/4.4bpp"); +const u32 gEventObjectPic_Scott_5[] = INCBIN_U32("graphics/event_objects/pics/people/scott/5.4bpp"); +const u32 gEventObjectPic_Scott_6[] = INCBIN_U32("graphics/event_objects/pics/people/scott/6.4bpp"); +const u32 gEventObjectPic_Scott_7[] = INCBIN_U32("graphics/event_objects/pics/people/scott/7.4bpp"); +const u32 gEventObjectPic_Scott_8[] = INCBIN_U32("graphics/event_objects/pics/people/scott/8.4bpp"); +const u32 gEventObjectPic_Statue[] = INCBIN_U32("graphics/event_objects/pics/misc/statue.4bpp"); +const u32 gEventObjectPic_Kirlia_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/0.4bpp"); +const u32 gEventObjectPic_Kirlia_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/1.4bpp"); +const u32 gEventObjectPic_Kirlia_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/2.4bpp"); +const u32 gEventObjectPic_Kirlia_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/3.4bpp"); +const u32 gEventObjectPic_Kirlia_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/4.4bpp"); +const u32 gEventObjectPic_Kirlia_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/5.4bpp"); +const u32 gEventObjectPic_Kirlia_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/6.4bpp"); +const u32 gEventObjectPic_Kirlia_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/7.4bpp"); +const u32 gEventObjectPic_Kirlia_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/kirlia/8.4bpp"); +const u32 gEventObjectPic_Dusclops_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/0.4bpp"); +const u32 gEventObjectPic_Dusclops_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/1.4bpp"); +const u32 gEventObjectPic_Dusclops_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/2.4bpp"); +const u32 gEventObjectPic_Dusclops_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/3.4bpp"); +const u32 gEventObjectPic_Dusclops_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/4.4bpp"); +const u32 gEventObjectPic_Dusclops_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/5.4bpp"); +const u32 gEventObjectPic_Dusclops_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/6.4bpp"); +const u32 gEventObjectPic_Dusclops_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/7.4bpp"); +const u32 gEventObjectPic_Dusclops_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/dusclops/8.4bpp"); +const u32 gEventObjectPic_MysteryEventDeliveryman_0[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman/0.4bpp"); +const u32 gEventObjectPic_MysteryEventDeliveryman_1[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman/1.4bpp"); +const u32 gEventObjectPic_MysteryEventDeliveryman_2[] = INCBIN_U32("graphics/event_objects/pics/people/mystery_event_deliveryman/2.4bpp"); +const u32 gEventObjectPic_UnionRoomAttendant_0[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant/0.4bpp"); +const u32 gEventObjectPic_UnionRoomAttendant_1[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant/1.4bpp"); +const u32 gEventObjectPic_UnionRoomAttendant_2[] = INCBIN_U32("graphics/event_objects/pics/people/union_room_attendant/2.4bpp"); +const u32 gEventObjectPic_MovingBox[] = INCBIN_U32("graphics/event_objects/pics/misc/moving_box.4bpp"); +const u16 gEventObjectPalette19[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_19.gbapal"); +const u32 gEventObjectPic_Sudowoodo_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo/0.4bpp"); +const u32 gEventObjectPic_Sudowoodo_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo/1.4bpp"); +const u32 gEventObjectPic_Sudowoodo_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/sudowoodo/2.4bpp"); +const u32 gEventObjectPic_Mew_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/0.4bpp"); +const u32 gEventObjectPic_Mew_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/1.4bpp"); +const u32 gEventObjectPic_Mew_2[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/2.4bpp"); +const u32 gEventObjectPic_Mew_3[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/3.4bpp"); +const u32 gEventObjectPic_Mew_4[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/4.4bpp"); +const u32 gEventObjectPic_Mew_5[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/5.4bpp"); +const u32 gEventObjectPic_Mew_6[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/6.4bpp"); +const u32 gEventObjectPic_Mew_7[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/7.4bpp"); +const u32 gEventObjectPic_Mew_8[] = INCBIN_U32("graphics/event_objects/pics/pokemon/mew/8.4bpp"); +const u16 gEventObjectPalette28[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_28.gbapal"); +const u32 gEventObjectPic_Red_0[] = INCBIN_U32("graphics/event_objects/pics/people/red/0.4bpp"); +const u32 gEventObjectPic_Red_1[] = INCBIN_U32("graphics/event_objects/pics/people/red/1.4bpp"); +const u32 gEventObjectPic_Red_2[] = INCBIN_U32("graphics/event_objects/pics/people/red/2.4bpp"); +const u32 gEventObjectPic_Red_3[] = INCBIN_U32("graphics/event_objects/pics/people/red/3.4bpp"); +const u32 gEventObjectPic_Red_4[] = INCBIN_U32("graphics/event_objects/pics/people/red/4.4bpp"); +const u32 gEventObjectPic_Red_5[] = INCBIN_U32("graphics/event_objects/pics/people/red/5.4bpp"); +const u32 gEventObjectPic_Red_6[] = INCBIN_U32("graphics/event_objects/pics/people/red/6.4bpp"); +const u32 gEventObjectPic_Red_7[] = INCBIN_U32("graphics/event_objects/pics/people/red/7.4bpp"); +const u32 gEventObjectPic_Red_8[] = INCBIN_U32("graphics/event_objects/pics/people/red/8.4bpp"); +const u32 gEventObjectPic_Leaf_0[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/0.4bpp"); +const u32 gEventObjectPic_Leaf_1[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/1.4bpp"); +const u32 gEventObjectPic_Leaf_2[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/2.4bpp"); +const u32 gEventObjectPic_Leaf_3[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/3.4bpp"); +const u32 gEventObjectPic_Leaf_4[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/4.4bpp"); +const u32 gEventObjectPic_Leaf_5[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/5.4bpp"); +const u32 gEventObjectPic_Leaf_6[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/6.4bpp"); +const u32 gEventObjectPic_Leaf_7[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/7.4bpp"); +const u32 gEventObjectPic_Leaf_8[] = INCBIN_U32("graphics/event_objects/pics/people/leaf/8.4bpp"); +const u16 gEventObjectPalette30[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_30.gbapal"); +const u32 gEventObjectPic_BirthIslandStone[] = INCBIN_U32("graphics/event_objects/pics/misc/birth_island_stone.4bpp"); +const u16 gEventObjectPalette29[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_29.gbapal"); +const u32 gEventObjectPic_Deoxys_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/deoxys/0.4bpp"); +const u32 gEventObjectPic_Deoxys_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/deoxys/1.4bpp"); +const u32 gEventObjectPic_Anabel_0[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/0.4bpp"); +const u32 gEventObjectPic_Anabel_1[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/1.4bpp"); +const u32 gEventObjectPic_Anabel_2[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/2.4bpp"); +const u32 gEventObjectPic_Anabel_3[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/3.4bpp"); +const u32 gEventObjectPic_Anabel_4[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/4.4bpp"); +const u32 gEventObjectPic_Anabel_5[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/5.4bpp"); +const u32 gEventObjectPic_Anabel_6[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/6.4bpp"); +const u32 gEventObjectPic_Anabel_7[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/7.4bpp"); +const u32 gEventObjectPic_Anabel_8[] = INCBIN_U32("graphics/event_objects/pics/people/anabel/8.4bpp"); +const u32 gEventObjectPic_Tucker_0[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/0.4bpp"); +const u32 gEventObjectPic_Tucker_1[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/1.4bpp"); +const u32 gEventObjectPic_Tucker_2[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/2.4bpp"); +const u32 gEventObjectPic_Tucker_3[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/3.4bpp"); +const u32 gEventObjectPic_Tucker_4[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/4.4bpp"); +const u32 gEventObjectPic_Tucker_5[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/5.4bpp"); +const u32 gEventObjectPic_Tucker_6[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/6.4bpp"); +const u32 gEventObjectPic_Tucker_7[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/7.4bpp"); +const u32 gEventObjectPic_Tucker_8[] = INCBIN_U32("graphics/event_objects/pics/people/tucker/8.4bpp"); +const u32 gEventObjectPic_Spenser_0[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/0.4bpp"); +const u32 gEventObjectPic_Spenser_1[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/1.4bpp"); +const u32 gEventObjectPic_Spenser_2[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/2.4bpp"); +const u32 gEventObjectPic_Spenser_3[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/3.4bpp"); +const u32 gEventObjectPic_Spenser_4[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/4.4bpp"); +const u32 gEventObjectPic_Spenser_5[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/5.4bpp"); +const u32 gEventObjectPic_Spenser_6[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/6.4bpp"); +const u32 gEventObjectPic_Spenser_7[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/7.4bpp"); +const u32 gEventObjectPic_Spenser_8[] = INCBIN_U32("graphics/event_objects/pics/people/spenser/8.4bpp"); +const u32 gEventObjectPic_Greta_0[] = INCBIN_U32("graphics/event_objects/pics/people/greta/0.4bpp"); +const u32 gEventObjectPic_Greta_1[] = INCBIN_U32("graphics/event_objects/pics/people/greta/1.4bpp"); +const u32 gEventObjectPic_Greta_2[] = INCBIN_U32("graphics/event_objects/pics/people/greta/2.4bpp"); +const u32 gEventObjectPic_Greta_3[] = INCBIN_U32("graphics/event_objects/pics/people/greta/3.4bpp"); +const u32 gEventObjectPic_Greta_4[] = INCBIN_U32("graphics/event_objects/pics/people/greta/4.4bpp"); +const u32 gEventObjectPic_Greta_5[] = INCBIN_U32("graphics/event_objects/pics/people/greta/5.4bpp"); +const u32 gEventObjectPic_Greta_6[] = INCBIN_U32("graphics/event_objects/pics/people/greta/6.4bpp"); +const u32 gEventObjectPic_Greta_7[] = INCBIN_U32("graphics/event_objects/pics/people/greta/7.4bpp"); +const u32 gEventObjectPic_Greta_8[] = INCBIN_U32("graphics/event_objects/pics/people/greta/8.4bpp"); +const u32 gEventObjectPic_Noland_0[] = INCBIN_U32("graphics/event_objects/pics/people/noland/0.4bpp"); +const u32 gEventObjectPic_Noland_1[] = INCBIN_U32("graphics/event_objects/pics/people/noland/1.4bpp"); +const u32 gEventObjectPic_Noland_2[] = INCBIN_U32("graphics/event_objects/pics/people/noland/2.4bpp"); +const u32 gEventObjectPic_Noland_3[] = INCBIN_U32("graphics/event_objects/pics/people/noland/3.4bpp"); +const u32 gEventObjectPic_Noland_4[] = INCBIN_U32("graphics/event_objects/pics/people/noland/4.4bpp"); +const u32 gEventObjectPic_Noland_5[] = INCBIN_U32("graphics/event_objects/pics/people/noland/5.4bpp"); +const u32 gEventObjectPic_Noland_6[] = INCBIN_U32("graphics/event_objects/pics/people/noland/6.4bpp"); +const u32 gEventObjectPic_Noland_7[] = INCBIN_U32("graphics/event_objects/pics/people/noland/7.4bpp"); +const u32 gEventObjectPic_Noland_8[] = INCBIN_U32("graphics/event_objects/pics/people/noland/8.4bpp"); +const u32 gEventObjectPic_Lucy_0[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/0.4bpp"); +const u32 gEventObjectPic_Lucy_1[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/1.4bpp"); +const u32 gEventObjectPic_Lucy_2[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/2.4bpp"); +const u32 gEventObjectPic_Lucy_3[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/3.4bpp"); +const u32 gEventObjectPic_Lucy_4[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/4.4bpp"); +const u32 gEventObjectPic_Lucy_5[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/5.4bpp"); +const u32 gEventObjectPic_Lucy_6[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/6.4bpp"); +const u32 gEventObjectPic_Lucy_7[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/7.4bpp"); +const u32 gEventObjectPic_Lucy_8[] = INCBIN_U32("graphics/event_objects/pics/people/lucy/8.4bpp"); +const u32 gEventObjectPic_Brandon_0[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/0.4bpp"); +const u32 gEventObjectPic_Brandon_1[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/1.4bpp"); +const u32 gEventObjectPic_Brandon_2[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/2.4bpp"); +const u32 gEventObjectPic_Brandon_3[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/3.4bpp"); +const u32 gEventObjectPic_Brandon_4[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/4.4bpp"); +const u32 gEventObjectPic_Brandon_5[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/5.4bpp"); +const u32 gEventObjectPic_Brandon_6[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/6.4bpp"); +const u32 gEventObjectPic_Brandon_7[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/7.4bpp"); +const u32 gEventObjectPic_Brandon_8[] = INCBIN_U32("graphics/event_objects/pics/people/brandon/8.4bpp"); +const u32 gEventObjectPic_Lugia_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/lugia/0.4bpp"); +const u32 gEventObjectPic_Lugia_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/lugia/1.4bpp"); +const u16 gEventObjectPalette32[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_32.gbapal"); +const u32 gEventObjectPic_HoOh_0[] = INCBIN_U32("graphics/event_objects/pics/pokemon/ho_oh/0.4bpp"); +const u32 gEventObjectPic_HoOh_1[] = INCBIN_U32("graphics/event_objects/pics/pokemon/ho_oh/1.4bpp"); +const u16 gEventObjectPalette31[] = INCBIN_U16("graphics/event_objects/palettes/field_object_palette_31.gbapal"); + +#endif //GUARD_EVENT_OBJECT_GFX_H diff --git a/src/data/field_event_obj/event_object_graphics_info.h b/src/data/field_event_obj/event_object_graphics_info.h new file mode 100755 index 000000000..14ef4983d --- /dev/null +++ b/src/data/field_event_obj/event_object_graphics_info.h @@ -0,0 +1,250 @@ +#ifndef GUARD_EVENT_OBJECT_GRAPHICS_INFO_H +#define GUARD_EVENT_OBJECT_GRAPHICS_INFO_H + +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanNormal = {0xFFFF, 0x1100, 0x1102, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanMachBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanAcroBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanSurfing = {0xFFFF, 0x1100, 0x11FF, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFieldMove = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_QuintyPlump = {0xFFFF, 0x110B, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_L, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_QuintyPlump, gEventObjectPicTable_QuintyPlump, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy1 = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleBoy1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl1 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleGirl1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl1 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Girl1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy2 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl2 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Girl2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy2 = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleBoy2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl2 = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LittleGirl2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy3 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy3, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl3 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Girl3, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy4 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy4, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman1 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FatMan = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_FatMan, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman2 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman3 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman3, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan1 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldMan1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman1 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldWoman1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man2 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman4 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman4, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man3 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man3, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman5 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman5, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cook = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Cook, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman6 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman6, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan2 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldMan2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman2 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_OldWoman2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Camper = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Camper, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Picnicker = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Picnicker, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man4 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man4, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman7 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Woman7, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Youngster = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Youngster, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BugCatcher = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BugCatcher, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PsychicM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_PsychicM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SchoolKidM = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SchoolKidM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maniac = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Maniac, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HexManiac = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_HexManiac, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza1 = {0xFFFF, 0x1105, 0x11FF, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_64x64, gEventObjectSpriteOamTables_64x64, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RayquazaStill, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerM = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SwimmerM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerF = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SwimmerF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BlackBelt = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BlackBelt, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Beauty = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Beauty, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Scientist1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lass = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Lass, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Gentleman = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Gentleman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sailor = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Sailor, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fisherman = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Fisherman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RunningTriathleteM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteF = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RunningTriathleteF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberF = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_TuberF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberM = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_TuberM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hiker = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Hiker, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteM = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_CyclingTriathleteM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteF = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_CyclingTriathleteF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Nurse = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Nurse, gEventObjectPicTable_Nurse, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ItemBall = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ItemBall, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTree = {0xFFFF, 0x1103, 0x11FF, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, NULL, gEventObjectImageAnimTable_BerryTree, gEventObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeEarlyStages = {0xFFFF, 0x1103, 0x11FF, 256, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_BerryTree, gEventObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeLateStages = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BerryTree, gEventObjectPicTable_PechaBerryTree, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ProfBirch = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ProfBirch, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man5 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man5, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man6 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man6, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ReporterM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterF = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ReporterF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Bard = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hipster = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Trader = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan1, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Storyteller = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Giddy = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan1 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan2 = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MauvilleOldMan2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedNatuDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedNatuDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMagnemiteDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedMagnemiteDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedSquirtleDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedSquirtleDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedWooperDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedWooperDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPikachuDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedPikachuDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPorygon2Doll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_UnusedPorygon2Doll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CuttableTree = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_CuttableTree, gEventObjectPicTable_CuttableTree, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MartEmployee = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MartEmployee, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RooftopSaleWoman = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RooftopSaleWoman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Teala = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Teala, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BreakableRock = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_BreakableRock, gEventObjectPicTable_BreakableRock, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PushableBoulder = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PushableBoulder, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MrBrineysBoat = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MrBrineysBoat, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayNormal = {0xFFFF, 0x1110, 0x1102, 512, 16, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayMachBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayMachBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayAcroBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MaySurfing = {0xFFFF, 0x1110, 0x11FF, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_MaySurfing, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFieldMove = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Truck = {0xFFFF, 0x110D, 0x11FF, 1152, 48, 48, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_Truck, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_Truck, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothCarryingBox = {0xFFFF, 0x110E, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_VigorothCarryingBox, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothFacingAway = {0xFFFF, 0x110E, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_VigorothFacingAway, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirchsBag = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BirchsBag, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_EnemyZigzagoon = {0xFFFF, 0x110F, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_EnemyZigzagoon, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Poochyena = {0xFFFF, 0x111C, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Poochyena, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Artist = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Artist, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanNormal = {0xFFFF, 0x1100, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanMachBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanMachBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanAcroBike = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_BrendanAcroBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanSurfing = {0xFFFF, 0x1100, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_BrendanSurfing, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanFieldMove = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_BrendanFieldMove, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayNormal = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayMachBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayMachBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayAcroBike = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_BIKE_TIRE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_AcroBike, gEventObjectPicTable_MayAcroBike, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMaySurfing = {0xFFFF, 0x1110, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Surfing, gEventObjectPicTable_MaySurfing, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayFieldMove = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_FieldMove, gEventObjectPicTable_MayFieldMove, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cameraman = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Cameraman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanUnderwater = {0xFFFF, 0x1115, 0x11FF, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanUnderwater, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayUnderwater = {0xFFFF, 0x1115, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayUnderwater, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MovingBox = {0xFFFF, 0x1112, 0x11FF, 128, 16, 16, 10, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MovingBox, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CableCar = {0xFFFF, 0x1113, 0x11FF, 2048, 64, 64, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_64x64, gEventObjectSpriteOamTables_64x64, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_CableCar, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist2 = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Scientist2, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man7 = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Man7, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberM = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_AquaMemberM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberF = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_AquaMemberF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberM = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MagmaMemberM, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberF = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MagmaMemberF, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sidney = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Sidney, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Phoebe = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Phoebe, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Glacia = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Glacia, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Drake = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Drake, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Roxanne = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Roxanne, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brawly = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Brawly, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wattson = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wattson, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Flannery = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Flannery, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Norman = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Norman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Winona = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Winona, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Liza = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Liza, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tate = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Tate, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wallace = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wallace, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Steven = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Steven, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wally = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wally, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireLittleBoy = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RubySapphireLittleBoy, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFishing = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Fishing, gEventObjectPicTable_BrendanFishing, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFishing = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Fishing, gEventObjectPicTable_MayFishing, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HotSpringsOldWoman = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_HotSpringsOldWoman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SSTidal = {0xFFFF, 0x1114, 0x11FF, 1920, 96, 40, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_8x8, gEventObjectSpriteOamTables_SSTidal, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SSTidal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SubmarineShadow = {0xFFFF, 0x111B, 0x11FF, 1408, 88, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_8x8, gEventObjectSpriteOamTables_SubmarineShadow, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_SubmarineShadow, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PichuDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PichuDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikachuDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PikachuDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MarillDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MarillDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TogepiDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TogepiDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyndaquilDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_CyndaquilDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ChikoritaDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ChikoritaDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TotodileDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TotodileDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_JigglypuffDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_JigglypuffDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MeowthDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MeowthDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ClefairyDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ClefairyDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DittoDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_DittoDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SmoochumDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SmoochumDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TreeckoDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TreeckoDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TorchicDoll = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_TorchicDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MudkipDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MudkipDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DuskullDoll = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_DuskullDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WynautDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_WynautDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BaltoyDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BaltoyDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KecleonDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_KecleonDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AzurillDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_AzurillDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SkittyDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SkittyDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwabluDoll = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SwabluDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GulpinDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_GulpinDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LotadDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_LotadDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SeedotDoll = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SeedotDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikaCushion = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_PikaCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RoundCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_RoundCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KissCushion = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_KissCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ZigzagCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_ZigzagCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SpinCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_SpinCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DiamondCushion = {0xFFFF, 0x1106, 0x11FF, 128, 16, 16, 5, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_DiamondCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BallCushion = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BallCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GrassCushion = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_GrassCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FireCushion = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_FireCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WaterCushion = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_WaterCushion, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigSnorlaxDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigSnorlaxDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRhydonDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRhydonDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigLaprasDoll = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigLaprasDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigVenusaurDoll = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigVenusaurDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigCharizardDoll = {0xFFFF, 0x1104, 0x11FF, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigCharizardDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigBlastoiseDoll = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigBlastoiseDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigWailmerDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigWailmerDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegirockDoll = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRegirockDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegiceDoll = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRegiceDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegisteelDoll = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BigRegisteelDoll, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latias = {0xFFFF, 0x1104, 0x11FF, 512, 32, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latios = {0xFFFF, 0x1103, 0x11FF, 512, 32, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_LatiasLatios, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy5 = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Boy5, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ContestOldMan = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_ContestOldMan, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanWatering = {0xFFFF, 0x1100, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_BrendanWatering, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayWatering = {0xFFFF, 0x1110, 0x1102, 512, 32, 32, 0, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MayWatering, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanDecorating = {0xFFFF, 0x1100, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BrendanDecorating, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayDecorating = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_MayDecorating, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Archie = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Archie, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maxie = {0xFFFF, 0x1104, 0x11FF, 256, 16, 32, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Maxie, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre1 = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_KyogreFront, gEventObjectRotScalAnimTable_KyogreGroudon}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon1 = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_GroudonFront, gEventObjectRotScalAnimTable_KyogreGroudon}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre3 = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_KyogreSide, gEventObjectRotScalAnimTable_KyogreGroudon}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon3 = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Groudon3, gEventObjectPicTable_GroudonSide, gEventObjectRotScalAnimTable_KyogreGroudon}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fossil = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_S, TRUE, FALSE, TRACKS_NONE, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_Fossil, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regirock = {0xFFFF, 0x1104, 0x11FF, 512, 32, 32, 3, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regice = {0xFFFF, 0x1105, 0x11FF, 512, 32, 32, 4, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Registeel = {0xFFFF, 0x1106, 0x11FF, 512, 32, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Regi, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Skitty = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Skitty, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon1 = {0xFFFF, 0x1105, 0x11FF, 128, 16, 16, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Kecleon, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre2 = {0xFFFF, 0x1116, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_KyogreFront, gEventObjectRotScalAnimTable_KyogreGroudon}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon2 = {0xFFFF, 0x1118, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_GroudonFront, gEventObjectRotScalAnimTable_KyogreGroudon}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza2 = {0xFFFF, 0x1105, 0x11FF, 2048, 64, 64, 4, SHADOW_SIZE_M, FALSE, TRUE, TRACKS_FOOT, &gEventObjectBaseOam_64x64, gEventObjectSpriteOamTables_64x64, gEventObjectImageAnimTable_Rayquaza2, gEventObjectPicTable_Rayquaza, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Zigzagoon = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Zigzagoon, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Pikachu = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Pikachu, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azumarill = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Azumarill, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wingull = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Wingull, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon2 = {0xFFFF, 0x1105, 0x1102, 128, 16, 16, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Kecleon, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberMSwimming = {0xFFFF, 0x1104, 0x11FF, 128, 16, 16, 3, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_TuberMSwimming, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azurill = {0xFFFF, 0x1103, 0x11FF, 128, 16, 16, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x16, gEventObjectSpriteOamTables_16x16, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Azurill, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mom = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Mom, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkBrendan = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_BrendanNormal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkMay = {0xFFFF, 0x1110, 0x1102, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_BrendanMayNormal, gEventObjectPicTable_MayNormal, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Juan = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Juan, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scott = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Scott, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MysteryEventDeliveryman = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_MysteryEventDeliveryman, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Statue = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_Statue, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kirlia = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_S, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Kirlia, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Dusclops = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Dusclops, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnionRoomAttendant = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_UnionRoomAttendant, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Red = {0xFFFF, 0x111D, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Red, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Leaf = {0xFFFF, 0x111D, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Leaf, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sudowoodo = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Sudowoodo, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mew = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Mew, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Deoxys = {0xFFFF, 0x111E, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Deoxys, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirthIslandStone = {0xFFFF, 0x111F, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, TRUE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Inanimate, gEventObjectPicTable_BirthIslandStone, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Anabel = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Anabel, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tucker = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Tucker, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Greta = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Greta, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Spenser = {0xFFFF, 0x1103, 0x11FF, 256, 16, 32, 2, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Spenser, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Noland = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Noland, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lucy = {0xFFFF, 0x1106, 0x11FF, 256, 16, 32, 5, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Lucy, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brandon = {0xFFFF, 0x1105, 0x11FF, 256, 16, 32, 4, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Brandon, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireBrendan = {0xFFFF, 0x1122, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RubySapphireBrendan, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireMay = {0xFFFF, 0x1123, 0x11FF, 256, 16, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_16x32, gEventObjectSpriteOamTables_16x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_RubySapphireMay, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lugia = {0xFFFF, 0x1121, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_Standard, gEventObjectPicTable_Lugia, gDummySpriteAffineAnimTable}; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HoOh = {0xFFFF, 0x1120, 0x11FF, 512, 32, 32, 10, SHADOW_SIZE_M, FALSE, FALSE, TRACKS_FOOT, &gEventObjectBaseOam_32x32, gEventObjectSpriteOamTables_32x32, gEventObjectImageAnimTable_HoOh, gEventObjectPicTable_HoOh, gDummySpriteAffineAnimTable}; + +#endif //GUARD_EVENT_OBJECT_GRAPHICS_INFO_H diff --git a/src/data/field_event_obj/event_object_graphics_info_pointers.h b/src/data/field_event_obj/event_object_graphics_info_pointers.h new file mode 100755 index 000000000..c0ca57b60 --- /dev/null +++ b/src/data/field_event_obj/event_object_graphics_info_pointers.h @@ -0,0 +1,504 @@ +#ifndef GUARD_EVENT_OBJECT_GRAPHICS_INFO_POINTERS_H +#define GUARD_EVENT_OBJECT_GRAPHICS_INFO_POINTERS_H + +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanNormal; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanMachBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanSurfing; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFieldMove; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_QuintyPlump; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleBoy2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LittleGirl2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy3; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Girl3; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy4; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FatMan; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman3; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman4; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man3; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman5; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cook; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman6; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldMan2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_OldWoman2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Camper; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Picnicker; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man4; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Woman7; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Youngster; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BugCatcher; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PsychicM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SchoolKidM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maniac; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HexManiac; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwimmerF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BlackBelt; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Beauty; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lass; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Gentleman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sailor; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fisherman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RunningTriathleteF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hiker; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyclingTriathleteF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Nurse; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ItemBall; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTree; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeEarlyStages; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BerryTreeLateStages; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanAcroBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ProfBirch; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man5; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man6; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ReporterF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Bard; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Anabel; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tucker; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Greta; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Spenser; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Noland; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lucy; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedNatuDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMagnemiteDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedSquirtleDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedWooperDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPikachuDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedPorygon2Doll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CuttableTree; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MartEmployee; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RooftopSaleWoman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Teala; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BreakableRock; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PushableBoulder; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MrBrineysBoat; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayNormal; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayMachBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayAcroBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MaySurfing; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFieldMove; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Truck; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothCarryingBox; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_VigorothFacingAway; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirchsBag; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_EnemyZigzagoon; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Artist; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanNormal; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanMachBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanAcroBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanSurfing; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalBrendanFieldMove; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayNormal; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayMachBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayAcroBike; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMaySurfing; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RivalMayFieldMove; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Cameraman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanUnderwater; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayUnderwater; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MovingBox; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CableCar; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scientist2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Man7; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AquaMemberF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberM; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MagmaMemberF; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sidney; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Phoebe; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Glacia; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Drake; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Roxanne; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brawly; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wattson; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Flannery; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Norman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Winona; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Liza; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Tate; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wallace; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Steven; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wally; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireLittleBoy; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanFishing; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayFishing; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HotSpringsOldWoman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SSTidal; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SubmarineShadow; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PichuDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikachuDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MarillDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TogepiDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_CyndaquilDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ChikoritaDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TotodileDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_JigglypuffDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MeowthDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ClefairyDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DittoDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SmoochumDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TreeckoDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TorchicDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MudkipDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DuskullDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WynautDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BaltoyDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KecleonDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_AzurillDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SkittyDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SwabluDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GulpinDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LotadDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SeedotDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_PikaCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RoundCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_KissCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ZigzagCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_SpinCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_DiamondCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BallCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_GrassCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_FireCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_WaterCushion; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigSnorlaxDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRhydonDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigLaprasDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigVenusaurDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigCharizardDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigBlastoiseDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigWailmerDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegirockDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegiceDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BigRegisteelDoll; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latias; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Latios; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Boy5; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_ContestOldMan; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanWatering; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayWatering; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BrendanDecorating; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MayDecorating; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Archie; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Maxie; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Fossil; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regirock; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Regice; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Registeel; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Skitty; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Rayquaza2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Zigzagoon; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Pikachu; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azumarill; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Wingull; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kecleon2; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_TuberMSwimming; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Azurill; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mom; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkBrendan; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_LinkMay; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Juan; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Scott; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Poochyena; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kyogre3; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Groudon3; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_MysteryEventDeliveryman; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Statue; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Kirlia; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Dusclops; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnionRoomAttendant; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Sudowoodo; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Mew; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Red; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Leaf; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Deoxys; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_BirthIslandStone; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Brandon; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireBrendan; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_RubySapphireMay; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Lugia; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_HoOh; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Bard; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Hipster; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Trader; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Storyteller; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_Giddy; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan1; +const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldMan2; + + +const struct EventObjectGraphicsInfo *const gEventObjectGraphicsInfoPointers[] = { + &gEventObjectGraphicsInfo_BrendanNormal, + &gEventObjectGraphicsInfo_BrendanMachBike, + &gEventObjectGraphicsInfo_BrendanSurfing, + &gEventObjectGraphicsInfo_BrendanFieldMove, + &gEventObjectGraphicsInfo_QuintyPlump, + &gEventObjectGraphicsInfo_LittleBoy1, + &gEventObjectGraphicsInfo_LittleGirl1, + &gEventObjectGraphicsInfo_Boy1, + &gEventObjectGraphicsInfo_Girl1, + &gEventObjectGraphicsInfo_Boy2, + &gEventObjectGraphicsInfo_Girl2, + &gEventObjectGraphicsInfo_LittleBoy2, + &gEventObjectGraphicsInfo_LittleGirl2, + &gEventObjectGraphicsInfo_Boy3, + &gEventObjectGraphicsInfo_Girl3, + &gEventObjectGraphicsInfo_Boy4, + &gEventObjectGraphicsInfo_Woman1, + &gEventObjectGraphicsInfo_FatMan, + &gEventObjectGraphicsInfo_Woman2, + &gEventObjectGraphicsInfo_Man1, + &gEventObjectGraphicsInfo_Woman3, + &gEventObjectGraphicsInfo_OldMan1, + &gEventObjectGraphicsInfo_OldWoman1, + &gEventObjectGraphicsInfo_Man2, + &gEventObjectGraphicsInfo_Woman4, + &gEventObjectGraphicsInfo_Man3, + &gEventObjectGraphicsInfo_Woman5, + &gEventObjectGraphicsInfo_Cook, + &gEventObjectGraphicsInfo_Woman6, + &gEventObjectGraphicsInfo_OldMan2, + &gEventObjectGraphicsInfo_OldWoman2, + &gEventObjectGraphicsInfo_Camper, + &gEventObjectGraphicsInfo_Picnicker, + &gEventObjectGraphicsInfo_Man4, + &gEventObjectGraphicsInfo_Woman7, + &gEventObjectGraphicsInfo_Youngster, + &gEventObjectGraphicsInfo_BugCatcher, + &gEventObjectGraphicsInfo_PsychicM, + &gEventObjectGraphicsInfo_SchoolKidM, + &gEventObjectGraphicsInfo_Maniac, + &gEventObjectGraphicsInfo_HexManiac, + &gEventObjectGraphicsInfo_Rayquaza1, + &gEventObjectGraphicsInfo_SwimmerM, + &gEventObjectGraphicsInfo_SwimmerF, + &gEventObjectGraphicsInfo_BlackBelt, + &gEventObjectGraphicsInfo_Beauty, + &gEventObjectGraphicsInfo_Scientist1, + &gEventObjectGraphicsInfo_Lass, + &gEventObjectGraphicsInfo_Gentleman, + &gEventObjectGraphicsInfo_Sailor, + &gEventObjectGraphicsInfo_Fisherman, + &gEventObjectGraphicsInfo_RunningTriathleteM, + &gEventObjectGraphicsInfo_RunningTriathleteF, + &gEventObjectGraphicsInfo_TuberF, + &gEventObjectGraphicsInfo_TuberM, + &gEventObjectGraphicsInfo_Hiker, + &gEventObjectGraphicsInfo_CyclingTriathleteM, + &gEventObjectGraphicsInfo_CyclingTriathleteF, + &gEventObjectGraphicsInfo_Nurse, + &gEventObjectGraphicsInfo_ItemBall, + &gEventObjectGraphicsInfo_BerryTree, + &gEventObjectGraphicsInfo_BerryTreeEarlyStages, + &gEventObjectGraphicsInfo_BerryTreeLateStages, + &gEventObjectGraphicsInfo_BrendanAcroBike, + &gEventObjectGraphicsInfo_ProfBirch, + &gEventObjectGraphicsInfo_Man5, + &gEventObjectGraphicsInfo_Man6, + &gEventObjectGraphicsInfo_ReporterM, + &gEventObjectGraphicsInfo_ReporterF, + &gEventObjectGraphicsInfo_Bard, + &gEventObjectGraphicsInfo_Anabel, + &gEventObjectGraphicsInfo_Tucker, + &gEventObjectGraphicsInfo_Greta, + &gEventObjectGraphicsInfo_Spenser, + &gEventObjectGraphicsInfo_Noland, + &gEventObjectGraphicsInfo_Lucy, + &gEventObjectGraphicsInfo_UnusedNatuDoll, + &gEventObjectGraphicsInfo_UnusedMagnemiteDoll, + &gEventObjectGraphicsInfo_UnusedSquirtleDoll, + &gEventObjectGraphicsInfo_UnusedWooperDoll, + &gEventObjectGraphicsInfo_UnusedPikachuDoll, + &gEventObjectGraphicsInfo_UnusedPorygon2Doll, + &gEventObjectGraphicsInfo_CuttableTree, + &gEventObjectGraphicsInfo_MartEmployee, + &gEventObjectGraphicsInfo_RooftopSaleWoman, + &gEventObjectGraphicsInfo_Teala, + &gEventObjectGraphicsInfo_BreakableRock, + &gEventObjectGraphicsInfo_PushableBoulder, + &gEventObjectGraphicsInfo_MrBrineysBoat, + &gEventObjectGraphicsInfo_MayNormal, + &gEventObjectGraphicsInfo_MayMachBike, + &gEventObjectGraphicsInfo_MayAcroBike, + &gEventObjectGraphicsInfo_MaySurfing, + &gEventObjectGraphicsInfo_MayFieldMove, + &gEventObjectGraphicsInfo_Truck, + &gEventObjectGraphicsInfo_VigorothCarryingBox, + &gEventObjectGraphicsInfo_VigorothFacingAway, + &gEventObjectGraphicsInfo_BirchsBag, + &gEventObjectGraphicsInfo_EnemyZigzagoon, + &gEventObjectGraphicsInfo_Artist, + &gEventObjectGraphicsInfo_RivalBrendanNormal, + &gEventObjectGraphicsInfo_RivalBrendanMachBike, + &gEventObjectGraphicsInfo_RivalBrendanAcroBike, + &gEventObjectGraphicsInfo_RivalBrendanSurfing, + &gEventObjectGraphicsInfo_RivalBrendanFieldMove, + &gEventObjectGraphicsInfo_RivalMayNormal, + &gEventObjectGraphicsInfo_RivalMayMachBike, + &gEventObjectGraphicsInfo_RivalMayAcroBike, + &gEventObjectGraphicsInfo_RivalMaySurfing, + &gEventObjectGraphicsInfo_RivalMayFieldMove, + &gEventObjectGraphicsInfo_Cameraman, + &gEventObjectGraphicsInfo_BrendanUnderwater, + &gEventObjectGraphicsInfo_MayUnderwater, + &gEventObjectGraphicsInfo_MovingBox, + &gEventObjectGraphicsInfo_CableCar, + &gEventObjectGraphicsInfo_Scientist2, + &gEventObjectGraphicsInfo_Man7, + &gEventObjectGraphicsInfo_AquaMemberM, + &gEventObjectGraphicsInfo_AquaMemberF, + &gEventObjectGraphicsInfo_MagmaMemberM, + &gEventObjectGraphicsInfo_MagmaMemberF, + &gEventObjectGraphicsInfo_Sidney, + &gEventObjectGraphicsInfo_Phoebe, + &gEventObjectGraphicsInfo_Glacia, + &gEventObjectGraphicsInfo_Drake, + &gEventObjectGraphicsInfo_Roxanne, + &gEventObjectGraphicsInfo_Brawly, + &gEventObjectGraphicsInfo_Wattson, + &gEventObjectGraphicsInfo_Flannery, + &gEventObjectGraphicsInfo_Norman, + &gEventObjectGraphicsInfo_Winona, + &gEventObjectGraphicsInfo_Liza, + &gEventObjectGraphicsInfo_Tate, + &gEventObjectGraphicsInfo_Wallace, + &gEventObjectGraphicsInfo_Steven, + &gEventObjectGraphicsInfo_Wally, + &gEventObjectGraphicsInfo_RubySapphireLittleBoy, + &gEventObjectGraphicsInfo_BrendanFishing, + &gEventObjectGraphicsInfo_MayFishing, + &gEventObjectGraphicsInfo_HotSpringsOldWoman, + &gEventObjectGraphicsInfo_SSTidal, + &gEventObjectGraphicsInfo_SubmarineShadow, + &gEventObjectGraphicsInfo_PichuDoll, + &gEventObjectGraphicsInfo_PikachuDoll, + &gEventObjectGraphicsInfo_MarillDoll, + &gEventObjectGraphicsInfo_TogepiDoll, + &gEventObjectGraphicsInfo_CyndaquilDoll, + &gEventObjectGraphicsInfo_ChikoritaDoll, + &gEventObjectGraphicsInfo_TotodileDoll, + &gEventObjectGraphicsInfo_JigglypuffDoll, + &gEventObjectGraphicsInfo_MeowthDoll, + &gEventObjectGraphicsInfo_ClefairyDoll, + &gEventObjectGraphicsInfo_DittoDoll, + &gEventObjectGraphicsInfo_SmoochumDoll, + &gEventObjectGraphicsInfo_TreeckoDoll, + &gEventObjectGraphicsInfo_TorchicDoll, + &gEventObjectGraphicsInfo_MudkipDoll, + &gEventObjectGraphicsInfo_DuskullDoll, + &gEventObjectGraphicsInfo_WynautDoll, + &gEventObjectGraphicsInfo_BaltoyDoll, + &gEventObjectGraphicsInfo_KecleonDoll, + &gEventObjectGraphicsInfo_AzurillDoll, + &gEventObjectGraphicsInfo_SkittyDoll, + &gEventObjectGraphicsInfo_SwabluDoll, + &gEventObjectGraphicsInfo_GulpinDoll, + &gEventObjectGraphicsInfo_LotadDoll, + &gEventObjectGraphicsInfo_SeedotDoll, + &gEventObjectGraphicsInfo_PikaCushion, + &gEventObjectGraphicsInfo_RoundCushion, + &gEventObjectGraphicsInfo_KissCushion, + &gEventObjectGraphicsInfo_ZigzagCushion, + &gEventObjectGraphicsInfo_SpinCushion, + &gEventObjectGraphicsInfo_DiamondCushion, + &gEventObjectGraphicsInfo_BallCushion, + &gEventObjectGraphicsInfo_GrassCushion, + &gEventObjectGraphicsInfo_FireCushion, + &gEventObjectGraphicsInfo_WaterCushion, + &gEventObjectGraphicsInfo_BigSnorlaxDoll, + &gEventObjectGraphicsInfo_BigRhydonDoll, + &gEventObjectGraphicsInfo_BigLaprasDoll, + &gEventObjectGraphicsInfo_BigVenusaurDoll, + &gEventObjectGraphicsInfo_BigCharizardDoll, + &gEventObjectGraphicsInfo_BigBlastoiseDoll, + &gEventObjectGraphicsInfo_BigWailmerDoll, + &gEventObjectGraphicsInfo_BigRegirockDoll, + &gEventObjectGraphicsInfo_BigRegiceDoll, + &gEventObjectGraphicsInfo_BigRegisteelDoll, + &gEventObjectGraphicsInfo_Latias, + &gEventObjectGraphicsInfo_Latios, + &gEventObjectGraphicsInfo_Boy5, + &gEventObjectGraphicsInfo_ContestOldMan, + &gEventObjectGraphicsInfo_BrendanWatering, + &gEventObjectGraphicsInfo_MayWatering, + &gEventObjectGraphicsInfo_BrendanDecorating, + &gEventObjectGraphicsInfo_MayDecorating, + &gEventObjectGraphicsInfo_Archie, + &gEventObjectGraphicsInfo_Maxie, + &gEventObjectGraphicsInfo_Kyogre1, + &gEventObjectGraphicsInfo_Groudon1, + &gEventObjectGraphicsInfo_Fossil, + &gEventObjectGraphicsInfo_Regirock, + &gEventObjectGraphicsInfo_Regice, + &gEventObjectGraphicsInfo_Registeel, + &gEventObjectGraphicsInfo_Skitty, + &gEventObjectGraphicsInfo_Kecleon1, + &gEventObjectGraphicsInfo_Kyogre2, + &gEventObjectGraphicsInfo_Groudon2, + &gEventObjectGraphicsInfo_Rayquaza2, + &gEventObjectGraphicsInfo_Zigzagoon, + &gEventObjectGraphicsInfo_Pikachu, + &gEventObjectGraphicsInfo_Azumarill, + &gEventObjectGraphicsInfo_Wingull, + &gEventObjectGraphicsInfo_Kecleon2, + &gEventObjectGraphicsInfo_TuberMSwimming, + &gEventObjectGraphicsInfo_Azurill, + &gEventObjectGraphicsInfo_Mom, + &gEventObjectGraphicsInfo_LinkBrendan, + &gEventObjectGraphicsInfo_LinkMay, + &gEventObjectGraphicsInfo_Juan, + &gEventObjectGraphicsInfo_Scott, + &gEventObjectGraphicsInfo_Poochyena, + &gEventObjectGraphicsInfo_Kyogre3, + &gEventObjectGraphicsInfo_Groudon3, + &gEventObjectGraphicsInfo_MysteryEventDeliveryman, + &gEventObjectGraphicsInfo_Statue, + &gEventObjectGraphicsInfo_Kirlia, + &gEventObjectGraphicsInfo_Dusclops, + &gEventObjectGraphicsInfo_UnionRoomAttendant, + &gEventObjectGraphicsInfo_Sudowoodo, + &gEventObjectGraphicsInfo_Mew, + &gEventObjectGraphicsInfo_Red, + &gEventObjectGraphicsInfo_Leaf, + &gEventObjectGraphicsInfo_Deoxys, + &gEventObjectGraphicsInfo_BirthIslandStone, + &gEventObjectGraphicsInfo_Brandon, + &gEventObjectGraphicsInfo_RubySapphireBrendan, + &gEventObjectGraphicsInfo_RubySapphireMay, + &gEventObjectGraphicsInfo_Lugia, + &gEventObjectGraphicsInfo_HoOh, +}; + +const struct EventObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = { + &gEventObjectGraphicsInfo_Bard, + &gEventObjectGraphicsInfo_Hipster, + &gEventObjectGraphicsInfo_Trader, + &gEventObjectGraphicsInfo_Storyteller, + &gEventObjectGraphicsInfo_Giddy, + &gEventObjectGraphicsInfo_UnusedMauvilleOldMan1, + &gEventObjectGraphicsInfo_UnusedMauvilleOldMan2, +}; + +#endif //GUARD_EVENT_OBJECT_GRAPHICS_INFO_POINTERS_H diff --git a/src/data/field_event_obj/event_object_pic_tables.h b/src/data/field_event_obj/event_object_pic_tables.h new file mode 100755 index 000000000..892af7e9b --- /dev/null +++ b/src/data/field_event_obj/event_object_pic_tables.h @@ -0,0 +1,2179 @@ +#ifndef GUARD_EVENT_OBJECT_PIC_TABLES_H +#define GUARD_EVENT_OBJECT_PIC_TABLES_H + +const struct SpriteFrameImage gEventObjectPicTable_BrendanNormal[] = { + obj_frame_tiles(gEventObjectPic_BrendanNormal_0), + obj_frame_tiles(gEventObjectPic_BrendanNormal_1), + obj_frame_tiles(gEventObjectPic_BrendanNormal_2), + obj_frame_tiles(gEventObjectPic_BrendanNormal_3), + obj_frame_tiles(gEventObjectPic_BrendanNormal_4), + obj_frame_tiles(gEventObjectPic_BrendanNormal_5), + obj_frame_tiles(gEventObjectPic_BrendanNormal_6), + obj_frame_tiles(gEventObjectPic_BrendanNormal_7), + obj_frame_tiles(gEventObjectPic_BrendanNormal_8), + obj_frame_tiles(gEventObjectPic_BrendanNormal_9), + obj_frame_tiles(gEventObjectPic_BrendanNormal_10), + obj_frame_tiles(gEventObjectPic_BrendanNormal_11), + obj_frame_tiles(gEventObjectPic_BrendanNormal_12), + obj_frame_tiles(gEventObjectPic_BrendanNormal_13), + obj_frame_tiles(gEventObjectPic_BrendanNormal_14), + obj_frame_tiles(gEventObjectPic_BrendanNormal_15), + obj_frame_tiles(gEventObjectPic_BrendanNormal_16), + obj_frame_tiles(gEventObjectPic_BrendanNormal_17), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanMachBike[] = { + obj_frame_tiles(gEventObjectPic_BrendanMachBike_0), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_1), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_2), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_3), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_4), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_5), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_6), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_7), + obj_frame_tiles(gEventObjectPic_BrendanMachBike_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanAcroBike[] = { + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_0), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_1), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_2), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_3), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_4), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_5), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_6), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_7), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_8), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_9), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_10), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_11), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_12), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_13), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_14), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_15), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_16), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_17), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_18), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_19), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_20), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_21), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_22), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_23), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_24), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_25), + obj_frame_tiles(gEventObjectPic_BrendanAcroBike_26), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanSurfing[] = { + obj_frame_tiles(gEventObjectPic_BrendanSurfing_0), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_1), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_2), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_0), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_0), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_1), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_1), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_2), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_2), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_3), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_4), + obj_frame_tiles(gEventObjectPic_BrendanSurfing_5), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanUnderwater[] = { + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_0), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_1), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_2), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_0), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_0), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_1), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_1), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_2), + obj_frame_tiles(gEventObjectPic_BrendanUnderwater_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanFieldMove[] = { + obj_frame_tiles(gEventObjectPic_BrendanFieldMove_0), + obj_frame_tiles(gEventObjectPic_BrendanFieldMove_1), + obj_frame_tiles(gEventObjectPic_BrendanFieldMove_2), + obj_frame_tiles(gEventObjectPic_BrendanFieldMove_3), + obj_frame_tiles(gEventObjectPic_BrendanFieldMove_4), +}; + +const struct SpriteFrameImage gEventObjectPicTable_QuintyPlump[] = { + obj_frame_tiles(gEventObjectPic_QuintyPlump_0), + obj_frame_tiles(gEventObjectPic_QuintyPlump_1), + obj_frame_tiles(gEventObjectPic_QuintyPlump_2), + obj_frame_tiles(gEventObjectPic_QuintyPlump_3), + obj_frame_tiles(gEventObjectPic_QuintyPlump_4), + obj_frame_tiles(gEventObjectPic_QuintyPlump_5), + obj_frame_tiles(gEventObjectPic_QuintyPlump_6), +}; + +const struct SpriteFrameImage gEventObjectPicTable_LittleBoy1[] = { + obj_frame_tiles(gEventObjectPic_LittleBoy1_0), + obj_frame_tiles(gEventObjectPic_LittleBoy1_1), + obj_frame_tiles(gEventObjectPic_LittleBoy1_2), + obj_frame_tiles(gEventObjectPic_LittleBoy1_3), + obj_frame_tiles(gEventObjectPic_LittleBoy1_4), + obj_frame_tiles(gEventObjectPic_LittleBoy1_5), + obj_frame_tiles(gEventObjectPic_LittleBoy1_6), + obj_frame_tiles(gEventObjectPic_LittleBoy1_7), + obj_frame_tiles(gEventObjectPic_LittleBoy1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_LittleGirl1[] = { + obj_frame_tiles(gEventObjectPic_LittleGirl1_0), + obj_frame_tiles(gEventObjectPic_LittleGirl1_1), + obj_frame_tiles(gEventObjectPic_LittleGirl1_2), + obj_frame_tiles(gEventObjectPic_LittleGirl1_3), + obj_frame_tiles(gEventObjectPic_LittleGirl1_4), + obj_frame_tiles(gEventObjectPic_LittleGirl1_5), + obj_frame_tiles(gEventObjectPic_LittleGirl1_6), + obj_frame_tiles(gEventObjectPic_LittleGirl1_7), + obj_frame_tiles(gEventObjectPic_LittleGirl1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Boy1[] = { + obj_frame_tiles(gEventObjectPic_Boy1_0), + obj_frame_tiles(gEventObjectPic_Boy1_1), + obj_frame_tiles(gEventObjectPic_Boy1_2), + obj_frame_tiles(gEventObjectPic_Boy1_3), + obj_frame_tiles(gEventObjectPic_Boy1_4), + obj_frame_tiles(gEventObjectPic_Boy1_5), + obj_frame_tiles(gEventObjectPic_Boy1_6), + obj_frame_tiles(gEventObjectPic_Boy1_7), + obj_frame_tiles(gEventObjectPic_Boy1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Girl1[] = { + obj_frame_tiles(gEventObjectPic_Girl1_0), + obj_frame_tiles(gEventObjectPic_Girl1_1), + obj_frame_tiles(gEventObjectPic_Girl1_2), + obj_frame_tiles(gEventObjectPic_Girl1_3), + obj_frame_tiles(gEventObjectPic_Girl1_4), + obj_frame_tiles(gEventObjectPic_Girl1_5), + obj_frame_tiles(gEventObjectPic_Girl1_6), + obj_frame_tiles(gEventObjectPic_Girl1_7), + obj_frame_tiles(gEventObjectPic_Girl1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Boy2[] = { + obj_frame_tiles(gEventObjectPic_Boy2_0), + obj_frame_tiles(gEventObjectPic_Boy2_1), + obj_frame_tiles(gEventObjectPic_Boy2_2), + obj_frame_tiles(gEventObjectPic_Boy2_3), + obj_frame_tiles(gEventObjectPic_Boy2_4), + obj_frame_tiles(gEventObjectPic_Boy2_5), + obj_frame_tiles(gEventObjectPic_Boy2_6), + obj_frame_tiles(gEventObjectPic_Boy2_7), + obj_frame_tiles(gEventObjectPic_Boy2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Girl2[] = { + obj_frame_tiles(gEventObjectPic_Girl2_0), + obj_frame_tiles(gEventObjectPic_Girl2_1), + obj_frame_tiles(gEventObjectPic_Girl2_2), + obj_frame_tiles(gEventObjectPic_Girl2_3), + obj_frame_tiles(gEventObjectPic_Girl2_4), + obj_frame_tiles(gEventObjectPic_Girl2_5), + obj_frame_tiles(gEventObjectPic_Girl2_6), + obj_frame_tiles(gEventObjectPic_Girl2_7), + obj_frame_tiles(gEventObjectPic_Girl2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_LittleBoy2[] = { + obj_frame_tiles(gEventObjectPic_LittleBoy2_0), + obj_frame_tiles(gEventObjectPic_LittleBoy2_1), + obj_frame_tiles(gEventObjectPic_LittleBoy2_2), + obj_frame_tiles(gEventObjectPic_LittleBoy2_3), + obj_frame_tiles(gEventObjectPic_LittleBoy2_4), + obj_frame_tiles(gEventObjectPic_LittleBoy2_5), + obj_frame_tiles(gEventObjectPic_LittleBoy2_6), + obj_frame_tiles(gEventObjectPic_LittleBoy2_7), + obj_frame_tiles(gEventObjectPic_LittleBoy2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_LittleGirl2[] = { + obj_frame_tiles(gEventObjectPic_LittleGirl2_0), + obj_frame_tiles(gEventObjectPic_LittleGirl2_1), + obj_frame_tiles(gEventObjectPic_LittleGirl2_2), + obj_frame_tiles(gEventObjectPic_LittleGirl2_3), + obj_frame_tiles(gEventObjectPic_LittleGirl2_4), + obj_frame_tiles(gEventObjectPic_LittleGirl2_5), + obj_frame_tiles(gEventObjectPic_LittleGirl2_6), + obj_frame_tiles(gEventObjectPic_LittleGirl2_7), + obj_frame_tiles(gEventObjectPic_LittleGirl2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Boy3[] = { + obj_frame_tiles(gEventObjectPic_Boy3_0), + obj_frame_tiles(gEventObjectPic_Boy3_1), + obj_frame_tiles(gEventObjectPic_Boy3_2), + obj_frame_tiles(gEventObjectPic_Boy3_3), + obj_frame_tiles(gEventObjectPic_Boy3_4), + obj_frame_tiles(gEventObjectPic_Boy3_5), + obj_frame_tiles(gEventObjectPic_Boy3_6), + obj_frame_tiles(gEventObjectPic_Boy3_7), + obj_frame_tiles(gEventObjectPic_Boy3_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Girl3[] = { + obj_frame_tiles(gEventObjectPic_Girl3_0), + obj_frame_tiles(gEventObjectPic_Girl3_1), + obj_frame_tiles(gEventObjectPic_Girl3_2), + obj_frame_tiles(gEventObjectPic_Girl3_3), + obj_frame_tiles(gEventObjectPic_Girl3_4), + obj_frame_tiles(gEventObjectPic_Girl3_5), + obj_frame_tiles(gEventObjectPic_Girl3_6), + obj_frame_tiles(gEventObjectPic_Girl3_7), + obj_frame_tiles(gEventObjectPic_Girl3_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Boy4[] = { + obj_frame_tiles(gEventObjectPic_Boy4_0), + obj_frame_tiles(gEventObjectPic_Boy4_1), + obj_frame_tiles(gEventObjectPic_Boy4_2), + obj_frame_tiles(gEventObjectPic_Boy4_3), + obj_frame_tiles(gEventObjectPic_Boy4_4), + obj_frame_tiles(gEventObjectPic_Boy4_5), + obj_frame_tiles(gEventObjectPic_Boy4_6), + obj_frame_tiles(gEventObjectPic_Boy4_7), + obj_frame_tiles(gEventObjectPic_Boy4_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman1[] = { + obj_frame_tiles(gEventObjectPic_Woman1_0), + obj_frame_tiles(gEventObjectPic_Woman1_1), + obj_frame_tiles(gEventObjectPic_Woman1_2), + obj_frame_tiles(gEventObjectPic_Woman1_3), + obj_frame_tiles(gEventObjectPic_Woman1_4), + obj_frame_tiles(gEventObjectPic_Woman1_5), + obj_frame_tiles(gEventObjectPic_Woman1_6), + obj_frame_tiles(gEventObjectPic_Woman1_7), + obj_frame_tiles(gEventObjectPic_Woman1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_FatMan[] = { + obj_frame_tiles(gEventObjectPic_FatMan_0), + obj_frame_tiles(gEventObjectPic_FatMan_1), + obj_frame_tiles(gEventObjectPic_FatMan_2), + obj_frame_tiles(gEventObjectPic_FatMan_3), + obj_frame_tiles(gEventObjectPic_FatMan_4), + obj_frame_tiles(gEventObjectPic_FatMan_5), + obj_frame_tiles(gEventObjectPic_FatMan_6), + obj_frame_tiles(gEventObjectPic_FatMan_7), + obj_frame_tiles(gEventObjectPic_FatMan_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman2[] = { + obj_frame_tiles(gEventObjectPic_Woman2_0), + obj_frame_tiles(gEventObjectPic_Woman2_1), + obj_frame_tiles(gEventObjectPic_Woman2_2), + obj_frame_tiles(gEventObjectPic_Woman2_3), + obj_frame_tiles(gEventObjectPic_Woman2_4), + obj_frame_tiles(gEventObjectPic_Woman2_5), + obj_frame_tiles(gEventObjectPic_Woman2_6), + obj_frame_tiles(gEventObjectPic_Woman2_7), + obj_frame_tiles(gEventObjectPic_Woman2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man1[] = { + obj_frame_tiles(gEventObjectPic_Man1_0), + obj_frame_tiles(gEventObjectPic_Man1_1), + obj_frame_tiles(gEventObjectPic_Man1_2), + obj_frame_tiles(gEventObjectPic_Man1_3), + obj_frame_tiles(gEventObjectPic_Man1_4), + obj_frame_tiles(gEventObjectPic_Man1_5), + obj_frame_tiles(gEventObjectPic_Man1_6), + obj_frame_tiles(gEventObjectPic_Man1_7), + obj_frame_tiles(gEventObjectPic_Man1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman3[] = { + obj_frame_tiles(gEventObjectPic_Woman3_0), + obj_frame_tiles(gEventObjectPic_Woman3_1), + obj_frame_tiles(gEventObjectPic_Woman3_2), + obj_frame_tiles(gEventObjectPic_Woman3_3), + obj_frame_tiles(gEventObjectPic_Woman3_4), + obj_frame_tiles(gEventObjectPic_Woman3_5), + obj_frame_tiles(gEventObjectPic_Woman3_6), + obj_frame_tiles(gEventObjectPic_Woman3_7), + obj_frame_tiles(gEventObjectPic_Woman3_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_OldMan1[] = { + obj_frame_tiles(gEventObjectPic_OldMan1_0), + obj_frame_tiles(gEventObjectPic_OldMan1_1), + obj_frame_tiles(gEventObjectPic_OldMan1_2), + obj_frame_tiles(gEventObjectPic_OldMan1_3), + obj_frame_tiles(gEventObjectPic_OldMan1_4), + obj_frame_tiles(gEventObjectPic_OldMan1_5), + obj_frame_tiles(gEventObjectPic_OldMan1_6), + obj_frame_tiles(gEventObjectPic_OldMan1_7), + obj_frame_tiles(gEventObjectPic_OldMan1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_OldWoman1[] = { + obj_frame_tiles(gEventObjectPic_OldWoman1_0), + obj_frame_tiles(gEventObjectPic_OldWoman1_1), + obj_frame_tiles(gEventObjectPic_OldWoman1_2), + obj_frame_tiles(gEventObjectPic_OldWoman1_3), + obj_frame_tiles(gEventObjectPic_OldWoman1_4), + obj_frame_tiles(gEventObjectPic_OldWoman1_5), + obj_frame_tiles(gEventObjectPic_OldWoman1_6), + obj_frame_tiles(gEventObjectPic_OldWoman1_7), + obj_frame_tiles(gEventObjectPic_OldWoman1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man2[] = { + obj_frame_tiles(gEventObjectPic_Man2_0), + obj_frame_tiles(gEventObjectPic_Man2_1), + obj_frame_tiles(gEventObjectPic_Man2_2), + obj_frame_tiles(gEventObjectPic_Man2_3), + obj_frame_tiles(gEventObjectPic_Man2_4), + obj_frame_tiles(gEventObjectPic_Man2_5), + obj_frame_tiles(gEventObjectPic_Man2_6), + obj_frame_tiles(gEventObjectPic_Man2_7), + obj_frame_tiles(gEventObjectPic_Man2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman4[] = { + obj_frame_tiles(gEventObjectPic_Woman4_0), + obj_frame_tiles(gEventObjectPic_Woman4_1), + obj_frame_tiles(gEventObjectPic_Woman4_2), + obj_frame_tiles(gEventObjectPic_Woman4_3), + obj_frame_tiles(gEventObjectPic_Woman4_4), + obj_frame_tiles(gEventObjectPic_Woman4_5), + obj_frame_tiles(gEventObjectPic_Woman4_6), + obj_frame_tiles(gEventObjectPic_Woman4_7), + obj_frame_tiles(gEventObjectPic_Woman4_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man3[] = { + obj_frame_tiles(gEventObjectPic_Man3_0), + obj_frame_tiles(gEventObjectPic_Man3_1), + obj_frame_tiles(gEventObjectPic_Man3_2), + obj_frame_tiles(gEventObjectPic_Man3_3), + obj_frame_tiles(gEventObjectPic_Man3_4), + obj_frame_tiles(gEventObjectPic_Man3_5), + obj_frame_tiles(gEventObjectPic_Man3_6), + obj_frame_tiles(gEventObjectPic_Man3_7), + obj_frame_tiles(gEventObjectPic_Man3_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman5[] = { + obj_frame_tiles(gEventObjectPic_Woman5_0), + obj_frame_tiles(gEventObjectPic_Woman5_1), + obj_frame_tiles(gEventObjectPic_Woman5_2), + obj_frame_tiles(gEventObjectPic_Woman5_3), + obj_frame_tiles(gEventObjectPic_Woman5_4), + obj_frame_tiles(gEventObjectPic_Woman5_5), + obj_frame_tiles(gEventObjectPic_Woman5_6), + obj_frame_tiles(gEventObjectPic_Woman5_7), + obj_frame_tiles(gEventObjectPic_Woman5_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Cook[] = { + obj_frame_tiles(gEventObjectPic_Cook_0), + obj_frame_tiles(gEventObjectPic_Cook_1), + obj_frame_tiles(gEventObjectPic_Cook_2), + obj_frame_tiles(gEventObjectPic_Cook_0), + obj_frame_tiles(gEventObjectPic_Cook_0), + obj_frame_tiles(gEventObjectPic_Cook_1), + obj_frame_tiles(gEventObjectPic_Cook_1), + obj_frame_tiles(gEventObjectPic_Cook_2), + obj_frame_tiles(gEventObjectPic_Cook_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman6[] = { + obj_frame_tiles(gEventObjectPic_Woman6_0), + obj_frame_tiles(gEventObjectPic_Woman6_1), + obj_frame_tiles(gEventObjectPic_Woman6_2), + obj_frame_tiles(gEventObjectPic_Woman6_3), + obj_frame_tiles(gEventObjectPic_Woman6_4), + obj_frame_tiles(gEventObjectPic_Woman6_5), + obj_frame_tiles(gEventObjectPic_Woman6_6), + obj_frame_tiles(gEventObjectPic_Woman6_7), + obj_frame_tiles(gEventObjectPic_Woman6_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_OldMan2[] = { + obj_frame_tiles(gEventObjectPic_OldMan2_0), + obj_frame_tiles(gEventObjectPic_OldMan2_1), + obj_frame_tiles(gEventObjectPic_OldMan2_2), + obj_frame_tiles(gEventObjectPic_OldMan2_0), + obj_frame_tiles(gEventObjectPic_OldMan2_0), + obj_frame_tiles(gEventObjectPic_OldMan2_1), + obj_frame_tiles(gEventObjectPic_OldMan2_1), + obj_frame_tiles(gEventObjectPic_OldMan2_2), + obj_frame_tiles(gEventObjectPic_OldMan2_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_OldWoman2[] = { + obj_frame_tiles(gEventObjectPic_OldWoman2_0), + obj_frame_tiles(gEventObjectPic_OldWoman2_1), + obj_frame_tiles(gEventObjectPic_OldWoman2_2), + obj_frame_tiles(gEventObjectPic_OldWoman2_3), + obj_frame_tiles(gEventObjectPic_OldWoman2_4), + obj_frame_tiles(gEventObjectPic_OldWoman2_5), + obj_frame_tiles(gEventObjectPic_OldWoman2_6), + obj_frame_tiles(gEventObjectPic_OldWoman2_7), + obj_frame_tiles(gEventObjectPic_OldWoman2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Camper[] = { + obj_frame_tiles(gEventObjectPic_Camper_0), + obj_frame_tiles(gEventObjectPic_Camper_1), + obj_frame_tiles(gEventObjectPic_Camper_2), + obj_frame_tiles(gEventObjectPic_Camper_3), + obj_frame_tiles(gEventObjectPic_Camper_4), + obj_frame_tiles(gEventObjectPic_Camper_5), + obj_frame_tiles(gEventObjectPic_Camper_6), + obj_frame_tiles(gEventObjectPic_Camper_7), + obj_frame_tiles(gEventObjectPic_Camper_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Picnicker[] = { + obj_frame_tiles(gEventObjectPic_Picnicker_0), + obj_frame_tiles(gEventObjectPic_Picnicker_1), + obj_frame_tiles(gEventObjectPic_Picnicker_2), + obj_frame_tiles(gEventObjectPic_Picnicker_3), + obj_frame_tiles(gEventObjectPic_Picnicker_4), + obj_frame_tiles(gEventObjectPic_Picnicker_5), + obj_frame_tiles(gEventObjectPic_Picnicker_6), + obj_frame_tiles(gEventObjectPic_Picnicker_7), + obj_frame_tiles(gEventObjectPic_Picnicker_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man4[] = { + obj_frame_tiles(gEventObjectPic_Man4_0), + obj_frame_tiles(gEventObjectPic_Man4_1), + obj_frame_tiles(gEventObjectPic_Man4_2), + obj_frame_tiles(gEventObjectPic_Man4_3), + obj_frame_tiles(gEventObjectPic_Man4_4), + obj_frame_tiles(gEventObjectPic_Man4_5), + obj_frame_tiles(gEventObjectPic_Man4_6), + obj_frame_tiles(gEventObjectPic_Man4_7), + obj_frame_tiles(gEventObjectPic_Man4_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Woman7[] = { + obj_frame_tiles(gEventObjectPic_Woman7_0), + obj_frame_tiles(gEventObjectPic_Woman7_1), + obj_frame_tiles(gEventObjectPic_Woman7_2), + obj_frame_tiles(gEventObjectPic_Woman7_3), + obj_frame_tiles(gEventObjectPic_Woman7_4), + obj_frame_tiles(gEventObjectPic_Woman7_5), + obj_frame_tiles(gEventObjectPic_Woman7_6), + obj_frame_tiles(gEventObjectPic_Woman7_7), + obj_frame_tiles(gEventObjectPic_Woman7_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Youngster[] = { + obj_frame_tiles(gEventObjectPic_Youngster_0), + obj_frame_tiles(gEventObjectPic_Youngster_1), + obj_frame_tiles(gEventObjectPic_Youngster_2), + obj_frame_tiles(gEventObjectPic_Youngster_3), + obj_frame_tiles(gEventObjectPic_Youngster_4), + obj_frame_tiles(gEventObjectPic_Youngster_5), + obj_frame_tiles(gEventObjectPic_Youngster_6), + obj_frame_tiles(gEventObjectPic_Youngster_7), + obj_frame_tiles(gEventObjectPic_Youngster_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BugCatcher[] = { + obj_frame_tiles(gEventObjectPic_BugCatcher_0), + obj_frame_tiles(gEventObjectPic_BugCatcher_1), + obj_frame_tiles(gEventObjectPic_BugCatcher_2), + obj_frame_tiles(gEventObjectPic_BugCatcher_3), + obj_frame_tiles(gEventObjectPic_BugCatcher_4), + obj_frame_tiles(gEventObjectPic_BugCatcher_5), + obj_frame_tiles(gEventObjectPic_BugCatcher_6), + obj_frame_tiles(gEventObjectPic_BugCatcher_7), + obj_frame_tiles(gEventObjectPic_BugCatcher_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_PsychicM[] = { + obj_frame_tiles(gEventObjectPic_PsychicM_0), + obj_frame_tiles(gEventObjectPic_PsychicM_1), + obj_frame_tiles(gEventObjectPic_PsychicM_2), + obj_frame_tiles(gEventObjectPic_PsychicM_3), + obj_frame_tiles(gEventObjectPic_PsychicM_4), + obj_frame_tiles(gEventObjectPic_PsychicM_5), + obj_frame_tiles(gEventObjectPic_PsychicM_6), + obj_frame_tiles(gEventObjectPic_PsychicM_7), + obj_frame_tiles(gEventObjectPic_PsychicM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SchoolKidM[] = { + obj_frame_tiles(gEventObjectPic_SchoolKidM_0), + obj_frame_tiles(gEventObjectPic_SchoolKidM_1), + obj_frame_tiles(gEventObjectPic_SchoolKidM_2), + obj_frame_tiles(gEventObjectPic_SchoolKidM_3), + obj_frame_tiles(gEventObjectPic_SchoolKidM_4), + obj_frame_tiles(gEventObjectPic_SchoolKidM_5), + obj_frame_tiles(gEventObjectPic_SchoolKidM_6), + obj_frame_tiles(gEventObjectPic_SchoolKidM_7), + obj_frame_tiles(gEventObjectPic_SchoolKidM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Maniac[] = { + obj_frame_tiles(gEventObjectPic_Maniac_0), + obj_frame_tiles(gEventObjectPic_Maniac_1), + obj_frame_tiles(gEventObjectPic_Maniac_2), + obj_frame_tiles(gEventObjectPic_Maniac_3), + obj_frame_tiles(gEventObjectPic_Maniac_4), + obj_frame_tiles(gEventObjectPic_Maniac_5), + obj_frame_tiles(gEventObjectPic_Maniac_6), + obj_frame_tiles(gEventObjectPic_Maniac_7), + obj_frame_tiles(gEventObjectPic_Maniac_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_HexManiac[] = { + obj_frame_tiles(gEventObjectPic_HexManiac_0), + obj_frame_tiles(gEventObjectPic_HexManiac_1), + obj_frame_tiles(gEventObjectPic_HexManiac_2), + obj_frame_tiles(gEventObjectPic_HexManiac_3), + obj_frame_tiles(gEventObjectPic_HexManiac_4), + obj_frame_tiles(gEventObjectPic_HexManiac_5), + obj_frame_tiles(gEventObjectPic_HexManiac_6), + obj_frame_tiles(gEventObjectPic_HexManiac_7), + obj_frame_tiles(gEventObjectPic_HexManiac_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SwimmerM[] = { + obj_frame_tiles(gEventObjectPic_SwimmerM_0), + obj_frame_tiles(gEventObjectPic_SwimmerM_1), + obj_frame_tiles(gEventObjectPic_SwimmerM_2), + obj_frame_tiles(gEventObjectPic_SwimmerM_3), + obj_frame_tiles(gEventObjectPic_SwimmerM_4), + obj_frame_tiles(gEventObjectPic_SwimmerM_5), + obj_frame_tiles(gEventObjectPic_SwimmerM_6), + obj_frame_tiles(gEventObjectPic_SwimmerM_7), + obj_frame_tiles(gEventObjectPic_SwimmerM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SwimmerF[] = { + obj_frame_tiles(gEventObjectPic_SwimmerF_0), + obj_frame_tiles(gEventObjectPic_SwimmerF_1), + obj_frame_tiles(gEventObjectPic_SwimmerF_2), + obj_frame_tiles(gEventObjectPic_SwimmerF_3), + obj_frame_tiles(gEventObjectPic_SwimmerF_4), + obj_frame_tiles(gEventObjectPic_SwimmerF_5), + obj_frame_tiles(gEventObjectPic_SwimmerF_6), + obj_frame_tiles(gEventObjectPic_SwimmerF_7), + obj_frame_tiles(gEventObjectPic_SwimmerF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BlackBelt[] = { + obj_frame_tiles(gEventObjectPic_BlackBelt_0), + obj_frame_tiles(gEventObjectPic_BlackBelt_1), + obj_frame_tiles(gEventObjectPic_BlackBelt_2), + obj_frame_tiles(gEventObjectPic_BlackBelt_3), + obj_frame_tiles(gEventObjectPic_BlackBelt_4), + obj_frame_tiles(gEventObjectPic_BlackBelt_5), + obj_frame_tiles(gEventObjectPic_BlackBelt_6), + obj_frame_tiles(gEventObjectPic_BlackBelt_7), + obj_frame_tiles(gEventObjectPic_BlackBelt_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Beauty[] = { + obj_frame_tiles(gEventObjectPic_Beauty_0), + obj_frame_tiles(gEventObjectPic_Beauty_1), + obj_frame_tiles(gEventObjectPic_Beauty_2), + obj_frame_tiles(gEventObjectPic_Beauty_3), + obj_frame_tiles(gEventObjectPic_Beauty_4), + obj_frame_tiles(gEventObjectPic_Beauty_5), + obj_frame_tiles(gEventObjectPic_Beauty_6), + obj_frame_tiles(gEventObjectPic_Beauty_7), + obj_frame_tiles(gEventObjectPic_Beauty_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Scientist1[] = { + obj_frame_tiles(gEventObjectPic_Scientist1_0), + obj_frame_tiles(gEventObjectPic_Scientist1_1), + obj_frame_tiles(gEventObjectPic_Scientist1_2), + obj_frame_tiles(gEventObjectPic_Scientist1_3), + obj_frame_tiles(gEventObjectPic_Scientist1_4), + obj_frame_tiles(gEventObjectPic_Scientist1_5), + obj_frame_tiles(gEventObjectPic_Scientist1_6), + obj_frame_tiles(gEventObjectPic_Scientist1_7), + obj_frame_tiles(gEventObjectPic_Scientist1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Lass[] = { + obj_frame_tiles(gEventObjectPic_Lass_0), + obj_frame_tiles(gEventObjectPic_Lass_1), + obj_frame_tiles(gEventObjectPic_Lass_2), + obj_frame_tiles(gEventObjectPic_Lass_3), + obj_frame_tiles(gEventObjectPic_Lass_4), + obj_frame_tiles(gEventObjectPic_Lass_5), + obj_frame_tiles(gEventObjectPic_Lass_6), + obj_frame_tiles(gEventObjectPic_Lass_7), + obj_frame_tiles(gEventObjectPic_Lass_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Gentleman[] = { + obj_frame_tiles(gEventObjectPic_Gentleman_0), + obj_frame_tiles(gEventObjectPic_Gentleman_1), + obj_frame_tiles(gEventObjectPic_Gentleman_2), + obj_frame_tiles(gEventObjectPic_Gentleman_3), + obj_frame_tiles(gEventObjectPic_Gentleman_4), + obj_frame_tiles(gEventObjectPic_Gentleman_5), + obj_frame_tiles(gEventObjectPic_Gentleman_6), + obj_frame_tiles(gEventObjectPic_Gentleman_7), + obj_frame_tiles(gEventObjectPic_Gentleman_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Sailor[] = { + obj_frame_tiles(gEventObjectPic_Sailor_0), + obj_frame_tiles(gEventObjectPic_Sailor_1), + obj_frame_tiles(gEventObjectPic_Sailor_2), + obj_frame_tiles(gEventObjectPic_Sailor_3), + obj_frame_tiles(gEventObjectPic_Sailor_4), + obj_frame_tiles(gEventObjectPic_Sailor_5), + obj_frame_tiles(gEventObjectPic_Sailor_6), + obj_frame_tiles(gEventObjectPic_Sailor_7), + obj_frame_tiles(gEventObjectPic_Sailor_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Fisherman[] = { + obj_frame_tiles(gEventObjectPic_Fisherman_0), + obj_frame_tiles(gEventObjectPic_Fisherman_1), + obj_frame_tiles(gEventObjectPic_Fisherman_2), + obj_frame_tiles(gEventObjectPic_Fisherman_3), + obj_frame_tiles(gEventObjectPic_Fisherman_4), + obj_frame_tiles(gEventObjectPic_Fisherman_5), + obj_frame_tiles(gEventObjectPic_Fisherman_6), + obj_frame_tiles(gEventObjectPic_Fisherman_7), + obj_frame_tiles(gEventObjectPic_Fisherman_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RunningTriathleteM[] = { + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_0), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_1), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_2), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_3), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_4), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_5), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_6), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_7), + obj_frame_tiles(gEventObjectPic_RunningTriathleteM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RunningTriathleteF[] = { + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_0), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_1), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_2), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_3), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_4), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_5), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_6), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_7), + obj_frame_tiles(gEventObjectPic_RunningTriathleteF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TuberF[] = { + obj_frame_tiles(gEventObjectPic_TuberF_0), + obj_frame_tiles(gEventObjectPic_TuberF_1), + obj_frame_tiles(gEventObjectPic_TuberF_2), + obj_frame_tiles(gEventObjectPic_TuberF_3), + obj_frame_tiles(gEventObjectPic_TuberF_4), + obj_frame_tiles(gEventObjectPic_TuberF_5), + obj_frame_tiles(gEventObjectPic_TuberF_6), + obj_frame_tiles(gEventObjectPic_TuberF_7), + obj_frame_tiles(gEventObjectPic_TuberF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TuberM[] = { + obj_frame_tiles(gEventObjectPic_TuberM_0), + obj_frame_tiles(gEventObjectPic_TuberM_1), + obj_frame_tiles(gEventObjectPic_TuberM_2), + obj_frame_tiles(gEventObjectPic_TuberM_3), + obj_frame_tiles(gEventObjectPic_TuberM_4), + obj_frame_tiles(gEventObjectPic_TuberM_5), + obj_frame_tiles(gEventObjectPic_TuberM_6), + obj_frame_tiles(gEventObjectPic_TuberM_7), + obj_frame_tiles(gEventObjectPic_TuberM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Hiker[] = { + obj_frame_tiles(gEventObjectPic_Hiker_0), + obj_frame_tiles(gEventObjectPic_Hiker_1), + obj_frame_tiles(gEventObjectPic_Hiker_2), + obj_frame_tiles(gEventObjectPic_Hiker_3), + obj_frame_tiles(gEventObjectPic_Hiker_4), + obj_frame_tiles(gEventObjectPic_Hiker_5), + obj_frame_tiles(gEventObjectPic_Hiker_6), + obj_frame_tiles(gEventObjectPic_Hiker_7), + obj_frame_tiles(gEventObjectPic_Hiker_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_CyclingTriathleteM[] = { + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_0), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_1), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_2), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_3), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_4), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_5), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_6), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_7), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_CyclingTriathleteF[] = { + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_0), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_1), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_2), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_3), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_4), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_5), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_6), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_7), + obj_frame_tiles(gEventObjectPic_CyclingTriathleteF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Nurse[] = { + obj_frame_tiles(gEventObjectPic_Nurse_0), + obj_frame_tiles(gEventObjectPic_Nurse_1), + obj_frame_tiles(gEventObjectPic_Nurse_2), + obj_frame_tiles(gEventObjectPic_Nurse_0), + obj_frame_tiles(gEventObjectPic_Nurse_0), + obj_frame_tiles(gEventObjectPic_Nurse_1), + obj_frame_tiles(gEventObjectPic_Nurse_1), + obj_frame_tiles(gEventObjectPic_Nurse_2), + obj_frame_tiles(gEventObjectPic_Nurse_2), + obj_frame_tiles(gEventObjectPic_Nurse_3), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ItemBall[] = { + obj_frame_tiles(gEventObjectPic_ItemBall), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ProfBirch[] = { + obj_frame_tiles(gEventObjectPic_ProfBirch_0), + obj_frame_tiles(gEventObjectPic_ProfBirch_1), + obj_frame_tiles(gEventObjectPic_ProfBirch_2), + obj_frame_tiles(gEventObjectPic_ProfBirch_3), + obj_frame_tiles(gEventObjectPic_ProfBirch_4), + obj_frame_tiles(gEventObjectPic_ProfBirch_5), + obj_frame_tiles(gEventObjectPic_ProfBirch_6), + obj_frame_tiles(gEventObjectPic_ProfBirch_7), + obj_frame_tiles(gEventObjectPic_ProfBirch_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man5[] = { + obj_frame_tiles(gEventObjectPic_Man5_0), + obj_frame_tiles(gEventObjectPic_Man5_1), + obj_frame_tiles(gEventObjectPic_Man5_2), + obj_frame_tiles(gEventObjectPic_Man5_3), + obj_frame_tiles(gEventObjectPic_Man5_4), + obj_frame_tiles(gEventObjectPic_Man5_5), + obj_frame_tiles(gEventObjectPic_Man5_6), + obj_frame_tiles(gEventObjectPic_Man5_7), + obj_frame_tiles(gEventObjectPic_Man5_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man6[] = { + obj_frame_tiles(gEventObjectPic_Man6_0), + obj_frame_tiles(gEventObjectPic_Man6_1), + obj_frame_tiles(gEventObjectPic_Man6_2), + obj_frame_tiles(gEventObjectPic_Man6_3), + obj_frame_tiles(gEventObjectPic_Man6_4), + obj_frame_tiles(gEventObjectPic_Man6_5), + obj_frame_tiles(gEventObjectPic_Man6_6), + obj_frame_tiles(gEventObjectPic_Man6_7), + obj_frame_tiles(gEventObjectPic_Man6_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ReporterM[] = { + obj_frame_tiles(gEventObjectPic_ReporterM_0), + obj_frame_tiles(gEventObjectPic_ReporterM_1), + obj_frame_tiles(gEventObjectPic_ReporterM_2), + obj_frame_tiles(gEventObjectPic_ReporterM_3), + obj_frame_tiles(gEventObjectPic_ReporterM_4), + obj_frame_tiles(gEventObjectPic_ReporterM_5), + obj_frame_tiles(gEventObjectPic_ReporterM_6), + obj_frame_tiles(gEventObjectPic_ReporterM_7), + obj_frame_tiles(gEventObjectPic_ReporterM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ReporterF[] = { + obj_frame_tiles(gEventObjectPic_ReporterF_0), + obj_frame_tiles(gEventObjectPic_ReporterF_1), + obj_frame_tiles(gEventObjectPic_ReporterF_2), + obj_frame_tiles(gEventObjectPic_ReporterF_3), + obj_frame_tiles(gEventObjectPic_ReporterF_4), + obj_frame_tiles(gEventObjectPic_ReporterF_5), + obj_frame_tiles(gEventObjectPic_ReporterF_6), + obj_frame_tiles(gEventObjectPic_ReporterF_7), + obj_frame_tiles(gEventObjectPic_ReporterF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MauvilleOldMan1[] = { + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_0), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_1), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_2), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_3), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_4), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_5), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_6), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_7), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan1_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MauvilleOldMan2[] = { + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_0), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_1), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_2), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_3), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_4), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_5), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_6), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_7), + obj_frame_tiles(gEventObjectPic_MauvilleOldMan2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnusedNatuDoll[] = { + obj_frame_tiles(gEventObjectPic_UnusedNatuDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnusedMagnemiteDoll[] = { + obj_frame_tiles(gEventObjectPic_UnusedMagnemiteDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnusedSquirtleDoll[] = { + obj_frame_tiles(gEventObjectPic_UnusedSquirtleDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnusedWooperDoll[] = { + obj_frame_tiles(gEventObjectPic_UnusedWooperDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnusedPikachuDoll[] = { + obj_frame_tiles(gEventObjectPic_UnusedPikachuDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnusedPorygon2Doll[] = { + obj_frame_tiles(gEventObjectPic_UnusedPorygon2Doll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_CuttableTree[] = { + obj_frame_tiles(gEventObjectPic_CuttableTree_0), + obj_frame_tiles(gEventObjectPic_CuttableTree_1), + obj_frame_tiles(gEventObjectPic_CuttableTree_2), + obj_frame_tiles(gEventObjectPic_CuttableTree_3), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MartEmployee[] = { + obj_frame_tiles(gEventObjectPic_MartEmployee_0), + obj_frame_tiles(gEventObjectPic_MartEmployee_1), + obj_frame_tiles(gEventObjectPic_MartEmployee_2), + obj_frame_tiles(gEventObjectPic_MartEmployee_3), + obj_frame_tiles(gEventObjectPic_MartEmployee_4), + obj_frame_tiles(gEventObjectPic_MartEmployee_5), + obj_frame_tiles(gEventObjectPic_MartEmployee_6), + obj_frame_tiles(gEventObjectPic_MartEmployee_7), + obj_frame_tiles(gEventObjectPic_MartEmployee_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RooftopSaleWoman[] = { + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_0), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_1), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_2), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_3), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_4), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_5), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_6), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_7), + obj_frame_tiles(gEventObjectPic_RooftopSaleWoman_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Teala[] = { + obj_frame_tiles(gEventObjectPic_Teala_0), + obj_frame_tiles(gEventObjectPic_Teala_1), + obj_frame_tiles(gEventObjectPic_Teala_2), + obj_frame_tiles(gEventObjectPic_Teala_3), + obj_frame_tiles(gEventObjectPic_Teala_4), + obj_frame_tiles(gEventObjectPic_Teala_5), + obj_frame_tiles(gEventObjectPic_Teala_6), + obj_frame_tiles(gEventObjectPic_Teala_7), + obj_frame_tiles(gEventObjectPic_Teala_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BreakableRock[] = { + obj_frame_tiles(gEventObjectPic_BreakableRock_0), + obj_frame_tiles(gEventObjectPic_BreakableRock_1), + obj_frame_tiles(gEventObjectPic_BreakableRock_2), + obj_frame_tiles(gEventObjectPic_BreakableRock_3), +}; + +const struct SpriteFrameImage gEventObjectPicTable_PushableBoulder[] = { + obj_frame_tiles(gEventObjectPic_PushableBoulder), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MrBrineysBoat[] = { + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_0), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_1), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_2), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_0), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_0), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_1), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_1), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_2), + obj_frame_tiles(gEventObjectPic_MrBrineysBoat_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Truck[] = { + obj_frame_tiles(gEventObjectPic_Truck), +}; + +const struct SpriteFrameImage gEventObjectPicTable_VigorothCarryingBox[] = { + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_0), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_0), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_0), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_1), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_2), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_1), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_2), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_1), + obj_frame_tiles(gEventObjectPic_VigorothCarryingBox_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_VigorothFacingAway[] = { + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_0), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_0), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_0), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1), + obj_frame_tiles(gEventObjectPic_VigorothFacingAway_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BirchsBag[] = { + obj_frame_tiles(gEventObjectPic_BirchsBag), +}; + +const struct SpriteFrameImage gEventObjectPicTable_EnemyZigzagoon[] = { + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_0), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_1), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_2), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_3), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_4), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_5), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_6), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_7), + obj_frame_tiles(gEventObjectPic_EnemyZigzagoon_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Poochyena[] = { + obj_frame_tiles(gEventObjectPic_Poochyena_0), + obj_frame_tiles(gEventObjectPic_Poochyena_1), + obj_frame_tiles(gEventObjectPic_Poochyena_2), + obj_frame_tiles(gEventObjectPic_Poochyena_3), + obj_frame_tiles(gEventObjectPic_Poochyena_4), + obj_frame_tiles(gEventObjectPic_Poochyena_5), + obj_frame_tiles(gEventObjectPic_Poochyena_6), + obj_frame_tiles(gEventObjectPic_Poochyena_7), + obj_frame_tiles(gEventObjectPic_Poochyena_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Artist[] = { + obj_frame_tiles(gEventObjectPic_Artist_0), + obj_frame_tiles(gEventObjectPic_Artist_1), + obj_frame_tiles(gEventObjectPic_Artist_2), + obj_frame_tiles(gEventObjectPic_Artist_3), + obj_frame_tiles(gEventObjectPic_Artist_4), + obj_frame_tiles(gEventObjectPic_Artist_5), + obj_frame_tiles(gEventObjectPic_Artist_6), + obj_frame_tiles(gEventObjectPic_Artist_7), + obj_frame_tiles(gEventObjectPic_Artist_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayNormal[] = { + obj_frame_tiles(gEventObjectPic_MayNormal_0), + obj_frame_tiles(gEventObjectPic_MayNormal_1), + obj_frame_tiles(gEventObjectPic_MayNormal_2), + obj_frame_tiles(gEventObjectPic_MayNormal_3), + obj_frame_tiles(gEventObjectPic_MayNormal_4), + obj_frame_tiles(gEventObjectPic_MayNormal_5), + obj_frame_tiles(gEventObjectPic_MayNormal_6), + obj_frame_tiles(gEventObjectPic_MayNormal_7), + obj_frame_tiles(gEventObjectPic_MayNormal_8), + obj_frame_tiles(gEventObjectPic_MayNormal_9), + obj_frame_tiles(gEventObjectPic_MayNormal_10), + obj_frame_tiles(gEventObjectPic_MayNormal_11), + obj_frame_tiles(gEventObjectPic_MayNormal_12), + obj_frame_tiles(gEventObjectPic_MayNormal_13), + obj_frame_tiles(gEventObjectPic_MayNormal_14), + obj_frame_tiles(gEventObjectPic_MayNormal_15), + obj_frame_tiles(gEventObjectPic_MayNormal_16), + obj_frame_tiles(gEventObjectPic_MayNormal_17), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayMachBike[] = { + obj_frame_tiles(gEventObjectPic_MayMachBike_0), + obj_frame_tiles(gEventObjectPic_MayMachBike_1), + obj_frame_tiles(gEventObjectPic_MayMachBike_2), + obj_frame_tiles(gEventObjectPic_MayMachBike_3), + obj_frame_tiles(gEventObjectPic_MayMachBike_4), + obj_frame_tiles(gEventObjectPic_MayMachBike_5), + obj_frame_tiles(gEventObjectPic_MayMachBike_6), + obj_frame_tiles(gEventObjectPic_MayMachBike_7), + obj_frame_tiles(gEventObjectPic_MayMachBike_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayAcroBike[] = { + obj_frame_tiles(gEventObjectPic_MayAcroBike_0), + obj_frame_tiles(gEventObjectPic_MayAcroBike_1), + obj_frame_tiles(gEventObjectPic_MayAcroBike_2), + obj_frame_tiles(gEventObjectPic_MayAcroBike_3), + obj_frame_tiles(gEventObjectPic_MayAcroBike_4), + obj_frame_tiles(gEventObjectPic_MayAcroBike_5), + obj_frame_tiles(gEventObjectPic_MayAcroBike_6), + obj_frame_tiles(gEventObjectPic_MayAcroBike_7), + obj_frame_tiles(gEventObjectPic_MayAcroBike_8), + obj_frame_tiles(gEventObjectPic_MayAcroBike_9), + obj_frame_tiles(gEventObjectPic_MayAcroBike_10), + obj_frame_tiles(gEventObjectPic_MayAcroBike_11), + obj_frame_tiles(gEventObjectPic_MayAcroBike_12), + obj_frame_tiles(gEventObjectPic_MayAcroBike_13), + obj_frame_tiles(gEventObjectPic_MayAcroBike_14), + obj_frame_tiles(gEventObjectPic_MayAcroBike_15), + obj_frame_tiles(gEventObjectPic_MayAcroBike_16), + obj_frame_tiles(gEventObjectPic_MayAcroBike_17), + obj_frame_tiles(gEventObjectPic_MayAcroBike_18), + obj_frame_tiles(gEventObjectPic_MayAcroBike_19), + obj_frame_tiles(gEventObjectPic_MayAcroBike_20), + obj_frame_tiles(gEventObjectPic_MayAcroBike_21), + obj_frame_tiles(gEventObjectPic_MayAcroBike_22), + obj_frame_tiles(gEventObjectPic_MayAcroBike_23), + obj_frame_tiles(gEventObjectPic_MayAcroBike_24), + obj_frame_tiles(gEventObjectPic_MayAcroBike_25), + obj_frame_tiles(gEventObjectPic_MayAcroBike_26), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MaySurfing[] = { + obj_frame_tiles(gEventObjectPic_MaySurfing_0), + obj_frame_tiles(gEventObjectPic_MaySurfing_1), + obj_frame_tiles(gEventObjectPic_MaySurfing_2), + obj_frame_tiles(gEventObjectPic_MaySurfing_0), + obj_frame_tiles(gEventObjectPic_MaySurfing_0), + obj_frame_tiles(gEventObjectPic_MaySurfing_1), + obj_frame_tiles(gEventObjectPic_MaySurfing_1), + obj_frame_tiles(gEventObjectPic_MaySurfing_2), + obj_frame_tiles(gEventObjectPic_MaySurfing_2), + obj_frame_tiles(gEventObjectPic_MaySurfing_3), + obj_frame_tiles(gEventObjectPic_MaySurfing_4), + obj_frame_tiles(gEventObjectPic_MaySurfing_5), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayUnderwater[] = { + obj_frame_tiles(gEventObjectPic_MayUnderwater_0), + obj_frame_tiles(gEventObjectPic_MayUnderwater_1), + obj_frame_tiles(gEventObjectPic_MayUnderwater_2), + obj_frame_tiles(gEventObjectPic_MayUnderwater_0), + obj_frame_tiles(gEventObjectPic_MayUnderwater_0), + obj_frame_tiles(gEventObjectPic_MayUnderwater_1), + obj_frame_tiles(gEventObjectPic_MayUnderwater_1), + obj_frame_tiles(gEventObjectPic_MayUnderwater_2), + obj_frame_tiles(gEventObjectPic_MayUnderwater_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayFieldMove[] = { + obj_frame_tiles(gEventObjectPic_MayFieldMove_0), + obj_frame_tiles(gEventObjectPic_MayFieldMove_1), + obj_frame_tiles(gEventObjectPic_MayFieldMove_2), + obj_frame_tiles(gEventObjectPic_MayFieldMove_3), + obj_frame_tiles(gEventObjectPic_MayFieldMove_4), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Cameraman[] = { + obj_frame_tiles(gEventObjectPic_Cameraman_0), + obj_frame_tiles(gEventObjectPic_Cameraman_1), + obj_frame_tiles(gEventObjectPic_Cameraman_2), + obj_frame_tiles(gEventObjectPic_Cameraman_3), + obj_frame_tiles(gEventObjectPic_Cameraman_4), + obj_frame_tiles(gEventObjectPic_Cameraman_5), + obj_frame_tiles(gEventObjectPic_Cameraman_6), + obj_frame_tiles(gEventObjectPic_Cameraman_7), + obj_frame_tiles(gEventObjectPic_Cameraman_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MovingBox[] = { + obj_frame_tiles(gEventObjectPic_MovingBox), +}; + +const struct SpriteFrameImage gEventObjectPicTable_CableCar[] = { + obj_frame_tiles(gEventObjectPic_CableCar), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Scientist2[] = { + obj_frame_tiles(gEventObjectPic_Scientist2_0), + obj_frame_tiles(gEventObjectPic_Scientist2_1), + obj_frame_tiles(gEventObjectPic_Scientist2_2), + obj_frame_tiles(gEventObjectPic_Scientist2_3), + obj_frame_tiles(gEventObjectPic_Scientist2_4), + obj_frame_tiles(gEventObjectPic_Scientist2_5), + obj_frame_tiles(gEventObjectPic_Scientist2_6), + obj_frame_tiles(gEventObjectPic_Scientist2_7), + obj_frame_tiles(gEventObjectPic_Scientist2_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Man7[] = { + obj_frame_tiles(gEventObjectPic_Man7_0), + obj_frame_tiles(gEventObjectPic_Man7_1), + obj_frame_tiles(gEventObjectPic_Man7_2), + obj_frame_tiles(gEventObjectPic_Man7_3), + obj_frame_tiles(gEventObjectPic_Man7_4), + obj_frame_tiles(gEventObjectPic_Man7_5), + obj_frame_tiles(gEventObjectPic_Man7_6), + obj_frame_tiles(gEventObjectPic_Man7_7), + obj_frame_tiles(gEventObjectPic_Man7_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_AquaMemberM[] = { + obj_frame_tiles(gEventObjectPic_AquaMemberM_0), + obj_frame_tiles(gEventObjectPic_AquaMemberM_1), + obj_frame_tiles(gEventObjectPic_AquaMemberM_2), + obj_frame_tiles(gEventObjectPic_AquaMemberM_3), + obj_frame_tiles(gEventObjectPic_AquaMemberM_4), + obj_frame_tiles(gEventObjectPic_AquaMemberM_5), + obj_frame_tiles(gEventObjectPic_AquaMemberM_6), + obj_frame_tiles(gEventObjectPic_AquaMemberM_7), + obj_frame_tiles(gEventObjectPic_AquaMemberM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_AquaMemberF[] = { + obj_frame_tiles(gEventObjectPic_AquaMemberF_0), + obj_frame_tiles(gEventObjectPic_AquaMemberF_1), + obj_frame_tiles(gEventObjectPic_AquaMemberF_2), + obj_frame_tiles(gEventObjectPic_AquaMemberF_3), + obj_frame_tiles(gEventObjectPic_AquaMemberF_4), + obj_frame_tiles(gEventObjectPic_AquaMemberF_5), + obj_frame_tiles(gEventObjectPic_AquaMemberF_6), + obj_frame_tiles(gEventObjectPic_AquaMemberF_7), + obj_frame_tiles(gEventObjectPic_AquaMemberF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MagmaMemberM[] = { + obj_frame_tiles(gEventObjectPic_MagmaMemberM_0), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_1), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_2), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_3), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_4), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_5), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_6), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_7), + obj_frame_tiles(gEventObjectPic_MagmaMemberM_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MagmaMemberF[] = { + obj_frame_tiles(gEventObjectPic_MagmaMemberF_0), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_1), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_2), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_3), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_4), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_5), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_6), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_7), + obj_frame_tiles(gEventObjectPic_MagmaMemberF_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Sidney[] = { + obj_frame_tiles(gEventObjectPic_Sidney_0), + obj_frame_tiles(gEventObjectPic_Sidney_1), + obj_frame_tiles(gEventObjectPic_Sidney_2), + obj_frame_tiles(gEventObjectPic_Sidney_0), + obj_frame_tiles(gEventObjectPic_Sidney_0), + obj_frame_tiles(gEventObjectPic_Sidney_1), + obj_frame_tiles(gEventObjectPic_Sidney_1), + obj_frame_tiles(gEventObjectPic_Sidney_2), + obj_frame_tiles(gEventObjectPic_Sidney_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Phoebe[] = { + obj_frame_tiles(gEventObjectPic_Phoebe_0), + obj_frame_tiles(gEventObjectPic_Phoebe_1), + obj_frame_tiles(gEventObjectPic_Phoebe_2), + obj_frame_tiles(gEventObjectPic_Phoebe_0), + obj_frame_tiles(gEventObjectPic_Phoebe_0), + obj_frame_tiles(gEventObjectPic_Phoebe_1), + obj_frame_tiles(gEventObjectPic_Phoebe_1), + obj_frame_tiles(gEventObjectPic_Phoebe_2), + obj_frame_tiles(gEventObjectPic_Phoebe_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Glacia[] = { + obj_frame_tiles(gEventObjectPic_Glacia_0), + obj_frame_tiles(gEventObjectPic_Glacia_1), + obj_frame_tiles(gEventObjectPic_Glacia_2), + obj_frame_tiles(gEventObjectPic_Glacia_0), + obj_frame_tiles(gEventObjectPic_Glacia_0), + obj_frame_tiles(gEventObjectPic_Glacia_1), + obj_frame_tiles(gEventObjectPic_Glacia_1), + obj_frame_tiles(gEventObjectPic_Glacia_2), + obj_frame_tiles(gEventObjectPic_Glacia_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Drake[] = { + obj_frame_tiles(gEventObjectPic_Drake_0), + obj_frame_tiles(gEventObjectPic_Drake_1), + obj_frame_tiles(gEventObjectPic_Drake_2), + obj_frame_tiles(gEventObjectPic_Drake_0), + obj_frame_tiles(gEventObjectPic_Drake_0), + obj_frame_tiles(gEventObjectPic_Drake_1), + obj_frame_tiles(gEventObjectPic_Drake_1), + obj_frame_tiles(gEventObjectPic_Drake_2), + obj_frame_tiles(gEventObjectPic_Drake_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Roxanne[] = { + obj_frame_tiles(gEventObjectPic_Roxanne_0), + obj_frame_tiles(gEventObjectPic_Roxanne_1), + obj_frame_tiles(gEventObjectPic_Roxanne_2), + obj_frame_tiles(gEventObjectPic_Roxanne_0), + obj_frame_tiles(gEventObjectPic_Roxanne_0), + obj_frame_tiles(gEventObjectPic_Roxanne_1), + obj_frame_tiles(gEventObjectPic_Roxanne_1), + obj_frame_tiles(gEventObjectPic_Roxanne_2), + obj_frame_tiles(gEventObjectPic_Roxanne_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Brawly[] = { + obj_frame_tiles(gEventObjectPic_Brawly_0), + obj_frame_tiles(gEventObjectPic_Brawly_1), + obj_frame_tiles(gEventObjectPic_Brawly_2), + obj_frame_tiles(gEventObjectPic_Brawly_0), + obj_frame_tiles(gEventObjectPic_Brawly_0), + obj_frame_tiles(gEventObjectPic_Brawly_1), + obj_frame_tiles(gEventObjectPic_Brawly_1), + obj_frame_tiles(gEventObjectPic_Brawly_2), + obj_frame_tiles(gEventObjectPic_Brawly_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Wattson[] = { + obj_frame_tiles(gEventObjectPic_Wattson_0), + obj_frame_tiles(gEventObjectPic_Wattson_1), + obj_frame_tiles(gEventObjectPic_Wattson_2), + obj_frame_tiles(gEventObjectPic_Wattson_0), + obj_frame_tiles(gEventObjectPic_Wattson_0), + obj_frame_tiles(gEventObjectPic_Wattson_1), + obj_frame_tiles(gEventObjectPic_Wattson_1), + obj_frame_tiles(gEventObjectPic_Wattson_2), + obj_frame_tiles(gEventObjectPic_Wattson_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Flannery[] = { + obj_frame_tiles(gEventObjectPic_Flannery_0), + obj_frame_tiles(gEventObjectPic_Flannery_1), + obj_frame_tiles(gEventObjectPic_Flannery_2), + obj_frame_tiles(gEventObjectPic_Flannery_0), + obj_frame_tiles(gEventObjectPic_Flannery_0), + obj_frame_tiles(gEventObjectPic_Flannery_1), + obj_frame_tiles(gEventObjectPic_Flannery_1), + obj_frame_tiles(gEventObjectPic_Flannery_2), + obj_frame_tiles(gEventObjectPic_Flannery_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Norman[] = { + obj_frame_tiles(gEventObjectPic_Norman_0), + obj_frame_tiles(gEventObjectPic_Norman_1), + obj_frame_tiles(gEventObjectPic_Norman_2), + obj_frame_tiles(gEventObjectPic_Norman_3), + obj_frame_tiles(gEventObjectPic_Norman_4), + obj_frame_tiles(gEventObjectPic_Norman_5), + obj_frame_tiles(gEventObjectPic_Norman_6), + obj_frame_tiles(gEventObjectPic_Norman_7), + obj_frame_tiles(gEventObjectPic_Norman_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Winona[] = { + obj_frame_tiles(gEventObjectPic_Winona_0), + obj_frame_tiles(gEventObjectPic_Winona_1), + obj_frame_tiles(gEventObjectPic_Winona_2), + obj_frame_tiles(gEventObjectPic_Winona_0), + obj_frame_tiles(gEventObjectPic_Winona_0), + obj_frame_tiles(gEventObjectPic_Winona_1), + obj_frame_tiles(gEventObjectPic_Winona_1), + obj_frame_tiles(gEventObjectPic_Winona_2), + obj_frame_tiles(gEventObjectPic_Winona_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Liza[] = { + obj_frame_tiles(gEventObjectPic_Liza_0), + obj_frame_tiles(gEventObjectPic_Liza_1), + obj_frame_tiles(gEventObjectPic_Liza_2), + obj_frame_tiles(gEventObjectPic_Liza_0), + obj_frame_tiles(gEventObjectPic_Liza_0), + obj_frame_tiles(gEventObjectPic_Liza_1), + obj_frame_tiles(gEventObjectPic_Liza_1), + obj_frame_tiles(gEventObjectPic_Liza_2), + obj_frame_tiles(gEventObjectPic_Liza_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Tate[] = { + obj_frame_tiles(gEventObjectPic_Tate_0), + obj_frame_tiles(gEventObjectPic_Tate_1), + obj_frame_tiles(gEventObjectPic_Tate_2), + obj_frame_tiles(gEventObjectPic_Tate_0), + obj_frame_tiles(gEventObjectPic_Tate_0), + obj_frame_tiles(gEventObjectPic_Tate_1), + obj_frame_tiles(gEventObjectPic_Tate_1), + obj_frame_tiles(gEventObjectPic_Tate_2), + obj_frame_tiles(gEventObjectPic_Tate_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Wallace[] = { + obj_frame_tiles(gEventObjectPic_Wallace_0), + obj_frame_tiles(gEventObjectPic_Wallace_1), + obj_frame_tiles(gEventObjectPic_Wallace_2), + obj_frame_tiles(gEventObjectPic_Wallace_3), + obj_frame_tiles(gEventObjectPic_Wallace_4), + obj_frame_tiles(gEventObjectPic_Wallace_5), + obj_frame_tiles(gEventObjectPic_Wallace_6), + obj_frame_tiles(gEventObjectPic_Wallace_7), + obj_frame_tiles(gEventObjectPic_Wallace_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Steven[] = { + obj_frame_tiles(gEventObjectPic_Steven_0), + obj_frame_tiles(gEventObjectPic_Steven_1), + obj_frame_tiles(gEventObjectPic_Steven_2), + obj_frame_tiles(gEventObjectPic_Steven_3), + obj_frame_tiles(gEventObjectPic_Steven_4), + obj_frame_tiles(gEventObjectPic_Steven_5), + obj_frame_tiles(gEventObjectPic_Steven_6), + obj_frame_tiles(gEventObjectPic_Steven_7), + obj_frame_tiles(gEventObjectPic_Steven_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Wally[] = { + obj_frame_tiles(gEventObjectPic_Wally_0), + obj_frame_tiles(gEventObjectPic_Wally_1), + obj_frame_tiles(gEventObjectPic_Wally_2), + obj_frame_tiles(gEventObjectPic_Wally_3), + obj_frame_tiles(gEventObjectPic_Wally_4), + obj_frame_tiles(gEventObjectPic_Wally_5), + obj_frame_tiles(gEventObjectPic_Wally_6), + obj_frame_tiles(gEventObjectPic_Wally_7), + obj_frame_tiles(gEventObjectPic_Wally_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RubySapphireLittleBoy[] = { + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_0), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_1), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_2), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_3), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_4), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_5), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_6), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_7), + obj_frame_tiles(gEventObjectPic_RubySapphireLittleBoy_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanFishing[] = { + obj_frame_tiles(gEventObjectPic_BrendanFishing_0), + obj_frame_tiles(gEventObjectPic_BrendanFishing_1), + obj_frame_tiles(gEventObjectPic_BrendanFishing_2), + obj_frame_tiles(gEventObjectPic_BrendanFishing_3), + obj_frame_tiles(gEventObjectPic_BrendanFishing_4), + obj_frame_tiles(gEventObjectPic_BrendanFishing_5), + obj_frame_tiles(gEventObjectPic_BrendanFishing_6), + obj_frame_tiles(gEventObjectPic_BrendanFishing_7), + obj_frame_tiles(gEventObjectPic_BrendanFishing_8), + obj_frame_tiles(gEventObjectPic_BrendanFishing_9), + obj_frame_tiles(gEventObjectPic_BrendanFishing_10), + obj_frame_tiles(gEventObjectPic_BrendanFishing_11), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayFishing[] = { + obj_frame_tiles(gEventObjectPic_MayFishing_0), + obj_frame_tiles(gEventObjectPic_MayFishing_1), + obj_frame_tiles(gEventObjectPic_MayFishing_2), + obj_frame_tiles(gEventObjectPic_MayFishing_3), + obj_frame_tiles(gEventObjectPic_MayFishing_4), + obj_frame_tiles(gEventObjectPic_MayFishing_5), + obj_frame_tiles(gEventObjectPic_MayFishing_6), + obj_frame_tiles(gEventObjectPic_MayFishing_7), + obj_frame_tiles(gEventObjectPic_MayFishing_8), + obj_frame_tiles(gEventObjectPic_MayFishing_9), + obj_frame_tiles(gEventObjectPic_MayFishing_10), + obj_frame_tiles(gEventObjectPic_MayFishing_11), +}; + +const struct SpriteFrameImage gEventObjectPicTable_HotSpringsOldWoman[] = { + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_0), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_1), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_2), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_3), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_4), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_5), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_6), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_7), + obj_frame_tiles(gEventObjectPic_HotSpringsOldWoman_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SSTidal[] = { + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), + obj_frame_tiles(gEventObjectPic_SSTidal), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SubmarineShadow[] = { + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), + obj_frame_tiles(gEventObjectPic_SubmarineShadow), +}; + +const struct SpriteFrameImage gEventObjectPicTable_PichuDoll[] = { + obj_frame_tiles(gEventObjectPic_PichuDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_PikachuDoll[] = { + obj_frame_tiles(gEventObjectPic_PikachuDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MarillDoll[] = { + obj_frame_tiles(gEventObjectPic_MarillDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TogepiDoll[] = { + obj_frame_tiles(gEventObjectPic_TogepiDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_CyndaquilDoll[] = { + obj_frame_tiles(gEventObjectPic_CyndaquilDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ChikoritaDoll[] = { + obj_frame_tiles(gEventObjectPic_ChikoritaDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TotodileDoll[] = { + obj_frame_tiles(gEventObjectPic_TotodileDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_JigglypuffDoll[] = { + obj_frame_tiles(gEventObjectPic_JigglypuffDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MeowthDoll[] = { + obj_frame_tiles(gEventObjectPic_MeowthDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ClefairyDoll[] = { + obj_frame_tiles(gEventObjectPic_ClefairyDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_DittoDoll[] = { + obj_frame_tiles(gEventObjectPic_DittoDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SmoochumDoll[] = { + obj_frame_tiles(gEventObjectPic_SmoochumDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TreeckoDoll[] = { + obj_frame_tiles(gEventObjectPic_TreeckoDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TorchicDoll[] = { + obj_frame_tiles(gEventObjectPic_TorchicDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MudkipDoll[] = { + obj_frame_tiles(gEventObjectPic_MudkipDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_DuskullDoll[] = { + obj_frame_tiles(gEventObjectPic_DuskullDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_WynautDoll[] = { + obj_frame_tiles(gEventObjectPic_WynautDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BaltoyDoll[] = { + obj_frame_tiles(gEventObjectPic_BaltoyDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_KecleonDoll[] = { + obj_frame_tiles(gEventObjectPic_KecleonDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_AzurillDoll[] = { + obj_frame_tiles(gEventObjectPic_AzurillDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SkittyDoll[] = { + obj_frame_tiles(gEventObjectPic_SkittyDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SwabluDoll[] = { + obj_frame_tiles(gEventObjectPic_SwabluDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_GulpinDoll[] = { + obj_frame_tiles(gEventObjectPic_GulpinDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_LotadDoll[] = { + obj_frame_tiles(gEventObjectPic_LotadDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SeedotDoll[] = { + obj_frame_tiles(gEventObjectPic_SeedotDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_PikaCushion[] = { + obj_frame_tiles(gEventObjectPic_PikaCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RoundCushion[] = { + obj_frame_tiles(gEventObjectPic_RoundCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_KissCushion[] = { + obj_frame_tiles(gEventObjectPic_KissCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ZigzagCushion[] = { + obj_frame_tiles(gEventObjectPic_ZigzagCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_SpinCushion[] = { + obj_frame_tiles(gEventObjectPic_SpinCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_DiamondCushion[] = { + obj_frame_tiles(gEventObjectPic_DiamondCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BallCushion[] = { + obj_frame_tiles(gEventObjectPic_BallCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_GrassCushion[] = { + obj_frame_tiles(gEventObjectPic_GrassCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_FireCushion[] = { + obj_frame_tiles(gEventObjectPic_FireCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_WaterCushion[] = { + obj_frame_tiles(gEventObjectPic_WaterCushion), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigSnorlaxDoll[] = { + obj_frame_tiles(gEventObjectPic_BigSnorlaxDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigRhydonDoll[] = { + obj_frame_tiles(gEventObjectPic_BigRhydonDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigLaprasDoll[] = { + obj_frame_tiles(gEventObjectPic_BigLaprasDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigVenusaurDoll[] = { + obj_frame_tiles(gEventObjectPic_BigVenusaurDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigCharizardDoll[] = { + obj_frame_tiles(gEventObjectPic_BigCharizardDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigBlastoiseDoll[] = { + obj_frame_tiles(gEventObjectPic_BigBlastoiseDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigWailmerDoll[] = { + obj_frame_tiles(gEventObjectPic_BigWailmerDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigRegirockDoll[] = { + obj_frame_tiles(gEventObjectPic_BigRegirockDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigRegiceDoll[] = { + obj_frame_tiles(gEventObjectPic_BigRegiceDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BigRegisteelDoll[] = { + obj_frame_tiles(gEventObjectPic_BigRegisteelDoll), +}; + +const struct SpriteFrameImage gEventObjectPicTable_LatiasLatios[] = { + obj_frame_tiles(gEventObjectPic_LatiasLatios_0), + obj_frame_tiles(gEventObjectPic_LatiasLatios_0), + obj_frame_tiles(gEventObjectPic_LatiasLatios_0), + obj_frame_tiles(gEventObjectPic_LatiasLatios_1), + obj_frame_tiles(gEventObjectPic_LatiasLatios_2), + obj_frame_tiles(gEventObjectPic_LatiasLatios_1), + obj_frame_tiles(gEventObjectPic_LatiasLatios_2), + obj_frame_tiles(gEventObjectPic_LatiasLatios_1), + obj_frame_tiles(gEventObjectPic_LatiasLatios_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Boy5[] = { + obj_frame_tiles(gEventObjectPic_Boy5_0), + obj_frame_tiles(gEventObjectPic_Boy5_1), + obj_frame_tiles(gEventObjectPic_Boy5_2), + obj_frame_tiles(gEventObjectPic_Boy5_0), + obj_frame_tiles(gEventObjectPic_Boy5_0), + obj_frame_tiles(gEventObjectPic_Boy5_1), + obj_frame_tiles(gEventObjectPic_Boy5_1), + obj_frame_tiles(gEventObjectPic_Boy5_2), + obj_frame_tiles(gEventObjectPic_Boy5_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_ContestOldMan[] = { + obj_frame_tiles(gEventObjectPic_ContestOldMan_0), + obj_frame_tiles(gEventObjectPic_ContestOldMan_1), + obj_frame_tiles(gEventObjectPic_ContestOldMan_2), + obj_frame_tiles(gEventObjectPic_ContestOldMan_3), + obj_frame_tiles(gEventObjectPic_ContestOldMan_4), + obj_frame_tiles(gEventObjectPic_ContestOldMan_5), + obj_frame_tiles(gEventObjectPic_ContestOldMan_6), + obj_frame_tiles(gEventObjectPic_ContestOldMan_7), + obj_frame_tiles(gEventObjectPic_ContestOldMan_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanWatering[] = { + obj_frame_tiles(gEventObjectPic_BrendanWatering_0), + obj_frame_tiles(gEventObjectPic_BrendanWatering_1), + obj_frame_tiles(gEventObjectPic_BrendanWatering_2), + obj_frame_tiles(gEventObjectPic_BrendanWatering_3), + obj_frame_tiles(gEventObjectPic_BrendanWatering_3), + obj_frame_tiles(gEventObjectPic_BrendanWatering_4), + obj_frame_tiles(gEventObjectPic_BrendanWatering_4), + obj_frame_tiles(gEventObjectPic_BrendanWatering_5), + obj_frame_tiles(gEventObjectPic_BrendanWatering_5), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayWatering[] = { + obj_frame_tiles(gEventObjectPic_MayWatering_0), + obj_frame_tiles(gEventObjectPic_MayWatering_1), + obj_frame_tiles(gEventObjectPic_MayWatering_2), + obj_frame_tiles(gEventObjectPic_MayWatering_3), + obj_frame_tiles(gEventObjectPic_MayWatering_3), + obj_frame_tiles(gEventObjectPic_MayWatering_4), + obj_frame_tiles(gEventObjectPic_MayWatering_4), + obj_frame_tiles(gEventObjectPic_MayWatering_5), + obj_frame_tiles(gEventObjectPic_MayWatering_5), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BrendanDecorating[] = { + obj_frame_tiles(gEventObjectPic_BrendanDecorating), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MayDecorating[] = { + obj_frame_tiles(gEventObjectPic_MayDecorating), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Archie[] = { + obj_frame_tiles(gEventObjectPic_Archie_0), + obj_frame_tiles(gEventObjectPic_Archie_1), + obj_frame_tiles(gEventObjectPic_Archie_2), + obj_frame_tiles(gEventObjectPic_Archie_3), + obj_frame_tiles(gEventObjectPic_Archie_4), + obj_frame_tiles(gEventObjectPic_Archie_5), + obj_frame_tiles(gEventObjectPic_Archie_6), + obj_frame_tiles(gEventObjectPic_Archie_7), + obj_frame_tiles(gEventObjectPic_Archie_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Maxie[] = { + obj_frame_tiles(gEventObjectPic_Maxie_0), + obj_frame_tiles(gEventObjectPic_Maxie_1), + obj_frame_tiles(gEventObjectPic_Maxie_2), + obj_frame_tiles(gEventObjectPic_Maxie_3), + obj_frame_tiles(gEventObjectPic_Maxie_4), + obj_frame_tiles(gEventObjectPic_Maxie_5), + obj_frame_tiles(gEventObjectPic_Maxie_6), + obj_frame_tiles(gEventObjectPic_Maxie_7), + obj_frame_tiles(gEventObjectPic_Maxie_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_KyogreFront[] = { + obj_frame_tiles(gEventObjectPic_KyogreFront_0), + obj_frame_tiles(gEventObjectPic_KyogreFront_0), + obj_frame_tiles(gEventObjectPic_KyogreFront_0), + obj_frame_tiles(gEventObjectPic_KyogreFront_1), + obj_frame_tiles(gEventObjectPic_KyogreFront_1), + obj_frame_tiles(gEventObjectPic_KyogreFront_1), + obj_frame_tiles(gEventObjectPic_KyogreFront_1), + obj_frame_tiles(gEventObjectPic_KyogreFront_1), + obj_frame_tiles(gEventObjectPic_KyogreFront_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_GroudonFront[] = { + obj_frame_tiles(gEventObjectPic_GroudonFront_0), + obj_frame_tiles(gEventObjectPic_GroudonFront_0), + obj_frame_tiles(gEventObjectPic_GroudonFront_0), + obj_frame_tiles(gEventObjectPic_GroudonFront_1), + obj_frame_tiles(gEventObjectPic_GroudonFront_1), + obj_frame_tiles(gEventObjectPic_GroudonFront_1), + obj_frame_tiles(gEventObjectPic_GroudonFront_1), + obj_frame_tiles(gEventObjectPic_GroudonFront_1), + obj_frame_tiles(gEventObjectPic_GroudonFront_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_KyogreSide[] = { + obj_frame_tiles(gEventObjectPic_KyogreSide_0), + obj_frame_tiles(gEventObjectPic_KyogreSide_0), + obj_frame_tiles(gEventObjectPic_KyogreSide_0), + obj_frame_tiles(gEventObjectPic_KyogreSide_1), + obj_frame_tiles(gEventObjectPic_KyogreSide_1), + obj_frame_tiles(gEventObjectPic_KyogreSide_1), + obj_frame_tiles(gEventObjectPic_KyogreSide_1), + obj_frame_tiles(gEventObjectPic_KyogreSide_1), + obj_frame_tiles(gEventObjectPic_KyogreSide_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_GroudonSide[] = { + obj_frame_tiles(gEventObjectPic_GroudonSide_0), + obj_frame_tiles(gEventObjectPic_GroudonSide_0), + obj_frame_tiles(gEventObjectPic_GroudonSide_0), + obj_frame_tiles(gEventObjectPic_GroudonSide_1), + obj_frame_tiles(gEventObjectPic_GroudonSide_1), + obj_frame_tiles(gEventObjectPic_GroudonSide_1), + obj_frame_tiles(gEventObjectPic_GroudonSide_1), + obj_frame_tiles(gEventObjectPic_GroudonSide_1), + obj_frame_tiles(gEventObjectPic_GroudonSide_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Fossil[] = { + obj_frame_tiles(gEventObjectPic_Fossil), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Regi[] = { + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), + obj_frame_tiles(gEventObjectPic_Regi), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Skitty[] = { + obj_frame_tiles(gEventObjectPic_Skitty_0), + obj_frame_tiles(gEventObjectPic_Skitty_1), + obj_frame_tiles(gEventObjectPic_Skitty_2), + obj_frame_tiles(gEventObjectPic_Skitty_0), + obj_frame_tiles(gEventObjectPic_Skitty_0), + obj_frame_tiles(gEventObjectPic_Skitty_1), + obj_frame_tiles(gEventObjectPic_Skitty_1), + obj_frame_tiles(gEventObjectPic_Skitty_2), + obj_frame_tiles(gEventObjectPic_Skitty_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Kecleon[] = { + obj_frame_tiles(gEventObjectPic_Kecleon_0), + obj_frame_tiles(gEventObjectPic_Kecleon_1), + obj_frame_tiles(gEventObjectPic_Kecleon_2), + obj_frame_tiles(gEventObjectPic_Kecleon_0), + obj_frame_tiles(gEventObjectPic_Kecleon_0), + obj_frame_tiles(gEventObjectPic_Kecleon_1), + obj_frame_tiles(gEventObjectPic_Kecleon_1), + obj_frame_tiles(gEventObjectPic_Kecleon_2), + obj_frame_tiles(gEventObjectPic_Kecleon_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Rayquaza[] = { + obj_frame_tiles(gEventObjectPic_Rayquaza_0), + obj_frame_tiles(gEventObjectPic_Rayquaza_1), + obj_frame_tiles(gEventObjectPic_Rayquaza_2), + obj_frame_tiles(gEventObjectPic_Rayquaza_3), + obj_frame_tiles(gEventObjectPic_Rayquaza_4), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RayquazaStill[] = { + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), + obj_frame_tiles(gEventObjectPic_RayquazaStill), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Zigzagoon[] = { + obj_frame_tiles(gEventObjectPic_Zigzagoon_0), + obj_frame_tiles(gEventObjectPic_Zigzagoon_1), + obj_frame_tiles(gEventObjectPic_Zigzagoon_2), + obj_frame_tiles(gEventObjectPic_Zigzagoon_0), + obj_frame_tiles(gEventObjectPic_Zigzagoon_0), + obj_frame_tiles(gEventObjectPic_Zigzagoon_1), + obj_frame_tiles(gEventObjectPic_Zigzagoon_1), + obj_frame_tiles(gEventObjectPic_Zigzagoon_2), + obj_frame_tiles(gEventObjectPic_Zigzagoon_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Pikachu[] = { + obj_frame_tiles(gEventObjectPic_Pikachu_0), + obj_frame_tiles(gEventObjectPic_Pikachu_1), + obj_frame_tiles(gEventObjectPic_Pikachu_2), + obj_frame_tiles(gEventObjectPic_Pikachu_0), + obj_frame_tiles(gEventObjectPic_Pikachu_0), + obj_frame_tiles(gEventObjectPic_Pikachu_1), + obj_frame_tiles(gEventObjectPic_Pikachu_1), + obj_frame_tiles(gEventObjectPic_Pikachu_2), + obj_frame_tiles(gEventObjectPic_Pikachu_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Azumarill[] = { + obj_frame_tiles(gEventObjectPic_Azumarill_0), + obj_frame_tiles(gEventObjectPic_Azumarill_1), + obj_frame_tiles(gEventObjectPic_Azumarill_2), + obj_frame_tiles(gEventObjectPic_Azumarill_0), + obj_frame_tiles(gEventObjectPic_Azumarill_0), + obj_frame_tiles(gEventObjectPic_Azumarill_1), + obj_frame_tiles(gEventObjectPic_Azumarill_1), + obj_frame_tiles(gEventObjectPic_Azumarill_2), + obj_frame_tiles(gEventObjectPic_Azumarill_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Wingull[] = { + obj_frame_tiles(gEventObjectPic_Wingull_0), + obj_frame_tiles(gEventObjectPic_Wingull_1), + obj_frame_tiles(gEventObjectPic_Wingull_2), + obj_frame_tiles(gEventObjectPic_Wingull_3), + obj_frame_tiles(gEventObjectPic_Wingull_3), + obj_frame_tiles(gEventObjectPic_Wingull_4), + obj_frame_tiles(gEventObjectPic_Wingull_4), + obj_frame_tiles(gEventObjectPic_Wingull_5), + obj_frame_tiles(gEventObjectPic_Wingull_5), +}; + +const struct SpriteFrameImage gEventObjectPicTable_TuberMSwimming[] = { + obj_frame_tiles(gEventObjectPic_TuberMSwimming_0), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_1), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_2), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_3), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_4), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_5), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_6), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_7), + obj_frame_tiles(gEventObjectPic_TuberMSwimming_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Azurill[] = { + obj_frame_tiles(gEventObjectPic_Azurill_0), + obj_frame_tiles(gEventObjectPic_Azurill_1), + obj_frame_tiles(gEventObjectPic_Azurill_2), + obj_frame_tiles(gEventObjectPic_Azurill_0), + obj_frame_tiles(gEventObjectPic_Azurill_0), + obj_frame_tiles(gEventObjectPic_Azurill_1), + obj_frame_tiles(gEventObjectPic_Azurill_1), + obj_frame_tiles(gEventObjectPic_Azurill_2), + obj_frame_tiles(gEventObjectPic_Azurill_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Mom[] = { + obj_frame_tiles(gEventObjectPic_Mom_0), + obj_frame_tiles(gEventObjectPic_Mom_1), + obj_frame_tiles(gEventObjectPic_Mom_2), + obj_frame_tiles(gEventObjectPic_Mom_3), + obj_frame_tiles(gEventObjectPic_Mom_4), + obj_frame_tiles(gEventObjectPic_Mom_5), + obj_frame_tiles(gEventObjectPic_Mom_6), + obj_frame_tiles(gEventObjectPic_Mom_7), + obj_frame_tiles(gEventObjectPic_Mom_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Scott[] = { + obj_frame_tiles(gEventObjectPic_Scott_0), + obj_frame_tiles(gEventObjectPic_Scott_1), + obj_frame_tiles(gEventObjectPic_Scott_2), + obj_frame_tiles(gEventObjectPic_Scott_3), + obj_frame_tiles(gEventObjectPic_Scott_4), + obj_frame_tiles(gEventObjectPic_Scott_5), + obj_frame_tiles(gEventObjectPic_Scott_6), + obj_frame_tiles(gEventObjectPic_Scott_7), + obj_frame_tiles(gEventObjectPic_Scott_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Juan[] = { + obj_frame_tiles(gEventObjectPic_Juan_0), + obj_frame_tiles(gEventObjectPic_Juan_1), + obj_frame_tiles(gEventObjectPic_Juan_2), + obj_frame_tiles(gEventObjectPic_Juan_3), + obj_frame_tiles(gEventObjectPic_Juan_4), + obj_frame_tiles(gEventObjectPic_Juan_5), + obj_frame_tiles(gEventObjectPic_Juan_6), + obj_frame_tiles(gEventObjectPic_Juan_7), + obj_frame_tiles(gEventObjectPic_Juan_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_MysteryEventDeliveryman[] = { + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_0), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_1), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_2), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_0), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_0), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_1), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_1), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_2), + obj_frame_tiles(gEventObjectPic_MysteryEventDeliveryman_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Statue[] = { + obj_frame_tiles(gEventObjectPic_Statue), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Dusclops[] = { + obj_frame_tiles(gEventObjectPic_Dusclops_0), + obj_frame_tiles(gEventObjectPic_Dusclops_1), + obj_frame_tiles(gEventObjectPic_Dusclops_2), + obj_frame_tiles(gEventObjectPic_Dusclops_3), + obj_frame_tiles(gEventObjectPic_Dusclops_4), + obj_frame_tiles(gEventObjectPic_Dusclops_5), + obj_frame_tiles(gEventObjectPic_Dusclops_6), + obj_frame_tiles(gEventObjectPic_Dusclops_7), + obj_frame_tiles(gEventObjectPic_Dusclops_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Kirlia[] = { + obj_frame_tiles(gEventObjectPic_Kirlia_0), + obj_frame_tiles(gEventObjectPic_Kirlia_1), + obj_frame_tiles(gEventObjectPic_Kirlia_2), + obj_frame_tiles(gEventObjectPic_Kirlia_3), + obj_frame_tiles(gEventObjectPic_Kirlia_4), + obj_frame_tiles(gEventObjectPic_Kirlia_5), + obj_frame_tiles(gEventObjectPic_Kirlia_6), + obj_frame_tiles(gEventObjectPic_Kirlia_7), + obj_frame_tiles(gEventObjectPic_Kirlia_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_UnionRoomAttendant[] = { + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_0), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_1), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_2), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_0), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_0), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_1), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_1), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_2), + obj_frame_tiles(gEventObjectPic_UnionRoomAttendant_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Sudowoodo[] = { + obj_frame_tiles(gEventObjectPic_Sudowoodo_0), + obj_frame_tiles(gEventObjectPic_Sudowoodo_0), + obj_frame_tiles(gEventObjectPic_Sudowoodo_1), + obj_frame_tiles(gEventObjectPic_Sudowoodo_0), + obj_frame_tiles(gEventObjectPic_Sudowoodo_0), + obj_frame_tiles(gEventObjectPic_Sudowoodo_0), + obj_frame_tiles(gEventObjectPic_Sudowoodo_0), + obj_frame_tiles(gEventObjectPic_Sudowoodo_1), + obj_frame_tiles(gEventObjectPic_Sudowoodo_2), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Mew[] = { + obj_frame_tiles(gEventObjectPic_Mew_0), + obj_frame_tiles(gEventObjectPic_Mew_1), + obj_frame_tiles(gEventObjectPic_Mew_2), + obj_frame_tiles(gEventObjectPic_Mew_3), + obj_frame_tiles(gEventObjectPic_Mew_4), + obj_frame_tiles(gEventObjectPic_Mew_5), + obj_frame_tiles(gEventObjectPic_Mew_6), + obj_frame_tiles(gEventObjectPic_Mew_7), + obj_frame_tiles(gEventObjectPic_Mew_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Red[] = { + obj_frame_tiles(gEventObjectPic_Red_0), + obj_frame_tiles(gEventObjectPic_Red_1), + obj_frame_tiles(gEventObjectPic_Red_2), + obj_frame_tiles(gEventObjectPic_Red_3), + obj_frame_tiles(gEventObjectPic_Red_4), + obj_frame_tiles(gEventObjectPic_Red_5), + obj_frame_tiles(gEventObjectPic_Red_6), + obj_frame_tiles(gEventObjectPic_Red_7), + obj_frame_tiles(gEventObjectPic_Red_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Leaf[] = { + obj_frame_tiles(gEventObjectPic_Leaf_0), + obj_frame_tiles(gEventObjectPic_Leaf_1), + obj_frame_tiles(gEventObjectPic_Leaf_2), + obj_frame_tiles(gEventObjectPic_Leaf_3), + obj_frame_tiles(gEventObjectPic_Leaf_4), + obj_frame_tiles(gEventObjectPic_Leaf_5), + obj_frame_tiles(gEventObjectPic_Leaf_6), + obj_frame_tiles(gEventObjectPic_Leaf_7), + obj_frame_tiles(gEventObjectPic_Leaf_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Deoxys[] = { + obj_frame_tiles(gEventObjectPic_Deoxys_0), + obj_frame_tiles(gEventObjectPic_Deoxys_0), + obj_frame_tiles(gEventObjectPic_Deoxys_0), + obj_frame_tiles(gEventObjectPic_Deoxys_0), + obj_frame_tiles(gEventObjectPic_Deoxys_1), + obj_frame_tiles(gEventObjectPic_Deoxys_0), + obj_frame_tiles(gEventObjectPic_Deoxys_1), + obj_frame_tiles(gEventObjectPic_Deoxys_0), + obj_frame_tiles(gEventObjectPic_Deoxys_0), +}; + +const struct SpriteFrameImage gEventObjectPicTable_BirthIslandStone[] = { + obj_frame_tiles(gEventObjectPic_BirthIslandStone), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Anabel[] = { + obj_frame_tiles(gEventObjectPic_Anabel_0), + obj_frame_tiles(gEventObjectPic_Anabel_1), + obj_frame_tiles(gEventObjectPic_Anabel_2), + obj_frame_tiles(gEventObjectPic_Anabel_3), + obj_frame_tiles(gEventObjectPic_Anabel_4), + obj_frame_tiles(gEventObjectPic_Anabel_5), + obj_frame_tiles(gEventObjectPic_Anabel_6), + obj_frame_tiles(gEventObjectPic_Anabel_7), + obj_frame_tiles(gEventObjectPic_Anabel_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Tucker[] = { + obj_frame_tiles(gEventObjectPic_Tucker_0), + obj_frame_tiles(gEventObjectPic_Tucker_1), + obj_frame_tiles(gEventObjectPic_Tucker_2), + obj_frame_tiles(gEventObjectPic_Tucker_3), + obj_frame_tiles(gEventObjectPic_Tucker_4), + obj_frame_tiles(gEventObjectPic_Tucker_5), + obj_frame_tiles(gEventObjectPic_Tucker_6), + obj_frame_tiles(gEventObjectPic_Tucker_7), + obj_frame_tiles(gEventObjectPic_Tucker_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Spenser[] = { + obj_frame_tiles(gEventObjectPic_Spenser_0), + obj_frame_tiles(gEventObjectPic_Spenser_1), + obj_frame_tiles(gEventObjectPic_Spenser_2), + obj_frame_tiles(gEventObjectPic_Spenser_3), + obj_frame_tiles(gEventObjectPic_Spenser_4), + obj_frame_tiles(gEventObjectPic_Spenser_5), + obj_frame_tiles(gEventObjectPic_Spenser_6), + obj_frame_tiles(gEventObjectPic_Spenser_7), + obj_frame_tiles(gEventObjectPic_Spenser_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Greta[] = { + obj_frame_tiles(gEventObjectPic_Greta_0), + obj_frame_tiles(gEventObjectPic_Greta_1), + obj_frame_tiles(gEventObjectPic_Greta_2), + obj_frame_tiles(gEventObjectPic_Greta_3), + obj_frame_tiles(gEventObjectPic_Greta_4), + obj_frame_tiles(gEventObjectPic_Greta_5), + obj_frame_tiles(gEventObjectPic_Greta_6), + obj_frame_tiles(gEventObjectPic_Greta_7), + obj_frame_tiles(gEventObjectPic_Greta_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Noland[] = { + obj_frame_tiles(gEventObjectPic_Noland_0), + obj_frame_tiles(gEventObjectPic_Noland_1), + obj_frame_tiles(gEventObjectPic_Noland_2), + obj_frame_tiles(gEventObjectPic_Noland_3), + obj_frame_tiles(gEventObjectPic_Noland_4), + obj_frame_tiles(gEventObjectPic_Noland_5), + obj_frame_tiles(gEventObjectPic_Noland_6), + obj_frame_tiles(gEventObjectPic_Noland_7), + obj_frame_tiles(gEventObjectPic_Noland_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Lucy[] = { + obj_frame_tiles(gEventObjectPic_Lucy_0), + obj_frame_tiles(gEventObjectPic_Lucy_1), + obj_frame_tiles(gEventObjectPic_Lucy_2), + obj_frame_tiles(gEventObjectPic_Lucy_3), + obj_frame_tiles(gEventObjectPic_Lucy_4), + obj_frame_tiles(gEventObjectPic_Lucy_5), + obj_frame_tiles(gEventObjectPic_Lucy_6), + obj_frame_tiles(gEventObjectPic_Lucy_7), + obj_frame_tiles(gEventObjectPic_Lucy_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Brandon[] = { + obj_frame_tiles(gEventObjectPic_Brandon_0), + obj_frame_tiles(gEventObjectPic_Brandon_1), + obj_frame_tiles(gEventObjectPic_Brandon_2), + obj_frame_tiles(gEventObjectPic_Brandon_3), + obj_frame_tiles(gEventObjectPic_Brandon_4), + obj_frame_tiles(gEventObjectPic_Brandon_5), + obj_frame_tiles(gEventObjectPic_Brandon_6), + obj_frame_tiles(gEventObjectPic_Brandon_7), + obj_frame_tiles(gEventObjectPic_Brandon_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_Lugia[] = { + obj_frame_tiles(gEventObjectPic_Lugia_0), + obj_frame_tiles(gEventObjectPic_Lugia_0), + obj_frame_tiles(gEventObjectPic_Lugia_0), + obj_frame_tiles(gEventObjectPic_Lugia_0), + obj_frame_tiles(gEventObjectPic_Lugia_1), + obj_frame_tiles(gEventObjectPic_Lugia_0), + obj_frame_tiles(gEventObjectPic_Lugia_1), + obj_frame_tiles(gEventObjectPic_Lugia_0), + obj_frame_tiles(gEventObjectPic_Lugia_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_HoOh[] = { + obj_frame_tiles(gEventObjectPic_HoOh_0), + obj_frame_tiles(gEventObjectPic_HoOh_0), + obj_frame_tiles(gEventObjectPic_HoOh_0), + obj_frame_tiles(gEventObjectPic_HoOh_0), + obj_frame_tiles(gEventObjectPic_HoOh_1), + obj_frame_tiles(gEventObjectPic_HoOh_0), + obj_frame_tiles(gEventObjectPic_HoOh_1), + obj_frame_tiles(gEventObjectPic_HoOh_0), + obj_frame_tiles(gEventObjectPic_HoOh_1), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RubySapphireBrendan[] = { + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_0), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_1), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_2), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_3), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_4), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_5), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_6), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_7), + obj_frame_tiles(gEventObjectPic_RubySapphireBrendan_8), +}; + +const struct SpriteFrameImage gEventObjectPicTable_RubySapphireMay[] = { + obj_frame_tiles(gEventObjectPic_RubySapphireMay_0), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_1), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_2), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_3), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_4), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_5), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_6), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_7), + obj_frame_tiles(gEventObjectPic_RubySapphireMay_8), +}; + +#endif //GUARD_EVENT_OBJECT_PIC_TABLES_H diff --git a/src/data/field_event_obj/event_object_subsprites.h b/src/data/field_event_obj/event_object_subsprites.h new file mode 100755 index 000000000..db5fddf1e --- /dev/null +++ b/src/data/field_event_obj/event_object_subsprites.h @@ -0,0 +1,342 @@ +#ifndef GUARD_EVENT_OBJECT_SUBSPRITES_H +#define GUARD_EVENT_OBJECT_SUBSPRITES_H + +const struct Subsprite gEventObjectSpriteOamTable_16x16_0[] = { + { -8, -8, 0, 1, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x16_1[] = { + { -8, -8, 0, 1, 0, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x16_2[] = { + { -8, -8, 1, 0, 0, 2}, + { -8, 0, 1, 0, 2, 3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x16_3[] = { + { -8, -8, 0, 1, 0, 2}, + { -8, -8, 0, 1, 0, 3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x16_4[] = { + { -8, -8, 0, 1, 0, 1}, + { -8, -8, 0, 1, 0, 3} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_16x16[] = { + {0, NULL}, + {1, gEventObjectSpriteOamTable_16x16_0}, + {1, gEventObjectSpriteOamTable_16x16_1}, + {2, gEventObjectSpriteOamTable_16x16_2}, + {2, gEventObjectSpriteOamTable_16x16_3}, + {2, gEventObjectSpriteOamTable_16x16_4} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x32_0[] = { + { -8, -16, 2, 2, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x32_1[] = { + { -8, -16, 2, 2, 0, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x32_2[] = { + { -8, -16, 0, 1, 0, 2}, + { -8, 0, 1, 0, 4, 2}, + { -8, 8, 1, 0, 6, 3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x32_3[] = { + { -8, -16, 0, 1, 0, 2}, + { -8, 0, 0, 1, 4, 3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_16x32_4[] = { + { -8, -16, 0, 1, 0, 1}, + { -8, 0, 0, 1, 4, 3} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_16x32[] = { + {0, NULL}, + {1, gEventObjectSpriteOamTable_16x32_0}, + {1, gEventObjectSpriteOamTable_16x32_1}, + {3, gEventObjectSpriteOamTable_16x32_2}, + {2, gEventObjectSpriteOamTable_16x32_3}, + {2, gEventObjectSpriteOamTable_16x32_4} +}; + +const struct Subsprite gEventObjectSpriteOamTable_32x32_0[] = { + {-16, -16, 0, 2, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_32x32_1[] = { + {-16, -16, 0, 2, 0, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_32x32_2[] = { + {-16, -16, 1, 2, 0, 2}, + {-16, 0, 1, 1, 8, 2}, + {-16, 8, 1, 1, 12, 3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_32x32_3[] = { + {-16, -16, 1, 2, 0, 2}, + {-16, 0, 1, 2, 8, 3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_32x32_4[] = { + {-16, -16, 1, 2, 0, 1}, + {-16, 0, 1, 2, 8, 3} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_32x32[] = { + {0, NULL}, + {1, gEventObjectSpriteOamTable_32x32_0}, + {1, gEventObjectSpriteOamTable_32x32_1}, + {3, gEventObjectSpriteOamTable_32x32_2}, + {2, gEventObjectSpriteOamTable_32x32_3}, + {2, gEventObjectSpriteOamTable_32x32_4} +}; + +const struct Subsprite gEventObjectSpriteOamTable_Truck_0[] = { + {-24, -24, 1, 1, 0, 2}, + { 8, -24, 1, 0, 4, 2}, + {-24, -16, 1, 1, 6, 2}, + { 8, -16, 1, 0, 10, 2}, + {-24, -8, 1, 1, 12, 2}, + { 8, -8, 1, 0, 16, 2}, + {-24, 0, 1, 1, 18, 2}, + { 8, 0, 1, 0, 22, 2}, + {-24, 8, 1, 1, 24, 2}, + { 8, 8, 1, 0, 28, 2}, + {-24, 16, 1, 1, 30, 2}, + { 8, 16, 1, 0, 34, 2} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_Truck[] = { + {12, gEventObjectSpriteOamTable_Truck_0}, + {12, gEventObjectSpriteOamTable_Truck_0}, + {12, gEventObjectSpriteOamTable_Truck_0}, + {12, gEventObjectSpriteOamTable_Truck_0}, + {12, gEventObjectSpriteOamTable_Truck_0}, + {12, gEventObjectSpriteOamTable_Truck_0} +}; + +const struct Subsprite gEventObjectSpriteOamTable_Unused_0[] = { + {-32, -16, 1, 3, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_Unused_1[] = { + {-32, -16, 1, 3, 0, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_Unused_2[] = { + {-32, -16, 1, 3, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_Unused_3[] = { + {-32, -16, 1, 3, 0, 2} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_Unused[] = { + {0, NULL}, + {1, gEventObjectSpriteOamTable_Unused_0}, + {1, gEventObjectSpriteOamTable_Unused_1}, + {1, gEventObjectSpriteOamTable_Unused_2}, + {1, gEventObjectSpriteOamTable_Unused_3}, + {1, gEventObjectSpriteOamTable_Unused_3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_64x64_0[] = { + {-32, -32, 0, 3, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_64x64_1[] = { + {-32, -32, 0, 3, 0, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_64x64_2[] = { + {-32, -32, 0, 3, 0, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_64x64_3[] = { + {-32, -32, 0, 3, 0, 2} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_64x64[] = { + {0, NULL}, + {1, gEventObjectSpriteOamTable_64x64_0}, + {1, gEventObjectSpriteOamTable_64x64_1}, + {1, gEventObjectSpriteOamTable_64x64_2}, + {1, gEventObjectSpriteOamTable_64x64_3}, + {1, gEventObjectSpriteOamTable_64x64_3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SSTidal_0[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 1, 8, 2}, + {-48, -12, 1, 1, 12, 2}, + {-16, -12, 1, 1, 16, 2}, + { 16, -12, 1, 1, 20, 2}, + {-48, -4, 1, 1, 24, 2}, + {-16, -4, 1, 1, 28, 2}, + { 16, -4, 1, 1, 32, 2}, + {-48, 4, 1, 1, 36, 2}, + {-16, 4, 1, 1, 40, 2}, + { 16, 4, 1, 1, 44, 2}, + {-48, 12, 1, 1, 48, 2}, + {-16, 12, 1, 1, 52, 2}, + { 16, 12, 1, 1, 56, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SSTidal_1[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 1, 8, 1}, + {-48, -12, 1, 1, 12, 1}, + {-16, -12, 1, 1, 16, 1}, + { 16, -12, 1, 1, 20, 1}, + {-48, -4, 1, 1, 24, 1}, + {-16, -4, 1, 1, 28, 1}, + { 16, -4, 1, 1, 32, 1}, + {-48, 4, 1, 1, 36, 1}, + {-16, 4, 1, 1, 40, 1}, + { 16, 4, 1, 1, 44, 1}, + {-48, 12, 1, 1, 48, 1}, + {-16, 12, 1, 1, 52, 1}, + { 16, 12, 1, 1, 56, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SSTidal_2[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 1, 8, 2}, + {-48, -12, 1, 1, 12, 2}, + {-16, -12, 1, 1, 16, 2}, + { 16, -12, 1, 1, 20, 2}, + {-48, -4, 1, 1, 24, 2}, + {-16, -4, 1, 1, 28, 2}, + { 16, -4, 1, 1, 32, 2}, + {-48, 4, 1, 1, 36, 2}, + {-16, 4, 1, 1, 40, 2}, + { 16, 4, 1, 1, 44, 2}, + {-48, 12, 1, 1, 48, 2}, + {-16, 12, 1, 1, 52, 2}, + { 16, 12, 1, 1, 56, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SSTidal_3[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 1, 8, 1}, + {-48, -12, 1, 1, 12, 1}, + {-16, -12, 1, 1, 16, 1}, + { 16, -12, 1, 1, 20, 1}, + {-48, -4, 1, 1, 24, 2}, + {-16, -4, 1, 1, 28, 2}, + { 16, -4, 1, 1, 32, 2}, + {-48, 4, 1, 1, 36, 2}, + {-16, 4, 1, 1, 40, 2}, + { 16, 4, 1, 1, 44, 2}, + {-48, 12, 1, 1, 48, 2}, + {-16, 12, 1, 1, 52, 2}, + { 16, 12, 1, 1, 56, 2} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_SSTidal[] = { + {15, gEventObjectSpriteOamTable_SSTidal_0}, + {15, gEventObjectSpriteOamTable_SSTidal_0}, + {15, gEventObjectSpriteOamTable_SSTidal_1}, + {15, gEventObjectSpriteOamTable_SSTidal_2}, + {15, gEventObjectSpriteOamTable_SSTidal_3}, + {15, gEventObjectSpriteOamTable_SSTidal_3} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_0[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 0, 8, 2}, + { 32, -20, 0, 0, 10, 2}, + {-48, -12, 1, 1, 11, 2}, + {-16, -12, 1, 1, 15, 2}, + { 16, -12, 1, 0, 19, 2}, + { 32, -12, 0, 0, 21, 2}, + {-48, -4, 1, 1, 22, 2}, + {-16, -4, 1, 1, 26, 2}, + { 16, -4, 1, 0, 30, 2}, + { 32, -4, 0, 0, 32, 2}, + {-48, 4, 1, 1, 33, 2}, + {-16, 4, 1, 1, 37, 2}, + { 16, 4, 1, 0, 41, 2}, + { 32, 4, 0, 0, 43, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_1[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 0, 8, 1}, + { 32, -20, 0, 0, 10, 1}, + {-48, -12, 1, 1, 11, 1}, + {-16, -12, 1, 1, 15, 1}, + { 16, -12, 1, 0, 19, 1}, + { 32, -12, 0, 0, 21, 1}, + {-48, -4, 1, 1, 22, 1}, + {-16, -4, 1, 1, 26, 1}, + { 16, -4, 1, 0, 30, 1}, + { 32, -4, 0, 0, 32, 1}, + {-48, 4, 1, 1, 33, 1}, + {-16, 4, 1, 1, 37, 1}, + { 16, 4, 1, 0, 41, 1}, + { 32, 4, 0, 0, 43, 1} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_2[] = { + {-48, -20, 1, 1, 0, 2}, + {-16, -20, 1, 1, 4, 2}, + { 16, -20, 1, 0, 8, 2}, + { 32, -20, 0, 0, 10, 2}, + {-48, -12, 1, 1, 11, 2}, + {-16, -12, 1, 1, 15, 2}, + { 16, -12, 1, 0, 19, 2}, + { 32, -12, 0, 0, 21, 2}, + {-48, -4, 1, 1, 22, 2}, + {-16, -4, 1, 1, 26, 2}, + { 16, -4, 1, 0, 30, 2}, + { 32, -4, 0, 0, 32, 2}, + {-48, 4, 1, 1, 33, 2}, + {-16, 4, 1, 1, 37, 2}, + { 16, 4, 1, 0, 41, 2}, + { 32, 4, 0, 0, 43, 2} +}; + +const struct Subsprite gEventObjectSpriteOamTable_SubmarineShadow_3[] = { + {-48, -20, 1, 1, 0, 1}, + {-16, -20, 1, 1, 4, 1}, + { 16, -20, 1, 0, 8, 1}, + { 32, -20, 0, 0, 10, 1}, + {-48, -12, 1, 1, 11, 1}, + {-16, -12, 1, 1, 15, 1}, + { 16, -12, 1, 0, 19, 1}, + { 32, -12, 0, 0, 21, 1}, + {-48, -4, 1, 1, 22, 2}, + {-16, -4, 1, 1, 26, 2}, + { 16, -4, 1, 0, 30, 2}, + { 32, -4, 0, 0, 32, 2}, + {-48, 4, 1, 1, 33, 2}, + {-16, 4, 1, 1, 37, 2}, + { 16, 4, 1, 0, 41, 2}, + { 32, 4, 0, 0, 43, 2} +}; + +const struct SubspriteTable gEventObjectSpriteOamTables_SubmarineShadow[] = { + {16, gEventObjectSpriteOamTable_SubmarineShadow_0}, + {16, gEventObjectSpriteOamTable_SubmarineShadow_0}, + {16, gEventObjectSpriteOamTable_SubmarineShadow_1}, + {16, gEventObjectSpriteOamTable_SubmarineShadow_2}, + {16, gEventObjectSpriteOamTable_SubmarineShadow_3}, + {16, gEventObjectSpriteOamTable_SubmarineShadow_3} +}; + +#endif //GUARD_EVENT_OBJECT_SUBSPRITES_H diff --git a/src/data/field_event_obj/field_effect_object_template_pointers.h b/src/data/field_event_obj/field_effect_object_template_pointers.h new file mode 100755 index 000000000..3b08a5ff1 --- /dev/null +++ b/src/data/field_event_obj/field_effect_object_template_pointers.h @@ -0,0 +1,82 @@ +#ifndef GUARD_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H +#define GUARD_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H + +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge; +const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass; +const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple; +const struct SpriteTemplate gFieldEffectObjectTemplate_Ash; +const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob; +const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow; +const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust; +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopTallGrass; +const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints; +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopBigSplash; +const struct SpriteTemplate gFieldEffectObjectTemplate_Splash; +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopSmallSplash; +const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown16; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown17; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown18; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown19; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown20; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown21; +const struct SpriteTemplate gFieldEffectObjectTemplate_BerryTreeGrowthSparkle; +const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints; +const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise; +const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise; +const struct SpriteTemplate gFieldEffectObjectTemplate_Bird; +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks; +const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown29; +const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass; +const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater; +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpOutOfAsh; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown33; +const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles; +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown35; +const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza; + +const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = { + &gFieldEffectObjectTemplate_ShadowSmall, + &gFieldEffectObjectTemplate_ShadowMedium, + &gFieldEffectObjectTemplate_ShadowLarge, + &gFieldEffectObjectTemplate_ShadowExtraLarge, + &gFieldEffectObjectTemplate_TallGrass, + &gFieldEffectObjectTemplate_Ripple, + &gFieldEffectObjectTemplate_Ash, + &gFieldEffectObjectTemplate_SurfBlob, + &gFieldEffectObjectTemplate_Arrow, + &gFieldEffectObjectTemplate_GroundImpactDust, + &gFieldEffectObjectTemplate_BikeHopTallGrass, + &gFieldEffectObjectTemplate_SandFootprints, + &gFieldEffectObjectTemplate_BikeHopBigSplash, + &gFieldEffectObjectTemplate_Splash, + &gFieldEffectObjectTemplate_BikeHopSmallSplash, + &gFieldEffectObjectTemplate_LongGrass, + &gFieldEffectObjectTemplate_Unknown16, + &gFieldEffectObjectTemplate_Unknown17, + &gFieldEffectObjectTemplate_Unknown18, + &gFieldEffectObjectTemplate_Unknown19, + &gFieldEffectObjectTemplate_Unknown20, + &gFieldEffectObjectTemplate_Unknown21, + &gFieldEffectObjectTemplate_BerryTreeGrowthSparkle, + &gFieldEffectObjectTemplate_DeepSandFootprints, + &gFieldEffectObjectTemplate_TreeDisguise, + &gFieldEffectObjectTemplate_MountainDisguise, + &gFieldEffectObjectTemplate_Bird, + &gFieldEffectObjectTemplate_BikeTireTracks, + &gFieldEffectObjectTemplate_SandDisguisePlaceholder, + &gFieldEffectObjectTemplate_Unknown29, + &gFieldEffectObjectTemplate_ShortGrass, + &gFieldEffectObjectTemplate_HotSpringsWater, + &gFieldEffectObjectTemplate_JumpOutOfAsh, + &gFieldEffectObjectTemplate_Unknown33, + &gFieldEffectObjectTemplate_Bubbles, + &gFieldEffectObjectTemplate_Unknown35, + &gFieldEffectObjectTemplate_Rayquaza, +}; + +#endif //GUARD_FIELD_EFFECT_OBJECT_TEMPLATE_POINTERS_H diff --git a/src/data/field_event_obj/field_effect_objects.h b/src/data/field_event_obj/field_effect_objects.h new file mode 100755 index 000000000..c8633daa7 --- /dev/null +++ b/src/data/field_event_obj/field_effect_objects.h @@ -0,0 +1,997 @@ +#ifndef GUARD_FIELD_EFFECT_OBJECTS_H +#define GUARD_FIELD_EFFECT_OBJECTS_H + +const struct SpritePalette gFieldEffectObjectPaletteInfo0 = {gFieldEffectObjectPalette0, 0x1004}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo1 = {gFieldEffectObjectPalette1, 0x1005}; + +const union AnimCmd gFieldEffectObjectImageAnim_850C9D0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Shadow[] = +{ + gFieldEffectObjectImageAnim_850C9D0, +}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowSmall[] = { + obj_frame_tiles(gFieldEffectObjectPic_ShadowSmall), +}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowMedium[] = { + obj_frame_tiles(gFieldEffectObjectPic_ShadowMedium), +}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowLarge[] = { + obj_frame_tiles(gFieldEffectObjectPic_ShadowLarge), +}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_ShadowExtraLarge[] = { + obj_frame_tiles(gFieldEffectObjectPic_ShadowExtraLarge), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowSmall = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_8x8, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowSmall, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowMedium = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowMedium, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowLarge = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x8, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowLarge, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ShadowExtraLarge = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_64x32, gFieldEffectObjectImageAnimTable_Shadow, gFieldEffectObjectPicTable_ShadowExtraLarge, gDummySpriteAffineAnimTable, oamc_shadow}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_TallGrass[] = { + obj_frame_tiles(gFieldEffectObjectPic_TallGrass_0), + obj_frame_tiles(gFieldEffectObjectPic_TallGrass_1), + obj_frame_tiles(gFieldEffectObjectPic_TallGrass_2), + obj_frame_tiles(gFieldEffectObjectPic_TallGrass_3), + obj_frame_tiles(gFieldEffectObjectPic_TallGrass_4), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CA84[] = +{ + ANIMCMD_FRAME(1, 10), + ANIMCMD_FRAME(2, 10), + ANIMCMD_FRAME(3, 10), + ANIMCMD_FRAME(4, 10), + ANIMCMD_FRAME(0, 10), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_TallGrass[] = +{ + gFieldEffectObjectImageAnim_850CA84, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_TallGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_TallGrass, gFieldEffectObjectPicTable_TallGrass, gDummySpriteAffineAnimTable, unc_grass_normal}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Ripple[] = { + obj_frame_tiles(gFieldEffectObjectPic_Ripple_0), + obj_frame_tiles(gFieldEffectObjectPic_Ripple_1), + obj_frame_tiles(gFieldEffectObjectPic_Ripple_2), + obj_frame_tiles(gFieldEffectObjectPic_Ripple_3), + obj_frame_tiles(gFieldEffectObjectPic_Ripple_4), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CAE0[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(2, 9), + ANIMCMD_FRAME(3, 9), + ANIMCMD_FRAME(0, 9), + ANIMCMD_FRAME(1, 9), + ANIMCMD_FRAME(2, 11), + ANIMCMD_FRAME(4, 11), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Ripple[] = +{ + gFieldEffectObjectImageAnim_850CAE0, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Ripple = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Ripple, gFieldEffectObjectPicTable_Ripple, gDummySpriteAffineAnimTable, sub_81561D0}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Ash[] = { + obj_frame_tiles(gFieldEffectObjectPic_Ash_0), + obj_frame_tiles(gFieldEffectObjectPic_Ash_1), + obj_frame_tiles(gFieldEffectObjectPic_Ash_2), + obj_frame_tiles(gFieldEffectObjectPic_Ash_3), + obj_frame_tiles(gFieldEffectObjectPic_Ash_4), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CB48[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_FRAME(1, 12), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 12), + ANIMCMD_FRAME(4, 12), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Ash[] = +{ + gFieldEffectObjectImageAnim_850CB48, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Ash = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Ash, gFieldEffectObjectPicTable_Ash, gDummySpriteAffineAnimTable, sub_8155460}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_SurfBlob[] = { + obj_frame_tiles(gFieldEffectObjectPic_SurfBlob_0), + obj_frame_tiles(gFieldEffectObjectPic_SurfBlob_1), + obj_frame_tiles(gFieldEffectObjectPic_SurfBlob_2), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CB94[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CB9C[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CBA4[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CBAC[] = +{ + ANIMCMD_FRAME(2, 1, .hFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_SurfBlob[] = +{ + gFieldEffectObjectImageAnim_850CB94, + gFieldEffectObjectImageAnim_850CB9C, + gFieldEffectObjectImageAnim_850CBA4, + gFieldEffectObjectImageAnim_850CBAC, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_SurfBlob = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_SurfBlob, gFieldEffectObjectPicTable_SurfBlob, gDummySpriteAffineAnimTable, sub_8155658}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Arrow[] = { + obj_frame_tiles(gFieldEffectObjectPic_Arrow_0), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_1), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_2), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_3), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_4), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_5), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_6), + obj_frame_tiles(gFieldEffectObjectPic_Arrow_7), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CC1C[] = +{ + ANIMCMD_FRAME(3, 32), + ANIMCMD_FRAME(7, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CC28[] = +{ + ANIMCMD_FRAME(0, 32), + ANIMCMD_FRAME(4, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CC34[] = +{ + ANIMCMD_FRAME(1, 32), + ANIMCMD_FRAME(5, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CC40[] = +{ + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(6, 32), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Arrow[] = +{ + gFieldEffectObjectImageAnim_850CC1C, + gFieldEffectObjectImageAnim_850CC28, + gFieldEffectObjectImageAnim_850CC34, + gFieldEffectObjectImageAnim_850CC40, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Arrow = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Arrow, gFieldEffectObjectPicTable_Arrow, gDummySpriteAffineAnimTable, SpriteCallbackDummy}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_GroundImpactDust[] = { + obj_frame_tiles(gFieldEffectObjectPic_GroundImpactDust_0), + obj_frame_tiles(gFieldEffectObjectPic_GroundImpactDust_1), + obj_frame_tiles(gFieldEffectObjectPic_GroundImpactDust_2), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CC8C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_GroundImpactDust[] = +{ + gFieldEffectObjectImageAnim_850CC8C, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_GroundImpactDust = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_GroundImpactDust, gFieldEffectObjectPicTable_GroundImpactDust, gDummySpriteAffineAnimTable, sub_8156194}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeHopTallGrass[] = { + obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_0), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_1), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_2), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopTallGrass_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CCD8[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeHopTallGrass[] = +{ + gFieldEffectObjectImageAnim_850CCD8, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopTallGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_BikeHopTallGrass, gFieldEffectObjectPicTable_BikeHopTallGrass, gDummySpriteAffineAnimTable, sub_8156194}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_SandFootprints[] = { + obj_frame_tiles(gFieldEffectObjectPic_SandFootprints_0), + obj_frame_tiles(gFieldEffectObjectPic_SandFootprints_1), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD18[] = +{ + ANIMCMD_FRAME(0, 1, .vFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD20[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD28[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD30[] = +{ + ANIMCMD_FRAME(1, 1, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_SandFootprints[] = +{ + gFieldEffectObjectImageAnim_850CD18, + gFieldEffectObjectImageAnim_850CD18, + gFieldEffectObjectImageAnim_850CD20, + gFieldEffectObjectImageAnim_850CD28, + gFieldEffectObjectImageAnim_850CD30, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_SandFootprints = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_SandFootprints, gFieldEffectObjectPicTable_SandFootprints, gDummySpriteAffineAnimTable, sub_8154C60}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_DeepSandFootprints[] = { + obj_frame_tiles(gFieldEffectObjectPic_DeepSandFootprints_0), + obj_frame_tiles(gFieldEffectObjectPic_DeepSandFootprints_1), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD74[] = +{ + ANIMCMD_FRAME(0, 1, .vFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD7C[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD84[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CD8C[] = +{ + ANIMCMD_FRAME(1, 1, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_DeepSandFootprints[] = +{ + gFieldEffectObjectImageAnim_850CD74, + gFieldEffectObjectImageAnim_850CD74, + gFieldEffectObjectImageAnim_850CD7C, + gFieldEffectObjectImageAnim_850CD84, + gFieldEffectObjectImageAnim_850CD8C, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_DeepSandFootprints = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_DeepSandFootprints, gFieldEffectObjectPicTable_DeepSandFootprints, gDummySpriteAffineAnimTable, sub_8154C60}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeTireTracks[] = { + obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_0), + obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_1), + obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_2), + obj_frame_tiles(gFieldEffectObjectPic_BikeTireTracks_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CDE0[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CDE8[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CDF0[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CDF8[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CE00[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CE08[] = +{ + ANIMCMD_FRAME(0, 1, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CE10[] = +{ + ANIMCMD_FRAME(3, 1, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CE18[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeTireTracks[] = +{ + gFieldEffectObjectImageAnim_850CDE0, + gFieldEffectObjectImageAnim_850CDE0, + gFieldEffectObjectImageAnim_850CDE8, + gFieldEffectObjectImageAnim_850CDF0, + gFieldEffectObjectImageAnim_850CDF8, + gFieldEffectObjectImageAnim_850CE00, + gFieldEffectObjectImageAnim_850CE08, + gFieldEffectObjectImageAnim_850CE10, + gFieldEffectObjectImageAnim_850CE18, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeTireTracks = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BikeTireTracks, gFieldEffectObjectPicTable_BikeTireTracks, gDummySpriteAffineAnimTable, sub_8154C60}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeHopBigSplash[] = { + obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_0), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_1), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_2), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopBigSplash_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CE7C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeHopBigSplash[] = +{ + gFieldEffectObjectImageAnim_850CE7C, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopBigSplash = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BikeHopBigSplash, gFieldEffectObjectPicTable_BikeHopBigSplash, gDummySpriteAffineAnimTable, sub_8156194}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Splash[] = { + obj_frame_tiles(gFieldEffectObjectPic_Splash_0), + obj_frame_tiles(gFieldEffectObjectPic_Splash_1), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CEBC[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CEC8[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Splash[] = +{ + gFieldEffectObjectImageAnim_850CEBC, + gFieldEffectObjectImageAnim_850CEC8, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Splash = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_Splash, gFieldEffectObjectPicTable_Splash, gDummySpriteAffineAnimTable, sub_8154D90}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_BikeHopSmallSplash[] = { + obj_frame_tiles(gFieldEffectObjectPic_BikeHopSmallSplash_0), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopSmallSplash_1), + obj_frame_tiles(gFieldEffectObjectPic_BikeHopSmallSplash_2), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CF24[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_BikeHopSmallSplash[] = +{ + gFieldEffectObjectImageAnim_850CF24, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_BikeHopSmallSplash = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_BikeHopSmallSplash, gFieldEffectObjectPicTable_BikeHopSmallSplash, gDummySpriteAffineAnimTable, sub_8156194}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_LongGrass[] = { + obj_frame_tiles(gFieldEffectObjectPic_LongGrass_0), + obj_frame_tiles(gFieldEffectObjectPic_LongGrass_1), + obj_frame_tiles(gFieldEffectObjectPic_LongGrass_2), + obj_frame_tiles(gFieldEffectObjectPic_LongGrass_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CF70[] = +{ + ANIMCMD_FRAME(1, 3), + ANIMCMD_FRAME(2, 3), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_LongGrass[] = +{ + gFieldEffectObjectImageAnim_850CF70, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_LongGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_LongGrass, gFieldEffectObjectPicTable_LongGrass, gDummySpriteAffineAnimTable, unc_grass_tall}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown16[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_2), + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_3), + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_4), + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_5), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850CFDC[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown16[] = +{ + gFieldEffectObjectImageAnim_850CFDC, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown16 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown16, gFieldEffectObjectPicTable_Unknown16, gDummySpriteAffineAnimTable, sub_8156194}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown17[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown16_5), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_2), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_3), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_4), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_5), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_6), + obj_frame_tiles(gFieldEffectObjectPic_Unknown17_7), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D05C[] = +{ + ANIMCMD_FRAME(0, 10), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_JUMP(7), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown17[] = +{ + gFieldEffectObjectImageAnim_850D05C, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown17 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown17, gFieldEffectObjectPicTable_Unknown17, gDummySpriteAffineAnimTable, sub_81561D0}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown18[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown18_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown18_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown18_2), + obj_frame_tiles(gFieldEffectObjectPic_Unknown18_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D0C0[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown18[] = +{ + gFieldEffectObjectImageAnim_850D0C0, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown18 = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown18, gFieldEffectObjectPicTable_Unknown18, gDummySpriteAffineAnimTable, sub_81561D0}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown19[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown19_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown19_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown19_2), + obj_frame_tiles(gFieldEffectObjectPic_Unknown19_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D118[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown19[] = +{ + gFieldEffectObjectImageAnim_850D118, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown19 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown19, gFieldEffectObjectPicTable_Unknown19, gDummySpriteAffineAnimTable, sub_81561D0}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown29[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown29_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown29_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown29_2), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D160[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown29[] = +{ + gFieldEffectObjectImageAnim_850D160, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown29 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x8, gFieldEffectObjectImageAnimTable_Unknown29, gFieldEffectObjectPicTable_Unknown29, gDummySpriteAffineAnimTable, sub_81559BC}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown20[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown20_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown20_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown20_2), + obj_frame_tiles(gFieldEffectObjectPic_Unknown20_3), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D1AC[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown20[] = +{ + gFieldEffectObjectImageAnim_850D1AC, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown20 = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown20, gFieldEffectObjectPicTable_Unknown20, gDummySpriteAffineAnimTable, sub_81561D0}; + +const union AffineAnimCmd gFieldEffectObjectRotScalAnim_850D1E4[] = +{ + AFFINEANIMCMD_FRAME(0xFF00, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd gFieldEffectObjectRotScalAnim_850D234[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0x1, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_FRAME(0xFFFF, 0x0, 0, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gFieldEffectObjectRotScalAnimTable_Unknown21[] = +{ + gFieldEffectObjectRotScalAnim_850D1E4, + gFieldEffectObjectRotScalAnim_850D234, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown21 = {0x0, 0xFFFF, &gDummyOamData, gDummySpriteAnimTable, NULL, gFieldEffectObjectRotScalAnimTable_Unknown21, SpriteCallbackDummy}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_BerryTreeGrowthSparkle[] = { + obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_0), + obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_1), + obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_2), + obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_3), + obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_4), + obj_frame_tiles(gFieldEffectObjectPic_BerryTreeGrowthSparkle_5), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D2D4[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_LOOP(0), + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_LOOP(3), + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(5, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_BerryTreeGrowthSparkle[] = +{ + gFieldEffectObjectImageAnim_850D2D4, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_BerryTreeGrowthSparkle = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_BerryTreeGrowthSparkle, gFieldEffectObjectPicTable_BerryTreeGrowthSparkle, gDummySpriteAffineAnimTable, sub_81561D0}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_TreeDisguise[] = { + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_0), + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_1), + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_2), + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_3), + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_4), + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_5), + obj_frame_tiles(gFieldEffectObjectPic_TreeDisguise_6), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D37C[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D384[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_TreeDisguise[] = +{ + gFieldEffectObjectImageAnim_850D37C, + gFieldEffectObjectImageAnim_850D384, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_TreeDisguise = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_TreeDisguise, gFieldEffectObjectPicTable_TreeDisguise, gDummySpriteAffineAnimTable, sub_8155C88}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_MountainDisguise[] = { + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_0), + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_1), + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_2), + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_3), + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_4), + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_5), + obj_frame_tiles(gFieldEffectObjectPic_MountainDisguise_6), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D3FC[] = +{ + ANIMCMD_FRAME(0, 16), + ANIMCMD_END, +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D404[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_MountainDisguise[] = +{ + gFieldEffectObjectImageAnim_850D3FC, + gFieldEffectObjectImageAnim_850D404, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_MountainDisguise = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_MountainDisguise, gFieldEffectObjectPicTable_MountainDisguise, gDummySpriteAffineAnimTable, sub_8155C88}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_SandDisguisePlaceholder[] = { + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_0), + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_1), + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_2), + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_3), + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_4), + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_5), + obj_frame_tiles(gFieldEffectObjectPic_SandDisguisePlaceholder_6), +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_SandDisguisePlaceholder = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_TreeDisguise, gFieldEffectObjectPicTable_SandDisguisePlaceholder, gDummySpriteAffineAnimTable, sub_8155C88}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Bird[] = { + obj_frame_tiles(gFieldEffectObjectPic_Bird), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D49C[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Bird[] = +{ + gFieldEffectObjectImageAnim_850D49C, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Bird = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_Bird, gFieldEffectObjectPicTable_Bird, gDummySpriteAffineAnimTable, SpriteCallbackDummy}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_ShortGrass[] = { + obj_frame_tiles(gFieldEffectObjectPic_ShortGrass_0), + obj_frame_tiles(gFieldEffectObjectPic_ShortGrass_1), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D4D0[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_ShortGrass[] = +{ + gFieldEffectObjectImageAnim_850D4D0, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_ShortGrass = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_ShortGrass, gFieldEffectObjectPicTable_ShortGrass, gDummySpriteAffineAnimTable, sub_8154A10}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_HotSpringsWater[] = { + obj_frame_tiles(gFieldEffectObjectPic_HotSpringsWater), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D500[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_HotSpringsWater[] = +{ + gFieldEffectObjectImageAnim_850D500, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_HotSpringsWater = {0xFFFF, 0x1005, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_HotSpringsWater, gFieldEffectObjectPicTable_HotSpringsWater, gDummySpriteAffineAnimTable, sub_8155158}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_JumpOutOfAsh[] = { + obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_0), + obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_1), + obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_2), + obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_3), + obj_frame_tiles(gFieldEffectObjectPic_JumpOutOfAsh_4), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D54C[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_JumpOutOfAsh[] = +{ + gFieldEffectObjectImageAnim_850D54C, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_JumpOutOfAsh = {0xFFFF, 0x100D, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_JumpOutOfAsh, gFieldEffectObjectPicTable_JumpOutOfAsh, gDummySpriteAffineAnimTable, sub_80B7CAC}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo2 = {gFieldEffectObjectPalette2, 0x100D}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown33[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown33_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown33_1), + obj_frame_tiles(gFieldEffectObjectPic_Unknown33_2), + obj_frame_tiles(gFieldEffectObjectPic_Unknown33_3), + obj_frame_tiles(gFieldEffectObjectPic_Unknown33_4), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D5B0[] = +{ + ANIMCMD_FRAME(0, 6), + ANIMCMD_FRAME(1, 6), + ANIMCMD_FRAME(2, 6), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown33[] = +{ + gFieldEffectObjectImageAnim_850D5B0, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown33 = {0xFFFF, 0x100D, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown33, gFieldEffectObjectPicTable_Unknown33, gDummySpriteAffineAnimTable, sub_80B7A58}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Bubbles[] = { + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_0), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_1), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_2), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_3), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_4), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_5), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_6), + obj_frame_tiles(gFieldEffectObjectPic_Bubbles_7), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D624[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(2, 4), + ANIMCMD_FRAME(3, 6), + ANIMCMD_FRAME(4, 6), + ANIMCMD_FRAME(5, 4), + ANIMCMD_FRAME(6, 4), + ANIMCMD_FRAME(7, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Bubbles[] = +{ + gFieldEffectObjectImageAnim_850D624, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles = {0xFFFF, 0x1004, &gEventObjectBaseOam_16x32, gFieldEffectObjectImageAnimTable_Bubbles, gFieldEffectObjectPicTable_Bubbles, gDummySpriteAffineAnimTable, sub_8155AEC}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Unknown35[] = { + obj_frame_tiles(gFieldEffectObjectPic_Unknown35_0), + obj_frame_tiles(gFieldEffectObjectPic_Unknown35_1), +}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D674[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(1, 5), + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Unknown35[] = +{ + gFieldEffectObjectImageAnim_850D674, +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Unknown35 = {0xFFFF, 0x100F, &gEventObjectBaseOam_16x16, gFieldEffectObjectImageAnimTable_Unknown35, gFieldEffectObjectPicTable_Unknown35, gDummySpriteAffineAnimTable, sub_8155E50}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo3 = {gFieldEffectObjectPalette3, 0x100F}; + +const union AnimCmd gFieldEffectObjectImageAnim_850D6A8[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gFieldEffectObjectImageAnimTable_Rayquaza[] = { + gFieldEffectObjectImageAnim_850D6A8, +}; + +const struct SpriteFrameImage gFieldEffectObjectPicTable_Rayquaza[] = { + {.data = (u8*)gEventObjectPic_Rayquaza_0, .size = (sizeof gEventObjectPic_Rayquaza_0) / 4} +}; + +const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = {0xFFFF, 0xFFFF, &gEventObjectBaseOam_32x32, gFieldEffectObjectImageAnimTable_Rayquaza, gFieldEffectObjectPicTable_Rayquaza, gDummySpriteAffineAnimTable, sub_8155F80}; + +const struct SpritePalette gFieldEffectObjectPaletteInfoUnused = {gEventObjectPalette2, 0x1011}; + +#endif //GUARD_FIELD_EFFECT_OBJECTS_H diff --git a/src/data/field_event_obj/movement_action_func_tables.h b/src/data/field_event_obj/movement_action_func_tables.h new file mode 100755 index 000000000..b24f5dea4 --- /dev/null +++ b/src/data/field_event_obj/movement_action_func_tables.h @@ -0,0 +1,1518 @@ +#ifndef GUARD_MOVEMENT_ACTION_FUNC_TABLES_H +#define GUARD_MOVEMENT_ACTION_FUNC_TABLES_H + +u8 MovementAction_FaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_PauseSpriteAnim(struct EventObject *, struct Sprite *); +u8 MovementAction_FaceUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FaceLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FaceRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalUpLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalUpRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalDownLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalDownRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkSlowRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalUpLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalUpRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalDownLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalDownRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkNormalRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Down_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Down_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Up_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Up_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Left_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Left_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Right_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Jump2Right_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Delay1_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Delay_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Finish(struct EventObject *, struct Sprite *); +u8 MovementAction_Delay2_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Delay4_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Delay8_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Delay16_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceSlowDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceSlow_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceSlowUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceSlowLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceSlowRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceNormalDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlace_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceNormalUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceNormalLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceNormalRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastestDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastestUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastestLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkInPlaceFastestRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RideWaterCurrentRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkFastestRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_SlideRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_PlayerRunRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_StartAnimInDirection_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WaitSpriteAnim(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpSpecialRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_FacePlayer_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FaceAwayPlayer_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_LockFacingDirection_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_UnlockFacingDirection_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceDownUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceDownUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceUpDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceUpDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceLeftRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceLeftRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceRightLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_JumpInPlaceRightLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_FaceOriginalDirection_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_NurseJoyBowDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_DisableAnimation_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RestoreAnimation_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_SetInvisible_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_SetVisible_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_EmoteExclamationMark_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_EmoteQuestionMark_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_EmoteHeart_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RevealTrainer_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RevealTrainer_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_RockSmashBreak_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_RockSmashBreak_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_RockSmashBreak_Step2(struct EventObject *, struct Sprite *); +u8 MovementAction_CutTree_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_CutTree_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_CutTree_Step2(struct EventObject *, struct Sprite *); +u8 MovementAction_SetFixedPriority_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_ClearFixedPriority_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_InitAffineAnim_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_ClearAffineAnim_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Unknown1_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Unknown2_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkDownStartAffine_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkDownStartAffine_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkDownAffine_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkDownAffine_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkLeftAffine_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkLeftAffine_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkRightAffine_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_WalkRightAffine_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieFaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieFaceUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieFaceLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieFaceRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieFaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieFaceUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieFaceRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_UnusedAcroActionDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_UnusedAcroActionUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_UnusedAcroActionLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_UnusedAcroActionRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Figure8_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Figure8_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopFaceRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieHopRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieJumpRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieInPlaceDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieInPlaceUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieInPlaceRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroPopWheelieMoveRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroWheelieMoveRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveDown_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveRight_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_AcroEndWheelieMoveRight_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Levitate_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_StopLevitate_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_DestroyExtraTaskIfAtTop_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_StoreAndLockAnim_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_Finish(struct EventObject *, struct Sprite *); +u8 MovementAction_FreeAndUnlockAnim_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FlyUp_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FlyUp_Step1(struct EventObject *, struct Sprite *); +u8 MovementAction_Fly_Finish(struct EventObject *, struct Sprite *); +u8 MovementAction_FlyDown_Step0(struct EventObject *, struct Sprite *); +u8 MovementAction_FlyDown_Step1(struct EventObject *, struct Sprite *); + +u8 (*const gMovementActionFuncs_FaceDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FaceUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FaceLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FaceRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Jump2Down[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Jump2Up[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Jump2Left[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Jump2Right[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Delay1[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Delay2[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Delay4[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Delay8[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Delay16[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceSlowDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceSlowUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceSlowLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceSlowRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceNormalDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceNormalUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceNormalLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceNormalRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastestDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastestUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastestLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkInPlaceFastestRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RideWaterCurrentDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RideWaterCurrentUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RideWaterCurrentLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RideWaterCurrentRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastestDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastestUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastestLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkFastestRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SlideDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SlideUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SlideLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SlideRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_PlayerRunDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_PlayerRunUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_PlayerRunLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_PlayerRunRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_StartAnimInDirection[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpSpecialDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpSpecialUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpSpecialLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpSpecialRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FacePlayer[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FaceAwayPlayer[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_LockFacingDirection[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_UnlockFacingDirection[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceDownUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceUpDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceLeftRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_JumpInPlaceRightLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FaceOriginalDirection[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_NurseJoyBowDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_DisableAnimation[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RestoreAnimation[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SetInvisible[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SetVisible[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_EmoteExclamationMark[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_EmoteQuestionMark[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_EmoteHeart[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RevealTrainer[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_RockSmashBreak[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_CutTree[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_SetFixedPriority[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_ClearFixedPriority[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_InitAffineAnim[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_ClearAffineAnim[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Unknown1[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Unknown2[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkDownStartAffine[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkDownAffine[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieFaceDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieFaceUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieFaceLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieFaceRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieHopRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieJumpDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieJumpUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieJumpLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieJumpRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieMoveDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieMoveUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieMoveLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroWheelieMoveRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveDown[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownLeft[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownRight[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_StoreAndLockAnim[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FreeAndUnlockAnim[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkLeftAffine[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_WalkRightAffine[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Levitate[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_StopLevitate[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_Figure8[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FlyUp[])(struct EventObject *, struct Sprite *); +u8 (*const gMovementActionFuncs_FlyDown[])(struct EventObject *, struct Sprite *); + +u8 (*const *const gMovementActionFuncs[])(struct EventObject *, struct Sprite *) = { + gMovementActionFuncs_FaceDown, // MOVEMENT_ACTION_FACE_DOWN + gMovementActionFuncs_FaceUp, // MOVEMENT_ACTION_FACE_UP + gMovementActionFuncs_FaceLeft, // MOVEMENT_ACTION_FACE_LEFT + gMovementActionFuncs_FaceRight, // MOVEMENT_ACTION_FACE_RIGHT + gMovementActionFuncs_WalkSlowDown, // MOVEMENT_ACTION_WALK_SLOW_DOWN + gMovementActionFuncs_WalkSlowUp, // MOVEMENT_ACTION_WALK_SLOW_UP + gMovementActionFuncs_WalkSlowLeft, // MOVEMENT_ACTION_WALK_SLOW_LEFT + gMovementActionFuncs_WalkSlowRight, // MOVEMENT_ACTION_WALK_SLOW_RIGHT + gMovementActionFuncs_WalkNormalDown, // MOVEMENT_ACTION_WALK_NORMAL_DOWN + gMovementActionFuncs_WalkNormalUp, // MOVEMENT_ACTION_WALK_NORMAL_UP + gMovementActionFuncs_WalkNormalLeft, // MOVEMENT_ACTION_WALK_NORMAL_LEFT + gMovementActionFuncs_WalkNormalRight, // MOVEMENT_ACTION_WALK_NORMAL_RIGHT + gMovementActionFuncs_Jump2Down, // MOVEMENT_ACTION_JUMP_2_DOWN + gMovementActionFuncs_Jump2Up, // MOVEMENT_ACTION_JUMP_2_UP + gMovementActionFuncs_Jump2Left, // MOVEMENT_ACTION_JUMP_2_LEFT + gMovementActionFuncs_Jump2Right, // MOVEMENT_ACTION_JUMP_2_RIGHT + gMovementActionFuncs_Delay1, // MOVEMENT_ACTION_DELAY_1 + gMovementActionFuncs_Delay2, // MOVEMENT_ACTION_DELAY_2 + gMovementActionFuncs_Delay4, // MOVEMENT_ACTION_DELAY_4 + gMovementActionFuncs_Delay8, // MOVEMENT_ACTION_DELAY_8 + gMovementActionFuncs_Delay16, // MOVEMENT_ACTION_DELAY_16 + gMovementActionFuncs_WalkFastDown, // MOVEMENT_ACTION_WALK_FAST_DOWN + gMovementActionFuncs_WalkFastUp, // MOVEMENT_ACTION_WALK_FAST_UP + gMovementActionFuncs_WalkFastLeft, // MOVEMENT_ACTION_WALK_FAST_LEFT + gMovementActionFuncs_WalkFastRight, // MOVEMENT_ACTION_WALK_FAST_RIGHT + gMovementActionFuncs_WalkInPlaceSlowDown, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN + gMovementActionFuncs_WalkInPlaceSlowUp, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP + gMovementActionFuncs_WalkInPlaceSlowLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT + gMovementActionFuncs_WalkInPlaceSlowRight, // MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT + gMovementActionFuncs_WalkInPlaceNormalDown, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN + gMovementActionFuncs_WalkInPlaceNormalUp, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP + gMovementActionFuncs_WalkInPlaceNormalLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT + gMovementActionFuncs_WalkInPlaceNormalRight, // MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT + gMovementActionFuncs_WalkInPlaceFastDown, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN + gMovementActionFuncs_WalkInPlaceFastUp, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP + gMovementActionFuncs_WalkInPlaceFastLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT + gMovementActionFuncs_WalkInPlaceFastRight, // MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT + gMovementActionFuncs_WalkInPlaceFastestDown, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN + gMovementActionFuncs_WalkInPlaceFastestUp, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_UP + gMovementActionFuncs_WalkInPlaceFastestLeft, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT + gMovementActionFuncs_WalkInPlaceFastestRight, // MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT + gMovementActionFuncs_RideWaterCurrentDown, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN + gMovementActionFuncs_RideWaterCurrentUp, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP + gMovementActionFuncs_RideWaterCurrentLeft, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT + gMovementActionFuncs_RideWaterCurrentRight, // MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT + gMovementActionFuncs_WalkFastestDown, // MOVEMENT_ACTION_WALK_FASTEST_DOWN + gMovementActionFuncs_WalkFastestUp, // MOVEMENT_ACTION_WALK_FASTEST_UP + gMovementActionFuncs_WalkFastestLeft, // MOVEMENT_ACTION_WALK_FASTEST_LEFT + gMovementActionFuncs_WalkFastestRight, // MOVEMENT_ACTION_WALK_FASTEST_RIGHT + gMovementActionFuncs_SlideDown, // MOVEMENT_ACTION_SLIDE_DOWN + gMovementActionFuncs_SlideUp, // MOVEMENT_ACTION_SLIDE_UP + gMovementActionFuncs_SlideLeft, // MOVEMENT_ACTION_SLIDE_LEFT + gMovementActionFuncs_SlideRight, // MOVEMENT_ACTION_SLIDE_RIGHT + gMovementActionFuncs_PlayerRunDown, // MOVEMENT_ACTION_PLAYER_RUN_DOWN + gMovementActionFuncs_PlayerRunUp, // MOVEMENT_ACTION_PLAYER_RUN_UP + gMovementActionFuncs_PlayerRunLeft, // MOVEMENT_ACTION_PLAYER_RUN_LEFT + gMovementActionFuncs_PlayerRunRight, // MOVEMENT_ACTION_PLAYER_RUN_RIGHT + gMovementActionFuncs_StartAnimInDirection, // MOVEMENT_ACTION_START_ANIM_IN_DIRECTION + gMovementActionFuncs_JumpSpecialDown, // MOVEMENT_ACTION_JUMP_SPECIAL_DOWN + gMovementActionFuncs_JumpSpecialUp, // MOVEMENT_ACTION_JUMP_SPECIAL_UP + gMovementActionFuncs_JumpSpecialLeft, // MOVEMENT_ACTION_JUMP_SPECIAL_LEFT + gMovementActionFuncs_JumpSpecialRight, // MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT + gMovementActionFuncs_FacePlayer, // MOVEMENT_ACTION_FACE_PLAYER + gMovementActionFuncs_FaceAwayPlayer, // MOVEMENT_ACTION_FACE_AWAY_PLAYER + gMovementActionFuncs_LockFacingDirection, // MOVEMENT_ACTION_LOCK_FACING_DIRECTION + gMovementActionFuncs_UnlockFacingDirection, // MOVEMENT_ACTION_UNLOCK_FACING_DIRECTION + gMovementActionFuncs_JumpDown, // MOVEMENT_ACTION_JUMP_DOWN + gMovementActionFuncs_JumpUp, // MOVEMENT_ACTION_JUMP_UP + gMovementActionFuncs_JumpLeft, // MOVEMENT_ACTION_JUMP_LEFT + gMovementActionFuncs_JumpRight, // MOVEMENT_ACTION_JUMP_RIGHT + gMovementActionFuncs_JumpInPlaceDown, // MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN + gMovementActionFuncs_JumpInPlaceUp, // MOVEMENT_ACTION_JUMP_IN_PLACE_UP + gMovementActionFuncs_JumpInPlaceLeft, // MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT + gMovementActionFuncs_JumpInPlaceRight, // MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT + gMovementActionFuncs_JumpInPlaceDownUp, // MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP + gMovementActionFuncs_JumpInPlaceUpDown, // MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN + gMovementActionFuncs_JumpInPlaceLeftRight, // MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT + gMovementActionFuncs_JumpInPlaceRightLeft, // MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT + gMovementActionFuncs_FaceOriginalDirection, // MOVEMENT_ACTION_FACE_ORIGINAL_DIRECTION + gMovementActionFuncs_NurseJoyBowDown, // MOVEMENT_ACTION_NURSE_JOY_BOW_DOWN + gMovementActionFuncs_EnableJumpLandingGroundEffect, // MOVEMENT_ACTION_ENABLE_JUMP_LANDING_GROUND_EFFECT + gMovementActionFuncs_DisableJumpLandingGroundEffect, // MOVEMENT_ACTION_DISABLE_JUMP_LANDING_GROUND_EFFECT + gMovementActionFuncs_DisableAnimation, // MOVEMENT_ACTION_DISABLE_ANIMATION + gMovementActionFuncs_RestoreAnimation, // MOVEMENT_ACTION_RESTORE_ANIMATION + gMovementActionFuncs_SetInvisible, // MOVEMENT_ACTION_SET_INVISIBLE + gMovementActionFuncs_SetVisible, // MOVEMENT_ACTION_SET_VISIBLE + gMovementActionFuncs_EmoteExclamationMark, // MOVEMENT_ACTION_EMOTE_EXCLAMATION_MARK + gMovementActionFuncs_EmoteQuestionMark, // MOVEMENT_ACTION_EMOTE_QUESTION_MARK + gMovementActionFuncs_EmoteHeart, // MOVEMENT_ACTION_EMOTE_HEART + gMovementActionFuncs_RevealTrainer, // MOVEMENT_ACTION_REVEAL_TRAINER + gMovementActionFuncs_RockSmashBreak, // MOVEMENT_ACTION_ROCK_SMASH_BREAK + gMovementActionFuncs_CutTree, // MOVEMENT_ACTION_CUT_TREE + gMovementActionFuncs_SetFixedPriority, // MOVEMENT_ACTION_SET_FIXED_PRIORITY + gMovementActionFuncs_ClearFixedPriority, // MOVEMENT_ACTION_CLEAR_FIXED_PRIORITY + gMovementActionFuncs_InitAffineAnim, // MOVEMENT_ACTION_INIT_AFFINE_ANIM + gMovementActionFuncs_ClearAffineAnim, // MOVEMENT_ACTION_CLEAR_AFFINE_ANIM + gMovementActionFuncs_Unknown1, // MOVEMENT_ACTION_UNKNOWN1 + gMovementActionFuncs_Unknown2, // MOVEMENT_ACTION_UNKNOWN2 + gMovementActionFuncs_WalkDownStartAffine, // MOVEMENT_ACTION_WALK_DOWN_START_AFFINE + gMovementActionFuncs_WalkDownAffine, // MOVEMENT_ACTION_WALK_DOWN_AFFINE + gMovementActionFuncs_AcroWheelieFaceDown, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN + gMovementActionFuncs_AcroWheelieFaceUp, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP + gMovementActionFuncs_AcroWheelieFaceLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT + gMovementActionFuncs_AcroWheelieFaceRight, // MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT + gMovementActionFuncs_AcroPopWheelieDown, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN + gMovementActionFuncs_AcroPopWheelieUp, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP + gMovementActionFuncs_AcroPopWheelieLeft, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT + gMovementActionFuncs_AcroPopWheelieRight, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT + gMovementActionFuncs_AcroEndWheelieFaceDown, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN + gMovementActionFuncs_AcroEndWheelieFaceUp, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP + gMovementActionFuncs_AcroEndWheelieFaceLeft, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT + gMovementActionFuncs_AcroEndWheelieFaceRight, // MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT + gMovementActionFuncs_AcroWheelieHopFaceDown, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN + gMovementActionFuncs_AcroWheelieHopFaceUp, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP + gMovementActionFuncs_AcroWheelieHopFaceLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT + gMovementActionFuncs_AcroWheelieHopFaceRight, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT + gMovementActionFuncs_AcroWheelieHopDown, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN + gMovementActionFuncs_AcroWheelieHopUp, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP + gMovementActionFuncs_AcroWheelieHopLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT + gMovementActionFuncs_AcroWheelieHopRight, // MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT + gMovementActionFuncs_AcroWheelieJumpDown, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN + gMovementActionFuncs_AcroWheelieJumpUp, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP + gMovementActionFuncs_AcroWheelieJumpLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT + gMovementActionFuncs_AcroWheelieJumpRight, // MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT + gMovementActionFuncs_AcroWheelieInPlaceDown, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN + gMovementActionFuncs_AcroWheelieInPlaceUp, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP + gMovementActionFuncs_AcroWheelieInPlaceLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT + gMovementActionFuncs_AcroWheelieInPlaceRight, // MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT + gMovementActionFuncs_AcroPopWheelieMoveDown, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN + gMovementActionFuncs_AcroPopWheelieMoveUp, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP + gMovementActionFuncs_AcroPopWheelieMoveLeft, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT + gMovementActionFuncs_AcroPopWheelieMoveRight, // MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT + gMovementActionFuncs_AcroWheelieMoveDown, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN + gMovementActionFuncs_AcroWheelieMoveUp, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP + gMovementActionFuncs_AcroWheelieMoveLeft, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT + gMovementActionFuncs_AcroWheelieMoveRight, // MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT + gMovementActionFuncs_AcroEndWheelieMoveDown, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN + gMovementActionFuncs_AcroEndWheelieMoveUp, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP + gMovementActionFuncs_AcroEndWheelieMoveLeft, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT + gMovementActionFuncs_AcroEndWheelieMoveRight, // MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT + gMovementActionFuncs_WalkNormalDiagonalUpLeft, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_UP_LEFT + gMovementActionFuncs_WalkNormalDiagonalUpRight, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_UP_RIGHT + gMovementActionFuncs_WalkNormalDiagonalDownLeft, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_DOWN_LEFT + gMovementActionFuncs_WalkNormalDiagonalDownRight, // MOVEMENT_ACTION_WALK_NORMAL_DIAGONAL_DOWN_RIGHT + gMovementActionFuncs_WalkSlowDiagonalUpLeft, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_LEFT + gMovementActionFuncs_WalkSlowDiagonalUpRight, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_UP_RIGHT + gMovementActionFuncs_WalkSlowDiagonalDownLeft, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_LEFT + gMovementActionFuncs_WalkSlowDiagonalDownRight, // MOVEMENT_ACTION_WALK_SLOW_DIAGONAL_DOWN_RIGHT + gMovementActionFuncs_StoreAndLockAnim, // MOVEMENT_ACTION_STORE_AND_LOCK_ANIM + gMovementActionFuncs_FreeAndUnlockAnim, // MOVEMENT_ACTION_FREE_AND_UNLOCK_ANIM + gMovementActionFuncs_WalkLeftAffine, // MOVEMENT_ACTION_WALK_LEFT_AFFINE + gMovementActionFuncs_WalkRightAffine, // MOVEMENT_ACTION_WALK_RIGHT_AFFINE + gMovementActionFuncs_Levitate, // MOVEMENT_ACTION_LEVITATE + gMovementActionFuncs_StopLevitate, // MOVEMENT_ACTION_STOP_LEVITATE + gMovementActionFuncs_DestroyExtraTaskIfAtTop, // MOVEMENT_ACTION_DESTROY_EXTRA_TASK_IF_AT_TOP + gMovementActionFuncs_Figure8, // MOVEMENT_ACTION_FIGURE_8 + gMovementActionFuncs_FlyUp, // MOVEMENT_ACTION_FLY_UP + gMovementActionFuncs_FlyDown, // MOVEMENT_ACTION_FLY_DOWN +}; + +u8 (*const gMovementActionFuncs_FaceDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_FaceDown_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_FaceUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_FaceUp_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_FaceLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_FaceLeft_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_FaceRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_FaceRight_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gUnknown_0850DEE8[])(u8) = { + GetMoveDirectionAnimNum, + GetMoveDirectionFastAnimNum, + GetMoveDirectionFastAnimNum, + GetMoveDirectionFasterAnimNum, + GetMoveDirectionFastestAnimNum, +}; + +u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowDiagonalUpLeft_Step0, + MovementAction_WalkSlowDiagonalUpLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowDiagonalUpRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowDiagonalUpRight_Step0, + MovementAction_WalkSlowDiagonalUpRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowDiagonalDownLeft_Step0, + MovementAction_WalkSlowDiagonalDownLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowDiagonalDownRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowDiagonalDownRight_Step0, + MovementAction_WalkSlowDiagonalDownRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowDown_Step0, + MovementAction_WalkSlowDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowUp_Step0, + MovementAction_WalkSlowUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowLeft_Step0, + MovementAction_WalkSlowLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkSlowRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkSlowRight_Step0, + MovementAction_WalkSlowRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalDiagonalUpLeft_Step0, + MovementAction_WalkNormalDiagonalUpLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalDiagonalUpRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalDiagonalUpRight_Step0, + MovementAction_WalkNormalDiagonalUpRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalDiagonalDownLeft_Step0, + MovementAction_WalkNormalDiagonalDownLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalDiagonalDownRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalDiagonalDownRight_Step0, + MovementAction_WalkNormalDiagonalDownRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalDown_Step0, + MovementAction_WalkNormalDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalUp_Step0, + MovementAction_WalkNormalUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalLeft_Step0, + MovementAction_WalkNormalLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkNormalRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkNormalRight_Step0, + MovementAction_WalkNormalRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +const s16 gUnknown_0850DFBC[] = {0, 1, 1}; +const s16 gUnknown_0850DFC2[] = {0, 0, 1}; + +u8 (*const gMovementActionFuncs_Jump2Down[])(struct EventObject *, struct Sprite *) = { + MovementAction_Jump2Down_Step0, + MovementAction_Jump2Down_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_Jump2Up[])(struct EventObject *, struct Sprite *) = { + MovementAction_Jump2Up_Step0, + MovementAction_Jump2Up_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_Jump2Left[])(struct EventObject *, struct Sprite *) = { + MovementAction_Jump2Left_Step0, + MovementAction_Jump2Left_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_Jump2Right[])(struct EventObject *, struct Sprite *) = { + MovementAction_Jump2Right_Step0, + MovementAction_Jump2Right_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_Delay1[])(struct EventObject *, struct Sprite *) = { + MovementAction_Delay1_Step0, + MovementAction_Delay_Step1, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_Delay2[])(struct EventObject *, struct Sprite *) = { + MovementAction_Delay2_Step0, + MovementAction_Delay_Step1, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_Delay4[])(struct EventObject *, struct Sprite *) = { + MovementAction_Delay4_Step0, + MovementAction_Delay_Step1, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_Delay8[])(struct EventObject *, struct Sprite *) = { + MovementAction_Delay8_Step0, + MovementAction_Delay_Step1, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_Delay16[])(struct EventObject *, struct Sprite *) = { + MovementAction_Delay16_Step0, + MovementAction_Delay_Step1, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_WalkFastDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastDown_Step0, + MovementAction_WalkFastDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastUp_Step0, + MovementAction_WalkFastUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastLeft_Step0, + MovementAction_WalkFastLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastRight_Step0, + MovementAction_WalkFastRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceSlowDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceSlowDown_Step0, + MovementAction_WalkInPlaceSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceSlowUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceSlowUp_Step0, + MovementAction_WalkInPlaceSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceSlowLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceSlowLeft_Step0, + MovementAction_WalkInPlaceSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceSlowRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceSlowRight_Step0, + MovementAction_WalkInPlaceSlow_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceNormalDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceNormalDown_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceNormalUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceNormalUp_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceNormalLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceNormalLeft_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceNormalRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceNormalRight_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastDown_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastUp_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastLeft_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastRight_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastestDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastestDown_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastestUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastestUp_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastestLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastestLeft_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkInPlaceFastestRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkInPlaceFastestRight_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RideWaterCurrentDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_RideWaterCurrentDown_Step0, + MovementAction_RideWaterCurrentDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RideWaterCurrentUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_RideWaterCurrentUp_Step0, + MovementAction_RideWaterCurrentUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RideWaterCurrentLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_RideWaterCurrentLeft_Step0, + MovementAction_RideWaterCurrentLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_RideWaterCurrentRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_RideWaterCurrentRight_Step0, + MovementAction_RideWaterCurrentRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastestDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastestDown_Step0, + MovementAction_WalkFastestDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastestUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastestUp_Step0, + MovementAction_WalkFastestUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastestLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastestLeft_Step0, + MovementAction_WalkFastestLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkFastestRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkFastestRight_Step0, + MovementAction_WalkFastestRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_SlideDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_SlideDown_Step0, + MovementAction_SlideDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_SlideUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_SlideUp_Step0, + MovementAction_SlideUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_SlideLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_SlideLeft_Step0, + MovementAction_SlideLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_SlideRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_SlideRight_Step0, + MovementAction_SlideRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_PlayerRunDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_PlayerRunDown_Step0, + MovementAction_PlayerRunDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_PlayerRunUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_PlayerRunUp_Step0, + MovementAction_PlayerRunUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_PlayerRunLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_PlayerRunLeft_Step0, + MovementAction_PlayerRunLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_PlayerRunRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_PlayerRunRight_Step0, + MovementAction_PlayerRunRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_StartAnimInDirection[])(struct EventObject *, struct Sprite *) = { + MovementAction_StartAnimInDirection_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpSpecialDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpSpecialDown_Step0, + MovementAction_JumpSpecialDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpSpecialUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpSpecialUp_Step0, + MovementAction_JumpSpecialUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpSpecialLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpSpecialLeft_Step0, + MovementAction_JumpSpecialLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpSpecialRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpSpecialRight_Step0, + MovementAction_JumpSpecialRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_FacePlayer[])(struct EventObject *, struct Sprite *) = { + MovementAction_FacePlayer_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_FaceAwayPlayer[])(struct EventObject *, struct Sprite *) = { + MovementAction_FaceAwayPlayer_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_LockFacingDirection[])(struct EventObject *, struct Sprite *) = { + MovementAction_LockFacingDirection_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_UnlockFacingDirection[])(struct EventObject *, struct Sprite *) = { + MovementAction_UnlockFacingDirection_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpDown_Step0, + MovementAction_JumpDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpUp_Step0, + MovementAction_JumpUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpLeft_Step0, + MovementAction_JumpLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpRight_Step0, + MovementAction_JumpRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceDown_Step0, + MovementAction_JumpInPlaceDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceUp_Step0, + MovementAction_JumpInPlaceUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceLeft_Step0, + MovementAction_JumpInPlaceLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceRight_Step0, + MovementAction_JumpInPlaceRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceDownUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceDownUp_Step0, + MovementAction_JumpInPlaceDownUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceUpDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceUpDown_Step0, + MovementAction_JumpInPlaceUpDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceLeftRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceLeftRight_Step0, + MovementAction_JumpInPlaceLeftRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_JumpInPlaceRightLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_JumpInPlaceRightLeft_Step0, + MovementAction_JumpInPlaceRightLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_FaceOriginalDirection[])(struct EventObject *, struct Sprite *) = { + MovementAction_FaceOriginalDirection_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_NurseJoyBowDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_NurseJoyBowDown_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_EnableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *) = { + MovementAction_EnableJumpLandingGroundEffect_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_DisableJumpLandingGroundEffect[])(struct EventObject *, struct Sprite *) = { + MovementAction_DisableJumpLandingGroundEffect_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_DisableAnimation[])(struct EventObject *, struct Sprite *) = { + MovementAction_DisableAnimation_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_RestoreAnimation[])(struct EventObject *, struct Sprite *) = { + MovementAction_RestoreAnimation_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_SetInvisible[])(struct EventObject *, struct Sprite *) = { + MovementAction_SetInvisible_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_SetVisible[])(struct EventObject *, struct Sprite *) = { + MovementAction_SetVisible_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_EmoteExclamationMark[])(struct EventObject *, struct Sprite *) = { + MovementAction_EmoteExclamationMark_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_EmoteQuestionMark[])(struct EventObject *, struct Sprite *) = { + MovementAction_EmoteQuestionMark_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_EmoteHeart[])(struct EventObject *, struct Sprite *) = { + MovementAction_EmoteHeart_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_RevealTrainer[])(struct EventObject *, struct Sprite *) = { + MovementAction_RevealTrainer_Step0, + MovementAction_RevealTrainer_Step1, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_RockSmashBreak[])(struct EventObject *, struct Sprite *) = { + MovementAction_RockSmashBreak_Step0, + MovementAction_RockSmashBreak_Step1, + MovementAction_RockSmashBreak_Step2, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_CutTree[])(struct EventObject *, struct Sprite *) = { + MovementAction_CutTree_Step0, + MovementAction_CutTree_Step1, + MovementAction_CutTree_Step2, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_SetFixedPriority[])(struct EventObject *, struct Sprite *) = { + MovementAction_SetFixedPriority_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_ClearFixedPriority[])(struct EventObject *, struct Sprite *) = { + MovementAction_ClearFixedPriority_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_InitAffineAnim[])(struct EventObject *, struct Sprite *) = { + MovementAction_InitAffineAnim_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_ClearAffineAnim[])(struct EventObject *, struct Sprite *) = { + MovementAction_ClearAffineAnim_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_Unknown1[])(struct EventObject *, struct Sprite *) = { + MovementAction_Unknown1_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_Unknown2[])(struct EventObject *, struct Sprite *) = { + MovementAction_Unknown2_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_WalkDownStartAffine[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkDownStartAffine_Step0, + MovementAction_WalkDownStartAffine_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkDownAffine[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkDownAffine_Step0, + MovementAction_WalkDownAffine_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkLeftAffine[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkLeftAffine_Step0, + MovementAction_WalkLeftAffine_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_WalkRightAffine[])(struct EventObject *, struct Sprite *) = { + MovementAction_WalkRightAffine_Step0, + MovementAction_WalkRightAffine_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieFaceDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieFaceDown_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieFaceUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieFaceUp_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieFaceLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieFaceLeft_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieFaceRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieFaceRight_Step0, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieDown_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieUp_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieLeft_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieRight_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieFaceDown_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieFaceUp_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieFaceLeft_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieFaceRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieFaceRight_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroUnusedAcroActionDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_UnusedAcroActionDown_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroUnusedAcroActionUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_UnusedAcroActionUp_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroUnusedAcroActionLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_UnusedAcroActionLeft_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroUnusedAcroActionRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_UnusedAcroActionRight_Step0, + MovementAction_WaitSpriteAnim, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_Figure8[])(struct EventObject *, struct Sprite *) = { + MovementAction_Figure8_Step0, + MovementAction_Figure8_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopFaceDown_Step0, + MovementAction_AcroWheelieHopFaceDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopFaceUp_Step0, + MovementAction_AcroWheelieHopFaceUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopFaceLeft_Step0, + MovementAction_AcroWheelieHopFaceLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopFaceRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopFaceRight_Step0, + MovementAction_AcroWheelieHopFaceRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopDown_Step0, + MovementAction_AcroWheelieHopDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopUp_Step0, + MovementAction_AcroWheelieHopUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopLeft_Step0, + MovementAction_AcroWheelieHopLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieHopRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieHopRight_Step0, + MovementAction_AcroWheelieHopRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieJumpDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieJumpDown_Step0, + MovementAction_AcroWheelieJumpDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieJumpUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieJumpUp_Step0, + MovementAction_AcroWheelieJumpUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieJumpLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieJumpLeft_Step0, + MovementAction_AcroWheelieJumpLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieJumpRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieJumpRight_Step0, + MovementAction_AcroWheelieJumpRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieInPlaceDown_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieInPlaceUp_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieInPlaceLeft_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieInPlaceRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieInPlaceRight_Step0, + MovementAction_WalkInPlace_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieMoveDown_Step0, + MovementAction_AcroPopWheelieMoveDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieMoveUp_Step0, + MovementAction_AcroPopWheelieMoveUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieMoveLeft_Step0, + MovementAction_AcroPopWheelieMoveLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroPopWheelieMoveRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroPopWheelieMoveRight_Step0, + MovementAction_AcroPopWheelieMoveRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieMoveDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieMoveDown_Step0, + MovementAction_AcroWheelieMoveDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieMoveUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieMoveUp_Step0, + MovementAction_AcroWheelieMoveUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieMoveLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieMoveLeft_Step0, + MovementAction_AcroWheelieMoveLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroWheelieMoveRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroWheelieMoveRight_Step0, + MovementAction_AcroWheelieMoveRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieMoveDown_Step0, + MovementAction_AcroEndWheelieMoveDown_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieMoveUp_Step0, + MovementAction_AcroEndWheelieMoveUp_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveLeft[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieMoveLeft_Step0, + MovementAction_AcroEndWheelieMoveLeft_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_AcroEndWheelieMoveRight[])(struct EventObject *, struct Sprite *) = { + MovementAction_AcroEndWheelieMoveRight_Step0, + MovementAction_AcroEndWheelieMoveRight_Step1, + MovementAction_PauseSpriteAnim, +}; + +u8 (*const gMovementActionFuncs_Levitate[])(struct EventObject *, struct Sprite *) = { + MovementAction_Levitate_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_StopLevitate[])(struct EventObject *, struct Sprite *) = { + MovementAction_StopLevitate_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_DestroyExtraTaskIfAtTop[])(struct EventObject *, struct Sprite *) = { + MovementAction_DestroyExtraTaskIfAtTop_Step0, + MovementAction_Finish, +}; + +#endif //GUARD_MOVEMENT_ACTION_FUNC_TABLES_H diff --git a/src/data/field_event_obj/movement_type_func_tables.h b/src/data/field_event_obj/movement_type_func_tables.h new file mode 100755 index 000000000..165e96220 --- /dev/null +++ b/src/data/field_event_obj/movement_type_func_tables.h @@ -0,0 +1,443 @@ +#ifndef GUARD_MOVEMENT_TYPE_FUNC_TABLES_H +#define GUARD_MOVEMENT_TYPE_FUNC_TABLES_H + +u8 (*const gMovementTypeFuncs_WanderAround[])(struct EventObject *, struct Sprite *) = { + MovementType_WanderAround_Step0, + MovementType_WanderAround_Step1, + MovementType_WanderAround_Step2, + MovementType_WanderAround_Step3, + MovementType_WanderAround_Step4, + MovementType_WanderAround_Step5, + MovementType_WanderAround_Step6, +}; + +const u8 gStandardDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST}; + +u8 (*const gGetVectorDirectionFuncs[])(s16, s16, s16, s16) = { + GetVectorDirection, + GetLimitedVectorDirection_SouthNorth, + GetLimitedVectorDirection_WestEast, + GetLimitedVectorDirection_WestNorth, + GetLimitedVectorDirection_EastNorth, + GetLimitedVectorDirection_WestSouth, + GetLimitedVectorDirection_EastSouth, + GetLimitedVectorDirection_SouthNorthWest, + GetLimitedVectorDirection_SouthNorthEast, + GetLimitedVectorDirection_NorthWestEast, + GetLimitedVectorDirection_SouthWestEast, +}; + +u8 (*const gMovementTypeFuncs_LookAround[])(struct EventObject *, struct Sprite *) = { + MovementType_LookAround_Step0, + MovementType_LookAround_Step1, + MovementType_LookAround_Step2, + MovementType_LookAround_Step3, + MovementType_LookAround_Step4, +}; + +u8 (*const gMovementTypeFuncs_WanderUpAndDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WanderUpAndDown_Step0, + MovementType_WanderUpAndDown_Step1, + MovementType_WanderUpAndDown_Step2, + MovementType_WanderUpAndDown_Step3, + MovementType_WanderUpAndDown_Step4, + MovementType_WanderUpAndDown_Step5, + MovementType_WanderUpAndDown_Step6, +}; + +const u8 gUpAndDownDirections[] = {DIR_SOUTH, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_WanderLeftAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WanderLeftAndRight_Step0, + MovementType_WanderLeftAndRight_Step1, + MovementType_WanderLeftAndRight_Step2, + MovementType_WanderLeftAndRight_Step3, + MovementType_WanderLeftAndRight_Step4, + MovementType_WanderLeftAndRight_Step5, + MovementType_WanderLeftAndRight_Step6, +}; + +const u8 gLeftAndRightDirections[] = {DIR_WEST, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_FaceDirection[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDirection_Step0, + MovementType_FaceDirection_Step1, + MovementType_FaceDirection_Step2, +}; + +u8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct EventObject *, struct Sprite *) = { + MovementType_BerryTreeGrowth_Step0, + MovementType_BerryTreeGrowth_Step1, + MovementType_BerryTreeGrowth_Step2, + MovementType_BerryTreeGrowth_Step3, + MovementType_BerryTreeGrowth_Step4, +}; + +u8 (*const gMovementTypeFuncs_FaceDownAndUp[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDownAndUp_Step0, + MovementType_FaceDownAndUp_Step1, + MovementType_FaceDownAndUp_Step2, + MovementType_FaceDownAndUp_Step3, + MovementType_FaceDownAndUp_Step4, +}; + +u8 (*const gMovementTypeFuncs_FaceLeftAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceLeftAndRight_Step0, + MovementType_FaceLeftAndRight_Step1, + MovementType_FaceLeftAndRight_Step2, + MovementType_FaceLeftAndRight_Step3, + MovementType_FaceLeftAndRight_Step4, +}; + +u8 (*const gMovementTypeFuncs_FaceUpAndLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceUpAndLeft_Step0, + MovementType_FaceUpAndLeft_Step1, + MovementType_FaceUpAndLeft_Step2, + MovementType_FaceUpAndLeft_Step3, + MovementType_FaceUpAndLeft_Step4, +}; + +const u8 gUpAndLeftDirections[] = {DIR_NORTH, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_FaceUpAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceUpAndRight_Step0, + MovementType_FaceUpAndRight_Step1, + MovementType_FaceUpAndRight_Step2, + MovementType_FaceUpAndRight_Step3, + MovementType_FaceUpAndRight_Step4, +}; + +const u8 gUpAndRightDirections[] = {DIR_NORTH, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_FaceDownAndLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDownAndLeft_Step0, + MovementType_FaceDownAndLeft_Step1, + MovementType_FaceDownAndLeft_Step2, + MovementType_FaceDownAndLeft_Step3, + MovementType_FaceDownAndLeft_Step4, +}; + +const u8 gDownAndLeftDirections[] = {DIR_SOUTH, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_FaceDownAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDownAndRight_Step0, + MovementType_FaceDownAndRight_Step1, + MovementType_FaceDownAndRight_Step2, + MovementType_FaceDownAndRight_Step3, + MovementType_FaceDownAndRight_Step4, +}; + +const u8 gDownAndRightDirections[] = {DIR_SOUTH, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_FaceDownUpAndLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDownUpAndLeft_Step0, + MovementType_FaceDownUpAndLeft_Step1, + MovementType_FaceDownUpAndLeft_Step2, + MovementType_FaceDownUpAndLeft_Step3, + MovementType_FaceDownUpAndLeft_Step4, +}; + +const u8 gDownUpAndLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_FaceDownUpAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDownUpAndRight_Step0, + MovementType_FaceDownUpAndRight_Step1, + MovementType_FaceDownUpAndRight_Step2, + MovementType_FaceDownUpAndRight_Step3, + MovementType_FaceDownUpAndRight_Step4, +}; + +const u8 gDownUpAndRightDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_FaceUpLeftAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceUpLeftAndRight_Step0, + MovementType_FaceUpLeftAndRight_Step1, + MovementType_FaceUpLeftAndRight_Step2, + MovementType_FaceUpLeftAndRight_Step3, + MovementType_FaceUpLeftAndRight_Step4, +}; + +const u8 gUpLeftAndRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_FaceDownLeftAndRight[])(struct EventObject *, struct Sprite *) = { + MovementType_FaceDownLeftAndRight_Step0, + MovementType_FaceDownLeftAndRight_Step1, + MovementType_FaceDownLeftAndRight_Step2, + MovementType_FaceDownLeftAndRight_Step3, + MovementType_FaceDownLeftAndRight_Step4, +}; + +const u8 gDownLeftAndRightDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_RotateCounterclockwise[])(struct EventObject *, struct Sprite *) = { + MovementType_RotateCounterclockwise_Step0, + MovementType_RotateCounterclockwise_Step1, + MovementType_RotateCounterclockwise_Step2, + MovementType_RotateCounterclockwise_Step3, +}; + +const u8 gCounterclockwiseDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_RotateClockwise[])(struct EventObject *, struct Sprite *) = { + MovementType_RotateClockwise_Step0, + MovementType_RotateClockwise_Step1, + MovementType_RotateClockwise_Step2, + MovementType_RotateClockwise_Step3, +}; + +const u8 gClockwiseDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkBackAndForth[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkBackAndForth_Step0, + MovementType_WalkBackAndForth_Step1, + MovementType_WalkBackAndForth_Step2, + MovementType_WalkBackAndForth_Step3, +}; + +u8 (*const gMovementTypeFuncs_WalkSequenceUpRightLeftDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceUpRightLeftDown_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gUpRightLeftDownDirections[] = {DIR_NORTH, DIR_EAST, DIR_WEST, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceRightLeftDownUp[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceRightLeftDownUp_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gRightLeftDownUpDirections[] = {DIR_EAST, DIR_WEST, DIR_SOUTH, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceDownUpRightLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceDownUpRightLeft_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gDownUpRightLeftDirections[] = {DIR_SOUTH, DIR_NORTH, DIR_EAST, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceLeftDownUpRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceLeftDownUpRight_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gLeftDownUpRightDirections[] = {DIR_WEST, DIR_SOUTH, DIR_NORTH, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceUpLeftRightDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceUpLeftRightDown_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gUpLeftRightDownDirections[] = {DIR_NORTH, DIR_WEST, DIR_EAST, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceLeftRightDownUp[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceLeftRightDownUp_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gLeftRightDownUpDirections[] = {DIR_WEST, DIR_EAST, DIR_SOUTH, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceDownUpLeftRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceDownUpLeftRight_Step1, + MovementType_WalkSequence_Step2, +}; + +u8 (*const gMovementTypeFuncs_WalkSequenceRightDownUpLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceRightDownUpLeft_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gRightDownUpLeftDirections[] = {DIR_EAST, DIR_SOUTH, DIR_NORTH, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceLeftUpDownRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceLeftUpDownRight_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gLeftUpDownRightDirections[] = {DIR_WEST, DIR_NORTH, DIR_SOUTH, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceUpDownRightLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceUpDownRightLeft_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gUpDownRightLeftDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_EAST, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceRightLeftUpDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceRightLeftUpDown_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gRightLeftUpDownDirections[] = {DIR_EAST, DIR_WEST, DIR_NORTH, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceDownRightLeftUp[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceDownRightLeftUp_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gDownRightLeftUpDirections[] = {DIR_SOUTH, DIR_EAST, DIR_WEST, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceRightUpDownLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceRightUpDownLeft_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gRightUpDownLeftDirections[] = {DIR_EAST, DIR_NORTH, DIR_SOUTH, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceUpDownLeftRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceUpDownLeftRight_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gUpDownLeftRightDirections[] = {DIR_NORTH, DIR_SOUTH, DIR_WEST, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceLeftRightUpDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceLeftRightUpDown_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gLeftRightUpDownDirections[] = {DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceDownLeftRightUp[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceDownLeftRightUp_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gDownLeftRightUpDirections[] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceUpLeftDownRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceUpLeftDownRight_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gUpLeftDownRightDirections[] = {DIR_NORTH, DIR_WEST, DIR_SOUTH, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceDownRightUpLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceDownRightUpLeft_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gDownRightUpLeftDirections[] = {DIR_SOUTH, DIR_EAST, DIR_NORTH, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceLeftDownRightUp[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceLeftDownRightUp_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gLeftDownRightUpDirections[] = {DIR_WEST, DIR_SOUTH, DIR_EAST, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceRightUpLeftDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceRightUpLeftDown_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gRightUpLeftDownDirections[] = {DIR_EAST, DIR_NORTH, DIR_WEST, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceUpRightDownLeft[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceUpRightDownLeft_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gUpRightDownLeftDirections[] = {DIR_NORTH, DIR_EAST, DIR_SOUTH, DIR_WEST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceDownLeftUpRight[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceDownLeftUpRight_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gDownLeftUpRightDirections[] = {DIR_SOUTH, DIR_WEST, DIR_NORTH, DIR_EAST}; + +u8 (*const gMovementTypeFuncs_WalkSequenceLeftUpRightDown[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceLeftUpRightDown_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gLeftUpRightDownDirections[] = {DIR_WEST, DIR_NORTH, DIR_EAST, DIR_SOUTH}; + +u8 (*const gMovementTypeFuncs_WalkSequenceRightDownLeftUp[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSequence_Step0, + MovementType_WalkSequenceRightDownLeftUp_Step1, + MovementType_WalkSequence_Step2, +}; + +const u8 gRightDownLeftUpDirections[] = {DIR_EAST, DIR_SOUTH, DIR_WEST, DIR_NORTH}; + +u8 (*const gMovementTypeFuncs_CopyPlayer[])(struct EventObject *, struct Sprite *) = { + MovementType_CopyPlayer_Step0, + MovementType_CopyPlayer_Step1, + MovementType_CopyPlayer_Step2, +}; + +bool8 (*const gCopyPlayerMovementFuncs[])(struct EventObject *, struct Sprite *, u8, bool8(u8)) = { + CopyablePlayerMovement_None, + CopyablePlayerMovement_FaceDirection, + CopyablePlayerMovement_GoSpeed0, + CopyablePlayerMovement_GoSpeed1, + CopyablePlayerMovement_GoSpeed2, + CopyablePlayerMovement_Slide, + cph_IM_DIFFERENT, + CopyablePlayerMovement_GoSpeed4, + CopyablePlayerMovement_Jump, + CopyablePlayerMovement_None, + CopyablePlayerMovement_None, +}; + +u8 (*const gMovementTypeFuncs_CopyPlayerInGrass[])(struct EventObject *, struct Sprite *) = { + MovementType_CopyPlayer_Step0, + MovementType_CopyPlayerInGrass_Step1, + MovementType_CopyPlayer_Step2, +}; + +u8 (*const gMovementTypeFuncs_Hidden[])(struct EventObject *, struct Sprite *) = { + MovementType_Hidden_Step0, +}; + +u8 (*const gMovementTypeFuncs_WalkInPlace[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkInPlace_Step0, + MovementType_MoveInPlace_Step1, +}; + +u8 (*const gMovementTypeFuncs_WalkSlowlyInPlace[])(struct EventObject *, struct Sprite *) = { + MovementType_WalkSlowlyInPlace_Step0, + MovementType_MoveInPlace_Step1, +}; + +u8 (*const gMovementTypeFuncs_JogInPlace[])(struct EventObject *, struct Sprite *) = { + MovementType_JogInPlace_Step0, + MovementType_MoveInPlace_Step1, +}; + +u8 (*const gMovementTypeFuncs_RunInPlace[])(struct EventObject *, struct Sprite *) = { + MovementType_RunInPlace_Step0, + MovementType_MoveInPlace_Step1, +}; + +u8 (*const gMovementTypeFuncs_Invisible[])(struct EventObject *, struct Sprite *) = { + MovementType_Invisible_Step0, + MovementType_Invisible_Step1, + MovementType_Invisible_Step2, +}; + +#endif //GUARD_MOVEMENT_TYPE_FUNC_TABLES_H diff --git a/src/data/heal_locations.h b/src/data/heal_locations.h new file mode 100644 index 000000000..613bcebe8 --- /dev/null +++ b/src/data/heal_locations.h @@ -0,0 +1,25 @@ +static const struct HealLocation sHealLocations[] = +{ + {MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2}, + {MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2}, + {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 20, 17}, + {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 19, 20}, + {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 22, 6}, + {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 16, 39}, + {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 5, 7}, + {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 24, 15}, + {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 28, 17}, + {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 43, 32}, + {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 27, 49}, + {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 5, 9}, + {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 14, 9}, + {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 6, 17}, + {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 2, 11}, + {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 9, 7}, + {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 14, 8}, + {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 16, 4}, + {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 8, 16}, + {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 18, 6}, + {MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(SOUTHERN_ISLAND_EXTERIOR), 15, 20}, + {MAP_GROUP(BATTLE_FRONTIER_OUTSIDE_EAST), MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST), 3, 52}, +}; diff --git a/src/data/text/move_descriptions.h b/src/data/text/move_descriptions.h new file mode 100644 index 000000000..f8830c593 --- /dev/null +++ b/src/data/text/move_descriptions.h @@ -0,0 +1,714 @@ +static const u8 sNullMoveDescription[] = _(""); +static const u8 sPoundMoveDescription[] = _("Pounds the foe with\nforelegs or tail."); +static const u8 sKarateChopMoveDescription[] = _("A chopping attack with a\nhigh critical-hit ratio."); +static const u8 sDoubleSlapMoveDescription[] = _("Repeatedly slaps the foe\n2 to 5 times."); +static const u8 sCometPunchMoveDescription[] = _("Repeatedly punches the foe\n2 to 5 times."); +static const u8 sMegaPunchMoveDescription[] = _("A strong punch thrown with\nincredible power."); +static const u8 sPayDayMoveDescription[] = _("Throws coins at the foe.\nMoney is recovered after."); +static const u8 sFirePunchMoveDescription[] = _("A fiery punch that may burn\nthe foe."); +static const u8 sIcePunchMoveDescription[] = _("An icy punch that may\nfreeze the foe."); +static const u8 sThunderPunchMoveDescription[] = _("An electrified punch that\nmay paralyze the foe."); +static const u8 sScratchMoveDescription[] = _("Scratches the foe with\nsharp claws."); +static const u8 sViceGripMoveDescription[] = _("Grips the foe with large and\npowerful pincers."); +static const u8 sGuillotineMoveDescription[] = _("A powerful pincer attack\nthat may cause fainting."); +static const u8 sRazorWindMoveDescription[] = _("A 2-turn move that strikes\nthe foe on the 2nd turn."); +static const u8 sSwordsDanceMoveDescription[] = _("A fighting dance that\nsharply raises ATTACK."); +static const u8 sCutMoveDescription[] = _("Cuts the foe with sharp\nscythes, claws, etc."); +static const u8 sGustMoveDescription[] = _("Strikes the foe with a gust\nof wind whipped up by wings."); +static const u8 sWingAttackMoveDescription[] = _("Strikes the foe with wings\nspread wide."); +static const u8 sWhirlwindMoveDescription[] = _("Blows away the foe with\nwind and ends the battle."); +static const u8 sFlyMoveDescription[] = _("Flies up on the first turn,\nthen strikes the next turn."); +static const u8 sBindMoveDescription[] = _("Binds and squeezes the foe\nfor 2 to 5 turns."); +static const u8 sSlamMoveDescription[] = _("Slams the foe with a long\ntail, vine, etc."); +static const u8 sVineWhipMoveDescription[] = _("Strikes the foe with\nslender, whiplike vines."); +static const u8 sStompMoveDescription[] = _("Stomps the enemy with a big\nfoot. May cause flinching."); +static const u8 sDoubleKickMoveDescription[] = _("A double-kicking attack\nthat strikes the foe twice."); +static const u8 sMegaKickMoveDescription[] = _("An extremely powerful kick\nwith intense force."); +static const u8 sJumpKickMoveDescription[] = _("A strong jumping kick. May\nmiss and hurt the kicker."); +static const u8 sRollingKickMoveDescription[] = _("A fast kick delivered from\na rapid spin."); +static const u8 sSandAttackMoveDescription[] = _("Reduces the foe’s accuracy\nby hurling sand in its face."); +static const u8 sHeadbuttMoveDescription[] = _("A ramming attack that may\ncause flinching."); +static const u8 sHornAttackMoveDescription[] = _("Jabs the foe with sharp\nhorns."); +static const u8 sFuryAttackMoveDescription[] = _("Jabs the foe 2 to 5 times\nwith sharp horns, etc."); +static const u8 sHornDrillMoveDescription[] = _("A one-hit KO attack that\nuses a horn like a drill."); +static const u8 sTackleMoveDescription[] = _("Charges the foe with a full-\nbody tackle."); +static const u8 sBodySlamMoveDescription[] = _("A full-body slam that may\ncause paralysis."); +static const u8 sWrapMoveDescription[] = _("Wraps and squeezes the foe\n2 to 5 times with vines, etc."); +static const u8 sTakeDownMoveDescription[] = _("A reckless charge attack\nthat also hurts the user."); +static const u8 sThrashMoveDescription[] = _("A rampage of 2 to 3 turns\nthat confuses the user."); +static const u8 sDoubleEdgeMoveDescription[] = _("A life-risking tackle that\nalso hurts the user."); +static const u8 sTailWhipMoveDescription[] = _("Wags the tail to lower the\nfoe’s DEFENSE."); +static const u8 sPoisonStingMoveDescription[] = _("A toxic attack with barbs,\netc., that may poison."); +static const u8 sTwineedleMoveDescription[] = _("Stingers on the forelegs\njab the foe twice."); +static const u8 sPinMissileMoveDescription[] = _("Sharp pins are fired to\nstrike 2 to 5 times."); +static const u8 sLeerMoveDescription[] = _("Frightens the foe with a\nleer to lower DEFENSE."); +static const u8 sBiteMoveDescription[] = _("Bites with vicious fangs.\nMay cause flinching."); +static const u8 sGrowlMoveDescription[] = _("Growls cutely to reduce the\nfoe’s ATTACK."); +static const u8 sRoarMoveDescription[] = _("Makes the foe flee to end\nthe battle."); +static const u8 sSingMoveDescription[] = _("A soothing song lulls the\nfoe into a deep slumber."); +static const u8 sSupersonicMoveDescription[] = _("Emits bizarre sound waves\nthat may confuse the foe."); +static const u8 sSonicBoomMoveDescription[] = _("Launches shock waves that\nalways inflict 20 HP damage."); +static const u8 sDisableMoveDescription[] = _("Psychically disables one of\nthe foe’s moves."); +static const u8 sAcidMoveDescription[] = _("Sprays a hide-melting acid.\nMay lower DEFENSE."); +static const u8 sEmberMoveDescription[] = _("A weak fire attack that may\ninflict a burn."); +static const u8 sFlamethrowerMoveDescription[] = _("A powerful fire attack that\nmay inflict a burn."); +static const u8 sMistMoveDescription[] = _("Creates a mist that stops\nreduction of abilities."); +static const u8 sWaterGunMoveDescription[] = _("Squirts water to attack\nthe foe."); +static const u8 sHydroPumpMoveDescription[] = _("Blasts water at high power\nto strike the foe."); +static const u8 sSurfMoveDescription[] = _("Creates a huge wave, then\ncrashes it down on the foe."); +static const u8 sIceBeamMoveDescription[] = _("Blasts the foe with an icy\nbeam that may freeze it."); +static const u8 sBlizzardMoveDescription[] = _("Hits the foe with an icy\nstorm that may freeze it."); +static const u8 sPsybeamMoveDescription[] = _("Fires a peculiar ray that\nmay confuse the foe."); +static const u8 sBubbleBeamMoveDescription[] = _("Forcefully sprays bubbles\nthat may lower SPEED."); +static const u8 sAuroraBeamMoveDescription[] = _("Fires a rainbow-colored\nbeam that may lower ATTACK."); +static const u8 sHyperBeamMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); +static const u8 sPeckMoveDescription[] = _("Attacks the foe with a\njabbing beak, etc."); +static const u8 sDrillPeckMoveDescription[] = _("A corkscrewing attack with\nthe beak acting as a drill."); +static const u8 sSubmissionMoveDescription[] = _("A reckless body slam that\nalso hurts the user."); +static const u8 sLowKickMoveDescription[] = _("A kick that inflicts more\ndamage on heavier foes."); +static const u8 sCounterMoveDescription[] = _("Retaliates any physical hit\nwith double the power."); +static const u8 sSeismicTossMoveDescription[] = _("Inflicts damage identical\nto the user’s level."); +static const u8 sStrengthMoveDescription[] = _("Builds enormous power,\nthen slams the foe."); +static const u8 sAbsorbMoveDescription[] = _("An attack that absorbs\nhalf the damage inflicted."); +static const u8 sMegaDrainMoveDescription[] = _("An attack that absorbs\nhalf the damage inflicted."); +static const u8 sLeechSeedMoveDescription[] = _("Plants a seed on the foe to\nsteal HP on every turn."); +static const u8 sGrowthMoveDescription[] = _("Forces the body to grow\nand heightens SP. ATK."); +static const u8 sRazorLeafMoveDescription[] = _("Cuts the enemy with leaves.\nHigh critical-hit ratio."); +static const u8 sSolarBeamMoveDescription[] = _("Absorbs light in one turn,\nthen attacks next turn."); +static const u8 sPoisonPowderMoveDescription[] = _("Scatters a toxic powder\nthat may poison the foe."); +static const u8 sStunSporeMoveDescription[] = _("Scatters a powder that may\nparalyze the foe."); +static const u8 sSleepPowderMoveDescription[] = _("Scatters a powder that may\ncause the foe to sleep."); +static const u8 sPetalDanceMoveDescription[] = _("A rampage of 2 to 3 turns\nthat confuses the user."); +static const u8 sStringShotMoveDescription[] = _("Binds the foe with string\nto reduce its SPEED."); +static const u8 sDragonRageMoveDescription[] = _("Launches shock waves that\nalways inflict 40 HP damage."); +static const u8 sFireSpinMoveDescription[] = _("Traps the foe in a ring of\nfire for 2 to 5 turns."); +static const u8 sThunderShockMoveDescription[] = _("An electrical attack that\nmay paralyze the foe."); +static const u8 sThunderboltMoveDescription[] = _("A strong electrical attack\nthat may paralyze the foe."); +static const u8 sThunderWaveMoveDescription[] = _("A weak jolt of electricity\nthat paralyzes the foe."); +static const u8 sThunderMoveDescription[] = _("A lightning attack that may\ncause paralysis."); +static const u8 sRockThrowMoveDescription[] = _("Throws small rocks to\nstrike the foe."); +static const u8 sEarthquakeMoveDescription[] = _("A powerful quake, but has\nno effect on flying foes."); +static const u8 sFissureMoveDescription[] = _("A one-hit KO move that\ndrops the foe in a fissure."); +static const u8 sDigMoveDescription[] = _("Digs underground the first\nturn and strikes next turn."); +static const u8 sToxicMoveDescription[] = _("Poisons the foe with an\nintensifying toxin."); +static const u8 sConfusionMoveDescription[] = _("A psychic attack that may\ncause confusion."); +static const u8 sPsychicMoveDescription[] = _("A powerful psychic attack\nthat may lower SP. DEF."); +static const u8 sHypnosisMoveDescription[] = _("A hypnotizing move that\nmay induce sleep."); +static const u8 sMeditateMoveDescription[] = _("Meditates in a peaceful\nfashion to raise ATTACK."); +static const u8 sAgilityMoveDescription[] = _("Relaxes the body to sharply\nboost SPEED."); +static const u8 sQuickAttackMoveDescription[] = _("An extremely fast attack\nthat always strikes first."); +static const u8 sRageMoveDescription[] = _("Raises the user’s ATTACK\nevery time it is hit."); +static const u8 sTeleportMoveDescription[] = _("A psychic move for fleeing\nfrom battle instantly."); +static const u8 sNightShadeMoveDescription[] = _("Inflicts damage identical\nto the user’s level."); +static const u8 sMimicMoveDescription[] = _("Copies a move used by the\nfoe during one battle."); +static const u8 sScreechMoveDescription[] = _("Emits a screech to sharply\nreduce the foe’s DEFENSE."); +static const u8 sDoubleTeamMoveDescription[] = _("Creates illusory copies to\nraise evasiveness."); +static const u8 sRecoverMoveDescription[] = _("Recovers up to half the\nuser’s maximum HP."); +static const u8 sHardenMoveDescription[] = _("Stiffens the body’s \nmuscles to raise DEFENSE."); +static const u8 sMinimizeMoveDescription[] = _("Minimizes the user’s size\nto raise evasiveness."); +static const u8 sSmokescreenMoveDescription[] = _("Lowers the foe’s accuracy\nusing smoke, ink, etc."); +static const u8 sConfuseRayMoveDescription[] = _("A sinister ray that\nconfuses the foe."); +static const u8 sWithdrawMoveDescription[] = _("Withdraws the body into its\nhard shell to raise DEFENSE."); +static const u8 sDefenseCurlMoveDescription[] = _("Curls up to conceal weak\nspots and raise DEFENSE."); +static const u8 sBarrierMoveDescription[] = _("Creates a barrier that\nsharply raises DEFENSE."); +static const u8 sLightScreenMoveDescription[] = _("Creates a wall of light that\nlowers SP. ATK damage."); +static const u8 sHazeMoveDescription[] = _("Creates a black haze that\neliminates all stat changes."); +static const u8 sReflectMoveDescription[] = _("Creates a wall of light that\nweakens physical attacks."); +static const u8 sFocusEnergyMoveDescription[] = _("Focuses power to raise the\ncritical-hit ratio."); +static const u8 sBideMoveDescription[] = _("Endures attack for 2\nturns to retaliate double."); +static const u8 sMetronomeMoveDescription[] = _("Waggles a finger to use any\nPOKéMON move at random."); +static const u8 sMirrorMoveMoveDescription[] = _("Counters the foe’s attack\nwith the same move."); +static const u8 sSelfDestructMoveDescription[] = _("Inflicts severe damage but\nmakes the user faint."); +static const u8 sEggBombMoveDescription[] = _("An egg is forcibly hurled at\nthe foe."); +static const u8 sLickMoveDescription[] = _("Licks with a long tongue to\ninjure. May also paralyze."); +static const u8 sSmogMoveDescription[] = _("An exhaust-gas attack\nthat may also poison."); +static const u8 sSludgeMoveDescription[] = _("Sludge is hurled to inflict\ndamage. May also poison."); +static const u8 sBoneClubMoveDescription[] = _("Clubs the foe with a bone.\nMay cause flinching."); +static const u8 sFireBlastMoveDescription[] = _("Incinerates everything it\nstrikes. May cause a burn."); +static const u8 sWaterfallMoveDescription[] = _("Charges the foe with speed\nto climb waterfalls."); +static const u8 sClampMoveDescription[] = _("Traps and squeezes the\nfoe for 2 to 5 turns."); +static const u8 sSwiftMoveDescription[] = _("Sprays star-shaped rays\nthat never miss."); +static const u8 sSkullBashMoveDescription[] = _("Tucks in the head, then\nattacks on the next turn."); +static const u8 sSpikeCannonMoveDescription[] = _("Launches sharp spikes that\nstrike 2 to 5 times."); +static const u8 sConstrictMoveDescription[] = _("Constricts to inflict pain.\nMay lower SPEED."); +static const u8 sAmnesiaMoveDescription[] = _("Forgets about something\nand sharply raises SP. DEF."); +static const u8 sKinesisMoveDescription[] = _("Distracts the foe.\nMay lower accuracy."); +static const u8 sSoftBoiledMoveDescription[] = _("Recovers up to half the\nuser’s maximum HP."); +static const u8 sHiJumpKickMoveDescription[] = _("A jumping knee kick. If it\nmisses, the user is hurt."); +static const u8 sGlareMoveDescription[] = _("Intimidates and frightens\nthe foe into paralysis."); +static const u8 sDreamEaterMoveDescription[] = _("Takes one half the damage\ninflicted on a sleeping foe."); +static const u8 sPoisonGasMoveDescription[] = _("Envelops the foe in a toxic\ngas that may poison."); +static const u8 sBarrageMoveDescription[] = _("Hurls round objects at the\nfoe 2 to 5 times."); +static const u8 sLeechLifeMoveDescription[] = _("An attack that steals half\nthe damage inflicted."); +static const u8 sLovelyKissMoveDescription[] = _("Demands a kiss with a scary\nface that induces sleep."); +static const u8 sSkyAttackMoveDescription[] = _("Searches out weak spots,\nthen strikes the next turn."); +static const u8 sTransformMoveDescription[] = _("Alters the user’s cells to\nbecome a copy of the foe."); +static const u8 sBubbleMoveDescription[] = _("An attack using bubbles.\nMay lower the foe’s SPEED."); +static const u8 sDizzyPunchMoveDescription[] = _("A rhythmic punch that may\nconfuse the foe."); +static const u8 sSporeMoveDescription[] = _("Scatters a cloud of spores\nthat always induce sleep."); +static const u8 sFlashMoveDescription[] = _("Looses a powerful blast of\nlight that cuts accuracy."); +static const u8 sPsywaveMoveDescription[] = _("Attacks with a psychic\nwave of varying intensity."); +static const u8 sSplashMoveDescription[] = _("It’s just a splash...\nHas no effect whatsoever."); +static const u8 sAcidArmorMoveDescription[] = _("Liquifies the user’s body\nto sharply raise DEFENSE."); +static const u8 sCrabhammerMoveDescription[] = _("Hammers with a pincer. Has a\nhigh critical-hit ratio."); +static const u8 sExplosionMoveDescription[] = _("Inflicts severe damage but\nmakes the user faint."); +static const u8 sFurySwipesMoveDescription[] = _("Rakes the foe with sharp\nclaws, etc., 2 to 5 times."); +static const u8 sBonemerangMoveDescription[] = _("Throws a bone boomerang\nthat strikes twice."); +static const u8 sRestMoveDescription[] = _("The user sleeps for 2 turns,\nrestoring HP and status."); +static const u8 sRockSlideMoveDescription[] = _("Large boulders are hurled.\nMay cause flinching."); +static const u8 sHyperFangMoveDescription[] = _("Attacks with sharp fangs.\nMay cause flinching."); +static const u8 sSharpenMoveDescription[] = _("Reduces the polygon count\nand raises ATTACK."); +static const u8 sConversionMoveDescription[] = _("Changes the user’s type\ninto a known move’s type."); +static const u8 sTriAttackMoveDescription[] = _("Fires three types of beams\nat the same time."); +static const u8 sSuperFangMoveDescription[] = _("Attacks with sharp fangs\nand cuts half the foe’s HP."); +static const u8 sSlashMoveDescription[] = _("Slashes with claws, etc. Has\na high critical-hit ratio."); +static const u8 sSubstituteMoveDescription[] = _("Creates a decoy using 1/4\nof the user’s maximum HP."); +static const u8 sStruggleMoveDescription[] = _("Used only if all PP are gone.\nAlso hurts the user a little."); +static const u8 sSketchMoveDescription[] = _("Copies the foe’s last move\npermanently."); +static const u8 sTripleKickMoveDescription[] = _("Kicks the foe 3 times in a\nrow with rising intensity."); +static const u8 sThiefMoveDescription[] = _("While attacking, it may\nsteal the foe’s held item."); +static const u8 sSpiderWebMoveDescription[] = _("Ensnares the foe to stop it\nfrom fleeing or switching."); +static const u8 sMindReaderMoveDescription[] = _("Senses the foe’s action to\nensure the next move’s hit."); +static const u8 sNightmareMoveDescription[] = _("Inflicts 1/4 damage on a\nsleeping foe every turn."); +static const u8 sFlameWheelMoveDescription[] = _("A fiery charge attack that\nmay inflict a burn."); +static const u8 sSnoreMoveDescription[] = _("A loud attack that can be\nused only while asleep."); +static const u8 sCurseMoveDescription[] = _("A move that functions\ndifferently for GHOSTS."); +static const u8 sFlailMoveDescription[] = _("Inflicts more damage when\nthe user’s HP is down."); +static const u8 sConversion2MoveDescription[] = _("Makes the user resistant\nto the last attack’s type."); +static const u8 sAeroblastMoveDescription[] = _("Launches a vacuumed blast.\nHigh critical-hit ratio."); +static const u8 sCottonSporeMoveDescription[] = _("Spores cling to the foe,\nsharply reducing SPEED."); +static const u8 sReversalMoveDescription[] = _("Inflicts more damage when\nthe user’s HP is down."); +static const u8 sSpiteMoveDescription[] = _("Spitefully cuts the PP\nof the foe’s last move."); +static const u8 sPowderSnowMoveDescription[] = _("Blasts the foe with a snowy\ngust. May cause freezing."); +static const u8 sProtectMoveDescription[] = _("Evades attack, but may fail\nif used in succession."); +static const u8 sMachPunchMoveDescription[] = _("A punch is thrown at wicked\nspeed to strike first."); +static const u8 sScaryFaceMoveDescription[] = _("Frightens with a scary face\nto sharply reduce SPEED."); +static const u8 sFaintAttackMoveDescription[] = _("Draws the foe close, then\nstrikes without fail."); +static const u8 sSweetKissMoveDescription[] = _("Demands a kiss with a cute\nlook. May cause confusion."); +static const u8 sBellyDrumMoveDescription[] = _("Maximizes ATTACK while\nsacrificing HP."); +static const u8 sSludgeBombMoveDescription[] = _("Sludge is hurled to inflict\ndamage. May also poison."); +static const u8 sMudSlapMoveDescription[] = _("Hurls mud in the foe’s face\nto reduce its accuracy."); +static const u8 sOctazookaMoveDescription[] = _("Fires a lump of ink to\ndamage and cut accuracy."); +static const u8 sSpikesMoveDescription[] = _("Sets spikes that hurt a \nfoe switching in."); +static const u8 sZapCannonMoveDescription[] = _("Powerful and sure to cause\nparalysis, but inaccurate."); +static const u8 sForesightMoveDescription[] = _("Negates the foe’s efforts\nto heighten evasiveness."); +static const u8 sDestinyBondMoveDescription[] = _("If the user faints, the foe\nis also made to faint."); +static const u8 sPerishSongMoveDescription[] = _("Any POKéMON hearing this\nsong faints in 3 turns."); +static const u8 sIcyWindMoveDescription[] = _("A chilling attack that\nlowers the foe’s SPEED."); +static const u8 sDetectMoveDescription[] = _("Evades attack, but may fail\nif used in succession."); +static const u8 sBoneRushMoveDescription[] = _("Strikes the foe with a bone\nin hand 2 to 5 times."); +static const u8 sLockOnMoveDescription[] = _("Locks on to the foe to\nensure the next move hits."); +static const u8 sOutrageMoveDescription[] = _("A rampage of 2 to 3 turns\nthat confuses the user."); +static const u8 sSandstormMoveDescription[] = _("Causes a sandstorm that\nrages for several turns."); +static const u8 sGigaDrainMoveDescription[] = _("An attack that steals half\nthe damage inflicted."); +static const u8 sEndureMoveDescription[] = _("Endures any attack for\n1 turn, leaving at least 1HP."); +static const u8 sCharmMoveDescription[] = _("Charms the foe and sharply\nreduces its ATTACK."); +static const u8 sRolloutMoveDescription[] = _("An attack lasting 5 turns\nwith rising intensity."); +static const u8 sFalseSwipeMoveDescription[] = _("An attack that leaves the\nfoe with at least 1 HP."); +static const u8 sSwaggerMoveDescription[] = _("Confuses the foe, but also\nsharply raises ATTACK."); +static const u8 sMilkDrinkMoveDescription[] = _("Recovers up to half the\nuser’s maximum HP."); +static const u8 sSparkMoveDescription[] = _("An electrified tackle that\nmay paralyze the foe."); +static const u8 sFuryCutterMoveDescription[] = _("An attack that intensifies\non each successive hit."); +static const u8 sSteelWingMoveDescription[] = _("Strikes the foe with hard\nwings spread wide."); +static const u8 sMeanLookMoveDescription[] = _("Fixes the foe with a mean\nlook that prevents escape."); +static const u8 sAttractMoveDescription[] = _("Makes the opposite gender\nless likely to attack."); +static const u8 sSleepTalkMoveDescription[] = _("Uses an available move\nrandomly while asleep."); +static const u8 sHealBellMoveDescription[] = _("Chimes soothingly to heal\nall status abnormalities."); +static const u8 sReturnMoveDescription[] = _("An attack that increases\nin power with friendship."); +static const u8 sPresentMoveDescription[] = _("A gift in the form of a\nbomb. May restore HP."); +static const u8 sFrustrationMoveDescription[] = _("An attack that is stronger\nif the TRAINER is disliked."); +static const u8 sSafeguardMoveDescription[] = _("A mystical force prevents\nall status problems."); +static const u8 sPainSplitMoveDescription[] = _("Adds the user and foe’s HP,\nthen shares them equally."); +static const u8 sSacredFireMoveDescription[] = _("A mystical fire attack that\nmay inflict a burn."); +static const u8 sMagnitudeMoveDescription[] = _("A ground-shaking attack\nof random intensity."); +static const u8 sDynamicPunchMoveDescription[] = _("Powerful and sure to cause\nconfusion, but inaccurate."); +static const u8 sMegahornMoveDescription[] = _("A brutal ramming attack\nusing out-thrust horns."); +static const u8 sDragonBreathMoveDescription[] = _("Strikes the foe with an\nincredible blast of breath."); +static const u8 sBatonPassMoveDescription[] = _("Switches out the user while\nkeeping effects in play."); +static const u8 sEncoreMoveDescription[] = _("Makes the foe repeat its\nlast move over 2 to 6 turns."); +static const u8 sPursuitMoveDescription[] = _("Inflicts bad damage if used\non a foe switching out."); +static const u8 sRapidSpinMoveDescription[] = _("Spins the body at high\nspeed to strike the foe."); +static const u8 sSweetScentMoveDescription[] = _("Allures the foe to reduce\nevasiveness."); +static const u8 sIronTailMoveDescription[] = _("Attacks with a rock-hard\ntail. May lower DEFENSE."); +static const u8 sMetalClawMoveDescription[] = _("A claw attack that may\nraise the user’s ATTACK."); +static const u8 sVitalThrowMoveDescription[] = _("Makes the user’s move last,\nbut it never misses."); +static const u8 sMorningSunMoveDescription[] = _("Restores HP. The amount\nvaries with the weather."); +static const u8 sSynthesisMoveDescription[] = _("Restores HP. The amount\nvaries with the weather."); +static const u8 sMoonlightMoveDescription[] = _("Restores HP. The amount\nvaries with the weather."); +static const u8 sHiddenPowerMoveDescription[] = _("The effectiveness varies\nwith the user."); +static const u8 sCrossChopMoveDescription[] = _("A double-chopping attack.\nHigh critical-hit ratio."); +static const u8 sTwisterMoveDescription[] = _("Whips up a vicious twister\nto tear at the foe."); +static const u8 sRainDanceMoveDescription[] = _("Boosts the power of WATER-\ntype moves for 5 turns."); +static const u8 sSunnyDayMoveDescription[] = _("Boosts the power of FIRE-\ntype moves for 5 turns."); +static const u8 sCrunchMoveDescription[] = _("Crunches with sharp fangs.\nMay lower SP. DEF."); +static const u8 sMirrorCoatMoveDescription[] = _("Counters the foe’s special\nattack at double the power."); +static const u8 sPsychUpMoveDescription[] = _("Copies the foe’s effect(s)\nand gives to the user."); +static const u8 sExtremeSpeedMoveDescription[] = _("An extremely fast and\npowerful attack."); +static const u8 sAncientPowerMoveDescription[] = _("An attack that may raise\nall stats."); +static const u8 sShadowBallMoveDescription[] = _("Hurls a black blob that may\nlower the foe’s SP. DEF."); +static const u8 sFutureSightMoveDescription[] = _("Heightens inner power to\nstrike 2 turns later."); +static const u8 sRockSmashMoveDescription[] = _("A rock-crushing attack\nthat may lower DEFENSE."); +static const u8 sWhirlpoolMoveDescription[] = _("Traps and hurts the foe in\na whirlpool for 2 to 5 turns."); +static const u8 sBeatUpMoveDescription[] = _("Summons party POKéMON to\njoin in the attack."); +static const u8 sFakeOutMoveDescription[] = _("A 1st-turn, 1st-strike move\nthat causes flinching."); +static const u8 sUproarMoveDescription[] = _("Causes an uproar for 2 to 5\nturns and prevents sleep."); +static const u8 sStockpileMoveDescription[] = _("Charges up power for up to\n3 turns."); +static const u8 sSpitUpMoveDescription[] = _("Releases stockpiled power\n(the more the better)."); +static const u8 sSwallowMoveDescription[] = _("Absorbs stockpiled power\nand restores HP."); +static const u8 sHeatWaveMoveDescription[] = _("Exhales a hot breath on the\nfoe. May inflict a burn."); +static const u8 sHailMoveDescription[] = _("Summons a hailstorm that\nstrikes every turn."); +static const u8 sTormentMoveDescription[] = _("Torments the foe and stops\nsuccessive use of a move."); +static const u8 sFlatterMoveDescription[] = _("Confuses the foe, but\nraises its SP. ATK."); +static const u8 sWillOWispMoveDescription[] = _("Inflicts a burn on the foe\nwith intense fire."); +static const u8 sMementoMoveDescription[] = _("The user faints and lowers\nthe foe’s abilities."); +static const u8 sFacadeMoveDescription[] = _("Boosts ATTACK when burned,\nparalyzed, or poisoned."); +static const u8 sFocusPunchMoveDescription[] = _("A powerful loyalty attack.\nThe user flinches if hit."); +static const u8 sSmellingSaltMoveDescription[] = _("Powerful against paralyzed\nfoes, but also heals them."); +static const u8 sFollowMeMoveDescription[] = _("Draws attention to make\nfoes attack only the user."); +static const u8 sNaturePowerMoveDescription[] = _("The type of attack varies\ndepending on the location."); +static const u8 sChargeMoveDescription[] = _("Charges power to boost the\nelectric move used next."); +static const u8 sTauntMoveDescription[] = _("Taunts the foe into only\nusing attack moves."); +static const u8 sHelpingHandMoveDescription[] = _("Boosts the power of the\nrecipient’s moves."); +static const u8 sTrickMoveDescription[] = _("Tricks the foe into trading\nheld items."); +static const u8 sRolePlayMoveDescription[] = _("Mimics the target and\ncopies its special ability."); +static const u8 sWishMoveDescription[] = _("A wish that restores HP.\nIt takes time to work."); +static const u8 sAssistMoveDescription[] = _("Attacks randomly with one\nof the partner’s moves."); +static const u8 sIngrainMoveDescription[] = _("Lays roots that restore HP.\nThe user can’t switch out."); +static const u8 sSuperpowerMoveDescription[] = _("Boosts strength sharply,\nbut lowers abilities."); +static const u8 sMagicCoatMoveDescription[] = _("Reflects special effects\nback to the attacker."); +static const u8 sRecycleMoveDescription[] = _("Recycles a used item for\none more use."); +static const u8 sRevengeMoveDescription[] = _("An attack that gains power\nif injured by the foe."); +static const u8 sBrickBreakMoveDescription[] = _("Destroys barriers such as\nREFLECT and causes damage."); +static const u8 sYawnMoveDescription[] = _("Lulls the foe into yawning,\nthen sleeping next turn."); +static const u8 sKnockOffMoveDescription[] = _("Knocks down the foe’s held\nitem to prevent its use."); +static const u8 sEndeavorMoveDescription[] = _("Gains power if the user’s HP\nis lower than the foe’s HP."); +static const u8 sEruptionMoveDescription[] = _("The higher the user’s HP,\nthe more damage caused."); +static const u8 sSkillSwapMoveDescription[] = _("The user swaps special\nabilities with the target."); +static const u8 sImprisonMoveDescription[] = _("Prevents foes from using\nmoves known by the user."); +static const u8 sRefreshMoveDescription[] = _("Heals poisoning, paralysis,\nor a burn."); +static const u8 sGrudgeMoveDescription[] = _("If the user faints, deletes\nall PP of foe’s last move."); +static const u8 sSnatchMoveDescription[] = _("Steals the effects of the\nmove the target uses next."); +static const u8 sSecretPowerMoveDescription[] = _("An attack with effects\nthat vary by location."); +static const u8 sDiveMoveDescription[] = _("Dives underwater the first\nturn and strikes next turn."); +static const u8 sArmThrustMoveDescription[] = _("Straight-arm punches that\nstrike the foe 2 to 5 times."); +static const u8 sCamouflageMoveDescription[] = _("Alters the POKéMON’s type\ndepending on the location."); +static const u8 sTailGlowMoveDescription[] = _("Flashes a light that sharply\nraises SP. ATK."); +static const u8 sLusterPurgeMoveDescription[] = _("Attacks with a burst of\nlight. May lower SP. DEF."); +static const u8 sMistBallMoveDescription[] = _("Attacks with a flurry of\ndown. May lower SP. ATK."); +static const u8 sFeatherDanceMoveDescription[] = _("Envelops the foe with down\nto sharply reduce ATTACK."); +static const u8 sTeeterDanceMoveDescription[] = _("Confuses all POKéMON on\nthe scene."); +static const u8 sBlazeKickMoveDescription[] = _("A kick with a high critical-\nhit ratio. May cause a burn."); +static const u8 sMudSportMoveDescription[] = _("Covers the user in mud to\nraise electrical resistance."); +static const u8 sIceBallMoveDescription[] = _("A 5-turn attack that gains\npower on successive hits."); +static const u8 sNeedleArmMoveDescription[] = _("Attacks with thorny arms.\nMay cause flinching."); +static const u8 sSlackOffMoveDescription[] = _("Slacks off and restores\nhalf the maximum HP."); +static const u8 sHyperVoiceMoveDescription[] = _("A loud attack that uses\nsound waves to injure."); +static const u8 sPoisonFangMoveDescription[] = _("A sharp-fanged attack.\nMay badly poison the foe."); +static const u8 sCrushClawMoveDescription[] = _("Tears at the foe with sharp\nclaws. May lower DEFENSE."); +static const u8 sBlastBurnMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); +static const u8 sHydroCannonMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); +static const u8 sMeteorMashMoveDescription[] = _("Fires a meteor-like punch.\nMay raise ATTACK."); +static const u8 sAstonishMoveDescription[] = _("An attack that may shock\nthe foe into flinching."); +static const u8 sWeatherBallMoveDescription[] = _("The move’s type and power\nchange with the weather."); +static const u8 sAromatherapyMoveDescription[] = _("Heals all status problems\nwith a soothing scent."); +static const u8 sFakeTearsMoveDescription[] = _("Feigns crying to sharply\nlower the foe’s SP. DEF."); +static const u8 sAirCutterMoveDescription[] = _("Hacks with razorlike wind.\nHigh critical-hit ratio."); +static const u8 sOverheatMoveDescription[] = _("Allows a full-power attack,\nbut sharply lowers SP. ATK."); +static const u8 sOdorSleuthMoveDescription[] = _("Negates the foe’s efforts\nto heighten evasiveness."); +static const u8 sRockTombMoveDescription[] = _("Stops the foe from moving\nwith rocks and cuts SPEED."); +static const u8 sSilverWindMoveDescription[] = _("A powdery attack that may\nraise abilities."); +static const u8 sMetalSoundMoveDescription[] = _("Emits a horrible screech\nthat sharply lowers SP. DEF."); +static const u8 sGrassWhistleMoveDescription[] = _("Lulls the foe into sleep\nwith a pleasant melody."); +static const u8 sTickleMoveDescription[] = _("Makes the foe laugh to\nlower ATTACK and DEFENSE."); +static const u8 sCosmicPowerMoveDescription[] = _("Raises DEFENSE and SP. DEF\nwith a mystic power."); +static const u8 sWaterSpoutMoveDescription[] = _("Inflicts more damage if the\nuser’s HP is high."); +static const u8 sSignalBeamMoveDescription[] = _("A strange beam attack that\nmay confuse the foe."); +static const u8 sShadowPunchMoveDescription[] = _("An unavoidable punch that\nis thrown from shadows."); +static const u8 sExtrasensoryMoveDescription[] = _("Attacks with a peculiar\npower. May cause flinching."); +static const u8 sSkyUppercutMoveDescription[] = _("An uppercut thrown as if\nleaping into the sky."); +static const u8 sSandTombMoveDescription[] = _("Traps and hurts the foe in\nquicksand for 2 to 5 turns."); +static const u8 sSheerColdMoveDescription[] = _("A chilling attack that\ncauses fainting if it hits."); +static const u8 sMuddyWaterMoveDescription[] = _("Attacks with muddy water.\nMay lower accuracy."); +static const u8 sBulletSeedMoveDescription[] = _("Shoots 2 to 5 seeds in a row\nto strike the foe."); +static const u8 sAerialAceMoveDescription[] = _("An extremely speedy and\nunavoidable attack."); +static const u8 sIcicleSpearMoveDescription[] = _("Attacks the foe by firing\n2 to 5 icicles in a row."); +static const u8 sIronDefenseMoveDescription[] = _("Hardens the body’s surface\nto sharply raise DEFENSE."); +static const u8 sBlockMoveDescription[] = _("Blocks the foe’s way to\nprevent escape."); +static const u8 sHowlMoveDescription[] = _("Howls to raise the spirit\nand boosts ATTACK."); +static const u8 sDragonClawMoveDescription[] = _("Slashes the foe with sharp\nclaws."); +static const u8 sFrenzyPlantMoveDescription[] = _("Powerful, but leaves the\nuser immobile the next turn."); +static const u8 sBulkUpMoveDescription[] = _("Bulks up the body to boost\nboth ATTACK and DEFENSE."); +static const u8 sBounceMoveDescription[] = _("Bounces up, then down the\nnext turn. May paralyze."); +static const u8 sMudShotMoveDescription[] = _("Hurls mud at the foe and\nreduces SPEED."); +static const u8 sPoisonTailMoveDescription[] = _("Has a high critical-hit\nratio. May also poison."); +static const u8 sCovetMoveDescription[] = _("Cutely begs to obtain an\nitem held by the foe."); +static const u8 sVoltTackleMoveDescription[] = _("A life-risking tackle that\nslightly hurts the user."); +static const u8 sMagicalLeafMoveDescription[] = _("Attacks with a strange leaf\nthat cannot be evaded."); +static const u8 sWaterSportMoveDescription[] = _("The user becomes soaked to\nraise resistance to fire."); +static const u8 sCalmMindMoveDescription[] = _("Raises SP. ATK and SP. DEF\nby focusing the mind."); +static const u8 sLeafBladeMoveDescription[] = _("Slashes with a sharp leaf.\nHigh critical-hit ratio."); +static const u8 sDragonDanceMoveDescription[] = _("A mystical dance that ups\nATTACK and SPEED."); +static const u8 sRockBlastMoveDescription[] = _("Hurls boulders at the foe\n2 to 5 times in a row."); +static const u8 sShockWaveMoveDescription[] = _("A fast and unavoidable\nelectric attack."); +static const u8 sWaterPulseMoveDescription[] = _("Attacks with ultrasonic\nwaves. May confuse the foe."); +static const u8 sDoomDesireMoveDescription[] = _("Summons strong sunlight to\nattack 2 turns later."); +static const u8 sPsychoBoostMoveDescription[] = _("Allows a full-power attack,\nbut sharply lowers SP. ATK."); + +// MOVE_NONE is ignored in this table. Make sure to always subtract 1 before getting the right pointer. +const u8 *const gMoveDescriptionPointers[MOVES_COUNT - 1] = +{ + [MOVE_POUND - 1] = sPoundMoveDescription, + [MOVE_KARATE_CHOP - 1] = sKarateChopMoveDescription, + [MOVE_DOUBLE_SLAP - 1] = sDoubleSlapMoveDescription, + [MOVE_COMET_PUNCH - 1] = sCometPunchMoveDescription, + [MOVE_MEGA_PUNCH - 1] = sMegaPunchMoveDescription, + [MOVE_PAY_DAY - 1] = sPayDayMoveDescription, + [MOVE_FIRE_PUNCH - 1] = sFirePunchMoveDescription, + [MOVE_ICE_PUNCH - 1] = sIcePunchMoveDescription, + [MOVE_THUNDER_PUNCH - 1] = sThunderPunchMoveDescription, + [MOVE_SCRATCH - 1] = sScratchMoveDescription, + [MOVE_VICE_GRIP - 1] = sViceGripMoveDescription, + [MOVE_GUILLOTINE - 1] = sGuillotineMoveDescription, + [MOVE_RAZOR_WIND - 1] = sRazorWindMoveDescription, + [MOVE_SWORDS_DANCE - 1] = sSwordsDanceMoveDescription, + [MOVE_CUT - 1] = sCutMoveDescription, + [MOVE_GUST - 1] = sGustMoveDescription, + [MOVE_WING_ATTACK - 1] = sWingAttackMoveDescription, + [MOVE_WHIRLWIND - 1] = sWhirlwindMoveDescription, + [MOVE_FLY - 1] = sFlyMoveDescription, + [MOVE_BIND - 1] = sBindMoveDescription, + [MOVE_SLAM - 1] = sSlamMoveDescription, + [MOVE_VINE_WHIP - 1] = sVineWhipMoveDescription, + [MOVE_STOMP - 1] = sStompMoveDescription, + [MOVE_DOUBLE_KICK - 1] = sDoubleKickMoveDescription, + [MOVE_MEGA_KICK - 1] = sMegaKickMoveDescription, + [MOVE_JUMP_KICK - 1] = sJumpKickMoveDescription, + [MOVE_ROLLING_KICK - 1] = sRollingKickMoveDescription, + [MOVE_SAND_ATTACK - 1] = sSandAttackMoveDescription, + [MOVE_HEADBUTT - 1] = sHeadbuttMoveDescription, + [MOVE_HORN_ATTACK - 1] = sHornAttackMoveDescription, + [MOVE_FURY_ATTACK - 1] = sFuryAttackMoveDescription, + [MOVE_HORN_DRILL - 1] = sHornDrillMoveDescription, + [MOVE_TACKLE - 1] = sTackleMoveDescription, + [MOVE_BODY_SLAM - 1] = sBodySlamMoveDescription, + [MOVE_WRAP - 1] = sWrapMoveDescription, + [MOVE_TAKE_DOWN - 1] = sTakeDownMoveDescription, + [MOVE_THRASH - 1] = sThrashMoveDescription, + [MOVE_DOUBLE_EDGE - 1] = sDoubleEdgeMoveDescription, + [MOVE_TAIL_WHIP - 1] = sTailWhipMoveDescription, + [MOVE_POISON_STING - 1] = sPoisonStingMoveDescription, + [MOVE_TWINEEDLE - 1] = sTwineedleMoveDescription, + [MOVE_PIN_MISSILE - 1] = sPinMissileMoveDescription, + [MOVE_LEER - 1] = sLeerMoveDescription, + [MOVE_BITE - 1] = sBiteMoveDescription, + [MOVE_GROWL - 1] = sGrowlMoveDescription, + [MOVE_ROAR - 1] = sRoarMoveDescription, + [MOVE_SING - 1] = sSingMoveDescription, + [MOVE_SUPERSONIC - 1] = sSupersonicMoveDescription, + [MOVE_SONIC_BOOM - 1] = sSonicBoomMoveDescription, + [MOVE_DISABLE - 1] = sDisableMoveDescription, + [MOVE_ACID - 1] = sAcidMoveDescription, + [MOVE_EMBER - 1] = sEmberMoveDescription, + [MOVE_FLAMETHROWER - 1] = sFlamethrowerMoveDescription, + [MOVE_MIST - 1] = sMistMoveDescription, + [MOVE_WATER_GUN - 1] = sWaterGunMoveDescription, + [MOVE_HYDRO_PUMP - 1] = sHydroPumpMoveDescription, + [MOVE_SURF - 1] = sSurfMoveDescription, + [MOVE_ICE_BEAM - 1] = sIceBeamMoveDescription, + [MOVE_BLIZZARD - 1] = sBlizzardMoveDescription, + [MOVE_PSYBEAM - 1] = sPsybeamMoveDescription, + [MOVE_BUBBLE_BEAM - 1] = sBubbleBeamMoveDescription, + [MOVE_AURORA_BEAM - 1] = sAuroraBeamMoveDescription, + [MOVE_HYPER_BEAM - 1] = sHyperBeamMoveDescription, + [MOVE_PECK - 1] = sPeckMoveDescription, + [MOVE_DRILL_PECK - 1] = sDrillPeckMoveDescription, + [MOVE_SUBMISSION - 1] = sSubmissionMoveDescription, + [MOVE_LOW_KICK - 1] = sLowKickMoveDescription, + [MOVE_COUNTER - 1] = sCounterMoveDescription, + [MOVE_SEISMIC_TOSS - 1] = sSeismicTossMoveDescription, + [MOVE_STRENGTH - 1] = sStrengthMoveDescription, + [MOVE_ABSORB - 1] = sAbsorbMoveDescription, + [MOVE_MEGA_DRAIN - 1] = sMegaDrainMoveDescription, + [MOVE_LEECH_SEED - 1] = sLeechSeedMoveDescription, + [MOVE_GROWTH - 1] = sGrowthMoveDescription, + [MOVE_RAZOR_LEAF - 1] = sRazorLeafMoveDescription, + [MOVE_SOLAR_BEAM - 1] = sSolarBeamMoveDescription, + [MOVE_POISON_POWDER - 1] = sPoisonPowderMoveDescription, + [MOVE_STUN_SPORE - 1] = sStunSporeMoveDescription, + [MOVE_SLEEP_POWDER - 1] = sSleepPowderMoveDescription, + [MOVE_PETAL_DANCE - 1] = sPetalDanceMoveDescription, + [MOVE_STRING_SHOT - 1] = sStringShotMoveDescription, + [MOVE_DRAGON_RAGE - 1] = sDragonRageMoveDescription, + [MOVE_FIRE_SPIN - 1] = sFireSpinMoveDescription, + [MOVE_THUNDER_SHOCK - 1] = sThunderShockMoveDescription, + [MOVE_THUNDERBOLT - 1] = sThunderboltMoveDescription, + [MOVE_THUNDER_WAVE - 1] = sThunderWaveMoveDescription, + [MOVE_THUNDER - 1] = sThunderMoveDescription, + [MOVE_ROCK_THROW - 1] = sRockThrowMoveDescription, + [MOVE_EARTHQUAKE - 1] = sEarthquakeMoveDescription, + [MOVE_FISSURE - 1] = sFissureMoveDescription, + [MOVE_DIG - 1] = sDigMoveDescription, + [MOVE_TOXIC - 1] = sToxicMoveDescription, + [MOVE_CONFUSION - 1] = sConfusionMoveDescription, + [MOVE_PSYCHIC - 1] = sPsychicMoveDescription, + [MOVE_HYPNOSIS - 1] = sHypnosisMoveDescription, + [MOVE_MEDITATE - 1] = sMeditateMoveDescription, + [MOVE_AGILITY - 1] = sAgilityMoveDescription, + [MOVE_QUICK_ATTACK - 1] = sQuickAttackMoveDescription, + [MOVE_RAGE - 1] = sRageMoveDescription, + [MOVE_TELEPORT - 1] = sTeleportMoveDescription, + [MOVE_NIGHT_SHADE - 1] = sNightShadeMoveDescription, + [MOVE_MIMIC - 1] = sMimicMoveDescription, + [MOVE_SCREECH - 1] = sScreechMoveDescription, + [MOVE_DOUBLE_TEAM - 1] = sDoubleTeamMoveDescription, + [MOVE_RECOVER - 1] = sRecoverMoveDescription, + [MOVE_HARDEN - 1] = sHardenMoveDescription, + [MOVE_MINIMIZE - 1] = sMinimizeMoveDescription, + [MOVE_SMOKESCREEN - 1] = sSmokescreenMoveDescription, + [MOVE_CONFUSE_RAY - 1] = sConfuseRayMoveDescription, + [MOVE_WITHDRAW - 1] = sWithdrawMoveDescription, + [MOVE_DEFENSE_CURL - 1] = sDefenseCurlMoveDescription, + [MOVE_BARRIER - 1] = sBarrierMoveDescription, + [MOVE_LIGHT_SCREEN - 1] = sLightScreenMoveDescription, + [MOVE_HAZE - 1] = sHazeMoveDescription, + [MOVE_REFLECT - 1] = sReflectMoveDescription, + [MOVE_FOCUS_ENERGY - 1] = sFocusEnergyMoveDescription, + [MOVE_BIDE - 1] = sBideMoveDescription, + [MOVE_METRONOME - 1] = sMetronomeMoveDescription, + [MOVE_MIRROR_MOVE - 1] = sMirrorMoveMoveDescription, + [MOVE_SELF_DESTRUCT - 1] = sSelfDestructMoveDescription, + [MOVE_EGG_BOMB - 1] = sEggBombMoveDescription, + [MOVE_LICK - 1] = sLickMoveDescription, + [MOVE_SMOG - 1] = sSmogMoveDescription, + [MOVE_SLUDGE - 1] = sSludgeMoveDescription, + [MOVE_BONE_CLUB - 1] = sBoneClubMoveDescription, + [MOVE_FIRE_BLAST - 1] = sFireBlastMoveDescription, + [MOVE_WATERFALL - 1] = sWaterfallMoveDescription, + [MOVE_CLAMP - 1] = sClampMoveDescription, + [MOVE_SWIFT - 1] = sSwiftMoveDescription, + [MOVE_SKULL_BASH - 1] = sSkullBashMoveDescription, + [MOVE_SPIKE_CANNON - 1] = sSpikeCannonMoveDescription, + [MOVE_CONSTRICT - 1] = sConstrictMoveDescription, + [MOVE_AMNESIA - 1] = sAmnesiaMoveDescription, + [MOVE_KINESIS - 1] = sKinesisMoveDescription, + [MOVE_SOFT_BOILED - 1] = sSoftBoiledMoveDescription, + [MOVE_HI_JUMP_KICK - 1] = sHiJumpKickMoveDescription, + [MOVE_GLARE - 1] = sGlareMoveDescription, + [MOVE_DREAM_EATER - 1] = sDreamEaterMoveDescription, + [MOVE_POISON_GAS - 1] = sPoisonGasMoveDescription, + [MOVE_BARRAGE - 1] = sBarrageMoveDescription, + [MOVE_LEECH_LIFE - 1] = sLeechLifeMoveDescription, + [MOVE_LOVELY_KISS - 1] = sLovelyKissMoveDescription, + [MOVE_SKY_ATTACK - 1] = sSkyAttackMoveDescription, + [MOVE_TRANSFORM - 1] = sTransformMoveDescription, + [MOVE_BUBBLE - 1] = sBubbleMoveDescription, + [MOVE_DIZZY_PUNCH - 1] = sDizzyPunchMoveDescription, + [MOVE_SPORE - 1] = sSporeMoveDescription, + [MOVE_FLASH - 1] = sFlashMoveDescription, + [MOVE_PSYWAVE - 1] = sPsywaveMoveDescription, + [MOVE_SPLASH - 1] = sSplashMoveDescription, + [MOVE_ACID_ARMOR - 1] = sAcidArmorMoveDescription, + [MOVE_CRABHAMMER - 1] = sCrabhammerMoveDescription, + [MOVE_EXPLOSION - 1] = sExplosionMoveDescription, + [MOVE_FURY_SWIPES - 1] = sFurySwipesMoveDescription, + [MOVE_BONEMERANG - 1] = sBonemerangMoveDescription, + [MOVE_REST - 1] = sRestMoveDescription, + [MOVE_ROCK_SLIDE - 1] = sRockSlideMoveDescription, + [MOVE_HYPER_FANG - 1] = sHyperFangMoveDescription, + [MOVE_SHARPEN - 1] = sSharpenMoveDescription, + [MOVE_CONVERSION - 1] = sConversionMoveDescription, + [MOVE_TRI_ATTACK - 1] = sTriAttackMoveDescription, + [MOVE_SUPER_FANG - 1] = sSuperFangMoveDescription, + [MOVE_SLASH - 1] = sSlashMoveDescription, + [MOVE_SUBSTITUTE - 1] = sSubstituteMoveDescription, + [MOVE_STRUGGLE - 1] = sStruggleMoveDescription, + [MOVE_SKETCH - 1] = sSketchMoveDescription, + [MOVE_TRIPLE_KICK - 1] = sTripleKickMoveDescription, + [MOVE_THIEF - 1] = sThiefMoveDescription, + [MOVE_SPIDER_WEB - 1] = sSpiderWebMoveDescription, + [MOVE_MIND_READER - 1] = sMindReaderMoveDescription, + [MOVE_NIGHTMARE - 1] = sNightmareMoveDescription, + [MOVE_FLAME_WHEEL - 1] = sFlameWheelMoveDescription, + [MOVE_SNORE - 1] = sSnoreMoveDescription, + [MOVE_CURSE - 1] = sCurseMoveDescription, + [MOVE_FLAIL - 1] = sFlailMoveDescription, + [MOVE_CONVERSION_2 - 1] = sConversion2MoveDescription, + [MOVE_AEROBLAST - 1] = sAeroblastMoveDescription, + [MOVE_COTTON_SPORE - 1] = sCottonSporeMoveDescription, + [MOVE_REVERSAL - 1] = sReversalMoveDescription, + [MOVE_SPITE - 1] = sSpiteMoveDescription, + [MOVE_POWDER_SNOW - 1] = sPowderSnowMoveDescription, + [MOVE_PROTECT - 1] = sProtectMoveDescription, + [MOVE_MACH_PUNCH - 1] = sMachPunchMoveDescription, + [MOVE_SCARY_FACE - 1] = sScaryFaceMoveDescription, + [MOVE_FAINT_ATTACK - 1] = sFaintAttackMoveDescription, + [MOVE_SWEET_KISS - 1] = sSweetKissMoveDescription, + [MOVE_BELLY_DRUM - 1] = sBellyDrumMoveDescription, + [MOVE_SLUDGE_BOMB - 1] = sSludgeBombMoveDescription, + [MOVE_MUD_SLAP - 1] = sMudSlapMoveDescription, + [MOVE_OCTAZOOKA - 1] = sOctazookaMoveDescription, + [MOVE_SPIKES - 1] = sSpikesMoveDescription, + [MOVE_ZAP_CANNON - 1] = sZapCannonMoveDescription, + [MOVE_FORESIGHT - 1] = sForesightMoveDescription, + [MOVE_DESTINY_BOND - 1] = sDestinyBondMoveDescription, + [MOVE_PERISH_SONG - 1] = sPerishSongMoveDescription, + [MOVE_ICY_WIND - 1] = sIcyWindMoveDescription, + [MOVE_DETECT - 1] = sDetectMoveDescription, + [MOVE_BONE_RUSH - 1] = sBoneRushMoveDescription, + [MOVE_LOCK_ON - 1] = sLockOnMoveDescription, + [MOVE_OUTRAGE - 1] = sOutrageMoveDescription, + [MOVE_SANDSTORM - 1] = sSandstormMoveDescription, + [MOVE_GIGA_DRAIN - 1] = sGigaDrainMoveDescription, + [MOVE_ENDURE - 1] = sEndureMoveDescription, + [MOVE_CHARM - 1] = sCharmMoveDescription, + [MOVE_ROLLOUT - 1] = sRolloutMoveDescription, + [MOVE_FALSE_SWIPE - 1] = sFalseSwipeMoveDescription, + [MOVE_SWAGGER - 1] = sSwaggerMoveDescription, + [MOVE_MILK_DRINK - 1] = sMilkDrinkMoveDescription, + [MOVE_SPARK - 1] = sSparkMoveDescription, + [MOVE_FURY_CUTTER - 1] = sFuryCutterMoveDescription, + [MOVE_STEEL_WING - 1] = sSteelWingMoveDescription, + [MOVE_MEAN_LOOK - 1] = sMeanLookMoveDescription, + [MOVE_ATTRACT - 1] = sAttractMoveDescription, + [MOVE_SLEEP_TALK - 1] = sSleepTalkMoveDescription, + [MOVE_HEAL_BELL - 1] = sHealBellMoveDescription, + [MOVE_RETURN - 1] = sReturnMoveDescription, + [MOVE_PRESENT - 1] = sPresentMoveDescription, + [MOVE_FRUSTRATION - 1] = sFrustrationMoveDescription, + [MOVE_SAFEGUARD - 1] = sSafeguardMoveDescription, + [MOVE_PAIN_SPLIT - 1] = sPainSplitMoveDescription, + [MOVE_SACRED_FIRE - 1] = sSacredFireMoveDescription, + [MOVE_MAGNITUDE - 1] = sMagnitudeMoveDescription, + [MOVE_DYNAMIC_PUNCH - 1] = sDynamicPunchMoveDescription, + [MOVE_MEGAHORN - 1] = sMegahornMoveDescription, + [MOVE_DRAGON_BREATH - 1] = sDragonBreathMoveDescription, + [MOVE_BATON_PASS - 1] = sBatonPassMoveDescription, + [MOVE_ENCORE - 1] = sEncoreMoveDescription, + [MOVE_PURSUIT - 1] = sPursuitMoveDescription, + [MOVE_RAPID_SPIN - 1] = sRapidSpinMoveDescription, + [MOVE_SWEET_SCENT - 1] = sSweetScentMoveDescription, + [MOVE_IRON_TAIL - 1] = sIronTailMoveDescription, + [MOVE_METAL_CLAW - 1] = sMetalClawMoveDescription, + [MOVE_VITAL_THROW - 1] = sVitalThrowMoveDescription, + [MOVE_MORNING_SUN - 1] = sMorningSunMoveDescription, + [MOVE_SYNTHESIS - 1] = sSynthesisMoveDescription, + [MOVE_MOONLIGHT - 1] = sMoonlightMoveDescription, + [MOVE_HIDDEN_POWER - 1] = sHiddenPowerMoveDescription, + [MOVE_CROSS_CHOP - 1] = sCrossChopMoveDescription, + [MOVE_TWISTER - 1] = sTwisterMoveDescription, + [MOVE_RAIN_DANCE - 1] = sRainDanceMoveDescription, + [MOVE_SUNNY_DAY - 1] = sSunnyDayMoveDescription, + [MOVE_CRUNCH - 1] = sCrunchMoveDescription, + [MOVE_MIRROR_COAT - 1] = sMirrorCoatMoveDescription, + [MOVE_PSYCH_UP - 1] = sPsychUpMoveDescription, + [MOVE_EXTREME_SPEED - 1] = sExtremeSpeedMoveDescription, + [MOVE_ANCIENT_POWER - 1] = sAncientPowerMoveDescription, + [MOVE_SHADOW_BALL - 1] = sShadowBallMoveDescription, + [MOVE_FUTURE_SIGHT - 1] = sFutureSightMoveDescription, + [MOVE_ROCK_SMASH - 1] = sRockSmashMoveDescription, + [MOVE_WHIRLPOOL - 1] = sWhirlpoolMoveDescription, + [MOVE_BEAT_UP - 1] = sBeatUpMoveDescription, + [MOVE_FAKE_OUT - 1] = sFakeOutMoveDescription, + [MOVE_UPROAR - 1] = sUproarMoveDescription, + [MOVE_STOCKPILE - 1] = sStockpileMoveDescription, + [MOVE_SPIT_UP - 1] = sSpitUpMoveDescription, + [MOVE_SWALLOW - 1] = sSwallowMoveDescription, + [MOVE_HEAT_WAVE - 1] = sHeatWaveMoveDescription, + [MOVE_HAIL - 1] = sHailMoveDescription, + [MOVE_TORMENT - 1] = sTormentMoveDescription, + [MOVE_FLATTER - 1] = sFlatterMoveDescription, + [MOVE_WILL_O_WISP - 1] = sWillOWispMoveDescription, + [MOVE_MEMENTO - 1] = sMementoMoveDescription, + [MOVE_FACADE - 1] = sFacadeMoveDescription, + [MOVE_FOCUS_PUNCH - 1] = sFocusPunchMoveDescription, + [MOVE_SMELLING_SALT - 1] = sSmellingSaltMoveDescription, + [MOVE_FOLLOW_ME - 1] = sFollowMeMoveDescription, + [MOVE_NATURE_POWER - 1] = sNaturePowerMoveDescription, + [MOVE_CHARGE - 1] = sChargeMoveDescription, + [MOVE_TAUNT - 1] = sTauntMoveDescription, + [MOVE_HELPING_HAND - 1] = sHelpingHandMoveDescription, + [MOVE_TRICK - 1] = sTrickMoveDescription, + [MOVE_ROLE_PLAY - 1] = sRolePlayMoveDescription, + [MOVE_WISH - 1] = sWishMoveDescription, + [MOVE_ASSIST - 1] = sAssistMoveDescription, + [MOVE_INGRAIN - 1] = sIngrainMoveDescription, + [MOVE_SUPERPOWER - 1] = sSuperpowerMoveDescription, + [MOVE_MAGIC_COAT - 1] = sMagicCoatMoveDescription, + [MOVE_RECYCLE - 1] = sRecycleMoveDescription, + [MOVE_REVENGE - 1] = sRevengeMoveDescription, + [MOVE_BRICK_BREAK - 1] = sBrickBreakMoveDescription, + [MOVE_YAWN - 1] = sYawnMoveDescription, + [MOVE_KNOCK_OFF - 1] = sKnockOffMoveDescription, + [MOVE_ENDEAVOR - 1] = sEndeavorMoveDescription, + [MOVE_ERUPTION - 1] = sEruptionMoveDescription, + [MOVE_SKILL_SWAP - 1] = sSkillSwapMoveDescription, + [MOVE_IMPRISON - 1] = sImprisonMoveDescription, + [MOVE_REFRESH - 1] = sRefreshMoveDescription, + [MOVE_GRUDGE - 1] = sGrudgeMoveDescription, + [MOVE_SNATCH - 1] = sSnatchMoveDescription, + [MOVE_SECRET_POWER - 1] = sSecretPowerMoveDescription, + [MOVE_DIVE - 1] = sDiveMoveDescription, + [MOVE_ARM_THRUST - 1] = sArmThrustMoveDescription, + [MOVE_CAMOUFLAGE - 1] = sCamouflageMoveDescription, + [MOVE_TAIL_GLOW - 1] = sTailGlowMoveDescription, + [MOVE_LUSTER_PURGE - 1] = sLusterPurgeMoveDescription, + [MOVE_MIST_BALL - 1] = sMistBallMoveDescription, + [MOVE_FEATHER_DANCE - 1] = sFeatherDanceMoveDescription, + [MOVE_TEETER_DANCE - 1] = sTeeterDanceMoveDescription, + [MOVE_BLAZE_KICK - 1] = sBlazeKickMoveDescription, + [MOVE_MUD_SPORT - 1] = sMudSportMoveDescription, + [MOVE_ICE_BALL - 1] = sIceBallMoveDescription, + [MOVE_NEEDLE_ARM - 1] = sNeedleArmMoveDescription, + [MOVE_SLACK_OFF - 1] = sSlackOffMoveDescription, + [MOVE_HYPER_VOICE - 1] = sHyperVoiceMoveDescription, + [MOVE_POISON_FANG - 1] = sPoisonFangMoveDescription, + [MOVE_CRUSH_CLAW - 1] = sCrushClawMoveDescription, + [MOVE_BLAST_BURN - 1] = sBlastBurnMoveDescription, + [MOVE_HYDRO_CANNON - 1] = sHydroCannonMoveDescription, + [MOVE_METEOR_MASH - 1] = sMeteorMashMoveDescription, + [MOVE_ASTONISH - 1] = sAstonishMoveDescription, + [MOVE_WEATHER_BALL - 1] = sWeatherBallMoveDescription, + [MOVE_AROMATHERAPY - 1] = sAromatherapyMoveDescription, + [MOVE_FAKE_TEARS - 1] = sFakeTearsMoveDescription, + [MOVE_AIR_CUTTER - 1] = sAirCutterMoveDescription, + [MOVE_OVERHEAT - 1] = sOverheatMoveDescription, + [MOVE_ODOR_SLEUTH - 1] = sOdorSleuthMoveDescription, + [MOVE_ROCK_TOMB - 1] = sRockTombMoveDescription, + [MOVE_SILVER_WIND - 1] = sSilverWindMoveDescription, + [MOVE_METAL_SOUND - 1] = sMetalSoundMoveDescription, + [MOVE_GRASS_WHISTLE - 1] = sGrassWhistleMoveDescription, + [MOVE_TICKLE - 1] = sTickleMoveDescription, + [MOVE_COSMIC_POWER - 1] = sCosmicPowerMoveDescription, + [MOVE_WATER_SPOUT - 1] = sWaterSpoutMoveDescription, + [MOVE_SIGNAL_BEAM - 1] = sSignalBeamMoveDescription, + [MOVE_SHADOW_PUNCH - 1] = sShadowPunchMoveDescription, + [MOVE_EXTRASENSORY - 1] = sExtrasensoryMoveDescription, + [MOVE_SKY_UPPERCUT - 1] = sSkyUppercutMoveDescription, + [MOVE_SAND_TOMB - 1] = sSandTombMoveDescription, + [MOVE_SHEER_COLD - 1] = sSheerColdMoveDescription, + [MOVE_MUDDY_WATER - 1] = sMuddyWaterMoveDescription, + [MOVE_BULLET_SEED - 1] = sBulletSeedMoveDescription, + [MOVE_AERIAL_ACE - 1] = sAerialAceMoveDescription, + [MOVE_ICICLE_SPEAR - 1] = sIcicleSpearMoveDescription, + [MOVE_IRON_DEFENSE - 1] = sIronDefenseMoveDescription, + [MOVE_BLOCK - 1] = sBlockMoveDescription, + [MOVE_HOWL - 1] = sHowlMoveDescription, + [MOVE_DRAGON_CLAW - 1] = sDragonClawMoveDescription, + [MOVE_FRENZY_PLANT - 1] = sFrenzyPlantMoveDescription, + [MOVE_BULK_UP - 1] = sBulkUpMoveDescription, + [MOVE_BOUNCE - 1] = sBounceMoveDescription, + [MOVE_MUD_SHOT - 1] = sMudShotMoveDescription, + [MOVE_POISON_TAIL - 1] = sPoisonTailMoveDescription, + [MOVE_COVET - 1] = sCovetMoveDescription, + [MOVE_VOLT_TACKLE - 1] = sVoltTackleMoveDescription, + [MOVE_MAGICAL_LEAF - 1] = sMagicalLeafMoveDescription, + [MOVE_WATER_SPORT - 1] = sWaterSportMoveDescription, + [MOVE_CALM_MIND - 1] = sCalmMindMoveDescription, + [MOVE_LEAF_BLADE - 1] = sLeafBladeMoveDescription, + [MOVE_DRAGON_DANCE - 1] = sDragonDanceMoveDescription, + [MOVE_ROCK_BLAST - 1] = sRockBlastMoveDescription, + [MOVE_SHOCK_WAVE - 1] = sShockWaveMoveDescription, + [MOVE_WATER_PULSE - 1] = sWaterPulseMoveDescription, + [MOVE_DOOM_DESIRE - 1] = sDoomDesireMoveDescription, + [MOVE_PSYCHO_BOOST - 1] = sPsychoBoostMoveDescription, +}; diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h new file mode 100644 index 000000000..9f540f1d6 --- /dev/null +++ b/src/data/text/move_names.h @@ -0,0 +1,358 @@ +const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = +{ + [MOVE_NONE] = _("-"), + [MOVE_POUND] = _("POUND"), + [MOVE_KARATE_CHOP] = _("KARATE CHOP"), + [MOVE_DOUBLE_SLAP] = _("DOUBLESLAP"), + [MOVE_COMET_PUNCH] = _("COMET PUNCH"), + [MOVE_MEGA_PUNCH] = _("MEGA PUNCH"), + [MOVE_PAY_DAY] = _("PAY DAY"), + [MOVE_FIRE_PUNCH] = _("FIRE PUNCH"), + [MOVE_ICE_PUNCH] = _("ICE PUNCH"), + [MOVE_THUNDER_PUNCH] = _("THUNDERPUNCH"), + [MOVE_SCRATCH] = _("SCRATCH"), + [MOVE_VICE_GRIP] = _("VICEGRIP"), + [MOVE_GUILLOTINE] = _("GUILLOTINE"), + [MOVE_RAZOR_WIND] = _("RAZOR WIND"), + [MOVE_SWORDS_DANCE] = _("SWORDS DANCE"), + [MOVE_CUT] = _("CUT"), + [MOVE_GUST] = _("GUST"), + [MOVE_WING_ATTACK] = _("WING ATTACK"), + [MOVE_WHIRLWIND] = _("WHIRLWIND"), + [MOVE_FLY] = _("FLY"), + [MOVE_BIND] = _("BIND"), + [MOVE_SLAM] = _("SLAM"), + [MOVE_VINE_WHIP] = _("VINE WHIP"), + [MOVE_STOMP] = _("STOMP"), + [MOVE_DOUBLE_KICK] = _("DOUBLE KICK"), + [MOVE_MEGA_KICK] = _("MEGA KICK"), + [MOVE_JUMP_KICK] = _("JUMP KICK"), + [MOVE_ROLLING_KICK] = _("ROLLING KICK"), + [MOVE_SAND_ATTACK] = _("SAND-ATTACK"), + [MOVE_HEADBUTT] = _("HEADBUTT"), + [MOVE_HORN_ATTACK] = _("HORN ATTACK"), + [MOVE_FURY_ATTACK] = _("FURY ATTACK"), + [MOVE_HORN_DRILL] = _("HORN DRILL"), + [MOVE_TACKLE] = _("TACKLE"), + [MOVE_BODY_SLAM] = _("BODY SLAM"), + [MOVE_WRAP] = _("WRAP"), + [MOVE_TAKE_DOWN] = _("TAKE DOWN"), + [MOVE_THRASH] = _("THRASH"), + [MOVE_DOUBLE_EDGE] = _("DOUBLE-EDGE"), + [MOVE_TAIL_WHIP] = _("TAIL WHIP"), + [MOVE_POISON_STING] = _("POISON STING"), + [MOVE_TWINEEDLE] = _("TWINEEDLE"), + [MOVE_PIN_MISSILE] = _("PIN MISSILE"), + [MOVE_LEER] = _("LEER"), + [MOVE_BITE] = _("BITE"), + [MOVE_GROWL] = _("GROWL"), + [MOVE_ROAR] = _("ROAR"), + [MOVE_SING] = _("SING"), + [MOVE_SUPERSONIC] = _("SUPERSONIC"), + [MOVE_SONIC_BOOM] = _("SONICBOOM"), + [MOVE_DISABLE] = _("DISABLE"), + [MOVE_ACID] = _("ACID"), + [MOVE_EMBER] = _("EMBER"), + [MOVE_FLAMETHROWER] = _("FLAMETHROWER"), + [MOVE_MIST] = _("MIST"), + [MOVE_WATER_GUN] = _("WATER GUN"), + [MOVE_HYDRO_PUMP] = _("HYDRO PUMP"), + [MOVE_SURF] = _("SURF"), + [MOVE_ICE_BEAM] = _("ICE BEAM"), + [MOVE_BLIZZARD] = _("BLIZZARD"), + [MOVE_PSYBEAM] = _("PSYBEAM"), + [MOVE_BUBBLE_BEAM] = _("BUBBLEBEAM"), + [MOVE_AURORA_BEAM] = _("AURORA BEAM"), + [MOVE_HYPER_BEAM] = _("HYPER BEAM"), + [MOVE_PECK] = _("PECK"), + [MOVE_DRILL_PECK] = _("DRILL PECK"), + [MOVE_SUBMISSION] = _("SUBMISSION"), + [MOVE_LOW_KICK] = _("LOW KICK"), + [MOVE_COUNTER] = _("COUNTER"), + [MOVE_SEISMIC_TOSS] = _("SEISMIC TOSS"), + [MOVE_STRENGTH] = _("STRENGTH"), + [MOVE_ABSORB] = _("ABSORB"), + [MOVE_MEGA_DRAIN] = _("MEGA DRAIN"), + [MOVE_LEECH_SEED] = _("LEECH SEED"), + [MOVE_GROWTH] = _("GROWTH"), + [MOVE_RAZOR_LEAF] = _("RAZOR LEAF"), + [MOVE_SOLAR_BEAM] = _("SOLARBEAM"), + [MOVE_POISON_POWDER] = _("POISONPOWDER"), + [MOVE_STUN_SPORE] = _("STUN SPORE"), + [MOVE_SLEEP_POWDER] = _("SLEEP POWDER"), + [MOVE_PETAL_DANCE] = _("PETAL DANCE"), + [MOVE_STRING_SHOT] = _("STRING SHOT"), + [MOVE_DRAGON_RAGE] = _("DRAGON RAGE"), + [MOVE_FIRE_SPIN] = _("FIRE SPIN"), + [MOVE_THUNDER_SHOCK] = _("THUNDERSHOCK"), + [MOVE_THUNDERBOLT] = _("THUNDERBOLT"), + [MOVE_THUNDER_WAVE] = _("THUNDER WAVE"), + [MOVE_THUNDER] = _("THUNDER"), + [MOVE_ROCK_THROW] = _("ROCK THROW"), + [MOVE_EARTHQUAKE] = _("EARTHQUAKE"), + [MOVE_FISSURE] = _("FISSURE"), + [MOVE_DIG] = _("DIG"), + [MOVE_TOXIC] = _("TOXIC"), + [MOVE_CONFUSION] = _("CONFUSION"), + [MOVE_PSYCHIC] = _("PSYCHIC"), + [MOVE_HYPNOSIS] = _("HYPNOSIS"), + [MOVE_MEDITATE] = _("MEDITATE"), + [MOVE_AGILITY] = _("AGILITY"), + [MOVE_QUICK_ATTACK] = _("QUICK ATTACK"), + [MOVE_RAGE] = _("RAGE"), + [MOVE_TELEPORT] = _("TELEPORT"), + [MOVE_NIGHT_SHADE] = _("NIGHT SHADE"), + [MOVE_MIMIC] = _("MIMIC"), + [MOVE_SCREECH] = _("SCREECH"), + [MOVE_DOUBLE_TEAM] = _("DOUBLE TEAM"), + [MOVE_RECOVER] = _("RECOVER"), + [MOVE_HARDEN] = _("HARDEN"), + [MOVE_MINIMIZE] = _("MINIMIZE"), + [MOVE_SMOKESCREEN] = _("SMOKESCREEN"), + [MOVE_CONFUSE_RAY] = _("CONFUSE RAY"), + [MOVE_WITHDRAW] = _("WITHDRAW"), + [MOVE_DEFENSE_CURL] = _("DEFENSE CURL"), + [MOVE_BARRIER] = _("BARRIER"), + [MOVE_LIGHT_SCREEN] = _("LIGHT SCREEN"), + [MOVE_HAZE] = _("HAZE"), + [MOVE_REFLECT] = _("REFLECT"), + [MOVE_FOCUS_ENERGY] = _("FOCUS ENERGY"), + [MOVE_BIDE] = _("BIDE"), + [MOVE_METRONOME] = _("METRONOME"), + [MOVE_MIRROR_MOVE] = _("MIRROR MOVE"), + [MOVE_SELF_DESTRUCT] = _("SELFDESTRUCT"), + [MOVE_EGG_BOMB] = _("EGG BOMB"), + [MOVE_LICK] = _("LICK"), + [MOVE_SMOG] = _("SMOG"), + [MOVE_SLUDGE] = _("SLUDGE"), + [MOVE_BONE_CLUB] = _("BONE CLUB"), + [MOVE_FIRE_BLAST] = _("FIRE BLAST"), + [MOVE_WATERFALL] = _("WATERFALL"), + [MOVE_CLAMP] = _("CLAMP"), + [MOVE_SWIFT] = _("SWIFT"), + [MOVE_SKULL_BASH] = _("SKULL BASH"), + [MOVE_SPIKE_CANNON] = _("SPIKE CANNON"), + [MOVE_CONSTRICT] = _("CONSTRICT"), + [MOVE_AMNESIA] = _("AMNESIA"), + [MOVE_KINESIS] = _("KINESIS"), + [MOVE_SOFT_BOILED] = _("SOFTBOILED"), + [MOVE_HI_JUMP_KICK] = _("HI JUMP KICK"), + [MOVE_GLARE] = _("GLARE"), + [MOVE_DREAM_EATER] = _("DREAM EATER"), + [MOVE_POISON_GAS] = _("POISON GAS"), + [MOVE_BARRAGE] = _("BARRAGE"), + [MOVE_LEECH_LIFE] = _("LEECH LIFE"), + [MOVE_LOVELY_KISS] = _("LOVELY KISS"), + [MOVE_SKY_ATTACK] = _("SKY ATTACK"), + [MOVE_TRANSFORM] = _("TRANSFORM"), + [MOVE_BUBBLE] = _("BUBBLE"), + [MOVE_DIZZY_PUNCH] = _("DIZZY PUNCH"), + [MOVE_SPORE] = _("SPORE"), + [MOVE_FLASH] = _("FLASH"), + [MOVE_PSYWAVE] = _("PSYWAVE"), + [MOVE_SPLASH] = _("SPLASH"), + [MOVE_ACID_ARMOR] = _("ACID ARMOR"), + [MOVE_CRABHAMMER] = _("CRABHAMMER"), + [MOVE_EXPLOSION] = _("EXPLOSION"), + [MOVE_FURY_SWIPES] = _("FURY SWIPES"), + [MOVE_BONEMERANG] = _("BONEMERANG"), + [MOVE_REST] = _("REST"), + [MOVE_ROCK_SLIDE] = _("ROCK SLIDE"), + [MOVE_HYPER_FANG] = _("HYPER FANG"), + [MOVE_SHARPEN] = _("SHARPEN"), + [MOVE_CONVERSION] = _("CONVERSION"), + [MOVE_TRI_ATTACK] = _("TRI ATTACK"), + [MOVE_SUPER_FANG] = _("SUPER FANG"), + [MOVE_SLASH] = _("SLASH"), + [MOVE_SUBSTITUTE] = _("SUBSTITUTE"), + [MOVE_STRUGGLE] = _("STRUGGLE"), + [MOVE_SKETCH] = _("SKETCH"), + [MOVE_TRIPLE_KICK] = _("TRIPLE KICK"), + [MOVE_THIEF] = _("THIEF"), + [MOVE_SPIDER_WEB] = _("SPIDER WEB"), + [MOVE_MIND_READER] = _("MIND READER"), + [MOVE_NIGHTMARE] = _("NIGHTMARE"), + [MOVE_FLAME_WHEEL] = _("FLAME WHEEL"), + [MOVE_SNORE] = _("SNORE"), + [MOVE_CURSE] = _("CURSE"), + [MOVE_FLAIL] = _("FLAIL"), + [MOVE_CONVERSION_2] = _("CONVERSION 2"), + [MOVE_AEROBLAST] = _("AEROBLAST"), + [MOVE_COTTON_SPORE] = _("COTTON SPORE"), + [MOVE_REVERSAL] = _("REVERSAL"), + [MOVE_SPITE] = _("SPITE"), + [MOVE_POWDER_SNOW] = _("POWDER SNOW"), + [MOVE_PROTECT] = _("PROTECT"), + [MOVE_MACH_PUNCH] = _("MACH PUNCH"), + [MOVE_SCARY_FACE] = _("SCARY FACE"), + [MOVE_FAINT_ATTACK] = _("FAINT ATTACK"), + [MOVE_SWEET_KISS] = _("SWEET KISS"), + [MOVE_BELLY_DRUM] = _("BELLY DRUM"), + [MOVE_SLUDGE_BOMB] = _("SLUDGE BOMB"), + [MOVE_MUD_SLAP] = _("MUD-SLAP"), + [MOVE_OCTAZOOKA] = _("OCTAZOOKA"), + [MOVE_SPIKES] = _("SPIKES"), + [MOVE_ZAP_CANNON] = _("ZAP CANNON"), + [MOVE_FORESIGHT] = _("FORESIGHT"), + [MOVE_DESTINY_BOND] = _("DESTINY BOND"), + [MOVE_PERISH_SONG] = _("PERISH SONG"), + [MOVE_ICY_WIND] = _("ICY WIND"), + [MOVE_DETECT] = _("DETECT"), + [MOVE_BONE_RUSH] = _("BONE RUSH"), + [MOVE_LOCK_ON] = _("LOCK-ON"), + [MOVE_OUTRAGE] = _("OUTRAGE"), + [MOVE_SANDSTORM] = _("SANDSTORM"), + [MOVE_GIGA_DRAIN] = _("GIGA DRAIN"), + [MOVE_ENDURE] = _("ENDURE"), + [MOVE_CHARM] = _("CHARM"), + [MOVE_ROLLOUT] = _("ROLLOUT"), + [MOVE_FALSE_SWIPE] = _("FALSE SWIPE"), + [MOVE_SWAGGER] = _("SWAGGER"), + [MOVE_MILK_DRINK] = _("MILK DRINK"), + [MOVE_SPARK] = _("SPARK"), + [MOVE_FURY_CUTTER] = _("FURY CUTTER"), + [MOVE_STEEL_WING] = _("STEEL WING"), + [MOVE_MEAN_LOOK] = _("MEAN LOOK"), + [MOVE_ATTRACT] = _("ATTRACT"), + [MOVE_SLEEP_TALK] = _("SLEEP TALK"), + [MOVE_HEAL_BELL] = _("HEAL BELL"), + [MOVE_RETURN] = _("RETURN"), + [MOVE_PRESENT] = _("PRESENT"), + [MOVE_FRUSTRATION] = _("FRUSTRATION"), + [MOVE_SAFEGUARD] = _("SAFEGUARD"), + [MOVE_PAIN_SPLIT] = _("PAIN SPLIT"), + [MOVE_SACRED_FIRE] = _("SACRED FIRE"), + [MOVE_MAGNITUDE] = _("MAGNITUDE"), + [MOVE_DYNAMIC_PUNCH] = _("DYNAMICPUNCH"), + [MOVE_MEGAHORN] = _("MEGAHORN"), + [MOVE_DRAGON_BREATH] = _("DRAGONBREATH"), + [MOVE_BATON_PASS] = _("BATON PASS"), + [MOVE_ENCORE] = _("ENCORE"), + [MOVE_PURSUIT] = _("PURSUIT"), + [MOVE_RAPID_SPIN] = _("RAPID SPIN"), + [MOVE_SWEET_SCENT] = _("SWEET SCENT"), + [MOVE_IRON_TAIL] = _("IRON TAIL"), + [MOVE_METAL_CLAW] = _("METAL CLAW"), + [MOVE_VITAL_THROW] = _("VITAL THROW"), + [MOVE_MORNING_SUN] = _("MORNING SUN"), + [MOVE_SYNTHESIS] = _("SYNTHESIS"), + [MOVE_MOONLIGHT] = _("MOONLIGHT"), + [MOVE_HIDDEN_POWER] = _("HIDDEN POWER"), + [MOVE_CROSS_CHOP] = _("CROSS CHOP"), + [MOVE_TWISTER] = _("TWISTER"), + [MOVE_RAIN_DANCE] = _("RAIN DANCE"), + [MOVE_SUNNY_DAY] = _("SUNNY DAY"), + [MOVE_CRUNCH] = _("CRUNCH"), + [MOVE_MIRROR_COAT] = _("MIRROR COAT"), + [MOVE_PSYCH_UP] = _("PSYCH UP"), + [MOVE_EXTREME_SPEED] = _("EXTREMESPEED"), + [MOVE_ANCIENT_POWER] = _("ANCIENTPOWER"), + [MOVE_SHADOW_BALL] = _("SHADOW BALL"), + [MOVE_FUTURE_SIGHT] = _("FUTURE SIGHT"), + [MOVE_ROCK_SMASH] = _("ROCK SMASH"), + [MOVE_WHIRLPOOL] = _("WHIRLPOOL"), + [MOVE_BEAT_UP] = _("BEAT UP"), + [MOVE_FAKE_OUT] = _("FAKE OUT"), + [MOVE_UPROAR] = _("UPROAR"), + [MOVE_STOCKPILE] = _("STOCKPILE"), + [MOVE_SPIT_UP] = _("SPIT UP"), + [MOVE_SWALLOW] = _("SWALLOW"), + [MOVE_HEAT_WAVE] = _("HEAT WAVE"), + [MOVE_HAIL] = _("HAIL"), + [MOVE_TORMENT] = _("TORMENT"), + [MOVE_FLATTER] = _("FLATTER"), + [MOVE_WILL_O_WISP] = _("WILL-O-WISP"), + [MOVE_MEMENTO] = _("MEMENTO"), + [MOVE_FACADE] = _("FACADE"), + [MOVE_FOCUS_PUNCH] = _("FOCUS PUNCH"), + [MOVE_SMELLING_SALT] = _("SMELLINGSALT"), + [MOVE_FOLLOW_ME] = _("FOLLOW ME"), + [MOVE_NATURE_POWER] = _("NATURE POWER"), + [MOVE_CHARGE] = _("CHARGE"), + [MOVE_TAUNT] = _("TAUNT"), + [MOVE_HELPING_HAND] = _("HELPING HAND"), + [MOVE_TRICK] = _("TRICK"), + [MOVE_ROLE_PLAY] = _("ROLE PLAY"), + [MOVE_WISH] = _("WISH"), + [MOVE_ASSIST] = _("ASSIST"), + [MOVE_INGRAIN] = _("INGRAIN"), + [MOVE_SUPERPOWER] = _("SUPERPOWER"), + [MOVE_MAGIC_COAT] = _("MAGIC COAT"), + [MOVE_RECYCLE] = _("RECYCLE"), + [MOVE_REVENGE] = _("REVENGE"), + [MOVE_BRICK_BREAK] = _("BRICK BREAK"), + [MOVE_YAWN] = _("YAWN"), + [MOVE_KNOCK_OFF] = _("KNOCK OFF"), + [MOVE_ENDEAVOR] = _("ENDEAVOR"), + [MOVE_ERUPTION] = _("ERUPTION"), + [MOVE_SKILL_SWAP] = _("SKILL SWAP"), + [MOVE_IMPRISON] = _("IMPRISON"), + [MOVE_REFRESH] = _("REFRESH"), + [MOVE_GRUDGE] = _("GRUDGE"), + [MOVE_SNATCH] = _("SNATCH"), + [MOVE_SECRET_POWER] = _("SECRET POWER"), + [MOVE_DIVE] = _("DIVE"), + [MOVE_ARM_THRUST] = _("ARM THRUST"), + [MOVE_CAMOUFLAGE] = _("CAMOUFLAGE"), + [MOVE_TAIL_GLOW] = _("TAIL GLOW"), + [MOVE_LUSTER_PURGE] = _("LUSTER PURGE"), + [MOVE_MIST_BALL] = _("MIST BALL"), + [MOVE_FEATHER_DANCE] = _("FEATHERDANCE"), + [MOVE_TEETER_DANCE] = _("TEETER DANCE"), + [MOVE_BLAZE_KICK] = _("BLAZE KICK"), + [MOVE_MUD_SPORT] = _("MUD SPORT"), + [MOVE_ICE_BALL] = _("ICE BALL"), + [MOVE_NEEDLE_ARM] = _("NEEDLE ARM"), + [MOVE_SLACK_OFF] = _("SLACK OFF"), + [MOVE_HYPER_VOICE] = _("HYPER VOICE"), + [MOVE_POISON_FANG] = _("POISON FANG"), + [MOVE_CRUSH_CLAW] = _("CRUSH CLAW"), + [MOVE_BLAST_BURN] = _("BLAST BURN"), + [MOVE_HYDRO_CANNON] = _("HYDRO CANNON"), + [MOVE_METEOR_MASH] = _("METEOR MASH"), + [MOVE_ASTONISH] = _("ASTONISH"), + [MOVE_WEATHER_BALL] = _("WEATHER BALL"), + [MOVE_AROMATHERAPY] = _("AROMATHERAPY"), + [MOVE_FAKE_TEARS] = _("FAKE TEARS"), + [MOVE_AIR_CUTTER] = _("AIR CUTTER"), + [MOVE_OVERHEAT] = _("OVERHEAT"), + [MOVE_ODOR_SLEUTH] = _("ODOR SLEUTH"), + [MOVE_ROCK_TOMB] = _("ROCK TOMB"), + [MOVE_SILVER_WIND] = _("SILVER WIND"), + [MOVE_METAL_SOUND] = _("METAL SOUND"), + [MOVE_GRASS_WHISTLE] = _("GRASSWHISTLE"), + [MOVE_TICKLE] = _("TICKLE"), + [MOVE_COSMIC_POWER] = _("COSMIC POWER"), + [MOVE_WATER_SPOUT] = _("WATER SPOUT"), + [MOVE_SIGNAL_BEAM] = _("SIGNAL BEAM"), + [MOVE_SHADOW_PUNCH] = _("SHADOW PUNCH"), + [MOVE_EXTRASENSORY] = _("EXTRASENSORY"), + [MOVE_SKY_UPPERCUT] = _("SKY UPPERCUT"), + [MOVE_SAND_TOMB] = _("SAND TOMB"), + [MOVE_SHEER_COLD] = _("SHEER COLD"), + [MOVE_MUDDY_WATER] = _("MUDDY WATER"), + [MOVE_BULLET_SEED] = _("BULLET SEED"), + [MOVE_AERIAL_ACE] = _("AERIAL ACE"), + [MOVE_ICICLE_SPEAR] = _("ICICLE SPEAR"), + [MOVE_IRON_DEFENSE] = _("IRON DEFENSE"), + [MOVE_BLOCK] = _("BLOCK"), + [MOVE_HOWL] = _("HOWL"), + [MOVE_DRAGON_CLAW] = _("DRAGON CLAW"), + [MOVE_FRENZY_PLANT] = _("FRENZY PLANT"), + [MOVE_BULK_UP] = _("BULK UP"), + [MOVE_BOUNCE] = _("BOUNCE"), + [MOVE_MUD_SHOT] = _("MUD SHOT"), + [MOVE_POISON_TAIL] = _("POISON TAIL"), + [MOVE_COVET] = _("COVET"), + [MOVE_VOLT_TACKLE] = _("VOLT TACKLE"), + [MOVE_MAGICAL_LEAF] = _("MAGICAL LEAF"), + [MOVE_WATER_SPORT] = _("WATER SPORT"), + [MOVE_CALM_MIND] = _("CALM MIND"), + [MOVE_LEAF_BLADE] = _("LEAF BLADE"), + [MOVE_DRAGON_DANCE] = _("DRAGON DANCE"), + [MOVE_ROCK_BLAST] = _("ROCK BLAST"), + [MOVE_SHOCK_WAVE] = _("SHOCK WAVE"), + [MOVE_WATER_PULSE] = _("WATER PULSE"), + [MOVE_DOOM_DESIRE] = _("DOOM DESIRE"), + [MOVE_PSYCHO_BOOST] = _("PSYCHO BOOST"), +}; diff --git a/src/data/text/species_names.h b/src/data/text/species_names.h new file mode 100644 index 000000000..840beb22b --- /dev/null +++ b/src/data/text/species_names.h @@ -0,0 +1,414 @@ +const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1] = { + [SPECIES_NONE] = _("??????????"), + [SPECIES_BULBASAUR] = _("BULBASAUR"), + [SPECIES_IVYSAUR] = _("IVYSAUR"), + [SPECIES_VENUSAUR] = _("VENUSAUR"), + [SPECIES_CHARMANDER] = _("CHARMANDER"), + [SPECIES_CHARMELEON] = _("CHARMELEON"), + [SPECIES_CHARIZARD] = _("CHARIZARD"), + [SPECIES_SQUIRTLE] = _("SQUIRTLE"), + [SPECIES_WARTORTLE] = _("WARTORTLE"), + [SPECIES_BLASTOISE] = _("BLASTOISE"), + [SPECIES_CATERPIE] = _("CATERPIE"), + [SPECIES_METAPOD] = _("METAPOD"), + [SPECIES_BUTTERFREE] = _("BUTTERFREE"), + [SPECIES_WEEDLE] = _("WEEDLE"), + [SPECIES_KAKUNA] = _("KAKUNA"), + [SPECIES_BEEDRILL] = _("BEEDRILL"), + [SPECIES_PIDGEY] = _("PIDGEY"), + [SPECIES_PIDGEOTTO] = _("PIDGEOTTO"), + [SPECIES_PIDGEOT] = _("PIDGEOT"), + [SPECIES_RATTATA] = _("RATTATA"), + [SPECIES_RATICATE] = _("RATICATE"), + [SPECIES_SPEAROW] = _("SPEAROW"), + [SPECIES_FEAROW] = _("FEAROW"), + [SPECIES_EKANS] = _("EKANS"), + [SPECIES_ARBOK] = _("ARBOK"), + [SPECIES_PIKACHU] = _("PIKACHU"), + [SPECIES_RAICHU] = _("RAICHU"), + [SPECIES_SANDSHREW] = _("SANDSHREW"), + [SPECIES_SANDSLASH] = _("SANDSLASH"), + [SPECIES_NIDORAN_F] = _("NIDORAN♀"), + [SPECIES_NIDORINA] = _("NIDORINA"), + [SPECIES_NIDOQUEEN] = _("NIDOQUEEN"), + [SPECIES_NIDORAN_M] = _("NIDORAN♂"), + [SPECIES_NIDORINO] = _("NIDORINO"), + [SPECIES_NIDOKING] = _("NIDOKING"), + [SPECIES_CLEFAIRY] = _("CLEFAIRY"), + [SPECIES_CLEFABLE] = _("CLEFABLE"), + [SPECIES_VULPIX] = _("VULPIX"), + [SPECIES_NINETALES] = _("NINETALES"), + [SPECIES_JIGGLYPUFF] = _("JIGGLYPUFF"), + [SPECIES_WIGGLYTUFF] = _("WIGGLYTUFF"), + [SPECIES_ZUBAT] = _("ZUBAT"), + [SPECIES_GOLBAT] = _("GOLBAT"), + [SPECIES_ODDISH] = _("ODDISH"), + [SPECIES_GLOOM] = _("GLOOM"), + [SPECIES_VILEPLUME] = _("VILEPLUME"), + [SPECIES_PARAS] = _("PARAS"), + [SPECIES_PARASECT] = _("PARASECT"), + [SPECIES_VENONAT] = _("VENONAT"), + [SPECIES_VENOMOTH] = _("VENOMOTH"), + [SPECIES_DIGLETT] = _("DIGLETT"), + [SPECIES_DUGTRIO] = _("DUGTRIO"), + [SPECIES_MEOWTH] = _("MEOWTH"), + [SPECIES_PERSIAN] = _("PERSIAN"), + [SPECIES_PSYDUCK] = _("PSYDUCK"), + [SPECIES_GOLDUCK] = _("GOLDUCK"), + [SPECIES_MANKEY] = _("MANKEY"), + [SPECIES_PRIMEAPE] = _("PRIMEAPE"), + [SPECIES_GROWLITHE] = _("GROWLITHE"), + [SPECIES_ARCANINE] = _("ARCANINE"), + [SPECIES_POLIWAG] = _("POLIWAG"), + [SPECIES_POLIWHIRL] = _("POLIWHIRL"), + [SPECIES_POLIWRATH] = _("POLIWRATH"), + [SPECIES_ABRA] = _("ABRA"), + [SPECIES_KADABRA] = _("KADABRA"), + [SPECIES_ALAKAZAM] = _("ALAKAZAM"), + [SPECIES_MACHOP] = _("MACHOP"), + [SPECIES_MACHOKE] = _("MACHOKE"), + [SPECIES_MACHAMP] = _("MACHAMP"), + [SPECIES_BELLSPROUT] = _("BELLSPROUT"), + [SPECIES_WEEPINBELL] = _("WEEPINBELL"), + [SPECIES_VICTREEBEL] = _("VICTREEBEL"), + [SPECIES_TENTACOOL] = _("TENTACOOL"), + [SPECIES_TENTACRUEL] = _("TENTACRUEL"), + [SPECIES_GEODUDE] = _("GEODUDE"), + [SPECIES_GRAVELER] = _("GRAVELER"), + [SPECIES_GOLEM] = _("GOLEM"), + [SPECIES_PONYTA] = _("PONYTA"), + [SPECIES_RAPIDASH] = _("RAPIDASH"), + [SPECIES_SLOWPOKE] = _("SLOWPOKE"), + [SPECIES_SLOWBRO] = _("SLOWBRO"), + [SPECIES_MAGNEMITE] = _("MAGNEMITE"), + [SPECIES_MAGNETON] = _("MAGNETON"), + [SPECIES_FARFETCHD] = _("FARFETCH’D"), + [SPECIES_DODUO] = _("DODUO"), + [SPECIES_DODRIO] = _("DODRIO"), + [SPECIES_SEEL] = _("SEEL"), + [SPECIES_DEWGONG] = _("DEWGONG"), + [SPECIES_GRIMER] = _("GRIMER"), + [SPECIES_MUK] = _("MUK"), + [SPECIES_SHELLDER] = _("SHELLDER"), + [SPECIES_CLOYSTER] = _("CLOYSTER"), + [SPECIES_GASTLY] = _("GASTLY"), + [SPECIES_HAUNTER] = _("HAUNTER"), + [SPECIES_GENGAR] = _("GENGAR"), + [SPECIES_ONIX] = _("ONIX"), + [SPECIES_DROWZEE] = _("DROWZEE"), + [SPECIES_HYPNO] = _("HYPNO"), + [SPECIES_KRABBY] = _("KRABBY"), + [SPECIES_KINGLER] = _("KINGLER"), + [SPECIES_VOLTORB] = _("VOLTORB"), + [SPECIES_ELECTRODE] = _("ELECTRODE"), + [SPECIES_EXEGGCUTE] = _("EXEGGCUTE"), + [SPECIES_EXEGGUTOR] = _("EXEGGUTOR"), + [SPECIES_CUBONE] = _("CUBONE"), + [SPECIES_MAROWAK] = _("MAROWAK"), + [SPECIES_HITMONLEE] = _("HITMONLEE"), + [SPECIES_HITMONCHAN] = _("HITMONCHAN"), + [SPECIES_LICKITUNG] = _("LICKITUNG"), + [SPECIES_KOFFING] = _("KOFFING"), + [SPECIES_WEEZING] = _("WEEZING"), + [SPECIES_RHYHORN] = _("RHYHORN"), + [SPECIES_RHYDON] = _("RHYDON"), + [SPECIES_CHANSEY] = _("CHANSEY"), + [SPECIES_TANGELA] = _("TANGELA"), + [SPECIES_KANGASKHAN] = _("KANGASKHAN"), + [SPECIES_HORSEA] = _("HORSEA"), + [SPECIES_SEADRA] = _("SEADRA"), + [SPECIES_GOLDEEN] = _("GOLDEEN"), + [SPECIES_SEAKING] = _("SEAKING"), + [SPECIES_STARYU] = _("STARYU"), + [SPECIES_STARMIE] = _("STARMIE"), + [SPECIES_MR_MIME] = _("MR. MIME"), + [SPECIES_SCYTHER] = _("SCYTHER"), + [SPECIES_JYNX] = _("JYNX"), + [SPECIES_ELECTABUZZ] = _("ELECTABUZZ"), + [SPECIES_MAGMAR] = _("MAGMAR"), + [SPECIES_PINSIR] = _("PINSIR"), + [SPECIES_TAUROS] = _("TAUROS"), + [SPECIES_MAGIKARP] = _("MAGIKARP"), + [SPECIES_GYARADOS] = _("GYARADOS"), + [SPECIES_LAPRAS] = _("LAPRAS"), + [SPECIES_DITTO] = _("DITTO"), + [SPECIES_EEVEE] = _("EEVEE"), + [SPECIES_VAPOREON] = _("VAPOREON"), + [SPECIES_JOLTEON] = _("JOLTEON"), + [SPECIES_FLAREON] = _("FLAREON"), + [SPECIES_PORYGON] = _("PORYGON"), + [SPECIES_OMANYTE] = _("OMANYTE"), + [SPECIES_OMASTAR] = _("OMASTAR"), + [SPECIES_KABUTO] = _("KABUTO"), + [SPECIES_KABUTOPS] = _("KABUTOPS"), + [SPECIES_AERODACTYL] = _("AERODACTYL"), + [SPECIES_SNORLAX] = _("SNORLAX"), + [SPECIES_ARTICUNO] = _("ARTICUNO"), + [SPECIES_ZAPDOS] = _("ZAPDOS"), + [SPECIES_MOLTRES] = _("MOLTRES"), + [SPECIES_DRATINI] = _("DRATINI"), + [SPECIES_DRAGONAIR] = _("DRAGONAIR"), + [SPECIES_DRAGONITE] = _("DRAGONITE"), + [SPECIES_MEWTWO] = _("MEWTWO"), + [SPECIES_MEW] = _("MEW"), + [SPECIES_CHIKORITA] = _("CHIKORITA"), + [SPECIES_BAYLEEF] = _("BAYLEEF"), + [SPECIES_MEGANIUM] = _("MEGANIUM"), + [SPECIES_CYNDAQUIL] = _("CYNDAQUIL"), + [SPECIES_QUILAVA] = _("QUILAVA"), + [SPECIES_TYPHLOSION] = _("TYPHLOSION"), + [SPECIES_TOTODILE] = _("TOTODILE"), + [SPECIES_CROCONAW] = _("CROCONAW"), + [SPECIES_FERALIGATR] = _("FERALIGATR"), + [SPECIES_SENTRET] = _("SENTRET"), + [SPECIES_FURRET] = _("FURRET"), + [SPECIES_HOOTHOOT] = _("HOOTHOOT"), + [SPECIES_NOCTOWL] = _("NOCTOWL"), + [SPECIES_LEDYBA] = _("LEDYBA"), + [SPECIES_LEDIAN] = _("LEDIAN"), + [SPECIES_SPINARAK] = _("SPINARAK"), + [SPECIES_ARIADOS] = _("ARIADOS"), + [SPECIES_CROBAT] = _("CROBAT"), + [SPECIES_CHINCHOU] = _("CHINCHOU"), + [SPECIES_LANTURN] = _("LANTURN"), + [SPECIES_PICHU] = _("PICHU"), + [SPECIES_CLEFFA] = _("CLEFFA"), + [SPECIES_IGGLYBUFF] = _("IGGLYBUFF"), + [SPECIES_TOGEPI] = _("TOGEPI"), + [SPECIES_TOGETIC] = _("TOGETIC"), + [SPECIES_NATU] = _("NATU"), + [SPECIES_XATU] = _("XATU"), + [SPECIES_MAREEP] = _("MAREEP"), + [SPECIES_FLAAFFY] = _("FLAAFFY"), + [SPECIES_AMPHAROS] = _("AMPHAROS"), + [SPECIES_BELLOSSOM] = _("BELLOSSOM"), + [SPECIES_MARILL] = _("MARILL"), + [SPECIES_AZUMARILL] = _("AZUMARILL"), + [SPECIES_SUDOWOODO] = _("SUDOWOODO"), + [SPECIES_POLITOED] = _("POLITOED"), + [SPECIES_HOPPIP] = _("HOPPIP"), + [SPECIES_SKIPLOOM] = _("SKIPLOOM"), + [SPECIES_JUMPLUFF] = _("JUMPLUFF"), + [SPECIES_AIPOM] = _("AIPOM"), + [SPECIES_SUNKERN] = _("SUNKERN"), + [SPECIES_SUNFLORA] = _("SUNFLORA"), + [SPECIES_YANMA] = _("YANMA"), + [SPECIES_WOOPER] = _("WOOPER"), + [SPECIES_QUAGSIRE] = _("QUAGSIRE"), + [SPECIES_ESPEON] = _("ESPEON"), + [SPECIES_UMBREON] = _("UMBREON"), + [SPECIES_MURKROW] = _("MURKROW"), + [SPECIES_SLOWKING] = _("SLOWKING"), + [SPECIES_MISDREAVUS] = _("MISDREAVUS"), + [SPECIES_UNOWN] = _("UNOWN"), + [SPECIES_WOBBUFFET] = _("WOBBUFFET"), + [SPECIES_GIRAFARIG] = _("GIRAFARIG"), + [SPECIES_PINECO] = _("PINECO"), + [SPECIES_FORRETRESS] = _("FORRETRESS"), + [SPECIES_DUNSPARCE] = _("DUNSPARCE"), + [SPECIES_GLIGAR] = _("GLIGAR"), + [SPECIES_STEELIX] = _("STEELIX"), + [SPECIES_SNUBBULL] = _("SNUBBULL"), + [SPECIES_GRANBULL] = _("GRANBULL"), + [SPECIES_QWILFISH] = _("QWILFISH"), + [SPECIES_SCIZOR] = _("SCIZOR"), + [SPECIES_SHUCKLE] = _("SHUCKLE"), + [SPECIES_HERACROSS] = _("HERACROSS"), + [SPECIES_SNEASEL] = _("SNEASEL"), + [SPECIES_TEDDIURSA] = _("TEDDIURSA"), + [SPECIES_URSARING] = _("URSARING"), + [SPECIES_SLUGMA] = _("SLUGMA"), + [SPECIES_MAGCARGO] = _("MAGCARGO"), + [SPECIES_SWINUB] = _("SWINUB"), + [SPECIES_PILOSWINE] = _("PILOSWINE"), + [SPECIES_CORSOLA] = _("CORSOLA"), + [SPECIES_REMORAID] = _("REMORAID"), + [SPECIES_OCTILLERY] = _("OCTILLERY"), + [SPECIES_DELIBIRD] = _("DELIBIRD"), + [SPECIES_MANTINE] = _("MANTINE"), + [SPECIES_SKARMORY] = _("SKARMORY"), + [SPECIES_HOUNDOUR] = _("HOUNDOUR"), + [SPECIES_HOUNDOOM] = _("HOUNDOOM"), + [SPECIES_KINGDRA] = _("KINGDRA"), + [SPECIES_PHANPY] = _("PHANPY"), + [SPECIES_DONPHAN] = _("DONPHAN"), + [SPECIES_PORYGON2] = _("PORYGON2"), + [SPECIES_STANTLER] = _("STANTLER"), + [SPECIES_SMEARGLE] = _("SMEARGLE"), + [SPECIES_TYROGUE] = _("TYROGUE"), + [SPECIES_HITMONTOP] = _("HITMONTOP"), + [SPECIES_SMOOCHUM] = _("SMOOCHUM"), + [SPECIES_ELEKID] = _("ELEKID"), + [SPECIES_MAGBY] = _("MAGBY"), + [SPECIES_MILTANK] = _("MILTANK"), + [SPECIES_BLISSEY] = _("BLISSEY"), + [SPECIES_RAIKOU] = _("RAIKOU"), + [SPECIES_ENTEI] = _("ENTEI"), + [SPECIES_SUICUNE] = _("SUICUNE"), + [SPECIES_LARVITAR] = _("LARVITAR"), + [SPECIES_PUPITAR] = _("PUPITAR"), + [SPECIES_TYRANITAR] = _("TYRANITAR"), + [SPECIES_LUGIA] = _("LUGIA"), + [SPECIES_HO_OH] = _("HO-OH"), + [SPECIES_CELEBI] = _("CELEBI"), + [SPECIES_OLD_UNOWN_B] = _("?"), + [SPECIES_OLD_UNOWN_C] = _("?"), + [SPECIES_OLD_UNOWN_D] = _("?"), + [SPECIES_OLD_UNOWN_E] = _("?"), + [SPECIES_OLD_UNOWN_F] = _("?"), + [SPECIES_OLD_UNOWN_G] = _("?"), + [SPECIES_OLD_UNOWN_H] = _("?"), + [SPECIES_OLD_UNOWN_I] = _("?"), + [SPECIES_OLD_UNOWN_J] = _("?"), + [SPECIES_OLD_UNOWN_K] = _("?"), + [SPECIES_OLD_UNOWN_L] = _("?"), + [SPECIES_OLD_UNOWN_M] = _("?"), + [SPECIES_OLD_UNOWN_N] = _("?"), + [SPECIES_OLD_UNOWN_O] = _("?"), + [SPECIES_OLD_UNOWN_P] = _("?"), + [SPECIES_OLD_UNOWN_Q] = _("?"), + [SPECIES_OLD_UNOWN_R] = _("?"), + [SPECIES_OLD_UNOWN_S] = _("?"), + [SPECIES_OLD_UNOWN_T] = _("?"), + [SPECIES_OLD_UNOWN_U] = _("?"), + [SPECIES_OLD_UNOWN_V] = _("?"), + [SPECIES_OLD_UNOWN_W] = _("?"), + [SPECIES_OLD_UNOWN_X] = _("?"), + [SPECIES_OLD_UNOWN_Y] = _("?"), + [SPECIES_OLD_UNOWN_Z] = _("?"), + [SPECIES_TREECKO] = _("TREECKO"), + [SPECIES_GROVYLE] = _("GROVYLE"), + [SPECIES_SCEPTILE] = _("SCEPTILE"), + [SPECIES_TORCHIC] = _("TORCHIC"), + [SPECIES_COMBUSKEN] = _("COMBUSKEN"), + [SPECIES_BLAZIKEN] = _("BLAZIKEN"), + [SPECIES_MUDKIP] = _("MUDKIP"), + [SPECIES_MARSHTOMP] = _("MARSHTOMP"), + [SPECIES_SWAMPERT] = _("SWAMPERT"), + [SPECIES_POOCHYENA] = _("POOCHYENA"), + [SPECIES_MIGHTYENA] = _("MIGHTYENA"), + [SPECIES_ZIGZAGOON] = _("ZIGZAGOON"), + [SPECIES_LINOONE] = _("LINOONE"), + [SPECIES_WURMPLE] = _("WURMPLE"), + [SPECIES_SILCOON] = _("SILCOON"), + [SPECIES_BEAUTIFLY] = _("BEAUTIFLY"), + [SPECIES_CASCOON] = _("CASCOON"), + [SPECIES_DUSTOX] = _("DUSTOX"), + [SPECIES_LOTAD] = _("LOTAD"), + [SPECIES_LOMBRE] = _("LOMBRE"), + [SPECIES_LUDICOLO] = _("LUDICOLO"), + [SPECIES_SEEDOT] = _("SEEDOT"), + [SPECIES_NUZLEAF] = _("NUZLEAF"), + [SPECIES_SHIFTRY] = _("SHIFTRY"), + [SPECIES_NINCADA] = _("NINCADA"), + [SPECIES_NINJASK] = _("NINJASK"), + [SPECIES_SHEDINJA] = _("SHEDINJA"), + [SPECIES_TAILLOW] = _("TAILLOW"), + [SPECIES_SWELLOW] = _("SWELLOW"), + [SPECIES_SHROOMISH] = _("SHROOMISH"), + [SPECIES_BRELOOM] = _("BRELOOM"), + [SPECIES_SPINDA] = _("SPINDA"), + [SPECIES_WINGULL] = _("WINGULL"), + [SPECIES_PELIPPER] = _("PELIPPER"), + [SPECIES_SURSKIT] = _("SURSKIT"), + [SPECIES_MASQUERAIN] = _("MASQUERAIN"), + [SPECIES_WAILMER] = _("WAILMER"), + [SPECIES_WAILORD] = _("WAILORD"), + [SPECIES_SKITTY] = _("SKITTY"), + [SPECIES_DELCATTY] = _("DELCATTY"), + [SPECIES_KECLEON] = _("KECLEON"), + [SPECIES_BALTOY] = _("BALTOY"), + [SPECIES_CLAYDOL] = _("CLAYDOL"), + [SPECIES_NOSEPASS] = _("NOSEPASS"), + [SPECIES_TORKOAL] = _("TORKOAL"), + [SPECIES_SABLEYE] = _("SABLEYE"), + [SPECIES_BARBOACH] = _("BARBOACH"), + [SPECIES_WHISCASH] = _("WHISCASH"), + [SPECIES_LUVDISC] = _("LUVDISC"), + [SPECIES_CORPHISH] = _("CORPHISH"), + [SPECIES_CRAWDAUNT] = _("CRAWDAUNT"), + [SPECIES_FEEBAS] = _("FEEBAS"), + [SPECIES_MILOTIC] = _("MILOTIC"), + [SPECIES_CARVANHA] = _("CARVANHA"), + [SPECIES_SHARPEDO] = _("SHARPEDO"), + [SPECIES_TRAPINCH] = _("TRAPINCH"), + [SPECIES_VIBRAVA] = _("VIBRAVA"), + [SPECIES_FLYGON] = _("FLYGON"), + [SPECIES_MAKUHITA] = _("MAKUHITA"), + [SPECIES_HARIYAMA] = _("HARIYAMA"), + [SPECIES_ELECTRIKE] = _("ELECTRIKE"), + [SPECIES_MANECTRIC] = _("MANECTRIC"), + [SPECIES_NUMEL] = _("NUMEL"), + [SPECIES_CAMERUPT] = _("CAMERUPT"), + [SPECIES_SPHEAL] = _("SPHEAL"), + [SPECIES_SEALEO] = _("SEALEO"), + [SPECIES_WALREIN] = _("WALREIN"), + [SPECIES_CACNEA] = _("CACNEA"), + [SPECIES_CACTURNE] = _("CACTURNE"), + [SPECIES_SNORUNT] = _("SNORUNT"), + [SPECIES_GLALIE] = _("GLALIE"), + [SPECIES_LUNATONE] = _("LUNATONE"), + [SPECIES_SOLROCK] = _("SOLROCK"), + [SPECIES_AZURILL] = _("AZURILL"), + [SPECIES_SPOINK] = _("SPOINK"), + [SPECIES_GRUMPIG] = _("GRUMPIG"), + [SPECIES_PLUSLE] = _("PLUSLE"), + [SPECIES_MINUN] = _("MINUN"), + [SPECIES_MAWILE] = _("MAWILE"), + [SPECIES_MEDITITE] = _("MEDITITE"), + [SPECIES_MEDICHAM] = _("MEDICHAM"), + [SPECIES_SWABLU] = _("SWABLU"), + [SPECIES_ALTARIA] = _("ALTARIA"), + [SPECIES_WYNAUT] = _("WYNAUT"), + [SPECIES_DUSKULL] = _("DUSKULL"), + [SPECIES_DUSCLOPS] = _("DUSCLOPS"), + [SPECIES_ROSELIA] = _("ROSELIA"), + [SPECIES_SLAKOTH] = _("SLAKOTH"), + [SPECIES_VIGOROTH] = _("VIGOROTH"), + [SPECIES_SLAKING] = _("SLAKING"), + [SPECIES_GULPIN] = _("GULPIN"), + [SPECIES_SWALOT] = _("SWALOT"), + [SPECIES_TROPIUS] = _("TROPIUS"), + [SPECIES_WHISMUR] = _("WHISMUR"), + [SPECIES_LOUDRED] = _("LOUDRED"), + [SPECIES_EXPLOUD] = _("EXPLOUD"), + [SPECIES_CLAMPERL] = _("CLAMPERL"), + [SPECIES_HUNTAIL] = _("HUNTAIL"), + [SPECIES_GOREBYSS] = _("GOREBYSS"), + [SPECIES_ABSOL] = _("ABSOL"), + [SPECIES_SHUPPET] = _("SHUPPET"), + [SPECIES_BANETTE] = _("BANETTE"), + [SPECIES_SEVIPER] = _("SEVIPER"), + [SPECIES_ZANGOOSE] = _("ZANGOOSE"), + [SPECIES_RELICANTH] = _("RELICANTH"), + [SPECIES_ARON] = _("ARON"), + [SPECIES_LAIRON] = _("LAIRON"), + [SPECIES_AGGRON] = _("AGGRON"), + [SPECIES_CASTFORM] = _("CASTFORM"), + [SPECIES_VOLBEAT] = _("VOLBEAT"), + [SPECIES_ILLUMISE] = _("ILLUMISE"), + [SPECIES_LILEEP] = _("LILEEP"), + [SPECIES_CRADILY] = _("CRADILY"), + [SPECIES_ANORITH] = _("ANORITH"), + [SPECIES_ARMALDO] = _("ARMALDO"), + [SPECIES_RALTS] = _("RALTS"), + [SPECIES_KIRLIA] = _("KIRLIA"), + [SPECIES_GARDEVOIR] = _("GARDEVOIR"), + [SPECIES_BAGON] = _("BAGON"), + [SPECIES_SHELGON] = _("SHELGON"), + [SPECIES_SALAMENCE] = _("SALAMENCE"), + [SPECIES_BELDUM] = _("BELDUM"), + [SPECIES_METANG] = _("METANG"), + [SPECIES_METAGROSS] = _("METAGROSS"), + [SPECIES_REGIROCK] = _("REGIROCK"), + [SPECIES_REGICE] = _("REGICE"), + [SPECIES_REGISTEEL] = _("REGISTEEL"), + [SPECIES_KYOGRE] = _("KYOGRE"), + [SPECIES_GROUDON] = _("GROUDON"), + [SPECIES_RAYQUAZA] = _("RAYQUAZA"), + [SPECIES_LATIAS] = _("LATIAS"), + [SPECIES_LATIOS] = _("LATIOS"), + [SPECIES_JIRACHI] = _("JIRACHI"), + [SPECIES_DEOXYS] = _("DEOXYS"), + [SPECIES_CHIMECHO] = _("CHIMECHO"), +}; diff --git a/src/data/text/trainer_class_names.h b/src/data/text/trainer_class_names.h new file mode 100644 index 000000000..7a126a128 --- /dev/null +++ b/src/data/text/trainer_class_names.h @@ -0,0 +1,73 @@ +#ifndef GUARD_TRAINER_CLASS_NAMES_H +#define GUARD_TRAINER_CLASS_NAMES_H + +const u8 gTrainerClassNames[][13] = { + _("{PKMN} TRAINER"), + _("{PKMN} TRAINER"), + _("HIKER"), + _("TEAM AQUA"), + _("{PKMN} BREEDER"), + _("COOLTRAINER"), + _("BIRD KEEPER"), + _("COLLECTOR"), + _("SWIMMER♂"), + _("TEAM MAGMA"), + _("EXPERT"), + _("AQUA ADMIN"), + _("BLACK BELT"), + _("AQUA LEADER"), + _("HEX MANIAC"), + _("AROMA LADY"), + _("RUIN MANIAC"), + _("INTERVIEWER"), + _("TUBER"), + _("TUBER"), + _("LADY"), + _("BEAUTY"), + _("RICH BOY"), + _("POKéMANIAC"), + _("GUITARIST"), + _("KINDLER"), + _("CAMPER"), + _("PICNICKER"), + _("BUG MANIAC"), + _("PSYCHIC"), + _("GENTLEMAN"), + _("ELITE FOUR"), + _("LEADER"), + _("SCHOOL KID"), + _("SR. AND JR."), + _("WINSTRATE"), + _("POKéFAN"), + _("YOUNGSTER"), + _("CHAMPION"), + _("FISHERMAN"), + _("TRIATHLETE"), + _("DRAGON TAMER"), + _("NINJA BOY"), + _("BATTLE GIRL"), + _("PARASOL LADY"), + _("SWIMMER♀"), + _("TWINS"), + _("SAILOR"), + _("COOLTRAINER"), + _("MAGMA ADMIN"), + _("{PKMN} TRAINER"), + _("BUG CATCHER"), + _("{PKMN} RANGER"), + _("MAGMA LEADER"), + _("LASS"), + _("YOUNG COUPLE"), + _("OLD COUPLE"), + _("SIS AND BRO"), + _("SALON MAIDEN"), + _("DOME ACE"), + _("PALACE MAVEN"), + _("ARENA TYCOON"), + _("FACTORY HEAD"), + _("PIKE QUEEN"), + _("PYRAMID KING"), + _("{PKMN} TRAINER"), +}; + +#endif diff --git a/src/data/trainer_parties.h b/src/data/trainer_parties.h new file mode 100644 index 000000000..4993186d2 --- /dev/null +++ b/src/data/trainer_parties.h @@ -0,0 +1,12437 @@ +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer1[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_GEODUDE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt1[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt2[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_ZUBAT, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt3[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt4[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt5[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt6[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt7[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle1[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_SKITTY, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_LOTAD, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_SEEDOT, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_TAILLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt8[] = { + { + .iv = 0, + .lvl = 9, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marcel[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_SHIFTRY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alberto[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_PELIPPER, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ed[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_ZANGOOSE, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_SEVIPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt9[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Declan[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt10[] = { + { + .iv = 0, + .lvl = 11, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt11[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_ZUBAT, + }, + { + .iv = 0, + .lvl = 27, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt12[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 0, + .lvl = 27, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt13[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_ZUBAT, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt14[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt15[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ZUBAT, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt16[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt17[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt18[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt19[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt20[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt21[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt22[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fredrick[] = { + { + .iv = 100, + .lvl = 30, + .species = SPECIES_MAKUHITA, + }, + { + .iv = 100, + .lvl = 30, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Matt[] = { + { + .iv = 50, + .lvl = 34, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 50, + .lvl = 34, + .species = SPECIES_GOLBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Zander[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelly1[] = { + { + .iv = 50, + .lvl = 28, + .species = SPECIES_CARVANHA, + }, + { + .iv = 50, + .lvl = 28, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelly2[] = { + { + .iv = 100, + .lvl = 37, + .species = SPECIES_SHARPEDO, + }, + { + .iv = 100, + .lvl = 37, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Archie[] = { + { + .iv = 150, + .lvl = 41, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 150, + .lvl = 41, + .species = SPECIES_CROBAT, + }, + { + .iv = 150, + .lvl = 43, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leah[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_SPOINK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Daisy[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose1[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ROSELIA, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Felix[] = { + { + .iv = 0, + .lvl = 43, + .species = SPECIES_MEDICHAM, + .moves = MOVE_PSYCHIC, MOVE_NONE, MOVE_NONE, MOVE_NONE + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_CLAYDOL, + .moves = MOVE_SKILL_SWAP, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Violet[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_ROSELIA, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_GLOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose3[] = { + { + .iv = 20, + .lvl = 28, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_GLOOM, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_GLOOM, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rose5[] = { + { + .iv = 40, + .lvl = 34, + .species = SPECIES_BRELOOM, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_GLOOM, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty1[] = { + { + .iv = 50, + .lvl = 23, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Chip[] = { + { + .iv = 50, + .lvl = 27, + .species = SPECIES_BALTOY, + .moves = MOVE_PSYBEAM, MOVE_SELF_DESTRUCT, MOVE_SANDSTORM, MOVE_ANCIENT_POWER + }, + { + .iv = 50, + .lvl = 27, + .species = SPECIES_SANDSHREW, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + }, + { + .iv = 50, + .lvl = 27, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Foster[] = { + { + .iv = 100, + .lvl = 25, + .species = SPECIES_SANDSHREW, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + }, + { + .iv = 100, + .lvl = 25, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty2[] = { + { + .iv = 60, + .lvl = 27, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty3[] = { + { + .iv = 70, + .lvl = 30, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty4[] = { + { + .iv = 80, + .lvl = 33, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Dusty5[] = { + { + .iv = 90, + .lvl = 36, + .species = SPECIES_SANDSLASH, + .moves = MOVE_DIG, MOVE_SLASH, MOVE_SAND_ATTACK, MOVE_POISON_STING + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy1[] = { + { + .iv = 50, + .lvl = 17, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 50, + .lvl = 17, + .species = SPECIES_WHISMUR, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy2[] = { + { + .iv = 100, + .lvl = 27, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy3[] = { + { + .iv = 150, + .lvl = 30, + .species = SPECIES_MAGNETON, + }, + { + .iv = 150, + .lvl = 30, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy4[] = { + { + .iv = 200, + .lvl = 33, + .species = SPECIES_MAGNETON, + }, + { + .iv = 200, + .lvl = 33, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_GabbyAndTy5[] = { + { + .iv = 250, + .lvl = 36, + .species = SPECIES_MAGNETON, + }, + { + .iv = 250, + .lvl = 36, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_GabbyAndTy6[] = { + { + .iv = 250, + .lvl = 39, + .species = SPECIES_MAGNETON, + .moves = MOVE_SONIC_BOOM, MOVE_THUNDER_WAVE, MOVE_METAL_SOUND, MOVE_THUNDERBOLT + }, + { + .iv = 250, + .lvl = 39, + .species = SPECIES_EXPLOUD, + .moves = MOVE_ASTONISH, MOVE_STOMP, MOVE_SUPERSONIC, MOVE_HYPER_VOICE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola1[] = { + { + .iv = 10, + .lvl = 12, + .species = SPECIES_AZURILL, + }, + { + .iv = 10, + .lvl = 12, + .species = SPECIES_AZURILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Austina[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gwen[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_MARILL, + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_MARILL, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola4[] = { + { + .iv = 30, + .lvl = 32, + .species = SPECIES_MARILL, + }, + { + .iv = 30, + .lvl = 32, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lola5[] = { + { + .iv = 40, + .lvl = 35, + .species = SPECIES_AZUMARILL, + }, + { + .iv = 40, + .lvl = 35, + .species = SPECIES_AZUMARILL, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky1[] = { + { + .iv = 10, + .lvl = 13, + .species = SPECIES_ZIGZAGOON, + .moves = MOVE_SAND_ATTACK, MOVE_HEADBUTT, MOVE_TAIL_WHIP, MOVE_SURF + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Simon[] = { + { + .iv = 0, + .lvl = 12, + .species = SPECIES_AZURILL, + }, + { + .iv = 0, + .lvl = 12, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Charlie[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky2[] = { + { + .iv = 10, + .lvl = 27, + .species = SPECIES_LINOONE, + .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky3[] = { + { + .iv = 20, + .lvl = 30, + .species = SPECIES_LINOONE, + .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky4[] = { + { + .iv = 30, + .lvl = 33, + .species = SPECIES_LINOONE, + .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Ricky5[] = { + { + .iv = 40, + .lvl = 36, + .species = SPECIES_LINOONE, + .moves = MOVE_SAND_ATTACK, MOVE_PIN_MISSILE, MOVE_TAIL_WHIP, MOVE_SURF + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Randall[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_SWELLOW, + .heldItem = ITEM_NONE, + .moves = MOVE_QUICK_ATTACK, MOVE_AGILITY, MOVE_WING_ATTACK, MOVE_NONE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Parker[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_SPINDA, + .heldItem = ITEM_NONE, + .moves = MOVE_TEETER_DANCE, MOVE_DIZZY_PUNCH, MOVE_FOCUS_PUNCH, MOVE_NONE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_George[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_SLAKOTH, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SLACK_OFF, MOVE_COUNTER, MOVE_SHADOW_BALL, MOVE_NONE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Berke[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_VIGOROTH, + .heldItem = ITEM_NONE, + .moves = MOVE_FOCUS_ENERGY, MOVE_SLASH, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Braxton[] = { + { + .iv = 100, + .lvl = 28, + .species = SPECIES_SWELLOW, + .moves = MOVE_FOCUS_ENERGY, MOVE_QUICK_ATTACK, MOVE_WING_ATTACK, MOVE_ENDEAVOR + }, + { + .iv = 100, + .lvl = 28, + .species = SPECIES_TRAPINCH, + .moves = MOVE_BITE, MOVE_DIG, MOVE_FAINT_ATTACK, MOVE_SAND_TOMB + }, + { + .iv = 100, + .lvl = 28, + .species = SPECIES_WAILMER, + .moves = MOVE_ROLLOUT, MOVE_WHIRLPOOL, MOVE_ASTONISH, MOVE_WATER_PULSE + }, + { + .iv = 100, + .lvl = 28, + .species = SPECIES_MAGNETON, + .moves = MOVE_THUNDERBOLT, MOVE_SUPERSONIC, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM + }, + { + .iv = 100, + .lvl = 28, + .species = SPECIES_SHIFTRY, + .moves = MOVE_GIGA_DRAIN, MOVE_FAINT_ATTACK, MOVE_DOUBLE_TEAM, MOVE_SWAGGER + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Vincent[] = { + { + .iv = 100, + .lvl = 44, + .species = SPECIES_SABLEYE, + }, + { + .iv = 100, + .lvl = 44, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 100, + .lvl = 44, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leroy[] = { + { + .iv = 100, + .lvl = 46, + .species = SPECIES_MAWILE, + }, + { + .iv = 100, + .lvl = 46, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton1[] = { + { + .iv = 100, + .lvl = 17, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_WAILMER, + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edgar[] = { + { + .iv = 100, + .lvl = 43, + .species = SPECIES_CACTURNE, + }, + { + .iv = 100, + .lvl = 43, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Albert[] = { + { + .iv = 100, + .lvl = 43, + .species = SPECIES_MAGNETON, + }, + { + .iv = 100, + .lvl = 43, + .species = SPECIES_MUK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Samuel[] = { + { + .iv = 100, + .lvl = 42, + .species = SPECIES_SWELLOW, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_MAWILE, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_KADABRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Vito[] = { + { + .iv = 100, + .lvl = 42, + .species = SPECIES_DODRIO, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_KADABRA, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_ELECTRODE, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_SHIFTRY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Owen[] = { + { + .iv = 100, + .lvl = 42, + .species = SPECIES_KECLEON, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_GRAVELER, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_WAILORD, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton2[] = { + { + .iv = 110, + .lvl = 26, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 110, + .lvl = 26, + .species = SPECIES_WAILMER, + }, + { + .iv = 110, + .lvl = 26, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton3[] = { + { + .iv = 120, + .lvl = 29, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 120, + .lvl = 29, + .species = SPECIES_WAILMER, + }, + { + .iv = 120, + .lvl = 29, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton4[] = { + { + .iv = 130, + .lvl = 32, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 130, + .lvl = 32, + .species = SPECIES_WAILMER, + }, + { + .iv = 130, + .lvl = 32, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wilton5[] = { + { + .iv = 140, + .lvl = 35, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 140, + .lvl = 35, + .species = SPECIES_WAILMER, + }, + { + .iv = 140, + .lvl = 35, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Warren[] = { + { + .iv = 100, + .lvl = 33, + .species = SPECIES_GRAVELER, + }, + { + .iv = 100, + .lvl = 33, + .species = SPECIES_LUDICOLO, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Mary[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_DELCATTY, + .heldItem = ITEM_NONE, + .moves = MOVE_FAINT_ATTACK, MOVE_SHOCK_WAVE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Alexia[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_WIGGLYTUFF, + .heldItem = ITEM_NONE, + .moves = MOVE_DEFENSE_CURL, MOVE_DOUBLE_EDGE, MOVE_SHADOW_BALL, MOVE_NONE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Jody[] = { + { + .iv = 255, + .lvl = 26, + .species = SPECIES_ZANGOOSE, + .heldItem = ITEM_NONE, + .moves = MOVE_SWORDS_DANCE, MOVE_SLASH, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Wendy[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_MAWILE, + .moves = MOVE_BATON_PASS, MOVE_FAINT_ATTACK, MOVE_FAKE_TEARS, MOVE_BITE + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_ROSELIA, + .moves = MOVE_MEGA_DRAIN, MOVE_MAGICAL_LEAF, MOVE_GRASS_WHISTLE, MOVE_LEECH_SEED + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_PELIPPER, + .moves = MOVE_FLY, MOVE_WATER_GUN, MOVE_MIST, MOVE_PROTECT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Keira[] = { + { + .iv = 100, + .lvl = 45, + .species = SPECIES_LAIRON, + }, + { + .iv = 100, + .lvl = 45, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke1[] = { + { + .iv = 100, + .lvl = 17, + .species = SPECIES_WINGULL, + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_NUMEL, + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jennifer[] = { + { + .iv = 200, + .lvl = 30, + .species = SPECIES_SABLEYE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hope[] = { + { + .iv = 100, + .lvl = 45, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shannon[] = { + { + .iv = 100, + .lvl = 45, + .species = SPECIES_CLAYDOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Michelle[] = { + { + .iv = 100, + .lvl = 42, + .species = SPECIES_TORKOAL, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_LUDICOLO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Caroline[] = { + { + .iv = 100, + .lvl = 43, + .species = SPECIES_SKARMORY, + }, + { + .iv = 100, + .lvl = 43, + .species = SPECIES_SABLEYE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Julie[] = { + { + .iv = 100, + .lvl = 42, + .species = SPECIES_SANDSLASH, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_NINETALES, + }, + { + .iv = 100, + .lvl = 42, + .species = SPECIES_TROPIUS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke2[] = { + { + .iv = 110, + .lvl = 26, + .species = SPECIES_WINGULL, + }, + { + .iv = 110, + .lvl = 26, + .species = SPECIES_NUMEL, + }, + { + .iv = 110, + .lvl = 26, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke3[] = { + { + .iv = 120, + .lvl = 29, + .species = SPECIES_PELIPPER, + }, + { + .iv = 120, + .lvl = 29, + .species = SPECIES_NUMEL, + }, + { + .iv = 120, + .lvl = 29, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke4[] = { + { + .iv = 130, + .lvl = 32, + .species = SPECIES_PELIPPER, + }, + { + .iv = 130, + .lvl = 32, + .species = SPECIES_NUMEL, + }, + { + .iv = 130, + .lvl = 32, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brooke5[] = { + { + .iv = 140, + .lvl = 34, + .species = SPECIES_PELIPPER, + }, + { + .iv = 140, + .lvl = 34, + .species = SPECIES_CAMERUPT, + }, + { + .iv = 140, + .lvl = 34, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Patricia[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_BANETTE, + }, + { + .iv = 0, + .lvl = 41, + .species = SPECIES_LUNATONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kindra[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_DUSKULL, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_SHUPPET, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tammy[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_DUSKULL, + }, + { + .iv = 0, + .lvl = 29, + .species = SPECIES_SHUPPET, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie1[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SABLEYE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tasha[] = { + { + .iv = 50, + .lvl = 32, + .species = SPECIES_SHUPPET, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie2[] = { + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SABLEYE, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SPOINK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie3[] = { + { + .iv = 20, + .lvl = 35, + .species = SPECIES_SPOINK, + }, + { + .iv = 20, + .lvl = 35, + .species = SPECIES_SABLEYE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie4[] = { + { + .iv = 30, + .lvl = 40, + .species = SPECIES_SPOINK, + }, + { + .iv = 30, + .lvl = 40, + .species = SPECIES_SABLEYE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Valerie5[] = { + { + .iv = 40, + .lvl = 42, + .species = SPECIES_DUSKULL, + }, + { + .iv = 40, + .lvl = 42, + .species = SPECIES_SABLEYE, + }, + { + .iv = 40, + .lvl = 42, + .species = SPECIES_GRUMPIG, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy1[] = { + { + .iv = 0, + .lvl = 7, + .species = SPECIES_ZIGZAGOON, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Daphne[] = { + { + .iv = 100, + .lvl = 39, + .species = SPECIES_LUVDISC, + .heldItem = ITEM_NUGGET, + .moves = MOVE_ATTRACT, MOVE_SWEET_KISS, MOVE_FLAIL, MOVE_WATER_PULSE + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_LUVDISC, + .heldItem = ITEM_NUGGET, + .moves = MOVE_ATTRACT, MOVE_SAFEGUARD, MOVE_TAKE_DOWN, MOVE_WATER_PULSE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt23[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Cindy2[] = { + { + .iv = 0, + .lvl = 11, + .species = SPECIES_ZIGZAGOON, + .heldItem = ITEM_NUGGET, + .moves = MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Brianna[] = { + { + .iv = 150, + .lvl = 40, + .species = SPECIES_SEAKING, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Naomi[] = { + { + .iv = 100, + .lvl = 45, + .species = SPECIES_ROSELIA, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy3[] = { + { + .iv = 10, + .lvl = 27, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy4[] = { + { + .iv = 20, + .lvl = 30, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Cindy5[] = { + { + .iv = 30, + .lvl = 33, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Cindy6[] = { + { + .iv = 40, + .lvl = 36, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET, + .moves = MOVE_FURY_SWIPES, MOVE_MUD_SPORT, MOVE_ODOR_SLEUTH, MOVE_SAND_ATTACK + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Melissa[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sheila[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shirley[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica1[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_KECLEON, + .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK + }, + { + .iv = 0, + .lvl = 29, + .species = SPECIES_SEVIPER, + .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Connie[] = { + { + .iv = 100, + .lvl = 40, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bridget[] = { + { + .iv = 150, + .lvl = 40, + .species = SPECIES_AZUMARILL, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Olivia[] = { + { + .iv = 100, + .lvl = 35, + .species = SPECIES_CLAMPERL, + .moves = MOVE_IRON_DEFENSE, MOVE_WHIRLPOOL, MOVE_RAIN_DANCE, MOVE_WATER_PULSE + }, + { + .iv = 100, + .lvl = 37, + .species = SPECIES_CORPHISH, + .moves = MOVE_TAUNT, MOVE_CRABHAMMER, MOVE_WATER_PULSE, MOVE_NONE + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_LOMBRE, + .moves = MOVE_UPROAR, MOVE_FURY_SWIPES, MOVE_FAKE_OUT, MOVE_WATER_PULSE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tiffany[] = { + { + .iv = 100, + .lvl = 39, + .species = SPECIES_CARVANHA, + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica2[] = { + { + .iv = 10, + .lvl = 35, + .species = SPECIES_KECLEON, + .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK + }, + { + .iv = 10, + .lvl = 35, + .species = SPECIES_SEVIPER, + .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica3[] = { + { + .iv = 20, + .lvl = 38, + .species = SPECIES_KECLEON, + .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK + }, + { + .iv = 20, + .lvl = 38, + .species = SPECIES_SEVIPER, + .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica4[] = { + { + .iv = 30, + .lvl = 41, + .species = SPECIES_KECLEON, + .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK + }, + { + .iv = 30, + .lvl = 41, + .species = SPECIES_SEVIPER, + .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jessica5[] = { + { + .iv = 40, + .lvl = 44, + .species = SPECIES_KECLEON, + .moves = MOVE_BIND, MOVE_LICK, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK + }, + { + .iv = 40, + .lvl = 44, + .species = SPECIES_SEVIPER, + .moves = MOVE_POISON_TAIL, MOVE_SCREECH, MOVE_GLARE, MOVE_CRUNCH + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Winston1[] = { + { + .iv = 0, + .lvl = 7, + .species = SPECIES_ZIGZAGOON, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mollie[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WHISCASH, + }, + { + .iv = 200, + .lvl = 33, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Garret[] = { + { + .iv = 0, + .lvl = 45, + .species = SPECIES_AZUMARILL, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Winston2[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Winston3[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Winston4[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Winston5[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NUGGET, + .moves = MOVE_FURY_SWIPES, MOVE_MUD_SPORT, MOVE_ODOR_SLEUTH, MOVE_SAND_ATTACK + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve1[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_ARON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia1[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_WAILMER, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_HORSEA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mark[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_RHYHORN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt24[] = { + { + .iv = 0, + .lvl = 20, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve2[] = { + { + .iv = 10, + .lvl = 27, + .species = SPECIES_LAIRON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_LAIRON, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_RHYHORN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve4[] = { + { + .iv = 30, + .lvl = 32, + .species = SPECIES_LAIRON, + }, + { + .iv = 30, + .lvl = 32, + .species = SPECIES_RHYHORN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Steve5[] = { + { + .iv = 40, + .lvl = 35, + .species = SPECIES_AGGRON, + }, + { + .iv = 40, + .lvl = 35, + .species = SPECIES_RHYDON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Luis[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dominik[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Douglas[] = { + { + .iv = 10, + .lvl = 24, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 10, + .lvl = 24, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darrin[] = { + { + .iv = 10, + .lvl = 24, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 10, + .lvl = 24, + .species = SPECIES_WINGULL, + }, + { + .iv = 10, + .lvl = 24, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony1[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerome[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Matthew[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_David[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Spencer[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Roland[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nolen[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Stan[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_HORSEA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Barry[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dean[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_CARVANHA, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rodney[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Richard[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Herman[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Santiago[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TENTACRUEL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gilbert[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Franklin[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SEALEO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kevin[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SPHEAL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jack[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dudley[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chad[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony2[] = { + { + .iv = 10, + .lvl = 30, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony3[] = { + { + .iv = 20, + .lvl = 33, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_STARYU, + }, + { + .iv = 30, + .lvl = 36, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tony5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_STARMIE, + }, + { + .iv = 40, + .lvl = 39, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Takao[] = { + { + .iv = 127, + .lvl = 13, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hitoshi[] = { + { + .iv = 50, + .lvl = 32, + .species = SPECIES_MACHOP, + }, + { + .iv = 200, + .lvl = 32, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kiyo[] = { + { + .iv = 100, + .lvl = 34, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koichi[] = { + { + .iv = 100, + .lvl = 24, + .species = SPECIES_MACHOP, + }, + { + .iv = 150, + .lvl = 28, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob1[] = { + { + .iv = 100, + .lvl = 19, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob2[] = { + { + .iv = 110, + .lvl = 27, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob3[] = { + { + .iv = 120, + .lvl = 29, + .species = SPECIES_MACHOP, + }, + { + .iv = 120, + .lvl = 29, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nob4[] = { + { + .iv = 130, + .lvl = 31, + .species = SPECIES_MACHOP, + }, + { + .iv = 130, + .lvl = 31, + .species = SPECIES_MACHOKE, + }, + { + .iv = 130, + .lvl = 31, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Nob5[] = { + { + .iv = 140, + .lvl = 33, + .species = SPECIES_MACHOP, + .heldItem = ITEM_NONE + }, + { + .iv = 140, + .lvl = 33, + .species = SPECIES_MACHOKE, + .heldItem = ITEM_NONE + }, + { + .iv = 140, + .lvl = 33, + .species = SPECIES_MACHOKE, + .heldItem = ITEM_NONE + }, + { + .iv = 140, + .lvl = 33, + .species = SPECIES_MACHAMP, + .heldItem = ITEM_BLACK_BELT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Yuji[] = { + { + .iv = 100, + .lvl = 26, + .species = SPECIES_MAKUHITA, + }, + { + .iv = 100, + .lvl = 26, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Daisuke[] = { + { + .iv = 100, + .lvl = 19, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Atsushi[] = { + { + .iv = 100, + .lvl = 32, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Kirk[] = { + { + .iv = 100, + .lvl = 17, + .species = SPECIES_ELECTRIKE, + .moves = MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_SPARK, MOVE_LEER + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_VOLTORB, + .moves = MOVE_CHARGE, MOVE_SHOCK_WAVE, MOVE_SCREECH, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt25[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt26[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shawn[] = { + { + .iv = 100, + .lvl = 17, + .species = SPECIES_VOLTORB, + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando1[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton1[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 0, + .lvl = 15, + .species = SPECIES_WHISMUR, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton2[] = { + { + .iv = 10, + .lvl = 25, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_WHISMUR, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton3[] = { + { + .iv = 20, + .lvl = 28, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_LOUDRED, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_MAGNETON, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_LOUDRED, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_MAGNETON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dalton5[] = { + { + .iv = 40, + .lvl = 34, + .species = SPECIES_MAGNETON, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_EXPLOUD, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_MAGNETON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cole[] = { + { + .iv = 100, + .lvl = 23, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeff[] = { + { + .iv = 100, + .lvl = 22, + .species = SPECIES_SLUGMA, + }, + { + .iv = 100, + .lvl = 22, + .species = SPECIES_SLUGMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Axle[] = { + { + .iv = 100, + .lvl = 23, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jace[] = { + { + .iv = 100, + .lvl = 23, + .species = SPECIES_SLUGMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Keegan[] = { + { + .iv = 120, + .lvl = 23, + .species = SPECIES_SLUGMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie1[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SLUGMA, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_SLUGMA, + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_SLUGMA, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie4[] = { + { + .iv = 30, + .lvl = 32, + .species = SPECIES_SLUGMA, + }, + { + .iv = 30, + .lvl = 32, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bernie5[] = { + { + .iv = 40, + .lvl = 35, + .species = SPECIES_MAGCARGO, + }, + { + .iv = 40, + .lvl = 35, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Drew[] = { + { + .iv = 0, + .lvl = 23, + .species = SPECIES_SANDSHREW, + .moves = MOVE_DIG, MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Beau[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_BALTOY, + .moves = MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, MOVE_ROCK_TOMB + }, + { + .iv = 0, + .lvl = 21, + .species = SPECIES_SANDSHREW, + .moves = MOVE_POISON_STING, MOVE_SAND_ATTACK, MOVE_SCRATCH, MOVE_DIG + }, + { + .iv = 0, + .lvl = 21, + .species = SPECIES_BALTOY, + .moves = MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, MOVE_ROCK_TOMB + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Larry[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shane[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Justin[] = { + { + .iv = 0, + .lvl = 24, + .species = SPECIES_KECLEON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan1[] = { + { + .iv = 0, + .lvl = 20, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 20, + .species = SPECIES_TAILLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Autumn[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Travis[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_TAILLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_LINOONE, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_SWELLOW, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_LINOONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ethan5[] = { + { + .iv = 40, + .lvl = 34, + .species = SPECIES_SWELLOW, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_SANDSLASH, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_LINOONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brent[] = { + { + .iv = 100, + .lvl = 26, + .species = SPECIES_SURSKIT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Donald[] = { + { + .iv = 100, + .lvl = 24, + .species = SPECIES_WURMPLE, + }, + { + .iv = 100, + .lvl = 24, + .species = SPECIES_SILCOON, + }, + { + .iv = 100, + .lvl = 24, + .species = SPECIES_BEAUTIFLY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Taylor[] = { + { + .iv = 100, + .lvl = 27, + .species = SPECIES_WURMPLE, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_CASCOON, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_DUSTOX, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey1[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_SURSKIT, + }, + { + .iv = 0, + .lvl = 27, + .species = SPECIES_SURSKIT, + }, + { + .iv = 0, + .lvl = 27, + .species = SPECIES_SURSKIT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Derek[] = { + { + .iv = 150, + .lvl = 16, + .species = SPECIES_DUSTOX, + }, + { + .iv = 150, + .lvl = 16, + .species = SPECIES_BEAUTIFLY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey2[] = { + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SURSKIT, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SURSKIT, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SURSKIT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey3[] = { + { + .iv = 20, + .lvl = 34, + .species = SPECIES_SURSKIT, + }, + { + .iv = 20, + .lvl = 34, + .species = SPECIES_SURSKIT, + }, + { + .iv = 20, + .lvl = 34, + .species = SPECIES_MASQUERAIN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jeffrey4[] = { + { + .iv = 30, + .lvl = 36, + .species = SPECIES_SURSKIT, + }, + { + .iv = 30, + .lvl = 36, + .species = SPECIES_WURMPLE, + }, + { + .iv = 30, + .lvl = 36, + .species = SPECIES_SURSKIT, + }, + { + .iv = 30, + .lvl = 36, + .species = SPECIES_MASQUERAIN, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Jeffrey5[] = { + { + .iv = 40, + .lvl = 38, + .species = SPECIES_SURSKIT, + .heldItem = ITEM_NONE + }, + { + .iv = 40, + .lvl = 38, + .species = SPECIES_DUSTOX, + .heldItem = ITEM_NONE + }, + { + .iv = 40, + .lvl = 38, + .species = SPECIES_SURSKIT, + .heldItem = ITEM_NONE + }, + { + .iv = 40, + .lvl = 38, + .species = SPECIES_MASQUERAIN, + .heldItem = ITEM_SILVER_POWDER + }, + { + .iv = 40, + .lvl = 38, + .species = SPECIES_BEAUTIFLY, + .heldItem = ITEM_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Edward[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_ABRA, + .moves = MOVE_HIDDEN_POWER, MOVE_NONE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Preston[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_KIRLIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Virgil[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_RALTS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Blake[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_GIRAFARIG, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_William[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_RALTS, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_RALTS, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_KIRLIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Joshua[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_KADABRA, + }, + { + .iv = 0, + .lvl = 41, + .species = SPECIES_SOLROCK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron1[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_SOLROCK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron2[] = { + { + .iv = 10, + .lvl = 33, + .species = SPECIES_KADABRA, + }, + { + .iv = 10, + .lvl = 33, + .species = SPECIES_SOLROCK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron3[] = { + { + .iv = 20, + .lvl = 38, + .species = SPECIES_KADABRA, + }, + { + .iv = 20, + .lvl = 38, + .species = SPECIES_SOLROCK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron4[] = { + { + .iv = 30, + .lvl = 41, + .species = SPECIES_KADABRA, + }, + { + .iv = 30, + .lvl = 41, + .species = SPECIES_SOLROCK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cameron5[] = { + { + .iv = 40, + .lvl = 45, + .species = SPECIES_SOLROCK, + }, + { + .iv = 40, + .lvl = 45, + .species = SPECIES_ALAKAZAM, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jaclyn[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_ABRA, + .moves = MOVE_HIDDEN_POWER, MOVE_NONE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hannah[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_KIRLIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Samantha[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maura[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_KADABRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kayla[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_WOBBUFFET, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_NATU, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_KADABRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alexis[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_KIRLIA, + }, + { + .iv = 0, + .lvl = 41, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki1[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_KADABRA, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_LUNATONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki2[] = { + { + .iv = 10, + .lvl = 34, + .species = SPECIES_KADABRA, + }, + { + .iv = 10, + .lvl = 34, + .species = SPECIES_LUNATONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki3[] = { + { + .iv = 20, + .lvl = 37, + .species = SPECIES_KADABRA, + }, + { + .iv = 20, + .lvl = 37, + .species = SPECIES_LUNATONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki4[] = { + { + .iv = 30, + .lvl = 40, + .species = SPECIES_KADABRA, + }, + { + .iv = 30, + .lvl = 40, + .species = SPECIES_LUNATONE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacki5[] = { + { + .iv = 40, + .lvl = 43, + .species = SPECIES_LUNATONE, + }, + { + .iv = 40, + .lvl = 43, + .species = SPECIES_ALAKAZAM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Walter1[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Micah[] = { + { + .iv = 0, + .lvl = 44, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 0, + .lvl = 44, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thomas[] = { + { + .iv = 0, + .lvl = 45, + .species = SPECIES_ZANGOOSE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Walter2[] = { + { + .iv = 10, + .lvl = 34, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Walter3[] = { + { + .iv = 20, + .lvl = 36, + .species = SPECIES_LINOONE, + .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, MOVE_FURY_SWIPES + }, + { + .iv = 20, + .lvl = 36, + .species = SPECIES_MANECTRIC, + .moves = MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, MOVE_ROAR + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Walter4[] = { + { + .iv = 30, + .lvl = 39, + .species = SPECIES_LINOONE, + .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, MOVE_FURY_SWIPES + }, + { + .iv = 30, + .lvl = 39, + .species = SPECIES_MANECTRIC, + .moves = MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Walter5[] = { + { + .iv = 40, + .lvl = 41, + .species = SPECIES_LINOONE, + .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_ODOR_SLEUTH, MOVE_FURY_SWIPES + }, + { + .iv = 40, + .lvl = 41, + .species = SPECIES_GOLDUCK, + .moves = MOVE_FURY_SWIPES, MOVE_DISABLE, MOVE_CONFUSION, MOVE_PSYCH_UP + }, + { + .iv = 40, + .lvl = 41, + .species = SPECIES_MANECTRIC, + .moves = MOVE_QUICK_ATTACK, MOVE_SPARK, MOVE_ODOR_SLEUTH, MOVE_ROAR + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Sidney[] = { + { + .iv = 250, + .lvl = 46, + .species = SPECIES_MIGHTYENA, + .heldItem = ITEM_NONE, + .moves = MOVE_ROAR, MOVE_DOUBLE_EDGE, MOVE_SAND_ATTACK, MOVE_CRUNCH + }, + { + .iv = 250, + .lvl = 48, + .species = SPECIES_SHIFTRY, + .heldItem = ITEM_NONE, + .moves = MOVE_TORMENT, MOVE_DOUBLE_TEAM, MOVE_SWAGGER, MOVE_EXTRASENSORY + }, + { + .iv = 250, + .lvl = 46, + .species = SPECIES_CACTURNE, + .heldItem = ITEM_NONE, + .moves = MOVE_LEECH_SEED, MOVE_FAINT_ATTACK, MOVE_NEEDLE_ARM, MOVE_COTTON_SPORE + }, + { + .iv = 250, + .lvl = 48, + .species = SPECIES_CRAWDAUNT, + .heldItem = ITEM_NONE, + .moves = MOVE_SURF, MOVE_SWORDS_DANCE, MOVE_STRENGTH, MOVE_FACADE + }, + { + .iv = 255, + .lvl = 49, + .species = SPECIES_ABSOL, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_AERIAL_ACE, MOVE_ROCK_SLIDE, MOVE_SWORDS_DANCE, MOVE_SLASH + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Phoebe[] = { + { + .iv = 250, + .lvl = 48, + .species = SPECIES_DUSCLOPS, + .heldItem = ITEM_NONE, + .moves = MOVE_SHADOW_PUNCH, MOVE_CONFUSE_RAY, MOVE_CURSE, MOVE_PROTECT + }, + { + .iv = 250, + .lvl = 49, + .species = SPECIES_BANETTE, + .heldItem = ITEM_NONE, + .moves = MOVE_SHADOW_BALL, MOVE_GRUDGE, MOVE_WILL_O_WISP, MOVE_FAINT_ATTACK + }, + { + .iv = 250, + .lvl = 50, + .species = SPECIES_SABLEYE, + .heldItem = ITEM_NONE, + .moves = MOVE_SHADOW_BALL, MOVE_DOUBLE_TEAM, MOVE_NIGHT_SHADE, MOVE_FAINT_ATTACK + }, + { + .iv = 250, + .lvl = 49, + .species = SPECIES_BANETTE, + .heldItem = ITEM_NONE, + .moves = MOVE_SHADOW_BALL, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_FACADE + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_DUSCLOPS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SHADOW_BALL, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Glacia[] = { + { + .iv = 250, + .lvl = 50, + .species = SPECIES_SEALEO, + .heldItem = ITEM_NONE, + .moves = MOVE_ENCORE, MOVE_BODY_SLAM, MOVE_HAIL, MOVE_ICE_BALL + }, + { + .iv = 250, + .lvl = 50, + .species = SPECIES_GLALIE, + .heldItem = ITEM_NONE, + .moves = MOVE_LIGHT_SCREEN, MOVE_CRUNCH, MOVE_ICY_WIND, MOVE_ICE_BEAM + }, + { + .iv = 250, + .lvl = 52, + .species = SPECIES_SEALEO, + .heldItem = ITEM_NONE, + .moves = MOVE_ATTRACT, MOVE_DOUBLE_EDGE, MOVE_HAIL, MOVE_BLIZZARD + }, + { + .iv = 250, + .lvl = 52, + .species = SPECIES_GLALIE, + .heldItem = ITEM_NONE, + .moves = MOVE_SHADOW_BALL, MOVE_EXPLOSION, MOVE_HAIL, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_WALREIN, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SURF, MOVE_BODY_SLAM, MOVE_ICE_BEAM, MOVE_SHEER_COLD + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Drake[] = { + { + .iv = 250, + .lvl = 52, + .species = SPECIES_SHELGON, + .heldItem = ITEM_NONE, + .moves = MOVE_ROCK_TOMB, MOVE_DRAGON_CLAW, MOVE_PROTECT, MOVE_DOUBLE_EDGE + }, + { + .iv = 250, + .lvl = 54, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_NONE, + .moves = MOVE_DOUBLE_EDGE, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, MOVE_AERIAL_ACE + }, + { + .iv = 250, + .lvl = 53, + .species = SPECIES_KINGDRA, + .heldItem = ITEM_NONE, + .moves = MOVE_SMOKESCREEN, MOVE_DRAGON_DANCE, MOVE_SURF, MOVE_BODY_SLAM + }, + { + .iv = 250, + .lvl = 53, + .species = SPECIES_FLYGON, + .heldItem = ITEM_NONE, + .moves = MOVE_FLAMETHROWER, MOVE_CRUNCH, MOVE_DRAGON_BREATH, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_SALAMENCE, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_FLAMETHROWER, MOVE_DRAGON_CLAW, MOVE_ROCK_SLIDE, MOVE_CRUNCH + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne1[] = { + { + .iv = 100, + .lvl = 12, + .species = SPECIES_GEODUDE, + .heldItem = ITEM_NONE, + .moves = MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, MOVE_ROCK_TOMB + }, + { + .iv = 100, + .lvl = 12, + .species = SPECIES_GEODUDE, + .heldItem = ITEM_NONE, + .moves = MOVE_TACKLE, MOVE_DEFENSE_CURL, MOVE_ROCK_THROW, MOVE_ROCK_TOMB + }, + { + .iv = 200, + .lvl = 15, + .species = SPECIES_NOSEPASS, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_BLOCK, MOVE_HARDEN, MOVE_TACKLE, MOVE_ROCK_TOMB + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Brawly1[] = { + { + .iv = 100, + .lvl = 16, + .species = SPECIES_MACHOP, + .heldItem = ITEM_NONE, + .moves = MOVE_KARATE_CHOP, MOVE_LOW_KICK, MOVE_SEISMIC_TOSS, MOVE_BULK_UP + }, + { + .iv = 100, + .lvl = 16, + .species = SPECIES_MEDITITE, + .heldItem = ITEM_NONE, + .moves = MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_BULK_UP + }, + { + .iv = 200, + .lvl = 19, + .species = SPECIES_MAKUHITA, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_ARM_THRUST, MOVE_VITAL_THROW, MOVE_REVERSAL, MOVE_BULK_UP + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Wattson1[] = { + { + .iv = 200, + .lvl = 20, + .species = SPECIES_VOLTORB, + .heldItem = ITEM_NONE, + .moves = MOVE_ROLLOUT, MOVE_SPARK, MOVE_SELF_DESTRUCT, MOVE_SHOCK_WAVE + }, + { + .iv = 200, + .lvl = 20, + .species = SPECIES_ELECTRIKE, + .heldItem = ITEM_NONE, + .moves = MOVE_SHOCK_WAVE, MOVE_LEER, MOVE_QUICK_ATTACK, MOVE_HOWL + }, + { + .iv = 220, + .lvl = 22, + .species = SPECIES_MAGNETON, + .heldItem = ITEM_NONE, + .moves = MOVE_SUPERSONIC, MOVE_SHOCK_WAVE, MOVE_THUNDER_WAVE, MOVE_SONIC_BOOM + }, + { + .iv = 250, + .lvl = 24, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_SHOCK_WAVE, MOVE_HOWL + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Flannery1[] = { + { + .iv = 200, + .lvl = 24, + .species = SPECIES_NUMEL, + .heldItem = ITEM_NONE, + .moves = MOVE_OVERHEAT, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, MOVE_SUNNY_DAY + }, + { + .iv = 200, + .lvl = 24, + .species = SPECIES_SLUGMA, + .heldItem = ITEM_NONE, + .moves = MOVE_OVERHEAT, MOVE_SMOG, MOVE_LIGHT_SCREEN, MOVE_SUNNY_DAY + }, + { + .iv = 250, + .lvl = 26, + .species = SPECIES_CAMERUPT, + .heldItem = ITEM_NONE, + .moves = MOVE_OVERHEAT, MOVE_TACKLE, MOVE_SUNNY_DAY, MOVE_ATTRACT + }, + { + .iv = 250, + .lvl = 29, + .species = SPECIES_TORKOAL, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_BODY_SLAM, MOVE_ATTRACT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Norman1[] = { + { + .iv = 200, + .lvl = 27, + .species = SPECIES_SPINDA, + .heldItem = ITEM_NONE, + .moves = MOVE_TEETER_DANCE, MOVE_PSYBEAM, MOVE_FACADE, MOVE_ENCORE + }, + { + .iv = 200, + .lvl = 27, + .species = SPECIES_VIGOROTH, + .heldItem = ITEM_NONE, + .moves = MOVE_SLASH, MOVE_FACADE, MOVE_ENCORE, MOVE_FAINT_ATTACK + }, + { + .iv = 200, + .lvl = 29, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NONE, + .moves = MOVE_SLASH, MOVE_BELLY_DRUM, MOVE_FACADE, MOVE_HEADBUTT + }, + { + .iv = 250, + .lvl = 31, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_COUNTER, MOVE_YAWN, MOVE_FACADE, MOVE_FAINT_ATTACK + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Winona1[] = { + { + .iv = 210, + .lvl = 29, + .species = SPECIES_SWABLU, + .heldItem = ITEM_NONE, + .moves = MOVE_PERISH_SONG, MOVE_MIRROR_MOVE, MOVE_SAFEGUARD, MOVE_AERIAL_ACE + }, + { + .iv = 210, + .lvl = 29, + .species = SPECIES_TROPIUS, + .heldItem = ITEM_NONE, + .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_SYNTHESIS + }, + { + .iv = 210, + .lvl = 30, + .species = SPECIES_PELIPPER, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_GUN, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE + }, + { + .iv = 220, + .lvl = 31, + .species = SPECIES_SKARMORY, + .heldItem = ITEM_NONE, + .moves = MOVE_SAND_ATTACK, MOVE_FURY_ATTACK, MOVE_STEEL_WING, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 33, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_EARTHQUAKE, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE, MOVE_AERIAL_ACE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza1[] = { + { + .iv = 250, + .lvl = 41, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN + }, + { + .iv = 250, + .lvl = 41, + .species = SPECIES_XATU, + .heldItem = ITEM_NONE, + .moves = MOVE_PSYCHIC, MOVE_SUNNY_DAY, MOVE_CONFUSE_RAY, MOVE_CALM_MIND + }, + { + .iv = 250, + .lvl = 42, + .species = SPECIES_LUNATONE, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_LIGHT_SCREEN, MOVE_PSYCHIC, MOVE_HYPNOSIS, MOVE_CALM_MIND + }, + { + .iv = 250, + .lvl = 42, + .species = SPECIES_SOLROCK, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Juan1[] = { + { + .iv = 200, + .lvl = 41, + .species = SPECIES_LUVDISC, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_ATTRACT, MOVE_SWEET_KISS, MOVE_FLAIL + }, + { + .iv = 200, + .lvl = 41, + .species = SPECIES_WHISCASH, + .heldItem = ITEM_NONE, + .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_AMNESIA, MOVE_EARTHQUAKE + }, + { + .iv = 200, + .lvl = 43, + .species = SPECIES_SEALEO, + .heldItem = ITEM_NONE, + .moves = MOVE_ENCORE, MOVE_BODY_SLAM, MOVE_AURORA_BEAM, MOVE_WATER_PULSE + }, + { + .iv = 200, + .lvl = 43, + .species = SPECIES_CRAWDAUNT, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_CRABHAMMER, MOVE_TAUNT, MOVE_LEER + }, + { + .iv = 250, + .lvl = 46, + .species = SPECIES_KINGDRA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry1[] = { + { + .iv = 10, + .lvl = 9, + .species = SPECIES_RALTS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ted[] = { + { + .iv = 10, + .lvl = 17, + .species = SPECIES_RALTS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Paul[] = { + { + .iv = 10, + .lvl = 15, + .species = SPECIES_NUMEL, + }, + { + .iv = 10, + .lvl = 15, + .species = SPECIES_ODDISH, + }, + { + .iv = 10, + .lvl = 15, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry2[] = { + { + .iv = 20, + .lvl = 26, + .species = SPECIES_RALTS, + }, + { + .iv = 20, + .lvl = 26, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry3[] = { + { + .iv = 30, + .lvl = 29, + .species = SPECIES_KIRLIA, + }, + { + .iv = 30, + .lvl = 29, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry4[] = { + { + .iv = 40, + .lvl = 32, + .species = SPECIES_KIRLIA, + }, + { + .iv = 40, + .lvl = 32, + .species = SPECIES_MEDICHAM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jerry5[] = { + { + .iv = 50, + .lvl = 34, + .species = SPECIES_KIRLIA, + }, + { + .iv = 50, + .lvl = 34, + .species = SPECIES_BANETTE, + }, + { + .iv = 50, + .lvl = 34, + .species = SPECIES_MEDICHAM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen1[] = { + { + .iv = 10, + .lvl = 9, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Georgia[] = { + { + .iv = 10, + .lvl = 16, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 10, + .lvl = 16, + .species = SPECIES_BEAUTIFLY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen2[] = { + { + .iv = 20, + .lvl = 26, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 20, + .lvl = 26, + .species = SPECIES_WHISMUR, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen3[] = { + { + .iv = 30, + .lvl = 29, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 30, + .lvl = 29, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen4[] = { + { + .iv = 40, + .lvl = 32, + .species = SPECIES_BRELOOM, + }, + { + .iv = 40, + .lvl = 32, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Karen5[] = { + { + .iv = 50, + .lvl = 35, + .species = SPECIES_BRELOOM, + }, + { + .iv = 50, + .lvl = 35, + .species = SPECIES_EXPLOUD, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_KateAndJoy[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_SPINDA, + .moves = MOVE_HYPNOSIS, MOVE_PSYBEAM, MOVE_DIZZY_PUNCH, MOVE_TEETER_DANCE + }, + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SLAKING, + .moves = MOVE_FOCUS_PUNCH, MOVE_YAWN, MOVE_SLACK_OFF, MOVE_FAINT_ATTACK + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg1[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_ZIGZAGOON, + .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_MAKUHITA, + .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg2[] = { + { + .iv = 10, + .lvl = 28, + .species = SPECIES_ZIGZAGOON, + .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH + }, + { + .iv = 10, + .lvl = 30, + .species = SPECIES_MAKUHITA, + .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg3[] = { + { + .iv = 20, + .lvl = 31, + .species = SPECIES_ZIGZAGOON, + .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_MAKUHITA, + .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_LINOONE, + .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH + }, + { + .iv = 30, + .lvl = 36, + .species = SPECIES_MAKUHITA, + .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AnnaAndMeg5[] = { + { + .iv = 40, + .lvl = 36, + .species = SPECIES_LINOONE, + .moves = MOVE_GROWL, MOVE_TAIL_WHIP, MOVE_HEADBUTT, MOVE_ODOR_SLEUTH + }, + { + .iv = 40, + .lvl = 38, + .species = SPECIES_HARIYAMA, + .moves = MOVE_TACKLE, MOVE_FOCUS_ENERGY, MOVE_ARM_THRUST, MOVE_NONE + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Victor[] = { + { + .iv = 25, + .lvl = 16, + .species = SPECIES_TAILLOW, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 25, + .lvl = 16, + .species = SPECIES_ZIGZAGOON, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel1[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Colton[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL + }, + { + .iv = 0, + .lvl = 36, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL + }, + { + .iv = 0, + .lvl = 40, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL + }, + { + .iv = 0, + .lvl = 12, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL + }, + { + .iv = 0, + .lvl = 42, + .species = SPECIES_DELCATTY, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK, MOVE_HEAL_BELL + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel2[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel3[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SKITTY, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel4[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_DELCATTY, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Miguel5[] = { + { + .iv = 0, + .lvl = 38, + .species = SPECIES_DELCATTY, + .heldItem = ITEM_SITRUS_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Victoria[] = { + { + .iv = 50, + .lvl = 17, + .species = SPECIES_ROSELIA, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Vanessa[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_PIKACHU, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Bethany[] = { + { + .iv = 100, + .lvl = 35, + .species = SPECIES_AZURILL, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 100, + .lvl = 37, + .species = SPECIES_MARILL, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_AZUMARILL, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel1[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_PLUSLE, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_MINUN, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_PLUSLE, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_MINUN, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_PLUSLE, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_MINUN, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel4[] = { + { + .iv = 30, + .lvl = 32, + .species = SPECIES_PLUSLE, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 30, + .lvl = 32, + .species = SPECIES_MINUN, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Isabel5[] = { + { + .iv = 40, + .lvl = 35, + .species = SPECIES_PLUSLE, + .heldItem = ITEM_SITRUS_BERRY + }, + { + .iv = 40, + .lvl = 35, + .species = SPECIES_MINUN, + .heldItem = ITEM_SITRUS_BERRY + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Timothy1[] = { + { + .iv = 200, + .lvl = 27, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy2[] = { + { + .iv = 210, + .lvl = 33, + .species = SPECIES_HARIYAMA, + .moves = MOVE_ARM_THRUST, MOVE_KNOCK_OFF, MOVE_SAND_ATTACK, MOVE_DIG + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy3[] = { + { + .iv = 220, + .lvl = 36, + .species = SPECIES_HARIYAMA, + .moves = MOVE_ARM_THRUST, MOVE_KNOCK_OFF, MOVE_SAND_ATTACK, MOVE_DIG + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy4[] = { + { + .iv = 230, + .lvl = 39, + .species = SPECIES_HARIYAMA, + .moves = MOVE_ARM_THRUST, MOVE_BELLY_DRUM, MOVE_SAND_ATTACK, MOVE_DIG + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Timothy5[] = { + { + .iv = 240, + .lvl = 42, + .species = SPECIES_HARIYAMA, + .moves = MOVE_ARM_THRUST, MOVE_BELLY_DRUM, MOVE_SAND_ATTACK, MOVE_DIG + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Vicky[] = { + { + .iv = 200, + .lvl = 18, + .species = SPECIES_MEDITITE, + .moves = MOVE_HI_JUMP_KICK, MOVE_MEDITATE, MOVE_CONFUSION, MOVE_DETECT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby1[] = { + { + .iv = 200, + .lvl = 21, + .species = SPECIES_MEDITITE, + }, + { + .iv = 200, + .lvl = 21, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby2[] = { + { + .iv = 210, + .lvl = 30, + .species = SPECIES_MEDITITE, + }, + { + .iv = 210, + .lvl = 30, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby3[] = { + { + .iv = 220, + .lvl = 33, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 220, + .lvl = 33, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby4[] = { + { + .iv = 230, + .lvl = 36, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 230, + .lvl = 36, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shelby5[] = { + { + .iv = 240, + .lvl = 39, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 240, + .lvl = 39, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin1[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Billy[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 7, + .species = SPECIES_SEEDOT, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Josh[] = { + { + .iv = 100, + .lvl = 10, + .species = SPECIES_GEODUDE, + .moves = MOVE_TACKLE, MOVE_NONE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tommy[] = { + { + .iv = 110, + .lvl = 8, + .species = SPECIES_GEODUDE, + }, + { + .iv = 120, + .lvl = 8, + .species = SPECIES_GEODUDE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Joey[] = { + { + .iv = 0, + .lvl = 9, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Ben[] = { + { + .iv = 150, + .lvl = 17, + .species = SPECIES_ZIGZAGOON, + .moves = MOVE_HEADBUTT, MOVE_SAND_ATTACK, MOVE_GROWL, MOVE_THUNDERBOLT + }, + { + .iv = 150, + .lvl = 17, + .species = SPECIES_GULPIN, + .moves = MOVE_AMNESIA, MOVE_SLUDGE, MOVE_YAWN, MOVE_POUND + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Quincy[] = { + { + .iv = 100, + .lvl = 43, + .species = SPECIES_SLAKING, + .moves = MOVE_ATTRACT, MOVE_ICE_BEAM, MOVE_THUNDERBOLT, MOVE_FLAMETHROWER + }, + { + .iv = 100, + .lvl = 43, + .species = SPECIES_DUSCLOPS, + .moves = MOVE_SKILL_SWAP, MOVE_PROTECT, MOVE_WILL_O_WISP, MOVE_TOXIC + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Katelynn[] = { + { + .iv = 100, + .lvl = 43, + .species = SPECIES_GARDEVOIR, + .moves = MOVE_SKILL_SWAP, MOVE_PSYCHIC, MOVE_THUNDERBOLT, MOVE_CALM_MIND + }, + { + .iv = 100, + .lvl = 43, + .species = SPECIES_SLAKING, + .moves = MOVE_EARTHQUAKE, MOVE_SHADOW_BALL, MOVE_AERIAL_ACE, MOVE_BRICK_BREAK + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jaylen[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_TRAPINCH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dillon[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_ARON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin2[] = { + { + .iv = 10, + .lvl = 27, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin3[] = { + { + .iv = 20, + .lvl = 28, + .species = SPECIES_SWELLOW, + }, + { + .iv = 20, + .lvl = 30, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_SWELLOW, + }, + { + .iv = 30, + .lvl = 29, + .species = SPECIES_LINOONE, + }, + { + .iv = 30, + .lvl = 33, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Calvin5[] = { + { + .iv = 40, + .lvl = 34, + .species = SPECIES_SWELLOW, + }, + { + .iv = 40, + .lvl = 32, + .species = SPECIES_LINOONE, + }, + { + .iv = 40, + .lvl = 36, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Eddie[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 16, + .species = SPECIES_ZIGZAGOON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Allen[] = { + { + .iv = 0, + .lvl = 4, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 3, + .species = SPECIES_TAILLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Timmy[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_ARON, + }, + { + .iv = 0, + .lvl = 13, + .species = SPECIES_ELECTRIKE, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Wallace[] = { + { + .iv = 255, + .lvl = 57, + .species = SPECIES_WAILORD, + .heldItem = ITEM_NONE, + .moves = MOVE_RAIN_DANCE, MOVE_WATER_SPOUT, MOVE_DOUBLE_EDGE, MOVE_BLIZZARD + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_TENTACRUEL, + .heldItem = ITEM_NONE, + .moves = MOVE_TOXIC, MOVE_HYDRO_PUMP, MOVE_SLUDGE_BOMB, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 56, + .species = SPECIES_LUDICOLO, + .heldItem = ITEM_NONE, + .moves = MOVE_GIGA_DRAIN, MOVE_SURF, MOVE_LEECH_SEED, MOVE_DOUBLE_TEAM + }, + { + .iv = 255, + .lvl = 56, + .species = SPECIES_WHISCASH, + .heldItem = ITEM_NONE, + .moves = MOVE_EARTHQUAKE, MOVE_SURF, MOVE_AMNESIA, MOVE_HYPER_BEAM + }, + { + .iv = 255, + .lvl = 56, + .species = SPECIES_GYARADOS, + .heldItem = ITEM_NONE, + .moves = MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE, MOVE_HYPER_BEAM, MOVE_SURF + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_MILOTIC, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_RECOVER, MOVE_SURF, MOVE_ICE_BEAM, MOVE_TOXIC + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andrew[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 10, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 15, + .species = SPECIES_MAGIKARP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ivan[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 6, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 7, + .species = SPECIES_MAGIKARP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Claude[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_GOLDEEN, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_BARBOACH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot1[] = { + { + .iv = 0, + .lvl = 10, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 7, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 10, + .species = SPECIES_MAGIKARP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ned[] = { + { + .iv = 10, + .lvl = 11, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dale[] = { + { + .iv = 0, + .lvl = 11, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_WAILMER, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nolan[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_BARBOACH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Barny[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wade[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carter[] = { + { + .iv = 10, + .lvl = 25, + .species = SPECIES_WAILMER, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot2[] = { + { + .iv = 10, + .lvl = 24, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 10, + .lvl = 27, + .species = SPECIES_GYARADOS, + }, + { + .iv = 10, + .lvl = 27, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_GYARADOS, + }, + { + .iv = 20, + .lvl = 26, + .species = SPECIES_CARVANHA, + }, + { + .iv = 20, + .lvl = 26, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_GYARADOS, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_CARVANHA, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_TENTACRUEL, + }, + { + .iv = 31, + .lvl = 31, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elliot5[] = { + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GYARADOS, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_SHARPEDO, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GYARADOS, + }, + { + .iv = 40, + .lvl = 35, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ronald[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 21, + .species = SPECIES_GYARADOS, + }, + { + .iv = 0, + .lvl = 23, + .species = SPECIES_GYARADOS, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_GYARADOS, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_GYARADOS, + }, + { + .iv = 0, + .lvl = 35, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jacob[] = { + { + .iv = 20, + .lvl = 6, + .species = SPECIES_VOLTORB, + }, + { + .iv = 20, + .lvl = 6, + .species = SPECIES_VOLTORB, + }, + { + .iv = 200, + .lvl = 14, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Anthony[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin1[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin2[] = { + { + .iv = 10, + .lvl = 30, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin3[] = { + { + .iv = 20, + .lvl = 33, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin4[] = { + { + .iv = 30, + .lvl = 36, + .species = SPECIES_MAGNETON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benjamin5[] = { + { + .iv = 40, + .lvl = 39, + .species = SPECIES_MAGNETON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail1[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jasmine[] = { + { + .iv = 80, + .lvl = 14, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 80, + .lvl = 14, + .species = SPECIES_MAGNEMITE, + }, + { + .iv = 0, + .lvl = 6, + .species = SPECIES_VOLTORB, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail2[] = { + { + .iv = 10, + .lvl = 28, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail3[] = { + { + .iv = 20, + .lvl = 31, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_MAGNETON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Abigail5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_MAGNETON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan1[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan2[] = { + { + .iv = 10, + .lvl = 28, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan3[] = { + { + .iv = 20, + .lvl = 31, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_DODRIO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dylan5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_DODRIO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria1[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria2[] = { + { + .iv = 10, + .lvl = 28, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria3[] = { + { + .iv = 20, + .lvl = 31, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_DODRIO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maria5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_DODRIO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Camden[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_STARYU, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Demetrius[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_ELECTRIKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah1[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo1[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_STARYU, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chase[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_WINGULL, + }, + { + .iv = 80, + .lvl = 34, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah2[] = { + { + .iv = 10, + .lvl = 39, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah3[] = { + { + .iv = 20, + .lvl = 42, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah4[] = { + { + .iv = 30, + .lvl = 45, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaiah5[] = { + { + .iv = 40, + .lvl = 48, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isobel[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Donny[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_WINGULL, + }, + { + .iv = 160, + .lvl = 34, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Talia[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn1[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Allison[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_WINGULL, + }, + { + .iv = 240, + .lvl = 33, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn2[] = { + { + .iv = 10, + .lvl = 39, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn3[] = { + { + .iv = 20, + .lvl = 42, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn4[] = { + { + .iv = 30, + .lvl = 45, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katelyn5[] = { + { + .iv = 40, + .lvl = 48, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas1[] = { + { + .iv = 100, + .lvl = 37, + .species = SPECIES_ALTARIA, + }, + { + .iv = 100, + .lvl = 37, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas2[] = { + { + .iv = 110, + .lvl = 41, + .species = SPECIES_ALTARIA, + }, + { + .iv = 110, + .lvl = 41, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas3[] = { + { + .iv = 120, + .lvl = 44, + .species = SPECIES_ALTARIA, + }, + { + .iv = 120, + .lvl = 44, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicolas4[] = { + { + .iv = 130, + .lvl = 46, + .species = SPECIES_BAGON, + }, + { + .iv = 130, + .lvl = 46, + .species = SPECIES_ALTARIA, + }, + { + .iv = 130, + .lvl = 46, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Nicolas5[] = { + { + .iv = 140, + .lvl = 49, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_NONE + }, + { + .iv = 140, + .lvl = 49, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_NONE + }, + { + .iv = 140, + .lvl = 49, + .species = SPECIES_SHELGON, + .heldItem = ITEM_DRAGON_FANG + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Aaron[] = { + { + .iv = 255, + .lvl = 34, + .species = SPECIES_BAGON, + .moves = MOVE_DRAGON_BREATH, MOVE_HEADBUTT, MOVE_FOCUS_ENERGY, MOVE_EMBER + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Perry[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hugh[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_TROPIUS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Phil[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jared[] = { + { + .iv = 100, + .lvl = 27, + .species = SPECIES_DODUO, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_SKARMORY, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_TROPIUS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Humberto[] = { + { + .iv = 250, + .lvl = 30, + .species = SPECIES_SKARMORY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Presley[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_TROPIUS, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwardo[] = { + { + .iv = 150, + .lvl = 29, + .species = SPECIES_DODUO, + }, + { + .iv = 150, + .lvl = 29, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Colin[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_NATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert1[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Benny[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_SWELLOW, + }, + { + .iv = 0, + .lvl = 36, + .species = SPECIES_PELIPPER, + }, + { + .iv = 0, + .lvl = 36, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chester[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_TAILLOW, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert2[] = { + { + .iv = 10, + .lvl = 32, + .species = SPECIES_NATU, + }, + { + .iv = 10, + .lvl = 32, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert3[] = { + { + .iv = 20, + .lvl = 35, + .species = SPECIES_NATU, + }, + { + .iv = 20, + .lvl = 35, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert4[] = { + { + .iv = 30, + .lvl = 38, + .species = SPECIES_NATU, + }, + { + .iv = 30, + .lvl = 38, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robert5[] = { + { + .iv = 40, + .lvl = 41, + .species = SPECIES_ALTARIA, + }, + { + .iv = 40, + .lvl = 41, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alex[] = { + { + .iv = 150, + .lvl = 33, + .species = SPECIES_NATU, + }, + { + .iv = 150, + .lvl = 33, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Beck[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_TROPIUS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Yasu[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Takashi[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_NINJASK, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_KOFFING, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Dianne[] = { + { + .iv = 0, + .lvl = 43, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_SKILL_SWAP, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_LANTURN, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jani[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao1[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SMOG, MOVE_SELF_DESTRUCT + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SMOG, MOVE_SELF_DESTRUCT + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lung[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_KOFFING, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao2[] = { + { + .iv = 0, + .lvl = 24, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + }, + { + .iv = 0, + .lvl = 24, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE + }, + { + .iv = 0, + .lvl = 24, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_KOFFING, + .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao3[] = { + { + .iv = 20, + .lvl = 27, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + }, + { + .iv = 20, + .lvl = 27, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + }, + { + .iv = 20, + .lvl = 27, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_KOFFING, + .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Lao4[] = { + { + .iv = 30, + .lvl = 30, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE + }, + { + .iv = 30, + .lvl = 32, + .species = SPECIES_KOFFING, + .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Lao5[] = { + { + .iv = 40, + .lvl = 33, + .species = SPECIES_KOFFING, + .heldItem = ITEM_NONE, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_KOFFING, + .heldItem = ITEM_NONE, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_KOFFING, + .heldItem = ITEM_NONE, + .moves = MOVE_POISON_GAS, MOVE_TACKLE, MOVE_SLUDGE, MOVE_SELF_DESTRUCT + }, + { + .iv = 40, + .lvl = 35, + .species = SPECIES_WEEZING, + .heldItem = ITEM_SMOKE_BALL, + .moves = MOVE_TACKLE, MOVE_SLUDGE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jocelyn[] = { + { + .iv = 127, + .lvl = 13, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Laura[] = { + { + .iv = 150, + .lvl = 13, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy1[] = { + { + .iv = 100, + .lvl = 18, + .species = SPECIES_MEDITITE, + }, + { + .iv = 100, + .lvl = 18, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cora[] = { + { + .iv = 100, + .lvl = 27, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Paula[] = { + { + .iv = 100, + .lvl = 27, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy2[] = { + { + .iv = 110, + .lvl = 26, + .species = SPECIES_MEDITITE, + }, + { + .iv = 110, + .lvl = 26, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy3[] = { + { + .iv = 120, + .lvl = 29, + .species = SPECIES_MEDITITE, + }, + { + .iv = 120, + .lvl = 29, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy4[] = { + { + .iv = 130, + .lvl = 32, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 130, + .lvl = 32, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cyndy5[] = { + { + .iv = 140, + .lvl = 35, + .species = SPECIES_MEDICHAM, + }, + { + .iv = 140, + .lvl = 35, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline1[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_NUMEL, + .moves = MOVE_EMBER, MOVE_TACKLE, MOVE_MAGNITUDE, MOVE_SUNNY_DAY + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clarissa[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_ROSELIA, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Angelica[] = { + { + .iv = 50, + .lvl = 30, + .species = SPECIES_CASTFORM, + .moves = MOVE_RAIN_DANCE, MOVE_WEATHER_BALL, MOVE_THUNDER, MOVE_WATER_PULSE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline2[] = { + { + .iv = 10, + .lvl = 29, + .species = SPECIES_NUMEL, + .moves = MOVE_EMBER, MOVE_TACKLE, MOVE_MAGNITUDE, MOVE_SUNNY_DAY + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline3[] = { + { + .iv = 20, + .lvl = 32, + .species = SPECIES_NUMEL, + .moves = MOVE_EMBER, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, MOVE_SUNNY_DAY + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_ROSELIA, + .moves = MOVE_LEECH_SEED, MOVE_MEGA_DRAIN, MOVE_GRASS_WHISTLE, MOVE_SUNNY_DAY + }, + { + .iv = 30, + .lvl = 34, + .species = SPECIES_NUMEL, + .moves = MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_MAGNITUDE, MOVE_SUNNY_DAY + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Madeline5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_ROSELIA, + .moves = MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_SOLAR_BEAM, MOVE_SUNNY_DAY + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_CAMERUPT, + .moves = MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_EARTHQUAKE, MOVE_SUNNY_DAY + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Beverly[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Imani[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kyla[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Denise[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Beth[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tara[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_HORSEA, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Missy[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alice[] = { + { + .iv = 0, + .lvl = 24, + .species = SPECIES_GOLDEEN, + }, + { + .iv = 0, + .lvl = 24, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 24, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny1[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grace[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tanya[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_LUVDISC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sharon[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SEAKING, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nikki[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_MARILL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_SPHEAL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brenda[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Katie[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_GOLDEEN, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_SPHEAL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Susie[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_LUVDISC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kara[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SEAKING, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dana[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_AZUMARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sienna[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_LUVDISC, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_LUVDISC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Debra[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SEAKING, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Linda[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_HORSEA, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_SEADRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kaylee[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_LANTURN, + }, + { + .iv = 0, + .lvl = 34, + .species = SPECIES_PELIPPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Laurel[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_LUVDISC, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_LUVDISC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carlee[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_SEAKING, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny2[] = { + { + .iv = 0, + .lvl = 38, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny3[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny4[] = { + { + .iv = 0, + .lvl = 43, + .species = SPECIES_STARYU, + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenny5[] = { + { + .iv = 0, + .lvl = 45, + .species = SPECIES_LUVDISC, + }, + { + .iv = 0, + .lvl = 45, + .species = SPECIES_WAILMER, + }, + { + .iv = 0, + .lvl = 45, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Heidi[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_SANDSHREW, + .moves = MOVE_DIG, MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_BALTOY, + .moves = MOVE_RAPID_SPIN, MOVE_MUD_SLAP, MOVE_PSYBEAM, MOVE_ROCK_TOMB + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Becky[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_SANDSHREW, + .moves = MOVE_SAND_ATTACK, MOVE_POISON_STING, MOVE_SLASH, MOVE_DIG + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_MARILL, + .moves = MOVE_ROLLOUT, MOVE_BUBBLE_BEAM, MOVE_TAIL_WHIP, MOVE_DEFENSE_CURL + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carol[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_TAILLOW, + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_LOMBRE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nancy[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_MARILL, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_LOMBRE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Martha[] = { + { + .iv = 0, + .lvl = 23, + .species = SPECIES_SKITTY, + }, + { + .iv = 0, + .lvl = 23, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana1[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 19, + .species = SPECIES_ODDISH, + }, + { + .iv = 0, + .lvl = 19, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Cedric[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_WOBBUFFET, + .moves = MOVE_DESTINY_BOND, MOVE_SAFEGUARD, MOVE_COUNTER, MOVE_MIRROR_COAT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Irene[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana2[] = { + { + .iv = 10, + .lvl = 25, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_GLOOM, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana3[] = { + { + .iv = 20, + .lvl = 28, + .species = SPECIES_BRELOOM, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_GLOOM, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_BRELOOM, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_GLOOM, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Diana5[] = { + { + .iv = 40, + .lvl = 40, + .species = SPECIES_BRELOOM, + }, + { + .iv = 40, + .lvl = 40, + .species = SPECIES_VILEPLUME, + }, + { + .iv = 40, + .lvl = 40, + .species = SPECIES_ALTARIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv1[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_PLUSLE, + }, + { + .iv = 0, + .lvl = 15, + .species = SPECIES_MINUN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv2[] = { + { + .iv = 10, + .lvl = 27, + .species = SPECIES_PLUSLE, + }, + { + .iv = 10, + .lvl = 27, + .species = SPECIES_MINUN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_GinaAndMia1[] = { + { + .iv = 0, + .lvl = 6, + .species = SPECIES_SEEDOT, + }, + { + .iv = 0, + .lvl = 6, + .species = SPECIES_LOTAD, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_MiuAndYuki[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_BEAUTIFLY, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_DUSTOX, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv3[] = { + { + .iv = 0, + .lvl = 9, + .species = SPECIES_PLUSLE, + }, + { + .iv = 0, + .lvl = 9, + .species = SPECIES_MINUN, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_GinaAndMia2[] = { + { + .iv = 0, + .lvl = 10, + .species = SPECIES_DUSKULL, + .moves = MOVE_NIGHT_SHADE, MOVE_DISABLE, MOVE_NONE, MOVE_NONE + }, + { + .iv = 0, + .lvl = 10, + .species = SPECIES_SHROOMISH, + .moves = MOVE_ABSORB, MOVE_LEECH_SEED, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_AmyAndLiv4[] = { + { + .iv = 20, + .lvl = 30, + .species = SPECIES_PLUSLE, + }, + { + .iv = 20, + .lvl = 30, + .species = SPECIES_MINUN, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AmyAndLiv5[] = { + { + .iv = 30, + .lvl = 33, + .species = SPECIES_PLUSLE, + .moves = MOVE_SPARK, MOVE_CHARGE, MOVE_FAKE_TEARS, MOVE_HELPING_HAND + }, + { + .iv = 30, + .lvl = 33, + .species = SPECIES_MINUN, + .moves = MOVE_SPARK, MOVE_CHARGE, MOVE_CHARM, MOVE_HELPING_HAND + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_AmyAndLiv6[] = { + { + .iv = 40, + .lvl = 36, + .species = SPECIES_PLUSLE, + .moves = MOVE_THUNDER, MOVE_CHARGE, MOVE_FAKE_TEARS, MOVE_HELPING_HAND + }, + { + .iv = 40, + .lvl = 36, + .species = SPECIES_MINUN, + .moves = MOVE_THUNDER, MOVE_CHARGE, MOVE_CHARM, MOVE_HELPING_HAND + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Huey[] = { + { + .iv = 10, + .lvl = 12, + .species = SPECIES_WINGULL, + }, + { + .iv = 10, + .lvl = 12, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edmond[] = { + { + .iv = 0, + .lvl = 13, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest1[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dwayne[] = { + { + .iv = 0, + .lvl = 11, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_MACHOP, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Phillip[] = { + { + .iv = 0, + .lvl = 44, + .species = SPECIES_TENTACRUEL, + }, + { + .iv = 0, + .lvl = 44, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leonard[] = { + { + .iv = 0, + .lvl = 43, + .species = SPECIES_MACHOP, + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_PELIPPER, + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Duncan[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_SPHEAL, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest2[] = { + { + .iv = 10, + .lvl = 36, + .species = SPECIES_WINGULL, + }, + { + .iv = 10, + .lvl = 36, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 10, + .lvl = 36, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest3[] = { + { + .iv = 20, + .lvl = 39, + .species = SPECIES_PELIPPER, + }, + { + .iv = 20, + .lvl = 39, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 20, + .lvl = 39, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest4[] = { + { + .iv = 30, + .lvl = 42, + .species = SPECIES_PELIPPER, + }, + { + .iv = 30, + .lvl = 42, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 30, + .lvl = 42, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ernest5[] = { + { + .iv = 40, + .lvl = 45, + .species = SPECIES_PELIPPER, + }, + { + .iv = 40, + .lvl = 45, + .species = SPECIES_MACHOKE, + }, + { + .iv = 40, + .lvl = 45, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Eli[] = { + { + .iv = 100, + .lvl = 23, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Annika[] = { + { + .iv = 100, + .lvl = 39, + .species = SPECIES_FEEBAS, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_FLAIL, MOVE_WATER_PULSE, MOVE_RETURN, MOVE_ATTRACT + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_FEEBAS, + .heldItem = ITEM_ORAN_BERRY, + .moves = MOVE_FLAIL, MOVE_WATER_PULSE, MOVE_RETURN, MOVE_ATTRACT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jazmyn[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_ABSOL, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Jonas[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_KOFFING, + .moves = MOVE_TOXIC, MOVE_THUNDER, MOVE_SELF_DESTRUCT, MOVE_SLUDGE_BOMB + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Kayley[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_CASTFORM, + .moves = MOVE_SUNNY_DAY, MOVE_WEATHER_BALL, MOVE_FLAMETHROWER, MOVE_SOLAR_BEAM + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Auron[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_MACHAMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kelvin[] = { + { + .iv = 150, + .lvl = 33, + .species = SPECIES_MACHOKE, + }, + { + .iv = 150, + .lvl = 33, + .species = SPECIES_SPHEAL, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Marley[] = { + { + .iv = 255, + .lvl = 34, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_NONE, + .moves = MOVE_BITE, MOVE_ROAR, MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Reyna[] = { + { + .iv = 50, + .lvl = 33, + .species = SPECIES_MEDITITE, + }, + { + .iv = 200, + .lvl = 33, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hudson[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Conor[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_CHINCHOU, + }, + { + .iv = 200, + .lvl = 33, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin1[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_LOMBRE, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hector[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_ZANGOOSE, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SEVIPER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tabitha1[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_CAMERUPT, + }, + { + .iv = 100, + .lvl = 38, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 100, + .lvl = 40, + .species = SPECIES_GOLBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin2[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_LOMBRE, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin3[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 0, + .lvl = 29, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin4[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_LOMBRE, + }, + { + .iv = 0, + .lvl = 32, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Edwin5[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_LUDICOLO, + }, + { + .iv = 0, + .lvl = 35, + .species = SPECIES_SHIFTRY, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally1[] = { + { + .iv = 150, + .lvl = 44, + .species = SPECIES_ALTARIA, + .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE + }, + { + .iv = 150, + .lvl = 43, + .species = SPECIES_DELCATTY, + .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK + }, + { + .iv = 150, + .lvl = 44, + .species = SPECIES_ROSELIA, + .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC + }, + { + .iv = 150, + .lvl = 41, + .species = SPECIES_MAGNETON, + .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH + }, + { + .iv = 250, + .lvl = 45, + .species = SPECIES_GARDEVOIR, + .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan1[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_TREECKO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan2[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_SLUGMA, + }, + { + .iv = 50, + .lvl = 18, + .species = SPECIES_WINGULL, + }, + { + .iv = 100, + .lvl = 20, + .species = SPECIES_GROVYLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan3[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_SLUGMA, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_PELIPPER, + }, + { + .iv = 150, + .lvl = 31, + .species = SPECIES_GROVYLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan4[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_TORCHIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan5[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_WINGULL, + }, + { + .iv = 50, + .lvl = 18, + .species = SPECIES_LOMBRE, + }, + { + .iv = 100, + .lvl = 20, + .species = SPECIES_COMBUSKEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan6[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_PELIPPER, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 150, + .lvl = 31, + .species = SPECIES_COMBUSKEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan7[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_MUDKIP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan8[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_LOMBRE, + }, + { + .iv = 50, + .lvl = 18, + .species = SPECIES_SLUGMA, + }, + { + .iv = 100, + .lvl = 20, + .species = SPECIES_MARSHTOMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan9[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_SLUGMA, + }, + { + .iv = 150, + .lvl = 31, + .species = SPECIES_MARSHTOMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May1[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_TREECKO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May2[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_WINGULL, + }, + { + .iv = 50, + .lvl = 18, + .species = SPECIES_SLUGMA, + }, + { + .iv = 100, + .lvl = 20, + .species = SPECIES_GROVYLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May3[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_SLUGMA, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 150, + .lvl = 31, + .species = SPECIES_GROVYLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May4[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_TORCHIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May5[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_WINGULL, + }, + { + .iv = 50, + .lvl = 18, + .species = SPECIES_LOMBRE, + }, + { + .iv = 100, + .lvl = 20, + .species = SPECIES_COMBUSKEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May6[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_PELIPPER, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 150, + .lvl = 31, + .species = SPECIES_COMBUSKEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May7[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_MUDKIP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May8[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_LOMBRE, + }, + { + .iv = 50, + .lvl = 18, + .species = SPECIES_SLUGMA, + }, + { + .iv = 100, + .lvl = 20, + .species = SPECIES_MARSHTOMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May9[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_SLUGMA, + }, + { + .iv = 150, + .lvl = 31, + .species = SPECIES_MARSHTOMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac1[] = { + { + .iv = 0, + .lvl = 11, + .species = SPECIES_WHISMUR, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_ARON, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_TAILLOW, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Davis[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_PINSIR, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Mitchell[] = { + { + .iv = 0, + .lvl = 43, + .species = SPECIES_LUNATONE, + .moves = MOVE_EXPLOSION, MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_PSYCHIC + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_SOLROCK, + .moves = MOVE_EXPLOSION, MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_SHADOW_BALL + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac2[] = { + { + .iv = 10, + .lvl = 22, + .species = SPECIES_LOUDRED, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_LINOONE, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_ARON, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_SWELLOW, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac3[] = { + { + .iv = 20, + .lvl = 25, + .species = SPECIES_LOUDRED, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_LINOONE, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_ARON, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_SWELLOW, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac4[] = { + { + .iv = 30, + .lvl = 28, + .species = SPECIES_LOUDRED, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_LINOONE, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_ARON, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_SWELLOW, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isaac5[] = { + { + .iv = 40, + .lvl = 31, + .species = SPECIES_LOUDRED, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_LINOONE, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_LAIRON, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_SWELLOW, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_HARIYAMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia1[] = { + { + .iv = 0, + .lvl = 11, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_MARILL, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_ROSELIA, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_SKITTY, + }, + { + .iv = 0, + .lvl = 11, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Halle[] = { + { + .iv = 0, + .lvl = 43, + .species = SPECIES_SABLEYE, + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_ABSOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Garrison[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_SANDSLASH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia2[] = { + { + .iv = 10, + .lvl = 22, + .species = SPECIES_WINGULL, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_MARILL, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_ROSELIA, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_SKITTY, + }, + { + .iv = 10, + .lvl = 22, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia3[] = { + { + .iv = 20, + .lvl = 25, + .species = SPECIES_PELIPPER, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_BRELOOM, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_MARILL, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_ROSELIA, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_DELCATTY, + }, + { + .iv = 20, + .lvl = 25, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia4[] = { + { + .iv = 30, + .lvl = 28, + .species = SPECIES_PELIPPER, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_BRELOOM, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_MARILL, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_ROSELIA, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_DELCATTY, + }, + { + .iv = 30, + .lvl = 28, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lydia5[] = { + { + .iv = 40, + .lvl = 31, + .species = SPECIES_PELIPPER, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_BRELOOM, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_AZUMARILL, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_ROSELIA, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_DELCATTY, + }, + { + .iv = 40, + .lvl = 31, + .species = SPECIES_SEAKING, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson1[] = { + { + .iv = 50, + .lvl = 27, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lorenzo[] = { + { + .iv = 50, + .lvl = 28, + .species = SPECIES_SEEDOT, + }, + { + .iv = 50, + .lvl = 28, + .species = SPECIES_NUZLEAF, + }, + { + .iv = 50, + .lvl = 28, + .species = SPECIES_LOMBRE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sebastian[] = { + { + .iv = 50, + .lvl = 39, + .species = SPECIES_CACTURNE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson2[] = { + { + .iv = 60, + .lvl = 31, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson3[] = { + { + .iv = 70, + .lvl = 34, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson4[] = { + { + .iv = 80, + .lvl = 37, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jackson5[] = { + { + .iv = 90, + .lvl = 39, + .species = SPECIES_KECLEON, + }, + { + .iv = 90, + .lvl = 39, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine1[] = { + { + .iv = 50, + .lvl = 26, + .species = SPECIES_GLOOM, + }, + { + .iv = 50, + .lvl = 26, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jenna[] = { + { + .iv = 50, + .lvl = 28, + .species = SPECIES_LOTAD, + }, + { + .iv = 50, + .lvl = 28, + .species = SPECIES_LOMBRE, + }, + { + .iv = 50, + .lvl = 28, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sophia[] = { + { + .iv = 50, + .lvl = 38, + .species = SPECIES_SWABLU, + }, + { + .iv = 50, + .lvl = 38, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine2[] = { + { + .iv = 60, + .lvl = 30, + .species = SPECIES_GLOOM, + }, + { + .iv = 60, + .lvl = 30, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine3[] = { + { + .iv = 70, + .lvl = 33, + .species = SPECIES_GLOOM, + }, + { + .iv = 70, + .lvl = 33, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine4[] = { + { + .iv = 80, + .lvl = 36, + .species = SPECIES_GLOOM, + }, + { + .iv = 80, + .lvl = 36, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Catherine5[] = { + { + .iv = 90, + .lvl = 39, + .species = SPECIES_BELLOSSOM, + }, + { + .iv = 90, + .lvl = 39, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Julio[] = { + { + .iv = 0, + .lvl = 21, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt27[] = { + { + .iv = 50, + .lvl = 35, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 50, + .lvl = 35, + .species = SPECIES_GOLBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt28[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_WAILMER, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt29[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_WAILMER, + }, + { + .iv = 0, + .lvl = 30, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt30[] = { + { + .iv = 50, + .lvl = 22, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 50, + .lvl = 22, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marc[] = { + { + .iv = 120, + .lvl = 8, + .species = SPECIES_GEODUDE, + }, + { + .iv = 130, + .lvl = 8, + .species = SPECIES_GEODUDE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brenden[] = { + { + .iv = 100, + .lvl = 13, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lilith[] = { + { + .iv = 150, + .lvl = 13, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristian[] = { + { + .iv = 200, + .lvl = 13, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sylvia[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leonardo[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Athena[] = { + { + .iv = 100, + .lvl = 32, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_THUNDER_WAVE, MOVE_QUICK_ATTACK, MOVE_NONE + }, + { + .iv = 100, + .lvl = 32, + .species = SPECIES_LINOONE, + .heldItem = ITEM_NONE, + .moves = MOVE_SURF, MOVE_THIEF, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Harrison[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt31[] = { + { + .iv = 0, + .lvl = 20, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clarence[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Terry[] = { + { + .iv = 0, + .lvl = 37, + .species = SPECIES_GIRAFARIG, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nate[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_SPOINK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kathleen[] = { + { + .iv = 100, + .lvl = 36, + .species = SPECIES_KADABRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clifford[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_GIRAFARIG, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Nicholas[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_WOBBUFFET, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt32[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_ZUBAT, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt33[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_BALTOY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt34[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt35[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt36[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_BALTOY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Macey[] = { + { + .iv = 0, + .lvl = 36, + .species = SPECIES_NATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan10[] = { + { + .iv = 25, + .lvl = 13, + .species = SPECIES_LOTAD, + }, + { + .iv = 50, + .lvl = 15, + .species = SPECIES_TORCHIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan11[] = { + { + .iv = 25, + .lvl = 13, + .species = SPECIES_WINGULL, + }, + { + .iv = 50, + .lvl = 15, + .species = SPECIES_TREECKO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Paxton[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_SWELLOW, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isabella[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt37[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_ZUBAT, + }, + { + .iv = 0, + .lvl = 27, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tabitha2[] = { + { + .iv = 50, + .lvl = 18, + .species = SPECIES_NUMEL, + }, + { + .iv = 50, + .lvl = 20, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 50, + .lvl = 22, + .species = SPECIES_NUMEL, + }, + { + .iv = 50, + .lvl = 22, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jonathan[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_KECLEON, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan12[] = { + { + .iv = 25, + .lvl = 13, + .species = SPECIES_SLUGMA, + }, + { + .iv = 50, + .lvl = 15, + .species = SPECIES_MUDKIP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May10[] = { + { + .iv = 25, + .lvl = 13, + .species = SPECIES_WINGULL, + }, + { + .iv = 50, + .lvl = 15, + .species = SPECIES_TREECKO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maxie1[] = { + { + .iv = 150, + .lvl = 37, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 150, + .lvl = 38, + .species = SPECIES_CROBAT, + }, + { + .iv = 150, + .lvl = 39, + .species = SPECIES_CAMERUPT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maxie2[] = { + { + .iv = 150, + .lvl = 24, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 150, + .lvl = 24, + .species = SPECIES_ZUBAT, + }, + { + .iv = 150, + .lvl = 25, + .species = SPECIES_CAMERUPT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tiana[] = { + { + .iv = 0, + .lvl = 4, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 4, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley1[] = { + { + .iv = 0, + .lvl = 6, + .species = SPECIES_LOTAD, + }, + { + .iv = 0, + .lvl = 6, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Janice[] = { + { + .iv = 0, + .lvl = 9, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Vivi[] = { + { + .iv = 100, + .lvl = 15, + .species = SPECIES_MARILL, + }, + { + .iv = 100, + .lvl = 15, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 100, + .lvl = 15, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_LOMBRE, + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_LOMBRE, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley4[] = { + { + .iv = 30, + .lvl = 32, + .species = SPECIES_LOMBRE, + }, + { + .iv = 30, + .lvl = 32, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Haley5[] = { + { + .iv = 40, + .lvl = 34, + .species = SPECIES_SWELLOW, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_LOMBRE, + }, + { + .iv = 40, + .lvl = 34, + .species = SPECIES_BRELOOM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sally[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_ODDISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Robin[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_SKITTY, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andrea[] = { + { + .iv = 100, + .lvl = 40, + .species = SPECIES_LUVDISC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Crissy[] = { + { + .iv = 100, + .lvl = 39, + .species = SPECIES_GOLDEEN, + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rick[] = { + { + .iv = 0, + .lvl = 4, + .species = SPECIES_WURMPLE, + }, + { + .iv = 0, + .lvl = 4, + .species = SPECIES_WURMPLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lyle[] = { + { + .iv = 0, + .lvl = 3, + .species = SPECIES_WURMPLE, + }, + { + .iv = 0, + .lvl = 3, + .species = SPECIES_WURMPLE, + }, + { + .iv = 0, + .lvl = 3, + .species = SPECIES_WURMPLE, + }, + { + .iv = 0, + .lvl = 3, + .species = SPECIES_WURMPLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jose[] = { + { + .iv = 50, + .lvl = 8, + .species = SPECIES_WURMPLE, + }, + { + .iv = 50, + .lvl = 8, + .species = SPECIES_NINCADA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Doug[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_NINCADA, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Greg[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_VOLBEAT, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_ILLUMISE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kent[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_James1[] = { + { + .iv = 0, + .lvl = 6, + .species = SPECIES_NINCADA, + }, + { + .iv = 0, + .lvl = 6, + .species = SPECIES_NINCADA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_James2[] = { + { + .iv = 10, + .lvl = 27, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_James3[] = { + { + .iv = 20, + .lvl = 29, + .species = SPECIES_DUSTOX, + }, + { + .iv = 20, + .lvl = 29, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_James4[] = { + { + .iv = 30, + .lvl = 31, + .species = SPECIES_SURSKIT, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_DUSTOX, + }, + { + .iv = 30, + .lvl = 31, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_James5[] = { + { + .iv = 40, + .lvl = 33, + .species = SPECIES_SURSKIT, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_NINJASK, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_DUSTOX, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_NINJASK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brice[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_NUMEL, + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent1[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 17, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 16, + .species = SPECIES_GEODUDE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lenny[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lucas1[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alan[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_NOSEPASS, + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_GRAVELER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Clark[] = { + { + .iv = 0, + .lvl = 8, + .species = SPECIES_GEODUDE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Eric[] = { + { + .iv = 0, + .lvl = 20, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 20, + .species = SPECIES_BALTOY, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Lucas2[] = { + { + .iv = 0, + .lvl = 9, + .species = SPECIES_WAILMER, + .moves = MOVE_SPLASH, MOVE_WATER_GUN, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Mike1[] = { + { + .iv = 0, + .lvl = 10, + .species = SPECIES_PELIPPER, + .moves = MOVE_GUST, MOVE_GROWL, MOVE_NONE, MOVE_NONE + }, + { + .iv = 0, + .lvl = 10, + .species = SPECIES_POOCHYENA, + .moves = MOVE_BITE, MOVE_SCARY_FACE, MOVE_NONE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mike2[] = { + { + .iv = 0, + .lvl = 16, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 16, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 16, + .species = SPECIES_MACHOP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent2[] = { + { + .iv = 10, + .lvl = 24, + .species = SPECIES_GEODUDE, + }, + { + .iv = 10, + .lvl = 24, + .species = SPECIES_GEODUDE, + }, + { + .iv = 10, + .lvl = 24, + .species = SPECIES_GEODUDE, + }, + { + .iv = 10, + .lvl = 24, + .species = SPECIES_GRAVELER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent3[] = { + { + .iv = 20, + .lvl = 27, + .species = SPECIES_GEODUDE, + }, + { + .iv = 20, + .lvl = 27, + .species = SPECIES_GEODUDE, + }, + { + .iv = 20, + .lvl = 27, + .species = SPECIES_GRAVELER, + }, + { + .iv = 20, + .lvl = 27, + .species = SPECIES_GRAVELER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent4[] = { + { + .iv = 30, + .lvl = 30, + .species = SPECIES_GEODUDE, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_GRAVELER, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_GRAVELER, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_GRAVELER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Trent5[] = { + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GRAVELER, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GRAVELER, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GRAVELER, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GOLEM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_DezAndLuke[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_DELCATTY, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LeaAndJed[] = { + { + .iv = 0, + .lvl = 45, + .species = SPECIES_LUVDISC, + }, + { + .iv = 0, + .lvl = 45, + .species = SPECIES_LUVDISC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan1[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_VOLBEAT, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_ILLUMISE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan2[] = { + { + .iv = 10, + .lvl = 30, + .species = SPECIES_VOLBEAT, + }, + { + .iv = 10, + .lvl = 30, + .species = SPECIES_ILLUMISE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan3[] = { + { + .iv = 20, + .lvl = 33, + .species = SPECIES_VOLBEAT, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_ILLUMISE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan4[] = { + { + .iv = 30, + .lvl = 36, + .species = SPECIES_VOLBEAT, + }, + { + .iv = 30, + .lvl = 36, + .species = SPECIES_ILLUMISE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_KiraAndDan5[] = { + { + .iv = 40, + .lvl = 39, + .species = SPECIES_VOLBEAT, + }, + { + .iv = 40, + .lvl = 39, + .species = SPECIES_ILLUMISE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Johanna[] = { + { + .iv = 0, + .lvl = 13, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Gerald[] = { + { + .iv = 100, + .lvl = 23, + .species = SPECIES_KECLEON, + .moves = MOVE_FLAMETHROWER, MOVE_FURY_SWIPES, MOVE_FAINT_ATTACK, MOVE_BIND + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Vivian[] = { + { + .iv = 100, + .lvl = 17, + .species = SPECIES_MEDITITE, + .moves = MOVE_BIDE, MOVE_DETECT, MOVE_CONFUSION, MOVE_THUNDER_PUNCH + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_MEDITITE, + .moves = MOVE_THUNDER_PUNCH, MOVE_DETECT, MOVE_CONFUSION, MOVE_MEDITATE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Danielle[] = { + { + .iv = 100, + .lvl = 23, + .species = SPECIES_MEDITITE, + .moves = MOVE_BIDE, MOVE_DETECT, MOVE_CONFUSION, MOVE_FIRE_PUNCH + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Hideo[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_KOFFING, + .moves = MOVE_TACKLE, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_KOFFING, + .moves = MOVE_TACKLE, MOVE_POISON_GAS, MOVE_SLUDGE, MOVE_SMOKESCREEN + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Keigo[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_KOFFING, + .moves = MOVE_POISON_GAS, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_NINJASK, + .moves = MOVE_SAND_ATTACK, MOVE_DOUBLE_TEAM, MOVE_FURY_CUTTER, MOVE_SWORDS_DANCE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Riley[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_NINCADA, + .moves = MOVE_LEECH_LIFE, MOVE_FURY_SWIPES, MOVE_MIND_READER, MOVE_DIG + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_KOFFING, + .moves = MOVE_TACKLE, MOVE_SELF_DESTRUCT, MOVE_SLUDGE, MOVE_SMOKESCREEN + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Flint[] = { + { + .iv = 150, + .lvl = 29, + .species = SPECIES_SWELLOW, + }, + { + .iv = 150, + .lvl = 29, + .species = SPECIES_XATU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ashley[] = { + { + .iv = 100, + .lvl = 27, + .species = SPECIES_SWABLU, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_SWABLU, + }, + { + .iv = 100, + .lvl = 27, + .species = SPECIES_SWABLU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wally2[] = { + { + .iv = 30, + .lvl = 16, + .species = SPECIES_RALTS, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally3[] = { + { + .iv = 150, + .lvl = 47, + .species = SPECIES_ALTARIA, + .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE + }, + { + .iv = 150, + .lvl = 46, + .species = SPECIES_DELCATTY, + .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK + }, + { + .iv = 150, + .lvl = 47, + .species = SPECIES_ROSELIA, + .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC + }, + { + .iv = 150, + .lvl = 44, + .species = SPECIES_MAGNETON, + .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH + }, + { + .iv = 250, + .lvl = 48, + .species = SPECIES_GARDEVOIR, + .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally4[] = { + { + .iv = 150, + .lvl = 50, + .species = SPECIES_ALTARIA, + .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE + }, + { + .iv = 150, + .lvl = 49, + .species = SPECIES_DELCATTY, + .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK + }, + { + .iv = 150, + .lvl = 50, + .species = SPECIES_ROSELIA, + .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC + }, + { + .iv = 150, + .lvl = 47, + .species = SPECIES_MAGNETON, + .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH + }, + { + .iv = 250, + .lvl = 51, + .species = SPECIES_GARDEVOIR, + .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally5[] = { + { + .iv = 150, + .lvl = 53, + .species = SPECIES_ALTARIA, + .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE + }, + { + .iv = 150, + .lvl = 52, + .species = SPECIES_DELCATTY, + .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK + }, + { + .iv = 150, + .lvl = 53, + .species = SPECIES_ROSELIA, + .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC + }, + { + .iv = 150, + .lvl = 50, + .species = SPECIES_MAGNETON, + .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH + }, + { + .iv = 250, + .lvl = 54, + .species = SPECIES_GARDEVOIR, + .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Wally6[] = { + { + .iv = 150, + .lvl = 56, + .species = SPECIES_ALTARIA, + .moves = MOVE_AERIAL_ACE, MOVE_SAFEGUARD, MOVE_DRAGON_BREATH, MOVE_DRAGON_DANCE + }, + { + .iv = 150, + .lvl = 55, + .species = SPECIES_DELCATTY, + .moves = MOVE_SING, MOVE_ASSIST, MOVE_CHARM, MOVE_FAINT_ATTACK + }, + { + .iv = 150, + .lvl = 56, + .species = SPECIES_ROSELIA, + .moves = MOVE_MAGICAL_LEAF, MOVE_LEECH_SEED, MOVE_GIGA_DRAIN, MOVE_TOXIC + }, + { + .iv = 150, + .lvl = 53, + .species = SPECIES_MAGNETON, + .moves = MOVE_SUPERSONIC, MOVE_THUNDERBOLT, MOVE_TRI_ATTACK, MOVE_SCREECH + }, + { + .iv = 250, + .lvl = 57, + .species = SPECIES_GARDEVOIR, + .moves = MOVE_DOUBLE_TEAM, MOVE_CALM_MIND, MOVE_PSYCHIC, MOVE_FUTURE_SIGHT + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan13[] = { + { + .iv = 150, + .lvl = 31, + .species = SPECIES_TROPIUS, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_SLUGMA, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_PELIPPER, + }, + { + .iv = 200, + .lvl = 34, + .species = SPECIES_GROVYLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan14[] = { + { + .iv = 150, + .lvl = 31, + .species = SPECIES_TROPIUS, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_PELIPPER, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_LUDICOLO, + }, + { + .iv = 200, + .lvl = 34, + .species = SPECIES_COMBUSKEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan15[] = { + { + .iv = 150, + .lvl = 31, + .species = SPECIES_TROPIUS, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_LUDICOLO, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_SLUGMA, + }, + { + .iv = 200, + .lvl = 34, + .species = SPECIES_MARSHTOMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May11[] = { + { + .iv = 150, + .lvl = 31, + .species = SPECIES_TROPIUS, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_SLUGMA, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_PELIPPER, + }, + { + .iv = 200, + .lvl = 34, + .species = SPECIES_GROVYLE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May12[] = { + { + .iv = 150, + .lvl = 31, + .species = SPECIES_TROPIUS, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_PELIPPER, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_LUDICOLO, + }, + { + .iv = 200, + .lvl = 34, + .species = SPECIES_COMBUSKEN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May13[] = { + { + .iv = 150, + .lvl = 31, + .species = SPECIES_TROPIUS, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_LUDICOLO, + }, + { + .iv = 150, + .lvl = 32, + .species = SPECIES_SLUGMA, + }, + { + .iv = 200, + .lvl = 34, + .species = SPECIES_MARSHTOMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jonah[] = { + { + .iv = 0, + .lvl = 30, + .species = SPECIES_WAILMER, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Henry[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_CARVANHA, + }, + { + .iv = 0, + .lvl = 34, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Roger[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 35, + .species = SPECIES_GYARADOS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alexa[] = { + { + .iv = 100, + .lvl = 34, + .species = SPECIES_GLOOM, + }, + { + .iv = 100, + .lvl = 34, + .species = SPECIES_AZUMARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Ruben[] = { + { + .iv = 100, + .lvl = 34, + .species = SPECIES_SHIFTRY, + }, + { + .iv = 100, + .lvl = 34, + .species = SPECIES_NOSEPASS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji1[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wayne[] = { + { + .iv = 0, + .lvl = 31, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 31, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 36, + .species = SPECIES_WAILMER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Aidan[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SWELLOW, + }, + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SKARMORY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Reed[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_SPHEAL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tisha[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_CHINCHOU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_ToriAndTia[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_SPINDA, + }, + { + .iv = 0, + .lvl = 19, + .species = SPECIES_SPINDA, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_KimAndIris[] = { + { + .iv = 0, + .lvl = 32, + .species = SPECIES_SWABLU, + .moves = MOVE_SING, MOVE_FURY_ATTACK, MOVE_SAFEGUARD, MOVE_AERIAL_ACE + }, + { + .iv = 0, + .lvl = 35, + .species = SPECIES_NUMEL, + .moves = MOVE_FLAMETHROWER, MOVE_TAKE_DOWN, MOVE_REST, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_TyraAndIvy[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_ROSELIA, + .moves = MOVE_GROWTH, MOVE_STUN_SPORE, MOVE_MEGA_DRAIN, MOVE_LEECH_SEED + }, + { + .iv = 0, + .lvl = 20, + .species = SPECIES_GRAVELER, + .moves = MOVE_DEFENSE_CURL, MOVE_ROLLOUT, MOVE_MUD_SPORT, MOVE_ROCK_THROW + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_MelAndPaul[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_DUSTOX, + .moves = MOVE_GUST, MOVE_PSYBEAM, MOVE_TOXIC, MOVE_PROTECT + }, + { + .iv = 0, + .lvl = 27, + .species = SPECIES_BEAUTIFLY, + .moves = MOVE_GUST, MOVE_MEGA_DRAIN, MOVE_ATTRACT, MOVE_STUN_SPORE + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay1[] = { + { + .iv = 200, + .lvl = 39, + .species = SPECIES_MEDICHAM, + .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT + }, + { + .iv = 200, + .lvl = 39, + .species = SPECIES_HARIYAMA, + .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay2[] = { + { + .iv = 210, + .lvl = 43, + .species = SPECIES_MEDICHAM, + .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT + }, + { + .iv = 210, + .lvl = 43, + .species = SPECIES_HARIYAMA, + .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay3[] = { + { + .iv = 220, + .lvl = 46, + .species = SPECIES_MEDICHAM, + .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT + }, + { + .iv = 220, + .lvl = 46, + .species = SPECIES_HARIYAMA, + .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay4[] = { + { + .iv = 230, + .lvl = 49, + .species = SPECIES_MEDICHAM, + .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT + }, + { + .iv = 230, + .lvl = 49, + .species = SPECIES_HARIYAMA, + .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_JohnAndJay5[] = { + { + .iv = 240, + .lvl = 52, + .species = SPECIES_MEDICHAM, + .moves = MOVE_PSYCHIC, MOVE_FIRE_PUNCH, MOVE_PSYCH_UP, MOVE_PROTECT + }, + { + .iv = 240, + .lvl = 52, + .species = SPECIES_HARIYAMA, + .moves = MOVE_FOCUS_PUNCH, MOVE_ROCK_TOMB, MOVE_REST, MOVE_BELLY_DRUM + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_ReliAndIan[] = { + { + .iv = 0, + .lvl = 35, + .species = SPECIES_AZUMARILL, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy1[] = { + { + .iv = 0, + .lvl = 34, + .species = SPECIES_CHINCHOU, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy2[] = { + { + .iv = 0, + .lvl = 42, + .species = SPECIES_CHINCHOU, + }, + { + .iv = 0, + .lvl = 40, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy3[] = { + { + .iv = 0, + .lvl = 45, + .species = SPECIES_LANTURN, + }, + { + .iv = 0, + .lvl = 43, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy4[] = { + { + .iv = 0, + .lvl = 48, + .species = SPECIES_LANTURN, + }, + { + .iv = 0, + .lvl = 46, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LilaAndRoy5[] = { + { + .iv = 0, + .lvl = 51, + .species = SPECIES_LANTURN, + }, + { + .iv = 0, + .lvl = 49, + .species = SPECIES_SHARPEDO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_LisaAndRay[] = { + { + .iv = 0, + .lvl = 27, + .species = SPECIES_GOLDEEN, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chris[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_MAGIKARP, + }, + { + .iv = 0, + .lvl = 20, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_FEEBAS, + }, + { + .iv = 0, + .lvl = 23, + .species = SPECIES_CARVANHA, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Dawson[] = { + { + .iv = 0, + .lvl = 8, + .species = SPECIES_ZIGZAGOON, + .heldItem = ITEM_NUGGET + }, + { + .iv = 0, + .lvl = 8, + .species = SPECIES_POOCHYENA, + .heldItem = ITEM_NONE + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Sarah[] = { + { + .iv = 0, + .lvl = 8, + .species = SPECIES_LOTAD, + .heldItem = ITEM_NONE + }, + { + .iv = 0, + .lvl = 8, + .species = SPECIES_ZIGZAGOON, + .heldItem = ITEM_NUGGET + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darian[] = { + { + .iv = 0, + .lvl = 9, + .species = SPECIES_MAGIKARP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hailey[] = { + { + .iv = 0, + .lvl = 13, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Chandler[] = { + { + .iv = 0, + .lvl = 12, + .species = SPECIES_TENTACOOL, + }, + { + .iv = 0, + .lvl = 12, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonItemDefaultMoves gTrainerParty_Kaleb[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_MINUN, + .heldItem = ITEM_ORAN_BERRY + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_PLUSLE, + .heldItem = ITEM_ORAN_BERRY + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Joseph[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_VOLTORB, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alyssa[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_MAGNEMITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marcos[] = { + { + .iv = 100, + .lvl = 15, + .species = SPECIES_VOLTORB, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rhett[] = { + { + .iv = 100, + .lvl = 15, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tyron[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Celina[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bianca[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SHROOMISH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Hayden[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sophie[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_MARILL, + }, + { + .iv = 0, + .lvl = 19, + .species = SPECIES_LOMBRE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Coby[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_SKARMORY, + }, + { + .iv = 0, + .lvl = 19, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lawrence[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_BALTOY, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Wyatt[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_ARON, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_ARON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Angelina[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_LOMBRE, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kai[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_BARBOACH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Charlotte[] = { + { + .iv = 0, + .lvl = 19, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Deandre[] = { + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ARON, + }, + { + .iv = 0, + .lvl = 14, + .species = SPECIES_ELECTRIKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt38[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt39[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt40[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt41[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_BALTOY, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt42[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_BALTOY, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt43[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt44[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt45[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_POOCHYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt46[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt47[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt48[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_BALTOY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt49[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt50[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_ZUBAT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt51[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_MIGHTYENA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt52[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Grunt53[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_BALTOY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tabitha3[] = { + { + .iv = 75, + .lvl = 26, + .species = SPECIES_NUMEL, + }, + { + .iv = 75, + .lvl = 28, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 75, + .lvl = 30, + .species = SPECIES_ZUBAT, + }, + { + .iv = 75, + .lvl = 33, + .species = SPECIES_CAMERUPT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darcy[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_PELIPPER, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_CAMERUPT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Maxie3[] = { + { + .iv = 150, + .lvl = 42, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 150, + .lvl = 43, + .species = SPECIES_CROBAT, + }, + { + .iv = 150, + .lvl = 44, + .species = SPECIES_CAMERUPT, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pete[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Isabelle[] = { + { + .iv = 0, + .lvl = 15, + .species = SPECIES_MARILL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres1[] = { + { + .iv = 50, + .lvl = 25, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 50, + .lvl = 25, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Josue[] = { + { + .iv = 50, + .lvl = 25, + .species = SPECIES_TAILLOW, + }, + { + .iv = 50, + .lvl = 25, + .species = SPECIES_WINGULL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Camron[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory1[] = { + { + .iv = 0, + .lvl = 24, + .species = SPECIES_WINGULL, + }, + { + .iv = 0, + .lvl = 24, + .species = SPECIES_MACHOP, + }, + { + .iv = 0, + .lvl = 24, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Carolina[] = { + { + .iv = 50, + .lvl = 24, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 50, + .lvl = 24, + .species = SPECIES_SWELLOW, + }, + { + .iv = 50, + .lvl = 24, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Elijah[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_SKARMORY, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_SKARMORY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Celia[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_MARILL, + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_LOMBRE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bryan[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_SANDSLASH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Branden[] = { + { + .iv = 0, + .lvl = 22, + .species = SPECIES_TAILLOW, + }, + { + .iv = 0, + .lvl = 22, + .species = SPECIES_NUZLEAF, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Bryant[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_NUMEL, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SLUGMA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Shayla[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_ROSELIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Kyra[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_DODUO, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_DODRIO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Jaiden[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_NINJASK, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_GULPIN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alix[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_KADABRA, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_KIRLIA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Helene[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MEDITITE, + }, + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Marlene[] = { + { + .iv = 0, + .lvl = 18, + .species = SPECIES_MEDITITE, + }, + { + .iv = 0, + .lvl = 18, + .species = SPECIES_SPOINK, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Devan[] = { + { + .iv = 0, + .lvl = 8, + .species = SPECIES_GEODUDE, + }, + { + .iv = 0, + .lvl = 8, + .species = SPECIES_GEODUDE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Johnson[] = { + { + .iv = 0, + .lvl = 8, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 0, + .lvl = 8, + .species = SPECIES_LOTAD, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Melina[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_DODUO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brandi[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_RALTS, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Aisha[] = { + { + .iv = 0, + .lvl = 17, + .species = SPECIES_MEDITITE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Makayla[] = { + { + .iv = 0, + .lvl = 33, + .species = SPECIES_ROSELIA, + }, + { + .iv = 0, + .lvl = 33, + .species = SPECIES_MEDICHAM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fabian[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_MANECTRIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Dayton[] = { + { + .iv = 0, + .lvl = 25, + .species = SPECIES_SLUGMA, + }, + { + .iv = 0, + .lvl = 25, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Rachel[] = { + { + .iv = 0, + .lvl = 26, + .species = SPECIES_GOLDEEN, + } +}; + +const struct TrainerMonNoItemCustomMoves gTrainerParty_Leonel[] = { + { + .iv = 100, + .lvl = 30, + .species = SPECIES_MANECTRIC, + .moves = MOVE_THUNDER, MOVE_QUICK_ATTACK, MOVE_THUNDER_WAVE, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Callie[] = { + { + .iv = 0, + .lvl = 28, + .species = SPECIES_MEDITITE, + }, + { + .iv = 0, + .lvl = 28, + .species = SPECIES_MAKUHITA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cale[] = { + { + .iv = 0, + .lvl = 29, + .species = SPECIES_DUSTOX, + }, + { + .iv = 0, + .lvl = 29, + .species = SPECIES_BEAUTIFLY, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Myles[] = { + { + .iv = 10, + .lvl = 25, + .species = SPECIES_MAKUHITA, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_WINGULL, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_TROPIUS, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pat[] = { + { + .iv = 10, + .lvl = 25, + .species = SPECIES_POOCHYENA, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_SHROOMISH, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_MARILL, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 10, + .lvl = 25, + .species = SPECIES_GULPIN, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin1[] = { + { + .iv = 100, + .lvl = 29, + .species = SPECIES_LOUDRED, + }, + { + .iv = 100, + .lvl = 29, + .species = SPECIES_VIGOROTH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May14[] = { + { + .iv = 25, + .lvl = 13, + .species = SPECIES_LOTAD, + }, + { + .iv = 50, + .lvl = 15, + .species = SPECIES_TORCHIC, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May15[] = { + { + .iv = 25, + .lvl = 13, + .species = SPECIES_TORKOAL, + }, + { + .iv = 50, + .lvl = 15, + .species = SPECIES_MUDKIP, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne2[] = { + { + .iv = 255, + .lvl = 32, + .species = SPECIES_GOLEM, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_ROLLOUT, MOVE_MAGNITUDE, MOVE_EXPLOSION + }, + { + .iv = 255, + .lvl = 35, + .species = SPECIES_KABUTO, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 35, + .species = SPECIES_ONIX, + .heldItem = ITEM_NONE, + .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 37, + .species = SPECIES_NOSEPASS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne3[] = { + { + .iv = 255, + .lvl = 37, + .species = SPECIES_OMANYTE, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_SURF + }, + { + .iv = 255, + .lvl = 37, + .species = SPECIES_GOLEM, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_ROLLOUT, MOVE_MAGNITUDE, MOVE_EXPLOSION + }, + { + .iv = 255, + .lvl = 40, + .species = SPECIES_KABUTOPS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 40, + .species = SPECIES_ONIX, + .heldItem = ITEM_NONE, + .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 42, + .species = SPECIES_NOSEPASS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne4[] = { + { + .iv = 255, + .lvl = 42, + .species = SPECIES_OMASTAR, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_SURF + }, + { + .iv = 255, + .lvl = 42, + .species = SPECIES_GOLEM, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_ROLLOUT, MOVE_EARTHQUAKE, MOVE_EXPLOSION + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_KABUTOPS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_ONIX, + .heldItem = ITEM_NONE, + .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 47, + .species = SPECIES_NOSEPASS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Roxanne5[] = { + { + .iv = 255, + .lvl = 47, + .species = SPECIES_AERODACTYL, + .heldItem = ITEM_NONE, + .moves = MOVE_ROCK_SLIDE, MOVE_HYPER_BEAM, MOVE_SUPERSONIC, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 47, + .species = SPECIES_GOLEM, + .heldItem = ITEM_NONE, + .moves = MOVE_FOCUS_PUNCH, MOVE_ROLLOUT, MOVE_EARTHQUAKE, MOVE_EXPLOSION + }, + { + .iv = 255, + .lvl = 47, + .species = SPECIES_OMASTAR, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_ICE_BEAM, MOVE_ROCK_SLIDE, MOVE_SURF + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_KABUTOPS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SWORDS_DANCE, MOVE_ICE_BEAM, MOVE_SURF, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_STEELIX, + .heldItem = ITEM_NONE, + .moves = MOVE_IRON_TAIL, MOVE_EXPLOSION, MOVE_ROAR, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 52, + .species = SPECIES_NOSEPASS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_DOUBLE_TEAM, MOVE_EXPLOSION, MOVE_PROTECT, MOVE_ROCK_SLIDE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Brawly2[] = { + { + .iv = 255, + .lvl = 33, + .species = SPECIES_MACHAMP, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP + }, + { + .iv = 255, + .lvl = 33, + .species = SPECIES_MEDITITE, + .heldItem = ITEM_NONE, + .moves = MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_FOCUS_PUNCH + }, + { + .iv = 255, + .lvl = 35, + .species = SPECIES_HITMONTOP, + .heldItem = ITEM_NONE, + .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK + }, + { + .iv = 255, + .lvl = 37, + .species = SPECIES_HARIYAMA, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Brawly3[] = { + { + .iv = 255, + .lvl = 38, + .species = SPECIES_MACHAMP, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP + }, + { + .iv = 255, + .lvl = 38, + .species = SPECIES_MEDICHAM, + .heldItem = ITEM_NONE, + .moves = MOVE_PSYCHIC, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_FOCUS_PUNCH + }, + { + .iv = 255, + .lvl = 40, + .species = SPECIES_HITMONTOP, + .heldItem = ITEM_NONE, + .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK + }, + { + .iv = 255, + .lvl = 42, + .species = SPECIES_HARIYAMA, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Brawly4[] = { + { + .iv = 255, + .lvl = 40, + .species = SPECIES_HITMONCHAN, + .heldItem = ITEM_NONE, + .moves = MOVE_SKY_UPPERCUT, MOVE_PROTECT, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_MACHAMP, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_KARATE_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_MEDICHAM, + .heldItem = ITEM_NONE, + .moves = MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_PSYCHIC + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_HITMONTOP, + .heldItem = ITEM_NONE, + .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK + }, + { + .iv = 255, + .lvl = 47, + .species = SPECIES_HARIYAMA, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Brawly5[] = { + { + .iv = 255, + .lvl = 46, + .species = SPECIES_HITMONLEE, + .heldItem = ITEM_NONE, + .moves = MOVE_MEGA_KICK, MOVE_FOCUS_PUNCH, MOVE_EARTHQUAKE, MOVE_BULK_UP + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_HITMONCHAN, + .heldItem = ITEM_NONE, + .moves = MOVE_SKY_UPPERCUT, MOVE_PROTECT, MOVE_FIRE_PUNCH, MOVE_ICE_PUNCH + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_MACHAMP, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_CROSS_CHOP, MOVE_ROCK_SLIDE, MOVE_FOCUS_PUNCH, MOVE_BULK_UP + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_MEDICHAM, + .heldItem = ITEM_NONE, + .moves = MOVE_FOCUS_PUNCH, MOVE_LIGHT_SCREEN, MOVE_REFLECT, MOVE_PSYCHIC + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_HITMONTOP, + .heldItem = ITEM_NONE, + .moves = MOVE_PURSUIT, MOVE_COUNTER, MOVE_PROTECT, MOVE_TRIPLE_KICK + }, + { + .iv = 255, + .lvl = 52, + .species = SPECIES_HARIYAMA, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_FAKE_OUT, MOVE_FOCUS_PUNCH, MOVE_BELLY_DRUM, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Wattson2[] = { + { + .iv = 255, + .lvl = 36, + .species = SPECIES_MAREEP, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 36, + .species = SPECIES_ELECTRODE, + .heldItem = ITEM_NONE, + .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 38, + .species = SPECIES_MAGNETON, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 40, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Wattson3[] = { + { + .iv = 255, + .lvl = 39, + .species = SPECIES_PIKACHU, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, MOVE_SHOCK_WAVE + }, + { + .iv = 255, + .lvl = 41, + .species = SPECIES_FLAAFFY, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 41, + .species = SPECIES_ELECTRODE, + .heldItem = ITEM_NONE, + .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_MAGNETON, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Wattson4[] = { + { + .iv = 255, + .lvl = 44, + .species = SPECIES_RAICHU, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_AMPHAROS, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_ELECTRODE, + .heldItem = ITEM_NONE, + .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_MAGNETON, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Wattson5[] = { + { + .iv = 255, + .lvl = 50, + .species = SPECIES_ELECTABUZZ, + .heldItem = ITEM_NONE, + .moves = MOVE_SWIFT, MOVE_FOCUS_PUNCH, MOVE_THUNDER_PUNCH, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_RAICHU, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_SLAM, MOVE_RAIN_DANCE, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_AMPHAROS, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_PROTECT, MOVE_THUNDER_WAVE, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_ELECTRODE, + .heldItem = ITEM_NONE, + .moves = MOVE_ROLLOUT, MOVE_THUNDER, MOVE_EXPLOSION, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_MAGNETON, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_THUNDER, MOVE_RAIN_DANCE + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_MANECTRIC, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BITE, MOVE_THUNDER_WAVE, MOVE_THUNDER, MOVE_PROTECT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Flannery2[] = { + { + .iv = 255, + .lvl = 38, + .species = SPECIES_MAGCARGO, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 36, + .species = SPECIES_PONYTA, + .heldItem = ITEM_NONE, + .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE + }, + { + .iv = 255, + .lvl = 38, + .species = SPECIES_CAMERUPT, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT + }, + { + .iv = 255, + .lvl = 40, + .species = SPECIES_TORKOAL, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Flannery3[] = { + { + .iv = 255, + .lvl = 41, + .species = SPECIES_GROWLITHE, + .heldItem = ITEM_NONE, + .moves = MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_ROAR, MOVE_SUNNY_DAY + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_MAGCARGO, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 41, + .species = SPECIES_PONYTA, + .heldItem = ITEM_NONE, + .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_CAMERUPT, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_TORKOAL, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Flannery4[] = { + { + .iv = 255, + .lvl = 46, + .species = SPECIES_HOUNDOUR, + .heldItem = ITEM_NONE, + .moves = MOVE_ROAR, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_SUNNY_DAY + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_GROWLITHE, + .heldItem = ITEM_NONE, + .moves = MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_SUNNY_DAY, MOVE_ROAR + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_MAGCARGO, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_RAPIDASH, + .heldItem = ITEM_NONE, + .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_CAMERUPT, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_TORKOAL, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Flannery5[] = { + { + .iv = 255, + .lvl = 51, + .species = SPECIES_ARCANINE, + .heldItem = ITEM_NONE, + .moves = MOVE_HELPING_HAND, MOVE_FLAMETHROWER, MOVE_SUNNY_DAY, MOVE_ROAR + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_MAGCARGO, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_ATTRACT, MOVE_LIGHT_SCREEN, MOVE_ROCK_SLIDE + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_HOUNDOOM, + .heldItem = ITEM_NONE, + .moves = MOVE_ROAR, MOVE_SOLAR_BEAM, MOVE_TAUNT, MOVE_SUNNY_DAY + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_RAPIDASH, + .heldItem = ITEM_NONE, + .moves = MOVE_FLAMETHROWER, MOVE_ATTRACT, MOVE_SOLAR_BEAM, MOVE_BOUNCE + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_CAMERUPT, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EARTHQUAKE, MOVE_ATTRACT + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_TORKOAL, + .heldItem = ITEM_WHITE_HERB, + .moves = MOVE_OVERHEAT, MOVE_SUNNY_DAY, MOVE_EXPLOSION, MOVE_ATTRACT + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Norman2[] = { + { + .iv = 255, + .lvl = 42, + .species = SPECIES_CHANSEY, + .heldItem = ITEM_NONE, + .moves = MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH + }, + { + .iv = 255, + .lvl = 42, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_SPINDA, + .heldItem = ITEM_NONE, + .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Norman3[] = { + { + .iv = 255, + .lvl = 47, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST + }, + { + .iv = 255, + .lvl = 47, + .species = SPECIES_CHANSEY, + .heldItem = ITEM_NONE, + .moves = MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_KANGASKHAN, + .heldItem = ITEM_NONE, + .moves = MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, MOVE_REVERSAL + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_SPINDA, + .heldItem = ITEM_NONE, + .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Norman4[] = { + { + .iv = 255, + .lvl = 52, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST + }, + { + .iv = 255, + .lvl = 52, + .species = SPECIES_BLISSEY, + .heldItem = ITEM_NONE, + .moves = MOVE_LIGHT_SCREEN, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_KANGASKHAN, + .heldItem = ITEM_NONE, + .moves = MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, MOVE_REVERSAL + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_SPINDA, + .heldItem = ITEM_NONE, + .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Norman5[] = { + { + .iv = 255, + .lvl = 57, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_BLIZZARD, MOVE_SHADOW_BALL, MOVE_DOUBLE_EDGE, MOVE_FIRE_BLAST + }, + { + .iv = 255, + .lvl = 57, + .species = SPECIES_BLISSEY, + .heldItem = ITEM_NONE, + .moves = MOVE_PROTECT, MOVE_SING, MOVE_SKILL_SWAP, MOVE_FOCUS_PUNCH + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_KANGASKHAN, + .heldItem = ITEM_NONE, + .moves = MOVE_FAKE_OUT, MOVE_DIZZY_PUNCH, MOVE_ENDURE, MOVE_REVERSAL + }, + { + .iv = 255, + .lvl = 57, + .species = SPECIES_TAUROS, + .heldItem = ITEM_NONE, + .moves = MOVE_TAKE_DOWN, MOVE_PROTECT, MOVE_FIRE_BLAST, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_SPINDA, + .heldItem = ITEM_NONE, + .moves = MOVE_TEETER_DANCE, MOVE_SKILL_SWAP, MOVE_FACADE, MOVE_HYPNOSIS + }, + { + .iv = 255, + .lvl = 60, + .species = SPECIES_SLAKING, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_HYPER_BEAM, MOVE_FLAMETHROWER, MOVE_THUNDERBOLT, MOVE_SHADOW_BALL + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Winona2[] = { + { + .iv = 255, + .lvl = 40, + .species = SPECIES_DRATINI, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 38, + .species = SPECIES_TROPIUS, + .heldItem = ITEM_NONE, + .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 41, + .species = SPECIES_PELIPPER, + .heldItem = ITEM_NONE, + .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_SKARMORY, + .heldItem = ITEM_NONE, + .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Winona3[] = { + { + .iv = 255, + .lvl = 43, + .species = SPECIES_HOOTHOOT, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_DREAM_EATER + }, + { + .iv = 255, + .lvl = 43, + .species = SPECIES_TROPIUS, + .heldItem = ITEM_NONE, + .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 45, + .species = SPECIES_DRAGONAIR, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_PELIPPER, + .heldItem = ITEM_NONE, + .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_SKARMORY, + .heldItem = ITEM_NONE, + .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Winona4[] = { + { + .iv = 255, + .lvl = 48, + .species = SPECIES_NOCTOWL, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_DREAM_EATER + }, + { + .iv = 255, + .lvl = 49, + .species = SPECIES_TROPIUS, + .heldItem = ITEM_NONE, + .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_DRAGONAIR, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_THUNDER_WAVE, MOVE_THUNDERBOLT, MOVE_PROTECT, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_PELIPPER, + .heldItem = ITEM_NONE, + .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_SKARMORY, + .heldItem = ITEM_NONE, + .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_AERIAL_ACE, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Winona5[] = { + { + .iv = 255, + .lvl = 53, + .species = SPECIES_NOCTOWL, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_PSYCHIC, MOVE_REFLECT, MOVE_DREAM_EATER + }, + { + .iv = 255, + .lvl = 54, + .species = SPECIES_TROPIUS, + .heldItem = ITEM_NONE, + .moves = MOVE_SUNNY_DAY, MOVE_AERIAL_ACE, MOVE_SOLAR_BEAM, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_PELIPPER, + .heldItem = ITEM_NONE, + .moves = MOVE_SURF, MOVE_SUPERSONIC, MOVE_PROTECT, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_DRAGONITE, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_HYPER_BEAM, MOVE_THUNDERBOLT, MOVE_EARTHQUAKE, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_SKARMORY, + .heldItem = ITEM_NONE, + .moves = MOVE_WHIRLWIND, MOVE_SPIKES, MOVE_STEEL_WING, MOVE_AERIAL_ACE + }, + { + .iv = 255, + .lvl = 60, + .species = SPECIES_ALTARIA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_SKY_ATTACK, MOVE_REST, MOVE_DRAGON_DANCE, MOVE_EARTHQUAKE + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza2[] = { + { + .iv = 255, + .lvl = 48, + .species = SPECIES_SLOWPOKE, + .heldItem = ITEM_NONE, + .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 49, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_EARTHQUAKE, MOVE_ANCIENT_POWER, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 49, + .species = SPECIES_XATU, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_LUNATONE, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 50, + .species = SPECIES_SOLROCK, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza3[] = { + { + .iv = 255, + .lvl = 53, + .species = SPECIES_DROWZEE, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_SLOWPOKE, + .heldItem = ITEM_NONE, + .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 54, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 54, + .species = SPECIES_XATU, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_LUNATONE, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 55, + .species = SPECIES_SOLROCK, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza4[] = { + { + .iv = 255, + .lvl = 58, + .species = SPECIES_HYPNO, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 59, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_SLOWPOKE, + .heldItem = ITEM_NONE, + .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 59, + .species = SPECIES_XATU, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 60, + .species = SPECIES_LUNATONE, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 60, + .species = SPECIES_SOLROCK, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_TateAndLiza5[] = { + { + .iv = 255, + .lvl = 63, + .species = SPECIES_HYPNO, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_DREAM_EATER, MOVE_HEADBUTT, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 64, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_EARTHQUAKE, MOVE_EXPLOSION, MOVE_PSYCHIC, MOVE_LIGHT_SCREEN + }, + { + .iv = 255, + .lvl = 63, + .species = SPECIES_SLOWKING, + .heldItem = ITEM_NONE, + .moves = MOVE_YAWN, MOVE_PSYCHIC, MOVE_CALM_MIND, MOVE_PROTECT + }, + { + .iv = 255, + .lvl = 64, + .species = SPECIES_XATU, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_PSYCHIC, MOVE_REST, MOVE_CONFUSE_RAY, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 65, + .species = SPECIES_LUNATONE, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_REST, MOVE_CALM_MIND + }, + { + .iv = 255, + .lvl = 65, + .species = SPECIES_SOLROCK, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_SUNNY_DAY, MOVE_SOLAR_BEAM, MOVE_PSYCHIC, MOVE_FLAMETHROWER + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Juan2[] = { + { + .iv = 255, + .lvl = 46, + .species = SPECIES_POLIWAG, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_HYDRO_PUMP + }, + { + .iv = 255, + .lvl = 46, + .species = SPECIES_WHISCASH, + .heldItem = ITEM_NONE, + .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_WALREIN, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 48, + .species = SPECIES_CRAWDAUNT, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_REST, MOVE_CRABHAMMER, MOVE_TAUNT, MOVE_DOUBLE_TEAM + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_KINGDRA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Juan3[] = { + { + .iv = 255, + .lvl = 50, + .species = SPECIES_POLIWHIRL, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_HYDRO_PUMP + }, + { + .iv = 255, + .lvl = 51, + .species = SPECIES_WHISCASH, + .heldItem = ITEM_NONE, + .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_WALREIN, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 53, + .species = SPECIES_CRAWDAUNT, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, MOVE_DOUBLE_TEAM + }, + { + .iv = 255, + .lvl = 56, + .species = SPECIES_KINGDRA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Juan4[] = { + { + .iv = 255, + .lvl = 56, + .species = SPECIES_LAPRAS, + .heldItem = ITEM_NONE, + .moves = MOVE_HYDRO_PUMP, MOVE_PERISH_SONG, MOVE_ICE_BEAM, MOVE_CONFUSE_RAY + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_WHISCASH, + .heldItem = ITEM_NONE, + .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE + }, + { + .iv = 255, + .lvl = 56, + .species = SPECIES_POLIWHIRL, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_PROTECT, MOVE_HYDRO_PUMP + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_WALREIN, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_ICE_BEAM + }, + { + .iv = 255, + .lvl = 58, + .species = SPECIES_CRAWDAUNT, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, MOVE_DOUBLE_TEAM + }, + { + .iv = 255, + .lvl = 61, + .species = SPECIES_KINGDRA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Juan5[] = { + { + .iv = 255, + .lvl = 61, + .species = SPECIES_LAPRAS, + .heldItem = ITEM_NONE, + .moves = MOVE_HYDRO_PUMP, MOVE_PERISH_SONG, MOVE_ICE_BEAM, MOVE_CONFUSE_RAY + }, + { + .iv = 255, + .lvl = 63, + .species = SPECIES_WHISCASH, + .heldItem = ITEM_NONE, + .moves = MOVE_RAIN_DANCE, MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_FISSURE + }, + { + .iv = 255, + .lvl = 61, + .species = SPECIES_POLITOED, + .heldItem = ITEM_NONE, + .moves = MOVE_HYPNOSIS, MOVE_RAIN_DANCE, MOVE_HYDRO_PUMP, MOVE_PERISH_SONG + }, + { + .iv = 255, + .lvl = 63, + .species = SPECIES_WALREIN, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_BODY_SLAM, MOVE_PROTECT, MOVE_SHEER_COLD + }, + { + .iv = 255, + .lvl = 63, + .species = SPECIES_CRAWDAUNT, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_REST, MOVE_GUILLOTINE, MOVE_TAUNT, MOVE_DOUBLE_TEAM + }, + { + .iv = 255, + .lvl = 66, + .species = SPECIES_KINGDRA, + .heldItem = ITEM_CHESTO_BERRY, + .moves = MOVE_WATER_PULSE, MOVE_DOUBLE_TEAM, MOVE_ICE_BEAM, MOVE_REST + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Angelo[] = { + { + .iv = 100, + .lvl = 17, + .species = SPECIES_ILLUMISE, + .heldItem = ITEM_NONE, + .moves = MOVE_SHOCK_WAVE, MOVE_QUICK_ATTACK, MOVE_CHARM, MOVE_NONE + }, + { + .iv = 100, + .lvl = 17, + .species = SPECIES_VOLBEAT, + .heldItem = ITEM_NONE, + .moves = MOVE_SHOCK_WAVE, MOVE_QUICK_ATTACK, MOVE_CONFUSE_RAY, MOVE_NONE + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Darius[] = { + { + .iv = 200, + .lvl = 30, + .species = SPECIES_TROPIUS, + } +}; + +const struct TrainerMonItemCustomMoves gTrainerParty_Steven[] = { + { + .iv = 255, + .lvl = 77, + .species = SPECIES_SKARMORY, + .heldItem = ITEM_NONE, + .moves = MOVE_TOXIC, MOVE_AERIAL_ACE, MOVE_SPIKES, MOVE_STEEL_WING + }, + { + .iv = 255, + .lvl = 75, + .species = SPECIES_CLAYDOL, + .heldItem = ITEM_NONE, + .moves = MOVE_REFLECT, MOVE_LIGHT_SCREEN, MOVE_ANCIENT_POWER, MOVE_EARTHQUAKE + }, + { + .iv = 255, + .lvl = 76, + .species = SPECIES_AGGRON, + .heldItem = ITEM_NONE, + .moves = MOVE_THUNDER, MOVE_EARTHQUAKE, MOVE_SOLAR_BEAM, MOVE_DRAGON_CLAW + }, + { + .iv = 255, + .lvl = 76, + .species = SPECIES_CRADILY, + .heldItem = ITEM_NONE, + .moves = MOVE_GIGA_DRAIN, MOVE_ANCIENT_POWER, MOVE_INGRAIN, MOVE_CONFUSE_RAY + }, + { + .iv = 255, + .lvl = 76, + .species = SPECIES_ARMALDO, + .heldItem = ITEM_NONE, + .moves = MOVE_WATER_PULSE, MOVE_ANCIENT_POWER, MOVE_AERIAL_ACE, MOVE_SLASH + }, + { + .iv = 255, + .lvl = 78, + .species = SPECIES_METAGROSS, + .heldItem = ITEM_SITRUS_BERRY, + .moves = MOVE_EARTHQUAKE, MOVE_PSYCHIC, MOVE_METEOR_MASH, MOVE_SHADOW_BALL + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Anabel[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Tucker[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Spenser[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Greta[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Noland[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Lucy[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brandon[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BELDUM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres2[] = { + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres3[] = { + { + .iv = 20, + .lvl = 33, + .species = SPECIES_NOSEPASS, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres4[] = { + { + .iv = 30, + .lvl = 35, + .species = SPECIES_NOSEPASS, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_SANDSHREW, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_SANDSHREW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Andres5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_NOSEPASS, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_SANDSLASH, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_SANDSLASH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory2[] = { + { + .iv = 10, + .lvl = 30, + .species = SPECIES_WINGULL, + }, + { + .iv = 10, + .lvl = 30, + .species = SPECIES_MACHOP, + }, + { + .iv = 10, + .lvl = 30, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory3[] = { + { + .iv = 20, + .lvl = 32, + .species = SPECIES_PELIPPER, + }, + { + .iv = 20, + .lvl = 32, + .species = SPECIES_MACHOP, + }, + { + .iv = 20, + .lvl = 32, + .species = SPECIES_TENTACOOL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory4[] = { + { + .iv = 30, + .lvl = 34, + .species = SPECIES_PELIPPER, + }, + { + .iv = 30, + .lvl = 34, + .species = SPECIES_MACHOP, + }, + { + .iv = 30, + .lvl = 34, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cory5[] = { + { + .iv = 40, + .lvl = 36, + .species = SPECIES_PELIPPER, + }, + { + .iv = 40, + .lvl = 36, + .species = SPECIES_MACHOKE, + }, + { + .iv = 40, + .lvl = 36, + .species = SPECIES_TENTACRUEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo2[] = { + { + .iv = 10, + .lvl = 37, + .species = SPECIES_STARYU, + }, + { + .iv = 10, + .lvl = 37, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo3[] = { + { + .iv = 20, + .lvl = 39, + .species = SPECIES_WINGULL, + }, + { + .iv = 20, + .lvl = 39, + .species = SPECIES_STARYU, + }, + { + .iv = 20, + .lvl = 39, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo4[] = { + { + .iv = 30, + .lvl = 41, + .species = SPECIES_PELIPPER, + }, + { + .iv = 30, + .lvl = 41, + .species = SPECIES_STARYU, + }, + { + .iv = 30, + .lvl = 41, + .species = SPECIES_STARYU, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Pablo5[] = { + { + .iv = 40, + .lvl = 43, + .species = SPECIES_PELIPPER, + }, + { + .iv = 40, + .lvl = 43, + .species = SPECIES_STARMIE, + }, + { + .iv = 40, + .lvl = 43, + .species = SPECIES_STARMIE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji2[] = { + { + .iv = 10, + .lvl = 37, + .species = SPECIES_MACHOKE, + }, + { + .iv = 10, + .lvl = 37, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji3[] = { + { + .iv = 20, + .lvl = 39, + .species = SPECIES_MAKUHITA, + }, + { + .iv = 20, + .lvl = 39, + .species = SPECIES_MACHOKE, + }, + { + .iv = 20, + .lvl = 39, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji4[] = { + { + .iv = 30, + .lvl = 41, + .species = SPECIES_HARIYAMA, + }, + { + .iv = 30, + .lvl = 41, + .species = SPECIES_MACHOKE, + }, + { + .iv = 30, + .lvl = 41, + .species = SPECIES_MACHOKE, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Koji5[] = { + { + .iv = 40, + .lvl = 43, + .species = SPECIES_HARIYAMA, + }, + { + .iv = 40, + .lvl = 43, + .species = SPECIES_MACHAMP, + }, + { + .iv = 40, + .lvl = 43, + .species = SPECIES_MACHAMP, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin2[] = { + { + .iv = 110, + .lvl = 35, + .species = SPECIES_LOUDRED, + }, + { + .iv = 110, + .lvl = 35, + .species = SPECIES_VIGOROTH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin3[] = { + { + .iv = 120, + .lvl = 37, + .species = SPECIES_SPINDA, + }, + { + .iv = 120, + .lvl = 37, + .species = SPECIES_LOUDRED, + }, + { + .iv = 120, + .lvl = 37, + .species = SPECIES_VIGOROTH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin4[] = { + { + .iv = 130, + .lvl = 39, + .species = SPECIES_SPINDA, + }, + { + .iv = 130, + .lvl = 39, + .species = SPECIES_LOUDRED, + }, + { + .iv = 100, + .lvl = 39, + .species = SPECIES_VIGOROTH, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Cristin5[] = { + { + .iv = 140, + .lvl = 41, + .species = SPECIES_SPINDA, + }, + { + .iv = 140, + .lvl = 41, + .species = SPECIES_EXPLOUD, + }, + { + .iv = 140, + .lvl = 41, + .species = SPECIES_SLAKING, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando2[] = { + { + .iv = 10, + .lvl = 35, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 10, + .lvl = 35, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 10, + .lvl = 35, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando3[] = { + { + .iv = 20, + .lvl = 37, + .species = SPECIES_ELECTRIKE, + }, + { + .iv = 20, + .lvl = 37, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 20, + .lvl = 37, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando4[] = { + { + .iv = 30, + .lvl = 39, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 30, + .lvl = 39, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 30, + .lvl = 39, + .species = SPECIES_LOUDRED, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Fernando5[] = { + { + .iv = 40, + .lvl = 41, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 40, + .lvl = 41, + .species = SPECIES_MANECTRIC, + }, + { + .iv = 40, + .lvl = 41, + .species = SPECIES_EXPLOUD, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer2[] = { + { + .iv = 10, + .lvl = 26, + .species = SPECIES_GEODUDE, + }, + { + .iv = 10, + .lvl = 26, + .species = SPECIES_NUMEL, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer3[] = { + { + .iv = 20, + .lvl = 28, + .species = SPECIES_MACHOP, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_NUMEL, + }, + { + .iv = 20, + .lvl = 28, + .species = SPECIES_GRAVELER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer4[] = { + { + .iv = 30, + .lvl = 30, + .species = SPECIES_MACHOP, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_NUMEL, + }, + { + .iv = 30, + .lvl = 30, + .species = SPECIES_GRAVELER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Sawyer5[] = { + { + .iv = 40, + .lvl = 33, + .species = SPECIES_MACHOKE, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_CAMERUPT, + }, + { + .iv = 40, + .lvl = 33, + .species = SPECIES_GOLEM, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle2[] = { + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SKITTY, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_ZIGZAGOON, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_LOTAD, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_SEEDOT, + }, + { + .iv = 10, + .lvl = 31, + .species = SPECIES_TAILLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle3[] = { + { + .iv = 20, + .lvl = 33, + .species = SPECIES_SKITTY, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_LINOONE, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_LOMBRE, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_NUZLEAF, + }, + { + .iv = 20, + .lvl = 33, + .species = SPECIES_TAILLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle4[] = { + { + .iv = 30, + .lvl = 35, + .species = SPECIES_DELCATTY, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_LINOONE, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_LOMBRE, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_NUZLEAF, + }, + { + .iv = 30, + .lvl = 35, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Gabrielle5[] = { + { + .iv = 40, + .lvl = 37, + .species = SPECIES_DELCATTY, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_MIGHTYENA, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_LINOONE, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_LUDICOLO, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_SHIFTRY, + }, + { + .iv = 40, + .lvl = 37, + .species = SPECIES_SWELLOW, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia2[] = { + { + .iv = 10, + .lvl = 34, + .species = SPECIES_WAILMER, + }, + { + .iv = 10, + .lvl = 34, + .species = SPECIES_HORSEA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia3[] = { + { + .iv = 20, + .lvl = 36, + .species = SPECIES_LUVDISC, + }, + { + .iv = 20, + .lvl = 36, + .species = SPECIES_WAILMER, + }, + { + .iv = 20, + .lvl = 36, + .species = SPECIES_SEADRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia4[] = { + { + .iv = 30, + .lvl = 38, + .species = SPECIES_LUVDISC, + }, + { + .iv = 30, + .lvl = 38, + .species = SPECIES_WAILMER, + }, + { + .iv = 30, + .lvl = 38, + .species = SPECIES_SEADRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Thalia5[] = { + { + .iv = 40, + .lvl = 40, + .species = SPECIES_LUVDISC, + }, + { + .iv = 40, + .lvl = 40, + .species = SPECIES_WAILORD, + }, + { + .iv = 40, + .lvl = 40, + .species = SPECIES_KINGDRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Mariela[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_CHIMECHO, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Alvaro[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_BANETTE, + }, + { + .iv = 0, + .lvl = 41, + .species = SPECIES_KADABRA, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Everett[] = { + { + .iv = 0, + .lvl = 41, + .species = SPECIES_WOBBUFFET, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Red[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_CHARMANDER, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Leaf[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_BULBASAUR, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_Brendan16[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_GROUDON, + } +}; + +const struct TrainerMonNoItemDefaultMoves gTrainerParty_May16[] = { + { + .iv = 0, + .lvl = 5, + .species = SPECIES_KYOGRE, + } +}; + diff --git a/src/data/trainers.h b/src/data/trainers.h new file mode 100644 index 000000000..19e210acc --- /dev/null +++ b/src/data/trainers.h @@ -0,0 +1,11971 @@ +const struct Trainer gTrainers[] = { + [TRAINER_NONE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _(""), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 0, + .party = {.NoItemDefaultMoves = NULL } + }, + + [TRAINER_SAWYER_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("SAWYER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer1 } + }, + + [TRAINER_GRUNT_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt1 } + }, + + [TRAINER_GRUNT_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt2 } + }, + + [TRAINER_GRUNT_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt3 } + }, + + [TRAINER_GRUNT_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt4 } + }, + + [TRAINER_GRUNT_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt5 } + }, + + [TRAINER_GRUNT_6] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt6 } + }, + + [TRAINER_GRUNT_7] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt7 } + }, + + [TRAINER_GABRIELLE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("GABRIELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle1 } + }, + + [TRAINER_GRUNT_8] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt8 } + }, + + [TRAINER_MARCEL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("MARCEL"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Marcel } + }, + + [TRAINER_ALBERTO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ALBERTO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Alberto } + }, + + [TRAINER_ED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("ED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Ed } + }, + + [TRAINER_GRUNT_9] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt9 } + }, + + [TRAINER_DECLAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DECLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Declan } + }, + + [TRAINER_GRUNT_10] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt10 } + }, + + [TRAINER_GRUNT_11] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt11 } + }, + + [TRAINER_GRUNT_12] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt12 } + }, + + [TRAINER_GRUNT_13] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt13 } + }, + + [TRAINER_GRUNT_14] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt14 } + }, + + [TRAINER_GRUNT_15] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt15 } + }, + + [TRAINER_GRUNT_16] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt16 } + }, + + [TRAINER_GRUNT_17] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt17 } + }, + + [TRAINER_GRUNT_18] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt18 } + }, + + [TRAINER_GRUNT_19] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt19 } + }, + + [TRAINER_GRUNT_20] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt20 } + }, + + [TRAINER_GRUNT_21] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt21 } + }, + + [TRAINER_GRUNT_22] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt22 } + }, + + [TRAINER_FREDRICK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("FREDRICK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Fredrick } + }, + + [TRAINER_MATT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AQUA_ADMIN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_ADMIN_M, + .trainerName = _("MATT"), + .items = {ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Matt } + }, + + [TRAINER_ZANDER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("ZANDER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Zander } + }, + + [TRAINER_SHELLY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AQUA_ADMIN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, + .trainerName = _("SHELLY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelly1 } + }, + + [TRAINER_SHELLY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AQUA_ADMIN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_ADMIN_F, + .trainerName = _("SHELLY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelly2 } + }, + + [TRAINER_ARCHIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AQUA_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_LEADER_ARCHIE, + .trainerName = _("ARCHIE"), + .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Archie } + }, + + [TRAINER_LEAH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("LEAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Leah } + }, + + [TRAINER_DAISY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("DAISY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Daisy } + }, + + [TRAINER_ROSE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("ROSE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Rose1 } + }, + + [TRAINER_FELIX] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("FELIX"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Felix } + }, + + [TRAINER_VIOLET] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("VIOLET"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Violet } + }, + + [TRAINER_ROSE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("ROSE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Rose2 } + }, + + [TRAINER_ROSE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("ROSE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Rose3 } + }, + + [TRAINER_ROSE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("ROSE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Rose4 } + }, + + [TRAINER_ROSE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("ROSE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Rose5 } + }, + + [TRAINER_DUSTY_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("DUSTY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Dusty1 } + }, + + [TRAINER_CHIP] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("CHIP"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemCustomMoves = gTrainerParty_Chip } + }, + + [TRAINER_FOSTER] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("FOSTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Foster } + }, + + [TRAINER_DUSTY_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("DUSTY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Dusty2 } + }, + + [TRAINER_DUSTY_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("DUSTY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Dusty3 } + }, + + [TRAINER_DUSTY_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("DUSTY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Dusty4 } + }, + + [TRAINER_DUSTY_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("DUSTY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Dusty5 } + }, + + [TRAINER_GABBY_AND_TY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_INTERVIEWER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + .trainerPic = TRAINER_PIC_INTERVIEWER, + .trainerName = _("GABBY & TY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy1 } + }, + + [TRAINER_GABBY_AND_TY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_INTERVIEWER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + .trainerPic = TRAINER_PIC_INTERVIEWER, + .trainerName = _("GABBY & TY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy2 } + }, + + [TRAINER_GABBY_AND_TY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_INTERVIEWER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + .trainerPic = TRAINER_PIC_INTERVIEWER, + .trainerName = _("GABBY & TY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy3 } + }, + + [TRAINER_GABBY_AND_TY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_INTERVIEWER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + .trainerPic = TRAINER_PIC_INTERVIEWER, + .trainerName = _("GABBY & TY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy4 } + }, + + [TRAINER_GABBY_AND_TY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_INTERVIEWER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + .trainerPic = TRAINER_PIC_INTERVIEWER, + .trainerName = _("GABBY & TY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_GabbyAndTy5 } + }, + + [TRAINER_GABBY_AND_TY_6] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_INTERVIEWER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, + .trainerPic = TRAINER_PIC_INTERVIEWER, + .trainerName = _("GABBY & TY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_GabbyAndTy6 } + }, + + [TRAINER_LOLA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("LOLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lola1 } + }, + + [TRAINER_AUSTINA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("AUSTINA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Austina } + }, + + [TRAINER_GWEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("GWEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Gwen } + }, + + [TRAINER_LOLA_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("LOLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lola2 } + }, + + [TRAINER_LOLA_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("LOLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lola3 } + }, + + [TRAINER_LOLA_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("LOLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lola4 } + }, + + [TRAINER_LOLA_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("LOLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lola5 } + }, + + [TRAINER_RICKY_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("RICKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Ricky1 } + }, + + [TRAINER_SIMON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("SIMON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Simon } + }, + + [TRAINER_CHARLIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("CHARLIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Charlie } + }, + + [TRAINER_RICKY_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("RICKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Ricky2 } + }, + + [TRAINER_RICKY_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("RICKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Ricky3 } + }, + + [TRAINER_RICKY_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("RICKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Ricky4 } + }, + + [TRAINER_RICKY_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("RICKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Ricky5 } + }, + + [TRAINER_RANDALL] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("RANDALL"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Randall } + }, + + [TRAINER_PARKER] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("PARKER"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Parker } + }, + + [TRAINER_GEORGE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("GEORGE"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_George } + }, + + [TRAINER_BERKE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("BERKE"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Berke } + }, + + [TRAINER_BRAXTON] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("BRAXTON"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.NoItemCustomMoves = gTrainerParty_Braxton } + }, + + [TRAINER_VINCENT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("VINCENT"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Vincent } + }, + + [TRAINER_LEROY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("LEROY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Leroy } + }, + + [TRAINER_WILTON_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("WILTON"), + .items = {ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Wilton1 } + }, + + [TRAINER_EDGAR] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("EDGAR"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edgar } + }, + + [TRAINER_ALBERT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("ALBERT"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Albert } + }, + + [TRAINER_SAMUEL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("SAMUEL"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Samuel } + }, + + [TRAINER_VITO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("VITO"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Vito } + }, + + [TRAINER_OWEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("OWEN"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Owen } + }, + + [TRAINER_WILTON_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("WILTON"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Wilton2 } + }, + + [TRAINER_WILTON_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("WILTON"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Wilton3 } + }, + + [TRAINER_WILTON_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("WILTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Wilton4 } + }, + + [TRAINER_WILTON_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("WILTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Wilton5 } + }, + + [TRAINER_WARREN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("WARREN"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Warren } + }, + + [TRAINER_MARY] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("MARY"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Mary } + }, + + [TRAINER_ALEXIA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("ALEXIA"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Alexia } + }, + + [TRAINER_JODY] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("JODY"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Jody } + }, + + [TRAINER_WENDY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("WENDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 3, + .party = {.NoItemCustomMoves = gTrainerParty_Wendy } + }, + + [TRAINER_KEIRA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("KEIRA"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Keira } + }, + + [TRAINER_BROOKE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("BROOKE"), + .items = {ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brooke1 } + }, + + [TRAINER_JENNIFER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("JENNIFER"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jennifer } + }, + + [TRAINER_HOPE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("HOPE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Hope } + }, + + [TRAINER_SHANNON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("SHANNON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Shannon } + }, + + [TRAINER_MICHELLE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("MICHELLE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Michelle } + }, + + [TRAINER_CAROLINE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CAROLINE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Caroline } + }, + + [TRAINER_JULIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("JULIE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Julie } + }, + + [TRAINER_BROOKE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("BROOKE"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brooke2 } + }, + + [TRAINER_BROOKE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("BROOKE"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brooke3 } + }, + + [TRAINER_BROOKE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("BROOKE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brooke4 } + }, + + [TRAINER_BROOKE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("BROOKE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brooke5 } + }, + + [TRAINER_PATRICIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("PATRICIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Patricia } + }, + + [TRAINER_KINDRA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("KINDRA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Kindra } + }, + + [TRAINER_TAMMY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("TAMMY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tammy } + }, + + [TRAINER_VALERIE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("VALERIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Valerie1 } + }, + + [TRAINER_TASHA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("TASHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tasha } + }, + + [TRAINER_VALERIE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("VALERIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Valerie2 } + }, + + [TRAINER_VALERIE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("VALERIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Valerie3 } + }, + + [TRAINER_VALERIE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("VALERIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Valerie4 } + }, + + [TRAINER_VALERIE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("VALERIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Valerie5 } + }, + + [TRAINER_CINDY_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("CINDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Cindy1 } + }, + + [TRAINER_DAPHNE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("DAPHNE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemCustomMoves = gTrainerParty_Daphne } + }, + + [TRAINER_GRUNT_23] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt23 } + }, + + [TRAINER_CINDY_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("CINDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Cindy2 } + }, + + [TRAINER_BRIANNA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("BRIANNA"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Brianna } + }, + + [TRAINER_NAOMI] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("NAOMI"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Naomi } + }, + + [TRAINER_CINDY_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("CINDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Cindy3 } + }, + + [TRAINER_CINDY_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("CINDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Cindy4 } + }, + + [TRAINER_CINDY_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("CINDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Cindy5 } + }, + + [TRAINER_CINDY_6] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("CINDY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Cindy6 } + }, + + [TRAINER_MELISSA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("MELISSA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Melissa } + }, + + [TRAINER_SHEILA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("SHEILA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Sheila } + }, + + [TRAINER_SHIRLEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("SHIRLEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Shirley } + }, + + [TRAINER_JESSICA_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("JESSICA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Jessica1 } + }, + + [TRAINER_CONNIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("CONNIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Connie } + }, + + [TRAINER_BRIDGET] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("BRIDGET"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Bridget } + }, + + [TRAINER_OLIVIA] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("OLIVIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemCustomMoves = gTrainerParty_Olivia } + }, + + [TRAINER_TIFFANY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("TIFFANY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tiffany } + }, + + [TRAINER_JESSICA_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("JESSICA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Jessica2 } + }, + + [TRAINER_JESSICA_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("JESSICA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Jessica3 } + }, + + [TRAINER_JESSICA_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("JESSICA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Jessica4 } + }, + + [TRAINER_JESSICA_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("JESSICA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Jessica5 } + }, + + [TRAINER_WINSTON_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("WINSTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Winston1 } + }, + + [TRAINER_MOLLIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("MOLLIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Mollie } + }, + + [TRAINER_GARRET] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("GARRET"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Garret } + }, + + [TRAINER_WINSTON_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("WINSTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Winston2 } + }, + + [TRAINER_WINSTON_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("WINSTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Winston3 } + }, + + [TRAINER_WINSTON_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("WINSTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Winston4 } + }, + + [TRAINER_WINSTON_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("WINSTON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Winston5 } + }, + + [TRAINER_STEVE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("STEVE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Steve1 } + }, + + [TRAINER_THALIA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("THALIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Thalia1 } + }, + + [TRAINER_MARK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("MARK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Mark } + }, + + [TRAINER_GRUNT_24] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt24 } + }, + + [TRAINER_STEVE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("STEVE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Steve2 } + }, + + [TRAINER_STEVE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("STEVE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Steve3 } + }, + + [TRAINER_STEVE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("STEVE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Steve4 } + }, + + [TRAINER_STEVE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("STEVE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Steve5 } + }, + + [TRAINER_LUIS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("LUIS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Luis } + }, + + [TRAINER_DOMINIK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DOMINIK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dominik } + }, + + [TRAINER_DOUGLAS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DOUGLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Douglas } + }, + + [TRAINER_DARRIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DARRIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Darrin } + }, + + [TRAINER_TONY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("TONY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tony1 } + }, + + [TRAINER_JEROME] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("JEROME"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jerome } + }, + + [TRAINER_MATTHEW] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("MATTHEW"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Matthew } + }, + + [TRAINER_DAVID] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DAVID"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_David } + }, + + [TRAINER_SPENCER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("SPENCER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Spencer } + }, + + [TRAINER_ROLAND] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("ROLAND"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Roland } + }, + + [TRAINER_NOLEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("NOLEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Nolen } + }, + + [TRAINER_STAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("STAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Stan } + }, + + [TRAINER_BARRY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("BARRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Barry } + }, + + [TRAINER_DEAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DEAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dean } + }, + + [TRAINER_RODNEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("RODNEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Rodney } + }, + + [TRAINER_RICHARD] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("RICHARD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Richard } + }, + + [TRAINER_HERMAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("HERMAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Herman } + }, + + [TRAINER_SANTIAGO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("SANTIAGO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Santiago } + }, + + [TRAINER_GILBERT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("GILBERT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Gilbert } + }, + + [TRAINER_FRANKLIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("FRANKLIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Franklin } + }, + + [TRAINER_KEVIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("KEVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kevin } + }, + + [TRAINER_JACK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("JACK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jack } + }, + + [TRAINER_DUDLEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("DUDLEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dudley } + }, + + [TRAINER_CHAD] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("CHAD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Chad } + }, + + [TRAINER_TONY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("TONY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tony2 } + }, + + [TRAINER_TONY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("TONY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tony3 } + }, + + [TRAINER_TONY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("TONY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tony4 } + }, + + [TRAINER_TONY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("TONY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tony5 } + }, + + [TRAINER_TAKAO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("TAKAO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Takao } + }, + + [TRAINER_HITOSHI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("HITOSHI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Hitoshi } + }, + + [TRAINER_KIYO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KIYO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kiyo } + }, + + [TRAINER_KOICHI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KOICHI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Koichi } + }, + + [TRAINER_NOB_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("NOB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Nob1 } + }, + + [TRAINER_NOB_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("NOB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Nob2 } + }, + + [TRAINER_NOB_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("NOB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Nob3 } + }, + + [TRAINER_NOB_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("NOB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Nob4 } + }, + + [TRAINER_NOB_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("NOB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.ItemDefaultMoves = gTrainerParty_Nob5 } + }, + + [TRAINER_YUJI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("YUJI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Yuji } + }, + + [TRAINER_DAISUKE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("DAISUKE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Daisuke } + }, + + [TRAINER_ATSUSHI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("ATSUSHI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Atsushi } + }, + + [TRAINER_KIRK] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("KIRK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Kirk } + }, + + [TRAINER_GRUNT_25] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt25 } + }, + + [TRAINER_GRUNT_26] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt26 } + }, + + [TRAINER_SHAWN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("SHAWN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shawn } + }, + + [TRAINER_FERNANDO_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("FERNANDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Fernando1 } + }, + + [TRAINER_DALTON_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("DALTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Dalton1 } + }, + + [TRAINER_DALTON_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("DALTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dalton2 } + }, + + [TRAINER_DALTON_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("DALTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dalton3 } + }, + + [TRAINER_DALTON_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("DALTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dalton4 } + }, + + [TRAINER_DALTON_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("DALTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dalton5 } + }, + + [TRAINER_COLE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("COLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Cole } + }, + + [TRAINER_JEFF] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("JEFF"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jeff } + }, + + [TRAINER_AXLE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("AXLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Axle } + }, + + [TRAINER_JACE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("JACE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jace } + }, + + [TRAINER_KEEGAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("KEEGAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Keegan } + }, + + [TRAINER_BERNIE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("BERNIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bernie1 } + }, + + [TRAINER_BERNIE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("BERNIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bernie2 } + }, + + [TRAINER_BERNIE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("BERNIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bernie3 } + }, + + [TRAINER_BERNIE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("BERNIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bernie4 } + }, + + [TRAINER_BERNIE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("BERNIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bernie5 } + }, + + [TRAINER_DREW] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("DREW"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Drew } + }, + + [TRAINER_BEAU] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("BEAU"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemCustomMoves = gTrainerParty_Beau } + }, + + [TRAINER_LARRY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("LARRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Larry } + }, + + [TRAINER_SHANE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("SHANE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shane } + }, + + [TRAINER_JUSTIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("JUSTIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Justin } + }, + + [TRAINER_ETHAN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("ETHAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Ethan1 } + }, + + [TRAINER_AUTUMN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("AUTUMN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Autumn } + }, + + [TRAINER_TRAVIS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("TRAVIS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Travis } + }, + + [TRAINER_ETHAN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("ETHAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Ethan2 } + }, + + [TRAINER_ETHAN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("ETHAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Ethan3 } + }, + + [TRAINER_ETHAN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("ETHAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ethan4 } + }, + + [TRAINER_ETHAN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("ETHAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ethan5 } + }, + + [TRAINER_BRENT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("BRENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brent } + }, + + [TRAINER_DONALD] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("DONALD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Donald } + }, + + [TRAINER_TAYLOR] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("TAYLOR"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Taylor } + }, + + [TRAINER_JEFFREY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("JEFFREY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey1 } + }, + + [TRAINER_DEREK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("DEREK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Derek } + }, + + [TRAINER_JEFFREY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("JEFFREY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey2 } + }, + + [TRAINER_JEFFREY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("JEFFREY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey3 } + }, + + [TRAINER_JEFFREY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("JEFFREY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Jeffrey4 } + }, + + [TRAINER_JEFFREY_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("JEFFREY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 5, + .party = {.ItemDefaultMoves = gTrainerParty_Jeffrey5 } + }, + + [TRAINER_EDWARD] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("EDWARD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Edward } + }, + + [TRAINER_PRESTON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("PRESTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Preston } + }, + + [TRAINER_VIRGIL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("VIRGIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Virgil } + }, + + [TRAINER_BLAKE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("BLAKE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Blake } + }, + + [TRAINER_WILLIAM] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("WILLIAM"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_William } + }, + + [TRAINER_JOSHUA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("JOSHUA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Joshua } + }, + + [TRAINER_CAMERON_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("CAMERON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Cameron1 } + }, + + [TRAINER_CAMERON_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("CAMERON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cameron2 } + }, + + [TRAINER_CAMERON_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("CAMERON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cameron3 } + }, + + [TRAINER_CAMERON_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("CAMERON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cameron4 } + }, + + [TRAINER_CAMERON_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("CAMERON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cameron5 } + }, + + [TRAINER_JACLYN] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("JACLYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Jaclyn } + }, + + [TRAINER_HANNAH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("HANNAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Hannah } + }, + + [TRAINER_SAMANTHA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("SAMANTHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Samantha } + }, + + [TRAINER_MAURA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("MAURA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Maura } + }, + + [TRAINER_KAYLA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("KAYLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Kayla } + }, + + [TRAINER_ALEXIS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("ALEXIS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Alexis } + }, + + [TRAINER_JACKI_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("JACKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jacki1 } + }, + + [TRAINER_JACKI_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("JACKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jacki2 } + }, + + [TRAINER_JACKI_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("JACKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jacki3 } + }, + + [TRAINER_JACKI_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("JACKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jacki4 } + }, + + [TRAINER_JACKI_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("JACKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jacki5 } + }, + + [TRAINER_WALTER_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("WALTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Walter1 } + }, + + [TRAINER_MICAH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("MICAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Micah } + }, + + [TRAINER_THOMAS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("THOMAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Thomas } + }, + + [TRAINER_WALTER_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("WALTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Walter2 } + }, + + [TRAINER_WALTER_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("WALTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Walter3 } + }, + + [TRAINER_WALTER_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("WALTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Walter4 } + }, + + [TRAINER_WALTER_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("WALTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemCustomMoves = gTrainerParty_Walter5 } + }, + + [TRAINER_SIDNEY] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_ELITE_FOUR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, + .trainerPic = TRAINER_PIC_ELITE_FOUR_SIDNEY, + .trainerName = _("SIDNEY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xf, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Sidney } + }, + + [TRAINER_PHOEBE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_ELITE_FOUR, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, + .trainerPic = TRAINER_PIC_ELITE_FOUR_PHOEBE, + .trainerName = _("PHOEBE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Phoebe } + }, + + [TRAINER_GLACIA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_ELITE_FOUR, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, + .trainerPic = TRAINER_PIC_ELITE_FOUR_GLACIA, + .trainerName = _("GLACIA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Glacia } + }, + + [TRAINER_DRAKE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_ELITE_FOUR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR, + .trainerPic = TRAINER_PIC_ELITE_FOUR_DRAKE, + .trainerName = _("DRAKE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Drake } + }, + + [TRAINER_ROXANNE_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_ROXANNE, + .trainerName = _("ROXANNE"), + .items = {ITEM_POTION, ITEM_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.ItemCustomMoves = gTrainerParty_Roxanne1 } + }, + + [TRAINER_BRAWLY_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_BRAWLY, + .trainerName = _("BRAWLY"), + .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.ItemCustomMoves = gTrainerParty_Brawly1 } + }, + + [TRAINER_WATTSON_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_WATTSON, + .trainerName = _("WATTSON"), + .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Wattson1 } + }, + + [TRAINER_FLANNERY_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_FLANNERY, + .trainerName = _("FLANNERY"), + .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Flannery1 } + }, + + [TRAINER_NORMAN_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_NORMAN, + .trainerName = _("NORMAN"), + .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Norman1 } + }, + + [TRAINER_WINONA_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_WINONA, + .trainerName = _("WINONA"), + .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x17, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Winona1 } + }, + + [TRAINER_TATE_AND_LIZA_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, + .trainerName = _("TATE&LIZA"), + .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza1 } + }, + + [TRAINER_JUAN_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_JUAN, + .trainerName = _("JUAN"), + .items = {ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Juan1 } + }, + + [TRAINER_JERRY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("JERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jerry1 } + }, + + [TRAINER_TED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("TED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Ted } + }, + + [TRAINER_PAUL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("PAUL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Paul } + }, + + [TRAINER_JERRY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("JERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jerry2 } + }, + + [TRAINER_JERRY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("JERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jerry3 } + }, + + [TRAINER_JERRY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("JERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jerry4 } + }, + + [TRAINER_JERRY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SCHOOL_KID_M, + .trainerName = _("JERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jerry5 } + }, + + [TRAINER_KAREN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_SCHOOL_KID_F, + .trainerName = _("KAREN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Karen1 } + }, + + [TRAINER_GEORGIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_SCHOOL_KID_F, + .trainerName = _("GEORGIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Georgia } + }, + + [TRAINER_KAREN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_SCHOOL_KID_F, + .trainerName = _("KAREN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Karen2 } + }, + + [TRAINER_KAREN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_SCHOOL_KID_F, + .trainerName = _("KAREN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Karen3 } + }, + + [TRAINER_KAREN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_SCHOOL_KID_F, + .trainerName = _("KAREN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Karen4 } + }, + + [TRAINER_KAREN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SCHOOL_KID, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_SCHOOL_KID_F, + .trainerName = _("KAREN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Karen5 } + }, + + [TRAINER_KATE_AND_JOY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("KATE & JOY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_KateAndJoy } + }, + + [TRAINER_ANNA_AND_MEG_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("ANNA & MEG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg1 } + }, + + [TRAINER_ANNA_AND_MEG_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("ANNA & MEG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg2 } + }, + + [TRAINER_ANNA_AND_MEG_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("ANNA & MEG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg3 } + }, + + [TRAINER_ANNA_AND_MEG_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("ANNA & MEG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg4 } + }, + + [TRAINER_ANNA_AND_MEG_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("ANNA & MEG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AnnaAndMeg5 } + }, + + [TRAINER_VICTOR] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_WINSTRATE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("VICTOR"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Victor } + }, + + [TRAINER_MIGUEL_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("MIGUEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Miguel1 } + }, + + [TRAINER_COLTON] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("COLTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Colton } + }, + + [TRAINER_MIGUEL_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("MIGUEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Miguel2 } + }, + + [TRAINER_MIGUEL_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("MIGUEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Miguel3 } + }, + + [TRAINER_MIGUEL_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("MIGUEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Miguel4 } + }, + + [TRAINER_MIGUEL_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("MIGUEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Miguel5 } + }, + + [TRAINER_VICTORIA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_WINSTRATE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("VICTORIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Victoria } + }, + + [TRAINER_VANESSA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("VANESSA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.ItemDefaultMoves = gTrainerParty_Vanessa } + }, + + [TRAINER_BETHANY] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("BETHANY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.ItemDefaultMoves = gTrainerParty_Bethany } + }, + + [TRAINER_ISABEL_1] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("ISABEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Isabel1 } + }, + + [TRAINER_ISABEL_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("ISABEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Isabel2 } + }, + + [TRAINER_ISABEL_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("ISABEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Isabel3 } + }, + + [TRAINER_ISABEL_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("ISABEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Isabel4 } + }, + + [TRAINER_ISABEL_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("ISABEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Isabel5 } + }, + + [TRAINER_TIMOTHY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("TIMOTHY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Timothy1 } + }, + + [TRAINER_TIMOTHY_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("TIMOTHY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Timothy2 } + }, + + [TRAINER_TIMOTHY_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("TIMOTHY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Timothy3 } + }, + + [TRAINER_TIMOTHY_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("TIMOTHY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Timothy4 } + }, + + [TRAINER_TIMOTHY_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("TIMOTHY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Timothy5 } + }, + + [TRAINER_VICKY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_WINSTRATE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("VICKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Vicky } + }, + + [TRAINER_SHELBY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("SHELBY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelby1 } + }, + + [TRAINER_SHELBY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("SHELBY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelby2 } + }, + + [TRAINER_SHELBY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("SHELBY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelby3 } + }, + + [TRAINER_SHELBY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("SHELBY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelby4 } + }, + + [TRAINER_SHELBY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("SHELBY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shelby5 } + }, + + [TRAINER_CALVIN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("CALVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Calvin1 } + }, + + [TRAINER_BILLY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("BILLY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Billy } + }, + + [TRAINER_JOSH] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("JOSH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Josh } + }, + + [TRAINER_TOMMY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("TOMMY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tommy } + }, + + [TRAINER_JOEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("JOEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Joey } + }, + + [TRAINER_BEN] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("BEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Ben } + }, + + [TRAINER_QUINCY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("QUINCY"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Quincy } + }, + + [TRAINER_KATELYNN] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("KATELYNN"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Katelynn } + }, + + [TRAINER_JAYLEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("JAYLEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jaylen } + }, + + [TRAINER_DILLON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("DILLON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dillon } + }, + + [TRAINER_CALVIN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("CALVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Calvin2 } + }, + + [TRAINER_CALVIN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("CALVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Calvin3 } + }, + + [TRAINER_CALVIN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("CALVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Calvin4 } + }, + + [TRAINER_CALVIN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("CALVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Calvin5 } + }, + + [TRAINER_EDDIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("EDDIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Eddie } + }, + + [TRAINER_ALLEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("ALLEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Allen } + }, + + [TRAINER_TIMMY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("TIMMY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Timmy } + }, + + [TRAINER_WALLACE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_CHAMPION, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CHAMPION_WALLACE, + .trainerName = _("WALLACE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Wallace } + }, + + [TRAINER_ANDREW] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ANDREW"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Andrew } + }, + + [TRAINER_IVAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("IVAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ivan } + }, + + [TRAINER_CLAUDE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("CLAUDE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Claude } + }, + + [TRAINER_ELLIOT_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ELLIOT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Elliot1 } + }, + + [TRAINER_NED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("NED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Ned } + }, + + [TRAINER_DALE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("DALE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Dale } + }, + + [TRAINER_NOLAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("NOLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Nolan } + }, + + [TRAINER_BARNY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("BARNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Barny } + }, + + [TRAINER_WADE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("WADE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Wade } + }, + + [TRAINER_CARTER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("CARTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Carter } + }, + + [TRAINER_ELLIOT_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ELLIOT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Elliot2 } + }, + + [TRAINER_ELLIOT_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ELLIOT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Elliot3 } + }, + + [TRAINER_ELLIOT_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ELLIOT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Elliot4 } + }, + + [TRAINER_ELLIOT_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ELLIOT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Elliot5 } + }, + + [TRAINER_RONALD] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("RONALD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Ronald } + }, + + [TRAINER_JACOB] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("JACOB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jacob } + }, + + [TRAINER_ANTHONY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("ANTHONY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Anthony } + }, + + [TRAINER_BENJAMIN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("BENJAMIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin1 } + }, + + [TRAINER_BENJAMIN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("BENJAMIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin2 } + }, + + [TRAINER_BENJAMIN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("BENJAMIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin3 } + }, + + [TRAINER_BENJAMIN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("BENJAMIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin4 } + }, + + [TRAINER_BENJAMIN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("BENJAMIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Benjamin5 } + }, + + [TRAINER_ABIGAIL_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("ABIGAIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Abigail1 } + }, + + [TRAINER_JASMINE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("JASMINE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jasmine } + }, + + [TRAINER_ABIGAIL_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("ABIGAIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Abigail2 } + }, + + [TRAINER_ABIGAIL_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("ABIGAIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Abigail3 } + }, + + [TRAINER_ABIGAIL_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("ABIGAIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Abigail4 } + }, + + [TRAINER_ABIGAIL_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("ABIGAIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Abigail5 } + }, + + [TRAINER_DYLAN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerName = _("DYLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dylan1 } + }, + + [TRAINER_DYLAN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerName = _("DYLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dylan2 } + }, + + [TRAINER_DYLAN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerName = _("DYLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dylan3 } + }, + + [TRAINER_DYLAN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerName = _("DYLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dylan4 } + }, + + [TRAINER_DYLAN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_M, + .trainerName = _("DYLAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dylan5 } + }, + + [TRAINER_MARIA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("MARIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Maria1 } + }, + + [TRAINER_MARIA_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("MARIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Maria2 } + }, + + [TRAINER_MARIA_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("MARIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Maria3 } + }, + + [TRAINER_MARIA_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("MARIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Maria4 } + }, + + [TRAINER_MARIA_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("MARIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Maria5 } + }, + + [TRAINER_CAMDEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("CAMDEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Camden } + }, + + [TRAINER_DEMETRIUS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("DEMETRIUS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Demetrius } + }, + + [TRAINER_ISAIAH_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("ISAIAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah1 } + }, + + [TRAINER_PABLO_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("PABLO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Pablo1 } + }, + + [TRAINER_CHASE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("CHASE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Chase } + }, + + [TRAINER_ISAIAH_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("ISAIAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah2 } + }, + + [TRAINER_ISAIAH_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("ISAIAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah3 } + }, + + [TRAINER_ISAIAH_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("ISAIAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah4 } + }, + + [TRAINER_ISAIAH_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("ISAIAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaiah5 } + }, + + [TRAINER_ISOBEL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("ISOBEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isobel } + }, + + [TRAINER_DONNY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("DONNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Donny } + }, + + [TRAINER_TALIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("TALIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Talia } + }, + + [TRAINER_KATELYN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("KATELYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn1 } + }, + + [TRAINER_ALLISON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("ALLISON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Allison } + }, + + [TRAINER_KATELYN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("KATELYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn2 } + }, + + [TRAINER_KATELYN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("KATELYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn3 } + }, + + [TRAINER_KATELYN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("KATELYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn4 } + }, + + [TRAINER_KATELYN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("KATELYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Katelyn5 } + }, + + [TRAINER_NICOLAS_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .trainerName = _("NICOLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas1 } + }, + + [TRAINER_NICOLAS_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .trainerName = _("NICOLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas2 } + }, + + [TRAINER_NICOLAS_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .trainerName = _("NICOLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas3 } + }, + + [TRAINER_NICOLAS_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .trainerName = _("NICOLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Nicolas4 } + }, + + [TRAINER_NICOLAS_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .trainerName = _("NICOLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.ItemDefaultMoves = gTrainerParty_Nicolas5 } + }, + + [TRAINER_AARON] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_DRAGON_TAMER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_DRAGON_TAMER, + .trainerName = _("AARON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Aaron } + }, + + [TRAINER_PERRY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("PERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Perry } + }, + + [TRAINER_HUGH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("HUGH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Hugh } + }, + + [TRAINER_PHIL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("PHIL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Phil } + }, + + [TRAINER_JARED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("JARED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jared } + }, + + [TRAINER_HUMBERTO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("HUMBERTO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Humberto } + }, + + [TRAINER_PRESLEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("PRESLEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Presley } + }, + + [TRAINER_EDWARDO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("EDWARDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edwardo } + }, + + [TRAINER_COLIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("COLIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Colin } + }, + + [TRAINER_ROBERT_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ROBERT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Robert1 } + }, + + [TRAINER_BENNY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("BENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Benny } + }, + + [TRAINER_CHESTER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("CHESTER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Chester } + }, + + [TRAINER_ROBERT_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ROBERT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Robert2 } + }, + + [TRAINER_ROBERT_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ROBERT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Robert3 } + }, + + [TRAINER_ROBERT_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ROBERT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Robert4 } + }, + + [TRAINER_ROBERT_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ROBERT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Robert5 } + }, + + [TRAINER_ALEX] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ALEX"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Alex } + }, + + [TRAINER_BECK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("BECK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Beck } + }, + + [TRAINER_YASU] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("YASU"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Yasu } + }, + + [TRAINER_TAKASHI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("TAKASHI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Takashi } + }, + + [TRAINER_DIANNE] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("DIANNE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 2, + .party = {.ItemCustomMoves = gTrainerParty_Dianne } + }, + + [TRAINER_JANI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("JANI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jani } + }, + + [TRAINER_LAO_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("LAO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 3, + .party = {.NoItemCustomMoves = gTrainerParty_Lao1 } + }, + + [TRAINER_LUNG] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("LUNG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lung } + }, + + [TRAINER_LAO_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("LAO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 4, + .party = {.NoItemCustomMoves = gTrainerParty_Lao2 } + }, + + [TRAINER_LAO_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("LAO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 4, + .party = {.NoItemCustomMoves = gTrainerParty_Lao3 } + }, + + [TRAINER_LAO_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("LAO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 4, + .party = {.NoItemCustomMoves = gTrainerParty_Lao4 } + }, + + [TRAINER_LAO_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("LAO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Lao5 } + }, + + [TRAINER_JOCELYN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("JOCELYN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jocelyn } + }, + + [TRAINER_LAURA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("LAURA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Laura } + }, + + [TRAINER_CYNDY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CYNDY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy1 } + }, + + [TRAINER_CORA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CORA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Cora } + }, + + [TRAINER_PAULA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("PAULA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Paula } + }, + + [TRAINER_CYNDY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CYNDY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy2 } + }, + + [TRAINER_CYNDY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CYNDY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy3 } + }, + + [TRAINER_CYNDY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CYNDY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy4 } + }, + + [TRAINER_CYNDY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CYNDY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cyndy5 } + }, + + [TRAINER_MADELINE_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("MADELINE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Madeline1 } + }, + + [TRAINER_CLARISSA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("CLARISSA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Clarissa } + }, + + [TRAINER_ANGELICA] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("ANGELICA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Angelica } + }, + + [TRAINER_MADELINE_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("MADELINE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Madeline2 } + }, + + [TRAINER_MADELINE_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("MADELINE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Madeline3 } + }, + + [TRAINER_MADELINE_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("MADELINE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Madeline4 } + }, + + [TRAINER_MADELINE_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("MADELINE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Madeline5 } + }, + + [TRAINER_BEVERLY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("BEVERLY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Beverly } + }, + + [TRAINER_IMANI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("IMANI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Imani } + }, + + [TRAINER_KYLA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("KYLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kyla } + }, + + [TRAINER_DENISE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("DENISE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Denise } + }, + + [TRAINER_BETH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("BETH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Beth } + }, + + [TRAINER_TARA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("TARA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tara } + }, + + [TRAINER_MISSY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("MISSY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Missy } + }, + + [TRAINER_ALICE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("ALICE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Alice } + }, + + [TRAINER_JENNY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("JENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jenny1 } + }, + + [TRAINER_GRACE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("GRACE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grace } + }, + + [TRAINER_TANYA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("TANYA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tanya } + }, + + [TRAINER_SHARON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("SHARON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Sharon } + }, + + [TRAINER_NIKKI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("NIKKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Nikki } + }, + + [TRAINER_BRENDA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("BRENDA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brenda } + }, + + [TRAINER_KATIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("KATIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Katie } + }, + + [TRAINER_SUSIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("SUSIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Susie } + }, + + [TRAINER_KARA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("KARA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kara } + }, + + [TRAINER_DANA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("DANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Dana } + }, + + [TRAINER_SIENNA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("SIENNA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Sienna } + }, + + [TRAINER_DEBRA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("DEBRA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Debra } + }, + + [TRAINER_LINDA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("LINDA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Linda } + }, + + [TRAINER_KAYLEE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("KAYLEE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Kaylee } + }, + + [TRAINER_LAUREL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("LAUREL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Laurel } + }, + + [TRAINER_CARLEE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("CARLEE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Carlee } + }, + + [TRAINER_JENNY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("JENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jenny2 } + }, + + [TRAINER_JENNY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("JENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jenny3 } + }, + + [TRAINER_JENNY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("JENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jenny4 } + }, + + [TRAINER_JENNY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("JENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jenny5 } + }, + + [TRAINER_HEIDI] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("HEIDI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Heidi } + }, + + [TRAINER_BECKY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("BECKY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Becky } + }, + + [TRAINER_CAROL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("CAROL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Carol } + }, + + [TRAINER_NANCY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("NANCY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Nancy } + }, + + [TRAINER_MARTHA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("MARTHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Martha } + }, + + [TRAINER_DIANA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("DIANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Diana1 } + }, + + [TRAINER_CEDRIC] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("CEDRIC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Cedric } + }, + + [TRAINER_IRENE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("IRENE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Irene } + }, + + [TRAINER_DIANA_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("DIANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Diana2 } + }, + + [TRAINER_DIANA_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("DIANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Diana3 } + }, + + [TRAINER_DIANA_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("DIANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Diana4 } + }, + + [TRAINER_DIANA_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("DIANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Diana5 } + }, + + [TRAINER_AMY_AND_LIV_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("AMY & LIV"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv1 } + }, + + [TRAINER_AMY_AND_LIV_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("AMY & LIV"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv2 } + }, + + [TRAINER_GINA_AND_MIA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("GINA & MIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_GinaAndMia1 } + }, + + [TRAINER_MIU_AND_YUKI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("MIU & YUKI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_MiuAndYuki } + }, + + [TRAINER_AMY_AND_LIV_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("AMY & LIV"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv3 } + }, + + [TRAINER_GINA_AND_MIA_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("GINA & MIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_GinaAndMia2 } + }, + + [TRAINER_AMY_AND_LIV_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("AMY & LIV"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_AmyAndLiv4 } + }, + + [TRAINER_AMY_AND_LIV_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("AMY & LIV"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AmyAndLiv5 } + }, + + [TRAINER_AMY_AND_LIV_6] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("AMY & LIV"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_AmyAndLiv6 } + }, + + [TRAINER_HUEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("HUEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Huey } + }, + + [TRAINER_EDMOND] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("EDMOND"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Edmond } + }, + + [TRAINER_ERNEST_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("ERNEST"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Ernest1 } + }, + + [TRAINER_DWAYNE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("DWAYNE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Dwayne } + }, + + [TRAINER_PHILLIP] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("PHILLIP"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Phillip } + }, + + [TRAINER_LEONARD] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("LEONARD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Leonard } + }, + + [TRAINER_DUNCAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("DUNCAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Duncan } + }, + + [TRAINER_ERNEST_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("ERNEST"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ernest2 } + }, + + [TRAINER_ERNEST_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("ERNEST"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ernest3 } + }, + + [TRAINER_ERNEST_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("ERNEST"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ernest4 } + }, + + [TRAINER_ERNEST_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("ERNEST"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ernest5 } + }, + + [TRAINER_ELI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("ELI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Eli } + }, + + [TRAINER_ANNIKA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_F, + .trainerName = _("ANNIKA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemCustomMoves = gTrainerParty_Annika } + }, + + [TRAINER_JAZMYN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_2, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("JAZMYN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jazmyn } + }, + + [TRAINER_JONAS] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("JONAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Jonas } + }, + + [TRAINER_KAYLEY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("KAYLEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Kayley } + }, + + [TRAINER_AURON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("AURON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Auron } + }, + + [TRAINER_KELVIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("KELVIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Kelvin } + }, + + [TRAINER_MARLEY] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("MARLEY"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.ItemCustomMoves = gTrainerParty_Marley } + }, + + [TRAINER_REYNA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("REYNA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Reyna } + }, + + [TRAINER_HUDSON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("HUDSON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Hudson } + }, + + [TRAINER_CONOR] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("CONOR"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Conor } + }, + + [TRAINER_EDWIN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("EDWIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edwin1 } + }, + + [TRAINER_HECTOR] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("HECTOR"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Hector } + }, + + [TRAINER_TABITHA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_ADMIN, + .trainerName = _("TABITHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Tabitha1 } + }, + + [TRAINER_EDWIN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("EDWIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edwin2 } + }, + + [TRAINER_EDWIN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("EDWIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edwin3 } + }, + + [TRAINER_EDWIN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("EDWIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edwin4 } + }, + + [TRAINER_EDWIN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COLLECTOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_COLLECTOR, + .trainerName = _("EDWIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Edwin5 } + }, + + [TRAINER_WALLY_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_WALLY, + .trainerName = _("WALLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.NoItemCustomMoves = gTrainerParty_Wally1 } + }, + + [TRAINER_BRENDAN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan1 } + }, + + [TRAINER_BRENDAN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan2 } + }, + + [TRAINER_BRENDAN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan3 } + }, + + [TRAINER_BRENDAN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan4 } + }, + + [TRAINER_BRENDAN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan5 } + }, + + [TRAINER_BRENDAN_6] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan6 } + }, + + [TRAINER_BRENDAN_7] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan7 } + }, + + [TRAINER_BRENDAN_8] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan8 } + }, + + [TRAINER_BRENDAN_9] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan9 } + }, + + [TRAINER_MAY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_May1 } + }, + + [TRAINER_MAY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_May2 } + }, + + [TRAINER_MAY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_May3 } + }, + + [TRAINER_MAY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_May4 } + }, + + [TRAINER_MAY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_May5 } + }, + + [TRAINER_MAY_6] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_May6 } + }, + + [TRAINER_MAY_7] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_May7 } + }, + + [TRAINER_MAY_8] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_May8 } + }, + + [TRAINER_MAY_9] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_May9 } + }, + + [TRAINER_ISAAC_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .trainerName = _("ISAAC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaac1 } + }, + + [TRAINER_DAVIS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("DAVIS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Davis } + }, + + [TRAINER_MITCHELL] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("MITCHELL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Mitchell } + }, + + [TRAINER_ISAAC_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .trainerName = _("ISAAC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaac2 } + }, + + [TRAINER_ISAAC_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .trainerName = _("ISAAC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaac3 } + }, + + [TRAINER_ISAAC_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .trainerName = _("ISAAC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaac4 } + }, + + [TRAINER_ISAAC_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .trainerName = _("ISAAC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Isaac5 } + }, + + [TRAINER_LYDIA_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("LYDIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Lydia1 } + }, + + [TRAINER_HALLE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("HALLE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Halle } + }, + + [TRAINER_GARRISON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("GARRISON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Garrison } + }, + + [TRAINER_LYDIA_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("LYDIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Lydia2 } + }, + + [TRAINER_LYDIA_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("LYDIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Lydia3 } + }, + + [TRAINER_LYDIA_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("LYDIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Lydia4 } + }, + + [TRAINER_LYDIA_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("LYDIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Lydia5 } + }, + + [TRAINER_JACKSON_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("JACKSON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jackson1 } + }, + + [TRAINER_LORENZO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("LORENZO"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Lorenzo } + }, + + [TRAINER_SEBASTIAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("SEBASTIAN"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Sebastian } + }, + + [TRAINER_JACKSON_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("JACKSON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jackson2 } + }, + + [TRAINER_JACKSON_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("JACKSON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jackson3 } + }, + + [TRAINER_JACKSON_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("JACKSON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Jackson4 } + }, + + [TRAINER_JACKSON_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_M, + .trainerName = _("JACKSON"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jackson5 } + }, + + [TRAINER_CATHERINE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("CATHERINE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Catherine1 } + }, + + [TRAINER_JENNA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("JENNA"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jenna } + }, + + [TRAINER_SOPHIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("SOPHIA"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Sophia } + }, + + [TRAINER_CATHERINE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("CATHERINE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Catherine2 } + }, + + [TRAINER_CATHERINE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("CATHERINE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Catherine3 } + }, + + [TRAINER_CATHERINE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("CATHERINE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Catherine4 } + }, + + [TRAINER_CATHERINE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_RANGER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_POKEMON_RANGER_F, + .trainerName = _("CATHERINE"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Catherine5 } + }, + + [TRAINER_JULIO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_M, + .trainerName = _("JULIO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Julio } + }, + + [TRAINER_GRUNT_27] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt27 } + }, + + [TRAINER_GRUNT_28] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt28 } + }, + + [TRAINER_GRUNT_29] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt29 } + }, + + [TRAINER_GRUNT_30] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt30 } + }, + + [TRAINER_MARC] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("MARC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Marc } + }, + + [TRAINER_BRENDEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("BRENDEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brenden } + }, + + [TRAINER_LILITH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("LILITH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Lilith } + }, + + [TRAINER_CRISTIAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("CRISTIAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Cristian } + }, + + [TRAINER_SYLVIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("SYLVIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Sylvia } + }, + + [TRAINER_LEONARDO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("LEONARDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Leonardo } + }, + + [TRAINER_ATHENA] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("ATHENA"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.ItemCustomMoves = gTrainerParty_Athena } + }, + + [TRAINER_HARRISON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("HARRISON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Harrison } + }, + + [TRAINER_GRUNT_31] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt31 } + }, + + [TRAINER_CLARENCE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("CLARENCE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Clarence } + }, + + [TRAINER_TERRY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("TERRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Terry } + }, + + [TRAINER_NATE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("NATE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Nate } + }, + + [TRAINER_KATHLEEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HEX_MANIAC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_HEX_MANIAC, + .trainerName = _("KATHLEEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kathleen } + }, + + [TRAINER_CLIFFORD] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("CLIFFORD"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Clifford } + }, + + [TRAINER_NICHOLAS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("NICHOLAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Nicholas } + }, + + [TRAINER_GRUNT_32] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt32 } + }, + + [TRAINER_GRUNT_33] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt33 } + }, + + [TRAINER_GRUNT_34] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt34 } + }, + + [TRAINER_GRUNT_35] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt35 } + }, + + [TRAINER_GRUNT_36] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt36 } + }, + + [TRAINER_MACEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("MACEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Macey } + }, + + [TRAINER_BRENDAN_10] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan10 } + }, + + [TRAINER_BRENDAN_11] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan11 } + }, + + [TRAINER_PAXTON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_M, + .trainerName = _("PAXTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Paxton } + }, + + [TRAINER_ISABELLA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_F, + .trainerName = _("ISABELLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isabella } + }, + + [TRAINER_GRUNT_37] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_AQUA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_AQUA, + .trainerPic = TRAINER_PIC_AQUA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt37 } + }, + + [TRAINER_TABITHA_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_ADMIN, + .trainerName = _("TABITHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Tabitha2 } + }, + + [TRAINER_JONATHAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("JONATHAN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jonathan } + }, + + [TRAINER_BRENDAN_12] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan12 } + }, + + [TRAINER_MAY_10] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_May10 } + }, + + [TRAINER_MAXIE_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_MAGMA_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, + .trainerName = _("MAXIE"), + .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Maxie1 } + }, + + [TRAINER_MAXIE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_MAGMA_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, + .trainerName = _("MAXIE"), + .items = {ITEM_SUPER_POTION, ITEM_SUPER_POTION, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Maxie2 } + }, + + [TRAINER_TIANA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("TIANA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Tiana } + }, + + [TRAINER_HALEY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("HALEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Haley1 } + }, + + [TRAINER_JANICE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("JANICE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Janice } + }, + + [TRAINER_VIVI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_WINSTRATE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("VIVI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Vivi } + }, + + [TRAINER_HALEY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("HALEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Haley2 } + }, + + [TRAINER_HALEY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("HALEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Haley3 } + }, + + [TRAINER_HALEY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("HALEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Haley4 } + }, + + [TRAINER_HALEY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("HALEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Haley5 } + }, + + [TRAINER_SALLY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("SALLY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Sally } + }, + + [TRAINER_ROBIN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("ROBIN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Robin } + }, + + [TRAINER_ANDREA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("ANDREA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Andrea } + }, + + [TRAINER_CRISSY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_LASS, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LASS, + .trainerName = _("CRISSY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Crissy } + }, + + [TRAINER_RICK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("RICK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Rick } + }, + + [TRAINER_LYLE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("LYLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Lyle } + }, + + [TRAINER_JOSE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("JOSE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jose } + }, + + [TRAINER_DOUG] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("DOUG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Doug } + }, + + [TRAINER_GREG] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("GREG"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Greg } + }, + + [TRAINER_KENT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("KENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kent } + }, + + [TRAINER_JAMES_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("JAMES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_James1 } + }, + + [TRAINER_JAMES_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("JAMES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_James2 } + }, + + [TRAINER_JAMES_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("JAMES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_James3 } + }, + + [TRAINER_JAMES_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("JAMES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_James4 } + }, + + [TRAINER_JAMES_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_CATCHER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BUG_CATCHER, + .trainerName = _("JAMES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_James5 } + }, + + [TRAINER_BRICE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("BRICE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Brice } + }, + + [TRAINER_TRENT_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("TRENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Trent1 } + }, + + [TRAINER_LENNY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("LENNY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lenny } + }, + + [TRAINER_LUCAS_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("LUCAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lucas1 } + }, + + [TRAINER_ALAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("ALAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Alan } + }, + + [TRAINER_CLARK] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("CLARK"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Clark } + }, + + [TRAINER_ERIC] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("ERIC"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Eric } + }, + + [TRAINER_LUCAS_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("LUCAS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Lucas2 } + }, + + [TRAINER_MIKE_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("MIKE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Mike1 } + }, + + [TRAINER_MIKE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("MIKE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Mike2 } + }, + + [TRAINER_TRENT_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("TRENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Trent2 } + }, + + [TRAINER_TRENT_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("TRENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Trent3 } + }, + + [TRAINER_TRENT_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("TRENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Trent4 } + }, + + [TRAINER_TRENT_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("TRENT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Trent5 } + }, + + [TRAINER_DEZ_AND_LUKE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("DEZ & LUKE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_DezAndLuke } + }, + + [TRAINER_LEA_AND_JED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("LEA & JED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LeaAndJed } + }, + + [TRAINER_KIRA_AND_DAN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("KIRA & DAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan1 } + }, + + [TRAINER_KIRA_AND_DAN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("KIRA & DAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan2 } + }, + + [TRAINER_KIRA_AND_DAN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("KIRA & DAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan3 } + }, + + [TRAINER_KIRA_AND_DAN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("KIRA & DAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan4 } + }, + + [TRAINER_KIRA_AND_DAN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("KIRA & DAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_KiraAndDan5 } + }, + + [TRAINER_JOHANNA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("JOHANNA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Johanna } + }, + + [TRAINER_GERALD] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("GERALD"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Gerald } + }, + + [TRAINER_VIVIAN] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("VIVIAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Vivian } + }, + + [TRAINER_DANIELLE] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("DANIELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Danielle } + }, + + [TRAINER_HIDEO] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("HIDEO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Hideo } + }, + + [TRAINER_KEIGO] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("KEIGO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Keigo } + }, + + [TRAINER_RILEY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("RILEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x3, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_Riley } + }, + + [TRAINER_FLINT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("FLINT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Flint } + }, + + [TRAINER_ASHLEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("ASHLEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Ashley } + }, + + [TRAINER_WALLY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_WALLY, + .trainerName = _("WALLY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Wally2 } + }, + + [TRAINER_WALLY_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_WALLY, + .trainerName = _("WALLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.NoItemCustomMoves = gTrainerParty_Wally3 } + }, + + [TRAINER_WALLY_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_WALLY, + .trainerName = _("WALLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.NoItemCustomMoves = gTrainerParty_Wally4 } + }, + + [TRAINER_WALLY_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_WALLY, + .trainerName = _("WALLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.NoItemCustomMoves = gTrainerParty_Wally5 } + }, + + [TRAINER_WALLY_6] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_WALLY, + .trainerName = _("WALLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.NoItemCustomMoves = gTrainerParty_Wally6 } + }, + + [TRAINER_BRENDAN_13] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan13 } + }, + + [TRAINER_BRENDAN_14] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan14 } + }, + + [TRAINER_BRENDAN_15] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan15 } + }, + + [TRAINER_MAY_11] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_May11 } + }, + + [TRAINER_MAY_12] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_May12 } + }, + + [TRAINER_MAY_13] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_May13 } + }, + + [TRAINER_JONAH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("JONAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Jonah } + }, + + [TRAINER_HENRY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("HENRY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Henry } + }, + + [TRAINER_ROGER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("ROGER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Roger } + }, + + [TRAINER_ALEXA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("ALEXA"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Alexa } + }, + + [TRAINER_RUBEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("RUBEN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Ruben } + }, + + [TRAINER_KOJI_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KOJI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Koji1 } + }, + + [TRAINER_WAYNE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("WAYNE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Wayne } + }, + + [TRAINER_AIDAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("AIDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Aidan } + }, + + [TRAINER_REED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("REED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Reed } + }, + + [TRAINER_TISHA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("TISHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tisha } + }, + + [TRAINER_TORI_AND_TIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TWINS, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_TWINS, + .trainerName = _("TORI & TIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_ToriAndTia } + }, + + [TRAINER_KIM_AND_IRIS] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("KIM & IRIS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_KimAndIris } + }, + + [TRAINER_TYRA_AND_IVY] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_SR_AND_JR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_SR_AND_JR, + .trainerName = _("TYRA & IVY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_TyraAndIvy } + }, + + [TRAINER_MEL_AND_PAUL] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_YOUNG_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_YOUNG_COUPLE, + .trainerName = _("MEL & PAUL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_MelAndPaul } + }, + + [TRAINER_JOHN_AND_JAY_1] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_OLD_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_OLD_COUPLE, + .trainerName = _("JOHN & JAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay1 } + }, + + [TRAINER_JOHN_AND_JAY_2] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_OLD_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_OLD_COUPLE, + .trainerName = _("JOHN & JAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay2 } + }, + + [TRAINER_JOHN_AND_JAY_3] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_OLD_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_OLD_COUPLE, + .trainerName = _("JOHN & JAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay3 } + }, + + [TRAINER_JOHN_AND_JAY_4] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_OLD_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_OLD_COUPLE, + .trainerName = _("JOHN & JAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0xb, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay4 } + }, + + [TRAINER_JOHN_AND_JAY_5] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_OLD_COUPLE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_OLD_COUPLE, + .trainerName = _("JOHN & JAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemCustomMoves = gTrainerParty_JohnAndJay5 } + }, + + [TRAINER_RELI_AND_IAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("RELI & IAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_ReliAndIan } + }, + + [TRAINER_LILA_AND_ROY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("LILA & ROY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy1 } + }, + + [TRAINER_LILA_AND_ROY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("LILA & ROY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy2 } + }, + + [TRAINER_LILA_AND_ROY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("LILA & ROY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy3 } + }, + + [TRAINER_LILA_AND_ROY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("LILA & ROY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy4 } + }, + + [TRAINER_LILA_AND_ROY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("LILA & ROY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LilaAndRoy5 } + }, + + [TRAINER_LISA_AND_RAY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SIS_AND_BRO, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SIS_AND_BRO, + .trainerName = _("LISA & RAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_LisaAndRay } + }, + + [TRAINER_CHRIS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("CHRIS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Chris } + }, + + [TRAINER_DAWSON] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_RICH_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_RICH_BOY, + .trainerName = _("DAWSON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Dawson } + }, + + [TRAINER_SARAH] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LADY, + .trainerName = _("SARAH"), + .items = {ITEM_FULL_RESTORE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Sarah } + }, + + [TRAINER_DARIAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("DARIAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Darian } + }, + + [TRAINER_HAILEY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_F, + .trainerName = _("HAILEY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Hailey } + }, + + [TRAINER_CHANDLER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TUBER_2, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_TUBER_M, + .trainerName = _("CHANDLER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Chandler } + }, + + [TRAINER_KALEB] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM, + .trainerClass = TRAINER_CLASS_POKEFAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_TWINS, + .trainerPic = TRAINER_PIC_WINSTRATE_M, + .trainerName = _("KALEB"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.ItemDefaultMoves = gTrainerParty_Kaleb } + }, + + [TRAINER_JOSEPH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("JOSEPH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Joseph } + }, + + [TRAINER_ALYSSA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_CYCLING_TRIATHLETE_F, + .trainerName = _("ALYSSA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Alyssa } + }, + + [TRAINER_MARCOS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("MARCOS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Marcos } + }, + + [TRAINER_RHETT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("RHETT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Rhett } + }, + + [TRAINER_TYRON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("TYRON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tyron } + }, + + [TRAINER_CELINA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("CELINA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Celina } + }, + + [TRAINER_BIANCA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("BIANCA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Bianca } + }, + + [TRAINER_HAYDEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("HAYDEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Hayden } + }, + + [TRAINER_SOPHIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("SOPHIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Sophie } + }, + + [TRAINER_COBY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("COBY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Coby } + }, + + [TRAINER_LAWRENCE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("LAWRENCE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Lawrence } + }, + + [TRAINER_WYATT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_POKEMANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_POKEMANIAC, + .trainerName = _("WYATT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Wyatt } + }, + + [TRAINER_ANGELINA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("ANGELINA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Angelina } + }, + + [TRAINER_KAI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FISHERMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_FISHERMAN, + .trainerName = _("KAI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Kai } + }, + + [TRAINER_CHARLOTTE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("CHARLOTTE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Charlotte } + }, + + [TRAINER_DEANDRE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("DEANDRE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Deandre } + }, + + [TRAINER_GRUNT_38] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt38 } + }, + + [TRAINER_GRUNT_39] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt39 } + }, + + [TRAINER_GRUNT_40] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt40 } + }, + + [TRAINER_GRUNT_41] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt41 } + }, + + [TRAINER_GRUNT_42] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt42 } + }, + + [TRAINER_GRUNT_43] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt43 } + }, + + [TRAINER_GRUNT_44] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt44 } + }, + + [TRAINER_GRUNT_45] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt45 } + }, + + [TRAINER_GRUNT_46] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt46 } + }, + + [TRAINER_GRUNT_47] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt47 } + }, + + [TRAINER_GRUNT_48] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt48 } + }, + + [TRAINER_GRUNT_49] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt49 } + }, + + [TRAINER_GRUNT_50] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_M, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt50 } + }, + + [TRAINER_GRUNT_51] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt51 } + }, + + [TRAINER_GRUNT_52] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt52 } + }, + + [TRAINER_GRUNT_53] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TEAM_MAGMA, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_GRUNT_F, + .trainerName = _("GRUNT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Grunt53 } + }, + + [TRAINER_TABITHA_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_MAGMA_ADMIN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_ADMIN, + .trainerName = _("TABITHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 4, + .party = {.NoItemDefaultMoves = gTrainerParty_Tabitha3 } + }, + + [TRAINER_DARCY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("DARCY"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Darcy } + }, + + [TRAINER_MAXIE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_MAGMA_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MAGMA, + .trainerPic = TRAINER_PIC_MAGMA_LEADER_MAXIE, + .trainerName = _("MAXIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Maxie3 } + }, + + [TRAINER_PETE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_M, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_M, + .trainerName = _("PETE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Pete } + }, + + [TRAINER_ISABELLE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SWIMMER_F, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMER_F, + .trainerName = _("ISABELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Isabelle } + }, + + [TRAINER_ANDRES_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("ANDRES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Andres1 } + }, + + [TRAINER_JOSUE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("JOSUE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Josue } + }, + + [TRAINER_CAMRON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("CAMRON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Camron } + }, + + [TRAINER_CORY_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("CORY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cory1 } + }, + + [TRAINER_CAROLINA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CAROLINA"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Carolina } + }, + + [TRAINER_ELIJAH] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("ELIJAH"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Elijah } + }, + + [TRAINER_CELIA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PICNICKER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_GIRL, + .trainerPic = TRAINER_PIC_PICNICKER, + .trainerName = _("CELIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Celia } + }, + + [TRAINER_BRYAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("BRYAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bryan } + }, + + [TRAINER_BRANDEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_CAMPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_CAMPER, + .trainerName = _("BRANDEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Branden } + }, + + [TRAINER_BRYANT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("BRYANT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Bryant } + }, + + [TRAINER_SHAYLA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_AROMA_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_AROMA_LADY, + .trainerName = _("SHAYLA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Shayla } + }, + + [TRAINER_KYRA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("KYRA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Kyra } + }, + + [TRAINER_JAIDEN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_NINJA_BOY, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_NINJA_BOY, + .trainerName = _("JAIDEN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Jaiden } + }, + + [TRAINER_ALIX] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("ALIX"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Alix } + }, + + [TRAINER_HELENE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("HELENE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Helene } + }, + + [TRAINER_MARLENE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("MARLENE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Marlene } + }, + + [TRAINER_DEVAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("DEVAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Devan } + }, + + [TRAINER_JOHNSON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_YOUNGSTER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_YOUNGSTER, + .trainerName = _("JOHNSON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Johnson } + }, + + [TRAINER_MELINA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_RUNNING_TRIATHLETE_F, + .trainerName = _("MELINA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Melina } + }, + + [TRAINER_BRANDI] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("BRANDI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brandi } + }, + + [TRAINER_AISHA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("AISHA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Aisha } + }, + + [TRAINER_MAKAYLA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_EXPERT, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_EXPERT_F, + .trainerName = _("MAKAYLA"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Makayla } + }, + + [TRAINER_FABIAN] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("FABIAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Fabian } + }, + + [TRAINER_DAYTON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_KINDLER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_KINDLER, + .trainerName = _("DAYTON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Dayton } + }, + + [TRAINER_RACHEL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PARASOL_LADY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_PARASOL_LADY, + .trainerName = _("RACHEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Rachel } + }, + + [TRAINER_LEONEL] = + { + .partyFlags = F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_M, + .trainerName = _("LEONEL"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemCustomMoves = gTrainerParty_Leonel } + }, + + [TRAINER_CALLIE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BATTLE_GIRL, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BATTLE_GIRL, + .trainerName = _("CALLIE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Callie } + }, + + [TRAINER_CALE] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("CALE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cale } + }, + + [TRAINER_MYLES] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_M, + .trainerName = _("MYLES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Myles } + }, + + [TRAINER_PAT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("PAT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Pat } + }, + + [TRAINER_CRISTIN_1] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CRISTIN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cristin1 } + }, + + [TRAINER_MAY_14] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_May14 } + }, + + [TRAINER_MAY_15] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_May15 } + }, + + [TRAINER_ROXANNE_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_ROXANNE, + .trainerName = _("ROXANNE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Roxanne2 } + }, + + [TRAINER_ROXANNE_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_ROXANNE, + .trainerName = _("ROXANNE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Roxanne3 } + }, + + [TRAINER_ROXANNE_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_ROXANNE, + .trainerName = _("ROXANNE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Roxanne4 } + }, + + [TRAINER_ROXANNE_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_ROXANNE, + .trainerName = _("ROXANNE"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Roxanne5 } + }, + + [TRAINER_BRAWLY_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_BRAWLY, + .trainerName = _("BRAWLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Brawly2 } + }, + + [TRAINER_BRAWLY_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_BRAWLY, + .trainerName = _("BRAWLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Brawly3 } + }, + + [TRAINER_BRAWLY_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_BRAWLY, + .trainerName = _("BRAWLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Brawly4 } + }, + + [TRAINER_BRAWLY_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_BRAWLY, + .trainerName = _("BRAWLY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Brawly5 } + }, + + [TRAINER_WATTSON_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_WATTSON, + .trainerName = _("WATTSON"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Wattson2 } + }, + + [TRAINER_WATTSON_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_WATTSON, + .trainerName = _("WATTSON"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Wattson3 } + }, + + [TRAINER_WATTSON_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_WATTSON, + .trainerName = _("WATTSON"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Wattson4 } + }, + + [TRAINER_WATTSON_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_WATTSON, + .trainerName = _("WATTSON"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Wattson5 } + }, + + [TRAINER_FLANNERY_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_FLANNERY, + .trainerName = _("FLANNERY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Flannery2 } + }, + + [TRAINER_FLANNERY_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_FLANNERY, + .trainerName = _("FLANNERY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Flannery3 } + }, + + [TRAINER_FLANNERY_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_FLANNERY, + .trainerName = _("FLANNERY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Flannery4 } + }, + + [TRAINER_FLANNERY_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_FLANNERY, + .trainerName = _("FLANNERY"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Flannery5 } + }, + + [TRAINER_NORMAN_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_NORMAN, + .trainerName = _("NORMAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 4, + .party = {.ItemCustomMoves = gTrainerParty_Norman2 } + }, + + [TRAINER_NORMAN_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_NORMAN, + .trainerName = _("NORMAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Norman3 } + }, + + [TRAINER_NORMAN_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_NORMAN, + .trainerName = _("NORMAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Norman4 } + }, + + [TRAINER_NORMAN_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_NORMAN, + .trainerName = _("NORMAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Norman5 } + }, + + [TRAINER_WINONA_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_WINONA, + .trainerName = _("WINONA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x17, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Winona2 } + }, + + [TRAINER_WINONA_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_WINONA, + .trainerName = _("WINONA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x17, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Winona3 } + }, + + [TRAINER_WINONA_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_WINONA, + .trainerName = _("WINONA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x17, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Winona4 } + }, + + [TRAINER_WINONA_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_WINONA, + .trainerName = _("WINONA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x17, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Winona5 } + }, + + [TRAINER_TATE_AND_LIZA_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, + .trainerName = _("TATE&LIZA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza2 } + }, + + [TRAINER_TATE_AND_LIZA_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, + .trainerName = _("TATE&LIZA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza3 } + }, + + [TRAINER_TATE_AND_LIZA_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, + .trainerName = _("TATE&LIZA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza4 } + }, + + [TRAINER_TATE_AND_LIZA_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_LEADER_TATE_AND_LIZA, + .trainerName = _("TATE&LIZA"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_TateAndLiza5 } + }, + + [TRAINER_JUAN_2] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_JUAN, + .trainerName = _("JUAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Juan2 } + }, + + [TRAINER_JUAN_3] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_JUAN, + .trainerName = _("JUAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 5, + .party = {.ItemCustomMoves = gTrainerParty_Juan3 } + }, + + [TRAINER_JUAN_4] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_JUAN, + .trainerName = _("JUAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Juan4 } + }, + + [TRAINER_JUAN_5] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_LEADER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEADER_JUAN, + .trainerName = _("JUAN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_NONE}, + .doubleBattle = TRUE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Juan5 } + }, + + [TRAINER_ANGELO] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_BUG_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, + .trainerPic = TRAINER_PIC_BUG_MANIAC, + .trainerName = _("ANGELO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.ItemCustomMoves = gTrainerParty_Angelo } + }, + + [TRAINER_DARIUS] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BIRD_KEEPER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_BIRD_KEEPER, + .trainerName = _("DARIUS"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Darius } + }, + + [TRAINER_STEVEN] = + { + .partyFlags = F_TRAINER_PARTY_HELD_ITEM | F_TRAINER_PARTY_CUSTOM_MOVESET, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_STEVEN, + .trainerName = _("STEVEN"), + .items = {ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 6, + .party = {.ItemCustomMoves = gTrainerParty_Steven } + }, + + [TRAINER_ANABEL] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SALON_MAIDEN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SALON_MAIDEN_ANABEL, + .trainerName = _("ANABEL"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Anabel } + }, + + [TRAINER_TUCKER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_DOME_ACE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_DOME_ACE_TUCKER, + .trainerName = _("TUCKER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Tucker } + }, + + [TRAINER_SPENSER] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PALACE_MAVEN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_PALACE_MAVEN_SPENSER, + .trainerName = _("SPENSER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Spenser } + }, + + [TRAINER_GRETA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_ARENA_TYCOON, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_ARENA_TYCOON_GRETA, + .trainerName = _("GRETA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Greta } + }, + + [TRAINER_NOLAND] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_FACTORY_HEAD, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_FACTORY_HEAD_NOLAND, + .trainerName = _("NOLAND"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Noland } + }, + + [TRAINER_LUCY] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PIKE_QUEEN, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_PIKE_QUEEN_LUCY, + .trainerName = _("LUCY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Lucy } + }, + + [TRAINER_BRANDON] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PYRAMID_KING, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_PYRAMID_KING_BRANDON, + .trainerName = _("BRANDON"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brandon } + }, + + [TRAINER_ANDRES_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("ANDRES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Andres2 } + }, + + [TRAINER_ANDRES_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("ANDRES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Andres3 } + }, + + [TRAINER_ANDRES_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("ANDRES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Andres4 } + }, + + [TRAINER_ANDRES_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_RUIN_MANIAC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_RUIN_MANIAC, + .trainerName = _("ANDRES"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Andres5 } + }, + + [TRAINER_CORY_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("CORY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cory2 } + }, + + [TRAINER_CORY_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("CORY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cory3 } + }, + + [TRAINER_CORY_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("CORY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cory4 } + }, + + [TRAINER_CORY_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_SAILOR, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_SAILOR, + .trainerName = _("CORY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cory5 } + }, + + [TRAINER_PABLO_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("PABLO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Pablo2 } + }, + + [TRAINER_PABLO_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("PABLO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Pablo3 } + }, + + [TRAINER_PABLO_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("PABLO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Pablo4 } + }, + + [TRAINER_PABLO_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_TRIATHLETE, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_SWIMMER, + .trainerPic = TRAINER_PIC_SWIMMING_TRIATHLETE_M, + .trainerName = _("PABLO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Pablo5 } + }, + + [TRAINER_KOJI_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KOJI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Koji2 } + }, + + [TRAINER_KOJI_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KOJI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Koji3 } + }, + + [TRAINER_KOJI_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KOJI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Koji4 } + }, + + [TRAINER_KOJI_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BLACK_BELT, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_BLACK_BELT, + .trainerName = _("KOJI"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Koji5 } + }, + + [TRAINER_CRISTIN_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CRISTIN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Cristin2 } + }, + + [TRAINER_CRISTIN_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CRISTIN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cristin3 } + }, + + [TRAINER_CRISTIN_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CRISTIN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cristin4 } + }, + + [TRAINER_CRISTIN_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_COOLTRAINER_1, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_COOL, + .trainerPic = TRAINER_PIC_COOL_TRAINER_F, + .trainerName = _("CRISTIN"), + .items = {ITEM_HYPER_POTION, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Cristin5 } + }, + + [TRAINER_FERNANDO_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("FERNANDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Fernando2 } + }, + + [TRAINER_FERNANDO_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("FERNANDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Fernando3 } + }, + + [TRAINER_FERNANDO_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("FERNANDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Fernando4 } + }, + + [TRAINER_FERNANDO_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GUITARIST, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_GUITARIST, + .trainerName = _("FERNANDO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Fernando5 } + }, + + [TRAINER_SAWYER_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("SAWYER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer2 } + }, + + [TRAINER_SAWYER_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("SAWYER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer3 } + }, + + [TRAINER_SAWYER_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("SAWYER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer4 } + }, + + [TRAINER_SAWYER_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_HIKER, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_HIKER, + .trainerPic = TRAINER_PIC_HIKER, + .trainerName = _("SAWYER"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x7, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Sawyer5 } + }, + + [TRAINER_GABRIELLE_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("GABRIELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle2 } + }, + + [TRAINER_GABRIELLE_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("GABRIELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle3 } + }, + + [TRAINER_GABRIELLE_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("GABRIELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle4 } + }, + + [TRAINER_GABRIELLE_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_BREEDER, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_POKEMON_BREEDER_F, + .trainerName = _("GABRIELLE"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 6, + .party = {.NoItemDefaultMoves = gTrainerParty_Gabrielle5 } + }, + + [TRAINER_THALIA_2] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("THALIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Thalia2 } + }, + + [TRAINER_THALIA_3] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("THALIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Thalia3 } + }, + + [TRAINER_THALIA_4] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("THALIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Thalia4 } + }, + + [TRAINER_THALIA_5] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_BEAUTY, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_FEMALE, + .trainerPic = TRAINER_PIC_BEAUTY, + .trainerName = _("THALIA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x1, + .partySize = 3, + .party = {.NoItemDefaultMoves = gTrainerParty_Thalia5 } + }, + + [TRAINER_MARIELA] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_F, + .trainerName = _("MARIELA"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Mariela } + }, + + [TRAINER_ALVARO] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PSYCHIC, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_INTENSE, + .trainerPic = TRAINER_PIC_PSYCHIC_M, + .trainerName = _("ALVARO"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 2, + .party = {.NoItemDefaultMoves = gTrainerParty_Alvaro } + }, + + [TRAINER_EVERETT] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_GENTLEMAN, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_RICH, + .trainerPic = TRAINER_PIC_GENTLEMAN, + .trainerName = _("EVERETT"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Everett } + }, + + [TRAINER_RED] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RED, + .trainerName = _("RED"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Red } + }, + + [TRAINER_LEAF] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_3, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_LEAF, + .trainerName = _("LEAF"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Leaf } + }, + + [TRAINER_BRENDAN_16] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_4, + .encounterMusic_gender = TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUBY_SAPPHIRE_BRENDAN, + .trainerName = _("BRENDAN"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_Brendan16 } + }, + + [TRAINER_MAY_16] = + { + .partyFlags = 0, + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_4, + .encounterMusic_gender = F_TRAINER_FEMALE | TRAINER_ENCOUNTER_MUSIC_MALE, + .trainerPic = TRAINER_PIC_RUBY_SAPPHIRE_MAY, + .trainerName = _("MAY"), + .items = {ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE}, + .doubleBattle = FALSE, + .aiFlags = 0x0, + .partySize = 1, + .party = {.NoItemDefaultMoves = gTrainerParty_May16 } + }, +}; diff --git a/src/daycare.c b/src/daycare.c index d567ff79a..c73d91521 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1,5 +1,6 @@ #include "global.h" #include "pokemon.h" +#include "battle.h" #include "daycare.h" #include "string_util.h" #include "constants/species.h" @@ -22,8 +23,6 @@ #define EGG_MOVES_ARRAY_COUNT 10 #define EGG_LVL_UP_MOVES_ARRAY_COUNT 50 -extern u16 gMoveToLearn; - // text extern const u8 gText_MaleSymbol4[]; extern const u8 gText_FemaleSymbol4[]; @@ -48,7 +47,7 @@ extern void sub_81B9328(void); extern void CB2_ReturnToField(void); // this file's functions -static void ClearDaycareMonMisc(struct DaycareMiscMon *misc); +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); @@ -74,20 +73,20 @@ static const struct ListMenuItem sLevelMenuItems[] = static const struct ListMenuTemplate sDaycareListMenuLevelTemplate = { .items = sLevelMenuItems, - .moveCursorFunc = sub_81AF078, - .unk_08 = DaycarePrintMonInfo, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = DaycarePrintMonInfo, .totalItems = 3, .maxShowed = 3, .windowId = 0, - .unk_11 = 0, - .unk_12 = 8, + .header_X = 0, + .item_X = 8, .cursor_X = 0, .upText_Y = 1, .cursorPal = 2, .fillValue = 1, .cursorShadowPal = 3, .lettersSpacing = 1, - .unk_16_3 = 0, + .itemVerticalPadding = 0, .scrollMultiple = LIST_NO_MULTIPLE_SCROLL, .fontId = 1, .cursorKind = 0 @@ -180,13 +179,13 @@ static void StorePokemonInDaycare(struct Pokemon *mon, struct DaycareMon *daycar { u8 mailId; - StringCopy(daycareMon->misc.OT_name, gSaveBlock2Ptr->playerName); - GetMonNick(mon, daycareMon->misc.monName); - StripExtCtrlCodes(daycareMon->misc.monName); - daycareMon->misc.gameLanguage = LANGUAGE_ENGLISH; - daycareMon->misc.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE); + StringCopy(daycareMon->mail.OT_name, gSaveBlock2Ptr->playerName); + GetMonNick(mon, daycareMon->mail.monName); + StripExtCtrlCodes(daycareMon->mail.monName); + daycareMon->mail.gameLanguage = LANGUAGE_ENGLISH; + daycareMon->mail.monLanguage = GetMonData(mon, MON_DATA_LANGUAGE); mailId = GetMonData(mon, MON_DATA_MAIL); - daycareMon->misc.mail = gSaveBlock1Ptr->mail[mailId]; + daycareMon->mail.message = gSaveBlock1Ptr->mail[mailId]; TakeMailFromMon(mon); } @@ -220,10 +219,10 @@ static void ShiftDaycareSlots(struct DayCare *daycare) daycare->mons[0].mon = daycare->mons[1].mon; ZeroBoxMonData(&daycare->mons[1].mon); - daycare->mons[0].misc = daycare->mons[1].misc; + daycare->mons[0].mail = daycare->mons[1].mail; daycare->mons[0].steps = daycare->mons[1].steps; daycare->mons[1].steps = 0; - ClearDaycareMonMisc(&daycare->mons[1].misc); + ClearDaycareMonMail(&daycare->mons[1].mail); } } @@ -278,10 +277,10 @@ static u16 TakeSelectedPokemonFromDaycare(struct DaycareMon *daycareMon) } gPlayerParty[PARTY_SIZE - 1] = pokemon; - if (daycareMon->misc.mail.itemId) + if (daycareMon->mail.message.itemId) { - GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycareMon->misc.mail); - ClearDaycareMonMisc(&daycareMon->misc); + GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycareMon->mail.message); + ClearDaycareMonMail(&daycareMon->mail); } ZeroBoxMonData(&daycareMon->mon); @@ -365,23 +364,23 @@ u8 GetNumLevelsGainedFromDaycare(void) return 0; } -static void ClearDaycareMonMisc(struct DaycareMiscMon *misc) +static void ClearDaycareMonMail(struct DayCareMail *mail) { s32 i; for (i = 0; i < OT_NAME_LENGTH + 1; i++) - misc->OT_name[i] = 0; + mail->OT_name[i] = 0; for (i = 0; i < POKEMON_NAME_LENGTH + 1; i++) - misc->monName[i] = 0; + mail->monName[i] = 0; - ClearMailStruct(&misc->mail); + ClearMailStruct(&mail->message); } static void ClearDaycareMon(struct DaycareMon *daycareMon) { ZeroBoxMonData(&daycareMon->mon); daycareMon->steps = 0; - ClearDaycareMonMisc(&daycareMon->misc); + ClearDaycareMonMail(&daycareMon->mail); } static void ClearAllDaycareData(struct DayCare *daycare) diff --git a/src/decompress.c b/src/decompress.c index fb288bf4a..83a9db0b6 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -117,7 +117,7 @@ void Unused_LZDecompressWramIndirect(const void **src, void *dest) } // This one (unused) function is really challenging, won't even try to decompile it. -ASM_DIRECT +NAKED void sub_803471C() { asm(".syntax unified\n\ @@ -459,7 +459,7 @@ _08034964:\n\ .syntax divided"); } -u32 sub_8034974(const u8 *ptr) +u32 GetDecompressedDataSize(const u8 *ptr) { return (ptr[3] << 16) | (ptr[2] << 8) | (ptr[1]); } diff --git a/src/decoration.c b/src/decoration.c index ffa1c3a68..b21d51278 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -17,11 +17,10 @@ #include "field_player_avatar.h" #include "field_camera.h" #include "field_screen.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "list_menu.h" #include "menu_helpers.h" #include "menu.h" -#include "menu_indicators.h" #include "sound.h" #include "event_scripts.h" #include "event_data.h" @@ -33,13 +32,11 @@ #include "tilesets.h" #include "item_icon.h" #include "trader.h" -#include "constants/map_objects.h" +#include "constants/event_objects.h" #include "decoration_inventory.h" #include "decoration.h" #include "graphics.h" -extern void (*gFieldCallback)(void); - // Static type declarations #define OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG 0xbe5 @@ -562,7 +559,7 @@ void SecretBasePC_Cancel(u8 taskId) } else { - sub_816B060(taskId); + ReshowPlayerPC(taskId); } } @@ -841,7 +838,7 @@ void sub_8127500(void) { if (sDecorPCBuffer->unk_522 == 0xFF) { - sDecorPCBuffer->unk_522 = AddScrollIndicatorArrowPairParametrized(0x02, 0x3c, 0x0c, 0x94, sDecorPCBuffer->unk_520 - sDecorPCBuffer->unk_521, 0x6e, 0x6e, &sSecretBasePCSelectDecorPageNo); + sDecorPCBuffer->unk_522 = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0x3c, 0x0c, 0x94, sDecorPCBuffer->unk_520 - sDecorPCBuffer->unk_521, 0x6e, 0x6e, &sSecretBasePCSelectDecorPageNo); } } @@ -1205,15 +1202,15 @@ void sub_8127E18(void) if (FlagGet(0xAE + i) == TRUE) { FlagClear(0xAE + i); - for (j = 0; j < gMapHeader.events->mapObjectCount; j ++) + for (j = 0; j < gMapHeader.events->eventObjectCount; j ++) { - if (gMapHeader.events->mapObjects[j].flagId == 0xAE + i) + if (gMapHeader.events->eventObjects[j].flagId == 0xAE + i) { break; } } - VarSet(0x3F20 + gMapHeader.events->mapObjects[j].graphicsId, sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0]); - gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; + VarSet(0x3F20 + gMapHeader.events->eventObjects[j].graphicsId, sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0]); + gSpecialVar_0x8005 = gMapHeader.events->eventObjects[j].localId; gSpecialVar_0x8006 = sCurDecorMapX; gSpecialVar_0x8007 = sCurDecorMapY; show_sprite(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); @@ -1294,7 +1291,7 @@ void sub_8128060(u8 taskId) gTasks[taskId].data[2] = 2; break; case 2: - if (sub_80ABDFC() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[12] = 0; sub_8128FD8(taskId); @@ -1305,12 +1302,12 @@ void sub_8128060(u8 taskId) void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor) { - sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0]; - gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor); - gSprites[gUnknown_03005DD0.unk4].oam.priority = 1; - gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0; - gSprites[gUnknown_03005DD0.unk4].pos1.x = gUnknown_085A7250[data->decoration->shape].x; - gSprites[gUnknown_03005DD0.unk4].pos1.y = gUnknown_085A7250[data->decoration->shape].y; + sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0]; + gUnknown_03005DD0.spriteId = gpu_pal_decompress_alloc_tag_and_upload(data, decor); + gSprites[gUnknown_03005DD0.spriteId].oam.priority = 1; + gSprites[gUnknown_03005DD0.spriteId].callback = sub_81292D0; + gSprites[gUnknown_03005DD0.spriteId].pos1.x = gUnknown_085A7250[data->decoration->shape].x; + gSprites[gUnknown_03005DD0.spriteId].pos1.y = gUnknown_085A7250[data->decoration->shape].y; } void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphicsDataBuffer *data) @@ -1324,15 +1321,15 @@ void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphic } if (gSaveBlock2Ptr->playerGender == MALE) { - sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0); } else { - sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0); } gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1; DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]); - sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4; + sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId; } void sub_812826C(u8 taskId) @@ -1469,7 +1466,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration) { return FALSE; } - behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + behaviorAt = GetEventObjectIdByXYZ(curX, curY, 0); if (behaviorAt != 0 && behaviorAt != 16) { return FALSE; @@ -1494,7 +1491,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration) { return FALSE; } - if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + if (GetEventObjectIdByXYZ(curX, curY, 0) != 16) { return FALSE; } @@ -1514,7 +1511,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration) { return FALSE; } - behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + behaviorAt = GetEventObjectIdByXYZ(curX, curY, 0); if (behaviorAt != 0 && behaviorAt != 16) { return FALSE; @@ -1559,7 +1556,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration) return FALSE; } } - if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + if (GetEventObjectIdByXYZ(curX, curY, 0) != 16) { return FALSE; } @@ -1710,7 +1707,7 @@ void sub_8128C64(u8 taskId) data[2] ++; break; case 3: - if (sub_80ABDFC() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = sub_812764C; } @@ -1739,7 +1736,7 @@ bool8 sub_8128D10(u8 taskId) data[1] ++; return FALSE; } - if (sDecorationLastDirectionMoved == DIR_NORTH && data[1] - 7 >= gMapHeader.mapData->height) + if (sDecorationLastDirectionMoved == DIR_NORTH && data[1] - 7 >= gMapHeader.mapLayout->height) { data[1] --; return FALSE; @@ -1749,7 +1746,7 @@ bool8 sub_8128D10(u8 taskId) data[0] ++; return FALSE; } - if (sDecorationLastDirectionMoved == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) + if (sDecorationLastDirectionMoved == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapLayout->width) { data[0] --; return FALSE; @@ -1993,7 +1990,7 @@ u8 gpu_pal_decompress_alloc_tag_and_upload(struct PlaceDecorationGraphicsDataBuf data->decoration = &gDecorations[decor]; if (data->decoration->permission == DECORPERM_SOLID_MAT) { - return AddPseudoFieldObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + return AddPseudoEventObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); } FreeSpritePaletteByTag(OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG); sub_81291E8(data); @@ -2043,7 +2040,7 @@ const u8 *GetDecorationIconPicOrPalette(u16 decor, u8 mode) return gUnknown_085A6BE8[decor][mode]; } -u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor) +u8 AddDecorationIconObjectFromEventObject(u16 tilesTag, u16 paletteTag, u8 decor) { u8 spriteId; struct SpriteSheet sheet; @@ -2074,7 +2071,7 @@ u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor } else { - spriteId = AddPseudoFieldObject(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + spriteId = AddPseudoEventObject(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); } return spriteId; } @@ -2095,7 +2092,7 @@ u8 AddDecorationIconObject(u8 decor, s16 x, s16 y, u8 priority, u16 tilesTag, u1 } else if (gUnknown_085A6BE8[decor][0] == NULL) { - spriteId = AddDecorationIconObjectFromFieldObject(tilesTag, paletteTag, decor); + spriteId = AddDecorationIconObjectFromEventObject(tilesTag, paletteTag, decor); if (spriteId == MAX_SPRITES) { return MAX_SPRITES; @@ -2144,11 +2141,11 @@ void sub_8129708(void) { gSpecialVar_0x8005 = sDecorRearrangementDataBuffer[gSpecialVar_0x8004].flagId; sub_81296EC(sDecorRearrangementDataBuffer[gSpecialVar_0x8004].idx); - for (i = 0; i < gMapHeader.events->mapObjectCount; i ++) + for (i = 0; i < gMapHeader.events->eventObjectCount; i ++) { - if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) + if (gMapHeader.events->eventObjects[i].flagId == gSpecialVar_0x8005) { - gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId; + gSpecialVar_0x8006 = gMapHeader.events->eventObjects[i].localId; break; } } @@ -2159,11 +2156,11 @@ void sub_81297AC(void) { u8 i; - for (i = 0; i < gMapHeader.events->mapObjectCount; i ++) + for (i = 0; i < gMapHeader.events->eventObjectCount; i ++) { - if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004) + if (gMapHeader.events->eventObjects[i].flagId == gSpecialVar_0x8004) { - gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId; + gSpecialVar_0x8005 = gMapHeader.events->eventObjects[i].localId; break; } } @@ -2189,7 +2186,7 @@ void sub_81297F8(void) { for (x = 0; x < sDecorRearrangementDataBuffer[i].width; x ++) { - MapGridSetMetatileEntryAt(posX + 7 + x, posY + 7 - y, gMapHeader.mapData->map[posX + x + gMapHeader.mapData->width * (posY - y)] | 0x3000); + MapGridSetMetatileEntryAt(posX + 7 + x, posY + 7 - y, gMapHeader.mapLayout->map[posX + x + gMapHeader.mapLayout->width * (posY - y)] | 0x3000); } } sub_81296EC(sDecorRearrangementDataBuffer[i].idx); @@ -2220,7 +2217,7 @@ void sub_81298EC(u8 taskId) gTasks[taskId].data[2] = 3; break; case 3: - if (sub_80ABDFC() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { StringExpandPlaceholders(gStringVar4, gText_DecorationReturnedToPC); DisplayItemMessageOnField(taskId, gStringVar4, sub_8129D64); @@ -2250,21 +2247,21 @@ bool8 sub_81299AC(u8 taskId) void SetUpPuttingAwayDecorationPlayerAvatar(void) { - player_get_direction_lower_nybble(); - sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0]; + GetPlayerFacingDirection(); + sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.spriteId].data[0]; sub_812A39C(); - gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0); + gUnknown_03005DD0.spriteId = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0); if (gSaveBlock2Ptr->playerGender == MALE) { - sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0); } else { - sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoEventObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0); } gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1; DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]); - sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4; + sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.spriteId; gSprites[sDecor_CameraSpriteObjectIdx1].oam.priority = 1; } @@ -2290,7 +2287,7 @@ void sub_8129ABC(u8 taskId) data[2] = 2; break; case 2: - if (sub_80ABDFC() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { data[12] = 1; sub_8129B34(taskId); @@ -2454,9 +2451,9 @@ void sub_8129F20(void) yOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].idx] & 0x0F; for (i = 0; i < 0x40; i ++) { - if (gSaveBlock1Ptr->mapObjectTemplates[i].x == xOff && gSaveBlock1Ptr->mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1Ptr->mapObjectTemplates[i].flagId)) + if (gSaveBlock1Ptr->eventObjectTemplates[i].x == xOff && gSaveBlock1Ptr->eventObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1Ptr->eventObjectTemplates[i].flagId)) { - sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].flagId = gSaveBlock1Ptr->mapObjectTemplates[i].flagId; + sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].flagId = gSaveBlock1Ptr->eventObjectTemplates[i].flagId; break; } } @@ -2616,7 +2613,7 @@ void sub_812A2C4(u8 taskId) data[2] ++; break; case 3: - if (sub_80ABDFC() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = sub_8126B80; } diff --git a/src/dewford_trend.c b/src/dewford_trend.c new file mode 100644 index 000000000..44b42c123 --- /dev/null +++ b/src/dewford_trend.c @@ -0,0 +1,340 @@ +#include "global.h" +#include "dewford_trend.h" +#include "easy_chat.h" +#include "constants/easy_chat.h" +#include "event_data.h" +#include "link.h" +#include "malloc.h" +#include "random.h" +#include "text.h" +#include "tv.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 +void InitDewfordTrend(void) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + gSaveBlock1Ptr->easyChatPairs[i].words[0] = sub_811EE38(EC_GROUP_CONDITIONS); + + if (Random() & 1) + gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_LIFESTYLE); + else + gSaveBlock1Ptr->easyChatPairs[i].words[1] = sub_811EE38(EC_GROUP_HOBBIES); + + gSaveBlock1Ptr->easyChatPairs[i].unk1_6 = Random() & 1; + sub_8122B28(&(gSaveBlock1Ptr->easyChatPairs[i])); + } + sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0); +} + +void UpdateDewfordTrendPerDay(u16 a) +{ + u16 i; + + if (a != 0) + { + u32 sp0 = a * 5; + + for (i = 0; i < 5; i++) + { + u32 r4; + u32 r2 = sp0; + struct EasyChatPair *r5 = &(gSaveBlock1Ptr->easyChatPairs[i]); + + if (r5->unk1_6 == 0) + { + if (r5->unk0_0 >= (u16)r2) + { + r5->unk0_0 -= r2; + if (r5->unk0_0 == 0) + r5->unk1_6 = 1; + continue; + } + r2 -= r5->unk0_0; + r5->unk0_0 = 0; + r5->unk1_6 = 1; + } + r4 = r5->unk0_0 + r2; + if ((u16)r4 > r5->unk0_7) + { + u32 sp4 = r4 % r5->unk0_7; + r4 = r4 / r5->unk0_7; + + r5->unk1_6 = r4 ^ 1; + if (r5->unk1_6) + r5->unk0_0 = sp4; + else + r5->unk0_0 = r5->unk0_7 - sp4; + } + else + { + r5->unk0_0 = r4; + + if (r5->unk0_0 == r5->unk0_7) + r5->unk1_6 = 0; + } + } + sub_8122804(gSaveBlock1Ptr->easyChatPairs, 5, 0); + } +} + + +bool8 sub_81226D8(u16 *a) +{ + struct EasyChatPair s = {0}; + u16 i; + + if (!SB1ContainsWords(a)) + { + if (!FlagGet(FLAG_SYS_POPWORD_INPUT)) + { + FlagSet(FLAG_SYS_POPWORD_INPUT); + if (!FlagGet(FLAG_SYS_MIX_RECORD)) + { + gSaveBlock1Ptr->easyChatPairs[0].words[0] = a[0]; + gSaveBlock1Ptr->easyChatPairs[0].words[1] = a[1]; + return TRUE; + } + } + + s.words[0] = a[0]; + s.words[1] = a[1]; + s.unk1_6 = 1; + sub_8122B28(&s); + + for (i = 0; i < 5; i++) + { + if (sub_8122A58(&s, &(gSaveBlock1Ptr->easyChatPairs[i]), 0)) + { + u16 r3 = 4; + + while (r3 > i) + { + gSaveBlock1Ptr->easyChatPairs[r3] = gSaveBlock1Ptr->easyChatPairs[r3 - 1]; + r3--; + } + gSaveBlock1Ptr->easyChatPairs[i] = s; + if(i == 4) + sub_80EDC60(a); + return (i == 0); + } + } + gSaveBlock1Ptr->easyChatPairs[4] = s; + sub_80EDC60(a); + } + return FALSE; +} + + +static void sub_8122804(struct EasyChatPair *s, u16 b, u8 c) +{ + u16 h; + + for (h = 0; h < b; h++) + { + u16 i; + + for (i = h + 1; i < b; i++) + { + if (sub_8122A58(&s[i], &s[h], c)) + { + struct EasyChatPair temp; + + temp = s[i]; + s[i] = s[h]; + s[h] = temp; + } + } + } +} + +void ReceiveEasyChatPairsData(void *a, u32 b, u8 unused) +{ + u16 i, j, r3, players; + struct EasyChatPair *buffer1, *buffer2, *src, *dst, *foo_of_buffer2; + + buffer1 = Alloc(0x100); + if(buffer1 != NULL) + { + buffer2 = Alloc(0x100); + if(buffer2 == NULL) + { + Free(buffer1); + } + else + { + players = GetLinkPlayerCount(); + for (i = 0; i < players; i++) + memcpy(&(buffer1[i * 5]), (u8 *)a + i * b, 40); + src = buffer1; + dst = buffer2; + r3 = 0; + for (i = 0; i < players; i++) + { + for (j = 0; j < 5; j++) + { + 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++; + } + } + sub_8122804(buffer2, r3, 2); + src = buffer2; + dst = gSaveBlock1Ptr->easyChatPairs; + for (i = 0; i < 5; i++) + *(dst++) = *(src++); + Free(buffer1); + Free(buffer2); + } + } +} + +void BufferTrendyPhraseString(void) +{ + struct EasyChatPair *s = &gSaveBlock1Ptr->easyChatPairs[gSpecialVar_0x8004]; + + ConvertEasyChatWordsToString(gStringVar1, s->words, 2, 1); +} + +void TrendyPhraseIsOld(void) +{ + u16 result = 0; + + if (gSaveBlock1Ptr->easyChatPairs[0].unk0_0 - gSaveBlock1Ptr->easyChatPairs[1].unk0_0 < 2) + { + asm("":::"r2"); //Force the compiler to store address of gSaveBlock1 in r3 instead of r2 + if (!gSaveBlock1Ptr->easyChatPairs[0].unk1_6 && gSaveBlock1Ptr->easyChatPairs[1].unk1_6) + result = 1; + } + gSpecialVar_Result = result; +} + +void GetDewfordHallPaintingNameIndex(void) +{ + gSpecialVar_Result = (gSaveBlock1Ptr->easyChatPairs[0].words[0] + gSaveBlock1Ptr->easyChatPairs[0].words[1]) & 7; +} + +static bool8 sub_8122A58(struct EasyChatPair *a, struct EasyChatPair *b, u8 c) +{ + switch (c) + { + 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; + 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; + 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; + } + return Random() & 1; +} + +static void sub_8122B28(struct EasyChatPair *s) +{ + u16 r4; + + r4 = Random() % 98; + if (r4 > 50) + { + r4 = Random() % 98; + if (r4 > 80) + r4 = Random() % 98; + } + s->unk0_7 = r4 + 30; + s->unk0_0 = (Random() % (r4 + 1)) + 30; + s->unk2 = Random(); +} + +static bool8 SB1ContainsWords(u16 *a) +{ + u16 i; + + for (i = 0; i < 5; i++) + { + if (IsEasyChatPairEqual(a, gSaveBlock1Ptr->easyChatPairs[i].words) != 0) + return TRUE; + } + return FALSE; +} + +static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + if (*(words1++) != *(words2++)) + return FALSE; + } + return TRUE; +} + +static s16 GetEqualEasyChatPairIndex(struct EasyChatPair*s, struct EasyChatPair *a, u16 b) +{ + s16 i; + + for (i = 0; i < b; i++) + { + if (IsEasyChatPairEqual(a->words, s->words)) + return i; + s++; + } + return -1; +} diff --git a/src/diploma.c b/src/diploma.c index 289e0e043..599ceec72 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -89,7 +89,7 @@ void CB2_ShowDiploma(void) CopyBgTilemapBufferToVram(1); DisplayDiplomaText(); BlendPalettes(-1, 16, 0); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); EnableInterrupts(1); SetVBlankCallback(VBlankCB); SetMainCallback2(MainCB2); @@ -114,7 +114,7 @@ static void Task_DiplomaWaitForKeyPress(u8 taskId) { if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); gTasks[taskId].func = Task_DiplomaFadeOut; } } diff --git a/src/unk_text_util.c b/src/dynamic_placeholder_text_util.c index 2773522b2..bdfcf6653 100644 --- a/src/unk_text_util.c +++ b/src/dynamic_placeholder_text_util.c @@ -1,11 +1,11 @@ #include "global.h" #include "text.h" -#include "unk_text_util.h" +#include "dynamic_placeholder_text_util.h" #include "string_util.h" static EWRAM_DATA const u8 *sStringPointers[8] = {}; -void UnkTextUtil_Reset(void) +void DynamicPlaceholderTextUtil_Reset(void) { const u8 **ptr; u8 *fillval; @@ -20,7 +20,7 @@ void UnkTextUtil_Reset(void) } while ((int)ptr2 >= (int)ptr); } -void UnkTextUtil_SetPtrI(u8 idx, const u8 *ptr) +void DynamicPlaceholderTextUtil_SetPlaceholderPtr(u8 idx, const u8 *ptr) { if (idx < ARRAY_COUNT(sStringPointers)) { @@ -28,7 +28,7 @@ void UnkTextUtil_SetPtrI(u8 idx, const u8 *ptr) } } -u8 *UnkTextUtil_StringExpandPlaceholders(u8 *dest, const u8 *src) +u8 *DynamicPlaceholderTextUtil_ExpandPlaceholders(u8 *dest, const u8 *src) { while (*src != EOS) { @@ -50,7 +50,7 @@ u8 *UnkTextUtil_StringExpandPlaceholders(u8 *dest, const u8 *src) return dest; } -const u8 *UnkTextUtil_GetPtrI(u8 idx) +const u8 *DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 idx) { return sStringPointers[idx]; } diff --git a/src/egg_hatch.c b/src/egg_hatch.c index e64a98ab1..67876f33b 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -25,6 +25,7 @@ #include "window.h" #include "constants/abilities.h" #include "daycare.h" +#include "overworld.h" #include "battle.h" // to get rid of later struct EggHatchData @@ -44,8 +45,6 @@ struct EggHatchData u8 textColor[3]; }; -extern void (*gFieldCallback)(void); - extern const struct CompressedSpriteSheet gMonFrontPicTable[]; extern const u8 gBattleTextboxTiles[]; extern const u8 gBattleTextboxTilemap[]; @@ -58,12 +57,10 @@ extern const u8 gText_NickHatchPrompt[]; extern u8 sav1_map_get_name(void); extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8); -extern void sub_806A068(u16, u8); extern void FadeScreen(u8, u8); extern void overworld_free_bg_tilemaps(void); extern void sub_80AF168(void); extern void ScanlineEffect_Stop(void); -extern void CB2_ReturnToField(void); extern void play_some_sound(void); extern void DoNamingScreen(u8, const u8*, u16, u8, u32, MainCallback); extern u16 sub_80D22D0(void); @@ -391,13 +388,13 @@ static bool8 sub_807158C(struct DayCare *daycare, u8 daycareId) struct DaycareMon *daycareMon = &daycare->mons[daycareId]; GetBoxMonNick(&daycareMon->mon, nick); - if (daycareMon->misc.mail.itemId != 0 - && (StringCompareWithoutExtCtrlCodes(nick, daycareMon->misc.monName) != 0 - || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->misc.OT_name) != 0)) + if (daycareMon->mail.message.itemId != 0 + && (StringCompareWithoutExtCtrlCodes(nick, daycareMon->mail.monName) != 0 + || StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->mail.OT_name) != 0)) { StringCopy(gStringVar1, nick); - TVShowConvertInternationalString(gStringVar2, daycareMon->misc.OT_name, daycareMon->misc.gameLanguage); - TVShowConvertInternationalString(gStringVar3, daycareMon->misc.monName, daycareMon->misc.monLanguage); + TVShowConvertInternationalString(gStringVar2, daycareMon->mail.OT_name, daycareMon->mail.gameLanguage); + TVShowConvertInternationalString(gStringVar3, daycareMon->mail.monName, daycareMon->mail.monLanguage); return TRUE; } return FALSE; @@ -438,8 +435,8 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc } break; case 1: - sub_806A068(GetMonSpritePalStruct(mon)->tag, r5); - spriteID = CreateSprite(&gUnknown_0202499C, 120, 75, 6); + SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, r5); + spriteID = CreateSprite(&gMultiuseSpriteTemplate, 120, 75, 6); gSprites[spriteID].invisible = 1; gSprites[spriteID].callback = SpriteCallbackDummy; break; @@ -575,10 +572,10 @@ static void Task_EggHatchPlayBGM(u8 taskID) play_some_sound(); } if (gTasks[taskID].data[0] == 1) - PlayBGM(376); + PlayBGM(MUS_ME_SHINKA); if (gTasks[taskID].data[0] > 60) { - PlayBGM(377); + PlayBGM(MUS_SHINKA); DestroyTask(taskID); // UB: task is destroyed, yet the value is incremented } @@ -594,7 +591,7 @@ static void CB2_EggHatch_1(void) switch (sEggHatchData->CB2_state) { case 0: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); sEggHatchData->eggSpriteID = CreateSprite(&sSpriteTemplate_EggHatch, 120, 75, 5); ShowBg(0); ShowBg(1); @@ -634,7 +631,7 @@ static void CB2_EggHatch_1(void) GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar1); StringExpandPlaceholders(gStringVar4, gText_HatchedFromEgg); EggHatchPrintMessage(sEggHatchData->windowId, gStringVar4, 0, 3, 0xFF); - PlayFanfare(371); + PlayFanfare(MUS_FANFA5); sEggHatchData->CB2_state++; PutWindowTilemap(sEggHatchData->windowId); CopyWindowToVram(sEggHatchData->windowId, 3); @@ -656,7 +653,7 @@ static void CB2_EggHatch_1(void) case 9: if (!IsTextPrinterActive(sEggHatchData->windowId)) { - sub_809882C(sEggHatchData->windowId, 0x140, 0xE0); + LoadUserWindowBorderGfx(sEggHatchData->windowId, 0x140, 0xE0); CreateYesNoMenu(&sYesNoWinTemplate, 0x140, 0xE, 0); sEggHatchData->CB2_state++; } @@ -677,7 +674,7 @@ static void CB2_EggHatch_1(void) } break; case 11: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); sEggHatchData->CB2_state++; break; case 12: @@ -787,7 +784,7 @@ static void SpriteCB_Egg_4(struct Sprite* sprite) { s16 i; if (sprite->data[0] == 0) - BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0xFFFF); if (sprite->data[0] < 4u) { for (i = 0; i <= 3; i++) @@ -811,7 +808,7 @@ static void SpriteCB_Egg_5(struct Sprite* sprite) StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1); } if (sprite->data[0] == 8) - BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0x10, 0, 0xFFFF); if (sprite->data[0] <= 9) gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1; if (sprite->data[0] > 40) diff --git a/src/event_data.c b/src/event_data.c index 9f1432f17..efd439a3c 100644 --- a/src/event_data.c +++ b/src/event_data.c @@ -190,7 +190,7 @@ bool8 VarSet(u16 id, u16 value) return TRUE; } -u8 VarGetFieldObjectGraphicsId(u8 id) +u8 VarGetEventObjectGraphicsId(u8 id) { return VarGet(0x4010 + id); } diff --git a/src/event_obj_lock.c b/src/event_obj_lock.c new file mode 100644 index 000000000..8c324ea82 --- /dev/null +++ b/src/event_obj_lock.c @@ -0,0 +1,186 @@ +#include "global.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "event_obj_lock.h" +#include "script_movement.h" +#include "task.h" +#include "trainer_see.h" + +bool8 walkrun_is_standing_still(void) +{ + if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) + return FALSE; + else + return TRUE; +} + +static void sub_80983A4(u8 taskId) +{ + if (walkrun_is_standing_still()) + { + sub_808B864(); + DestroyTask(taskId); + } +} + +bool8 sub_80983C4(void) +{ + if (FuncIsActiveTask(sub_80983A4)) + { + return FALSE; + } + else + { + sub_808BCF4(); + return TRUE; + } +} + + +void ScriptFreezeEventObjects(void) +{ + FreezeEventObjects(); + CreateTask(sub_80983A4, 80); +} + +static void sub_8098400(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!task->data[0] && walkrun_is_standing_still() == TRUE) + { + sub_808B864(); + task->data[0] = 1; + } + if (!task->data[1] && !gEventObjects[gSelectedEventObject].singleMovementActive) + { + FreezeEventObject(&gEventObjects[gSelectedEventObject]); + task->data[1] = 1; + } + if (task->data[0] && task->data[1]) + DestroyTask(taskId); +} + +bool8 sub_809847C(void) +{ + if (FuncIsActiveTask(sub_8098400)) + { + return FALSE; + } + else + { + sub_808BCF4(); + return TRUE; + } +} + +void LockSelectedEventObject(void) +{ + u8 taskId; + FreezeEventObjectsExceptOne(gSelectedEventObject); + taskId = CreateTask(sub_8098400, 80); + if (!gEventObjects[gSelectedEventObject].singleMovementActive) + { + FreezeEventObject(&gEventObjects[gSelectedEventObject]); + gTasks[taskId].data[1] = 1; + } +} + +void ScriptUnfreezeEventObjects(void) +{ + u8 objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); + sub_80D338C(); + UnfreezeEventObjects(); +} + +void sub_8098524(void) +{ + u8 objectId; + + if (gEventObjects[gSelectedEventObject].active) + EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]); + objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); + sub_80D338C(); + UnfreezeEventObjects(); +} + +void sub_8098574(void) +{ + EventObjectFaceOppositeDirection(&gEventObjects[gSelectedEventObject], gSpecialVar_Facing); +} + +void sub_809859C(void) +{ + EventObjectClearHeldMovementIfActive(&gEventObjects[gSelectedEventObject]); +} + +static void sub_80985BC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 eventObjectId = task->data[2]; + + if (!task->data[0] && walkrun_is_standing_still() == TRUE) + { + sub_808B864(); + task->data[0] = 1; + } + if (!task->data[1] && !gEventObjects[eventObjectId].singleMovementActive) + { + FreezeEventObject(&gEventObjects[eventObjectId]); + task->data[1] = 1; + } + if (task->data[0] && task->data[1]) + DestroyTask(taskId); +} + +void sub_8098630(void) +{ + u8 trainerObjectId1, trainerObjectId2, taskId; + trainerObjectId1 = GetChosenApproachingTrainerEventObjectId(0); + if(gNoOfApproachingTrainers == 2) + { + trainerObjectId2 = GetChosenApproachingTrainerEventObjectId(1); + sub_8098074(trainerObjectId1, trainerObjectId2); + taskId = CreateTask(sub_80985BC, 80); + gTasks[taskId].data[2] = trainerObjectId1; + if(!gEventObjects[trainerObjectId1].singleMovementActive) + { + FreezeEventObject(&gEventObjects[trainerObjectId1]); + gTasks[taskId].data[1] = 1; + } + taskId = CreateTask(sub_80985BC, 81); + gTasks[taskId].data[2] = trainerObjectId2; + if(!gEventObjects[trainerObjectId2].singleMovementActive) + { + FreezeEventObject(&gEventObjects[trainerObjectId2]); + gTasks[taskId].data[1] = 1; + } + } + else + { + FreezeEventObjectsExceptOne(trainerObjectId1); + taskId = CreateTask(sub_80985BC, 80); + gTasks[taskId].data[2] = trainerObjectId1; + if(!gEventObjects[trainerObjectId1].singleMovementActive) + { + FreezeEventObject(&gEventObjects[trainerObjectId1]); + gTasks[taskId].data[1] = 1; + } + } +} + +bool8 sub_8098734(void) +{ + if (FuncIsActiveTask(sub_80985BC)) + { + return FALSE; + } + else + { + sub_808BCF4(); + return TRUE; + } +} diff --git a/src/event_object_movement.c b/src/event_object_movement.c new file mode 100644 index 000000000..5fdceb4c3 --- /dev/null +++ b/src/event_object_movement.c @@ -0,0 +1,9160 @@ +#include "global.h" +#include "berry.h" +#include "decoration.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "event_scripts.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_effect_helpers.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "malloc.h" +#include "mauville_old_man.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "palette.h" +#include "pokenav.h" +#include "random.h" +#include "rom_818CFC8.h" +#include "rom_81BE66C.h" +#include "sprite.h" +#include "trainer_see.h" +#include "util.h" +#include "constants/event_object_movement_constants.h" +#include "constants/event_objects.h" + +// this file was known as evobjmv.c in Game Freak's original source + +extern u8 gUnknown_020375B4; +extern u16 gUnknown_020375B6; +extern struct LockedAnimEventObjects *gLockedAnimEventObjects; + +static void MoveCoordsInDirection(u32, s16 *, s16 *, s16, s16); +static bool8 EventObjectExecSingleMovementAction(struct EventObject *, struct Sprite *); +static void SetMovementDelay(struct Sprite *, s16); +static bool8 WaitForMovementDelay(struct Sprite *); +static u8 GetCollisionInDirection(struct EventObject *, u8); +static u32 state_to_direction(u8, u32, u32); +static void TryEnableEventObjectAnim(struct EventObject *, struct Sprite *); +static void EventObjectExecHeldMovementAction(struct EventObject *, struct Sprite *); +static void UpdateEventObjectSpriteAnimPause(struct EventObject *, struct Sprite *); +static bool8 IsCoordOutsideEventObjectMovementRange(struct EventObject *, s16, s16); +static bool8 IsMetatileDirectionallyImpassable(struct EventObject *, s16, s16, u8); +static bool8 DoesObjectCollideWithObjectAt(struct EventObject *, s16, s16); +static void sub_8096530(struct EventObject *, struct Sprite *); +static void npc_update_obj_anim_flag(struct EventObject *, struct Sprite *); +static void EventObjectUpdateMetatileBehaviors(struct EventObject*); +static void GetGroundEffectFlags_Reflection(struct EventObject*, u32*); +static void GetGroundEffectFlags_TallGrassOnSpawn(struct EventObject*, u32*); +static void GetGroundEffectFlags_LongGrassOnSpawn(struct EventObject*, u32*); +static void GetGroundEffectFlags_SandHeap(struct EventObject*, u32*); +static void GetGroundEffectFlags_ShallowFlowingWater(struct EventObject*, u32*); +static void GetGroundEffectFlags_ShortGrass(struct EventObject*, u32*); +static void GetGroundEffectFlags_HotSprings(struct EventObject*, u32*); +static void GetGroundEffectFlags_TallGrassOnBeginStep(struct EventObject*, u32*); +static void GetGroundEffectFlags_LongGrassOnBeginStep(struct EventObject*, u32*); +static void GetGroundEffectFlags_Tracks(struct EventObject*, u32*); +static void GetGroundEffectFlags_Puddle(struct EventObject*, u32*); +static void GetGroundEffectFlags_Ripple(struct EventObject*, u32*); +static void GetGroundEffectFlags_Seaweed(struct EventObject*, u32*); +static void GetGroundEffectFlags_JumpLanding(struct EventObject*, u32*); +static u8 EventObjectCheckForReflectiveSurface(struct EventObject*); +static u8 GetReflectionTypeByMetatileBehavior(u32); +static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z); +static void EventObjectUpdateSubpriority(struct EventObject*, struct Sprite*); +static void DoTracksGroundEffect_None(struct EventObject*, struct Sprite*, u8); +static void DoTracksGroundEffect_Footprints(struct EventObject*, struct Sprite*, u8); +static void DoTracksGroundEffect_BikeTireTracks(struct EventObject*, struct Sprite*, u8); +static void DoRippleFieldEffect(struct EventObject*, struct Sprite*); +static void DoGroundEffects_OnSpawn(struct EventObject*, struct Sprite*); +static void DoGroundEffects_OnBeginStep(struct EventObject*, struct Sprite*); +static void DoGroundEffects_OnFinishStep(struct EventObject*, struct Sprite*); +static void sub_8097D68(struct Sprite*); +static void ApplyLevitateMovement(u8); +static bool8 MovementType_Disguise_Callback(struct EventObject *, struct Sprite *); +static bool8 MovementType_Hidden_Callback(struct EventObject *, struct Sprite *); +static void sub_808D450(void); +static u8 GetEventObjectIdByLocalId(u8); +static u8 GetEventObjectIdByLocalIdAndMapInternal(u8, u8, u8); +static bool8 GetAvailableEventObjectId(u16, u8, u8, u8 *); +static void SetEventObjectDynamicGraphicsId(struct EventObject *); +static void RemoveEventObjectInternal(struct EventObject *); +static u16 GetEventObjectFlagIdByEventObjectId(u8); +static void UpdateEventObjectVisibility(struct EventObject *, struct Sprite *); +static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); +static void GetEventObjectMovingCameraOffset(s16 *, s16 *); +static struct EventObjectTemplate *GetEventObjectTemplateByLocalIdAndMap(u8, u8, u8); +static void sub_808E894(u16); +static void RemoveEventObjectIfOutsideView(struct EventObject *); +static void sub_808E1B8(u8, s16, s16); +static void SetPlayerAvatarEventObjectIdAndObjectId(u8, u8); +static void sub_808E38C(struct EventObject *); +static u8 sub_808E8F4(const struct SpritePalette *); +static u8 FindEventObjectPaletteIndexByTag(u16); +static void sub_808EAB0(u16, u8); +static bool8 EventObjectDoesZCoordMatch(struct EventObject *, u8); +static void ObjectCB_CameraObject(struct Sprite *); +static void CameraObject_0(struct Sprite *); +static void CameraObject_1(struct Sprite *); +static void CameraObject_2(struct Sprite *); +static struct EventObjectTemplate *FindEventObjectTemplateByLocalId(u8 localId, struct EventObjectTemplate *templates, u8 count); +static void ClearEventObjectMovement(struct EventObject *, struct Sprite *); +static void EventObjectSetSingleMovement(struct EventObject *, struct Sprite *, u8); + +const u8 gUnknown_084975C4[] = {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}; + +void (*const gCameraObjectFuncs[])(struct Sprite *) = { + CameraObject_0, + CameraObject_1, + CameraObject_2, +}; + +#include "data/field_event_obj/event_object_graphics.h" + +// movement type callbacks +static void (*const sMovementTypeCallbacks[])(struct Sprite *) = +{ + MovementType_None, // MOVEMENT_TYPE_NONE + MovementType_LookAround, // MOVEMENT_TYPE_LOOK_AROUND + MovementType_WanderAround, // MOVEMENT_TYPE_WANDER_AROUND + MovementType_WanderUpAndDown, // MOVEMENT_TYPE_WANDER_UP_AND_DOWN + MovementType_WanderUpAndDown, // MOVEMENT_TYPE_WANDER_DOWN_AND_UP + MovementType_WanderLeftAndRight, // MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT + MovementType_WanderLeftAndRight, // MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT + MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_UP + MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_DOWN + MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_LEFT + MovementType_FaceDirection, // MOVEMENT_TYPE_FACE_RIGHT + MovementType_Player, // MOVEMENT_TYPE_PLAYER + MovementType_BerryTreeGrowth, // MOVEMENT_TYPE_BERRY_TREE_GROWTH + MovementType_FaceDownAndUp, // MOVEMENT_TYPE_FACE_DOWN_AND_UP + MovementType_FaceLeftAndRight, // MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT + MovementType_FaceUpAndLeft, // MOVEMENT_TYPE_FACE_UP_AND_LEFT + MovementType_FaceUpAndRight, // MOVEMENT_TYPE_FACE_UP_AND_RIGHT + MovementType_FaceDownAndLeft, // MOVEMENT_TYPE_FACE_DOWN_AND_LEFT + MovementType_FaceDownAndRight, // MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT + MovementType_FaceDownUpAndLeft, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT + MovementType_FaceDownUpAndRight, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT + MovementType_FaceUpRightAndLeft, // MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT + MovementType_FaceDownRightAndLeft, // MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT + MovementType_RotateCounterclockwise, // MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE + MovementType_RotateClockwise, // MOVEMENT_TYPE_ROTATE_CLOCKWISE + MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_UP_AND_DOWN + MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_DOWN_AND_UP + MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT + MovementType_WalkBackAndForth, // MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT + MovementType_WalkSequenceUpRightLeftDown, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN + MovementType_WalkSequenceRightLeftDownUp, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP + MovementType_WalkSequenceDownUpRightLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT + MovementType_WalkSequenceLeftDownUpRight, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT + MovementType_WalkSequenceUpLeftRightDown, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN + MovementType_WalkSequenceLeftRightDownUp, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP + MovementType_WalkSequenceDownUpLeftRight, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT + MovementType_WalkSequenceRightDownUpLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT + MovementType_WalkSequenceLeftUpDownRight, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT + MovementType_WalkSequenceUpDownRightLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT + MovementType_WalkSequenceRightLeftUpDown, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN + MovementType_WalkSequenceDownRightLeftUp, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP + MovementType_WalkSequenceRightUpDownLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT + MovementType_WalkSequenceUpDownLeftRight, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT + MovementType_WalkSequenceLeftRightUpDown, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN + MovementType_WalkSequenceDownLeftRightUp, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP + MovementType_WalkSequenceUpLeftDownRight, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT + MovementType_WalkSequenceDownRightUpLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT + MovementType_WalkSequenceLeftDownRightUp, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP + MovementType_WalkSequenceRightUpLeftDown, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN + MovementType_WalkSequenceUpRightDownLeft, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT + MovementType_WalkSequenceDownLeftUpRight, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT + MovementType_WalkSequenceLeftUpRightDown, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN + MovementType_WalkSequenceRightDownLeftUp, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP + MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER + MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE + MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE + MovementType_CopyPlayer, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE + MovementType_TreeDisguise, // MOVEMENT_TYPE_TREE_DISGUISE + MovementType_MountainDisguise, // MOVEMENT_TYPE_MOUNTAIN_DISGUISE + MovementType_CopyPlayerInGrass, // MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS + MovementType_CopyPlayerInGrass, // 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_Hidden, // MOVEMENT_TYPE_HIDDEN + MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_DOWN + MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_UP + MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_LEFT + MovementType_WalkInPlace, // MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT + MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_DOWN + MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_UP + MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_LEFT + MovementType_JogInPlace, // MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT + MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_DOWN + MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_UP + MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_LEFT + MovementType_RunInPlace, // MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT + MovementType_Invisible, // MOVEMENT_TYPE_INVISIBLE + MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN + MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP + MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT + MovementType_WalkSlowlyInPlace, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT +}; + +const u8 gRangedMovementTypes[] = { + 0, // MOVEMENT_TYPE_NONE + 0, // MOVEMENT_TYPE_LOOK_AROUND + 1, // MOVEMENT_TYPE_WANDER_AROUND + 1, // MOVEMENT_TYPE_WANDER_UP_AND_DOWN + 1, // MOVEMENT_TYPE_WANDER_DOWN_AND_UP + 1, // MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT + 1, // MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT + 0, // MOVEMENT_TYPE_FACE_UP + 0, // MOVEMENT_TYPE_FACE_DOWN + 0, // MOVEMENT_TYPE_FACE_LEFT + 0, // MOVEMENT_TYPE_FACE_RIGHT + 0, // MOVEMENT_TYPE_PLAYER + 0, // MOVEMENT_TYPE_BERRY_TREE_GROWTH + 0, // MOVEMENT_TYPE_FACE_DOWN_AND_UP + 0, // MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT + 0, // MOVEMENT_TYPE_FACE_UP_AND_LEFT + 0, // MOVEMENT_TYPE_FACE_UP_AND_RIGHT + 0, // MOVEMENT_TYPE_FACE_DOWN_AND_LEFT + 0, // MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT + 0, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT + 0, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT + 0, // MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT + 0, // MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT + 0, // MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE + 0, // MOVEMENT_TYPE_ROTATE_CLOCKWISE + 1, // MOVEMENT_TYPE_WALK_UP_AND_DOWN + 1, // MOVEMENT_TYPE_WALK_DOWN_AND_UP + 1, // MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT + 1, // MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN + 1, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP + 1, // MOVEMENT_TYPE_COPY_PLAYER + 1, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE + 1, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE + 1, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE + 0, // MOVEMENT_TYPE_TREE_DISGUISE + 0, // MOVEMENT_TYPE_MOUNTAIN_DISGUISE + 1, // MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS + 1, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS + 1, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS + 1, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS + 0, // MOVEMENT_TYPE_HIDDEN + 0, // MOVEMENT_TYPE_WALK_IN_PLACE_DOWN + 0, // MOVEMENT_TYPE_WALK_IN_PLACE_UP + 0, // MOVEMENT_TYPE_WALK_IN_PLACE_LEFT + 0, // MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT + 0, // MOVEMENT_TYPE_JOG_IN_PLACE_DOWN + 0, // MOVEMENT_TYPE_JOG_IN_PLACE_UP + 0, // MOVEMENT_TYPE_JOG_IN_PLACE_LEFT + 0, // MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT + 0, // MOVEMENT_TYPE_RUN_IN_PLACE_DOWN + 0, // MOVEMENT_TYPE_RUN_IN_PLACE_UP + 0, // MOVEMENT_TYPE_RUN_IN_PLACE_LEFT + 0, // MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT + 0, // MOVEMENT_TYPE_INVISIBLE + 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN + 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP + 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT + 0, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT +}; + +const u8 gInitialMovementTypeFacingDirections[] = { + DIR_SOUTH, // MOVEMENT_TYPE_NONE + DIR_SOUTH, // MOVEMENT_TYPE_LOOK_AROUND + DIR_SOUTH, // MOVEMENT_TYPE_WANDER_AROUND + DIR_NORTH, // MOVEMENT_TYPE_WANDER_UP_AND_DOWN + DIR_SOUTH, // MOVEMENT_TYPE_WANDER_DOWN_AND_UP + DIR_WEST, // MOVEMENT_TYPE_WANDER_LEFT_AND_RIGHT + DIR_EAST, // MOVEMENT_TYPE_WANDER_RIGHT_AND_LEFT + DIR_NORTH, // MOVEMENT_TYPE_FACE_UP + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN + DIR_WEST, // MOVEMENT_TYPE_FACE_LEFT + DIR_EAST, // MOVEMENT_TYPE_FACE_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_PLAYER + DIR_SOUTH, // MOVEMENT_TYPE_BERRY_TREE_GROWTH + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_AND_UP + DIR_WEST, // MOVEMENT_TYPE_FACE_LEFT_AND_RIGHT + DIR_NORTH, // MOVEMENT_TYPE_FACE_UP_AND_LEFT + DIR_NORTH, // MOVEMENT_TYPE_FACE_UP_AND_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_AND_LEFT + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_LEFT + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_UP_AND_RIGHT + DIR_NORTH, // MOVEMENT_TYPE_FACE_UP_LEFT_AND_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_FACE_DOWN_LEFT_AND_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_ROTATE_COUNTERCLOCKWISE + DIR_SOUTH, // MOVEMENT_TYPE_ROTATE_CLOCKWISE + DIR_NORTH, // MOVEMENT_TYPE_WALK_UP_AND_DOWN + DIR_SOUTH, // MOVEMENT_TYPE_WALK_DOWN_AND_UP + DIR_WEST, // MOVEMENT_TYPE_WALK_LEFT_AND_RIGHT + DIR_EAST, // MOVEMENT_TYPE_WALK_RIGHT_AND_LEFT + DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_LEFT_DOWN + DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_DOWN_UP + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_RIGHT_LEFT + DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_UP_RIGHT + DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_RIGHT_DOWN + DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_DOWN_UP + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_UP_LEFT_RIGHT + DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_UP_LEFT + DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_DOWN_RIGHT + DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_RIGHT_LEFT + DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_LEFT_UP_DOWN + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_LEFT_UP + DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_DOWN_LEFT + DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_DOWN_LEFT_RIGHT + DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_RIGHT_UP_DOWN + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_RIGHT_UP + DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_LEFT_DOWN_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_RIGHT_UP_LEFT + DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_DOWN_RIGHT_UP + DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_UP_LEFT_DOWN + DIR_NORTH, // MOVEMENT_TYPE_WALK_SEQUENCE_UP_RIGHT_DOWN_LEFT + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT + DIR_WEST, // MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN + DIR_EAST, // MOVEMENT_TYPE_WALK_SEQUENCE_RIGHT_DOWN_LEFT_UP + DIR_NORTH, // MOVEMENT_TYPE_COPY_PLAYER + DIR_SOUTH, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE + DIR_WEST, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE + DIR_EAST, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE + DIR_SOUTH, // MOVEMENT_TYPE_TREE_DISGUISE + DIR_SOUTH, // MOVEMENT_TYPE_MOUNTAIN_DISGUISE + DIR_NORTH, // MOVEMENT_TYPE_COPY_PLAYER_IN_GRASS + DIR_SOUTH, // MOVEMENT_TYPE_COPY_PLAYER_OPPOSITE_IN_GRASS + DIR_WEST, // MOVEMENT_TYPE_COPY_PLAYER_COUNTERCLOCKWISE_IN_GRASS + DIR_EAST, // MOVEMENT_TYPE_COPY_PLAYER_CLOCKWISE_IN_GRASS + DIR_SOUTH, // MOVEMENT_TYPE_HIDDEN + DIR_SOUTH, // MOVEMENT_TYPE_WALK_IN_PLACE_DOWN + DIR_NORTH, // MOVEMENT_TYPE_WALK_IN_PLACE_UP + DIR_WEST, // MOVEMENT_TYPE_WALK_IN_PLACE_LEFT + DIR_EAST, // MOVEMENT_TYPE_WALK_IN_PLACE_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_JOG_IN_PLACE_DOWN + DIR_NORTH, // MOVEMENT_TYPE_JOG_IN_PLACE_UP + DIR_WEST, // MOVEMENT_TYPE_JOG_IN_PLACE_LEFT + DIR_EAST, // MOVEMENT_TYPE_JOG_IN_PLACE_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_RUN_IN_PLACE_DOWN + DIR_NORTH, // MOVEMENT_TYPE_RUN_IN_PLACE_UP + DIR_WEST, // MOVEMENT_TYPE_RUN_IN_PLACE_LEFT + DIR_EAST, // MOVEMENT_TYPE_RUN_IN_PLACE_RIGHT + DIR_SOUTH, // MOVEMENT_TYPE_INVISIBLE + DIR_SOUTH, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_DOWN + DIR_NORTH, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_UP + DIR_WEST, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_LEFT + DIR_EAST, // MOVEMENT_TYPE_WALK_SLOWLY_IN_PLACE_RIGHT +}; + +#include "data/field_event_obj/event_object_graphics_info_pointers.h" +#include "data/field_event_obj/field_effect_object_template_pointers.h" +#include "data/field_event_obj/event_object_pic_tables.h" +#include "data/field_event_obj/event_object_anims.h" +#include "data/field_event_obj/base_oam.h" +#include "data/field_event_obj/event_object_subsprites.h" +#include "data/field_event_obj/event_object_graphics_info.h" + +const struct SpritePalette gUnknown_0850BBC8[] = { + {gEventObjectPalette0, 0x1103}, + {gEventObjectPalette1, 0x1104}, + {gEventObjectPalette2, 0x1105}, + {gEventObjectPalette3, 0x1106}, + {gEventObjectPalette4, 0x1107}, + {gEventObjectPalette5, 0x1108}, + {gEventObjectPalette6, 0x1109}, + {gEventObjectPalette7, 0x110A}, + {gEventObjectPalette8, 0x1100}, + {gEventObjectPalette9, 0x1101}, + {gEventObjectPalette10, 0x1102}, + {gEventObjectPalette11, 0x1115}, + {gEventObjectPalette12, 0x110B}, + {gEventObjectPalette13, 0x110C}, + {gEventObjectPalette14, 0x110D}, + {gEventObjectPalette15, 0x110E}, + {gEventObjectPalette16, 0x110F}, + {gEventObjectPalette17, 0x1110}, + {gEventObjectPalette18, 0x1111}, + {gEventObjectPalette19, 0x1112}, + {gEventObjectPalette20, 0x1113}, + {gEventObjectPalette21, 0x1114}, + {gEventObjectPalette22, 0x1116}, + {gEventObjectPalette23, 0x1117}, + {gEventObjectPalette24, 0x1118}, + {gEventObjectPalette25, 0x1119}, + {gEventObjectPalette26, 0x111B}, + {gEventObjectPalette27, 0x111C}, + {gEventObjectPalette28, 0x111D}, + {gEventObjectPalette29, 0x111E}, + {gEventObjectPalette30, 0x111F}, + {gEventObjectPalette31, 0x1120}, + {gEventObjectPalette32, 0x1121}, + {gEventObjectPalette33, 0x1122}, + {gEventObjectPalette34, 0x1123}, + {NULL, 0x0000}, +}; + +const u16 Unknown_0850BCE8[] = { + 0x1101, + 0x1101, + 0x1101, + 0x1101, +}; + +const u16 Unknown_0850BCF0[] = { + 0x1111, + 0x1111, + 0x1111, + 0x1111, +}; + +const u16 Unknown_0850BCF8[] = { + 0x1115, + 0x1115, + 0x1115, + 0x1115, +}; + +const struct PairedPalettes gUnknown_0850BD00[] = { + {0x1100, Unknown_0850BCE8}, + {0x1110, Unknown_0850BCF0}, + {0x1115, Unknown_0850BCF8}, + {0x11FF, NULL}, +}; + +const u16 Unknown_0850BD20[] = { + 0x110C, + 0x110C, + 0x110C, + 0x110C, +}; + +const u16 Unknown_0850BD28[] = { + 0x110D, + 0x110D, + 0x110D, + 0x110D, +}; + +const u16 Unknown_0850BD30[] = { + 0x110E, + 0x110E, + 0x110E, + 0x110E, +}; + +const u16 Unknown_0850BD38[] = { + 0x1112, + 0x1112, + 0x1112, + 0x1112, +}; + +const u16 Unknown_0850BD40[] = { + 0x1113, + 0x1113, + 0x1113, + 0x1113, +}; + +const u16 Unknown_0850BD48[] = { + 0x1114, + 0x1114, + 0x1114, + 0x1114, +}; + +const u16 Unknown_0850BD50[] = { + 0x111B, + 0x111B, + 0x111B, + 0x111B, +}; + +const u16 Unknown_0850BD58[] = { + 0x1117, + 0x1117, + 0x1117, + 0x1117, +}; + +const u16 Unknown_0850BD60[] = { + 0x1119, + 0x1119, + 0x1119, + 0x1119, +}; + +const u16 Unknown_0850BD68[] = { + 0x1109, + 0x1109, + 0x1109, + 0x1109, +}; + +const u16 Unknown_0850BD70[] = { + 0x111D, + 0x111D, + 0x111D, + 0x111D, +}; + +const struct PairedPalettes gUnknown_0850BD78[] = { + {4352, Unknown_0850BCE8}, + {4368, Unknown_0850BCF0}, + {4363, Unknown_0850BD20}, + {4365, Unknown_0850BD28}, + {4366, Unknown_0850BD30}, + {4370, Unknown_0850BD38}, + {4371, Unknown_0850BD40}, + {4372, Unknown_0850BD48}, + {4374, Unknown_0850BD58}, + {4376, Unknown_0850BD60}, + {4357, Unknown_0850BD68}, + {4379, Unknown_0850BD50}, + {4381, Unknown_0850BD70}, + {4607, NULL}, +}; + +const u16 gUnknown_0850BDE8[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A, +}; + +const u16 gUnknown_0850BDFC[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A, +}; + +const u16 gUnknown_0850BE10[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A, +}; + +const u16 gUnknown_0850BE24[] = { + 0x1100, + 0x1101, + 0x1103, + 0x1104, + 0x1105, + 0x1106, + 0x1107, + 0x1108, + 0x1109, + 0x110A, +}; + + +const u16 *const gUnknown_0850BE38[] = { + gUnknown_0850BDE8, + gUnknown_0850BDFC, + gUnknown_0850BE10, + gUnknown_0850BE24, +}; + +#include "data/field_event_obj/berry_tree_graphics_tables.h" +#include "data/field_event_obj/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}; + +#include "data/field_event_obj/movement_type_func_tables.h" + +const u8 gFaceDirectionAnimNums[] = { + 0, // DIR_NONE + 0, // DIR_SOUTH + 1, // DIR_NORTH + 2, // DIR_WEST + 3, // DIR_EAST + 0, // DIR_SOUTHWEST + 0, // DIR_SOUTHEAST + 1, // DIR_NORTHWEST + 1, // DIR_NORTHEAST +}; +const u8 gMoveDirectionAnimNums[] = { + 4, // DIR_NONE + 4, // DIR_SOUTH + 5, // DIR_NORTH + 6, // DIR_WEST + 7, // DIR_EAST + 4, // DIR_SOUTHWEST + 4, // DIR_SOUTHEAST + 5, // DIR_NORTHWEST + 5, // DIR_NORTHEAST +}; +const u8 gMoveDirectionFastAnimNums[] = { + 8, // DIR_NONE + 8, // DIR_SOUTH + 9, // DIR_NORTH + 10, // DIR_WEST + 11, // DIR_EAST + 8, // DIR_SOUTHWEST + 8, // DIR_SOUTHEAST + 9, // DIR_NORTHWEST + 9, // DIR_NORTHEAST +}; +const u8 gMoveDirectionFasterAnimNums[] = { + 12, // DIR_NONE + 12, // DIR_SOUTH + 13, // DIR_NORTH + 14, // DIR_WEST + 15, // DIR_EAST + 12, // DIR_SOUTHWEST + 12, // DIR_SOUTHEAST + 13, // DIR_NORTHWEST + 13, // DIR_NORTHEAST +}; +const u8 gMoveDirectionFastestAnimNums[] = { + 16, // DIR_NONE + 16, // DIR_SOUTH + 17, // DIR_NORTH + 18, // DIR_WEST + 19, // DIR_EAST + 16, // DIR_SOUTHWEST + 16, // DIR_SOUTHEAST + 17, // DIR_NORTHWEST + 17, // DIR_NORTHEAST +}; +const u8 gJumpSpecialDirectionAnimNums[] = { // used for jumping onto surf mon + 20, // DIR_NONE + 20, // DIR_SOUTH + 21, // DIR_NORTH + 22, // DIR_WEST + 23, // DIR_EAST + 20, // DIR_SOUTHWEST + 20, // DIR_SOUTHEAST + 21, // DIR_NORTHWEST + 21, // DIR_NORTHEAST +}; +const u8 gAcroWheelieDirectionAnimNums[] = { + 20, // DIR_NONE + 20, // DIR_SOUTH + 21, // DIR_NORTH + 22, // DIR_WEST + 23, // DIR_EAST + 20, // DIR_SOUTHWEST + 20, // DIR_SOUTHEAST + 21, // DIR_NORTHWEST + 21, // DIR_NORTHEAST +}; +const u8 gUnrefAnimNums_08375633[] = { + 24, // DIR_NONE + 24, // DIR_SOUTH + 25, // DIR_NORTH + 26, // DIR_WEST + 27, // DIR_EAST + 24, // DIR_SOUTHWEST + 24, // DIR_SOUTHEAST + 25, // DIR_NORTHWEST + 25, // DIR_NORTHEAST +}; +const u8 gAcroEndWheelieDirectionAnimNums[] = { + 28, // DIR_NONE + 28, // DIR_SOUTH + 29, // DIR_NORTH + 30, // DIR_WEST + 31, // DIR_EAST + 28, // DIR_SOUTHWEST + 28, // DIR_SOUTHEAST + 29, // DIR_NORTHWEST + 29, // DIR_NORTHEAST +}; +const u8 gAcroUnusedActionDirectionAnimNums[] = { + 32, // DIR_NONE + 32, // DIR_SOUTH + 33, // DIR_NORTH + 34, // DIR_WEST + 35, // DIR_EAST + 32, // DIR_SOUTHWEST + 32, // DIR_SOUTHEAST + 33, // DIR_NORTHWEST + 33, // DIR_NORTHEAST +}; +const u8 gAcroWheeliePedalDirectionAnimNums[] = { + 36, // DIR_NONE + 36, // DIR_SOUTH + 37, // DIR_NORTH + 38, // DIR_WEST + 39, // DIR_EAST + 36, // DIR_SOUTHWEST + 36, // DIR_SOUTHEAST + 37, // DIR_NORTHWEST + 37, // DIR_NORTHEAST +}; +const u8 gFishingDirectionAnimNums[] = { + 0, // DIR_NONE + 0, // DIR_SOUTH + 1, // DIR_NORTH + 2, // DIR_WEST + 3, // DIR_EAST + 0, // DIR_SOUTHWEST + 0, // DIR_SOUTHEAST + 1, // DIR_NORTHWEST + 1, // DIR_NORTHEAST +}; +const u8 gFishingNoCatchDirectionAnimNums[] = { + 4, // DIR_NONE + 4, // DIR_SOUTH + 5, // DIR_NORTH + 6, // DIR_WEST + 7, // DIR_EAST + 4, // DIR_SOUTHWEST + 4, // DIR_SOUTHEAST + 5, // DIR_NORTHWEST + 5, // DIR_NORTHEAST +}; +const u8 gFishingBiteDirectionAnimNums[] = { + 8, // DIR_NONE + 8, // DIR_SOUTH + 9, // DIR_NORTH + 10, // DIR_WEST + 11, // DIR_EAST + 8, // DIR_SOUTHWEST + 8, // DIR_SOUTHEAST + 9, // DIR_NORTHWEST + 9, // DIR_NORTHEAST +}; +const u8 gRunningDirectionAnimNums[] = { + 20, // DIR_NONE + 20, // DIR_SOUTH + 21, // DIR_NORTH + 22, // DIR_WEST + 23, // DIR_EAST + 20, // DIR_SOUTHWEST + 20, // DIR_SOUTHEAST + 21, // DIR_NORTHWEST + 21, // DIR_NORTHEAST +}; + +const u8 gTrainerFacingDirectionMovementTypes[] = { + MOVEMENT_TYPE_FACE_DOWN, // DIR_NONE + MOVEMENT_TYPE_FACE_DOWN, // DIR_SOUTH + MOVEMENT_TYPE_FACE_UP, // DIR_NORTH + MOVEMENT_TYPE_FACE_LEFT, // DIR_WEST + MOVEMENT_TYPE_FACE_RIGHT, // DIR_EAST + MOVEMENT_TYPE_FACE_DOWN, // DIR_SOUTHWEST + MOVEMENT_TYPE_FACE_DOWN, // DIR_SOUTHEAST + MOVEMENT_TYPE_FACE_UP, // DIR_NORTHWEST + MOVEMENT_TYPE_FACE_UP, // DIR_NORTHEAST +}; + +bool8 (*const gOppositeDirectionBlockedMetatileFuncs[])(u8) = { + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsWestBlocked, + MetatileBehavior_IsEastBlocked +}; + +bool8 (*const gDirectionBlockedMetatileFuncs[])(u8) = { + MetatileBehavior_IsNorthBlocked, + MetatileBehavior_IsSouthBlocked, + MetatileBehavior_IsEastBlocked, + MetatileBehavior_IsWestBlocked +}; + +const struct Coords16 gDirectionToVectors[] = { + { 0, 0}, + { 0, 1}, + { 0, -1}, + {-1, 0}, + { 1, 0}, + {-1, 1}, + { 1, 1}, + {-1, -1}, + { 1, -1} +}; + +const u8 gFaceDirectionMovementActions[] = { + MOVEMENT_ACTION_FACE_DOWN, + MOVEMENT_ACTION_FACE_DOWN, + MOVEMENT_ACTION_FACE_UP, + MOVEMENT_ACTION_FACE_LEFT, + MOVEMENT_ACTION_FACE_RIGHT, +}; +const u8 gWalkSlowMovementActions[] = { + MOVEMENT_ACTION_WALK_SLOW_DOWN, + MOVEMENT_ACTION_WALK_SLOW_DOWN, + MOVEMENT_ACTION_WALK_SLOW_UP, + MOVEMENT_ACTION_WALK_SLOW_LEFT, + MOVEMENT_ACTION_WALK_SLOW_RIGHT, +}; +const u8 gWalkNormalMovementActions[] = { + MOVEMENT_ACTION_WALK_NORMAL_DOWN, + MOVEMENT_ACTION_WALK_NORMAL_DOWN, + MOVEMENT_ACTION_WALK_NORMAL_UP, + MOVEMENT_ACTION_WALK_NORMAL_LEFT, + MOVEMENT_ACTION_WALK_NORMAL_RIGHT, +}; +const u8 gWalkFastMovementActions[] = { + MOVEMENT_ACTION_WALK_FAST_DOWN, + MOVEMENT_ACTION_WALK_FAST_DOWN, + MOVEMENT_ACTION_WALK_FAST_UP, + MOVEMENT_ACTION_WALK_FAST_LEFT, + MOVEMENT_ACTION_WALK_FAST_RIGHT, +}; +const u8 gRideWaterCurrentMovementActions[] = { + MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, + MOVEMENT_ACTION_RIDE_WATER_CURRENT_DOWN, + MOVEMENT_ACTION_RIDE_WATER_CURRENT_UP, + MOVEMENT_ACTION_RIDE_WATER_CURRENT_LEFT, + MOVEMENT_ACTION_RIDE_WATER_CURRENT_RIGHT, +}; +const u8 gWalkFastestMovementActions[] = { + MOVEMENT_ACTION_WALK_FASTEST_DOWN, + MOVEMENT_ACTION_WALK_FASTEST_DOWN, + MOVEMENT_ACTION_WALK_FASTEST_UP, + MOVEMENT_ACTION_WALK_FASTEST_LEFT, + MOVEMENT_ACTION_WALK_FASTEST_RIGHT, +}; +const u8 gSlideMovementActions[] = { + MOVEMENT_ACTION_SLIDE_DOWN, + MOVEMENT_ACTION_SLIDE_DOWN, + MOVEMENT_ACTION_SLIDE_UP, + MOVEMENT_ACTION_SLIDE_LEFT, + MOVEMENT_ACTION_SLIDE_RIGHT, +}; +const u8 gPlayerRunMovementActions[] = { + MOVEMENT_ACTION_PLAYER_RUN_DOWN, + MOVEMENT_ACTION_PLAYER_RUN_DOWN, + MOVEMENT_ACTION_PLAYER_RUN_UP, + MOVEMENT_ACTION_PLAYER_RUN_LEFT, + MOVEMENT_ACTION_PLAYER_RUN_RIGHT, +}; +const u8 gJump2MovementActions[] = { + MOVEMENT_ACTION_JUMP_2_DOWN, + MOVEMENT_ACTION_JUMP_2_DOWN, + MOVEMENT_ACTION_JUMP_2_UP, + MOVEMENT_ACTION_JUMP_2_LEFT, + MOVEMENT_ACTION_JUMP_2_RIGHT, +}; +const u8 gJumpInPlaceMovementActions[] = { + MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN, + MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN, + MOVEMENT_ACTION_JUMP_IN_PLACE_UP, + MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT, + MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT, +}; +const u8 gJumpInPlaceTurnAroundMovementActions[] = { + MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN, + MOVEMENT_ACTION_JUMP_IN_PLACE_UP_DOWN, + MOVEMENT_ACTION_JUMP_IN_PLACE_DOWN_UP, + MOVEMENT_ACTION_JUMP_IN_PLACE_RIGHT_LEFT, + MOVEMENT_ACTION_JUMP_IN_PLACE_LEFT_RIGHT, +}; +const u8 gJumpMovementActions[] = { + MOVEMENT_ACTION_JUMP_DOWN, + MOVEMENT_ACTION_JUMP_DOWN, + MOVEMENT_ACTION_JUMP_UP, + MOVEMENT_ACTION_JUMP_LEFT, + MOVEMENT_ACTION_JUMP_RIGHT, +}; +const u8 gJumpSpecialMovementActions[] = { + MOVEMENT_ACTION_JUMP_SPECIAL_DOWN, + MOVEMENT_ACTION_JUMP_SPECIAL_DOWN, + MOVEMENT_ACTION_JUMP_SPECIAL_UP, + MOVEMENT_ACTION_JUMP_SPECIAL_LEFT, + MOVEMENT_ACTION_JUMP_SPECIAL_RIGHT, +}; +const u8 gWalkInPlaceSlowMovementActions[] = { + MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_UP, + MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_LEFT, + MOVEMENT_ACTION_WALK_IN_PLACE_SLOW_RIGHT, +}; +const u8 gWalkInPlaceNormalMovementActions[] = { + MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_UP, + MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_LEFT, + MOVEMENT_ACTION_WALK_IN_PLACE_NORMAL_RIGHT, +}; +const u8 gWalkInPlaceFastMovementActions[] = { + MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_FAST_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_FAST_UP, + MOVEMENT_ACTION_WALK_IN_PLACE_FAST_LEFT, + MOVEMENT_ACTION_WALK_IN_PLACE_FAST_RIGHT, +}; +const u8 gWalkInPlaceFastestMovementActions[] = { + MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_DOWN, + MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_UP, + MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_LEFT, + MOVEMENT_ACTION_WALK_IN_PLACE_FASTEST_RIGHT, +}; +const u8 gAcroWheelieFaceDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_FACE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_FACE_UP, + MOVEMENT_ACTION_ACRO_WHEELIE_FACE_LEFT, + MOVEMENT_ACTION_ACRO_WHEELIE_FACE_RIGHT, +}; +const u8 gAcroPopWheelieFaceDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_DOWN, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_UP, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_LEFT, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_RIGHT, +}; +const u8 gAcroEndWheelieFaceDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, + MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_DOWN, + MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_UP, + MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_LEFT, + MOVEMENT_ACTION_ACRO_END_WHEELIE_FACE_RIGHT, +}; +const u8 gAcroWheelieHopFaceDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_UP, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_LEFT, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_FACE_RIGHT, +}; +const u8 gAcroWheelieHopDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_UP, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_LEFT, + MOVEMENT_ACTION_ACRO_WHEELIE_HOP_RIGHT, +}; +const u8 gAcroWheelieJumpDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_UP, + MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_LEFT, + MOVEMENT_ACTION_ACRO_WHEELIE_JUMP_RIGHT, +}; +const u8 gAcroWheelieInPlaceDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_UP, + MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_LEFT, + MOVEMENT_ACTION_ACRO_WHEELIE_IN_PLACE_RIGHT, +}; +const u8 gAcroPopWheelieMoveDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_DOWN, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_UP, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_LEFT, + MOVEMENT_ACTION_ACRO_POP_WHEELIE_MOVE_RIGHT, +}; +const u8 gAcroWheelieMoveDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_DOWN, + MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_UP, + MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_LEFT, + MOVEMENT_ACTION_ACRO_WHEELIE_MOVE_RIGHT, +}; +const u8 gAcroEndWheelieMoveDirectionMovementActions[] = { + MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, + MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_DOWN, + MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_UP, + MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_LEFT, + MOVEMENT_ACTION_ACRO_END_WHEELIE_MOVE_RIGHT, +}; + +const u8 gOppositeDirections[] = { + DIR_NORTH, + DIR_SOUTH, + DIR_EAST, + DIR_WEST, + DIR_NORTHEAST, + DIR_NORTHWEST, + DIR_SOUTHEAST, + DIR_SOUTHWEST, +}; + +const u8 gUnknown_0850DC2F[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {3, 4, 2, 1}, + {4, 3, 1, 2} +}; + +const u8 gUnknown_0850DC3F[][4] = { + {2, 1, 4, 3}, + {1, 2, 3, 4}, + {4, 3, 1, 2}, + {3, 4, 2, 1} +}; + +#include "data/field_event_obj/movement_action_func_tables.h" + +// Code + +static void ClearEventObject(struct EventObject *eventObject) +{ + *eventObject = (struct EventObject){}; + eventObject->localId = 0xFF; + eventObject->mapNum = 0xFF; + eventObject->mapGroup = 0xFF; + eventObject->movementActionId = 0xFF; +} + +static void ClearAllEventObjects(void) +{ + u8 i; + + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + ClearEventObject(&gEventObjects[i]); +} + +void sub_808D438(void) +{ + ClearLinkPlayerEventObjects(); + ClearAllEventObjects(); + ClearPlayerAvatarInfo(); + sub_808D450(); +} + +static void sub_808D450(void) +{ + u8 spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31); + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 0); + gSprites[spriteId].invisible = 1; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31); + gSprites[spriteId].oam.affineMode = 1; + InitSpriteAffineAnim(&gSprites[spriteId]); + StartSpriteAffineAnim(&gSprites[spriteId], 1); + gSprites[spriteId].invisible = 1; +} + +u8 GetFirstInactiveEventObjectId(void) +{ + u8 i; + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (!gEventObjects[i].active) + break; + } + + return i; +} + +u8 GetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) +{ + if (localId < 0xff) + { + return GetEventObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); + } + return GetEventObjectIdByLocalId(localId); +} + +bool8 TryGetEventObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId, u8 *eventObjectId) +{ + *eventObjectId = GetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroupId); + if (*eventObjectId == NUM_EVENT_OBJECTS) + return TRUE; + else + return FALSE; +} + +u8 GetEventObjectIdByXY(s16 x, s16 y) +{ + u8 i; + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (gEventObjects[i].active && gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y) + break; + } + + return i; +} + +static u8 GetEventObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroupId) +{ + u8 i; + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroupId) + return i; + } + + return NUM_EVENT_OBJECTS; +} + +static u8 GetEventObjectIdByLocalId(u8 localId) +{ + u8 i; + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (gEventObjects[i].active && gEventObjects[i].localId == localId) + return i; + } + + return NUM_EVENT_OBJECTS; +} + +// This function has the same nonmatching quirk as in Ruby/Sapphire. +#ifdef NONMATCHING +static u8 InitEventObjectStateFromTemplate(struct EventObjectTemplate *template, u8 mapNum, u8 mapGroup) +{ + struct EventObject *eventObject; + u8 eventObjectId; + s16 x; + s16 y; + + // mapNum and mapGroup are in the wrong registers (r7/r6 instead of r6/r7) + if (GetAvailableEventObjectId(template->localId, mapNum, mapGroup, &eventObjectId)) + { + return NUM_EVENT_OBJECTS; + } + eventObject = &gEventObjects[eventObjectId]; + ClearEventObject(eventObject); + x = template->x + 7; + y = template->y + 7; + eventObject->active = TRUE; + eventObject->triggerGroundEffectsOnMove = TRUE; + eventObject->graphicsId = template->graphicsId; + eventObject->movementType = template->movementType; + eventObject->localId = template->localId; + eventObject->mapNum = mapNum; + eventObject->mapGroup = mapGroup; + eventObject->initialCoords.x = x; + eventObject->initialCoords.y = y; + eventObject->currentCoords.x = x; + eventObject->currentCoords.y = y; + eventObject->previousCoords.x = x; + eventObject->previousCoords.y = y; + eventObject->currentElevation = template->elevation; + eventObject->previousElevation = template->elevation; + // For some reason, 0x0F is placed in r9, to be used later + eventObject->range.as_nybbles.x = template->movementRangeX; + eventObject->range.as_nybbles.y = template->movementRangeY; + eventObject->trainerType = template->trainerType; + eventObject->trainerRange_berryTreeId = template->trainerRange_berryTreeId; + eventObject->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType]; + SetEventObjectDirection(eventObject, eventObject->previousMovementDirection); + SetEventObjectDynamicGraphicsId(eventObject); + + if (gRangedMovementTypes[eventObject->movementType]) + { + if ((eventObject->range.as_nybbles.x) == 0) + { + // r9 is invoked here + eventObject->range.as_nybbles.x++; + } + if ((eventObject->range.as_nybbles.y) == 0) + { + eventObject->range.as_nybbles.y++; + } + } + return eventObjectId; +} +#else +static NAKED u8 InitEventObjectStateFromTemplate(struct EventObjectTemplate *template, u8 mapId, u8 mapGroupId) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tsub sp, 0x4\n" + "\tadds r5, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r6, r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r7, r2, 24\n" + "\tldrb r0, [r5]\n" + "\tadds r1, r6, 0\n" + "\tadds r2, r7, 0\n" + "\tmov r3, sp\n" + "\tbl GetAvailableEventObjectId\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0808D66E\n" + "\tmovs r0, 0x10\n" + "\tb _0808D762\n" + "_0808D66E:\n" + "\tmov r0, sp\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 3\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, =gEventObjects\n" + "\tadds r4, r0, r1\n" + "\tadds r0, r4, 0\n" + "\tbl ClearEventObject\n" + "\tldrh r3, [r5, 0x4]\n" + "\tadds r3, 0x7\n" + "\tlsls r3, 16\n" + "\tlsrs r3, 16\n" + "\tldrh r2, [r5, 0x6]\n" + "\tadds r2, 0x7\n" + "\tlsls r2, 16\n" + "\tlsrs r2, 16\n" + "\tldrb r0, [r4]\n" + "\tmovs r1, 0x1\n" + "\torrs r0, r1\n" + "\tmovs r1, 0x4\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4]\n" + "\tldrb r0, [r5, 0x1]\n" + "\tstrb r0, [r4, 0x5]\n" + "\tldrb r0, [r5, 0x9]\n" + "\tstrb r0, [r4, 0x6]\n" + "\tldrb r0, [r5]\n" + "\tstrb r0, [r4, 0x8]\n" + "\tstrb r6, [r4, 0x9]\n" + "\tstrb r7, [r4, 0xA]\n" + "\tstrh r3, [r4, 0xC]\n" + "\tstrh r2, [r4, 0xE]\n" + "\tstrh r3, [r4, 0x10]\n" + "\tstrh r2, [r4, 0x12]\n" + "\tstrh r3, [r4, 0x14]\n" + "\tstrh r2, [r4, 0x16]\n" + "\tldrb r0, [r5, 0x8]\n" + "\tmovs r7, 0xF\n" + "\tadds r1, r7, 0\n" + "\tands r1, r0\n" + "\tldrb r2, [r4, 0xB]\n" + "\tmovs r0, 0x10\n" + "\tnegs r0, r0\n" + "\tmov r8, r0\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4, 0xB]\n" + "\tldrb r1, [r5, 0x8]\n" + "\tlsls r1, 4\n" + "\tands r0, r7\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4, 0xB]\n" + "\tldrb r1, [r5, 0xA]\n" + "\tlsls r1, 28\n" + "\tmovs r0, 0xF\n" + "\tmov r9, r0\n" + "\tlsrs r1, 28\n" + "\tldrb r2, [r4, 0x19]\n" + "\tmov r0, r8\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4, 0x19]\n" + "\tldrb r1, [r5, 0xA]\n" + "\tlsrs r1, 4\n" + "\tlsls r1, 4\n" + "\tands r0, r7\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4, 0x19]\n" + "\tldrh r0, [r5, 0xC]\n" + "\tstrb r0, [r4, 0x7]\n" + "\tldrh r0, [r5, 0xE]\n" + "\tstrb r0, [r4, 0x1D]\n" + "\tldr r1, =gInitialMovementTypeFacingDirections\n" + "\tldrb r0, [r5, 0x9]\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0x20\n" + "\tstrb r1, [r0]\n" + "\tldrb r1, [r0]\n" + "\tadds r0, r4, 0\n" + "\tbl SetEventObjectDirection\n" + "\tadds r0, r4, 0\n" + "\tbl SetEventObjectDynamicGraphicsId\n" + "\tldr r1, =gRangedMovementTypes\n" + "\tldrb r0, [r4, 0x6]\n" + "\tadds r0, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0808D75E\n" + "\tldrb r2, [r4, 0x19]\n" + "\tadds r0, r7, 0\n" + "\tands r0, r2\n" + "\tcmp r0, 0\n" + "\tbne _0808D746\n" + "\tlsls r0, r2, 28\n" + "\tlsrs r0, 28\n" + "\tadds r0, 0x1\n" + "\tmov r1, r9\n" + "\tands r0, r1\n" + "\tmov r1, r8\n" + "\tands r1, r2\n" + "\torrs r1, r0\n" + "\tstrb r1, [r4, 0x19]\n" + "_0808D746:\n" + "\tldrb r2, [r4, 0x19]\n" + "\tmovs r0, 0xF0\n" + "\tands r0, r2\n" + "\tcmp r0, 0\n" + "\tbne _0808D75E\n" + "\tlsrs r1, r2, 4\n" + "\tadds r1, 0x1\n" + "\tlsls r1, 4\n" + "\tadds r0, r7, 0\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4, 0x19]\n" + "_0808D75E:\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0]\n" + "_0808D762:\n" + "\tadd sp, 0x4\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + ".pool"); +} +#endif + +u8 Unref_TryInitLocalEventObject(u8 localId) +{ + u8 i; + u8 nObjects; + struct EventObjectTemplate *template; + + if (gMapHeader.events != NULL) + { + if (InBattlePyramid()) + { + nObjects = sub_81AAA40(); + } + else if (InTrainerHill()) + { + nObjects = 2; + } + else + { + nObjects = gMapHeader.events->eventObjectCount; + } + for (i = 0; i < nObjects; i++) + { + template = &gSaveBlock1Ptr->eventObjectTemplates[i]; + if (template->localId == localId && !FlagGet(template->flagId)) + { + return InitEventObjectStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + } + } + } + return NUM_EVENT_OBJECTS; +} + +static bool8 GetAvailableEventObjectId(u16 localId, u8 mapNum, u8 mapGroup, u8 *eventObjectId) +// Looks for an empty slot. +// Returns FALSE and the location of the available slot +// in *eventObjectId. +// If no slots are available, or if the object is already +// loaded, returns TRUE. +{ + u8 i = 0; + + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (!gEventObjects[i].active) + break; + if (gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup) + return TRUE; + } + if (i >= NUM_EVENT_OBJECTS) + return TRUE; + *eventObjectId = i; + do + { + if (gEventObjects[i].active && gEventObjects[i].localId == localId && gEventObjects[i].mapNum == mapNum && gEventObjects[i].mapGroup == mapGroup) + return TRUE; + i++; + } while (i < NUM_EVENT_OBJECTS); + return FALSE; +} + +static void RemoveEventObject(struct EventObject *eventObject) +{ + eventObject->active = FALSE; + RemoveEventObjectInternal(eventObject); +} + +void RemoveEventObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + FlagSet(GetEventObjectFlagIdByEventObjectId(eventObjectId)); + RemoveEventObject(&gEventObjects[eventObjectId]); + } +} + +static void RemoveEventObjectInternal(struct EventObject *eventObject) +{ + struct SpriteFrameImage image; + image.size = GetEventObjectGraphicsInfo(eventObject->graphicsId)->size; + gSprites[eventObject->spriteId].images = ℑ + DestroySprite(&gSprites[eventObject->spriteId]); +} + +void RemoveAllEventObjectsExceptPlayer(void) +{ + u8 i; + + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (i != gPlayerAvatar.eventObjectId) + RemoveEventObject(&gEventObjects[i]); + } +} + +static u8 TrySetupEventObjectSprite(struct EventObjectTemplate *eventObjectTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) +{ + struct EventObject *eventObject; + const struct EventObjectGraphicsInfo *graphicsInfo; + struct Sprite *sprite; + u8 eventObjectId; + u8 paletteSlot; + u8 spriteId; + + eventObjectId = InitEventObjectStateFromTemplate(eventObjectTemplate, mapNum, mapGroup); + if (eventObjectId == NUM_EVENT_OBJECTS) + return NUM_EVENT_OBJECTS; + + eventObject = &gEventObjects[eventObjectId]; + graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); + paletteSlot = graphicsInfo->paletteSlot; + if (paletteSlot == 0) + { + npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, 0); + } + else if (paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, 10); + } + else if (paletteSlot >= 16) + { + paletteSlot -= 16; + sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot); + } + if (eventObject->movementType == 0x4c) + { + eventObject->invisible = TRUE; + } + *(u16 *)&spriteTemplate->paletteTag = 0xFFFF; + spriteId = CreateSprite(spriteTemplate, 0, 0, 0); + if (spriteId == MAX_SPRITES) + { + gEventObjects[eventObjectId].active = FALSE; + return NUM_EVENT_OBJECTS; + } + sprite = &gSprites[spriteId]; + sub_8092FF0(eventObject->currentCoords.x + cameraX, eventObject->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] = eventObjectId; + eventObject->spriteId = spriteId; + eventObject->inanimate = graphicsInfo->inanimate; + if (!eventObject->inanimate) + { + StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObject->facingDirection)); + } + SetObjectSubpriorityByZCoord(eventObject->previousElevation, sprite, 1); + UpdateEventObjectVisibility(eventObject, sprite); + return eventObjectId; +} + +static u8 TrySpawnEventObject(struct EventObjectTemplate *eventObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) +{ + const struct EventObjectGraphicsInfo *graphicsInfo; + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + struct SpriteFrameImage spriteFrameImage; + u8 eventObjectId; + + subspriteTables = NULL; + graphicsInfo = GetEventObjectGraphicsInfo(eventObjectTemplate->graphicsId); + MakeObjectTemplateFromEventObjectTemplate(eventObjectTemplate, &spriteTemplate, &subspriteTables); + spriteFrameImage.size = graphicsInfo->size; + spriteTemplate.images = &spriteFrameImage; + eventObjectId = TrySetupEventObjectSprite(eventObjectTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); + if (eventObjectId == NUM_EVENT_OBJECTS) + { + return NUM_EVENT_OBJECTS; + } + gSprites[gEventObjects[eventObjectId].spriteId].images = graphicsInfo->images; + if (subspriteTables != NULL) + { + SetSubspriteTables(&gSprites[gEventObjects[eventObjectId].spriteId], subspriteTables); + } + return eventObjectId; +} + +u8 SpawnSpecialEventObject(struct EventObjectTemplate *eventObjectTemplate) +{ + s16 cameraX; + s16 cameraY; + + GetEventObjectMovingCameraOffset(&cameraX, &cameraY); + return TrySpawnEventObject(eventObjectTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); +} + +u8 SpawnSpecialEventObjectParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z) +{ + struct EventObjectTemplate eventObjectTemplate; + + x -= 7; + y -= 7; + eventObjectTemplate.localId = localId; + eventObjectTemplate.graphicsId = graphicsId; + eventObjectTemplate.unk2 = 0; + eventObjectTemplate.x = x; + eventObjectTemplate.y = y; + eventObjectTemplate.elevation = z; + eventObjectTemplate.movementType = movementBehavior; + eventObjectTemplate.movementRangeX = 0; + eventObjectTemplate.movementRangeY = 0; + eventObjectTemplate.trainerType = 0; + eventObjectTemplate.trainerRange_berryTreeId = 0; + return SpawnSpecialEventObject(&eventObjectTemplate); +} + +u8 show_sprite(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct EventObjectTemplate *eventObjectTemplate; + s16 cameraX; + s16 cameraY; + + eventObjectTemplate = GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); + if (eventObjectTemplate == NULL) + { + return NUM_EVENT_OBJECTS; + } + GetEventObjectMovingCameraOffset(&cameraX, &cameraY); + return TrySpawnEventObject(eventObjectTemplate, mapNum, mapGroup, cameraX, cameraY); +} + +static void MakeObjectTemplateFromEventObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(graphicsId); + + sprTemplate->tileTag = gfxInfo->tileTag; + sprTemplate->paletteTag = gfxInfo->paletteTag1; + sprTemplate->oam = gfxInfo->oam; + sprTemplate->anims = gfxInfo->anims; + sprTemplate->images = gfxInfo->images; + sprTemplate->affineAnims = gfxInfo->affineAnims; + sprTemplate->callback = callback; + *subspriteTables = gfxInfo->subspriteTables; +} + +static void MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, sMovementTypeCallbacks[callbackIndex], sprTemplate, subspriteTables); +} + +static void MakeObjectTemplateFromEventObjectTemplate(struct EventObjectTemplate *eventObjectTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) +{ + MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(eventObjectTemplate->graphicsId, eventObjectTemplate->movementType, spriteTemplate, subspriteTables); +} + +u8 AddPseudoEventObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) +{ + struct SpriteTemplate *spriteTemplate; + const struct SubspriteTable *subspriteTables; + struct Sprite *sprite; + u8 spriteIdx; + + spriteTemplate = malloc(sizeof(struct SpriteTemplate)); + MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, callback, spriteTemplate, &subspriteTables); + if (spriteTemplate->paletteTag != 0xffff) + { + sub_808E894(spriteTemplate->paletteTag); + } + spriteIdx = CreateSprite(spriteTemplate, x, y, subpriority); + free(spriteTemplate); + + if (spriteIdx != MAX_SPRITES && subspriteTables != NULL) + { + sprite = &gSprites[spriteIdx]; + SetSubspriteTables(sprite, subspriteTables); + sprite->subspriteMode = 2; + } + return spriteIdx; +} + +u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction) +{ + const struct EventObjectGraphicsInfo *graphicsInfo; + struct SpriteTemplate spriteTemplate; + const struct SubspriteTable *subspriteTables; + u8 spriteId; + struct Sprite *sprite; + + graphicsInfo = GetEventObjectGraphicsInfo(graphicsId); + MakeObjectTemplateFromEventObjectGraphicsInfo(graphicsId, UpdateEventObjectSpriteSubpriorityAndVisibility, &spriteTemplate, &subspriteTables); + *(u16 *)&spriteTemplate.paletteTag = 0xffff; + x += 7; + y += 7; + sub_80930E0(&x, &y, 8, 16); + spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); + sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); + sprite->pos1.y += sprite->centerToCornerVecY; + sprite->oam.paletteNum = graphicsInfo->paletteSlot; + if (sprite->oam.paletteNum >= 16) + { + sprite->oam.paletteNum -= 16; + } + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = a1; + sprite->data[1] = z; + if (graphicsInfo->paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); + } + else if (graphicsInfo->paletteSlot >= 16) + { + sub_808EAB0(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot | 0xf0); + } + if (subspriteTables != NULL) + { + SetSubspriteTables(sprite, subspriteTables); + sprite->subspriteMode = 2; + } + InitObjectPriorityByZCoord(sprite, z); + SetObjectSubpriorityByZCoord(z, sprite, 1); + StartSpriteAnim(sprite, GetFaceDirectionAnimNum(direction)); + } + return spriteId; +} + +void TrySpawnEventObjects(s16 cameraX, s16 cameraY) +{ + u8 i; + s16 left; + s16 right; + s16 top; + s16 bottom; + u8 objectCount; + s16 npcX; + s16 npcY; + + if (gMapHeader.events != NULL) + { + left = gSaveBlock1Ptr->pos.x - 2; + right = gSaveBlock1Ptr->pos.x + 17; + top = gSaveBlock1Ptr->pos.y; + bottom = gSaveBlock1Ptr->pos.y + 16; + + if (InBattlePyramid()) + { + objectCount = sub_81AAA40(); + } + else if (InTrainerHill()) + { + objectCount = 2; + } + else + { + objectCount = gMapHeader.events->eventObjectCount; + } + + for (i = 0; i < objectCount; i++) + { + struct EventObjectTemplate *template = &gSaveBlock1Ptr->eventObjectTemplates[i]; + npcX = template->x + 7; + npcY = template->y + 7; + + if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX + && !FlagGet(template->flagId)) + TrySpawnEventObject(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); + } + } +} + +void RemoveEventObjectsOutsideView(void) +{ + u8 i; + u8 j; + bool8 isActiveLinkPlayer; + struct EventObject *eventObject; + + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + for (j = 0, isActiveLinkPlayer = FALSE; j < ARRAY_COUNT(gLinkPlayerEventObjects); j++) + { + if (gLinkPlayerEventObjects[j].active && i == gLinkPlayerEventObjects[j].eventObjId) + isActiveLinkPlayer = TRUE; + } + if (!isActiveLinkPlayer) + { + eventObject = &gEventObjects[i]; + + if (eventObject->active && !eventObject->isPlayer) + RemoveEventObjectIfOutsideView(eventObject); + } + } +} + +static void RemoveEventObjectIfOutsideView(struct EventObject *eventObject) +{ + s16 left; + s16 right; + s16 top; + s16 bottom; + + left = gSaveBlock1Ptr->pos.x - 2; + right = gSaveBlock1Ptr->pos.x + 17; + top = gSaveBlock1Ptr->pos.y; + bottom = gSaveBlock1Ptr->pos.y + 16; + + if (eventObject->currentCoords.x >= left && eventObject->currentCoords.x <= right + && eventObject->currentCoords.y >= top && eventObject->currentCoords.y <= bottom) + return; + if (eventObject->initialCoords.x >= left && eventObject->initialCoords.x <= right + && eventObject->initialCoords.y >= top && eventObject->initialCoords.y <= bottom) + return; + RemoveEventObject(eventObject); +} + +void sub_808E16C(s16 x, s16 y) +{ + u8 i; + + ClearPlayerAvatarInfo(); + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (gEventObjects[i].active) + { + sub_808E1B8(i, x, y); + } + } + sub_808D450(); +} + +static void sub_808E1B8(u8 eventObjectId, s16 x, s16 y) +{ + u8 spriteId; + u8 paletteSlot; + struct EventObject *eventObject; + const struct SubspriteTable *subspriteTables; + const struct EventObjectGraphicsInfo *graphicsInfo; + struct SpriteFrameImage spriteFrameImage; + struct SpriteTemplate spriteTemplate; + struct Sprite *sprite; + +#define i spriteId + for (i = 0; i < ARRAY_COUNT(gLinkPlayerEventObjects); i++) + { + if (gLinkPlayerEventObjects[i].active && eventObjectId == gLinkPlayerEventObjects[i].eventObjId) + { + return; + } + } +#undef i + + eventObject = &gEventObjects[eventObjectId]; + subspriteTables = NULL; + graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); + spriteFrameImage.size = graphicsInfo->size; + MakeObjectTemplateFromEventObjectGraphicsInfoWithCallbackIndex(eventObject->graphicsId, eventObject->movementType, &spriteTemplate, &subspriteTables); + spriteTemplate.images = &spriteFrameImage; + *(u16 *)&spriteTemplate.paletteTag = 0xffff; + paletteSlot = graphicsInfo->paletteSlot; + if (paletteSlot == 0) + { + npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); + } + else if (paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); + } + else if (paletteSlot >= 16) + { + paletteSlot -= 16; + sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot); + } + *(u16 *)&spriteTemplate.paletteTag = 0xffff; + spriteId = CreateSprite(&spriteTemplate, 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sub_8092FF0(x + eventObject->currentCoords.x, y + eventObject->currentCoords.y, &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->images = graphicsInfo->images; + if (eventObject->movementType == 0x0b) + { + SetPlayerAvatarEventObjectIdAndObjectId(eventObjectId, spriteId); + eventObject->warpArrowSpriteId = sub_8154228(); + } + if (subspriteTables != NULL) + { + SetSubspriteTables(sprite, subspriteTables); + } + sprite->oam.paletteNum = paletteSlot; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = eventObjectId; + eventObject->spriteId = spriteId; + if (!eventObject->inanimate && eventObject->movementType != 0x0b) + { + StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObject->facingDirection)); + } + sub_808E38C(eventObject); + SetObjectSubpriorityByZCoord(eventObject->previousElevation, sprite, 1); + } +} + +static void sub_808E38C(struct EventObject *eventObject) +{ + eventObject->singleMovementActive = 0; + eventObject->triggerGroundEffectsOnMove = TRUE; + eventObject->hasShadow = FALSE; + eventObject->hasReflection = FALSE; + eventObject->inShortGrass = FALSE; + eventObject->inShallowFlowingWater = FALSE; + eventObject->inSandPile = FALSE; + eventObject->inHotSprings = FALSE; + EventObjectClearHeldMovement(eventObject); +} + +static void SetPlayerAvatarEventObjectIdAndObjectId(u8 eventObjectId, u8 spriteId) +{ + gPlayerAvatar.eventObjectId = eventObjectId; + gPlayerAvatar.spriteId = spriteId; + gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gEventObjects[eventObjectId].graphicsId); + SetPlayerAvatarExtraStateTransition(gEventObjects[eventObjectId].graphicsId, 0x20); +} + +void EventObjectSetGraphicsId(struct EventObject *eventObject, u8 graphicsId) +{ + const struct EventObjectGraphicsInfo *graphicsInfo; + struct Sprite *sprite; + u8 paletteSlot; + + graphicsInfo = GetEventObjectGraphicsInfo(graphicsId); + sprite = &gSprites[eventObject->spriteId]; + paletteSlot = graphicsInfo->paletteSlot; + if (paletteSlot == 0) + { + pal_patch_for_npc(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); + } + else if (paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); + } + else if (paletteSlot >= 16) + { + paletteSlot -= 16; + sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot); + } + sprite->oam.shape = graphicsInfo->oam->shape; + sprite->oam.size = graphicsInfo->oam->size; + sprite->images = graphicsInfo->images; + sprite->anims = graphicsInfo->anims; + sprite->subspriteTables = graphicsInfo->subspriteTables; + sprite->oam.paletteNum = paletteSlot; + eventObject->inanimate = graphicsInfo->inanimate; + eventObject->graphicsId = graphicsId; + sub_8093038(eventObject->currentCoords.x, eventObject->currentCoords.y, &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; + if (eventObject->trackedByCamera) + { + CameraObjectReset1(); + } +} + +void EventObjectSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + EventObjectSetGraphicsId(&gEventObjects[eventObjectId], graphicsId); + } +} + +void EventObjectTurn(struct EventObject *eventObject, u8 direction) +{ + SetEventObjectDirection(eventObject, direction); + if (!eventObject->inanimate) + { + StartSpriteAnim(&gSprites[eventObject->spriteId], GetFaceDirectionAnimNum(eventObject->facingDirection)); + SeekSpriteAnim(&gSprites[eventObject->spriteId], 0); + } +} + +void EventObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + EventObjectTurn(&gEventObjects[eventObjectId], direction); + } +} + +void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) +{ + EventObjectTurn(&gEventObjects[playerAvatar->eventObjectId], direction); +} + +/*static*/ void get_berry_tree_graphics(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 berryStage; + u8 berryId; + + eventObject->invisible = TRUE; + sprite->invisible = TRUE; + berryStage = GetStageByBerryTreeId(eventObject->trainerRange_berryTreeId); + if (berryStage != 0) + { + eventObject->invisible = FALSE; + sprite->invisible = FALSE; + berryId = GetBerryTypeByBerryTreeId(eventObject->trainerRange_berryTreeId) - 1; + berryStage -= 1; + if (berryId >= NUM_BERRIES) + { + berryId = 0; + } + EventObjectSetGraphicsId(eventObject, gBerryTreeEventObjectGraphicsIdTablePointers[berryId][berryStage]); + sprite->images = gBerryTreePicTablePointers[berryId]; + sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[berryId][berryStage]; + StartSpriteAnim(sprite, berryStage); + } +} + +const struct EventObjectGraphicsInfo *GetEventObjectGraphicsInfo(u8 graphicsId) +{ + u8 bard; + + if (graphicsId >= SPRITE_VAR) + { + graphicsId = VarGetEventObjectGraphicsId(graphicsId - SPRITE_VAR); + } + if (graphicsId == 0x45) + { + bard = GetCurrentMauvilleOldMan(); + return gMauvilleOldManGraphicsInfoPointers[bard]; + } + if (graphicsId >= NUM_OBJECT_GRAPHICS_INFO) + { + graphicsId = 0x05; // LittleBoy1 + } + return gEventObjectGraphicsInfoPointers[graphicsId]; +} + +static void SetEventObjectDynamicGraphicsId(struct EventObject *eventObject) +{ + if (eventObject->graphicsId >= SPRITE_VAR) + { + eventObject->graphicsId = VarGetEventObjectGraphicsId(eventObject->graphicsId - SPRITE_VAR); + } +} + +void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 state) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + gEventObjects[eventObjectId].invisible = state; + } +} + +void EventObjectGetLocalIdAndMap(struct EventObject *eventObject, void *localId, void *mapNum, void *mapGroup) +{ + *(u8*)(localId) = eventObject->localId; + *(u8*)(mapNum) = eventObject->mapNum; + *(u8*)(mapGroup) = eventObject->mapGroup; +} + +void sub_808E75C(s16 x, s16 y) +{ + u8 eventObjectId; + struct EventObject *eventObject; + + eventObjectId = GetEventObjectIdByXY(x, y); + if (eventObjectId != NUM_EVENT_OBJECTS) + { + eventObject = &gEventObjects[eventObjectId]; + eventObject->triggerGroundEffectsOnMove = TRUE; + } +} + +void sub_808E78C(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) +{ + u8 eventObjectId; + struct EventObject *eventObject; + struct Sprite *sprite; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + eventObject = &gEventObjects[eventObjectId]; + sprite = &gSprites[eventObject->spriteId]; + eventObject->fixedPriority = TRUE; + sprite->subpriority = subpriority; + } +} + +void sub_808E7E4(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + struct EventObject *eventObject; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + eventObject = &gEventObjects[eventObjectId]; + eventObject->fixedPriority = FALSE; + eventObject->triggerGroundEffectsOnMove = TRUE; + } +} + +void sub_808E82C(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 eventObjectId; + struct Sprite *sprite; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + sprite = &gSprites[gEventObjects[eventObjectId].spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + } +} + +void gpu_pal_allocator_reset__manage_upper_four(void) +{ + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 12; +} + +static void sub_808E894(u16 paletteTag) +{ + u16 paletteSlot; + + paletteSlot = FindEventObjectPaletteIndexByTag(paletteTag); + if (paletteSlot != 0x11ff) // always true + { + sub_808E8F4(&gUnknown_0850BBC8[paletteSlot]); + } +} + +void sub_808E8C0(u16 *paletteTags) +{ + u8 i; + + for (i = 0; paletteTags[i] != 0x11ff; i++) + { + sub_808E894(paletteTags[i]); + } +} + +static u8 sub_808E8F4(const struct SpritePalette *spritePalette) +{ + if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xff) + { + return 0xff; + } + return LoadSpritePalette(spritePalette); +} + +void pal_patch_for_npc(u16 paletteTag, u8 paletteSlot) +{ + u16 paletteIdx; + + paletteIdx = FindEventObjectPaletteIndexByTag(paletteTag); + LoadPalette(gUnknown_0850BBC8[paletteIdx].data, 16 * paletteSlot + 256, 0x20); +} + +void pal_patch_for_npc_range(const u16 *paletteTags, u8 minSlot, u8 maxSlot) +{ + while (minSlot < maxSlot) + { + pal_patch_for_npc(*paletteTags, minSlot); + paletteTags++; + minSlot++; + } +} + +static u8 FindEventObjectPaletteIndexByTag(u16 tag) +{ + u8 i; + + for (i = 0; gUnknown_0850BBC8[i].tag != 0x11ff; i++) + { + if (gUnknown_0850BBC8[i].tag == tag) + { + return i; + } + } + return 0xff; +} + +void npc_load_two_palettes__no_record(u16 tag, u8 slot) +{ + u8 i; + + pal_patch_for_npc(tag, slot); + for (i = 0; gUnknown_0850BD00[i].tag != 0x11ff; i++) + { + if (gUnknown_0850BD00[i].tag == tag) + { + pal_patch_for_npc(gUnknown_0850BD00[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]); + return; + } + } +} + +void npc_load_two_palettes__and_record(u16 tag, u8 slot) +{ + u8 i; + + gUnknown_020375B6 = tag; + pal_patch_for_npc(tag, slot); + for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i++) + { + if (gUnknown_0850BD78[i].tag == tag) + { + pal_patch_for_npc(gUnknown_0850BD78[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]); + return; + } + } +} + +static void sub_808EAB0(u16 tag, u8 slot) +{ + pal_patch_for_npc(tag, slot); +} + +void unref_sub_808EAC4(struct EventObject *eventObject, s16 x, s16 y) +{ + eventObject->previousCoords.x = eventObject->currentCoords.x; + eventObject->previousCoords.y = eventObject->currentCoords.y; + eventObject->currentCoords.x += x; + eventObject->currentCoords.y += y; +} + +void ShiftEventObjectCoords(struct EventObject *eventObject, s16 x, s16 y) +{ + eventObject->previousCoords.x = eventObject->currentCoords.x; + eventObject->previousCoords.y = eventObject->currentCoords.y; + eventObject->currentCoords.x = x; + eventObject->currentCoords.y = y; +} + +/*static*/ void npc_coords_set(struct EventObject *eventObject, s16 x, s16 y) +{ + eventObject->previousCoords.x = x; + eventObject->previousCoords.y = y; + eventObject->currentCoords.x = x; + eventObject->currentCoords.y = y; +} + +void sub_808EB08(struct EventObject *eventObject, s16 x, s16 y) +{ + struct Sprite *sprite; + const struct EventObjectGraphicsInfo *graphicsInfo; + + sprite = &gSprites[eventObject->spriteId]; + graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); + npc_coords_set(eventObject, x, y); + sub_8093038(eventObject->currentCoords.x, eventObject->currentCoords.y, &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; + sub_808E38C(eventObject); + if (eventObject->trackedByCamera) + { + CameraObjectReset1(); + } +} + +void sub_808EBA8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + x += 7; + y += 7; + sub_808EB08(&gEventObjects[eventObjectId], x, y); + } +} + +void ShiftStillEventObjectCoords(struct EventObject *eventObject) +{ + ShiftEventObjectCoords(eventObject, eventObject->currentCoords.x, eventObject->currentCoords.y); +} + +void UpdateEventObjectCoordsForCameraUpdate(void) +{ + u8 i; + s16 dx; + s16 dy; + + if (gCamera.active) + { + dx = gCamera.x; + dy = gCamera.y; + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (gEventObjects[i].active) + { + gEventObjects[i].initialCoords.x -= dx; + gEventObjects[i].initialCoords.y -= dy; + gEventObjects[i].currentCoords.x -= dx; + gEventObjects[i].currentCoords.y -= dy; + gEventObjects[i].previousCoords.x -= dx; + gEventObjects[i].previousCoords.y -= dy; + } + } + } +} + +u8 GetEventObjectIdByXYZ(u16 x, u16 y, u8 z) +{ + u8 i; + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + if (gEventObjects[i].active) + { + if (gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y && EventObjectDoesZCoordMatch(&gEventObjects[i], z)) + { + return i; + } + } + } + return NUM_EVENT_OBJECTS; +} + +static bool8 EventObjectDoesZCoordMatch(struct EventObject *eventObject, u8 z) +{ + if (eventObject->currentElevation != 0 && z != 0 && eventObject->currentElevation != z) + { + return FALSE; + } + return TRUE; +} + +void UpdateEventObjectsForCameraUpdate(s16 x, s16 y) +{ + UpdateEventObjectCoordsForCameraUpdate(); + TrySpawnEventObjects(x, y); + RemoveEventObjectsOutsideView(); +} + +u8 AddCameraObject(u8 linkedSpriteId) +{ + u8 spriteId; + + spriteId = CreateSprite(&gCameraSpriteTemplate, 0, 0, 4); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].data[0] = linkedSpriteId; + return spriteId; +} + +static void ObjectCB_CameraObject(struct Sprite *sprite) +{ + void (*callbacks[ARRAY_COUNT(gCameraObjectFuncs)])(struct Sprite *); + + memcpy(callbacks, gCameraObjectFuncs, sizeof gCameraObjectFuncs); + callbacks[sprite->data[1]](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->invisible = TRUE; + sprite->data[1] = 1; + CameraObject_1(sprite); +} + +static void CameraObject_1(struct Sprite *sprite) +{ + s16 x; + s16 y; + + y = gSprites[sprite->data[0]].pos1.y; + x = gSprites[sprite->data[0]].pos1.x; + sprite->data[2] = x - sprite->pos1.x; + sprite->data[3] = y - sprite->pos1.y; + sprite->pos1.x = x; + sprite->pos1.y = y; +} + +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->data[2] = 0; + sprite->data[3] = 0; +} + +static struct Sprite *FindCameraObject(void) +{ + u8 spriteId; + + for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++) + { + if (gSprites[spriteId].inUse && gSprites[spriteId].callback == ObjectCB_CameraObject) + { + return &gSprites[spriteId]; + } + } + return NULL; +} + +void CameraObjectReset1(void) +{ + struct Sprite *cameraObject; + + cameraObject = FindCameraObject(); + if (cameraObject != NULL) + { + cameraObject->data[1] = 0; + cameraObject->callback(cameraObject); + } +} + +void CameraObjectSetFollowedObjectId(u8 objectId) +{ + struct Sprite *cameraObject; + + cameraObject = FindCameraObject(); + if (cameraObject != NULL) + { + cameraObject->data[0] = objectId; + CameraObjectReset1(); + } +} + +u8 CameraObjectGetFollowedObjectId(void) +{ + struct Sprite *cameraObject; + + cameraObject = FindCameraObject(); + if (cameraObject == NULL) + { + return MAX_SPRITES; + } + return cameraObject->data[0]; +} + +void CameraObjectReset2(void) +{ + FindCameraObject()->data[1] = 2; +} + +u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) +{ + u8 i; + + for (i = 0; i < MAX_SPRITES; i++) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *sprite; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + break; + } + } + return i; +} + +u8 obj_unfreeze(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) +{ + s16 i; + + for (i = MAX_SPRITES - 1; i > -1; i --) + { + if (!gSprites[i].inUse) + { + gSprites[i] = *sprite; + gSprites[i].pos1.x = x; + gSprites[i].pos1.y = y; + gSprites[i].subpriority = subpriority; + return i; + } + } + return MAX_SPRITES; +} + +void SetEventObjectDirection(struct EventObject *eventObject, u8 direction) +{ + s8 d2; + eventObject->previousMovementDirection = eventObject->facingDirection; + if (!eventObject->facingDirectionLocked) + { + d2 = direction; + eventObject->facingDirection = d2; + } + eventObject->movementDirection = direction; +} + +static const u8 *GetEventObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + return GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; +} + +const u8 *GetEventObjectScriptPointerByEventObjectId(u8 eventObjectId) +{ + return GetEventObjectScriptPointerByLocalIdAndMap(gEventObjects[eventObjectId].localId, gEventObjects[eventObjectId].mapNum, gEventObjects[eventObjectId].mapGroup); +} + +static u16 GetEventObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + return GetEventObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->flagId; +} + +static u16 GetEventObjectFlagIdByEventObjectId(u8 eventObjectId) +{ + return GetEventObjectFlagIdByLocalIdAndMap(gEventObjects[eventObjectId].localId, gEventObjects[eventObjectId].mapNum, gEventObjects[eventObjectId].mapGroup); +} + +u8 sub_808F080(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + + if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + return 0xFF; + } + return gEventObjects[eventObjectId].trainerType; +} + +u8 sub_808F0BC(u8 eventObjectId) +{ + return gEventObjects[eventObjectId].trainerType; +} + +u8 sub_808F0D4(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + + if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + return 0xFF; + } + return gEventObjects[eventObjectId].trainerRange_berryTreeId; +} + +u8 EventObjectGetBerryTreeId(u8 eventObjectId) +{ + return gEventObjects[eventObjectId].trainerRange_berryTreeId; +} + +static struct EventObjectTemplate *GetEventObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) +{ + struct EventObjectTemplate *templates; + const struct MapHeader *mapHeader; + u8 count; + + if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup) + { + templates = gSaveBlock1Ptr->eventObjectTemplates; + count = gMapHeader.events->eventObjectCount; + } + else + { + mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); + templates = mapHeader->events->eventObjects; + count = mapHeader->events->eventObjectCount; + } + return FindEventObjectTemplateByLocalId(localId, templates, count); +} + +static struct EventObjectTemplate *FindEventObjectTemplateByLocalId(u8 localId, struct EventObjectTemplate *templates, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + if (templates[i].localId == localId) + { + return &templates[i]; + } + } + return NULL; +} + +struct EventObjectTemplate *GetBaseTemplateForEventObject(const struct EventObject *eventObject) +{ + int i; + + if (eventObject->mapNum != gSaveBlock1Ptr->location.mapNum || eventObject->mapGroup != gSaveBlock1Ptr->location.mapGroup) + { + return NULL; + } + for (i = 0; i < 64; i++) // Using ARRAY_COUNT here results in the wrong conditional branch instruction (bls instead of ble) + { + if (eventObject->localId == gSaveBlock1Ptr->eventObjectTemplates[i].localId) + { + return &gSaveBlock1Ptr->eventObjectTemplates[i]; + } + } + return NULL; +} + +void OverrideTemplateCoordsForEventObject(const struct EventObject *eventObject) +{ + struct EventObjectTemplate *eventObjectTemplate; + + eventObjectTemplate = GetBaseTemplateForEventObject(eventObject); + if (eventObjectTemplate != NULL) + { + eventObjectTemplate->x = eventObject->currentCoords.x - 7; + eventObjectTemplate->y = eventObject->currentCoords.y - 7; + } +} + +void OverrideMovementTypeForEventObject(const struct EventObject *eventObject, const u8 *script) +{ + struct EventObjectTemplate *eventObjectTemplate; + + eventObjectTemplate = GetBaseTemplateForEventObject(eventObject); + if (eventObjectTemplate != NULL) + { + eventObjectTemplate->script = script; + } +} + +void TryOverrideTemplateCoordsForEventObject(const struct EventObject *eventObject, u8 movementType) +{ + struct EventObjectTemplate *eventObjectTemplate; + + eventObjectTemplate = GetBaseTemplateForEventObject(eventObject); + if (eventObjectTemplate != NULL) + { + eventObjectTemplate->movementType = movementType; + } +} + +void sub_808F254(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + OverrideTemplateCoordsForEventObject(&gEventObjects[eventObjectId]); + } +} + +void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + switch (decorCat) + { + case DECORCAT_DOLL: + OverrideMovementTypeForEventObject(&gEventObjects[eventObjectId], EventScript_2766A2); + break; + case DECORCAT_CUSHION: + OverrideMovementTypeForEventObject(&gEventObjects[eventObjectId], EventScript_2766A6); + break; + } + } +} + +void npc_paltag_set_load(u8 palSlot) +{ + gpu_pal_allocator_reset__manage_upper_four(); + gUnknown_020375B6 = 0x11ff; + gUnknown_020375B4 = palSlot; + if (palSlot == 1) + { + pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 6); + gReservedSpritePaletteCount = 8; + } + else + { + pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 10); + } +} + +u16 npc_paltag_by_palslot(u8 palSlot) +{ + u8 i; + + if (palSlot < 10) + { + return gUnknown_0850BE38[gUnknown_020375B4][palSlot]; + } + for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i++) + { + if (gUnknown_0850BD78[i].tag == gUnknown_020375B6) + { + return gUnknown_0850BD78[i].data[gUnknown_020375B4]; + } + } + return 0x11ff; +} + +movement_type_empty_callback(MovementType_None) +movement_type_def(MovementType_WanderAround, gMovementTypeFuncs_WanderAround) + +bool8 MovementType_WanderAround_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_WanderAround_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_WanderAround_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (!EventObjectExecSingleMovementAction(eventObject, sprite)) + { + return FALSE; + } + SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); + sprite->data[1] = 3; + return TRUE; +} + +bool8 MovementType_WanderAround_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_WanderAround_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[4]; + u8 chosenDirection; + + memcpy(directions, gStandardDirections, sizeof directions); + chosenDirection = directions[Random() & 3]; + SetEventObjectDirection(eventObject, chosenDirection); + sprite->data[1] = 5; + if (GetCollisionInDirection(eventObject, chosenDirection)) + { + sprite->data[1] = 1; + } + return TRUE; +} + +bool8 MovementType_WanderAround_Step5(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(eventObject->movementDirection)); + eventObject->singleMovementActive = 1; + sprite->data[1] = 6; + return TRUE; +} + +bool8 MovementType_WanderAround_Step6(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + eventObject->singleMovementActive = 0; + sprite->data[1] = 1; + } + return FALSE; +} + +bool8 EventObjectIsTrainerAndCloseToPlayer(struct EventObject *eventObject) +{ + s16 playerX; + s16 playerY; + s16 objX; + s16 objY; + s16 minX; + s16 maxX; + s16 minY; + s16 maxY; + + if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_DASH)) + { + return FALSE; + } + if (eventObject->trainerType != 1 && eventObject->trainerType != 3) + { + return FALSE; + } + PlayerGetDestCoords(&playerX, &playerY); + objX = eventObject->currentCoords.x; + objY = eventObject->currentCoords.y; + minX = objX - eventObject->trainerRange_berryTreeId; + minY = objY - eventObject->trainerRange_berryTreeId; + maxX = objX + eventObject->trainerRange_berryTreeId; + maxY = objY + eventObject->trainerRange_berryTreeId; + if (minX > playerX || maxX < playerX || minY > playerY || maxY < playerY) + { + return FALSE; + } + return TRUE; +} + +u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + if (absdx > absdy) + { + direction = DIR_EAST; + if (dx < 0) + { + direction = DIR_WEST; + } + } + else + { + direction = DIR_SOUTH; + if (dy < 0) + { + direction = DIR_NORTH; + } + } + return direction; +} + +u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = DIR_SOUTH; + if (dy < 0) + { + direction = DIR_NORTH; + } + return direction; +} + +u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = DIR_EAST; + if (dx < 0) + { + direction = DIR_WEST; + } + return direction; +} + +u8 GetLimitedVectorDirection_WestNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_SOUTH) + { + 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; +} + +u8 GetLimitedVectorDirection_EastNorth(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_SOUTH) + { + 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; +} + +u8 GetLimitedVectorDirection_WestSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_NORTH) + { + 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; +} + +u8 GetLimitedVectorDirection_EastSouth(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_NORTH) + { + 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; +} + +u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_EAST) + { + direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); + } + return direction; +} + +u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_WEST) + { + direction = GetLimitedVectorDirection_SouthNorth(dx, dy, absdx, absdy); + } + return direction; +} + +u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_SOUTH) + { + direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); + } + return direction; +} + +u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy) +{ + u8 direction; + + direction = GetVectorDirection(dx, dy, absdx, absdy); + if (direction == DIR_NORTH) + { + direction = GetLimitedVectorDirection_WestEast(dx, dy, absdx, absdy); + } + return direction; +} + +u8 TryGetTrainerEncounterDirection(struct EventObject *eventObject, u8 movementType) +{ + s16 dx; + s16 dy; + s16 absdx; + s16 absdy; + + if (!EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + return 0; + } + PlayerGetDestCoords(&dx, &dy); + dx -= eventObject->currentCoords.x; + dy -= eventObject->currentCoords.y; + absdx = dx; + absdy = dy; + if (absdx < 0) + { + absdx = -absdx; + } + if (absdy < 0) + { + absdy = -absdy; + } + return gGetVectorDirectionFuncs[movementType](dx, dy, absdx, absdy); +} + +movement_type_def(MovementType_LookAround, gMovementTypeFuncs_LookAround) + +bool8 MovementType_LookAround_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_LookAround_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_LookAround_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_LookAround_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_LookAround_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gStandardDirections, sizeof directions); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_ANY); + if (direction == DIR_NONE) + direction = directions[Random() & 3]; + + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_WanderUpAndDown, gMovementTypeFuncs_WanderUpAndDown) + +bool8 MovementType_WanderUpAndDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_WanderUpAndDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_WanderUpAndDown_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (!EventObjectExecSingleMovementAction(eventObject, sprite)) + { + return FALSE; + } + SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); + sprite->data[1] = 3; + return TRUE; +} + +bool8 MovementType_WanderUpAndDown_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_WanderUpAndDown_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUpAndDownDirections, sizeof directions); + direction = directions[Random() & 1]; + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 5; + if (GetCollisionInDirection(eventObject, direction)) + { + sprite->data[1] = 1; + } + return TRUE; +} + +bool8 MovementType_WanderUpAndDown_Step5(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(eventObject->movementDirection)); + eventObject->singleMovementActive = 1; + sprite->data[1] = 6; + return TRUE; +} + +bool8 MovementType_WanderUpAndDown_Step6(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + eventObject->singleMovementActive = 0; + sprite->data[1] = 1; + } + return FALSE; +} + +movement_type_def(MovementType_WanderLeftAndRight, gMovementTypeFuncs_WanderLeftAndRight) + +bool8 MovementType_WanderLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_WanderLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_WanderLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (!EventObjectExecSingleMovementAction(eventObject, sprite)) + { + return FALSE; + } + SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); + sprite->data[1] = 3; + return TRUE; +} + +bool8 MovementType_WanderLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_WanderLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gLeftAndRightDirections, sizeof directions); + direction = directions[Random() & 1]; + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 5; + if (GetCollisionInDirection(eventObject, direction)) + { + sprite->data[1] = 1; + } + return TRUE; +} + +bool8 MovementType_WanderLeftAndRight_Step5(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(eventObject->movementDirection)); + eventObject->singleMovementActive = 1; + sprite->data[1] = 6; + return TRUE; +} + +bool8 MovementType_WanderLeftAndRight_Step6(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + eventObject->singleMovementActive = 0; + sprite->data[1] = 1; + } + return FALSE; +} + +movement_type_def(MovementType_FaceDirection, gMovementTypeFuncs_FaceDirection) + +bool8 MovementType_FaceDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDirection_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + sprite->data[1] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDirection_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->singleMovementActive = 0; + return FALSE; +} + +static bool8 EventObjectCB2_BerryTree(struct EventObject *eventObject, struct Sprite *sprite); +extern bool8 (*const gMovementTypeFuncs_BerryTreeGrowth[])(struct EventObject *eventObject, struct Sprite *sprite); +void MovementType_BerryTreeGrowth(struct Sprite *sprite) +{ + struct EventObject *eventObject; + + eventObject = &gEventObjects[sprite->data[0]]; + if (!(sprite->data[7] & 1)) + { + get_berry_tree_graphics(eventObject, sprite); + sprite->data[7] |= 1; + } + UpdateEventObjectCurrentMovement(eventObject, sprite, EventObjectCB2_BerryTree); +} +static bool8 EventObjectCB2_BerryTree(struct EventObject *eventObject, struct Sprite *sprite) +{ + return gMovementTypeFuncs_BerryTreeGrowth[sprite->data[1]](eventObject, sprite); +} + +bool8 MovementType_BerryTreeGrowth_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 berryStage; + ClearEventObjectMovement(eventObject, sprite); + eventObject->invisible = TRUE; + sprite->invisible = TRUE; + berryStage = GetStageByBerryTreeId(eventObject->trainerRange_berryTreeId); + if (berryStage == 0) + { + if (!(sprite->data[7] & 4) && sprite->animNum == 4) + { + gFieldEffectArguments[0] = eventObject->currentCoords.x; + gFieldEffectArguments[1] = eventObject->currentCoords.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + sprite->animNum = berryStage; + } + return FALSE; + } + eventObject->invisible = FALSE; + sprite->invisible = FALSE; + berryStage --; + if (sprite->animNum != berryStage) + { + sprite->data[1] = 2; + return TRUE; + } + get_berry_tree_graphics(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, MOVEMENT_ACTION_START_ANIM_IN_DIRECTION); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_BerryTreeGrowth_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + sprite->data[1] = 0; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_BerryTreeGrowth_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->singleMovementActive = 1; + sprite->data[1] = 3; + sprite->data[2] = 0; + sprite->data[7] |= 2; + gFieldEffectArguments[0] = eventObject->currentCoords.x; + gFieldEffectArguments[1] = eventObject->currentCoords.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); + return TRUE; +} + +bool8 MovementType_BerryTreeGrowth_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->data[2]++; + eventObject->invisible = (sprite->data[2] & 0x02) >> 1; + sprite->animPaused = TRUE; + if (sprite->data[2] > 64) + { + get_berry_tree_graphics(eventObject, sprite); + sprite->data[1] = 4; + sprite->data[2] = 0; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_BerryTreeGrowth_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->data[2]++; + eventObject->invisible = (sprite->data[2] & 0x02) >> 1; + sprite->animPaused = TRUE; + if (sprite->data[2] > 64) + { + sprite->data[1] = 0; + sprite->data[7] &= ~0x0002; + return TRUE; + } + return FALSE; +} + +movement_type_def(MovementType_FaceDownAndUp, gMovementTypeFuncs_FaceDownAndUp) + +bool8 MovementType_FaceDownAndUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDownAndUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceDownAndUp_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceDownAndUp_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDownAndUp_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUpAndDownDirections, sizeof gUpAndDownDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_SOUTH); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceLeftAndRight, gMovementTypeFuncs_FaceLeftAndRight) + +bool8 MovementType_FaceLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysMedium[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gLeftAndRightDirections, sizeof gLeftAndRightDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_EAST_WEST); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceUpAndLeft, gMovementTypeFuncs_FaceUpAndLeft) + +bool8 MovementType_FaceUpAndLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceUpAndLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceUpAndLeft_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceUpAndLeft_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceUpAndLeft_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUpAndLeftDirections, sizeof gUpAndLeftDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_WEST); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceUpAndRight, gMovementTypeFuncs_FaceUpAndRight) + +bool8 MovementType_FaceUpAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceUpAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceUpAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceUpAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceUpAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gUpAndRightDirections, sizeof gUpAndRightDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_EAST); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceDownAndLeft, gMovementTypeFuncs_FaceDownAndLeft) + +bool8 MovementType_FaceDownAndLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDownAndLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceDownAndLeft_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceDownAndLeft_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDownAndLeft_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gDownAndLeftDirections, sizeof gDownAndLeftDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_SOUTH_WEST); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceDownAndRight, gMovementTypeFuncs_FaceDownAndRight) + +bool8 MovementType_FaceDownAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDownAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceDownAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceDownAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDownAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[2]; + memcpy(directions, gDownAndRightDirections, sizeof gDownAndRightDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_SOUTH_EAST); + if (direction == 0) + { + direction = directions[Random() & 1]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceDownUpAndLeft, gMovementTypeFuncs_FaceDownUpAndLeft) + +bool8 MovementType_FaceDownUpAndLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDownUpAndLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceDownUpAndLeft_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceDownUpAndLeft_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDownUpAndLeft_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gDownUpAndLeftDirections, sizeof gDownUpAndLeftDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_SOUTH_WEST); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceDownUpAndRight, gMovementTypeFuncs_FaceDownUpAndRight) + +bool8 MovementType_FaceDownUpAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDownUpAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceDownUpAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceDownUpAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDownUpAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gDownUpAndRightDirections, sizeof gDownUpAndRightDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_SOUTH_EAST); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceUpRightAndLeft, gMovementTypeFuncs_FaceUpLeftAndRight) + +bool8 MovementType_FaceUpLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceUpLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceUpLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceUpLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceUpLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gUpLeftAndRightDirections, sizeof gUpLeftAndRightDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_NORTH_EAST_WEST); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_FaceDownRightAndLeft, gMovementTypeFuncs_FaceDownLeftAndRight) + +bool8 MovementType_FaceDownLeftAndRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_FaceDownLeftAndRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_FaceDownLeftAndRight_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, gMovementDelaysShort[Random() & 3]); + eventObject->singleMovementActive = 0; + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_FaceDownLeftAndRight_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 4; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_FaceDownLeftAndRight_Step4(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[4]; + memcpy(directions, gDownLeftAndRightDirections, sizeof gDownLeftAndRightDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_SOUTH_EAST_WEST); + if (direction == 0) + { + direction = directions[Random() & 3]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_RotateCounterclockwise, gMovementTypeFuncs_RotateCounterclockwise) + +bool8 MovementType_RotateCounterclockwise_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_RotateCounterclockwise_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, 48); + sprite->data[1] = 2; + } + return FALSE; +} + +bool8 MovementType_RotateCounterclockwise_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_RotateCounterclockwise_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gCounterclockwiseDirections, sizeof gCounterclockwiseDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_ANY); + if (direction == 0) + { + direction = directions[eventObject->facingDirection]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 0; + return TRUE; +} + +movement_type_def(MovementType_RotateClockwise, gMovementTypeFuncs_RotateClockwise) + +bool8 MovementType_RotateClockwise_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_RotateClockwise_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + SetMovementDelay(sprite, 48); + sprite->data[1] = 2; + } + return FALSE; +} + +bool8 MovementType_RotateClockwise_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (WaitForMovementDelay(sprite) || EventObjectIsTrainerAndCloseToPlayer(eventObject)) + { + sprite->data[1] = 3; + } + return FALSE; +} + +bool8 MovementType_RotateClockwise_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + u8 directions[5]; + memcpy(directions, gClockwiseDirections, sizeof gClockwiseDirections); + direction = TryGetTrainerEncounterDirection(eventObject, RUNFOLLOW_ANY); + if (direction == 0) + { + direction = directions[eventObject->facingDirection]; + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 0; + return TRUE; +} + +movement_type_def(MovementType_WalkBackAndForth, gMovementTypeFuncs_WalkBackAndForth) + +bool8 MovementType_WalkBackAndForth_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_WalkBackAndForth_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 direction; + + direction = gInitialMovementTypeFacingDirections[eventObject->movementType]; + if (eventObject->directionSequenceIndex) + { + direction = GetOppositeDirection(direction); + } + SetEventObjectDirection(eventObject, direction); + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_WalkBackAndForth_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + bool8 collisionState; + u8 movementActionId; + + if (eventObject->directionSequenceIndex && eventObject->initialCoords.x == eventObject->currentCoords.x && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 0; + SetEventObjectDirection(eventObject, GetOppositeDirection(eventObject->movementDirection)); + } + collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection); + movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection); + if (collisionState == TRUE) + { + eventObject->directionSequenceIndex++; + SetEventObjectDirection(eventObject, GetOppositeDirection(eventObject->movementDirection)); + movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection); + collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection); + } + if (collisionState) + { + movementActionId = GetWalkInPlaceNormalMovementAction(eventObject->facingDirection); + } + EventObjectSetSingleMovement(eventObject, sprite, movementActionId); + eventObject->singleMovementActive = 1; + sprite->data[1] = 3; + return TRUE; +} + +bool8 MovementType_WalkBackAndForth_Step3(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + eventObject->singleMovementActive = 0; + sprite->data[1] = 1; + } + return FALSE; +} + +bool8 MovementType_WalkSequence_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + sprite->data[1] = 1; + return TRUE; +} + +bool8 MoveNextDirectionInSequence(struct EventObject *eventObject, struct Sprite *sprite, u8 *route) +{ + u8 collisionState; + u8 movementActionId; + + if (eventObject->directionSequenceIndex == 3 && eventObject->initialCoords.x == eventObject->currentCoords.x && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 0; + } + SetEventObjectDirection(eventObject, route[eventObject->directionSequenceIndex]); + movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection); + collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection); + if (collisionState == TRUE) + { + eventObject->directionSequenceIndex++; + SetEventObjectDirection(eventObject, route[eventObject->directionSequenceIndex]); + movementActionId = GetWalkNormalMovementAction(eventObject->movementDirection); + collisionState = GetCollisionInDirection(eventObject, eventObject->movementDirection); + } + if (collisionState) + { + movementActionId = GetWalkInPlaceNormalMovementAction(eventObject->facingDirection); + } + EventObjectSetSingleMovement(eventObject, sprite, movementActionId); + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 MovementType_WalkSequence_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + eventObject->singleMovementActive = 0; + sprite->data[1] = 1; + } + return FALSE; +} + +movement_type_def(MovementType_WalkSequenceUpRightLeftDown, gMovementTypeFuncs_WalkSequenceUpRightLeftDown) + +u8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gUpRightLeftDownDirections)]; + memcpy(directions, gUpRightLeftDownDirections, sizeof(gUpRightLeftDownDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceRightLeftDownUp, gMovementTypeFuncs_WalkSequenceRightLeftDownUp) + +u8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gRightLeftDownUpDirections)]; + memcpy(directions, gRightLeftDownUpDirections, sizeof(gRightLeftDownUpDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceDownUpRightLeft, gMovementTypeFuncs_WalkSequenceDownUpRightLeft) + +u8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gDownUpRightLeftDirections)]; + memcpy(directions, gDownUpRightLeftDirections, sizeof(gDownUpRightLeftDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceLeftDownUpRight, gMovementTypeFuncs_WalkSequenceLeftDownUpRight) + +u8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gLeftDownUpRightDirections)]; + memcpy(directions, gLeftDownUpRightDirections, sizeof(gLeftDownUpRightDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceUpLeftRightDown, gMovementTypeFuncs_WalkSequenceUpLeftRightDown) + +u8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gUpLeftRightDownDirections)]; + memcpy(directions, gUpLeftRightDownDirections, sizeof(gUpLeftRightDownDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceLeftRightDownUp, gMovementTypeFuncs_WalkSequenceLeftRightDownUp) + +u8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gLeftRightDownUpDirections)]; + memcpy(directions, gLeftRightDownUpDirections, sizeof(gLeftRightDownUpDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceDownUpLeftRight, gMovementTypeFuncs_WalkSequenceDownUpLeftRight) + +u8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gStandardDirections)]; + memcpy(directions, gStandardDirections, sizeof(gStandardDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceRightDownUpLeft, gMovementTypeFuncs_WalkSequenceRightDownUpLeft) + +u8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gRightDownUpLeftDirections)]; + memcpy(directions, gRightDownUpLeftDirections, sizeof(gRightDownUpLeftDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceLeftUpDownRight, gMovementTypeFuncs_WalkSequenceLeftUpDownRight) + +u8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gLeftUpDownRightDirections)]; + memcpy(directions, gLeftUpDownRightDirections, sizeof(gLeftUpDownRightDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceUpDownRightLeft, gMovementTypeFuncs_WalkSequenceUpDownRightLeft) + +u8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gUpDownRightLeftDirections)]; + memcpy(directions, gUpDownRightLeftDirections, sizeof(gUpDownRightLeftDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceRightLeftUpDown, gMovementTypeFuncs_WalkSequenceRightLeftUpDown) + +u8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gRightLeftUpDownDirections)]; + memcpy(directions, gRightLeftUpDownDirections, sizeof(gRightLeftUpDownDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceDownRightLeftUp, gMovementTypeFuncs_WalkSequenceDownRightLeftUp) + +u8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gDownRightLeftUpDirections)]; + memcpy(directions, gDownRightLeftUpDirections, sizeof(gDownRightLeftUpDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceRightUpDownLeft, gMovementTypeFuncs_WalkSequenceRightUpDownLeft) + +u8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gRightUpDownLeftDirections)]; + memcpy(directions, gRightUpDownLeftDirections, sizeof(gRightUpDownLeftDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceUpDownLeftRight, gMovementTypeFuncs_WalkSequenceUpDownLeftRight) + +u8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gUpDownLeftRightDirections)]; + memcpy(directions, gUpDownLeftRightDirections, sizeof(gUpDownLeftRightDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceLeftRightUpDown, gMovementTypeFuncs_WalkSequenceLeftRightUpDown) + +u8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gLeftRightUpDownDirections)]; + memcpy(directions, gLeftRightUpDownDirections, sizeof(gLeftRightUpDownDirections)); + if (eventObject->directionSequenceIndex == 1 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 2; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceDownLeftRightUp, gMovementTypeFuncs_WalkSequenceDownLeftRightUp) + +u8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gDownLeftRightUpDirections)]; + memcpy(directions, gDownLeftRightUpDirections, sizeof(gDownLeftRightUpDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceUpLeftDownRight, gMovementTypeFuncs_WalkSequenceUpLeftDownRight) + +u8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gUpLeftDownRightDirections)]; + memcpy(directions, gUpLeftDownRightDirections, sizeof(gUpLeftDownRightDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceDownRightUpLeft, gMovementTypeFuncs_WalkSequenceDownRightUpLeft) + +u8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gDownRightUpLeftDirections)]; + memcpy(directions, gDownRightUpLeftDirections, sizeof(gDownRightUpLeftDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceLeftDownRightUp, gMovementTypeFuncs_WalkSequenceLeftDownRightUp) + +u8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gLeftDownRightUpDirections)]; + memcpy(directions, gLeftDownRightUpDirections, sizeof(gLeftDownRightUpDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceRightUpLeftDown, gMovementTypeFuncs_WalkSequenceRightUpLeftDown) + +u8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gRightUpLeftDownDirections)]; + memcpy(directions, gRightUpLeftDownDirections, sizeof(gRightUpLeftDownDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceUpRightDownLeft, gMovementTypeFuncs_WalkSequenceUpRightDownLeft) + +u8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gUpRightDownLeftDirections)]; + memcpy(directions, gUpRightDownLeftDirections, sizeof(gUpRightDownLeftDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceDownLeftUpRight, gMovementTypeFuncs_WalkSequenceDownLeftUpRight) + +u8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gDownLeftUpRightDirections)]; + memcpy(directions, gDownLeftUpRightDirections, sizeof(gDownLeftUpRightDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.y == eventObject->currentCoords.y) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceLeftUpRightDown, gMovementTypeFuncs_WalkSequenceLeftUpRightDown) + +u8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gLeftUpRightDownDirections)]; + memcpy(directions, gLeftUpRightDownDirections, sizeof(gLeftUpRightDownDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_WalkSequenceRightDownLeftUp, gMovementTypeFuncs_WalkSequenceRightDownLeftUp) + +u8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 directions[sizeof(gRightDownLeftUpDirections)]; + memcpy(directions, gRightDownLeftUpDirections, sizeof(gRightDownLeftUpDirections)); + if (eventObject->directionSequenceIndex == 2 && eventObject->initialCoords.x == eventObject->currentCoords.x) + { + eventObject->directionSequenceIndex = 3; + } + return MoveNextDirectionInSequence(eventObject, sprite, directions); +} + +movement_type_def(MovementType_CopyPlayer, gMovementTypeFuncs_CopyPlayer) + +bool8 MovementType_CopyPlayer_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + if (eventObject->directionSequenceIndex == 0) + { + eventObject->directionSequenceIndex = GetPlayerFacingDirection(); + } + sprite->data[1] = 1; + return TRUE; +} + +bool8 MovementType_CopyPlayer_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (gEventObjects[gPlayerAvatar.eventObjectId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return FALSE; + } + return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](eventObject, sprite, GetPlayerMovementDirection(), NULL); +} + +bool8 MovementType_CopyPlayer_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + eventObject->singleMovementActive = 0; + sprite->data[1] = 1; + } + return FALSE; +} + +bool8 CopyablePlayerMovement_None(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + return FALSE; +} + +bool8 CopyablePlayerMovement_FaceDirection(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, playerDirection))); + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 CopyablePlayerMovement_GoSpeed0(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + if (EventObjectIsFarawayIslandMew(eventObject)) + { + direction = sub_81D427C(); + if (direction == 0) + { + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + EventObjectMoveDestCoords(eventObject, direction, &x, &y); + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; + } + } + else + { + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + } + EventObjectMoveDestCoords(eventObject, direction, &x, &y); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkNormalMovementAction(direction)); + if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) + { + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + } + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 CopyablePlayerMovement_GoSpeed1(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + EventObjectMoveDestCoords(eventObject, direction, &x, &y); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkFastMovementAction(direction)); + if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) + { + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + } + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 CopyablePlayerMovement_GoSpeed2(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + EventObjectMoveDestCoords(eventObject, direction, &x, &y); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkFastestMovementAction(direction)); + if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) + { + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + } + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 CopyablePlayerMovement_Slide(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + EventObjectMoveDestCoords(eventObject, direction, &x, &y); + EventObjectSetSingleMovement(eventObject, sprite, GetSlideMovementAction(direction)); + if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) + { + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + } + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 cph_IM_DIFFERENT(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + EventObjectSetSingleMovement(eventObject, sprite, GetJumpInPlaceMovementAction(direction)); + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 CopyablePlayerMovement_GoSpeed4(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + EventObjectMoveDestCoords(eventObject, direction, &x, &y); + EventObjectSetSingleMovement(eventObject, sprite, GetJumpMovementAction(direction)); + if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) + { + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + } + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +bool8 CopyablePlayerMovement_Jump(struct EventObject *eventObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gInitialMovementTypeFacingDirections[eventObject->movementType], eventObject->directionSequenceIndex, direction); + x = eventObject->currentCoords.x; + y = eventObject->currentCoords.y; + MoveCoordsInDirection(direction, &x, &y, 2, 2); + EventObjectSetSingleMovement(eventObject, sprite, GetJump2MovementAction(direction)); + if (GetCollisionAtCoords(eventObject, x, y, direction) || (tileCallback != NULL && !tileCallback(MapGridGetMetatileBehaviorAt(x, y)))) + { + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(direction)); + } + eventObject->singleMovementActive = 1; + sprite->data[1] = 2; + return TRUE; +} + +movement_type_def(MovementType_CopyPlayerInGrass, gMovementTypeFuncs_CopyPlayerInGrass) + +bool8 MovementType_CopyPlayerInGrass_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (gEventObjects[gPlayerAvatar.eventObjectId].movementActionId == 0xFF || gPlayerAvatar.tileTransitionState == T_TILE_CENTER) + { + return FALSE; + } + return gCopyPlayerMovementFuncs[PlayerGetCopyableMovement()](eventObject, sprite, GetPlayerMovementDirection(), MetatileBehavior_IsPokeGrass); +} + +void MovementType_TreeDisguise(struct Sprite *sprite) +{ + struct EventObject *eventObject; + + eventObject = &gEventObjects[sprite->data[0]]; + if (eventObject->directionSequenceIndex == 0 || (eventObject->directionSequenceIndex == 1 && !sprite->data[7])) + { + EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + eventObject->fieldEffectSpriteId = FieldEffectStart(FLDEFF_TREE_DISGUISE); + eventObject->directionSequenceIndex = 1; + sprite->data[7]++; + } + UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, MovementType_Disguise_Callback); +} + +static bool8 MovementType_Disguise_Callback(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + return FALSE; +} + +void MovementType_MountainDisguise(struct Sprite *sprite) +{ + struct EventObject *eventObject; + + eventObject = &gEventObjects[sprite->data[0]]; + if (eventObject->directionSequenceIndex == 0 || (eventObject->directionSequenceIndex == 1 && !sprite->data[7])) + { + EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + eventObject->fieldEffectSpriteId = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); + eventObject->directionSequenceIndex = 1; + sprite->data[7]++; + } + UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, MovementType_Disguise_Callback); +} + +void MovementType_Hidden(struct Sprite *sprite) +{ + if (!sprite->data[7]) + { + gEventObjects[sprite->data[0]].fixedPriority = TRUE; + sprite->subspriteMode = 2; + sprite->oam.priority = 3; + sprite->data[7]++; + } + UpdateEventObjectCurrentMovement(&gEventObjects[sprite->data[0]], sprite, MovementType_Hidden_Callback); +} + +static bool8 MovementType_Hidden_Callback(struct EventObject *eventObject, struct Sprite *sprite) +{ + return gMovementTypeFuncs_Hidden[sprite->data[1]](eventObject, sprite); +} + +bool8 MovementType_Hidden_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + return FALSE; +} + +bool8 MovementType_MoveInPlace_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + sprite->data[1] = 0; + } + return FALSE; +} + +movement_type_def(MovementType_WalkInPlace, gMovementTypeFuncs_WalkInPlace) + +bool8 MovementType_WalkInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceNormalMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_WalkSlowlyInPlace, gMovementTypeFuncs_WalkSlowlyInPlace) + +bool8 MovementType_WalkSlowlyInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceSlowMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_JogInPlace, gMovementTypeFuncs_JogInPlace) + +bool8 MovementType_JogInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceFastMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_RunInPlace, gMovementTypeFuncs_RunInPlace) + +bool8 MovementType_RunInPlace_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetWalkInPlaceFastestMovementAction(eventObject->facingDirection)); + sprite->data[1] = 1; + return TRUE; +} + +movement_type_def(MovementType_Invisible, gMovementTypeFuncs_Invisible) + +bool8 MovementType_Invisible_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + ClearEventObjectMovement(eventObject, sprite); + EventObjectSetSingleMovement(eventObject, sprite, GetFaceDirectionMovementAction(eventObject->facingDirection)); + eventObject->invisible = TRUE; + sprite->data[1] = 1; + return TRUE; +} +bool8 MovementType_Invisible_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectExecSingleMovementAction(eventObject, sprite)) + { + sprite->data[1] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementType_Invisible_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->singleMovementActive = 0; + return FALSE; +} + +static void ClearEventObjectMovement(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->singleMovementActive = 0; + eventObject->heldMovementActive = FALSE; + eventObject->heldMovementFinished = FALSE; + eventObject->movementActionId = 0xFF; + sprite->data[1] = 0; +} + +u8 GetFaceDirectionAnimNum(u8 direction) +{ + return gFaceDirectionAnimNums[direction]; +} + +u8 GetMoveDirectionAnimNum(u8 direction) +{ + return gMoveDirectionAnimNums[direction]; +} + +u8 GetMoveDirectionFastAnimNum(u8 direction) +{ + return gMoveDirectionFastAnimNums[direction]; +} + +u8 GetMoveDirectionFasterAnimNum(u8 direction) +{ + return gMoveDirectionFasterAnimNums[direction]; +} + +u8 GetMoveDirectionFastestAnimNum(u8 direction) +{ + return gMoveDirectionFastestAnimNums[direction]; +} + +u8 GetJumpSpecialDirectionAnimNum(u8 direction) +{ + return gJumpSpecialDirectionAnimNums[direction]; +} + +u8 GetAcroWheelieDirectionAnimNum(u8 direction) +{ + return gAcroWheelieDirectionAnimNums[direction]; +} + +u8 Unref_GetAnimNums_08375633(u8 direction) +{ + return gUnrefAnimNums_08375633[direction]; +} + +u8 GetAcroEndWheelieDirectionAnimNum(u8 direction) +{ + return gAcroEndWheelieDirectionAnimNums[direction]; +} + +u8 GetAcroUnusedActionDirectionAnimNum(u8 direction) +{ + return gAcroUnusedActionDirectionAnimNums[direction]; +} + +u8 GetAcroWheeliePedalDirectionAnimNum(u8 direction) +{ + return gAcroWheeliePedalDirectionAnimNums[direction]; +} + +u8 GetFishingDirectionAnimNum(u8 direction) +{ + return gFishingDirectionAnimNums[direction]; +} + +u8 GetFishingNoCatchDirectionAnimNum(u8 direction) +{ + return gFishingNoCatchDirectionAnimNums[direction]; +} + +u8 GetFishingBiteDirectionAnimNum(u8 direction) +{ + return gFishingBiteDirectionAnimNums[direction]; +} + +u8 GetRunningDirectionAnimNum(u8 direction) +{ + return gRunningDirectionAnimNums[direction]; +} + +static const struct UnkStruct_085094AC *sub_8092A4C(const union AnimCmd *const *anims) +{ + const struct UnkStruct_085094AC *retval; + + for (retval = gUnknown_085094AC; retval->anims != NULL; retval++) + { + if (retval->anims == anims) + { + return retval; + } + } + return NULL; +} + +void npc_apply_anim_looping(struct EventObject *eventObject, struct Sprite *sprite, u8 animNum) +{ + const struct UnkStruct_085094AC *unk85094AC; + + if (!eventObject->inanimate) + { + sprite->animNum = animNum; + unk85094AC = sub_8092A4C(sprite->anims); + if (unk85094AC != NULL) + { + if (sprite->animCmdIndex == unk85094AC->animPos[0]) + { + sprite->animCmdIndex = unk85094AC->animPos[3]; + } + else if (sprite->animCmdIndex == unk85094AC->animPos[1]) + { + sprite->animCmdIndex = unk85094AC->animPos[2]; + } + } + SeekSpriteAnim(sprite, sprite->animCmdIndex); + } +} + +void obj_npc_animation_step(struct EventObject *eventObject, struct Sprite *sprite, u8 animNum) +{ + const struct UnkStruct_085094AC *unk85094AC; + + if (!eventObject->inanimate) + { + u8 animPos; + + sprite->animNum = animNum; + unk85094AC = sub_8092A4C(sprite->anims); + if (unk85094AC != NULL) + { + animPos = unk85094AC->animPos[1]; + if (sprite->animCmdIndex <= unk85094AC->animPos[0]) + { + animPos = unk85094AC->animPos[0]; + } + SeekSpriteAnim(sprite, animPos); + } + } +} + +// file boundary? + +u8 GetDirectionToFace(s16 x1, s16 y1, s16 x2, s16 y2) +{ + if (x1 > x2) + { + return DIR_WEST; + } + if (x1 < x2) + { + return DIR_EAST; + } + if (y1 > y2) + { + return DIR_NORTH; + } + return DIR_SOUTH; +} + +void SetTrainerMovementType(struct EventObject *eventObject, u8 movementType) +{ + eventObject->movementType = movementType; + eventObject->directionSequenceIndex = 0; + eventObject->playerCopyableMovement = 0; + gSprites[eventObject->spriteId].callback = sMovementTypeCallbacks[movementType]; + gSprites[eventObject->spriteId].data[1] = 0; +} + +u8 GetTrainerFacingDirectionMovementType(u8 direction) +{ + return gTrainerFacingDirectionMovementTypes[direction]; +} + +static u8 GetCollisionInDirection(struct EventObject *eventObject, u8 direction) +{ + s16 x; + s16 y; + x = eventObject->currentCoords.x; + y = eventObject->currentCoords.y; + MoveCoords(direction, &x, &y); + return GetCollisionAtCoords(eventObject, x, y, direction); +} + +u8 GetCollisionAtCoords(struct EventObject *eventObject, s16 x, s16 y, u32 dirn) +{ + u8 direction; + + direction = dirn; + if (IsCoordOutsideEventObjectMovementRange(eventObject, x, y)) + return 1; + else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(eventObject, x, y, direction)) + return 2; + else if (eventObject->trackedByCamera && !CanCameraMoveInDirection(direction)) + return 2; + else if (IsZCoordMismatchAt(eventObject->currentElevation, x, y)) + return 3; + else if (DoesObjectCollideWithObjectAt(eventObject, x, y)) + return 4; + return 0; +} + +u8 GetCollisionFlagsAtCoords(struct EventObject *eventObject, s16 x, s16 y, u8 direction) +{ + u8 flags = 0; + + if (IsCoordOutsideEventObjectMovementRange(eventObject, x, y)) + flags |= 1; + if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(eventObject, x, y, direction) || (eventObject->trackedByCamera && !CanCameraMoveInDirection(direction))) + flags |= 2; + if (IsZCoordMismatchAt(eventObject->currentElevation, x, y)) + flags |= 4; + if (DoesObjectCollideWithObjectAt(eventObject, x, y)) + flags |= 8; + return flags; +} + +static bool8 IsCoordOutsideEventObjectMovementRange(struct EventObject *eventObject, s16 x, s16 y) +{ + s16 left; + s16 right; + s16 top; + s16 bottom; + + if (eventObject->range.as_nybbles.x != 0) + { + left = eventObject->initialCoords.x - eventObject->range.as_nybbles.x; + right = eventObject->initialCoords.x + eventObject->range.as_nybbles.x; + if (left > x || right < x) + { + return TRUE; + } + } + if (eventObject->range.as_nybbles.y != 0) + { + top = eventObject->initialCoords.y - eventObject->range.as_nybbles.y; + bottom = eventObject->initialCoords.y + eventObject->range.as_nybbles.y; + if (top > y || bottom < y) + { + return TRUE; + } + } + return FALSE; +} + +static bool8 IsMetatileDirectionallyImpassable(struct EventObject *eventObject, s16 x, s16 y, u8 direction) +{ + if (gOppositeDirectionBlockedMetatileFuncs[direction - 1](eventObject->currentMetatileBehavior) + || gDirectionBlockedMetatileFuncs[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) + { + return TRUE; + } + return FALSE; +} + +static bool8 DoesObjectCollideWithObjectAt(struct EventObject *eventObject, s16 x, s16 y) +{ + u8 i; + struct EventObject *curObject; + + for (i = 0; i < NUM_EVENT_OBJECTS; i++) + { + curObject = &gEventObjects[i]; + if (curObject->active && curObject != eventObject) + { + if ((curObject->currentCoords.x == x && curObject->currentCoords.y == y) || (curObject->previousCoords.x == x && curObject->previousCoords.y == y)) + { + if (AreZCoordsCompatible(eventObject->currentElevation, curObject->currentElevation)) + { + return TRUE; + } + } + } + } + return FALSE; +} + +bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId) + && gSprites[gEventObjects[eventObjectId].spriteId].data[7] & 2) + { + return TRUE; + } + + return FALSE; +} + +void sub_8092EF0(u8 localId, u8 mapNum, u8 mapGroup) +{ + u8 eventObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjectId)) + { + gSprites[gEventObjects[eventObjectId].spriteId].data[7] |= 0x04; + } +} + +void MoveCoords(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVectors[direction].x; + *y += gDirectionToVectors[direction].y; +} + +void sub_8092F60(u8 direction, s16 *x, s16 *y) +{ + *x += gDirectionToVectors[direction].x << 4; + *y += gDirectionToVectors[direction].y << 4; +} + +static void MoveCoordsInDirection(u32 dir, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +{ + u8 direction = dir; + s16 dx2 = (u16)deltaX; + s16 dy2 = (u16)deltaY; + if (gDirectionToVectors[direction].x > 0) + *x += dx2; + if (gDirectionToVectors[direction].x < 0) + *x -= dx2; + if (gDirectionToVectors[direction].y > 0) + *y += dy2; + if (gDirectionToVectors[direction].y < 0) + *y -= dy2; +} + +void sub_8092FF0(s16 x, s16 y, s16 *dest_x, s16 *dest_y) +{ + *dest_x = (x - gSaveBlock1Ptr->pos.x) << 4; + *dest_y = (y - gSaveBlock1Ptr->pos.y) << 4; + *dest_x -= gUnknown_03005DEC; + *dest_y -= gUnknown_03005DE8; +} + +void sub_8093038(s16 x, s16 y, s16 *dest_x, s16 *dest_y) +{ + s16 dx; + s16 dy; + + dx = -gUnknown_03005DEC - gUnknown_03005DD0.x; + dy = -gUnknown_03005DE8 - gUnknown_03005DD0.y; + if (gUnknown_03005DD0.x > 0) + { + dx += 0x10; + } + if (gUnknown_03005DD0.x < 0) + { + dx -= 0x10; + } + if (gUnknown_03005DD0.y > 0) + { + dy += 0x10; + } + if (gUnknown_03005DD0.y < 0) + { + dy -= 0x10; + } + *dest_x = ((x - gSaveBlock1Ptr->pos.x) << 4) + dx; + *dest_y = ((y - gSaveBlock1Ptr->pos.y) << 4) + dy; +} + +void sub_80930E0(s16 *x, s16 *y, s16 dx, s16 dy) +{ + sub_8093038(*x, *y, x, y); + *x += dx; + *y += dy; +} + +static void GetEventObjectMovingCameraOffset(s16 *x, s16 *y) +{ + *x = 0; + *y = 0; + if (gUnknown_03005DD0.x > 0) + { + (*x)++; + } + if (gUnknown_03005DD0.x < 0) + { + (*x) --; + } + if (gUnknown_03005DD0.y > 0) + { + (*y)++; + } + if (gUnknown_03005DD0.y < 0) + { + (*y) --; + } +} + +void EventObjectMoveDestCoords(struct EventObject *eventObject, u32 direction, s16 *x, s16 *y) +{ + u8 newDirn = direction; + *x = eventObject->currentCoords.x; + *y = eventObject->currentCoords.y; + MoveCoords(newDirn, x, y); +} + +bool8 EventObjectIsMovementOverridden(struct EventObject *eventObject) +{ + if (eventObject->singleMovementActive || eventObject->heldMovementActive) + return TRUE; + + return FALSE; +} + +bool8 EventObjectIsHeldMovementActive(struct EventObject *eventObject) +{ + if (eventObject->heldMovementActive && eventObject->movementActionId != 0xFF) + return TRUE; + + return FALSE; +} + +bool8 EventObjectSetHeldMovement(struct EventObject *eventObject, u8 movementActionId) +{ + if (EventObjectIsMovementOverridden(eventObject)) + return TRUE; + + UnfreezeEventObject(eventObject); + eventObject->movementActionId = movementActionId; + eventObject->heldMovementActive = TRUE; + eventObject->heldMovementFinished = FALSE; + gSprites[eventObject->spriteId].data[2] = 0; + return FALSE; +} + +void EventObjectForceSetHeldMovement(struct EventObject *eventObject, u8 movementActionId) +{ + EventObjectClearHeldMovementIfActive(eventObject); + EventObjectSetHeldMovement(eventObject, movementActionId); +} + +void EventObjectClearHeldMovementIfActive(struct EventObject *eventObject) +{ + if (eventObject->heldMovementActive) + EventObjectClearHeldMovement(eventObject); +} + +void EventObjectClearHeldMovement(struct EventObject *eventObject) +{ + eventObject->movementActionId = 0xFF; + eventObject->heldMovementActive = FALSE; + eventObject->heldMovementFinished = FALSE; + gSprites[eventObject->spriteId].data[1] = 0; + gSprites[eventObject->spriteId].data[2] = 0; +} + +u8 EventObjectCheckHeldMovementStatus(struct EventObject *eventObject) +{ + if (eventObject->heldMovementActive) + return eventObject->heldMovementFinished; + + return 16; +} + +u8 EventObjectClearHeldMovementIfFinished(struct EventObject *eventObject) +{ + u8 heldMovementStatus = EventObjectCheckHeldMovementStatus(eventObject); + if (heldMovementStatus != 0 && heldMovementStatus != 16) + EventObjectClearHeldMovementIfActive(eventObject); + + return heldMovementStatus; +} + +u8 EventObjectGetHeldMovementActionId(struct EventObject *eventObject) +{ + if (eventObject->heldMovementActive) + return eventObject->movementActionId; + + return 0xFF; +} + +void UpdateEventObjectCurrentMovement(struct EventObject *eventObject, struct Sprite *sprite, bool8 (*callback)(struct EventObject *, struct Sprite *)) +{ + DoGroundEffects_OnSpawn(eventObject, sprite); + TryEnableEventObjectAnim(eventObject, sprite); + if (EventObjectIsHeldMovementActive(eventObject)) + { + EventObjectExecHeldMovementAction(eventObject, sprite); + } + else if (!eventObject->frozen) + { + while (callback(eventObject, sprite)); + } + DoGroundEffects_OnBeginStep(eventObject, sprite); + DoGroundEffects_OnFinishStep(eventObject, sprite); + UpdateEventObjectSpriteAnimPause(eventObject, sprite); + UpdateEventObjectVisibility(eventObject, sprite); + EventObjectUpdateSubpriority(eventObject, sprite); +} + +#define dirn_to_anim(name, table)\ +u8 name(u32 idx)\ +{\ + u8 direction;\ + u8 animIds[sizeof(table)];\ + direction = idx;\ + memcpy(animIds, (table), sizeof(table));\ + if (direction > DIR_EAST) direction = 0;\ + return animIds[direction];\ +} + +dirn_to_anim(GetFaceDirectionMovementAction, gFaceDirectionMovementActions); +dirn_to_anim(GetWalkSlowMovementAction, gWalkSlowMovementActions); +dirn_to_anim(GetWalkNormalMovementAction, gWalkNormalMovementActions); +dirn_to_anim(GetWalkFastMovementAction, gWalkFastMovementActions); +dirn_to_anim(GetRideWaterCurrentMovementAction, gRideWaterCurrentMovementActions); +dirn_to_anim(GetWalkFastestMovementAction, gWalkFastestMovementActions); +dirn_to_anim(GetSlideMovementAction, gSlideMovementActions); +dirn_to_anim(GetPlayerRunMovementAction, gPlayerRunMovementActions); +dirn_to_anim(GetJump2MovementAction, gJump2MovementActions); +dirn_to_anim(GetJumpInPlaceMovementAction, gJumpInPlaceMovementActions); +dirn_to_anim(GetJumpInPlaceTurnAroundMovementAction, gJumpInPlaceTurnAroundMovementActions); +dirn_to_anim(GetJumpMovementAction, gJumpMovementActions); +dirn_to_anim(GetJumpSpecialMovementAction, gJumpSpecialMovementActions); +dirn_to_anim(GetWalkInPlaceSlowMovementAction, gWalkInPlaceSlowMovementActions); +dirn_to_anim(GetWalkInPlaceNormalMovementAction, gWalkInPlaceNormalMovementActions); +dirn_to_anim(GetWalkInPlaceFastMovementAction, gWalkInPlaceFastMovementActions); +dirn_to_anim(GetWalkInPlaceFastestMovementAction, gWalkInPlaceFastestMovementActions); + +bool8 EventObjectFaceOppositeDirection(struct EventObject *eventObject, u8 direction) +{ + return EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(GetOppositeDirection(direction))); +} + +dirn_to_anim(GetAcroWheelieFaceDirectionMovementAction, gAcroWheelieFaceDirectionMovementActions); +dirn_to_anim(GetAcroPopWheelieFaceDirectionMovementAction, gAcroPopWheelieFaceDirectionMovementActions); +dirn_to_anim(GetAcroEndWheelieFaceDirectionMovementAction, gAcroEndWheelieFaceDirectionMovementActions); +dirn_to_anim(GetAcroWheelieHopFaceDirectionMovementAction, gAcroWheelieHopFaceDirectionMovementActions); +dirn_to_anim(GetAcroWheelieHopDirectionMovementAction, gAcroWheelieHopDirectionMovementActions); +dirn_to_anim(GetAcroWheelieJumpDirectionMovementAction, gAcroWheelieJumpDirectionMovementActions); +dirn_to_anim(GetAcroWheelieInPlaceDirectionMovementAction, gAcroWheelieInPlaceDirectionMovementActions); +dirn_to_anim(GetAcroPopWheelieMoveDirectionMovementAction, gAcroPopWheelieMoveDirectionMovementActions); +dirn_to_anim(GetAcroWheelieMoveDirectionMovementAction, gAcroWheelieMoveDirectionMovementActions); +dirn_to_anim(GetAcroEndWheelieMoveDirectionMovementAction, gAcroEndWheelieMoveDirectionMovementActions); + +u8 GetOppositeDirection(u8 direction) +{ + u8 directions[sizeof gOppositeDirections]; + + memcpy(directions, gOppositeDirections, sizeof gOppositeDirections); + if (direction < 1 || direction > (sizeof gOppositeDirections)) + { + return direction; + } + return directions[direction - 1]; +} + +static u32 zffu_offset_calc(u8 a0, u8 a1) +{ + return gUnknown_0850DC2F[a0 - 1][a1 - 1]; +} + +static u32 state_to_direction(u8 a0, u32 a1, u32 a2) +{ + u32 zffuOffset; + u8 a1_2; + u8 a2_2; + + a1_2 = a1; + a2_2 = a2; + if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) + { + return 0; + } + zffuOffset = zffu_offset_calc(a1_2, a2); + return gUnknown_0850DC3F[a0 - 1][zffuOffset - 1]; +} + +static void EventObjectExecHeldMovementAction(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (gMovementActionFuncs[eventObject->movementActionId][sprite->data[2]](eventObject, sprite)) + { + eventObject->heldMovementFinished = TRUE; + } +} + +static bool8 EventObjectExecSingleMovementAction(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (gMovementActionFuncs[eventObject->movementActionId][sprite->data[2]](eventObject, sprite)) + { + eventObject->movementActionId = 0xFF; + sprite->data[2] = 0; + return TRUE; + } + return FALSE; +} + +static void EventObjectSetSingleMovement(struct EventObject *eventObject, struct Sprite *sprite, u8 animId) +{ + eventObject->movementActionId = animId; + sprite->data[2] = 0; +} + +static void FaceDirection(struct EventObject *eventObject, struct Sprite *sprite, u8 direction) +{ + SetEventObjectDirection(eventObject, direction); + ShiftStillEventObjectCoords(eventObject); + obj_npc_animation_step(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection)); + sprite->animPaused = TRUE; + sprite->data[2] = 1; +} + +bool8 MovementAction_FaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + FaceDirection(eventObject, sprite, DIR_SOUTH); + return TRUE; +} + +bool8 MovementAction_FaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + FaceDirection(eventObject, sprite, DIR_NORTH); + return TRUE; +} + +bool8 MovementAction_FaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + FaceDirection(eventObject, sprite, DIR_WEST); + return TRUE; +} + +bool8 MovementAction_FaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + FaceDirection(eventObject, sprite, DIR_EAST); + return TRUE; +} + +void npc_apply_direction(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed) +{ + s16 x; + s16 y; + + x = eventObject->currentCoords.x; + y = eventObject->currentCoords.y; + SetEventObjectDirection(eventObject, direction); + MoveCoords(direction, &x, &y); + ShiftEventObjectCoords(eventObject, x, y); + oamt_npc_ministep_reset(sprite, direction, speed); + sprite->animPaused = FALSE; + if (gLockedAnimEventObjects != NULL && FindLockedEventObjectIndex(eventObject) != NUM_EVENT_OBJECTS) + { + sprite->animPaused = TRUE; + } + eventObject->triggerGroundEffectsOnMove = TRUE; + sprite->data[2] = 1; +} + +void do_go_anim(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed) +{ + u8 (*functions[ARRAY_COUNT(gUnknown_0850DEE8)])(u8); + + memcpy(functions, gUnknown_0850DEE8, sizeof gUnknown_0850DEE8); + npc_apply_direction(eventObject, sprite, direction, speed); + npc_apply_anim_looping(eventObject, sprite, functions[speed](eventObject->facingDirection)); +} + +void StartRunningAnim(struct EventObject *eventObject, struct Sprite *sprite, u8 direction) +{ + npc_apply_direction(eventObject, sprite, direction, 1); + npc_apply_anim_looping(eventObject, sprite, GetRunningDirectionAnimNum(eventObject->facingDirection)); +} + +bool8 npc_obj_ministep_stop_on_arrival(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (obj_npc_ministep(sprite)) + { + ShiftStillEventObjectCoords(eventObject); + eventObject->triggerGroundEffectsOnStop = TRUE; + sprite->animPaused = TRUE; + return TRUE; + } + return FALSE; +} + +void sub_8093AF0(struct EventObject *eventObject, struct Sprite *sprite, u8 direction) +{ + s16 x; + s16 y; + + x = eventObject->currentCoords.x; + y = eventObject->currentCoords.y; + SetEventObjectDirection(eventObject, direction); + MoveCoords(direction, &x, &y); + ShiftEventObjectCoords(eventObject, x, y); + sub_80976DC(sprite, direction); + sprite->animPaused = FALSE; + eventObject->triggerGroundEffectsOnMove = TRUE; + sprite->data[2] = 1; +} + +void sub_8093B60(struct EventObject *eventObject, struct Sprite *sprite, u8 direction) +{ + sub_8093AF0(eventObject, sprite, direction); + npc_apply_anim_looping(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection)); +} + +bool8 an_walk_any_2(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80976EC(sprite)) + { + ShiftStillEventObjectCoords(eventObject); + eventObject->triggerGroundEffectsOnStop = TRUE; + sprite->animPaused = TRUE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowDiagonalUpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_NORTHWEST); + return MovementAction_WalkSlowDiagonalUpLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowDiagonalUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowDiagonalUpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_NORTHEAST); + return MovementAction_WalkSlowDiagonalUpRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowDiagonalUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowDiagonalDownLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_SOUTHWEST); + return MovementAction_WalkSlowDiagonalDownLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowDiagonalDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowDiagonalDownRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_SOUTHEAST); + return MovementAction_WalkSlowDiagonalDownRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowDiagonalDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_SOUTH); + return MovementAction_WalkSlowDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_NORTH); + return MovementAction_WalkSlowUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_WEST); + return MovementAction_WalkSlowLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkSlowRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_EAST); + return MovementAction_WalkSlowRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkSlowRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalDiagonalUpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTHWEST, 0); + return MovementAction_WalkNormalDiagonalUpLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalDiagonalUpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalDiagonalUpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTHEAST, 0); + return MovementAction_WalkNormalDiagonalUpRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalDiagonalUpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalDiagonalDownLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTHWEST, 0); + return MovementAction_WalkNormalDiagonalDownLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalDiagonalDownLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalDiagonalDownRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTHEAST, 0); + return MovementAction_WalkNormalDiagonalDownRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalDiagonalDownRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTH, 0); + return MovementAction_WalkNormalDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTH, 0); + return MovementAction_WalkNormalUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_WEST, 0); + return MovementAction_WalkNormalLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkNormalRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_EAST, 0); + return MovementAction_WalkNormalRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkNormalRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8093FC4(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a5) +{ + s16 displacements[ARRAY_COUNT(gUnknown_0850DFBC)]; + s16 x; + s16 y; + + memcpy(displacements, gUnknown_0850DFBC, sizeof gUnknown_0850DFBC); + x = 0; + y = 0; + SetEventObjectDirection(eventObject, direction); + MoveCoordsInDirection(direction, &x, &y, displacements[speed], displacements[speed]); + ShiftEventObjectCoords(eventObject, eventObject->currentCoords.x + x, eventObject->currentCoords.y + y); + sub_809783C(sprite, direction, speed, a5); + sprite->data[2] = 1; + sprite->animPaused = 0; + eventObject->triggerGroundEffectsOnMove = 1; + eventObject->disableCoveringGroundEffects = 1; +} + +void maybe_shadow_1(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4) +{ + sub_8093FC4(eventObject, sprite, direction, speed, a4); + npc_apply_anim_looping(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection)); + DoShadowFieldEffect(eventObject); +} + +u8 sub_80940C4(struct EventObject *eventObject, struct Sprite *sprite, u8 callback(struct Sprite *)) +{ + s16 displacements[ARRAY_COUNT(gUnknown_0850DFC2)]; + s16 x; + s16 y; + u8 result; + + memcpy(displacements, gUnknown_0850DFC2, sizeof gUnknown_0850DFC2); + result = callback(sprite); + if (result == 1 && displacements[sprite->data[4]] != 0) + { + x = 0; + y = 0; + MoveCoordsInDirection(eventObject->movementDirection, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]); + ShiftEventObjectCoords(eventObject, eventObject->currentCoords.x + x, eventObject->currentCoords.y + y); + eventObject->triggerGroundEffectsOnMove = TRUE; + eventObject->disableCoveringGroundEffects = TRUE; + } + else if (result == 0xFF) + { + ShiftStillEventObjectCoords(eventObject); + eventObject->triggerGroundEffectsOnStop = TRUE; + eventObject->landingJump = TRUE; + sprite->animPaused = TRUE; + } + return result; +} + +u8 sub_8094188(struct EventObject *eventObject, struct Sprite *sprite) +{ + return sub_80940C4(eventObject, sprite, sub_809785C); +} + +u8 sub_809419C(struct EventObject *eventObject, struct Sprite *sprite) +{ + return sub_80940C4(eventObject, sprite, sub_80978E4); +} + +bool8 sub_80941B0(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_8094188(eventObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_80941C8(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_809419C(eventObject, sprite) == 0xFF) + { + return TRUE; + } + return FALSE; +} + +bool8 sub_80941E0(struct EventObject *eventObject, struct Sprite *sprite) +{ + switch (sub_8094188(eventObject, sprite)) + { + case 255: + return TRUE; + case 1: + SetEventObjectDirection(eventObject, GetOppositeDirection(eventObject->movementDirection)); + obj_npc_animation_step(eventObject, sprite, GetMoveDirectionAnimNum(eventObject->facingDirection)); + default: + return FALSE; + } +} + +bool8 MovementAction_Jump2Down_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 2, 0); + return MovementAction_Jump2Down_Step1(eventObject, sprite); +} + +bool8 MovementAction_Jump2Down_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_Jump2Up_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_NORTH, 2, 0); + return MovementAction_Jump2Up_Step1(eventObject, sprite); +} + +bool8 MovementAction_Jump2Up_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_Jump2Left_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_WEST, 2, 0); + return MovementAction_Jump2Left_Step1(eventObject, sprite); +} + +bool8 MovementAction_Jump2Left_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_Jump2Right_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_EAST, 2, 0); + return MovementAction_Jump2Right_Step1(eventObject, sprite); +} + +bool8 MovementAction_Jump2Right_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +void sub_8094390(struct Sprite *sprite, u16 duration) +{ + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 MovementAction_Delay_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (-- sprite->data[3] == 0) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_Delay1_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094390(sprite, 1); + return MovementAction_Delay_Step1(eventObject, sprite); +} + +bool8 MovementAction_Delay2_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094390(sprite, 2); + return MovementAction_Delay_Step1(eventObject, sprite); +} + +bool8 MovementAction_Delay4_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094390(sprite, 4); + return MovementAction_Delay_Step1(eventObject, sprite); +} + +bool8 MovementAction_Delay8_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094390(sprite, 8); + return MovementAction_Delay_Step1(eventObject, sprite); +} + +bool8 MovementAction_Delay16_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094390(sprite, 16); + return MovementAction_Delay_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTH, 1); + return MovementAction_WalkFastDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTH, 1); + return MovementAction_WalkFastUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_WEST, 1); + return MovementAction_WalkFastLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_EAST, 1); + return MovementAction_WalkFastRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + + +void sub_8094554(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration) +{ + SetEventObjectDirection(eventObject, direction); + npc_apply_anim_looping(eventObject, sprite, animNum); + sprite->animPaused = FALSE; + sprite->data[2] = 1; + sprite->data[3] = duration; +} + +bool8 MovementAction_WalkInPlace_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (-- sprite->data[3] == 0) + { + sprite->data[2] = 2; + sprite->animPaused = TRUE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkInPlaceSlow_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sprite->data[3] & 1) + { + sprite->animDelayCounter++; + } + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceSlowDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 32); + return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceSlowUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 32); + return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceSlowLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 32); + return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceSlowRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 32); + return MovementAction_WalkInPlaceSlow_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceNormalDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionAnimNum(DIR_SOUTH), 16); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceNormalUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionAnimNum(DIR_NORTH), 16); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceNormalLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionAnimNum(DIR_WEST), 16); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceNormalRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionAnimNum(DIR_EAST), 16); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionFastAnimNum(DIR_SOUTH), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionFastAnimNum(DIR_NORTH), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionFastAnimNum(DIR_WEST), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionFastAnimNum(DIR_EAST), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastestDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_SOUTH, GetMoveDirectionFasterAnimNum(DIR_SOUTH), 4); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastestUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_NORTH, GetMoveDirectionFasterAnimNum(DIR_NORTH), 4); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastestLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_WEST, GetMoveDirectionFasterAnimNum(DIR_WEST), 4); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkInPlaceFastestRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_EAST, GetMoveDirectionFasterAnimNum(DIR_EAST), 4); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_RideWaterCurrentDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTH, 2); + return MovementAction_RideWaterCurrentDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_RideWaterCurrentDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_RideWaterCurrentUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTH, 2); + return MovementAction_RideWaterCurrentUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_RideWaterCurrentUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_RideWaterCurrentLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_WEST, 2); + return MovementAction_RideWaterCurrentLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_RideWaterCurrentLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_RideWaterCurrentRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_EAST, 2); + return MovementAction_RideWaterCurrentRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_RideWaterCurrentRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastestDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTH, 3); + return MovementAction_WalkFastestDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastestDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastestUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTH, 3); + return MovementAction_WalkFastestUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastestUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastestLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_WEST, 3); + return MovementAction_WalkFastestLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastestLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkFastestRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_EAST, 3); + return MovementAction_WalkFastestRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkFastestRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_SlideDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_SOUTH, 4); + return MovementAction_SlideDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_SlideDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_SlideUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_NORTH, 4); + return MovementAction_SlideUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_SlideUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_SlideLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_WEST, 4); + return MovementAction_SlideLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_SlideLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_SlideRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_EAST, 4); + return MovementAction_SlideRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_SlideRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_PlayerRunDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartRunningAnim(eventObject, sprite, DIR_SOUTH); + return MovementAction_PlayerRunDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_PlayerRunDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_PlayerRunUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartRunningAnim(eventObject, sprite, DIR_NORTH); + return MovementAction_PlayerRunUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_PlayerRunUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_PlayerRunLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartRunningAnim(eventObject, sprite, DIR_WEST); + return MovementAction_PlayerRunLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_PlayerRunLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_PlayerRunRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartRunningAnim(eventObject, sprite, DIR_EAST); + return MovementAction_PlayerRunRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_PlayerRunRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void StartSpriteAnimInDirection(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 animNum) +{ + SetAndStartSpriteAnim(sprite, animNum, 0); + SetEventObjectDirection(eventObject, direction); + sprite->data[2] = 1; +} + +bool8 MovementAction_StartAnimInDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, eventObject->movementDirection, sprite->animNum); + return FALSE; +} + +bool8 MovementAction_WaitSpriteAnim(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (SpriteAnimEnded(sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8094DE4(struct EventObject *eventObject, struct Sprite *sprite, u8 direction) +{ + sub_8093FC4(eventObject, sprite, direction, 1, 0); + StartSpriteAnim(sprite, GetJumpSpecialDirectionAnimNum(direction)); +} + +bool8 MovementAction_JumpSpecialDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094DE4(eventObject, sprite, DIR_SOUTH); + return MovementAction_JumpSpecialDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpSpecialDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941C8(eventObject, sprite)) + { + sprite->data[2] = 2; + eventObject->landingJump = FALSE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpSpecialUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094DE4(eventObject, sprite, DIR_NORTH); + return MovementAction_JumpSpecialUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpSpecialUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941C8(eventObject, sprite)) + { + sprite->data[2] = 2; + eventObject->landingJump = FALSE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpSpecialLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094DE4(eventObject, sprite, DIR_WEST); + return MovementAction_JumpSpecialLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpSpecialLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941C8(eventObject, sprite)) + { + sprite->data[2] = 2; + eventObject->landingJump = FALSE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpSpecialRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094DE4(eventObject, sprite, DIR_EAST); + return MovementAction_JumpSpecialRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpSpecialRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941C8(eventObject, sprite)) + { + sprite->data[2] = 2; + eventObject->landingJump = FALSE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_FacePlayer_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 playerObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId)) + { + FaceDirection(eventObject, sprite, GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y)); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_FaceAwayPlayer_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + u8 playerObjectId; + + if (!TryGetEventObjectIdByLocalIdAndMap(0xFF, 0, 0, &playerObjectId)) + { + FaceDirection(eventObject, sprite, GetOppositeDirection(GetDirectionToFace(eventObject->currentCoords.x, eventObject->currentCoords.y, gEventObjects[playerObjectId].currentCoords.x, gEventObjects[playerObjectId].currentCoords.y))); + } + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_LockFacingDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->facingDirectionLocked = TRUE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_UnlockFacingDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->facingDirectionLocked = FALSE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_JumpDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 1, 2); + return MovementAction_JumpDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_NORTH, 1, 2); + return MovementAction_JumpUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_WEST, 1, 2); + return MovementAction_JumpLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_EAST, 1, 2); + return MovementAction_JumpRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 0, 0); + return MovementAction_JumpInPlaceDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_NORTH, 0, 0); + return MovementAction_JumpInPlaceUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_WEST, 0, 0); + return MovementAction_JumpInPlaceLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_EAST, 0, 0); + return MovementAction_JumpInPlaceRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceDownUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_SOUTH, 0, 2); + return MovementAction_JumpInPlaceDownUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceDownUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941E0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceUpDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_NORTH, 0, 2); + return MovementAction_JumpInPlaceUpDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceUpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941E0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceLeftRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_WEST, 0, 2); + return MovementAction_JumpInPlaceLeftRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceLeftRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941E0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_JumpInPlaceRightLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + maybe_shadow_1(eventObject, sprite, DIR_EAST, 0, 2); + return MovementAction_JumpInPlaceRightLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_JumpInPlaceRightLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941E0(eventObject, sprite)) + { + eventObject->hasShadow = 0; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_FaceOriginalDirection_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + FaceDirection(eventObject, sprite, gInitialMovementTypeFacingDirections[eventObject->movementType]); + return TRUE; +} + +bool8 MovementAction_NurseJoyBowDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, 0x14); + return FALSE; +} + +bool8 MovementAction_EnableJumpLandingGroundEffect_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->disableJumpLandingGroundEffect = FALSE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_DisableJumpLandingGroundEffect_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->disableJumpLandingGroundEffect = TRUE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_DisableAnimation_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->inanimate = TRUE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_RestoreAnimation_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->inanimate = GetEventObjectGraphicsInfo(eventObject->graphicsId)->inanimate; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_SetInvisible_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->invisible = TRUE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_SetVisible_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->invisible = FALSE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_EmoteExclamationMark_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_EmoteQuestionMark_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_QUESTION_MARK_ICON); + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_EmoteHeart_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_HEART_ICON); + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_RevealTrainer_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (eventObject->movementType == MOVEMENT_TYPE_HIDDEN) + { + sub_80B4578(eventObject); + return FALSE; + } + if (eventObject->movementType != MOVEMENT_TYPE_TREE_DISGUISE && eventObject->movementType != MOVEMENT_TYPE_MOUNTAIN_DISGUISE) + { + sprite->data[2] = 2; + return TRUE; + } + sub_8155D78(eventObject); + sprite->data[2] = 1; + return MovementAction_RevealTrainer_Step1(eventObject, sprite); +} + +bool8 MovementAction_RevealTrainer_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_8155DA0(eventObject)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_RockSmashBreak_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + SetAndStartSpriteAnim(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 MovementAction_RockSmashBreak_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (SpriteAnimEnded(sprite)) + { + SetMovementDelay(sprite, 32); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 MovementAction_RockSmashBreak_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->invisible ^= TRUE; + if (WaitForMovementDelay(sprite)) + { + eventObject->invisible = TRUE; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 MovementAction_CutTree_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + SetAndStartSpriteAnim(sprite, 1, 0); + sprite->data[2] = 1; + return FALSE; +} + +bool8 MovementAction_CutTree_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (SpriteAnimEnded(sprite)) + { + SetMovementDelay(sprite, 32); + sprite->data[2] = 2; + } + return FALSE; +} + +bool8 MovementAction_CutTree_Step2(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->invisible ^= TRUE; + if (WaitForMovementDelay(sprite)) + { + eventObject->invisible = TRUE; + sprite->data[2] = 3; + } + return FALSE; +} + +bool8 MovementAction_SetFixedPriority_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->fixedPriority = TRUE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_ClearFixedPriority_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->fixedPriority = FALSE; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_InitAffineAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + sprite->affineAnimPaused = TRUE; + sprite->subspriteMode = 0; + return TRUE; +} + +bool8 MovementAction_ClearAffineAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + FreeOamMatrix(sprite->oam.matrixNum); + sprite->oam.affineMode = ST_OAM_AFFINE_OFF; + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); + return TRUE; +} + +bool8 MovementAction_Unknown1_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->unk3_3 = TRUE; + return TRUE; +} + +bool8 MovementAction_Unknown2_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + eventObject->unk3_3 = FALSE; + return TRUE; +} + +bool8 MovementAction_WalkDownStartAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = FALSE; + StartSpriteAffineAnimIfDifferent(sprite, 0); + return MovementAction_WalkDownStartAffine_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkDownStartAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->affineAnimPaused = TRUE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkDownAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8093B60(eventObject, sprite, DIR_SOUTH); + sprite->affineAnimPaused = FALSE; + ChangeSpriteAffineAnimIfDifferent(sprite, 1); + return MovementAction_WalkDownAffine_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkDownAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (an_walk_any_2(eventObject, sprite)) + { + sprite->affineAnimPaused = TRUE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkLeftAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_WEST, 1); + sprite->affineAnimPaused = FALSE; + ChangeSpriteAffineAnimIfDifferent(sprite, 2); + return MovementAction_WalkLeftAffine_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkLeftAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->affineAnimPaused = TRUE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_WalkRightAffine_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + do_go_anim(eventObject, sprite, DIR_EAST, 1); + sprite->affineAnimPaused = FALSE; + ChangeSpriteAffineAnimIfDifferent(sprite, 3); + return MovementAction_WalkRightAffine_Step1(eventObject, sprite); +} + +bool8 MovementAction_WalkRightAffine_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->affineAnimPaused = TRUE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +static void sub_80958C0(struct EventObject *eventObject, struct Sprite *sprite, u8 direction) +{ + SetEventObjectDirection(eventObject, direction); + ShiftStillEventObjectCoords(eventObject); + obj_npc_animation_step(eventObject, sprite, GetAcroWheeliePedalDirectionAnimNum(direction)); + sprite->animPaused = TRUE; + sprite->data[2] = 1; +} + +bool8 MovementAction_AcroWheelieFaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80958C0(eventObject, sprite, DIR_SOUTH); + return TRUE; +} + +bool8 MovementAction_AcroWheelieFaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80958C0(eventObject, sprite, DIR_NORTH); + return TRUE; +} + +bool8 MovementAction_AcroWheelieFaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80958C0(eventObject, sprite, DIR_WEST); + return TRUE; +} + +bool8 MovementAction_AcroWheelieFaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80958C0(eventObject, sprite, DIR_EAST); + return TRUE; +} + +bool8 MovementAction_AcroPopWheelieDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, GetAcroWheelieDirectionAnimNum(DIR_SOUTH)); + return FALSE; +} + +bool8 MovementAction_AcroPopWheelieUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_NORTH, GetAcroWheelieDirectionAnimNum(DIR_NORTH)); + return FALSE; +} + +bool8 MovementAction_AcroPopWheelieLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_WEST, GetAcroWheelieDirectionAnimNum(DIR_WEST)); + return FALSE; +} + +bool8 MovementAction_AcroPopWheelieRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_EAST, GetAcroWheelieDirectionAnimNum(DIR_EAST)); + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieFaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, GetAcroEndWheelieDirectionAnimNum(DIR_SOUTH)); + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieFaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_NORTH, GetAcroEndWheelieDirectionAnimNum(DIR_NORTH)); + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieFaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_WEST, GetAcroEndWheelieDirectionAnimNum(DIR_WEST)); + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieFaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_EAST, GetAcroEndWheelieDirectionAnimNum(DIR_EAST)); + return FALSE; +} + +bool8 MovementAction_UnusedAcroActionDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_SOUTH, GetAcroUnusedActionDirectionAnimNum(DIR_SOUTH)); + return FALSE; +} + +bool8 MovementAction_UnusedAcroActionUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_NORTH, GetAcroUnusedActionDirectionAnimNum(DIR_NORTH)); + return FALSE; +} + +bool8 MovementAction_UnusedAcroActionLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_WEST, GetAcroUnusedActionDirectionAnimNum(DIR_WEST)); + return FALSE; +} + +bool8 MovementAction_UnusedAcroActionRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + StartSpriteAnimInDirection(eventObject, sprite, DIR_EAST, GetAcroUnusedActionDirectionAnimNum(DIR_EAST)); + return FALSE; +} + +void sub_8095AF0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8097750(sprite); + sprite->animPaused = FALSE; +} + +bool8 sub_8095B0C(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_8097758(sprite)) + { + ShiftStillEventObjectCoords(eventObject); + eventObject->triggerGroundEffectsOnStop = TRUE; + sprite->animPaused = TRUE; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_Figure8_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095AF0(eventObject, sprite); + sprite->data[2] = 1; + return MovementAction_Figure8_Step1(eventObject, sprite); +} + +bool8 MovementAction_Figure8_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_8095B0C(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8095B84(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4) +{ + sub_8093FC4(eventObject, sprite, direction, speed, a4); + StartSpriteAnimIfDifferent(sprite, GetAcroWheelieDirectionAnimNum(direction)); + DoShadowFieldEffect(eventObject); +} + +bool8 MovementAction_AcroWheelieHopFaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_SOUTH, 0, 1); + return MovementAction_AcroWheelieHopFaceDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopFaceDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopFaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_NORTH, 0, 1); + return MovementAction_AcroWheelieHopFaceUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopFaceUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopFaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_WEST, 0, 1); + return MovementAction_AcroWheelieHopFaceLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopFaceLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopFaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_EAST, 0, 1); + return MovementAction_AcroWheelieHopFaceRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopFaceRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_SOUTH, 1, 1); + return MovementAction_AcroWheelieHopDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_NORTH, 1, 1); + return MovementAction_AcroWheelieHopUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_WEST, 1, 1); + return MovementAction_AcroWheelieHopLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieHopRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_EAST, 1, 1); + return MovementAction_AcroWheelieHopRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieHopRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieJumpDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_SOUTH, 2, 0); + return MovementAction_AcroWheelieJumpDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieJumpDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieJumpUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_NORTH, 2, 0); + return MovementAction_AcroWheelieJumpUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieJumpUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieJumpLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_WEST, 2, 0); + return MovementAction_AcroWheelieJumpLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieJumpLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieJumpRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8095B84(eventObject, sprite, DIR_EAST, 2, 0); + return MovementAction_AcroWheelieJumpRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieJumpRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sub_80941B0(eventObject, sprite)) + { + eventObject->hasShadow = FALSE; + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieInPlaceDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_SOUTH, GetAcroWheeliePedalDirectionAnimNum(DIR_SOUTH), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieInPlaceUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_NORTH, GetAcroWheeliePedalDirectionAnimNum(DIR_NORTH), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieInPlaceLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_WEST, GetAcroWheeliePedalDirectionAnimNum(DIR_WEST), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieInPlaceRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8094554(eventObject, sprite, DIR_EAST, GetAcroWheeliePedalDirectionAnimNum(DIR_EAST), 8); + return MovementAction_WalkInPlace_Step1(eventObject, sprite); +} + +void sub_80960C8(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed) +{ + npc_apply_direction(eventObject, sprite, direction, speed); + StartSpriteAnim(sprite, GetAcroWheelieDirectionAnimNum(eventObject->facingDirection)); + SeekSpriteAnim(sprite, 0); +} + +bool8 MovementAction_AcroPopWheelieMoveDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80960C8(eventObject, sprite, DIR_SOUTH, 1); + return MovementAction_AcroPopWheelieMoveDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroPopWheelieMoveDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroPopWheelieMoveUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80960C8(eventObject, sprite, DIR_NORTH, 1); + return MovementAction_AcroPopWheelieMoveUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroPopWheelieMoveUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroPopWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80960C8(eventObject, sprite, DIR_WEST, 1); + return MovementAction_AcroPopWheelieMoveLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroPopWheelieMoveLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroPopWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_80960C8(eventObject, sprite, DIR_EAST, 1); + return MovementAction_AcroPopWheelieMoveRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroPopWheelieMoveRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8096200(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed) +{ + npc_apply_direction(eventObject, sprite, direction, speed); + npc_apply_anim_looping(eventObject, sprite, GetAcroWheeliePedalDirectionAnimNum(eventObject->facingDirection)); +} + +bool8 MovementAction_AcroWheelieMoveDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096200(eventObject, sprite, DIR_SOUTH, 1); + return MovementAction_AcroWheelieMoveDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieMoveDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieMoveUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096200(eventObject, sprite, DIR_NORTH, 1); + return MovementAction_AcroWheelieMoveUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieMoveUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096200(eventObject, sprite, DIR_WEST, 1); + return MovementAction_AcroWheelieMoveLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieMoveLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096200(eventObject, sprite, DIR_EAST, 1); + return MovementAction_AcroWheelieMoveRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroWheelieMoveRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +void sub_8096330(struct EventObject *eventObject, struct Sprite *sprite, u8 direction, u8 speed) +{ + npc_apply_direction(eventObject, sprite, direction, speed); + StartSpriteAnim(sprite, GetAcroEndWheelieDirectionAnimNum(eventObject->facingDirection)); + SeekSpriteAnim(sprite, 0); +} + +bool8 MovementAction_AcroEndWheelieMoveDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096330(eventObject, sprite, DIR_SOUTH, 1); + return MovementAction_AcroEndWheelieMoveDown_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroEndWheelieMoveDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieMoveUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096330(eventObject, sprite, DIR_NORTH, 1); + return MovementAction_AcroEndWheelieMoveUp_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroEndWheelieMoveUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieMoveLeft_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096330(eventObject, sprite, DIR_WEST, 1); + return MovementAction_AcroEndWheelieMoveLeft_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroEndWheelieMoveLeft_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_AcroEndWheelieMoveRight_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096330(eventObject, sprite, DIR_EAST, 1); + return MovementAction_AcroEndWheelieMoveRight_Step1(eventObject, sprite); +} + +bool8 MovementAction_AcroEndWheelieMoveRight_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (npc_obj_ministep_stop_on_arrival(eventObject, sprite)) + { + sprite->data[2] = 2; + return TRUE; + } + return FALSE; +} + +bool8 MovementAction_Levitate_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + CreateLevitateMovementTask(eventObject); + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_StopLevitate_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + DestroyExtraMovementTask(eventObject->warpArrowSpriteId); + sprite->pos2.y = 0; + sprite->data[2] = 1; + return TRUE; +} + +bool8 MovementAction_DestroyExtraTaskIfAtTop_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (sprite->pos2.y == 0) + { + DestroyExtraMovementTask(eventObject->warpArrowSpriteId); + sprite->data[2] = 1; + return TRUE; + } + return FALSE; +} + +u8 MovementAction_Finish(struct EventObject *eventObject, struct Sprite *sprite) +{ + return TRUE; +} + +bool8 MovementAction_PauseSpriteAnim(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->animPaused = TRUE; + return TRUE; +} + +static void UpdateEventObjectSpriteAnimPause(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (eventObject->disableAnim) + { + sprite->animPaused = TRUE; + } +} + +static void TryEnableEventObjectAnim(struct EventObject *eventObject, struct Sprite *sprite) +{ + if (eventObject->enableAnim) + { + sprite->animPaused = FALSE; + eventObject->disableAnim = FALSE; + eventObject->enableAnim = FALSE; + } +} + +static void UpdateEventObjectVisibility(struct EventObject *eventObject, struct Sprite *sprite) +{ + sub_8096530(eventObject, sprite); + npc_update_obj_anim_flag(eventObject, sprite); +} + +static void sub_8096530(struct EventObject *eventObject, struct Sprite *sprite) +{ + u16 x; + u16 y; + u16 x2; + u16 y2; + const struct EventObjectGraphicsInfo *graphicsInfo; + + eventObject->offScreen = FALSE; + graphicsInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + x2 = graphicsInfo->width; + x2 += x; + y2 = y; + y2 += graphicsInfo->height; + if ((s16)x >= 0x100 || (s16)x2 < -0x10) + { + eventObject->offScreen = TRUE; + } + if ((s16)y >= 0xB0 || (s16)y2 < -0x10) + { + eventObject->offScreen = TRUE; + } +} + +static void npc_update_obj_anim_flag(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->invisible = FALSE; + if (eventObject->invisible || eventObject->offScreen) + { + sprite->invisible = TRUE; + } +} + +/*static*/ void GetAllGroundEffectFlags_OnSpawn(struct EventObject *eventObj, u32 *flags) +{ + EventObjectUpdateMetatileBehaviors(eventObj); + GetGroundEffectFlags_Reflection(eventObj, flags); + GetGroundEffectFlags_TallGrassOnSpawn(eventObj, flags); + GetGroundEffectFlags_LongGrassOnSpawn(eventObj, flags); + GetGroundEffectFlags_SandHeap(eventObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags); + GetGroundEffectFlags_ShortGrass(eventObj, flags); + GetGroundEffectFlags_HotSprings(eventObj, flags); +} + +static void GetAllGroundEffectFlags_OnBeginStep(struct EventObject *eventObj, u32 *flags) +{ + EventObjectUpdateMetatileBehaviors(eventObj); + GetGroundEffectFlags_Reflection(eventObj, flags); + GetGroundEffectFlags_TallGrassOnBeginStep(eventObj, flags); + GetGroundEffectFlags_LongGrassOnBeginStep(eventObj, flags); + GetGroundEffectFlags_Tracks(eventObj, flags); + GetGroundEffectFlags_SandHeap(eventObj, flags); + GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags); + GetGroundEffectFlags_Puddle(eventObj, flags); + GetGroundEffectFlags_ShortGrass(eventObj, flags); + GetGroundEffectFlags_HotSprings(eventObj, flags); +} + +/*static*/ void GetAllGroundEffectFlags_OnFinishStep(struct EventObject *eventObj, u32 *flags) +{ + EventObjectUpdateMetatileBehaviors(eventObj); + GetGroundEffectFlags_ShallowFlowingWater(eventObj, flags); + GetGroundEffectFlags_SandHeap(eventObj, flags); + GetGroundEffectFlags_Puddle(eventObj, flags); + GetGroundEffectFlags_Ripple(eventObj, flags); + GetGroundEffectFlags_ShortGrass(eventObj, flags); + GetGroundEffectFlags_HotSprings(eventObj, flags); + GetGroundEffectFlags_Seaweed(eventObj, flags); + GetGroundEffectFlags_JumpLanding(eventObj, flags); +} + +static void EventObjectUpdateMetatileBehaviors(struct EventObject *eventObj) +{ + eventObj->previousMetatileBehavior = MapGridGetMetatileBehaviorAt(eventObj->previousCoords.x, eventObj->previousCoords.y); + eventObj->currentMetatileBehavior = MapGridGetMetatileBehaviorAt(eventObj->currentCoords.x, eventObj->currentCoords.y); +} + +static void GetGroundEffectFlags_Reflection(struct EventObject *eventObj, u32 *flags) +{ + u32 reflectionFlags[2] = { GROUND_EFFECT_FLAG_REFLECTION, GROUND_EFFECT_FLAG_ICE_REFLECTION }; + u8 type = EventObjectCheckForReflectiveSurface(eventObj); + + if (type) + { + if (!eventObj->hasReflection) + { + eventObj->hasReflection = 0; + eventObj->hasReflection = 1; + *flags |= reflectionFlags[type - 1]; + } + } + else + { + eventObj->hasReflection = 0; + } +} + +static void GetGroundEffectFlags_TallGrassOnSpawn(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(eventObj->currentMetatileBehavior)) + *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_SPAWN; +} + +static void GetGroundEffectFlags_TallGrassOnBeginStep(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsTallGrass(eventObj->currentMetatileBehavior)) + *flags |= GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE; +} + +static void GetGroundEffectFlags_LongGrassOnSpawn(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(eventObj->currentMetatileBehavior)) + *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_SPAWN; +} + +static void GetGroundEffectFlags_LongGrassOnBeginStep(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsLongGrass(eventObj->currentMetatileBehavior)) + *flags |= GROUND_EFFECT_FLAG_LONG_GRASS_ON_MOVE; +} + +static void GetGroundEffectFlags_Tracks(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(eventObj->previousMetatileBehavior)) + { + *flags |= GROUND_EFFECT_FLAG_DEEP_SAND; + } + else if (MetatileBehavior_IsSandOrDeepSand(eventObj->previousMetatileBehavior) + || MetatileBehavior_IsUnusedFootprintMetatile(eventObj->previousMetatileBehavior)) + { + *flags |= GROUND_EFFECT_FLAG_SAND; + } +} + +static void GetGroundEffectFlags_SandHeap(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsDeepSand(eventObj->currentMetatileBehavior) + && MetatileBehavior_IsDeepSand(eventObj->previousMetatileBehavior)) + { + if (!eventObj->inSandPile) + { + eventObj->inSandPile = 0; + eventObj->inSandPile = 1; + *flags |= GROUND_EFFECT_FLAG_SAND_PILE; + } + } + else + { + eventObj->inSandPile = 0; + } +} + +static void GetGroundEffectFlags_ShallowFlowingWater(struct EventObject *eventObj, u32 *flags) +{ + if ((MetatileBehavior_IsShallowFlowingWater(eventObj->currentMetatileBehavior) + && MetatileBehavior_IsShallowFlowingWater(eventObj->previousMetatileBehavior)) + || (MetatileBehavior_IsPacifidlogLog(eventObj->currentMetatileBehavior) + && MetatileBehavior_IsPacifidlogLog(eventObj->previousMetatileBehavior))) + { + if (!eventObj->inShallowFlowingWater) + { + eventObj->inShallowFlowingWater = 0; + eventObj->inShallowFlowingWater = 1; + *flags |= GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER; + } + } + else + { + eventObj->inShallowFlowingWater = 0; + } +} + +static void GetGroundEffectFlags_Puddle(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsPuddle(eventObj->currentMetatileBehavior) + && MetatileBehavior_IsPuddle(eventObj->previousMetatileBehavior)) + { + *flags |= GROUND_EFFECT_FLAG_PUDDLE; + } +} + +static void GetGroundEffectFlags_Ripple(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_HasRipples(eventObj->currentMetatileBehavior)) + *flags |= GROUND_EFFECT_FLAG_RIPPLES; +} + +static void GetGroundEffectFlags_ShortGrass(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsShortGrass(eventObj->currentMetatileBehavior) + && MetatileBehavior_IsShortGrass(eventObj->previousMetatileBehavior)) + { + if (!eventObj->inShortGrass) + { + eventObj->inShortGrass = 0; + eventObj->inShortGrass = 1; + *flags |= GROUND_EFFECT_FLAG_SHORT_GRASS; + } + } + else + { + eventObj->inShortGrass = 0; + } +} + +static void GetGroundEffectFlags_HotSprings(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsHotSprings(eventObj->currentMetatileBehavior) + && MetatileBehavior_IsHotSprings(eventObj->previousMetatileBehavior)) + { + if (!eventObj->inHotSprings) + { + eventObj->inHotSprings = 0; + eventObj->inHotSprings = 1; + *flags |= GROUND_EFFECT_FLAG_HOT_SPRINGS; + } + } + else + { + eventObj->inHotSprings = 0; + } +} + +static void GetGroundEffectFlags_Seaweed(struct EventObject *eventObj, u32 *flags) +{ + if (MetatileBehavior_IsSeaweed(eventObj->currentMetatileBehavior)) + *flags |= GROUND_EFFECT_FLAG_SEAWEED; +} + +static void GetGroundEffectFlags_JumpLanding(struct EventObject *eventObj, u32 *flags) +{ + typedef bool8 (*MetatileFunc)(u8); + + static const MetatileFunc metatileFuncs[] = { + MetatileBehavior_IsTallGrass, + MetatileBehavior_IsLongGrass, + MetatileBehavior_IsPuddle, + MetatileBehavior_IsSurfableWaterOrUnderwater, + MetatileBehavior_IsShallowFlowingWater, + MetatileBehavior_IsATile, + }; + + static const u32 jumpLandingFlags[] = { + GROUND_EFFECT_FLAG_LAND_IN_TALL_GRASS, + GROUND_EFFECT_FLAG_LAND_IN_LONG_GRASS, + GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER, + GROUND_EFFECT_FLAG_LAND_IN_DEEP_WATER, + GROUND_EFFECT_FLAG_LAND_IN_SHALLOW_WATER, + GROUND_EFFECT_FLAG_LAND_ON_NORMAL_GROUND, + }; + + if (eventObj->landingJump && !eventObj->disableJumpLandingGroundEffect) + { + u8 i; + + for (i = 0; i < ARRAY_COUNT(metatileFuncs); i++) + { + if (metatileFuncs[i](eventObj->currentMetatileBehavior)) + { + *flags |= jumpLandingFlags[i]; + return; + } + } + } +} + +static u8 EventObjectCheckForReflectiveSurface(struct EventObject *eventObj) +{ + const struct EventObjectGraphicsInfo *info = GetEventObjectGraphicsInfo(eventObj->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; + + for (i = 0, one = 1; i < height; i++) + { + RETURN_REFLECTION_TYPE_AT(eventObj->currentCoords.x, eventObj->currentCoords.y + one + i) + RETURN_REFLECTION_TYPE_AT(eventObj->previousCoords.x, eventObj->previousCoords.y + one + i) + for (j = 1; j < width; j++) + { + RETURN_REFLECTION_TYPE_AT(eventObj->currentCoords.x + j, eventObj->currentCoords.y + one + i) + RETURN_REFLECTION_TYPE_AT(eventObj->currentCoords.x - j, eventObj->currentCoords.y + one + i) + RETURN_REFLECTION_TYPE_AT(eventObj->previousCoords.x + j, eventObj->previousCoords.y + one + i) + RETURN_REFLECTION_TYPE_AT(eventObj->previousCoords.x - j, eventObj->previousCoords.y + one + i) + } + } + return 0; + +#undef RETURN_REFLECTION_TYPE_AT +} + +static u8 GetReflectionTypeByMetatileBehavior(u32 behavior) +{ + if (MetatileBehavior_IsIce(behavior)) + return 1; + else if (MetatileBehavior_IsReflective(behavior)) + return 2; + else + return 0; +} + +u8 GetLedgeJumpDirection(s16 x, s16 y, u8 z) +{ + static bool8 (*const unknown_08376040[])(u8) = { + MetatileBehavior_IsJumpSouth, + MetatileBehavior_IsJumpNorth, + MetatileBehavior_IsJumpWest, + MetatileBehavior_IsJumpEast, + }; + + u8 b; + u8 index = z; + + if (index == 0) + return 0; + else if (index > 4) + index -= 4; + + index--; + b = MapGridGetMetatileBehaviorAt(x, y); + + if (unknown_08376040[index](b) == 1) + return index + 1; + + return 0; +} + +void EventObjectSetSpriteOamTableForLongGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + if (eventObj->disableCoveringGroundEffects) + return; + + if (!MetatileBehavior_IsLongGrass(eventObj->currentMetatileBehavior)) + return; + + if (!MetatileBehavior_IsLongGrass(eventObj->previousMetatileBehavior)) + return; + + sprite->subspriteTableNum = 4; + + if (ZCoordToPriority(eventObj->previousElevation) == 1) + sprite->subspriteTableNum = 5; +} + +bool8 IsZCoordMismatchAt(u8 z, s16 x, s16 y) +{ + u8 mapZ; + + if (z == 0) + return FALSE; + + mapZ = MapGridGetZCoordAt(x, y); + + if (mapZ == 0 || mapZ == 0xF) + return FALSE; + + if (mapZ != z) + return TRUE; + + return FALSE; +} + +static const u8 sUnknown_08376050[] = { + 0x73, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x73, 0x53, 0x00, 0x00, 0x73 +}; + +// Each byte corresponds to a sprite priority for an event object. +// This is directly the inverse of gEventObjectPriorities_08376070. +static const u8 sEventObjectPriorities_08376060[] = { + 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 event object. +// This is the inverse of gEventObjectPriorities_08376060. +// 1 = Above player sprite +// 2 = Below player sprite +static const u8 sEventObjectPriorities_08376070[] = { + 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 1, +}; + +void EventObjectUpdateZCoordAndPriority(struct EventObject *eventObj, struct Sprite *sprite) +{ + if (eventObj->fixedPriority) + return; + + EventObjectUpdateZCoord(eventObj); + + sprite->subspriteTableNum = sEventObjectPriorities_08376070[eventObj->previousElevation]; + sprite->oam.priority = sEventObjectPriorities_08376060[eventObj->previousElevation]; +} + +static void InitObjectPriorityByZCoord(struct Sprite *sprite, u8 z) +{ + sprite->subspriteTableNum = sEventObjectPriorities_08376070[z]; + sprite->oam.priority = sEventObjectPriorities_08376060[z]; +} + +u8 ZCoordToPriority(u8 z) +{ + return sEventObjectPriorities_08376060[z]; +} + +void EventObjectUpdateZCoord(struct EventObject *eventObj) +{ + u8 z = MapGridGetZCoordAt(eventObj->currentCoords.x, eventObj->currentCoords.y); + u8 z2 = MapGridGetZCoordAt(eventObj->previousCoords.x, eventObj->previousCoords.y); + + if (z == 0xF || z2 == 0xF) + return; + + eventObj->currentElevation = z; + + if (z != 0 && z != 0xF) + eventObj->previousElevation = z; +} + +void SetObjectSubpriorityByZCoord(u8 a, struct Sprite *sprite, u8 b) +{ + 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; +} + +static void EventObjectUpdateSubpriority(struct EventObject *eventObj, struct Sprite *sprite) +{ + if (eventObj->fixedPriority) + return; + + SetObjectSubpriorityByZCoord(eventObj->previousElevation, sprite, 1); +} + +bool8 AreZCoordsCompatible(u8 a, u8 b) +{ + if (a == 0 || b == 0) + return TRUE; + + if (a != b) + return FALSE; + + return TRUE; +} + +void GroundEffect_SpawnOnTallGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = eventObj->localId << 8 | eventObj->mapNum; + gFieldEffectArguments[5] = eventObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void GroundEffect_StepOnTallGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = eventObj->localId << 8 | eventObj->mapNum; + gFieldEffectArguments[5] = eventObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_TALL_GRASS); +} + +void GroundEffect_SpawnOnLongGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = eventObj->localId << 8 | eventObj->mapNum; + gFieldEffectArguments[5] = eventObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; + gFieldEffectArguments[7] = 1; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void GroundEffect_StepOnLongGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = (eventObj->localId << 8) | eventObj->mapNum; + gFieldEffectArguments[5] = eventObj->mapGroup; + gFieldEffectArguments[6] = (u8)gSaveBlock1Ptr->location.mapNum << 8 | (u8)gSaveBlock1Ptr->location.mapGroup; + gFieldEffectArguments[7] = 0; + FieldEffectStart(FLDEFF_LONG_GRASS); +} + +void GroundEffect_WaterReflection(struct EventObject *eventObj, struct Sprite *sprite) +{ + SetUpReflection(eventObj, sprite, 0); +} + +void GroundEffect_IceReflection(struct EventObject *eventObj, struct Sprite *sprite) +{ + SetUpReflection(eventObj, sprite, 1); +} + +void GroundEffect_FlowingWater(struct EventObject *eventObj, struct Sprite *sprite) +{ + StartFieldEffectForEventObject(FLDEFF_FEET_IN_FLOWING_WATER, eventObj); +} + +static void (*const sGroundEffectTracksFuncs[])(struct EventObject *eventObj, struct Sprite *sprite, u8 a) = { + DoTracksGroundEffect_None, + DoTracksGroundEffect_Footprints, + DoTracksGroundEffect_BikeTireTracks, +}; + +void GroundEffect_SandTracks(struct EventObject *eventObj, struct Sprite *sprite) +{ + const struct EventObjectGraphicsInfo *info = GetEventObjectGraphicsInfo(eventObj->graphicsId); + sGroundEffectTracksFuncs[info->tracks](eventObj, sprite, 0); +} + +void GroundEffect_DeepSandTracks(struct EventObject *eventObj, struct Sprite *sprite) +{ + const struct EventObjectGraphicsInfo *info = GetEventObjectGraphicsInfo(eventObj->graphicsId); + sGroundEffectTracksFuncs[info->tracks](eventObj, sprite, 1); +} + +static void DoTracksGroundEffect_None(struct EventObject *eventObj, struct Sprite *sprite, u8 a) +{ +} + +static void DoTracksGroundEffect_Footprints(struct EventObject *eventObj, struct Sprite *sprite, u8 a) +{ + // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) + u16 sandFootprints_FieldEffectData[2] = { + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_DEEP_SAND_FOOTPRINTS + }; + + gFieldEffectArguments[0] = eventObj->previousCoords.x; + gFieldEffectArguments[1] = eventObj->previousCoords.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = eventObj->facingDirection; + FieldEffectStart(sandFootprints_FieldEffectData[a]); +} + +static void DoTracksGroundEffect_BikeTireTracks(struct EventObject *eventObj, struct Sprite *sprite, u8 a) +{ + // Specifies which bike track shape to show next. + // For example, when the bike turns from up to right, it will show + // a track that curves to the right. + // Each 4-byte row corresponds to the initial direction of the bike, and + // each byte in that row is for the next direction of the bike in the order + // of down, up, left, right. + static const u8 bikeTireTracks_Transitions[4][4] = { + 1, 2, 7, 8, + 1, 2, 6, 5, + 5, 8, 3, 4, + 6, 7, 3, 4, + }; + + if (eventObj->currentCoords.x != eventObj->previousCoords.x || eventObj->currentCoords.y != eventObj->previousCoords.y) + { + gFieldEffectArguments[0] = eventObj->previousCoords.x; + gFieldEffectArguments[1] = eventObj->previousCoords.y; + gFieldEffectArguments[2] = 149; + gFieldEffectArguments[3] = 2; + gFieldEffectArguments[4] = + bikeTireTracks_Transitions[eventObj->previousMovementDirection][eventObj->facingDirection - 5]; + FieldEffectStart(FLDEFF_BIKE_TIRE_TRACKS); + } +} + +void GroundEffect_Ripple(struct EventObject *eventObj, struct Sprite *sprite) +{ + DoRippleFieldEffect(eventObj, sprite); +} + +void GroundEffect_StepOnPuddle(struct EventObject *eventObj, struct Sprite *sprite) +{ + StartFieldEffectForEventObject(FLDEFF_SPLASH, eventObj); +} + +void GroundEffect_SandHeap(struct EventObject *eventObj, struct Sprite *sprite) +{ + StartFieldEffectForEventObject(FLDEFF_SAND_PILE, eventObj); +} + +void GroundEffect_JumpOnTallGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + u8 spriteId; + + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_TALL_GRASS); + + spriteId = sub_81546C8( + eventObj->localId, eventObj->mapNum, eventObj->mapGroup, eventObj->currentCoords.x, eventObj->currentCoords.y); + + if (spriteId == MAX_SPRITES) + GroundEffect_SpawnOnTallGrass(eventObj, sprite); +} + +void GroundEffect_JumpOnLongGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = 2; + FieldEffectStart(FLDEFF_JUMP_LONG_GRASS); +} + +void GroundEffect_JumpOnShallowWater(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_SMALL_SPLASH); +} + +void GroundEffect_JumpOnWater(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_JUMP_BIG_SPLASH); +} + +void GroundEffect_JumpLandingDust(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + gFieldEffectArguments[2] = eventObj->previousElevation; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_DUST); +} + +void GroundEffect_ShortGrass(struct EventObject *eventObj, struct Sprite *sprite) +{ + StartFieldEffectForEventObject(FLDEFF_SHORT_GRASS, eventObj); +} + +void GroundEffect_HotSprings(struct EventObject *eventObj, struct Sprite *sprite) +{ + StartFieldEffectForEventObject(FLDEFF_HOT_SPRINGS_WATER, eventObj); +} + +void GroundEffect_Seaweed(struct EventObject *eventObj, struct Sprite *sprite) +{ + gFieldEffectArguments[0] = eventObj->currentCoords.x; + gFieldEffectArguments[1] = eventObj->currentCoords.y; + FieldEffectStart(FLDEFF_BUBBLES); +} + +static void (*const sGroundEffectFuncs[])(struct EventObject *eventObj, struct Sprite *sprite) = { + GroundEffect_SpawnOnTallGrass, + GroundEffect_StepOnTallGrass, + GroundEffect_SpawnOnLongGrass, + GroundEffect_StepOnLongGrass, + GroundEffect_WaterReflection, + GroundEffect_IceReflection, + GroundEffect_FlowingWater, + GroundEffect_SandTracks, + GroundEffect_DeepSandTracks, + GroundEffect_Ripple, + GroundEffect_StepOnPuddle, + GroundEffect_SandHeap, + GroundEffect_JumpOnTallGrass, + GroundEffect_JumpOnLongGrass, + GroundEffect_JumpOnShallowWater, + GroundEffect_JumpOnWater, + GroundEffect_JumpLandingDust, + GroundEffect_ShortGrass, + GroundEffect_HotSprings, + GroundEffect_Seaweed +}; + +/*static*/ void DoFlaggedGroundEffects(struct EventObject *eventObj, struct Sprite *sprite, u32 flags) +{ + u8 i; + + if (EventObjectIsFarawayIslandMew(eventObj) == TRUE && !sub_81D4A58(eventObj)) + return; + + for (i = 0; i < ARRAY_COUNT(sGroundEffectFuncs); i++, flags >>= 1) + if (flags & 1) + sGroundEffectFuncs[i](eventObj, sprite); +} + +void filters_out_some_ground_effects(struct EventObject *eventObj, u32 *flags) +{ + if (eventObj->disableCoveringGroundEffects) + { + eventObj->inShortGrass = 0; + eventObj->inSandPile = 0; + eventObj->inShallowFlowingWater = 0; + eventObj->inHotSprings = 0; + *flags &= ~(GROUND_EFFECT_FLAG_HOT_SPRINGS + | GROUND_EFFECT_FLAG_SHORT_GRASS + | GROUND_EFFECT_FLAG_SAND_PILE + | GROUND_EFFECT_FLAG_SHALLOW_FLOWING_WATER + | GROUND_EFFECT_FLAG_TALL_GRASS_ON_MOVE); + } +} + +void FilterOutStepOnPuddleGroundEffectIfJumping(struct EventObject *eventObj, u32 *flags) +{ + if (eventObj->landingJump) + *flags &= ~GROUND_EFFECT_FLAG_PUDDLE; +} + +static void DoGroundEffects_OnSpawn(struct EventObject *eventObj, struct Sprite *sprite) +{ + u32 flags; + + if (eventObj->triggerGroundEffectsOnMove) + { + flags = 0; + EventObjectUpdateZCoordAndPriority(eventObj, sprite); + GetAllGroundEffectFlags_OnSpawn(eventObj, &flags); + EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite); + DoFlaggedGroundEffects(eventObj, sprite, flags); + eventObj->triggerGroundEffectsOnMove = 0; + eventObj->disableCoveringGroundEffects = 0; + } +} + +static void DoGroundEffects_OnBeginStep(struct EventObject *eventObj, struct Sprite *sprite) +{ + u32 flags; + + if (eventObj->triggerGroundEffectsOnMove) + { + flags = 0; + EventObjectUpdateZCoordAndPriority(eventObj, sprite); + GetAllGroundEffectFlags_OnBeginStep(eventObj, &flags); + EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite); + filters_out_some_ground_effects(eventObj, &flags); + DoFlaggedGroundEffects(eventObj, sprite, flags); + eventObj->triggerGroundEffectsOnMove = 0; + eventObj->disableCoveringGroundEffects = 0; + } +} + +static void DoGroundEffects_OnFinishStep(struct EventObject *eventObj, struct Sprite *sprite) +{ + u32 flags; + + if (eventObj->triggerGroundEffectsOnStop) + { + flags = 0; + EventObjectUpdateZCoordAndPriority(eventObj, sprite); + GetAllGroundEffectFlags_OnFinishStep(eventObj, &flags); + EventObjectSetSpriteOamTableForLongGrass(eventObj, sprite); + FilterOutStepOnPuddleGroundEffectIfJumping(eventObj, &flags); + DoFlaggedGroundEffects(eventObj, sprite, flags); + eventObj->triggerGroundEffectsOnStop = 0; + eventObj->landingJump = 0; + } +} + +bool8 FreezeEventObject(struct EventObject *eventObject) +{ + if (eventObject->heldMovementActive || eventObject->frozen) + { + return TRUE; + } + else + { + eventObject->frozen = 1; + eventObject->spriteAnimPausedBackup = gSprites[eventObject->spriteId].animPaused; + eventObject->spriteAffineAnimPausedBackup = gSprites[eventObject->spriteId].affineAnimPaused; + gSprites[eventObject->spriteId].animPaused = 1; + gSprites[eventObject->spriteId].affineAnimPaused = 1; + return FALSE; + } +} + +void FreezeEventObjects(void) +{ + u8 i; + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) + if (gEventObjects[i].active && i != gPlayerAvatar.eventObjectId) + FreezeEventObject(&gEventObjects[i]); +} + +void FreezeEventObjectsExceptOne(u8 a1) +{ + u8 i; + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) + if (i != a1 && gEventObjects[i].active && i != gPlayerAvatar.eventObjectId) + FreezeEventObject(&gEventObjects[i]); +} + +void UnfreezeEventObject(struct EventObject *eventObject) +{ + if (eventObject->active && eventObject->frozen) + { + eventObject->frozen = 0; + gSprites[eventObject->spriteId].animPaused = eventObject->spriteAnimPausedBackup; + gSprites[eventObject->spriteId].affineAnimPaused = eventObject->spriteAffineAnimPausedBackup; + } +} + +void UnfreezeEventObjects(void) +{ + u8 i; + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) + if (gEventObjects[i].active) + UnfreezeEventObject(&gEventObjects[i]); +} + +void Step1(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += gDirectionToVectors[dir].x; + sprite->pos1.y += gDirectionToVectors[dir].y; +} + +void Step2(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVectors[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVectors[dir].y; +} + +void Step3(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 2 * (u16) gDirectionToVectors[dir].x + (u16) gDirectionToVectors[dir].x; + sprite->pos1.y += 2 * (u16) gDirectionToVectors[dir].y + (u16) gDirectionToVectors[dir].y; +} + +void Step4(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 4 * (u16) gDirectionToVectors[dir].x; + sprite->pos1.y += 4 * (u16) gDirectionToVectors[dir].y; +} + +void Step8(struct Sprite *sprite, u8 dir) +{ + sprite->pos1.x += 8 * (u16) gDirectionToVectors[dir].x; + sprite->pos1.y += 8 * (u16) gDirectionToVectors[dir].y; +} + +void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = 0; +} + +typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); + +static const SpriteStepFunc gUnknown_0850E6C4[] = { + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, + Step1, +}; + +static const SpriteStepFunc gUnknown_0850E704[] = { + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, + Step2, +}; + +static const SpriteStepFunc gUnknown_0850E724[] = { + Step2, + Step3, + Step3, + Step2, + Step3, + Step3, +}; + +static const SpriteStepFunc gUnknown_0850E73C[] = { + Step4, + Step4, + Step4, + Step4, +}; + +static const SpriteStepFunc gUnknown_0850E74C[] = { + Step8, + Step8, +}; + +static const SpriteStepFunc *const gUnknown_0850E754[] = { + gUnknown_0850E6C4, + gUnknown_0850E704, + gUnknown_0850E724, + gUnknown_0850E73C, + gUnknown_0850E74C, +}; + +static const s16 gUnknown_0850E768[] = { + 16, 8, 6, 4, 2 +}; + +bool8 obj_npc_ministep(struct Sprite *sprite) +{ + if (sprite->data[5] >= gUnknown_0850E768[sprite->data[4]]) + return FALSE; + + gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); + + sprite->data[5]++; + + if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]]) + return FALSE; + + return TRUE; +} + +void sub_80976DC(struct Sprite *sprite, u8 a2) +{ + sprite->data[3] = a2; + sprite->data[4] = 0; + sprite->data[5] = 0; +} + +bool8 sub_80976EC(struct Sprite *sprite) +{ + if (!(sprite->data[4] & 1)) + { + Step1(sprite, sprite->data[3]); + sprite->data[5]++; + } + + sprite->data[4]++; + + if (sprite->data[5] > 15) + return TRUE; + else + return FALSE; +} + +const s8 gUnknown_0850E772[] = { + 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, +}; + +const s8 gUnknown_0850E7BA[] = { + 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, +}; + +s16 sub_8097728(s16 a1) +{ + return gUnknown_0850E7BA[a1]; +} + +s16 sub_809773C(s16 a1) +{ + return gUnknown_0850E772[a1]; +} + +void sub_8097750(struct Sprite *sprite) +{ + sprite->data[6] = 0; + sprite->data[7] = 0; +} + +bool8 sub_8097758(struct Sprite *sprite) +{ + bool8 result = FALSE; + + switch(sprite->data[7]) + { + case 0: + sprite->pos2.x += sub_809773C(sprite->data[6]); + sprite->pos2.y += sub_8097728(sprite->data[6]); + break; + case 1: + sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]); + sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]); + break; + case 2: + sprite->pos2.x -= sub_809773C(sprite->data[6]); + sprite->pos2.y += sub_8097728(sprite->data[6]); + break; + case 3: + sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]); + sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]); + break; + } + if(++sprite->data[6] == 0x48) + { + sprite->data[6] = 0; + sprite->data[7]++; + } + if(sprite->data[7] == 0x4) + { + sprite->pos2.y = 0; + sprite->pos2.x = 0; + result = TRUE; + } + return result; +} + +static const s8 gUnknown_0850E802[] = { + -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 gUnknown_0850E822[] = { + -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 +}; + +s16 sub_8097820(s16 a1, u8 a2) +{ + return gUnknown_0850E834[a2][a1]; +} + +void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) +{ + sprite->data[3] = a2; + sprite->data[4] = a3; + sprite->data[5] = a4; + sprite->data[6] = 0; +} + +static const s16 gUnknown_0850E840[] = { + 16, 16, 32, +}; + +static const u8 gUnknown_0850E846[] = { + 0, 0, 1, +}; + +u8 sub_809785C(struct Sprite *sprite) +{ + s16 v5[3]; + u8 v6[3]; + u8 v2; + + memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy + memcpy(v6, gUnknown_0850E846, 3); + v2 = 0; + + if (sprite->data[4]) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +static const s16 gUnknown_0850E84A[] = { + 32, 32, 64, +}; + +static const u8 gUnknown_0850E850[] = { + 1, 1, 2, +}; + +u8 sub_80978E4(struct Sprite *sprite) +{ + s16 v5[3]; + u8 v6[3]; + u8 v2; + + memcpy(v5, gUnknown_0850E84A, 6); + memcpy(v6, gUnknown_0850E850, 3); + v2 = 0; + + if (sprite->data[4] && !(sprite->data[6] & 1)) + Step1(sprite, sprite->data[3]); + + sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); + + sprite->data[6]++; + + if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) + v2 = 1; + + if (sprite->data[6] >= v5[sprite->data[4]]) + { + sprite->pos2.y = 0; + v2 = -1; + } + + return v2; +} + +void SetMovementDelay(struct Sprite *sprite, s16 timer) +{ + sprite->data[3] = timer; +} + +static bool8 WaitForMovementDelay(struct Sprite *sprite) +{ + sprite->data[3]--; + + if (sprite->data[3] == 0) + return TRUE; + else + return FALSE; +} + +void SetAndStartSpriteAnim(struct Sprite *sprite, u8 a2, u8 a3) +{ + sprite->animNum = a2; + sprite->animPaused = 0 ; + SeekSpriteAnim(sprite, a3); +} + +bool8 SpriteAnimEnded(struct Sprite *sprite) +{ + if (sprite->animEnded) + return TRUE; + else + return FALSE; +} + +void UpdateEventObjectSpriteVisibility(struct Sprite *sprite, bool8 invisible) +{ + u16 x, y; + s16 x2, y2; + + sprite->invisible = invisible; + + if (sprite->coordOffsetEnabled) + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + } + else + { + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; + } + + x2 = x - (sprite->centerToCornerVecX >> 1); + y2 = y - (sprite->centerToCornerVecY >> 1); + + if ((s16)x > 255 || x2 < -16) + sprite->invisible = 1; + if ((s16)y > 175 || y2 < -16) + sprite->invisible = 1; +} + +void UpdateEventObjectSpriteSubpriorityAndVisibility(struct Sprite *sprite) +{ + sub_8097D68(sprite); + SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); + UpdateEventObjectSpriteVisibility(sprite, sprite->data[2]); +} + +void sub_8097AF0(void) +{ + int i; + + for(i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if(sprite->inUse && sprite->callback == UpdateEventObjectSpriteSubpriorityAndVisibility) + DestroySprite(sprite); + } +} + +int sub_8097B2C(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. +{ + int i; + + for(i = 0; i < MAX_SPRITES; i++) + { + struct Sprite *sprite = &gSprites[i]; + if(sprite->inUse && sprite->callback == UpdateEventObjectSpriteSubpriorityAndVisibility && (u8)sprite->data[0] == var) + return i; + } + return MAX_SPRITES; +} + +void sub_8097B78(u8 var1, u8 var2) +{ + u8 spriteId = sub_8097B2C(var1); + + if(spriteId != MAX_SPRITES) + StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(var2)); +} + +void sub_8097BB4(u8 var1, u8 var2) +{ + int spriteId = sub_8097B2C(var1); + + if(spriteId != MAX_SPRITES) + { + struct Sprite *sprite = &gSprites[spriteId]; + const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(var2); + u16 tileNum = sprite->oam.tileNum; + + sprite->oam = *gfxInfo->oam; + sprite->oam.tileNum = tileNum; + sprite->oam.paletteNum = gfxInfo->paletteSlot; + sprite->images = gfxInfo->images; + + if(gfxInfo->subspriteTables == NULL) + { + sprite->subspriteTables = NULL; + sprite->subspriteTableNum = 0; + sprite->subspriteMode = 0; + } + else + { + SetSubspriteTables(sprite, gfxInfo->subspriteTables); + sprite->subspriteMode = 2; + } + StartSpriteAnim(sprite, 0); + } +} + +void sub_8097C44(u8 var, bool32 var2) +{ + u8 spriteId = sub_8097B2C(var); + + if(spriteId == MAX_SPRITES) + return; + + if(var2) + gSprites[spriteId].data[2] = 1; + else + gSprites[spriteId].data[2] = 0; +} + +bool32 sub_8097C8C(u8 var) +{ + u8 spriteId = sub_8097B2C(var); + + if(spriteId == MAX_SPRITES) + return FALSE; + + return (gSprites[spriteId].data[2] == TRUE); +} + +void sub_8097CC4(u8 var1, u8 var2) +{ + u8 spriteId = sub_8097B2C(var1); + + if(spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[3] = var2; + gSprites[spriteId].data[4] = 0; + } +} + +void sub_8097CF4(struct Sprite *sprite) +{ + switch(sprite->data[4]) + { + case 0: + sprite->pos2.y = 0; + sprite->data[4]++; + case 1: + sprite->pos2.y -= 8; + if(sprite->pos2.y == -160) + { + sprite->pos2.y = 0; + sprite->data[2] = 1; + sprite->data[3] = 0; + sprite->data[4] = 0; + } + } +} + +void sub_8097D30(struct Sprite *sprite) +{ + switch(sprite->data[4]) + { + case 0: + sprite->pos2.y = -160; + sprite->data[4]++; + case 1: + sprite->pos2.y += 8; + if(sprite->pos2.y == 0) + { + sprite->data[3] = 0; + sprite->data[4] = 0; + } + } +} + +static void sub_8097D68(struct Sprite *sprite) +{ + switch(sprite->data[3]) + { + case 1: + sub_8097D30(sprite); + break; + case 2: + sub_8097CF4(sprite); + break; + case 0: + break; + default: + sprite->data[3] = 0; + break; + } +} + +bool32 sub_8097D9C(u8 var) +{ + u8 spriteId = sub_8097B2C(var); + + if(spriteId == MAX_SPRITES) + return FALSE; + + if(gSprites[spriteId].data[3] != FALSE) + return TRUE; + + return FALSE; +} + +u32 StartFieldEffectForEventObject(u8 fieldEffectId, struct EventObject *eventObject) +{ + EventObjectGetLocalIdAndMap(eventObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + return FieldEffectStart(fieldEffectId); +} + +void DoShadowFieldEffect(struct EventObject *eventObject) +{ + if (!eventObject->hasShadow) + { + eventObject->hasShadow = 1; + StartFieldEffectForEventObject(FLDEFF_SHADOW, eventObject); + } +} + +static void DoRippleFieldEffect(struct EventObject *eventObject, struct Sprite *sprite) +{ + const struct EventObjectGraphicsInfo *gfxInfo = GetEventObjectGraphicsInfo(eventObject->graphicsId); + gFieldEffectArguments[0] = sprite->pos1.x; + gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; + gFieldEffectArguments[2] = 151; + gFieldEffectArguments[3] = 3; + FieldEffectStart(FLDEFF_RIPPLE); +} + +u8 (*const gMovementActionFuncs_StoreAndLockAnim[])(struct EventObject *, struct Sprite *) = { + MovementAction_StoreAndLockAnim_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_FreeAndUnlockAnim[])(struct EventObject *, struct Sprite *) = { + MovementAction_FreeAndUnlockAnim_Step0, + MovementAction_Finish, +}; + +u8 (*const gMovementActionFuncs_FlyUp[])(struct EventObject *, struct Sprite *) = { + MovementAction_FlyUp_Step0, + MovementAction_FlyUp_Step1, + MovementAction_Fly_Finish, +}; + +u8 (*const gMovementActionFuncs_FlyDown[])(struct EventObject *, struct Sprite *) = { + MovementAction_FlyDown_Step0, + MovementAction_FlyDown_Step1, + MovementAction_Fly_Finish, +}; + +u8 MovementAction_StoreAndLockAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + u32 one; + bool32 ableToStore = FALSE; + if (gLockedAnimEventObjects == NULL) + { + gLockedAnimEventObjects = AllocZeroed(sizeof(struct LockedAnimEventObjects)); + gLockedAnimEventObjects->eventObjectIds[0] = eventObject->localId; + // needed to match + gLockedAnimEventObjects->count = (one = 1); + ableToStore = one; + } + else + { + u8 i; + u8 firstFreeSlot; + bool32 found; + for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++) + { + if (firstFreeSlot == 16 && gLockedAnimEventObjects->eventObjectIds[i] == 0) + firstFreeSlot = i; + + if (gLockedAnimEventObjects->eventObjectIds[i] == eventObject->localId) + { + found = TRUE; + break; + } + } + + if (!found && firstFreeSlot != 16) + { + gLockedAnimEventObjects->eventObjectIds[firstFreeSlot] = eventObject->localId; + gLockedAnimEventObjects->count++; + ableToStore = TRUE; + } + } + + if (ableToStore == TRUE) + { + eventObject->inanimate = TRUE; + eventObject->facingDirectionLocked = TRUE; + } + + sprite->data[2] = 1; + return TRUE; +} + +u8 MovementAction_FreeAndUnlockAnim_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + bool32 ableToStore; + u8 index; + + sprite->data[2] = 1; + if (gLockedAnimEventObjects != NULL) + { + ableToStore = FALSE; + index = FindLockedEventObjectIndex(eventObject); + if (index != 16) + { + gLockedAnimEventObjects->eventObjectIds[index] = 0; + gLockedAnimEventObjects->count--; + ableToStore = TRUE; + } + if (gLockedAnimEventObjects->count == 0) + FREE_AND_SET_NULL(gLockedAnimEventObjects); + if (ableToStore == TRUE) + { + eventObject->inanimate = GetEventObjectGraphicsInfo(eventObject->graphicsId)->inanimate; + eventObject->facingDirectionLocked = FALSE; + sprite->animPaused = 0; + } + } + + return TRUE; +} + +u8 FindLockedEventObjectIndex(struct EventObject *eventObject) +{ + u8 i; + + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) + { + if (gLockedAnimEventObjects->eventObjectIds[i] == eventObject->localId) + return i; + } + return EVENT_OBJECTS_COUNT; +} + +void CreateLevitateMovementTask(struct EventObject *eventObject) +{ + u8 taskId = CreateTask(ApplyLevitateMovement, 0xFF); + struct Task *task = &gTasks[taskId]; + + StoreWordInTwoHalfwords(&task->data[0], (u32)eventObject); + eventObject->warpArrowSpriteId = taskId; + task->data[3] = 0xFFFF; +} + +static void ApplyLevitateMovement(u8 taskId) +{ + struct EventObject *eventObject; + struct Sprite *sprite; + struct Task *task = &gTasks[taskId]; + + LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&eventObject); // load the map object pointer. + sprite = &gSprites[eventObject->spriteId]; + + if(!(task->data[2] & 0x3)) + sprite->pos2.y += task->data[3]; + + if(!(task->data[2] & 0xF)) + task->data[3] = -task->data[3]; + + task->data[2]++; +} + +void DestroyExtraMovementTask(u8 taskId) +{ + struct EventObject *eventObject; + struct Task *task = &gTasks[taskId]; + + LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&eventObject); // unused eventObject + DestroyTask(taskId); +} + +void sub_8098074(u8 var1, u8 var2) +{ + u8 i; + + for(i = 0; i < EVENT_OBJECTS_COUNT; i++) + { + if(i != var1 && i != var2 && + gEventObjects[i].active && i != gPlayerAvatar.eventObjectId) + FreezeEventObject(&gEventObjects[i]); + } +} + +u8 MovementAction_FlyUp_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->pos2.y = 0; + sprite->data[2]++; + return FALSE; +} + +u8 MovementAction_FlyUp_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->pos2.y -= 8; + + if(sprite->pos2.y == -160) + sprite->data[2]++; + return FALSE; +} + +u8 MovementAction_FlyDown_Step0(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->pos2.y = -160; + sprite->data[2]++; + return FALSE; +} + +u8 MovementAction_FlyDown_Step1(struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->pos2.y += 8; + + if(!sprite->pos2.y) + sprite->data[2]++; + return FALSE; +} + +// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it. +u8 MovementAction_Fly_Finish(struct EventObject *eventObject, struct Sprite *sprite) +{ + return TRUE; +} diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 74eac32de..f039c5f24 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -62,7 +62,6 @@ extern const u8 gText_CommunicationStandby5[]; extern void sub_80356D0(void); extern void sub_807B154(void); -extern void sub_806A068(u16, u8); extern void sub_807F19C(void); extern void sub_807B140(void); extern void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); @@ -189,7 +188,7 @@ static void Task_BeginEvolutionScene(u8 taskID) switch (gTasks[taskID].tState) { case 0: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskID].tState++; break; case 1: @@ -280,9 +279,9 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, pokePal = GetMonSpritePalStructFromOtIdPersonality(currSpecies, trainerId, personality); LoadCompressedPalette(pokePal->data, 0x110, 0x20); - sub_806A068(currSpecies, 1); - gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->preEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30); + SetMultiuseSpriteTemplateToPokemon(currSpecies, 1); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->preEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 1; @@ -295,9 +294,9 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality); LoadCompressedPalette(pokePal->data, 0x120, 0x20); - sub_806A068(speciesToEvolve, 3); - gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30); + SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 3); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; gSprites[ID].invisible = 1; @@ -373,9 +372,9 @@ static void CB2_EvolutionSceneLoadGraphics(void) LoadCompressedPalette(pokePal->data, 0x120, 0x20); - sub_806A068(postEvoSpecies, 3); - gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30); + SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 3); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; @@ -386,7 +385,7 @@ static void CB2_EvolutionSceneLoadGraphics(void) SetVBlankCallback(VBlankCB_EvolutionScene); SetMainCallback2(CB2_EvolutionSceneUpdate); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); ShowBg(0); ShowBg(1); @@ -450,9 +449,9 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) { u8 ID; - sub_806A068(postEvoSpecies, 1); - gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30); + SetMultiuseSpriteTemplateToPokemon(postEvoSpecies, 1); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; @@ -470,7 +469,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) gMain.state++; break; case 7: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); sub_807B140(); ShowBg(0); ShowBg(1); @@ -509,9 +508,9 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri pokePal = GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, trainerId, personality); LoadCompressedPalette(pokePal->data, 0x120, 0x20); - sub_806A068(speciesToEvolve, 1); - gUnknown_0202499C.affineAnims = gDummySpriteAffineAnimTable; - sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gUnknown_0202499C, 120, 64, 30); + SetMultiuseSpriteTemplateToPokemon(speciesToEvolve, 1); + gMultiuseSpriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + sEvoStructPtr->postEvoSpriteID = ID = CreateSprite(&gMultiuseSpriteTemplate, 120, 64, 30); gSprites[ID].callback = SpriteCallbackDummy_2; gSprites[ID].oam.paletteNum = 2; @@ -623,7 +622,7 @@ static void Task_EvolutionScene(u8 taskID) switch (gTasks[taskID].tState) { case 0: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gSprites[sEvoStructPtr->preEvoSpriteID].invisible = 0; gTasks[taskID].tState++; ShowBg(0); @@ -635,7 +634,7 @@ static void Task_EvolutionScene(u8 taskID) if (!gPaletteFade.active) { StringExpandPlaceholders(gStringVar4, gText_PkmnIsEvolving); - BattleHandleAddTextPrinter(gStringVar4, 0); + BattlePutTextOnWindow(gStringVar4, 0); gTasks[taskID].tState++; } break; @@ -731,7 +730,7 @@ static void Task_EvolutionScene(u8 taskID) if (IsCryFinished()) { StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved); - BattleHandleAddTextPrinter(gStringVar4, 0); + BattlePutTextOnWindow(gStringVar4, 0); PlayBGM(MUS_FANFA5); gTasks[taskID].tState++; SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies)); @@ -771,7 +770,7 @@ static void Task_EvolutionScene(u8 taskID) } else // no move to learn { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskID].tState++; } } @@ -818,7 +817,7 @@ static void Task_EvolutionScene(u8 taskID) else // Fire Red leftover probably StringExpandPlaceholders(gStringVar4, gText_PkmnStoppedEvolving); - BattleHandleAddTextPrinter(gStringVar4, 0); + BattlePutTextOnWindow(gStringVar4, 0); gTasks[taskID].tEvoWasStopped = TRUE; gTasks[taskID].tState = 15; } @@ -829,7 +828,7 @@ static void Task_EvolutionScene(u8 taskID) BufferMoveToLearnIntoBattleTextBuff2(); PlayFanfare(MUS_FANFA1); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter gTasks[taskID].tState++; } @@ -846,7 +845,7 @@ static void Task_EvolutionScene(u8 taskID) { BufferMoveToLearnIntoBattleTextBuff2(); BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; } break; @@ -854,7 +853,7 @@ static void Task_EvolutionScene(u8 taskID) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; } break; @@ -862,7 +861,7 @@ static void Task_EvolutionScene(u8 taskID) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tData7 = 5; gTasks[taskID].tData8 = 10; gTasks[taskID].tLearnMoveState++; @@ -871,7 +870,7 @@ static void Task_EvolutionScene(u8 taskID) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { HandleBattleWindow(0x18, 8, 0x1D, 0xD, 0); - BattleHandleAddTextPrinter(gText_BattleYesNoChoice, 0xC); + BattlePutTextOnWindow(gText_BattleYesNoChoice, 0xC); gTasks[taskID].tLearnMoveState++; sEvoCursorPos = 0; BattleCreateYesNoCursorAt(0); @@ -905,7 +904,7 @@ static void Task_EvolutionScene(u8 taskID) { gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7; if (gTasks[taskID].tLearnMoveState == 5) - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); } } if (gMain.newKeys & B_BUTTON) @@ -939,7 +938,7 @@ static void Task_EvolutionScene(u8 taskID) if (IsHMMove2(move)) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState = 12; } else @@ -955,14 +954,14 @@ static void Task_EvolutionScene(u8 taskID) break; case 7: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; break; case 8: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tLearnMoveState++; } break; @@ -970,20 +969,20 @@ static void Task_EvolutionScene(u8 taskID) if (!IsTextPrinterActive(0) && !IsSEPlaying()) { BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tState = 20; } break; case 10: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tData7 = 11; gTasks[taskID].tData8 = 0; gTasks[taskID].tLearnMoveState = 3; break; case 11: BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]); - BattleHandleAddTextPrinter(gDisplayedStringBattle, 0); + BattlePutTextOnWindow(gDisplayedStringBattle, 0); gTasks[taskID].tState = 15; break; case 12: @@ -1215,7 +1214,7 @@ static void Task_TradeEvolutionScene(u8 taskID) case 3: if (!IsTextPrinterActive(0) && !IsSEPlaying()) { - sub_809882C(0, 0xA8, 0xE0); + LoadUserWindowBorderGfx(0, 0xA8, 0xE0); CreateYesNoMenu(&gUnknown_0833900C, 0xA8, 0xE, 0); sEvoCursorPos = 0; gTasks[taskID].tLearnMoveState++; @@ -1231,7 +1230,7 @@ static void Task_TradeEvolutionScene(u8 taskID) sub_807F1A8(0, gDisplayedStringBattle, 1); gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7; if (gTasks[taskID].tLearnMoveState == 5) - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); break; case 1: case -1: diff --git a/src/field_camera.c b/src/field_camera.c index 17ced6aa5..8629bec2b 100644 --- a/src/field_camera.c +++ b/src/field_camera.c @@ -1,9 +1,20 @@ - -// Includes #include "global.h" +#include "berry.h" +#include "bike.h" +#include "field_camera.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "event_object_movement.h" +#include "gpu_regs.h" +#include "menu.h" +#include "overworld.h" +#include "rotating_gate.h" +#include "sprite.h" +#include "text.h" -// Static type declarations +EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE; +// Static type declarations struct FieldCameraUnknownStruct { u8 unk0; @@ -13,16 +24,478 @@ struct FieldCameraUnknownStruct bool8 unk4; }; -// Static RAM declarations +// static functions +static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout); +static void RedrawMapSliceSouth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout); +static void RedrawMapSliceEast(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout); +static void RedrawMapSliceWest(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout); +static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y); +static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout); +static void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int); +static void DrawMetatile(s32 a, u16 *b, u16 c); +static void CameraPanningCB_PanAhead(void); + +// IWRAM bss vars +static IWRAM_DATA struct FieldCameraUnknownStruct gUnknown_03000E20; +static IWRAM_DATA s16 gUnknown_03000E28; +static IWRAM_DATA s16 gUnknown_03000E2A; +static IWRAM_DATA u8 gUnknown_03000E2C; +static IWRAM_DATA void (*gUnknown_03000E30)(void); + +struct CameraObject gUnknown_03005DD0; +u16 gUnknown_03005DE8; +u16 gUnknown_03005DEC; + +// text +static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraUnknownStruct *a) +{ + a->unk2 = 0; + a->unk3 = 0; + a->unk0 = 0; + a->unk1 = 0; + a->unk4 = TRUE; +} + +static void tilemap_move_something(struct FieldCameraUnknownStruct *a, u32 b, u32 c) +{ + a->unk2 += b; + a->unk2 %= 32; + a->unk3 += c; + a->unk3 %= 32; +} + +static void coords8_add(struct FieldCameraUnknownStruct *a, u32 b, u32 c) +{ + a->unk0 += b; + a->unk1 += c; +} + +void move_tilemap_camera_to_upper_left_corner(void) +{ + move_tilemap_camera_to_upper_left_corner_(&gUnknown_03000E20); +} + +void FieldUpdateBgTilemapScroll(void) +{ + u32 r4, r5; + r5 = gUnknown_03000E20.unk0 + gUnknown_03000E28; + r4 = gUnknown_03000E2A + gUnknown_03000E20.unk1 + 8; + + SetGpuReg(REG_OFFSET_BG1HOFS, r5); + SetGpuReg(REG_OFFSET_BG1VOFS, r4); + SetGpuReg(REG_OFFSET_BG2HOFS, r5); + SetGpuReg(REG_OFFSET_BG2VOFS, r4); + SetGpuReg(REG_OFFSET_BG3HOFS, r5); + SetGpuReg(REG_OFFSET_BG3VOFS, r4); +} + +void sub_8089C08(s16 *a, s16 *b) +{ + *a = gUnknown_03000E20.unk0 + gUnknown_03000E28; + *b = gUnknown_03000E20.unk1 + gUnknown_03000E2A + 8; +} + +void DrawWholeMapView(void) +{ + DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout); + gUnknown_03000E20.unk4 = TRUE; +} + +static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout) +{ + u8 i; + u8 j; + u32 r6; + u8 temp; + + for (i = 0; i < 32; i += 2) + { + temp = gUnknown_03000E20.unk3 + i; + if (temp >= 32) + temp -= 32; + r6 = temp * 32; + for (j = 0; j < 32; j += 2) + { + temp = gUnknown_03000E20.unk2 + j; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2); + } + } +} + +static void RedrawMapSlicesForCameraUpdate(struct FieldCameraUnknownStruct *a, int x, int y) +{ + const struct MapLayout *mapLayout = gMapHeader.mapLayout; + + if (x > 0) + RedrawMapSliceWest(a, mapLayout); + if (x < 0) + RedrawMapSliceEast(a, mapLayout); + if (y > 0) + RedrawMapSliceNorth(a, mapLayout); + if (y < 0) + RedrawMapSliceSouth(a, mapLayout); + a->unk4 = TRUE; +} + +static void RedrawMapSliceNorth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout) +{ + u8 i; + u8 temp; + u32 r7; + + temp = a->unk3 + 28; + if (temp >= 32) + temp -= 32; + r7 = temp * 32; + for (i = 0; i < 32; i += 2) + { + temp = a->unk2 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14); + } +} + +static void RedrawMapSliceSouth(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout) +{ + u8 i; + u8 temp; + u32 r7 = a->unk3 * 32; + + for (i = 0; i < 32; i += 2) + { + temp = a->unk2 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y); + } +} + +static void RedrawMapSliceEast(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout) +{ + u8 i; + u8 temp; + u32 r6 = a->unk2; + + for (i = 0; i < 32; i += 2) + { + temp = a->unk3 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapLayout, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2); + } +} + +static void RedrawMapSliceWest(struct FieldCameraUnknownStruct *a, const struct MapLayout *mapLayout) +{ + u8 i; + u8 temp; + u8 r5 = a->unk2 + 28; + + if (r5 >= 32) + r5 -= 32; + for (i = 0; i < 32; i += 2) + { + temp = a->unk3 + i; + if (temp >= 32) + temp -= 32; + DrawMetatileAt(mapLayout, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2); + } +} + +void CurrentMapDrawMetatileAt(int a, int b) +{ + int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, a, b); + + if (offset >= 0) + { + DrawMetatileAt(gMapHeader.mapLayout, offset, a, b); + gUnknown_03000E20.unk4 = TRUE; + } +} + +void DrawDoorMetatileAt(int x, int y, u16 *arr) +{ + int offset = MapPosToBgTilemapOffset(&gUnknown_03000E20, x, y); + + if (offset >= 0) + { + DrawMetatile(1, arr, offset); + gUnknown_03000E20.unk4 = TRUE; + } +} + +static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 b, int c, int d) +{ + u16 metatileId = MapGridGetMetatileIdAt(c, d); + u16 *metatiles; + + if (metatileId > 1024) + metatileId = 0; + if (metatileId < 512) + metatiles = mapLayout->primaryTileset->metatiles; + else + { + metatiles = mapLayout->secondaryTileset->metatiles; + metatileId -= 512; + } + DrawMetatile(MapGridGetMetatileLayerTypeAt(c, d), metatiles + metatileId * 8, b); +} + +static void DrawMetatile(s32 a, u16 *b, u16 c) +{ + switch (a) + { + case 2: + gBGTilemapBuffers3[c] = b[0]; + gBGTilemapBuffers3[c + 1] = b[1]; + gBGTilemapBuffers3[c + 0x20] = b[2]; + gBGTilemapBuffers3[c + 0x21] = b[3]; + + gBGTilemapBuffers1[c] = 0; + gBGTilemapBuffers1[c + 1] = 0; + gBGTilemapBuffers1[c + 0x20] = 0; + gBGTilemapBuffers1[c + 0x21] = 0; + + gBGTilemapBuffers2[c] = b[4]; + gBGTilemapBuffers2[c + 1] = b[5]; + gBGTilemapBuffers2[c + 0x20] = b[6]; + gBGTilemapBuffers2[c + 0x21] = b[7]; + break; + case 1: + gBGTilemapBuffers3[c] = b[0]; + gBGTilemapBuffers3[c + 1] = b[1]; + gBGTilemapBuffers3[c + 0x20] = b[2]; + gBGTilemapBuffers3[c + 0x21] = b[3]; + + gBGTilemapBuffers1[c] = b[4]; + gBGTilemapBuffers1[c + 1] = b[5]; + gBGTilemapBuffers1[c + 0x20] = b[6]; + gBGTilemapBuffers1[c + 0x21] = b[7]; + + gBGTilemapBuffers2[c] = 0; + gBGTilemapBuffers2[c + 1] = 0; + gBGTilemapBuffers2[c + 0x20] = 0; + gBGTilemapBuffers2[c + 0x21] = 0; + break; + case 0: + gBGTilemapBuffers3[c] = 0x3014; + gBGTilemapBuffers3[c + 1] = 0x3014; + gBGTilemapBuffers3[c + 0x20] = 0x3014; + gBGTilemapBuffers3[c + 0x21] = 0x3014; + + gBGTilemapBuffers1[c] = b[0]; + gBGTilemapBuffers1[c + 1] = b[1]; + gBGTilemapBuffers1[c + 0x20] = b[2]; + gBGTilemapBuffers1[c + 0x21] = b[3]; + + gBGTilemapBuffers2[c] = b[4]; + gBGTilemapBuffers2[c + 1] = b[5]; + gBGTilemapBuffers2[c + 0x20] = b[6]; + gBGTilemapBuffers2[c + 0x21] = b[7]; + break; + } + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); + schedule_bg_copy_tilemap_to_vram(3); +} + +static s32 MapPosToBgTilemapOffset(struct FieldCameraUnknownStruct *a, s32 x, s32 y) +{ + x -= gSaveBlock1Ptr->pos.x; + x *= 2; + if (x >= 32 || x < 0) + return -1; + x = x + a->unk2; + if (x >= 32) + x -= 32; + + y = (y - gSaveBlock1Ptr->pos.y) * 2; + if (y >= 32 || y < 0) + return -1; + y = y + a->unk3; + if (y >= 32) + y -= 32; + + return y * 32 + x; +} + +static void CameraUpdateCallback(struct CameraObject *a) +{ + if (a->spriteId != 0) + { + a->unk8 = gSprites[a->spriteId].data[2]; + a->unkC = gSprites[a->spriteId].data[3]; + } +} + +void ResetCameraUpdateInfo(void) +{ + gUnknown_03005DD0.unk8 = 0; + gUnknown_03005DD0.unkC = 0; + gUnknown_03005DD0.x = 0; + gUnknown_03005DD0.y = 0; + gUnknown_03005DD0.spriteId = 0; + gUnknown_03005DD0.callback = NULL; +} -IWRAM_DATA struct FieldCameraUnknownStruct gUnknown_03000E20; -IWRAM_DATA s16 gUnknown_03000E28; -IWRAM_DATA s16 gUnknown_03000E2A; -IWRAM_DATA u8 gUnknown_03000E2C; -IWRAM_DATA void (*gUnknown_03000E30)(void); +u32 InitCameraUpdateCallback(u8 a) +{ + if (gUnknown_03005DD0.spriteId != 0) + DestroySprite(&gSprites[gUnknown_03005DD0.spriteId]); + gUnknown_03005DD0.spriteId = AddCameraObject(a); + gUnknown_03005DD0.callback = CameraUpdateCallback; + return 0; +} + +void CameraUpdate(void) +{ + int deltaX; + int deltaY; + int r0; + int r1; + int r7; + int r8; + + if (gUnknown_03005DD0.callback != NULL) + gUnknown_03005DD0.callback(&gUnknown_03005DD0); + r7 = gUnknown_03005DD0.unk8; + r8 = gUnknown_03005DD0.unkC; + deltaX = 0; + deltaY = 0; + r1 = gUnknown_03005DD0.x; + r0 = gUnknown_03005DD0.y; + + + if (r1 == 0 && r7 != 0) + { + if (r7 > 0) + deltaX = 1; + else + deltaX = -1; + } + if (r0 == 0 && r8 != 0) + { + if (r8 > 0) + deltaY = 1; + else + deltaY = -1; + } + if (r1 != 0 && r1 == -r7) + { + if (r7 > 0) + deltaX = 1; + else + deltaX = -1; + } + if (r0 != 0 && r0 == -r8) + { + if (r8 > 0) + deltaX = 1; + else + deltaX = -1; + } + + gUnknown_03005DD0.x += r7; + gUnknown_03005DD0.x = gUnknown_03005DD0.x - 16 * (gUnknown_03005DD0.x / 16); + gUnknown_03005DD0.y += r8; + gUnknown_03005DD0.y = gUnknown_03005DD0.y - 16 * (gUnknown_03005DD0.y / 16); + + if (deltaX != 0 || deltaY != 0) + { + CameraMove(deltaX, deltaY); + UpdateEventObjectsForCameraUpdate(deltaX, deltaY); + RotatingGatePuzzleCameraUpdate(deltaX, deltaY); + ResetBerryTreeSparkleFlags(); + tilemap_move_something(&gUnknown_03000E20, deltaX * 2, deltaY * 2); + RedrawMapSlicesForCameraUpdate(&gUnknown_03000E20, deltaX * 2, deltaY * 2); + } + + coords8_add(&gUnknown_03000E20, r7, r8); + gUnknown_03005DEC -= r7; + gUnknown_03005DE8 -= r8; +} + +void camera_move_and_redraw(int a, int b) //unused +{ + CameraMove(a, b); + UpdateEventObjectsForCameraUpdate(a, b); + DrawWholeMapView(); + gUnknown_03005DEC -= a * 16; + gUnknown_03005DE8 -= b * 16; +} + +void SetCameraPanningCallback(void (*a)(void)) +{ + gUnknown_03000E30 = a; +} + +void SetCameraPanning(s16 a, s16 b) +{ + gUnknown_03000E28 = a; + gUnknown_03000E2A = b + 32; +} + +void InstallCameraPanAheadCallback(void) +{ + gUnknown_03000E30 = CameraPanningCB_PanAhead; + gUnknown_03000E2C = 0; + gUnknown_03000E28 = 0; + gUnknown_03000E2A = 32; +} + +void UpdateCameraPanning(void) +{ + if (gUnknown_03000E30 != NULL) + gUnknown_03000E30(); + //Update sprite offset of overworld objects + gSpriteCoordOffsetX = gUnknown_03005DEC - gUnknown_03000E28; + gSpriteCoordOffsetY = gUnknown_03005DE8 - gUnknown_03000E2A - 8; +} + +static void CameraPanningCB_PanAhead(void) +{ + u8 var; -// Static ROM declarations + if (gUnusedBikeCameraAheadPanback == FALSE) + { + InstallCameraPanAheadCallback(); + } + else + { + // this code is never reached. + if (gPlayerAvatar.tileTransitionState == T_TILE_TRANSITION) + { + gUnknown_03000E2C ^= 1; + if (gUnknown_03000E2C == 0) + return; + } + else + { + gUnknown_03000E2C = 0; + } -// .rodata + var = GetPlayerMovementDirection(); + if (var == 2) + { + if (gUnknown_03000E2A > -8) + gUnknown_03000E2A -= 2; + } + else if (var == 1) + { + if (gUnknown_03000E2A < 72) + gUnknown_03000E2A += 2; + } + else if (gUnknown_03000E2A < 32) + { + gUnknown_03000E2A += 2; + } + else if (gUnknown_03000E2A > 32) + { + gUnknown_03000E2A -= 2; + } + } +} -// .text diff --git a/src/field_door.c b/src/field_door.c index f73c6bb55..fe9de01fd 100644 --- a/src/field_door.c +++ b/src/field_door.c @@ -889,7 +889,7 @@ bool8 sub_808A964(void) { if (FlagGet(FLAG_SPECIAL_FLAG_0x4002)) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR_2) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR_2)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR2) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR2)) { return TRUE; } diff --git a/src/field_effect.c b/src/field_effect.c index 628dc776a..f047c78a3 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,15 +1,3896 @@ // Includes #include "global.h" +#include "field_effect.h" +#include "battle_dome_cards.h" +#include "decompress.h" +#include "field_camera.h" +#include "field_effect_helpers.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "field_screen.h" +#include "field_weather.h" +#include "fieldmap.h" +#include "fldeff_groundshake.h" +#include "gpu_regs.h" +#include "main.h" +#include "menu.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "util.h" +#include "constants/rgb.h" +#include "constants/songs.h" + +#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} + +EWRAM_DATA s32 gFieldEffectArguments[8] = {0}; // Static type declarations // Static RAM declarations -IWRAM_DATA u8 gUnknown_03000F58[32]; +static IWRAM_DATA u8 sActiveList[32]; // Static ROM declarations +extern u8 *gFieldEffectScriptPointers[]; + // .rodata +const u32 gNewGameBirchPic[] = INCBIN_U32("graphics/birch_speech/birch.4bpp"); +const u32 gUnusedBirchBeauty[] = INCBIN_U32("graphics/unused/intro_birch_beauty.4bpp"); +const u16 gNewGameBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal"); +const u32 gSpriteImage_855A970[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp"); +const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_04.gbapal"); +const u32 gSpriteImage_855A9B0[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); +const u32 gSpriteImage_855AA70[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); +const u32 gSpriteImage_855AB30[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); +const u8 gSpriteImage_855AD30[] = INCBIN_U8("graphics/misc/small_hof_monitor.4bpp"); +const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/event_objects/palettes/field_effect_object_palette_05.gbapal"); + +// Graphics for the lights streaking past your Pokemon when it uses a field move. +const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp"); +const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal"); +const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin"); + +// The following light streaks effect is used when the map is dark (e.g. a cave). +const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp"); +const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal"); +const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin"); + +const u16 gUnknown_0855B610[16] = INCBIN_U16("graphics/misc/spotlight.gbapal"); +const u8 gUnknown_0855B630[] = INCBIN_U8("graphics/misc/spotlight.4bpp"); +const u8 gUnknown_0855C170[] = INCBIN_U8("graphics/unknown/unknown_55C170.4bpp"); +const u8 gUnknown_0855C190[] = INCBIN_U8("graphics/unknown/unknown_55C190.4bpp"); +const u8 gUnknown_0855C1B0[] = INCBIN_U8("graphics/unknown/unknown_55C1B0.4bpp"); +const u8 gUnknown_0855C1D0[] = INCBIN_U8("graphics/unknown/unknown_55C1D0.4bpp"); + +bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = { + FieldEffectCmd_loadtiles, + FieldEffectCmd_loadfadedpal, + FieldEffectCmd_loadpal, + FieldEffectCmd_callnative, + FieldEffectCmd_end, + FieldEffectCmd_loadgfx_callnative, + FieldEffectCmd_loadtiles_callnative, + FieldEffectCmd_loadfadedpal_callnative, +}; + +const struct OamData gNewGameBirchOamAttributes = {.size = 3}; +const struct OamData gOamData_855C218 = {.size = 0}; +const struct OamData gOamData_855C220 = {.size = 1}; + +const struct SpriteFrameImage gNewGameBirchPicTable[] = { + obj_frame_tiles(gNewGameBirchPic) +}; +const struct SpritePalette gNewGameBirchObjectPaletteInfo = {.data = gNewGameBirchPalette, .tag = 0x1006}; + +const union AnimCmd gNewGameBirchImageAnim[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_END +}; + +const union AnimCmd *const gNewGameBirchImageAnimTable[] = { + gNewGameBirchImageAnim +}; + +const struct SpriteTemplate gNewGameBirchObjectTemplate = { + .tileTag = 0xffff, + .paletteTag = 4102, + .oam = &gNewGameBirchOamAttributes, + .anims = gNewGameBirchImageAnimTable, + .images = gNewGameBirchPicTable, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007}; +const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010}; +const struct OamData gOamData_855C26C = { + .shape = 1, + .size = 2 +}; + +const struct SpriteFrameImage gSpriteImageTable_855C274[] = { + obj_frame_tiles(gSpriteImage_855A970) +}; + +const struct SpriteFrameImage gSpriteImageTable_855C27C[] = { + obj_frame_tiles(gSpriteImage_855A9B0), + obj_frame_tiles(gSpriteImage_855AA70) +}; + +const struct SpriteFrameImage gSpriteImageTable_855C28C[] = { + obj_frame_tiles(gSpriteImage_855AB30) +}; + +const struct SpriteFrameImage gSpriteImageTable_855C294[] = { + {.data = gSpriteImage_855AD30, .size = 0x200} // the macro breaks down here +}; + +const struct Subsprite gSubspriteTable_855C29C[] = { + {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0}, + {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0}, + {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0}, + {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0} +}; + +const struct SubspriteTable gUnknown_0855C2AC = subsprite_table(gSubspriteTable_855C29C); + +const struct Subsprite gSubspriteTable_855C2B4[] = { + {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1}, + {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1}, + {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1}, + {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1} +}; + +const struct SubspriteTable gUnknown_0855C2C4 = subsprite_table(gSubspriteTable_855C2B4); + +const union AnimCmd gSpriteAnim_855C2CC[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_855C2D4[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_855C2F8[] = { + gSpriteAnim_855C2CC, + gSpriteAnim_855C2D4 +}; + +const union AnimCmd *const gSpriteAnimTable_855C300[] = { + gSpriteAnim_855C2CC +}; + +const struct SpriteTemplate gSpriteTemplate_855C304 = { + .tileTag = 0xffff, + .paletteTag = 4103, + .oam = &gOamData_855C218, + .anims = gSpriteAnimTable_855C2F8, + .images = gSpriteImageTable_855C274, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokeballGlow +}; + +const struct SpriteTemplate gSpriteTemplate_855C31C = { + .tileTag = 0xffff, + .paletteTag = 4100, + .oam = &gOamData_855C220, + .anims = gSpriteAnimTable_855C2F8, + .images = gSpriteImageTable_855C27C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokecenterMonitor +}; + +const struct SpriteTemplate gSpriteTemplate_855C334 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_855C220, + .anims = gSpriteAnimTable_855C300, + .images = gSpriteImageTable_855C28C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + +const struct SpriteTemplate gSpriteTemplate_855C34C = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_855C26C, + .anims = gSpriteAnimTable_855C300, + .images = gSpriteImageTable_855C294, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + +void (*const gUnknown_0855C364[])(struct Task *) = { + PokecenterHealEffect_0, + PokecenterHealEffect_1, + PokecenterHealEffect_2, + PokecenterHealEffect_3 +}; + +void (*const gUnknown_0855C374[])(struct Task *) = { + HallOfFameRecordEffect_0, + HallOfFameRecordEffect_1, + HallOfFameRecordEffect_2, + HallOfFameRecordEffect_3 +}; + +void (*const gUnknown_0855C384[])(struct Sprite *) = { + PokeballGlowEffect_0, + PokeballGlowEffect_1, + PokeballGlowEffect_2, + PokeballGlowEffect_3, + PokeballGlowEffect_4, + PokeballGlowEffect_5, + PokeballGlowEffect_6, + PokeballGlowEffect_7 +}; + +const struct Coords16 gUnknown_0855C3A4[] = { + {.x = 0, .y = 0}, + {.x = 6, .y = 0}, + {.x = 0, .y = 4}, + {.x = 6, .y = 4}, + {.x = 0, .y = 8}, + {.x = 6, .y = 8} +}; + +const u8 gUnknown_0855C3BC[] = {16, 12, 8, 0}; +const u8 gUnknown_0855C3C0[] = {16, 12, 8, 0}; +const u8 gUnknown_0855C3C4[] = { 0, 0, 0, 0}; + +bool8 (*const gUnknown_0855C3C8[])(struct Task *) = { + sub_80B6BCC, + sub_80B6C74, + sub_80B6C90, + sub_80B6D04, + sub_80B6DBC, + sub_80B6DD8, + sub_80B6E18, +}; + +bool8 (*const gUnknown_0855C3E4[])(struct Task *) = { + sub_80B6EC0, + sub_80B6EE0, + sub_80B6F50, + sub_80B6F74, + sub_80B6F84, + sub_80B6FA8, +}; + +bool8 (*const gUnknown_0855C3FC[])(struct Task *) = { + sub_80B7114, + sub_80B7190, + sub_80B71D0, + sub_80B7230, + sub_80B7270, + sub_80B72D0, + sub_80B72F4, +}; + +bool8 (*const gUnknown_0855C418[])(struct Task *, struct EventObject *) = { + sub_80B73D0, + waterfall_1_do_anim_probably, + waterfall_2_wait_anim_finish_probably, + sub_80B7450, + sub_80B7478, +}; + +bool8 (*const gUnknown_0855C42C[])(struct Task *) = { + dive_1_lock, + dive_2_unknown, + dive_3_unknown, +}; + +bool8 (*const gUnknown_0855C438[])(struct Task *, struct EventObject *, struct Sprite *) = { + sub_80B764C, + sub_80B7684, + sub_80B76B8, + sub_80B7704, + sub_80B77F8, + sub_80B7814, +}; + +bool8 (*const gUnknown_0855C450[])(struct Task *, struct EventObject *, struct Sprite *) = { + sub_80B78EC, + sub_80B791C, + sub_80B7968, + sub_80B79BC, +}; + +bool8 (*const gUnknown_0855C460[])(struct Task *, struct EventObject *, struct Sprite *) = { + sub_80B7AE8, + sub_80B7B18, + sub_80B7B94, + sub_80B7BCC, + sub_80B7BF4, +}; + +void (*const gUnknown_0855C474[])(struct Task *) = { + sub_80B7D14, + sub_80B7D34, +}; // .text + +u32 FieldEffectStart(u8 id) +{ + u8 *script; + u32 val; + + FieldEffectActiveListAdd(id); + + script = gFieldEffectScriptPointers[id]; + + while (gFieldEffectScriptFuncs[*script](&script, &val)) + ; + + return val; +} + +bool8 FieldEffectCmd_loadtiles(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadFadedPalette(script); + return TRUE; +} + +bool8 FieldEffectCmd_loadpal(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadPalette(script); + return TRUE; +} + +bool8 FieldEffectCmd_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_end(u8 **script, u32 *val) +{ + return FALSE; +} + +bool8 FieldEffectCmd_loadgfx_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_LoadFadedPalette(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_loadtiles_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadTiles(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +bool8 FieldEffectCmd_loadfadedpal_callnative(u8 **script, u32 *val) +{ + (*script)++; + FieldEffectScript_LoadFadedPalette(script); + FieldEffectScript_CallNative(script, val); + return TRUE; +} + +u32 FieldEffectScript_ReadWord(u8 **script) +{ + return (*script)[0] + + ((*script)[1] << 8) + + ((*script)[2] << 16) + + ((*script)[3] << 24); +} + +void FieldEffectScript_LoadTiles(u8 **script) +{ + struct SpriteSheet *sheet = (struct SpriteSheet *)FieldEffectScript_ReadWord(script); + if (GetSpriteTileStartByTag(sheet->tag) == 0xFFFF) + LoadSpriteSheet(sheet); + (*script) += 4; +} + +void FieldEffectScript_LoadFadedPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); + (*script) += 4; +} + +void FieldEffectScript_LoadPalette(u8 **script) +{ + struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); + LoadSpritePalette(palette); + (*script) += 4; +} + +void FieldEffectScript_CallNative(u8 **script, u32 *val) +{ + u32 (*func)(void) = (u32 (*)(void))FieldEffectScript_ReadWord(script); + *val = func(); + (*script) += 4; +} + +void FieldEffectFreeGraphicsResources(struct Sprite *sprite) +{ + u16 sheetTileStart = sprite->sheetTileStart; + u32 paletteNum = sprite->oam.paletteNum; + DestroySprite(sprite); + FieldEffectFreeTilesIfUnused(sheetTileStart); + FieldEffectFreePaletteIfUnused(paletteNum); +} + +void FieldEffectStop(struct Sprite *sprite, u8 id) +{ + FieldEffectFreeGraphicsResources(sprite); + FieldEffectActiveListRemove(id); +} + +void FieldEffectFreeTilesIfUnused(u16 tileStart) +{ + u8 i; + u16 tag = GetSpriteTileTagByTileStart(tileStart); + + if (tag != 0xFFFF) + { + for (i = 0; i < MAX_SPRITES; i++) + if (gSprites[i].inUse && gSprites[i].usingSheet && tileStart == gSprites[i].sheetTileStart) + return; + FreeSpriteTilesByTag(tag); + } +} + +void FieldEffectFreePaletteIfUnused(u8 paletteNum) +{ + u8 i; + u16 tag = GetSpritePaletteTagByPaletteNum(paletteNum); + + if (tag != 0xFFFF) + { + for (i = 0; i < MAX_SPRITES; i++) + if (gSprites[i].inUse && gSprites[i].oam.paletteNum == paletteNum) + return; + FreeSpritePaletteByTag(tag); + } +} + +void FieldEffectActiveListClear(void) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + sActiveList[i] = 0xFF; +} + +void FieldEffectActiveListAdd(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + { + if (sActiveList[i] == 0xFF) + { + sActiveList[i] = id; + return; + } + } +} + +void FieldEffectActiveListRemove(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + { + if (sActiveList[i] == id) + { + sActiveList[i] = 0xFF; + return; + } + } +} + +bool8 FieldEffectActiveListContains(u8 id) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(sActiveList); i++) + if (sActiveList[i] == id) + return TRUE; + return FALSE; +} + +u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer) +{ + struct SpriteTemplate spriteTemplate; + LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[trainerSpriteID], buffer); + LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[trainerSpriteID], buffer); + spriteTemplate.tileTag = gTrainerFrontPicTable[trainerSpriteID].tag; + spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[trainerSpriteID].tag; + spriteTemplate.oam = &gNewGameBirchOamAttributes; + spriteTemplate.anims = gDummySpriteAnimTable; + spriteTemplate.images = NULL; + spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + spriteTemplate.callback = SpriteCallbackDummy; + return CreateSprite(&spriteTemplate, x, y, subpriority); +} + +void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +{ + LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); + LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); +} + +u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority) +{ + LoadSpritePalette(&gNewGameBirchObjectPaletteInfo); + return CreateSprite(&gNewGameBirchObjectTemplate, x, y, subpriority); +} + +#ifdef NONMATCHING +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y) +{ + u16 spriteId = sub_818D7D8(species, 0, 0x8000, 1, x, y, 0, gMonPaletteTable[species].tag); + PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[species].tag) + 0x10); + if (spriteId == 0xFFFF) + return 0x40; + + return spriteId; +} +#else +NAKED +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y) +{ + asm_unified("push {r4,r5,lr}\n\ + sub sp, 0x10\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r3, 0x80\n\ + lsls r3, 8\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + str r1, [sp]\n\ + lsls r2, 16\n\ + asrs r2, 16\n\ + str r2, [sp, 0x4]\n\ + movs r1, 0\n\ + str r1, [sp, 0x8]\n\ + ldr r1, =gMonPaletteTable\n\ + lsls r4, r0, 3\n\ + adds r4, r1\n\ + ldrh r1, [r4, 0x4]\n\ + str r1, [sp, 0xC]\n\ + movs r1, 0\n\ + adds r2, r3, 0\n\ + movs r3, 0x1\n\ + bl sub_818D7D8\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldrh r0, [r4, 0x4]\n\ + bl IndexOfSpritePaletteTag\n\ + adds r0, 0x10\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl PreservePaletteInWeather\n\ + ldr r0, =0x0000ffff\n\ + cmp r5, r0\n\ + beq _080B5FDC\n\ + lsls r0, r5, 24\n\ + lsrs r0, 24\n\ + b _080B5FDE\n\ + .pool\n\ +_080B5FDC:\n\ + movs r0, 0x40\n\ +_080B5FDE:\n\ + add sp, 0x10\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1"); +} +#endif //NONMATCHING + +u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +{ + const struct CompressedSpritePalette *spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); + u16 spriteId = sub_818D7D8(species, d, g, 1, x, y, 0, spritePalette->tag); + PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + if (spriteId == 0xFFFF) + return 0x40; + + return spriteId; +} + +void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId) +{ + ResetPreservedPalettesInWeather(); + if (sprite->oam.affineMode != 0) + { + FreeOamMatrix(sprite->oam.matrixNum); + } + sub_818D820(spriteId); +} + +#ifdef NONMATCHING +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed += (((0x1f - curRed) * r) >> 4); + curGreen += (((0x1f - curGreen) * g) >> 4); + curBlue += (((0x1f - curBlue) * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} + +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed -= ((curRed * r) >> 4); + curGreen -= ((curGreen * g) >> 4); + curBlue -= ((curBlue * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} +#else +NAKED +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r9, r5\n" + "\tmov r8, r4\n" + "\tmov r6, r8\n" + "\tands r6, r5\n" + "\tmov r8, r6\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 2\n" + "\tands r6, r4\n" + "\tlsrs r6, 5\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 7\n" + "\tands r4, r5\n" + "\tlsrs r4, 10\n" + "\tmov r7, r9\n" + "\tmov r5, r8\n" + "\tsubs r7, r5\n" + "\tmov r12, r7\n" + "\tmov r7, r12\n" + "\tmuls r7, r1\n" + "\tadds r1, r7, 0\n" + "\tasrs r1, 4\n" + "\tadd r8, r1\n" + "\tmov r5, r9\n" + "\tsubs r1, r5, r6\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tadds r6, r1\n" + "\tsubs r5, r4\n" + "\tmov r9, r5\n" + "\tmov r1, r9\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tadds r4, r1\n" + "\tmov r7, r8\n" + "\tlsls r7, 16\n" + "\tlsls r6, 21\n" + "\torrs r6, r7\n" + "\tlsls r4, 26\n" + "\torrs r4, r6\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D00: .4byte gPlttBufferUnfaded\n" + "_08085D04: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} + +NAKED +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r6,lr}\n" + "\tmov r6, r8\n" + "\tpush {r6}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r8, r5\n" + "\tmov r6, r8\n" + "\tands r6, r4\n" + "\tmov r8, r6\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 2\n" + "\tands r5, r4\n" + "\tlsrs r5, 5\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 7\n" + "\tands r4, r6\n" + "\tlsrs r4, 10\n" + "\tmov r6, r8\n" + "\tmuls r6, r1\n" + "\tadds r1, r6, 0\n" + "\tasrs r1, 4\n" + "\tmov r6, r8\n" + "\tsubs r6, r1\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tsubs r5, r1\n" + "\tadds r1, r4, 0\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tsubs r4, r1\n" + "\tlsls r6, 16\n" + "\tlsls r5, 21\n" + "\torrs r5, r6\n" + "\tlsls r4, 26\n" + "\torrs r4, r5\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D78: .4byte gPlttBufferUnfaded\n" + "_08085D7C: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} +#endif + +void Task_PokecenterHeal(u8 taskId); +u8 CreatePokeballGlowSprite(s16, s16, s16, u16); +u8 PokecenterHealEffectHelper(s16, s16); + +bool8 FldEff_PokecenterHeal(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x5d; + task->data[3] = 0x24; + task->data[4] = 0x7c; + task->data[5] = 0x18; + return FALSE; +} + +void Task_PokecenterHeal(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0855C364[task->data[0]](task); +} + +void PokecenterHealEffect_0(struct Task *task) +{ + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); + task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); +} + +void PokecenterHealEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 1) + { + gSprites[task->data[7]].data[0]++; + task->data[0]++; + } +} + +void PokecenterHealEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 4) + { + task->data[0]++; + } +} + +void PokecenterHealEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); + DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); + } +} + +void Task_HallOfFameRecord(u8 taskId); +void HallOfFameRecordEffectHelper(s16, s16, s16, u8); + +bool8 FldEff_HallOfFameRecord(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x75; + task->data[3] = 0x34; + return FALSE; +} + +void Task_HallOfFameRecord(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0855C374[task->data[0]](task); +} + +void HallOfFameRecordEffect_0(struct Task *task) +{ + u8 taskId; + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); + taskId = FindTaskIdByFunc(Task_HallOfFameRecord); + HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); + HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); +} + +void HallOfFameRecordEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 1) + { + task->data[15]++; // was this ever initialized? is this ever used? + task->data[0]++; + } +} + +void HallOfFameRecordEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 4) + { + task->data[0]++; + } +} + +void HallOfFameRecordEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data[0] > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); + DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); + } +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *); + +u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); + sprite = &gSprites[spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + sprite->data[5] = data5; + sprite->data[6] = data6; + sprite->data[7] = spriteId; + return spriteId; +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) +{ + gUnknown_0855C384[sprite->data[0]](sprite); +} + +void PokeballGlowEffect_0(struct Sprite *sprite) +{ + u8 endSpriteId; + if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) + { + sprite->data[1] = 25; + endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_855C304, gUnknown_0855C3A4[sprite->data[2]].x + sprite->pos2.x, gUnknown_0855C3A4[sprite->data[2]].y + sprite->pos2.y, 0); + gSprites[endSpriteId].oam.priority = 2; + gSprites[endSpriteId].data[0] = sprite->data[7]; + sprite->data[2]++; + sprite->data[6]--; + PlaySE(SE_BOWA); + } + if (sprite->data[6] == 0) + { + sprite->data[1] = 32; + sprite->data[0]++; + } +} + +void PokeballGlowEffect_1(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->data[0]++; + sprite->data[1] = 8; + sprite->data[2] = 0; + sprite->data[3] = 0; + if (sprite->data[5]) + { + PlayFanfare(MUS_ME_ASA); + } + } +} + +void PokeballGlowEffect_2(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data[1]) == 0) + { + sprite->data[1] = 8; + sprite->data[2]++; + sprite->data[2] &= 3; + if (sprite->data[2] == 0) + { + sprite->data[3]++; + } + } + phase = (sprite->data[2] + 3) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + phase = (sprite->data[2] + 2) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + phase = (sprite->data[2] + 1) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + phase = sprite->data[2]; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + if (sprite->data[3] > 2) + { + sprite->data[0]++; + sprite->data[1] = 8; + sprite->data[2] = 0; + } +} + +void PokeballGlowEffect_3(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data[1]) == 0) + { + sprite->data[1] = 8; + sprite->data[2]++; + sprite->data[2] &= 3; + if (sprite->data[2] == 3) + { + sprite->data[0]++; + sprite->data[1] = 30; + } + } + phase = sprite->data[2]; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0855C3BC[phase], gUnknown_0855C3C0[phase], gUnknown_0855C3C4[phase]); +} + +void PokeballGlowEffect_4(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->data[0]++; + } +} + +void PokeballGlowEffect_5(struct Sprite *sprite) +{ + sprite->data[0]++; +} + +void PokeballGlowEffect_6(struct Sprite *sprite) +{ + if (sprite->data[5] == 0 || IsFanfareTaskInactive()) + { + sprite->data[0]++; + } +} + +void PokeballGlowEffect_7(struct Sprite *sprite) +{ +} + +void SpriteCB_PokeballGlow(struct Sprite *sprite) +{ + if (gSprites[sprite->data[0]].data[0] > 4) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +u8 PokecenterHealEffectHelper(s16 x, s16 y) +{ + u8 spriteIdAtEnd; + struct Sprite *sprite; + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C31C, x, y, 0); + sprite = &gSprites[spriteIdAtEnd]; + sprite->oam.priority = 2; + sprite->invisible = 1; + SetSubspriteTables(sprite, &gUnknown_0855C2AC); + return spriteIdAtEnd; +} + +void SpriteCB_PokecenterMonitor(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[0] = 0; + sprite->invisible = 0; + StartSpriteAnim(sprite, 1); + } + if (sprite->animEnded) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) +{ + u8 spriteIdAtEnd; + if (!a3) + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C334, a1, a2, 0); + SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0855C2C4); + } else + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_855C34C, a1, a2, 0); + } + gSprites[spriteIdAtEnd].invisible = 1; + gSprites[spriteIdAtEnd].data[0] = a0; +} + +void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].data[15]) + { + if (sprite->data[1] == 0 || (--sprite->data[1]) == 0) + { + sprite->data[1] = 16; + sprite->invisible ^= 1; + } + sprite->data[2]++; + } + if (sprite->data[2] > 127) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void mapldr_080842E8(void); +void mapldr_08084390(void); +void task00_8084310(u8); +void c3_080843F8(u8); + +void sub_80B69DC(void) +{ + SetMainCallback2(CB2_ReturnToField); + gFieldCallback = mapldr_080842E8; +} + +void mapldr_080842E8(void) +{ + pal_fill_black(); + CreateTask(task00_8084310, 0); + ScriptContext2_Enable(); + FreezeEventObjects(); + gFieldCallback = NULL; +} + +void task00_8084310(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (!task->data[0]) + { + if (!IsWeatherNotFadingIn()) + { + return; + } + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + if ((int)gFieldEffectArguments[0] > 5) + { + gFieldEffectArguments[0] = 0; + } + FieldEffectStart(FLDEFF_USE_FLY); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) + { + Overworld_ResetStateAfterFly(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gFieldCallback = mapldr_08084390; + DestroyTask(taskId); + } +} + +void mapldr_08084390(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_black(); + CreateTask(c3_080843F8, 0); + gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1; + if (gPlayerAvatar.flags & 0x08) + { + EventObjectTurn(&gEventObjects[gPlayerAvatar.eventObjectId], DIR_WEST); + } + ScriptContext2_Enable(); + FreezeEventObjects(); + gFieldCallback = NULL; +} + +void c3_080843F8(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (task->data[0] == 0) + { + if (gPaletteFade.active) + { + return; + } + FieldEffectStart(FLDEFF_FLY_IN); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) + { + ScriptContext2_Disable(); + UnfreezeEventObjects(); + DestroyTask(taskId); + } +} + +extern void pal_fill_for_maplights(void); +void sub_80B6B94(u8); +extern void CameraObjectReset2(void); +extern void CameraObjectReset1(void); + +void sub_80B6B68(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_maplights(); + ScriptContext2_Enable(); + FreezeEventObjects(); + CreateTask(sub_80B6B94, 0); + gFieldCallback = NULL; +} + +void sub_80B6B94(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0855C3C8[task->data[0]](task)); // return code signifies whether to continue blocking here +} + +bool8 sub_80B6BCC(struct Task *task) // gUnknown_0855C3C8[0] +{ + struct EventObject *playerObject; + struct Sprite *playerSprite; + playerObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + playerSprite = &gSprites[gPlayerAvatar.spriteId]; + CameraObjectReset2(); + gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1; + gPlayerAvatar.preventStep = TRUE; + EventObjectSetHeldMovement(playerObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); + task->data[4] = playerSprite->subspriteMode; + playerObject->fixedPriority = 1; + playerSprite->oam.priority = 1; + playerSprite->subspriteMode = 2; + task->data[0]++; + return TRUE; +} + +bool8 sub_80B6C74(struct Task *task) // gUnknown_0855C3C8[1] +{ + if (IsWeatherNotFadingIn()) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B6C90(struct Task *task) // gUnknown_0855C3C8[2] +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + task->data[1] = 1; + task->data[2] = 0; + gEventObjects[gPlayerAvatar.eventObjectId].invisible = 0; + PlaySE(SE_RU_HYUU); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B6D04(struct Task *task) +{ + struct EventObject *eventObject; + struct Sprite *sprite; + + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y += task->data[1]; + if (task->data[1] < 8) + { + task->data[2] += task->data[1]; + if (task->data[2] & 0xf) + { + task->data[1] <<= 1; + } + } + if (task->data[3] == 0 && sprite->pos2.y >= -16) + { + task->data[3]++; + eventObject->fixedPriority = 0; + sprite->subspriteMode = task->data[4]; + eventObject->triggerGroundEffectsOnMove = 1; + } + if (sprite->pos2.y >= 0) + { + PlaySE(SE_W070); + eventObject->triggerGroundEffectsOnStop = 1; + eventObject->landingJump = 1; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B6DBC(struct Task *task) +{ + task->data[0]++; + task->data[1] = 4; + task->data[2] = 0; + SetCameraPanningCallback(NULL); + return TRUE; +} + +bool8 sub_80B6DD8(struct Task *task) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B6E18(struct Task *task) +{ + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeEventObjects(); + InstallCameraPanAheadCallback(); + DestroyTask(FindTaskIdByFunc(sub_80B6B94)); + return FALSE; +} + +void sub_80B6E88(u8); +extern void sub_80E1558(u8); +extern void sub_80AF0B4(void); + +void sub_80B6FB8(struct Task *); +void sub_80B7004(struct Task *); +void sub_80B7050(void); +void sub_80B7060(void); +bool8 sub_80859A0(void); +void sub_80B70B4(void); +void sub_80E1570(void); +void sub_80B70DC(u8); + +void sub_80B6E4C(u8 a0, u8 priority) +{ + u8 taskId; + taskId = CreateTask(sub_80B6E88, priority); + gTasks[taskId].data[1] = 0; + if (a0 == 0x6a) + { + gTasks[taskId].data[1] = 1; + } +} + +void sub_80B6E88(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0855C3E4[task->data[0]](task)); +} + +bool8 sub_80B6EC0(struct Task *task) +{ + FreezeEventObjects(); + CameraObjectReset2(); + sub_80E1558(task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B6EE0(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject)) + { + EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(GetPlayerFacingDirection())); + task->data[0]++; + task->data[2] = 0; + task->data[3] = 0; + if ((u8)task->data[1] == 0) + { + task->data[0] = 4; + } + PlaySE(SE_ESUKA); + } + return FALSE; +} + +bool8 sub_80B6F50(struct Task *task) +{ + sub_80B6FB8(task); + if (task->data[2] > 3) + { + sub_80B7050(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B6F74(struct Task *task) +{ + sub_80B6FB8(task); + sub_80B7060(); + return FALSE; +} + +bool8 sub_80B6F84(struct Task *task) +{ + sub_80B7004(task); + if (task->data[2] > 3) + { + sub_80B7050(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B6FA8(struct Task *task) +{ + sub_80B7004(task); + sub_80B7060(); + return FALSE; +} + +void sub_80B6FB8(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[2]); + sprite->pos2.y = Sin(0x94, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_80B7004(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[2]); + sprite->pos2.y = Sin(0x76, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +void sub_80B7050(void) +{ + music_something(); + sub_80AF0B4(); +} + +void sub_80B7060(void) +{ + if (!gPaletteFade.active && sub_80859A0() == TRUE) + { + sub_80E1570(); + warp_in(); + gFieldCallback = sub_80B70B4; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80B6E88)); + } +} + +void sub_80B70B4(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_maplights(); + ScriptContext2_Enable(); + CreateTask(sub_80B70DC, 0); + gFieldCallback = NULL; +} + +void sub_80B70DC(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0855C3FC[task->data[0]](task)); +} + +bool8 sub_80B7114(struct Task *task) +{ + struct EventObject *eventObject; + s16 x; + s16 y; + u8 behavior; + CameraObjectReset2(); + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(DIR_EAST)); + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + task->data[0]++; + task->data[1] = 16; + if (behavior == 0x6b) + { + behavior = 1; + task->data[0] = 3; + } else + { + behavior = 0; + } + sub_80E1558(behavior); + return TRUE; +} + +bool8 sub_80B7190(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B71D0(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0] = 5; + } + return FALSE; +} + +bool8 sub_80B7230(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B7270(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +extern bool8 sub_80E1584(void); + +bool8 sub_80B72D0(struct Task *task) +{ + if (sub_80E1584()) + { + return FALSE; + } + sub_80E1570(); + task->data[0]++; + return TRUE; +} + +bool8 sub_80B72F4(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (EventObjectClearHeldMovementIfFinished(eventObject)) + { + CameraObjectReset1(); + ScriptContext2_Disable(); + EventObjectSetHeldMovement(eventObject, GetWalkNormalMovementAction(DIR_EAST)); + DestroyTask(FindTaskIdByFunc(sub_80B70DC)); + } + return FALSE; +} + +void sub_80B7384(u8); + +bool8 FldEff_UseWaterfall(void) +{ + u8 taskId; + taskId = CreateTask(sub_80B7384, 0xff); + gTasks[taskId].data[1] = gFieldEffectArguments[0]; + sub_80B7384(taskId); + return FALSE; +} + +void sub_80B7384(u8 taskId) +{ + while (gUnknown_0855C418[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId])); +} + +bool8 sub_80B73D0(struct Task *task, struct EventObject *eventObject) +{ + ScriptContext2_Enable(); + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; + return FALSE; +} + +bool8 waterfall_1_do_anim_probably(struct Task *task, struct EventObject *eventObject) +{ + ScriptContext2_Enable(); + if (!EventObjectIsMovementOverridden(eventObject)) + { + EventObjectClearHeldMovementIfFinished(eventObject); + gFieldEffectArguments[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } + return FALSE; +} + +bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct EventObject *eventObject) +{ + if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + return FALSE; + } + task->data[0]++; + return TRUE; +} + +bool8 sub_80B7450(struct Task *task, struct EventObject *eventObject) +{ + EventObjectSetHeldMovement(eventObject, GetWalkSlowMovementAction(DIR_NORTH)); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B7478(struct Task *task, struct EventObject *eventObject) +{ + if (!EventObjectClearHeldMovementIfFinished(eventObject)) + { + return FALSE; + } + if (MetatileBehavior_IsWaterfall(eventObject->currentMetatileBehavior)) + { + task->data[0] = 3; + return TRUE; + } + ScriptContext2_Disable(); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(FindTaskIdByFunc(sub_80B7384)); + FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); + return FALSE; +} + +void Task_Dive(u8); +extern int dive_warp(struct MapPosition *, u16); + +bool8 FldEff_UseDive(void) +{ + u8 taskId; + taskId = CreateTask(Task_Dive, 0xff); + gTasks[taskId].data[15] = gFieldEffectArguments[0]; + gTasks[taskId].data[14] = gFieldEffectArguments[1]; + Task_Dive(taskId); + return FALSE; +} + +void Task_Dive(u8 taskId) +{ + while (gUnknown_0855C42C[gTasks[taskId].data[0]](&gTasks[taskId])); +} + +bool8 dive_1_lock(struct Task *task) +{ + gPlayerAvatar.preventStep = TRUE; + task->data[0]++; + return FALSE; +} + +bool8 dive_2_unknown(struct Task *task) +{ + ScriptContext2_Enable(); + gFieldEffectArguments[0] = task->data[15]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + return FALSE; +} + +bool8 dive_3_unknown(struct Task *task) +{ + struct MapPosition mapPosition; + PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + dive_warp(&mapPosition, gEventObjects[gPlayerAvatar.eventObjectId].currentMetatileBehavior); + DestroyTask(FindTaskIdByFunc(Task_Dive)); + FieldEffectActiveListRemove(FLDEFF_USE_DIVE); + } + return FALSE; +} + +void sub_80B75F0(u8); +void mapldr_080851BC(void); + +void sub_80B75D8(u8 priority) +{ + CreateTask(sub_80B75F0, priority); +} + +void sub_80B75F0(u8 taskId) +{ + while (gUnknown_0855C438[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80B764C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + FreezeEventObjects(); + CameraObjectReset2(); + SetCameraPanningCallback(NULL); + gPlayerAvatar.preventStep = TRUE; + eventObject->fixedPriority = 1; + task->data[1] = 1; + task->data[0]++; + return TRUE; +} + +bool8 sub_80B7684(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if (task->data[2] > 7) + { + task->data[2] = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B76B8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite->pos2.y = 0; + task->data[3] = 1; + gFieldEffectArguments[0] = eventObject->currentCoords.x; + gFieldEffectArguments[1] = eventObject->currentCoords.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); + PlaySE(SE_W153); + task->data[0]++; + return TRUE; +} + +bool8 sub_80B7704(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + s16 centerToCornerVecY; + SetCameraPanning(0, task->data[1]); + if (task->data[1] = -task->data[1], ++task->data[2] <= 17) + { + if (!(task->data[2] & 1) && (task->data[1] <= 3)) + { + task->data[1] <<= 1; + } + } else if (!(task->data[2] & 4) && (task->data[1] > 0)) + { + task->data[1] >>= 1; + } + if (task->data[2] > 6) + { + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) + { + sprite->pos2.y -= task->data[3]; + if (task->data[3] <= 7) + { + task->data[3]++; + } + } else + { + task->data[4] = 1; + } + } + if (task->data[5] == 0 && sprite->pos2.y < -0x10) + { + task->data[5]++; + eventObject->fixedPriority = 1; + sprite->oam.priority = 1; + sprite->subspriteMode = 2; + } + if (task->data[1] == 0 && task->data[4] != 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B77F8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + music_something(); + sub_80AF0B4(); + task->data[0]++; + return FALSE; +} + +bool8 sub_80B7814(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_80859A0() == TRUE) + { + warp_in(); + gFieldCallback = mapldr_080851BC; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80B75F0)); + } + return FALSE; +} + +void sub_80B7890(u8); + +void mapldr_080851BC(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_maplights(); + ScriptContext2_Enable(); + gFieldCallback = NULL; + CreateTask(sub_80B7890, 0); +} + +void sub_80B7890(u8 taskId) +{ + while (gUnknown_0855C450[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80B78EC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + CameraObjectReset2(); + FreezeEventObjects(); + gPlayerAvatar.preventStep = TRUE; + eventObject->invisible = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80B791C(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (IsWeatherNotFadingIn()) + { + gFieldEffectArguments[0] = eventObject->currentCoords.x; + gFieldEffectArguments[1] = eventObject->currentCoords.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B7968(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + sprite = &gSprites[task->data[1]]; + if (sprite->animCmdIndex > 1) + { + task->data[0]++; + eventObject->invisible = 0; + CameraObjectReset1(); + PlaySE(SE_W091); + EventObjectSetHeldMovement(eventObject, GetJumpMovementAction(DIR_EAST)); + } + return FALSE; +} + +bool8 sub_80B79BC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectClearHeldMovementIfFinished(eventObject)) + { + gPlayerAvatar.preventStep = FALSE; + ScriptContext2_Disable(); + UnfreezeEventObjects(); + DestroyTask(FindTaskIdByFunc(sub_80B7890)); + } + return FALSE; +} + +extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; + +u8 FldEff_LavaridgeGymWarp(void) +{ + u8 spriteId; + sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_80B7A58(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); + } +} + +void sub_80B7A8C(u8); + +void sub_80B7A74(u8 priority) +{ + CreateTask(sub_80B7A8C, priority); +} + +void sub_80B7A8C(u8 taskId) +{ + while(gUnknown_0855C460[gTasks[taskId].data[0]](&gTasks[taskId], &gEventObjects[gPlayerAvatar.eventObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80B7AE8(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + FreezeEventObjects(); + CameraObjectReset2(); + gPlayerAvatar.preventStep = TRUE; + eventObject->fixedPriority = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80B7B18(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (EventObjectClearHeldMovementIfFinished(eventObject)) + { + if (task->data[1] > 3) + { + gFieldEffectArguments[0] = eventObject->currentCoords.x; + gFieldEffectArguments[1] = eventObject->currentCoords.y; + gFieldEffectArguments[2] = sprite->subpriority - 1; + gFieldEffectArguments[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } else + { + task->data[1]++; + EventObjectSetHeldMovement(eventObject, GetWalkInPlaceFastestMovementAction(eventObject->facingDirection)); + PlaySE(SE_FU_ZUZUZU); + } + } + return FALSE; +} + +bool8 sub_80B7B94(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (gSprites[task->data[1]].animCmdIndex == 2) + { + eventObject->invisible = 1; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80B7BCC(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + music_something(); + sub_80AF0B4(); + task->data[0]++; + } + return FALSE; +} + +void sub_80B7CE4(u8); +void mapldr_080859D4(void); + +bool8 sub_80B7BF4(struct Task *task, struct EventObject *eventObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_80859A0() == TRUE) + { + warp_in(); + gFieldCallback = sub_80B6B68; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80B7A8C)); + } + return FALSE; +} + +u8 FldEff_PopOutOfAsh(void) +{ + u8 spriteId; + sub_80930E0((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + gSprites[spriteId].oam.priority = gFieldEffectArguments[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_80B7CAC(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); + } +} + +void sub_80B7CC8(void) +{ + ScriptContext2_Enable(); + FreezeEventObjects(); + CreateTask(sub_80B7CE4, 0x50); +} + +void sub_80B7CE4(u8 taskId) +{ + gUnknown_0855C474[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B7D14(struct Task *task) +{ + task->data[0]++; + task->data[14] = 64; + task->data[15] = GetPlayerFacingDirection(); +} + +void sub_80B7D34(struct Task *task) +{ + struct EventObject *eventObject; + u8 spinDirections[5] = {1, 3, 4, 2, 1}; + if (task->data[14] != 0 && (--task->data[14]) == 0) + { + music_something(); + sub_80AF0B4(); + } + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject)) + { + if (task->data[14] == 0 && !gPaletteFade.active && sub_80859A0() == TRUE) + { + SetEventObjectDirection(eventObject, task->data[15]); + sub_8084E14(); + warp_in(); + gFieldCallback = mapldr_080859D4; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80B7CE4)); + } else if (task->data[1] == 0 || (--task->data[1]) == 0) + { + EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(spinDirections[eventObject->facingDirection])); + if (task->data[2] < 12) + { + task->data[2]++; + } + task->data[1] = 8 >> (task->data[2] >> 2); + } + } +} + +void (*const gUnknown_0855C484[])(struct Task *) = { + sub_80B7EC4, + sub_80B7EE8 +}; + +void sub_80B7E94(u8); + +void mapldr_080859D4(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_maplights(); + ScriptContext2_Enable(); + FreezeEventObjects(); + gFieldCallback = NULL; + gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1; + CreateTask(sub_80B7E94, 0); +} + +void sub_80B7E94(u8 taskId) +{ + gUnknown_0855C484[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B7EC4(struct Task *task) +{ + if (IsWeatherNotFadingIn()) + { + task->data[0]++; + task->data[15] = GetPlayerFacingDirection(); + } +} + +void sub_80B7EE8(struct Task *task) +{ + u8 spinDirections[5] = {1, 3, 4, 2, 1}; + struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + if (EventObjectIsMovementOverridden(eventObject) && !EventObjectClearHeldMovementIfFinished(eventObject)) + { + return; + } + if (task->data[2] >= 32 && task->data[15] == GetPlayerFacingDirection()) + { + eventObject->invisible = 0; + ScriptContext2_Disable(); + UnfreezeEventObjects(); + DestroyTask(FindTaskIdByFunc(sub_80B7E94)); + return; + } + EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(spinDirections[eventObject->facingDirection])); + if (task->data[2] < 32) + { + task->data[2]++; + } + task->data[1] = task->data[2] >> 2; + } + eventObject->invisible ^= 1; +} + +static void ExecuteTeleportFieldEffectTask(u8); +static void TeleportFieldEffectTask1(struct Task*); +static void TeleportFieldEffectTask2(struct Task*); +static void TeleportFieldEffectTask3(struct Task*); +static void TeleportFieldEffectTask4(struct Task*); +static void mapldr_08085D88(void); + +void CreateTeleportFieldEffectTask(void) +{ + CreateTask(ExecuteTeleportFieldEffectTask, 0); +} + +static void (*const sTeleportFieldEffectTasks[])(struct Task *) = { + TeleportFieldEffectTask1, + TeleportFieldEffectTask2, + TeleportFieldEffectTask3, + TeleportFieldEffectTask4 +}; + +static void ExecuteTeleportFieldEffectTask(u8 taskId) +{ + sTeleportFieldEffectTasks[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +static void TeleportFieldEffectTask1(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeEventObjects(); + CameraObjectReset2(); + task->data[15] = GetPlayerFacingDirection(); + task->data[0]++; +} + +static void TeleportFieldEffectTask2(struct Task *task) +{ + u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]); + task->data[1] = 8; + task->data[2]++; + } + if (task->data[2] > 7 && task->data[15] == eventObject->facingDirection) + { + task->data[0]++; + task->data[1] = 4; + task->data[2] = 8; + task->data[3] = 1; + PlaySE(SE_TK_WARPIN); + } +} + +static void TeleportFieldEffectTask3(struct Task *task) +{ + u8 spinDirections[5] = {DIR_SOUTH, DIR_WEST, DIR_EAST, DIR_NORTH, DIR_SOUTH}; + struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((--task->data[1]) <= 0) + { + task->data[1] = 4; + EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]); + } + sprite->pos1.y -= task->data[3]; + task->data[4] += task->data[3]; + if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) + { + task->data[3] <<= 1; + } + if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) + { + sprite->subspriteMode = 2; + } + if (task->data[4] >= 0xa8) + { + task->data[0]++; + music_something(); + sub_80AF0B4(); + } +} + +static void TeleportFieldEffectTask4(struct Task *task) +{ + if (!gPaletteFade.active) + { + if (task->data[5] == FALSE) + { + sub_81BE72C(); + task->data[5] = TRUE; + } + + if (sub_80859A0() == TRUE) + { + Overworld_SetWarpDestToLastHealLoc(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gFieldCallback = mapldr_08085D88; + DestroyTask(FindTaskIdByFunc(ExecuteTeleportFieldEffectTask)); + } + } +} + +void sub_80B8250(u8); + +static void mapldr_08085D88(void) +{ + Overworld_PlaySpecialMapMusic(); + pal_fill_for_maplights(); + ScriptContext2_Enable(); + FreezeEventObjects(); + gFieldCallback = NULL; + gEventObjects[gPlayerAvatar.eventObjectId].invisible = 1; + CameraObjectReset2(); + CreateTask(sub_80B8250, 0); +} + +void (*const gUnknown_0855C49C[])(struct Task *) = { + sub_80B8280, + sub_80B830C, + sub_80B8410 +}; + +void sub_80B8250(u8 taskId) +{ + gUnknown_0855C49C[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B8280(struct Task *task) +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + if (IsWeatherNotFadingIn()) + { + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + gEventObjects[gPlayerAvatar.eventObjectId].invisible = 0; + task->data[0]++; + task->data[1] = 8; + task->data[2] = 1; + task->data[14] = sprite->subspriteMode; + task->data[15] = GetPlayerFacingDirection(); + PlaySE(SE_TK_WARPIN); + } +} + +void sub_80B830C(struct Task *task) +{ + u8 spinDirections[5] = {1, 3, 4, 2, 1}; + struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((sprite->pos2.y += task->data[1]) >= -8) + { + if (task->data[13] == 0) + { + task->data[13]++; + eventObject->triggerGroundEffectsOnMove = 1; + sprite->subspriteMode = task->data[14]; + } + } else + { + sprite->oam.priority = 1; + if (sprite->subspriteMode != 0) + { + sprite->subspriteMode = 2; + } + } + if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) + { + task->data[1]--; + } + if ((--task->data[2]) == 0) + { + task->data[2] = 4; + EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]); + } + if (sprite->pos2.y >= 0) + { + sprite->pos2.y = 0; + task->data[0]++; + task->data[1] = 1; + task->data[2] = 0; + } +} + +void sub_80B8410(struct Task *task) +{ + u8 spinDirections[5] = {1, 3, 4, 2, 1}; + struct EventObject *eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if ((--task->data[1]) == 0) + { + EventObjectTurn(eventObject, spinDirections[eventObject->facingDirection]); + task->data[1] = 8; + if ((++task->data[2]) > 4 && task->data[14] == eventObject->facingDirection) + { + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeEventObjects(); + DestroyTask(FindTaskIdByFunc(sub_80B8250)); + } + } +} + +void sub_80B8554(u8); +void sub_80B88B4(u8); +u8 sub_80B8C60(u32, u32, u32); +void sub_80B880C(void); +void sub_80B8874(u16); +void sub_80B8CC0(struct Sprite *); + +bool8 FldEff_FieldMoveShowMon(void) +{ + u8 taskId; + if (is_map_type_1_2_3_5_or_6(Overworld_GetMapTypeOfSaveblockLocation()) == TRUE) + { + taskId = CreateTask(sub_80B8554, 0xff); + } else + { + taskId = CreateTask(sub_80B88B4, 0xff); + } + gTasks[taskId].data[15] = sub_80B8C60(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + return FALSE; +} + +bool8 FldEff_FieldMoveShowMonInit(void) +{ + struct Pokemon *pokemon; + u32 flag = gFieldEffectArguments[0] & 0x80000000; + pokemon = &gPlayerParty[(u8)gFieldEffectArguments[0]]; + gFieldEffectArguments[0] = GetMonData(pokemon, MON_DATA_SPECIES); + gFieldEffectArguments[1] = GetMonData(pokemon, MON_DATA_OT_ID); + gFieldEffectArguments[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); + gFieldEffectArguments[0] |= flag; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + return FALSE; +} + +void (*const gUnknown_0855C4A8[])(struct Task *) = { + sub_80B8584, + sub_80B85F8, + sub_80B8660, + sub_80B86EC, + sub_80B871C, + sub_80B8770, + overworld_bg_setup_2, +}; + +void sub_80B8554(u8 taskId) +{ + gUnknown_0855C4A8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B8584(struct Task *task) +{ + task->data[11] = REG_WININ; + task->data[12] = REG_WINOUT; + StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); + task->data[1] = 0xf0f1; + task->data[2] = 0x5051; + task->data[3] = 0x3f; + task->data[4] = 0x3e; + SetGpuReg(REG_OFFSET_WIN0H, task->data[1]); + SetGpuReg(REG_OFFSET_WIN0V, task->data[2]); + SetGpuReg(REG_OFFSET_WININ, task->data[3]); + SetGpuReg(REG_OFFSET_WINOUT, task->data[4]); + SetVBlankCallback(sub_80B880C); + task->data[0]++; +} + +void sub_80B85F8(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); + sub_80B8874(delta); + task->data[0]++; +} + +void sub_80B8660(struct Task *task) +{ + s16 v0; + s16 v2; + s16 v3; + task->data[5] -= 16; + v0 = ((u16)task->data[1] >> 8); + v2 = ((u16)task->data[2] >> 8); + v3 = ((u16)task->data[2] & 0xff); + v0 -= 16; + v2 -= 2; + v3 += 2; + if (v0 < 0) + { + v0 = 0; + } + if (v2 < 0x28) + { + v2 = 0x28; + } + if (v3 > 0x78) + { + v3 = 0x78; + } + task->data[1] = (v0 << 8) | (task->data[1] & 0xff); + task->data[2] = (v2 << 8) | v3; + if (v0 == 0 && v2 == 0x28 && v3 == 0x78) + { + gSprites[task->data[15]].callback = sub_80B8CC0; + task->data[0]++; + } +} + +void sub_80B86EC(struct Task *task) +{ + task->data[5] -= 16; + if (gSprites[task->data[15]].data[7]) + { + task->data[0]++; + } +} + +void sub_80B871C(struct Task *task) +{ + s16 v2; + s16 v3; + task->data[5] -= 16; + v2 = (task->data[2] >> 8); + v3 = (task->data[2] & 0xff); + v2 += 6; + v3 -= 6; + if (v2 > 0x50) + { + v2 = 0x50; + } + if (v3 < 0x51) + { + v3 = 0x51; + } + task->data[2] = (v2 << 8) | v3; + if (v2 == 0x50 && v3 == 0x51) + { + task->data[0]++; + } +} + +void sub_80B8770(struct Task *task) +{ + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + task->data[1] = 0xf1; + task->data[2] = 0xa1; + task->data[3] = task->data[11]; + task->data[4] = task->data[12]; + task->data[0]++; +} + +void overworld_bg_setup_2(struct Task *task) +{ + IntrCallback callback; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + SetVBlankCallback(callback); + sub_8197200(); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_80B8554)); +} + +void sub_80B880C(void) +{ + struct Task *task; + IntrCallback callback; + task = &gTasks[FindTaskIdByFunc(sub_80B8554)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + callback(); + SetGpuReg(REG_OFFSET_WIN0H, task->data[1]); + SetGpuReg(REG_OFFSET_WIN0V, task->data[2]); + SetGpuReg(REG_OFFSET_WININ, task->data[3]); + SetGpuReg(REG_OFFSET_WINOUT, task->data[4]); + SetGpuReg(REG_OFFSET_BG0HOFS, task->data[5]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[6]); +} + +void sub_80B8874(u16 offs) +{ + u16 i; + u16 *dest; + dest = (u16 *)(VRAM + 0x140 + offs); + for (i = 0; i < 0x140; i++, dest++) + { + *dest = gFieldMoveStreaksTilemap[i] | 0xf000; + } +} + +void sub_80B8AE0(void); +bool8 sub_80B8B38(struct Task *); +void sub_80B8B28(struct Task *); +bool8 sub_80B8BF0(struct Task *); + +void (*const gUnknown_0855C4C4[])(struct Task *) = { + sub_80B88E4, + sub_80B8920, + sub_80B898C, + sub_80B89DC, + sub_80B8A0C, + sub_80B8A44, + sub_80B8A64, +}; + +void sub_80B88B4(u8 taskId) +{ + gUnknown_0855C4C4[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B88E4(struct Task *task) +{ + SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); + StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); + SetVBlankCallback(sub_80B8AE0); + task->data[0]++; +} + +void sub_80B8920(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + task->data[12] = delta; + CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); + task->data[0]++; +} + +void sub_80B898C(struct Task *task) +{ + if (sub_80B8B38(task)) + { + SetGpuReg(REG_OFFSET_WIN1H, 0x00f0); + SetGpuReg(REG_OFFSET_WIN1V, 0x2878); + gSprites[task->data[15]].callback = sub_80B8CC0; + task->data[0]++; + } + sub_80B8B28(task); +} + +void sub_80B89DC(struct Task *task) +{ + sub_80B8B28(task); + if (gSprites[task->data[15]].data[7]) + { + task->data[0]++; + } +} + +void sub_80B8A0C(struct Task *task) +{ + sub_80B8B28(task); + task->data[3] = task->data[1] & 7; + task->data[4] = 0; + SetGpuReg(REG_OFFSET_WIN1H, 0xffff); + SetGpuReg(REG_OFFSET_WIN1V, 0xffff); + task->data[0]++; +} + +void sub_80B8A44(struct Task *task) +{ + sub_80B8B28(task); + if (sub_80B8BF0(task)) + { + task->data[0]++; + } +} + +void sub_80B8A64(struct Task *task) +{ + IntrCallback intrCallback; + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + SetVBlankCallback(intrCallback); + sub_8197200(); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]], task->data[15]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_80B88B4)); +} + +void sub_80B8AE0(void) +{ + IntrCallback intrCallback; + struct Task *task; + task = &gTasks[FindTaskIdByFunc(sub_80B88B4)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + intrCallback(); + SetGpuReg(REG_OFFSET_BG0HOFS, task->data[1]); + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); +} + +void sub_80B8B28(struct Task *task) +{ + task->data[1] -= 16; + task->data[3] += 16; +} + +#ifdef NONMATCHING +bool8 sub_80B8B38(struct Task *task) +{ + u16 i; + u16 srcOffs; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = (task->data[3] >> 3) & 0x1f; + if (dstOffs >= task->data[4]) + { + dstOffs = (32 - dstOffs) & 0x1f; + srcOffs = (32 - task->data[4]) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} +#else +NAKED +bool8 sub_80B8B38(struct Task *task) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x4\n" + "\tadds r5, r0, 0\n" + "\tldrh r2, [r5, 0x10]\n" + "\tmovs r1, 0x10\n" + "\tldrsh r0, [r5, r1]\n" + "\tcmp r0, 0x1F\n" + "\tble _08088724\n" + "\tmovs r0, 0x1\n" + "\tb _080887A8\n" + "_08088724:\n" + "\tldrh r0, [r5, 0xE]\n" + "\tlsls r0, 16\n" + "\tasrs r3, r0, 19\n" + "\tmovs r1, 0x1F\n" + "\tands r3, r1\n" + "\tmovs r4, 0x10\n" + "\tldrsh r0, [r5, r4]\n" + "\tcmp r3, r0\n" + "\tblt _080887A6\n" + "\tmovs r0, 0x20\n" + "\tsubs r3, r0, r3\n" + "\tands r3, r1\n" + "\tsubs r0, r2\n" + "\tmov r12, r0\n" + "\tmov r7, r12\n" + "\tands r7, r1\n" + "\tmov r12, r7\n" + "\tldrh r0, [r5, 0x20]\n" + "\tldr r1, _080887B8 @ =0x06000140\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmovs r4, 0\n" + "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" + "\tmov r10, r7\n" + "\tmovs r0, 0xF0\n" + "\tlsls r0, 8\n" + "\tmov r9, r0\n" + "\tadds r1, r3, 0x1\n" + "\tmovs r0, 0x1F\n" + "\tands r1, r0\n" + "\tstr r1, [sp]\n" + "\tmov r6, r12\n" + "\tadds r6, 0x1\n" + "\tands r6, r0\n" + "_08088768:\n" + "\tlsls r1, r4, 5\n" + "\tadds r2, r1, r3\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tmov r7, r12\n" + "\tadds r0, r7, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r10\n" + "\tldrh r0, [r0]\n" + "\tmov r7, r9\n" + "\torrs r0, r7\n" + "\tstrh r0, [r2]\n" + "\tldr r0, [sp]\n" + "\tadds r2, r1, r0\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tadd r1, r10\n" + "\tldrh r0, [r1]\n" + "\tmov r1, r9\n" + "\torrs r0, r1\n" + "\tstrh r0, [r2]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tcmp r4, 0x9\n" + "\tbls _08088768\n" + "\tldrh r0, [r5, 0x10]\n" + "\tadds r0, 0x2\n" + "\tstrh r0, [r5, 0x10]\n" + "_080887A6:\n" + "\tmovs r0, 0\n" + "_080887A8:\n" + "\tadd sp, 0x4\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080887B8: .4byte 0x06000140\n" + "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); +} +#endif + +bool8 sub_80B8BF0(struct Task *task) +{ + u16 i; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = task->data[3] >> 3; + if (dstOffs >= task->data[4]) + { + dstOffs = (task->data[1] >> 3) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +u8 sub_80B8C60(u32 a0, u32 a1, u32 a2) +{ + u16 v0; + u8 monSprite; + struct Sprite *sprite; + v0 = (a0 & 0x80000000) >> 16; + a0 &= 0x7fffffff; + monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); + sprite = &gSprites[monSprite]; + sprite->callback = SpriteCallbackDummy; + sprite->oam.priority = 0; + sprite->data[0] = a0; + sprite->data[6] = v0; + return monSprite; +} + +void sub_80B8D04(struct Sprite *); + +void sub_80B8CC0(struct Sprite *sprite) +{ + if ((sprite->pos1.x -= 20) <= 0x78) + { + sprite->pos1.x = 0x78; + sprite->data[1] = 30; + sprite->callback = sub_80B8D04; + if (sprite->data[6]) + { + PlayCry2(sprite->data[0], 0, 0x7d, 0xa); + } else + { + PlayCry1(sprite->data[0], 0); + } + } +} + +void sub_80B8D20(struct Sprite *); + +void sub_80B8D04(struct Sprite *sprite) +{ + if ((--sprite->data[1]) == 0) + { + sprite->callback = sub_80B8D20; + } +} + +void sub_80B8D20(struct Sprite *sprite) +{ + if (sprite->pos1.x < -0x40) + { + sprite->data[7] = 1; + } else + { + sprite->pos1.x -= 20; + } +} + +void sub_80B8D84(u8); + +u8 FldEff_UseSurf(void) +{ + u8 taskId; + taskId = CreateTask(sub_80B8D84, 0xff); + gTasks[taskId].data[15] = gFieldEffectArguments[0]; + Overworld_ClearSavedMusic(); + Overworld_ChangeMusicTo(MUS_NAMINORI); + return FALSE; +} + +void (*const gUnknown_0855C4E0[])(struct Task *) = { + sub_80B8DB4, + sub_80B8E14, + sub_80B8E60, + sub_80B8EA8, + sub_80B8F24, +}; + +void sub_80B8D84(u8 taskId) +{ + gUnknown_0855C4E0[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B8DB4(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeEventObjects(); + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(8); + PlayerGetDestCoords(&task->data[1], &task->data[2]); + MoveCoords(gEventObjects[gPlayerAvatar.eventObjectId].movementDirection, &task->data[1], &task->data[2]); + task->data[0]++; +} + +void sub_80B8E14(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject)) + { + sub_808C114(); + EventObjectSetHeldMovement(eventObject, 0x39); + task->data[0]++; + } +} + +void sub_80B8E60(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (EventObjectCheckHeldMovementStatus(eventObject)) + { + gFieldEffectArguments[0] = task->data[15] | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } +} + +void sub_80B8EA8(struct Task *task) +{ + struct EventObject *eventObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(3)); + EventObjectClearHeldMovementIfFinished(eventObject); + EventObjectSetHeldMovement(eventObject, GetJumpSpecialMovementAction(eventObject->movementDirection)); + gFieldEffectArguments[0] = task->data[1]; + gFieldEffectArguments[1] = task->data[2]; + gFieldEffectArguments[2] = gPlayerAvatar.eventObjectId; + eventObject->fieldEffectSpriteId = FieldEffectStart(FLDEFF_SURF_BLOB); + task->data[0]++; + } +} + +void sub_80B8F24(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (EventObjectClearHeldMovementIfFinished(eventObject)) + { + gPlayerAvatar.preventStep = FALSE; + gPlayerAvatar.flags &= 0xdf; + EventObjectSetHeldMovement(eventObject, GetFaceDirectionMovementAction(eventObject->movementDirection)); + sub_81555AC(eventObject->fieldEffectSpriteId, 1); + UnfreezeEventObjects(); + ScriptContext2_Disable(); + FieldEffectActiveListRemove(FLDEFF_USE_SURF); + DestroyTask(FindTaskIdByFunc(sub_80B8D84)); + } +} + +#ifdef NONMATCHING +u8 sub_80B8F98(void) +{ + u8 spriteId, i, j, k, l; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[36], 0x78, -0x18, 1); + sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->oam.paletteNum = 4; + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->data[3] = -1; + sprite->data[4] = sprite->pos1.y; + sprite->data[5] = 0; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(14, 14)); + SetGpuReg(REG_OFFSET_WININ, 0x3F3F); + LoadPalette(gUnknown_0855B610, 0xC0, sizeof(gUnknown_0855B610)); + SetGpuReg(REG_OFFSET_BG0VOFS, 120); + for (i = 3; i < 15; i++) + { + for (j = 12; j < 18; j++) + { + ((u16*)(VRAM + 0xF800))[i * 32 + j] = 0xBFF4 + i * 6 + j + 1; + } + } + for (k = 0; k < 90; k++) + { + for (l = 0; l < 8; l++) + { + *(u16*)(VRAM + 0x8000 + (k + 1) * 32 + l * 4) = (gUnknown_0855B630[k * 32 + l * 4 + 1] << 8) + gUnknown_0855B630[k * 32 + l * 4]; + *(u16*)(VRAM + 0x8000 + (k + 1) * 32 + l * 4 + 2) = (gUnknown_0855B630[k * 32 + l * 4 + 3] << 8) + gUnknown_0855B630[k * 32 + l * 4 + 2]; + } + } + return spriteId; +} +#else +NAKED +u8 sub_80B8F98(void) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + ldr r0, =gFieldEffectObjectTemplatePointers\n\ + adds r0, 0x90\n\ + ldr r0, [r0]\n\ + movs r2, 0x18\n\ + negs r2, r2\n\ + movs r1, 0x78\n\ + movs r3, 0x1\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r1, r0, 4\n\ + add r1, r8\n\ + lsls r1, 2\n\ + ldr r0, =gSprites\n\ + adds r1, r0\n\ + ldrb r2, [r1, 0x5]\n\ + movs r0, 0xD\n\ + negs r0, r0\n\ + ands r0, r2\n\ + movs r2, 0x4\n\ + orrs r0, r2\n\ + movs r2, 0xF\n\ + ands r0, r2\n\ + movs r2, 0x40\n\ + orrs r0, r2\n\ + strb r0, [r1, 0x5]\n\ + movs r2, 0\n\ + strh r2, [r1, 0x2E]\n\ + strh r2, [r1, 0x30]\n\ + strh r2, [r1, 0x32]\n\ + ldr r0, =0x0000ffff\n\ + strh r0, [r1, 0x34]\n\ + ldrh r0, [r1, 0x22]\n\ + strh r0, [r1, 0x36]\n\ + strh r2, [r1, 0x38]\n\ + ldr r1, =0x00003e41\n\ + movs r0, 0x50\n\ + bl SetGpuReg\n\ + ldr r1, =0x00000e0e\n\ + movs r0, 0x52\n\ + bl SetGpuReg\n\ + ldr r1, =0x00003f3f\n\ + movs r0, 0x48\n\ + bl SetGpuReg\n\ + ldr r0, =gUnknown_0855B610\n\ + movs r1, 0xC0\n\ + movs r2, 0x20\n\ + bl LoadPalette\n\ + movs r0, 0x12\n\ + movs r1, 0x78\n\ + bl SetGpuReg\n\ + movs r4, 0x3\n\ + ldr r7, =0x0600f800\n\ + ldr r0, =0x0000bff4\n\ + adds r6, r0, 0\n\ +_080B901A:\n\ + movs r2, 0xC\n\ + lsls r0, r4, 1\n\ + lsls r5, r4, 5\n\ + adds r0, r4\n\ + lsls r3, r0, 1\n\ +_080B9024:\n\ + adds r0, r5, r2\n\ + lsls r0, 1\n\ + adds r0, r7\n\ + adds r1, r2, r6\n\ + adds r1, r3, r1\n\ + adds r1, 0x1\n\ + strh r1, [r0]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x11\n\ + bls _080B9024\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0xE\n\ + bls _080B901A\n\ + movs r0, 0\n\ + ldr r5, =gUnknown_0855B630\n\ +_080B904A:\n\ + movs r4, 0\n\ + adds r7, r0, 0x1\n\ + lsls r6, r0, 5\n\ +_080B9050:\n\ + lsls r1, r4, 2\n\ + adds r1, r6, r1\n\ + ldr r0, =0x06008020\n\ + adds r3, r1, r0\n\ + adds r0, r1, 0x1\n\ + adds r0, r5\n\ + ldrb r2, [r0]\n\ + lsls r2, 8\n\ + adds r0, r1, r5\n\ + ldrb r0, [r0]\n\ + adds r0, r2\n\ + strh r0, [r3]\n\ + ldr r0, =0x06008022\n\ + adds r3, r1, r0\n\ + adds r0, r1, 0x3\n\ + adds r0, r5\n\ + ldrb r2, [r0]\n\ + lsls r2, 8\n\ + adds r1, 0x2\n\ + adds r1, r5\n\ + ldrb r0, [r1]\n\ + adds r0, r2\n\ + strh r0, [r3]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x7\n\ + bls _080B9050\n\ + lsls r0, r7, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x59\n\ + bls _080B904A\n\ + mov r0, r8\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} +#endif // NONMATCHING + +void sub_80B9128(struct Sprite *); + +u8 FldEff_NPCFlyOut(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_80B9128; + sprite->data[1] = gFieldEffectArguments[0]; + PlaySE(SE_W019); + return spriteId; +} + +void sub_80B9128(struct Sprite *sprite) +{ + struct Sprite *npcSprite; + sprite->pos2.x = Cos(sprite->data[2], 0x8c); + sprite->pos2.y = Sin(sprite->data[2], 0x48); + sprite->data[2] = (sprite->data[2] + 4) & 0xff; + if (sprite->data[0]) + { + npcSprite = &gSprites[sprite->data[1]]; + npcSprite->coordOffsetEnabled = 0; + npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; + npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + npcSprite->pos2.x = 0; + npcSprite->pos2.y = 0; + } + if (sprite->data[2] >= 0x80) + { + FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); + } +} + +void sub_80B91D4(u8); +extern void sub_81555D8(u8, u8); +u8 sub_80B94C4(void); +bool8 sub_80B9508(u8); +void sub_80B9524(u8); +void sub_80B9560(u8, u8); +void sub_80B957C(struct Sprite *); +void sub_80B963C(struct Sprite *); + +u8 FldEff_UseFly(void) +{ + u8 taskId; + taskId = CreateTask(sub_80B91D4, 0xfe); + gTasks[taskId].data[1] = gFieldEffectArguments[0]; + return 0; +} + +void (*const gUnknown_0855C4F4[])(struct Task *) = { + sub_80B9204, + sub_80B925C, + sub_80B92A0, + sub_80B92F8, + sub_80B933C, + sub_80B9390, + sub_80B9418, + sub_80B9474, + sub_80B9494, +}; + +void sub_80B91D4(u8 taskId) +{ + gUnknown_0855C4F4[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B9204(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject)) + { + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(1); + sub_808C114(); + EventObjectSetHeldMovement(eventObject, 0x39); + task->data[0]++; + } +} + +void sub_80B925C(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (EventObjectClearHeldMovementIfFinished(eventObject)) + { + task->data[0]++; + gFieldEffectArguments[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + } +} + +void sub_80B92A0(struct Task *task) +{ + struct EventObject *eventObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (task->data[15] & 0x08) + { + sub_81555AC(eventObject->fieldEffectSpriteId, 2); + sub_81555D8(eventObject->fieldEffectSpriteId, 0); + } + task->data[1] = sub_80B94C4(); + task->data[0]++; + } +} + +void sub_80B92F8(struct Task *task) +{ + if (sub_80B9508(task->data[1])) + { + task->data[0]++; + task->data[2] = 16; + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + EventObjectSetHeldMovement(&gEventObjects[gPlayerAvatar.eventObjectId], 0x02); + } +} + +void sub_80B933C(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if ((task->data[2] == 0 || (--task->data[2]) == 0) && EventObjectClearHeldMovementIfFinished(eventObject)) + { + task->data[0]++; + PlaySE(SE_W019); + sub_80B9524(task->data[1]); + } +} + +void sub_80B9390(struct Task *task) +{ + struct EventObject *eventObject; + if ((++task->data[2]) >= 8) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); + StartSpriteAnim(&gSprites[eventObject->spriteId], 0x16); + eventObject->inanimate = 1; + EventObjectSetHeldMovement(eventObject, 0x48); + if (task->data[15] & 0x08) + { + DestroySprite(&gSprites[eventObject->fieldEffectSpriteId]); + } + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_80B9418(struct Task *task) +{ + struct EventObject *eventObject; + if ((++task->data[2]) >= 10) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + EventObjectClearHeldMovementIfActive(eventObject); + eventObject->inanimate = 0; + eventObject->hasShadow = 0; + sub_80B9560(task->data[1], eventObject->spriteId); + CameraObjectReset2(); + task->data[0]++; + } +} + +void sub_80B9474(struct Task *task) +{ + if (sub_80B9508(task->data[1])) + { + sub_80AF0B4(); + task->data[0]++; + } +} + +void sub_80B9494(struct Task *task) +{ + if (!gPaletteFade.active) + { + FieldEffectActiveListRemove(FLDEFF_USE_FLY); + DestroyTask(FindTaskIdByFunc(sub_80B91D4)); + } +} + +u8 sub_80B94C4(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_80B957C; + return spriteId; +} + +u8 sub_80B9508(u8 spriteId) +{ + return gSprites[spriteId].data[7]; +} + +void sub_80B9524(u8 spriteId) +{ + struct Sprite *sprite; + sprite = &gSprites[spriteId]; + sprite->callback = sub_80B963C; + sprite->pos1.x = 0x78; + sprite->pos1.y = 0x00; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + memset(&sprite->data[0], 0, 8 * sizeof(u16) /* zero all data cells */); + sprite->data[6] = 0x40; +} + +void sub_80B9560(u8 a0, u8 a1) +{ + gSprites[a0].data[6] = a1; +} + +const union AffineAnimCmd SpriteAffineAnim_855C518[] = { + AFFINEANIMCMD_FRAME(8, 8, -30, 0), + AFFINEANIMCMD_FRAME(28, 28, 0, 30), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd SpriteAffineAnim_855C530[] = { + AFFINEANIMCMD_FRAME(256, 256, 64, 0), + AFFINEANIMCMD_FRAME(-10, -10, 0, 22), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_0855C548[] = { + SpriteAffineAnim_855C518, + SpriteAffineAnim_855C530 +}; + +void sub_80B957C(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + if (sprite->data[0] == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0855C548; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 0); + sprite->pos1.x = 0x76; + sprite->pos1.y = -0x30; + sprite->data[0]++; + sprite->data[1] = 0x40; + sprite->data[2] = 0x100; + } + sprite->data[1] += (sprite->data[2] >> 8); + sprite->pos2.x = Cos(sprite->data[1], 0x78); + sprite->pos2.y = Sin(sprite->data[1], 0x78); + if (sprite->data[2] < 0x800) + { + sprite->data[2] += 0x60; + } + if (sprite->data[1] > 0x81) + { + sprite->data[7]++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); + } + } +} + +void sub_80B963C(struct Sprite *sprite) +{ + struct Sprite *sprite1; + sprite->pos2.x = Cos(sprite->data[2], 0x8c); + sprite->pos2.y = Sin(sprite->data[2], 0x48); + sprite->data[2] = (sprite->data[2] + 4) & 0xff; + if (sprite->data[6] != 0x40) + { + sprite1 = &gSprites[sprite->data[6]]; + sprite1->coordOffsetEnabled = 0; + sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; + sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + sprite1->pos2.x = 0; + sprite1->pos2.y = 0; + } + if (sprite->data[2] >= 0x80) + { + sprite->data[7] = 1; + } +} + +void sub_80B96B0(struct Sprite *sprite) +{ + if (sprite->data[7] == 0) + { + if (sprite->data[0] == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0855C548; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 1); + sprite->pos1.x = 0x5e; + sprite->pos1.y = -0x20; + sprite->data[0]++; + sprite->data[1] = 0xf0; + sprite->data[2] = 0x800; + sprite->data[4] = 0x80; + } + sprite->data[1] += sprite->data[2] >> 8; + sprite->data[3] += sprite->data[2] >> 8; + sprite->data[1] &= 0xff; + sprite->pos2.x = Cos(sprite->data[1], 0x20); + sprite->pos2.y = Sin(sprite->data[1], 0x78); + if (sprite->data[2] > 0x100) + { + sprite->data[2] -= sprite->data[4]; + } + if (sprite->data[4] < 0x100) + { + sprite->data[4] += 24; + } + if (sprite->data[2] < 0x100) + { + sprite->data[2] = 0x100; + } + if (sprite->data[3] >= 60) + { + sprite->data[7]++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->invisible = 1; + } + } +} + +void sub_80B9794(u8 spriteId) +{ + sub_80B9524(spriteId); + gSprites[spriteId].callback = sub_80B96B0; +} + +void sub_80B97D4(u8); + +u8 FldEff_FlyIn(void) +{ + CreateTask(sub_80B97D4, 0xfe); + return 0; +} + +void (*const gUnknown_0855C550[])(struct Task *) = { + sub_80B9804, + sub_80B98B8, + sub_80B9924, + sub_80B9978, + sub_80B99F0, + sub_80B9A28, + sub_80B9A60, +}; + +void sub_80B97D4(u8 taskId) +{ + gUnknown_0855C550[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80B9804(struct Task *task) +{ + struct EventObject *eventObject; + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (!EventObjectIsMovementOverridden(eventObject) || EventObjectClearHeldMovementIfFinished(eventObject)) + { + task->data[0]++; + task->data[2] = 17; + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.preventStep = TRUE; + SetPlayerAvatarStateMask(0x01); + if (task->data[15] & 0x08) + { + sub_81555AC(eventObject->fieldEffectSpriteId, 0); + } + EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); + CameraObjectReset2(); + EventObjectTurn(eventObject, DIR_WEST); + StartSpriteAnim(&gSprites[eventObject->spriteId], 0x16); + eventObject->invisible = 0; + task->data[1] = sub_80B94C4(); + sub_80B9524(task->data[1]); + sub_80B9560(task->data[1], eventObject->spriteId); + } +} + +void sub_80B98B8(struct Task *task) +{ + struct EventObject *eventObject; + struct Sprite *sprite; + if (task->data[2] == 0 || (--task->data[2]) == 0) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + sprite = &gSprites[eventObject->spriteId]; + sub_80B9560(task->data[1], 0x40); + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_80B9924(struct Task *task) +{ + s16 unknown_0855C56C[18] = { + -2, + -4, + -5, + -6, + -7, + -8, + -8, + -8, + -7, + -7, + -6, + -5, + -3, + -2, + 0, + 2, + 4, + 8 + }; + struct Sprite *sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y = unknown_0855C56C[task->data[2]]; + if ((++task->data[2]) >= 18) + { + task->data[0]++; + } +} + +void sub_80B9978(struct Task *task) +{ + struct EventObject *eventObject; + struct Sprite *sprite; + if (sub_80B9508(task->data[1])) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + sprite = &gSprites[eventObject->spriteId]; + eventObject->inanimate = 0; + sub_808EB08(eventObject, eventObject->currentCoords.x, eventObject->currentCoords.y); + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->coordOffsetEnabled = 1; + sub_808C114(); + EventObjectSetHeldMovement(eventObject, 0x39); + task->data[0]++; + } +} + +void sub_80B99F0(struct Task *task) +{ + if (EventObjectClearHeldMovementIfFinished(&gEventObjects[gPlayerAvatar.eventObjectId])) + { + task->data[0]++; + sub_80B9794(task->data[1]); + } +} + +void sub_80B9A28(struct Task *task) +{ + if (sub_80B9508(task->data[1])) + { + DestroySprite(&gSprites[task->data[1]]); + task->data[0]++; + task->data[1] = 0x10; + } +} + +void sub_80B9A60(struct Task *task) +{ + u8 state; + struct EventObject *eventObject; + if ((--task->data[1]) == 0) + { + eventObject = &gEventObjects[gPlayerAvatar.eventObjectId]; + state = 0; + if (task->data[15] & 0x08) + { + state = 3; + sub_81555AC(eventObject->fieldEffectSpriteId, 1); + } + EventObjectSetGraphicsId(eventObject, GetPlayerAvatarGraphicsIdByStateId(state)); + EventObjectTurn(eventObject, DIR_SOUTH); + gPlayerAvatar.flags = task->data[15]; + gPlayerAvatar.preventStep = FALSE; + FieldEffectActiveListRemove(FLDEFF_FLY_IN); + DestroyTask(FindTaskIdByFunc(sub_80B97D4)); + } +} + +void sub_80B9BE8(u8 taskId); + +bool8 sub_80B9ADC(void) +{ + u8 taskId; + u8 eventObjectIdBuffer; + if (!TryGetEventObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &eventObjectIdBuffer)) + { + taskId = CreateTask(sub_80B9BE8, 0x50); + gTasks[taskId].data[2] = eventObjectIdBuffer; + gTasks[taskId].data[6] = gFieldEffectArguments[0]; + gTasks[taskId].data[7] = gFieldEffectArguments[1]; + gTasks[taskId].data[8] = gFieldEffectArguments[2]; + } + else + { + FieldEffectActiveListRemove(0x41); + } + return FALSE; +} + +void sub_80B9B3C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (data[7] != 0) + { + if (++data[6] > 20) + { + data[6] = 0; + if (data[5] != 0) + data[5]--; + } + } + else + { + data[5] = 4; + } + + if (++data[0] > 1) + { + data[0] = 0; + if (++data[1] & 1) + { + SetCameraPanning(0, -data[5]); + } + else + { + SetCameraPanning(0, data[5]); + } + } + UpdateCameraPanning(); + if (data[5] == 0) + DestroyTask(taskId); +} + +void sub_80B9BD0(u8 taskId) +{ + gTasks[taskId].data[7] = 1; +} + +void (*const gUnknown_0855C590[])(s16*, u8) = { + sub_80B9C28, + sub_80B9C54, + sub_80B9CDC, +}; + +void sub_80B9BE8(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + InstallCameraPanAheadCallback(); + SetCameraPanningCallback(0); + gUnknown_0855C590[data[1]](data, taskId); +} + +void sub_80B9C28(s16* data, u8 taskId) +{ + u8 newTaskId = CreateTask(sub_80B9B3C, 0x5A); + PlaySE(SE_T_KAMI2); + data[5] = newTaskId; + data[1]++; +} + +void sub_80B9D24(struct Sprite*); + +void sub_80B9C54(s16* data, u8 taskId) +{ + if (++data[3] > 0x78) + { + struct Sprite *sprite = &gSprites[gEventObjects[data[2]].spriteId]; + gEventObjects[data[2]].invisible = TRUE; + BlendPalettes(0x0000FFFF, 0x10, RGB_WHITE); + BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, RGB_WHITE); + sub_80B9D24(sprite); + PlaySE(SE_T_KAMI); + sub_80B9BD0(data[5]); + data[3] = 0; + data[1]++; + } +} + +void sub_80B9CDC(s16* a0, u8 taskId) +{ + if (!gPaletteFade.active && !FuncIsActiveTask(sub_80B9B3C)) + { + InstallCameraPanAheadCallback(); + RemoveEventObjectByLocalIdAndMap(a0[6], a0[7], a0[8]); + FieldEffectActiveListRemove(0x41); + DestroyTask(taskId); + } +} + +void sub_80B9DB8(struct Sprite* sprite); + +const struct SpriteFrameImage gSpriteImageTable_855C59C[] = { + obj_frame_tiles(gUnknown_0855C170), + obj_frame_tiles(gUnknown_0855C190), + obj_frame_tiles(gUnknown_0855C1B0), + obj_frame_tiles(gUnknown_0855C1D0), +}; + +const union AnimCmd gSpriteAnim_855C5BC[] = { + ANIMCMD_FRAME(.imageValue = 0), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_855C5C4[] = { + ANIMCMD_FRAME(.imageValue = 1), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_855C5CC[] = { + ANIMCMD_FRAME(.imageValue = 2), + ANIMCMD_END +}; + +const union AnimCmd gSpriteAnim_855C5D4[] = { + ANIMCMD_FRAME(.imageValue = 3), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_855C5DC[] = { + gSpriteAnim_855C5BC, + gSpriteAnim_855C5C4, + gSpriteAnim_855C5CC, + gSpriteAnim_855C5D4, +}; + +const struct SpriteTemplate gUnknown_0855C5EC = { + .tileTag = 0xffff, + .paletteTag = 4378, + .oam = &gOamData_855C218, + .anims = gSpriteAnimTable_855C5DC, + .images = gSpriteImageTable_855C59C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80B9DB8 +}; + +void sub_80B9D24(struct Sprite* sprite) +{ + int i; + int xPos = (s16)gUnknown_03005DEC + sprite->pos1.x + sprite->pos2.x; + int yPos = (s16)gUnknown_03005DE8 + sprite->pos1.y + sprite->pos2.y - 4; + + for (i = 0; i < 4; i++) + { + u8 spriteId = CreateSprite(&gUnknown_0855C5EC, xPos, yPos, 0); + if (spriteId != 0x40) + { + StartSpriteAnim(&gSprites[spriteId], i); + gSprites[spriteId].data[0] = i; + gSprites[spriteId].oam.paletteNum = sprite->oam.paletteNum; + } + } +} + +void sub_80B9DB8(struct Sprite* sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x -= 16; + sprite->pos1.y -= 12; + break; + case 1: + sprite->pos1.x += 16; + sprite->pos1.y -= 12; + break; + case 2: + sprite->pos1.x -= 16; + sprite->pos1.y += 12; + break; + case 3: + sprite->pos1.x += 16; + sprite->pos1.y += 12; + break; + } + if ((u16)(sprite->pos1.x + 4) > 0xF8 || sprite->pos1.y < -4 || sprite->pos1.y > 0xA4) + DestroySprite(sprite); +} + +void sub_80B9EDC(u8 taskId); + +bool8 sub_80B9E28(struct Sprite* sprite) +{ + u8 eventObjectIdBuffer; + if (!TryGetEventObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &eventObjectIdBuffer)) + { + struct EventObject *object; + int xPos, yPos; + u8 taskId; + object = &gEventObjects[eventObjectIdBuffer]; + xPos = object->currentCoords.x - 7; + yPos = object->currentCoords.y - 7; + xPos = (gFieldEffectArguments[3] - xPos) * 16; + yPos = (gFieldEffectArguments[4] - yPos) * 16; + ShiftEventObjectCoords(object, gFieldEffectArguments[3] + 7, gFieldEffectArguments[4] + 7); + taskId = CreateTask(sub_80B9EDC, 0x50); + gTasks[taskId].data[1] = object->spriteId; + gTasks[taskId].data[2] = gSprites[object->spriteId].pos1.x + xPos; + gTasks[taskId].data[3] = gSprites[object->spriteId].pos1.y + yPos; + gTasks[taskId].data[8] = gFieldEffectArguments[5]; + gTasks[taskId].data[9] = eventObjectIdBuffer; + } + return FALSE; +} + +void sub_80B9EDC(u8 taskId) +{ + // BUG: Possible divide by zero + s16 *data = gTasks[taskId].data; + struct Sprite *sprite = &gSprites[data[1]]; + switch (data[0]) + { + case 0: + data[4] = sprite->pos1.x << 4; + data[5] = sprite->pos1.y << 4; + data[6] = (data[2] * 16 - data[4]) / data[8]; + data[7] = (data[3] * 16 - data[5]) / data[8]; + data[0]++; + case 1: + if (data[8] != 0) + { + data[8]--; + data[4] += data[6]; + data[5] += data[7]; + sprite->pos1.x = data[4] >> 4; + sprite->pos1.y = data[5] >> 4; + } + else + { + struct EventObject *object = &gEventObjects[data[9]]; + sprite->pos1.x = data[2]; + sprite->pos1.y = data[3]; + ShiftStillEventObjectCoords(object); + object->triggerGroundEffectsOnStop = TRUE; + FieldEffectActiveListRemove(0x42); + DestroyTask(taskId); + } + break; + } +} diff --git a/src/field_map_obj.c b/src/field_map_obj.c deleted file mode 100644 index a5be62442..000000000 --- a/src/field_map_obj.c +++ /dev/null @@ -1,5119 +0,0 @@ -// Includes - -#include "global.h" -#include "malloc.h" -#include "sprite.h" -#include "overworld.h" -#include "random.h" -#include "event_scripts.h" -#include "berry.h" -#include "palette.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "event_data.h" -#include "rom_818CFC8.h" -#include "rom_81BE66C.h" -#include "field_ground_effect.h" -#include "field_map_obj_helpers.h" -#include "mauville_old_man.h" -#include "metatile_behavior.h" -#include "field_effect.h" -#include "field_effect_helpers.h" -#include "field_camera.h" -#include "trainer_see.h" -#include "decoration.h" -#include "field_map_obj.h" - -#define NUM_FIELD_MAP_OBJECT_TEMPLATES 0x51 - -#define null_object_step(name, retval) \ -bool8 FieldObjectCB2_##name(struct MapObject *, struct Sprite *);\ -void FieldObjectCB_##name(struct Sprite *sprite)\ -{\ - FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, FieldObjectCB2_##name);\ -}\ -bool8 FieldObjectCB2_##name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - return (retval);\ -} - -#define field_object_step(name, table) \ -extern bool8 (*const (table)[])(struct MapObject *, struct Sprite *);\ -bool8 FieldObjectCB2_##name(struct MapObject *, struct Sprite *);\ -void FieldObjectCB_##name(struct Sprite *sprite)\ -{\ - FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, FieldObjectCB2_##name);\ -}\ -bool8 FieldObjectCB2_##name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - return (table)[sprite->data[1]](mapObject, sprite);\ -} - -#define field_object_path(idx, table, sub, path, catch, coord)\ -field_object_step(GoInDirectionSequence##idx, table)\ -extern const u8 path[4];\ -bool8 sub(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - u8 route[sizeof(path)];\ - memcpy(route, path, sizeof(path));\ - if (mapObject->mapobj_unk_21 == (catch) && mapObject->coords1.coord == mapObject->coords2.coord)\ - {\ - mapObject->mapobj_unk_21 = (catch) + 1;\ - }\ - return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, route);\ -}\ - -// Static struct declarations - -// Static RAM declarations - -extern u8 gUnknown_020375B4; -extern u16 gUnknown_020375B6; - -// Static ROM declarations - -static void sub_808D450(void); -static u8 GetFieldObjectIdByLocalId(u8); -static u8 GetFieldObjectIdByLocalIdAndMapInternal(u8, u8, u8); -static bool8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *); -static void FieldObjectHandleDynamicGraphicsId(struct MapObject *); -static void RemoveFieldObjectInternal (struct MapObject *); -/*static*/ u16 GetFieldObjectFlagIdByFieldObjectId(u8); -void sub_8096518(struct MapObject *, struct Sprite *); -static void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *, struct SpriteTemplate *, const struct SubspriteTable **); -/*static*/ void GetFieldObjectMovingCameraOffset(s16 *, s16 *); -/*static*/ struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8, u8, u8); -static void sub_808E894(u16); -static void RemoveFieldObjectIfOutsideView(struct MapObject *); -static void sub_808E1B8(u8, s16, s16); -static void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); -/*static*/ void sub_808E38C(struct MapObject *); -static u8 sub_808E8F4(const struct SpritePalette *); -static u8 FindFieldObjectPaletteIndexByTag(u16); -static void sub_808EAB0(u16, u8); -static bool8 FieldObjectDoesZCoordMatch(struct MapObject *, u8); -//static void CameraObject_0(struct Sprite *); -/*static*/ void CameraObject_1(struct Sprite *); -//static void CameraObject_2(struct Sprite *); -/*static*/ struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count); -void npc_reset(struct MapObject *, struct Sprite *); -void FieldObjectSetRegularAnim(struct MapObject *, struct Sprite *, u8); - -u8 GetFaceDirectionAnimId(u32); -u8 GetGoSpeed0AnimId(u32); -u8 GetGoSpeed1AnimId(u32); -u8 GetGoSpeed3AnimId(u32); -u8 sub_8093438(u32); -u8 sub_80934BC(u32); -u8 sub_8093514(u32); -u8 GetJumpLedgeAnimId(u32); -void sub_8092F88(u32, s16 *, s16 *, s16, s16); - -bool8 FieldObjectExecRegularAnim(struct MapObject *, struct Sprite *); -void SetFieldObjectStepTimer(struct Sprite *, s16); -bool8 RunFieldObjectStepTimer(struct Sprite *); -bool8 npc_block_way__next_tile(struct MapObject *, u8); -static u32 state_to_direction(u8, u32, u32); -/*static*/ void sub_80964E8(struct MapObject *, struct Sprite *); -static void FieldObjectExecSpecialAnim(struct MapObject *, struct Sprite *); -/*static*/ void npc_obj_transfer_image_anim_pause_flag(struct MapObject *, struct Sprite *); - -static bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *, s16, s16); -static bool8 IsMetatileDirectionallyImpassable(struct MapObject *, s16, s16, u8); -static bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *, s16, s16); -bool8 sub_809558C(struct MapObject *, struct Sprite *); -bool8 sub_8095B64(struct MapObject *, struct Sprite *); -static void sub_8096530(struct MapObject *, struct Sprite *); -static void npc_update_obj_anim_flag(struct MapObject *, struct Sprite *); - -// ROM data - -extern void (*const gUnknown_08505438[NUM_FIELD_MAP_OBJECT_TEMPLATES])(struct Sprite *); -extern const u8 gUnknown_0850557C[NUM_FIELD_MAP_OBJECT_TEMPLATES]; -extern const u8 gUnknown_085055CD[NUM_FIELD_MAP_OBJECT_TEMPLATES]; -extern const struct MapObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[7]; -extern const struct MapObjectGraphicsInfo *const gFieldObjectGraphicsInfoPointers[0xEF]; -extern u8 (*const gUnknown_0850D714[11])(s16, s16, s16, s16); - -struct PairedPalettes { - u16 tag; - const u16 *data; -}; - -extern const u8 gUnknown_084975C4[0x10]; -extern const struct SpriteTemplate gUnknown_084975D4; -extern void (*const gUnknown_084975EC[3])(struct Sprite *); -extern const struct SpritePalette gUnknown_0850BBC8[39]; -extern const struct PairedPalettes gUnknown_0850BD00[4]; -extern const struct PairedPalettes gUnknown_0850BD78[14]; -extern const u16 *const gUnknown_0850BE38[2]; -extern const s16 gUnknown_0850D6DC[4]; // {0x20, 0x40, 0x60, 0x80} -extern const s16 gUnknown_0850D6EC[4]; -extern const u8 gUnknown_0850D710[4]; // {DIR_SOUTH, DIR_NORTH, DIR_WEST, DIR_EAST} -extern const u8 gUnknown_0850D770[2]; // {DIR_SOUTH, DIR_NORTH} -extern const u8 gUnknown_0850D790[2]; // {DIR_WEST, DIR_EAST} -extern const u8 gUnknown_0850D7F0[2]; // {DIR_NORTH, DIR_WEST} -extern const u8 gUnknown_0850D808[2]; // {DIR_NORTH, DIR_EAST} -extern const u8 gUnknown_0850D820[2]; // {DIR_SOUTH, DIR_WEST} -extern const u8 gUnknown_0850D838[2]; // {DIR_SOUTH, DIR_EAST} -extern const u8 gUnknown_0850D850[4]; -extern const u8 gUnknown_0850D868[4]; -extern const u8 gUnknown_0850D880[4]; -extern const u8 gUnknown_0850D898[4]; -extern const u8 gUnknown_0850D8AC[5]; -extern const u8 gUnknown_0850D8C4[5]; -extern const u8 gUnknown_0850D8E8[4]; -extern bool8 (*const gUnknown_0850DA64[11])(struct MapObject *, struct Sprite *, u8, bool8(u8)); -extern bool8 (*const gUnknown_0850DB5C[4])(u8); -extern bool8 (*const gUnknown_0850DB6C[4])(u8); -extern const struct Coords16 gUnknown_0850DB7C[4]; -extern const u8 gUnknown_0850DC2F[4][4]; -extern const u8 gUnknown_0850DC3F[4][4]; -extern const u8 gUnknown_0850DBA0[5]; -extern bool8 (*const *const gUnknown_0850DC50[166])(struct MapObject *, struct Sprite *); -extern u8 (*const gUnknown_0850DEE8[5])(u8); -extern const s16 gUnknown_0850DFBC[3]; -extern const s16 gUnknown_0850DFC2[3]; - -// Code - -static void npc_clear_ids_and_state(struct MapObject *mapObject) -{ - *mapObject = (struct MapObject){}; - mapObject->localId = 0xFF; - mapObject->mapNum = -1; - mapObject->mapGroup = -1; - mapObject->mapobj_unk_1C = -1; -} - -static void npcs_clear_ids_and_state(void) -{ - u8 i; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - npc_clear_ids_and_state(&gMapObjects[i]); - } -} - -void sub_808D438(void) -{ - ZeroAllLinkPlayerMapObjects(); - npcs_clear_ids_and_state(); - ClearPlayerAvatarInfo(); - sub_808D450(); -} - -static void sub_808D450(void) -{ - u8 spriteIdx; - - spriteIdx = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31); - gSprites[spriteIdx].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteIdx]); - StartSpriteAffineAnim(&gSprites[spriteIdx], 0); - gSprites[spriteIdx].invisible = TRUE; - - spriteIdx = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[21], 0, 0, 31); - gSprites[spriteIdx].oam.affineMode = 1; - InitSpriteAffineAnim(&gSprites[spriteIdx]); - StartSpriteAffineAnim(&gSprites[spriteIdx], 1); - gSprites[spriteIdx].invisible = TRUE; -} - -u8 sub_808D4F4(void) -{ - u8 i; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (!gMapObjects[i].active) - { - break; - } - } - return i; -} - -u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapId, u8 mapGroupId) -{ - if (localId < 0xff) - { - return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapId, mapGroupId); - } - return GetFieldObjectIdByLocalId(localId); -} - -bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapId, u8 mapGroupId, u8 *fieldObjectId) -{ - *fieldObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapId, mapGroupId); - if (*fieldObjectId == NUM_FIELD_OBJECTS) - { - return TRUE; - } - return FALSE; -} - -u8 GetFieldObjectIdByXY(s16 x, s16 y) -{ - u8 i; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - { - break; - } - } - return i; -} - -static u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapId, u8 mapGroupId) -{ - u8 i; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapId && gMapObjects[i].mapGroup == mapGroupId) - { - return i; - } - } - return NUM_FIELD_OBJECTS; -} - -static u8 GetFieldObjectIdByLocalId(u8 localId) -{ - u8 i; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId) - { - return i; - } - } - return NUM_FIELD_OBJECTS; -} - -// This function has the same nonmatching quirk as in Ruby/Sapphire. -#ifdef NONMATCHING -static u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 mapNum, u8 mapGroup) -{ - struct MapObject *mapObject; - s16 x; - s16 y; - u8 slot; - - // mapNum and mapGroup are in the wrong registers (r7/r6 instead of r6/r7) - if (GetAvailableFieldObjectSlot(template->localId, mapNum, mapGroup, &slot)) - { - return NUM_FIELD_OBJECTS; - } - mapObject = &gMapObjects[slot]; - npc_clear_ids_and_state(mapObject); - x = template->x + 7; - y = template->y + 7; - mapObject->active = TRUE; - mapObject->mapobj_bit_2 = TRUE; - mapObject->graphicsId = template->graphicsId; - mapObject->animPattern = template->movementType; - mapObject->localId = template->localId; - mapObject->mapNum = mapNum; - mapObject->mapGroup = mapGroup; - mapObject->coords1.x = x; - mapObject->coords1.y = y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; - mapObject->coords3.x = x; - mapObject->coords3.y = y; - mapObject->mapobj_unk_0B_0 = template->elevation; - mapObject->elevation = template->elevation; - // For some reason, 0x0F is placed in r9, to be used later - mapObject->range.as_nybbles.x = template->unkA_0; - mapObject->range.as_nybbles.y = template->unkA_4; - mapObject->trainerType = template->unkC; - mapObject->trainerRange_berryTreeId = template->unkE; - mapObject->mapobj_unk_20 = gUnknown_085055CD[template->movementType]; - FieldObjectSetDirection(mapObject, mapObject->mapobj_unk_20); - FieldObjectHandleDynamicGraphicsId(mapObject); - - if (gUnknown_0850557C[mapObject->animPattern]) - { - if ((mapObject->range.as_nybbles.x) == 0) - { - // r9 is invoked here - mapObject->range.as_nybbles.x ++; - } - if ((mapObject->range.as_nybbles.y) == 0) - { - mapObject->range.as_nybbles.y ++; - } - } - return slot; -} -#else -static __attribute__((naked)) u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 mapId, u8 mapGroupId) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r9\n" - "\tmov r6, r8\n" - "\tpush {r6,r7}\n" - "\tsub sp, 0x4\n" - "\tadds r5, r0, 0\n" - "\tlsls r1, 24\n" - "\tlsrs r6, r1, 24\n" - "\tlsls r2, 24\n" - "\tlsrs r7, r2, 24\n" - "\tldrb r0, [r5]\n" - "\tadds r1, r6, 0\n" - "\tadds r2, r7, 0\n" - "\tmov r3, sp\n" - "\tbl GetAvailableFieldObjectSlot\n" - "\tlsls r0, 24\n" - "\tcmp r0, 0\n" - "\tbeq _0808D66E\n" - "\tmovs r0, 0x10\n" - "\tb _0808D762\n" - "_0808D66E:\n" - "\tmov r0, sp\n" - "\tldrb r1, [r0]\n" - "\tlsls r0, r1, 3\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tldr r1, =gMapObjects\n" - "\tadds r4, r0, r1\n" - "\tadds r0, r4, 0\n" - "\tbl npc_clear_ids_and_state\n" - "\tldrh r3, [r5, 0x4]\n" - "\tadds r3, 0x7\n" - "\tlsls r3, 16\n" - "\tlsrs r3, 16\n" - "\tldrh r2, [r5, 0x6]\n" - "\tadds r2, 0x7\n" - "\tlsls r2, 16\n" - "\tlsrs r2, 16\n" - "\tldrb r0, [r4]\n" - "\tmovs r1, 0x1\n" - "\torrs r0, r1\n" - "\tmovs r1, 0x4\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4]\n" - "\tldrb r0, [r5, 0x1]\n" - "\tstrb r0, [r4, 0x5]\n" - "\tldrb r0, [r5, 0x9]\n" - "\tstrb r0, [r4, 0x6]\n" - "\tldrb r0, [r5]\n" - "\tstrb r0, [r4, 0x8]\n" - "\tstrb r6, [r4, 0x9]\n" - "\tstrb r7, [r4, 0xA]\n" - "\tstrh r3, [r4, 0xC]\n" - "\tstrh r2, [r4, 0xE]\n" - "\tstrh r3, [r4, 0x10]\n" - "\tstrh r2, [r4, 0x12]\n" - "\tstrh r3, [r4, 0x14]\n" - "\tstrh r2, [r4, 0x16]\n" - "\tldrb r0, [r5, 0x8]\n" - "\tmovs r7, 0xF\n" - "\tadds r1, r7, 0\n" - "\tands r1, r0\n" - "\tldrb r2, [r4, 0xB]\n" - "\tmovs r0, 0x10\n" - "\tnegs r0, r0\n" - "\tmov r8, r0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0xB]\n" - "\tldrb r1, [r5, 0x8]\n" - "\tlsls r1, 4\n" - "\tands r0, r7\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0xB]\n" - "\tldrb r1, [r5, 0xA]\n" - "\tlsls r1, 28\n" - "\tmovs r0, 0xF\n" - "\tmov r9, r0\n" - "\tlsrs r1, 28\n" - "\tldrb r2, [r4, 0x19]\n" - "\tmov r0, r8\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0x19]\n" - "\tldrb r1, [r5, 0xA]\n" - "\tlsrs r1, 4\n" - "\tlsls r1, 4\n" - "\tands r0, r7\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0x19]\n" - "\tldrh r0, [r5, 0xC]\n" - "\tstrb r0, [r4, 0x7]\n" - "\tldrh r0, [r5, 0xE]\n" - "\tstrb r0, [r4, 0x1D]\n" - "\tldr r1, =gUnknown_085055CD\n" - "\tldrb r0, [r5, 0x9]\n" - "\tadds r0, r1\n" - "\tldrb r1, [r0]\n" - "\tadds r0, r4, 0\n" - "\tadds r0, 0x20\n" - "\tstrb r1, [r0]\n" - "\tldrb r1, [r0]\n" - "\tadds r0, r4, 0\n" - "\tbl FieldObjectSetDirection\n" - "\tadds r0, r4, 0\n" - "\tbl FieldObjectHandleDynamicGraphicsId\n" - "\tldr r1, =gUnknown_0850557C\n" - "\tldrb r0, [r4, 0x6]\n" - "\tadds r0, r1\n" - "\tldrb r0, [r0]\n" - "\tcmp r0, 0\n" - "\tbeq _0808D75E\n" - "\tldrb r2, [r4, 0x19]\n" - "\tadds r0, r7, 0\n" - "\tands r0, r2\n" - "\tcmp r0, 0\n" - "\tbne _0808D746\n" - "\tlsls r0, r2, 28\n" - "\tlsrs r0, 28\n" - "\tadds r0, 0x1\n" - "\tmov r1, r9\n" - "\tands r0, r1\n" - "\tmov r1, r8\n" - "\tands r1, r2\n" - "\torrs r1, r0\n" - "\tstrb r1, [r4, 0x19]\n" - "_0808D746:\n" - "\tldrb r2, [r4, 0x19]\n" - "\tmovs r0, 0xF0\n" - "\tands r0, r2\n" - "\tcmp r0, 0\n" - "\tbne _0808D75E\n" - "\tlsrs r1, r2, 4\n" - "\tadds r1, 0x1\n" - "\tlsls r1, 4\n" - "\tadds r0, r7, 0\n" - "\tands r0, r2\n" - "\torrs r0, r1\n" - "\tstrb r0, [r4, 0x19]\n" - "_0808D75E:\n" - "\tmov r0, sp\n" - "\tldrb r0, [r0]\n" - "_0808D762:\n" - "\tadd sp, 0x4\n" - "\tpop {r3,r4}\n" - "\tmov r8, r3\n" - "\tmov r9, r4\n" - "\tpop {r4-r7}\n" - "\tpop {r1}\n" - "\tbx r1\n" - ".pool"); -} -#endif - -u8 unref_sub_808D77C(u8 localId) -{ - u8 i; - u8 nObjects; - struct MapObjectTemplate *template; - - if (gMapHeader.events != NULL) - { - if (InBattlePyramid()) - { - nObjects = sub_81AAA40(); - } - else if (InTrainerHill()) - { - nObjects = 2; - } - else - { - nObjects = gMapHeader.events->mapObjectCount; - } - for (i = 0; i < nObjects; i ++) - { - template = &gSaveBlock1Ptr->mapObjectTemplates[i]; - if (template->localId == localId && !FlagGet(template->flagId)) - { - return InitFieldObjectStateFromTemplate(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); - } - } - } - return NUM_FIELD_OBJECTS; -} - -static bool8 GetAvailableFieldObjectSlot(u16 localId, u8 mapNum, u8 mapGroup, u8 *result) -// Looks for an empty slot. -// Returns FALSE and the location of the available slot -// in *result. -// If no slots are available, or if the object is already -// loaded, returns TRUE. -{ - u8 i = 0; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (!gMapObjects[i].active) - break; - if (gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) - return TRUE; - } - if (i >= NUM_FIELD_OBJECTS) - return TRUE; - *result = i; - do - { - if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup) - return TRUE; - i ++; - } while (i < NUM_FIELD_OBJECTS); - return FALSE; -} - -static void RemoveFieldObject(struct MapObject *mapObject) -{ - mapObject->active = FALSE; - RemoveFieldObjectInternal(mapObject); -} - -void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 index; - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &index)) - { - FlagSet(GetFieldObjectFlagIdByFieldObjectId(index)); - RemoveFieldObject(&gMapObjects[index]); - } -} - -static void RemoveFieldObjectInternal(struct MapObject *mapObject) -{ - struct SpriteFrameImage image; - image.size = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->size; - gSprites[mapObject->spriteId].images = ℑ - DestroySprite(&gSprites[mapObject->spriteId]); -} - -void unref_sub_808D958(void) -{ - u8 i; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (i != gPlayerAvatar.mapObjectId) - { - RemoveFieldObject(&gMapObjects[i]); - } - } -} - -static u8 SpawnFieldObjectInternal(struct MapObjectTemplate *mapObjectTemplate, struct SpriteTemplate *spriteTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) -{ - struct MapObject *mapObject; - const struct MapObjectGraphicsInfo *graphicsInfo; - struct Sprite *sprite; - u8 mapObjectId; - u8 paletteSlot; - u8 spriteId; - - mapObjectId = InitFieldObjectStateFromTemplate(mapObjectTemplate, mapNum, mapGroup); - if (mapObjectId == NUM_FIELD_OBJECTS) - { - return NUM_FIELD_OBJECTS; - } - mapObject = &gMapObjects[mapObjectId]; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == 0) - { - npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, 0); - } - else if (paletteSlot == 10) - { - npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, 10); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot); - } - if (mapObject->animPattern == 0x4c) - { - mapObject->mapobj_bit_13 = TRUE; - } - *(u16 *)&spriteTemplate->paletteTag = 0xFFFF; - spriteId = CreateSprite(spriteTemplate, 0, 0, 0); - if (spriteId == MAX_SPRITES) - { - gMapObjects[mapObjectId].active = FALSE; - return NUM_FIELD_OBJECTS; - } - sprite = &gSprites[spriteId]; - sub_8092FF0(mapObject->coords2.x + cameraX, mapObject->coords2.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] = mapObjectId; - mapObject->spriteId = spriteId; - mapObject->mapobj_bit_12 = graphicsInfo->inanimate; - if (!mapObject->mapobj_bit_12) - { - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - } - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - sub_8096518(mapObject, sprite); - return mapObjectId; -} - -static u8 SpawnFieldObject(struct MapObjectTemplate *mapObjectTemplate, u8 mapNum, u8 mapGroup, s16 cameraX, s16 cameraY) -{ - const struct MapObjectGraphicsInfo *graphicsInfo; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - struct SpriteFrameImage spriteFrameImage; - u8 mapObjectId; - - subspriteTables = NULL; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObjectTemplate->graphicsId); - MakeObjectTemplateFromFieldObjectTemplate(mapObjectTemplate, &spriteTemplate, &subspriteTables); - spriteFrameImage.size = graphicsInfo->size; - spriteTemplate.images = &spriteFrameImage; - mapObjectId = SpawnFieldObjectInternal(mapObjectTemplate, &spriteTemplate, mapNum, mapGroup, cameraX, cameraY); - if (mapObjectId == NUM_FIELD_OBJECTS) - { - return NUM_FIELD_OBJECTS; - } - gSprites[gMapObjects[mapObjectId].spriteId].images = graphicsInfo->images; - if (subspriteTables != NULL) - { - SetSubspriteTables(&gSprites[gMapObjects[mapObjectId].spriteId], subspriteTables); - } - return mapObjectId; -} - -u8 SpawnSpecialFieldObject(struct MapObjectTemplate *mapObjectTemplate) -{ - s16 cameraX; - s16 cameraY; - - GetFieldObjectMovingCameraOffset(&cameraX, &cameraY); - return SpawnFieldObject(mapObjectTemplate, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); -} - -u8 SpawnSpecialFieldObjectParametrized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 z) -{ - struct MapObjectTemplate mapObjectTemplate; - - x -= 7; - y -= 7; - mapObjectTemplate.localId = localId; - mapObjectTemplate.graphicsId = graphicsId; - mapObjectTemplate.unk2 = 0; - mapObjectTemplate.x = x; - mapObjectTemplate.y = y; - mapObjectTemplate.elevation = z; - mapObjectTemplate.movementType = movementBehavior; - mapObjectTemplate.unkA_0 = 0; - mapObjectTemplate.unkA_4 = 0; - mapObjectTemplate.unkC = 0; - mapObjectTemplate.unkE = 0; - return SpawnSpecialFieldObject(&mapObjectTemplate); -} - -u8 show_sprite(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *mapObjectTemplate; - s16 cameraX; - s16 cameraY; - - mapObjectTemplate = GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup); - if (mapObjectTemplate == NULL) - { - return NUM_FIELD_OBJECTS; - } - GetFieldObjectMovingCameraOffset(&cameraX, &cameraY); - return SpawnFieldObject(mapObjectTemplate, mapNum, mapGroup, cameraX, cameraY); -} - -static void MakeObjectTemplateFromFieldObjectGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(graphicsId); - - sprTemplate->tileTag = gfxInfo->tileTag; - sprTemplate->paletteTag = gfxInfo->paletteTag1; - sprTemplate->oam = gfxInfo->oam; - sprTemplate->anims = gfxInfo->anims; - sprTemplate->images = gfxInfo->images; - sprTemplate->affineAnims = gfxInfo->affineAnims; - sprTemplate->callback = callback; - *subspriteTables = gfxInfo->subspriteTables; -} - -static void MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(u16 graphicsId, u16 callbackIndex, struct SpriteTemplate *sprTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, gUnknown_08505438[callbackIndex], sprTemplate, subspriteTables); -} - -static void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjectTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) -{ - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjectTemplate->graphicsId, mapObjectTemplate->movementType, spriteTemplate, subspriteTables); -} - -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) -{ - struct SpriteTemplate *spriteTemplate; - const struct SubspriteTable *subspriteTables; - struct Sprite *sprite; - u8 spriteIdx; - - spriteTemplate = malloc(sizeof(struct SpriteTemplate)); - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, spriteTemplate, &subspriteTables); - if (spriteTemplate->paletteTag != 0xffff) - { - sub_808E894(spriteTemplate->paletteTag); - } - spriteIdx = CreateSprite(spriteTemplate, x, y, subpriority); - free(spriteTemplate); - - if (spriteIdx != MAX_SPRITES && subspriteTables != NULL) - { - sprite = &gSprites[spriteIdx]; - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = 2; - } - return spriteIdx; -} - -u8 sprite_new(u8 graphicsId, u8 a1, s16 x, s16 y, u8 z, u8 direction) -{ - const struct MapObjectGraphicsInfo *graphicsInfo; - struct SpriteTemplate spriteTemplate; - const struct SubspriteTable *subspriteTables; - u8 spriteId; - struct Sprite *sprite; - - graphicsInfo = GetFieldObjectGraphicsInfo(graphicsId); - MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, sub_8097AC8, &spriteTemplate, &subspriteTables); - *(u16 *)&spriteTemplate.paletteTag = 0xffff; - x += 7; - y += 7; - sub_80930E0(&x, &y, 8, 16); - spriteId = CreateSpriteAtEnd(&spriteTemplate, x, y, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sprite->centerToCornerVecX = -(graphicsInfo->width >> 1); - sprite->centerToCornerVecY = -(graphicsInfo->height >> 1); - sprite->pos1.y += sprite->centerToCornerVecY; - sprite->oam.paletteNum = graphicsInfo->paletteSlot; - if (sprite->oam.paletteNum >= 16) - { - sprite->oam.paletteNum -= 16; - } - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = a1; - sprite->data[1] = z; - if (graphicsInfo->paletteSlot == 10) - { - npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); - } - else if (graphicsInfo->paletteSlot >= 16) - { - sub_808EAB0(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot | 0xf0); - } - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - sprite->subspriteMode = 2; - } - InitObjectPriorityByZCoord(sprite, z); - SetObjectSubpriorityByZCoord(z, sprite, 1); - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(direction)); - } - return spriteId; -} - -void SpawnFieldObjectsInView(s16 cameraX, s16 cameraY) -{ - u8 i; - s16 left; - s16 right; - s16 top; - s16 bottom; - u8 objectCount; - s16 npcX; - s16 npcY; - - if (gMapHeader.events != NULL) - { - left = gSaveBlock1Ptr->pos.x - 2; - right = gSaveBlock1Ptr->pos.x + 17; - top = gSaveBlock1Ptr->pos.y; - bottom = gSaveBlock1Ptr->pos.y + 16; - - if (InBattlePyramid()) - { - objectCount = sub_81AAA40(); - } - else if (InTrainerHill()) - { - objectCount = 2; - } - else - { - objectCount = gMapHeader.events->mapObjectCount; - } - - for (i = 0; i < objectCount; i++) - { - struct MapObjectTemplate *template = &gSaveBlock1Ptr->mapObjectTemplates[i]; - npcX = template->x + 7; - npcY = template->y + 7; - - if (top <= npcY && bottom >= npcY && left <= npcX && right >= npcX - && !FlagGet(template->flagId)) - SpawnFieldObject(template, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, cameraX, cameraY); - } - } -} - -/*static*/ void RemoveFieldObjectsOutsideView(void) -{ - u8 i; - u8 j; - bool8 isActiveLinkPlayer; - struct MapObject *mapObject; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - for (j = 0, isActiveLinkPlayer = FALSE; j < ARRAY_COUNT(gLinkPlayerMapObjects); j ++) - { - if (gLinkPlayerMapObjects[j].active && i == gLinkPlayerMapObjects[j].mapObjId) - isActiveLinkPlayer = TRUE; - } - if (!isActiveLinkPlayer) - { - mapObject = &gMapObjects[i]; - - if (mapObject->active && !mapObject->mapobj_bit_16) - RemoveFieldObjectIfOutsideView(mapObject); - } - } -} - -static void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) -{ - s16 left; - s16 right; - s16 top; - s16 bottom; - - left = gSaveBlock1Ptr->pos.x - 2; - right = gSaveBlock1Ptr->pos.x + 17; - top = gSaveBlock1Ptr->pos.y; - bottom = gSaveBlock1Ptr->pos.y + 16; - - if (mapObject->coords2.x >= left && mapObject->coords2.x <= right - && mapObject->coords2.y >= top && mapObject->coords2.y <= bottom) - return; - if (mapObject->coords1.x >= left && mapObject->coords1.x <= right - && mapObject->coords1.y >= top && mapObject->coords1.y <= bottom) - return; - RemoveFieldObject(mapObject); -} - -void sub_808E16C(s16 x, s16 y) -{ - u8 i; - - ClearPlayerAvatarInfo(); - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (gMapObjects[i].active) - { - sub_808E1B8(i, x, y); - } - } - sub_808D450(); -} - -static void sub_808E1B8(u8 mapObjectId, s16 x, s16 y) -{ - u8 spriteId; - u8 paletteSlot; - struct MapObject *mapObject; - const struct SubspriteTable *subspriteTables; - const struct MapObjectGraphicsInfo *graphicsInfo; - struct SpriteFrameImage spriteFrameImage; - struct SpriteTemplate spriteTemplate; - struct Sprite *sprite; - -#define i spriteId - for (i = 0; i < ARRAY_COUNT(gLinkPlayerMapObjects); i ++) - { - if (gLinkPlayerMapObjects[i].active && mapObjectId == gLinkPlayerMapObjects[i].mapObjId) - { - return; - } - } -#undef i - - mapObject = &gMapObjects[mapObjectId]; - subspriteTables = NULL; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - spriteFrameImage.size = graphicsInfo->size; - MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObject->graphicsId, mapObject->animPattern, &spriteTemplate, &subspriteTables); - spriteTemplate.images = &spriteFrameImage; - *(u16 *)&spriteTemplate.paletteTag = 0xffff; - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == 0) - { - npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); - } - else if (paletteSlot == 10) - { - npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot); - } - *(u16 *)&spriteTemplate.paletteTag = 0xffff; - spriteId = CreateSprite(&spriteTemplate, 0, 0, 0); - if (spriteId != MAX_SPRITES) - { - sprite = &gSprites[spriteId]; - sub_8092FF0(x + mapObject->coords2.x, y + mapObject->coords2.y, &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->images = graphicsInfo->images; - if (mapObject->animPattern == 0x0b) - { - SetPlayerAvatarFieldObjectIdAndObjectId(mapObjectId, spriteId); - mapObject->mapobj_unk_1B = sub_8154228(); - } - if (subspriteTables != NULL) - { - SetSubspriteTables(sprite, subspriteTables); - } - sprite->oam.paletteNum = paletteSlot; - sprite->coordOffsetEnabled = TRUE; - sprite->data[0] = mapObjectId; - mapObject->spriteId = spriteId; - if (!mapObject->mapobj_bit_12 && mapObject->animPattern != 0x0b) - { - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - } - sub_808E38C(mapObject); - SetObjectSubpriorityByZCoord(mapObject->elevation, sprite, 1); - } -} - -/*static*/ void sub_808E38C(struct MapObject *mapObject) -{ - mapObject->mapobj_bit_1 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - mapObject->mapobj_bit_22 = FALSE; - mapObject->mapobj_bit_17 = FALSE; - mapObject->mapobj_bit_18 = FALSE; - mapObject->mapobj_bit_19 = FALSE; - mapObject->mapobj_bit_20 = FALSE; - mapObject->mapobj_bit_21 = FALSE; - FieldObjectClearAnim(mapObject); -} - -static void SetPlayerAvatarFieldObjectIdAndObjectId(u8 mapObjectId, u8 spriteId) -{ - gPlayerAvatar.mapObjectId = mapObjectId; - gPlayerAvatar.spriteId = spriteId; - gPlayerAvatar.gender = GetPlayerAvatarGenderByGraphicsId(gMapObjects[mapObjectId].graphicsId); - SetPlayerAvatarExtraStateTransition(gMapObjects[mapObjectId].graphicsId, 0x20); -} - -void FieldObjectSetGraphicsId(struct MapObject *mapObject, u8 graphicsId) -{ - const struct MapObjectGraphicsInfo *graphicsInfo; - struct Sprite *sprite; - u8 paletteSlot; - - graphicsInfo = GetFieldObjectGraphicsInfo(graphicsId); - sprite = &gSprites[mapObject->spriteId]; - paletteSlot = graphicsInfo->paletteSlot; - if (paletteSlot == 0) - { - pal_patch_for_npc(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); - } - else if (paletteSlot == 10) - { - npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, graphicsInfo->paletteSlot); - } - else if (paletteSlot >= 16) - { - paletteSlot -= 16; - sub_808EAB0(graphicsInfo->paletteTag1, paletteSlot); - } - sprite->oam.shape = graphicsInfo->oam->shape; - sprite->oam.size = graphicsInfo->oam->size; - sprite->images = graphicsInfo->images; - sprite->anims = graphicsInfo->anims; - sprite->subspriteTables = graphicsInfo->subspriteTables; - sprite->oam.paletteNum = paletteSlot; - mapObject->mapobj_bit_12 = graphicsInfo->inanimate; - mapObject->graphicsId = graphicsId; - sub_8093038(mapObject->coords2.x, mapObject->coords2.y, &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; - if (mapObject->mapobj_bit_15) - { - CameraObjectReset1(); - } -} - -void FieldObjectSetGraphicsIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 graphicsId) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - FieldObjectSetGraphicsId(&gMapObjects[mapObjectId], graphicsId); - } -} - -void FieldObjectTurn(struct MapObject *mapObject, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - if (!mapObject->mapobj_bit_12) - { - StartSpriteAnim(&gSprites[mapObject->spriteId], FieldObjectDirectionToImageAnimId(mapObject->mapobj_unk_18)); - SeekSpriteAnim(&gSprites[mapObject->spriteId], 0); - } -} - -void FieldObjectTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - FieldObjectTurn(&gMapObjects[mapObjectId], direction); - } -} - -void PlayerObjectTurn(struct PlayerAvatar *playerAvatar, u8 direction) -{ - FieldObjectTurn(&gMapObjects[playerAvatar->mapObjectId], direction); -} - -/*static*/ void get_berry_tree_graphics(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 berryStage; - u8 berryId; - - mapObject->mapobj_bit_13 = TRUE; - sprite->invisible = TRUE; - berryStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (berryStage != 0) - { - mapObject->mapobj_bit_13 = FALSE; - sprite->invisible = FALSE; - berryId = GetBerryTypeByBerryTreeId(mapObject->trainerRange_berryTreeId) - 1; - berryStage -= 1; - if (berryId >= NUM_BERRIES) - { - berryId = 0; - } - FieldObjectSetGraphicsId(mapObject, gBerryTreeFieldObjectGraphicsIdTablePointers[berryId][berryStage]); - sprite->images = gBerryTreePicTablePointers[berryId]; - sprite->oam.paletteNum = gBerryTreePaletteSlotTablePointers[berryId][berryStage]; - StartSpriteAnim(sprite, berryStage); - } -} - -const struct MapObjectGraphicsInfo *GetFieldObjectGraphicsInfo(u8 graphicsId) -{ - u8 bard; - - if (graphicsId >= SPRITE_VAR) - { - graphicsId = VarGetFieldObjectGraphicsId(graphicsId - SPRITE_VAR); - } - if (graphicsId == 0x45) - { - bard = sub_81201C8(); - return gMauvilleOldManGraphicsInfoPointers[bard]; - } - if (graphicsId >= NUM_OBJECT_GRAPHICS_INFO) - { - graphicsId = 0x05; // LittleBoy1 - } - return gFieldObjectGraphicsInfoPointers[graphicsId]; -} - -static void FieldObjectHandleDynamicGraphicsId(struct MapObject *mapObject) -{ - if (mapObject->graphicsId >= SPRITE_VAR) - { - mapObject->graphicsId = VarGetFieldObjectGraphicsId(mapObject->graphicsId - SPRITE_VAR); - } -} - -void npc_by_local_id_and_map_set_field_1_bit_x20(u8 localId, u8 mapNum, u8 mapGroup, u8 state) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - gMapObjects[mapObjectId].mapobj_bit_13 = state; - } -} - -void FieldObjectGetLocalIdAndMap(struct MapObject *mapObject, void *localId, void *mapNum, void *mapGroup) -{ - *(u8*)(localId) = mapObject->localId; - *(u8*)(mapNum) = mapObject->mapNum; - *(u8*)(mapGroup) = mapObject->mapGroup; -} - -void sub_808E75C(s16 x, s16 y) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - mapObjectId = GetFieldObjectIdByXY(x, y); - if (mapObjectId != NUM_FIELD_OBJECTS) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_808E78C(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority) -{ - u8 mapObjectId; - struct MapObject *mapObject; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - sprite = &gSprites[mapObject->spriteId]; - mapObject->mapobj_bit_26 = TRUE; - sprite->subpriority = subpriority; - } -} - -void sub_808E7E4(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - struct MapObject *mapObject; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - mapObject = &gMapObjects[mapObjectId]; - mapObject->mapobj_bit_26 = FALSE; - mapObject->mapobj_bit_2 = TRUE; - } -} - -void sub_808E82C(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - struct Sprite *sprite; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - sprite = &gSprites[gMapObjects[mapObjectId].spriteId]; - sprite->pos2.x = x; - sprite->pos2.y = y; - } -} - -void gpu_pal_allocator_reset__manage_upper_four(void) -{ - FreeAllSpritePalettes(); - gReservedSpritePaletteCount = 12; -} - -static void sub_808E894(u16 paletteTag) -{ - u16 paletteSlot; - - paletteSlot = FindFieldObjectPaletteIndexByTag(paletteTag); - if (paletteSlot != 0x11ff) // always true - { - sub_808E8F4(&gUnknown_0850BBC8[paletteSlot]); - } -} - -void sub_808E8C0(u16 *paletteTags) -{ - u8 i; - - for (i = 0; paletteTags[i] != 0x11ff; i ++) - { - sub_808E894(paletteTags[i]); - } -} - -static u8 sub_808E8F4(const struct SpritePalette *spritePalette) -{ - if (IndexOfSpritePaletteTag(spritePalette->tag) != 0xff) - { - return 0xff; - } - return LoadSpritePalette(spritePalette); -} - -void pal_patch_for_npc(u16 paletteTag, u8 paletteSlot) -{ - u16 paletteIdx; - - paletteIdx = FindFieldObjectPaletteIndexByTag(paletteTag); - LoadPalette(gUnknown_0850BBC8[paletteIdx].data, 16 * paletteSlot + 256, 0x20); -} - -void pal_patch_for_npc_range(const u16 *paletteTags, u8 minSlot, u8 maxSlot) -{ - while (minSlot < maxSlot) - { - pal_patch_for_npc(*paletteTags, minSlot); - paletteTags ++; - minSlot ++; - } -} - -static u8 FindFieldObjectPaletteIndexByTag(u16 tag) -{ - u8 i; - - for (i = 0; gUnknown_0850BBC8[i].tag != 0x11ff; i ++) - { - if (gUnknown_0850BBC8[i].tag == tag) - { - return i; - } - } - return 0xff; -} - -void npc_load_two_palettes__no_record(u16 tag, u8 slot) -{ - u8 i; - - pal_patch_for_npc(tag, slot); - for (i = 0; gUnknown_0850BD00[i].tag != 0x11ff; i ++) - { - if (gUnknown_0850BD00[i].tag == tag) - { - pal_patch_for_npc(gUnknown_0850BD00[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]); - return; - } - } -} - -void npc_load_two_palettes__and_record(u16 tag, u8 slot) -{ - u8 i; - - gUnknown_020375B6 = tag; - pal_patch_for_npc(tag, slot); - for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i ++) - { - if (gUnknown_0850BD78[i].tag == tag) - { - pal_patch_for_npc(gUnknown_0850BD78[i].data[gUnknown_020375B4], gUnknown_084975C4[slot]); - return; - } - } -} - -static void sub_808EAB0(u16 tag, u8 slot) -{ - pal_patch_for_npc(tag, slot); -} - -void unref_sub_808EAC4(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x += x; - mapObject->coords2.y += y; -} - -void npc_coords_shift(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = mapObject->coords2.x; - mapObject->coords3.y = mapObject->coords2.y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -/*static*/ void npc_coords_set(struct MapObject *mapObject, s16 x, s16 y) -{ - mapObject->coords3.x = x; - mapObject->coords3.y = y; - mapObject->coords2.x = x; - mapObject->coords2.y = y; -} - -void sub_808EB08(struct MapObject *mapObject, s16 x, s16 y) -{ - struct Sprite *sprite; - const struct MapObjectGraphicsInfo *graphicsInfo; - - sprite = &gSprites[mapObject->spriteId]; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - npc_coords_set(mapObject, x, y); - sub_8093038(mapObject->coords2.x, mapObject->coords2.y, &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; - sub_808E38C(mapObject); - if (mapObject->mapobj_bit_15) - { - CameraObjectReset1(); - } -} - -void sub_808EBA8(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - x += 7; - y += 7; - sub_808EB08(&gMapObjects[mapObjectId], x, y); - } -} - -void npc_coords_shift_still(struct MapObject *mapObject) -{ - npc_coords_shift(mapObject, mapObject->coords2.x, mapObject->coords2.y); -} - -void UpdateFieldObjectCoordsForCameraUpdate(void) -{ - u8 i; - s16 dx; - s16 dy; - - if (gCamera.active) - { - dx = gCamera.x; - dy = gCamera.y; - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (gMapObjects[i].active) - { - gMapObjects[i].coords1.x -= dx; - gMapObjects[i].coords1.y -= dy; - gMapObjects[i].coords2.x -= dx; - gMapObjects[i].coords2.y -= dy; - gMapObjects[i].coords3.x -= dx; - gMapObjects[i].coords3.y -= dy; - } - } - } -} - -u8 GetFieldObjectIdByXYZ(u16 x, u16 y, u8 z) -{ - u8 i; - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - if (gMapObjects[i].active) - { - if (gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y && FieldObjectDoesZCoordMatch(&gMapObjects[i], z)) - { - return i; - } - } - } - return NUM_FIELD_OBJECTS; -} - -static bool8 FieldObjectDoesZCoordMatch(struct MapObject *mapObject, u8 z) -{ - if (mapObject->mapobj_unk_0B_0 != 0 && z != 0 && mapObject->mapobj_unk_0B_0 != z) - { - return FALSE; - } - return TRUE; -} - -void UpdateFieldObjectsForCameraUpdate(s16 x, s16 y) -{ - UpdateFieldObjectCoordsForCameraUpdate(); - SpawnFieldObjectsInView(x, y); - RemoveFieldObjectsOutsideView(); -} - -u8 AddCameraObject(u8 linkedSpriteId) -{ - u8 spriteId; - - spriteId = CreateSprite(&gUnknown_084975D4, 0, 0, 4); - gSprites[spriteId].invisible = TRUE; - gSprites[spriteId].data[0] = linkedSpriteId; - return spriteId; -} - -void ObjectCB_CameraObject(struct Sprite *sprite) -{ - void (*callbacks[ARRAY_COUNT(gUnknown_084975EC)])(struct Sprite *); - - memcpy(callbacks, gUnknown_084975EC, sizeof gUnknown_084975EC); - callbacks[sprite->data[1]](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->invisible = TRUE; - sprite->data[1] = 1; - CameraObject_1(sprite); -} - -/*static*/ void CameraObject_1(struct Sprite *sprite) -{ - s16 x; - s16 y; - - y = gSprites[sprite->data[0]].pos1.y; - x = gSprites[sprite->data[0]].pos1.x; - sprite->data[2] = x - sprite->pos1.x; - sprite->data[3] = y - sprite->pos1.y; - sprite->pos1.x = x; - sprite->pos1.y = y; -} - -/*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->data[2] = 0; - sprite->data[3] = 0; -} - -static struct Sprite *FindCameraObject(void) -{ - u8 spriteId; - - for (spriteId = 0; spriteId < MAX_SPRITES; spriteId ++) - { - if (gSprites[spriteId].inUse && gSprites[spriteId].callback == ObjectCB_CameraObject) - { - return &gSprites[spriteId]; - } - } - return NULL; -} - -void CameraObjectReset1(void) -{ - struct Sprite *cameraObject; - - cameraObject = FindCameraObject(); - if (cameraObject != NULL) - { - cameraObject->data[1] = 0; - cameraObject->callback(cameraObject); - } -} - -void CameraObjectSetFollowedObjectId(u8 objectId) -{ - struct Sprite *cameraObject; - - cameraObject = FindCameraObject(); - if (cameraObject != NULL) - { - cameraObject->data[0] = objectId; - CameraObjectReset1(); - } -} - -u8 CameraObjectGetFollowedObjectId(void) -{ - struct Sprite *cameraObject; - - cameraObject = FindCameraObject(); - if (cameraObject == NULL) - { - return MAX_SPRITES; - } - return cameraObject->data[0]; -} - -void CameraObjectReset2(void) -{ - FindCameraObject()->data[1] = 2; -} - -u8 CopySprite(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) -{ - u8 i; - - for (i = 0; i < MAX_SPRITES; i ++) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *sprite; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - break; - } - } - return i; -} - -u8 obj_unfreeze(struct Sprite *sprite, s16 x, s16 y, u8 subpriority) -{ - s16 i; - - for (i = MAX_SPRITES - 1; i > -1; i --) - { - if (!gSprites[i].inUse) - { - gSprites[i] = *sprite; - gSprites[i].pos1.x = x; - gSprites[i].pos1.y = y; - gSprites[i].subpriority = subpriority; - return i; - } - } - return MAX_SPRITES; -} - -void FieldObjectSetDirection(struct MapObject *mapObject, u8 direction) -{ - s8 d2; - mapObject->mapobj_unk_20 = mapObject->mapobj_unk_18; - if (!mapObject->mapobj_bit_9) - { - d2 = direction; - mapObject->mapobj_unk_18 = d2; - } - mapObject->placeholder18 = direction; -} - -static const u8 *GetFieldObjectScriptPointerByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - return GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->script; -} - -const u8 *GetFieldObjectScriptPointerByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectScriptPointerByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -static u16 GetFieldObjectFlagIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - return GetFieldObjectTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->flagId; -} - -u16 GetFieldObjectFlagIdByFieldObjectId(u8 mapObjectId) -{ - return GetFieldObjectFlagIdByLocalIdAndMap(gMapObjects[mapObjectId].localId, gMapObjects[mapObjectId].mapNum, gMapObjects[mapObjectId].mapGroup); -} - -u8 sub_808F080(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - return 0xFF; - } - return gMapObjects[mapObjectId].trainerType; -} - -u8 sub_808F0BC(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerType; -} - -u8 sub_808F0D4(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - return 0xFF; - } - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -u8 FieldObjectGetBerryTreeId(u8 mapObjectId) -{ - return gMapObjects[mapObjectId].trainerRange_berryTreeId; -} - -struct MapObjectTemplate *GetFieldObjectTemplateByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) -{ - struct MapObjectTemplate *templates; - const struct MapHeader *mapHeader; - u8 count; - - if (gSaveBlock1Ptr->location.mapNum == mapNum && gSaveBlock1Ptr->location.mapGroup == mapGroup) - { - templates = gSaveBlock1Ptr->mapObjectTemplates; - count = gMapHeader.events->mapObjectCount; - } - else - { - mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - templates = mapHeader->events->mapObjects; - count = mapHeader->events->mapObjectCount; - } - return FindFieldObjectTemplateInArrayByLocalId(localId, templates, count); -} - -struct MapObjectTemplate *FindFieldObjectTemplateInArrayByLocalId(u8 localId, struct MapObjectTemplate *templates, u8 count) -{ - u8 i; - - for (i = 0; i < count; i ++) - { - if (templates[i].localId == localId) - { - return &templates[i]; - } - } - return NULL; -} - -struct MapObjectTemplate *sub_808F1B4(const struct MapObject *mapObject) -{ - int i; - - if (mapObject->mapNum != gSaveBlock1Ptr->location.mapNum || mapObject->mapGroup != gSaveBlock1Ptr->location.mapGroup) - { - return NULL; - } - for (i = 0; i < 64; i ++) // Using ARRAY_COUNT here results in the wrong conditional branch instruction (bls instead of ble) - { - if (mapObject->localId == gSaveBlock1Ptr->mapObjectTemplates[i].localId) - { - return &gSaveBlock1Ptr->mapObjectTemplates[i]; - } - } - return NULL; -} - -void sub_808F208(const struct MapObject *mapObject) -{ - struct MapObjectTemplate *mapObjectTemplate; - - mapObjectTemplate = sub_808F1B4(mapObject); - if (mapObjectTemplate != NULL) - { - mapObjectTemplate->x = mapObject->coords2.x - 7; - mapObjectTemplate->y = mapObject->coords2.y - 7; - } -} - -void sub_808F228(const struct MapObject *mapObject, const u8 *script) -{ - struct MapObjectTemplate *mapObjectTemplate; - - mapObjectTemplate = sub_808F1B4(mapObject); - if (mapObjectTemplate != NULL) - { - mapObjectTemplate->script = script; - } -} - -void sub_808F23C(const struct MapObject *mapObject, u8 movementType) -{ - struct MapObjectTemplate *mapObjectTemplate; - - mapObjectTemplate = sub_808F1B4(mapObject); - if (mapObjectTemplate != NULL) - { - mapObjectTemplate->movementType = movementType; - } -} - -void sub_808F254(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - sub_808F208(&gMapObjects[mapObjectId]); - } -} - -void sub_808F28C(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - switch (decorCat) - { - case DECORCAT_DOLL: - sub_808F228(&gMapObjects[mapObjectId], EventScript_2766A2); - break; - case DECORCAT_CUSHION: - sub_808F228(&gMapObjects[mapObjectId], EventScript_2766A6); - break; - } - } -} - -void npc_paltag_set_load(u8 palSlot) -{ - gpu_pal_allocator_reset__manage_upper_four(); - gUnknown_020375B6 = 0x11ff; - gUnknown_020375B4 = palSlot; - if (palSlot == 1) - { - pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 6); - gReservedSpritePaletteCount = 8; - } - else - { - pal_patch_for_npc_range(gUnknown_0850BE38[gUnknown_020375B4], 0, 10); - } -} - -u16 npc_paltag_by_palslot(u8 palSlot) -{ - u8 i; - - if (palSlot < 10) - { - return gUnknown_0850BE38[gUnknown_020375B4][palSlot]; - } - for (i = 0; gUnknown_0850BD78[i].tag != 0x11ff; i ++) - { - if (gUnknown_0850BD78[i].tag == gUnknown_020375B6) - { - return gUnknown_0850BD78[i].data[gUnknown_020375B4]; - } - } - return 0x11ff; -} - -// Map Object Step Callbacks -// file boundary? - -null_object_step(NoMovement1, FALSE) - -field_object_step(GoRandomDirections, gUnknown_0850D6F4) - -bool8 sub_808F44C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_808F460(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_808F48C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!FieldObjectExecRegularAnim(mapObject, sprite)) - { - return FALSE; - } - SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - sprite->data[1] = 3; - return TRUE; -} - -bool8 sub_808F4C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_808F4E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - u8 chosenDirection; - - memcpy(directions, gUnknown_0850D710, sizeof directions); - chosenDirection = directions[Random() & 0x03]; - FieldObjectSetDirection(mapObject, chosenDirection); - sprite->data[1] = 5; - if (npc_block_way__next_tile(mapObject, chosenDirection)) - { - sprite->data[1] = 1; - } - return TRUE; -} - -bool8 sub_808F534(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 6; - return TRUE; -} - -bool8 sub_808F564(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 1; - } - return FALSE; -} - -bool8 FieldObjectIsTrainerAndCloseToPlayer(struct MapObject *mapObject) -{ - s16 playerX; - s16 playerY; - s16 objX; - s16 objY; - s16 minX; - s16 maxX; - s16 minY; - s16 maxY; - - if (!TestPlayerAvatarFlags(0x80)) - { - return FALSE; - } - if (mapObject->trainerType != 1 && mapObject->trainerType != 3) - { - return FALSE; - } - PlayerGetDestCoords(&playerX, &playerY); - objX = mapObject->coords2.x; - objY = mapObject->coords2.y; - minX = objX - mapObject->trainerRange_berryTreeId; - minY = objY - mapObject->trainerRange_berryTreeId; - maxX = objX + mapObject->trainerRange_berryTreeId; - maxY = objY + mapObject->trainerRange_berryTreeId; - if (minX > playerX || maxX < playerX || minY > playerY || maxY < playerY) - { - return FALSE; - } - return TRUE; -} - -u8 GetRegularRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - if (absdx > absdy) - { - direction = DIR_EAST; - if (dx < 0) - { - direction = DIR_WEST; - } - } - else - { - direction = DIR_SOUTH; - if (dy < 0) - { - direction = DIR_NORTH; - } - } - return direction; -} - -u8 GetNorthSouthRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = DIR_SOUTH; - if (dy < 0) - { - direction = DIR_NORTH; - } - return direction; -} - -u8 GetEastWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = DIR_EAST; - if (dx < 0) - { - direction = DIR_WEST; - } - return direction; -} - -u8 GetNorthEastRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_EAST) - { - direction = DIR_NORTH; - } - } - else if (direction == DIR_EAST) - { - direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = DIR_NORTH; - } - } - return direction; -} - -u8 GetNorthWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_WEST) - { - direction = DIR_NORTH; - } - } - else if (direction == DIR_WEST) - { - direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = DIR_NORTH; - } - } - return direction; -} - -u8 GetSouthEastRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_EAST) - { - direction = DIR_SOUTH; - } - } - else if (direction == DIR_EAST) - { - direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = DIR_SOUTH; - } - } - return direction; -} - -u8 GetSouthWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_WEST) - { - direction = DIR_SOUTH; - } - } - else if (direction == DIR_WEST) - { - direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = DIR_SOUTH; - } - } - return direction; -} - -u8 GetNonEastRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_EAST) - { - direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy); - } - return direction; -} - -u8 GetNonWestRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_WEST) - { - direction = GetNorthSouthRunningPastFacingDirection(dx, dy, absdx, absdy); - } - return direction; -} - -u8 GetNonSouthRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_SOUTH) - { - direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy); - } - return direction; -} - -u8 GetNonNorthRunningPastFacingDirection(s16 dx, s16 dy, s16 absdx, s16 absdy) -{ - u8 direction; - - direction = GetRegularRunningPastFacingDirection(dx, dy, absdx, absdy); - if (direction == DIR_NORTH) - { - direction = GetEastWestRunningPastFacingDirection(dx, dy, absdx, absdy); - } - return direction; -} - -u8 GetRunningPastFacingDirection(struct MapObject *mapObject, u8 movementType) -{ - s16 dx; - s16 dy; - s16 absdx; - s16 absdy; - - if (!FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - return 0; - } - PlayerGetDestCoords(&dx, &dy); - dx -= mapObject->coords2.x; - dy -= mapObject->coords2.y; - absdx = dx; - absdy = dy; - if (absdx < 0) - { - absdx = -absdx; - } - if (absdy < 0) - { - absdy = -absdy; - } - return gUnknown_0850D714[movementType](dx, dy, absdx, absdy); -} - -field_object_step(LookRandomDirections, gUnknown_0850D740) - -bool8 sub_808F988(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_808F99C(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_808F9C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_808FA0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_808FA3C(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - u8 direction; - - memcpy(directions, gUnknown_0850D710, sizeof directions); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_ANY); - if (direction == 0) - { - direction = directions[Random() & 0x03]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyGoNorthOrSouth, gUnknown_0850D754) - -bool8 sub_808FAC8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_808FADC(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_808FB08(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!FieldObjectExecRegularAnim(mapObject, sprite)) - { - return FALSE; - } - SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - sprite->data[1] = 3; - return TRUE; -} - -bool8 sub_808FB44(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_808FB64(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D770, sizeof directions); - direction = directions[Random() & 0x01]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (npc_block_way__next_tile(mapObject, direction)) - { - sprite->data[1] = 1; - } - return TRUE; -} - -bool8 sub_808FBB0(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 6; - return TRUE; -} - -bool8 sub_808FBE0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 1; - } - return FALSE; -} - -field_object_step(RandomlyGoEastOrWest, gUnknown_0850D774) - -bool8 sub_808FC4C(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_808FC60(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_808FC8C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (!FieldObjectExecRegularAnim(mapObject, sprite)) - { - return FALSE; - } - SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - sprite->data[1] = 3; - return TRUE; -} - -bool8 sub_808FCC8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_808FCE8(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D790, sizeof directions); - direction = directions[Random() & 0x01]; - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 5; - if (npc_block_way__next_tile(mapObject, direction)) - { - sprite->data[1] = 1; - } - return TRUE; -} - -bool8 sub_808FD34(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(mapObject->placeholder18)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 6; - return TRUE; -} - -bool8 sub_808FD64(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 1; - } - return FALSE; -} - -field_object_step(FaceFixedDirection, gUnknown_0850D794) - -bool8 sub_808FDD0(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_808FDFC(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_808FE1C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = FALSE; - return FALSE; -} - -static bool8 FieldObjectCB2_BerryTree(struct MapObject *mapObject, struct Sprite *sprite); -extern bool8 (*const gUnknown_0850D7A0[])(struct MapObject *mapObject, struct Sprite *sprite); -void FieldObjectCB_BerryTree(struct Sprite *sprite) -{ - struct MapObject *mapObject; - - mapObject = &gMapObjects[sprite->data[0]]; - if (!(sprite->data[7] & 0x0001)) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[7] |= 0x0001; - } - FieldObjectStep(mapObject, sprite, FieldObjectCB2_BerryTree); -} -static bool8 FieldObjectCB2_BerryTree(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_0850D7A0[sprite->data[1]](mapObject, sprite); -} - -bool8 do_berry_tree_growth_sparkle_1 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 berryStage; - - npc_reset(mapObject, sprite); - mapObject->mapobj_bit_13 = TRUE; - sprite->invisible = TRUE; - berryStage = GetStageByBerryTreeId(mapObject->trainerRange_berryTreeId); - if (berryStage == 0) - { - if (!(sprite->data[7] & 0x0004) && sprite->animNum == 4) - { - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - sprite->animNum = berryStage; - } - return FALSE; - } - mapObject->mapobj_bit_13 = FALSE; - sprite->invisible = FALSE; - berryStage --; - if (sprite->animNum != berryStage) - { - sprite->data[1] = 2; - return TRUE; - } - get_berry_tree_graphics(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, 0x39); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_808FF48 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - return TRUE; - } - return FALSE; -} - -bool8 do_berry_tree_growth_sparkle_2 (struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 3; - sprite->data[2] = 0; - sprite->data[7] |= 0x0002; - gFieldEffectArguments[0] = mapObject->coords2.x; - gFieldEffectArguments[1] = mapObject->coords2.y; - gFieldEffectArguments[2] = sprite->subpriority - 1; - gFieldEffectArguments[3] = sprite->oam.priority; - FieldEffectStart(FLDEFF_BERRY_TREE_GROWTH_SPARKLE); - return TRUE; -} - -bool8 sub_808FFB4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2] ++; - mapObject->mapobj_bit_13 = (sprite->data[2] & 0x02) >> 1; - sprite->animPaused = TRUE; - if (sprite->data[2] > 64) - { - get_berry_tree_graphics(mapObject, sprite); - sprite->data[1] = 4; - sprite->data[2] = 0; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090004 (struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->data[2] ++; - mapObject->mapobj_bit_13 = (sprite->data[2] & 0x02) >> 1; - sprite->animPaused = TRUE; - if (sprite->data[2] > 64) - { - sprite->data[1] = 0; - sprite->data[7] &= ~0x0002; - return TRUE; - } - return FALSE; -} - -field_object_step(RandomlyLookNorthOrSouth, gUnknown_0850D7B4) - -bool8 sub_8090094 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_80900A8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_80900D4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090118 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090148 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D770, sizeof gUnknown_0850D770); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_SOUTH); - if (direction == 0) - { - direction = directions[Random() & 0x01]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookEastOrWest, gUnknown_0850D7C8) - -bool8 sub_80901D4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_80901E8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090214 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6DC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090258 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090288 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D790, sizeof gUnknown_0850D790); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_EAST_WEST); - if (direction == 0) - { - direction = directions[Random() & 0x01]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookNorthOrWest, gUnknown_0850D7DC) - -bool8 sub_8090314 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090328 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090354 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090398 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_80903C8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D7F0, sizeof gUnknown_0850D7F0); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_WEST); - if (direction == 0) - { - direction = directions[Random() & 0x01]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookNorthOrEast, gUnknown_0850D7F4) - -bool8 sub_8090454 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090468 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090494 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_80904D8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090508 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D808, sizeof gUnknown_0850D808); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_EAST); - if (direction == 0) - { - direction = directions[Random() & 0x01]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookSouthOrWest, gUnknown_0850D80C) - -bool8 sub_8090594 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_80905A8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_80905D4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090618 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090648 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D820, sizeof gUnknown_0850D820); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_SOUTH_WEST); - if (direction == 0) - { - direction = directions[Random() & 0x01]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookSouthOrEast, gUnknown_0850D824) - -bool8 sub_80906D4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_80906E8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090714 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090758 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090788 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[2]; - u8 direction; - - memcpy(directions, gUnknown_0850D838, sizeof gUnknown_0850D838); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_SOUTH_EAST); - if (direction == 0) - { - direction = directions[Random() & 0x01]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookNorthOrSouthOrWest, gUnknown_0850D83C) - -bool8 sub_8090814 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090828 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090854 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090898 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_80908C8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - u8 direction; - - memcpy(directions, gUnknown_0850D850, sizeof gUnknown_0850D850); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_SOUTH_WEST); - if (direction == 0) - { - direction = directions[Random() & 0x03]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookNorthOrSouthOrEast, gUnknown_0850D854) - -bool8 sub_8090954 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090968 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090994 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_80909D8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090A08 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - u8 direction; - - memcpy(directions, gUnknown_0850D868, sizeof gUnknown_0850D868); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_SOUTH_EAST); - if (direction == 0) - { - direction = directions[Random() & 0x03]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookNorthOrEastOrWest, gUnknown_0850D86C) - -bool8 sub_8090A94 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090AA8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090AD4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090B18 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090B48 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - u8 direction; - - memcpy(directions, gUnknown_0850D880, sizeof gUnknown_0850D880); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_NORTH_EAST_WEST); - if (direction == 0) - { - direction = directions[Random() & 0x03]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(RandomlyLookSouthOrEastOrWest, gUnknown_0850D884) - -bool8 sub_8090BD4 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090BE8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090C14 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, gUnknown_0850D6EC[Random() & 0x03]); - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090C58 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 4; - return TRUE; - } - return FALSE; -} - -bool8 sub_8090C88 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[4]; - u8 direction; - - memcpy(directions, gUnknown_0850D898, sizeof gUnknown_0850D898); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_SOUTH_EAST_WEST); - if (direction == 0) - { - direction = directions[Random() & 0x03]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(LookAroundCounterclockwise, gUnknown_0850D89C) - -bool8 sub_8090D14 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090D40 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, 48); - sprite->data[1] = 2; - } - return FALSE; -} - -bool8 sub_8090D64 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090D90 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[5]; - u8 direction; - - memcpy(directions, gUnknown_0850D8AC, sizeof gUnknown_0850D8AC); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_ANY); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return TRUE; -} - -field_object_step(LookAroundClockwise, gUnknown_0850D8B4) - -bool8 sub_8090E18 (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090E44 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - SetFieldObjectStepTimer(sprite, 48); - sprite->data[1] = 2; - } - return FALSE; -} - -bool8 sub_8090E68 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (RunFieldObjectStepTimer(sprite) || FieldObjectIsTrainerAndCloseToPlayer(mapObject)) - { - sprite->data[1] = 3; - } - return FALSE; -} - -bool8 sub_8090E94 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 directions[5]; - u8 direction; - - memcpy(directions, gUnknown_0850D8C4, sizeof gUnknown_0850D8C4); - direction = GetRunningPastFacingDirection(mapObject, RUNFOLLOW_ANY); - if (direction == 0) - { - direction = directions[mapObject->mapobj_unk_18]; - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 0; - return TRUE; -} - -field_object_step(AlternatelyGoInOppositeDirections, gUnknown_0850D8CC) - -bool8 sub_8090F1C (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8090F30 (struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 direction; - - direction = gUnknown_085055CD[mapObject->animPattern]; - if (mapObject->mapobj_unk_21) - { - direction = GetOppositeDirection(direction); - } - FieldObjectSetDirection(mapObject, direction); - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8090F68 (struct MapObject *mapObject, struct Sprite *sprite) -{ - bool8 blockingWay; - u8 animId; - - if (mapObject->mapobj_unk_21 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - } - blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18); - animId = GetGoSpeed0AnimId(mapObject->placeholder18); - if (blockingWay == TRUE) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - animId = GetGoSpeed0AnimId(mapObject->placeholder18); - blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18); - } - if (blockingWay) - { - animId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, animId); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 3; - return TRUE; -} - -bool8 sub_8091020 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 1; - } - return FALSE; -} - -bool8 sub_8091048(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - sprite->data[1] = 1; - return TRUE; -} - -bool8 MoveFieldObjectInNextDirectionInSequence(struct MapObject *mapObject, struct Sprite *sprite, u8 *route) -{ - u8 blockingWay; - u8 animId; - - if (mapObject->mapobj_unk_21 == 3 && mapObject->coords1.x == mapObject->coords2.x && mapObject->coords1.y == mapObject->coords2.y) - { - mapObject->mapobj_unk_21 = 0; - } - FieldObjectSetDirection(mapObject, route[mapObject->mapobj_unk_21]); - animId = GetGoSpeed0AnimId(mapObject->placeholder18); - blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18); - if (blockingWay == TRUE) - { - mapObject->mapobj_unk_21 ++; - FieldObjectSetDirection(mapObject, route[mapObject->mapobj_unk_21]); - animId = GetGoSpeed0AnimId(mapObject->placeholder18); - blockingWay = npc_block_way__next_tile(mapObject, mapObject->placeholder18); - } - if (blockingWay) - { - animId = GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18); - } - FieldObjectSetRegularAnim(mapObject, sprite, animId); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8091110(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 1; - } - return FALSE; -} - -field_object_path( 1, gUnknown_0850D8DC, sub_809117C, gUnknown_0850D8E8, 2, x) -field_object_path( 2, gUnknown_0850D8EC, sub_8091208, gUnknown_0850D8F8, 1, x) -field_object_path( 3, gUnknown_0850D8FC, sub_8091294, gUnknown_0850D908, 1, y) -field_object_path( 4, gUnknown_0850D90C, sub_8091320, gUnknown_0850D918, 2, y) -field_object_path( 5, gUnknown_0850D91C, sub_80913AC, gUnknown_0850D928, 2, x) -field_object_path( 6, gUnknown_0850D92C, sub_8091438, gUnknown_0850D938, 1, x) -field_object_path( 7, gUnknown_0850D93C, sub_80914C4, gUnknown_0850D710, 1, y) -field_object_path( 8, gUnknown_0850D948, sub_8091550, gUnknown_0850D954, 2, y) -field_object_path( 9, gUnknown_0850D958, sub_80915DC, gUnknown_0850D964, 2, y) -field_object_path(10, gUnknown_0850D968, sub_8091668, gUnknown_0850D974, 1, y) -field_object_path(11, gUnknown_0850D978, sub_80916F4, gUnknown_0850D984, 1, x) -field_object_path(12, gUnknown_0850D988, sub_8091780, gUnknown_0850D994, 2, x) -field_object_path(13, gUnknown_0850D998, sub_809180C, gUnknown_0850D9A4, 2, y) -field_object_path(14, gUnknown_0850D9A8, sub_8091898, gUnknown_0850D9B4, 1, y) -field_object_path(15, gUnknown_0850D9B8, sub_8091924, gUnknown_0850D9C4, 1, x) -field_object_path(16, gUnknown_0850D9C8, sub_80919B0, gUnknown_0850D9D4, 2, x) -field_object_path(17, gUnknown_0850D9D8, sub_8091A3C, gUnknown_0850D9E4, 2, y) -field_object_path(18, gUnknown_0850D9E8, sub_8091AC8, gUnknown_0850D9F4, 2, y) -field_object_path(19, gUnknown_0850D9F8, sub_8091B54, gUnknown_0850DA04, 2, x) -field_object_path(20, gUnknown_0850DA08, sub_8091BE0, gUnknown_0850DA14, 2, x) -field_object_path(21, gUnknown_0850DA18, sub_8091C6C, gUnknown_0850DA24, 2, y) -field_object_path(22, gUnknown_0850DA28, sub_8091CF8, gUnknown_0850DA34, 2, y) -field_object_path(23, gUnknown_0850DA38, sub_8091D84, gUnknown_0850DA44, 2, x) -field_object_path(24, gUnknown_0850DA48, sub_8091E10, gUnknown_0850DA54, 2, x) - -field_object_step(CopyPlayer1, gUnknown_0850DA58) - -bool8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - if (mapObject->mapobj_unk_21 == 0) - { - mapObject->mapobj_unk_21 = player_get_direction_lower_nybble(); - } - sprite->data[1] = 1; - return TRUE; -} - -bool8 sub_8091EC0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == 2) - { - return FALSE; - } - return gUnknown_0850DA64[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), NULL); -} - -bool8 sub_8091F20(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - mapObject->mapobj_bit_1 = FALSE; - sprite->data[1] = 1; - } - return FALSE; -} - -bool8 sub_8091F48(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - return FALSE; -} - -bool8 sub_8091F4C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, playerDirection))); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8091F94(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - if (FieldObjectIsFarawayIslandMew(mapObject)) - { - direction = sub_81D427C(); - if (direction == 0) - { - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; - } - } - else - { - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - } - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_80920A4(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed1AnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_809215C(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed3AnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8092214(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_8093438(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectSetRegularAnim(mapObject, sprite, sub_80934BC(direction)); - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 sub_8092314(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - FieldObjectMoveDestCoords(mapObject, direction, &x, &y); - FieldObjectSetRegularAnim(mapObject, sprite, sub_8093514(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) -{ - u32 direction; - s16 x; - s16 y; - - direction = playerDirection; - direction = state_to_direction(gUnknown_085055CD[mapObject->animPattern], mapObject->mapobj_unk_21, direction); - x = mapObject->coords2.x; - y = mapObject->coords2.y; - sub_8092F88(direction, &x, &y, 2, 2); - FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); - if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) - { - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); - } - mapObject->mapobj_bit_1 = TRUE; - sprite->data[1] = 2; - return TRUE; -} - -field_object_step(CopyPlayer2, gUnknown_0850DA90) - -bool8 mss_08062EA4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.tileTransitionState == 2) - { - return FALSE; - } - return gUnknown_0850DA64[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), MetatileBehavior_IsPokeGrass); -} - -bool8 sub_80925AC(struct MapObject *, struct Sprite *); - -void FieldObjectCB_TreeDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7])) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_TREE_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, sub_80925AC); -} - -bool8 sub_80925AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return FALSE; -} - -void FieldObjectCB_MountainDisguise(struct Sprite *sprite) -{ - struct MapObject *mapObject; - - mapObject = &gMapObjects[sprite->data[0]]; - if (mapObject->mapobj_unk_21 == 0 || (mapObject->mapobj_unk_21 == 1 && !sprite->data[7])) - { - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_MOUNTAIN_DISGUISE); - mapObject->mapobj_unk_21 = 1; - sprite->data[7] ++; - } - FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, sub_80925AC); -} - -extern bool8 (*const gUnknown_0850DA9C[])(struct MapObject *, struct Sprite *); -bool8 sub_809268C(struct MapObject *, struct Sprite *); - -void FieldObjectCB_Hidden1(struct Sprite *sprite) -{ - if (!sprite->data[7]) - { - gMapObjects[sprite->data[0]].mapobj_bit_26 = TRUE; - sprite->subspriteMode = 2; - sprite->oam.priority = 3; - sprite->data[7] ++; - } - FieldObjectStep(&gMapObjects[sprite->data[0]], sprite, sub_809268C); -} - -bool8 sub_809268C(struct MapObject *mapObject, struct Sprite *sprite) -{ - return gUnknown_0850DA9C[sprite->data[1]](mapObject, sprite); -} - -bool8 sub_80926AC (struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - return FALSE; -} -bool8 sub_80926B8 (struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 0; - } - return FALSE; -} - -field_object_step(WalkInPlace1, gUnknown_0850DAA0) - -bool8 sub_8092718(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay16AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(WalkInPlace4, gUnknown_0850DAA8) - -bool8 sub_8092788(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay32AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(WalkInPlace2, gUnknown_0850DAB0) - -bool8 sub_80927F8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay8AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(WalkInPlace3, gUnknown_0850DAB8) - -bool8 sub_8092868(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); - sprite->data[1] = 1; - return TRUE; -} - -field_object_step(Hidden2, gUnknown_0850DAC0) - -bool8 sub_80928D8(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_reset(mapObject, sprite); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(mapObject->mapobj_unk_18)); - mapObject->mapobj_bit_13 = TRUE; - sprite->data[1] = 1; - return TRUE; -} -bool8 sub_809290C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (FieldObjectExecRegularAnim(mapObject, sprite)) - { - sprite->data[1] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_809292C(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = FALSE; - return FALSE; -} - -void npc_reset(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_1 = FALSE; - mapObject->mapobj_bit_6 = FALSE; - mapObject->mapobj_bit_7 = FALSE; - mapObject->mapobj_unk_1C = 0xFF; - sprite->data[1] = 0; -} - -#define dirn2anim(name, table)\ -extern const u8 table[4];\ -u8 name(u8 direction)\ -{\ - return table[direction];\ -} - -dirn2anim(FieldObjectDirectionToImageAnimId, gUnknown_0850DACC) -dirn2anim(get_go_image_anim_num, gUnknown_0850DAD5) -dirn2anim(get_go_fast_image_anim_num, gUnknown_0850DADE) -dirn2anim(get_go_faster_image_anim_num, gUnknown_0850DAE7) -dirn2anim(get_go_fastest_image_anim_num, gUnknown_0850DAF0) -dirn2anim(sub_80929AC, gUnknown_0850DAF9) -dirn2anim(sub_80929BC, gUnknown_0850DB02) -dirn2anim(sub_80929CC, gUnknown_0850DB0B) -dirn2anim(sub_80929DC, gUnknown_0850DB14) -dirn2anim(sub_80929EC, gUnknown_0850DB1D) -dirn2anim(sub_80929FC, gUnknown_0850DB26) -dirn2anim(sub_8092A0C, gUnknown_0850DB2F) -dirn2anim(sub_8092A1C, gUnknown_0850DB38) -dirn2anim(sub_8092A2C, gUnknown_0850DB41) -dirn2anim(get_run_image_anim_num, gUnknown_0850DB4A) - -// file boundary? - -struct UnkStruct_085094AC { - const union AnimCmd *const *anims; - u8 animPos[4]; -}; - -extern const struct UnkStruct_085094AC gUnknown_085094AC[]; - -static const struct UnkStruct_085094AC *sub_8092A4C(const union AnimCmd *const *anims) -{ - const struct UnkStruct_085094AC *retval; - - for (retval = gUnknown_085094AC; retval->anims != NULL; retval ++) - { - if (retval->anims == anims) - { - return retval; - } - } - return NULL; -} - -void npc_apply_anim_looping(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - const struct UnkStruct_085094AC *unk85094AC; - - if (!mapObject->mapobj_bit_12) - { - sprite->animNum = animNum; - unk85094AC = sub_8092A4C(sprite->anims); - if (unk85094AC != NULL) - { - if (sprite->animCmdIndex == unk85094AC->animPos[0]) - { - sprite->animCmdIndex = unk85094AC->animPos[3]; - } - else if (sprite->animCmdIndex == unk85094AC->animPos[1]) - { - sprite->animCmdIndex = unk85094AC->animPos[2]; - } - } - SeekSpriteAnim(sprite, sprite->animCmdIndex); - } -} - -void obj_npc_animation_step(struct MapObject *mapObject, struct Sprite *sprite, u8 animNum) -{ - const struct UnkStruct_085094AC *unk85094AC; - - if (!mapObject->mapobj_bit_12) - { - u8 animPos; - - sprite->animNum = animNum; - unk85094AC = sub_8092A4C(sprite->anims); - if (unk85094AC != NULL) - { - animPos = unk85094AC->animPos[1]; - if (sprite->animCmdIndex <= unk85094AC->animPos[0]) - { - animPos = unk85094AC->animPos[0]; - } - SeekSpriteAnim(sprite, animPos); - } - } -} - -// file boundary? - -u8 sub_8092AF8(s16 x1, s16 y1, s16 x2, s16 y2) -{ - if (x1 > x2) - { - return DIR_WEST; - } - if (x1 < x2) - { - return DIR_EAST; - } - if (y1 > y2) - { - return DIR_NORTH; - } - return DIR_SOUTH; -} - -void npc_set_running_behaviour_etc(struct MapObject *mapObject, u8 animPattern) -{ - mapObject->animPattern = animPattern; - mapObject->mapobj_unk_21 = 0; - mapObject->animId = 0; - gSprites[mapObject->spriteId].callback = gUnknown_08505438[animPattern]; - gSprites[mapObject->spriteId].data[1] = 0; -} - -dirn2anim(npc_running_behaviour_by_direction, gUnknown_0850DB53) - -u8 npc_block_way__next_tile(struct MapObject *mapObject, u8 direction) -{ - s16 x; - s16 y; - - x = mapObject->coords2.x; - y = mapObject->coords2.y; - MoveCoords(direction, &x, &y); - return npc_block_way(mapObject, x, y, direction); -} - -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) -{ - u8 direction; - - direction = dirn; - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - { - return 1; - } - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) - { - return 2; - } - if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)) - { - return 2; - } - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - { - return 3; - } - if (CheckForCollisionBetweenFieldObjects(mapObject, x, y)) - { - return 4; - } - return 0; -} - -u8 sub_8092C8C(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - u8 retval; - - retval = 0x00; - if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y)) - { - retval |= 1; - } - if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))) - { - retval |= 2; - } - if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y)) - { - retval |= 4; - } - if (CheckForCollisionBetweenFieldObjects(mapObject, x, y)) - { - retval |= 8; - } - return retval; -} - -static bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y) -{ - s16 left; - s16 right; - s16 top; - s16 bottom; - - if (mapObject->range.as_nybbles.x != 0) - { - left = mapObject->coords1.x - mapObject->range.as_nybbles.x; - right = mapObject->coords1.x + mapObject->range.as_nybbles.x; - if (left > x || right < x) - { - return TRUE; - } - } - if (mapObject->range.as_nybbles.y != 0) - { - top = mapObject->coords1.y - mapObject->range.as_nybbles.y; - bottom = mapObject->coords1.y + mapObject->range.as_nybbles.y; - if (top > y || bottom < y) - { - return TRUE; - } - } - return FALSE; -} - -static bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction) -{ - if (gUnknown_0850DB5C[direction - 1](mapObject->mapobj_unk_1E) || gUnknown_0850DB6C[direction - 1](MapGridGetMetatileBehaviorAt(x, y))) - { - return TRUE; - } - return FALSE; -} - -static bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y) -{ - u8 i; - struct MapObject *curObject; - - for (i = 0; i < NUM_FIELD_OBJECTS; i ++) - { - curObject = &gMapObjects[i]; - if (curObject->active && curObject != mapObject) - { - if ((curObject->coords2.x == x && curObject->coords2.y == y) || (curObject->coords3.x == x && curObject->coords3.y == y)) - { - if (AreZCoordsCompatible(mapObject->mapobj_unk_0B_0, curObject->mapobj_unk_0B_0)) - { - return TRUE; - } - } - } - } - return FALSE; -} - -bool8 sub_8092E9C(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) && gSprites[gMapObjects[mapObjectId].spriteId].data[7] & 0x02) - { - return TRUE; - } - return FALSE; -} - -void sub_8092EF0(u8 localId, u8 mapNum, u8 mapGroup) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId)) - { - gSprites[gMapObjects[mapObjectId].spriteId].data[7] |= 0x04; - } -} - -void MoveCoords(u8 direction, s16 *x, s16 *y) -{ - *x += gUnknown_0850DB7C[direction].x; - *y += gUnknown_0850DB7C[direction].y; -} - -void sub_8092F60(u8 direction, s16 *x, s16 *y) -{ - *x += gUnknown_0850DB7C[direction].x << 4; - *y += gUnknown_0850DB7C[direction].y << 4; -} - -void sub_8092F88(u32 dirn, s16 *x, s16 *y, s16 dx, s16 dy) -{ - u8 direction; - s16 dx_2; - s16 dy_2; - s16 cur_x; - s16 cur_y; - - direction = dirn; - dx_2 = dx; - dy_2 = dy; - cur_x = gUnknown_0850DB7C[direction].x; - if (cur_x > 0) - { - *x += dx_2; - } - if (cur_x < 0) - { - *x -= dx_2; - } - cur_y = gUnknown_0850DB7C[direction].y; - if (cur_y > 0) - { - *y += dy_2; - } - if (cur_y < 0) - { - *y -= dy_2; - } -} - -void sub_8092FF0(s16 x, s16 y, s16 *dest_x, s16 *dest_y) -{ - *dest_x = (x - gSaveBlock1Ptr->pos.x) << 4; - *dest_y = (y - gSaveBlock1Ptr->pos.y) << 4; - *dest_x -= gUnknown_03005DEC; - *dest_y -= gUnknown_03005DE8; -} - -void sub_8093038(s16 x, s16 y, s16 *dest_x, s16 *dest_y) -{ - s16 dx; - s16 dy; - - dx = -gUnknown_03005DEC - gUnknown_03005DD0.x; - dy = -gUnknown_03005DE8 - gUnknown_03005DD0.y; - if (gUnknown_03005DD0.x > 0) - { - dx += 0x10; - } - if (gUnknown_03005DD0.x < 0) - { - dx -= 0x10; - } - if (gUnknown_03005DD0.y > 0) - { - dy += 0x10; - } - if (gUnknown_03005DD0.y < 0) - { - dy -= 0x10; - } - *dest_x = ((x - gSaveBlock1Ptr->pos.x) << 4) + dx; - *dest_y = ((y - gSaveBlock1Ptr->pos.y) << 4) + dy; -} - -void sub_80930E0(s16 *x, s16 *y, s16 dx, s16 dy) -{ - sub_8093038(*x, *y, x, y); - *x += dx; - *y += dy; -} - -void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) -{ - *x = 0; - *y = 0; - if (gUnknown_03005DD0.x > 0) - { - (*x) ++; - } - if (gUnknown_03005DD0.x < 0) - { - (*x) --; - } - if (gUnknown_03005DD0.y > 0) - { - (*y) ++; - } - if (gUnknown_03005DD0.y < 0) - { - (*y) --; - } -} - -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 dirn, s16 *x, s16 *y) -{ - u8 direction; - - direction = dirn; - *x = mapObject->coords2.x; - *y = mapObject->coords2.y; - MoveCoords(direction, x, y); -} - -// file boundary? - -bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_1 || mapObject->mapobj_bit_6) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectIsSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 && mapObject->mapobj_unk_1C != 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) - { - return TRUE; - } - npc_sync_anim_pause_bits(mapObject); - mapObject->mapobj_unk_1C = specialAnimId; - mapObject->mapobj_bit_6 = TRUE; - mapObject->mapobj_bit_7 = FALSE; - gSprites[mapObject->spriteId].data[2] = 0; - return FALSE; -} - -void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId) -{ - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - FieldObjectSetSpecialAnim(mapObject, specialAnimId); -} - -void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - FieldObjectClearAnim(mapObject); - } -} - -void FieldObjectClearAnim(struct MapObject *mapObject) -{ - mapObject->mapobj_unk_1C = 0xFF; - mapObject->mapobj_bit_6 = FALSE; - mapObject->mapobj_bit_7 = FALSE; - gSprites[mapObject->spriteId].data[1] = 0; - gSprites[mapObject->spriteId].data[2] = 0; -} - -u8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - return mapObject->mapobj_bit_7; - } - return 0x10; -} - -u8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject) -{ - u8 specialAnimState; - - specialAnimState = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject); - if (specialAnimState != 0 && specialAnimState != 16) - { - FieldObjectClearAnimIfSpecialAnimActive(mapObject); - } - return specialAnimState; -} - -u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6) - { - return mapObject->mapobj_unk_1C; - } - return 0xFF; -} - -void FieldObjectStep(struct MapObject *mapObject, struct Sprite *sprite, bool8 (*callback)(struct MapObject *, struct Sprite *)) -{ - DoGroundEffects_OnSpawn(mapObject, sprite); - sub_80964E8(mapObject, sprite); - if (FieldObjectIsSpecialAnimActive(mapObject)) - { - FieldObjectExecSpecialAnim(mapObject, sprite); - } - else if (!mapObject->mapobj_bit_8) - { - while (callback(mapObject, sprite)); - } - DoGroundEffects_OnBeginStep(mapObject, sprite); - DoGroundEffects_OnFinishStep(mapObject, sprite); - npc_obj_transfer_image_anim_pause_flag(mapObject, sprite); - sub_8096518(mapObject, sprite); - FieldObjectUpdateSubpriority(mapObject, sprite); -} - -#define dirn2anim_2(name, table) \ -extern const u8 table[5]; \ -u8 name(u32 direction) \ -{ \ - u8 dirn2; \ - u8 animIds[5]; \ - dirn2 = direction; \ - memcpy(animIds, table, 5); \ - if (dirn2 > DIR_EAST) \ - { \ - dirn2 = 0; \ - } \ - return animIds[dirn2]; \ -} - -dirn2anim_2(GetFaceDirectionAnimId, gUnknown_0850DBA0); -dirn2anim_2(GetSimpleGoAnimId, gUnknown_0850DBA5); -dirn2anim_2(GetGoSpeed0AnimId, gUnknown_0850DBAA); -dirn2anim_2(GetGoSpeed1AnimId, gUnknown_0850DBAF); -dirn2anim_2(GetGoSpeed2AnimId, gUnknown_0850DBB4); -dirn2anim_2(GetGoSpeed3AnimId, gUnknown_0850DBB9); -dirn2anim_2(sub_8093438, gUnknown_0850DBBE); -dirn2anim_2(GetRunAnimId, gUnknown_0850DBC3); -dirn2anim_2(GetJumpLedgeAnimId, gUnknown_0850DBC8); -dirn2anim_2(sub_80934BC, gUnknown_0850DBCD); -dirn2anim_2(sub_80934E8, gUnknown_0850DBD2); -dirn2anim_2(sub_8093514, gUnknown_0850DBD7); -dirn2anim_2(sub_8093540, gUnknown_0850DBDC); -dirn2anim_2(GetStepInPlaceDelay32AnimId, gUnknown_0850DBE1); -dirn2anim_2(GetStepInPlaceDelay16AnimId, gUnknown_0850DBE6); -dirn2anim_2(GetStepInPlaceDelay8AnimId, gUnknown_0850DBEB); -dirn2anim_2(GetStepInPlaceDelay4AnimId, gUnknown_0850DBF0); - -bool8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) -{ - return FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(GetOppositeDirection(direction))); -} - -dirn2anim_2(sub_8093648, gUnknown_0850DBF5); -dirn2anim_2(sub_8093674, gUnknown_0850DBFA); -dirn2anim_2(sub_80936A0, gUnknown_0850DBFF); -dirn2anim_2(sub_80936CC, gUnknown_0850DC04); -dirn2anim_2(sub_80936F8, gUnknown_0850DC09); -dirn2anim_2(sub_8093724, gUnknown_0850DC0E); -dirn2anim_2(sub_8093750, gUnknown_0850DC13); -dirn2anim_2(sub_809377C, gUnknown_0850DC18); -dirn2anim_2(sub_80937A8, gUnknown_0850DC1D); -dirn2anim_2(d2s_08064034, gUnknown_0850DC22); - -extern const u8 gUnknown_0850DC27[8]; - -u8 GetOppositeDirection(u8 direction) -{ - u8 directions[sizeof gUnknown_0850DC27]; - - memcpy(directions, gUnknown_0850DC27, sizeof gUnknown_0850DC27); - if (direction < 1 || direction > (sizeof gUnknown_0850DC27)) - { - return direction; - } - return directions[direction - 1]; -} - -static u32 zffu_offset_calc(u8 a0, u8 a1) -{ - return gUnknown_0850DC2F[a0 - 1][a1 - 1]; -} - -static u32 state_to_direction(u8 a0, u32 a1, u32 a2) -{ - u32 zffuOffset; - u8 a1_2; - u8 a2_2; - - a1_2 = a1; - a2_2 = a2; - if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) - { - return 0; - } - zffuOffset = zffu_offset_calc(a1_2, a2); - return gUnknown_0850DC3F[a0 - 1][zffuOffset - 1]; -} - -static void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_bit_7 = TRUE; - } -} - -bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (gUnknown_0850DC50[mapObject->mapobj_unk_1C][sprite->data[2]](mapObject, sprite)) - { - mapObject->mapobj_unk_1C = 0xFF; - sprite->data[2] = 0; - return TRUE; - } - return FALSE; -} - -void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId) -{ - mapObject->mapobj_unk_1C = animId; - sprite->data[2] = 0; -} - -// file boundary? - -void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - obj_npc_animation_step(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - sprite->animPaused = TRUE; - sprite->data[2] = 1; -} - -bool8 sub_8093950(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 sub_8093960(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_NORTH); - return TRUE; -} - -bool8 sub_8093970(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_WEST); - return TRUE; -} - -bool8 sub_8093980(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, DIR_EAST); - return TRUE; -} - -void npc_apply_direction(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed) -{ - s16 x; - s16 y; - - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - oamt_npc_ministep_reset(sprite, direction, speed); - sprite->animPaused = FALSE; - if (gUnknown_020375B8 != NULL && sub_8097F78(mapObject) != 0x10) - { - sprite->animPaused = TRUE; - } - mapObject->mapobj_bit_2 = TRUE; - sprite->data[2] = 1; -} - -void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed) -{ - u8 (*functions[ARRAY_COUNT(gUnknown_0850DEE8)])(u8); - - memcpy(functions, gUnknown_0850DEE8, sizeof gUnknown_0850DEE8); - npc_apply_direction(mapObject, sprite, direction, speed); - npc_apply_anim_looping(mapObject, sprite, functions[speed](mapObject->mapobj_unk_18)); -} - -void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - npc_apply_direction(mapObject, sprite, direction, 1); - npc_apply_anim_looping(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (obj_npc_ministep(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = TRUE; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -void sub_8093AF0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - s16 x; - s16 y; - - x = mapObject->coords2.x; - y = mapObject->coords2.y; - FieldObjectSetDirection(mapObject, direction); - MoveCoords(direction, &x, &y); - npc_coords_shift(mapObject, x, y); - sub_80976DC(sprite, direction); - sprite->animPaused = FALSE; - mapObject->mapobj_bit_2 = TRUE; - sprite->data[2] = 1; -} - -void sub_8093B60(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8093AF0(mapObject, sprite, direction); - npc_apply_anim_looping(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); -} - -bool8 an_walk_any_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_80976EC(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = TRUE; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -#define an_walk_any_2_macro(name, fn1, fn2, ...) \ -bool8 name##_2(struct MapObject *, struct Sprite *);\ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - fn1(mapObject, sprite, __VA_ARGS__);\ - return name##_2(mapObject, sprite);\ -}\ -bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - if (fn2(mapObject, sprite))\ - {\ - sprite->data[2] = 2;\ - return TRUE;\ - }\ - return FALSE;\ -} - -an_walk_any_2_macro(sub_8093BC4, sub_8093B60, an_walk_any_2, 7) -an_walk_any_2_macro(sub_8093C04, sub_8093B60, an_walk_any_2, 8) -an_walk_any_2_macro(sub_8093C44, sub_8093B60, an_walk_any_2, 5) -an_walk_any_2_macro(sub_8093C84, sub_8093B60, an_walk_any_2, 6) -an_walk_any_2_macro(sub_8093CC4, sub_8093B60, an_walk_any_2, 1) -an_walk_any_2_macro(sub_8093D04, sub_8093B60, an_walk_any_2, 2) -an_walk_any_2_macro(sub_8093D44, sub_8093B60, an_walk_any_2, 3) -an_walk_any_2_macro(sub_8093D84, sub_8093B60, an_walk_any_2, 4) -an_walk_any_2_macro(sub_8093DC4, do_go_anim, npc_obj_ministep_stop_on_arrival, 7, 0) -an_walk_any_2_macro(sub_8093E04, do_go_anim, npc_obj_ministep_stop_on_arrival, 8, 0) -an_walk_any_2_macro(sub_8093E44, do_go_anim, npc_obj_ministep_stop_on_arrival, 5, 0) -an_walk_any_2_macro(sub_8093E84, do_go_anim, npc_obj_ministep_stop_on_arrival, 6, 0) -an_walk_any_2_macro(sub_8093EC4, do_go_anim, npc_obj_ministep_stop_on_arrival, 1, 0) -an_walk_any_2_macro(sub_8093F04, do_go_anim, npc_obj_ministep_stop_on_arrival, 2, 0) -an_walk_any_2_macro(sub_8093F44, do_go_anim, npc_obj_ministep_stop_on_arrival, 3, 0) -an_walk_any_2_macro(sub_8093F84, do_go_anim, npc_obj_ministep_stop_on_arrival, 4, 0) - -void sub_8093FC4(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a5) -{ - s16 displacements[ARRAY_COUNT(gUnknown_0850DFBC)]; - s16 x; - s16 y; - - memcpy(displacements, gUnknown_0850DFBC, sizeof gUnknown_0850DFBC); - x = 0; - y = 0; - FieldObjectSetDirection(mapObject, direction); - sub_8092F88(direction, &x, &y, displacements[speed], displacements[speed]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - sub_809783C(sprite, direction, speed, a5); - sprite->data[2] = 1; - sprite->animPaused = 0; - mapObject->mapobj_bit_2 = 1; - mapObject->mapobj_bit_4 = 1; -} - -void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4) -{ - sub_8093FC4(mapObject, sprite, direction, speed, a4); - npc_apply_anim_looping(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - DoShadowFieldEffect(mapObject); -} - -u8 sub_80940C4(struct MapObject *mapObject, struct Sprite *sprite, u8 callback(struct Sprite *)) -{ - s16 displacements[ARRAY_COUNT(gUnknown_0850DFC2)]; - s16 x; - s16 y; - u8 result; - - memcpy(displacements, gUnknown_0850DFC2, sizeof gUnknown_0850DFC2); - result = callback(sprite); - if (result == 1 && displacements[sprite->data[4]] != 0) - { - x = 0; - y = 0; - sub_8092F88(mapObject->placeholder18, &x, &y, displacements[sprite->data[4]], displacements[sprite->data[4]]); - npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y); - mapObject->mapobj_bit_2 = TRUE; - mapObject->mapobj_bit_4 = TRUE; - } - else if (result == 0xFF) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = TRUE; - mapObject->mapobj_bit_5 = TRUE; - sprite->animPaused = TRUE; - } - return result; -} - -u8 sub_8094188(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_80940C4(mapObject, sprite, sub_809785C); -} - -u8 sub_809419C(struct MapObject *mapObject, struct Sprite *sprite) -{ - return sub_80940C4(mapObject, sprite, sub_80978E4); -} - -bool8 sub_80941B0(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8094188(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_80941C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_809419C(mapObject, sprite) == 0xFF) - { - return TRUE; - } - return FALSE; -} - -bool8 sub_80941E0(struct MapObject *mapObject, struct Sprite *sprite) -{ - switch (sub_8094188(mapObject, sprite)) - { - case 255: - return TRUE; - case 1: - FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18)); - obj_npc_animation_step(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18)); - default: - return FALSE; - } -} - -#define maybe_shadow_1_macro(name, fn1, fn2, ...) \ -bool8 name##_2(struct MapObject *, struct Sprite *);\ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - fn1(mapObject, sprite, __VA_ARGS__);\ - return name##_2(mapObject, sprite);\ -}\ -bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - if (fn2(mapObject, sprite))\ - {\ - mapObject->mapobj_bit_22 = FALSE;\ - sprite->data[2] = 2;\ - return TRUE;\ - }\ - return FALSE;\ -} - -maybe_shadow_1_macro(sub_8094230, maybe_shadow_1, sub_80941B0, DIR_SOUTH, 2, 0) -maybe_shadow_1_macro(sub_8094288, maybe_shadow_1, sub_80941B0, DIR_NORTH, 2, 0) -maybe_shadow_1_macro(sub_80942E0, maybe_shadow_1, sub_80941B0, DIR_WEST, 2, 0) -maybe_shadow_1_macro(sub_8094338, maybe_shadow_1, sub_80941B0, DIR_EAST, 2, 0) - -void sub_8094390(struct Sprite *sprite, u16 duration) -{ - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_8094398(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (-- sprite->data[3] == 0) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -#define special_anim_with_timer(name, duration)\ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - sub_8094390(sprite, duration);\ - return sub_8094398(mapObject, sprite);\ -} - -special_anim_with_timer(sub_80943B4, 1) -special_anim_with_timer(sub_80943D4, 2) -special_anim_with_timer(sub_80943F4, 4) -special_anim_with_timer(sub_8094414, 8) -special_anim_with_timer(sub_8094434, 16) - -an_walk_any_2_macro(sub_8094454, do_go_anim, npc_obj_ministep_stop_on_arrival, 1, 1) -an_walk_any_2_macro(sub_8094494, do_go_anim, npc_obj_ministep_stop_on_arrival, 2, 1) -an_walk_any_2_macro(sub_80944D4, do_go_anim, npc_obj_ministep_stop_on_arrival, 3, 1) -an_walk_any_2_macro(sub_8094514, do_go_anim, npc_obj_ministep_stop_on_arrival, 4, 1) - -void sub_8094554(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum, u16 duration) -{ - FieldObjectSetDirection(mapObject, direction); - npc_apply_anim_looping(mapObject, sprite, animNum); - sprite->animPaused = FALSE; - sprite->data[2] = 1; - sprite->data[3] = duration; -} - -bool8 sub_809459C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (-- sprite->data[3] == 0) - { - sprite->data[2] = 2; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -bool8 sub_80945C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sprite->data[3] & 1) - { - sprite->animDelayCounter ++; - } - return sub_809459C(mapObject, sprite); -} - -#define special_anim_with_timer_2(name, direction, images, duration, timer) \ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - u8 animId;\ - animId = images(DIR_##direction);\ - sub_8094554(mapObject, sprite, DIR_##direction, animId, duration);\ - return timer(mapObject, sprite);\ -} - -special_anim_with_timer_2(sub_8094600, SOUTH, get_go_image_anim_num, 32, sub_80945C4) -special_anim_with_timer_2(sub_8094638, NORTH, get_go_image_anim_num, 32, sub_80945C4) -special_anim_with_timer_2(sub_8094670, WEST, get_go_image_anim_num, 32, sub_80945C4) -special_anim_with_timer_2(sub_80946A8, EAST, get_go_image_anim_num, 32, sub_80945C4) -special_anim_with_timer_2(sub_80946E0, SOUTH, get_go_image_anim_num, 16, sub_809459C) -special_anim_with_timer_2(sub_8094718, NORTH, get_go_image_anim_num, 16, sub_809459C) -special_anim_with_timer_2(sub_8094750, WEST, get_go_image_anim_num, 16, sub_809459C) -special_anim_with_timer_2(sub_8094788, EAST, get_go_image_anim_num, 16, sub_809459C) -special_anim_with_timer_2(sub_80947C0, SOUTH, get_go_fast_image_anim_num, 8, sub_809459C) -special_anim_with_timer_2(sub_80947F8, NORTH, get_go_fast_image_anim_num, 8, sub_809459C) -special_anim_with_timer_2(sub_8094830, WEST, get_go_fast_image_anim_num, 8, sub_809459C) -special_anim_with_timer_2(sub_8094868, EAST, get_go_fast_image_anim_num, 8, sub_809459C) -special_anim_with_timer_2(sub_80948A0, SOUTH, get_go_faster_image_anim_num, 4, sub_809459C) -special_anim_with_timer_2(sub_80948D8, NORTH, get_go_faster_image_anim_num, 4, sub_809459C) -special_anim_with_timer_2(sub_8094910, WEST, get_go_faster_image_anim_num, 4, sub_809459C) -special_anim_with_timer_2(sub_8094948, EAST, get_go_faster_image_anim_num, 4, sub_809459C) - -an_walk_any_2_macro(sub_8094980, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 2) -an_walk_any_2_macro(sub_80949C0, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 2) -an_walk_any_2_macro(sub_8094A00, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST, 2) -an_walk_any_2_macro(sub_8094A40, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST, 2) -an_walk_any_2_macro(sub_8094A80, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 3) -an_walk_any_2_macro(sub_8094AC0, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 3) -an_walk_any_2_macro(sub_8094B00, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST, 3) -an_walk_any_2_macro(sub_8094B40, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST, 3) -an_walk_any_2_macro(sub_8094B80, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 4) -an_walk_any_2_macro(sub_8094BC0, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 4) -an_walk_any_2_macro(sub_8094C00, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST, 4) -an_walk_any_2_macro(sub_8094C40, do_go_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST, 4) -an_walk_any_2_macro(sub_8094C80, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_SOUTH) -an_walk_any_2_macro(sub_8094CC0, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_NORTH) -an_walk_any_2_macro(sub_8094D00, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_WEST) -an_walk_any_2_macro(sub_8094D40, do_run_anim, npc_obj_ministep_stop_on_arrival, DIR_EAST) - -void npc_set_direction_and_anim__an_proceed(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 animNum) -{ - obj_anim_image_set_and_seek(sprite, animNum, 0); - FieldObjectSetDirection(mapObject, direction); - sprite->data[2] = 1; -} - -bool8 sub_8094DAC(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, mapObject->placeholder18, sprite->animNum); - return FALSE; -} - -bool8 sub_8094DC4(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_80979BC(sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8094DE4(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - sub_8093FC4(mapObject, sprite, direction, 1, 0); - StartSpriteAnim(sprite, sub_80929AC(direction)); -} - -#define unk_macro_8094E18(name, direction)\ -bool8 name##_2(struct MapObject *, struct Sprite *);\ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - sub_8094DE4(mapObject, sprite, direction);\ - return name##_2(mapObject, sprite);\ -}\ -bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - if (sub_80941C8(mapObject, sprite))\ - {\ - sprite->data[2] = 2;\ - mapObject->mapobj_bit_5 = FALSE;\ - return TRUE;\ - }\ - return FALSE;\ -} - -unk_macro_8094E18(sub_8094E18, DIR_SOUTH) -unk_macro_8094E18(sub_8094E60, DIR_NORTH) -unk_macro_8094E18(sub_8094EB8, DIR_WEST) -unk_macro_8094E18(sub_8094710, DIR_EAST) - -bool8 sub_8094F38(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0, &mapObjectId)) - { - an_look_any(mapObject, sprite, sub_8092AF8(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[mapObjectId].coords2.x, gMapObjects[mapObjectId].coords2.y)); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8094F94(struct MapObject *mapObject, struct Sprite *sprite) -{ - u8 mapObjectId; - - if (!TryGetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0, &mapObjectId)) - { - an_look_any(mapObject, sprite, GetOppositeDirection(sub_8092AF8(mapObject->coords2.x, mapObject->coords2.y, gMapObjects[mapObjectId].coords2.x, gMapObjects[mapObjectId].coords2.y))); - } - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8094FF8(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = TRUE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8095008(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_9 = FALSE; - sprite->data[2] = 1; - return TRUE; -} - -maybe_shadow_1_macro(sub_8095018, maybe_shadow_1, sub_80941B0, DIR_SOUTH, 1, 2) -maybe_shadow_1_macro(sub_8095070, maybe_shadow_1, sub_80941B0, DIR_NORTH, 1, 2) -maybe_shadow_1_macro(sub_80950C8, maybe_shadow_1, sub_80941B0, DIR_WEST, 1, 2) -maybe_shadow_1_macro(sub_8095120, maybe_shadow_1, sub_80941B0, DIR_EAST, 1, 2) -maybe_shadow_1_macro(sub_8095178, maybe_shadow_1, sub_80941B0, DIR_SOUTH, 0, 0) -maybe_shadow_1_macro(sub_80951D0, maybe_shadow_1, sub_80941B0, DIR_NORTH, 0, 0) -maybe_shadow_1_macro(sub_8095228, maybe_shadow_1, sub_80941B0, DIR_WEST, 0, 0) -maybe_shadow_1_macro(sub_8095280, maybe_shadow_1, sub_80941B0, DIR_EAST, 0, 0) -maybe_shadow_1_macro(sub_80952D8, maybe_shadow_1, sub_80941E0, DIR_SOUTH, 0, 2) -maybe_shadow_1_macro(sub_8095330, maybe_shadow_1, sub_80941E0, DIR_NORTH, 0, 2) -maybe_shadow_1_macro(sub_8095388, maybe_shadow_1, sub_80941E0, DIR_WEST, 0, 2) -maybe_shadow_1_macro(sub_80953E0, maybe_shadow_1, sub_80941E0, DIR_EAST, 0, 2) - -bool8 sub_8095438(struct MapObject *mapObject, struct Sprite *sprite) -{ - an_look_any(mapObject, sprite, gUnknown_085055CD[mapObject->animPattern]); - return TRUE; -} - -bool8 sub_8095450(struct MapObject *mapObject, struct Sprite *sprite) -{ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, DIR_SOUTH, 0x14); - return FALSE; -} - -bool8 sub_8095460(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = FALSE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8095470(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_25 = TRUE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8095480(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = TRUE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8095490(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80954BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = TRUE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80954CC(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 = FALSE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_1(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_exclamation_mark_bubble_2(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_2); - sprite->data[2] = 1; - return TRUE; -} - -bool8 do_heart_bubble(struct MapObject *mapObject, struct Sprite *sprite) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_HEART_ICON); - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8095548(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->animPattern == 0x3F) - { - sub_80B4578(mapObject); - return FALSE; - } - if (mapObject->animPattern != 0x39 && mapObject->animPattern != 0x3A) - { - sprite->data[2] = 2; - return TRUE; - } - sub_8155D78(mapObject); - sprite->data[2] = 1; - return sub_809558C(mapObject, sprite); -} - -bool8 sub_809558C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8155DA0(mapObject)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -bool8 sub_80955AC(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_80955C8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_80979BC(sprite)) - { - SetFieldObjectStepTimer(sprite, 32); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_80955EC(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= TRUE; - if (RunFieldObjectStepTimer(sprite)) - { - mapObject->mapobj_bit_13 = TRUE; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_8095628(struct MapObject *mapObject, struct Sprite *sprite) -{ - obj_anim_image_set_and_seek(sprite, 1, 0); - sprite->data[2] = 1; - return FALSE; -} - -bool8 sub_8095644(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_80979BC(sprite)) - { - SetFieldObjectStepTimer(sprite, 32); - sprite->data[2] = 2; - } - return FALSE; -} - -bool8 sub_8095668(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_13 ^= TRUE; - if (RunFieldObjectStepTimer(sprite)) - { - mapObject->mapobj_bit_13 = TRUE; - sprite->data[2] = 3; - } - return FALSE; -} - -bool8 sub_80956A4(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = TRUE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80956B4(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_26 = FALSE; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_80956C4(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->oam.affineMode = 3; - InitSpriteAffineAnim(sprite); - sprite->affineAnimPaused = TRUE; - sprite->subspriteMode = 0; - return TRUE; -} - -bool8 sub_80956F4(struct MapObject *mapObject, struct Sprite *sprite) -{ - FreeOamMatrix(sprite->oam.matrixNum); - sprite->oam.affineMode = 0; - CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode); - return TRUE; -} - -bool8 sub_8095724(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_27 = TRUE; - return TRUE; -} - -bool8 sub_8095730(struct MapObject *mapObject, struct Sprite *sprite) -{ - mapObject->mapobj_bit_27 = FALSE; - return TRUE; -} - -#define affine_an_walk_any_2_macro(name, fn, fn2, action, anim, ...)\ -bool8 name##_2(struct MapObject *, struct Sprite *);\ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - fn(mapObject, sprite, __VA_ARGS__);\ - sprite->affineAnimPaused = FALSE;\ - action(sprite, anim);\ - return name##_2(mapObject, sprite);\ -}\ -bool8 name##_2(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - if (fn2(mapObject, sprite))\ - {\ - sprite->affineAnimPaused = TRUE;\ - sprite->data[2] = 2;\ - return TRUE;\ - }\ - return FALSE;\ -}\ - -affine_an_walk_any_2_macro(sub_8095740, sub_8093B60, an_walk_any_2, StartSpriteAffineAnimIfDifferent, 0, DIR_SOUTH) -affine_an_walk_any_2_macro(sub_80957A0, sub_8093B60, an_walk_any_2, ChangeSpriteAffineAnimIfDifferent, 1, DIR_SOUTH) -affine_an_walk_any_2_macro(sub_8095800, do_go_anim, npc_obj_ministep_stop_on_arrival, ChangeSpriteAffineAnimIfDifferent, 2, DIR_WEST, 1) -affine_an_walk_any_2_macro(sub_8095860, do_go_anim, npc_obj_ministep_stop_on_arrival, ChangeSpriteAffineAnimIfDifferent, 3, DIR_EAST, 1) - -static void sub_80958C0(struct MapObject *mapObject, struct Sprite *sprite, u8 direction) -{ - FieldObjectSetDirection(mapObject, direction); - npc_coords_shift_still(mapObject); - obj_npc_animation_step(mapObject, sprite, sub_80929FC(direction)); - sprite->animPaused = TRUE; - sprite->data[2] = 1; -} - -bool8 sub_8095900(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80958C0(mapObject, sprite, DIR_SOUTH); - return TRUE; -} - -bool8 sub_8095910(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80958C0(mapObject, sprite, DIR_NORTH); - return TRUE; -} - -bool8 sub_8095920(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80958C0(mapObject, sprite, DIR_WEST); - return TRUE; -} - -bool8 sub_8095930(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_80958C0(mapObject, sprite, DIR_EAST); - return TRUE; -} - -#define set_dirn_and_anim__an_proceed(name, direction, anims)\ -bool8 name(struct MapObject *mapObject, struct Sprite *sprite)\ -{\ - npc_set_direction_and_anim__an_proceed(mapObject, sprite, direction, anims(direction));\ - return FALSE;\ -} - -set_dirn_and_anim__an_proceed(sub_8095940, DIR_SOUTH, sub_80929BC) -set_dirn_and_anim__an_proceed(sub_8095964, DIR_NORTH, sub_80929BC) -set_dirn_and_anim__an_proceed(sub_8095988, DIR_WEST, sub_80929BC) -set_dirn_and_anim__an_proceed(sub_80959AC, DIR_EAST, sub_80929BC) -set_dirn_and_anim__an_proceed(sub_80959D0, DIR_SOUTH, sub_80929DC) -set_dirn_and_anim__an_proceed(sub_80959F4, DIR_NORTH, sub_80929DC) -set_dirn_and_anim__an_proceed(sub_8095A18, DIR_WEST, sub_80929DC) -set_dirn_and_anim__an_proceed(sub_8095A3C, DIR_EAST, sub_80929DC) -set_dirn_and_anim__an_proceed(sub_8095A60, DIR_SOUTH, sub_80929EC) -set_dirn_and_anim__an_proceed(sub_8095A84, DIR_NORTH, sub_80929EC) -set_dirn_and_anim__an_proceed(sub_8095AA8, DIR_WEST, sub_80929EC) -set_dirn_and_anim__an_proceed(sub_8095ACC, DIR_EAST, sub_80929EC) - -void sub_8095AF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8097750(sprite); - sprite->animPaused = FALSE; -} - -bool8 sub_8095B0C(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8097758(sprite)) - { - npc_coords_shift_still(mapObject); - mapObject->mapobj_bit_3 = TRUE; - sprite->animPaused = TRUE; - return TRUE; - } - return FALSE; -} - -bool8 sub_8095B44(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8095AF0(mapObject, sprite); - sprite->data[2] = 1; - return sub_8095B64(mapObject, sprite); -} - -bool8 sub_8095B64(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sub_8095B0C(mapObject, sprite)) - { - sprite->data[2] = 2; - return TRUE; - } - return FALSE; -} - -void sub_8095B84(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed, u8 a4) -{ - sub_8093FC4(mapObject, sprite, direction, speed, a4); - StartSpriteAnimIfDifferent(sprite, sub_80929BC(direction)); - DoShadowFieldEffect(mapObject); -} - -maybe_shadow_1_macro(sub_8095BC8, sub_8095B84, sub_80941B0, DIR_SOUTH, 0, 1) -maybe_shadow_1_macro(sub_8095C20, sub_8095B84, sub_80941B0, DIR_NORTH, 0, 1) -maybe_shadow_1_macro(sub_8095C78, sub_8095B84, sub_80941B0, DIR_WEST, 0, 1) -maybe_shadow_1_macro(sub_8095CD0, sub_8095B84, sub_80941B0, DIR_EAST, 0, 1) -maybe_shadow_1_macro(sub_8095D28, sub_8095B84, sub_80941B0, DIR_SOUTH, 1, 1) -maybe_shadow_1_macro(sub_8095D80, sub_8095B84, sub_80941B0, DIR_NORTH, 1, 1) -maybe_shadow_1_macro(sub_8095DD8, sub_8095B84, sub_80941B0, DIR_WEST, 1, 1) -maybe_shadow_1_macro(sub_8095E30, sub_8095B84, sub_80941B0, DIR_EAST, 1, 1) -maybe_shadow_1_macro(sub_8095E88, sub_8095B84, sub_80941B0, DIR_SOUTH, 2, 0) -maybe_shadow_1_macro(sub_8095EE0, sub_8095B84, sub_80941B0, DIR_NORTH, 2, 0) -maybe_shadow_1_macro(sub_8095F38, sub_8095B84, sub_80941B0, DIR_WEST, 2, 0) -maybe_shadow_1_macro(sub_8095F90, sub_8095B84, sub_80941B0, DIR_EAST, 2, 0) - -special_anim_with_timer_2(sub_8095FE8, SOUTH, sub_80929FC, 8, sub_809459C) -special_anim_with_timer_2(sub_8096020, NORTH, sub_80929FC, 8, sub_809459C) -special_anim_with_timer_2(sub_8096058, WEST, sub_80929FC, 8, sub_809459C) -special_anim_with_timer_2(sub_8096090, EAST, sub_80929FC, 8, sub_809459C) - -void sub_80960C8(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed) -{ - npc_apply_direction(mapObject, sprite, direction, speed); - StartSpriteAnim(sprite, sub_80929BC(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} - -an_walk_any_2_macro(sub_8096100, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 1) -an_walk_any_2_macro(sub_8096140, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 1) -an_walk_any_2_macro(sub_8096180, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_WEST, 1) -an_walk_any_2_macro(sub_80961C0, sub_80960C8, npc_obj_ministep_stop_on_arrival, DIR_EAST, 1) - -void sub_8096200(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed) -{ - npc_apply_direction(mapObject, sprite, direction, speed); - npc_apply_anim_looping(mapObject, sprite, sub_80929FC(mapObject->mapobj_unk_18)); -} - -an_walk_any_2_macro(sub_8096230, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 1) -an_walk_any_2_macro(sub_8096270, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 1) -an_walk_any_2_macro(sub_80962B0, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_WEST, 1) -an_walk_any_2_macro(sub_80962F0, sub_8096200, npc_obj_ministep_stop_on_arrival, DIR_EAST, 1) - -void sub_8096330(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 speed) -{ - npc_apply_direction(mapObject, sprite, direction, speed); - StartSpriteAnim(sprite, sub_80929DC(mapObject->mapobj_unk_18)); - SeekSpriteAnim(sprite, 0); -} -an_walk_any_2_macro(sub_8096368, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_SOUTH, 1) -an_walk_any_2_macro(sub_80963A8, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_NORTH, 1) -an_walk_any_2_macro(sub_80963E8, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_WEST, 1) -an_walk_any_2_macro(sub_8096428, sub_8096330, npc_obj_ministep_stop_on_arrival, DIR_EAST, 1) - -bool8 sub_8096468(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8097FA4(mapObject); - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_809647C(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8098044(mapObject->mapobj_unk_1B); - sprite->pos2.y = 0; - sprite->data[2] = 1; - return TRUE; -} - -bool8 sub_8096494(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (sprite->pos2.y == 0) - { - sub_8098044(mapObject->mapobj_unk_1B); - sprite->data[2] = 1; - return TRUE; - } - return FALSE; -} - -bool8 sub_80964B8(struct MapObject *mapObject, struct Sprite *sprite) -{ - return TRUE; -} - -bool8 sub_80964BC(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->animPaused = TRUE; - return TRUE; -} - -void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_10) - { - sprite->animPaused = TRUE; - } -} - -void sub_80964E8(struct MapObject *mapObject, struct Sprite *sprite) -{ - if (mapObject->mapobj_bit_11) - { - sprite->animPaused = FALSE; - mapObject->mapobj_bit_10 = FALSE; - mapObject->mapobj_bit_11 = FALSE; - } -} - -void sub_8096518(struct MapObject *mapObject, struct Sprite *sprite) -{ - sub_8096530(mapObject, sprite); - npc_update_obj_anim_flag(mapObject, sprite); -} - -static void sub_8096530(struct MapObject *mapObject, struct Sprite *sprite) -{ - u16 x; - u16 y; - u16 x2; - u16 y2; - const struct MapObjectGraphicsInfo *graphicsInfo; - - mapObject->mapobj_bit_14 = FALSE; - graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - x2 = graphicsInfo->width; - x2 += x; - y2 = y; - y2 += graphicsInfo->height; - if ((s16)x >= 0x100 || (s16)x2 < -0x10) - { - mapObject->mapobj_bit_14 = TRUE; - } - if ((s16)y >= 0xB0 || (s16)y2 < -0x10) - { - mapObject->mapobj_bit_14 = TRUE; - } -} - -static void npc_update_obj_anim_flag(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->invisible = FALSE; - if (mapObject->mapobj_bit_13 || mapObject->mapobj_bit_14) - { - sprite->invisible = TRUE; - } -} diff --git a/src/field_map_obj_helpers.c b/src/field_map_obj_helpers.c deleted file mode 100755 index b8efcfe72..000000000 --- a/src/field_map_obj_helpers.c +++ /dev/null @@ -1,705 +0,0 @@ -#include "global.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "field_effect.h" -#include "field_map_obj_helpers.h" -#include "malloc.h" -#include "task.h" -#include "util.h" - -typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir); - -extern const struct Coords16 gUnknown_0850DB7C[4]; -extern s16 gUnknown_0850E768[]; -extern SpriteStepFunc *const gUnknown_0850E754[]; -extern const s8 gUnknown_0850E772[]; -extern const s8 gUnknown_0850E7BA[]; -extern const s8 *const gUnknown_0850E834[]; -extern s16 gUnknown_0850E840[]; -extern u8 gUnknown_0850E846[]; -extern s16 gUnknown_0850E84A[]; -extern u8 gUnknown_0850E850[]; - -void sub_8097D68(struct Sprite *sprite); -void sub_8097FE4(u8); - -bool8 FreezeMapObject(struct MapObject *mapObject) -{ - if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8) - { - return TRUE; - } - else - { - mapObject->mapobj_bit_8 = 1; - mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused; - mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused; - gSprites[mapObject->spriteId].animPaused = 1; - gSprites[mapObject->spriteId].affineAnimPaused = 1; - return FALSE; - } -} - -void FreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < MAP_OBJECTS_COUNT; i++) - if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void FreezeMapObjectsExceptOne(u8 a1) -{ - u8 i; - for (i = 0; i < MAP_OBJECTS_COUNT; i++) - if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); -} - -void npc_sync_anim_pause_bits(struct MapObject *mapObject) -{ - if (mapObject->active && mapObject->mapobj_bit_8) - { - mapObject->mapobj_bit_8 = 0; - gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23; - gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24; - } -} - -void UnfreezeMapObjects(void) -{ - u8 i; - for (i = 0; i < MAP_OBJECTS_COUNT; i++) - if (gMapObjects[i].active) - npc_sync_anim_pause_bits(&gMapObjects[i]); -} - -void little_step(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += gUnknown_0850DB7C[dir].x; - sprite->pos1.y += gUnknown_0850DB7C[dir].y; -} - -void double_little_steps(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x; - sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y; -} - -void triple_little_steps(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x + (u16) gUnknown_0850DB7C[dir].x; - sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y + (u16) gUnknown_0850DB7C[dir].y; -} - -void quad_little_steps(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 4 * (u16) gUnknown_0850DB7C[dir].x; - sprite->pos1.y += 4 * (u16) gUnknown_0850DB7C[dir].y; -} - -void oct_little_steps(struct Sprite *sprite, u8 dir) -{ - sprite->pos1.x += 8 * (u16) gUnknown_0850DB7C[dir].x; - sprite->pos1.y += 8 * (u16) gUnknown_0850DB7C[dir].y; -} - -void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = 0; -} - -bool8 obj_npc_ministep(struct Sprite *sprite) -{ - if (sprite->data[5] >= gUnknown_0850E768[sprite->data[4]]) - return FALSE; - - gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]); - - sprite->data[5]++; - - if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]]) - return FALSE; - - return TRUE; -} - -void sub_80976DC(struct Sprite *sprite, u8 a2) -{ - sprite->data[3] = a2; - sprite->data[4] = 0; - sprite->data[5] = 0; -} - -bool8 sub_80976EC(struct Sprite *sprite) -{ - if (!(sprite->data[4] & 1)) - { - little_step(sprite, sprite->data[3]); - sprite->data[5]++; - } - - sprite->data[4]++; - - if (sprite->data[5] > 15) - return TRUE; - else - return FALSE; -} - -// new helper added here in the middle. Perhaps Game Freak kept these organized in alphebetical order or some other heirarchy? - -s16 sub_8097728(s16 a1) -{ - return gUnknown_0850E7BA[a1]; -} - -s16 sub_809773C(s16 a1) -{ - return gUnknown_0850E772[a1]; -} - -void sub_8097750(struct Sprite *sprite) -{ - sprite->data[6] = 0; - sprite->data[7] = 0; -} - -bool8 sub_8097758(struct Sprite *sprite) -{ - bool8 result = FALSE; - - switch(sprite->data[7]) - { - case 0: - sprite->pos2.x += sub_809773C(sprite->data[6]); - sprite->pos2.y += sub_8097728(sprite->data[6]); - break; - case 1: - sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]); - sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]); - break; - case 2: - sprite->pos2.x -= sub_809773C(sprite->data[6]); - sprite->pos2.y += sub_8097728(sprite->data[6]); - break; - case 3: - sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]); - sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]); - break; - } - if(++sprite->data[6] == 0x48) - { - sprite->data[6] = 0; - sprite->data[7]++; - } - if(sprite->data[7] == 0x4) - { - sprite->pos2.y = 0; - sprite->pos2.x = 0; - result = TRUE; - } - return result; -} - -s16 sub_8097820(s16 a1, u8 a2) -{ - return gUnknown_0850E834[a2][a1]; -} - -void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4) -{ - sprite->data[3] = a2; - sprite->data[4] = a3; - sprite->data[5] = a4; - sprite->data[6] = 0; -} - -u8 sub_809785C(struct Sprite *sprite) -{ - s16 v5[3]; - u8 v6[3]; - u8 v2; - - memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy - memcpy(v6, gUnknown_0850E846, 3); - v2 = 0; - - if (sprite->data[4]) - little_step(sprite, sprite->data[3]); - - sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -u8 sub_80978E4(struct Sprite *sprite) -{ - s16 v5[3]; - u8 v6[3]; - u8 v2; - - memcpy(v5, gUnknown_0850E84A, 6); - memcpy(v6, gUnknown_0850E850, 3); - v2 = 0; - - if (sprite->data[4] && !(sprite->data[6] & 1)) - little_step(sprite, sprite->data[3]); - - sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]); - - sprite->data[6]++; - - if (sprite->data[6] == (v5[sprite->data[4]] >> 1)) - v2 = 1; - - if (sprite->data[6] >= v5[sprite->data[4]]) - { - sprite->pos2.y = 0; - v2 = -1; - } - - return v2; -} - -void SetFieldObjectStepTimer(struct Sprite *sprite, u16 timer) -{ - sprite->data[3] = timer; -} - - -bool8 RunFieldObjectStepTimer(struct Sprite *sprite) -{ - sprite->data[3]--; - - if (sprite->data[3] == 0) - return TRUE; - else - return FALSE; -} - -void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3) -{ - sprite->animNum = a2; - sprite->animPaused = 0 ; - SeekSpriteAnim(sprite, a3); -} - -bool8 sub_80979BC(struct Sprite *sprite) -{ - if (sprite->animEnded) - return TRUE; - else - return FALSE; -} - -void sub_80979D4(struct Sprite *sprite, bool8 invisible) -{ - u16 x, y; - s16 x2, y2; - - sprite->invisible = invisible; - - if (sprite->coordOffsetEnabled) - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; - } - else - { - x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX; - y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY; - } - - x2 = x - (sprite->centerToCornerVecX >> 1); - y2 = y - (sprite->centerToCornerVecY >> 1); - - if ((s16)x > 255 || x2 < -16) - sprite->invisible = 1; - if ((s16)y > 175 || y2 < -16) - sprite->invisible = 1; -} - -void sub_8097AC8(struct Sprite *sprite) -{ - sub_8097D68(sprite); - SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1); - sub_80979D4(sprite, sprite->data[2]); -} - -void sub_8097AF0(void) -{ - int i; - - for(i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if(sprite->inUse && sprite->callback == sub_8097AC8) - DestroySprite(sprite); - } -} - -int sub_8097B2C(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. -{ - int i; - - for(i = 0; i < MAX_SPRITES; i++) - { - struct Sprite *sprite = &gSprites[i]; - if(sprite->inUse && sprite->callback == sub_8097AC8 && (u8)sprite->data[0] == var) - return i; - } - return MAX_SPRITES; -} - -void sub_8097B78(u8 var1, u8 var2) -{ - u8 spriteId = sub_8097B2C(var1); - - if(spriteId != MAX_SPRITES) - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(var2)); -} - -void sub_8097BB4(u8 var1, u8 var2) -{ - int spriteId = sub_8097B2C(var1); - - if(spriteId != MAX_SPRITES) - { - struct Sprite *sprite = &gSprites[spriteId]; - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(var2); - u16 tileNum = sprite->oam.tileNum; - - sprite->oam = *gfxInfo->oam; - sprite->oam.tileNum = tileNum; - sprite->oam.paletteNum = gfxInfo->paletteSlot; - sprite->images = gfxInfo->images; - - if(gfxInfo->subspriteTables == NULL) - { - sprite->subspriteTables = NULL; - sprite->subspriteTableNum = 0; - sprite->subspriteMode = 0; - } - else - { - SetSubspriteTables(sprite, gfxInfo->subspriteTables); - sprite->subspriteMode = 2; - } - StartSpriteAnim(sprite, 0); - } -} - -void sub_8097C44(u8 var, bool32 var2) -{ - u8 spriteId = sub_8097B2C(var); - - if(spriteId == MAX_SPRITES) - return; - - if(var2) - gSprites[spriteId].data[2] = 1; - else - gSprites[spriteId].data[2] = 0; -} - -bool32 sub_8097C8C(u8 var) -{ - u8 spriteId = sub_8097B2C(var); - - if(spriteId == MAX_SPRITES) - return FALSE; - - return (gSprites[spriteId].data[2] == TRUE); -} - -void sub_8097CC4(u8 var1, u8 var2) -{ - u8 spriteId = sub_8097B2C(var1); - - if(spriteId != MAX_SPRITES) - { - gSprites[spriteId].data[3] = var2; - gSprites[spriteId].data[4] = 0; - } -} - -void sub_8097CF4(struct Sprite *sprite) -{ - switch(sprite->data[4]) - { - case 0: - sprite->pos2.y = 0; - sprite->data[4]++; - case 1: - sprite->pos2.y -= 8; - if(sprite->pos2.y == -160) - { - sprite->pos2.y = 0; - sprite->data[2] = 1; - sprite->data[3] = 0; - sprite->data[4] = 0; - } - } -} - -void sub_8097D30(struct Sprite *sprite) -{ - switch(sprite->data[4]) - { - case 0: - sprite->pos2.y = -160; - sprite->data[4]++; - case 1: - sprite->pos2.y += 8; - if(sprite->pos2.y == 0) - { - sprite->data[3] = 0; - sprite->data[4] = 0; - } - } -} - -void sub_8097D68(struct Sprite *sprite) -{ - switch(sprite->data[3]) - { - case 1: - sub_8097D30(sprite); - break; - case 2: - sub_8097CF4(sprite); - break; - case 0: - break; - default: - sprite->data[3] = 0; - break; - } -} - -bool32 sub_8097D9C(u8 var) -{ - u8 spriteId = sub_8097B2C(var); - - if(spriteId == MAX_SPRITES) - return FALSE; - - if(gSprites[spriteId].data[3] != FALSE) - return TRUE; - - return FALSE; -} - -u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject) -{ - FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - return FieldEffectStart(fieldEffectId); -} - -void DoShadowFieldEffect(struct MapObject *mapObject) -{ - if (!mapObject->mapobj_bit_22) - { - mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); - } -} - -void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite) -{ - const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); - gFieldEffectArguments[0] = sprite->pos1.x; - gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2; - gFieldEffectArguments[2] = 151; - gFieldEffectArguments[3] = 3; - FieldEffectStart(FLDEFF_RIPPLE); -} - -bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite) -{ - u32 one; - bool32 ableToStore = FALSE; - if (gUnknown_020375B8 == NULL) - { - gUnknown_020375B8 = AllocZeroed(0x14); - gUnknown_020375B8[0] = mapObject->localId; - // needed to match - gUnknown_020375B8[16] = (one = 1); - ableToStore = one; - } - else - { - u8 i; - u8 firstFreeSlot; - bool32 found; - for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++) - { - if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0) - firstFreeSlot = i; - - if (gUnknown_020375B8[i] == mapObject->localId) - { - found = TRUE; - break; - } - } - - if (!found && firstFreeSlot != 16) - { - gUnknown_020375B8[firstFreeSlot] = mapObject->localId; - gUnknown_020375B8[16]++; - ableToStore = TRUE; - } - } - - if (ableToStore == TRUE) - { - mapObject->mapobj_bit_12 = TRUE; - mapObject->mapobj_bit_9 = TRUE; - } - - sprite->data[2] = 1; - return TRUE; -} - -bool32 sub_8097EF0(struct MapObject *mapObject, struct Sprite *sprite) -{ - bool32 ableToStore; - u8 id; - - sprite->data[2] = 1; - if (gUnknown_020375B8 != NULL) - { - ableToStore = FALSE; - id = sub_8097F78(mapObject); - if (id != 16) - { - gUnknown_020375B8[id] = 0; - gUnknown_020375B8[16]--; - ableToStore = TRUE; - } - if (gUnknown_020375B8[16] == 0) - FREE_AND_SET_NULL(gUnknown_020375B8); - if (ableToStore == TRUE) - { - mapObject->mapobj_bit_12 = GetFieldObjectGraphicsInfo(mapObject->graphicsId)->inanimate; - mapObject->mapobj_bit_9 = 0; - sprite->animPaused = 0; - } - } - - return TRUE; -} - -u8 sub_8097F78(struct MapObject *mapObject) -{ - u8 i; - - for(i = 0; i < MAP_OBJECTS_COUNT; i++) - { - if(gUnknown_020375B8[i] == mapObject->localId) - return i; - } - return MAP_OBJECTS_COUNT; -} - -void sub_8097FA4(struct MapObject *mapObject) -{ - u8 taskId = CreateTask(sub_8097FE4, 0xFF); - struct Task *task = &gTasks[taskId]; - - StoreWordInTwoHalfwords(&task->data[0], (u32)mapObject); - mapObject->mapobj_unk_1B = taskId; - task->data[3] = 0xFFFF; -} - -void sub_8097FE4(u8 taskId) -{ - struct MapObject *mapObject; - struct Sprite *sprite; - struct Task *task = &gTasks[taskId]; - - LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&mapObject); // load the map object pointer. - sprite = &gSprites[mapObject->spriteId]; - - if(!(task->data[2] & 0x3)) - sprite->pos2.y += task->data[3]; - - if(!(task->data[2] & 0xF)) - task->data[3] = -task->data[3]; - - task->data[2]++; -} - -void sub_8098044(u8 taskId) -{ - u32 word; - struct Task *task = &gTasks[taskId]; - - LoadWordFromTwoHalfwords(&task->data[0], &word); // huh??? why does it load a word that never gets used??? - DestroyTask(taskId); -} - -void sub_8098074(u8 var1, u8 var2) -{ - u8 i; - - for(i = 0; i < MAP_OBJECTS_COUNT; i++) - { - if(i != var1 && i != var2 && - gMapObjects[i].active && i != gPlayerAvatar.mapObjectId) - FreezeMapObject(&gMapObjects[i]); - } -} - -bool32 sub_80980C0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->pos2.y = 0; - sprite->data[2]++; - return FALSE; -} - -bool32 sub_80980D0(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->pos2.y -= 8; - - if(sprite->pos2.y == -160) - sprite->data[2]++; - return FALSE; -} - -bool32 sub_80980F4(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->pos2.y = -160; - sprite->data[2]++; - return FALSE; -} - -bool32 sub_8098108(struct MapObject *mapObject, struct Sprite *sprite) -{ - sprite->pos2.y += 8; - - if(!sprite->pos2.y) - sprite->data[2]++; - return FALSE; -} - -// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it. -bool32 sub_8098124(struct MapObject *mapObject, struct Sprite *sprite) -{ - return TRUE; -} diff --git a/src/field_region_map.c b/src/field_region_map.c index b7d677c90..f56548068 100644 --- a/src/field_region_map.c +++ b/src/field_region_map.c @@ -63,7 +63,7 @@ static const struct WindowTemplate gUnknown_085E5070[] = { // .text -void sub_817018C(MainCallback callback) +void FieldInitRegionMap(MainCallback callback) { SetVBlankCallback(NULL); sFieldRegionMapHandler = malloc(sizeof(*sFieldRegionMapHandler)); @@ -89,7 +89,7 @@ static void MCB2_InitRegionMapRegisters(void) InitBgsFromTemplates(1, gUnknown_085E5068, 2); InitWindows(gUnknown_085E5070); DeactivateAllTextPrinters(); - sub_809882C(0, 0x27, 0xd0); + LoadUserWindowBorderGfx(0, 0x27, 0xd0); clear_scheduled_bg_copies_to_vram(); SetMainCallback2(MCB2_FieldUpdateRegionMap); SetVBlankCallback(VBCB_FieldUpdateRegionMap); @@ -130,7 +130,7 @@ static void FieldUpdateRegionMap(void) schedule_bg_copy_tilemap_to_vram(0); SetWindowBorderStyle(0, 0, 0x27, 0xd); PrintRegionMapSecName(); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); sFieldRegionMapHandler->state++; break; case 2: @@ -158,7 +158,7 @@ static void FieldUpdateRegionMap(void) } break; case 5: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); sFieldRegionMapHandler->state++; break; case 6: diff --git a/src/field_special_scene.c b/src/field_special_scene.c index a704beaab..6f33b2c9b 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -1,7 +1,7 @@ #include "global.h" #include "task.h" #include "sprite.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "constants/songs.h" #include "sound.h" #include "palette.h" @@ -272,7 +272,7 @@ bool8 sub_80FB59C(void) void Task_HandlePorthole(u8 taskId) { s16 *data = gTasks[taskId].data; - u16 *var = GetVarPointer(VAR_PORTHOLE); + u16 *var = GetVarPointer(VAR_PORTHOLE_STATE); struct WarpData *location = &gSaveBlock1Ptr->location; switch (data[0]) @@ -329,24 +329,24 @@ void Task_HandlePorthole(u8 taskId) void sub_80FB6EC(void) { - u8 spriteId = AddPseudoFieldObject(0x8C, SpriteCallbackDummy, 112, 80, 0); + u8 spriteId = AddPseudoEventObject(0x8C, SpriteCallbackDummy, 112, 80, 0); gSprites[spriteId].coordOffsetEnabled = FALSE; if (VarGet(0x40B4) == 2) { - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(4)); + StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(4)); } else { - StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(3)); + StartSpriteAnim(&gSprites[spriteId], GetFaceDirectionAnimNum(3)); } } void sub_80FB768(void) { sub_80FB6EC(); - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = TRUE; + gEventObjects[gPlayerAvatar.eventObjectId].invisible = TRUE; pal_fill_black(); CreateTask(Task_HandlePorthole, 80); ScriptContext2_Enable(); diff --git a/src/field_specials.c b/src/field_specials.c new file mode 100644 index 000000000..897bcc8d7 --- /dev/null +++ b/src/field_specials.c @@ -0,0 +1,4329 @@ +#include "global.h" +#include "main.h" +#include "battle.h" +#include "battle_tower.h" +#include "cable_club.h" +#include "data2.h" +#include "decoration.h" +#include "diploma.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "field_effect.h" +#include "field_message_box.h" +#include "field_player_avatar.h" +#include "field_region_map.h" +#include "field_screen.h" +#include "field_specials.h" +#include "field_weather.h" +#include "international_string_util.h" +#include "item_icon.h" +#include "link.h" +#include "list_menu.h" +#include "malloc.h" +#include "match_call.h" +#include "menu.h" +#include "overworld.h" +#include "party_menu.h" +#include "pokeblock.h" +#include "pokemon.h" +#include "pokemon_storage_system.h" +#include "random.h" +#include "rayquaza_scene.h" +#include "region_map.h" +#include "rom_8011DC0.h" +#include "rtc.h" +#include "script.h" +#include "script_menu.h" +#include "sound.h" +#include "starter_choose.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "text.h" +#include "tv.h" +#include "wallclock.h" +#include "window.h" +#include "constants/event_objects.h" +#include "constants/items.h" +#include "constants/maps.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "constants/moves.h" +#include "constants/vars.h" + +EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE; +EWRAM_DATA u8 gBikeCollisions = 0; +EWRAM_DATA u32 gBikeCyclingTimer = 0; +EWRAM_DATA u8 gUnknown_0203AB5C = 0; +EWRAM_DATA u8 gUnknown_0203AB5D = 0; +EWRAM_DATA u8 gUnknown_0203AB5E = 0; +EWRAM_DATA u16 gUnknown_0203AB60 = 0; +EWRAM_DATA u16 gUnknown_0203AB62 = 0; +EWRAM_DATA struct ListMenuItem *gUnknown_0203AB64 = NULL; +EWRAM_DATA u16 gUnknown_0203AB68 = 0; +EWRAM_DATA u16 gUnknown_0203AB6A = 0; +EWRAM_DATA u8 gUnknown_0203AB6C = 0; +EWRAM_DATA u8 gUnknown_0203AB6D = 0; +EWRAM_DATA u8 gUnknown_0203AB6E = 0; +EWRAM_DATA u8 gUnknown_0203AB6F = 0; +EWRAM_DATA u32 gUnknown_0203AB70 = 0; + +struct ListMenuTemplate gUnknown_030061D0; + +extern const u16 gEventObjectPalette8[]; +extern const u16 gEventObjectPalette17[]; +extern const u16 gEventObjectPalette33[]; +extern const u16 gEventObjectPalette34[]; + +extern void LoadPalette(const void *src, u32 offset, u16 size); // incorrect signature, needed to match +extern void BlendPalettes(u32, u8, u16); + +void UpdateMovedLilycoveFanClubMembers(void); +void sub_813BF60(void); +u16 GetNumMovedLilycoveFanClubMembers(void); + +static void RecordCyclingRoadResults(u32, u8); +static void LoadLinkPartnerEventObjectSpritePalette(u8 graphicsId, u8 localEventId, u8 paletteNum); +static void Task_PetalburgGym(u8); +static void PetalburgGymFunc(u8, u16); +static void Task_PCTurnOnEffect(u8); +static void PCTurnOnEffect_0(struct Task *); +static void PCTurnOnEffect_1(s16, s8, s8); +static void PCTurnOffEffect(void); +static void Task_LotteryCornerComputerEffect(u8); +static void LotteryCornerComputerEffect(struct Task *); +static void sub_81395BC(u8 taskId); +static void sub_8139620(u8 taskId); +static void sub_8139AF4(u8 taskId); +static void sub_8139C2C(u16 a1, u8 a2); +static void sub_8139C80(u8 taskId); +static void sub_813A2DC(u8 taskId); +static void sub_813AA60(u16 a0, u16 a1); +static void sub_813ACE8(u8 a0, u16 a1); +static void sub_813A42C(void); +static void sub_813A4EC(u8 taskId); +static void sub_813A694(u8 taskId); +static void sub_813A46C(s32 itemIndex, bool8 onInit, struct ListMenu *list); +static void sub_813AC44(u16 a0, u16 a1); +static void sub_813AD34(u8 a0, u16 a1); +static void sub_813A570(u8 taskId); +static void sub_813A738(u8 taskId); +static void sub_813A600(u8 taskId); +static void sub_813A664(u8 taskId); +static void sub_813ABD4(u16 a0); +static void task_deoxys_sound(u8 taskId); +static void sub_813B0B4(u8 a0); +static void sub_813B160(u8 taskId); +static void sub_813B57C(u8 taskId); +static void sub_813B824(u8 taskId); +static void _fwalk(u8 taskId); +static u8 sub_813BF44(void); +static void sub_813BD84(void); +static u16 sub_813BB74(void); +static void sub_813BE30(struct LinkBattleRecords *linkRecords, u8 a, u8 b); + +void Special_ShowDiploma(void) +{ + SetMainCallback2(CB2_ShowDiploma); + ScriptContext2_Enable(); +} + +void Special_ViewWallClock(void) +{ + gMain.savedCallback = CB2_ReturnToField; + SetMainCallback2(CB2_ViewWallClock); + ScriptContext2_Enable(); +} + +void ResetCyclingRoadChallengeData(void) +{ + gBikeCyclingChallenge = FALSE; + gBikeCollisions = 0; + gBikeCyclingTimer = 0; +} + +void Special_BeginCyclingRoadChallenge(void) +{ + gBikeCyclingChallenge = TRUE; + gBikeCollisions = 0; + gBikeCyclingTimer = gMain.vblankCounter1; +} + +u16 GetPlayerAvatarBike(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE)) + return 1; + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) + return 2; + return 0; +} + +static void DetermineCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) +{ + u8 result; + + if (numBikeCollisions < 100) + { + ConvertIntToDecimalStringN(gStringVar1, numBikeCollisions, STR_CONV_MODE_LEFT_ALIGN, 2); + StringAppend(gStringVar1, gText_SpaceTimes); + } + else + { + StringCopy(gStringVar1, gText_99TimesPlus); + } + + if (numFrames < 3600) + { + ConvertIntToDecimalStringN(gStringVar2, numFrames / 60, STR_CONV_MODE_RIGHT_ALIGN, 2); + gStringVar2[2] = CHAR_PERIOD; + ConvertIntToDecimalStringN(&gStringVar2[3], ((numFrames % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(gStringVar2, gText_SpaceSeconds); + } + else + { + StringCopy(gStringVar2, gText_1MinutePlus); + } + + result = 0; + if (numBikeCollisions == 0) + { + result = 5; + } + else if (numBikeCollisions < 4) + { + result = 4; + } + else if (numBikeCollisions < 10) + { + result = 3; + } + else if (numBikeCollisions < 20) + { + result = 2; + } + else if (numBikeCollisions < 100) + { + result = 1; + } + + if (numFrames / 60 <= 10) + { + result += 5; + } + else if (numFrames / 60 <= 15) + { + result += 4; + } + else if (numFrames / 60 <= 20) + { + result += 3; + } + else if (numFrames / 60 <= 40) + { + result += 2; + } + else if (numFrames / 60 < 60) + { + result += 1; + } + + + gSpecialVar_Result = result; +} + +void FinishCyclingRoadChallenge(void) { + const u32 numFrames = gMain.vblankCounter1 - gBikeCyclingTimer; + + DetermineCyclingRoadResults(numFrames, gBikeCollisions); + RecordCyclingRoadResults(numFrames, gBikeCollisions); +} + +static void RecordCyclingRoadResults(u32 numFrames, u8 numBikeCollisions) { + u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); + u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); + u32 framesRecord = low + (high << 16); + + if (framesRecord > numFrames || framesRecord == 0) + { + VarSet(VAR_CYCLING_ROAD_RECORD_TIME_L, numFrames); + VarSet(VAR_CYCLING_ROAD_RECORD_TIME_H, numFrames >> 16); + VarSet(VAR_CYCLING_ROAD_RECORD_COLLISIONS, numBikeCollisions); + } +} + +u16 GetRecordedCyclingRoadResults(void) { + u16 low = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_L); + u16 high = VarGet(VAR_CYCLING_ROAD_RECORD_TIME_H); + u32 framesRecord = low + (high << 16); + + if (framesRecord == 0) + { + return FALSE; + } + + DetermineCyclingRoadResults(framesRecord, VarGet(VAR_CYCLING_ROAD_RECORD_COLLISIONS)); + return TRUE; +} + +void UpdateCyclingRoadState(void) { + if (gUnknown_020322DC.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) && gUnknown_020322DC.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE)) + { + return; + } + + if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3) + { + VarSet(VAR_CYCLING_CHALLENGE_STATE, 0); + Overworld_SetSavedMusic(MUS_DUMMY); + } +} + +void SetSSTidalFlag(void) +{ + FlagSet(FLAG_SYS_CRUISE_MODE); + *GetVarPointer(VAR_CRUISE_STEP_COUNT) = 0; +} + +void ResetSSTidalFlag(void) +{ + FlagClear(FLAG_SYS_CRUISE_MODE); +} + +bool32 CountSSTidalStep(u16 delta) +{ + if (!FlagGet(FLAG_SYS_CRUISE_MODE) || (*GetVarPointer(VAR_CRUISE_STEP_COUNT) += delta) <= 0xcc) + { + return FALSE; + } + return TRUE; +} + +u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) +{ + u16 *varCruiseStepCount = GetVarPointer(VAR_CRUISE_STEP_COUNT); + switch (*GetVarPointer(VAR_PORTHOLE_STATE)) + { + case 1: + case 8: + return 1; + case 3: + case 9: + return 4; + case 4: + case 5: + return 2; + case 6: + case 10: + return 3; + case 2: + if (*varCruiseStepCount < 60) + { + *mapNum = MAP_NUM(ROUTE134); + *x = *varCruiseStepCount + 19; + } + else if (*varCruiseStepCount < 140) + { + *mapNum = MAP_NUM(ROUTE133); + *x = *varCruiseStepCount - 60; + } + else + { + *mapNum = MAP_NUM(ROUTE132); + *x = *varCruiseStepCount - 140; + } + break; + case 7: + if (*varCruiseStepCount < 66) + { + *mapNum = MAP_NUM(ROUTE132); + *x = 65 - *varCruiseStepCount; + } + else if (*varCruiseStepCount < 146) { + *mapNum = MAP_NUM(ROUTE133); + *x = 145 - *varCruiseStepCount; + } + else + { + *mapNum = MAP_NUM(ROUTE134); + *x = 224 - *varCruiseStepCount; + } + break; + } + *mapGroup = MAP_GROUP(ROUTE132); + *y = 20; + return 0; +} + +bool32 is_tile_that_overrides_player_control(void) +{ + if (FlagGet(FLAG_0x088)) + { + switch (gMapHeader.mapType) + { + case 1: + case 2: + case 3: + case 6: + if (++(*GetVarPointer(VAR_0x40F2)) < 0xFA) + { + return FALSE; + } + break; + default: + return FALSE; + } + } + else + { + return FALSE; + } + + return TRUE; +} + +bool32 sub_8138120(void) +{ + if (FlagGet(FLAG_0x08A)) + { + switch (gMapHeader.mapType) + { + case 1: + case 2: + case 3: + case 6: + if (++(*GetVarPointer(VAR_0x40F3)) < 0xA) + { + return FALSE; + } + break; + default: + return FALSE; + } + } + else + { + return FALSE; + } + + return TRUE; +} + +bool32 sub_8138168(void) +{ + if (FlagGet(FLAG_0x072)) + { + switch (gMapHeader.mapType) + { + case 1: + case 2: + case 3: + case 6: + if (++(*GetVarPointer(VAR_0x40F5)) < 0xA) + { + return FALSE; + } + break; + default: + return FALSE; + } + } + else + { + return FALSE; + } + + return TRUE; +} + +bool32 sub_81381B0(void) +{ + if (FlagGet(FLAG_0x080)) + { + switch (gMapHeader.mapType) + { + case 1: + case 2: + case 3: + case 6: + if (++(*GetVarPointer(VAR_0x40F4)) < 0xFA) + { + return FALSE; + } + break; + default: + return FALSE; + } + } + else + { + return FALSE; + } + + return TRUE; +} + +bool32 sub_81381F8(void) +{ + if (FlagGet(FLAG_0x075)) + { + switch (gMapHeader.mapType) + { + case 1: + case 2: + case 3: + case 6: + if (++(*GetVarPointer(VAR_0x40F6)) < 0xFA) + { + return FALSE; + } + break; + default: + return FALSE; + } + } + else + { + return FALSE; + } + + return TRUE; +} + +u8 GetLinkPartnerNames(void) +{ + u8 i; + u8 j = 0; + u8 myLinkPlayerNumber = GetMultiplayerId(); + u8 nLinkPlayers = GetLinkPlayerCount(); + for (i = 0; i < nLinkPlayers; i++) + { + if (myLinkPlayerNumber != i) + { + StringCopy(gTVStringVarPtrs[j], gLinkPlayers[i].name); + j++; + } + } + return nLinkPlayers; +} + +void SpawnLinkPartnerEventObject(void) +{ + u8 j = 0; + s16 x = 0; + s16 y = 0; + u8 gUnknown_085B2B5C[] = {7, 9, 8, 10}; + s8 gUnknown_085B2B60[][2] = { + { 0, 1}, + { 1, 0}, + { 0, -1}, + {-1, 0} + }; + u8 myLinkPlayerNumber; + u8 playerFacingDirection; + u8 linkSpriteId; + u8 i; + + myLinkPlayerNumber = GetMultiplayerId(); + playerFacingDirection = GetPlayerFacingDirection(); + switch (playerFacingDirection) + { + case DIR_WEST: + j = 2; + x = gSaveBlock1Ptr->pos.x - 1; + y = gSaveBlock1Ptr->pos.y; + break; + case DIR_NORTH: + j = 1; + x = gSaveBlock1Ptr->pos.x; + y = gSaveBlock1Ptr->pos.y - 1; + break; + case DIR_EAST: + x = gSaveBlock1Ptr->pos.x + 1; + y = gSaveBlock1Ptr->pos.y; + break; + case DIR_SOUTH: + j = 3; + x = gSaveBlock1Ptr->pos.x; + y = gSaveBlock1Ptr->pos.y + 1; + } + for (i = 0; i < gSpecialVar_0x8004; i++) + { + if (myLinkPlayerNumber != i) + { + switch ((u8)gLinkPlayers[i].version) + { + case VERSION_RUBY: + case VERSION_SAPPHIRE: + if (gLinkPlayers[i].gender == 0) + linkSpriteId = EVENT_OBJ_GFX_LINK_RS_BRENDAN; + else + linkSpriteId = EVENT_OBJ_GFX_LINK_RS_MAY; + break; + case VERSION_EMERALD: + if (gLinkPlayers[i].gender == 0) + linkSpriteId = EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL; + else + linkSpriteId = EVENT_OBJ_GFX_RIVAL_MAY_NORMAL; + break; + default: + if (gLinkPlayers[i].gender == 0) + linkSpriteId = EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL; + else + linkSpriteId = EVENT_OBJ_GFX_RIVAL_MAY_NORMAL; + break; + } + SpawnSpecialEventObjectParameterized(linkSpriteId, gUnknown_085B2B5C[j], 0xf0 - i, gUnknown_085B2B60[j][0] + x + 7, gUnknown_085B2B60[j][1] + y + 7, 0); + LoadLinkPartnerEventObjectSpritePalette(linkSpriteId, 0xf0 - i, i); + j++; + if (j == 4) + { + j = 0; + } + } + } +} + +static void LoadLinkPartnerEventObjectSpritePalette(u8 graphicsId, u8 localEventId, u8 paletteNum) +{ + paletteNum += 6; + if (graphicsId == EVENT_OBJ_GFX_LINK_RS_BRENDAN || + graphicsId == EVENT_OBJ_GFX_LINK_RS_MAY || + graphicsId == EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL || + graphicsId == EVENT_OBJ_GFX_RIVAL_MAY_NORMAL) + { + u8 obj = GetEventObjectIdByLocalIdAndMap(localEventId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + if (obj != NUM_EVENT_OBJECTS) + { + u8 spriteId = gEventObjects[obj].spriteId; + struct Sprite *sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = paletteNum; + + switch (graphicsId) + { + case EVENT_OBJ_GFX_LINK_RS_BRENDAN: + LoadPalette(gEventObjectPalette33, 0x100 + paletteNum * 16, 0x20); + break; + case EVENT_OBJ_GFX_LINK_RS_MAY: + LoadPalette(gEventObjectPalette34, 0x100 + paletteNum * 16, 0x20); + break; + case EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL: + LoadPalette(gEventObjectPalette8, 0x100 + paletteNum * 16, 0x20); + break; + case EVENT_OBJ_GFX_RIVAL_MAY_NORMAL: + LoadPalette(gEventObjectPalette17, 0x100 + paletteNum * 16, 0x20); + break; + } + } + } +} + +static const struct UCoords8 gUnknown_085B2B68[] = { + { 7, 22}, + {11, 19}, + {10, 16}, + {15, 16} +}; + +void MauvilleGymSpecial1(void) +{ + u8 i; + for (i = 0; i < ARRAY_COUNT(gUnknown_085B2B68); i++) + { + if (i == gSpecialVar_0x8004) + { + MapGridSetMetatileIdAt(gUnknown_085B2B68[i].x, gUnknown_085B2B68[i].y, 0x206); + } + else + { + MapGridSetMetatileIdAt(gUnknown_085B2B68[i].x, gUnknown_085B2B68[i].y, 0x205); + } + } +} + +void MauvilleGymSpecial2(void) +{ + int x, y; + for (y = 12; y < 24; y++) + { + for (x = 7; x < 16; x++) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x220: + MapGridSetMetatileIdAt(x, y, 0x230); + break; + case 0x221: + MapGridSetMetatileIdAt(x, y, 0x231); + break; + case 0x228: + MapGridSetMetatileIdAt(x, y, 0x238); + break; + case 0x229: + MapGridSetMetatileIdAt(x, y, 0x239); + break; + case 0x230: + MapGridSetMetatileIdAt(x, y, 0x220); + break; + case 0x231: + MapGridSetMetatileIdAt(x, y, 0x221); + break; + case 0x238: + MapGridSetMetatileIdAt(x, y, 0xe28); + break; + case 0x239: + MapGridSetMetatileIdAt(x, y, 0xe29); + break; + case 0x222: + MapGridSetMetatileIdAt(x, y, 0x232); + break; + case 0x223: + MapGridSetMetatileIdAt(x, y, 0x233); + break; + case 0x22a: + MapGridSetMetatileIdAt(x, y, 0x23a); + break; + case 0x22b: + MapGridSetMetatileIdAt(x, y, 0x23b); + break; + case 0x232: + MapGridSetMetatileIdAt(x, y, 0x222); + break; + case 0x233: + MapGridSetMetatileIdAt(x, y, 0x223); + break; + case 0x23a: + MapGridSetMetatileIdAt(x, y, 0xe2a); + break; + case 0x23b: + MapGridSetMetatileIdAt(x, y, 0xe2b); + break; + case 0x240: + MapGridSetMetatileIdAt(x, y, 0xe42); + break; + case 0x248: + MapGridSetMetatileIdAt(x, y, 0x21a); + break; + case 0x241: + MapGridSetMetatileIdAt(x, y, 0xe43); + break; + case 0x249: + MapGridSetMetatileIdAt(x, y, 0x21a); + break; + case 0x242: + MapGridSetMetatileIdAt(x, y, 0xe40); + break; + case 0x21a: + if (MapGridGetMetatileIdAt(x, y - 1) == 0x240) + { + MapGridSetMetatileIdAt(x, y, 0xe48); + } + else + { + MapGridSetMetatileIdAt(x, y, 0xe49); + } + break; + case 0x243: + MapGridSetMetatileIdAt(x, y, 0xe41); + break; + case 0x251: + MapGridSetMetatileIdAt(x, y, 0xe50); + break; + case 0x250: + MapGridSetMetatileIdAt(x, y, 0x251); + break; + } + } + } +} + +void MauvilleGymSpecial3(void) +{ + int i, x, y; + const struct UCoords8 *switchCoords = gUnknown_085B2B68; + for (i = ARRAY_COUNT(gUnknown_085B2B68) - 1; i >= 0; i--) + { + MapGridSetMetatileIdAt(switchCoords->x, switchCoords->y, 0x206); + switchCoords++; + } + for (y = 12; y < 24; y++) + { + for (x = 7; x < 16; x++) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x220: + MapGridSetMetatileIdAt(x, y, 0x230); + break; + case 0x221: + MapGridSetMetatileIdAt(x, y, 0x231); + break; + case 0x228: + MapGridSetMetatileIdAt(x, y, 0x238); + break; + case 0x229: + MapGridSetMetatileIdAt(x, y, 0x239); + break; + case 0x222: + MapGridSetMetatileIdAt(x, y, 0x232); + break; + case 0x223: + MapGridSetMetatileIdAt(x, y, 0x233); + break; + case 0x22a: + MapGridSetMetatileIdAt(x, y, 0x23a); + break; + case 0x22b: + MapGridSetMetatileIdAt(x, y, 0x23b); + break; + case 0x240: + MapGridSetMetatileIdAt(x, y, 0xe42); + break; + case 0x241: + MapGridSetMetatileIdAt(x, y, 0xe43); + break; + case 0x248: + case 0x249: + MapGridSetMetatileIdAt(x, y, 0x21a); + break; + case 0x250: + MapGridSetMetatileIdAt(x, y, 0x251); + break; + } + } + } +} + +static const u8 gUnknown_085B2B78[] = {0, 1, 1, 1, 1}; +static const u16 gUnknown_085B2B7E[] = {0x218, 0x219, 0x21a, 0x21b, 0x21c}; + +void PetalburgGymSpecial1(void) +{ + gUnknown_0203AB5C = 0; + gUnknown_0203AB5D = 0; + PlaySE(SE_KI_GASYAN); + CreateTask(Task_PetalburgGym, 8); +} + +static void Task_PetalburgGym(u8 taskId) +{ + if (gUnknown_085B2B78[gUnknown_0203AB5D] == gUnknown_0203AB5C) + { + PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_085B2B7E[gUnknown_0203AB5D]); + gUnknown_0203AB5C = 0; + if ((++gUnknown_0203AB5D) == 5) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } + } + else + { + gUnknown_0203AB5C++; + } +} + +static void PetalburgGymFunc(u8 a0, u16 a1) +{ + u16 x[4]; + u16 y[4]; + u8 i; + u8 nDoors = 0; + switch (a0) + { + case 1: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x68; + y[1] = 0x68; + break; + case 2: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x4e; + y[1] = 0x4e; + break; + case 3: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x5b; + y[1] = 0x5b; + break; + case 4: + nDoors = 1; + x[0] = 7; + y[0] = 0x27; + break; + case 5: + nDoors = 2; + x[0] = 1; + x[1] = 7; + y[0] = 0x34; + y[1] = 0x34; + break; + case 6: + nDoors = 1; + x[0] = 1; + y[0] = 0x41; + break; + case 7: + nDoors = 1; + x[0] = 7; + y[0] = 0xd; + break; + case 8: + nDoors = 1; + x[0] = 1; + y[0] = 0x1a; + break; + } + for (i = 0; i < nDoors; i++) + { + MapGridSetMetatileIdAt(x[i] + 7, y[i] + 7, a1 | 0xc00); + MapGridSetMetatileIdAt(x[i] + 7, y[i] + 8, (a1 + 8) | 0xc00); + } + DrawWholeMapView(); +} + +void PetalburgGymSpecial2(void) +{ + PetalburgGymFunc(gSpecialVar_0x8004, gUnknown_085B2B7E[4]); +} + +void ShowFieldMessageStringVar4(void) +{ + ShowFieldMessage(gStringVar4); +} + +void StorePlayerCoordsInVars(void) +{ + gSpecialVar_0x8004 = gSaveBlock1Ptr->pos.x; + gSpecialVar_0x8005 = gSaveBlock1Ptr->pos.y; +} + +u8 GetPlayerTrainerIdOnesDigit(void) +{ + return (u16)((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]) % 10; +} + +void GetPlayerBigGuyGirlString(void) +{ + if (gSaveBlock2Ptr->playerGender == MALE) + { + StringCopy(gStringVar1, gText_BigGuy); + } + else + { + StringCopy(gStringVar1, gText_BigGirl); + } +} + +void GetRivalSonDaughterString(void) +{ + if (gSaveBlock2Ptr->playerGender == MALE) + { + StringCopy(gStringVar1, gText_Daughter); + } + else + { + StringCopy(gStringVar1, gText_Son); + } +} + +u8 GetBattleOutcome(void) +{ + return gBattleOutcome; +} + +void CableCarWarp(void) +{ + if (gSpecialVar_0x8004 != 0) + { + Overworld_SetWarpDestination(MAP_GROUP(ROUTE112_CABLE_CAR_STATION), MAP_NUM(ROUTE112_CABLE_CAR_STATION), -1, 6, 4); + } + else + { + Overworld_SetWarpDestination(MAP_GROUP(MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MT_CHIMNEY_CABLE_CAR_STATION), -1, 6, 4); + } +} + +void SetFlagInVar(void) +{ + FlagSet(gSpecialVar_0x8004); +} + +u16 GetWeekCount(void) +{ + u16 weekCount = gLocalTime.days / 7; + if (weekCount > 9999) + { + weekCount = 9999; + } + return weekCount; +} + +u8 GetLeadMonFriendshipScore(void) +{ + struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()]; + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255) + { + return 6; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200) + { + return 5; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150) + { + return 4; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100) + { + return 3; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50) + { + return 2; + } + if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1) + { + return 1; + } + return 0; +} + +static void CB2_FieldShowRegionMap(void) +{ + FieldInitRegionMap(CB2_ReturnToFieldContinueScriptPlayMapMusic); +} + +void FieldShowRegionMap(void) +{ + SetMainCallback2(CB2_FieldShowRegionMap); +} + +void DoPCTurnOnEffect(void) +{ + if (FuncIsActiveTask(Task_PCTurnOnEffect) != TRUE) + { + u8 taskId = CreateTask(Task_PCTurnOnEffect, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +static void Task_PCTurnOnEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] == 0) + { + PCTurnOnEffect_0(task); + } +} + +static void PCTurnOnEffect_0(struct Task *task) +{ + u8 playerDirection; + s8 dx = 0; + s8 dy = 0; + if (task->data[3] == 6) + { + task->data[3] = 0; + playerDirection = GetPlayerFacingDirection(); + switch (playerDirection) + { + case DIR_NORTH: + dx = 0; + dy = -1; + break; + case DIR_WEST: + dx = -1; + dy = -1; + break; + case DIR_EAST: + dx = 1; + dy = -1; + break; + } + PCTurnOnEffect_1(task->data[4], dx, dy); + DrawWholeMapView(); + task->data[4] ^= 1; + if ((++task->data[2]) == 5) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +static void PCTurnOnEffect_1(s16 flag, s8 dx, s8 dy) +{ + u16 tileId = 0; + if (flag != 0) + { + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x4; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x25a; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x259; + } + } + else + { + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x5; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x27f; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x27e; + } + } + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + 7, gSaveBlock1Ptr->pos.y + dy + 7, tileId | 0xc00); +} + +void DoPCTurnOffEffect(void) +{ + PCTurnOffEffect(); +} + +static void PCTurnOffEffect(void) +{ + s8 dx = 0; + s8 dy = 0; + u16 tileId = 0; + u8 playerDirection = GetPlayerFacingDirection(); + switch (playerDirection) + { + case DIR_NORTH: + dx = 0; + dy = -1; + break; + case DIR_WEST: + dx = -1; + dy = -1; + break; + case DIR_EAST: + dx = 1; + dy = -1; + break; + } + if (gSpecialVar_0x8004 == 0) + { + tileId = 0x4; + } + else if (gSpecialVar_0x8004 == 1) + { + tileId = 0x25a; + } + else if (gSpecialVar_0x8004 == 2) + { + tileId = 0x259; + } + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + dx + 7, gSaveBlock1Ptr->pos.y + dy + 7, tileId | 0xc00); + DrawWholeMapView(); +} + +void DoLotteryCornerComputerEffect(void) +{ + if (FuncIsActiveTask(Task_LotteryCornerComputerEffect) != TRUE) + { + u8 taskId = CreateTask(Task_LotteryCornerComputerEffect, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = taskId; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + } +} + +static void Task_LotteryCornerComputerEffect(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] == 0) + { + LotteryCornerComputerEffect(task); + } +} + +static void LotteryCornerComputerEffect(struct Task *task) +{ + if (task->data[3] == 6) + { + task->data[3] = 0; + if (task->data[4] != 0) + { + MapGridSetMetatileIdAt(18, 8, 0xe9d); + MapGridSetMetatileIdAt(18, 9, 0xea5); + } + else + { + MapGridSetMetatileIdAt(18, 8, 0xe58); + MapGridSetMetatileIdAt(18, 9, 0xe60); + } + DrawWholeMapView(); + task->data[4] ^= 1; + if ((++task->data[2]) == 5) + { + DestroyTask(task->data[1]); + } + } + task->data[3]++; +} + +void EndLotteryCornerComputerEffect(void) +{ + MapGridSetMetatileIdAt(18, 8, 0xe9d); + MapGridSetMetatileIdAt(18, 9, 0xea5); + DrawWholeMapView(); +} + +void SetTrickHouseEndRoomFlag(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_0x1F5; + *specVar = flag; + FlagSet(flag); +} + +void ResetTrickHouseEndRoomFlag(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_0x1F5; + *specVar = flag; + FlagClear(flag); +} + +bool8 CheckLeadMonCool(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_COOL) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonBeauty(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_BEAUTY) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonCute(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_CUTE) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonSmart(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_SMART) < 200) + { + return FALSE; + } + return TRUE; +} + +bool8 CheckLeadMonTough(void) +{ + if (GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_TOUGH) < 200) + { + return FALSE; + } + return TRUE; +} + +void IsGrassTypeInParty(void) +{ + u8 i; + u16 species; + struct Pokemon *pokemon; + for (i = 0; i < PARTY_SIZE; i++) + { + pokemon = &gPlayerParty[i]; + if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && !GetMonData(pokemon, MON_DATA_IS_EGG)) + { + species = GetMonData(pokemon, MON_DATA_SPECIES); + if (gBaseStats[species].type1 == TYPE_GRASS || gBaseStats[species].type2 == TYPE_GRASS) + { + gSpecialVar_Result = TRUE; + return; + } + } + } + gSpecialVar_Result = FALSE; +} + +void SpawnScriptEventObject(void) +{ + u8 obj = SpawnSpecialEventObjectParameterized(EVENT_OBJ_GFX_BOY_1, 8, 0x7F, gSaveBlock1Ptr->pos.x + 7, gSaveBlock1Ptr->pos.y + 7, 3); + gEventObjects[obj].invisible = TRUE; + CameraObjectSetFollowedObjectId(gEventObjects[obj].spriteId); +} + +void RemoveScriptEventObject(void) +{ + CameraObjectSetFollowedObjectId(GetPlayerAvatarObjectId()); + RemoveEventObjectByLocalIdAndMap(0x7F, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); +} + +u8 GetPokeblockNameByMonNature(void) +{ + return CopyMonFavoritePokeblockName(GetNature(&gPlayerParty[GetLeadMonIndex()]), gStringVar1); +} + +void GetSecretBaseNearbyMapName(void) +{ + GetMapName(gStringVar1, VarGet(VAR_SECRET_BASE_MAP), 0); +} + +u16 GetBestBattleTowerStreak(void) +{ + return GetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK); +} + +void BufferEReaderTrainerName(void) +{ + GetEreaderTrainerName(gStringVar1); +} + +u16 GetSlotMachineId(void) +{ + static const u8 gUnknown_085B2B88[] = {12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6}; + static const u8 gUnknown_085B2B94[] = {0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5}; + static const u8 gUnknown_085B2BA0[] = {3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5}; + + u32 v0 = gSaveBlock1Ptr->easyChatPairs[0].unk0_0 + gSaveBlock1Ptr->easyChatPairs[0].unk2 + gUnknown_085B2B88[gSpecialVar_0x8004]; + if (GetPriceReduction(2)) + { + return gUnknown_085B2BA0[v0 % 12]; + } + return gUnknown_085B2B94[v0 % 12]; +} + +bool8 FoundAbandonedShipRoom1Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_1F; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 FoundAbandonedShipRoom2Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_20; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 FoundAbandonedShipRoom4Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_21; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 FoundAbandonedShipRoom6Key(void) +{ + u16 *specVar = &gSpecialVar_0x8004; + u16 flag = FLAG_HIDDEN_ITEM_22; + *specVar = flag; + if (!FlagGet(flag)) + { + return FALSE; + } + return TRUE; +} + +bool8 LeadMonHasEffortRibbon(void) +{ + return GetMonData(&gPlayerParty[GetLeadMonIndex()], MON_DATA_EFFORT_RIBBON, NULL); +} + +void GiveLeadMonEffortRibbon(void) +{ + bool8 ribbonSet; + struct Pokemon *leadMon; + IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS); + FlagSet(FLAG_SYS_RIBBON_GET); + ribbonSet = TRUE; + leadMon = &gPlayerParty[GetLeadMonIndex()]; + SetMonData(leadMon, MON_DATA_EFFORT_RIBBON, &ribbonSet); + if (GetRibbonCount(leadMon) > 4) + { + sub_80EE4DC(leadMon, 0x47); + } +} + +bool8 Special_AreLeadMonEVsMaxedOut(void) +{ + if (GetMonEVCount(&gPlayerParty[GetLeadMonIndex()]) >= 510) + { + return TRUE; + } + return FALSE; +} + +u8 TryUpdateRusturfTunnelState(void) +{ + if (!FlagGet(FLAG_RUSTURF_TUNNEL_OPENED) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RUSTURF_TUNNEL) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(RUSTURF_TUNNEL)) + { + if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1)) + { + VarSet(VAR_RUSTURF_TUNNEL_STATE, 4); + return TRUE; + } + else if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_2)) + { + VarSet(VAR_RUSTURF_TUNNEL_STATE, 5); + return TRUE; + } + } + return FALSE; +} + +void SetShoalItemFlag(u16 v0) +{ + FlagSet(FLAG_SYS_SHOAL_ITEM); +} + +void PutZigzagoonInPlayerParty(void) +{ + u16 monData; + CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); + monData = TRUE; + SetMonData(&gPlayerParty[0], MON_DATA_ALT_ABILITY, &monData); + monData = MOVE_TACKLE; + SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, &monData); + monData = MOVE_NONE; + SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &monData); + SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &monData); +} + +bool8 IsStarterInParty(void) +{ + u8 i; + u16 starter = GetStarterPokemon(VarGet(VAR_STARTER_MON)); + u8 partyCount = CalculatePlayerPartyCount(); + for (i = 0; i < partyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == starter) + { + return TRUE; + } + } + return FALSE; +} + +bool8 ScriptCheckFreePokemonStorageSpace(void) +{ + return CheckFreePokemonStorageSpace(); +} + +bool8 IsPokerusInParty(void) +{ + if (!CheckPartyPokerus(gPlayerParty, 0x3f)) + { + return FALSE; + } + return TRUE; +} + +void sub_8139560(void) +{ + u8 taskId = CreateTask(sub_81395BC, 9); + gTasks[taskId].data[0] = gSpecialVar_0x8005; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = gSpecialVar_0x8006; + gTasks[taskId].data[3] = gSpecialVar_0x8007; + gTasks[taskId].data[4] = gSpecialVar_0x8004; + SetCameraPanningCallback(NULL); + PlaySE(SE_W070); +} + +static void sub_81395BC(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[1]++; + if (data[1] % data[3] == 0) + { + data[1] = 0; + data[2]--; + data[0] = -data[0]; + data[4] = -data[4]; + SetCameraPanning(data[0], data[4]); + if (data[2] == 0) + { + sub_8139620(taskId); + InstallCameraPanAheadCallback(); + } + } +} + +static void sub_8139620(u8 taskId) +{ + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +bool8 FoundBlackGlasses(void) +{ + return FlagGet(FLAG_HIDDEN_ITEM_BLACK_GLASSES); +} + +void SetRoute119Weather(void) +{ + if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE) + { + SetSav1Weather(20); + } +} + +void SetRoute123Weather(void) +{ + if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0()) != TRUE) + { + SetSav1Weather(21); + } +} + +u8 GetLeadMonIndex(void) +{ + u8 i; + u8 partyCount = CalculatePlayerPartyCount(); + for (i = 0; i < partyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != SPECIES_EGG && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) != 0) + { + return i; + } + } + return 0; +} + +u16 ScriptGetPartyMonSpecies(void) +{ + return GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPECIES2, NULL); +} + +void nullsub_54(void) +{ + +} + +u16 GetDaysUntilPacifidlogTMAvailable(void) +{ + u16 tmReceivedDay = VarGet(VAR_PACIFIDLOG_TM_RECEIVED_DAY); + if (gLocalTime.days - tmReceivedDay >= 7) + { + return 0; + } + else if (gLocalTime.days < 0) + { + return 8; + } + return 7 - (gLocalTime.days - tmReceivedDay); +} + +u16 SetPacifidlogTMReceivedDay(void) +{ + VarSet(VAR_PACIFIDLOG_TM_RECEIVED_DAY, gLocalTime.days); + return gLocalTime.days; +} + +bool8 MonOTNameMatchesPlayer(void) +{ + if (GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_LANGUAGE) != GAME_LANGUAGE) + { + return TRUE; // huh? + } + + GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_OT_NAME, gStringVar1); + if (!StringCompare(gSaveBlock2Ptr->playerName, gStringVar1)) + { + return FALSE; + } + return TRUE; +} + +void BufferLottoTicketNumber(void) +{ + if (gSpecialVar_Result >= 10000) + { + TV_PrintIntToStringVar(0, gSpecialVar_Result); + } + else if (gSpecialVar_Result >= 1000) + { + gStringVar1[0] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 1, gSpecialVar_Result, 0, CountDigits(gSpecialVar_Result)); + } + else if (gSpecialVar_Result >= 100) + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 2, gSpecialVar_Result, 0, CountDigits(gSpecialVar_Result)); + } + else if (gSpecialVar_Result >= 10) + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + gStringVar1[2] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 3, gSpecialVar_Result, 0, CountDigits(gSpecialVar_Result)); + } + else + { + gStringVar1[0] = CHAR_0; + gStringVar1[1] = CHAR_0; + gStringVar1[2] = CHAR_0; + gStringVar1[3] = CHAR_0; + ConvertIntToDecimalStringN(gStringVar1 + 4, gSpecialVar_Result, 0, CountDigits(gSpecialVar_Result)); + } +} + +u16 sub_813986C(void) +{ + switch (gSpecialVar_Result) + { + case 0: + return mevent_081445C0(3); + case 1: + return mevent_081445C0(4); + case 2: + return mevent_081445C0(0); + case 3: + return mevent_081445C0(1); + case 4: + return mevent_081445C0(2); + default: + return 0; + } +} + +bool8 sub_81398C0(void) +{ + if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) + { + StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_0x8004)]); + return TRUE; + } + + return FALSE; +} + +bool8 sub_813990C(void) +{ + u8 partyCount = CalculatePlayerPartyCount(); + u8 i; + + for (i = 0; i < partyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT1) == 1) + return TRUE; + } + + return FALSE; +} + +bool8 InMultiBattleRoom(void) +{ + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM) && + VarGet(VAR_0x40CE) == 2) + return TRUE; + return FALSE; +} + +void sub_8139980(void) +{ + SetCameraPanningCallback(NULL); + SetCameraPanning(8, 0); +} + +const struct WindowTemplate gUnknown_085B2BAC = { + .priority = 0, + .tilemapLeft = 21, + .tilemapTop = 1, + .width = 8, + .height = 4, + .paletteNum = 15, + .baseBlock = 8, +}; + +const u8 *const gElevatorFloorsTable[] = { + gText_B4F, + gText_B3F, + gText_B2F, + gText_B1F, + gText_1F, + gText_2F, + gText_3F, + gText_4F, + gText_5F, + gText_6F, + gText_7F, + gText_8F, + gText_9F, + gText_10F, + gText_11F, + gText_Rooftop +}; + +const u16 gUnknown_085B2BF4[] = { 0x0329, 0x032a, 0x032b, 0x0331, 0x0332, 0x0333, 0x0339, 0x033a, 0x033b }; +const u16 gUnknown_085B2C06[] = { 0x0329, 0x032b, 0x032a, 0x0331, 0x0333, 0x0332, 0x0339, 0x033b, 0x033a }; + +void SetDepartmentStoreFloorVar(void) +{ + u8 deptStoreFloor; + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): + deptStoreFloor = 4; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): + deptStoreFloor = 5; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): + deptStoreFloor = 6; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): + deptStoreFloor = 7; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): + deptStoreFloor = 8; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP): + deptStoreFloor = 15; + break; + default: + deptStoreFloor = 4; + break; + } + VarSet(VAR_DEPT_STORE_FLOOR, deptStoreFloor); +} + +u16 sub_81399F4(void) +{ + gUnknown_0203AB60 = 0; + gUnknown_0203AB62 = 0; + + if (gSaveBlock1Ptr->warp2.mapGroup == 13) + { + switch (gSaveBlock1Ptr->warp2.mapNum) + { + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): + gUnknown_0203AB60 = 0; + gUnknown_0203AB62 = 0; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): + gUnknown_0203AB60 = 0; + gUnknown_0203AB62 = 1; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): + gUnknown_0203AB60 = 0; + gUnknown_0203AB62 = 2; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): + gUnknown_0203AB60 = 0; + gUnknown_0203AB62 = 3; + break; + case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): + gUnknown_0203AB60 = 0; + gUnknown_0203AB62 = 4; + break; + } + } + + return gUnknown_0203AB62; +} + +void ShakeScreenInElevator(void) +{ + static const u8 gUnknown_085B2C18[] = { 0x08, 0x10, 0x18, 0x20, 0x26, 0x2e, 0x34, 0x38, 0x39 }; + + s16 *data = gTasks[CreateTask(sub_8139AF4, 9)].data; + u16 floorDelta; + + data[1] = 0; + data[2] = 0; + data[4] = 1; + + if (gSpecialVar_0x8005 > gSpecialVar_0x8006) + { + floorDelta = gSpecialVar_0x8005 - gSpecialVar_0x8006; + data[6] = 1; + } + else + { + floorDelta = gSpecialVar_0x8006 - gSpecialVar_0x8005; + data[6] = 0; + } + + if (floorDelta > 8) + floorDelta = 8; + + data[5] = gUnknown_085B2C18[floorDelta]; + + SetCameraPanningCallback(NULL); + sub_8139C2C(floorDelta, data[6]); + PlaySE(SE_ELEBETA); +} + +static void sub_8139AF4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[1]++; + if (data[1] % 3 == 0) + { + data[1] = 0; + data[2]++; + data[4] = -data[4]; + SetCameraPanning(0, data[4]); + if (data[2] == data[5]) + { + PlaySE(SE_PINPON); + DestroyTask(taskId); + EnableBothScriptContexts(); + InstallCameraPanAheadCallback(); + } + } +} + +void sub_8139B60(void) +{ + int xPos; + + gUnknown_0203AB5E = AddWindow(&gUnknown_085B2BAC); + SetStandardWindowBorderStyle(gUnknown_0203AB5E, 0); + + xPos = GetStringCenterAlignXOffset(1, gText_ElevatorNowOn, 64); + PrintTextOnWindow(gUnknown_0203AB5E, 1, gText_ElevatorNowOn, xPos, 1, TEXT_SPEED_FF, NULL); + + xPos = GetStringCenterAlignXOffset(1, gElevatorFloorsTable[gSpecialVar_0x8005], 64); + PrintTextOnWindow(gUnknown_0203AB5E, 1, gElevatorFloorsTable[gSpecialVar_0x8005], xPos, 17, TEXT_SPEED_FF, NULL); + + PutWindowTilemap(gUnknown_0203AB5E); + CopyWindowToVram(gUnknown_0203AB5E, 3); +} + +void sub_8139C10(void) +{ + sub_8198070(gUnknown_0203AB5E, TRUE); + RemoveWindow(gUnknown_0203AB5E); +} + +static void sub_8139C2C(u16 a1, u8 a2) +{ + static const u8 gUnknown_085B2C21[] = { 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15, 0x18, 0x1b }; + + if (FuncIsActiveTask(sub_8139C80) != TRUE) + { + u8 taskId = CreateTask(sub_8139C80, 8); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = a2; + gTasks[taskId].data[3] = gUnknown_085B2C21[a1]; + } +} + +// Annoyingly close but compiler wants to add all the parts of the index into the arrays +// first and then shift by one, whereas we need each individual part to shift and then be added. +#ifdef NONMATCHING +static void sub_8139C80(u8 taskId) +{ + u8 x, y; + s16 *data = gTasks[taskId].data; + + if (data[1] == 6) + { + data[0]++; + if (data[2] == 0) + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + MapGridSetMetatileIdAt(x + 8, y + 7, gUnknown_085B2BF4[y * 3 + data[0] % 3] | 0xC00); + } + } + } + else + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + MapGridSetMetatileIdAt(x + 8, y + 7, gUnknown_085B2C06[y * 3 + data[0] % 3] | 0xC00); + } + } + } + DrawWholeMapView(); + data[1] = 0; + if (data[0] == data[3]) + { + DestroyTask(taskId); + } + } + data[1]++; +} +#else +NAKED +static void sub_8139C80(u8 taskId) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + lsls r0, 2\n\ + ldr r1, [sp]\n\ + adds r0, r1\n\ + lsls r0, 3\n\ + ldr r1, =gTasks + 0x8\n\ + adds r6, r0, r1\n\ + movs r2, 0x2\n\ + ldrsh r0, [r6, r2]\n\ + cmp r0, 0x6\n\ + bne _08139D7C\n\ + ldrh r0, [r6]\n\ + adds r0, 0x1\n\ + strh r0, [r6]\n\ + movs r1, 0x4\n\ + ldrsh r0, [r6, r1]\n\ + cmp r0, 0\n\ + bne _08139D10\n\ + movs r1, 0\n\ + ldr r2, =gUnknown_085B2BF4\n\ + mov r10, r2\n\ +_08139CBA:\n\ + movs r5, 0\n\ + adds r7, r1, 0x7\n\ + lsls r0, r1, 1\n\ + adds r2, r1, 0x1\n\ + mov r8, r2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + mov r9, r0\n\ +_08139CCA:\n\ + adds r4, r5, 0\n\ + adds r4, 0x8\n\ + movs r1, 0\n\ + ldrsh r0, [r6, r1]\n\ + movs r1, 0x3\n\ + bl __modsi3\n\ + lsls r0, 16\n\ + asrs r0, 15\n\ + add r0, r9\n\ + add r0, r10\n\ + ldrh r0, [r0]\n\ + movs r1, 0xC0\n\ + lsls r1, 4\n\ + adds r2, r1, 0\n\ + orrs r2, r0\n\ + adds r0, r4, 0\n\ + adds r1, r7, 0\n\ + bl MapGridSetMetatileIdAt\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x2\n\ + bls _08139CCA\n\ + mov r2, r8\n\ + lsls r0, r2, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x2\n\ + bls _08139CBA\n\ + b _08139D62\n\ + .pool\n\ +_08139D10:\n\ + movs r1, 0\n\ + ldr r0, =gUnknown_085B2C06\n\ + mov r10, r0\n\ +_08139D16:\n\ + movs r5, 0\n\ + adds r7, r1, 0x7\n\ + lsls r0, r1, 1\n\ + adds r2, r1, 0x1\n\ + mov r8, r2\n\ + adds r0, r1\n\ + lsls r0, 1\n\ + mov r9, r0\n\ +_08139D26:\n\ + adds r4, r5, 0\n\ + adds r4, 0x8\n\ + movs r1, 0\n\ + ldrsh r0, [r6, r1]\n\ + movs r1, 0x3\n\ + bl __modsi3\n\ + lsls r0, 16\n\ + asrs r0, 15\n\ + add r0, r9\n\ + add r0, r10\n\ + ldrh r0, [r0]\n\ + movs r1, 0xC0\n\ + lsls r1, 4\n\ + adds r2, r1, 0\n\ + orrs r2, r0\n\ + adds r0, r4, 0\n\ + adds r1, r7, 0\n\ + bl MapGridSetMetatileIdAt\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x2\n\ + bls _08139D26\n\ + mov r2, r8\n\ + lsls r0, r2, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x2\n\ + bls _08139D16\n\ +_08139D62:\n\ + bl DrawWholeMapView\n\ + movs r0, 0\n\ + strh r0, [r6, 0x2]\n\ + movs r0, 0\n\ + ldrsh r1, [r6, r0]\n\ + movs r2, 0x6\n\ + ldrsh r0, [r6, r2]\n\ + cmp r1, r0\n\ + bne _08139D7C\n\ + ldr r0, [sp]\n\ + bl DestroyTask\n\ +_08139D7C:\n\ + ldrh r0, [r6, 0x2]\n\ + adds r0, 0x1\n\ + strh r0, [r6, 0x2]\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif // NAKED + +void sub_8139D98(void) +{ + u8 i; + u32 ivStorage[6]; + + ivStorage[0] = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_HP_IV); + ivStorage[1] = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_ATK_IV); + ivStorage[2] = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_DEF_IV); + ivStorage[3] = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPEED_IV); + ivStorage[4] = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPATK_IV); + ivStorage[5] = GetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_SPDEF_IV); + + gSpecialVar_0x8005 = 0; + + for (i = 0; i < ARRAY_COUNT(ivStorage); i++) + { + gSpecialVar_0x8005 += ivStorage[i]; + } + + gSpecialVar_0x8006 = 0; + gSpecialVar_0x8007 = ivStorage[0]; // HP IV + + for (i = 1; i < 6; i++) + { + if (ivStorage[gSpecialVar_0x8006] < ivStorage[i]) + { + gSpecialVar_0x8006 = i; + gSpecialVar_0x8007 = ivStorage[i]; + } + else if (ivStorage[gSpecialVar_0x8006] == ivStorage[i]) + { + u16 randomNumber = Random(); + if ((randomNumber & 1) != 0) + { + gSpecialVar_0x8006 = i; + gSpecialVar_0x8007 = ivStorage[i]; + } + } + } +} + +bool32 warp0_in_pokecenter(void) +{ + static const u16 gUnknown_085B2C2A[] = { 0x0202, 0x0301, 0x0405, 0x0504, 0x0604, 0x0700, 0x0804, 0x090b, 0x0a05, 0x0b05, 0x0c02, 0x0d06, 0x0e03, 0x0f02, 0x100c, 0x100a, 0x1a35, 0x193c, 0xffff }; + + int i; + u16 map = (gUnknown_020322DC.mapGroup << 8) + gUnknown_020322DC.mapNum; + + for (i = 0; gUnknown_085B2C2A[i] != 0xFFFF; i++) + { + if (gUnknown_085B2C2A[i] == map) + return TRUE; + } + + return FALSE; +} + +bool32 sub_8139ED0(void) +{ + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_HILL_ENTRANCE)) + { + return FALSE; + } + return TRUE; +} + +void UpdateFrontierManiac(u16 a0) +{ + u16 *var = GetVarPointer(VAR_FRONTIER_MANIAC_FACILITY); + *var += a0; + *var %= 10; +} + +void sub_8139F20(void) +{ + static const u8 *const gUnknown_085B2C50[][3] = { + { BattleFrontier_Lounge2_Text_260971, BattleFrontier_Lounge2_Text_260A1E, BattleFrontier_Lounge2_Text_260AE7 }, + { BattleFrontier_Lounge2_Text_2619AC, BattleFrontier_Lounge2_Text_261A91, BattleFrontier_Lounge2_Text_261B0C }, + { BattleFrontier_Lounge2_Text_261B95, BattleFrontier_Lounge2_Text_261B95, BattleFrontier_Lounge2_Text_261B95 }, + { BattleFrontier_Lounge2_Text_261C1A, BattleFrontier_Lounge2_Text_261C1A, BattleFrontier_Lounge2_Text_261C1A }, + { BattleFrontier_Lounge2_Text_260BC4, BattleFrontier_Lounge2_Text_260C6D, BattleFrontier_Lounge2_Text_260D3A }, + { BattleFrontier_Lounge2_Text_260E1E, BattleFrontier_Lounge2_Text_260EC7, BattleFrontier_Lounge2_Text_260F74 }, + { BattleFrontier_Lounge2_Text_2614E6, BattleFrontier_Lounge2_Text_261591, BattleFrontier_Lounge2_Text_26166F }, + { BattleFrontier_Lounge2_Text_261282, BattleFrontier_Lounge2_Text_261329, BattleFrontier_Lounge2_Text_261403 }, + { BattleFrontier_Lounge2_Text_261026, BattleFrontier_Lounge2_Text_2610CC, BattleFrontier_Lounge2_Text_261194 }, + { BattleFrontier_Lounge2_Text_26174D, BattleFrontier_Lounge2_Text_2617F9, BattleFrontier_Lounge2_Text_2618C4 }, + }; + + static const u8 gUnknown_085B2CC8[][2] = { + { 0x15, 0x38 }, + { 0x15, 0x23 }, + { 0xff, 0xff }, + { 0xff, 0xff }, + { 0x02, 0x04 }, + { 0x07, 0x15 }, + { 0x07, 0x15 }, + { 0x0e, 0x1c }, + { 0x0d, 0x70 }, + { 0x07, 0x38 } + }; + + u8 i; + u16 unk = 0; + u16 var = VarGet(VAR_FRONTIER_MANIAC_FACILITY); + switch (var) + { + case 0: + case 1: + case 2: + case 3: + if (gSaveBlock2Ptr->frontier.field_CE0[var][0] >= gSaveBlock2Ptr->frontier.field_CE0[var][1]) + { + unk = gSaveBlock2Ptr->frontier.field_CE0[var][0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_CE0[var][1]; + } + break; + case 4: + if (gSaveBlock2Ptr->frontier.field_D0C[0] >= gSaveBlock2Ptr->frontier.field_D0C[1]) + { + unk = gSaveBlock2Ptr->frontier.field_D0C[0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_D0C[1]; + } + break; + case 5: + if (gSaveBlock2Ptr->frontier.field_DE2[0] >= gSaveBlock2Ptr->frontier.field_DE2[1]) + { + unk = gSaveBlock2Ptr->frontier.field_DE2[0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_DE2[1]; + } + break; + case 6: + if (gSaveBlock2Ptr->frontier.field_DC8[0] >= gSaveBlock2Ptr->frontier.field_DC8[1]) + { + unk = gSaveBlock2Ptr->frontier.field_DC8[0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_DC8[1]; + } + break; + case 7: + if (gSaveBlock2Ptr->frontier.field_DDA[0] >= gSaveBlock2Ptr->frontier.field_DDA[1]) + { + unk = gSaveBlock2Ptr->frontier.field_DDA[0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_DDA[1]; + } + break; + case 8: + if (gSaveBlock2Ptr->frontier.field_E04[0] >= gSaveBlock2Ptr->frontier.field_E04[1]) + { + unk = gSaveBlock2Ptr->frontier.field_E04[0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_E04[1]; + } + break; + case 9: + if (gSaveBlock2Ptr->frontier.field_E1A[0] >= gSaveBlock2Ptr->frontier.field_E1A[1]) + { + unk = gSaveBlock2Ptr->frontier.field_E1A[0]; + } + else + { + unk = gSaveBlock2Ptr->frontier.field_E1A[1]; + } + break; + } + + for (i = 0; i < 2 && gUnknown_085B2CC8[var][i] < unk; i++); + + ShowFieldMessage(gUnknown_085B2C50[var][i]); +} + +void sub_813A080(void) +{ + static const u16 gUnknown_085B2CDC[] = { + 0x0007, 0x000e, 0x0015, 0x001c, 0x0023, 0x0031, 0x003f, 0x004d, 0x005b, 0x0000 + }; + + u8 i; + u16 var = VarGet(VAR_0x40CE); + u8 chosenLevel = gSaveBlock2Ptr->frontier.chosenLvl; + + if (var == 2 && !FlagGet(FLAG_0x152)) + { + gSpecialVar_0x8005 = 5; + gSpecialVar_0x8006 = 4; + return; + } + + for (i = 0; i < 9; i++) + { + if (gUnknown_085B2CDC[i] > gSaveBlock2Ptr->frontier.field_CE0[var][chosenLevel]) + { + gSpecialVar_0x8005 = 4; + gSpecialVar_0x8006 = i + 5; + return; + } + } + + gSpecialVar_0x8005 = 4; + gSpecialVar_0x8006 = 12; +} + +void sub_813A128(void) +{ + u8 taskId = CreateTask(sub_813A2DC, 8); + struct Task *task = &gTasks[taskId]; + task->data[11] = gSpecialVar_0x8004; + + switch (gSpecialVar_0x8004) + { + case 0: + task->data[0] = 1; + task->data[1] = 1; + task->data[2] = 1; + task->data[3] = 1; + task->data[4] = 1; + task->data[5] = 1; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 1: + task->data[0] = 5; + task->data[1] = 8; + task->data[2] = 1; + task->data[3] = 1; + task->data[4] = 9; + task->data[5] = 10; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 2: + task->data[0] = 6; + task->data[1] = 12; + task->data[2] = 1; + task->data[3] = 1; + task->data[4] = 7; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 3: + task->data[0] = 6; + task->data[1] = 11; + task->data[2] = 14; + task->data[3] = 1; + task->data[4] = 15; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 4: + task->data[0] = 6; + task->data[1] = 6; + task->data[2] = 14; + task->data[3] = 1; + task->data[4] = 15; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 5: + task->data[0] = 6; + task->data[1] = 7; + task->data[2] = 14; + task->data[3] = 1; + task->data[4] = 15; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 6: + task->data[0] = 6; + task->data[1] = 10; + task->data[2] = 14; + task->data[3] = 1; + task->data[4] = 15; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 7: + task->data[0] = 6; + task->data[1] = 12; + task->data[2] = 15; + task->data[3] = 1; + task->data[4] = 14; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 8: + task->data[0] = 6; + task->data[1] = 10; + task->data[2] = 17; + task->data[3] = 1; + task->data[4] = 11; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 9: + case 10: + task->data[0] = 6; + task->data[1] = 11; + task->data[2] = 15; + task->data[3] = 1; + task->data[4] = 14; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 11: + task->data[0] = 6; + task->data[1] = 7; + task->data[2] = 19; + task->data[3] = 1; + task->data[4] = 10; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + case 12: + task->data[0] = 6; + task->data[1] = 7; + task->data[2] = 17; + task->data[3] = 1; + task->data[4] = 12; + task->data[5] = 12; + task->data[6] = 0; + task->data[15] = taskId; + break; + default: + gSpecialVar_Result = 0x7F; + DestroyTask(taskId); + break; + } +} + +static const u8 *const gUnknown_085B2CF0[][16] = { + { + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_BlueFlute, + gText_YellowFlute, + gText_RedFlute, + gText_WhiteFlute, + gText_BlackFlute, + gText_PrettyChair, + gText_PrettyDesk, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_0Pts, + gText_10Pts, + gText_20Pts, + gText_30Pts, + gText_40Pts, + gText_50Pts, + gText_60Pts, + gText_70Pts, + gText_80Pts, + gText_90Pts, + gText_100Pts, + gText_QuestionMark, + NULL, + NULL, + NULL, + NULL + }, + { + gText_KissPoster16BP, + gText_KissCushion32BP, + gText_SmoochumDoll32BP, + gText_TogepiDoll48BP, + gText_MeowthDoll48BP, + gText_ClefairyDoll48BP, + gText_DittoDoll48BP, + gText_CyndaquilDoll80BP, + gText_ChikoritaDoll80BP, + gText_TotodileDoll80BP, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_LaprasDoll128BP, + gText_SnorlaxDoll128BP, + gText_VenusaurDoll256BP, + gText_CharizardDoll256BP, + gText_BlastoiseDoll256BP, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_Protein1BP, + gText_Calcium1BP, + gText_Iron1BP, + gText_Zinc1BP, + gText_Carbos1BP, + gText_HpUp1BP, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_Leftovers48BP, + gText_WhiteHerb48BP, + gText_QuickClaw48BP, + gText_MentalHerb48BP, + gText_BrightPowder64BP, + gText_ChoiceBand64BP, + gText_KingsRock64BP, + gText_FocusBand64BP, + gText_ScopeLens64BP, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_EnergyPowder50, + gText_EnergyRoot80, + gText_HealPowder50, + gText_RevivalHerb300, + gText_Protein1000, + gText_Iron1000, + gText_Carbos1000, + gText_Calcium1000, + gText_Zinc1000, + gText_HPUp1000, + gText_PPUp3000, + gText_Exit, + NULL, + NULL, + NULL, + NULL + }, + { + gText_BattleTower2, + gText_BattleDome, + gText_BattlePalace, + gText_BattleArena, + gText_BattleFactory, + gText_BattlePike, + gText_BattlePyramid, + gText_RankingHall, + gText_ExchangeService, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_Softboiled16BP, + gText_SeismicToss24BP, + gText_DreamEater24BP, + gText_MegaPunch24BP, + gText_MegaKick48BP, + gText_BodySlam48BP, + gText_RockSlide48BP, + gText_Counter48BP, + gText_ThunderWave48BP, + gText_SwordsDance48BP, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_DefenseCurl16BP, + gText_Snore24BP, + gText_MudSlap24BP, + gText_Swift24BP, + gText_IcyWind24BP, + gText_Endure48BP, + gText_PsychUp48BP, + gText_IcePunch48BP, + gText_ThunderPunch48BP, + gText_FirePunch48BP, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_SlateportCity, + gText_BattleFrontier, + gText_SouthernIsland, + gText_NavelRock, + gText_BirthIsland, + gText_FarawayIsland, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + }, + { + gText_BattleTrainers, + gText_BattleBasics, + gText_PokemonNature, + gText_PokemonMoves, + gText_Underpowered, + gText_WhenInDanger, + gText_Exit, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + } +}; + +static void sub_813A2DC(u8 taskId) +{ + u32 unk1; + u8 i, windowId; + struct WindowTemplate template; + struct Task *task = &gTasks[taskId]; + + ScriptContext2_Enable(); + gUnknown_0203AB68 = 0; + gUnknown_0203AB6C = 0x40; + sub_813AA60(task->data[11], 0); + sub_813ACE8(task->data[11], 0); + gUnknown_0203AB64 = AllocZeroed(task->data[1] * 8); + gUnknown_0203AB6A = 0; + sub_813A42C(); + + for (unk1 = 0, i = 0; i < task->data[1]; i++) + { + const u8 *text = gUnknown_085B2CF0[gSpecialVar_0x8004][i]; + gUnknown_0203AB64[i].name = text; + gUnknown_0203AB64[i].id = i; + unk1 = display_text_and_get_width(text, unk1); + } + + task->data[4] = convert_pixel_width_to_tile_width(unk1); + + if (task->data[2] + task->data[4] > 0x1D) + { + int unk2 = 0x1D - task->data[4]; + if (unk2 < 0) + { + task->data[2] = 0; + } + else + { + task->data[2] = unk2; + } + } + + template = CreateWindowTemplate(0, task->data[2], task->data[3], task->data[4], task->data[5], 0xF, 0x64); + windowId = AddWindow(&template); + task->data[13] = windowId; + SetStandardWindowBorderStyle(windowId, 0); + + gUnknown_030061D0.totalItems = task->data[1]; + gUnknown_030061D0.maxShowed = task->data[0]; + gUnknown_030061D0.windowId = task->data[13]; + + sub_813A694(taskId); + task->data[14] = ListMenuInit(&gUnknown_030061D0, task->data[7], task->data[8]); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = sub_813A4EC; +} + +static void sub_813A42C(void) +{ + gUnknown_030061D0.items = gUnknown_0203AB64; + gUnknown_030061D0.moveCursorFunc = sub_813A46C; + gUnknown_030061D0.itemPrintFunc = NULL; + gUnknown_030061D0.totalItems = 1; + gUnknown_030061D0.maxShowed = 1; + gUnknown_030061D0.windowId = 0; + gUnknown_030061D0.header_X = 0; + gUnknown_030061D0.item_X = 8; + gUnknown_030061D0.cursor_X = 0; + gUnknown_030061D0.upText_Y = 1; + gUnknown_030061D0.cursorPal = 2; + gUnknown_030061D0.fillValue = 1; + gUnknown_030061D0.cursorShadowPal = 3; + gUnknown_030061D0.lettersSpacing = 0; + gUnknown_030061D0.itemVerticalPadding = 0; + gUnknown_030061D0.scrollMultiple = 0; + gUnknown_030061D0.fontId = 1; + gUnknown_030061D0.cursorKind = 0; +} + +static void sub_813A46C(s32 itemIndex, bool8 onInit, struct ListMenu *list) +{ + u8 taskId; + PlaySE(SE_SELECT); + taskId = FindTaskIdByFunc(sub_813A4EC); + if (taskId != 0xFF) + { + u16 misc; + struct Task *task = &gTasks[taskId]; + ListMenuGetScrollAndRow(task->data[14], &misc, NULL); + gUnknown_0203AB68 = misc; + ListMenuGetCurrentItemArrayId(task->data[14], &misc); + sub_813AC44(task->data[11], gUnknown_0203AB6A); + sub_813AA60(task->data[11], misc); + sub_813AD34(task->data[11], misc); + gUnknown_0203AB6A = misc; + } +} + +// stupid r5<->r6 swap +#ifdef NONMATCHING +static void sub_813A4EC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + s32 itemId = ListMenuHandleInputGetItemId(task->data[14]); + + switch (itemId) + { + case LIST_NOTHING_CHOSEN: + break; + case LIST_B_PRESSED: + gSpecialVar_Result = 0x7F; + PlaySE(SE_SELECT); + sub_813A570(taskId); + break; + default: + gSpecialVar_Result = itemId; + PlaySE(SE_SELECT); + if (!task->data[6] || itemId == task->data[1] - 1) + { + sub_813A570(taskId); + } + else + { + sub_813A738(taskId); + task->func = sub_813A600; + EnableBothScriptContexts(); + } + break; + } +} +#else +NAKED +static void sub_813A4EC(u8 taskId) +{ + asm_unified("push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + ldr r1, =gTasks\n\ + adds r6, r0, r1\n\ + ldrh r0, [r6, 0x24]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + bl ListMenuHandleInputGetItemId\n\ + adds r4, r0, 0\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + cmp r4, r0\n\ + beq _0813A51C\n\ + adds r0, 0x1\n\ + cmp r4, r0\n\ + bne _0813A530\n\ + b _0813A566\n\ + .pool\n\ +_0813A51C:\n\ + ldr r1, =gSpecialVar_Result\n\ + movs r0, 0x7F\n\ + strh r0, [r1]\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + b _0813A54C\n\ + .pool\n\ +_0813A530:\n\ + ldr r0, =gSpecialVar_Result\n\ + strh r4, [r0]\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + movs r1, 0x14\n\ + ldrsh r0, [r6, r1]\n\ + cmp r0, 0\n\ + beq _0813A54C\n\ + movs r1, 0xA\n\ + ldrsh r0, [r6, r1]\n\ + subs r0, 0x1\n\ + cmp r4, r0\n\ + bne _0813A558\n\ +_0813A54C:\n\ + adds r0, r5, 0\n\ + bl sub_813A570\n\ + b _0813A566\n\ + .pool\n\ +_0813A558:\n\ + adds r0, r5, 0\n\ + bl sub_813A738\n\ + ldr r0, =sub_813A600\n\ + str r0, [r6]\n\ + bl EnableBothScriptContexts\n\ +_0813A566:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif // NONMATCHING + +static void sub_813A570(u8 taskId) +{ + u16 array; + struct Task *task = &gTasks[taskId]; + ListMenuGetCurrentItemArrayId(task->data[14], &array); + sub_813AC44(task->data[11], array); + sub_813A738(taskId); + DestroyListMenuTask(task->data[14], NULL, NULL); + Free(gUnknown_0203AB64); + sub_8198070(task->data[13], 1); + FillWindowPixelBuffer(task->data[13], 0); + CopyWindowToVram(task->data[13], 2); + RemoveWindow(task->data[13]); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static void sub_813A600(u8 taskId) +{ + switch (gTasks[taskId].data[6]) + { + case 1: + default: + break; + case 2: + gTasks[taskId].data[6] = 1; + gTasks[taskId].func = sub_813A664; + break; + } +} + +void sub_813A630(void) +{ + u8 taskId = FindTaskIdByFunc(sub_813A600); + if (taskId == 0xFF) + { + EnableBothScriptContexts(); + } + else + { + gTasks[taskId].data[6]++; + } +} + +static void sub_813A664(u8 taskId) +{ + ScriptContext2_Enable(); + sub_813A694(taskId); + gTasks[taskId].func = sub_813A4EC; +} + +static void sub_813A694(u8 taskId) +{ + static const struct ScrollArrowsTemplate gUnknown_085B3030 = { + .firstArrowType = 2, + .firstX = 0, + .firstY = 0, + .secondArrowType = 3, + .secondX = 0, + .secondY = 0, + .fullyUpThreshold = 0, + .fullyDownThreshold = 0, + .tileTag = 2000, + .palTag = 100, + .palNum = 0 + }; + + struct Task *task = &gTasks[taskId]; + struct ScrollArrowsTemplate template = gUnknown_085B3030; + if (task->data[0] != task->data[1]) + { + template.firstX = (task->data[4] / 2) * 8 + 12 + (task->data[2] - 1) * 8; + template.firstY = 8; + template.secondX = (task->data[4] / 2) * 8 + 12 + (task->data[2] - 1) * 8; + template.secondY = task->data[5] * 8 + 10; + template.fullyUpThreshold = 0; + template.fullyDownThreshold = task->data[1] - task->data[0]; + task->data[12] = AddScrollIndicatorArrowPair(&template, &gUnknown_0203AB68); + } +} + +static void sub_813A738(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + if (task->data[0] != task->data[1]) + { + RemoveScrollIndicatorArrowPair(task->data[12]); + } +} + +void nullsub_55(void) +{ + +} + +void sub_813A76C(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + if (gLinkPlayers[i].gender == MALE) + { + VarSet(VAR_OBJ_GFX_ID_F - i, EVENT_OBJ_GFX_BRENDAN_NORMAL); + } + else + { + VarSet(VAR_OBJ_GFX_ID_F - i, EVENT_OBJ_GFX_RIVAL_MAY_NORMAL); + } + } +} + +void sub_813A7B8(void) +{ + static const u8 *const gUnknown_085B3040[] = { + BattleFrontier_Lounge5_Text_26468D, + BattleFrontier_Lounge5_Text_2646E5, + BattleFrontier_Lounge5_Text_264741, + BattleFrontier_Lounge5_Text_2647A4, + BattleFrontier_Lounge5_Text_2647FC, + BattleFrontier_Lounge5_Text_264858, + BattleFrontier_Lounge5_Text_2648BE, + BattleFrontier_Lounge5_Text_264916, + BattleFrontier_Lounge5_Text_264972, + BattleFrontier_Lounge5_Text_2649D5, + BattleFrontier_Lounge5_Text_264A3F, + BattleFrontier_Lounge5_Text_264A9B, + BattleFrontier_Lounge5_Text_264AF3, + BattleFrontier_Lounge5_Text_264B5D, + BattleFrontier_Lounge5_Text_2648BE, + BattleFrontier_Lounge5_Text_264BC3, + BattleFrontier_Lounge5_Text_264C36, + BattleFrontier_Lounge5_Text_2648BE, + BattleFrontier_Lounge5_Text_264C95, + BattleFrontier_Lounge5_Text_264D01, + BattleFrontier_Lounge5_Text_264D6B, + BattleFrontier_Lounge5_Text_264DD7, + BattleFrontier_Lounge5_Text_264E33, + BattleFrontier_Lounge5_Text_264E8F, + BattleFrontier_Lounge5_Text_2648BE, + }; + + u8 nature; + + if (gSpecialVar_0x8004 >= PARTY_SIZE) + { + gSpecialVar_0x8004 = 0; + } + + nature = GetNature(&gPlayerParty[gSpecialVar_0x8004]); + ShowFieldMessage(gUnknown_085B3040[nature]); +} + +void UpdateFrontierGambler(u16 a0) +{ + u16 *var = GetVarPointer(VAR_FRONTIER_GAMBLER_FACILITY); + *var += a0; + *var %= 12; +} + +void sub_813A820(void) +{ + static const u8 *const gUnknown_085B30A4[] = { + BattleFrontier_Lounge3_Text_262261, + BattleFrontier_Lounge3_Text_26230D, + BattleFrontier_Lounge3_Text_2623B9, + BattleFrontier_Lounge3_Text_262464, + BattleFrontier_Lounge3_Text_26250E, + BattleFrontier_Lounge3_Text_2625B8, + BattleFrontier_Lounge3_Text_26266A, + BattleFrontier_Lounge3_Text_26271C, + BattleFrontier_Lounge3_Text_2627C9, + BattleFrontier_Lounge3_Text_262876, + BattleFrontier_Lounge3_Text_26291A, + BattleFrontier_Lounge3_Text_2629BC, + }; + + u16 var = VarGet(VAR_FRONTIER_GAMBLER_FACILITY); + ShowFieldMessage(gUnknown_085B30A4[var]); + VarSet(VAR_FRONTIER_GAMBLER_SET_FACILITY_F, var); +} + +void sub_813A854(void) +{ + static const u8 *const gUnknown_085B30D4[] = { + BattleFrontier_Lounge3_Text_262C04, + BattleFrontier_Lounge3_Text_262C90, + BattleFrontier_Lounge3_Text_262D1C, + BattleFrontier_Lounge3_Text_262DA7, + BattleFrontier_Lounge3_Text_262E34, + BattleFrontier_Lounge3_Text_262EC1, + BattleFrontier_Lounge3_Text_262F56, + BattleFrontier_Lounge3_Text_262FEB, + BattleFrontier_Lounge3_Text_263078, + BattleFrontier_Lounge3_Text_263105, + BattleFrontier_Lounge3_Text_26318C, + BattleFrontier_Lounge3_Text_263211, + }; + + ShowFieldMessage(gUnknown_085B30D4[VarGet(VAR_FRONTIER_GAMBLER_SET_FACILITY_F)]); +} + +void sub_813A878(u8 a0) +{ + static const u16 gUnknown_085B3104[] = {0x0000, 0x0001, 0x0002, 0x0100, 0x0101, 0x0400, 0x0401, 0x0200, 0x0201, 0x0300, 0x0500, 0x0600}; + + u16 var1 = VarGet(VAR_0x40CE); + u16 var2 = VarGet(VAR_FRONTIER_GAMBLER_SET_FACILITY_F); + u16 var3 = VarGet(VAR_FRONTIER_FACILITY); + + if (VarGet(VAR_FRONTIER_GAMBLER_PLACED_BET_F) == 1) + { + if (gUnknown_085B3104[var2] == (var3 << 8) + var1) + { + if (a0 != 0) + { + VarSet(VAR_FRONTIER_GAMBLER_PLACED_BET_F, 2); + } + else + { + VarSet(VAR_FRONTIER_GAMBLER_PLACED_BET_F, 3); + } + } + } +} + +void sub_813A8FC(void) +{ + u8 string[32]; + u32 x; + StringCopy(ConvertIntToDecimalStringN(string, gSaveBlock2Ptr->frontier.frontierBattlePoints, STR_CONV_MODE_RIGHT_ALIGN, 4), gText_BP); + x = GetStringRightAlignXOffset(1, string, 48); + PrintTextOnWindow(gUnknown_0203AB6D, 1, string, x, 1, 0, NULL); +} + +void sub_813A958(void) +{ + static const struct WindowTemplate gUnknown_085B311C = { + .priority = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 6, + .height = 2, + .paletteNum = 15, + .baseBlock = 8, + }; + + gUnknown_0203AB6D = AddWindow(&gUnknown_085B311C); + SetStandardWindowBorderStyle(gUnknown_0203AB6D, 0); + sub_813A8FC(); + CopyWindowToVram(gUnknown_0203AB6D, 2); +} + +void sub_813A988(void) +{ + sub_8198070(gUnknown_0203AB6D, TRUE); + RemoveWindow(gUnknown_0203AB6D); +} + +void sub_813A9A4(void) +{ + if (gSaveBlock2Ptr->frontier.frontierBattlePoints < gSpecialVar_0x8004) + { + gSaveBlock2Ptr->frontier.frontierBattlePoints = 0; + } + else + { + gSaveBlock2Ptr->frontier.frontierBattlePoints -= gSpecialVar_0x8004; + } +} + +void sub_813A9D0(void) +{ + if (gSaveBlock2Ptr->frontier.frontierBattlePoints + gSpecialVar_0x8004 > 0x270F) + { + gSaveBlock2Ptr->frontier.frontierBattlePoints = 0x270f; + } + else + { + gSaveBlock2Ptr->frontier.frontierBattlePoints = gSaveBlock2Ptr->frontier.frontierBattlePoints + gSpecialVar_0x8004; + } +} + +u16 sub_813AA04(void) +{ + return gSaveBlock2Ptr->frontier.frontierBattlePoints; +} + +void sub_813AA18(void) +{ + static const struct WindowTemplate gUnknown_085B3124 = { + .priority = 0, + .tilemapLeft = 2, + .tilemapTop = 9, + .width = 4, + .height = 4, + .paletteNum = 15, + .baseBlock = 20, + }; + + gUnknown_0203AB6E = AddWindow(&gUnknown_085B3124); + SetStandardWindowBorderStyle(gUnknown_0203AB6E, 0); + CopyWindowToVram(gUnknown_0203AB6E, 2); +} + +void sub_813AA44(void) +{ + sub_8198070(gUnknown_0203AB6E, TRUE); + RemoveWindow(gUnknown_0203AB6E); +} + +static void sub_813AA60(u16 a0, u16 a1) +{ + static const u16 gUnknown_085B312C[] = { 0x004b, 0x0067, 0x0057, 0x004f, 0x0054, 0x0055, 0x0056, 0x0050, 0x0051, 0x0052, 0xffff }; + static const u16 gUnknown_085B3142[] = { 0x0071, 0x006f, 0x0072, 0x0073, 0x0074, 0xffff }; + static const u16 gUnknown_085B314E[] = { 0x0040, 0x0043, 0x0041, 0x0046, 0x0042, 0x003f, 0xffff }; + static const u16 gUnknown_085B315C[] = { 0x00c8, 0x00b4, 0x00b7, 0x00b9, 0x00b3, 0x00ba, 0x00bb, 0x00c4, 0x00c6, 0xffff }; + + static const u8 *const gUnknown_085B3170[] = { + BattleFrontier_BattlePointExchangeServiceCorner_Text_2601AA, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2601D0, + BattleFrontier_BattlePointExchangeServiceCorner_Text_260201, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26022F, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26025B, + BattleFrontier_BattlePointExchangeServiceCorner_Text_260287, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2602B5, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2602E0, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26030F, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26033E, + gText_Exit, + }; + + static const u8 *const gUnknown_085B319C[] = { + BattleFrontier_BattlePointExchangeServiceCorner_Text_26036C, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26036C, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26036C, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26036C, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26036C, + gText_Exit + }; + + static const u8 *const gUnknown_085B31B4[] = { + BattleFrontier_BattlePointExchangeServiceCorner_Text_260397, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2603BE, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2603E6, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26040E, + BattleFrontier_BattlePointExchangeServiceCorner_Text_260436, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26045C, + gText_Exit + }; + + static const u8 *const gUnknown_085B31D0[] = { + BattleFrontier_BattlePointExchangeServiceCorner_Text_26047A, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2604AC, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2604D8, + BattleFrontier_BattlePointExchangeServiceCorner_Text_26050F, + BattleFrontier_BattlePointExchangeServiceCorner_Text_260542, + BattleFrontier_BattlePointExchangeServiceCorner_Text_260575, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2605A8, + BattleFrontier_BattlePointExchangeServiceCorner_Text_2605E2, + BattleFrontier_BattlePointExchangeServiceCorner_Text_260613, + gText_Exit + }; + + if (a0 > 2 && a0 < 7) + { + FillWindowPixelRect(0, 0x11, 0, 0, 216, 32); + switch (a0) + { + case 3: + AddTextPrinterParameterized(0, 1, gUnknown_085B3170[a1], 0, NULL, 2, 1, 3); + if (gUnknown_085B312C[a1] == 0xFFFF) + { + sub_813ABD4(gUnknown_085B312C[a1]); + } + else + { + FreeSpriteTilesByTag(5500); + FreeSpritePaletteByTag(5500); + gUnknown_0203AB6C = AddDecorationIconObject(gUnknown_085B312C[a1], 33, 88, 0, 5500, 5500); + } + break; + case 4: + AddTextPrinterParameterized(0, 1, gUnknown_085B319C[a1], 0, NULL, 2, 1, 3); + if (gUnknown_085B3142[a1] == 0xFFFF) + { + sub_813ABD4(gUnknown_085B3142[a1]); + } + else + { + FreeSpriteTilesByTag(5500); + FreeSpritePaletteByTag(5500); + gUnknown_0203AB6C = AddDecorationIconObject(gUnknown_085B3142[a1], 33, 88, 0, 5500, 5500); + } + break; + case 5: + AddTextPrinterParameterized(0, 1, gUnknown_085B31B4[a1], 0, NULL, 2, 1, 3); + sub_813ABD4(gUnknown_085B314E[a1]); + break; + case 6: + AddTextPrinterParameterized(0, 1, gUnknown_085B31D0[a1], 0, NULL, 2, 1, 3); + sub_813ABD4(gUnknown_085B315C[a1]); + break; + } + } +} + +static void sub_813ABD4(u16 a0) +{ + FreeSpriteTilesByTag(5500); + FreeSpritePaletteByTag(5500); + gUnknown_0203AB6C = AddItemIconSprite(5500, 5500, a0); + + if (gUnknown_0203AB6C != MAX_SPRITES) + { + gSprites[gUnknown_0203AB6C].oam.priority = 0; + gSprites[gUnknown_0203AB6C].pos1.x = 36; + gSprites[gUnknown_0203AB6C].pos1.y = 92; + } +} + +static void sub_813AC44(u16 a0, u16 unused) +{ + if (gUnknown_0203AB6C != MAX_SPRITES) + { + switch (a0) + { + case 3 ... 6: + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203AB6C]); + break; + } + gUnknown_0203AB6C = MAX_SPRITES; + } +} + +static const u16 gUnknown_085B31F8[] = { 0x0087, 0x0045, 0x008a, 0x0005, 0x0019, 0x0022, 0x009d, 0x0044, 0x0056, 0x000e }; +static const u16 gUnknown_085B320C[] = { 0x006f, 0x00ad, 0x00bd, 0x0081, 0x00c4, 0x00cb, 0x00f4, 0x0008, 0x0009, 0x0007 }; + +void sub_813AC7C(void) +{ + if (gSpecialVar_0x8005 != 0) + { + StringCopy(gStringVar1, gMoveNames[gUnknown_085B320C[gSpecialVar_0x8004]]); + } + else + { + StringCopy(gStringVar1, gMoveNames[gUnknown_085B31F8[gSpecialVar_0x8004]]); + } +} + +static void sub_813ACE8(u8 a0, u16 a1) +{ + static const struct WindowTemplate gUnknown_085B3220 = { + .priority = 0, + .tilemapLeft = 1, + .tilemapTop = 7, + .width = 12, + .height = 6, + .paletteNum = 15, + .baseBlock = 28, + }; + + if (a0 == 9 || a0 == 10) + { + if (gSpecialVar_0x8006 == 0) + { + gUnknown_0203AB5E = AddWindow(&gUnknown_085B3220); + SetStandardWindowBorderStyle(gUnknown_0203AB5E, 0); + } + sub_813AD34(a0, a1); + } +} + +static void sub_813AD34(u8 a0, u16 a1) +{ + static const u8 *const gUnknown_085B3228[] = { + BattleFrontier_Lounge7_Text_265E30, + BattleFrontier_Lounge7_Text_265E5B, + BattleFrontier_Lounge7_Text_265E8A, + BattleFrontier_Lounge7_Text_265EC0, + BattleFrontier_Lounge7_Text_265EED, + BattleFrontier_Lounge7_Text_265F1C, + BattleFrontier_Lounge7_Text_265F47, + BattleFrontier_Lounge7_Text_265F77, + BattleFrontier_Lounge7_Text_265FAA, + BattleFrontier_Lounge7_Text_265FDD, + gText_Exit, + }; + + static const u8 *const gUnknown_085B3254[] = { + BattleFrontier_Lounge7_Text_26600A, + BattleFrontier_Lounge7_Text_26603E, + BattleFrontier_Lounge7_Text_266070, + BattleFrontier_Lounge7_Text_2660A6, + BattleFrontier_Lounge7_Text_2660D0, + BattleFrontier_Lounge7_Text_2660FF, + BattleFrontier_Lounge7_Text_26612D, + BattleFrontier_Lounge7_Text_26615F, + BattleFrontier_Lounge7_Text_266185, + BattleFrontier_Lounge7_Text_2661B5, + gText_Exit, + }; + + if (a0 == 9 || a0 == 10) + { + FillWindowPixelRect(gUnknown_0203AB5E, 0x11, 0, 0, 96, 48); + if (a0 == 10) + { + PrintTextOnWindow(gUnknown_0203AB5E, 1, gUnknown_085B3254[a1], 0, 1, 0, NULL); + } + else + { + PrintTextOnWindow(gUnknown_0203AB5E, 1, gUnknown_085B3228[a1], 0, 1, 0, NULL); + } + } +} + +void sub_813ADB8(void) +{ + sub_8198070(gUnknown_0203AB5E, TRUE); + RemoveWindow(gUnknown_0203AB5E); +} + +void sub_813ADD4(void) +{ + u16 scrollOffset, selectedRow; + u8 i; + u8 taskId = FindTaskIdByFunc(sub_813A600); + if (taskId != 0xFF) + { + struct Task *task = &gTasks[taskId]; + ListMenuGetScrollAndRow(task->data[14], &scrollOffset, &selectedRow); + SetStandardWindowBorderStyle(task->data[13], 0); + + for (i = 0; i < 6; i++) + { + sub_8199F74(task->data[13], 1, gUnknown_085B2CF0[gSpecialVar_0x8004][scrollOffset + i], 10, i * 16, TEXT_SPEED_FF, NULL, 0, 0); + } + + PrintTextOnWindow(task->data[13], 1, gText_SelectorArrow, 0, selectedRow * 16, TEXT_SPEED_FF, NULL); + PutWindowTilemap(task->data[13]); + CopyWindowToVram(task->data[13], 3); + } +} + +void sub_813AEB4(void) +{ + u8 i; + u16 temp1 = 0; + u16 temp2 = 0; + gSpecialVar_0x8005 = 0; + + temp1 = VarGet(VAR_TEMP_E); + temp2 = VarGet(VAR_TEMP_D); + + if (temp1 != 0) + { + i = 0; + do + { + if (gUnknown_0861500C[i] == gUnknown_085B320C[temp2]) + { + gSpecialVar_0x8005 = i; + break; + } + i++; + } while (i < 30); + } + else + { + i = 0; + do + { + if (gUnknown_0861500C[i] == gUnknown_085B31F8[temp2]) + { + gSpecialVar_0x8005 = i; + break; + } + i++; + } while (i < 30); + } +} + +void sub_813AF48(void) +{ + u8 taskId = FindTaskIdByFunc(sub_813A600); + if (taskId != 0xFF) + { + struct Task *task = &gTasks[taskId]; + DestroyListMenuTask(task->data[14], NULL, NULL); + Free(gUnknown_0203AB64); + sub_8198070(task->data[13], TRUE); + FillWindowPixelBuffer(task->data[13], 0); + ClearWindowTilemap(task->data[13]); + CopyWindowToVram(task->data[13], 2); + RemoveWindow(task->data[13]); + DestroyTask(taskId); + } +} + +void sub_813AFC8(void) +{ + CreateTask(task_deoxys_sound, 8); +} + +static const u16 gUnknown_085B3280[][16] = { + INCBIN_U16("graphics/misc/deoxys1.gbapal"), + INCBIN_U16("graphics/misc/deoxys2.gbapal"), + INCBIN_U16("graphics/misc/deoxys3.gbapal"), + INCBIN_U16("graphics/misc/deoxys4.gbapal"), + INCBIN_U16("graphics/misc/deoxys5.gbapal"), + INCBIN_U16("graphics/misc/deoxys6.gbapal"), + INCBIN_U16("graphics/misc/deoxys7.gbapal"), + INCBIN_U16("graphics/misc/deoxys8.gbapal"), + INCBIN_U16("graphics/misc/deoxys9.gbapal"), + INCBIN_U16("graphics/misc/deoxys10.gbapal"), + INCBIN_U16("graphics/misc/deoxys11.gbapal"), +}; + +static const u8 gUnknown_085B33E0[][2] = { + { 0x0f, 0x0c }, + { 0x0b, 0x0e }, + { 0x0f, 0x08 }, + { 0x13, 0x0e }, + { 0x0c, 0x0b }, + { 0x12, 0x0b }, + { 0x0f, 0x0e }, + { 0x0b, 0x0e }, + { 0x13, 0x0e }, + { 0x0f, 0x0f }, + { 0x0f, 0x0a }, +}; + +static void task_deoxys_sound(u8 taskId) +{ + static const u8 gUnknown_085B33F6[] = { 0x04, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x06, 0x03, 0x03 }; + + if (FlagGet(FLAG_0x8D4) == TRUE) + { + gSpecialVar_Result = 3; + EnableBothScriptContexts(); + DestroyTask(taskId); + } + else + { + u16 temp1 = VarGet(VAR_0x4035); + u16 temp2 = VarGet(VAR_0x4034); + + VarSet(VAR_0x4034, 0); + if (temp1 != 0 && gUnknown_085B33F6[temp1 - 1] < temp2) + { + sub_813B0B4(0); + VarSet(VAR_0x4035, 0); + gSpecialVar_Result = 0; + DestroyTask(taskId); + } + else if (temp1 == 10) + { + FlagSet(FLAG_0x8D4); + gSpecialVar_Result = 2; + EnableBothScriptContexts(); + DestroyTask(taskId); + } + else + { + temp1++; + sub_813B0B4(temp1); + VarSet(VAR_0x4035, temp1); + gSpecialVar_Result = 1; + DestroyTask(taskId); + } + } +} + +static void sub_813B0B4(u8 a0) +{ + u8 eventObjectId; + LoadPalette(&gUnknown_085B3280[a0], 0x1A0, 8); + TryGetEventObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectId); + + if (a0 == 0) + { + PlaySE(SE_W109); + } + else + { + PlaySE(SE_RG_DEOMOV); + } + + CreateTask(sub_813B160, 8); + + gFieldEffectArguments[0] = 1; + gFieldEffectArguments[1] = 58; + gFieldEffectArguments[2] = 26; + gFieldEffectArguments[3] = gUnknown_085B33E0[a0][0]; + gFieldEffectArguments[4] = gUnknown_085B33E0[a0][1]; + + if (a0 == 0) + { + gFieldEffectArguments[5] = 60; + } + else + { + gFieldEffectArguments[5] = 5; + } + + FieldEffectStart(FLDEFF_66); + Overworld_SetEventObjTemplateCoords(1, gUnknown_085B33E0[a0][0], gUnknown_085B33E0[a0][1]); +} + +static void sub_813B160(u8 taskId) +{ + if (FieldEffectActiveListContains(FLDEFF_66) == FALSE) + { + EnableBothScriptContexts(); + DestroyTask(taskId); + } +} + +void increment_var_x4026_on_birth_island_modulo_100(void) +{ + u16 var = VarGet(VAR_0x4034); + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR)) + { + var++; + if (var > 99) + { + VarSet(VAR_0x4034, 0); + } + else + { + VarSet(VAR_0x4034, var); + } + } +} + +void sub_813B1D0(void) +{ + LoadPalette(&gUnknown_085B3280[(u8)VarGet(VAR_0x4035)], 0x1A0, 8); + BlendPalettes(0x04000000, 16, 0); +} + +void set_unknown_box_id(u8 id) +{ + gUnknown_0203AB6F = id; +} + +u16 get_unknown_box_id(void) +{ + return gUnknown_0203AB6F; +} + +bool32 sub_813B21C(void) +{ + if (FlagGet(FLAG_SYS_STORAGE_UNKNOWN_FLAG) == FALSE) + { + if (StorageGetCurrentBox() != VarGet(VAR_STORAGE_UNKNOWN)) + { + FlagSet(FLAG_SYS_STORAGE_UNKNOWN_FLAG); + return TRUE; + } + } + return FALSE; +} + +bool8 sub_813B260(void) +{ + int box; + int i; + set_unknown_box_id(VarGet(VAR_STORAGE_UNKNOWN)); + box = StorageGetCurrentBox(); + do + { + for (i = 0; i < IN_BOX_COUNT; i++) + { + if (GetBoxMonData(GetBoxedMonPtr(box, i), MON_DATA_SPECIES, 0) == 0) + { + if (get_unknown_box_id() != box) + { + FlagClear(FLAG_SYS_STORAGE_UNKNOWN_FLAG); + } + VarSet(VAR_STORAGE_UNKNOWN, box); + return sub_813B21C(); + } + } + + if (++box == TOTAL_BOXES_COUNT) + { + box = 0; + } + } while (box != StorageGetCurrentBox()); + return FALSE; +} + +void sub_813B2E4(void) +{ + u16 randomValue = Random(); + VarSet(VAR_0x4038, 0); + + if (FlagGet(FLAG_0x1BE) == TRUE) + { + VarSet(VAR_0x4037, (randomValue & 7) + 1); + } + else if (FlagGet(FLAG_0x1BF) == TRUE) + { + VarSet(VAR_0x4037, (randomValue & 7) + 9); + } + else if ((randomValue & 1) == 0) + { + randomValue = Random(); + VarSet(VAR_0x4037, (randomValue & 7) + 1); + } + else + { + randomValue = Random(); + VarSet(VAR_0x4037, (randomValue & 7) + 9); + } +} + +bool32 sub_813B374(void) +{ + static const u8 gUnknown_085B3400[] = { 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f, 0x21, 0x21, 0x14, 0x14, 0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c }; + + u16 var = VarGet(VAR_0x4037); + + GetMapName(gStringVar1, gUnknown_085B3400[var - 1], 0); + + if (var < 9) + { + return FALSE; + } + else + { + return TRUE; + } +} + +bool32 sub_813B3B0(void) +{ + static const u8 gUnknown_085B3410[] = { 0x1d, 0x1d, 0x1e, 0x1e, 0x1f, 0x1f, 0x21, 0x21, 0x14, 0x14, 0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c }; + + u16 var1 = VarGet(VAR_0x4038); + u16 var2 = VarGet(VAR_0x4037); + + if (!var2) + { + return FALSE; + } + + if (++var1 > 999) + { + VarSet(VAR_0x4038, 0); + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNDERWATER_MARINE_CAVE)) + { + switch (gSaveBlock1Ptr->location.mapNum) + { + case MAP_NUM(UNDERWATER_MARINE_CAVE): + case MAP_NUM(MARINE_CAVE_ENTRANCE): + case MAP_NUM(MARINE_CAVE_END): + case MAP_NUM(TERRA_CAVE_ENTRANCE): + case MAP_NUM(TERRA_CAVE_END): + VarSet(VAR_0x4039, 1); + return FALSE; + default: + break; + } + } + + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNDERWATER3)) + { + switch (gSaveBlock1Ptr->location.mapNum) + { + case MAP_NUM(UNDERWATER3): + case MAP_NUM(UNDERWATER5): + case MAP_NUM(UNDERWATER6): + case MAP_NUM(UNDERWATER7): + VarSet(VAR_0x4039, 1); + return FALSE; + default: + break; + } + } + + if (gSaveBlock1Ptr->location.mapNum == gUnknown_085B3410[var2 - 1] && + gSaveBlock1Ptr->location.mapGroup == 0) + { + return TRUE; + } + else + { + VarSet(VAR_0x4037, 0); + return FALSE; + } + } + else + { + VarSet(VAR_0x4038, var1); + return FALSE; + } +} + +void sub_813B484(void) +{ + sub_80AB104(2); +} + +bool32 sub_813B490(void) +{ + static const u8 gUnknown_085B3420[][3] = { + { 0x02, 0x04, 0x01 }, + { 0x04, 0x04, 0x01 }, + { 0x05, 0x00, 0x01 }, + { 0x06, 0x03, 0x01 }, + { 0x08, 0x06, 0x01 }, + { 0x09, 0x0d, 0x01 }, + { 0x0a, 0x07, 0x01 }, + { 0x0b, 0x07, 0x01 }, + { 0x0c, 0x04, 0x01 }, + { 0x0e, 0x05, 0x01 }, + { 0x0f, 0x04, 0x01 }, + { 0x1a, 0x37, 0x01 } + }; + + u8 i; + for (i = 0; i < 12; i++) + { + if (gSaveBlock1Ptr->location.mapGroup == gUnknown_085B3420[i][0]) + { + if (gSaveBlock1Ptr->location.mapNum == gUnknown_085B3420[i][1]) + { + return gUnknown_085B3420[i][2]; + } + } + } + return TRUE; +} + +bool32 sub_813B4E0(void) +{ + int index = GetRematchIdxByTrainerIdx(gSpecialVar_0x8004); + if (index >= 0) + { + if (FlagGet(FLAG_MATCH_CALL_REGISTERED + index) == TRUE) + return TRUE; + } + return FALSE; +} + +bool32 sub_813B514(void) +{ + if (!VarGet(VAR_0x403F)) + { + return FALSE; + } + return TRUE; +} + +void sub_813B534(void) +{ + gUnknown_0203AB70 = gBattleTypeFlags; + gBattleTypeFlags = 0; + if (!gReceivedRemoteLinkPlayers) + { + CreateTask(sub_80B3AF8, 5); + } +} + +void sub_813B568(void) +{ + CreateTask(sub_813B57C, 5); +} + +static void sub_813B57C(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (!FuncIsActiveTask(sub_80B3AF8)) + { + gTasks[taskId].data[0]++; + } + break; + case 1: + if (sub_800A520() == TRUE) + { + if (GetMultiplayerId() == 0) + { + gTasks[taskId].data[0]++; + } + else + { + SendBlock(bitmask_all_link_players_but_self(), &gSpecialVar_0x8004, 2); + gTasks[taskId].data[0]++; + } + } + break; + case 2: + if ((GetBlockReceivedStatus() & 2) != 0) + { + if (GetMultiplayerId() == 0) + { + gSpecialVar_0x8005 = gBlockRecvBuffer[1][0]; + ResetBlockReceivedFlag(1); + if (gSpecialVar_0x8004 == 1 && gSpecialVar_0x8005 == 1) + { + gSpecialVar_Result = 1; + } + else if (gSpecialVar_0x8004 == 0 && gSpecialVar_0x8005 == 1) + { + gSpecialVar_Result = 2; + } + else if (gSpecialVar_0x8004 == 1 && gSpecialVar_0x8005 == 0) + { + gSpecialVar_Result = 3; + } + else + { + gSpecialVar_Result = 0; + } + } + gTasks[taskId].data[0]++; + } + break; + case 3: + if (sub_800A520() == TRUE) + { + if (GetMultiplayerId() != 0) + { + gTasks[taskId].data[0]++; + } + else + { + SendBlock(bitmask_all_link_players_but_self(), &gSpecialVar_Result, 2); + gTasks[taskId].data[0]++; + } + } + break; + case 4: + if ((GetBlockReceivedStatus() & 1) != 0) + { + if (GetMultiplayerId() != 0) + { + gSpecialVar_Result = gBlockRecvBuffer[0][0]; + ResetBlockReceivedFlag(0); + gTasks[taskId].data[0]++; + } + else + { + gTasks[taskId].data[0]++; + } + } + break; + case 5: + if (GetMultiplayerId() == 0) + { + if (gSpecialVar_Result == 2) + { + ShowFieldAutoScrollMessage(gText_YourPartnerHasRetired); + } + } + else + { + if (gSpecialVar_Result == 3) + { + ShowFieldAutoScrollMessage(gText_YourPartnerHasRetired); + } + } + gTasks[taskId].data[0]++; + break; + case 6: + if (!IsTextPrinterActive(0)) + { + gTasks[taskId].data[0]++; + } + break; + case 7: + if (sub_800A520() == 1) + { + sub_800ADF8(); + gTasks[taskId].data[0]++; + } + break; + case 8: + if (sub_800A520() == 1) + { + gTasks[taskId].data[0]++; + } + break; + case 9: + if (gWirelessCommType == 0) + { + sub_800AC34(); + } + gBattleTypeFlags = gUnknown_0203AB70; + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + } +} + +void sub_813B7D8(void) +{ + if (gSpecialVar_0x8004 == 0) + { + DoRayquazaScene(0, TRUE, CB2_ReturnToFieldContinueScriptPlayMapMusic); + } + else + { + DoRayquazaScene(1, FALSE, CB2_ReturnToFieldContinueScriptPlayMapMusic); + } +} + +void sub_813B80C(void) +{ + CreateTask(sub_813B824, 8); + PlaySE(SE_W017); +} + +static void sub_813B824(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[1]++; + if (data[1] == gSpecialVar_0x8005) + { + data[0]++; + data[1] = 0; + PlaySE(SE_W017); + } + + if (data[0] == gSpecialVar_0x8004 - 1) + { + DestroyTask(taskId); + } +} + +void sub_813B880(void) +{ + u8 taskId = CreateTask(_fwalk, 8); + gTasks[taskId].data[0] = 4; + gTasks[taskId].data[1] = 4; + gTasks[taskId].data[2] = 4; + gTasks[taskId].data[3] = 0; +} + +static void _fwalk(u8 taskId) +{ + u8 x, y; + s16 *data = gTasks[taskId].data; + + data[data[3]]--; + if (data[data[3]] == 0) + { + for (y = 0; y < 4; y++) + { + for (x = 0; x < 3; x++) + { + MapGridSetMetatileIdAt(gSaveBlock1Ptr->pos.x + x + 6, gSaveBlock1Ptr->pos.y + y + 4, x + 0x201 + y * 8 + data[3] * 32); + } + } + DrawWholeMapView(); + data[3]++; + if (data[3] == 3) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } + } +} + +void sub_813B968(void) +{ + gSpecialVar_Result = gSpecialVar_0x8004 / 7; + gSpecialVar_Result -= (gSpecialVar_Result / 20) * 20; +} + +void sub_813B9A0(void) +{ + if (gSaveBlock1Ptr->lastHealLocation.mapGroup == MAP_GROUP(DEWFORD_TOWN) && gSaveBlock1Ptr->lastHealLocation.mapNum == MAP_NUM(DEWFORD_TOWN)) + { + Overworld_SetHealLocationWarp(3); + } +} + +bool32 sub_813B9C0(void) +{ + static const u16 gUnknown_085B3444[] = { + MAP_OLDALE_TOWN_POKEMON_CENTER_1F, + MAP_DEWFORD_TOWN_POKEMON_CENTER_1F, + MAP_LAVARIDGE_TOWN_POKEMON_CENTER_1F, + MAP_FALLARBOR_TOWN_POKEMON_CENTER_1F, + MAP_VERDANTURF_TOWN_POKEMON_CENTER_1F, + MAP_PACIFIDLOG_TOWN_POKEMON_CENTER_1F, + MAP_PETALBURG_CITY_POKEMON_CENTER_1F, + MAP_SLATEPORT_CITY_POKEMON_CENTER_1F, + MAP_MAUVILLE_CITY_POKEMON_CENTER_1F, + MAP_RUSTBORO_CITY_POKEMON_CENTER_1F, + MAP_FORTREE_CITY_POKEMON_CENTER_1F, + MAP_LILYCOVE_CITY_POKEMON_CENTER_1F, + MAP_MOSSDEEP_CITY_POKEMON_CENTER_1F, + MAP_SOOTOPOLIS_CITY_POKEMON_CENTER_1F, + MAP_EVER_GRANDE_CITY_POKEMON_CENTER_1F, + MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F, + MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F, + MAP_SINGLE_BATTLE_COLOSSEUM, + MAP_TRADE_CENTER, + MAP_RECORD_CORNER, + MAP_DOUBLE_BATTLE_COLOSSEUM, + 0xffff + }; + + int i; + u16 map = (gSaveBlock1Ptr->location.mapGroup << 8) + gSaveBlock1Ptr->location.mapNum; + + for (i = 0; gUnknown_085B3444[i] != 0xFFFF; i++) + { + if (gUnknown_085B3444[i] == map) + { + return TRUE; + } + } + return FALSE; +} + +void ResetFanClub(void) +{ + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = 0; + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = 0; +} + +void sub_813BA30(void) +{ + if (sub_813BF44() != 0) + { + UpdateMovedLilycoveFanClubMembers(); + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2Ptr->playTimeHours; + } +} + +void sub_813BA60(void) +{ + if (!((gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 1)) + { + sub_813BF60(); + sub_813BD84(); + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2Ptr->playTimeHours; + FlagClear(FLAG_HIDE_FANCLUB_OLD_LADY); + FlagClear(FLAG_HIDE_FANCLUB_BOY); + FlagClear(FLAG_HIDE_FANCLUB_LITTLE_BOY); + FlagClear(FLAG_HIDE_FANCLUB_LADY); + FlagClear(FLAG_0x2DA); + VarSet(VAR_LILYCOVE_FAN_CLUB_STATE, 1); + } +} + +u8 sub_813BADC(u8 a0) +{ + static const u8 gUnknown_085B3470[] = { 0x02, 0x01, 0x02, 0x01 }; + + if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) + { + if ((gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7F) + gUnknown_085B3470[a0] > 19) + { + if (GetNumMovedLilycoveFanClubMembers() < 3) + { + sub_813BB74(); + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] &= 0xFF80; + } + else + { + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] = (gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0xFF80) | 0x14; + } + } + else + { + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] += gUnknown_085B3470[a0]; + } + } + + return gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] & 0x7F; +} + +static u16 sub_813BB74(void) +{ + static const u8 gUnknown_085B3474[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; + + u8 i; + u8 retVal = 0; + + for (i = 0; i < 8; i++) + { + if (!((gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_085B3474[i]) & 1)) + { + retVal = i; + if ((Random() & 1) != 0) + { + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 1 << gUnknown_085B3474[retVal]; + return retVal; + } + } + } + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 1 << gUnknown_085B3474[retVal]; + return retVal; +} + +static u16 sub_813BC00(void) +{ + static const u8 gUnknown_085B347C[] = { 0x08, 0x0d, 0x0e, 0x0b, 0x0a, 0x0c, 0x0f, 0x09 }; + + u8 i; + u8 retVal = 0; + + if (GetNumMovedLilycoveFanClubMembers() == 1) + { + return 0; + } + + for (i = 0; i < 8; i++) + { + if (((gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_085B347C[i]) & 1) != 0) + { + retVal = i; + if ((Random() & 1) != 0) + { + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= 1 << gUnknown_085B347C[retVal]; + return retVal; + } + } + } + + if (((gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gUnknown_085B347C[retVal]) & 1)) + { + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] ^= 1 << gUnknown_085B347C[retVal]; + } + + return retVal; +} + +u16 GetNumMovedLilycoveFanClubMembers(void) +{ + u8 i; + u8 retVal = 0; + + for (i = 0; i < 8; i++) + { + if (((gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> (i + 8)) & 1) != 0) + { + retVal++; + } + } + + return retVal; +} + +void UpdateMovedLilycoveFanClubMembers(void) +{ + u8 i = 0; + if (gSaveBlock2Ptr->playTimeHours < 999) + { + while (TRUE) + { + if (GetNumMovedLilycoveFanClubMembers() < 5) + { + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] = gSaveBlock2Ptr->playTimeHours; + break; + } + else if (i == 8) + { + break; + } + else if (gSaveBlock2Ptr->playTimeHours - gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] < 12) + { + return; + } + sub_813BC00(); + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_2 - VARS_START] += 12; + i++; + } + } +} + +bool8 ShouldMoveLilycoveFanClubMember(void) +{ + return (gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> gSpecialVar_0x8004) & 1; +} + +static void sub_813BD84(void) +{ + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x2000; + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x100; + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x400; +} + +void BufferStreakTrainerText(void) +{ + u8 a = 0; + u8 b = 0; + switch (gSpecialVar_0x8004) + { + case 8: + break; + case 9: + break; + case 10: + a = 0; + b = 3; + break; + case 11: + a = 0; + b = 1; + break; + case 12: + a = 1; + b = 0; + break; + case 13: + a = 0; + b = 4; + break; + case 14: + a = 1; + b = 5; + break; + case 15: + break; + } + sub_813BE30(&gSaveBlock1Ptr->linkBattleRecords, a, b); +} + +static void sub_813BE30(struct LinkBattleRecords *linkRecords, u8 a, u8 b) +{ + struct LinkBattleRecord *record = &linkRecords->entries[a]; + if (record->name[0] == EOS) + { + switch (b) + { + case 0: + StringCopy(gStringVar1, gText_Wallace); + break; + case 1: + StringCopy(gStringVar1, gText_Steven); + break; + case 2: + StringCopy(gStringVar1, gText_Brawly); + break; + case 3: + StringCopy(gStringVar1, gText_Winona); + break; + case 4: + StringCopy(gStringVar1, gText_Phoebe); + break; + case 5: + StringCopy(gStringVar1, gText_Glacia); + break; + default: + StringCopy(gStringVar1, gText_Wallace); + break; + } + } + else + { + StringCopyN(gStringVar1, record->name, 7); + gStringVar1[7] = EOS; + ConvertInternationalString(gStringVar1, linkRecords->languages[a]); + } +} + +void sub_813BF10(void) +{ + if (VarGet(VAR_LILYCOVE_FAN_CLUB_STATE) == 2) + { + sub_813BA30(); + if (gBattleOutcome == 1) + { + sub_813BB74(); + } + else + { + sub_813BC00(); + } + } +} + +static bool8 sub_813BF44(void) +{ + return (gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] >> 7) & 1; +} + +void sub_813BF60(void) +{ + gSaveBlock1Ptr->vars[VAR_FANCLUB_UNKNOWN_1 - VARS_START] |= 0x80; +} + +u8 sub_813BF7C(void) +{ + return sub_813BADC(gSpecialVar_0x8004); +} diff --git a/src/field_tasks.c b/src/field_tasks.c new file mode 100644 index 000000000..fc57585e5 --- /dev/null +++ b/src/field_tasks.c @@ -0,0 +1,776 @@ +#include "global.h" +#include "task.h" +#include "main.h" +#include "constants/vars.h" +#include "bike.h" +#include "item.h" +#include "constants/items.h" +#include "event_data.h" +#include "overworld.h" +#include "clock.h" +#include "script.h" +#include "field_special_scene.h" +#include "field_effect_helpers.h" +#include "secret_base.h" +#include "metatile_behavior.h" +#include "fieldmap.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "constants/songs.h" +#include "sound.h" +#include "field_tasks.h" + +struct MetatileOffset +{ + s8 x; + s8 y; + u16 tileId; +}; + +// this file's functions +static void DummyPerStepCallback(u8 taskId); +static void PerStepCallback_8069F64(u8 taskId); +static void PerStepCallback_8069AA0(u8 taskId); +static void PerStepCallback_8069864(u8 taskId); +static void PerStepCallback_8069DD4(u8 taskId); +static void PerStepCallback_806A07C(u8 taskId); +static void Task_MuddySlope(u8 taskId); + +// const rom data +static void (*const gUnknown_08510348[])(u8) = +{ + DummyPerStepCallback, + PerStepCallback_8069F64, + PerStepCallback_8069AA0, + PerStepCallback_8069864, + PerStepCallback_8069DD4, + EndTruckSequence, + sub_80EA3E4, + PerStepCallback_806A07C +}; + +// they are in pairs but declared as 1D array +static const struct MetatileOffset gUnknown_08510368[] = +{ + { 0, 0,0x259}, { 0, 1,0x261}, + { 0, -1,0x259}, { 0, 0,0x261}, + { 0, 0,0x252}, { 1, 0,0x253}, + { -1, 0,0x252}, { 0, 0,0x253} +}; + +static const struct MetatileOffset gUnknown_08510388[] = +{ + { 0, 0,0x25A}, { 0, 1,0x262}, + { 0, -1,0x25A}, { 0, 0,0x262}, + { 0, 0,0x254}, { 1, 0,0x255}, + { -1, 0,0x254}, { 0, 0,0x255} +}; + +static const struct MetatileOffset gUnknown_085103A8[] = +{ + { 0, 0,0x258}, { 0, 1,0x260}, + { 0, -1,0x258}, { 0, 0,0x260}, + { 0, 0,0x250}, { 1, 0,0x251}, + { -1, 0,0x250}, { 0, 0,0x251} +}; + +static const u16 gUnknown_085103C8[] = +{ + 0, + 0, + 0, + 0, + 0, + 0, + VAR_TEMP_1, + VAR_TEMP_2, + VAR_TEMP_3, + VAR_TEMP_4, + 0, + 0, + VAR_TEMP_5, + VAR_TEMP_6, + VAR_TEMP_7, + 0, + 0, + VAR_TEMP_8, + VAR_TEMP_9, + VAR_TEMP_A, + 0, + 0, + 0, + 0, + 0, + 0 +}; + +static const u16 gUnknown_085103FC[] = {0xe8, 0xeb, 0xea, 0xe9}; + +// code +static void Task_RunPerStepCallback(u8 taskId) +{ + int idx = gTasks[taskId].data[0]; + gUnknown_08510348[idx](taskId); +} + +#define tState data[0] +#define tAmbientCryState data[1] +#define tAmbientCryDelay data[2] + +static void RunTimeBasedEvents(s16 *data) +{ + switch (tState) + { + case 0: + if (gMain.vblankCounter1 & 0x1000) + { + DoTimeBasedEvents(); + tState++; + } + break; + case 1: + if (!(gMain.vblankCounter1 & 0x1000)) + { + tState--; + } + break; + } +} + +static void Task_RunTimeBasedEvents(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (!ScriptContext2_IsEnabled()) + { + RunTimeBasedEvents(data); + UpdateAmbientCry(&tAmbientCryState, &tAmbientCryDelay); + } +} + +#undef tState +#undef tAmbientCryState +#undef tAmbientCryDelay + +void SetUpFieldTasks(void) +{ + if (!FuncIsActiveTask(Task_RunPerStepCallback)) + { + u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); + gTasks[taskId].data[0] = 0; + } + if (!FuncIsActiveTask(Task_MuddySlope)) + { + CreateTask(Task_MuddySlope, 0x50); + } + if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) + { + CreateTask(Task_RunTimeBasedEvents, 0x50); + } +} + +void ActivatePerStepCallback(u8 callbackId) +{ + u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); + if (taskId != 0xff) + { + s32 i; + s16 *data = gTasks[taskId].data; + + for (i = 0; i < 16; i++) + data[i] = 0; + + if (callbackId >= ARRAY_COUNT(gUnknown_08510348)) + { + data[0] = 0; + } + else + { + data[0] = callbackId; + } + } +} + +void ResetFieldTasksArgs(void) +{ + u8 taskId; + s16 *data; + + taskId = FindTaskIdByFunc(Task_RunPerStepCallback); + if (taskId != 0xff) + { + data = gTasks[taskId].data; + } + taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); + if (taskId != 0xff) + { + data = gTasks[taskId].data; + data[1] = 0; + data[2] = 0; + } +} + +static void DummyPerStepCallback(u8 taskId) +{ + +} + +static const struct MetatileOffset *sub_809DA30(const struct MetatileOffset *offsets, u16 metatileBehavior) +{ + if (MetatileBehavior_IsPacifilogVerticalLog1(metatileBehavior)) + return &offsets[0 * 2]; + else if (MetatileBehavior_IsPacifilogVerticalLog2(metatileBehavior)) + return &offsets[1 * 2]; + else if (MetatileBehavior_IsPacifilogHorizontalLog1(metatileBehavior)) + return &offsets[2 * 2]; + else if (MetatileBehavior_IsPacifilogHorizontalLog2(metatileBehavior)) + return &offsets[3 * 2]; + else + return NULL; +} + +static void sub_809DA88(const struct MetatileOffset *offsets, s16 x, s16 y, bool32 flag) +{ + offsets = sub_809DA30(offsets, MapGridGetMetatileBehaviorAt(x, y)); + + if (offsets != NULL) + { + MapGridSetMetatileIdAt(x + offsets[0].x, y + offsets[0].y, offsets[0].tileId); + if (flag) + CurrentMapDrawMetatileAt(x + offsets[0].x, y + offsets[0].y); + + MapGridSetMetatileIdAt(x + offsets[1].x, y + offsets[1].y, offsets[1].tileId); + if (flag) + CurrentMapDrawMetatileAt(x + offsets[1].x, y + offsets[1].y); + } +} + +static void sub_809DB10(s16 x, s16 y, bool32 flag) +{ + sub_809DA88(gUnknown_08510368, x, y, flag); +} + +static void sub_809DB34(s16 x, s16 y, bool32 flag) +{ + sub_809DA88(gUnknown_08510388, x, y, flag); +} + +static void sub_809DB58(s16 x, s16 y, bool32 flag) +{ + sub_809DA88(gUnknown_085103A8, x, y, flag); +} + +static bool32 sub_809DB7C(s16 x1, s16 y1, s16 x2, s16 y2) +{ + u16 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2); + + if (MetatileBehavior_IsPacifilogVerticalLog1(metatileBehavior)) + { + if (y1 > y2) + return FALSE; + } + else if (MetatileBehavior_IsPacifilogVerticalLog2(metatileBehavior)) + { + if (y1 < y2) + return FALSE; + } + else if (MetatileBehavior_IsPacifilogHorizontalLog1(metatileBehavior)) + { + if (x1 > x2) + return FALSE; + } + else if (MetatileBehavior_IsPacifilogHorizontalLog2(metatileBehavior)) + { + if (x1 < x2) + return FALSE; + } + return TRUE; +} + +static bool32 sub_809DC18(s16 x1, s16 y1, s16 x2, s16 y2) +{ + u16 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1); + + if (MetatileBehavior_IsPacifilogVerticalLog1(metatileBehavior)) + { + if (y1 < y2) + return FALSE; + } + else if (MetatileBehavior_IsPacifilogVerticalLog2(metatileBehavior)) + { + if (y1 > y2) + return FALSE; + } + else if (MetatileBehavior_IsPacifilogHorizontalLog1(metatileBehavior)) + { + if (x1 < x2) + return FALSE; + } + else if (MetatileBehavior_IsPacifilogHorizontalLog2(metatileBehavior)) + { + if (x1 > x2) + return FALSE; + } + return TRUE; +} + +static void PerStepCallback_8069864(u8 taskId) +{ + s16 *data; + s16 x, y; + data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + switch (data[1]) + { + case 0: + data[2] = x; + data[3] = y; + sub_809DB34(x, y, TRUE); + data[1] = 1; + break; + case 1: + if (x != data[2] || y != data[3]) + { + if (sub_809DB7C(x, y, data[2], data[3])) + { + sub_809DB10(data[2], data[3], TRUE); + sub_809DB58(data[2], data[3], FALSE); + data[4] = data[2]; + data[5] = data[3]; + data[1] = 2; + data[6] = 8; + } + else + { + data[4] = -1; + data[5] = -1; + } + if (sub_809DC18(x, y, data[2], data[3])) + { + sub_809DB10(x, y, TRUE); + data[1] = 2; + data[6] = 8; + } + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y))) + { + PlaySE(SE_MIZU); + } + } + break; + case 2: + if ((--data[6]) == 0) + { + sub_809DB34(x, y, TRUE); + if (data[4] != -1 && data[5] != -1) + { + sub_809DB58(data[4], data[5], TRUE); + } + data[1] = 1; + } + break; + } +} + +static void sub_809DE28(s16 x, s16 y) +{ + u8 z = PlayerGetZCoord(); + if (!(z & 0x01)) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x24e: + MapGridSetMetatileIdAt(x, y, 0x24f); + break; + case 0x256: + MapGridSetMetatileIdAt(x, y, 0x257); + break; + } + } +} + +static void sub_809DE8C(s16 x, s16 y) +{ + u8 z = PlayerGetZCoord(); + if (!(z & 0x01)) + { + switch (MapGridGetMetatileIdAt(x, y)) + { + case 0x24f: + MapGridSetMetatileIdAt(x, y, 0x24e); + break; + case 0x257: + MapGridSetMetatileIdAt(x, y, 0x256); + break; + } + } +} + +static void PerStepCallback_8069AA0(u8 taskId) +{ + bool8 isFortreeBridgeCur; + bool8 isFortreeBridgePrev; + u8 z, flag; + s16 x, y, x2, y2; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + switch (data[1]) + { + default: + break; + case 0: + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y))) + { + sub_809DE28(x, y); + CurrentMapDrawMetatileAt(x, y); + } + data[1] = 1; + break; + case 1: + x2 = data[2]; + y2 = data[3]; + if (x == x2 && y == y2) + { + break; + } + isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)); + isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2)); + z = PlayerGetZCoord(); + flag = 0; + if ((u8)(z & 1) == 0) + { + flag = 1; + } + if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1)) + { + PlaySE(SE_HASHI); + } + if (isFortreeBridgePrev) + { + sub_809DE8C(x2, y2); + CurrentMapDrawMetatileAt(x2, y2); + sub_809DE28(x, y); + CurrentMapDrawMetatileAt(x, y); + } + data[4] = x2; + data[5] = y2; + data[2] = x; + data[3] = y; + if (!isFortreeBridgePrev) + { + break; + } + data[6] = 16; + data[1] = 2; + // fallthrough + case 2: + data[6]--; + x2 = data[4]; + y2 = data[5]; + switch (data[6] % 7) + { + case 0: + CurrentMapDrawMetatileAt(x2, y2); + case 1: + case 2: + case 3: + break; + case 4: + sub_809DE28(x2, y2); + CurrentMapDrawMetatileAt(x2, y2); + sub_809DE8C(x2, y2); + case 5: + case 6: + case 7: + break; + } + if (data[6] == 0) + { + data[1] = 1; + } + break; + } +} + +static bool32 sub_809E108(s16 x, s16 y) +{ + if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_085103C8[y]) + return TRUE; + else + return FALSE; +} + +static void sub_809E14C(s16 x, s16 y) +{ + if (sub_809E108(x, y)) + *GetVarPointer(gUnknown_085103C8[y]) |= (1 << (x - 3)); +} + +static bool32 sub_809E184(s16 x, s16 y) +{ + u32 var; + if (!sub_809E108(x, y)) + return FALSE; + + var = VarGet(gUnknown_085103C8[y]) << 16; + if (((1 << 16) << (x - 3)) & var) // TODO: fix that if + return TRUE; + else + return FALSE; +} + +void SetSootopolisGymCrackedIceMetatiles(void) +{ + s32 x, y; + s32 width = gMapHeader.mapLayout->width; + s32 height = gMapHeader.mapLayout->height; + for (x = 0; x < width; x++) + { + for (y = 0; y < height; y++) + { + if (sub_809E184(x, y) == TRUE) + { + MapGridSetMetatileIdAt(x + 7, y + 7, 0x20e); + } + } + } +} + +static void PerStepCallback_8069DD4(u8 taskId) +{ + s16 x, y; + u16 tileBehavior; + u16 *var; + s16 *data = gTasks[taskId].data; + switch (data[1]) + { + case 0: + PlayerGetDestCoords(&x, &y); + data[2] = x; + data[3] = y; + data[1] = 1; + break; + case 1: + PlayerGetDestCoords(&x, &y); + if (x != data[2] || y != data[3]) + { + data[2] = x; + data[3] = y; + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + var = GetVarPointer(VAR_ICE_STEP_COUNT); + if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) + { + (*var)++; + data[6] = 4; + data[1] = 2; + data[4] = x; + data[5] = y; + } + else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) + { + *var = 0; + data[6] = 4; + data[1] = 3; + data[4] = x; + data[5] = y; + } + } + break; + case 2: + if (data[6] != 0) + { + data[6]--; + } + else + { + x = data[4]; + y = data[5]; + PlaySE(SE_RU_BARI); + MapGridSetMetatileIdAt(x, y, 0x20e); + CurrentMapDrawMetatileAt(x, y); + sub_809E14C(x - 7, y - 7); + data[1] = 1; + } + break; + case 3: + if (data[6] != 0) + { + data[6]--; + } + else + { + x = data[4]; + y = data[5]; + PlaySE(SE_RU_GASYAN); + MapGridSetMetatileIdAt(x, y, 0x206); + CurrentMapDrawMetatileAt(x, y); + data[1] = 1; + } + break; + } +} + +static void PerStepCallback_8069F64(u8 taskId) +{ + s16 x, y; + u16 *var; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + if (x != data[1] || y != data[2]) + { + data[1] = x; + data[2] = y; + if (MetatileBehavior_IsAshGrass(MapGridGetMetatileBehaviorAt(x, y))) + { + if (MapGridGetMetatileIdAt(x, y) == 0x20a) + { + ash(x, y, 0x212, 4); + } + else + { + ash(x, y, 0x206, 4); + } + if (CheckBagHasItem(ITEM_SOOT_SACK, 1)) + { + var = GetVarPointer(VAR_ASH_GATHER_COUNT); + if (*var < 9999) + { + (*var)++; + } + } + } + } +} + +static void sub_809E490(s16 x, s16 y) +{ + MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237); + CurrentMapDrawMetatileAt(x, y); +} + +static void PerStepCallback_806A07C(u8 taskId) +{ + s16 x, y; + u16 behavior; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + if (data[4] != 0 && (--data[4]) == 0) + { + sub_809E490(data[5], data[6]); + } + if (data[7] != 0 && (--data[7]) == 0) + { + sub_809E490(data[8], data[9]); + } + if (MetatileBehavior_IsCrackedFloorHole(behavior)) + { + VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty + } + if ((x != data[2] || y != data[3])) + { + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsCrackedFloor(behavior)) + { + if (GetPlayerSpeed() != 4) + { + VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty + } + if (data[4] == 0) + { + data[4] = 3; + data[5] = x; + data[6] = y; + } + else if (data[7] == 0) + { + data[7] = 3; + data[8] = x; + data[9] = y; + } + } + } +} + +static void sub_809E5DC(s16 *data, s16 x, s16 y) +{ + u16 tile; + if ((--data[0]) == 0) + { + tile = 0xe8; + } + else + { + tile = gUnknown_085103FC[data[0] / 8]; + } + MapGridSetMetatileIdAt(x, y, tile); + CurrentMapDrawMetatileAt(x, y); + MapGridSetMetatileIdAt(x, y, 0xe8); +} + +static void Task_MuddySlope(u8 taskId) +{ + s16 x, y, x2, y2; + int i; + u16 mapIndices; + s16 *data = gTasks[taskId].data; + PlayerGetDestCoords(&x, &y); + mapIndices = (gSaveBlock1Ptr->location.mapGroup << 8) | gSaveBlock1Ptr->location.mapNum; + switch (data[1]) + { + case 0: + data[0] = mapIndices; + data[2] = x; + data[3] = y; + data[1] = 1; + data[4] = 0; + data[7] = 0; + data[10] = 0; + data[13] = 0; + break; + case 1: + if (data[2] != x || data[3] != y) + { + data[2] = x; + data[3] = y; + if (MetatileBehavior_IsMuddySlope(MapGridGetMetatileBehaviorAt(x, y))) + { + for (i=4; i<14; i+=3) + { + if (data[i] == 0) + { + data[i] = 32; + data[i + 1] = x; + data[i + 2] = y; + break; + } + } + } + } + break; + } + if (gCamera.active && mapIndices != data[0]) + { + data[0] = mapIndices; + x2 = gCamera.x; + y2 = gCamera.y; + } + else + { + x2 = 0; + y2 = 0; + } + for (i = 4; i < 14; i += 3) + { + if (data[i]) + { + data[i + 1] -= x2; + data[i + 2] -= y2; + sub_809E5DC(&data[i], data[i + 1], data[i + 2]); + } + } +} diff --git a/src/fieldmap.c b/src/fieldmap.c new file mode 100644 index 000000000..f57c4b48f --- /dev/null +++ b/src/fieldmap.c @@ -0,0 +1,1034 @@ +#include "global.h" +#include "overworld.h" +#include "bg.h" +#include "battle_frontier_2.h" +#include "constants/rgb.h" +#include "fieldmap.h" +#include "fldeff_80F9BCC.h" +#include "fldeff_cut.h" +#include "fldeff_groundshake.h" +#include "menu.h" +#include "palette.h" +#include "pokenav.h" +#include "script.h" +#include "secret_base.h" +#include "tv.h" + +struct ConnectionFlags +{ + u8 south:1; + u8 north:1; + u8 west:1; + u8 east:1; +}; + +EWRAM_DATA static u16 gUnknown_02032318[0x2800] = {0}; +EWRAM_DATA struct MapHeader gMapHeader = {0}; +EWRAM_DATA struct Camera gCamera = {0}; +EWRAM_DATA static struct ConnectionFlags gUnknown_02037340 = {0}; +EWRAM_DATA static u32 sFiller_02037344 = 0; // without this, the next file won't align properly + +struct BackupMapLayout gUnknown_03005DC0; + +static const struct ConnectionFlags sDummyConnectionFlags = {0}; + +struct MapHeader const *const mapconnection_get_mapheader(struct MapConnection *connection) +{ + return Overworld_GetMapHeaderByGroupAndId(connection->mapGroup, connection->mapNum); +} + +void not_trainer_hill_battle_pyramid(void) +{ + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80E8EE0(gMapHeader.events); + mapheader_run_script_with_tag_x1(); +} + +void sub_8087D74(void) +{ + mapheader_copy_mapdata_with_padding(&gMapHeader); + sub_80E9238(0); + sub_80E8EE0(gMapHeader.events); + mapdata_from_sav2(); + mapheader_run_script_with_tag_x1(); + UpdateTVScreensOnMap(gUnknown_03005DC0.width, gUnknown_03005DC0.height); +} + +void battle_pyramid_map_load_related(u8 a0) +{ + CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318)); + sub_81AA078(gUnknown_02032318, a0); +} + +void trainer_hill_map_load_related(void) +{ + CpuFastFill(0x03ff03ff, gUnknown_02032318, sizeof(gUnknown_02032318)); + sub_81D5FB4(gUnknown_02032318); +} + +void mapheader_copy_mapdata_with_padding(struct MapHeader *mapHeader) +{ + struct MapLayout const *mapLayout; + int width; + int height; + mapLayout = mapHeader->mapLayout; + CpuFastFill16(0x03ff, gUnknown_02032318, sizeof(gUnknown_02032318)); + gUnknown_03005DC0.map = gUnknown_02032318; + width = mapLayout->width + 15; + gUnknown_03005DC0.width = width; + height = mapLayout->height + 14; + gUnknown_03005DC0.height = height; + if (width * height <= 0x2800) + { + map_copy_with_padding(mapLayout->map, mapLayout->width, mapLayout->height); + mapheader_copy_mapdata_of_adjacent_maps(mapHeader); + } +} + +void map_copy_with_padding(u16 *map, u16 width, u16 height) +{ + u16 *dest; + int y; + dest = gUnknown_03005DC0.map; + dest += gUnknown_03005DC0.width * 7 + 7; + for (y = 0; y < height; y++) + { + CpuCopy16(map, dest, width * 2); + dest += width + 0xf; + map += width; + } +} + +void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) +{ + int count; + struct MapConnection *connection; + int i; + + if (mapHeader->connections) + { + count = mapHeader->connections->count; + connection = mapHeader->connections->connections; + + gUnknown_02037340 = sDummyConnectionFlags; + for (i = 0; i < count; i++, connection++) + { + struct MapHeader const *cMap = mapconnection_get_mapheader(connection); + u32 offset = connection->offset; + + switch (connection->direction) + { + case CONNECTION_SOUTH: + fillSouthConnection(mapHeader, cMap, offset); + gUnknown_02037340.south = 1; + break; + case CONNECTION_NORTH: + fillNorthConnection(mapHeader, cMap, offset); + gUnknown_02037340.north = 1; + break; + case CONNECTION_WEST: + fillWestConnection(mapHeader, cMap, offset); + gUnknown_02037340.west = 1; + break; + case CONNECTION_EAST: + fillEastConnection(mapHeader, cMap, offset); + gUnknown_02037340.east = 1; + break; + } + } + } +} + +void sub_8087F54(int x, int y, struct MapHeader const *mapHeader, int x2, int y2, int width, int height) +{ + int i; + u16 *src; + u16 *dest; + int mapWidth; + + mapWidth = mapHeader->mapLayout->width; + src = &mapHeader->mapLayout->map[mapWidth * y2 + x2]; + dest = &gUnknown_03005DC0.map[gUnknown_03005DC0.width * y + x]; + + for (i = 0; i < height; i++) + { + CpuCopy16(src, dest, width * 2); + dest += gUnknown_03005DC0.width; + src += mapWidth; + } +} + +void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +{ + int x, y; + int x2; + int width; + int cWidth; + + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapLayout->width; + x = offset + 7; + y = mapHeader->mapLayout->height + 7; + if (x < 0) + { + x2 = -x; + x += cWidth; + if (x < gUnknown_03005DC0.width) + { + width = x; + } + else + { + width = gUnknown_03005DC0.width; + } + x = 0; + } + else + { + x2 = 0; + if (x + cWidth < gUnknown_03005DC0.width) + { + width = cWidth; + } + else + { + width = gUnknown_03005DC0.width - x; + } + } + + sub_8087F54( + x, y, + connectedMapHeader, + x2, /*y2*/ 0, + width, /*height*/ 7); + } +} + +void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +{ + int x; + int x2, y2; + int width; + int cWidth, cHeight; + + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapLayout->width; + cHeight = connectedMapHeader->mapLayout->height; + x = offset + 7; + y2 = cHeight - 7; + if (x < 0) + { + x2 = -x; + x += cWidth; + if (x < gUnknown_03005DC0.width) + { + width = x; + } + else + { + width = gUnknown_03005DC0.width; + } + x = 0; + } + else + { + x2 = 0; + if (x + cWidth < gUnknown_03005DC0.width) + { + width = cWidth; + } + else + { + width = gUnknown_03005DC0.width - x; + } + } + + sub_8087F54( + x, /*y*/ 0, + connectedMapHeader, + x2, y2, + width, /*height*/ 7); + + } +} + +void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +{ + int y; + int x2, y2; + int height; + int cWidth, cHeight; + if (connectedMapHeader) + { + cWidth = connectedMapHeader->mapLayout->width; + cHeight = connectedMapHeader->mapLayout->height; + y = offset + 7; + x2 = cWidth - 7; + if (y < 0) + { + y2 = -y; + if (y + cHeight < gUnknown_03005DC0.height) + { + height = y + cHeight; + } + else + { + height = gUnknown_03005DC0.height; + } + y = 0; + } + else + { + y2 = 0; + if (y + cHeight < gUnknown_03005DC0.height) + { + height = cHeight; + } + else + { + height = gUnknown_03005DC0.height - y; + } + } + + sub_8087F54( + /*x*/ 0, y, + connectedMapHeader, + x2, y2, + /*width*/ 7, height); + } +} + +void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +{ + int x, y; + int y2; + int height; + int cHeight; + if (connectedMapHeader) + { + cHeight = connectedMapHeader->mapLayout->height; + x = mapHeader->mapLayout->width + 7; + y = offset + 7; + if (y < 0) + { + y2 = -y; + if (y + cHeight < gUnknown_03005DC0.height) + { + height = y + cHeight; + } + else + { + height = gUnknown_03005DC0.height; + } + y = 0; + } + else + { + y2 = 0; + if (y + cHeight < gUnknown_03005DC0.height) + { + height = cHeight; + } + else + { + height = gUnknown_03005DC0.height - y; + } + } + + sub_8087F54( + x, y, + connectedMapHeader, + /*x2*/ 0, y2, + /*width*/ 8, height); + } +} + +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 < gUnknown_03005DC0.width + && y >= 0 && y < gUnknown_03005DC0.height) + { + block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y]; + } + else + { + border = gMapHeader.mapLayout->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapLayout->border[i]; + block |= 0xc00; + } + + if (block == 0x3ff) + { + return 0; + } + + return block >> 12; +} + +u8 MapGridIsImpassableAt(int x, int y) +{ + u16 block; + int i; + u16 *border; + + if (x >= 0 && x < gUnknown_03005DC0.width + && y >= 0 && y < gUnknown_03005DC0.height) + { + block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y]; + } + else + { + border = gMapHeader.mapLayout->border; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = gMapHeader.mapLayout->border[i]; + block |= 0xc00; + } + if (block == 0x3ff) + { + return 1; + } + return (block & 0xc00) >> 10; +} + +u32 MapGridGetMetatileIdAt(int x, int y) +{ + u16 block; + int i; + int j; + struct MapLayout const *mapLayout; + u16 *border; + u16 block2; + + if (x >= 0 && x < gUnknown_03005DC0.width + && y >= 0 && y < gUnknown_03005DC0.height) + { + block = gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y]; + } + else + { + mapLayout = gMapHeader.mapLayout; + i = (x + 1) & 1; + i += ((y + 1) & 1) * 2; + block = mapLayout->border[i] | 0xc00; + } + if (block == 0x3ff) + { + border = gMapHeader.mapLayout->border; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = gMapHeader.mapLayout->border[j]; + block2 |= 0xc00; + return block2 & block; + } + return block & 0x3ff; +} + +u32 MapGridGetMetatileBehaviorAt(int x, int y) +{ + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return GetBehaviorByMetatileId(metatile) & 0xff; +} + +u8 MapGridGetMetatileLayerTypeAt(int x, int y) +{ + u16 metatile; + metatile = MapGridGetMetatileIdAt(x, y); + return (GetBehaviorByMetatileId(metatile) & 0xf000) >> 12; +} + +void MapGridSetMetatileIdAt(int x, int y, u16 metatile) +{ + int i; + if (x >= 0 && x < gUnknown_03005DC0.width + && y >= 0 && y < gUnknown_03005DC0.height) + { + i = x + y * gUnknown_03005DC0.width; + gUnknown_03005DC0.map[i] = (gUnknown_03005DC0.map[i] & 0xf000) | (metatile & 0xfff); + } +} + +void MapGridSetMetatileEntryAt(int x, int y, u16 metatile) +{ + int i; + if (x >= 0 && x < gUnknown_03005DC0.width + && y >= 0 && y < gUnknown_03005DC0.height) + { + i = x + gUnknown_03005DC0.width * y; + gUnknown_03005DC0.map[i] = metatile; + } +} + +u16 GetBehaviorByMetatileId(u16 metatile) +{ + u16 *attributes; + if (metatile <= 0x1ff) + { + attributes = gMapHeader.mapLayout->primaryTileset->metatileAttributes; + return attributes[metatile]; + } + else if (metatile <= 0x3ff) + { + attributes = gMapHeader.mapLayout->secondaryTileset->metatileAttributes; + return attributes[metatile - 0x200]; + } + else + { + return 0xff; + } +} + +void save_serialize_map(void) +{ + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1Ptr->mapView; + width = gUnknown_03005DC0.width; + x = gSaveBlock1Ptr->pos.x; + y = gSaveBlock1Ptr->pos.y; + for (i = y; i < y + 14; i++) + { + for (j = x; j < x + 15; j++) + { + *mapView++ = gUnknown_02032318[width * i + j]; + } + } +} + +int sub_8088438(void) +{ + u16 i; + u32 r2; + r2 = 0; + for (i = 0; i < 0x200; i++) + { + r2 |= gSaveBlock1Ptr->mapView[i]; + } + if (r2 == 0) + { + return 1; + } + return 0; +} + +void sav2_mapdata_clear(void) +{ + CpuFill16(0, gSaveBlock1Ptr->mapView, sizeof(gSaveBlock1Ptr->mapView)); +} + +void mapdata_from_sav2(void) +{ + u8 a0; + int i, j; + int x, y; + u16 *mapView; + int width; + mapView = gSaveBlock1Ptr->mapView; + if (!sub_8088438()) + { + width = gUnknown_03005DC0.width; + x = gSaveBlock1Ptr->pos.x; + y = gSaveBlock1Ptr->pos.y; + for (i = y; i < y + 14; i++) + { + if (i == y && i != 0) + a0 = 0; + else if (i == y + 13 && i != gMapHeader.mapLayout->height - 1) + a0 = 1; + else + a0 = -1; + + for (j = x; j < x + 15; j++) + { + if (!sub_8088BF0(&gUnknown_02032318[j + width * i], width, a0)) + gUnknown_02032318[j + width * i] = *mapView; + mapView++; + } + } + for (j = x; j < x + 15; j++) + { + if (y != 0) + sub_80D423C(j, y - 1); + if (i < gMapHeader.mapLayout->height - 1) + sub_80D42B8(j, y + 13); + } + sav2_mapdata_clear(); + } +} + +void sub_80885C4(u8 a1) +{ + int width; + u16 *mapView; + int x0, y0; + int x2, y2; + u16 *src, *dest; + int srci, desti; + int r9, r8; + int x, y; + int i, j; + mapView = gSaveBlock1Ptr->mapView; + width = gUnknown_03005DC0.width; + r9 = 0; + r8 = 0; + x0 = gSaveBlock1Ptr->pos.x; + y0 = gSaveBlock1Ptr->pos.y; + x2 = 15; + y2 = 14; + switch (a1) + { + case CONNECTION_NORTH: + y0 += 1; + y2 = 13; + break; + case CONNECTION_SOUTH: + r8 = 1; + y2 = 13; + break; + case CONNECTION_WEST: + x0 += 1; + x2 = 14; + break; + case CONNECTION_EAST: + r9 = 1; + x2 = 14; + break; + } + for (y = 0; y < y2; y++) + { + i = 0; + j = 0; + for (x = 0; x < x2; x++) + { + desti = width * (y + y0); + srci = (y + r8) * 15 + r9; + src = &mapView[srci + i]; + dest = &gUnknown_02032318[x0 + desti + j]; + *dest = *src; + i++; + j++; + } + } + sav2_mapdata_clear(); +} + +int GetMapBorderIdAt(int x, int y) +{ + struct MapLayout const *mapLayout; + u16 block, block2; + int i, j; + if (x >= 0 && x < gUnknown_03005DC0.width + && y >= 0 && y < gUnknown_03005DC0.height) + { + i = gUnknown_03005DC0.width; + i *= y; + block = gUnknown_03005DC0.map[x + i]; + if (block == 0x3ff) + { + goto fail; + } + } + else + { + mapLayout = gMapHeader.mapLayout; + j = (x + 1) & 1; + j += ((y + 1) & 1) * 2; + block2 = 0xc00 | mapLayout->border[j]; + if (block2 == 0x3ff) + { + goto fail; + } + } + goto success; +fail: + return -1; +success: + + if (x >= (gUnknown_03005DC0.width - 8)) + { + if (!gUnknown_02037340.east) + { + return -1; + } + return CONNECTION_EAST; + } + else if (x < 7) + { + if (!gUnknown_02037340.west) + { + return -1; + } + return CONNECTION_WEST; + } + else if (y >= (gUnknown_03005DC0.height - 7)) + { + if (!gUnknown_02037340.south) + { + return -1; + } + return CONNECTION_SOUTH; + } + else if (y < 7) + { + if (!gUnknown_02037340.north) + { + return -1; + } + return CONNECTION_NORTH; + } + else + { + return 0; + } +} + +int GetPostCameraMoveMapBorderId(int x, int y) +{ + return GetMapBorderIdAt(gSaveBlock1Ptr->pos.x + 7 + x, gSaveBlock1Ptr->pos.y + 7 + y); +} + +int CanCameraMoveInDirection(int direction) +{ + int x, y; + x = gSaveBlock1Ptr->pos.x + 7 + gUnknown_08339D64[direction].x; + y = gSaveBlock1Ptr->pos.y + 7 + gUnknown_08339D64[direction].y; + if (GetMapBorderIdAt(x, y) == -1) + { + return 0; + } + return 1; +} + +void sub_80887F8(struct MapConnection *connection, int direction, int x, int y) +{ + struct MapHeader const *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) + { + case CONNECTION_EAST: + gSaveBlock1Ptr->pos.x = -x; + gSaveBlock1Ptr->pos.y -= connection->offset; + break; + case CONNECTION_WEST: + gSaveBlock1Ptr->pos.x = mapHeader->mapLayout->width; + gSaveBlock1Ptr->pos.y -= connection->offset; + break; + case CONNECTION_SOUTH: + gSaveBlock1Ptr->pos.x -= connection->offset; + gSaveBlock1Ptr->pos.y = -y; + break; + case CONNECTION_NORTH: + gSaveBlock1Ptr->pos.x -= connection->offset; + gSaveBlock1Ptr->pos.y = mapHeader->mapLayout->height; + break; + } +} + +bool8 CameraMove(int x, int y) +{ + unsigned int direction; + struct MapConnection *connection; + int old_x, old_y; + gCamera.active = FALSE; + direction = GetPostCameraMoveMapBorderId(x, y); + if (direction + 1 <= 1) + { + gSaveBlock1Ptr->pos.x += x; + gSaveBlock1Ptr->pos.y += y; + } + else + { + save_serialize_map(); + sub_81BE72C(); + 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); + mliX_load_map(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); + } + return gCamera.active; +} + +struct MapConnection *sub_8088950(u8 direction, int x, int y) +{ + int count; + struct MapConnection *connection; + int i; + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) + { + if (connection->direction == direction && sub_80889A8(direction, x, y, connection) == TRUE) + return connection; + } + return NULL; +} + +bool8 sub_80889A8(u8 direction, int x, int y, struct MapConnection *connection) +{ + struct MapHeader const *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (direction) + { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8088A0C(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 FALSE; +} + +bool8 sub_8088A0C(int x, int src_width, int dest_width, int offset) +{ + int offset2; + offset2 = offset; + + if (offset2 < 0) + offset2 = 0; + + if (dest_width + offset < src_width) + src_width = dest_width + offset; + + if (offset2 <= x && x <= src_width) + return TRUE; + + return FALSE; +} + +int sub_8088A38(int x, int width) +{ + if (x >= 0 && x < width) + return TRUE; + + return FALSE; +} + +int sub_8088A4C(struct MapConnection *connection, int x, int y) +{ + struct MapHeader const *mapHeader; + mapHeader = mapconnection_get_mapheader(connection); + switch (connection->direction) + { + case CONNECTION_SOUTH: + case CONNECTION_NORTH: + return sub_8088A38(x - connection->offset, mapHeader->mapLayout->width); + case CONNECTION_WEST: + case CONNECTION_EAST: + return sub_8088A38(y - connection->offset, mapHeader->mapLayout->height); + } + return FALSE; +} + +struct MapConnection *sub_8088A8C(s16 x, s16 y) +{ + int count; + struct MapConnection *connection; + int i; + u8 direction; + if (!gMapHeader.connections) + { + return NULL; + } + else + { + count = gMapHeader.connections->count; + connection = gMapHeader.connections->connections; + for (i = 0; i < count; i++, connection++) + { + direction = connection->direction; + if ((direction == CONNECTION_DIVE || direction == CONNECTION_EMERGE) + || (direction == CONNECTION_NORTH && y > 6) + || (direction == CONNECTION_SOUTH && y < gMapHeader.mapLayout->height + 7) + || (direction == CONNECTION_WEST && x > 6) + || (direction == CONNECTION_EAST && x < gMapHeader.mapLayout->width + 7)) + { + continue; + } + if (sub_8088A4C(connection, x - 7, y - 7) == TRUE) + { + return connection; + } + } + } + return NULL; +} + +void sub_8088B3C(u16 x, u16 y) +{ + gSaveBlock1Ptr->pos.x = x - 7; + gSaveBlock1Ptr->pos.y = y - 7; +} + +void sav1_camera_get_focus_coords(u16 *x, u16 *y) +{ + *x = gSaveBlock1Ptr->pos.x + 7; + *y = gSaveBlock1Ptr->pos.y + 7; +} + +void SetCameraCoords(u16 x, u16 y) +{ + gSaveBlock1Ptr->pos.x = x; + gSaveBlock1Ptr->pos.y = y; +} + +void GetCameraCoords(u16 *x, u16 *y) +{ + *x = gSaveBlock1Ptr->pos.x; + *y = gSaveBlock1Ptr->pos.y; +} + +void sub_8088B94(int x, int y, int a2) +{ + if (x >= 0 && x < gUnknown_03005DC0.width && y >= 0 && y < gUnknown_03005DC0.height) + { + if (a2 != 0) + gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] |= 0xC00; + else + gUnknown_03005DC0.map[x + gUnknown_03005DC0.width * y] &= 0xF3FF; + } +} + +bool8 sub_8088BF0(u16* a0, u16 a1, u8 a2) +{ + if (a2 == 0xFF) + return FALSE; + + if (a2 == 0) + a0 -= a1; + else + a0 += a1; + + if (sub_80FADE4(*a0 & 0x3FF, a2) == 1) + return TRUE; + return FALSE; +} + +void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset) +{ + if (tileset) + { + if (!tileset->isCompressed) + LoadBgTiles(2, tileset->tiles, numTiles * 32, offset); + else + decompress_and_copy_tile_data_to_vram(2, tileset->tiles, numTiles * 32, offset, 0); + } +} + +void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset) +{ + if (tileset) + { + if (!tileset->isCompressed) + LoadBgTiles(2, tileset->tiles, numTiles * 32, offset); + else + copy_decompressed_tile_data_to_vram_autofree(2, tileset->tiles, numTiles * 32, offset, 0); + } +} + +void nullsub_3(u16 a0, u16 a1) +{ + +} + +void nullsub_90(void) +{ + +} + +void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size) +{ + u16 black = RGB_BLACK; + + if (tileset) + { + if (tileset->isSecondary == FALSE) + { + LoadPalette(&black, destOffset, 2); + LoadPalette(((u16*)tileset->palettes) + 1, destOffset + 1, size - 2); + nullsub_3(destOffset + 1, (size - 2) >> 1); + } + else if (tileset->isSecondary == TRUE) + { + LoadPalette(((u16*)tileset->palettes) + 0x60, destOffset, size); + nullsub_3(destOffset, size >> 1); + } + else + { + LoadCompressedPalette((u16*)tileset->palettes, destOffset, size); + nullsub_3(destOffset, size >> 1); + } + } +} + +void copy_map_tileset1_to_vram(struct MapLayout const *mapLayout) +{ + copy_tileset_patterns_to_vram(mapLayout->primaryTileset, 0x200, 0); +} + +void copy_map_tileset2_to_vram(struct MapLayout const *mapLayout) +{ + copy_tileset_patterns_to_vram(mapLayout->secondaryTileset, 0x200, 0x200); +} + +void copy_map_tileset2_to_vram_2(struct MapLayout const *mapLayout) +{ + copy_tileset_patterns_to_vram2(mapLayout->secondaryTileset, 0x200, 0x200); +} + +void apply_map_tileset1_palette(struct MapLayout const *mapLayout) +{ + apply_map_tileset_palette(mapLayout->primaryTileset, 0, 0xC0); +} + +void apply_map_tileset2_palette(struct MapLayout const *mapLayout) +{ + apply_map_tileset_palette(mapLayout->secondaryTileset, 0x60, 0xE0); +} + +void copy_map_tileset1_tileset2_to_vram(struct MapLayout const *mapLayout) +{ + if (mapLayout) + { + copy_tileset_patterns_to_vram2(mapLayout->primaryTileset, 0x200, 0); + copy_tileset_patterns_to_vram2(mapLayout->secondaryTileset, 0x200, 0x200); + } +} + +void apply_map_tileset1_tileset2_palette(struct MapLayout const *mapLayout) +{ + if (mapLayout) + { + apply_map_tileset1_palette(mapLayout); + apply_map_tileset2_palette(mapLayout); + } +} diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c index 9929dd6f9..9de954e80 100644 --- a/src/fldeff_cut.c +++ b/src/fldeff_cut.c @@ -1,19 +1,683 @@ - -// Includes #include "global.h" +#include "fldeff_cut.h" +#include "field_camera.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "event_obj_lock.h" +#include "metatile_behavior.h" +#include "party_menu.h" +#include "overworld.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "malloc.h" +#include "constants/event_objects.h" +#include "constants/songs.h" +#include "constants/abilities.h" + +extern bool8 CheckObjectGraphicsInFrontOfPlayer(u8); +extern u8 oei_task_add(void); +extern void ScriptUnfreezeEventObjects(void); +extern bool8 IsMewPlayingHideAndSeek(void); + +extern struct MapPosition gPlayerFacingPosition; + +extern const u8 Route103_EventScript_290705[]; +extern const u8 FarawayIsland_Interior_EventScript_267EDB[]; + +extern const u8 gFieldEffectPic_CutGrass[]; +extern const u16 gFieldEffectObjectPalette6[]; + +// tileset 0 as first +#define METATILE_ID_GRASS 0x1 +#define METATILE_ID_POKE_GRASS 0xD + +#define METATILE_ID_POKE_GRASS_TREE_UP 0x25 +#define METATILE_ID_GRASS_TREE_UP 0xE + +#define METATILE_ID_POKE_GRASS_TREE_LEFT 0x1C6 +#define METATILE_ID_POKE_GRASS_TREE_RIGHT 0x1C7 + +#define METATILE_ID_GRASS_TREE_LEFT 0x1CE +#define METATILE_ID_GRASS_TREE_RIGHT 0x1CF + +#define METATILE_ID_POKE_LONG_GRASS 0x15 + +// tileset 6 as second +#define METATILE_ID_POKE_STEP_LAVA_GRASS 0x206 +#define METATILE_ID_POKE_LAVA_GRASS 0x207 +#define METATILE_ID_LAVA_FIELD 0x271 + +// tileset 7 as second +#define METATILE_ID_POKE_ASH_GRASS 0x20A +#define METATILE_ID_POKE_STEP_ASH_GRASS 0x212 +#define METATILE_ID_ASH 0x218 + +// tileset 8 as second +#define METATILE_ID_POKE_LONG_GRASS_START 0x208 + +#define METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS 0x279 +#define METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS 0x27A +#define METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS 0x27B + +#define METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS 0x281 +#define METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS 0x282 +#define METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS 0x283 + +// cut 'square' defines +#define CUT_NORMAL_SIDE 3 +#define CUT_NORMAL_AREA CUT_NORMAL_SIDE * CUT_NORMAL_SIDE + +#define CUT_HYPER_SIDE 5 +#define CUT_HYPER_AREA CUT_HYPER_SIDE * CUT_HYPER_SIDE + +#define CUT_SPRITE_ARRAY_COUNT 8 + +struct HyperCutterUnk +{ + s8 x; + s8 y; + u8 unk2[2]; +}; + +// this file's functions +static void FieldCallback_CutTree(void); +static void FieldCallback_CutGrass(void); +static void StartCutTreeFieldEffect(void); +static void StartCutGrassFieldEffect(void); +static void SetCutGrassMetatile(s16, s16); +static void SetCutGrassMetatiles(s16, s16); +static void CutGrassSpriteCallback1(struct Sprite *); +static void CutGrassSpriteCallback2(struct Sprite *); +static void CutGrassSpriteCallbackEnd(struct Sprite *); +static void HandleLongGrassOnHyper(u8, s16, s16); + +// IWRAM variables +static IWRAM_DATA u8 sCutSquareSide; +static IWRAM_DATA u8 sTileCountFromPlayer_X; +static IWRAM_DATA u8 sTileCountFromPlayer_Y; +static IWRAM_DATA u32 sUnused; +static IWRAM_DATA bool8 sHyperCutTiles[CUT_HYPER_AREA]; + +// EWRAM variables +static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; + +// const rom data +static const struct HyperCutterUnk sHyperCutStruct[] = +{ + {-2, -2, {1}}, + {-1, -2, {1}}, + {0, -2, {2}}, + {1, -2, {3}}, + {2, -2, {3}}, + {-2, -1, {1}}, + {2, -1, {3}}, + {-2, 0, {4}}, + {2, 0, {6}}, + {-2, 1, {7}}, + {2, 1, {9}}, + {-2, 2, {7}}, + {-1, 2, {7}}, + {0, 2, {8}}, + {1, 2, {9}}, + {2, 2, {9}}, +}; + +static const struct OamData sOamData_CutGrass = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 1, + .priority = 1, + .paletteNum = 1, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_CutGrass[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const sSpriteAnimTable_CutGrass[] = +{ + sSpriteAnim_CutGrass, +}; + +static const struct SpriteFrameImage sSpriteImageTable_CutGrass[] = +{ + {gFieldEffectPic_CutGrass, 0x20}, +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo6 = {gFieldEffectObjectPalette6, 0x1000}; + +static const struct SpriteTemplate sSpriteTemplate_CutGrass = +{ + .tileTag = 0xFFFF, + .paletteTag = 0x1000, + .oam = &sOamData_CutGrass, + .anims = sSpriteAnimTable_CutGrass, + .images = sSpriteImageTable_CutGrass, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = CutGrassSpriteCallback1, +}; + +// code +bool8 SetUpFieldMove_Cut(void) +{ + s16 x, y; + u8 i, j; + u8 tileBehavior; + u8 userAbility; + bool8 cutTiles[CUT_NORMAL_AREA]; + bool8 ret; + + if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_CUTTABLE_TREE) == TRUE) + { + // Standing in front of cuttable tree. + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutTree; + return TRUE; + } + else + { + PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + userAbility = GetMonAbility(&gPlayerParty[GetCursorSelectionMonId()]); + if (userAbility == ABILITY_HYPER_CUTTER) + { + sCutSquareSide = CUT_HYPER_SIDE; + sTileCountFromPlayer_X = 2; + sTileCountFromPlayer_Y = 2; + } + else + { + sCutSquareSide = CUT_NORMAL_SIDE; + sTileCountFromPlayer_X = 1; + sTileCountFromPlayer_Y = 1; + } + + for (i = 0; i < CUT_NORMAL_AREA; i++) + cutTiles[i] = FALSE; + for (i = 0; i < CUT_HYPER_AREA; i++) + sHyperCutTiles[i] = FALSE; + + ret = FALSE; + + for (i = 0; i < CUT_NORMAL_SIDE; i++) + { + y = i - 1 + gPlayerFacingPosition.y; + for (j = 0; j < CUT_NORMAL_SIDE; j++) + { + x = j - 1 + gPlayerFacingPosition.x; + if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height) + { + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE + || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE) + { + // Standing in front of grass. + sHyperCutTiles[6 + (i * 5) + j] = TRUE; + ret = TRUE; + } + if (MapGridIsImpassableAt(x, y) == TRUE) + { + cutTiles[i * 3 + j] = FALSE; + } + else + { + cutTiles[i * 3 + j] = TRUE; + if (MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE) + sHyperCutTiles[6 + (i * 5) + j] = TRUE; + } + } + else + { + cutTiles[i * 3 + j] = FALSE; + } + } + } + + if (userAbility != ABILITY_HYPER_CUTTER) + { + if (ret == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + } + } + else + { + bool8 tileCuttable; + for (i = 0; i < 16; i++) + { + x = gPlayerFacingPosition.x + sHyperCutStruct[i].x; + y = gPlayerFacingPosition.y + sHyperCutStruct[i].y; + tileCuttable = TRUE; + + j = 0; + do + { + if (sHyperCutStruct[i].unk2[j] == 0) + break; + if (cutTiles[(u8)(sHyperCutStruct[i].unk2[j] - 1)] == FALSE) + { + tileCuttable = FALSE; + break; + } + } while (++j <= 1); + + if (tileCuttable == TRUE) + { + if (MapGridGetZCoordAt(x, y) == gPlayerFacingPosition.height) + { + u8 tileArrayId = ((sHyperCutStruct[i].y * 5) + 12) + (sHyperCutStruct[i].x); + tileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsPokeGrass(tileBehavior) == TRUE + || MetatileBehavior_IsAshGrass(tileBehavior) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + sHyperCutTiles[tileArrayId] = TRUE; + ret = TRUE; + } + else + { + if (MetatileBehavior_IsCuttableGrass(tileBehavior) == TRUE) + sHyperCutTiles[tileArrayId] = TRUE; + } + } + } + } + + if (ret == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + } + } + + return ret; + } +} + +static void FieldCallback_CutGrass(void) +{ + FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 FldEff_UseCutOnGrass(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)StartCutGrassFieldEffect >> 16; + gTasks[taskId].data[9] = (u32)StartCutGrassFieldEffect; + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +static void FieldCallback_CutTree(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext1_SetupScript(Route103_EventScript_290705); +} + +bool8 FldEff_UseCutOnTree(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)StartCutTreeFieldEffect >> 16; + gTasks[taskId].data[9] = (u32)StartCutTreeFieldEffect; + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +static void StartCutGrassFieldEffect(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); + FieldEffectStart(FLDEFF_CUT_GRASS); +} + +bool8 FldEff_CutGrass(void) +{ + s16 x, y; + u8 i = 0; + + PlaySE(SE_W015); + PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + for (i = 0; i < CUT_HYPER_AREA; i++) + { + if (sHyperCutTiles[i] == TRUE) + { + s8 xAdd = (i % 5) - 2; + s8 yAdd = (i / 5) - 2; + + x = xAdd + gPlayerFacingPosition.x; + y = yAdd + gPlayerFacingPosition.y; + + SetCutGrassMetatile(x, y); + sub_808E75C(x, y); + } + } + + SetCutGrassMetatiles(gPlayerFacingPosition.x - sTileCountFromPlayer_X, gPlayerFacingPosition.y - (1 + sTileCountFromPlayer_Y)); + DrawWholeMapView(); + sCutGrassSpriteArrayPtr = AllocZeroed(CUT_SPRITE_ARRAY_COUNT); + + // populate sprite ID array + for (i = 0; i < CUT_SPRITE_ARRAY_COUNT; i++) + { + sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_CutGrass, + gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); + gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = 32 * i; + } + + return FALSE; +} + +// set map grid metatile depending on x, y +static void SetCutGrassMetatile(s16 x, s16 y) +{ + s32 metatileId = MapGridGetMetatileIdAt(x, y); + + switch (metatileId) + { + case METATILE_ID_POKE_LONG_GRASS_START: + case METATILE_ID_POKE_LONG_GRASS: + case METATILE_ID_POKE_GRASS: + MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS); + break; + case METATILE_ID_POKE_GRASS_TREE_LEFT: + MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS_TREE_LEFT); + break; + case METATILE_ID_POKE_GRASS_TREE_RIGHT: + MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS_TREE_RIGHT); + break; + case METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS: + MapGridSetMetatileIdAt(x, y, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS); + break; + case METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS: + MapGridSetMetatileIdAt(x, y, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS); + break; + case METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS: + MapGridSetMetatileIdAt(x, y, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS); + break; + case METATILE_ID_POKE_STEP_LAVA_GRASS: + case METATILE_ID_POKE_LAVA_GRASS: + MapGridSetMetatileIdAt(x, y, METATILE_ID_LAVA_FIELD); + break; + case METATILE_ID_POKE_STEP_ASH_GRASS: + case METATILE_ID_POKE_ASH_GRASS: + MapGridSetMetatileIdAt(x, y, METATILE_ID_ASH); + break; + case METATILE_ID_POKE_GRASS_TREE_UP: + MapGridSetMetatileIdAt(x, y, METATILE_ID_GRASS_TREE_UP); + break; + } +} + +enum +{ + LONG_GRASS_NONE, + LONG_GRASS_FIELD, + LONG_GRASS_BASE_LEFT, + LONG_GRASS_BASE_CENTER, + LONG_GRASS_BASE_RIGHT +}; + +static u8 GetLongGrassCaseAt(s16 x, s16 y) +{ + u16 metatileId = MapGridGetMetatileIdAt(x, y); + + if (metatileId == METATILE_ID_GRASS) + return LONG_GRASS_FIELD; + else if (metatileId == METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS) + return LONG_GRASS_BASE_LEFT; + else if (metatileId == METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS) + return LONG_GRASS_BASE_CENTER; + else if (metatileId == METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS) + return LONG_GRASS_BASE_RIGHT; + else + return LONG_GRASS_NONE; +} + +static void SetCutGrassMetatiles(s16 x, s16 y) +{ + s16 i; + s16 lowerY = y + sCutSquareSide; + + for (i = 0; i < sCutSquareSide; i++) + { + s16 currentX = x + i; + if (MapGridGetMetatileIdAt(currentX, y) == METATILE_ID_POKE_LONG_GRASS) + { + switch (GetLongGrassCaseAt(currentX, y + 1)) + { + case LONG_GRASS_FIELD: + MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_POKE_LONG_GRASS_START); + break; + case LONG_GRASS_BASE_LEFT: + MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_CENTER: + MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_RIGHT: + MapGridSetMetatileIdAt(currentX, y + 1, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS); + break; + } + } + if (MapGridGetMetatileIdAt(currentX, lowerY) == METATILE_ID_GRASS) + { + if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_POKE_LONG_GRASS_START) + MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_GRASS); + if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS); + if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS); + if (MapGridGetMetatileIdAt(currentX, lowerY + 1) == METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(currentX, lowerY + 1, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS); + } + } + + if (sCutSquareSide == CUT_HYPER_SIDE) + { + HandleLongGrassOnHyper(0, x, y); + HandleLongGrassOnHyper(1, x, y); + } +} + +static void HandleLongGrassOnHyper(u8 caseId, s16 x, s16 y) +{ + s16 newX; + bool8 arr[3]; + + if (caseId == 0) + { + arr[0] = sHyperCutTiles[5]; + arr[1] = sHyperCutTiles[10]; + arr[2] = sHyperCutTiles[15]; + newX = x; + } + else if (caseId == 1) + { + arr[0] = sHyperCutTiles[9]; + arr[1] = sHyperCutTiles[14]; + arr[2] = sHyperCutTiles[19]; + newX = x + 4; + } + else // invalid case + { + return; + } + + if (arr[0] == TRUE) + { + if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_POKE_LONG_GRASS_START) + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_GRASS); + if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS); + if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS); + if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS); + } + if (arr[1] == TRUE) + { + if (MapGridGetMetatileIdAt(newX, y + 2) == METATILE_ID_POKE_LONG_GRASS) + { + switch (GetLongGrassCaseAt(newX, y + 3)) + { + case LONG_GRASS_FIELD: + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_POKE_LONG_GRASS_START); + break; + case LONG_GRASS_BASE_LEFT: + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_CENTER: + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_RIGHT: + MapGridSetMetatileIdAt(newX, y + 3, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS); + break; + } + } + + if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_POKE_LONG_GRASS_START) + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_GRASS); + if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS); + if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS); + if (MapGridGetMetatileIdAt(newX, y + 4) == METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS) + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS); + } + if (arr[2] == TRUE) + { + if (MapGridGetMetatileIdAt(newX, y + 3) == METATILE_ID_POKE_LONG_GRASS) + { + switch (GetLongGrassCaseAt(newX, y + 4)) + { + case LONG_GRASS_FIELD: + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_POKE_LONG_GRASS_START); + break; + case LONG_GRASS_BASE_LEFT: + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_CENTER: + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_RIGHT: + MapGridSetMetatileIdAt(newX, y + 4, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS); + break; + } + } + } +} + +static void CutGrassSpriteCallback1(struct Sprite *sprite) +{ + sprite->data[0] = 8; + sprite->data[1] = 0; + sprite->data[3] = 0; + sprite->callback = CutGrassSpriteCallback2; +} + +static void CutGrassSpriteCallback2(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]); + sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]); + + sprite->data[2] = (sprite->data[2] + 8) & 0xFF; + sprite->data[0] += 1 + (sprite->data[3] >> 2); // right shift by 2 is dividing by 4 + sprite->data[3]++; + + if (sprite->data[1] != 28) + sprite->data[1]++; + else + sprite->callback = CutGrassSpriteCallbackEnd; // done rotating the grass, execute clean up function +} + +static void CutGrassSpriteCallbackEnd(struct Sprite *sprite) +{ + u8 i; -// Static type declarations + for (i = 1; i < CUT_SPRITE_ARRAY_COUNT; i++) + DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]); -// Static RAM declarations + FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS); + FREE_AND_SET_NULL(sCutGrassSpriteArrayPtr); + ScriptUnfreezeEventObjects(); + ScriptContext2_Disable(); -IWRAM_DATA u8 gUnknown_03001100; -IWRAM_DATA u8 gUnknown_03001101; -IWRAM_DATA u8 gUnknown_03001102; -IWRAM_DATA u32 fldeff_cut_unused_03001104; -IWRAM_DATA u8 gUnknown_03001108[25]; + if (IsMewPlayingHideAndSeek() == TRUE) + ScriptContext1_SetupScript(FarawayIsland_Interior_EventScript_267EDB); +} -// Static ROM declarations +void sub_80D423C(s16 x, s16 y) +{ + u8 metatileBehavior = MapGridGetMetatileBehaviorAt(x, y); + if (MetatileBehavior_IsLongGrass_Duplicate(metatileBehavior)) + { + switch (GetLongGrassCaseAt(x, y + 1)) + { + case LONG_GRASS_FIELD: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_POKE_LONG_GRASS_START); + break; + case LONG_GRASS_BASE_LEFT: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_CENTER: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS); + break; + case LONG_GRASS_BASE_RIGHT: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS); + break; + } + } +} -// .rodata +void sub_80D42B8(s16 x, s16 y) +{ + if (MapGridGetMetatileIdAt(x, y) == METATILE_ID_GRASS) + { + u8 metatileBehavior = MapGridGetMetatileBehaviorAt(x, y + 1); + if (MetatileBehavior_IsLongGrassSouthEdge(metatileBehavior)) + { + s32 metatileId = MapGridGetMetatileIdAt(x, y + 1); + switch (metatileId) + { + case METATILE_ID_POKE_LONG_GRASS_START: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_GRASS); + break; + case METATILE_ID_SECRET_BASE_LEFT_POKE_LONG_GRASS: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_LEFT_LONG_GRASS); + break; + case METATILE_ID_SECRET_BASE_CENTER_POKE_LONG_GRASS: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_CENTER_LONG_GRASS); + break; + case METATILE_ID_SECRET_BASE_RIGHT_POKE_LONG_GRASS: + MapGridSetMetatileIdAt(x, y + 1, METATILE_ID_SECRET_BASE_RIGHT_LONG_GRASS); + break; + } + } + } +} -// .text +static void StartCutTreeFieldEffect(void) +{ + PlaySE(SE_W015); + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); + EnableBothScriptContexts(); +} diff --git a/src/fldeff_flash.c b/src/fldeff_flash.c index 4f3a091ce..654f02c23 100644 --- a/src/fldeff_flash.c +++ b/src/fldeff_flash.c @@ -78,14 +78,14 @@ bool8 SetUpFieldMove_Flash(void) if (ShouldDoBrailleFlyEffect()) { gSpecialVar_Result = GetCursorSelectionMonId(); - gUnknown_03005DB0 = FieldCallback_Teleport; - gUnknown_0203CEEC = sub_8179918; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = sub_8179918; return TRUE; } else if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH)) { - gUnknown_03005DB0 = FieldCallback_Teleport; - gUnknown_0203CEEC = hm2_flash; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = hm2_flash; return TRUE; } diff --git a/src/fldeff_groundshake.c b/src/fldeff_groundshake.c index bee4d2c4b..60b078982 100644 --- a/src/fldeff_groundshake.c +++ b/src/fldeff_groundshake.c @@ -4,7 +4,7 @@ #include "constants/songs.h" #include "event_data.h" #include "field_camera.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "malloc.h" #include "random.h" #include "roulette_util.h" @@ -179,17 +179,17 @@ void sub_81BE7F4(void) static void sub_81BE808(u8 taskId) { - u8 mapObjectIdBuffer; - struct MapObject *fieldMapObject; - struct MapObject *playerAvatarMapObject; + u8 eventObjectIdBuffer; + struct EventObject *fieldEventObject; + struct EventObject *playerAvatarEventObject; - TryGetFieldObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectIdBuffer); - fieldMapObject = &(gMapObjects[mapObjectIdBuffer]); - gSprites[fieldMapObject->spriteId].pos2.y += 4; - playerAvatarMapObject = &(gMapObjects[gPlayerAvatar.mapObjectId]); + TryGetEventObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &eventObjectIdBuffer); + fieldEventObject = &(gEventObjects[eventObjectIdBuffer]); + gSprites[fieldEventObject->spriteId].pos2.y += 4; + playerAvatarEventObject = &(gEventObjects[gPlayerAvatar.eventObjectId]); - if((gSprites[fieldMapObject->spriteId].pos1.y + gSprites[fieldMapObject->spriteId].pos2.y) >= - (gSprites[playerAvatarMapObject->spriteId].pos1.y + gSprites[playerAvatarMapObject->spriteId].pos2.y)) + if((gSprites[fieldEventObject->spriteId].pos1.y + gSprites[fieldEventObject->spriteId].pos2.y) >= + (gSprites[playerAvatarEventObject->spriteId].pos1.y + gSprites[playerAvatarEventObject->spriteId].pos2.y)) { DestroyTask(taskId); EnableBothScriptContexts(); diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index 162479c73..74eb100bc 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -6,6 +6,7 @@ #include "rom6.h" #include "script.h" #include "task.h" +#include "constants/event_objects.h" // static functions static void FldEff_UseStrength(void); @@ -14,11 +15,11 @@ static void sub_8145E74(void); // text bool8 SetUpFieldMove_Strength(void) { - if (npc_before_player_of_type(87) == TRUE) + if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_PUSHABLE_BOULDER) == TRUE) { gSpecialVar_Result = GetCursorSelectionMonId(); - gUnknown_03005DB0 = FieldCallback_Teleport; - gUnknown_0203CEEC = FldEff_UseStrength; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FldEff_UseStrength; return TRUE; } return FALSE; diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 100e440a5..14da87eb3 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -24,8 +24,8 @@ void sub_81BE72C(void); bool8 SetUpFieldMove_SweetScent(void) { - gUnknown_03005DB0 = FieldCallback_Teleport; - gUnknown_0203CEEC = hm2_sweet_scent; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = hm2_sweet_scent; return TRUE; } diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index e675ef0a5..e82a26cd1 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -11,8 +11,8 @@ bool8 SetUpFieldMove_Teleport(void) { if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE) { - gUnknown_03005DB0 = FieldCallback_Teleport; - gUnknown_0203CEEC = hm_teleport_run_dp02scr; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = hm_teleport_run_dp02scr; return TRUE; } return FALSE; @@ -37,7 +37,7 @@ bool8 FldEff_UseTeleport(void) void sub_817C94C(void) { FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT); - sub_80B7FC8(); + CreateTeleportFieldEffectTask(); } diff --git a/src/fossil_specials.c b/src/fossil_specials.c index 95fafc17b..49db0f5b6 100644 --- a/src/fossil_specials.c +++ b/src/fossil_specials.c @@ -4,7 +4,7 @@ #include "bg.h" #include "event_data.h" #include "field_camera.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "fieldmap.h" #include "global.fieldmap.h" #include "gpu_regs.h" @@ -335,7 +335,7 @@ static void sub_81BED50(u8 taskId) } #else -ASM_DIRECT +NAKED static void sub_81BED50(u8 taskId) { asm("\n\ diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 83df30d05..f5c4ba491 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -33,12 +33,12 @@ struct HallofFameMon u32 personality; u16 species:9; u16 lvl:7; - u8 nick[10]; + u8 nick[POKEMON_NAME_LENGTH]; }; struct HallofFameTeam { - struct HallofFameMon mon[6]; + struct HallofFameMon mon[PARTY_SIZE]; }; struct HofGfx @@ -49,11 +49,11 @@ struct HofGfx u8 tilemap2[0x1000]; }; +static EWRAM_DATA u32 sUnknown_0203BCD4 = 0; static EWRAM_DATA struct HallofFameTeam *sHofMonPtr = NULL; static EWRAM_DATA struct HofGfx *sHofGfxPtr = NULL; extern bool8 gHasHallOfFameRecords; -extern u32 gUnknown_0203BCD4; extern struct MusicPlayerInfo gMPlayInfo_BGM; extern MainCallback gGameContinueCallback; extern u32 gDamagedSaveSectors; @@ -89,7 +89,7 @@ extern void sub_8197434(u8, u8); extern u16 sub_818D97C(u8 playerGender, u8); extern u16 sub_818D8AC(u16, u8, s16, s16, u8, u16); extern const void* stdpal_get(u8); -extern void sub_80987D4(u8, u8, u16, u8); +extern void LoadWindowGfx(u8, u8, u16, u8); extern u16 sub_818D820(u16); extern u16 sub_818D8F0(u16); extern u16 sub_818D7D8(u16 species, u32 trainerId, u32 personality, u8 arg3, s16 sp0, s16 sp1, u8 sp2, u16 sp3); @@ -414,7 +414,7 @@ static bool8 InitHallOfFameScreen(void) if (!sub_8175024()) { SetVBlankCallback(VBlankCB_HallOfFame); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gMain.state++; } break; @@ -490,7 +490,7 @@ static void Task_Hof_InitMonData(u8 taskId) } } - gUnknown_0203BCD4 = 0; + sUnknown_0203BCD4 = 0; gTasks[taskId].tDisplayedMonId = 0; gTasks[taskId].tPlayerSpriteID = 0xFF; @@ -648,11 +648,11 @@ static void Task_Hof_TryDisplayAnotherMon(u8 taskId) } else { - gUnknown_0203BCD4 |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum); + sUnknown_0203BCD4 |= (0x10000 << gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.paletteNum); if (gTasks[taskId].tDisplayedMonId <= 4 && currMon[1].species != SPECIES_NONE) // there is another pokemon to display { gTasks[taskId].tDisplayedMonId++; - BeginNormalPaletteFade(gUnknown_0203BCD4, 0, 12, 12, 0x63B0); + BeginNormalPaletteFade(sUnknown_0203BCD4, 0, 12, 12, 0x63B0); gSprites[gTasks[taskId].tMonSpriteId(currPokeID)].oam.priority = 1; gTasks[taskId].func = Task_Hof_DisplayMon; } @@ -696,7 +696,7 @@ static void sub_8173DC0(u8 taskId) if (gTasks[taskId].tMonSpriteId(i) != 0xFF) gSprites[gTasks[taskId].tMonSpriteId(i)].oam.priority = 1; } - BeginNormalPaletteFade(gUnknown_0203BCD4, 0, 12, 12, 0x63B0); + BeginNormalPaletteFade(sUnknown_0203BCD4, 0, 12, 12, 0x63B0); FillWindowPixelBuffer(0, 0); CopyWindowToVram(0, 3); gTasks[taskId].tFrameCount = 7; @@ -725,7 +725,7 @@ static void sub_8173EE4(u8 taskId) ShowBg(3); gTasks[taskId].tPlayerSpriteID = sub_818D8AC(sub_818D97C(gSaveBlock2Ptr->playerGender, 1), 1, 120, 72, 6, 0xFFFF); AddWindow(&sHof_WindowTemplate); - sub_80987D4(1, gSaveBlock2Ptr->optionsWindowFrameType, 0x21D, 0xD0); + LoadWindowGfx(1, gSaveBlock2Ptr->optionsWindowFrameType, 0x21D, 0xD0); LoadPalette(stdpal_get(1), 0xE0, 0x20); gTasks[taskId].tFrameCount = 120; gTasks[taskId].func = Task_Hof_WaitAndPrintPlayerInfo; @@ -764,7 +764,7 @@ static void Task_Hof_ExitOnKeyPressed(u8 taskId) static void Task_Hof_HandlePaletteOnExit(u8 taskId) { CpuCopy16(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); - BeginNormalPaletteFade(-1, 8, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 0x10, 0); gTasks[taskId].func = Task_Hof_HandleExit; } @@ -923,7 +923,7 @@ static void Task_HofPC_DrawSpritesPrintText(u8 taskId) savedTeams++; currMon = &savedTeams->mon[0]; - gUnknown_0203BCD4 = 0; + sUnknown_0203BCD4 = 0; gTasks[taskId].tCurrMonId = 0; gTasks[taskId].tMonNo = 0; @@ -998,8 +998,8 @@ static void Task_HofPC_PrintMonInfo(u8 taskId) currMonID = gTasks[taskId].tMonSpriteId(gTasks[taskId].tCurrMonId); gSprites[currMonID].oam.priority = 0; - gUnknown_0203BCD4 = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000; - BlendPalettesUnfaded(gUnknown_0203BCD4, 0xC, 0x63B0); + sUnknown_0203BCD4 = (0x10000 << gSprites[currMonID].oam.paletteNum) ^ 0xFFFF0000; + BlendPalettesUnfaded(sUnknown_0203BCD4, 0xC, 0x63B0); currMon = &savedTeams->mon[gTasks[taskId].tCurrMonId]; if (currMon->species != SPECIES_EGG) diff --git a/src/heal_location.c b/src/heal_location.c index aa90fe1ae..b378e8e8c 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -1,83 +1,37 @@ - -// Includes #include "global.h" -#include "constants/maps.h" #include "heal_location.h" +#include "constants/maps.h" -#define HEAL_LOCATION(map, x, y) {MAP_GROUP(map), MAP_NUM(map), x, y} - -// Static type declarations - -// Static RAM declarations - -// Static ROM declarations - -// .rodata - -static const struct HealLocation sHealLocations[] = { - HEAL_LOCATION(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 4, 2), - HEAL_LOCATION(LITTLEROOT_TOWN_MAYS_HOUSE_2F, 4, 2), - HEAL_LOCATION(PETALBURG_CITY, 20, 17), - HEAL_LOCATION(SLATEPORT_CITY, 19, 20), - HEAL_LOCATION(MAUVILLE_CITY, 22, 6), - HEAL_LOCATION(RUSTBORO_CITY, 16, 39), - HEAL_LOCATION(FORTREE_CITY, 5, 7), - HEAL_LOCATION(LILYCOVE_CITY, 24, 15), - HEAL_LOCATION(MOSSDEEP_CITY, 28, 17), - HEAL_LOCATION(SOOTOPOLIS_CITY, 43, 32), - HEAL_LOCATION(EVER_GRANDE_CITY, 27, 49), - HEAL_LOCATION(LITTLEROOT_TOWN, 5, 9), - HEAL_LOCATION(LITTLEROOT_TOWN, 14, 9), - HEAL_LOCATION(OLDALE_TOWN, 6, 17), - HEAL_LOCATION(DEWFORD_TOWN, 2, 11), - HEAL_LOCATION(LAVARIDGE_TOWN, 9, 7), - HEAL_LOCATION(FALLARBOR_TOWN, 14, 8), - HEAL_LOCATION(VERDANTURF_TOWN, 16, 4), - HEAL_LOCATION(PACIFIDLOG_TOWN, 8, 16), - HEAL_LOCATION(EVER_GRANDE_CITY, 18, 6), - HEAL_LOCATION(SOUTHERN_ISLAND_EXTERIOR, 15, 20), - HEAL_LOCATION(BATTLE_FRONTIER_OUTSIDE_EAST, 3, 52) -}; - -#define NUM_HEAL_LOCATIONS (ARRAY_COUNT(sHealLocations)) - -// .text +#include "data/heal_locations.h" -static u32 GetHealLocationIndexFromMapGroupAndNum(u16 mapGroup, u16 mapNum) +u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) { u32 i; - for (i = 0; i < NUM_HEAL_LOCATIONS; i++) + for (i = 0; i < ARRAY_COUNT(sHealLocations); i++) { if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum) - { return i + 1; - } } return 0; } -const struct HealLocation *GetHealLocationPointerFromMapGroupAndNum(u16 mapGroup, u16 mapNum) +const struct HealLocation *GetHealLocationByMap(u16 mapGroup, u16 mapNum) { - u32 loc; + u32 index = GetHealLocationIndexByMap(mapGroup, mapNum); - loc = GetHealLocationIndexFromMapGroupAndNum(mapGroup, mapNum); - if (loc == 0) - { + if (index == 0) return NULL; - } - return &sHealLocations[loc - 1]; + else + return &sHealLocations[index - 1]; } -const struct HealLocation *GetHealLocationPointer(u32 loc) +const struct HealLocation *GetHealLocation(u32 index) { - if (loc == 0) - { + if (index == 0) return NULL; - } - if (loc > NUM_HEAL_LOCATIONS) - { + else if (index > ARRAY_COUNT(sHealLocations)) return NULL; - } - return &sHealLocations[loc - 1]; + else + return &sHealLocations[index - 1]; } diff --git a/src/hof_pc.c b/src/hof_pc.c index e5b6f96f8..44b929337 100644 --- a/src/hof_pc.c +++ b/src/hof_pc.c @@ -7,7 +7,6 @@ #include "script_menu.h" #include "task.h" -extern void (*gFieldCallback)(void); extern void (*gUnknown_0300485C)(void); extern void Overworld_PlaySpecialMapMusic(void); diff --git a/src/international_string_util.c b/src/international_string_util.c index 89b4a7a69..9de338c59 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -42,7 +42,7 @@ s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1) return convert_pixel_width_to_tile_width(var); } -s32 sub_81DB3D8(const struct MenuAction *str, u8* arg1, s32 arg2) +s32 sub_81DB3D8(const struct MenuAction *str, const u8* arg1, s32 arg2) { s32 i, var; diff --git a/src/item.c b/src/item.c index a17599db9..c94f29910 100644 --- a/src/item.c +++ b/src/item.c @@ -5,50 +5,48 @@ #include "string_util.h" #include "text.h" #include "event_data.h" +#include "malloc.h" +#include "secret_base.h" +#include "item_menu.h" +#include "strings.h" +#include "load_save.h" -extern void ApplyNewEncryptionKeyToHword(u16* hword, u32 newKey); extern bool8 InBattlePyramid(void); +extern u16 gUnknown_0203CF30[]; +extern const struct Item gItems[]; -extern const u8 gText_PokeBalls[]; -extern const u8 gText_Berries[]; -extern const u8 gText_Berry[]; +// this file's functions +static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count); +static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count); -bool8 CheckPyramidBagHasItem(u16 itemId, u16 count); -bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count); +// EWRAM variables +EWRAM_DATA struct BagPocket gBagPockets[POCKETS_COUNT] = {0}; -enum -{ - ITEMS_POCKET, - BALLS_POCKET, - TMHM_POCKET, - BERRIES_POCKET, - KEYITEMS_POCKET -}; - -u16 GetBagItemQuantity(u16* quantity) +// code +static u16 GetBagItemQuantity(u16 *quantity) { return gSaveBlock2Ptr->encryptionKey ^ *quantity; } -void SetBagItemQuantity(u16* quantity, u16 newValue) +static void SetBagItemQuantity(u16 *quantity, u16 newValue) { *quantity = newValue ^ gSaveBlock2Ptr->encryptionKey; } -u16 GetBagItemId(u16* slot) +static u16 GetPCItemQuantity(u16 *quantity) { - return *slot; + return *quantity; } -void SetBagItemId(u16* slot, u16 newItemId) +static void SetPCItemQuantity(u16 *quantity, u16 newValue) { - *slot = newItemId; + *quantity = newValue; } void ApplyNewEncryptionKeyToBagItems(u32 newKey) { u32 pocket, item; - for (pocket = 0; pocket < 5; pocket++) + for (pocket = 0; pocket < POCKETS_COUNT; pocket++) { for (item = 0; item < gBagPockets[pocket].capacity; item++) ApplyNewEncryptionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey); @@ -60,58 +58,57 @@ void ApplyNewEncryptionKeyToBagItems_(u32 newKey) // really GF? ApplyNewEncryptionKeyToBagItems(newKey); } -// TODO: move those max values to defines - void SetBagItemsPointers(void) { gBagPockets[ITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Items; - gBagPockets[ITEMS_POCKET].capacity = 30; + gBagPockets[ITEMS_POCKET].capacity = BAG_ITEMS_COUNT; gBagPockets[KEYITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems; - gBagPockets[KEYITEMS_POCKET].capacity = 30; + gBagPockets[KEYITEMS_POCKET].capacity = BAG_KEYITEMS_COUNT; gBagPockets[BALLS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls; - gBagPockets[BALLS_POCKET].capacity = 16; + gBagPockets[BALLS_POCKET].capacity = BAG_POKEBALLS_COUNT; gBagPockets[TMHM_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM; - gBagPockets[TMHM_POCKET].capacity = 64; + gBagPockets[TMHM_POCKET].capacity = BAG_TMHM_COUNT; gBagPockets[BERRIES_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Berries; - gBagPockets[BERRIES_POCKET].capacity = 46; + gBagPockets[BERRIES_POCKET].capacity = BAG_BERRIES_COUNT; } -void CopyItemName(u16 itemId, u8 *string) +void CopyItemName(u16 itemId, u8 *dst) { - StringCopy(string, ItemId_GetItem(itemId)->name); + StringCopy(dst, ItemId_GetName(itemId)); } -void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity) +void CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) { if (itemId == ITEM_POKE_BALL) { if (quantity < 2) - StringCopy(string, ItemId_GetItem(ITEM_POKE_BALL)->name); + StringCopy(dst, ItemId_GetName(ITEM_POKE_BALL)); else - StringCopy(string, gText_PokeBalls); + StringCopy(dst, gText_PokeBalls); } else { if (itemId >= ITEM_CHERI_BERRY && itemId <= ITEM_ENIGMA_BERRY) - GetBerryCountString(string, gBerries[itemId - ITEM_CHERI_BERRY].name, quantity); + GetBerryCountString(dst, gBerries[itemId - ITEM_CHERI_BERRY].name, quantity); else - StringCopy(string, ItemId_GetItem(itemId)->name); + StringCopy(dst, ItemId_GetName(itemId)); } } -void GetBerryCountString(u8* dst, const u8* berryName, u32 quantity) +void GetBerryCountString(u8 *dst, const u8 *berryName, u32 quantity) { - const u8* berryString; - u8* txtPtr; + const u8 *berryString; + u8 *txtPtr; if (quantity < 2) berryString = gText_Berry; else berryString = gText_Berries; + txtPtr = StringCopy(dst, berryName); *txtPtr = CHAR_SPACE; StringCopy(txtPtr + 1, berryString); @@ -136,21 +133,21 @@ bool8 CheckBagHasItem(u16 itemId, u16 count) if (ItemId_GetPocket(itemId) == 0) return FALSE; - if (InBattlePyramid() || FlagGet(0x4004) == TRUE) + if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE) return CheckPyramidBagHasItem(itemId, count); pocket = ItemId_GetPocket(itemId) - 1; - //Check for item slots that contain the item + // Check for item slots that contain the item for (i = 0; i < gBagPockets[pocket].capacity; i++) { if (gBagPockets[pocket].itemSlots[i].itemId == itemId) { u16 quantity; - //Does this item slot contain enough of the item? + // Does this item slot contain enough of the item? quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); if (quantity >= count) return TRUE; count -= quantity; - //Does this item slot and all previous slots contain enough of the item? + // Does this item slot and all previous slots contain enough of the item? if (count == 0) return TRUE; } @@ -161,69 +158,945 @@ bool8 CheckBagHasItem(u16 itemId, u16 count) bool8 HasAtLeastOneBerry(void) { u16 i; - for (i = 0x85; i < 0xB3; i++) + + for (i = FIRST_BERRY_INDEX; i < ITEM_BRIGHT_POWDER; i++) { if (CheckBagHasItem(i, 1) == TRUE) { - gSpecialVar_Result = 1; + gSpecialVar_Result = TRUE; return TRUE; } } - gSpecialVar_Result = 0; + gSpecialVar_Result = FALSE; return FALSE; } -/* Refuses to match. +#ifdef NONMATCHING +// Refuses to match. bool8 CheckBagHasSpace(u16 itemId, u16 count) { u8 i; - u8 pocket; - u16 slotCapacity; - u16 quantity; - if (ItemId_GetPocket(itemId) == 0) + if (ItemId_GetPocket(itemId) == POCKET_NONE) return FALSE; - if (InBattlePyramid() || FlagGet(0x4004) == TRUE) + + if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE) + { return CheckPyramidBagHasSpace(itemId, count); - pocket = ItemId_GetPocket(itemId) - 1; - if (pocket != BERRIES_POCKET) - slotCapacity = 99; + } else - slotCapacity = 999; + { + u8 pocket; + u16 slotCapacity; + u16 ownedCount; - //Check space in any existing item slots that already contain this item - for (i = 0; i < gBagPockets[pocket].capacity; i++) + pocket = ItemId_GetPocket(itemId) - 1; + if (pocket != BERRIES_POCKET) + slotCapacity = 99; + else + slotCapacity = 999; + + // Check space in any existing item slots that already contain this item + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + ownedCount = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); + if (ownedCount + count <= slotCapacity) + return TRUE; + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= slotCapacity - ownedCount; + if (count == 0) + return TRUE; + } + } + + // Check space in empty item slots + if (count > 0) + { + for (i = 0; i < gBagPockets[pocket].capacity; i++) + { + if (gBagPockets[pocket].itemSlots[i].itemId == 0) + { + if (count <= slotCapacity) + return TRUE; + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= slotCapacity; + } + } + if (count > 0) + return FALSE; // No more item slots. The bag is full + } + + return TRUE; + } +} +#else +NAKED +bool8 CheckBagHasSpace(u16 itemId, u16 count) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + mov r8, r0\n\ + lsls r1, 16\n\ + lsrs r5, r1, 16\n\ + bl ItemId_GetPocket\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080D6906\n\ + bl InBattlePyramid\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080D6838\n\ + ldr r0, =0x00004004\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080D684C\n\ +_080D6838:\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + bl CheckPyramidBagHasSpace\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + b _080D6916\n\ + .pool\n\ +_080D684C:\n\ + mov r0, r8\n\ + bl ItemId_GetPocket\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + ldr r7, =0x000003e7\n\ + cmp r2, 0x3\n\ + beq _080D6860\n\ + movs r7, 0x63\n\ +_080D6860:\n\ + movs r6, 0\n\ + ldr r1, =gBagPockets\n\ + lsls r4, r2, 3\n\ + adds r0, r4, r1\n\ + mov r9, r4\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r6, r0\n\ + bcs _080D68BC\n\ + subs r0, r2, 0x2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ +_080D6878:\n\ + adds r0, r4, r1\n\ + ldr r1, [r0]\n\ + lsls r0, r6, 2\n\ + adds r1, r0, r1\n\ + ldrh r0, [r1]\n\ + cmp r0, r8\n\ + bne _080D68AC\n\ + adds r0, r1, 0x2\n\ + str r2, [sp]\n\ + bl GetBagItemQuantity\n\ + lsls r0, 16\n\ + lsrs r1, r0, 16\n\ + adds r0, r1, r5\n\ + ldr r2, [sp]\n\ + cmp r0, r7\n\ + ble _080D6914\n\ + mov r0, r10\n\ + cmp r0, 0x1\n\ + bls _080D6906\n\ + subs r0, r7, r1\n\ + subs r0, r5, r0\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0\n\ + beq _080D6914\n\ +_080D68AC:\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + ldr r1, =gBagPockets\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r6, r0\n\ + bcc _080D6878\n\ +_080D68BC:\n\ + cmp r5, 0\n\ + beq _080D6914\n\ + movs r6, 0\n\ + ldr r3, =gBagPockets\n\ + mov r1, r9\n\ + adds r0, r1, r3\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r6, r0\n\ + bcs _080D6902\n\ + adds r4, r3, 0\n\ + subs r0, r2, 0x2\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ +_080D68D6:\n\ + adds r0, r1, r4\n\ + ldr r1, [r0]\n\ + lsls r0, r6, 2\n\ + adds r0, r1\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _080D68F2\n\ + cmp r5, r7\n\ + bls _080D6914\n\ + cmp r2, 0x1\n\ + bls _080D6906\n\ + subs r0, r5, r7\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ +_080D68F2:\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + mov r1, r9\n\ + adds r0, r1, r3\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r6, r0\n\ + bcc _080D68D6\n\ +_080D6902:\n\ + cmp r5, 0\n\ + beq _080D6914\n\ +_080D6906:\n\ + movs r0, 0\n\ + b _080D6916\n\ + .pool\n\ +_080D6914:\n\ + movs r0, 0x1\n\ +_080D6916:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1"); +} +#endif // NONMATCHING + +bool8 AddBagItem(u16 itemId, u16 count) +{ + u8 i; + + if (ItemId_GetPocket(itemId) == POCKET_NONE) + return FALSE; + + // check Battle Pyramid Bag + if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE) { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + return AddPyramidBagItem(itemId, count); + } + else + { + struct BagPocket *itemPocket; + struct ItemSlot *newItems; + u16 slotCapacity; + u16 ownedCount; + u8 pocket = ItemId_GetPocket(itemId) - 1; + + itemPocket = &gBagPockets[pocket]; + newItems = AllocZeroed(itemPocket->capacity * sizeof(struct ItemSlot)); + memcpy(newItems, itemPocket->itemSlots, itemPocket->capacity * sizeof(struct ItemSlot)); + + if (pocket != BERRIES_POCKET) + slotCapacity = 99; + else + slotCapacity = 999; + + for (i = 0; i < itemPocket->capacity; i++) { - quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); - if (quantity + count <= slotCapacity) - return TRUE; - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + if (newItems[i].itemId == itemId) + { + ownedCount = GetBagItemQuantity(&newItems[i].quantity); + // check if won't exceed max slot capacity + if (ownedCount + count <= slotCapacity) + { + // 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; + } + else + { + // try creating another instance of the item if possible + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + { + Free(newItems); + return FALSE; + } + else + { + count -= slotCapacity - ownedCount; + SetBagItemQuantity(&newItems[i].quantity, slotCapacity); + // 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; + } + } + } + } + } + + // we're done if quantity is equal to 0 + if (count > 0) + { + // either no existing item was found or we have to create another instance, because the capacity was exceeded + for (i = 0; i < itemPocket->capacity; i++) + { + if (newItems[i].itemId == ITEM_NONE) + { + newItems[i].itemId = itemId; + if (count > slotCapacity) + { + // try creating a new slot with max capacity if duplicates are possible + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + { + Free(newItems); + return FALSE; + } + count -= slotCapacity; + SetBagItemQuantity(&newItems[i].quantity, slotCapacity); + } + else + { + // created a new slot and added quantity + SetBagItemQuantity(&newItems[i].quantity, count); + goto SUCCESS_ADD_ITEM; + } + } + } + + if (count > 0) + { + Free(newItems); return FALSE; - count -= slotCapacity - quantity; + } + } + + SUCCESS_ADD_ITEM: + memcpy(itemPocket->itemSlots, newItems, itemPocket->capacity * sizeof(struct ItemSlot)); + Free(newItems); + return TRUE; + } +} + +bool8 RemoveBagItem(u16 itemId, u16 count) +{ + u8 i; + u16 totalQuantity = 0; + + if (ItemId_GetPocket(itemId) == POCKET_NONE || itemId == ITEM_NONE) + return FALSE; + + // check Battle Pyramid Bag + if (InBattlePyramid() || FlagGet(FLAG_SPECIAL_FLAG_0x4004) == TRUE) + { + return RemovePyramidBagItem(itemId, count); + } + else + { + u8 pocket; + u8 var; + u16 ownedCount; + struct BagPocket *itemPocket; + + pocket = ItemId_GetPocket(itemId) - 1; + itemPocket = &gBagPockets[pocket]; + + for (i = 0; i < itemPocket->capacity; i++) + { + if (itemPocket->itemSlots[i].itemId == itemId) + totalQuantity += GetBagItemQuantity(&itemPocket->itemSlots[i].quantity); + } + + if (totalQuantity < count) + return FALSE; // We don't have enough of the item + + if (CurrentMapIsSecretBase() == TRUE) + { + VarSet(VAR_0x40EE, VarGet(VAR_0x40EE) | 0x200); + VarSet(VAR_0x40ED, itemId); + } + + var = sub_81ABB2C(pocket); + if (itemPocket->capacity > var + && itemPocket->itemSlots[var].itemId == itemId) + { + ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[var].quantity); + if (ownedCount >= count) + { + SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, ownedCount - count); + count = 0; + } + else + { + count -= ownedCount; + SetBagItemQuantity(&itemPocket->itemSlots[var].quantity, 0); + } + + if (GetBagItemQuantity(&itemPocket->itemSlots[var].quantity) == 0) + itemPocket->itemSlots[var].itemId = ITEM_NONE; + if (count == 0) return TRUE; } + + for (i = 0; i < itemPocket->capacity; i++) + { + if (itemPocket->itemSlots[i].itemId == itemId) + { + ownedCount = GetBagItemQuantity(&itemPocket->itemSlots[i].quantity); + if (ownedCount >= count) + { + SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, ownedCount - count); + count = 0; + } + else + { + count -= ownedCount; + SetBagItemQuantity(&itemPocket->itemSlots[i].quantity, 0); + } + + if (GetBagItemQuantity(&itemPocket->itemSlots[i].quantity) == 0) + itemPocket->itemSlots[i].itemId = ITEM_NONE; + + if (count == 0) + return TRUE; + } + } + return TRUE; } +} - //Check space in empty item slots - if (count > 0) +u8 GetPocketByItemId(u16 itemId) +{ + return ItemId_GetPocket(itemId); +} + +void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount) +{ + u16 i; + + for (i = 0; i < itemCount; i++) { - for (i = 0; i < gBagPockets[pocket].capacity; i++) + itemSlots[i].itemId = ITEM_NONE; + SetBagItemQuantity(&itemSlots[i].quantity, 0); + } +} + +static s32 FindFreePCItemSlot(void) +{ + s8 i; + + for (i = 0; i < PC_ITEMS_COUNT; i++) + { + if (gSaveBlock1Ptr->pcItems[i].itemId == ITEM_NONE) + return i; + } + return -1; +} + +u8 CountUsedPCItemSlots(void) +{ + u8 usedSlots = 0; + u8 i; + + for (i = 0; i < PC_ITEMS_COUNT; i++) + { + if (gSaveBlock1Ptr->pcItems[i].itemId != ITEM_NONE) + usedSlots++; + } + return usedSlots; +} + +bool8 CheckPCHasItem(u16 itemId, u16 count) +{ + u8 i; + + for (i = 0; i < PC_ITEMS_COUNT; i++) + { + if (gSaveBlock1Ptr->pcItems[i].itemId == itemId && GetPCItemQuantity(&gSaveBlock1Ptr->pcItems[i].quantity) >= count) + return TRUE; + } + return FALSE; +} + +bool8 AddPCItem(u16 itemId, u16 count) +{ + u8 i; + s8 freeSlot; + u16 ownedCount; + struct ItemSlot *newItems; + + // Copy PC items + newItems = AllocZeroed(sizeof(gSaveBlock1Ptr->pcItems)); + memcpy(newItems, gSaveBlock1Ptr->pcItems, sizeof(gSaveBlock1Ptr->pcItems)); + + // Use any item slots that already contain this item + for (i = 0; i < PC_ITEMS_COUNT; i++) + { + if (newItems[i].itemId == itemId) { - if (gBagPockets[pocket].itemSlots[i].itemId == 0) + ownedCount = GetPCItemQuantity(&newItems[i].quantity); + if (ownedCount + count <= 999) { - if (count <= slotCapacity) - return TRUE; - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - return FALSE; - count -= slotCapacity; + SetPCItemQuantity(&newItems[i].quantity, ownedCount + count); + memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); + Free(newItems); + return TRUE; + } + count += ownedCount - 999; + SetPCItemQuantity(&newItems[i].quantity, 999); + if (count == 0) + { + memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); + Free(newItems); + return TRUE; } } - if (count > 0) - return FALSE; //No more item slots. The bag is full } + // Put any remaining items into a new item slot. + if (count > 0) + { + freeSlot = FindFreePCItemSlot(); + if (freeSlot == -1) + { + Free(newItems); + return FALSE; + } + else + { + newItems[freeSlot].itemId = itemId; + SetPCItemQuantity(&newItems[freeSlot].quantity, count); + } + } + + // Copy items back to the PC + memcpy(gSaveBlock1Ptr->pcItems, newItems, sizeof(gSaveBlock1Ptr->pcItems)); + Free(newItems); return TRUE; -}*/ +} + +void RemovePCItem(u8 index, u16 count) +{ + // UB: should use GetPCItemQuantity and SetPCItemQuantity functions + gSaveBlock1Ptr->pcItems[index].quantity -= count; + if (gSaveBlock1Ptr->pcItems[index].quantity == 0) + { + gSaveBlock1Ptr->pcItems[index].itemId = ITEM_NONE; + CompactPCItems(); + } +} + +void CompactPCItems(void) +{ + u16 i; + u16 j; + + for (i = 0; i < PC_ITEMS_COUNT - 1; i++) + { + for (j = i + 1; j < PC_ITEMS_COUNT; j++) + { + if (gSaveBlock1Ptr->pcItems[i].itemId == 0) + { + struct ItemSlot temp = gSaveBlock1Ptr->pcItems[i]; + gSaveBlock1Ptr->pcItems[i] = gSaveBlock1Ptr->pcItems[j]; + gSaveBlock1Ptr->pcItems[j] = temp; + } + } + } +} + +void SwapRegisteredBike(void) +{ + switch (gSaveBlock1Ptr->registeredItem) + { + case ITEM_MACH_BIKE: + gSaveBlock1Ptr->registeredItem = ITEM_ACRO_BIKE; + break; + case ITEM_ACRO_BIKE: + gSaveBlock1Ptr->registeredItem = ITEM_MACH_BIKE; + break; + } +} + +u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos) +{ + return gBagPockets[pocketId - 1].itemSlots[pocketPos].itemId; +} + +u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos) +{ + return GetBagItemQuantity(&gBagPockets[pocketId - 1].itemSlots[pocketPos].quantity); +} + +static void SwapItemSlots(struct ItemSlot *a, struct ItemSlot *b) +{ + struct ItemSlot temp = *a; + *a = *b; + *b = temp; +} + +void CompactItemsInBagPocket(struct BagPocket *bagPocket) +{ + u16 i, j; + + for (i = 0; i < bagPocket->capacity - 1; i++) + { + for (j = i + 1; j < bagPocket->capacity; j++) + { + if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) == 0) + SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]); + } + } +} + +void SortBerriesOrTMHMs(struct BagPocket *bagPocket) +{ + u16 i, j; + + for (i = 0; i < bagPocket->capacity - 1; i++) + { + for (j = i + 1; j < bagPocket->capacity; j++) + { + if (GetBagItemQuantity(&bagPocket->itemSlots[i].quantity) != 0) + { + if (GetBagItemQuantity(&bagPocket->itemSlots[j].quantity) == 0) + continue; + if (bagPocket->itemSlots[i].itemId <= bagPocket->itemSlots[j].itemId) + continue; + } + SwapItemSlots(&bagPocket->itemSlots[i], &bagPocket->itemSlots[j]); + } + } +} + +void MoveItemSlotInList(struct ItemSlot* itemSlots_, u32 from, u32 to_) +{ + // dumb assignments needed to match + struct ItemSlot *itemSlots = itemSlots_; + u32 to = to_; + + if (from != to) + { + s16 i, count; + struct ItemSlot firstSlot = itemSlots[from]; + + if (to > from) + { + to--; + for (i = from, count = to; i < count; i++) + itemSlots[i] = itemSlots[i + 1]; + } + else + { + for (i = from, count = to; i > count; i--) + itemSlots[i] = itemSlots[i - 1]; + } + itemSlots[to] = firstSlot; + } +} + +void ClearBag(void) +{ + u16 i; + + for (i = 0; i < POCKETS_COUNT; i++) + { + ClearItemSlots(gBagPockets[i].itemSlots, gBagPockets[i].capacity); + } +} + +u16 CountTotalItemQuantityInBag(u16 itemId) +{ + u16 i; + u16 ownedCount = 0; + struct BagPocket *bagPocket = &gBagPockets[ItemId_GetPocket(itemId) - 1]; + + for (i = 0; i < bagPocket->capacity; i++) + { + if (bagPocket->itemSlots[i].itemId == itemId) + ownedCount += GetBagItemQuantity(&bagPocket->itemSlots[i].quantity); + } + + return ownedCount; +} + +static bool8 CheckPyramidBagHasItem(u16 itemId, u16 count) +{ + u8 i; + u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl]; + u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl]; + + for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) + { + if (items[i] == itemId) + { + if (quantities[i] >= count) + return TRUE; + + count -= quantities[i]; + if (count == 0) + return TRUE; + } + } + + return FALSE; +} + +static bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count) +{ + u8 i; + u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl]; + u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl]; + + for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) + { + if (items[i] == itemId || items[i] == ITEM_NONE) + { + if (quantities[i] + count <= 99) + return TRUE; + + count = (quantities[i] + count) - 99; + if (count == 0) + return TRUE; + } + } + + return FALSE; +} + +bool8 AddPyramidBagItem(u16 itemId, u16 count) +{ + u16 i; + + u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl]; + u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl]; + + u16 *newItems = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u16)); + u8 *newQuantities = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u8)); + + memcpy(newItems, items, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16)); + memcpy(newQuantities, quantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8)); + + for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) + { + if (newItems[i] == itemId && newQuantities[i] < 99) + { + newQuantities[i] += count; + if (newQuantities[i] > 99) + { + count = newQuantities[i] - 99; + newQuantities[i] = 99; + } + else + { + count = 0; + } + + if (count == 0) + break; + } + } + + if (count > 0) + { + for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) + { + if (newItems[i] == ITEM_NONE) + { + newItems[i] = itemId; + newQuantities[i] = count; + if (newQuantities[i] > 99) + { + count = newQuantities[i] - 99; + newQuantities[i] = 99; + } + else + { + count = 0; + } + + if (count == 0) + break; + } + } + } + + if (count == 0) + { + memcpy(items, newItems, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16)); + memcpy(quantities, newQuantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8)); + Free(newItems); + Free(newQuantities); + return TRUE; + } + else + { + Free(newItems); + Free(newQuantities); + return FALSE; + } +} + +bool8 RemovePyramidBagItem(u16 itemId, u16 count) +{ + u16 i; + + u16 *items = gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.chosenLvl]; + u8 *quantities = gSaveBlock2Ptr->frontier.pyramidBag.quantity[gSaveBlock2Ptr->frontier.chosenLvl]; + + i = gUnknown_0203CF30[3] + gUnknown_0203CF30[4]; + if (items[i] == itemId && quantities[i] >= count) + { + quantities[i] -= count; + if (quantities[i] == 0) + items[i] = ITEM_NONE; + return TRUE; + } + else + { + u16 *newItems = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u16)); + u8 *newQuantities = Alloc(PYRAMID_BAG_ITEMS_COUNT * sizeof(u8)); + + memcpy(newItems, items, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16)); + memcpy(newQuantities, quantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8)); + + for (i = 0; i < PYRAMID_BAG_ITEMS_COUNT; i++) + { + if (newItems[i] == itemId) + { + if (newQuantities[i] >= count) + { + newQuantities[i] -= count; + count = 0; + if (newQuantities[i] == 0) + newItems[i] = ITEM_NONE; + } + else + { + count -= newQuantities[i]; + newQuantities[i] = 0; + newItems[i] = ITEM_NONE; + } + + if (count == 0) + break; + } + } + + if (count == 0) + { + memcpy(items, newItems, PYRAMID_BAG_ITEMS_COUNT * sizeof(u16)); + memcpy(quantities, newQuantities, PYRAMID_BAG_ITEMS_COUNT * sizeof(u8)); + Free(newItems); + Free(newQuantities); + return TRUE; + } + else + { + Free(newItems); + Free(newQuantities); + return FALSE; + } + } +} + +static u16 SanitizeItemId(u16 itemId) +{ + if (itemId >= ITEMS_COUNT) + return ITEM_NONE; + else + return itemId; +} + +const u8 *ItemId_GetName(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].name; +} + +u16 ItemId_GetId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].itemId; +} + +u16 ItemId_GetPrice(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].price; +} + +u8 ItemId_GetHoldEffect(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffect; +} + +u8 ItemId_GetHoldEffectParam(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].holdEffectParam; +} + +const u8 *ItemId_GetDescription(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].description; +} + +u8 ItemId_GetImportance(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].importance; +} + +// unused +u8 ItemId_GetUnknownValue(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].unk19; +} + +u8 ItemId_GetPocket(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].pocket; +} + +u8 ItemId_GetType(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].type; +} + +ItemUseFunc ItemId_GetFieldFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].fieldUseFunc; +} + +u8 ItemId_GetBattleUsage(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUsage; +} + +ItemUseFunc ItemId_GetBattleFunc(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].battleUseFunc; +} + +u8 ItemId_GetSecondaryId(u16 itemId) +{ + return gItems[SanitizeItemId(itemId)].secondaryId; +} diff --git a/src/item_icon.c b/src/item_icon.c index 4aaad9c31..68ec1daf0 100644 --- a/src/item_icon.c +++ b/src/item_icon.c @@ -4,13 +4,13 @@ #include "sprite.h" #include "decompress.h" #include "constants/items.h" +#include "data/item_icon_table.h" // EWRAM vars EWRAM_DATA void *gItemIconDecompressionBuffer = NULL; EWRAM_DATA void *gItemIcon4x4Buffer = NULL; // const rom data -extern const void *const gItemIconTable[][2]; // todo: move to C file static const struct OamData sOamData_ItemIcon = { @@ -162,7 +162,7 @@ const void *GetItemIconPicOrPalette(u16 itemId, u8 which) { if (itemId == 0xFFFF) itemId = ITEM_FIELD_ARROW; - else if (itemId > ITEM_LAST_ID) + else if (itemId >= ITEMS_COUNT) itemId = 0; return gItemIconTable[itemId][which]; diff --git a/src/item_menu.c b/src/item_menu.c index 8c05f0828..d134e6375 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -9,7 +9,7 @@ #include "constants/songs.h" #include "decompress.h" #include "event_data.h" -#include "field_map_obj_helpers.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "field_specials.h" #include "graphics.h" @@ -26,7 +26,6 @@ #include "malloc.h" #include "map_name_popup.h" #include "menu.h" -#include "menu_indicators.h" #include "money.h" #include "overworld.h" #include "palette.h" @@ -72,7 +71,7 @@ void AddBagItemIconSprite(u16, u8); void bag_menu_print_description_box_text(int); void bag_menu_print_cursor(u8, u8); void bag_menu_print(u8, u8, const u8*, u8, u8, u8, u8, u8, u8); -bool8 itemid_is_unique(u16); +bool8 ItemId_GetImportance(u16); u16 BagGetQuantityByPocketPosition(u8, u16); void sub_81AB89C(void); void task_close_bag_menu_2(u8); @@ -210,7 +209,7 @@ const struct YesNoFuncTable gUnknown_08614084 = {BagMenuActuallyToss, BagMenuCan const struct YesNoFuncTable gUnknown_0861408C = {sub_81AD84C, sub_81AD6FC}; -const struct ArrowStruct gUnknown_08614094 = {0, 0x1C, 16, 1, 100, 16, -1, -1, 0x6F, 0x6F, 0}; +const struct ScrollArrowsTemplate gUnknown_08614094 = {SCROLL_ARROW_LEFT, 0x1C, 16, SCROLL_ARROW_RIGHT, 100, 16, -1, -1, 0x6F, 0x6F, 0}; const u8 gUnknown_086140A4[] = INCBIN_U8("graphics/interface/select_button.4bpp"); @@ -265,14 +264,12 @@ struct TempWallyStruct { }; EWRAM_DATA struct UnkBagStruct *gUnknown_0203CE54 = 0; -EWRAM_DATA struct BagStruct gUnknown_0203CE58 = {0, 0, 0, {0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}}; +EWRAM_DATA struct BagStruct gUnknown_0203CE58 = {0}; EWRAM_DATA struct ListBuffer1 *gUnknown_0203CE74 = 0; EWRAM_DATA struct ListBuffer2 *gUnknown_0203CE78 = 0; EWRAM_DATA u16 gSpecialVar_ItemId = 0; EWRAM_DATA struct TempWallyStruct *gUnknown_0203CE80 = 0; -void (*gFieldCallback)(void); - extern u8 *gPocketNamesStringsTable[]; extern u8 gUnknown_08D9A88C[]; extern struct ListMenuTemplate gUnknown_08613F9C; @@ -304,7 +301,7 @@ void sub_81AABB0(void) void CB2_ChooseBerry(void) { - GoToBagMenu(4, 3, sub_80861B0); + GoToBagMenu(4, 3, CB2_ReturnToFieldContinueScript); } void sub_81AABF0(void(*callback)(void)) @@ -491,7 +488,7 @@ bool8 setup_bag_menu(void) gMain.state++; break; case 20: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); gPaletteFade.bufferTransferDisabled = FALSE; gMain.state++; break; @@ -687,7 +684,7 @@ void sub_81AB520(u8 rboxId, int item_index_in_pocket, u8 a) offset = GetStringRightAlignXOffset(7, gStringVar4, 0x77); bag_menu_print(rboxId, 7, gStringVar4, offset, a, 0, 0, -1, 0); } - else if (gUnknown_0203CE58.pocket != 4 && (unique = itemid_is_unique(itemId)) == FALSE) + else if (gUnknown_0203CE58.pocket != 4 && (unique = ItemId_GetImportance(itemId)) == FALSE) { ConvertIntToDecimalStringN(gStringVar1, itemQuantity, 1, 2); StringExpandPlaceholders(gStringVar4, gText_xVar1); @@ -736,7 +733,7 @@ void bag_menu_print_cursor(u8 a, u8 b) void bag_menu_add_pocket_scroll_arrow_indicators_maybe(void) { if (gUnknown_0203CE54->unk81E == 0xFF) - gUnknown_0203CE54->unk81E = AddScrollIndicatorArrowPairParametrized(2, 0xAC, 12, 0x94, gUnknown_0203CE54->unk829[gUnknown_0203CE58.pocket] - gUnknown_0203CE54->unk82E[gUnknown_0203CE58.pocket], 0x6E, 0x6E, &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket]); + gUnknown_0203CE54->unk81E = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xAC, 12, 0x94, gUnknown_0203CE54->unk829[gUnknown_0203CE58.pocket] - gUnknown_0203CE54->unk82E[gUnknown_0203CE58.pocket], 0x6E, 0x6E, &gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket]); } void sub_81AB824(void) @@ -752,7 +749,7 @@ void sub_81AB824(void) void bag_menu_add_list_scroll_arrow_indicators_maybe(void) { if (gUnknown_0203CE54->unk81B != 1 && gUnknown_0203CE54->unk81F == 0xFF) - gUnknown_0203CE54->unk81F = AddScrollIndicatorArrowPair(&gUnknown_08614094, gUnknown_0203CE58.unk6); + gUnknown_0203CE54->unk81F = AddScrollIndicatorArrowPair(&gUnknown_08614094, &gUnknown_0203CE58.unk6); } void sub_81AB89C(void) @@ -774,7 +771,7 @@ void free_bag_item_list_buffers(void) void unknown_ItemMenu_Confirm(u8 taskId) { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); gTasks[taskId].func = task_close_bag_menu_2; } @@ -804,10 +801,10 @@ void sub_81AB9A8(u8 pocketId) { case 2: case 3: - sub_80D6FB4(pocket); + SortBerriesOrTMHMs(pocket); break; default: - sub_80D6F64(pocket); + CompactItemsInBagPocket(pocket); break; } gUnknown_0203CE54->unk829[pocketId] = 0; @@ -847,9 +844,9 @@ void sub_81ABAE0(void) sub_8122298(&gUnknown_0203CE58.scrollPosition[i], &gUnknown_0203CE58.cursorPosition[i], gUnknown_0203CE54->unk82E[i], gUnknown_0203CE54->unk829[i], 8); } -u8 sub_81ABB2C(u8 a) +u8 sub_81ABB2C(u8 pocketId) { - return gUnknown_0203CE58.scrollPosition[a] + gUnknown_0203CE58.cursorPosition[a]; + return gUnknown_0203CE58.scrollPosition[pocketId] + gUnknown_0203CE58.cursorPosition[pocketId]; } void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void ( *callback)(u8 taskId)) @@ -1117,7 +1114,7 @@ void bag_menu_swap_items(u8 taskId) { s16* data = gTasks[taskId].data; - sub_81AF15C(data[0], 16, 1); + ListMenuSetUnkIndicatorsStructField(data[0], 16, 1); data[1] = gUnknown_0203CE58.scrollPosition[gUnknown_0203CE58.pocket] + gUnknown_0203CE58.cursorPosition[gUnknown_0203CE58.pocket]; gUnknown_0203CE54->unk81A = data[1]; CopyItemName(BagGetItemIdByPocketPosition(gUnknown_0203CE58.pocket + 1, data[1]), gStringVar1); @@ -1179,7 +1176,7 @@ void sub_81AC498(u8 taskId) sub_81AC590(taskId); else { - sub_80D702C(gBagPockets[gUnknown_0203CE58.pocket].itemSlots, data[1], realPos); + MoveItemSlotInList(gBagPockets[gUnknown_0203CE58.pocket].itemSlots, data[1], realPos); gUnknown_0203CE54->unk81A = -1; DestroyListMenuTask(data[0], scrollPos, cursorPos); if (data[1] < realPos) @@ -1231,7 +1228,7 @@ void sub_81AC644(u8 unused) gUnknown_0203CE54->unk828 = 4; break; case 8: - if (!itemid_is_unique(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) + if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) { gUnknown_0203CE54->unk820 = gUnknown_0861404B; gUnknown_0203CE54->unk828 = 2; @@ -1243,7 +1240,7 @@ void sub_81AC644(u8 unused) } break; case 6: - if (!itemid_is_unique(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) + if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) { gUnknown_0203CE54->unk820 = gUnknown_0861404D; gUnknown_0203CE54->unk828 = 2; @@ -1255,7 +1252,7 @@ void sub_81AC644(u8 unused) } break; case 7: - if (!itemid_is_unique(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) + if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) { gUnknown_0203CE54->unk820 = gUnknown_0861404F; gUnknown_0203CE54->unk828 = 2; @@ -1605,7 +1602,7 @@ void ItemMenu_Give(u8 taskId) { DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350); } - else if (!itemid_is_unique(gSpecialVar_ItemId)) + else if (!ItemId_GetImportance(gSpecialVar_ItemId)) { if (CalculatePlayerPartyCount() == 0) bag_menu_print_there_is_no_pokemon(taskId); @@ -1686,7 +1683,7 @@ void item_menu_type_2(u8 taskId) StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeldHere); DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD350); } - else if (gUnknown_0203CE58.pocket != 4 && !itemid_is_unique(gSpecialVar_ItemId)) + else if (gUnknown_0203CE58.pocket != 4 && !ItemId_GetImportance(gSpecialVar_ItemId)) { unknown_ItemMenu_Confirm(taskId); } @@ -1700,7 +1697,7 @@ void item_menu_type_b(u8 taskId) { if (ItemIsMail(gSpecialVar_ItemId) == TRUE) DisplayItemMessage(taskId, 1, gText_CantWriteMail, sub_81AD350); - else if (gUnknown_0203CE58.pocket != 4 && !itemid_is_unique(gSpecialVar_ItemId)) + else if (gUnknown_0203CE58.pocket != 4 && !ItemId_GetImportance(gSpecialVar_ItemId)) gTasks[taskId].func = unknown_ItemMenu_Confirm; else bag_menu_print_cant_be_held_msg(taskId); @@ -1719,7 +1716,7 @@ bool8 UseRegisteredKeyItemOnField(void) if (CheckBagHasItem(gSaveBlock1Ptr->registeredItem, 1) == TRUE) { ScriptContext2_Enable(); - FreezeMapObjects(); + FreezeEventObjects(); sub_808B864(); sub_808BCF4(); gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem; @@ -1738,7 +1735,7 @@ void display_sell_item_ask_str(u8 taskId) { s16* data = gTasks[taskId].data; - if (itemid_get_market_price(gSpecialVar_ItemId) == 0) + if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) { CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_CantBuyKeyItem); @@ -1765,7 +1762,7 @@ void sub_81AD680(u8 taskId) { s16* data = gTasks[taskId].data; - ConvertIntToDecimalStringN(gStringVar1, (itemid_get_market_price(gSpecialVar_ItemId) / 2) * data[8], 0, 6); + ConvertIntToDecimalStringN(gStringVar1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8], 0, 6); StringExpandPlaceholders(gStringVar4, gText_ICanPayVar1); DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD6E4); } @@ -1790,7 +1787,7 @@ void sub_81AD730(u8 taskId) s16* data = gTasks[taskId].data; u8 windowId = bag_menu_add_window(8); - sub_81ABCC0(windowId, 1, (itemid_get_market_price(gSpecialVar_ItemId) / 2) * data[8]); + sub_81ABCC0(windowId, 1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8]); bag_menu_AddMoney_window(); gTasks[taskId].func = sub_81AD794; } @@ -1801,7 +1798,7 @@ void sub_81AD794(u8 taskId) if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) { - sub_81ABCC0(gUnknown_0203CE54->unk818, data[8], (itemid_get_market_price(gSpecialVar_ItemId) / 2) * data[8]); + sub_81ABCC0(gUnknown_0203CE54->unk818, data[8], (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8]); } else if (gMain.newKeys & A_BUTTON) { @@ -1825,7 +1822,7 @@ void sub_81AD84C(u8 taskId) s16* data = gTasks[taskId].data; CopyItemName(gSpecialVar_ItemId, gStringVar2); - ConvertIntToDecimalStringN(gStringVar1, (itemid_get_market_price(gSpecialVar_ItemId) / 2) * data[8], 0, 6); + ConvertIntToDecimalStringN(gStringVar1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8], 0, 6); StringExpandPlaceholders(gStringVar4, gText_TurnedOverVar1ForVar2); DisplayItemMessage(taskId, 1, gStringVar4, sub_81AD8C8); } @@ -1838,7 +1835,7 @@ void sub_81AD8C8(u8 taskId) PlaySE(SE_REGI); RemoveBagItem(gSpecialVar_ItemId, data[8]); - AddMoney(&gSaveBlock1Ptr->money, (itemid_get_market_price(gSpecialVar_ItemId) / 2) * data[8]); + AddMoney(&gSaveBlock1Ptr->money, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * data[8]); DestroyListMenuTask(data[0], scrollPos, cursorPos); sub_81AB9A8(gUnknown_0203CE58.pocket); sub_81ABA88(gUnknown_0203CE58.pocket); @@ -1908,7 +1905,7 @@ void sub_81ADB14(u8 taskId) s16* data = gTasks[taskId].data; FillWindowPixelBuffer(1, 0); - if (itemid_is_unique(gSpecialVar_ItemId)) + if (ItemId_GetImportance(gSpecialVar_ItemId)) { bag_menu_print(1, 1, gText_CantStoreImportantItems, 3, 1, 0, 0, 0, 0); gTasks[taskId].func = sub_81ADC0C; @@ -2081,7 +2078,7 @@ void bag_menu_print_pocket_names(u8 *pocketName1, u8 *pocketName2) offset = GetStringCenterAlignXOffset(1, pocketName2, 0x40); bag_menu_print(windowId, 1, pocketName2, offset + 0x40, 1, 0, 0, -1, 1); } - CpuCopy32((u8*)GetWindowAttribute(windowId, 7), gUnknown_0203CE54->unk844, 0x400); + CpuCopy32((u8*)GetWindowAttribute(windowId, WINDOW_TILE_DATA), gUnknown_0203CE54->unk844, 0x400); RemoveWindow(windowId); } @@ -2093,7 +2090,7 @@ void bag_menu_copy_pocket_name_to_window(u32 a) if (a > 8) a = 8; r4 = &gUnknown_0203CE54->unk844; - windowAttribute = (u8*)GetWindowAttribute(2, 7); + windowAttribute = (u8*)GetWindowAttribute(2, WINDOW_TILE_DATA); CpuCopy32(r4[0][a], windowAttribute, 0x100); b = a + 16; CpuCopy32(r4[0][b], windowAttribute + 0x100, 0x100); @@ -2106,8 +2103,8 @@ void setup_bag_menu_textboxes(void) InitWindows(gUnknown_08614174); DeactivateAllTextPrinters(); - sub_809882C(0, 1, -32); - copy_textbox_border_tile_patterns_to_vram(0, 10, -48); + LoadUserWindowBorderGfx(0, 1, -32); + LoadMessageBoxGfx(0, 10, -48); sub_819A2BC(-64, 1); LoadPalette(&gUnknown_0860F074, 0xF0, 0x20); for (i = 0; i < 3; i++) @@ -2119,9 +2116,9 @@ void setup_bag_menu_textboxes(void) schedule_bg_copy_tilemap_to_vram(1); } -void bag_menu_print(u8 a, u8 b, const u8 *str, u8 c, u8 d, u8 e, u8 f, u8 g, u8 h) +void bag_menu_print(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 h) { - AddTextPrinterParameterized2(a, b, c, d, e, f, gUnknown_08614164[h], g, str); + AddTextPrinterParameterized2(windowId, fontId, left, top, letterSpacing, lineSpacing, gUnknown_08614164[h], speed, str); } u8 sub_81AE124(u8 a) diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index 1d9dbb106..f12bb454e 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -9,6 +9,9 @@ #include "berry.h" #include "graphics.h" #include "constants/items.h" +#include "item.h" +#include "item_use.h" +#include "constants/hold_effects.h" struct CompressedTilesPal { @@ -466,6 +469,9 @@ const struct SpriteTemplate gUnknown_0857FE88 = .callback = sub_80D5B48, }; +#include "data/text/item_descriptions.h" +#include "data/items.h" + // code void RemoveBagSprite(u8 id) { diff --git a/src/item_use.c b/src/item_use.c index 3b6b286b7..9031338dd 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -5,6 +5,7 @@ #include "berry.h" #include "bike.h" #include "coins.h" +#include "constants/bg_event_constants.h" #include "constants/flags.h" #include "constants/items.h" #include "constants/songs.h" @@ -12,12 +13,11 @@ #include "data2.h" #include "event_data.h" #include "fieldmap.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "field_player_avatar.h" #include "field_screen.h" #include "field_weather.h" #include "item.h" -#include "field_map_obj_helpers.h" #include "mail.h" #include "metatile_behavior.h" #include "overworld.h" @@ -40,7 +40,7 @@ extern void sub_81C5B14(u8 taskId); extern u8 gText_DadsAdvice[]; extern u8 gText_CantDismountBike[]; extern void sub_8197434(u8 a, u8 b); -extern void sub_80984F4(void); +extern void ScriptUnfreezeEventObjects(void); extern void ItemUseOutOfBattle_TMHM(u8 a); extern void ItemUseOutOfBattle_EvolutionStone(u8 b); extern void bag_menu_mail_related(void); @@ -91,7 +91,6 @@ extern u8* sub_806CF78(u16); extern void sub_81B89F0(void); extern u8 GetItemEffectType(u16); extern struct MapConnection *sub_8088A8C(s16, s16); -extern void (*gFieldCallback)(void); void MapPostLoadHook_UseItem(void); void sub_80AF6D4(void); @@ -167,7 +166,7 @@ void MapPostLoadHook_UseItem(void) void Task_CallItemUseOnFieldCallback(u8 taskId) { - if (sub_80ABDFC() == 1) + if (IsWeatherNotFadingIn() == 1) gUnknown_0203A0F4(taskId); } @@ -199,7 +198,7 @@ void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId) { sub_8197434(0, 1); DestroyTask(taskId); - sub_80984F4(); + ScriptUnfreezeEventObjects(); ScriptContext2_Disable(); } @@ -254,7 +253,7 @@ void ItemUseOnFieldCB_Bike(u8 taskId) GetOnOffBike(2); else GetOnOffBike(4); - sub_80984F4(); + ScriptUnfreezeEventObjects(); ScriptContext2_Disable(); DestroyTask(taskId); } @@ -339,7 +338,7 @@ void sub_80FD504(u8 taskId) } else { - playerDir = player_get_direction_lower_nybble(); + playerDir = GetPlayerFacingDirection(); for (i = 0; i < 4; i++) { if (playerDir == gUnknown_085920E4[i]) @@ -360,7 +359,7 @@ void sub_80FD504(u8 taskId) void sub_80FD5CC(u8 taskId) { sub_8197434(0, 1); - sub_80984F4(); + ScriptUnfreezeEventObjects(); ScriptContext2_Disable(); DestroyTask(taskId); } @@ -373,7 +372,7 @@ bool8 ItemfinderCheckForHiddenItems(const struct MapEvents *events, u8 taskId) gTasks[taskId].data[2] = FALSE; for (i = 0; i < events->bgEventCount; i++) { - if (events->bgEvents[i].kind == 7 && !FlagGet(events->bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4)) + if (events->bgEvents[i].kind == BG_EVENT_HIDDEN_ITEM && !FlagGet(events->bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4)) { distanceX = (u16)events->bgEvents[i].x + 7; newDistanceX = distanceX - x; @@ -400,7 +399,7 @@ bool8 sub_80FD6D4(const struct MapEvents *events, s16 x, s16 y) for (i = 0; i < bgEventCount; i++) { - if (bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? + if (bgEvent[i].kind == BG_EVENT_HIDDEN_ITEM && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed? { if (!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4)) return TRUE; @@ -426,23 +425,23 @@ bool8 sub_80FD730(struct MapConnection *connection, int x, int y) case 2: localOffset = connection->offset + 7; localX = x - localOffset; - localLength = mapHeader->mapData->height - 7; + localLength = mapHeader->mapLayout->height - 7; localY = localLength + y; // additions are reversed for some reason break; case 1: localOffset = connection->offset + 7; localX = x - localOffset; - localLength = gMapHeader.mapData->height + 7; + localLength = gMapHeader.mapLayout->height + 7; localY = y - localLength; break; case 3: - localLength = mapHeader->mapData->width - 7; + localLength = mapHeader->mapLayout->width - 7; localX = localLength + x; // additions are reversed for some reason localOffset = connection->offset + 7; localY = y - localOffset; break; case 4: - localLength = gMapHeader.mapData->width + 7; + localLength = gMapHeader.mapLayout->width + 7; localX = x - localLength; localOffset = connection->offset + 7; localY = y - localOffset; @@ -457,8 +456,8 @@ void sub_80FD7C8(u8 taskId) { s16 x, y; s16 curX, curY; - s16 width = gMapHeader.mapData->width + 7; - s16 height = gMapHeader.mapData->height + 7; + s16 width = gMapHeader.mapLayout->width + 7; + s16 height = gMapHeader.mapLayout->height + 7; s16 var1 = 7; s16 var2 = 7; @@ -581,15 +580,15 @@ u8 sub_80FD9B0(s16 itemX, s16 itemY) void sub_80FDA24(u8 direction) { - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); - npc_sync_anim_pause_bits(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + EventObjectClearHeldMovementIfFinished(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + EventObjectClearHeldMovement(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + UnfreezeEventObject(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]); PlayerTurnInPlace(direction); } void sub_80FDA94(u8 taskId) { - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) + if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, sub_80FD5CC); } @@ -597,7 +596,7 @@ void sub_80FDADC(u8 taskId) { s16 *data = gTasks[taskId].data; - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE + if (EventObjectCheckHeldMovementStatus(&gEventObjects[GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE || data[2] == FALSE) { sub_80FDA24(gUnknown_085920E4[data[5]]); @@ -729,8 +728,8 @@ bool8 sub_80FDE2C(void) u8 objId; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); z = PlayerGetZCoord(); - objId = GetFieldObjectIdByXYZ(x, y, z); - if (objId == 16 || gMapObjects[objId].graphicsId != 0xE4) + objId = GetEventObjectIdByXYZ(x, y, z); + if (objId == 16 || gEventObjects[objId].graphicsId != 0xE4) return FALSE; else return TRUE; @@ -912,7 +911,7 @@ void re_escape_rope(u8 taskId) DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44); } -bool8 sub_80FE314(void) +bool8 CanUseEscapeRopeOnCurrMap(void) { if (gMapHeader.flags & 2) return TRUE; @@ -922,7 +921,7 @@ bool8 sub_80FE314(void) void ItemUseOutOfBattle_EscapeRope(u8 taskId) { - if (sub_80FE314() == TRUE) + if (CanUseEscapeRopeOnCurrMap() == TRUE) { gUnknown_0203A0F4 = re_escape_rope; SetUpItemUseOnFieldCallback(taskId); diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 812f1f975..1012a8e08 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -237,11 +237,11 @@ void sub_818D9C0(void) { LilycoveLady *lilycoveLady; - VarSet(VAR_0x4010, sUnknown_0860B07E[GetLilycoveLadyId()]); + VarSet(VAR_OBJ_GFX_ID_0, sUnknown_0860B07E[GetLilycoveLadyId()]); if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST) { lilycoveLady = &gSaveBlock1Ptr->lilycoveLady; - VarSet(VAR_0x4011, sUnknown_0860B074[lilycoveLady->contest.category]); + VarSet(VAR_OBJ_GFX_ID_1, sUnknown_0860B074[lilycoveLady->contest.category]); gSpecialVar_Result = TRUE; } else @@ -392,7 +392,7 @@ bool8 sub_818DC60(void) static void sub_818DCAC(u8 *dest, u16 itemId) { - StringCopy(dest, ItemId_GetItem(itemId)->name); + StringCopy(dest, ItemId_GetName(itemId)); } void sub_818DCC8(void) @@ -671,7 +671,7 @@ static u8 sub_818E258(const u8 *str) void sub_818E274(void) { - StringCopy(gStringVar1, ItemId_GetItem(gUnknown_0203CD68->itemId)->name); + StringCopy(gStringVar1, ItemId_GetName(gUnknown_0203CD68->itemId)); } bool8 sub_818E298(void) @@ -801,26 +801,26 @@ void sub_818E564(void) EnableBothScriptContexts(); } -void sub_818E570(const struct LilycoveLadyQuiz *quiz) +void sub_818E570(const LilycoveLady *lilycoveLady) { u8 i; gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (quiz->unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ) + if (lilycoveLady->quiz.unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ) { for (i = 0; i < 4; i ++) { - if (quiz->unk_02c != gUnknown_0203CD68->unk_02b) + if (lilycoveLady->quiz.unk_02c != gUnknown_0203CD68->unk_02b) { break; } gUnknown_0203CD68->unk_02b = Random() % 16; } - if (quiz->unk_02c == gUnknown_0203CD68->unk_02b) + if (lilycoveLady->quiz.unk_02c == gUnknown_0203CD68->unk_02b) { gUnknown_0203CD68->unk_02b = (gUnknown_0203CD68->unk_02b + 1) % 16; } - gUnknown_0203CD68->unk_02c = quiz->unk_02c; + gUnknown_0203CD68->unk_02c = lilycoveLady->quiz.unk_02c; } } diff --git a/src/link.c b/src/link.c index 292ffecf2..b729f86eb 100644 --- a/src/link.c +++ b/src/link.c @@ -219,7 +219,7 @@ const u8 gUnknown_082ED224[] = { // .text -bool8 sub_80093CC(void) +bool8 IsWirelessAdapterConnected(void) { sub_800B488(); sub_800E700(); @@ -304,7 +304,7 @@ void LinkTestScreen(void) void sub_8009628(u8 a0) { - gLocalLinkPlayer.lp_field_18 = a0; + gLocalLinkPlayer.id = a0; } static void InitLocalLinkPlayer(void) @@ -444,7 +444,7 @@ static void LinkTestProcessKeyInput(void) } if (gMain.newKeys & L_BUTTON) { - BeginNormalPaletteFade(-1, 0, 16, 0, 2); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 2); } if (gMain.newKeys & START_BUTTON) { @@ -798,7 +798,7 @@ bool32 sub_800A040(void) return TRUE; } -bool32 sub_800A064(void) +bool32 Link_AnyPartnersPlayingRubyOrSapphire(void) { if (sub_8009FF8(VERSION_RUBY, VERSION_SAPPHIRE) >= 0) { diff --git a/src/link_rfu.c b/src/link_rfu.c index a1917ed24..29256899d 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -2051,7 +2051,7 @@ u8 sub_800DD1C(u8 maxFlags) return 0; } #else -ASM_DIRECT u8 sub_800DD1C(u8 maxFlags) +NAKED u8 sub_800DD1C(u8 maxFlags) { asm_unified("\tpush {r4-r7,lr}\n" "\tlsls r0, 24\n" @@ -2126,7 +2126,7 @@ void sub_800DD94(struct UnkLinkRfuStruct_02022B14 *data, u8 r9, bool32 r2, int r for (i = 0; i < 2; i++) { - data->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; + data->unk_00.playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; } for (i = 0; i < 4; i++) { @@ -2136,14 +2136,14 @@ void sub_800DD94(struct UnkLinkRfuStruct_02022B14 *data, u8 r9, bool32 r2, int r data->playerGender = gSaveBlock2Ptr->playerGender; data->unk_0a_0 = r9; data->unk_0a_7 = r2; - data->unk_00_0 = 2; - data->unk_01_2 = 3; - data->unk_00_4 = 0; - data->unk_00_5 = 0; - data->unk_00_6 = 0; - data->unk_00_7 = FlagGet(FLAG_0x87F); - data->unk_01_0 = IsNationalPokedexEnabled(); - data->unk_01_1 = FlagGet(FLAG_SYS_GAME_CLEAR); + data->unk_00.unk_00_0 = 2; + data->unk_00.unk_01_2 = 3; + data->unk_00.unk_00_4 = 0; + data->unk_00.unk_00_5 = 0; + data->unk_00.unk_00_6 = 0; + data->unk_00.unk_00_7 = FlagGet(FLAG_0x87F); + data->unk_00.unk_01_0 = IsNationalPokedexEnabled(); + data->unk_00.unk_01_1 = FlagGet(FLAG_SYS_GAME_CLEAR); } bool8 sub_800DE7C(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx) @@ -2155,12 +2155,12 @@ bool8 sub_800DE7C(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx) retVal = TRUE; if (sub_8010454(gUnknown_03007890->unk_14[idx].unk_04) && ((gUnknown_03007890->unk_07 >> idx) & 1)) { - memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, sizeof(gUnknown_03007890->unk_14[idx].unk_06)); + memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD); memcpy(buff2, gUnknown_03007890->unk_14[idx].unk_15, sizeof(gUnknown_03007890->unk_14[idx].unk_15)); } else { - memset(buff1, 0, sizeof(gUnknown_03007890->unk_14[idx].unk_06)); + memset(buff1, 0, 0xD); memset(buff2, 0, sizeof(gUnknown_03007890->unk_14[idx].unk_15)); } } @@ -2169,12 +2169,12 @@ bool8 sub_800DE7C(struct UnkLinkRfuStruct_02022B14 *buff1, u8 *buff2, u8 idx) retVal = FALSE; if (sub_8010454(gUnknown_03007890->unk_14[idx].unk_04)) { - memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, sizeof(gUnknown_03007890->unk_14[idx].unk_06)); + memcpy(buff1, &gUnknown_03007890->unk_14[idx].unk_06, 0xD); memcpy(buff2, gUnknown_03007890->unk_14[idx].unk_15, sizeof(gUnknown_03007890->unk_14[idx].unk_15)); } else { - memset(buff1, 0, sizeof(gUnknown_03007890->unk_14[idx].unk_06)); + memset(buff1, 0, 0xD); memset(buff2, 0, sizeof(gUnknown_03007890->unk_14[idx].unk_15)); } } @@ -2850,7 +2850,7 @@ void sub_800EF38(void) gUnknown_03005000.unk_ce7 = gUnknown_03004140.unk_00; } -bool8 sub_800EF58(bool32 a0) +bool32 sub_800EF58(bool32 a0) { if (gUnknown_03005000.unk_04 == 17 || a0) { @@ -2897,7 +2897,7 @@ void sub_800EFB0(void) CpuFill16(0, gRecvCmds, sizeof gRecvCmds); } #else -ASM_DIRECT void sub_800EFB0(void) +NAKED void sub_800EFB0(void) { asm_unified("\tpush {r4-r7,lr}\n" "\tsub sp, 0x4\n" @@ -3233,7 +3233,7 @@ void sub_800F638(u8 unused, u32 flags) } } #else -ASM_DIRECT void sub_800F638(u8 unused, u32 flags) +NAKED void sub_800F638(u8 unused, u32 flags) { asm_unified("\tpush {r4-r7,lr}\n" "\tmov r7, r10\n" @@ -3601,7 +3601,7 @@ void sub_800FD14(u16 command) } } #else -ASM_DIRECT void sub_800FD14(u16 command) +NAKED void sub_800FD14(u16 command) { asm_unified("\tpush {r4,r5,lr}\n" "\tlsls r0, 16\n" @@ -4104,7 +4104,7 @@ bool8 sub_8010540(void) return retval; } -bool8 sub_80105EC(void) +bool32 sub_80105EC(void) { u8 flags = 0; int i; @@ -4129,7 +4129,7 @@ bool8 sub_80105EC(void) return FALSE; } -bool8 sub_801064C(u16 a0, const u8 *a1) +bool32 sub_801064C(u16 a0, const u8 *a1) { u8 r1 = sub_8011CE4(a1, a0); if (r1 == 0xFF) @@ -4154,14 +4154,14 @@ void sub_80106D4(void) rfu_NI_setSendData(1 << gUnknown_03005000.unk_c3e, 8, &gUnknown_03005000.unk_c85, 1); } -u8 sub_8010714(u16 a0, const u8 *a1) +u32 sub_8010714(u16 a0, const u8 *a1) { u8 r0 = sub_8011CE4(a1, a0); if (r0 == 0xff) return 2; if (gUnknown_03007880[r0]->unk_0 == 0) - return TRUE; - return FALSE; + return 1; + return 0; } void sub_8010750(void) @@ -4512,14 +4512,14 @@ void sub_8010F84(u8 a0, u32 a1, u32 a2) void sub_8010FA0(bool32 a0, bool32 a1) { - gUnknown_02022B14.unk_00_4 = a0; - gUnknown_02022B14.unk_00_5 = a1; + gUnknown_02022B14.unk_00.unk_00_4 = a0; + gUnknown_02022B14.unk_00.unk_00_5 = a1; } void sub_8010FCC(u32 a0, u32 a1, u32 a2) { - gUnknown_02022B14.unk_09_2 = a0; - gUnknown_02022B14.unk_08_0 = a1; + gUnknown_02022B14.type = a0; + gUnknown_02022B14.species = a1; gUnknown_02022B14.unk_0b_1 = a2; } @@ -4699,7 +4699,7 @@ void sub_801120C(u8 a0) } } #else -ASM_DIRECT void sub_801120C(u8 a0) +NAKED void sub_801120C(u8 a0) { asm_unified("\tpush {r4-r7,lr}\n" "\tmov r7, r10\n" diff --git a/src/list_menu.c b/src/list_menu.c index c78d32bb3..6b5c3af94 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -5,44 +5,307 @@ #include "text_window.h" #include "main.h" #include "task.h" -#include "menu_indicators.h" +#include "trig.h" +#include "decompress.h" +#include "palette.h" +#include "malloc.h" #include "strings.h" #include "sound.h" #include "constants/songs.h" -struct UnknownMysteryGiftLinkMenuStruct +struct UnkIndicatorsStruct { - s32 field_0; - u8 field_4; - u8 field_5; - u8 field_6; + u8 field_0; + u16 *field_4; + u16 field_8; + u16 field_A; + u16 field_C; + u16 field_E; + u8 field_10; + u8 field_11; + u8 field_12; + u8 field_13; + u8 field_14_0:4; + u8 field_14_1:4; + u8 field_15_0:4; + u8 field_15_1:4; + u8 field_16_0:3; + u8 field_16_1:3; + u8 field_16_2:2; + u8 field_17_0:6; + u8 field_17_1:2; }; -struct UnknownListMenuPals +struct ScrollIndicatorPair { - u8 cursorPal:4; - u8 fillValue:4; - u8 cursorShadowPal:4; - u8 lettersSpacing:6; - u8 field_2_2:6; // unused - u8 fontId:7; - u8 field_3_7:1; + u8 field_0; + u16 *scrollOffset; + u16 fullyUpThreshold; + u16 fullyDownThreshold; + u8 topSpriteId; + u8 bottomSpriteId; + u16 tileTag; + u16 palTag; }; -extern struct UnknownMysteryGiftLinkMenuStruct gUnknown_0203CE84; +struct RedOutlineCursor +{ + struct SubspriteTable subspriteTable; + struct Subsprite *subspritesPtr; // not a const pointer + u8 spriteId; + u16 tileTag; + u16 palTag; +}; + +struct RedArrowCursor +{ + u8 spriteId; + u16 tileTag; + u16 palTag; +}; // this file's functions static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow); static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown); static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count); static void ListMenuDrawCursor(struct ListMenu *list); -static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 a2); +static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit); static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind); +static void Task_ScrollIndicatorArrowPair(u8 taskId); +static u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor); +static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor); +static void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y); +static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y); +static void ListMenuRemoveRedOutlineCursorObject(u8 taskId); +static void ListMenuRemoveRedArrowCursorObject(u8 taskId); +static u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind); +static void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind); +static void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind); +static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite); +static void SpriteCallback_RedArrowCursor(struct Sprite *sprite); + +// EWRAM vars +static EWRAM_DATA struct { + s32 currItemId; + u8 state; + u8 windowId; + u8 listTaskId; +} sMysteryGiftLinkMenu = {0}; + +EWRAM_DATA struct ScrollArrowsTemplate gTempScrollArrowTemplate = {0}; // IWRAM common -struct UnknownListMenuPals gUnknown_03006300; +struct { + u8 cursorPal:4; + u8 fillValue:4; + u8 cursorShadowPal:4; + u8 lettersSpacing:6; + u8 field_2_2:6; // unused + u8 fontId:7; + bool8 enabled:1; +} gListMenuOverride; + struct ListMenuTemplate gMultiuseListMenuTemplate; +// const rom data +static const struct +{ + u8 animNum:4; + u8 bounceDir:4; + u8 multiplier; + u16 frequency; +} sScrollIndicatorTemplates[] = +{ + {0, 0, 2, 8}, + {1, 0, 2, -8}, + {2, 1, 2, 8}, + {3, 1, 2, -8}, +}; + +static const struct OamData sOamData_ScrollArrowIndicator = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator0[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator1[] = +{ + ANIMCMD_FRAME(0, 30, 1, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator2[] = +{ + ANIMCMD_FRAME(4, 30), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_ScrollArrowIndicator3[] = +{ + ANIMCMD_FRAME(4, 30, 0, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_ScrollArrowIndicator[] = +{ + sSpriteAnim_ScrollArrowIndicator0, + sSpriteAnim_ScrollArrowIndicator1, + sSpriteAnim_ScrollArrowIndicator2, + sSpriteAnim_ScrollArrowIndicator3 +}; + +static const struct SpriteTemplate sSpriteTemplate_ScrollArrowIndicator = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sOamData_ScrollArrowIndicator, + .anims = sSpriteAnimTable_ScrollArrowIndicator, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_ScrollIndicatorArrow, +}; + +static const struct Subsprite sSubsprite_RedOutline1 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 0, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline2 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 1, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline3 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 2, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline4 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 3, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline5 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 4, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline6 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 5, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline7 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 6, + .priority = 0, +}; + +static const struct Subsprite sSubsprite_RedOutline8 = +{ + .x = 0, + .y = 0, + .shape = 0, + .size = 0, + .tileOffset = 7, + .priority = 0, +}; + +static const struct OamData sOamData_RedArrowCursor = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_RedArrowCursor[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_RedArrowCursor[] = +{ + sSpriteAnim_RedArrowCursor +}; + +static const struct SpriteTemplate sSpriteTemplate_RedArrowCursor = +{ + .tileTag = 0, + .paletteTag = 0, + .oam = &sOamData_RedArrowCursor, + .anims = sSpriteAnimTable_RedArrowCursor, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_RedArrowCursor, +}; + +static const u16 sRedArrowPal[] = INCBIN_U16("graphics/interface/red_arrow.gbapal"); +static const u8 sRedArrowOtherGfx[] = INCBIN_U8("graphics/interface/red_arrow_other.4bpp.lz"); +static const u8 sSelectorOutlineGfx[] = INCBIN_U8("graphics/interface/selector_outline.4bpp.lz"); +static const u8 sRedArrowGfx[] = INCBIN_U8("graphics/interface/red_arrow.4bpp.lz"); + // code static void ListMenuDummyTask(u8 taskId) { @@ -51,67 +314,67 @@ static void ListMenuDummyTask(u8 taskId) s32 DoMysteryGiftListMenu(struct WindowTemplate *windowTemplate, struct ListMenuTemplate *listMenuTemplate, u8 arg2, u16 tileNum, u16 palNum) { - switch (gUnknown_0203CE84.field_4) + switch (sMysteryGiftLinkMenu.state) { case 0: default: - gUnknown_0203CE84.field_5 = AddWindow(windowTemplate); + sMysteryGiftLinkMenu.windowId = AddWindow(windowTemplate); switch (arg2) { case 2: - sub_809882C(gUnknown_0203CE84.field_5, tileNum, palNum); + LoadUserWindowBorderGfx(sMysteryGiftLinkMenu.windowId, tileNum, palNum); case 1: - sub_8098858(gUnknown_0203CE84.field_5, tileNum, palNum / 16); + sub_8098858(sMysteryGiftLinkMenu.windowId, tileNum, palNum / 16); break; } gMultiuseListMenuTemplate = *listMenuTemplate; - gMultiuseListMenuTemplate.windowId = gUnknown_0203CE84.field_5; - gUnknown_0203CE84.field_6 = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); - CopyWindowToVram(gUnknown_0203CE84.field_5, 1); - gUnknown_0203CE84.field_4 = 1; + gMultiuseListMenuTemplate.windowId = sMysteryGiftLinkMenu.windowId; + sMysteryGiftLinkMenu.listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1); + sMysteryGiftLinkMenu.state = 1; break; case 1: - gUnknown_0203CE84.field_0 = ListMenuHandleInputGetItemId(gUnknown_0203CE84.field_6); + sMysteryGiftLinkMenu.currItemId = ListMenuHandleInputGetItemId(sMysteryGiftLinkMenu.listTaskId); if (gMain.newKeys & A_BUTTON) { - gUnknown_0203CE84.field_4 = 2; + sMysteryGiftLinkMenu.state = 2; } if (gMain.newKeys & B_BUTTON) { - gUnknown_0203CE84.field_0 = LIST_B_PRESSED; - gUnknown_0203CE84.field_4 = 2; + sMysteryGiftLinkMenu.currItemId = LIST_B_PRESSED; + sMysteryGiftLinkMenu.state = 2; } - if (gUnknown_0203CE84.field_4 == 2) + if (sMysteryGiftLinkMenu.state == 2) { if (arg2 == 0) { - ClearWindowTilemap(gUnknown_0203CE84.field_5); + ClearWindowTilemap(sMysteryGiftLinkMenu.windowId); } else { switch (arg2) { case 0: // can never be reached, because of the if statement above - sub_819746C(gUnknown_0203CE84.field_5, FALSE); + sub_819746C(sMysteryGiftLinkMenu.windowId, FALSE); break; case 2: case 1: - sub_819746C(gUnknown_0203CE84.field_5, FALSE); + sub_819746C(sMysteryGiftLinkMenu.windowId, FALSE); break; } } - CopyWindowToVram(gUnknown_0203CE84.field_5, 1); + CopyWindowToVram(sMysteryGiftLinkMenu.windowId, 1); } break; case 2: - DestroyListMenuTask(gUnknown_0203CE84.field_6, NULL, NULL); - RemoveWindow(gUnknown_0203CE84.field_5); - gUnknown_0203CE84.field_4 = 0; - return gUnknown_0203CE84.field_0; + DestroyListMenuTask(sMysteryGiftLinkMenu.listTaskId, NULL, NULL); + RemoveWindow(sMysteryGiftLinkMenu.windowId); + sMysteryGiftLinkMenu.state = 0; + return sMysteryGiftLinkMenu.currItemId; } - return -1; + return LIST_NOTHING_CHOSEN; } u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow) @@ -124,19 +387,19 @@ u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 } // unused -u8 ListMenuInitWithWindows(struct ListMenuTemplate *listMenuTemplate, struct UnknownListMenuWindowStruct *arg1, u16 scrollOffset, u16 selectedRow) +u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *rect, u16 scrollOffset, u16 selectedRow) { s32 i; u8 taskId = ListMenuInitInternal(listMenuTemplate, scrollOffset, selectedRow); - for (i = 0; arg1[i].palNum != 0xFF; i++) + for (i = 0; rect[i].palNum != 0xFF; i++) { PutWindowRectTilemapOverridePalette(listMenuTemplate->windowId, - arg1[i].x, - arg1[i].y, - arg1[i].width, - arg1[i].height, - arg1[i].palNum); + rect[i].x, + rect[i].y, + rect[i].width, + rect[i].height, + rect[i].palNum); } CopyWindowToVram(listMenuTemplate->windowId, 2); @@ -202,6 +465,8 @@ s32 ListMenuHandleInputGetItemId(u8 listTaskId) } } +#define TASK_NONE 0xFF + void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow) { struct ListMenu *list = (void*) gTasks[listTaskId].data; @@ -211,13 +476,13 @@ void DestroyListMenuTask(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow) if (selectedRow != NULL) *selectedRow = list->selectedRow; - if (list->unk_1E != 0xFF) - ListMenuRemoveCursorObject(list->unk_1E, list->template.cursorKind - 2); + if (list->taskId != TASK_NONE) + ListMenuRemoveCursorObject(list->taskId, list->template.cursorKind - 2); DestroyTask(listTaskId); } -void sub_81AE70C(u8 listTaskId) +void RedrawListMenu(u8 listTaskId) { struct ListMenu *list = (void*) gTasks[listTaskId].data; @@ -291,7 +556,7 @@ void ListMenuGetScrollAndRow(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow) u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId) { struct ListMenu *list = (void*) gTasks[listTaskId].data; - u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; return list->selectedRow * yMultiplier + list->template.upText_Y; } @@ -306,15 +571,15 @@ static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 sc list->selectedRow = selectedRow; list->unk_1C = 0; list->unk_1D = 0; - list->unk_1E = 0xFF; + list->taskId = TASK_NONE; list->unk_1F = 0; - gUnknown_03006300.cursorPal = list->template.cursorPal; - gUnknown_03006300.fillValue = list->template.fillValue; - gUnknown_03006300.cursorShadowPal = list->template.cursorShadowPal; - gUnknown_03006300.lettersSpacing = list->template.lettersSpacing; - gUnknown_03006300.fontId = list->template.fontId; - gUnknown_03006300.field_3_7 = 0; + gListMenuOverride.cursorPal = list->template.cursorPal; + gListMenuOverride.fillValue = list->template.fillValue; + gListMenuOverride.cursorShadowPal = list->template.cursorShadowPal; + gListMenuOverride.lettersSpacing = list->template.lettersSpacing; + gListMenuOverride.fontId = list->template.fontId; + gListMenuOverride.enabled = FALSE; if (list->template.totalItems < list->template.maxShowed) list->template.maxShowed = list->template.totalItems; @@ -322,7 +587,7 @@ static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 sc FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue)); ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); ListMenuDrawCursor(list); - ListMenuCallSelectionChangedCallback(list, 1); + ListMenuCallSelectionChangedCallback(list, TRUE); return listTaskId; } @@ -330,18 +595,18 @@ static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 sc static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) { u8 colors[3]; - if (gUnknown_03006300.field_3_7) + if (gListMenuOverride.enabled) { - colors[0] = gUnknown_03006300.fillValue; - colors[1] = gUnknown_03006300.cursorPal; - colors[2] = gUnknown_03006300.cursorShadowPal; + colors[0] = gListMenuOverride.fillValue; + colors[1] = gListMenuOverride.cursorPal; + colors[2] = gListMenuOverride.cursorShadowPal; AddTextPrinterParameterized2(list->template.windowId, - gUnknown_03006300.fontId, + gListMenuOverride.fontId, x, y, - gUnknown_03006300.lettersSpacing, + gListMenuOverride.lettersSpacing, 0, colors, TEXT_SPEED_FF, str); - gUnknown_03006300.field_3_7 = 0; + gListMenuOverride.enabled = FALSE; } else { @@ -360,18 +625,18 @@ static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOff { s32 i; u8 x, y; - u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; for (i = 0; i < count; i++) { - if (list->template.items[startIndex].id != -3) - x = list->template.unk_12; + if (list->template.items[startIndex].id != LIST_HEADER) + x = list->template.item_X; else - x = list->template.unk_11; + x = list->template.header_X; y = (yOffset + i) * yMultiplier + list->template.upText_Y; - if (list->template.unk_08 != NULL) - list->template.unk_08(list->template.windowId, list->template.items[startIndex].id, y); + if (list->template.itemPrintFunc != NULL) + list->template.itemPrintFunc(list->template.windowId, list->template.items[startIndex].id, y); ListMenuPrint(list, list->template.items[startIndex].name, x, y); startIndex++; @@ -380,7 +645,7 @@ static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOff static void ListMenuDrawCursor(struct ListMenu *list) { - u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; u8 x = list->template.cursor_X; u8 y = list->selectedRow * yMultiplier + list->template.upText_Y; switch (list->template.cursorKind) @@ -391,33 +656,35 @@ static void ListMenuDrawCursor(struct ListMenu *list) case 1: break; case 2: - if (list->unk_1E == 0xFF) - list->unk_1E = ListMenuAddCursorObject(list, 0); - ListMenuUpdateCursorObject(list->unk_1E, + if (list->taskId == TASK_NONE) + list->taskId = ListMenuAddCursorObject(list, 0); + ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 - 1, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y - 1, 0); break; case 3: - if (list->unk_1E == 0xFF) - list->unk_1E = ListMenuAddCursorObject(list, 1); - ListMenuUpdateCursorObject(list->unk_1E, + if (list->taskId == TASK_NONE) + list->taskId = ListMenuAddCursorObject(list, 1); + ListMenuUpdateCursorObject(list->taskId, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_LEFT) * 8 + x, GetWindowAttribute(list->template.windowId, WINDOW_TILEMAP_TOP) * 8 + y, 1); break; } } +#undef TASK_NONE + static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) { struct CursorStruct cursor; - cursor.unk0 = 0; - cursor.unk1 = 0xA0; - cursor.unk2 = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2; - cursor.unk4 = GetFontAttribute(list->template.fontId, 1) + 2; - cursor.unk6 = 0x4000; - cursor.unk8 = 0xFFFF; - cursor.unkA = 0xF; + cursor.left = 0; + cursor.top = 160; + cursor.rowWidth = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8 + 2; + cursor.rowHeight = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + 2; + cursor.tileTag = 0x4000; + cursor.palTag = SPRITE_INVALID_TAG; + cursor.palNum = 15; return ListMenuAddCursorObjectInternal(&cursor, cursorKind); } @@ -427,7 +694,7 @@ static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 selectedRow) u8 cursorKind = list->template.cursorKind; if (cursorKind == 0) { - u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0); u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1); FillWindowPixelRect(list->template.windowId, @@ -458,7 +725,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow != 0) { selectedRow--; - if (list->template.items[scrollOffset + selectedRow].id != -3) + if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -472,7 +739,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow > newRow) { selectedRow--; - if (list->template.items[scrollOffset + selectedRow].id != -3) + if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -494,7 +761,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow < list->template.maxShowed - 1) { selectedRow++; - if (list->template.items[scrollOffset + selectedRow].id != -3) + if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -508,7 +775,7 @@ static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, b while (selectedRow < newRow) { selectedRow++; - if (list->template.items[scrollOffset + selectedRow].id != -3) + if (list->template.items[scrollOffset + selectedRow].id != LIST_HEADER) { list->selectedRow = selectedRow; return 1; @@ -533,7 +800,7 @@ static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown) } else { - u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + u8 yMultiplier = GetFontAttribute(list->template.fontId, FONTATTR_MAX_LETTER_HEIGHT) + list->template.itemVerticalPadding; if (!movingDown) { @@ -581,7 +848,7 @@ static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAn if (ret != 2) break; cursorCount++; - } while (list->template.items[list->scrollOffset + list->selectedRow].id == -3); + } while (list->template.items[list->scrollOffset + list->selectedRow].id == LIST_HEADER); } if (updateCursorAndCallCallback) @@ -594,7 +861,7 @@ static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAn case 1: ListMenuErasePrintedCursor(list, oldSelectedRow); ListMenuDrawCursor(list); - ListMenuCallSelectionChangedCallback(list, 0); + ListMenuCallSelectionChangedCallback(list, FALSE); CopyWindowToVram(list->template.windowId, 2); break; case 2: @@ -602,7 +869,7 @@ static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAn ListMenuErasePrintedCursor(list, oldSelectedRow); ListMenuScroll(list, cursorCount, movingDown); ListMenuDrawCursor(list); - ListMenuCallSelectionChangedCallback(list, 0); + ListMenuCallSelectionChangedCallback(list, FALSE); CopyWindowToVram(list->template.windowId, 2); break; } @@ -611,23 +878,585 @@ static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAn return FALSE; } -static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 a2) +static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 onInit) { if (list->template.moveCursorFunc != NULL) - list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].id, a2, list); + list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].id, onInit, list); } // unused -void sub_81AF028(u8 cursorPal, u8 fillValue, u8 cursorShadowPal) +void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal) { - gUnknown_03006300.cursorPal = cursorPal; - gUnknown_03006300.fillValue = fillValue; - gUnknown_03006300.cursorShadowPal = cursorShadowPal; - gUnknown_03006300.field_3_7 = 1; + gListMenuOverride.cursorPal = cursorPal; + gListMenuOverride.fillValue = fillValue; + gListMenuOverride.cursorShadowPal = cursorShadowPal; + gListMenuOverride.enabled = TRUE; } -void sub_81AF078(s32 arg0, u8 arg1, struct ListMenu *list) +void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) { - if (!arg1) + if (!onInit) PlaySE(SE_SELECT); } + +// unused +s32 ListMenuGetUnkIndicatorsStructFields(u8 taskId, u8 field) +{ + struct UnkIndicatorsStruct *data = (void*) gTasks[taskId].data; + + switch (field) + { + case 0: + case 1: + return (s32)(data->field_4); + case 2: + return data->field_C; + case 3: + return data->field_E; + case 4: + return data->field_10; + case 5: + return data->field_11; + case 6: + return data->field_12; + case 7: + return data->field_13; + case 8: + return data->field_14_0; + case 9: + return data->field_14_1; + case 10: + return data->field_15_0; + case 11: + return data->field_15_1; + case 12: + return data->field_16_0; + case 13: + return data->field_16_1; + case 14: + return data->field_16_2; + case 15: + return data->field_17_0; + case 16: + return data->field_17_1; + default: + return -1; + } +} + +void ListMenuSetUnkIndicatorsStructField(u8 taskId, u8 field, s32 value) +{ + struct UnkIndicatorsStruct *data = (void*) &gTasks[taskId].data; + + switch (field) + { + case 0: + case 1: + data->field_4 = (void*)(value); + break; + case 2: + data->field_C = value; + break; + case 3: + data->field_E = value; + break; + case 4: + data->field_10 = value; + break; + case 5: + data->field_11 = value; + break; + case 6: + data->field_12 = value; + break; + case 7: + data->field_13 = value; + break; + case 8: + data->field_14_0 = value; + break; + case 9: + data->field_14_1 = value; + break; + case 10: + data->field_15_0 = value; + break; + case 11: + data->field_15_1 = value; + break; + case 12: + data->field_16_0 = value; + break; + case 13: + data->field_16_1 = value; + break; + case 14: + data->field_16_2 = value; + break; + case 15: + data->field_17_0 = value; + break; + case 16: + data->field_17_1 = value; + break; + } +} + +#define tState data[0] +#define tAnimNum data[1] +#define tBounceDir data[2] +#define tMultiplier data[3] +#define tFrequency data[4] +#define tSinePos data[5] + +static void SpriteCallback_ScrollIndicatorArrow(struct Sprite *sprite) +{ + s32 multiplier; + + switch (sprite->tState) + { + case 0: + StartSpriteAnim(sprite, sprite->tAnimNum); + sprite->tState++; + break; + case 1: + switch (sprite->tBounceDir) + { + case 0: + multiplier = sprite->tMultiplier; + sprite->pos2.x = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256; + break; + case 1: + multiplier = sprite->tMultiplier; + sprite->pos2.y = (gSineTable[(u8)(sprite->tSinePos)] * multiplier) / 256; + break; + } + sprite->tSinePos += sprite->tFrequency; + break; + } +} + +static u8 AddScrollIndicatorArrowObject(u8 arrowDir, u8 x, u8 y, u16 tileTag, u16 palTag) +{ + u8 spriteId; + struct SpriteTemplate spriteTemplate; + + spriteTemplate = sSpriteTemplate_ScrollArrowIndicator; + spriteTemplate.tileTag = tileTag; + spriteTemplate.paletteTag = palTag; + + spriteId = CreateSprite(&spriteTemplate, x, y, 0); + gSprites[spriteId].invisible = TRUE; + gSprites[spriteId].tState = 0; + gSprites[spriteId].tAnimNum = sScrollIndicatorTemplates[arrowDir].animNum; + gSprites[spriteId].tBounceDir = sScrollIndicatorTemplates[arrowDir].bounceDir; + gSprites[spriteId].tMultiplier = sScrollIndicatorTemplates[arrowDir].multiplier; + gSprites[spriteId].tFrequency = sScrollIndicatorTemplates[arrowDir].frequency; + gSprites[spriteId].tSinePos = 0; + + return spriteId; +} + +#undef tState +#undef tAnimNum +#undef tBounceDir +#undef tMultiplier +#undef tFrequency +#undef tSinePos + +u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset) +{ + struct CompressedSpriteSheet spriteSheet; + struct SpritePalette spritePal; + struct ScrollIndicatorPair *data; + u8 taskId; + + spriteSheet.data = sRedArrowOtherGfx; + spriteSheet.size = 0x100; + spriteSheet.tag = arrowInfo->tileTag; + LoadCompressedObjectPic(&spriteSheet); + + if (arrowInfo->palTag == SPRITE_INVALID_TAG) + { + LoadPalette(sRedArrowPal, (16 * arrowInfo->palNum) + 0x100, 0x20); + } + else + { + spritePal.data = sRedArrowPal; + spritePal.tag = arrowInfo->palTag; + LoadSpritePalette(&spritePal); + } + + taskId = CreateTask(Task_ScrollIndicatorArrowPair, 0); + data = (void*) gTasks[taskId].data; + + data->field_0 = 0; + data->scrollOffset = scrollOffset; + data->fullyUpThreshold = arrowInfo->fullyUpThreshold; + data->fullyDownThreshold = arrowInfo->fullyDownThreshold; + data->tileTag = arrowInfo->tileTag; + data->palTag = arrowInfo->palTag; + data->topSpriteId = AddScrollIndicatorArrowObject(arrowInfo->firstArrowType, arrowInfo->firstX, arrowInfo->firstY, arrowInfo->tileTag, arrowInfo->palTag); + data->bottomSpriteId = AddScrollIndicatorArrowObject(arrowInfo->secondArrowType, arrowInfo->secondX, arrowInfo->secondY, arrowInfo->tileTag, arrowInfo->palTag); + + if (arrowInfo->palTag == SPRITE_INVALID_TAG) + { + gSprites[data->topSpriteId].oam.paletteNum = arrowInfo->palNum; + gSprites[data->bottomSpriteId].oam.paletteNum = arrowInfo->palNum; + } + + return taskId; +} + +u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset) +{ + if (arrowType == SCROLL_ARROW_UP || arrowType == SCROLL_ARROW_DOWN) + { + gTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_UP; + gTempScrollArrowTemplate.firstX = commonPos; + gTempScrollArrowTemplate.firstY = firstPos; + gTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_DOWN; + gTempScrollArrowTemplate.secondX = commonPos; + gTempScrollArrowTemplate.secondY = secondPos; + } + else + { + gTempScrollArrowTemplate.firstArrowType = SCROLL_ARROW_LEFT; + gTempScrollArrowTemplate.firstX = firstPos; + gTempScrollArrowTemplate.firstY = commonPos; + gTempScrollArrowTemplate.secondArrowType = SCROLL_ARROW_RIGHT; + gTempScrollArrowTemplate.secondX = secondPos; + gTempScrollArrowTemplate.secondY = commonPos; + } + + gTempScrollArrowTemplate.fullyUpThreshold = 0; + gTempScrollArrowTemplate.fullyDownThreshold = fullyDownThreshold; + gTempScrollArrowTemplate.tileTag = tileTag; + gTempScrollArrowTemplate.palTag = palTag; + gTempScrollArrowTemplate.palNum = 0; + + return AddScrollIndicatorArrowPair(&gTempScrollArrowTemplate, scrollOffset); +} + +static void Task_ScrollIndicatorArrowPair(u8 taskId) +{ + struct ScrollIndicatorPair *data = (void*) gTasks[taskId].data; + u16 currItem = (*data->scrollOffset); + + if (currItem == data->fullyUpThreshold && currItem != 0xFFFF) + gSprites[data->topSpriteId].invisible = TRUE; + else + gSprites[data->topSpriteId].invisible = FALSE; + + if (currItem == data->fullyDownThreshold) + gSprites[data->bottomSpriteId].invisible = TRUE; + else + gSprites[data->bottomSpriteId].invisible = FALSE; +} + +#define tIsScrolled data[15] + +void Task_ScrollIndicatorArrowPairOnMainMenu(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + struct ScrollIndicatorPair *scrollData = (void*) data; + + if (tIsScrolled) + { + gSprites[scrollData->topSpriteId].invisible = FALSE; + gSprites[scrollData->bottomSpriteId].invisible = TRUE; + } + else + { + gSprites[scrollData->topSpriteId].invisible = TRUE; + gSprites[scrollData->bottomSpriteId].invisible = FALSE; + } +} + +#undef tIsScrolled + +void RemoveScrollIndicatorArrowPair(u8 taskId) +{ + struct ScrollIndicatorPair *data = (void*) gTasks[taskId].data; + + if (data->tileTag != SPRITE_INVALID_TAG) + FreeSpriteTilesByTag(data->tileTag); + if (data->palTag != SPRITE_INVALID_TAG) + FreeSpritePaletteByTag(data->palTag); + + DestroySprite(&gSprites[data->topSpriteId]); + DestroySprite(&gSprites[data->bottomSpriteId]); + + DestroyTask(taskId); +} + +static u8 ListMenuAddCursorObjectInternal(struct CursorStruct *cursor, u32 cursorKind) +{ + switch (cursorKind) + { + case 0: + default: + return ListMenuAddRedOutlineCursorObject(cursor); + case 1: + return ListMenuAddRedArrowCursorObject(cursor); + } +} + +static void ListMenuUpdateCursorObject(u8 taskId, u16 x, u16 y, u32 cursorKind) +{ + switch (cursorKind) + { + case 0: + ListMenuUpdateRedOutlineCursorObject(taskId, x, y); + break; + case 1: + ListMenuUpdateRedArrowCursorObject(taskId, x, y); + break; + } +} + +static void ListMenuRemoveCursorObject(u8 taskId, u32 cursorKind) +{ + switch (cursorKind) + { + case 0: + ListMenuRemoveRedOutlineCursorObject(taskId); + break; + case 1: + ListMenuRemoveRedArrowCursorObject(taskId); + break; + } +} + +static void Task_RedOutlineCursor(u8 taskId) +{ + +} + +u8 ListMenuGetRedOutlineCursorSpriteCount(u16 rowWidth, u16 rowHeight) +{ + s32 i; + s32 count = 4; + + if (rowWidth > 16) + { + for (i = 8; i < (rowWidth - 8); i += 8) + count += 2; + } + if (rowHeight > 16) + { + for (i = 8; i < (rowHeight - 8); i += 8) + count += 2; + } + + return count; +} + +void ListMenuSetUpRedOutlineCursorSpriteOamTable(u16 rowWidth, u16 rowHeight, struct Subsprite *subsprites) +{ + s32 i, j, id = 0; + + subsprites[id] = sSubsprite_RedOutline1; + subsprites[id].x = 136; + subsprites[id].y = 136; + id++; + + subsprites[id] = sSubsprite_RedOutline2; + subsprites[id].x = rowWidth + 128; + subsprites[id].y = 136; + id++; + + subsprites[id] = sSubsprite_RedOutline7; + subsprites[id].x = 136; + subsprites[id].y = rowHeight + 128; + id++; + + subsprites[id] = sSubsprite_RedOutline8; + subsprites[id].x = rowWidth + 128; + subsprites[id].y = rowHeight + 128; + id++; + + if (rowWidth > 16) + { + for (i = 8; i < rowWidth - 8; i += 8) + { + subsprites[id] = sSubsprite_RedOutline3; + subsprites[id].x = i - 120; + subsprites[id].y = 136; + id++; + + subsprites[id] = sSubsprite_RedOutline6; + subsprites[id].x = i - 120; + subsprites[id].y = rowHeight + 128; + id++; + } + } + + if (rowHeight > 16) + { + for (j = 8; j < rowHeight - 8; j += 8) + { + subsprites[id] = sSubsprite_RedOutline4; + subsprites[id].x = 136; + subsprites[id].y = j - 120; + id++; + + subsprites[id] = sSubsprite_RedOutline5; + subsprites[id].x = rowWidth + 128; + subsprites[id].y = j - 120; + id++; + } + } +} + +static u8 ListMenuAddRedOutlineCursorObject(struct CursorStruct *cursor) +{ + struct CompressedSpriteSheet spriteSheet; + struct SpritePalette spritePal; + struct RedOutlineCursor *data; + struct SpriteTemplate spriteTemplate; + u8 taskId; + + spriteSheet.data = sSelectorOutlineGfx; + spriteSheet.size = 0x100; + spriteSheet.tag = cursor->tileTag; + LoadCompressedObjectPic(&spriteSheet); + + if (cursor->palTag == SPRITE_INVALID_TAG) + { + LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20); + } + else + { + spritePal.data = sRedArrowPal; + spritePal.tag = cursor->palTag; + LoadSpritePalette(&spritePal); + } + + taskId = CreateTask(Task_RedOutlineCursor, 0); + data = (void*) gTasks[taskId].data; + + data->tileTag = cursor->tileTag; + data->palTag = cursor->palTag; + data->subspriteTable.subspriteCount = ListMenuGetRedOutlineCursorSpriteCount(cursor->rowWidth, cursor->rowHeight); + data->subspriteTable.subsprites = data->subspritesPtr = Alloc(data->subspriteTable.subspriteCount * 4); + ListMenuSetUpRedOutlineCursorSpriteOamTable(cursor->rowWidth, cursor->rowHeight, data->subspritesPtr); + + spriteTemplate = gDummySpriteTemplate; + spriteTemplate.tileTag = cursor->tileTag; + spriteTemplate.paletteTag = cursor->palTag; + + data->spriteId = CreateSprite(&spriteTemplate, cursor->left + 120, cursor->top + 120, 0); + SetSubspriteTables(&gSprites[data->spriteId], &data->subspriteTable); + gSprites[data->spriteId].oam.priority = 0; + gSprites[data->spriteId].subpriority = 0; + gSprites[data->spriteId].subspriteTableNum = 0; + + if (cursor->palTag == SPRITE_INVALID_TAG) + { + gSprites[data->spriteId].oam.paletteNum = cursor->palNum; + } + + return taskId; +} + +static void ListMenuUpdateRedOutlineCursorObject(u8 taskId, u16 x, u16 y) +{ + struct RedOutlineCursor *data = (void*) gTasks[taskId].data; + + gSprites[data->spriteId].pos1.x = x + 120; + gSprites[data->spriteId].pos1.y = y + 120; +} + +static void ListMenuRemoveRedOutlineCursorObject(u8 taskId) +{ + struct RedOutlineCursor *data = (void*) gTasks[taskId].data; + + Free(data->subspritesPtr); + + if (data->tileTag != SPRITE_INVALID_TAG) + FreeSpriteTilesByTag(data->tileTag); + if (data->palTag != SPRITE_INVALID_TAG) + FreeSpritePaletteByTag(data->palTag); + + DestroySprite(&gSprites[data->spriteId]); + DestroyTask(taskId); +} + +static void SpriteCallback_RedArrowCursor(struct Sprite *sprite) +{ + sprite->pos2.x = gSineTable[(u8)(sprite->data[0])] / 64; + sprite->data[0] += 8; +} + +static void Task_RedArrowCursor(u8 taskId) +{ + +} + +static u8 ListMenuAddRedArrowCursorObject(struct CursorStruct *cursor) +{ + struct CompressedSpriteSheet spriteSheet; + struct SpritePalette spritePal; + struct RedArrowCursor *data; + struct SpriteTemplate spriteTemplate; + u8 taskId; + + spriteSheet.data = sRedArrowGfx; + spriteSheet.size = 0x80; + spriteSheet.tag = cursor->tileTag; + LoadCompressedObjectPic(&spriteSheet); + + if (cursor->palTag == SPRITE_INVALID_TAG) + { + LoadPalette(sRedArrowPal, (16 * cursor->palNum) + 0x100, 0x20); + } + else + { + spritePal.data = sRedArrowPal; + spritePal.tag = cursor->palTag; + LoadSpritePalette(&spritePal); + } + + taskId = CreateTask(Task_RedArrowCursor, 0); + data = (void*) gTasks[taskId].data; + + data->tileTag = cursor->tileTag; + data->palTag = cursor->palTag; + + spriteTemplate = sSpriteTemplate_RedArrowCursor; + spriteTemplate.tileTag = cursor->tileTag; + spriteTemplate.paletteTag = cursor->palTag; + + data->spriteId = CreateSprite(&spriteTemplate, cursor->left, cursor->top, 0); + gSprites[data->spriteId].pos2.x = 8; + gSprites[data->spriteId].pos2.y = 8; + + if (cursor->palTag == SPRITE_INVALID_TAG) + { + gSprites[data->spriteId].oam.paletteNum = cursor->palNum; + } + + return taskId; +} + +static void ListMenuUpdateRedArrowCursorObject(u8 taskId, u16 x, u16 y) +{ + struct RedArrowCursor *data = (void*) gTasks[taskId].data; + + gSprites[data->spriteId].pos1.x = x; + gSprites[data->spriteId].pos1.y = y; +} + +static void ListMenuRemoveRedArrowCursorObject(u8 taskId) +{ + struct RedArrowCursor *data = (void*) gTasks[taskId].data; + + if (data->tileTag != SPRITE_INVALID_TAG) + FreeSpriteTilesByTag(data->tileTag); + if (data->palTag != SPRITE_INVALID_TAG) + FreeSpritePaletteByTag(data->palTag); + + DestroySprite(&gSprites[data->spriteId]); + DestroyTask(taskId); +} diff --git a/src/load_save.c b/src/load_save.c index e3de66bb8..005af7c42 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -4,33 +4,30 @@ #include "main.h" #include "pokemon.h" #include "random.h" +#include "malloc.h" +#include "item.h" extern void* gUnknown_0203CF5C; extern bool16 IdentifyFlash(void); -extern void SetBagItemsPointers(void); extern void SetDecorationInventoriesPointers(void); extern void ApplyNewEncryptionKeyToGameStats(u32 key); -extern void ApplyNewEncryptionKeyToBagItems(u32 newKey); -extern void ApplyNewEncryptionKeyToBagItems_(u32 key); extern void ApplyNewEncryptionKeyToBerryPowder(u32 key); extern void sub_8084FAC(int unused); -// this is probably wrong or misleading due to it being used in ResetHeap... -extern void InitHeap(void *pointer, u32 size); - #define SAVEBLOCK_MOVE_RANGE 128 struct LoadedSaveData { - /*0x0000*/ struct ItemSlot items[30]; - /*0x0078*/ struct ItemSlot keyItems[30]; - /*0x00F0*/ struct ItemSlot pokeBalls[16]; - /*0x0130*/ struct ItemSlot TMsHMs[64]; - /*0x0230*/ struct ItemSlot berries[46]; + /*0x0000*/ struct ItemSlot items[BAG_ITEMS_COUNT]; + /*0x0078*/ struct ItemSlot keyItems[BAG_KEYITEMS_COUNT]; + /*0x00F0*/ struct ItemSlot pokeBalls[BAG_POKEBALLS_COUNT]; + /*0x0130*/ struct ItemSlot TMsHMs[BAG_TMHM_COUNT]; + /*0x0230*/ struct ItemSlot berries[BAG_BERRIES_COUNT]; /*0x02E8*/ struct MailStruct mail[MAIL_COUNT]; }; +// EWRAM DATA EWRAM_DATA struct SaveBlock2 gSaveblock2 = {0}; EWRAM_DATA u8 gSaveblock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; @@ -41,10 +38,15 @@ EWRAM_DATA struct PokemonStorage gPokemonStorage = {0}; EWRAM_DATA u8 gSaveblock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0}; EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0}; -EWRAM_DATA u32 gLastEncryptionKey = {0}; +EWRAM_DATA u32 gLastEncryptionKey = 0; -void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); +// IWRAM common +IWRAM_DATA bool32 gFlashMemoryPresent; +IWRAM_DATA struct SaveBlock1 *gSaveBlock1Ptr; +IWRAM_DATA struct SaveBlock2 *gSaveBlock2Ptr; +IWRAM_DATA struct PokemonStorage *gPokemonStoragePtr; +// code void CheckForFlashMemory(void) { if (!IdentifyFlash()) @@ -53,7 +55,9 @@ void CheckForFlashMemory(void) InitFlashTimer(); } else + { gFlashMemoryPresent = FALSE; + } } void ClearSav2(void) @@ -80,8 +84,6 @@ void SetSaveBlocksPointers(u16 offset) SetDecorationInventoriesPointers(); } -extern u8 gHeap[]; - void MoveSaveBlocks_ResetHeap(void) { void *vblankCB, *hblankCB; @@ -132,7 +134,6 @@ void MoveSaveBlocks_ResetHeap(void) gSaveBlock2Ptr->encryptionKey = encryptionKey; } - u32 GetSecretBase2Field_9(void) { return gSaveBlock2Ptr->specialSaveWarp & 1; @@ -159,112 +160,112 @@ void sav2_gender2_inplace_and_xFE(void) gSaveBlock2Ptr->specialSaveWarp &= ~1; } -void copy_player_party_to_sav1(void) // SavePlayerParty +void SavePlayerParty(void) { int i; gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i]; } -void copy_player_party_from_sav1(void) // LoadPlayerParty +void LoadPlayerParty(void) { int i; gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i]; } -void save_serialize_npcs(void) // SaveMapObjects +void SaveEventObjects(void) { int i; - for (i = 0; i < 16; i++) - gSaveBlock1Ptr->mapObjects[i] = gMapObjects[i]; + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) + gSaveBlock1Ptr->eventObjects[i] = gEventObjects[i]; } -void save_deserialize_npcs(void) // LoadMapObjects +void LoadEventObjects(void) { int i; - for (i = 0; i < 16; i++) - gMapObjects[i] = gSaveBlock1Ptr->mapObjects[i]; + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) + gEventObjects[i] = gSaveBlock1Ptr->eventObjects[i]; } void SaveSerializedGame(void) { - copy_player_party_to_sav1(); - save_serialize_npcs(); + SavePlayerParty(); + SaveEventObjects(); } void LoadSerializedGame(void) { - copy_player_party_from_sav1(); - save_deserialize_npcs(); + LoadPlayerParty(); + LoadEventObjects(); } -void copy_bags_and_unk_data_from_save_blocks(void) +void LoadPlayerBag(void) { int i; // load player items. - for (i = 0; i < 30; i++) + for (i = 0; i < BAG_ITEMS_COUNT; i++) gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i]; // load player key items. - for (i = 0; i < 30; i++) + for (i = 0; i < BAG_KEYITEMS_COUNT; i++) gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i]; // load player pokeballs. - for (i = 0; i < 16; i++) + for (i = 0; i < BAG_POKEBALLS_COUNT; i++) gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i]; // load player TMs and HMs. - for (i = 0; i < 64; i++) + for (i = 0; i < BAG_TMHM_COUNT; i++) gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i]; // load player berries. - for (i = 0; i < 46; i++) + for (i = 0; i < BAG_BERRIES_COUNT; i++) gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i]; // load mail. - for (i = 0; i < 16; i++) + for (i = 0; i < MAIL_COUNT; i++) gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i]; gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey; } -void copy_bags_and_unk_data_to_save_blocks(void) +void SavePlayerBag(void) { int i; u32 encryptionKeyBackup; // save player items. - for (i = 0; i < 30; i++) + for (i = 0; i < BAG_ITEMS_COUNT; i++) gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i]; // save player key items. - for (i = 0; i < 30; i++) + for (i = 0; i < BAG_KEYITEMS_COUNT; i++) gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i]; // save player pokeballs. - for (i = 0; i < 16; i++) + for (i = 0; i < BAG_POKEBALLS_COUNT; i++) gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i]; // save player TMs and HMs. - for (i = 0; i < 64; i++) + for (i = 0; i < BAG_TMHM_COUNT; i++) gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i]; // save player berries. - for (i = 0; i < 46; i++) + for (i = 0; i < BAG_BERRIES_COUNT; i++) gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i]; // save mail. - for (i = 0; i < 16; i++) + for (i = 0; i < MAIL_COUNT; i++) gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i]; encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey; diff --git a/src/mail.c b/src/mail.c index ac263ac67..625b52de3 100644 --- a/src/mail.c +++ b/src/mail.c @@ -101,7 +101,7 @@ struct MailRead /*0x021c*/ u8 monIconSprite; /*0x021d*/ u8 language; /*0x021e*/ bool8 playerIsSender; - /*0x0220*/ void (*parserSingle)(u8 *dest, u16 word); + /*0x0220*/ u8 * (*parserSingle)(u8 *dest, u16 word); /*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2); /*0x0228*/ const struct MailLayout *layout; /*0x022c*/ u8 bg1TilemapBuffer[0x1000]; @@ -403,11 +403,11 @@ static bool8 MailReadBuildGraphics(void) switch (sMailRead->animsActive) { case 1: - sub_80D2F68(icon); + LoadMonIconPalette(icon); sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); break; case 2: - sub_80D2F68(icon); + LoadMonIconPalette(icon); sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); break; } @@ -417,7 +417,7 @@ static bool8 MailReadBuildGraphics(void) ShowBg(0); ShowBg(1); ShowBg(2); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); gPaletteFade.bufferTransferDisabled = FALSE; sMailRead->callback2 = CB2_WaitForPaletteExitOnKeyPress; return TRUE; @@ -526,7 +526,7 @@ static void CB2_ExitOnKeyPress(void) { if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); sMailRead->callback2 = CB2_ExitMailReadFreeVars; } } @@ -540,7 +540,7 @@ static void CB2_ExitMailReadFreeVars(void) { case 1: case 2: - sub_80D2FF0(sub_80D2E84(sMailRead->mail->species)); + FreeMonIconPalette(sub_80D2E84(sMailRead->mail->species)); sub_80D2EF8(&gSprites[sMailRead->monIconSprite]); } memset(sMailRead, 0, sizeof(*sMailRead)); diff --git a/src/main_menu.c b/src/main_menu.c index 3d6c1df76..3afe1abe5 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -16,7 +16,7 @@ #include "link.h" #include "main.h" #include "menu.h" -#include "menu_indicators.h" +#include "list_menu.h" #include "mystery_event_menu.h" #include "naming_screen.h" #include "option_menu.h" @@ -44,10 +44,10 @@ // Static RAM declarations -EWRAM_DATA u8 gUnknown_02022D04 = 0; -EWRAM_DATA u16 gUnknown_02022D06 = 0; +static EWRAM_DATA u8 gUnknown_02022D04 = 0; +static EWRAM_DATA u16 sCurrItemAndOptionMenuCheck = 0; -IWRAM_DATA u8 gUnknown_03000DD0; +static IWRAM_DATA u8 gUnknown_03000DD0; // Static ROM declarations @@ -56,7 +56,7 @@ void Task_MainMenuCheckSaveFile(u8); void Task_MainMenuCheckBattery(u8); void Task_WaitForSaveFileErrorWindow(u8); void CreateMainMenuErrorWindow(const u8*); -void sub_8032250(const struct WindowTemplate*); +static void ClearMainMenuWindowTilemap(const struct WindowTemplate*); void Task_DisplayMainMenu(u8); void Task_WaitForBatteryDryErrorWindow(u8); void fmt_savegame(void); @@ -133,12 +133,12 @@ const u8 gUnknown_082FEEF0[] = INCBIN_U8("graphics/birch_speech/map.bin.lz"); const u16 gUnknown_082FF018[] = INCBIN_U16("graphics/birch_speech/bg2.gbapal"); const u16 gUnknown_082FF028[] = {0, 0, 0, 0, 0, 0, 0, 0}; -const struct WindowTemplate gUnknown_082FF038[] = { +const struct WindowTemplate sWindowTemplates_NoSavedGame[] = { {0, 2, 1, 26, 2, 15, 1}, {0, 2, 5, 26, 2, 15, 0x35} }; -const struct WindowTemplate gUnknown_082FF048[] = { +const struct WindowTemplate sWindowTemplates_HasSavedGame[] = { {0, 2, 1, 26, 6, 15, 1}, {0, 2, 9, 26, 2, 15, 0x9D}, {0, 2, 13, 26, 2, 15, 0xD1}, @@ -146,7 +146,7 @@ const struct WindowTemplate gUnknown_082FF048[] = { {0, 2, 21, 26, 2, 15, 0x139} }; -const struct WindowTemplate gUnknown_082FF070[] = { +const struct WindowTemplate sWindowTemplate_ErrorWindow[] = { {0, 2, 15, 26, 4, 15, 0x16D}, {0xFF, 0, 0, 0, 0, 0, 0} }; @@ -161,7 +161,7 @@ const struct WindowTemplate gUnknown_082FF080[] = { const u16 gMainMenuBgPal[] = INCBIN_U16("graphics/misc/main_menu_bg.gbapal"); const u16 gMainMenuTextPal[] = INCBIN_U16("graphics/misc/main_menu_text.gbapal"); -const u8 gUnknown_082FF0E0[] = {10, 11, 12}; +const u8 gTextColor_Headers[] = {10, 11, 12}; const u8 gUnknown_082FF0E3[] = {10, 1, 12}; const struct BgTemplate gUnknown_082FF0E8[] = { @@ -195,7 +195,7 @@ const struct BgTemplate gUnknown_082FF0F0 = { .baseTile = 0 }; -const struct ArrowStruct gUnknown_082FF0F4 = {2, 0x78, 8, 3, 0x78, 0x98, 3, 4, 1, 1, 0}; +const struct ScrollArrowsTemplate sScrollArrowsTemplate_MainMenu = {2, 0x78, 8, 3, 0x78, 0x98, 3, 4, 1, 1, 0}; const union AffineAnimCmd gUnknown_082FF104[] = { AFFINEANIMCMD_FRAME(-2, -2, 0, 0x30), @@ -265,6 +265,16 @@ enum HAS_MYSTERY_EVENTS, }; +enum { + ACTION_NEW_GAME, + ACTION_CONTINUE, + ACTION_OPTIONS, + ACTION_MYSTERY_GIFT, + ACTION_MYSTERY_EVENTS, + ACTION_UNKNOWN, // TODO: change when rom_8011DC0 decompiled + ACTION_INVALID +}; + #define MAIN_MENU_BORDER_TILE 0x1D5 void CB2_MainMenu(void) @@ -319,16 +329,16 @@ u32 InitMainMenu(bool8 returningFromOptionsMenu) ResetSpriteData(); FreeAllSpritePalettes(); if (returningFromOptionsMenu) - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0x0000); // fade to black + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0x0000); // fade to black else - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0xFFFF); // fade to white + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0xFFFF); // fade to white ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, gUnknown_082FF0E8, 2); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); ChangeBgY(1, 0, 0); - InitWindows(gUnknown_082FF038); + InitWindows(sWindowTemplates_NoSavedGame); DeactivateAllTextPrinters(); LoadMainMenuWindowFrameTiles(0, MAIN_MENU_BORDER_TILE); @@ -351,6 +361,15 @@ u32 InitMainMenu(bool8 returningFromOptionsMenu) return 0; } +#define tMenuType data[0] +#define tCurrItem data[1] +#define tItemCount data[12] +#define tScrollArrowTaskId data[13] +#define tIsScrolled data[14] +#define tWirelessAdapterConnected data[15] + +#define tArrowTaskIsScrolled data[15] // For scroll indicator arrow task + void Task_MainMenuCheckSaveFile(u8 taskId) { s16* data = gTasks[taskId].data; @@ -359,64 +378,64 @@ void Task_MainMenuCheckSaveFile(u8 taskId) { SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WININ, 17); - SetGpuReg(REG_OFFSET_WINOUT, 0x31); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_DARKEN | BLDCNT_TGT1_BG0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 7); - if (sub_80093CC()) - data[15] = 1; + if (IsWirelessAdapterConnected()) + tWirelessAdapterConnected = TRUE; switch (gSaveFileStatus) { case 1: - data[0] = HAS_SAVED_GAME; + tMenuType = HAS_SAVED_GAME; if (IsMysteryGiftEnabled()) - data[0]++; + tMenuType++; gTasks[taskId].func = Task_MainMenuCheckBattery; break; case 2: CreateMainMenuErrorWindow(gText_SaveFileErased); - data[0] = 0; + tMenuType = HAS_NO_SAVED_GAME; gTasks[taskId].func = Task_WaitForSaveFileErrorWindow; break; case 0xFF: CreateMainMenuErrorWindow(gText_SaveFileCorrupted); gTasks[taskId].func = Task_WaitForSaveFileErrorWindow; - data[0] = HAS_SAVED_GAME; + tMenuType = HAS_SAVED_GAME; if (IsMysteryGiftEnabled() == TRUE) - data[0]++; + tMenuType++; break; case 0: default: - data[0] = HAS_NO_SAVED_GAME; + tMenuType = HAS_NO_SAVED_GAME; gTasks[taskId].func = Task_MainMenuCheckBattery; break; case 4: CreateMainMenuErrorWindow(gJPText_No1MSubCircuit); - gTasks[taskId].data[0] = HAS_NO_SAVED_GAME; + gTasks[taskId].tMenuType = HAS_NO_SAVED_GAME; gTasks[taskId].func = Task_WaitForSaveFileErrorWindow; break; } - if (gUnknown_02022D06 & 0x8000) + if (sCurrItemAndOptionMenuCheck & 0x8000) // are we returning from the options menu? { - switch (data[0]) + switch (tMenuType) // if so, highlight the OPTIONS item { case HAS_NO_SAVED_GAME: case HAS_SAVED_GAME: - gUnknown_02022D06 = data[0] + 1; + sCurrItemAndOptionMenuCheck = tMenuType + 1; break; case HAS_MYSTERY_GIFT: - gUnknown_02022D06 = 3; + sCurrItemAndOptionMenuCheck = 3; break; - case 3: - gUnknown_02022D06 = 4; + case HAS_MYSTERY_EVENTS: + sCurrItemAndOptionMenuCheck = 4; break; } } - gUnknown_02022D06 &= 0x7FFF; - data[1] = gUnknown_02022D06; - data[12] = data[0] + 2; + sCurrItemAndOptionMenuCheck &= 0x7FFF; // turn off the "returning from options menu" flag + tCurrItem = sCurrItemAndOptionMenuCheck; + tItemCount = tMenuType + 2; } } @@ -426,7 +445,7 @@ void Task_WaitForSaveFileErrorWindow(u8 taskId) if (!IsTextPrinterActive(7) && (gMain.newKeys & A_BUTTON)) { ClearWindowTilemap(7); - sub_8032250(gUnknown_082FF070); + ClearMainMenuWindowTilemap(sWindowTemplate_ErrorWindow); gTasks[taskId].func = Task_MainMenuCheckBattery; } } @@ -437,8 +456,8 @@ void Task_MainMenuCheckBattery(u8 taskId) { SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WININ, 17); - SetGpuReg(REG_OFFSET_WINOUT, 0x31); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_DARKEN | BLDCNT_TGT1_BG0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 7); @@ -461,7 +480,7 @@ void Task_WaitForBatteryDryErrorWindow(u8 taskId) if (!IsTextPrinterActive(7) && (gMain.newKeys & A_BUTTON)) { ClearWindowTilemap(7); - sub_8032250(gUnknown_082FF070); + ClearMainMenuWindowTilemap(sWindowTemplate_ErrorWindow); gTasks[taskId].func = Task_DisplayMainMenu; } } @@ -475,8 +494,8 @@ void Task_DisplayMainMenu(u8 taskId) { SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); - SetGpuReg(REG_OFFSET_WININ, 17); - SetGpuReg(REG_OFFSET_WINOUT, 0x31); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_DARKEN | BLDCNT_TGT1_BG0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); SetGpuReg(REG_OFFSET_BLDY, 7); @@ -504,28 +523,28 @@ void Task_DisplayMainMenu(u8 taskId) LoadPalette(&palette, 241, 2); } - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tMenuType) { case HAS_NO_SAVED_GAME: default: FillWindowPixelBuffer(0, 0xAA); FillWindowPixelBuffer(1, 0xAA); - box_print(0, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuNewGame); - box_print(1, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuOption); + box_print(0, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame); + box_print(1, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption); PutWindowTilemap(0); PutWindowTilemap(1); CopyWindowToVram(0, 2); CopyWindowToVram(1, 2); - DrawMainMenuWindowBorder(gUnknown_082FF038, MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF038[1], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_NoSavedGame[0], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_NoSavedGame[1], MAIN_MENU_BORDER_TILE); break; case HAS_SAVED_GAME: FillWindowPixelBuffer(2, 0xAA); FillWindowPixelBuffer(3, 0xAA); FillWindowPixelBuffer(4, 0xAA); - box_print(2, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuContinue); - box_print(3, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuNewGame); - box_print(4, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuOption); + box_print(2, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuContinue); + box_print(3, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame); + box_print(4, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption); fmt_savegame(); PutWindowTilemap(2); PutWindowTilemap(3); @@ -533,19 +552,19 @@ void Task_DisplayMainMenu(u8 taskId) CopyWindowToVram(2, 2); CopyWindowToVram(3, 2); CopyWindowToVram(4, 2); - DrawMainMenuWindowBorder(gUnknown_082FF048, MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[1], MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[2], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[0], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[1], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[2], MAIN_MENU_BORDER_TILE); break; case HAS_MYSTERY_GIFT: FillWindowPixelBuffer(2, 0xAA); FillWindowPixelBuffer(3, 0xAA); FillWindowPixelBuffer(4, 0xAA); FillWindowPixelBuffer(5, 0xAA); - box_print(2, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuContinue); - box_print(3, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuNewGame); - box_print(4, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuMysteryGift); - box_print(5, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuOption); + box_print(2, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuContinue); + box_print(3, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame); + box_print(4, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuMysteryGift); + box_print(5, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption); fmt_savegame(); PutWindowTilemap(2); PutWindowTilemap(3); @@ -555,10 +574,10 @@ void Task_DisplayMainMenu(u8 taskId) CopyWindowToVram(3, 2); CopyWindowToVram(4, 2); CopyWindowToVram(5, 2); - DrawMainMenuWindowBorder(gUnknown_082FF048, MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[1], MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[2], MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[3], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(sWindowTemplates_HasSavedGame, MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[1], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[2], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[3], MAIN_MENU_BORDER_TILE); break; case HAS_MYSTERY_EVENTS: FillWindowPixelBuffer(2, 0xAA); @@ -566,11 +585,11 @@ void Task_DisplayMainMenu(u8 taskId) FillWindowPixelBuffer(4, 0xAA); FillWindowPixelBuffer(5, 0xAA); FillWindowPixelBuffer(6, 0xAA); - box_print(2, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuContinue); - box_print(3, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuNewGame); - box_print(4, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuMysteryGift2); - box_print(5, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuMysteryEvents); - box_print(6, 1, 0, 1, gUnknown_082FF0E0, -1, gText_MainMenuOption); + box_print(2, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuContinue); + box_print(3, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuNewGame); + box_print(4, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuMysteryGift2); + box_print(5, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuMysteryEvents); + box_print(6, 1, 0, 1, gTextColor_Headers, -1, gText_MainMenuOption); fmt_savegame(); PutWindowTilemap(2); PutWindowTilemap(3); @@ -582,19 +601,19 @@ void Task_DisplayMainMenu(u8 taskId) CopyWindowToVram(4, 2); CopyWindowToVram(5, 2); CopyWindowToVram(6, 2); - DrawMainMenuWindowBorder(gUnknown_082FF048, MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[1], MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[2], MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[3], MAIN_MENU_BORDER_TILE); - DrawMainMenuWindowBorder(&gUnknown_082FF048[4], MAIN_MENU_BORDER_TILE); - data[13] = AddScrollIndicatorArrowPair(&gUnknown_082FF0F4, &gUnknown_02022D06); - gTasks[data[13]].func = Task_ScrollIndicatorArrowPairOnMainMenu; - if (gUnknown_02022D06 == 4) + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[0], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[1], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[2], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[3], MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(&sWindowTemplates_HasSavedGame[4], MAIN_MENU_BORDER_TILE); + tScrollArrowTaskId = AddScrollIndicatorArrowPair(&sScrollArrowsTemplate_MainMenu, &sCurrItemAndOptionMenuCheck); + gTasks[tScrollArrowTaskId].func = Task_ScrollIndicatorArrowPairOnMainMenu; + if (sCurrItemAndOptionMenuCheck == 4) { ChangeBgY(0, 0x2000, 1); ChangeBgY(1, 0x2000, 1); - data[14] = 1; - gTasks[data[13]].data[15] = 1; + tIsScrolled = TRUE; + gTasks[tScrollArrowTaskId].tArrowTaskIsScrolled = TRUE; } break; } @@ -604,7 +623,7 @@ void Task_DisplayMainMenu(u8 taskId) void Task_HighlightSelectedMainMenuItem(u8 taskId) { - HighlightSelectedMainMenuItem(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[14]); + HighlightSelectedMainMenuItem(gTasks[taskId].tMenuType, gTasks[taskId].tCurrItem, gTasks[taskId].tIsScrolled); gTasks[taskId].func = Task_HandleMainMenuInput; } @@ -615,40 +634,40 @@ bool8 HandleMainMenuInput(u8 taskId) if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - sub_80093CC(); - BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + IsWirelessAdapterConnected(); // why bother calling this here? debug? Task_HandleMainMenuAPressed will check too + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); gTasks[taskId].func = Task_HandleMainMenuAPressed; } else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_WHITEALPHA); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_WHITEALPHA); SetGpuReg(REG_OFFSET_WIN0H, 0xF0); SetGpuReg(REG_OFFSET_WIN0V, 0xA0); gTasks[taskId].func = Task_HandleMainMenuBPressed; } - else if ((gMain.newKeys & DPAD_UP) && data[1] > 0) + else if ((gMain.newKeys & DPAD_UP) && tCurrItem > 0) { - if (data[0] == 3 && data[14] == 1 && data[1] == 1) + if (tMenuType == HAS_MYSTERY_EVENTS && tIsScrolled == TRUE && tCurrItem == 1) { ChangeBgY(0, 0x2000, 2); ChangeBgY(1, 0x2000, 2); - gTasks[data[13]].data[15] = data[14] = 0; + gTasks[tScrollArrowTaskId].tArrowTaskIsScrolled = tIsScrolled = FALSE; } - data[1]--; - gUnknown_02022D06 = data[1]; + tCurrItem--; + sCurrItemAndOptionMenuCheck = tCurrItem; return TRUE; } - else if ((gMain.newKeys & DPAD_DOWN) && data[1] < data[12] - 1) + else if ((gMain.newKeys & DPAD_DOWN) && tCurrItem < tItemCount - 1) { - if (data[0] == 3 && data[1] == 3 && data[14] == 0) + if (tMenuType == HAS_MYSTERY_EVENTS && tCurrItem == 3 && tIsScrolled == FALSE) { ChangeBgY(0, 0x2000, 1); ChangeBgY(1, 0x2000, 1); - gTasks[data[13]].data[15] = data[14] = 1; + gTasks[tScrollArrowTaskId].tArrowTaskIsScrolled = tIsScrolled = TRUE; } - data[1]++; - gUnknown_02022D06 = data[1]; + tCurrItem++; + sCurrItemAndOptionMenuCheck = tCurrItem; return TRUE; } return FALSE; @@ -662,13 +681,13 @@ void Task_HandleMainMenuInput(u8 taskId) void Task_HandleMainMenuAPressed(u8 taskId) { - bool8 r2; + bool8 wirelessAdapterConnected; u8 action; if (!gPaletteFade.active) { - if (gTasks[taskId].data[0] == 3) - RemoveScrollIndicatorArrowPair(gTasks[taskId].data[13]); + if (gTasks[taskId].tMenuType == HAS_MYSTERY_EVENTS) + RemoveScrollIndicatorArrowPair(gTasks[taskId].tScrollArrowTaskId); sub_819746C(0, 1); sub_819746C(1, 1); sub_819746C(2, 1); @@ -677,103 +696,103 @@ void Task_HandleMainMenuAPressed(u8 taskId) sub_819746C(5, 1); sub_819746C(6, 1); sub_819746C(7, 1); - r2 = sub_80093CC(); - switch (gTasks[taskId].data[0]) + wirelessAdapterConnected = IsWirelessAdapterConnected(); + switch (gTasks[taskId].tMenuType) { case HAS_NO_SAVED_GAME: default: - switch (gTasks[taskId].data[1]) + switch (gTasks[taskId].tCurrItem) { case 0: default: - action = 0; + action = ACTION_NEW_GAME; break; case 1: - action = 2; + action = ACTION_OPTIONS; break; } break; case HAS_SAVED_GAME: - switch (gTasks[taskId].data[1]) + switch (gTasks[taskId].tCurrItem) { case 0: default: - action = 1; + action = ACTION_CONTINUE; break; case 1: - action = 0; + action = ACTION_NEW_GAME; break; case 2: - action = 2; + action = ACTION_OPTIONS; break; } break; case HAS_MYSTERY_GIFT: - switch (gTasks[taskId].data[1]) + switch (gTasks[taskId].tCurrItem) { case 0: default: - action = 1; + action = ACTION_CONTINUE; break; case 1: - action = 0; + action = ACTION_NEW_GAME; break; case 2: - action = 3; - if (r2 == FALSE) + action = ACTION_MYSTERY_GIFT; + if (!wirelessAdapterConnected) { - action = 6; - gTasks[taskId].data[0] = 0; + action = ACTION_INVALID; + gTasks[taskId].tMenuType = 0; } break; case 3: - action = 2; + action = ACTION_OPTIONS; break; } break; case HAS_MYSTERY_EVENTS: - switch (gTasks[taskId].data[1]) + switch (gTasks[taskId].tCurrItem) { case 0: default: - action = 1; + action = ACTION_CONTINUE; break; case 1: - action = 0; + action = ACTION_NEW_GAME; break; case 2: - if (gTasks[taskId].data[15]) + if (gTasks[taskId].tWirelessAdapterConnected) { - action = 3; - if (r2 == FALSE) + action = ACTION_MYSTERY_GIFT; + if (!wirelessAdapterConnected) { - action = 6; - gTasks[taskId].data[0] = 0; + action = ACTION_INVALID; + gTasks[taskId].tMenuType = 0; } } - else if (r2) + else if (wirelessAdapterConnected) { - action = 6; - gTasks[taskId].data[0] = 1; + action = ACTION_INVALID; + gTasks[taskId].tMenuType = 1; } else { - action = 5; + action = ACTION_UNKNOWN; } break; case 3: - if (r2) + if (wirelessAdapterConnected) { - action = 6; - gTasks[taskId].data[0] = 2; + action = ACTION_INVALID; + gTasks[taskId].tMenuType = 2; } else { - action = 4; + action = ACTION_MYSTERY_EVENTS; } break; case 4: - action = 2; + action = ACTION_OPTIONS; break; } break; @@ -782,37 +801,37 @@ void Task_HandleMainMenuAPressed(u8 taskId) ChangeBgY(1, 0, 0); switch (action) { - case 0: + case ACTION_NEW_GAME: default: gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK; gTasks[taskId].func = task_new_game_prof_birch_speech_1; break; - case 1: + case ACTION_CONTINUE: gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK; SetMainCallback2(CB2_ContinueSavedGame); DestroyTask(taskId); break; - case 2: + case ACTION_OPTIONS: gMain.savedCallback = CB2_ReinitMainMenu; SetMainCallback2(CB2_InitOptionMenu); DestroyTask(taskId); break; - case 3: + case ACTION_MYSTERY_GIFT: SetMainCallback2(c2_mystery_gift); DestroyTask(taskId); break; - case 4: + case ACTION_MYSTERY_EVENTS: SetMainCallback2(CB2_InitMysteryEventMenu); DestroyTask(taskId); break; - case 5: + case ACTION_UNKNOWN: SetMainCallback2(sub_801867C); DestroyTask(taskId); break; - case 6: - gTasks[taskId].data[1] = 0; + case ACTION_INVALID: + gTasks[taskId].tCurrItem = 0; gTasks[taskId].func = Task_DisplayMainMenuInvalidActionError; gPlttBufferUnfaded[0xF1] = RGB_WHITE; gPlttBufferFaded[0xF1] = RGB_WHITE; @@ -822,14 +841,14 @@ void Task_HandleMainMenuAPressed(u8 taskId) SetGpuReg(REG_OFFSET_BG1VOFS, 0); SetGpuReg(REG_OFFSET_BG0HOFS, 0); SetGpuReg(REG_OFFSET_BG0VOFS, 0); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); return; } FreeAllWindowBuffers(); - if (action != 2) - gUnknown_02022D06 = 0; + if (action != ACTION_OPTIONS) + sCurrItemAndOptionMenuCheck = 0; else - gUnknown_02022D06 |= 0x8000; + sCurrItemAndOptionMenuCheck |= 0x8000; // entering the options menu } } @@ -837,9 +856,9 @@ void Task_HandleMainMenuBPressed(u8 taskId) { if (!gPaletteFade.active) { - if (gTasks[taskId].data[0] == 3) - RemoveScrollIndicatorArrowPair(gTasks[taskId].data[13]); - gUnknown_02022D06 = 0; + if (gTasks[taskId].tMenuType == 3) + RemoveScrollIndicatorArrowPair(gTasks[taskId].tScrollArrowTaskId); + sCurrItemAndOptionMenuCheck = 0; FreeAllWindowBuffers(); SetMainCallback2(CB2_InitTitleScreen); DestroyTask(taskId); @@ -848,11 +867,11 @@ void Task_HandleMainMenuBPressed(u8 taskId) void Task_DisplayMainMenuInvalidActionError(u8 taskId) { - switch (gTasks[taskId].data[1]) + switch (gTasks[taskId].tCurrItem) { case 0: FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); - switch (gTasks[taskId].data[0]) + switch (gTasks[taskId].tMenuType) { case 0: CreateMainMenuErrorWindow(gText_WirelessNotConnected); @@ -864,30 +883,39 @@ void Task_DisplayMainMenuInvalidActionError(u8 taskId) CreateMainMenuErrorWindow(gText_MysteryEventsCantUse); break; } - gTasks[taskId].data[1]++; + gTasks[taskId].tCurrItem++; break; case 1: if (!gPaletteFade.active) - gTasks[taskId].data[1]++; + gTasks[taskId].tCurrItem++; break; case 2: RunTextPrinters(); if (!IsTextPrinterActive(7)) - gTasks[taskId].data[1]++; + gTasks[taskId].tCurrItem++; break; case 3: if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { PlaySE(SE_SELECT); - BeginNormalPaletteFade(-1, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = Task_HandleMainMenuBPressed; } } } -void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 a) +#undef tMenuType +#undef tCurrItem +#undef tItemCount +#undef tScrollArrowTaskId +#undef tIsScrolled +#undef tWirelessAdapterConnected + +#undef tArrowTaskIsScrolled + +void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 isScrolled) { - SetGpuReg(REG_OFFSET_WIN0H, 0x9E7); + SetGpuReg(REG_OFFSET_WIN0H, WINHV_COORDS(9, 231)); switch (menuType) { @@ -897,10 +925,10 @@ void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 a) { case 0: default: - SetGpuReg(REG_OFFSET_WIN0V, 0x11F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 31)); break; case 1: - SetGpuReg(REG_OFFSET_WIN0V, 0x213F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(33, 63)); break; } break; @@ -909,13 +937,13 @@ void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 a) { case 0: default: - SetGpuReg(REG_OFFSET_WIN0V, 0x13F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 63)); break; case 1: - SetGpuReg(REG_OFFSET_WIN0V, 0x415F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95)); break; case 2: - SetGpuReg(REG_OFFSET_WIN0V, 0x617F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127)); break; } break; @@ -924,16 +952,16 @@ void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 a) { case 0: default: - SetGpuReg(REG_OFFSET_WIN0V, 0x13F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 63)); break; case 1: - SetGpuReg(REG_OFFSET_WIN0V, 0x415F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95)); break; case 2: - SetGpuReg(REG_OFFSET_WIN0V, 0x617F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127)); break; case 3: - SetGpuReg(REG_OFFSET_WIN0V, 0x819F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(129, 159)); break; } break; @@ -942,28 +970,28 @@ void HighlightSelectedMainMenuItem(u8 menuType, u8 selectedMenuItem, s16 a) { case 0: default: - SetGpuReg(REG_OFFSET_WIN0V, 0x13F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(1, 63)); break; case 1: - if (a) - SetGpuReg(REG_OFFSET_WIN0V, 0x213F); + if (isScrolled) + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(33, 63)); else - SetGpuReg(REG_OFFSET_WIN0V, 0x415F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95)); break; case 2: - if (a) - SetGpuReg(REG_OFFSET_WIN0V, 0x415F); + if (isScrolled) + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(65, 95)); else - SetGpuReg(REG_OFFSET_WIN0V, 0x617F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127)); break; case 3: - if (a) - SetGpuReg(REG_OFFSET_WIN0V, 0x617F); + if (isScrolled) + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(97, 127)); else - SetGpuReg(REG_OFFSET_WIN0V, 0x819F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(129, 159)); break; case 4: - SetGpuReg(REG_OFFSET_WIN0V, 0x819F); + SetGpuReg(REG_OFFSET_WIN0V, WINHV_COORDS(129, 159)); break; } break; @@ -992,7 +1020,7 @@ void task_new_game_prof_birch_speech_1(u8 taskId) FreeAllSpritePalettes(); dp13_810BB8C(); AddBirchSpeechObjects(taskId); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); gTasks[taskId].data[4] = 0; gTasks[taskId].func = task_new_game_prof_birch_speech_2; gTasks[taskId].data[2] = 0xFF; @@ -1038,7 +1066,7 @@ void task_new_game_prof_birch_speech_3(u8 taskId) { InitWindows(gUnknown_082FF080); LoadMainMenuWindowFrameTiles(0, 0xF3); - copy_textbox_border_tile_patterns_to_vram(0, 0xFC, 0xF0); + LoadMessageBoxGfx(0, 0xFC, 0xF0); unknown_rbox_to_vram(0, 1); PutWindowTilemap(0); CopyWindowToVram(0, 2); @@ -1298,7 +1326,7 @@ void task_new_game_prof_birch_speech_16(u8 taskId) { if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) { - BeginNormalPaletteFade(-1, 0, 0, 16, RGB_BLACK); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); gTasks[taskId].func = task_new_game_prof_birch_speech_17; } } @@ -1547,7 +1575,7 @@ void new_game_prof_birch_speech_part2_start(void) gSprites[spriteId].invisible = 0; gTasks[taskId].data[2] = spriteId; SetGpuReg(REG_OFFSET_BG1HOFS, -60); - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); @@ -1565,7 +1593,7 @@ void new_game_prof_birch_speech_part2_start(void) SetMainCallback2(CB2_MainMenu); InitWindows(gUnknown_082FF080); LoadMainMenuWindowFrameTiles(0, 0xF3); - copy_textbox_border_tile_patterns_to_vram(0, 0xFC, 0xF0); + LoadMessageBoxGfx(0, 0xFC, 0xF0); PutWindowTilemap(0); CopyWindowToVram(0, 3); } @@ -1797,7 +1825,7 @@ void CreateMainMenuErrorWindow(const u8* str) PrintTextOnWindow(7, 1, str, 0, 1, 2, 0); PutWindowTilemap(7); CopyWindowToVram(7, 2); - DrawMainMenuWindowBorder(gUnknown_082FF070, MAIN_MENU_BORDER_TILE); + DrawMainMenuWindowBorder(sWindowTemplate_ErrorWindow, MAIN_MENU_BORDER_TILE); SetGpuReg(REG_OFFSET_WIN0H, 0x9E7); SetGpuReg(REG_OFFSET_WIN0V, 0x719F); } @@ -1892,7 +1920,7 @@ void DrawMainMenuWindowBorder(const struct WindowTemplate *template, u16 baseTil CopyBgTilemapBufferToVram(template->priority); } -void sub_8032250(const struct WindowTemplate *template) +static void ClearMainMenuWindowTilemap(const struct WindowTemplate *template) { FillBgTilemapBufferRect(template->priority, 0, template->tilemapLeft - 1, template->tilemapTop - 1, template->tilemapLeft + template->width + 1, template->tilemapTop + template->height + 1, 2); CopyBgTilemapBufferToVram(template->priority); @@ -1914,11 +1942,11 @@ void sub_80322E0(u8 windowId, u8 a) void sub_8032318(u8 a) { - u8 fontAttribute = GetFontAttribute(1, 6); - u8 fontAttribute2 = GetFontAttribute(1, 0); - u8 fontAttribute3 = GetFontAttribute(1, 1); - u8 windowAttribute = GetWindowAttribute(a, 3); - u8 windowAttribute2 = GetWindowAttribute(a, 4); + u8 fontAttribute = GetFontAttribute(1, FONTATTR_COLOR_BACKGROUND); + u8 fontAttribute2 = GetFontAttribute(1, FONTATTR_MAX_LETTER_WIDTH); + u8 fontAttribute3 = GetFontAttribute(1, FONTATTR_MAX_LETTER_HEIGHT); + u8 windowAttribute = GetWindowAttribute(a, WINDOW_WIDTH); + u8 windowAttribute2 = GetWindowAttribute(a, WINDOW_HEIGHT); FillWindowPixelRect(a, fontAttribute, 0, 0, fontAttribute2 * windowAttribute, fontAttribute3 * windowAttribute2); CopyWindowToVram(a, 2); @@ -1937,7 +1965,7 @@ void sub_80323CC(u8 a, u8 b, u16 c, u16 d, u8 e, u8 f) { struct WindowTemplate sp; - sp = sub_8198A50(0, a + 1, b + 1, 5, 4, f, d); + sp = CreateWindowTemplate(0, a + 1, b + 1, 5, 4, f, d); CreateYesNoMenu(&sp, c, e, 0); } diff --git a/src/map_name_popup.c b/src/map_name_popup.c new file mode 100644 index 000000000..578636d40 --- /dev/null +++ b/src/map_name_popup.c @@ -0,0 +1,474 @@ +#include "global.h" +#include "constants/region_map_sections.h" +#include "constants/weather.h" +#include "bg.h" +#include "event_data.h" +#include "gpu_regs.h" +#include "international_string_util.h" +#include "menu.h" +#include "map_name_popup.h" +#include "palette.h" +#include "region_map.h" +#include "rom_818CFC8.h" +#include "start_menu.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + + +// enums +enum MapPopUp_Themes +{ + MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_MARBLE, + MAPPOPUP_THEME_STONE, + MAPPOPUP_THEME_BRICK, + MAPPOPUP_THEME_UNDERWATER, + MAPPOPUP_THEME_STONE2, +}; + +// static functions +static void Task_MapNamePopUpWindow(u8 taskId); +static void ShowMapNamePopUpWindow(void); +static void LoadMapNamePopUpWindowBg(void); + +// EWRAM +static EWRAM_DATA u8 mapNamePopupTaskId = 0; + +// .rodata +static const u8 gMapPopUp_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"), +}; + +static const u8 gMapPopUp_Outline_Table[][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"), +}; + +static const u16 gMapPopUp_Palette_Table[][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"), +}; + +static const u16 gUnknown_0857F444[16] = INCBIN_U16("graphics/interface/map_popup/857F444.gbapal"); + +static const u8 gRegionMapSectionId_To_PopUpThemeIdMapping[] = +{ + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_BRICK, + MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK, + MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_BRICK, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, + MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_UNDERWATER, + MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, + MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, + MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_UNDERWATER, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, + MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_MARBLE, MAPPOPUP_THEME_STONE, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_MARBLE, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_WOOD, + MAPPOPUP_THEME_WOOD, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, MAPPOPUP_THEME_STONE2, + MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_STONE, MAPPOPUP_THEME_MARBLE +}; + +static const u8 gText_PyramidFloor1[] = _("PYRAMID FLOOR 1"); +static const u8 gText_PyramidFloor2[] = _("PYRAMID FLOOR 2"); +static const u8 gText_PyramidFloor3[] = _("PYRAMID FLOOR 3"); +static const u8 gText_PyramidFloor4[] = _("PYRAMID FLOOR 4"); +static const u8 gText_PyramidFloor5[] = _("PYRAMID FLOOR 5"); +static const u8 gText_PyramidFloor6[] = _("PYRAMID FLOOR 6"); +static const u8 gText_PyramidFloor7[] = _("PYRAMID FLOOR 7"); +static const u8 gText_Pyramid[] = _("PYRAMID"); + +static const u8 * const gBattlePyramid_MapHeaderStrings[] = +{ + gText_PyramidFloor1, + gText_PyramidFloor2, + gText_PyramidFloor3, + gText_PyramidFloor4, + gText_PyramidFloor5, + gText_PyramidFloor6, + gText_PyramidFloor7, + gText_Pyramid, +}; + +// text +bool8 sub_80D47D4(void) +{ + HideStartMenu(); + ShowMapNamePopup(); + return 1; +} + +void ShowMapNamePopup(void) +{ + if (FlagGet(FLAG_SPECIAL_FLAG_0x4000) != TRUE) + { + if (!FuncIsActiveTask(Task_MapNamePopUpWindow)) + { + mapNamePopupTaskId = CreateTask(Task_MapNamePopUpWindow, 90); + SetGpuReg(REG_OFFSET_BG0VOFS, 40); + gTasks[mapNamePopupTaskId].data[0] = 6; + gTasks[mapNamePopupTaskId].data[2] = 40; + } + else + { + if (gTasks[mapNamePopupTaskId].data[0] != 2) + gTasks[mapNamePopupTaskId].data[0] = 2; + gTasks[mapNamePopupTaskId].data[3] = 1; + } + } +} + +static void Task_MapNamePopUpWindow(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 6: + task->data[4]++; + if (task->data[4] > 30) + { + task->data[0] = 0; + task->data[4] = 0; + ShowMapNamePopUpWindow(); + } + break; + case 0: + task->data[2] -= 2; + if (task->data[2] <= 0 ) + { + task->data[2] = 0; + task->data[0] = 1; + gTasks[mapNamePopupTaskId].data[1] = 0; + } + break; + case 1: + task->data[1]++; + if (task->data[1] > 120 ) + { + task->data[1] = 0; + task->data[0] = 2; + } + break; + case 2: + task->data[2] += 2; + if (task->data[2] > 39) + { + task->data[2] = 40; + if (task->data[3]) + { + task->data[0] = 6; + task->data[4] = 0; + task->data[3] = 0; + } + else + { + task->data[0] = 4; + return; + } + } + break; + case 4: + sub_819746C(GetMapNamePopUpWindowId(), TRUE); + task->data[0] = 5; + break; + case 5: + HideMapNamePopUpWindow(); + return; + } + SetGpuReg(REG_OFFSET_BG0VOFS, task->data[2]); +} + +void HideMapNamePopUpWindow(void) +{ + if (FuncIsActiveTask(Task_MapNamePopUpWindow)) + { + sub_819746C(GetMapNamePopUpWindowId(), TRUE); + RemoveMapNamePopUpWindow(); + SetGpuReg_ForcedBlank(REG_OFFSET_BG0VOFS, 0); + DestroyTask(mapNamePopupTaskId); + } +} + +static void ShowMapNamePopUpWindow(void) +{ + u8 mapDisplayHeader[24]; + u8 *withoutPrefixPtr; + u8 x; + const u8* mapDisplayHeaderSource; + + if(InBattlePyramid()) + { + if(gMapHeader.mapLayoutId == 0x17A) + { + withoutPrefixPtr = &(mapDisplayHeader[3]); + mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[7]; + } + else + { + withoutPrefixPtr = &(mapDisplayHeader[3]); + mapDisplayHeaderSource = gBattlePyramid_MapHeaderStrings[gSaveBlock2Ptr->frontier.field_CB2]; + } + StringCopy(withoutPrefixPtr, mapDisplayHeaderSource); + } + else + { + withoutPrefixPtr = &(mapDisplayHeader[3]); + GetMapName(withoutPrefixPtr, gMapHeader.regionMapSectionId, 0); + } + AddMapNamePopUpWindow(); + LoadMapNamePopUpWindowBg(); + x = GetStringCenterAlignXOffset(7, withoutPrefixPtr, 80); + mapDisplayHeader[0] = EXT_CTRL_CODE_BEGIN; + mapDisplayHeader[1] = EXT_CTRL_CODE_HIGHLIGHT; + mapDisplayHeader[2] = TEXT_COLOR_TRANSPARENT; + PrintTextOnWindow(GetMapNamePopUpWindowId(), 7, mapDisplayHeader, x, 3, 0xFF, NULL); + CopyWindowToVram(GetMapNamePopUpWindowId(), 3); +} + +#ifdef NONMATCHING +static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused) +{ + s32 i; + + for(i=0; i<=11; i++) + { + FillBgTilemapBufferRect(bg, 0x21D + i, x + i - 1, y - 1, 1, 1, 0xE); + } + FillBgTilemapBufferRect(bg, 0x229 + i, x - 1, y, 1, 1, 0xE); + FillBgTilemapBufferRect(bg, 0x22A + i, deltaX + x, y, 1, 1, 0xE); + FillBgTilemapBufferRect(bg, 0x22B + i, x - 1, y + 1 , 1, 1, 0xE); + FillBgTilemapBufferRect(bg, 0x22C + i, deltaX + x, y + 1, 1, 1, 0xE); + FillBgTilemapBufferRect(bg, 0x22D + i, x - 1, y + 2, 1, 1, 0xE); + FillBgTilemapBufferRect(bg, 0x22E + i, deltaX + x, y + 2, 1, 1, 0xE); + for(i=0; i<=11; i++) + { + FillBgTilemapBufferRect(bg, 0x22F + i, x + i - 1, y + deltaY, 1, 1, 0xE); + } +} +#else +NAKED +static void sub_80D4A78(u8 bg, u8 x, u8 y, u8 deltaX, u8 deltaY, u8 unused) +{ + asm("\n\ + .syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x1C\n\ + ldr r4, [sp, 0x3C]\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r10, r1\n\ + lsls r2, 24\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + str r3, [sp, 0x10]\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + str r4, [sp, 0x14]\n\ + movs r5, 0\n\ + lsls r0, r1, 24\n\ + asrs r1, r0, 24\n\ + lsrs r3, r2, 24\n\ + str r3, [sp, 0xC]\n\ + movs r6, 0xFF\n\ + lsls r6, 24\n\ + adds r6, r2\n\ + mov r8, r6\n\ + str r0, [sp, 0x18]\n\ + subs r4, r1, 0x1\n\ + _080D4AB4:\n\ + ldr r0, =0x0000021d\n\ + adds r1, r5, r0\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r3, 0x1\n\ + str r3, [sp]\n\ + str r3, [sp, 0x4]\n\ + movs r6, 0xE\n\ + mov r9, r6\n\ + str r6, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + mov r6, r8\n\ + lsrs r3, r6, 24\n\ + bl FillBgTilemapBufferRect\n\ + adds r4, 0x1\n\ + adds r5, 0x1\n\ + cmp r5, 0xB\n\ + ble _080D4AB4\n\ + ldr r1, =0x00000229\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + add r0, r10\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + movs r5, 0x1\n\ + str r5, [sp]\n\ + str r5, [sp, 0x4]\n\ + mov r2, r9\n\ + str r2, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + mov r2, r8\n\ + ldr r3, [sp, 0xC]\n\ + bl FillBgTilemapBufferRect\n\ + ldr r1, =0x0000022a\n\ + ldr r6, [sp, 0x10]\n\ + add r6, r10\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + str r5, [sp]\n\ + str r5, [sp, 0x4]\n\ + mov r3, r9\n\ + str r3, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + ldr r3, [sp, 0xC]\n\ + bl FillBgTilemapBufferRect\n\ + ldr r1, =0x0000022b\n\ + ldr r4, [sp, 0xC]\n\ + adds r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + str r5, [sp]\n\ + str r5, [sp, 0x4]\n\ + mov r0, r9\n\ + str r0, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + mov r2, r8\n\ + adds r3, r4, 0\n\ + bl FillBgTilemapBufferRect\n\ + movs r1, 0x8B\n\ + lsls r1, 2\n\ + str r5, [sp]\n\ + str r5, [sp, 0x4]\n\ + mov r2, r9\n\ + str r2, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + adds r3, r4, 0\n\ + bl FillBgTilemapBufferRect\n\ + ldr r1, =0x0000022d\n\ + ldr r4, [sp, 0xC]\n\ + adds r4, 0x2\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + str r5, [sp]\n\ + str r5, [sp, 0x4]\n\ + mov r3, r9\n\ + str r3, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + mov r2, r8\n\ + adds r3, r4, 0\n\ + bl FillBgTilemapBufferRect\n\ + ldr r1, =0x0000022e\n\ + str r5, [sp]\n\ + str r5, [sp, 0x4]\n\ + mov r0, r9\n\ + str r0, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + adds r2, r6, 0\n\ + adds r3, r4, 0\n\ + bl FillBgTilemapBufferRect\n\ + movs r5, 0\n\ + ldr r1, [sp, 0xC]\n\ + ldr r2, [sp, 0x14]\n\ + adds r0, r1, r2\n\ + lsls r4, r0, 24\n\ + movs r6, 0x1\n\ + _080D4B8A:\n\ + ldr r3, =0x0000022f\n\ + adds r1, r5, r3\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + subs r0, r5, 0x1\n\ + ldr r3, [sp, 0x18]\n\ + asrs r2, r3, 24\n\ + adds r2, r0\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r6, [sp]\n\ + str r6, [sp, 0x4]\n\ + movs r0, 0xE\n\ + str r0, [sp, 0x8]\n\ + adds r0, r7, 0\n\ + lsrs r3, r4, 24\n\ + bl FillBgTilemapBufferRect\n\ + adds r5, 0x1\n\ + cmp r5, 0xB\n\ + ble _080D4B8A\n\ + add sp, 0x1C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif // NONMATCHING + +static void LoadMapNamePopUpWindowBg(void) +{ + u8 popupWindowId; + u16 regionMapSectionId; + u8 popUpThemeId; + + popupWindowId = GetMapNamePopUpWindowId(); + regionMapSectionId = gMapHeader.regionMapSectionId; + if(regionMapSectionId > MAPSEC_DYNAMIC) + { + if(regionMapSectionId > MAPSEC_SPECIAL_AREA) + regionMapSectionId -= (MAPSEC_SPECIAL_AREA - MAPSEC_DYNAMIC); + else + regionMapSectionId = 0; //discard kanto region sections + } + popUpThemeId = gRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId]; + + LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_PRIORITY), &(gMapPopUp_Outline_Table[popUpThemeId][0]), 0x400, 0x21D); + CallWindowFunction(popupWindowId, sub_80D4A78); + PutWindowTilemap(popupWindowId); + if(gMapHeader.weather == WEATHER_BUBBLES) + LoadPalette(&gUnknown_0857F444, 0xE0, 0x20); + else + LoadPalette(&(gMapPopUp_Palette_Table[popUpThemeId][0]), 0xE0, 0x20); + BlitBitmapToWindow(popupWindowId, &(gMapPopUp_Table[popUpThemeId][0]), 0, 0, 80, 24); +} diff --git a/src/match_call.c b/src/match_call.c new file mode 100644 index 000000000..99eb6d65a --- /dev/null +++ b/src/match_call.c @@ -0,0 +1,1275 @@ + +// Includes +#include "global.h" +#include "battle_setup.h" +#include "event_data.h" +#include "string_util.h" +#include "battle.h" +#include "battle_frontier_1.h" +#include "gym_leader_rematch.h" + +extern const u8 gTrainerClassNames[][13]; + +// Static type declarations + +typedef struct MatchCallTextDataStruct { + const u8 *text; + u16 flag; + u16 flag2; +} match_call_text_data_t; + +struct MatchCallStructCommon { + u8 type; + u8 v1; + u16 flag; +}; + +struct MatchCallStruct0 { + u8 type; + u8 v1; + u16 flag; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +struct MatchCallStruct1 { + u8 type; + u8 v1; + u16 flag; + u16 rematchTableIdx; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +struct MatchCallSubstruct2 { + u16 flag; + u8 v2; +}; + +struct MatchCallStruct2 { + u8 type; + u8 v1; + u16 flag; + u16 rematchTableIdx; + const u8 *desc; + const match_call_text_data_t *textData; + const struct MatchCallSubstruct2 *v10; +}; + +struct MatchCallStruct3 { + u8 type; + u8 v1; + u16 flag; + const u8 *desc; + const u8 *name; +}; + +struct MatchCallStruct4 { + u8 type; + u8 gender; + u16 flag; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +struct MatchCallStruct5 { + u8 type; + u8 v1; + u16 flag; + u16 v4; + const u8 *desc; + const u8 *name; + const match_call_text_data_t *textData; +}; + +#define MATCHCALLDEF(name, type_, ...) \ +static const struct MatchCallStruct##type_ name = { \ + .type = type_, \ + __VA_ARGS__ \ +}; + +typedef union { + const struct MatchCallStructCommon *common; + const struct MatchCallStruct0 *type0; + const struct MatchCallStruct1 *type1; + const struct MatchCallStruct2 *type2; + const struct MatchCallStruct3 *type3; + const struct MatchCallStruct4 *type4; + const struct MatchCallStruct5 *type5; +} match_call_t; + +struct UnkStruct_08625388 { + u16 idx; + u16 v2; + u16 v4; + const u8 *v8[4]; +}; + +// Static RAM declarations + +// Static ROM declarations + +static bool32 MatchCallGetFlag_Type0(match_call_t); +static bool32 MatchCallGetFlag_Type1(match_call_t); +static bool32 MatchCallGetFlag_Type2(match_call_t); +static bool32 MatchCallGetFlag_Type3(match_call_t); +static bool32 MatchCallGetFlag_Type4(match_call_t); + +static u8 sub_81D1714(match_call_t); +static u8 sub_81D1718(match_call_t); +static u8 sub_81D171C(match_call_t); +static u8 sub_81D1750(match_call_t); +static u8 sub_81D1754(match_call_t); + +static bool32 MatchCall_IsRematchable_Type0(match_call_t); +static bool32 MatchCall_IsRematchable_Type1(match_call_t); +static bool32 MatchCall_IsRematchable_Type2(match_call_t); +static bool32 MatchCall_IsRematchable_Type3(match_call_t); +static bool32 MatchCall_IsRematchable_Type4(match_call_t); + +static bool32 sub_81D1840(match_call_t); +static bool32 sub_81D1844(match_call_t); +static bool32 sub_81D1848(match_call_t); +static bool32 sub_81D184C(match_call_t); +static bool32 sub_81D1850(match_call_t); + +static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t); +static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t); + +static void MatchCall_GetMessage_Type0(match_call_t, u8 *); +static void MatchCall_GetMessage_Type1(match_call_t, u8 *); +static void MatchCall_GetMessage_Type2(match_call_t, u8 *); +static void MatchCall_GetMessage_Type3(match_call_t, u8 *); +static void MatchCall_GetMessage_Type4(match_call_t, u8 *); + +static void MatchCall_GetNameAndDesc_Type0(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type1(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type2(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type3(match_call_t, const u8 **, const u8 **); +static void MatchCall_GetNameAndDesc_Type4(match_call_t, const u8 **, const u8 **); + +static void sub_81D1920(const match_call_text_data_t *, u8 *); +static void sub_81D199C(const match_call_text_data_t *, u16, u8 *); +static void MatchCall_GetNameAndDescByRematchIdx(u32, const u8 **, const u8 **); + +extern const u8 gText_MrStone_Pokenav_2B60C0[]; +extern const u8 gText_MrStone_Pokenav_2B61E6[]; +extern const u8 gText_MrStone_Pokenav_2B6302[]; +extern const u8 gText_MrStone_Pokenav_2B63A0[]; +extern const u8 gText_MrStone_Pokenav_2B64A2[]; +extern const u8 gText_MrStone_Pokenav_2B6526[]; +extern const u8 gText_MrStone_Pokenav_2B65BB[]; +extern const u8 gText_MrStone_Pokenav_2B6664[]; +extern const u8 gText_MrStone_Pokenav_2B66B1[]; +extern const u8 gText_MrStone_Pokenav_2B6703[]; +extern const u8 gText_MrStone_Pokenav_2B67ED[]; + +extern const u8 gMrStoneMatchCallDesc[]; +extern const u8 gMrStoneMatchCallName[]; + +extern const u8 gText_Norman_Pokenav_2B5719[]; +extern const u8 gText_Norman_Pokenav_2B5795[]; +extern const u8 gText_Norman_Pokenav_2B584D[]; +extern const u8 gText_Norman_Pokenav_2B58E3[]; +extern const u8 gText_Norman_Pokenav_2B5979[]; +extern const u8 gText_Norman_Pokenav_2B5A07[]; +extern const u8 gText_Norman_Pokenav_2B5A69[]; +extern const u8 gText_Norman_Pokenav_2B5ACF[]; +extern const u8 gText_Norman_Pokenav_2B5B5E[]; + +extern const u8 gNormanMatchCallDesc[]; +extern const u8 gNormanMatchCallName[]; + +extern const u8 gProfBirchMatchCallDesc[]; +extern const u8 gProfBirchMatchCallName[]; + +extern const u8 gText_Mom_Pokenav_2B227B[]; +extern const u8 gText_Mom_Pokenav_2B2310[]; +extern const u8 gText_Mom_Pokenav_2B23F3[]; + +extern const u8 gMomMatchCallDesc[]; +extern const u8 gMomMatchCallName[]; + +extern const u8 gText_Steven_Pokenav_2B5B95[]; +extern const u8 gText_Steven_Pokenav_2B5C53[]; +extern const u8 gText_Steven_Pokenav_2B5CC9[]; +extern const u8 gText_Steven_Pokenav_2B5DB4[]; +extern const u8 gText_Steven_Pokenav_2B5E26[]; +extern const u8 gText_Steven_Pokenav_2B5EA2[]; +extern const u8 gText_Steven_Pokenav_2B5ED9[]; + +extern const u8 gStevenMatchCallDesc[]; +extern const u8 gStevenMatchCallName[]; + +extern const u8 gText_May_Pokenav_2B3AB3[]; +extern const u8 gText_May_Pokenav_2B3B3F[]; +extern const u8 gText_May_Pokenav_2B3C13[]; +extern const u8 gText_May_Pokenav_2B3CF3[]; +extern const u8 gText_May_Pokenav_2B3D4B[]; +extern const u8 gText_May_Pokenav_2B3DD1[]; +extern const u8 gText_May_Pokenav_2B3E69[]; +extern const u8 gText_May_Pokenav_2B3ECD[]; +extern const u8 gText_May_Pokenav_2B3F2B[]; +extern const u8 gText_May_Pokenav_2B3FFB[]; +extern const u8 gText_May_Pokenav_2B402B[]; +extern const u8 gText_May_Pokenav_2B414B[]; +extern const u8 gText_May_Pokenav_2B4228[]; +extern const u8 gText_May_Pokenav_2B42E0[]; +extern const u8 gText_May_Pokenav_2B4350[]; +extern const u8 gMayBrendanMatchCallDesc[]; +extern const u8 gExpandedPlaceholder_May[]; +extern const u8 gText_Brendan_Pokenav_2B43EF[]; +extern const u8 gText_Brendan_Pokenav_2B4486[]; +extern const u8 gText_Brendan_Pokenav_2B4560[]; +extern const u8 gText_Brendan_Pokenav_2B463F[]; +extern const u8 gText_Brendan_Pokenav_2B46B7[]; +extern const u8 gText_Brendan_Pokenav_2B4761[]; +extern const u8 gText_Brendan_Pokenav_2B47F4[]; +extern const u8 gText_Brendan_Pokenav_2B4882[]; +extern const u8 gText_Brendan_Pokenav_2B4909[]; +extern const u8 gText_Brendan_Pokenav_2B49C4[]; +extern const u8 gText_Brendan_Pokenav_2B4A44[]; +extern const u8 gText_Brendan_Pokenav_2B4B28[]; +extern const u8 gText_Brendan_Pokenav_2B4C15[]; +extern const u8 gText_Brendan_Pokenav_2B4CD8[]; +extern const u8 gText_Brendan_Pokenav_2B4D46[]; +extern const u8 gExpandedPlaceholder_Brendan[]; +extern const u8 gText_Wally_Pokenav_2B4DE2[]; +extern const u8 gText_Wally_Pokenav_2B4E57[]; +extern const u8 gText_Wally_Pokenav_2B4EA5[]; +extern const u8 gText_Wally_Pokenav_2B4F41[]; +extern const u8 gText_Wally_Pokenav_2B4FF3[]; +extern const u8 gText_Wally_Pokenav_2B50B1[]; +extern const u8 gText_Wally_Pokenav_2B5100[]; +extern const u8 gWallyMatchCallDesc[]; +extern const u8 gText_Scott_Pokenav_2B5184[]; +extern const u8 gText_Scott_Pokenav_2B5275[]; +extern const u8 gText_Scott_Pokenav_2B5323[]; +extern const u8 gText_Scott_Pokenav_2B53DB[]; +extern const u8 gText_Scott_Pokenav_2B54A5[]; +extern const u8 gText_Scott_Pokenav_2B5541[]; +extern const u8 gText_Scott_Pokenav_2B56CA[]; +extern const u8 gScottMatchCallDesc[]; +extern const u8 gScottMatchCallName[]; +extern const u8 gText_Roxanne_Pokenav_2B2456[]; +extern const u8 gText_Roxanne_Pokenav_2B250E[]; +extern const u8 gText_Roxanne_Pokenav_2B25C1[]; +extern const u8 gText_Roxanne_Pokenav_2B2607[]; +extern const u8 gRoxanneMatchCallDesc[]; +extern const u8 gText_Brawly_Pokenav_2B2659[]; +extern const u8 gText_Brawly_Pokenav_2B275D[]; +extern const u8 gText_Brawly_Pokenav_2B286F[]; +extern const u8 gText_Brawly_Pokenav_2B28D1[]; +extern const u8 gBrawlyMatchCallDesc[]; +extern const u8 gText_Wattson_Pokenav_2B2912[]; +extern const u8 gText_Wattson_Pokenav_2B29CA[]; +extern const u8 gText_Wattson_Pokenav_2B2AB6[]; +extern const u8 gText_Wattson_Pokenav_2B2B01[]; +extern const u8 gWattsonMatchCallDesc[]; +extern const u8 gText_Flannery_Pokenav_2B2B4D[]; +extern const u8 gText_Flannery_Pokenav_2B2C0E[]; +extern const u8 gText_Flannery_Pokenav_2B2CF1[]; +extern const u8 gText_Flannery_Pokenav_2B2D54[]; +extern const u8 gFlanneryMatchCallDesc[]; +extern const u8 gText_Winona_Pokenav_2B2DA4[]; +extern const u8 gText_Winona_Pokenav_2B2E2B[]; +extern const u8 gText_Winona_Pokenav_2B2EC2[]; +extern const u8 gText_Winona_Pokenav_2B2F16[]; +extern const u8 gWinonaMatchCallDesc[]; +extern const u8 gText_TateLiza_Pokenav_2B2F97[]; +extern const u8 gText_TateLiza_Pokenav_2B306E[]; +extern const u8 gText_TateLiza_Pokenav_2B3158[]; +extern const u8 gText_TateLiza_Pokenav_2B31CD[]; +extern const u8 gTateLizaMatchCallDesc[]; +extern const u8 gText_Juan_Pokenav_2B3249[]; +extern const u8 gText_Juan_Pokenav_2B32EC[]; +extern const u8 gText_Juan_Pokenav_2B33AA[]; +extern const u8 gText_Juan_Pokenav_2B341E[]; +extern const u8 gJuanMatchCallDesc[]; +extern const u8 gText_Sidney_Pokenav_2B34CC[]; +extern const u8 gEliteFourMatchCallDesc[]; +extern const u8 gText_Phoebe_Pokenav_2B3561[]; +extern const u8 gText_Glacia_Pokenav_2B35E4[]; +extern const u8 gText_Drake_Pokenav_2B368B[]; +extern const u8 gText_Wallace_Pokenav_2B3790[]; +extern const u8 gChampionMatchCallDesc[]; +extern const u8 gMatchCallStevenStrategyText[]; +extern const u8 gMatchCall_StevenTrainersPokemonText[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle[]; +extern const u8 gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle[]; +extern const u8 gMatchCall_BrendanStrategyText[]; +extern const u8 gMatchCall_BrendanTrainersPokemonText[]; +extern const u8 gMatchCall_BrendanSelfIntroductionText_Line1[]; +extern const u8 gMatchCall_BrendanSelfIntroductionText_Line2[]; +extern const u8 gMatchCall_MayStrategyText[]; +extern const u8 gMatchCall_MayTrainersPokemonText[]; +extern const u8 gMatchCall_MaySelfIntroductionText_Line1[]; +extern const u8 gMatchCall_MaySelfIntroductionText_Line2[]; +// .rodata + +static const match_call_text_data_t sMrStoneTextScripts[] = { + { gText_MrStone_Pokenav_2B60C0, 0xFFFF, FLAG_0x158 }, + { gText_MrStone_Pokenav_2B61E6, FLAG_0x158, 0xFFFF }, + { gText_MrStone_Pokenav_2B6302, FLAG_0x0BD, 0xFFFF }, + { gText_MrStone_Pokenav_2B63A0, FLAG_0x110, 0xFFFF }, + { gText_MrStone_Pokenav_2B64A2, FLAG_0x06A, 0xFFFF }, + { gText_MrStone_Pokenav_2B6526, FLAG_0x4F4, 0xFFFF }, + { gText_MrStone_Pokenav_2B65BB, FLAG_0x097, 0xFFFF }, + { gText_MrStone_Pokenav_2B6664, FLAG_0x06F, 0xFFFF }, + { gText_MrStone_Pokenav_2B66B1, FLAG_0x070, 0xFFFF }, + { gText_MrStone_Pokenav_2B6703, FLAG_0x4F7, 0xFFFF }, + { gText_MrStone_Pokenav_2B67ED, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sMrStoneMatchCallHeader, 0, 10, 0xffff, gMrStoneMatchCallDesc, gMrStoneMatchCallName, sMrStoneTextScripts); + +static const match_call_text_data_t sNormanTextScripts[] = { + { gText_Norman_Pokenav_2B5719, FLAG_0x132, 0xFFFF }, + { gText_Norman_Pokenav_2B5795, FLAG_0x4F1, 0xFFFF }, + { gText_Norman_Pokenav_2B584D, FLAG_0x4F3, 0xFFFF }, + { gText_Norman_Pokenav_2B58E3, FLAG_0x4F4, 0xFFFF }, + { gText_Norman_Pokenav_2B5979, FLAG_0x0D4, 0xFFFF }, + { gText_Norman_Pokenav_2B5A07, 0xFFFE, 0xFFFF }, + { gText_Norman_Pokenav_2B5A69, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { gText_Norman_Pokenav_2B5ACF, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { gText_Norman_Pokenav_2B5B5E, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sNormanMatchCallHeader, 5, 7, FLAG_0x132, 0x45, gNormanMatchCallDesc, gNormanMatchCallName, sNormanTextScripts); + +MATCHCALLDEF(sProfBirchMatchCallHeader, 3, 0, FLAG_0x119, gProfBirchMatchCallDesc, gProfBirchMatchCallName) + +static const match_call_text_data_t sMomTextScripts[] = { + { gText_Mom_Pokenav_2B227B, 0xffff, 0xffff }, + { gText_Mom_Pokenav_2B2310, FLAG_0x4F4, 0xffff }, + { gText_Mom_Pokenav_2B23F3, FLAG_SYS_GAME_CLEAR, 0xffff }, + { NULL, 0xffff, 0xffff } +}; + +MATCHCALLDEF(sMomMatchCallHeader, 0, 0, FLAG_0x0D8, gMomMatchCallDesc, gMomMatchCallName, sMomTextScripts); + +static const match_call_text_data_t sStevenTextScripts[] = { + { gText_Steven_Pokenav_2B5B95, 0xffff, 0xffff }, + { gText_Steven_Pokenav_2B5C53, FLAG_RUSTURF_TUNNEL_OPENED, 0xffff }, + { gText_Steven_Pokenav_2B5CC9, FLAG_0x0D4, 0xffff }, + { gText_Steven_Pokenav_2B5DB4, FLAG_0x070, 0xffff }, + { gText_Steven_Pokenav_2B5E26, FLAG_0x4F6, 0xffff }, + { gText_Steven_Pokenav_2B5EA2, FLAG_0x081, 0xffff }, + { gText_Steven_Pokenav_2B5ED9, FLAG_SYS_GAME_CLEAR, 0xffff }, + { NULL, 0xffff, 0xffff }, +}; + +MATCHCALLDEF(sStevenMatchCallHeader, 0, 0xd5, FLAG_0x131, gStevenMatchCallDesc, gStevenMatchCallName, sStevenTextScripts); + +static const match_call_text_data_t sMayTextScripts[] = { + { gText_May_Pokenav_2B3AB3, 0xFFFF, 0xFFFF }, + { gText_May_Pokenav_2B3B3F, FLAG_0x4F1, 0xFFFF }, + { gText_May_Pokenav_2B3C13, FLAG_0x095, 0xFFFF }, + { gText_May_Pokenav_2B3CF3, FLAG_0x324, 0xFFFF }, + { gText_May_Pokenav_2B3D4B, FLAG_0x06A, 0xFFFF }, + { gText_May_Pokenav_2B3DD1, FLAG_0x4F3, 0xFFFF }, + { gText_May_Pokenav_2B3E69, FLAG_0x4F4, 0xFFFF }, + { gText_May_Pokenav_2B3ECD, FLAG_0x097, 0xFFFF }, + { gText_May_Pokenav_2B3F2B, FLAG_0x0D4, 0xFFFF }, + { gText_May_Pokenav_2B3FFB, FLAG_0x06F, 0xFFFF }, + { gText_May_Pokenav_2B402B, FLAG_0x061, 0xFFFF }, + { gText_May_Pokenav_2B414B, FLAG_0x070, 0xFFFF }, + { gText_May_Pokenav_2B4228, FLAG_0x081, 0xFFFF }, + { gText_May_Pokenav_2B42E0, FLAG_0x4F7, 0xFFFF }, + { gText_May_Pokenav_2B4350, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sMayMatchCallHeader, 4, MALE, FLAG_0x0FD, gMayBrendanMatchCallDesc, gExpandedPlaceholder_May, sMayTextScripts); + +static const match_call_text_data_t sBrendanTextScripts[] = { + { gText_Brendan_Pokenav_2B43EF, 0xFFFF, 0xFFFF }, + { gText_Brendan_Pokenav_2B4486, FLAG_0x4F1, 0xFFFF }, + { gText_Brendan_Pokenav_2B4560, FLAG_0x095, 0xFFFF }, + { gText_Brendan_Pokenav_2B463F, FLAG_0x324, 0xFFFF }, + { gText_Brendan_Pokenav_2B46B7, FLAG_0x06A, 0xFFFF }, + { gText_Brendan_Pokenav_2B4761, FLAG_0x4F3, 0xFFFF }, + { gText_Brendan_Pokenav_2B47F4, FLAG_0x4F4, 0xFFFF }, + { gText_Brendan_Pokenav_2B4882, FLAG_0x097, 0xFFFF }, + { gText_Brendan_Pokenav_2B4909, FLAG_0x0D4, 0xFFFF }, + { gText_Brendan_Pokenav_2B49C4, FLAG_0x06F, 0xFFFF }, + { gText_Brendan_Pokenav_2B4A44, FLAG_0x061, 0xFFFF }, + { gText_Brendan_Pokenav_2B4B28, FLAG_0x070, 0xFFFF }, + { gText_Brendan_Pokenav_2B4C15, FLAG_0x081, 0xFFFF }, + { gText_Brendan_Pokenav_2B4CD8, FLAG_0x4F7, 0xFFFF }, + { gText_Brendan_Pokenav_2B4D46, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sBrendanMatchCallHeader, 4, FEMALE, FLAG_0x0FD, gMayBrendanMatchCallDesc, gExpandedPlaceholder_Brendan, sBrendanTextScripts); + +static const match_call_text_data_t sWallyTextScripts[] = { + { gText_Wally_Pokenav_2B4DE2, 0xFFFF, 0xFFFF }, + { gText_Wally_Pokenav_2B4E57, FLAG_RUSTURF_TUNNEL_OPENED, 0xFFFF }, + { gText_Wally_Pokenav_2B4EA5, FLAG_0x4F3, 0xFFFF }, + { gText_Wally_Pokenav_2B4F41, FLAG_0x097, 0xFFFF }, + { gText_Wally_Pokenav_2B4FF3, FLAG_0x06F, 0xFFFF }, + { gText_Wally_Pokenav_2B50B1, FLAG_0x081, 0xFFFF }, + { gText_Wally_Pokenav_2B5100, FLAG_0x07E, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +const struct MatchCallSubstruct2 sWallyAdditionalData[] = { + { FLAG_0x324, 0x05 }, + { FLAG_0x06F, 0xD5 }, + { FLAG_0x35A, 0x46 }, + { 0xFFFF, 0xD5 } +}; + +MATCHCALLDEF(sWallyMatchCallHeader, 2, 0, FLAG_0x0D6, REMATCH_WALLY_3, gWallyMatchCallDesc, sWallyTextScripts, sWallyAdditionalData); + +static const match_call_text_data_t sScottTextScripts[] = { + { gText_Scott_Pokenav_2B5184, 0xFFFF, 0xFFFF }, + { gText_Scott_Pokenav_2B5275, FLAG_0x08B, 0xFFFF }, + { gText_Scott_Pokenav_2B5323, FLAG_0x097, 0xFFFF }, + { gText_Scott_Pokenav_2B53DB, FLAG_0x0D4, 0xFFFF }, + { gText_Scott_Pokenav_2B54A5, FLAG_0x070, 0xFFFF }, + { gText_Scott_Pokenav_2B5541, FLAG_0x4F7, 0xFFFF }, + { gText_Scott_Pokenav_2B56CA, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + + +MATCHCALLDEF(sScottMatchCallHeader, 0, 0xD5, FLAG_0x0D7, gScottMatchCallDesc, gScottMatchCallName, sScottTextScripts); + +static const match_call_text_data_t sRoxanneTextScripts[] = { + { gText_Roxanne_Pokenav_2B2456, 0xFFFE, 0xFFFF }, + { gText_Roxanne_Pokenav_2B250E, 0xFFFF, 0xFFFF }, + { gText_Roxanne_Pokenav_2B25C1, 0xFFFF, 0xFFFF }, + { gText_Roxanne_Pokenav_2B2607, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sRoxanneMatchCallHeader, 5, 10, FLAG_0x1D3, 0x41, gRoxanneMatchCallDesc, NULL, sRoxanneTextScripts); + +static const match_call_text_data_t sBrawlyTextScripts[] = { + { gText_Brawly_Pokenav_2B2659, 0xFFFE, 0xFFFF }, + { gText_Brawly_Pokenav_2B275D, 0xFFFF, 0xFFFF }, + { gText_Brawly_Pokenav_2B286F, 0xFFFF, 0xFFFF }, + { gText_Brawly_Pokenav_2B28D1, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sBrawlyMatchCallHeader, 5, 2, FLAG_0x1D4, 0x42, gBrawlyMatchCallDesc, NULL, sBrawlyTextScripts); + +static const match_call_text_data_t sWattsonTextScripts[] = { + { gText_Wattson_Pokenav_2B2912, 0xFFFE, 0xFFFF }, + { gText_Wattson_Pokenav_2B29CA, 0xFFFF, 0xFFFF }, + { gText_Wattson_Pokenav_2B2AB6, 0xFFFF, 0xFFFF }, + { gText_Wattson_Pokenav_2B2B01, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sWattsonMatchCallHeader, 5, 9, FLAG_0x1D5, 0x43, gWattsonMatchCallDesc, NULL, sWattsonTextScripts); + +static const match_call_text_data_t sFlanneryTextScripts[] = { + { gText_Flannery_Pokenav_2B2B4D, 0xFFFE, 0xFFFF }, + { gText_Flannery_Pokenav_2B2C0E, 0xFFFF, 0xFFFF }, + { gText_Flannery_Pokenav_2B2CF1, 0xFFFF, 0xFFFF }, + { gText_Flannery_Pokenav_2B2D54, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sFlanneryMatchCallHeader, 5, 3, FLAG_0x1D6, 0x44, gFlanneryMatchCallDesc, NULL, sFlanneryTextScripts); + +static const match_call_text_data_t sWinonaTextScripts[] = { + { gText_Winona_Pokenav_2B2DA4, 0xFFFE, 0xFFFF }, + { gText_Winona_Pokenav_2B2E2B, 0xFFFF, 0xFFFF }, + { gText_Winona_Pokenav_2B2EC2, 0xFFFF, 0xFFFF }, + { gText_Winona_Pokenav_2B2F16, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sWinonaMatchCallHeader, 5, 11, FLAG_0x1D7, 0x46, gWinonaMatchCallDesc, NULL, sWinonaTextScripts); + +static const match_call_text_data_t sTateLizaTextScripts[] = { + { gText_TateLiza_Pokenav_2B2F97, 0xFFFE, 0xFFFF }, + { gText_TateLiza_Pokenav_2B306E, 0xFFFF, 0xFFFF }, + { gText_TateLiza_Pokenav_2B3158, 0xFFFF, 0xFFFF }, + { gText_TateLiza_Pokenav_2B31CD, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sTateLizaMatchCallHeader, 5, 13, FLAG_0x1D8, 0x47, gTateLizaMatchCallDesc, NULL, sTateLizaTextScripts); + +static const match_call_text_data_t sJuanTextScripts[] = { + { gText_Juan_Pokenav_2B3249, 0xFFFE, 0xFFFF }, + { gText_Juan_Pokenav_2B32EC, 0xFFFF, 0xFFFF }, + { gText_Juan_Pokenav_2B33AA, 0xFFFF, 0xFFFF }, + { gText_Juan_Pokenav_2B341E, FLAG_SYS_GAME_CLEAR, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sJuanMatchCallHeader, 5, 14, FLAG_0x1D9, 0x48, gJuanMatchCallDesc, NULL, sJuanTextScripts); + +static const match_call_text_data_t sSidneyTextScripts[] = { + { gText_Sidney_Pokenav_2B34CC, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sSidneyMatchCallHeader, 5, 15, FLAG_0x1A5, 0x49, gEliteFourMatchCallDesc, NULL, sSidneyTextScripts); + +static const match_call_text_data_t sPhoebeTextScripts[] = { + { gText_Phoebe_Pokenav_2B3561, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sPhoebeMatchCallHeader, 5, 15, FLAG_0x1A6, 0x4A, gEliteFourMatchCallDesc, NULL, sPhoebeTextScripts); + +static const match_call_text_data_t sGlaciaTextScripts[] = { + { gText_Glacia_Pokenav_2B35E4, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sGlaciaMatchCallHeader, 5, 15, FLAG_0x1A7, 0x4B, gEliteFourMatchCallDesc, NULL, sGlaciaTextScripts); + +static const match_call_text_data_t sDrakeTextScripts[] = { + { gText_Drake_Pokenav_2B368B, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sDrakeMatchCallHeader, 5, 15, FLAG_0x1A8, 0x4C, gEliteFourMatchCallDesc, NULL, sDrakeTextScripts); + +static const match_call_text_data_t sWallaceTextScripts[] = { + { gText_Wallace_Pokenav_2B3790, 0xFFFF, 0xFFFF }, + { NULL, 0xFFFF, 0xFFFF } +}; + +MATCHCALLDEF(sWallaceMatchCallHeader, 5, 15, FLAG_0x1A9, 0x4D, gChampionMatchCallDesc, NULL, sWallaceTextScripts); + +static const match_call_t sMatchCallHeaders[] = { + {.type0 = &sMrStoneMatchCallHeader}, + {.type3 = &sProfBirchMatchCallHeader}, + {.type4 = &sBrendanMatchCallHeader}, + {.type4 = &sMayMatchCallHeader}, + {.type2 = &sWallyMatchCallHeader}, + {.type5 = &sNormanMatchCallHeader}, + {.type0 = &sMomMatchCallHeader}, + {.type0 = &sStevenMatchCallHeader}, + {.type0 = &sScottMatchCallHeader}, + {.type5 = &sRoxanneMatchCallHeader}, + {.type5 = &sBrawlyMatchCallHeader}, + {.type5 = &sWattsonMatchCallHeader}, + {.type5 = &sFlanneryMatchCallHeader}, + {.type5 = &sWinonaMatchCallHeader}, + {.type5 = &sTateLizaMatchCallHeader}, + {.type5 = &sJuanMatchCallHeader}, + {.type5 = &sSidneyMatchCallHeader}, + {.type5 = &sPhoebeMatchCallHeader}, + {.type5 = &sGlaciaMatchCallHeader}, + {.type5 = &sDrakeMatchCallHeader}, + {.type5 = &sWallaceMatchCallHeader} +}; + +static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = { + MatchCallGetFlag_Type0, + MatchCallGetFlag_Type1, + MatchCallGetFlag_Type2, + MatchCallGetFlag_Type3, + MatchCallGetFlag_Type4 +}; + +static u8 (*const gUnknown_08625310[])(match_call_t) = { + sub_81D1714, + sub_81D1718, + sub_81D171C, + sub_81D1750, + sub_81D1754 +}; + +static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = { + MatchCall_IsRematchable_Type0, + MatchCall_IsRematchable_Type1, + MatchCall_IsRematchable_Type2, + MatchCall_IsRematchable_Type3, + MatchCall_IsRematchable_Type4 +}; + +static bool32 (*const gUnknown_08625338[])(match_call_t) = { + sub_81D1840, + sub_81D1844, + sub_81D1848, + sub_81D184C, + sub_81D1850 +}; + +static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = { + MatchCall_GetRematchTableIdx_Type0, + MatchCall_GetRematchTableIdx_Type1, + MatchCall_GetRematchTableIdx_Type2, + MatchCall_GetRematchTableIdx_Type3, + MatchCall_GetRematchTableIdx_Type4 +}; + +static void (*const sMatchCall_GetMessageFunctions[])(match_call_t, u8 *) = { + MatchCall_GetMessage_Type0, + MatchCall_GetMessage_Type1, + MatchCall_GetMessage_Type2, + MatchCall_GetMessage_Type3, + MatchCall_GetMessage_Type4 +}; + +static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 **, const u8 **) = { + MatchCall_GetNameAndDesc_Type0, + MatchCall_GetNameAndDesc_Type1, + MatchCall_GetNameAndDesc_Type2, + MatchCall_GetNameAndDesc_Type3, + MatchCall_GetNameAndDesc_Type4 +}; + +static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = { + { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN + { 7, 0x4B, FLAG_0x4F6, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN + { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan + { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May +}; + +// .text + +static u32 MatchCallGetFunctionIndex(match_call_t matchCall) +{ + switch (matchCall.common->type) + { + case 0: + default: + return 0; + case 1: + case 5: + return 1; + case 2: + return 2; + case 4: + return 3; + case 3: + return 4; + } +} + +u32 GetTrainerIdxByRematchIdx(u32 rematchIdx) +{ + return gRematchTable[rematchIdx].trainerIds[0]; +} + +s32 GetRematchIdxByTrainerIdx(s32 trainerIdx) +{ + s32 rematchIdx; + + for (rematchIdx = 0; rematchIdx < REMATCH_TABLE_ENTRIES; rematchIdx++) + { + if (gRematchTable[rematchIdx].trainerIds[0] == trainerIdx) + return rematchIdx; + } + return -1; +} + +bool32 MatchCallFlagGetByIndex(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return FALSE; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return sMatchCallGetFlagFuncs[i](matchCall); +} + +static bool32 MatchCallGetFlag_Type0(match_call_t matchCall) +{ + if (matchCall.type0->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type0->flag); +} + +static bool32 MatchCallGetFlag_Type1(match_call_t matchCall) +{ + if (matchCall.type1->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type1->flag); +} + +static bool32 MatchCallGetFlag_Type2(match_call_t matchCall) +{ + if (matchCall.type2->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type2->flag); +} + +static bool32 MatchCallGetFlag_Type3(match_call_t matchCall) +{ + if (matchCall.type4->gender != gSaveBlock2Ptr->playerGender) + return FALSE; + if (matchCall.type4->flag == 0xffff) + return TRUE; + return FlagGet(matchCall.type4->flag); +} + +static bool32 MatchCallGetFlag_Type4(match_call_t matchCall) +{ + return FlagGet(matchCall.type3->flag); +} + +u8 sub_81D16DC(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return 0; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return gUnknown_08625310[i](matchCall); +} + +static u8 sub_81D1714(match_call_t matchCall) +{ + return matchCall.type0->v1; +} + +static u8 sub_81D1718(match_call_t matchCall) +{ + return matchCall.type1->v1; +} + +static u8 sub_81D171C(match_call_t matchCall) +{ + s32 i; + + for (i = 0; matchCall.type2->v10[i].flag != 0xffff; i++) + { + if (!FlagGet(matchCall.type2->v10[i].flag)) + break; + } + return matchCall.type2->v10[i].v2; +} + +static u8 sub_81D1750(match_call_t matchCall) +{ + return 0xd5; +} + +static u8 sub_81D1754(match_call_t matchCall) +{ + return 0xd5; +} + +bool32 MatchCall_IsRematchable(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return 0; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return sMatchCall_IsRematchableFunctions[i](matchCall); +} + +static bool32 MatchCall_IsRematchable_Type0(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 MatchCall_IsRematchable_Type1(match_call_t matchCall) +{ + if (matchCall.type1->rematchTableIdx >= REMATCH_ELITE_FOUR_ENTRIES) + return FALSE; + return gSaveBlock1Ptr->trainerRematches[matchCall.type1->rematchTableIdx] ? TRUE : FALSE; +} + +static bool32 MatchCall_IsRematchable_Type2(match_call_t matchCall) +{ + return gSaveBlock1Ptr->trainerRematches[matchCall.type2->rematchTableIdx] ? TRUE : FALSE; +} + +static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 MatchCall_IsRematchable_Type4(match_call_t matchCall) +{ + return FALSE; +} + +bool32 sub_81D17E8(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return FALSE; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + if (gUnknown_08625338[i](matchCall)) + return TRUE; + for (i = 0; i < 4; i++) + { + if (sMatchCallCheckPageOverrides[i].idx == idx) + return TRUE; + } + return FALSE; +} + +static bool32 sub_81D1840(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 sub_81D1844(match_call_t matchCall) +{ + return TRUE; +} + +static bool32 sub_81D1848(match_call_t matchCall) +{ + return TRUE; +} + +static bool32 sub_81D184C(match_call_t matchCall) +{ + return FALSE; +} + +static bool32 sub_81D1850(match_call_t matchCall) +{ + return FALSE; +} + +u32 MatchCall_GetRematchTableIdx(u32 idx) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return REMATCH_TABLE_ENTRIES; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + return sMatchCall_GetRematchTableIdxFunctions[i](matchCall); +} + +static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t matchCall) +{ + return REMATCH_TABLE_ENTRIES; +} + +static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t matchCall) +{ + return matchCall.type1->rematchTableIdx; +} + +static u32 MatchCall_GetRematchTableIdx_Type2(match_call_t matchCall) +{ + return matchCall.type2->rematchTableIdx; +} + +static u32 MatchCall_GetRematchTableIdx_Type3(match_call_t matchCall) +{ + return REMATCH_TABLE_ENTRIES; +} + +static u32 MatchCall_GetRematchTableIdx_Type4(match_call_t matchCall) +{ + return REMATCH_TABLE_ENTRIES; +} + +void MatchCall_GetMessage(u32 idx, u8 *dest) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + sMatchCall_GetMessageFunctions[i](matchCall, dest); +} + +static void MatchCall_GetMessage_Type0(match_call_t matchCall, u8 *dest) +{ + sub_81D1920(matchCall.type0->textData, dest); +} + +static void MatchCall_GetMessage_Type1(match_call_t matchCall, u8 *dest) +{ + if (matchCall.common->type != 5) + sub_81D1920(matchCall.type5->textData, dest); + else + sub_81D199C(matchCall.type1->textData, matchCall.type1->rematchTableIdx, dest); +} + +static void MatchCall_GetMessage_Type2(match_call_t matchCall, u8 *dest) +{ + sub_81D1920(matchCall.type2->textData, dest); +} + +static void MatchCall_GetMessage_Type3(match_call_t matchCall, u8 *dest) +{ + sub_81D1920(matchCall.type4->textData, dest); +} + +static void MatchCall_GetMessage_Type4(match_call_t matchCall, u8 *dest) +{ + sub_8197080(dest); +} + +void sub_81D1920(const match_call_text_data_t *sub0, u8 *dest) +{ + u32 i; + for (i = 0; sub0[i].text != NULL; i++) + ; + if (i) + i--; + while (i) + { + if (sub0[i].flag != 0xffff && FlagGet(sub0[i].flag) == TRUE) + break; + i--; + } + if (sub0[i].flag2 != 0xffff) + FlagSet(sub0[i].flag2); + StringExpandPlaceholders(dest, sub0[i].text); +} + +#ifdef NONMATCHING +// There's some weird upmerge going on that I cannot replicate at this time. +static void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest) +{ + u32 i; + for (i = 0; sub0[i].text != NULL; i++) + { + if (sub0[i].flag == 0xfffe) + break; + if (sub0[i].flag == 0xffff && !FlagGet(sub0[i].flag)) + break; + } + if (sub0[i].flag != 0xfffe) + { + if (i) + i--; + if (sub0[i].flag2 != 0xffff) + FlagSet(sub0[i].flag2); + StringExpandPlaceholders(dest, sub0[i].text); + } + else + { + if (!FlagGet(FLAG_SYS_GAME_CLEAR)) + ; + else if (gSaveBlock1Ptr->trainerRematches[idx]) + i += 2; + else if (CountBattledRematchTeams(idx) >= 2) + i += 3; + else + i++; + StringExpandPlaceholders(dest, sub0[i].text); + } +} +#else +static NAKED void sub_81D199C(const match_call_text_data_t *sub0, u16 idx, u8 *dest) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tadds r6, r0, 0\n" + "\tmov r10, r2\n" + "\tlsls r1, 16\n" + "\tlsrs r7, r1, 16\n" + "\tmovs r5, 0\n" + "\tldr r0, [r6]\n" + "\tcmp r0, 0\n" + "\tbeq _081D19E6\n" + "\tldrh r0, [r6, 0x4]\n" + "\tldr r1, =0x0000fffe\n" + "\tcmp r0, r1\n" + "\tbeq _081D1A24\n" + "\tldr r0, =0x0000ffff\n" + "\tmov r9, r0\n" + "\tmov r8, r1\n" + "\tadds r4, r6, 0\n" + "_081D19C6:\n" + "\tldrh r0, [r4, 0x4]\n" + "\tcmp r0, r9\n" + "\tbeq _081D19D6\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _081D19E6\n" + "_081D19D6:\n" + "\tadds r4, 0x8\n" + "\tadds r5, 0x1\n" + "\tldr r0, [r4]\n" + "\tcmp r0, 0\n" + "\tbeq _081D19E6\n" + "\tldrh r0, [r4, 0x4]\n" + "\tcmp r0, r8\n" + "\tbne _081D19C6\n" + "_081D19E6:\n" + "\tlsls r0, r5, 3\n" + "\tadds r0, r6\n" + "\tldrh r1, [r0, 0x4]\n" + "\tldr r0, =0x0000fffe\n" + "\tcmp r1, r0\n" + "\tbeq _081D1A24\n" + "\tcmp r5, 0\n" + "\tbeq _081D19F8\n" + "\tsubs r5, 0x1\n" + "_081D19F8:\n" + "\tlsls r0, r5, 3\n" + "\tadds r4, r0, r6\n" + "\tldrh r1, [r4, 0x6]\n" + "\tldr r0, =0x0000ffff\n" + "\tcmp r1, r0\n" + "\tbeq _081D1A0A\n" + "\tadds r0, r1, 0\n" + "\tbl FlagSet\n" + "_081D1A0A:\n" + "\tldr r1, [r4]\n" + "\tmov r0, r10\n" + "\tbl StringExpandPlaceholders\n" + "\tb _081D1A5C\n" + "\t.pool\n" + "_081D1A1C:\n" + "\tadds r5, 0x2\n" + "\tb _081D1A50\n" + "_081D1A20:\n" + "\tadds r5, 0x3\n" + "\tb _081D1A50\n" + "_081D1A24:\n" + "\tldr r0, =0x00000864\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _081D1A50\n" + "\tldr r0, =gSaveBlock1Ptr\n" + "\tldr r0, [r0]\n" + "\tldr r1, =0x000009ca\n" + "\tadds r0, r1\n" + "\tadds r0, r7\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _081D1A1C\n" + "\tadds r0, r7, 0\n" + "\tbl CountBattledRematchTeams\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbhi _081D1A20\n" + "\tadds r5, 0x1\n" + "_081D1A50:\n" + "\tlsls r0, r5, 3\n" + "\tadds r0, r6\n" + "\tldr r1, [r0]\n" + "\tmov r0, r10\n" + "\tbl StringExpandPlaceholders\n" + "_081D1A5C:\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.pool"); +} +#endif + +void sub_81D1A78(u32 idx, const u8 **desc, const u8 **name) +{ + match_call_t matchCall; + u32 i; + + if (idx > 20) + return; + matchCall = sMatchCallHeaders[idx]; + i = MatchCallGetFunctionIndex(matchCall); + sMatchCall_GetNameAndDescFunctions[i](matchCall, desc, name); +} + +static void MatchCall_GetNameAndDesc_Type0(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + *desc = matchCall.type0->desc; + *name = matchCall.type0->name; +} + +static void MatchCall_GetNameAndDesc_Type1(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + match_call_t _matchCall = matchCall; + if (_matchCall.type1->name == NULL) + MatchCall_GetNameAndDescByRematchIdx(_matchCall.type1->rematchTableIdx, desc, name); + else + *name = _matchCall.type1->name; + *desc = _matchCall.type1->desc; +} + +static void MatchCall_GetNameAndDesc_Type2(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + MatchCall_GetNameAndDescByRematchIdx(matchCall.type2->rematchTableIdx, desc, name); + *desc = matchCall.type2->desc; +} + +static void MatchCall_GetNameAndDesc_Type3(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + *desc = matchCall.type4->desc; + *name = matchCall.type4->name; +} + +static void MatchCall_GetNameAndDesc_Type4(match_call_t matchCall, const u8 **desc, const u8 **name) +{ + *desc = matchCall.type3->desc; + *name = matchCall.type3->name; +} + +static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const u8 **name) +{ + const struct Trainer *trainer = gTrainers + GetTrainerIdxByRematchIdx(idx); + *desc = gTrainerClassNames[trainer->trainerClass]; + *name = trainer->trainerName; +} + +#ifdef NONMATCHING +const u8 *sub_81D1B40(u32 idx, u32 offset) +{ + u32 i; + + for (i = 0; i < 4; i++) + { + if (sMatchCallCheckPageOverrides[i].idx == idx) + { + for (; i + 1 < 4 && sMatchCallCheckPageOverrides[i + 1].idx == idx; i++) + { + if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4)) + break; + } + return sMatchCallCheckPageOverrides[i].v8[offset]; + } + } + return NULL; +} +#else +NAKED const u8 *sub_81D1B40(u32 idx, u32 offset) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tadds r6, r0, 0\n" + "\tmovs r5, 0\n" + "\tldr r2, =sMatchCallCheckPageOverrides\n" + "\tmovs r0, 0x8\n" + "\tadds r0, r2\n" + "\tmov r9, r0\n" + "_081D1B54:\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r5\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r6\n" + "\tbne _081D1BBC\n" + "\tadds r4, r5, 0x1\n" + "\tlsls r1, 2\n" + "\tmov r8, r1\n" + "\tcmp r4, 0x3\n" + "\tbhi _081D1BA8\n" + "\tlsls r0, r4, 1\n" + "\tadds r0, r4\n" + "\tlsls r0, 3\n" + "\tadds r0, r2\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r6\n" + "\tbne _081D1BA8\n" + "\tldr r7, =sMatchCallCheckPageOverrides\n" + "_081D1B7C:\n" + "\tlsls r0, r4, 1\n" + "\tadds r0, r4\n" + "\tlsls r0, 3\n" + "\tadds r1, r7, 0x4\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0]\n" + "\tbl FlagGet\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _081D1BA8\n" + "\tadds r5, r4, 0\n" + "\tadds r4, r5, 0x1\n" + "\tcmp r4, 0x3\n" + "\tbhi _081D1BA8\n" + "\tlsls r0, r4, 1\n" + "\tadds r0, r4\n" + "\tlsls r0, 3\n" + "\tadds r0, r7\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r6\n" + "\tbeq _081D1B7C\n" + "_081D1BA8:\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r5\n" + "\tlsls r0, 3\n" + "\tadd r0, r8\n" + "\tadd r0, r9\n" + "\tldr r0, [r0]\n" + "\tb _081D1BC4\n" + "\t.pool\n" + "_081D1BBC:\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x3\n" + "\tbls _081D1B54\n" + "\tmovs r0, 0\n" + "_081D1BC4:\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +s32 sub_81D1BD0(u32 idx) +{ + u32 i; + + for (i = 0; i < 4; i++) + { + if (sMatchCallCheckPageOverrides[i].idx == idx) + return sMatchCallCheckPageOverrides[i].v2; + } + return -1; +} + +bool32 sub_81D1BF8(u32 idx) +{ + s32 i; + + for (i = 0; i < 21; i++) + { + u32 r0 = MatchCall_GetRematchTableIdx(i); + if (r0 != REMATCH_TABLE_ENTRIES && r0 == idx) + return TRUE; + } + return FALSE; +} + +void SetMatchCallRegisteredFlag(void) +{ + s32 r0 = GetRematchIdxByTrainerIdx(gSpecialVar_0x8004); + if (r0 >= 0) + FlagSet(FLAG_MATCH_CALL_REGISTERED + r0); +} diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c new file mode 100644 index 000000000..591e3ad9a --- /dev/null +++ b/src/mauville_old_man.c @@ -0,0 +1,1248 @@ +#include "global.h" +#include "main.h" +#include "constants/songs.h" +#include "constants/easy_chat.h" +#include "constants/event_objects.h" +#include "constants/vars.h" +#include "mauville_old_man.h" +#include "event_data.h" +#include "string_util.h" +#include "text.h" +#include "easy_chat.h" +#include "script.h" +#include "random.h" +#include "event_scripts.h" +#include "task.h" +#include "menu.h" +#include "m4a.h" +#include "bard_music.h" +#include "sound.h" +#include "strings.h" +#include "overworld.h" +#include "field_message_box.h" +#include "script_menu.h" +#include "trader.h" + +#define CHAR_SONG_WORD_SEPARATOR 0x37 + +extern struct MusicPlayerInfo gMPlayInfo_SE2; + +static void InitGiddyTaleList(void); +static void StartBardSong(bool8 useTemporaryLyrics); +static void Task_BardSong(u8 taskId); +static void StorytellerSetup(void); +static void Storyteller_ResetFlag(void); + +IWRAM_DATA u8 sSelectedStory; + +struct BardSong gBardSong; + +static EWRAM_DATA u16 sUnknownBardRelated = 0; +static EWRAM_DATA struct MauvilleManStoryteller * sStorytellerPtr = NULL; +static EWRAM_DATA u8 sStorytellerWindowId = 0; + +static const u16 sDefaultBardSongLyrics[6] = { + EC_WORD_SHAKE, + EC_WORD_IT, + EC_WORD_DO, + EC_WORD_THE, + EC_WORD_DIET, + EC_WORD_DANCE +}; + +static const u8 * const sGiddyAdjectives[] = { + gText_SoPretty, + gText_SoDarling, + gText_SoRelaxed, + gText_SoSunny, + gText_SoDesirable, + gText_SoExciting, + gText_SoAmusing, + gText_SoMagical +}; + +static const u8 * const sGiddyQuestions[] = { + gUnknown_08294313, + gUnknown_08294359, + gUnknown_08294398, + gUnknown_082943DA, + gUnknown_0829441C, + gUnknown_08294460, + gUnknown_082944A0, + gUnknown_082944D5 +}; + +static void SetupBard(void) +{ + u16 i; + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + + bard->id = MAUVILLE_MAN_BARD; + bard->hasChangedSong = FALSE; + bard->language = gGameLanguage; + for (i = 0; i < 6; i++) + bard->songLyrics[i] = sDefaultBardSongLyrics[i]; +} + +static void SetupHipster(void) +{ + struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster; + + hipster->id = MAUVILLE_MAN_HIPSTER; + hipster->alreadySpoken = FALSE; + hipster->language = gGameLanguage; +} + +static void SetupStoryteller(void) +{ + StorytellerSetup(); +} + +static void SetupGiddy(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy; + + giddy->id = MAUVILLE_MAN_GIDDY; + giddy->taleCounter = 0; + giddy->language = gGameLanguage; +} + +static void SetupTrader(void) +{ + TraderSetup(); +} + +void SetMauvilleOldMan(void) +{ + u16 trainerId = (gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]; + + + // Determine man based on the last digit of the player's trainer ID. + switch ((trainerId % 10) / 2) + { + case MAUVILLE_MAN_BARD: + SetupBard(); + break; + case MAUVILLE_MAN_HIPSTER: + SetupHipster(); + break; + case MAUVILLE_MAN_TRADER: + SetupTrader(); + break; + case MAUVILLE_MAN_STORYTELLER: + SetupStoryteller(); + break; + case MAUVILLE_MAN_GIDDY: + SetupGiddy(); + break; + } + ScrSpecial_SetMauvilleOldManEventObjGfx(); +} + +u8 GetCurrentMauvilleOldMan(void) +{ + struct MauvilleManCommon *common = &gSaveBlock1Ptr->oldMan.common; + + return common->id; +} + +void ScrSpecial_GetCurrentMauvilleMan(void) +{ + gSpecialVar_Result = GetCurrentMauvilleOldMan(); +} + +void ScrSpecial_HasBardSongBeenChanged(void) +{ + u16 *scriptResult = &gSpecialVar_Result; // why?? + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + + *scriptResult = bard->hasChangedSong; +} + +void ScrSpecial_SaveBardSongLyrics(void) +{ + u16 i; + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + + StringCopy(bard->playerName, gSaveBlock2Ptr->playerName); + + for (i = 0; i < 4; i++) + bard->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; + + for (i = 0; i < 6; i++) + bard->songLyrics[i] = bard->temporaryLyrics[i]; + + bard->hasChangedSong = TRUE; +} + +// Copies lyrics into gStringVar4 +static void PrepareSongText(void) +{ + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + u16 * lyrics = gSpecialVar_0x8004 == 0 ? bard->songLyrics : bard->temporaryLyrics; + u8 * wordEnd = gStringVar4; + u8 * str = wordEnd; + u16 lineNum; + + // Put three words on each line + for (lineNum = 0; lineNum < 2; lineNum++) + { + wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++)); + while (wordEnd != str) + { + if (*str == CHAR_SPACE) + *str = CHAR_SONG_WORD_SEPARATOR; + str++; + } + + str++; + *(wordEnd++) = CHAR_SPACE; + + wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++)); + while (wordEnd != str) + { + if (*str == CHAR_SPACE) + *str = CHAR_SONG_WORD_SEPARATOR; + str++; + } + + str++; + *(wordEnd++) = CHAR_NEWLINE; + + wordEnd = CopyEasyChatWord(wordEnd, *(lyrics++)); + while (wordEnd != str) + { + if (*str == CHAR_SPACE) + *str = CHAR_SONG_WORD_SEPARATOR; + str++; + } + + if (lineNum == 0) + { + *(wordEnd++) = EXT_CTRL_CODE_BEGIN; + *(wordEnd++) = 15; + } + } +} + +void ScrSpecial_PlayBardSong(void) +{ + StartBardSong(gSpecialVar_0x8004); + ScriptContext1_Stop(); +} + +void ScrSpecial_GetHipsterSpokenFlag(void) +{ + u16 *scriptResult = &gSpecialVar_Result; // again?? + struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster; + + *scriptResult = hipster->alreadySpoken; +} + +void ScrSpecial_SetHipsterSpokenFlag(void) +{ + struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster; + + hipster->alreadySpoken = TRUE; +} + +void ScrSpecial_HipsterTeachWord(void) +{ + u16 var = sub_811F01C(); + + if (var == 0xFFFF) + { + gSpecialVar_Result = FALSE; + } + else + { + CopyEasyChatWord(gStringVar1, var); + gSpecialVar_Result = TRUE; + } +} + +void ScrSpecial_GiddyShouldTellAnotherTale(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy; + + if (giddy->taleCounter == 10) + { + gSpecialVar_Result = FALSE; + giddy->taleCounter = 0; + } + else + { + gSpecialVar_Result = TRUE; + } +} + +void ScrSpecial_GenerateGiddyLine(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy; + + if (giddy->taleCounter == 0) + InitGiddyTaleList(); + + if (giddy->randomWords[giddy->taleCounter] != 0xFFFF) // is not the last element of the array? + { + u8 *stringPtr; + u32 adjective = Random(); + + adjective %= 8; + stringPtr = CopyEasyChatWord(gStringVar4, giddy->randomWords[giddy->taleCounter]); + stringPtr = StringCopy(stringPtr, gOtherText_Is); + stringPtr = StringCopy(stringPtr, sGiddyAdjectives[adjective]); + StringCopy(stringPtr, gOtherText_DontYouAgree); + } + else + { + StringCopy(gStringVar4, sGiddyQuestions[giddy->questionList[giddy->questionNum++]]); + } + + if (!(Random() % 10)) + giddy->taleCounter = 10; + else + giddy->taleCounter++; + + gSpecialVar_Result = TRUE; +} + +static void InitGiddyTaleList(void) +{ + struct MauvilleManGiddy *giddy = &gSaveBlock1Ptr->oldMan.giddy; + u16 arr[][2] = { + {EC_GROUP_POKEMON, 0}, + {EC_GROUP_LIFESTYLE, 0}, + {EC_GROUP_HOBBIES, 0}, + {EC_GROUP_MOVE_1, 0}, + {EC_GROUP_MOVE_2, 0}, + {EC_GROUP_POKEMON_2, 0} + }; + u16 i; + u16 r10; + u16 r7; + u16 r1; + + for (i = 0; i < 8; i++) + giddy->questionList[i] = i; + + for (i = 0; i < 8; i++) + { + r1 = Random() % (i + 1); + r7 = giddy->questionList[i]; + giddy->questionList[i] = giddy->questionList[r1]; + giddy->questionList[r1] = r7; + } + + r10 = 0; + for (i = 0; i < 6; i++) + { + arr[i][1] = EasyChat_GetNumWordsInGroup(arr[i][0]); + r10 += arr[i][1]; + } + + giddy->questionNum = 0; + r7 = 0; + for (i = 0; i < 10; i++) + { + r1 = Random() % 10; + if (r1 < 3 && r7 < 8) + { + giddy->randomWords[i] = 0xFFFF; + r7++; + } + else + { + s16 r2 = Random() % r10; + for (r1 = 0; i < 6; r1++) + if ((r2 -= arr[r1][1]) <= 0) + break; + if (r1 == 6) + r1 = 0; + giddy->randomWords[i] = sub_811EE90(arr[r1][0]); + } + } +} +static void ResetBardFlag(void) +{ + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + + bard->hasChangedSong = FALSE; +} + +static void ResetHipsterFlag(void) +{ + struct MauvilleManHipster *hipster = &gSaveBlock1Ptr->oldMan.hipster; + + hipster->alreadySpoken = FALSE; +} + +static void ResetTraderFlag(void) +{ + Trader_ResetFlag(); +} + +static void ResetStorytellerFlag(void) +{ + Storyteller_ResetFlag(); +} + +void ResetMauvilleOldManFlag(void) +{ + switch (GetCurrentMauvilleOldMan()) + { + case MAUVILLE_MAN_BARD: + ResetBardFlag(); + break; + case MAUVILLE_MAN_HIPSTER: + ResetHipsterFlag(); + break; + case MAUVILLE_MAN_STORYTELLER: + ResetStorytellerFlag(); + break; + case MAUVILLE_MAN_TRADER: + ResetTraderFlag(); + break; + case MAUVILLE_MAN_GIDDY: + break; + } + ScrSpecial_SetMauvilleOldManEventObjGfx(); +} + + +#define tState data[0] +#define tCharIndex data[3] +#define tCurrWord data[4] +#define tUseTemporaryLyrics data[5] + +#define MACRO1(a) (((a) & 3) + (((a) / 8) & 1)) +#define MACRO2(a) (((a) % 4) + (((a) / 8) & 1)) + +static void StartBardSong(bool8 useTemporaryLyrics) +{ + u8 taskId = CreateTask(Task_BardSong, 80); + + gTasks[taskId].tUseTemporaryLyrics = useTemporaryLyrics; +} + +static void sub_81206F0(void) +{ + gUnknown_03002F84 = FALSE; +} + +static void BardSong_TextSubPrinter(struct TextSubPrinter * printer, u16 a1) +{ + gUnknown_03002F84 = TRUE; +} + +static void sub_8120708(const u8 * src) +{ + NewMenuHelpers_DrawDialogueFrame(0, 0); + PrintTextOnWindow(0, 1, src, 0, 1, 1, BardSong_TextSubPrinter); + gUnknown_03002F84 = TRUE; + CopyWindowToVram(0, 3); +} + +static void BardSing(struct Task *task, struct BardSong *song) +{ + switch (task->tState) + { + case 0: // Initialize song + { + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + u16 *lyrics; + s32 i; + + // Copy lyrics + if (gSpecialVar_0x8004 == 0) + lyrics = bard->songLyrics; + else + lyrics = bard->temporaryLyrics; + for (i = 0; i < 6; i++) + song->lyrics[i] = lyrics[i]; + song->currWord = 0; + } + break; + case 1: // Wait for BGM to end + break; + case 2: // Initialize word + { + u16 word = song->lyrics[song->currWord]; + song->sound = GetWordSounds(word); + GetWordPhonemes(song, MACRO1(word)); + song->currWord++; + if (song->sound->var00 != 0xFF) + song->state = 0; + else + { + song->state = 3; + song->phonemeTimer = 2; + } + break; + } + case 3: + case 4: + { + const struct BardSound *sound = &song->sound[song->currPhoneme]; + + switch (song->state) + { + case 0: + song->phonemeTimer = song->phonemes[song->currPhoneme].length; + if (sound->var00 <= 50) + { + u8 num = sound->var00 / 3; + m4aSongNumStart(PH_TRAP_HELD + 3 * num); + } + song->state = 2; + song->phonemeTimer--; + break; + case 2: + song->state = 1; + if (sound->var00 <= 50) + { + song->volume = 0x100 + sound->volume * 16; + m4aMPlayVolumeControl(&gMPlayInfo_SE2, 0xFFFF, song->volume); + song->pitch = 0x200 + song->phonemes[song->currPhoneme].pitch; + m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, song->pitch); + } + break; + case 1: + if (song->voiceInflection > 10) + song->volume -= 2; + if (song->voiceInflection & 1) + song->pitch += 64; + else + song->pitch -= 64; + m4aMPlayVolumeControl(&gMPlayInfo_SE2, 0xFFFF, song->volume); + m4aMPlayPitchControl(&gMPlayInfo_SE2, 0xFFFF, song->pitch); + song->voiceInflection++; + song->phonemeTimer--; + if (song->phonemeTimer == 0) + { + song->currPhoneme++; + if (song->currPhoneme != 6 && song->sound[song->currPhoneme].var00 != 0xFF) + song->state = 0; + else + { + song->state = 3; + song->phonemeTimer = 2; + } + } + break; + case 3: + song->phonemeTimer--; + if (song->phonemeTimer == 0) + { + m4aMPlayStop(&gMPlayInfo_SE2); + song->state = 4; + } + break; + } + } + break; + case 5: + break; + } +} + +static void Task_BardSong(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; // r5 + + BardSing(task, &gBardSong); + switch (task->tState) + { + case 0: // Initialize song + PrepareSongText(); + sub_8120708(gStringVar4); + task->data[1] = 0; + task->data[2] = 0; + task->tCharIndex = 0; + task->tCurrWord = 0; + FadeOutBGMTemporarily(4); + task->tState = 1; + break; + case 1: // Wait for BGM to end + if (IsBGMPausedOrStopped()) + task->tState = 2; + break; + case 2: // Initialize word + { + struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; + u8 *str = gStringVar4 + task->tCharIndex; + u16 wordLen = 0; + // Can't get it to match without hacking + u32 temp; + register s16 zero asm("r1"); + + while (*str != CHAR_SPACE + && *str != CHAR_NEWLINE + && *str != EXT_CTRL_CODE_BEGIN + && *str != EOS) + { + str++; + wordLen++; + } + if (!task->tUseTemporaryLyrics) + sUnknownBardRelated = MACRO2(bard->songLyrics[task->tCurrWord]); + else + sUnknownBardRelated = MACRO2(bard->temporaryLyrics[task->tCurrWord]); + temp = gBardSong.length / wordLen; + zero = 0; + gBardSong.length = temp; + if (gBardSong.length <= 0) + gBardSong.length = 1; + task->tCurrWord++; + if (task->data[2] == 0) + task->tState = 3; + else + task->tState = 5; + task->data[1] = zero; + } + break; + case 5: + if (task->data[2] == 0) + task->tState = 3; + else + task->data[2]--; + break; + case 3: + if (gStringVar4[task->tCharIndex] == EOS) + { + FadeInBGM(6); + m4aMPlayFadeOutTemporarily(&gMPlayInfo_SE2, 2); + EnableBothScriptContexts(); + DestroyTask(taskId); + } + else if (gStringVar4[task->tCharIndex] == CHAR_SPACE) + { + + sub_81206F0(); + task->tCharIndex++; + task->tState = 2; + task->data[2] = 0; + } + else if (gStringVar4[task->tCharIndex] == CHAR_NEWLINE) + { + task->tCharIndex++; + task->tState = 2; + task->data[2] = 0; + } + else if (gStringVar4[task->tCharIndex] == EXT_CTRL_CODE_BEGIN) + { + task->tCharIndex += 2; // skip over control codes + task->tState = 2; + task->data[2] = 8; + } + else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR) + { + gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space + sub_81206F0(); + task->tCharIndex++; + task->data[2] = 0; + } + else + { + switch (task->data[1]) + { + case 0: + sub_81206F0(); + task->data[1]++; + break; + case 1: + task->data[1]++; + break; + case 2: + task->tCharIndex++; + task->data[1] = 0; + task->data[2] = gBardSong.length; + task->tState = 4; + break; + } + } + break; + case 4: + task->data[2]--; + if (task->data[2] == 0) + task->tState = 3; + break; + } + sub_8197224(); +} + +void ScrSpecial_SetMauvilleOldManEventObjGfx(void) +{ + VarSet(VAR_OBJ_GFX_ID_0, EVENT_OBJ_GFX_BARD); +} + +// Language fixers? + +void sub_8120B70(union OldMan * oldMan) +{ + s32 i; + u8 sp00[8]; + + switch (oldMan->common.id) + { + case MAUVILLE_MAN_TRADER: + { + struct MauvilleOldManTrader * trader = &oldMan->trader; + for (i = 0; i < 4; i++) + { + if (trader->language[i] == LANGUAGE_JAPANESE) + { + ConvertInternationalString(trader->playerNames[i], LANGUAGE_JAPANESE); + } + } + } + break; + case MAUVILLE_MAN_STORYTELLER: + { + struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + for (i = 0; i < 4; i++) + { + if (storyteller->gameStatIDs[i] != 0) + { + memcpy(sp00, storyteller->trainerNames[i], 7); + sp00[7] = EOS; + if (IsStringJapanese(sp00)) + { + memset(sp00, CHAR_SPACE, 8); + StringCopy(sp00, gText_Friend); + memcpy(storyteller->trainerNames[i], sp00, 7); + storyteller->language[i] = GAME_LANGUAGE; + } + } + } + } + break; + } +} + +void sub_8120C0C(union OldMan * oldMan, u32 r8, u32 r7, u32 r3) +{ + s32 i; + + switch (oldMan->common.id) + { + case MAUVILLE_MAN_TRADER: + { + struct MauvilleOldManTrader * trader = &oldMan->trader; + + for (i = 0; i < 4; i++) + { + if (IsStringJapanese(trader->playerNames[i])) + { + trader->language[i] = r8; + } + else + { + trader->language[i] = r7; + } + } + } + break; + case MAUVILLE_MAN_STORYTELLER: + { + struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + + for (i = 0; i < 4; i++) + { + if (IsStringJapanese(storyteller->trainerNames[i])) + { + storyteller->language[i] = r8; + } + else + { + storyteller->language[i] = r7; + } + } + } + break; + case MAUVILLE_MAN_BARD: + { + struct MauvilleManBard * bard = &oldMan->bard; + + if (r3 == LANGUAGE_JAPANESE) + bard->language = r8; + else + bard->language = r7; + } + break; + case MAUVILLE_MAN_HIPSTER: + { + struct MauvilleManHipster * hipster = &oldMan->hipster; + + if (r3 == LANGUAGE_JAPANESE) + hipster->language = r8; + else + hipster->language = r7; + } + break; + case MAUVILLE_MAN_GIDDY: + { + struct MauvilleManGiddy * giddy = &oldMan->giddy; + + if (r3 == LANGUAGE_JAPANESE) + giddy->language = r8; + else + giddy->language = r7; + } + break; + } +} + +void SanitizeReceivedEmeraldOldMan(union OldMan * oldMan, u32 version, u32 language) +{ + u8 sp00[8]; + s32 i; + if (oldMan->common.id == MAUVILLE_MAN_STORYTELLER && language == LANGUAGE_JAPANESE) + { + struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + + for (i = 0; i < 4; i++) + { + if (storyteller->gameStatIDs[i] != 0) + { + memcpy(sp00, storyteller->trainerNames[i], 7); + sp00[7] = EOS; + if (IsStringJapanese(sp00)) + storyteller->language[i] = LANGUAGE_JAPANESE; + else + storyteller->language[i] = GAME_LANGUAGE; + } + } + } +} + +void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language) +{ + bool32 isRuby = (version == VERSION_SAPPHIRE || version == VERSION_RUBY); + + switch (oldMan->common.id) + { + case MAUVILLE_MAN_TRADER: + { + struct MauvilleOldManTrader * trader = &oldMan->trader; + s32 i; + + if (isRuby) + { + for (i = 0; i < 4; i++) + { + u8 * str = trader->playerNames[i]; + if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN) + { + StripExtCtrlCodes(str); + trader->language[i] = LANGUAGE_JAPANESE; + } + else + trader->language[i] = language; + } + } + else + { + for (i = 0; i < 4; i++) + { + if (trader->language[i] == LANGUAGE_JAPANESE) + { + StripExtCtrlCodes(trader->playerNames[i]); + } + } + } + } + break; + case MAUVILLE_MAN_STORYTELLER: + { + + struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + s32 i; + + if (isRuby) + { + for (i = 0; i < 4; i++) + { + if (storyteller->gameStatIDs[i] != 0) + storyteller->language[i] = language; + } + } + } + break; + case MAUVILLE_MAN_BARD: + { + struct MauvilleManBard * bard = &oldMan->bard; + + if (isRuby) + { + bard->language = language; + } + } + break; + case MAUVILLE_MAN_HIPSTER: + { + struct MauvilleManHipster * hipster = &oldMan->hipster; + + if (isRuby) + { + hipster->language = language; + } + } + break; + case MAUVILLE_MAN_GIDDY: + { + struct MauvilleManGiddy * giddy = &oldMan->giddy; + + if (isRuby) + { + giddy->language = language; + } + } + break; + } +} + +struct Story +{ + u8 stat; + u8 minVal; + const u8 *title; + const u8 *action; + const u8 *fullText; +}; + +static const struct Story sStorytellerStories[] = { + {GAME_STAT_50, 1, MauvilleCity_PokemonCenter_1F_Text_28E930, MauvilleCity_PokemonCenter_1F_Text_28E947, MauvilleCity_PokemonCenter_1F_Text_28E956}, + {GAME_STAT_STARTED_TRENDS, 1, MauvilleCity_PokemonCenter_1F_Text_28E9D7, MauvilleCity_PokemonCenter_1F_Text_28E9EF, MauvilleCity_PokemonCenter_1F_Text_28E9FE}, + {GAME_STAT_PLANTED_BERRIES, 1, MauvilleCity_PokemonCenter_1F_Text_28EA7D, MauvilleCity_PokemonCenter_1F_Text_28EA98, MauvilleCity_PokemonCenter_1F_Text_28EAA8}, + {GAME_STAT_TRADED_BIKES, 1, MauvilleCity_PokemonCenter_1F_Text_28EB19, MauvilleCity_PokemonCenter_1F_Text_28EB31, MauvilleCity_PokemonCenter_1F_Text_28EB3E}, + {GAME_STAT_GOT_INTERVIEWED, 1, MauvilleCity_PokemonCenter_1F_Text_28EBB5, MauvilleCity_PokemonCenter_1F_Text_28EBCD, MauvilleCity_PokemonCenter_1F_Text_28EBDD}, + {GAME_STAT_TRAINER_BATTLES, 1, MauvilleCity_PokemonCenter_1F_Text_28EC60, MauvilleCity_PokemonCenter_1F_Text_28EC79, MauvilleCity_PokemonCenter_1F_Text_28EC81}, + {GAME_STAT_POKEMON_CAPTURES, 1, MauvilleCity_PokemonCenter_1F_Text_28ED04, MauvilleCity_PokemonCenter_1F_Text_28ED21, MauvilleCity_PokemonCenter_1F_Text_28ED30}, + {GAME_STAT_FISHING_CAPTURES, 1, MauvilleCity_PokemonCenter_1F_Text_28EDA1, MauvilleCity_PokemonCenter_1F_Text_28EDB5, MauvilleCity_PokemonCenter_1F_Text_28EDCF}, + {GAME_STAT_HATCHED_EGGS, 1, MauvilleCity_PokemonCenter_1F_Text_28EE45, MauvilleCity_PokemonCenter_1F_Text_28EE5D, MauvilleCity_PokemonCenter_1F_Text_28EE6A}, + {GAME_STAT_EVOLVED_POKEMON, 1, MauvilleCity_PokemonCenter_1F_Text_28EEDD, MauvilleCity_PokemonCenter_1F_Text_28EEF1, MauvilleCity_PokemonCenter_1F_Text_28EF01}, + {GAME_STAT_USED_POKECENTER, 1, MauvilleCity_PokemonCenter_1F_Text_28EF73, MauvilleCity_PokemonCenter_1F_Text_28EF95, MauvilleCity_PokemonCenter_1F_Text_28EFAA}, + {GAME_STAT_RESTED_AT_HOME, 1, MauvilleCity_PokemonCenter_1F_Text_28F045, MauvilleCity_PokemonCenter_1F_Text_28F05A, MauvilleCity_PokemonCenter_1F_Text_28F071}, + {GAME_STAT_ENTERED_SAFARI_ZONE, 1, MauvilleCity_PokemonCenter_1F_Text_28F0F3, MauvilleCity_PokemonCenter_1F_Text_28F10D, MauvilleCity_PokemonCenter_1F_Text_28F125}, + {GAME_STAT_USED_CUT, 1, MauvilleCity_PokemonCenter_1F_Text_28F1BE, MauvilleCity_PokemonCenter_1F_Text_28F1D5, MauvilleCity_PokemonCenter_1F_Text_28F1DE}, + {GAME_STAT_USED_ROCK_SMASH, 1, MauvilleCity_PokemonCenter_1F_Text_28F24F, MauvilleCity_PokemonCenter_1F_Text_28F269, MauvilleCity_PokemonCenter_1F_Text_28F277}, + {GAME_STAT_MOVED_SECRET_BASE, 1, MauvilleCity_PokemonCenter_1F_Text_28F2FC, MauvilleCity_PokemonCenter_1F_Text_28F314, MauvilleCity_PokemonCenter_1F_Text_28F32A}, + {GAME_STAT_USED_SPLASH, 1, MauvilleCity_PokemonCenter_1F_Text_28F3AD, MauvilleCity_PokemonCenter_1F_Text_28F3C6, MauvilleCity_PokemonCenter_1F_Text_28F3D2}, + {GAME_STAT_USED_STRUGGLE, 1, MauvilleCity_PokemonCenter_1F_Text_28F44B, MauvilleCity_PokemonCenter_1F_Text_28F461, MauvilleCity_PokemonCenter_1F_Text_28F47C}, + {GAME_STAT_SLOT_JACKPOTS, 1, MauvilleCity_PokemonCenter_1F_Text_28F50C, MauvilleCity_PokemonCenter_1F_Text_28F51B, MauvilleCity_PokemonCenter_1F_Text_28F538}, + {GAME_STAT_CONSECUTIVE_ROULETTE_WINS, 2, MauvilleCity_PokemonCenter_1F_Text_28F5BE, MauvilleCity_PokemonCenter_1F_Text_28F5D1, MauvilleCity_PokemonCenter_1F_Text_28F5F2}, + {GAME_STAT_ENTERED_BATTLE_TOWER, 1, MauvilleCity_PokemonCenter_1F_Text_28F678, MauvilleCity_PokemonCenter_1F_Text_28F694, MauvilleCity_PokemonCenter_1F_Text_28F6B4}, + {GAME_STAT_POKEBLOCKS, 1, MauvilleCity_PokemonCenter_1F_Text_28F751, MauvilleCity_PokemonCenter_1F_Text_28F76A, MauvilleCity_PokemonCenter_1F_Text_28F776}, + {GAME_STAT_ENTERED_CONTEST, 1, MauvilleCity_PokemonCenter_1F_Text_28F7F6, MauvilleCity_PokemonCenter_1F_Text_28F811, MauvilleCity_PokemonCenter_1F_Text_28F822}, + {GAME_STAT_WON_CONTEST, 1, MauvilleCity_PokemonCenter_1F_Text_28F89C, MauvilleCity_PokemonCenter_1F_Text_28F8AF, MauvilleCity_PokemonCenter_1F_Text_28F8BC}, + {GAME_STAT_SHOPPED, 1, MauvilleCity_PokemonCenter_1F_Text_28F92F, MauvilleCity_PokemonCenter_1F_Text_28F941, MauvilleCity_PokemonCenter_1F_Text_28F949}, + {GAME_STAT_USED_ITEMFINDER, 1, MauvilleCity_PokemonCenter_1F_Text_28F9D1, MauvilleCity_PokemonCenter_1F_Text_28F9EA, MauvilleCity_PokemonCenter_1F_Text_28F9FD}, + {GAME_STAT_GOT_RAINED_ON, 1, MauvilleCity_PokemonCenter_1F_Text_28FA81, MauvilleCity_PokemonCenter_1F_Text_28FA99, MauvilleCity_PokemonCenter_1F_Text_28FAA7}, + {GAME_STAT_CHECKED_POKEDEX, 1, MauvilleCity_PokemonCenter_1F_Text_28FB1D, MauvilleCity_PokemonCenter_1F_Text_28FB35, MauvilleCity_PokemonCenter_1F_Text_28FB47}, + {GAME_STAT_RECEIVED_RIBBONS, 1, MauvilleCity_PokemonCenter_1F_Text_28FBC4, MauvilleCity_PokemonCenter_1F_Text_28FBD9, MauvilleCity_PokemonCenter_1F_Text_28FBEA}, + {GAME_STAT_JUMPED_DOWN_LEDGES, 1, MauvilleCity_PokemonCenter_1F_Text_28FC6B, MauvilleCity_PokemonCenter_1F_Text_28FC85, MauvilleCity_PokemonCenter_1F_Text_28FC98}, + {GAME_STAT_WATCHED_TV, 1, MauvilleCity_PokemonCenter_1F_Text_28FD1D, MauvilleCity_PokemonCenter_1F_Text_28FD35, MauvilleCity_PokemonCenter_1F_Text_28FD40}, + {GAME_STAT_CHECKED_CLOCK, 1, MauvilleCity_PokemonCenter_1F_Text_28FDA2, MauvilleCity_PokemonCenter_1F_Text_28FDBD, MauvilleCity_PokemonCenter_1F_Text_28FDCE}, + {GAME_STAT_WON_POKEMON_LOTTERY, 1, MauvilleCity_PokemonCenter_1F_Text_28FE57, MauvilleCity_PokemonCenter_1F_Text_28FE72, MauvilleCity_PokemonCenter_1F_Text_28FE88}, + {GAME_STAT_USED_DAYCARE, 1, MauvilleCity_PokemonCenter_1F_Text_28FF0C, MauvilleCity_PokemonCenter_1F_Text_28FF27, MauvilleCity_PokemonCenter_1F_Text_28FF44}, + {GAME_STAT_RODE_CABLE_CAR, 1, MauvilleCity_PokemonCenter_1F_Text_28FFDD, MauvilleCity_PokemonCenter_1F_Text_28FFFA, MauvilleCity_PokemonCenter_1F_Text_29000D}, + {GAME_STAT_ENTERED_HOT_SPRINGS, 1, MauvilleCity_PokemonCenter_1F_Text_290097, MauvilleCity_PokemonCenter_1F_Text_2900B5, MauvilleCity_PokemonCenter_1F_Text_2900CB} +}; + +static void StorytellerSetup(void) +{ + s32 i; + sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller; + + sStorytellerPtr->id = MAUVILLE_MAN_STORYTELLER; + sStorytellerPtr->alreadyRecorded = FALSE; + for (i = 0; i < 4; i++) + { + sStorytellerPtr->gameStatIDs[i] = 0; + sStorytellerPtr->trainerNames[0][i] = EOS; // Maybe they meant storyteller->trainerNames[i][0] instead? + } +} + +static void Storyteller_ResetFlag(void) +{ + sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller; + + sStorytellerPtr->id = MAUVILLE_MAN_STORYTELLER; + sStorytellerPtr->alreadyRecorded = FALSE; +} + +static u32 StorytellerGetGameStat(u8 stat) +{ + if (stat == 50) + stat = 0; + return GetGameStat(stat); +} + +static const struct Story *GetStoryByStat(u32 stat) +{ + s32 i; + + for (i = 0; i < 36; i++) + { + if (sStorytellerStories[i].stat == stat) + return &sStorytellerStories[i]; + } + return &sStorytellerStories[35]; +} + +static const u8 *GetStoryTitleByStat(u32 stat) +{ + return GetStoryByStat(stat)->title; +} + +static const u8 *GetStoryTextByStat(u32 stat) +{ + return GetStoryByStat(stat)->fullText; +} + +static const u8 *GetStoryActionByStat(u32 stat) +{ + return GetStoryByStat(stat)->action; +} + +static u8 GetFreeStorySlot(void) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (sStorytellerPtr->gameStatIDs[i] == 0) + break; + } + return i; +} + +static u32 StorytellerGetRecordedTrainerStat(u32 trainer) +{ + u8 *ptr = sStorytellerPtr->statValues[trainer]; + + return ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); +} + +static void StorytellerSetRecordedTrainerStat(u32 trainer, u32 val) +{ + u8 *ptr = sStorytellerPtr->statValues[trainer]; + + ptr[0] = val; + ptr[1] = val >> 8; + ptr[2] = val >> 16; + ptr[3] = val >> 24; +} + +static bool32 HasTrainerStatIncreased(u32 trainer) +{ + if (StorytellerGetGameStat(sStorytellerPtr->gameStatIDs[trainer]) > StorytellerGetRecordedTrainerStat(trainer)) + return TRUE; + else + return FALSE; +} + +static void GetStoryByStattellerPlayerName(u32 player, void *dst) +{ + u8 *name = sStorytellerPtr->trainerNames[player]; + + memset(dst, EOS, 8); + memcpy(dst, name, 7); +} + +static void StorytellerSetPlayerName(u32 player, const u8 * src) +{ + u8 * name = sStorytellerPtr->trainerNames[player]; + memset(name, EOS, 7); + memcpy(name, src, 7); +} + + +static void StorytellerRecordNewStat(u32 player, u32 stat) +{ + sStorytellerPtr->gameStatIDs[player] = stat; + StorytellerSetPlayerName(player, gSaveBlock2Ptr->playerName); + StorytellerSetRecordedTrainerStat(player, StorytellerGetGameStat(stat)); + ConvertIntToDecimalStringN(gStringVar1, StorytellerGetGameStat(stat), STR_CONV_MODE_LEFT_ALIGN, 10); + StringCopy(gStringVar2, GetStoryActionByStat(stat)); + sStorytellerPtr->language[player] = gGameLanguage; +} + +static void ScrambleStatList(u8 * arr, s32 count) +{ + s32 i; + + for (i = 0; i < count; i++) + arr[i] = i; + for (i = 0; i < count; i++) + { + u32 a = Random() % count; + u32 b = Random() % count; + u8 temp = arr[a]; + arr[a] = arr[b]; + arr[b] = temp; + } +} + +struct UnknownStruct_0859F288 +{ + s32 length; + u32 unused2; +}; + +static const struct UnknownStruct_0859F288 sStorytellerStuff = { + ARRAY_COUNT(sStorytellerStories), + sizeof(sStorytellerStuff) +}; + +static bool8 StorytellerInitializeRandomStat(void) +{ + u8 arr[sStorytellerStuff.length]; + s32 i; + s32 j; + + ScrambleStatList(arr, ARRAY_COUNT(sStorytellerStories)); + for (i = 0; i < (s32)ARRAY_COUNT(sStorytellerStories); i++) + { + u8 stat = sStorytellerStories[arr[i]].stat; + u8 minVal = sStorytellerStories[arr[i]].minVal; + + for (j = 0; j < 4; j++) + { + if (sStorytellerPtr->gameStatIDs[j] == stat) + break; + } + if (j == 4 && StorytellerGetGameStat(stat) >= minVal) + { + sStorytellerPtr->alreadyRecorded = TRUE; + if (GetFreeStorySlot() == 4) + StorytellerRecordNewStat(sSelectedStory, stat); + else + StorytellerRecordNewStat(GetFreeStorySlot(), stat); + return TRUE; + } + } + return FALSE; +} + +static void StorytellerDisplayStory(u32 player) +{ + u8 stat = sStorytellerPtr->gameStatIDs[player]; + + ConvertIntToDecimalStringN(gStringVar1, StorytellerGetRecordedTrainerStat(player), 0, 10); + StringCopy(gStringVar2, GetStoryActionByStat(stat)); + GetStoryByStattellerPlayerName(player, gStringVar3); + ConvertInternationalString(gStringVar3, sStorytellerPtr->language[player]); + ShowFieldMessage(GetStoryTextByStat(stat)); +} + +static void PrintStoryList(void) +{ + s32 i; + s32 width = GetStringWidth(1, gText_Exit, 0); + u8 tileWidth; + for (i = 0; i < 4; i++) + { + s32 curWidth; + u16 gameStatID = sStorytellerPtr->gameStatIDs[i]; + + if (gameStatID == 0) + break; + curWidth = GetStringWidth(1, GetStoryTitleByStat(gameStatID), 0); + if (curWidth > width) + width = curWidth; + } + sStorytellerWindowId = CreateWindowFromRect(0, 0, convert_pixel_width_to_tile_width(width), GetFreeStorySlot() * 2 + 2); + SetStandardWindowBorderStyle(sStorytellerWindowId, 0); + for (i = 0; i < 4; i++) + { + u16 gameStatID = sStorytellerPtr->gameStatIDs[i]; + if (gameStatID == 0) + break; + PrintTextOnWindow(sStorytellerWindowId, 1, GetStoryTitleByStat(gameStatID), 8, 16 * i + 1, 0xFF, NULL); + } + PrintTextOnWindow(sStorytellerWindowId, 1, gText_Exit, 8, 16 * i + 1, 0xFF, NULL); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sStorytellerWindowId, GetFreeStorySlot() + 1, 0); + CopyWindowToVram(sStorytellerWindowId, 3); +} + +static void Task_StoryListMenu(u8 taskId) // Task_StoryListMenu +{ + struct Task *task = &gTasks[taskId]; + s32 selection; + + switch (task->data[0]) + { + case 0: + PrintStoryList(); + task->data[0]++; + break; + case 1: + selection = ProcessMenuInput(); + if (selection == -2) + break; + if (selection == -1 || selection == GetFreeStorySlot()) + { + gSpecialVar_Result = 0; + } + else + { + gSpecialVar_Result = 1; + sSelectedStory = selection; + } + sub_80E2A78(sStorytellerWindowId); + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } +} + +// Sets gSpecialVar_Result to TRUE if player selected a story +void ScrSpecial_StorytellerStoryListMenu(void) +{ + CreateTask(Task_StoryListMenu, 80); +} + +void ScrSpecial_StorytellerDisplayStory(void) +{ + StorytellerDisplayStory(sSelectedStory); +} + +u8 ScrSpecial_StorytellerGetFreeStorySlot(void) +{ + sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller; + return GetFreeStorySlot(); +} + +// Returns TRUE if stat has increased +bool8 ScrSpecial_StorytellerUpdateStat(void) +{ + u8 r4; + sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller; + r4 = sStorytellerPtr->gameStatIDs[sSelectedStory]; + + if (HasTrainerStatIncreased(sSelectedStory) == TRUE) + { + StorytellerRecordNewStat(sSelectedStory, r4); + return TRUE; + } + return FALSE; +} + +bool8 ScrSpecial_HasStorytellerAlreadyRecorded(void) +{ + sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller; + + if (sStorytellerPtr->alreadyRecorded == FALSE) + return FALSE; + else + return TRUE; +} + +bool8 ScrSpecial_StorytellerInitializeRandomStat(void) +{ + sStorytellerPtr = &gSaveBlock1Ptr->oldMan.storyteller; + return StorytellerInitializeRandomStat(); +} + diff --git a/src/menu.c b/src/menu.c index b20ab5164..f4ffec023 100644 --- a/src/menu.c +++ b/src/menu.c @@ -25,11 +25,11 @@ #define STD_WINDOW_PALETTE_NUM 14 #define STD_WINDOW_BASE_TILE_NUM 0x214 -struct SomeUnkStruct_60F0D4 +struct MoveMenuInfoIcon { - u8 unk1; - u8 unk2; - u16 unk3; + u8 width; + u8 height; + u16 offset; }; struct Menu @@ -48,7 +48,7 @@ struct Menu bool8 APressMuted; }; -static EWRAM_DATA u8 gUnknown_0203CD8C = 0; +static EWRAM_DATA u8 gStartMenuWindowId = 0; static EWRAM_DATA u8 gUnknown_0203CD8D = 0; static EWRAM_DATA struct Menu gUnknown_0203CD90 = {0}; static EWRAM_DATA u16 gUnknown_0203CD9C = 0; @@ -76,34 +76,36 @@ static const struct WindowTemplate gUnknown_0860F0A8 = const u16 gUnknown_0860F0B0[] = INCBIN_U16("graphics/interface/860F0B0.gbapal"); const u8 gUnknown_0860F0D0[] = { 15, 1, 2 }; -const struct SomeUnkStruct_60F0D4 gUnknown_0860F0D4[] = -{ - { 12, 12, 0x00 }, - { 32, 12, 0x20 }, - { 32, 12, 0x64 }, - { 32, 12, 0x60 }, - { 32, 12, 0x80 }, - { 32, 12, 0x48 }, - { 32, 12, 0x44 }, - { 32, 12, 0x6C }, - { 32, 12, 0x68 }, - { 32, 12, 0x88 }, - { 32, 12, 0xA4 }, - { 32, 12, 0x24 }, - { 32, 12, 0x28 }, - { 32, 12, 0x2C }, - { 32, 12, 0x40 }, - { 32, 12, 0x84 }, - { 32, 12, 0x4C }, - { 32, 12, 0xA0 }, - { 32, 12, 0x8C }, - { 42, 12, 0xA8 }, - { 42, 12, 0xC0 }, - { 42, 12, 0xC8 }, - { 42, 12, 0xE0 }, - { 42, 12, 0xE8 }, - { 8, 8, 0xAE }, - { 8, 8, 0xAF }, + +// Table of move info icon offsets in graphics/interface_fr/menu.png +const struct MoveMenuInfoIcon gMoveMenuInfoIcons[] = +{ // { width, height, offset } + { 12, 12, 0x00 }, // Unused + { 32, 12, 0x20 }, // Normal icon + { 32, 12, 0x64 }, // Fight icon + { 32, 12, 0x60 }, // Flying icon + { 32, 12, 0x80 }, // Poison icon + { 32, 12, 0x48 }, // Ground icon + { 32, 12, 0x44 }, // Rock icon + { 32, 12, 0x6C }, // Bug icon + { 32, 12, 0x68 }, // Ghost icon + { 32, 12, 0x88 }, // Steel icon + { 32, 12, 0xA4 }, // ??? (Mystery) icon + { 32, 12, 0x24 }, // Fire icon + { 32, 12, 0x28 }, // Water icon + { 32, 12, 0x2C }, // Grass icon + { 32, 12, 0x40 }, // Electric icon + { 32, 12, 0x84 }, // Psychic icon + { 32, 12, 0x4C }, // Ice icon + { 32, 12, 0xA0 }, // Dragon icon + { 32, 12, 0x8C }, // Dark icon + { 42, 12, 0xA8 }, // -Type- icon + { 42, 12, 0xC0 }, // -Power- icon + { 42, 12, 0xC8 }, // -Accuracy- icon + { 42, 12, 0xE0 }, // -PP- icon + { 42, 12, 0xE8 }, // -Effect- icon + { 8, 8, 0xAE }, // Unused (Small white pokeball) + { 8, 8, 0xAF }, // Unused (Small dark pokeball) }; // Forward declarations @@ -118,14 +120,13 @@ extern void DrawWindowBorder(u8, u8, u8, u8, u8, u8); extern void sub_81980A8(u8, u8, u8, u8, u8, u8); extern u8 MoveMenuCursor(s8); extern u8 sub_8199134(s8, s8); -extern void sub_8199F74(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, void (*callback)(struct TextSubPrinter *, u16), u8 letterSpacing, u8 lineSpacing); extern void sub_8198C78(void); extern void task_free_buf_after_copying_tile_data_to_vram(u8 taskId); void sub_81971D0(void) { InitWindows(gUnknown_0860F098); - gUnknown_0203CD8C = 0xFF; + gStartMenuWindowId = 0xFF; gUnknown_0203CD8D = 0xFF; } @@ -191,8 +192,8 @@ void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonP void sub_81973A4(void) { - copy_textbox_border_tile_patterns_to_vram(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); - sub_809882C(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10); + LoadMessageBoxGfx(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); + LoadUserWindowBorderGfx(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10); } void NewMenuHelpers_DrawDialogueFrame(u8 windowId, bool8 copyToVram) @@ -410,7 +411,7 @@ void SetStandardWindowBorderStyle(u8 windowId, bool8 copyToVram) void sub_819786C(u8 windowId, bool8 copyToVram) { - copy_textbox_border_tile_patterns_to_vram(windowId, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); + LoadMessageBoxGfx(windowId, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); sub_8197B1C(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, 0xF); } @@ -471,22 +472,22 @@ u8 GetPlayerTextSpeed(void) u8 sub_81979C4(u8 a1) { - if (gUnknown_0203CD8C == 0xFF) - gUnknown_0203CD8C = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139); - return gUnknown_0203CD8C; + if (gStartMenuWindowId == 0xFF) + gStartMenuWindowId = sub_8198AA4(0, 0x16, 1, 7, (a1 * 2) + 2, 0xF, 0x139); + return gStartMenuWindowId; } u8 GetStartMenuWindowId(void) { - return gUnknown_0203CD8C; + return gStartMenuWindowId; } -void remove_start_menu_window_maybe(void) +void RemoveStartMenuWindow(void) { - if (gUnknown_0203CD8C != 0xFF) + if (gStartMenuWindowId != 0xFF) { - RemoveWindow(gUnknown_0203CD8C); - gUnknown_0203CD8C = 0xFF; + RemoveWindow(gStartMenuWindowId); + gStartMenuWindowId = 0xFF; } } @@ -1105,12 +1106,12 @@ void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 l printer.windowId = windowId; printer.fontId = fontId; - printer.fgColor = GetFontAttribute(fontId, 5); - printer.bgColor = GetFontAttribute(fontId, 6); - printer.shadowColor = GetFontAttribute(fontId, 7); - printer.fontColor_l = GetFontAttribute(fontId, 4); + printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); + printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); + printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); + printer.fontColor_l = GetFontAttribute(fontId, FONTATTR_COLOR_LOWNIBBLE); printer.letterSpacing = letterSpacing; - printer.lineSpacing = GetFontAttribute(fontId, 3); + printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); printer.x = left; printer.currentX = left; @@ -1127,7 +1128,7 @@ void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 l void sub_81989B8(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *a5) { - AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, 0), 1, GetFontAttribute(fontId, 2), lineHeight, itemCount, strs, a5); + AddItemMenuActionTextPrinters(windowId, fontId, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH), 1, GetFontAttribute(fontId, FONTATTR_LETTER_SPACING), lineHeight, itemCount, strs, a5); } void SetWindowTemplateFields(struct WindowTemplate *template, u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock) @@ -1141,7 +1142,7 @@ void SetWindowTemplateFields(struct WindowTemplate *template, u8 bg, u8 left, u8 template->baseBlock = baseBlock; } -struct WindowTemplate sub_8198A50(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock) +struct WindowTemplate CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock) { struct WindowTemplate template; SetWindowTemplateFields(&template, bg, left, top, width, height, paletteNum, baseBlock); @@ -1165,20 +1166,20 @@ void sub_8198AF8(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top printer.current_text_offset = gText_YesNo; printer.windowId = gUnknown_0203CD9F; printer.fontId = fontId; - printer.x = GetFontAttribute(fontId, 0) + left; + printer.x = GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + left; printer.y = top; printer.currentX = printer.x; printer.currentY = printer.y; - printer.fgColor = GetFontAttribute(fontId, 5); - printer.bgColor = GetFontAttribute(fontId, 6); - printer.shadowColor = GetFontAttribute(fontId, 7); - printer.fontColor_l = GetFontAttribute(fontId, 4); - printer.letterSpacing = GetFontAttribute(fontId, 2); - printer.lineSpacing = GetFontAttribute(fontId, 3); + printer.fgColor = GetFontAttribute(fontId, FONTATTR_COLOR_FOREGROUND); + printer.bgColor = GetFontAttribute(fontId, FONTATTR_COLOR_BACKGROUND); + printer.shadowColor = GetFontAttribute(fontId, FONTATTR_COLOR_SHADOW); + printer.fontColor_l = GetFontAttribute(fontId, FONTATTR_COLOR_LOWNIBBLE); + printer.letterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); + printer.lineSpacing = GetFontAttribute(fontId, FONTATTR_LINE_SPACING); AddTextPrinter(&printer, 0xFF, NULL); - sub_81983AC(gUnknown_0203CD9F, fontId, left, top, GetFontAttribute(fontId, 1), 2, initialCursorPos); + sub_81983AC(gUnknown_0203CD9F, fontId, left, top, GetFontAttribute(fontId, FONTATTR_MAX_LETTER_HEIGHT), 2, initialCursorPos); } void sub_8198C34(const struct WindowTemplate *window, u8 fontId, u16 baseTileNum, u8 paletteNum) @@ -1988,7 +1989,7 @@ void sub_8199F74(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 spee AddTextPrinter(&printer, speed, callback); } -void sub_819A024(u8 windowId, const u8 *src, u16 a2, u16 a3) +void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y) { int count = 0; while (gSaveBlock2Ptr->playerName[count] != EOS) @@ -1996,7 +1997,7 @@ void sub_819A024(u8 windowId, const u8 *src, u16 a2, u16 a3) StringExpandPlaceholders(gStringVar4, src); - PrintTextOnWindow(windowId, 1, gStringVar4, a2, a3, 0xFF, 0); + PrintTextOnWindow(windowId, 1, gStringVar4, x, y, 0xFF, 0); } //Screw this function, it's long and unreferenced and ugh @@ -2078,7 +2079,7 @@ void sub_819A080(struct UnkStruct_819A080 *a0, struct UnkStruct_819A080 *a1, u16 } } #else -__attribute__((naked)) +NAKED void sub_819A080(struct UnkStruct_819A080 *a0, struct UnkStruct_819A080 *a1, u16 a2, u16 a3, u16 a4, u16 a5, u16 a6, u16 a7) { asm("push {r4-r7,lr}\n\ @@ -2364,22 +2365,22 @@ void sub_819A2BC(u8 palOffset, u8 palId) void blit_move_info_icon(u8 windowId, u8 iconId, u16 x, u16 y) { - BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gUnknown_0860F0D4[iconId].unk3 * 32, 0, 0, 128, 128, x, y, gUnknown_0860F0D4[iconId].unk1, gUnknown_0860F0D4[iconId].unk2); + BlitBitmapRectToWindow(windowId, gFireRedMenuElements_Gfx + gMoveMenuInfoIcons[iconId].offset * 32, 0, 0, 128, 128, x, y, gMoveMenuInfoIcons[iconId].width, gMoveMenuInfoIcons[iconId].height); } -void sub_819A344(u8 a0, u8 *a1, u8 a2) +void sub_819A344(u8 a0, u8 *dest, u8 color) { s32 curFlag; s32 flagCount; u8 *endOfString; - u8 *string = a1; + u8 *string = dest; *(string++) = EXT_CTRL_CODE_BEGIN; *(string++) = EXT_CTRL_CODE_COLOR; - *(string++) = a2; + *(string++) = color; *(string++) = EXT_CTRL_CODE_BEGIN; *(string++) = EXT_CTRL_CODE_SHADOW; - *(string++) = a2 + 1; + *(string++) = color + 1; switch (a0) { diff --git a/src/menu_helpers.c b/src/menu_helpers.c new file mode 100644 index 000000000..178fbb5fa --- /dev/null +++ b/src/menu_helpers.c @@ -0,0 +1,455 @@ +#include "global.h" +#include "task.h" +#include "window.h" +#include "menu.h" +#include "menu_helpers.h" +#include "gpu_regs.h" +#include "bg.h" +#include "main.h" +#include "text.h" +#include "link.h" +#include "string_util.h" +#include "sound.h" +#include "mail.h" +#include "overworld.h" +#include "decompress.h" +#include "constants/songs.h" +#include "constants/items.h" +#include "constants/maps.h" + +extern bool32 sub_800B504(void); + +extern const u8 gBagSwapLineGfx[]; +extern const u8 gBagSwapLinePal[]; + +// this file's functions +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 +IWRAM_DATA static TaskFunc gUnknown_0300117C; + +// const rom data +static const struct OamData sOamData_859F4E8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_859F4F0[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_859F4F8[] = +{ + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sSpriteAnim_859F500[] = +{ + ANIMCMD_FRAME(0, 0, 1, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable_859F508[] = +{ + sSpriteAnim_859F4F0, + sSpriteAnim_859F4F8, + sSpriteAnim_859F500 +}; + +static const struct CompressedSpriteSheet gUnknown_0859F514 = +{ + gBagSwapLineGfx, 0x100, 109 +}; + +static const struct CompressedSpritePalette gUnknown_0859F51C = +{ + gBagSwapLinePal, 109 +}; + +static const struct SpriteTemplate gUnknown_0859F524 = +{ + .tileTag = 109, + .paletteTag = 109, + .oam = &sOamData_859F4E8, + .anims = sSpriteAnimTable_859F508, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +// code +void ResetVramOamAndBgCntRegs(void) +{ + SetGpuReg(REG_OFFSET_DISPCNT, 0); + SetGpuReg(REG_OFFSET_BG3CNT, 0); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + CpuFill16(0, (void*) VRAM, VRAM_SIZE); + CpuFill32(0, (void*) OAM, OAM_SIZE); + CpuFill16(0, (void*) PLTT, PLTT_SIZE); +} + +void ResetAllBgsCoordinates(void) +{ + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); +} + +void SetVBlankHBlankCallbacksToNull(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); +} + +void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 arg2, u8 arg3, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc) +{ + gUnknown_0203A140 = windowId; + sub_8197B1C(windowId, TRUE, arg2, arg3); + + if (string != gStringVar4) + StringExpandPlaceholders(gStringVar4, string); + + gTextFlags.flag_0 = 1; + AddTextPrinterParameterized(windowId, fontId, gStringVar4, textSpeed, NULL, 2, 1, 3); + gUnknown_0300117C = taskFunc; + gTasks[taskId].func = Task_ContinueTaskAfterMessagePrints; +} + +bool16 RunTextPrintersRetIsActive(u8 textPrinterId) +{ + RunTextPrinters(); + return IsTextPrinterActive(textPrinterId); +} + +static void Task_ContinueTaskAfterMessagePrints(u8 taskId) +{ + if (!RunTextPrintersRetIsActive(gUnknown_0203A140)) + gUnknown_0300117C(taskId); +} + +void sub_8121F68(u8 taskId, const struct YesNoFuncTable *data) +{ + gUnknown_0203A138 = *data; + gTasks[taskId].func = Task_CallYesOrNoCallback; +} + +void CreateYesNoMenuWithCallbacks(u8 taskId, const struct WindowTemplate *template, u8 arg2, u8 arg3, u8 arg4, u16 tileStart, u8 palette, const struct YesNoFuncTable *yesNo) +{ + CreateYesNoMenu(template, tileStart, palette, 0); + gUnknown_0203A138 = *yesNo; + gTasks[taskId].func = Task_CallYesOrNoCallback; +} + +static void Task_CallYesOrNoCallback(u8 taskId) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: + PlaySE(SE_SELECT); + gUnknown_0203A138.yesFunc(taskId); + break; + case 1: + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + gUnknown_0203A138.noFunc(taskId); + break; + } +} + +bool8 AdjustQuantityAccordingToDPadInput(s16 *arg0, u16 arg1) +{ + s16 valBefore = (*arg0); + + if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_UP) + { + (*arg0)++; + if ((*arg0) > arg1) + (*arg0) = 1; + + if ((*arg0) == valBefore) + { + return FALSE; + } + else + { + PlaySE(SE_SELECT); + return TRUE; + } + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) + { + (*arg0)--; + if ((*arg0) <= 0) + (*arg0) = arg1; + + if ((*arg0) == valBefore) + { + return FALSE; + } + else + { + PlaySE(SE_SELECT); + return TRUE; + } + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_RIGHT) + { + (*arg0) += 10; + if ((*arg0) > arg1) + (*arg0) = arg1; + + if ((*arg0) == valBefore) + { + return FALSE; + } + else + { + PlaySE(SE_SELECT); + return TRUE; + } + } + else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_LEFT) + { + (*arg0) -= 10; + if ((*arg0) <= 0) + (*arg0) = 1; + + if ((*arg0) == valBefore) + { + return FALSE; + } + else + { + PlaySE(SE_SELECT); + return TRUE; + } + } + + return FALSE; +} + +u8 GetLRKeysState(void) +{ + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.newKeys & L_BUTTON) + return 1; + if (gMain.newKeys & R_BUTTON) + return 2; + } + + return 0; +} + +u8 sub_812210C(void) +{ + if (gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR) + { + if (gMain.newAndRepeatedKeys & L_BUTTON) + return 1; + if (gMain.newAndRepeatedKeys & R_BUTTON) + return 2; + } + + return 0; +} + +bool8 sub_8122148(u16 itemId) +{ + if (itemId != ITEM_ENIGMA_BERRY) + return TRUE; + else if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRADE_CENTER) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRADE_CENTER)) + return FALSE; + else if (InUnionRoom() != TRUE) + return TRUE; + else + return FALSE; +} + +bool8 itemid_80BF6D8_mail_related(u16 itemId) +{ + if (is_c1_link_related_active() != TRUE && InUnionRoom() != TRUE) + return TRUE; + else if (ItemIsMail(itemId) != TRUE) + return TRUE; + else + return FALSE; +} + +bool8 sub_81221AC(void) +{ + if (is_c1_link_related_active() == TRUE || gReceivedRemoteLinkPlayers == 1) + return TRUE; + else + return FALSE; +} + +static bool8 sub_81221D0(void) +{ + if (!sub_81221AC()) + return FALSE; + else + return sub_8087598(); +} + +bool8 sub_81221EC(void) +{ + if (sub_81221D0() == TRUE) + return TRUE; + else if (sub_800B504() != TRUE) + return FALSE; + else + return TRUE; +} + +void sub_812220C(struct ItemSlot *slots, u8 count, u8 *arg2, u8 *usedSlotsCount, u8 maxUsedSlotsCount) +{ + u16 i; + struct ItemSlot *slots_ = slots; + + (*usedSlotsCount) = 0; + for (i = 0; i < count; i++) + { + if (slots_[i].itemId != ITEM_NONE) + (*usedSlotsCount)++; + } + + (*usedSlotsCount)++; + if ((*usedSlotsCount) > maxUsedSlotsCount) + *arg2 = maxUsedSlotsCount; + else + *arg2 = (*usedSlotsCount); +} + +void sub_812225C(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3) +{ + if ((*arg0) != 0 && (*arg0) + arg2 > arg3) + (*arg0) = arg3 - arg2; + + if ((*arg0) + (*arg1) >= arg3) + { + if (arg3 == 0) + (*arg1) = 0; + else + (*arg1) = arg3 - 1; + } +} + +void sub_8122298(u16 *arg0, u16 *arg1, u8 arg2, u8 arg3, u8 arg4) +{ + u8 i; + + if (arg4 % 2 != 0) + { + if ((*arg1) >= arg4 / 2) + { + for (i = 0; i < (*arg1) - (arg4 / 2); i++) + { + if ((*arg0) + arg2 == arg3) + break; + (*arg1)--; + (*arg0)++; + } + } + } + else + { + if ((*arg1) >= (arg4 / 2) + 1) + { + for (i = 0; i <= (*arg1) - (arg4 / 2); i++) + { + if ((*arg0) + arg2 == arg3) + break; + (*arg1)--; + (*arg0)++; + } + } + } +} + +void LoadListMenuArrowsGfx(void) +{ + LoadCompressedObjectPic(&gUnknown_0859F514); + LoadCompressedObjectPalette(&gUnknown_0859F51C); +} + +void sub_8122344(u8 *spriteIds, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + spriteIds[i] = CreateSprite(&gUnknown_0859F524, i * 16, 0, 0); + if (i != 0) + StartSpriteAnim(&gSprites[spriteIds[i]], 1); + + gSprites[spriteIds[i]].invisible = 1; + } +} + +void sub_81223B0(u8 *spriteIds, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + if (i == count - 1) + DestroySpriteAndFreeResources(&gSprites[spriteIds[i]]); + else + DestroySprite(&gSprites[spriteIds[i]]); + } +} + +void sub_81223FC(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) +{ + u8 i; + bool8 unknownBit = count & 0x80; + count &= ~(0x80); + + for (i = 0; i < count; i++) + { + if (i == count - 1 && unknownBit) + gSprites[spriteIds[i]].pos2.x = x - 8; + else + gSprites[spriteIds[i]].pos2.x = x; + + gSprites[spriteIds[i]].pos1.y = 1 + y; + } +} diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index b9760f522..a5e328e4a 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -252,8 +252,7 @@ static const u8 sTileBitAttributes[] = TILE_ATTRIBUTES(FALSE, FALSE, FALSE), // ? 0xEF }; -// only used as default case for checking jump landing in field_ground_effect. -bool8 ShouldDoJumpLandingDustEffect(u8 var) +bool8 MetatileBehavior_IsATile(u8 var) { return TRUE; } @@ -847,7 +846,7 @@ bool8 MetatileBehavior_IsBerryTreeSoil(u8 var) return FALSE; } -bool8 MetatileBehavior_IsAsh(u8 var) +bool8 MetatileBehavior_IsAshGrass(u8 var) { if (var == MB_ASHGRASS) return TRUE; diff --git a/src/mon_markings.c b/src/mon_markings.c new file mode 100644 index 000000000..7f320002d --- /dev/null +++ b/src/mon_markings.c @@ -0,0 +1,612 @@ +#include "global.h" +#include "dma3.h" +#include "graphics.h" +#include "main.h" +#include "window.h" +#include "list_menu.h" +#include "mon_markings.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" +#include "text_window.h" + +#define MENU_TEXT_SPRITE_X_OFFSET 32 + +// 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); + +// .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 const struct OamData gUnknown_0859EE7C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_0859EE84 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gUnknown_0859EE8C[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EE94[] = +{ + ANIMCMD_FRAME(1, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EE9C[] = +{ + ANIMCMD_FRAME(2, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EEA4[] = +{ + ANIMCMD_FRAME(3, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EEAC[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EEB4[] = +{ + ANIMCMD_FRAME(5, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EEBC[] = +{ + ANIMCMD_FRAME(6, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EEC4[] = +{ + ANIMCMD_FRAME(7, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EECC[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EED4[] = +{ + ANIMCMD_FRAME(9, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_0859EEDC[] = +{ + gUnknown_0859EE8C, + gUnknown_0859EE94, + gUnknown_0859EE9C, + gUnknown_0859EEA4, + gUnknown_0859EEAC, + gUnknown_0859EEB4, + gUnknown_0859EEBC, + gUnknown_0859EEC4, + gUnknown_0859EECC, + gUnknown_0859EED4, +}; + +static const union AnimCmd gUnknown_0859EF04[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF0C[] = +{ + ANIMCMD_FRAME(64, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_0859EF14[] = +{ + gUnknown_0859EF04, + gUnknown_0859EF0C, +}; + +static const struct OamData gUnknown_0859EF1C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd gUnknown_0859EF24[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF2C[] = +{ + ANIMCMD_FRAME(4, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF34[] = +{ + ANIMCMD_FRAME(8, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF3C[] = +{ + ANIMCMD_FRAME(12, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF44[] = +{ + ANIMCMD_FRAME(16, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF4C[] = +{ + ANIMCMD_FRAME(20, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF54[] = +{ + ANIMCMD_FRAME(24, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF5C[] = +{ + ANIMCMD_FRAME(28, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF64[] = +{ + ANIMCMD_FRAME(32, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF6C[] = +{ + ANIMCMD_FRAME(36, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF74[] = +{ + ANIMCMD_FRAME(40, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF7C[] = +{ + ANIMCMD_FRAME(44, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF84[] = +{ + ANIMCMD_FRAME(48, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF8C[] = +{ + ANIMCMD_FRAME(52, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF94[] = +{ + ANIMCMD_FRAME(56, 5), + ANIMCMD_END, +}; + +static const union AnimCmd gUnknown_0859EF9C[] = +{ + ANIMCMD_FRAME(60, 5), + ANIMCMD_END, +}; + +static const union AnimCmd *const gUnknown_0859EFA4[] = +{ + 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, +}; + +static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; + +void sub_811F90C(struct PokemonMarkMenu *ptr) +{ + sMenu = ptr; +} + +void sub_811F918(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)); +} + +bool8 sub_811F960(void) +{ + u16 i; + u8 *dest = sMenu->menuWindowSpriteTiles + 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; + case 14: + return FALSE; + } + + return TRUE; +} + +void sub_811FA90(void) +{ + sub_811F918(); + while (sub_811F960()); +} + +void sub_811FAA4(u8 markings, s16 x, s16 y) +{ + u16 i; + sMenu->cursorPos = 0; + sMenu->markings = markings; + for (i = 0; i < 4; i++) + sMenu->markingsArray[i] = (sMenu->markings >> i) & 1; + sub_811FC80(x, y, sMenu->baseTileTag, sMenu->basePaletteTag); +} + +void sub_811FAF8(void) +{ + u16 i; + + for (i = 0; i < 2; i++) + { + FreeSpriteTilesByTag(sMenu->baseTileTag + i); + FreeSpritePaletteByTag(sMenu->basePaletteTag + i); + } + for (i = 0; i < 2; i++) + { + if (!sMenu->menuWindowSprites[i]) + return; + DestroySprite(sMenu->menuWindowSprites[i]); + sMenu->menuWindowSprites[i] = NULL; + } + for (i = 0; i < 4; i++) + { + if (!sMenu->menuMarkingSprites[i]) + return; + DestroySprite(sMenu->menuMarkingSprites[i]); + sMenu->menuMarkingSprites[i] = NULL; + } + if (sMenu->unkSprite) + { + DestroySprite(sMenu->unkSprite); + sMenu->unkSprite = NULL; + } + if (sMenu->menuTextSprite) + { + DestroySprite(sMenu->menuTextSprite); + sMenu->menuTextSprite = NULL; + } +} + + +bool8 sub_811FBA4(void) +{ + u16 i; + + if (gMain.newKeys & DPAD_UP) + { + s8 pos; + PlaySE(SE_SELECT); + pos = --sMenu->cursorPos; + if (pos < 0) + sMenu->cursorPos = 5; + return TRUE; + } + + if (gMain.newKeys & DPAD_DOWN) + { + s8 pos; + PlaySE(SE_SELECT); + pos = ++sMenu->cursorPos; + if (pos > 5) + sMenu->cursorPos = 0; + return TRUE; + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + + switch (sMenu->cursorPos) + { + case 4: + sMenu->markings = 0; + for (i = 0; i < 4; i++) + sMenu->markings |= sMenu->markingsArray[i] << i; + return FALSE; + case 5: + return FALSE; + } + + sMenu->markingsArray[sMenu->cursorPos] = !sMenu->markingsArray[sMenu->cursorPos]; + return TRUE; + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + return FALSE; + } + + return TRUE; +} + +static void sub_811FC80(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 } + }; + + struct SpritePalette palettes[] = + { + { sMenu->framePalette, basePaletteTag }, + { gPokenavConditionMarker_Pal, basePaletteTag + 1}, + { NULL, 0 } + }; + + struct SpriteTemplate sprTemplate = + { + baseTileTag, + basePaletteTag, + &gUnknown_0859EE7C, + gUnknown_0859EF14, + NULL, + gDummySpriteAffineAnimTable, + TaskDummy7, + }; + + LoadSpriteSheets(sheets); + LoadSpritePalettes(palettes); + + for (i = 0; i < 2; i++) + { + spriteId = CreateSprite(&sprTemplate, x + 32, y + 32, 1); + if (spriteId != 64) + { + sMenu->menuWindowSprites[i] = &gSprites[spriteId]; + StartSpriteAnim(&gSprites[spriteId], i); + } + else + { + sMenu->menuWindowSprites[i] = NULL; + return; + } + } + + sMenu->menuWindowSprites[1]->pos1.y = y + 96; + + sprTemplate.tileTag++; + sprTemplate.paletteTag++; + sprTemplate.anims = gUnknown_0859EEDC; + sprTemplate.callback = sub_811FF40; + sprTemplate.oam = &gUnknown_0859EE84; + + for (i = 0; i < 4; i++) + { + spriteId = CreateSprite(&sprTemplate, x + 32, y + 16 + 16 * i, 0); + if (spriteId != 64) + { + sMenu->menuMarkingSprites[i] = &gSprites[spriteId]; + gSprites[spriteId].data[0] = i; + } + else + { + sMenu->menuMarkingSprites[i] = NULL; + return; + } + } + + sprTemplate.callback = SpriteCallbackDummy; + + spriteId = CreateSprite(&sprTemplate, 0, 0, 0); + + if (spriteId != 64) + { + sMenu->menuTextSprite = &gSprites[spriteId]; + sMenu->menuTextSprite->oam.shape = ST_OAM_SQUARE; + sMenu->menuTextSprite->oam.size = 2; + StartSpriteAnim(sMenu->menuTextSprite, 9); + sMenu->menuTextSprite->pos1.x = x + MENU_TEXT_SPRITE_X_OFFSET; + sMenu->menuTextSprite->pos1.y = y + 80; + CalcCenterToCornerVec(sMenu->menuTextSprite, 1, 2, 0); + } + else + { + sMenu->menuTextSprite = NULL; + } + + sprTemplate.callback = sub_811FF7C; + spriteId = CreateSprite(&sprTemplate, x + 12, 0, 0); + if(spriteId != 64) + { + sMenu->unkSprite = &gSprites[spriteId]; + sMenu->unkSprite->data[0] = y + 16; + StartSpriteAnim(sMenu->unkSprite, 8); + } + else + { + sMenu->unkSprite = NULL; + } + +} + +static void TaskDummy7(struct Sprite *sprite) +{ +} + +static void sub_811FF40(struct Sprite *sprite) +{ + if (sMenu->markingsArray[sprite->data[0]]) + StartSpriteAnim(sprite, 2 * sprite->data[0] + 1); + else + StartSpriteAnim(sprite, 2 * sprite->data[0]); +} + +static void sub_811FF7C(struct Sprite *sprite) +{ + sprite->pos1.y = (16 * sMenu->cursorPos) + sprite->data[0]; +} + +struct Sprite *sub_811FF94(u16 tileTag, u16 paletteTag, const u16 *palette) +{ + if (!palette) + palette = gUnknown_0859E65C; + return sub_811FFD4(tileTag, paletteTag, palette, 16); +} + +struct Sprite *sub_811FFB4(u16 tileTag, u16 paletteTag, const u16 *palette) +{ + if (!palette) + palette = gUnknown_0859E65C; + return sub_811FFD4(tileTag, paletteTag, palette, 1); +} + +static struct Sprite *sub_811FFD4(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) +{ + u8 spriteId; + struct SpriteTemplate sprTemplate; + struct SpriteSheet sheet = { gUnknown_0859E67C, 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; + + sheet.size = size * 0x80; + + LoadSpriteSheet(&sheet); + LoadSpritePalette(&sprPalette); + + spriteId = CreateSprite(&sprTemplate, 0, 0, 0); + if (spriteId != 64) + return &gSprites[spriteId]; + else + return NULL; +} + +void sub_8120084(u8 markings, void *dest) +{ + RequestDma3Copy(gUnknown_0859E67C + markings * 0x80, dest, 0x80, 0x10); +} diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c index 8a7671c5b..68f31584b 100644 --- a/src/mystery_event_menu.c +++ b/src/mystery_event_menu.c @@ -77,7 +77,7 @@ void CB2_InitMysteryEventMenu(void) FillWindowPixelBuffer(i, 0); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14); - sub_809882C(0, 1u, 0xD0u); + LoadUserWindowBorderGfx(0, 1u, 0xD0u); sub_81978B0(0xE0); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); @@ -121,7 +121,7 @@ static void CB2_MysteryEventMenu(void) PutWindowTilemap(0); CopyWindowToVram(0, 3); ShowBg(0); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gMain.state++; break; case 1: @@ -264,7 +264,7 @@ static void CB2_MysteryEventMenu(void) } break; case 15: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gMain.state++; break; case 16: diff --git a/src/naming_screen.c b/src/naming_screen.c index be306c765..f99d23bc3 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -11,7 +11,7 @@ #include "pokemon.h" #include "field_specials.h" #include "field_player_avatar.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "event_data.h" #include "constants/vars.h" #include "constants/songs.h" @@ -25,7 +25,7 @@ #include "menu.h" #include "text_window.h" #include "overworld.h" -#include "constants/map_objects.h" +#include "constants/event_objects.h" EWRAM_DATA static struct NamingScreenData *gNamingScreenData = NULL; extern u16 gKeyRepeatStartDelay; @@ -75,7 +75,7 @@ static const u8 gSpriteImage_858BCB8[] = INCBIN_U8("graphics/naming_screen/pc_ic static const u16 gUnknown_0858BD78[] = INCBIN_U16("graphics/naming_screen/0.gbapal"); static const u16 gUnknown_0858BD98[] = INCBIN_U16("graphics/naming_screen/1.gbapal"); -static const u8 *const gUnknown_0858BDB8[] = +static const u8 *const gUnknown_0858BDB8[] = { gText_PkmnTransferredSomeonesPC, gText_PkmnTransferredLanettesPC, @@ -85,7 +85,7 @@ static const u8 *const gUnknown_0858BDB8[] = static const u8 gUnknown_0858BDC8[] = _("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!"); -static const struct BgTemplate gUnknown_0858BE00[] = +static const struct BgTemplate gUnknown_0858BE00[] = { { .bg = 0, @@ -226,10 +226,10 @@ void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 monSpecies, u16 monGende gNamingScreenData->monPersonality = monPersonality; gNamingScreenData->destBuffer = destBuffer; gNamingScreenData->returnCallback = returnCallback; - + if (templateNum == 0) StartTimer1(); - + SetMainCallback2(C2_NamingScreen); } } @@ -316,15 +316,15 @@ static void sub_80E2FA4(void) static void NamingScreen_InitBGs(void) { u8 i; - + DmaClearLarge16(3, (void *)VRAM, VRAM_SIZE, 0x1000); DmaClear32(3, (void *)OAM, OAM_SIZE); DmaClear16(3, (void *)PLTT, PLTT_SIZE); - + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, gUnknown_0858BE00, 4); - + ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -333,21 +333,21 @@ static void NamingScreen_InitBGs(void) ChangeBgY(2, 0, 0); ChangeBgX(3, 0, 0); ChangeBgY(3, 0, 0); - + sub_81971D0(); sub_8197200(); - + for (i = 0; i < 5; i++) gNamingScreenData->windows[i] = AddWindow(&gUnknown_0858BE10[i]); - + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0xC, 0x8)); - + SetBgTilemapBuffer(1, gNamingScreenData->tilemapBuffer1); SetBgTilemapBuffer(2, gNamingScreenData->tilemapBuffer2); SetBgTilemapBuffer(3, gNamingScreenData->tilemapBuffer3); - + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 0x20, 0x20); FillBgTilemapBufferRect_Palette0(3, 0, 0, 0, 0x20, 0x20); @@ -511,7 +511,7 @@ static bool8 MainState_WaitFadeOutAndExit(void) static void DisplaySentToPCMessage(void) { u8 stringToDisplay = 0; - + if (!sub_813B260()) { StringCopy(gStringVar1, GetBoxNamePtr(VarGet(VAR_STORAGE_UNKNOWN))); @@ -524,10 +524,10 @@ static void DisplaySentToPCMessage(void) StringCopy(gStringVar3, GetBoxNamePtr(get_unknown_box_id())); stringToDisplay = 2; } - + if (FlagGet(FLAG_SYS_PC_LANETTE)) stringToDisplay++; - + StringExpandPlaceholders(gStringVar4, gUnknown_0858BDB8[stringToDisplay]); NewMenuHelpers_DrawDialogueFrame(0, 0); gTextFlags.flag_0 = TRUE; @@ -538,10 +538,10 @@ static void DisplaySentToPCMessage(void) static bool8 sub_80E3604(void) { RunTextPrinters(); - + if (!IsTextPrinterActive(0) && (gMain.newKeys & A_BUTTON)) gNamingScreenData->state = MAIN_STATE_BEGIN_FADE_OUT; - + return FALSE; } @@ -562,17 +562,17 @@ static bool8 MainState_WaitPageSwap(void) s16 cursorX; s16 cursorY; bool32 var3; - + if (IsPageSwapAnimNotInProgress()) { - + GetCursorPos(&cursorX, &cursorY); var3 = (cursorX == GetCurrentPageColumnCount()); - + gNamingScreenData->state = MAIN_STATE_HANDLE_INPUT; gNamingScreenData->currentPage++; gNamingScreenData->currentPage %= 3; - + if (var3) { cursorX = GetCurrentPageColumnCount(); @@ -582,7 +582,7 @@ static bool8 MainState_WaitPageSwap(void) if (cursorX >= GetCurrentPageColumnCount()) cursorX = GetCurrentPageColumnCount() - 1; } - + SetCursorPos(cursorX, cursorY); sub_80E4E5C(); SetInputState(INPUT_STATE_ENABLED); @@ -603,7 +603,7 @@ static bool8 PageSwapAnimState_1(struct Task *); static bool8 PageSwapAnimState_2(struct Task *); static bool8 PageSwapAnimState_Done(struct Task *); -static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = +static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = { PageSwapAnimState_Init, PageSwapAnimState_1, @@ -754,7 +754,7 @@ static void Task_80E39BC(u8 taskId) task->data[3] += task->data[4]; task->data[6] += task->data[4]; } - + if (task->data[3] == 16 && task->data[6] == 22) { task->data[4] = -4; @@ -893,7 +893,7 @@ static void CursorInit(void) static void SetCursorPos(s16 x, s16 y) { struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId]; - + if (x < gUnknown_0858BEA0[sub_80E3274()]) cursorSprite->pos1.x = gUnknown_0858BEA3[x + sub_80E3274() * 8] + 38; else @@ -909,7 +909,7 @@ static void SetCursorPos(s16 x, s16 y) static void GetCursorPos(s16 *x, s16 *y) { struct Sprite *cursorSprite = &gSprites[gNamingScreenData->cursorSpriteId]; - + *x = cursorSprite->data[0]; *y = cursorSprite->data[1]; } @@ -1133,7 +1133,7 @@ static void CreateInputTargetIcon(void) static void TaskDummy2(void) { - + } static void NamingScreen_CreatePlayerIcon(void) @@ -1142,7 +1142,7 @@ static void NamingScreen_CreatePlayerIcon(void) u8 spriteId; rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, gNamingScreenData->monSpecies); - spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x25, 0); + spriteId = AddPseudoEventObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x25, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], 4); } @@ -1160,7 +1160,7 @@ static void NamingScreen_CreateMonIcon(void) { u8 spriteId; - sub_80D2F04(); + LoadMonIconPalettes(); spriteId = CreateMonIcon(gNamingScreenData->monSpecies, SpriteCallbackDummy, 0x38, 0x28, 0, gNamingScreenData->monPersonality, 1); gSprites[spriteId].oam.priority = 3; } @@ -1169,7 +1169,7 @@ static void NamingScreen_CreateWandaDadIcon(void) { u8 spriteId; - spriteId = AddPseudoFieldObject(MAP_OBJ_GFX_MAN_1, SpriteCallbackDummy, 0x38, 0x25, 0); + spriteId = AddPseudoEventObject(EVENT_OBJ_GFX_MAN_1, SpriteCallbackDummy, 0x38, 0x25, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], 4); } @@ -1331,7 +1331,7 @@ static void InputState_Disabled(struct Task *task) static void InputState_Enabled(struct Task *task) { task->tKeyboardEvent = 0; - + if (gMain.newKeys & A_BUTTON) task->tKeyboardEvent = KBEVENT_PRESSED_A; else if (gMain.newKeys & B_BUTTON) @@ -1454,7 +1454,7 @@ static void sub_80E4894(void) static void sub_80E48E8(void) { u8 buffer[0x20]; - + StringCopy(buffer, gSpeciesNames[gNamingScreenData->monSpecies]); StringAppendN(buffer, gNamingScreenData->template->title, 15); FillWindowPixelBuffer(gNamingScreenData->windows[3], 0x11); @@ -1492,10 +1492,10 @@ static void sub_80E498C(void) static void TaskDummy3(void) { - + } -static const u8 sGenderColors[2][3] = +static const u8 sGenderColors[2][3] = { {0, 9, 8}, {0, 5, 4} @@ -1505,7 +1505,7 @@ static void sub_80E49BC(void) { u8 genderSymbol[2]; bool8 isFemale = FALSE; - + StringCopy(genderSymbol, gText_MaleSymbol); if (gNamingScreenData->monGender != MON_GENDERLESS) @@ -1575,7 +1575,7 @@ static bool8 sub_80E4B54(void) sub_80E4D10(); CopyBgTilemapBufferToVram(3); PlaySE(SE_SELECT); - + if (GetPreviousTextCaretPosition() != gNamingScreenData->template->maxChars - 1) return FALSE; else @@ -1633,7 +1633,7 @@ static void sub_80E4CF8(u8 bg, const void *src) static void nullsub_10(u8 a1, u8 a2) { - + } static void sub_80E4D10(void) @@ -1643,18 +1643,18 @@ static void sub_80E4D10(void) u16 unk2; u8 maxChars = gNamingScreenData->template->maxChars; u16 unk = gNamingScreenData->inputCharBaseXPos - 0x40; - + FillWindowPixelBuffer(gNamingScreenData->windows[2], 0x11); - + for (i = 0; i < maxChars; i++) { temp[0] = gNamingScreenData->textBuffer[i]; temp[1] = gExpandedPlaceholder_Empty[0]; unk2 = (sub_80E503C(temp[0]) == 1) ? 2 : 0; - + PrintTextOnWindow(gNamingScreenData->windows[2], 1, temp, i * 8 + unk + unk2, 1, 0xFF, NULL); } - + sub_80E498C(); CopyWindowToVram(gNamingScreenData->windows[2], 2); PutWindowTilemap(gNamingScreenData->windows[2]); @@ -1674,12 +1674,12 @@ static const struct TextColorThing sUnkColorStruct = } }; -static const u8 sFillValues[3] = +static const u8 sFillValues[3] = { 0xEE, 0xDD, 0xFF }; -static const u8 *const sUnkColors[3] = +static const u8 *const sUnkColors[3] = { sUnkColorStruct.colors[1], sUnkColorStruct.colors[0], @@ -1689,18 +1689,18 @@ static const u8 *const sUnkColors[3] = static void sub_80E4DE4(u8 window, u8 a1) { u8 i; - + FillWindowPixelBuffer(window, sFillValues[a1]); - + for (i = 0; i < 4; i++) { box_print(window, 1, 0, i * 16 + 1, sUnkColors[a1], 0, gUnknown_0858C198[a1][i]); } - + PutWindowTilemap(window); } -static const u8 *const gUnknown_0858BF98[] = +static const u8 *const gUnknown_0858BF98[] = { gUnknown_08DD4620, gUnknown_08DD46E0, @@ -1714,7 +1714,7 @@ static void sub_80E4E5C(void) u8 unk3; u8 bg1Priority = GetGpuReg(REG_OFFSET_BG1CNT) & 3; u8 bg2Priority = GetGpuReg(REG_OFFSET_BG2CNT) & 3; - + if (bg1Priority > bg2Priority) { unk1 = 1; @@ -1727,7 +1727,7 @@ static void sub_80E4E5C(void) unk2 = 2; unk3 = gNamingScreenData->windows[1]; } - + sub_80E4CF8(unk1, gUnknown_0858BF98[gNamingScreenData->currentPage]); sub_80E4DE4(unk3, sub_80E3254()); nullsub_10(unk1, sub_80E3254()); @@ -1737,7 +1737,7 @@ static void sub_80E4E5C(void) static void sub_80E4EF0(void) { const u8 color[3] = { 15, 1, 2 }; - + FillWindowPixelBuffer(gNamingScreenData->windows[4], 0xFF); box_print(gNamingScreenData->windows[4], 0, 2, 1, color, 0, gText_MoveOkBack); PutWindowTilemap(gNamingScreenData->windows[4]); @@ -1787,7 +1787,7 @@ static void sub_80E501C(void) static bool8 sub_80E503C(u8 character) { u8 i; - + for (i = 0; gUnknown_0858BDC8[i] != EOS; i++) { if (character == gUnknown_0858BDC8[i]) @@ -1987,20 +1987,20 @@ static const struct SpriteFrameImage gUnknown_0858C080[] = {gSpriteImage_858BCB8, sizeof(gSpriteImage_858BCB8)}, }; -static const union AnimCmd gSpriteAnim_858C090[] = +static const union AnimCmd gSpriteAnim_858C090[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_JUMP(0) }; -static const union AnimCmd gSpriteAnim_858C098[] = +static const union AnimCmd gSpriteAnim_858C098[] = { ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_858C0A4[] = +static const union AnimCmd gSpriteAnim_858C0A4[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(1, 2), @@ -2023,7 +2023,7 @@ static const union AnimCmd *const gSpriteAnimTable_858C0BC[] = gSpriteAnim_858C0A4 }; -static const struct SpriteTemplate gUnknown_0858C0C0 = +static const struct SpriteTemplate gUnknown_0858C0C0 = { .tileTag = 0x0002, .paletteTag = 0x0004, @@ -2034,7 +2034,7 @@ static const struct SpriteTemplate gUnknown_0858C0C0 = .callback = sub_80E4084 }; -static const struct SpriteTemplate gUnknown_0858C0D8 = +static const struct SpriteTemplate gUnknown_0858C0D8 = { .tileTag = 0x0003, .paletteTag = 0x0001, @@ -2045,7 +2045,7 @@ static const struct SpriteTemplate gUnknown_0858C0D8 = .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_0858C0F0 = +static const struct SpriteTemplate gUnknown_0858C0F0 = { .tileTag = 0x0004, .paletteTag = 0x0004, @@ -2056,7 +2056,7 @@ static const struct SpriteTemplate gUnknown_0858C0F0 = .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_0858C108 = +static const struct SpriteTemplate gUnknown_0858C108 = { .tileTag = 0x0000, .paletteTag = 0x0006, @@ -2067,7 +2067,7 @@ static const struct SpriteTemplate gUnknown_0858C108 = .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_0858C120 = +static const struct SpriteTemplate gUnknown_0858C120 = { .tileTag = 0x0001, .paletteTag = 0x0007, @@ -2078,7 +2078,7 @@ static const struct SpriteTemplate gUnknown_0858C120 = .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate gUnknown_0858C138 = +static const struct SpriteTemplate gUnknown_0858C138 = { .tileTag = 0x0007, .paletteTag = 0x0005, @@ -2089,7 +2089,7 @@ static const struct SpriteTemplate gUnknown_0858C138 = .callback = sub_80E3B30 }; -static const struct SpriteTemplate sSpriteTemplate_InputArrow = +static const struct SpriteTemplate sSpriteTemplate_InputArrow = { .tileTag = 0x000A, .paletteTag = 0x0003, @@ -2100,7 +2100,7 @@ static const struct SpriteTemplate sSpriteTemplate_InputArrow = .callback = sub_80E3C20 }; -static const struct SpriteTemplate sSpriteTemplate_Underscore = +static const struct SpriteTemplate sSpriteTemplate_Underscore = { .tileTag = 0x000B, .paletteTag = 0x0003, @@ -2111,7 +2111,7 @@ static const struct SpriteTemplate sSpriteTemplate_Underscore = .callback = sub_80E3C6C }; -static const struct SpriteTemplate gUnknown_0858C180 = +static const struct SpriteTemplate gUnknown_0858C180 = { .tileTag = 0xFFFF, .paletteTag = 0x0000, @@ -2122,7 +2122,7 @@ static const struct SpriteTemplate gUnknown_0858C180 = .callback = SpriteCallbackDummy }; -static const u8* const gUnknown_0858C198[][4] = +static const u8* const gUnknown_0858C198[][4] = { { gUnknown_0862B88D, diff --git a/src/new_game.c b/src/new_game.c index 89771e92b..8b8436d10 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -20,8 +20,10 @@ #include "tv.h" #include "coins.h" #include "text.h" +#include "overworld.h" +#include "mail.h" +#include "battle_records.h" -extern u8 gPlayerPartyCount; extern u8 gDifferentSaveFile; extern u16 gSaveFileStatus; extern u8 gUnknown_030060B0; @@ -29,19 +31,13 @@ extern u8 gUnknown_030060B0; // TODO: replace those declarations with file headers extern u16 GetGeneratedTrainerIdLower(void); extern void ClearContestWinnerPicsInContestHall(void); -extern void Overworld_SetWarpDestination(s8 mapBank, s8 mapNo, s8 warpNo, s8 xPos, s8 yPos); -extern void warp_in(void); extern void sub_80BB358(void); extern void ResetBagScrollPositions(void); extern void ResetPokedex(void); -extern void sub_8084400(void); -extern void ClearMailData(void); extern void ResetGabbyAndTy(void); extern void ResetSecretBases(void); extern void ResetLinkContestBoolean(void); -extern void ResetGameStats(void); extern void sub_8052DA8(void); -extern void InitLinkBattleRecords(void); extern void ResetPokemonStorageSystem(void); extern void ClearBag(void); extern void NewGameInitPCItems(void); @@ -58,8 +54,21 @@ extern void ResetContestLinkResults(void); extern void ResetPokeJumpResults(void); extern void SetBerryPowder(u32* powder, u32 newValue); -extern u8 EventScript_2715DE[]; +extern const u8 EventScript_2715DE[]; +// this file's functions +static void ClearFrontierRecord(void); +static void WarpToTruck(void); +static void ResetMiniGamesResults(void); + +// const rom data +static const struct ContestWinner sContestWinnerPicDummy = +{ + .monName = _(""), + .trainerName = _("") +}; + +// code void WriteUnalignedWord(u32 var, u8 *dataPtr) { dataPtr[0] = var; @@ -80,14 +89,14 @@ void CopyUnalignedWord(u8 *copyTo, u8 *copyFrom) copyTo[i] = copyFrom[i]; } -void InitPlayerTrainerId(void) +static void InitPlayerTrainerId(void) { u32 trainerId = (Random() << 0x10) | GetGeneratedTrainerIdLower(); WriteUnalignedWord(trainerId, gSaveBlock2Ptr->playerTrainerId); } // L=A isnt set here for some reason. -void SetDefaultOptions(void) +static void SetDefaultOptions(void) { gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; gSaveBlock2Ptr->optionsWindowFrameType = 0; @@ -97,38 +106,31 @@ void SetDefaultOptions(void) gSaveBlock2Ptr->regionMapZoom = FALSE; } -void ClearPokedexFlags(void) +static void ClearPokedexFlags(void) { gUnknown_030060B0 = 0; memset(&gSaveBlock2Ptr->pokedex.owned, 0, sizeof(gSaveBlock2Ptr->pokedex.owned)); memset(&gSaveBlock2Ptr->pokedex.seen, 0, sizeof(gSaveBlock2Ptr->pokedex.seen)); } -const struct ContestWinner gContestWinnerPicDummy = { - .monName = _(""), - .trainerName = _("") -}; - void ClearAllContestWinnerPics(void) { s32 i; ClearContestWinnerPicsInContestHall(); for (i = 8; i < 13; i++) - gSaveBlock1Ptr->contestWinners[i] = gContestWinnerPicDummy; + gSaveBlock1Ptr->contestWinners[i] = sContestWinnerPicDummy; } -void sub_8084400(void) +static void ClearFrontierRecord(void) { - // probably clearing one struct for battle frontier - CpuFill32(0, gSaveBlock2Ptr->field_64C, 2272); + CpuFill32(0, &gSaveBlock2Ptr->frontier, sizeof(gSaveBlock2Ptr->frontier)); - // those look like strings - gSaveBlock2Ptr->field_EE1 = 0xFF; - gSaveBlock2Ptr->field_EE9 = 0xFF; + gSaveBlock2Ptr->frontier.field_EE1[0][0] = EOS; + gSaveBlock2Ptr->frontier.field_EE1[1][0] = EOS; } -void WarpToTruck(void) +static void WarpToTruck(void) { Overworld_SetWarpDestination(25, 40, -1, -1, -1); // inside of truck warp_in(); @@ -160,7 +162,7 @@ void NewGameInitData(void) ZeroPlayerPartyMons(); ZeroEnemyPartyMons(); ResetPokedex(); - sub_8084400(); + ClearFrontierRecord(); ClearSav1(); ClearMailData(); gSaveBlock2Ptr->specialSaveWarp = 0; @@ -178,7 +180,7 @@ void NewGameInitData(void) ResetLinkContestBoolean(); ResetGameStats(); ClearAllContestWinnerPics(); - InitLinkBattleRecords(); + ClearPlayerLinkBattleRecords(); InitSeedotSizeRecord(); InitLotadSizeRecord(); gPlayerPartyCount = 0; @@ -210,7 +212,7 @@ void NewGameInitData(void) ResetContestLinkResults(); } -void ResetMiniGamesResults(void) +static void ResetMiniGamesResults(void) { CpuFill16(0, &gSaveBlock2Ptr->berryCrush, sizeof(struct BerryCrush)); SetBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, 0); diff --git a/src/option_menu.c b/src/option_menu.c index cbbe14b77..fc0c0c24e 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -146,23 +146,7 @@ void CB2_InitOptionMenu(void) gMain.state++; break; case 1: - { - u8 *addr; - u32 size; - - addr = (u8 *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaClearLarge16(3, (void*)(VRAM), VRAM_SIZE, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); SetGpuReg(REG_OFFSET_DISPCNT, 0); @@ -189,7 +173,6 @@ void CB2_InitOptionMenu(void) ShowBg(0); ShowBg(1); gMain.state++; - } break; case 2: ResetPaletteFade(); @@ -252,7 +235,7 @@ void CB2_InitOptionMenu(void) break; } case 11: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); SetVBlankCallback(VBlankCB); SetMainCallback2(MainCB2); return; @@ -361,7 +344,7 @@ static void Task_OptionMenuSave(u8 taskId) gSaveBlock2Ptr->optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE]; gSaveBlock2Ptr->optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE]; - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskId].func = Task_OptionMenuFadeOut; } diff --git a/src/overworld.c b/src/overworld.c index 6ee338cb8..d85af9e4d 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -10,9 +10,7 @@ #include "field_control_avatar.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "field_ground_effect.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "event_object_movement.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" @@ -38,6 +36,7 @@ #include "roamer.h" // #include "rotating_gate.h" #include "safari_zone.h" +#include "save.h" #include "script.h" // #include "script_pokemon_80C4.h" #include "secret_base.h" @@ -58,6 +57,7 @@ #include "malloc.h" #include "gpu_regs.h" #include "link_rfu.h" +#include "constants/map_types.h" // event scripts extern const u8 EventScript_WhiteOut[]; @@ -82,36 +82,32 @@ extern const u8 gUnknown_082774EF[]; extern const u8 gUnknown_08277509[]; // vars -extern const struct MapData *const gMapAttributes[]; +extern const struct MapLayout *const gMapLayouts[]; extern const struct MapHeader *const *const gMapGroups[]; extern const s32 gMaxFlashLevel; extern const u16 gUnknown_82EC7C4[]; -extern u16 gSaveFileStatus; -extern u16 gUnknown_03005DA8; -extern u8 *gUnknown_03005DA0; -extern u8 *gUnknown_03005D9C; -extern u8 *gUnknown_03005DA4; -extern bool8 (*gUnknown_03005DB0)(void); -extern u8 gUnknown_03005DB4; -extern u8 gFieldLinkPlayerCount; -extern MainCallback gFieldCallback; +u16 gUnknown_03005DA8; +MainCallback gFieldCallback; +bool8 (*gFieldCallback2)(void); +u8 gUnknown_03005DB4; +u8 gFieldLinkPlayerCount; // functions extern void HealPlayerParty(void); extern void move_tilemap_camera_to_upper_left_corner(void); extern void cur_mapheader_run_tileset_funcs_after_some_cpuset(void); extern void DrawWholeMapView(void); -extern void copy_map_tileset1_tileset2_to_vram(const struct MapData *); -extern void apply_map_tileset1_tileset2_palette(const struct MapData *); +extern void copy_map_tileset1_tileset2_to_vram(const struct MapLayout *); +extern void apply_map_tileset1_tileset2_palette(const struct MapLayout *); extern void ResetCyclingRoadChallengeData(void); extern void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey); extern void mapheader_run_script_with_tag_x5(void); extern void ResetFieldTasksArgs(void); extern void sub_80A0A2C(void); extern void not_trainer_hill_battle_pyramid(void); -extern void apply_map_tileset2_palette(const struct MapData *); -extern void copy_map_tileset2_to_vram_2(const struct MapData *); +extern void apply_map_tileset2_palette(const struct MapLayout *); +extern void copy_map_tileset2_to_vram_2(const struct MapLayout *); extern void prev_quest_postbuffer_cursor_backup_reset(void); extern void ShowMapNamePopup(void); extern bool32 InTrainerHill(void); @@ -140,7 +136,6 @@ extern void trainer_hill_map_load_related(void); extern void sub_8087D74(void); extern void battle_pyramid_map_load_related(u8); extern void sub_80B00E8(u8); -extern void UpdateTVScreensOnMap(u32, u32); extern void sub_80E9238(u8); extern void sub_81A3908(void); extern void sub_81AA2F8(void); @@ -149,8 +144,8 @@ extern void sub_80EDB44(void); extern void sub_81D64C0(void); extern void sub_81BE6AC(void); extern void sub_8098128(void); -extern void copy_map_tileset1_to_vram(const struct MapData *); -extern void copy_map_tileset2_to_vram(const struct MapData *); +extern void copy_map_tileset1_to_vram(const struct MapLayout *); +extern void copy_map_tileset2_to_vram(const struct MapLayout *); extern void FieldUpdateBgTilemapScroll(void); extern void TransferTilesetAnimsBuffer(void); extern bool32 sub_81D5F48(void); @@ -161,7 +156,7 @@ extern void FieldEffectActiveListClear(void); extern void SetUpFieldTasks(void); extern void sub_81BE6B8(void); extern void sub_80AAFA4(void); -extern void sub_809FA9C(void); +extern void ShowStartMenu(void); extern void sub_80AEE84(void); extern void mapldr_default(void); extern void npc_paltag_set_load(u8); @@ -175,7 +170,7 @@ extern const u8* sub_809C2C8(struct MapPosition *a1, u8, u8); extern u8 *sub_809D0F4(void*); extern u8 sub_808BD6C(u8); extern u8 sub_808BD7C(u8); -extern void sub_80979D4(struct Sprite*, u8); +extern void UpdateEventObjectSpriteVisibility(struct Sprite*, u8); // this file's functions static void Overworld_ResetStateAfterWhiteOut(void); @@ -210,7 +205,7 @@ static void sub_8086C90(void); static void sub_8086FA0(u16); static void sub_8086F38(u16*, s32); static u8 npc_something3(u8 a1, u8 a2); -static u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y); +static u8 LinkPlayerDetectCollision(u8 selfEventObjId, u8 a2, s16 x, s16 y); static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion); static void sub_8087878(u8 linkPlayerId, u16 *x, u16 *y); static u8 sub_80878A0(u8 linkPlayerId); @@ -218,15 +213,15 @@ static u8 sub_80878C0(u8 linkPlayerId); static s32 sub_80878E4(u8 linkPlayerId); static u8 GetLinkPlayerIdAt(s16 x, s16 y); static void sub_808796C(u8 linkPlayerId, u8 a2); -static void ZeroMapObject(struct MapObject *mapObj); -static void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4); -static void InitLinkPlayerMapObjectPos(struct MapObject *mapObj, s16 x, s16 y); +static void ZeroEventObject(struct EventObject *eventObj); +static void SpawnLinkPlayerEventObject(u8 linkPlayerId, s16 x, s16 y, u8 a4); +static void InitLinkPlayerEventObjectPos(struct EventObject *eventObj, s16 x, s16 y); static void sub_80877DC(u8 linkPlayerId, u8 a2); static void sub_808780C(u8 linkPlayerId); static u8 sub_8087858(u8 linkPlayerId); static void sub_8087584(void); static u32 sub_8087690(void); -static void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj); +static void ZeroLinkPlayerEventObject(struct LinkPlayerEventObject *linkPlayerEventObj); static const u8 *sub_80873B4(struct UnkStruct_8054FF8 *a1); static u16 sub_8087480(const u8 *script); static void sub_8087510(void); @@ -273,7 +268,7 @@ EWRAM_DATA static u16 sLastMapSectionId = 0; EWRAM_DATA static struct UnkPlayerStruct sUnknown_02032300 = {0}; EWRAM_DATA static u16 sAmbientCrySpecies = 0; EWRAM_DATA static bool8 sIsAmbientCryWaterMon = FALSE; -EWRAM_DATA struct LinkPlayerMapObject gLinkPlayerMapObjects[4] = {0}; +EWRAM_DATA struct LinkPlayerEventObject gLinkPlayerEventObjects[4] = {0}; // const rom data static const struct WarpData sDummyWarpData = @@ -358,22 +353,22 @@ static const struct ScanlineEffectParams gUnknown_08339DBC = 0, }; -static u8 sub_80879D8(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_80879F8(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_80879FC(struct LinkPlayerMapObject *, struct MapObject *, u8); +static u8 sub_80879D8(struct LinkPlayerEventObject *, struct EventObject *, u8); +static u8 sub_80879F8(struct LinkPlayerEventObject *, struct EventObject *, u8); +static u8 sub_80879FC(struct LinkPlayerEventObject *, struct EventObject *, u8); -static u8 (*const gUnknown_08339DC8[])(struct LinkPlayerMapObject *, struct MapObject *, u8) = +static u8 (*const gUnknown_08339DC8[])(struct LinkPlayerEventObject *, struct EventObject *, u8) = { sub_80879D8, sub_80879F8, sub_80879FC, }; -static u8 sub_8087A1C(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_8087A20(struct LinkPlayerMapObject *, struct MapObject *, u8); -static u8 sub_8087A88(struct LinkPlayerMapObject *, struct MapObject *, u8); +static u8 sub_8087A1C(struct LinkPlayerEventObject *, struct EventObject *, u8); +static u8 sub_8087A20(struct LinkPlayerEventObject *, struct EventObject *, u8); +static u8 sub_8087A88(struct LinkPlayerEventObject *, struct EventObject *, u8); -static u8 (*const gUnknown_08339DD4[])(struct LinkPlayerMapObject *, struct MapObject *, u8) = +static u8 (*const gUnknown_08339DD4[])(struct LinkPlayerEventObject *, struct EventObject *, u8) = { sub_8087A1C, sub_8087A20, @@ -388,10 +383,10 @@ static u8 (*const gUnknown_08339DD4[])(struct LinkPlayerMapObject *, struct MapO sub_8087A88, }; -static void sub_8087AA0(struct LinkPlayerMapObject *, struct MapObject *); -static void sub_8087AA8(struct LinkPlayerMapObject *, struct MapObject *); +static void sub_8087AA0(struct LinkPlayerEventObject *, struct EventObject *); +static void sub_8087AA8(struct LinkPlayerEventObject *, struct EventObject *); -static void (*const gUnknown_08339E00[])(struct LinkPlayerMapObject *, struct MapObject *) = +static void (*const gUnknown_08339E00[])(struct LinkPlayerEventObject *, struct EventObject *) = { sub_8087AA0, sub_8087AA8, @@ -507,55 +502,55 @@ void ApplyNewEncryptionKeyToGameStats(u32 newKey) ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->gameStats[i], newKey); } -void LoadMapObjTemplatesFromHeader(void) +void LoadEventObjTemplatesFromHeader(void) { // Clear map object templates - CpuFill32(0, gSaveBlock1Ptr->mapObjectTemplates, sizeof(gSaveBlock1Ptr->mapObjectTemplates)); + CpuFill32(0, gSaveBlock1Ptr->eventObjectTemplates, sizeof(gSaveBlock1Ptr->eventObjectTemplates)); // Copy map header events to save block - CpuCopy32(gMapHeader.events->mapObjects, - gSaveBlock1Ptr->mapObjectTemplates, - gMapHeader.events->mapObjectCount * sizeof(struct MapObjectTemplate)); + CpuCopy32(gMapHeader.events->eventObjects, + gSaveBlock1Ptr->eventObjectTemplates, + gMapHeader.events->eventObjectCount * sizeof(struct EventObjectTemplate)); } -void LoadSaveblockMapObjScripts(void) +void LoadSaveblockEventObjScripts(void) { - struct MapObjectTemplate *mapHeaderObjTemplates = gMapHeader.events->mapObjects; - struct MapObjectTemplate *savObjTemplates = gSaveBlock1Ptr->mapObjectTemplates; + struct EventObjectTemplate *mapHeaderObjTemplates = gMapHeader.events->eventObjects; + struct EventObjectTemplate *savObjTemplates = gSaveBlock1Ptr->eventObjectTemplates; s32 i; for (i = 0; i < 64; i++) savObjTemplates[i].script = mapHeaderObjTemplates[i].script; } -void Overworld_SetMapObjTemplateCoords(u8 localId, s16 x, s16 y) +void Overworld_SetEventObjTemplateCoords(u8 localId, s16 x, s16 y) { s32 i; - struct MapObjectTemplate *savObjTemplates = gSaveBlock1Ptr->mapObjectTemplates; + struct EventObjectTemplate *savObjTemplates = gSaveBlock1Ptr->eventObjectTemplates; for (i = 0; i < 64; i++) { - struct MapObjectTemplate *mapObjectTemplate = &savObjTemplates[i]; - if (mapObjectTemplate->localId == localId) + struct EventObjectTemplate *eventObjectTemplate = &savObjTemplates[i]; + if (eventObjectTemplate->localId == localId) { - mapObjectTemplate->x = x; - mapObjectTemplate->y = y; + eventObjectTemplate->x = x; + eventObjectTemplate->y = y; return; } } } -void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType) +void Overworld_SetEventObjTemplateMovementType(u8 localId, u8 movementType) { s32 i; - struct MapObjectTemplate *savObjTemplates = gSaveBlock1Ptr->mapObjectTemplates; + struct EventObjectTemplate *savObjTemplates = gSaveBlock1Ptr->eventObjectTemplates; for (i = 0; i < 64; i++) { - struct MapObjectTemplate *mapObjectTemplate = &savObjTemplates[i]; - if (mapObjectTemplate->localId == localId) + struct EventObjectTemplate *eventObjectTemplate = &savObjTemplates[i]; + if (eventObjectTemplate->localId == localId) { - mapObjectTemplate->movementType = movementType; + eventObjectTemplate->movementType = movementType; return; } } @@ -564,17 +559,17 @@ void Overworld_SetMapObjTemplateMovementType(u8 localId, u8 movementType) static void mapdata_load_assets_to_gpu_and_full_redraw(void) { move_tilemap_camera_to_upper_left_corner(); - copy_map_tileset1_tileset2_to_vram(gMapHeader.mapData); - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + copy_map_tileset1_tileset2_to_vram(gMapHeader.mapLayout); + apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout); DrawWholeMapView(); cur_mapheader_run_tileset_funcs_after_some_cpuset(); } -const struct MapData *get_mapdata_header(void) +const struct MapLayout *GetMapLayout(void) { - u16 mapDataId = gSaveBlock1Ptr->mapDataId; - if (mapDataId) - return gMapAttributes[mapDataId - 1]; + u16 mapLayoutId = gSaveBlock1Ptr->mapLayoutId; + if (mapLayoutId) + return gMapLayouts[mapLayoutId - 1]; return NULL; } @@ -617,12 +612,12 @@ bool32 warp_data_is_not_neg_1(struct WarpData *warp) return TRUE; } -const struct MapHeader *Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum) +struct MapHeader const *const Overworld_GetMapHeaderByGroupAndId(u16 mapGroup, u16 mapNum) { return gMapGroups[mapGroup][mapNum]; } -const struct MapHeader *warp1_get_mapheader(void) +struct MapHeader const *const warp1_get_mapheader(void) { return Overworld_GetMapHeaderByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); } @@ -631,14 +626,14 @@ void set_current_map_header_from_sav1_save_old_name(void) { sLastMapSectionId = gMapHeader.regionMapSectionId; gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); - gSaveBlock1Ptr->mapDataId = gMapHeader.mapDataId; - gMapHeader.mapData = get_mapdata_header(); + gSaveBlock1Ptr->mapLayoutId = gMapHeader.mapLayoutId; + gMapHeader.mapLayout = GetMapLayout(); } void LoadSaveblockMapHeader(void) { gMapHeader = *Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); - gMapHeader.mapData = get_mapdata_header(); + gMapHeader.mapLayout = GetMapLayout(); } void update_camera_pos_from_warpid(void) @@ -655,8 +650,8 @@ void update_camera_pos_from_warpid(void) } else { - gSaveBlock1Ptr->pos.x = gMapHeader.mapData->width / 2; - gSaveBlock1Ptr->pos.y = gMapHeader.mapData->height / 2; + gSaveBlock1Ptr->pos.x = gMapHeader.mapLayout->width / 2; + gSaveBlock1Ptr->pos.y = gMapHeader.mapLayout->height / 2; } } @@ -694,7 +689,7 @@ void copy_saved_warp2_bank_and_enter_x_to_warp1(u8 unused) void sub_8084CCC(u8 a1) { - const struct HealLocation *warp = GetHealLocationPointer(a1); + const struct HealLocation *warp = GetHealLocation(a1); if (warp) Overworld_SetWarpDestination(warp->group, warp->map, -1, warp->x, warp->y); @@ -707,7 +702,7 @@ void Overworld_SetWarpDestToLastHealLoc(void) void Overworld_SetHealLocationWarp(u8 healLocationId) { - const struct HealLocation *healLocation = GetHealLocationPointer(healLocationId); + const struct HealLocation *healLocation = GetHealLocation(healLocationId); if (healLocation != NULL) SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, -1, healLocation->x, healLocation->y); @@ -717,7 +712,7 @@ void sub_8084D5C(s16 a1, s16 a2) { u8 currMapType = Overworld_GetMapTypeOfSaveblockLocation(); u8 destMapType = GetMapTypeByGroupAndId(sWarpDestination.mapGroup, sWarpDestination.mapNum); - if (is_light_level_1_2_3_5_or_6(currMapType) && is_light_level_1_2_3_5_or_6(destMapType) != TRUE) + if (is_map_type_1_2_3_5_or_6(currMapType) && is_map_type_1_2_3_5_or_6(destMapType) != TRUE) sub_8084DD4(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, a1 - 7, a2 - 6); } @@ -766,7 +761,7 @@ void sub_8084F2C(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y) void sub_8084F6C(u8 a1) { - const struct HealLocation *warp = GetHealLocationPointer(a1); + const struct HealLocation *warp = GetHealLocation(a1); if (warp) SetWarpData(&gSaveBlock1Ptr->warp1, warp->group, warp->map, -1, warp->x, warp->y); } @@ -830,7 +825,7 @@ void mliX_load_map(u8 mapGroup, u8 mapNum) ApplyCurrentWarp(); set_current_map_header_from_sav1_save_old_name(); - LoadMapObjTemplatesFromHeader(); + LoadEventObjTemplatesFromHeader(); TrySetMapSaveWarpStatus(); ClearTempFieldEventData(); ResetCyclingRoadChallengeData(); @@ -843,8 +838,8 @@ void mliX_load_map(u8 mapGroup, u8 mapNum) Overworld_ClearSavedMusic(); mapheader_run_script_with_tag_x3(); not_trainer_hill_battle_pyramid(); - copy_map_tileset2_to_vram_2(gMapHeader.mapData); - apply_map_tileset2_palette(gMapHeader.mapData); + copy_map_tileset2_to_vram_2(gMapHeader.mapLayout); + apply_map_tileset2_palette(gMapHeader.mapLayout); for (paletteIndex = 6; paletteIndex < 13; paletteIndex++) ApplyWeatherGammaShiftToPal(paletteIndex); @@ -868,15 +863,15 @@ static void mli0_load_map(u32 a1) set_current_map_header_from_sav1_save_old_name(); if (!(sUnknown_020322D8 & 1)) { - if (gMapHeader.mapDataId == 0x169) + if (gMapHeader.mapLayoutId == 0x169) sub_81AA1D8(); else if (InTrainerHill()) sub_81D5DF8(); else - LoadMapObjTemplatesFromHeader(); + LoadEventObjTemplatesFromHeader(); } - v2 = is_light_level_1_2_3_5_or_6(gMapHeader.mapType); + v2 = is_map_type_1_2_3_5_or_6(gMapHeader.mapType); indoors = Overworld_MapTypeIsIndoors(gMapHeader.mapType); sub_80EB218(); @@ -896,7 +891,7 @@ static void mli0_load_map(u32 a1) mapheader_run_script_with_tag_x3(); UpdateLocationHistoryForRoamer(); RoamerMoveToOtherLocationSet(); - if (gMapHeader.mapDataId == 0x169) + if (gMapHeader.mapLayoutId == 0x169) battle_pyramid_map_load_related(0); else if (InTrainerHill()) trainer_hill_map_load_related(); @@ -918,7 +913,7 @@ void player_avatar_init_params_reset(void) void walkrun_find_lowest_active_bit_in_bitfield(void) { - sUnknown_02032300.player_field_1 = player_get_direction_lower_nybble(); + sUnknown_02032300.player_field_1 = GetPlayerFacingDirection(); if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE)) sUnknown_02032300.player_field_0 = 2; @@ -1022,10 +1017,10 @@ u8 Overworld_GetFlashLevel(void) return gSaveBlock1Ptr->flashLevel; } -void sub_8085524(u16 mapDataId) +void sub_8085524(u16 mapLayoutId) { - gSaveBlock1Ptr->mapDataId = mapDataId; - gMapHeader.mapData = get_mapdata_header(); + gSaveBlock1Ptr->mapLayoutId = mapLayoutId; + gMapHeader.mapLayout = GetMapLayout(); } void sub_8085540(u8 var) @@ -1369,7 +1364,7 @@ u8 get_map_light_from_warp0(void) return GetMapTypeByWarpData(&gUnknown_020322DC); } -bool8 is_light_level_1_2_3_5_or_6(u8 mapType) +bool8 is_map_type_1_2_3_5_or_6(u8 mapType) { if (mapType == MAP_TYPE_ROUTE || mapType == MAP_TYPE_TOWN @@ -1422,12 +1417,12 @@ static void overworld_bg_setup(void) SetBgAttribute(1, BG_CTRL_ATTR_PALETTEMODE, 1); SetBgAttribute(2, BG_CTRL_ATTR_PALETTEMODE, 1); SetBgAttribute(3, BG_CTRL_ATTR_PALETTEMODE, 1); - gUnknown_03005DA0 = AllocZeroed(0x800); - gUnknown_03005D9C = AllocZeroed(0x800); - gUnknown_03005DA4 = AllocZeroed(0x800); - SetBgTilemapBuffer(1, gUnknown_03005DA0); - SetBgTilemapBuffer(2, gUnknown_03005D9C); - SetBgTilemapBuffer(3, gUnknown_03005DA4); + gBGTilemapBuffers2 = AllocZeroed(0x800); + gBGTilemapBuffers1 = AllocZeroed(0x800); + gBGTilemapBuffers3 = AllocZeroed(0x800); + SetBgTilemapBuffer(1, gBGTilemapBuffers2); + SetBgTilemapBuffer(2, gBGTilemapBuffers1); + SetBgTilemapBuffer(3, gBGTilemapBuffers3); sub_81971D0(); } @@ -1435,12 +1430,12 @@ void overworld_free_bg_tilemaps(void) { sub_81BE72C(); sub_81971F4(); - if (gUnknown_03005DA4 != NULL) - FREE_AND_SET_NULL(gUnknown_03005DA4); - if (gUnknown_03005D9C != NULL) - FREE_AND_SET_NULL(gUnknown_03005D9C); - if (gUnknown_03005DA0 != NULL) - FREE_AND_SET_NULL(gUnknown_03005DA0); + if (gBGTilemapBuffers3 != NULL) + FREE_AND_SET_NULL(gBGTilemapBuffers3); + if (gBGTilemapBuffers1 != NULL) + FREE_AND_SET_NULL(gBGTilemapBuffers1); + if (gBGTilemapBuffers2 != NULL) + FREE_AND_SET_NULL(gBGTilemapBuffers2); } static void ResetSafariZoneFlag_(void) @@ -1524,15 +1519,15 @@ void sub_8085E94(void *a0) static bool8 map_post_load_hook_exec(void) { - if (gUnknown_03005DB0 != NULL) + if (gFieldCallback2 != NULL) { - if (!gUnknown_03005DB0()) + if (!gFieldCallback2()) { return FALSE; } else { - gUnknown_03005DB0 = NULL; + gFieldCallback2 = NULL; gFieldCallback = NULL; } } @@ -1560,7 +1555,7 @@ void CB2_NewGame(void) ScriptContext1_Init(); ScriptContext2_Disable(); gFieldCallback = ExecuteTruckSequence; - gUnknown_03005DB0 = NULL; + gFieldCallback2 = NULL; do_load_map_stuff_loop(&gMain.state); SetFieldVBlankCallback(); SetMainCallback1(CB1_Overworld); @@ -1690,18 +1685,18 @@ void c2_8056854(void) void CB2_ReturnToFieldWithOpenMenu(void) { FieldClearVBlankHBlankCallbacks(); - gUnknown_03005DB0 = sub_80AF6A4; + gFieldCallback2 = sub_80AF6A4; CB2_ReturnToField(); } -void sub_80861B0(void) +void CB2_ReturnToFieldContinueScript(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = sub_80AF188; CB2_ReturnToField(); } -void CB2_ReturnToFieldContinueScript(void) +void CB2_ReturnToFieldContinueScriptPlayMapMusic(void) { FieldClearVBlankHBlankCallbacks(); gFieldCallback = sub_80AF168; @@ -1735,17 +1730,17 @@ void CB2_ContinueSavedGame(void) LoadSaveblockMapHeader(); set_warp2_warp3_to_neg_1(); trainerHillMapId = GetCurrentTrainerHillMapId(); - if (gMapHeader.mapDataId == 0x169) + if (gMapHeader.mapLayoutId == 0x169) sub_81AA2F8(); else if (trainerHillMapId != 0 && trainerHillMapId != 6) sub_81D5F48(); else - LoadSaveblockMapObjScripts(); + LoadSaveblockEventObjScripts(); - UnfreezeMapObjects(); + UnfreezeEventObjects(); DoTimeBasedEvents(); sub_8084788(); - if (gMapHeader.mapDataId == 0x169) + if (gMapHeader.mapLayoutId == 0x169) battle_pyramid_map_load_related(1); else if (trainerHillMapId != 0) trainer_hill_map_load_related(); @@ -1865,17 +1860,17 @@ static bool32 map_loading_iteration_3(u8 *state) (*state)++; break; case 6: - copy_map_tileset1_to_vram(gMapHeader.mapData); + copy_map_tileset1_to_vram(gMapHeader.mapLayout); (*state)++; break; case 7: - copy_map_tileset2_to_vram(gMapHeader.mapData); + copy_map_tileset2_to_vram(gMapHeader.mapLayout); (*state)++; break; case 8: if (free_temp_tile_data_buffers_if_possible() != TRUE) { - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout); (*state)++; } break; @@ -1940,17 +1935,17 @@ static bool32 load_map_stuff(u8 *state, u32 a2) (*state)++; break; case 6: - copy_map_tileset1_to_vram(gMapHeader.mapData); + copy_map_tileset1_to_vram(gMapHeader.mapLayout); (*state)++; break; case 7: - copy_map_tileset2_to_vram(gMapHeader.mapData); + copy_map_tileset2_to_vram(gMapHeader.mapLayout); (*state)++; break; case 8: if (free_temp_tile_data_buffers_if_possible() != TRUE) { - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout); (*state)++; } break; @@ -2037,17 +2032,17 @@ static bool32 map_loading_iteration_2_link(u8 *state) (*state)++; break; case 5: - copy_map_tileset1_to_vram(gMapHeader.mapData); + copy_map_tileset1_to_vram(gMapHeader.mapLayout); (*state)++; break; case 6: - copy_map_tileset2_to_vram(gMapHeader.mapData); + copy_map_tileset2_to_vram(gMapHeader.mapLayout); (*state)++; break; case 7: if (free_temp_tile_data_buffers_if_possible() != TRUE) { - apply_map_tileset1_tileset2_palette(gMapHeader.mapData); + apply_map_tileset1_tileset2_palette(gMapHeader.mapLayout); (*state)++; } break; @@ -2176,7 +2171,7 @@ static void sub_80869DC(void) gUnknown_03005DEC = 0; gUnknown_03005DE8 = 0; sub_808D438(); - SpawnFieldObjectsInView(0, 0); + TrySpawnEventObjects(0, 0); mapheader_run_first_tag4_script_list_match(); } @@ -2193,7 +2188,7 @@ static void mli4_mapscripts_and_other(void) InitPlayerAvatar(x, y, player->player_field_1, gSaveBlock2Ptr->playerGender); SetPlayerAvatarTransitionFlags(player->player_field_0); player_avatar_init_params_reset(); - SpawnFieldObjectsInView(0, 0); + TrySpawnEventObjects(0, 0); mapheader_run_first_tag4_script_list_match(); } @@ -2206,7 +2201,7 @@ static void sub_8086A68(void) static void sub_8086A80(void) { - gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_15 = 1; + gEventObjects[gPlayerAvatar.eventObjectId].trackedByCamera = 1; InitCameraUpdateCallback(gPlayerAvatar.spriteId); } @@ -2237,7 +2232,7 @@ static void sub_8086B14(void) for (i = 0; i < gFieldLinkPlayerCount; i++) { - SpawnLinkPlayerMapObject(i, i + x, y, gLinkPlayers[i].gender); + SpawnLinkPlayerEventObject(i, i + x, y, gLinkPlayers[i].gender); CreateLinkPlayerSprite(i, gLinkPlayers[i].version); } @@ -2682,7 +2677,7 @@ static void sub_80872D8(s32 linkPlayerId, s32 a2, struct UnkStruct_8054FF8 *a3) a3->a = linkPlayerId; a3->b = (linkPlayerId == a2) ? 1 : 0; - a3->c = gLinkPlayerMapObjects[linkPlayerId].mode; + a3->c = gLinkPlayerEventObjects[linkPlayerId].mode; a3->d = sub_80878A0(linkPlayerId); sub_8087878(linkPlayerId, &x, &y); a3->sub.x = x; @@ -2795,7 +2790,7 @@ static void sub_8087510(void) static void sub_808751C(void) { PlaySE(SE_WIN_OPEN); - sub_809FA9C(); + ShowStartMenu(); ScriptContext2_Enable(); } @@ -2895,109 +2890,109 @@ static u32 sub_8087690(void) return gLink.sendQueue.count; } -static void ZeroLinkPlayerMapObject(struct LinkPlayerMapObject *linkPlayerMapObj) +static void ZeroLinkPlayerEventObject(struct LinkPlayerEventObject *linkPlayerEventObj) { - memset(linkPlayerMapObj, 0, sizeof(struct LinkPlayerMapObject)); + memset(linkPlayerEventObj, 0, sizeof(struct LinkPlayerEventObject)); } -void ZeroAllLinkPlayerMapObjects(void) +void ClearLinkPlayerEventObjects(void) { - memset(gLinkPlayerMapObjects, 0, sizeof(gLinkPlayerMapObjects)); + memset(gLinkPlayerEventObjects, 0, sizeof(gLinkPlayerEventObjects)); } -static void ZeroMapObject(struct MapObject *mapObj) +static void ZeroEventObject(struct EventObject *eventObj) { - memset(mapObj, 0, sizeof(struct MapObject)); + memset(eventObj, 0, sizeof(struct EventObject)); } -static void SpawnLinkPlayerMapObject(u8 linkPlayerId, s16 x, s16 y, u8 a4) +static void SpawnLinkPlayerEventObject(u8 linkPlayerId, s16 x, s16 y, u8 a4) { - u8 mapObjId = sub_808D4F4(); - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - struct MapObject *mapObj = &gMapObjects[mapObjId]; + u8 eventObjId = GetFirstInactiveEventObjectId(); + struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId]; + struct EventObject *eventObj = &gEventObjects[eventObjId]; - ZeroLinkPlayerMapObject(linkPlayerMapObj); - ZeroMapObject(mapObj); + ZeroLinkPlayerEventObject(linkPlayerEventObj); + ZeroEventObject(eventObj); - linkPlayerMapObj->active = 1; - linkPlayerMapObj->linkPlayerId = linkPlayerId; - linkPlayerMapObj->mapObjId = mapObjId; - linkPlayerMapObj->mode = 0; + linkPlayerEventObj->active = 1; + linkPlayerEventObj->linkPlayerId = linkPlayerId; + linkPlayerEventObj->eventObjId = eventObjId; + linkPlayerEventObj->mode = 0; - mapObj->active = 1; - mapObj->mapobj_bit_1 = a4; - mapObj->range.as_byte = 2; - mapObj->spriteId = 64; + eventObj->active = 1; + eventObj->singleMovementActive = a4; + eventObj->range.as_byte = 2; + eventObj->spriteId = 64; - InitLinkPlayerMapObjectPos(mapObj, x, y); + InitLinkPlayerEventObjectPos(eventObj, x, y); } -static void InitLinkPlayerMapObjectPos(struct MapObject *mapObj, s16 x, s16 y) +static void InitLinkPlayerEventObjectPos(struct EventObject *eventObj, s16 x, s16 y) { - mapObj->coords2.x = x; - mapObj->coords2.y = y; - mapObj->coords3.x = x; - mapObj->coords3.y = y; - sub_8093038(x, y, &mapObj->coords1.x, &mapObj->coords1.y); - mapObj->coords1.x += 8; - FieldObjectUpdateZCoord(mapObj); + eventObj->currentCoords.x = x; + eventObj->currentCoords.y = y; + eventObj->previousCoords.x = x; + eventObj->previousCoords.y = y; + sub_8093038(x, y, &eventObj->initialCoords.x, &eventObj->initialCoords.y); + eventObj->initialCoords.x += 8; + EventObjectUpdateZCoord(eventObj); } static void sub_80877DC(u8 linkPlayerId, u8 a2) { - if (gLinkPlayerMapObjects[linkPlayerId].active) + if (gLinkPlayerEventObjects[linkPlayerId].active) { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - mapObj->range.as_byte = a2; + u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + eventObj->range.as_byte = a2; } } static void sub_808780C(u8 linkPlayerId) { - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - if (mapObj->spriteId != 64 ) - DestroySprite(&gSprites[mapObj->spriteId]); - linkPlayerMapObj->active = 0; - mapObj->active = 0; + struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId]; + u8 eventObjId = linkPlayerEventObj->eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + if (eventObj->spriteId != 64 ) + DestroySprite(&gSprites[eventObj->spriteId]); + linkPlayerEventObj->active = 0; + eventObj->active = 0; } static u8 sub_8087858(u8 linkPlayerId) { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->spriteId; + u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + return eventObj->spriteId; } static void sub_8087878(u8 linkPlayerId, u16 *x, u16 *y) { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - *x = mapObj->coords2.x; - *y = mapObj->coords2.y; + u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + *x = eventObj->currentCoords.x; + *y = eventObj->currentCoords.y; } static u8 sub_80878A0(u8 linkPlayerId) { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->range.as_byte; + u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + return eventObj->range.as_byte; } static u8 sub_80878C0(u8 linkPlayerId) { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return mapObj->mapobj_unk_0B_0; + u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + return eventObj->currentElevation; } static s32 sub_80878E4(u8 linkPlayerId) { - u8 mapObjId = gLinkPlayerMapObjects[linkPlayerId].mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; - return 16 - (s8)mapObj->mapobj_unk_21; + u8 eventObjId = gLinkPlayerEventObjects[linkPlayerId].eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; + return 16 - (s8)eventObj->directionSequenceIndex; } static u8 GetLinkPlayerIdAt(s16 x, s16 y) @@ -3005,11 +3000,11 @@ static u8 GetLinkPlayerIdAt(s16 x, s16 y) u8 i; for (i = 0; i < 4; i++) { - if (gLinkPlayerMapObjects[i].active - && (gLinkPlayerMapObjects[i].mode == 0 || gLinkPlayerMapObjects[i].mode == 2)) + if (gLinkPlayerEventObjects[i].active + && (gLinkPlayerEventObjects[i].mode == 0 || gLinkPlayerEventObjects[i].mode == 2)) { - struct MapObject *mapObj = &gMapObjects[gLinkPlayerMapObjects[i].mapObjId]; - if (mapObj->coords2.x == x && mapObj->coords2.y == y) + struct EventObject *eventObj = &gEventObjects[gLinkPlayerEventObjects[i].eventObjId]; + if (eventObj->currentCoords.x == x && eventObj->currentCoords.y == y) return i; } } @@ -3018,79 +3013,79 @@ static u8 GetLinkPlayerIdAt(s16 x, s16 y) static void sub_808796C(u8 linkPlayerId, u8 a2) { - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; + struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId]; + u8 eventObjId = linkPlayerEventObj->eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; - if (linkPlayerMapObj->active) + if (linkPlayerEventObj->active) { if (a2 > 10) - mapObj->mapobj_bit_2 = 1; + eventObj->triggerGroundEffectsOnMove = 1; else - gUnknown_08339E00[gUnknown_08339DC8[linkPlayerMapObj->mode](linkPlayerMapObj, mapObj, a2)](linkPlayerMapObj, mapObj); + gUnknown_08339E00[gUnknown_08339DC8[linkPlayerEventObj->mode](linkPlayerEventObj, eventObj, a2)](linkPlayerEventObj, eventObj); } } -static u8 sub_80879D8(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +static u8 sub_80879D8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3) { - return gUnknown_08339DD4[a3](linkPlayerMapObj, mapObj, a3); + return gUnknown_08339DD4[a3](linkPlayerEventObj, eventObj, a3); } -static u8 sub_80879F8(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +static u8 sub_80879F8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3) { return 1; } -static u8 sub_80879FC(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +static u8 sub_80879FC(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3) { - return gUnknown_08339DD4[a3](linkPlayerMapObj, mapObj, a3); + return gUnknown_08339DD4[a3](linkPlayerEventObj, eventObj, a3); } -static u8 sub_8087A1C(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +static u8 sub_8087A1C(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3) { return 0; } -static u8 sub_8087A20(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +static u8 sub_8087A20(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3) { s16 x, y; - mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte); - FieldObjectMoveDestCoords(mapObj, mapObj->range.as_byte, &x, &y); + eventObj->range.as_byte = npc_something3(a3, eventObj->range.as_byte); + EventObjectMoveDestCoords(eventObj, eventObj->range.as_byte, &x, &y); - if (LinkPlayerDetectCollision(linkPlayerMapObj->mapObjId, mapObj->range.as_byte, x, y)) + if (LinkPlayerDetectCollision(linkPlayerEventObj->eventObjId, eventObj->range.as_byte, x, y)) { return 0; } else { - mapObj->mapobj_unk_21 = 16; - npc_coords_shift(mapObj, x, y); - FieldObjectUpdateZCoord(mapObj); + eventObj->directionSequenceIndex = 16; + ShiftEventObjectCoords(eventObj, x, y); + EventObjectUpdateZCoord(eventObj); return 1; } } -static u8 sub_8087A88(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj, u8 a3) +static u8 sub_8087A88(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj, u8 a3) { - mapObj->range.as_byte = npc_something3(a3, mapObj->range.as_byte); + eventObj->range.as_byte = npc_something3(a3, eventObj->range.as_byte); return 0; } -static void sub_8087AA0(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) +static void sub_8087AA0(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj) { - linkPlayerMapObj->mode = 0; + linkPlayerEventObj->mode = 0; } -static void sub_8087AA8(struct LinkPlayerMapObject *linkPlayerMapObj, struct MapObject *mapObj) +static void sub_8087AA8(struct LinkPlayerEventObject *linkPlayerEventObj, struct EventObject *eventObj) { - mapObj->mapobj_unk_21--; - linkPlayerMapObj->mode = 1; - MoveCoords(mapObj->range.as_byte, &mapObj->coords1.x, &mapObj->coords1.y); - if (!mapObj->mapobj_unk_21) + eventObj->directionSequenceIndex--; + linkPlayerEventObj->mode = 1; + MoveCoords(eventObj->range.as_byte, &eventObj->initialCoords.x, &eventObj->initialCoords.y); + if (!eventObj->directionSequenceIndex) { - npc_coords_shift_still(mapObj); - linkPlayerMapObj->mode = 2; + ShiftStillEventObjectCoords(eventObj); + linkPlayerEventObj->mode = 2; } } @@ -3114,15 +3109,15 @@ static u8 npc_something3(u8 a1, u8 a2) return a2; } -static u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y) +static u8 LinkPlayerDetectCollision(u8 selfEventObjId, u8 a2, s16 x, s16 y) { u8 i; for (i = 0; i < 16; i++) { - if (i != selfMapObjId) + if (i != selfEventObjId) { - if ((gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y) - || (gMapObjects[i].coords3.x == x && gMapObjects[i].coords3.y == y)) + if ((gEventObjects[i].currentCoords.x == x && gEventObjects[i].currentCoords.y == y) + || (gEventObjects[i].previousCoords.x == x && gEventObjects[i].previousCoords.y == y)) { return 1; } @@ -3133,51 +3128,51 @@ static u8 LinkPlayerDetectCollision(u8 selfMapObjId, u8 a2, s16 x, s16 y) static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion) { - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[linkPlayerId]; - u8 mapObjId = linkPlayerMapObj->mapObjId; - struct MapObject *mapObj = &gMapObjects[mapObjId]; + struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[linkPlayerId]; + u8 eventObjId = linkPlayerEventObj->eventObjId; + struct EventObject *eventObj = &gEventObjects[eventObjId]; struct Sprite *sprite; - if (linkPlayerMapObj->active) + if (linkPlayerEventObj->active) { switch (gameVersion) { case VERSION_FIRE_RED: case VERSION_LEAF_GREEN: - mapObj->spriteId = AddPseudoFieldObject(sub_808BD6C(mapObj->mapobj_bit_1), SpriteCB_LinkPlayer, 0, 0, 0); + eventObj->spriteId = AddPseudoEventObject(sub_808BD6C(eventObj->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0); break; case VERSION_RUBY: case VERSION_SAPPHIRE: - mapObj->spriteId = AddPseudoFieldObject(sub_808BD7C(mapObj->mapobj_bit_1), SpriteCB_LinkPlayer, 0, 0, 0); + eventObj->spriteId = AddPseudoEventObject(sub_808BD7C(eventObj->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0); break; case VERSION_EMERALD: - mapObj->spriteId = AddPseudoFieldObject(GetRivalAvatarGraphicsIdByStateIdAndGender(0, mapObj->mapobj_bit_1), SpriteCB_LinkPlayer, 0, 0, 0); + eventObj->spriteId = AddPseudoEventObject(GetRivalAvatarGraphicsIdByStateIdAndGender(0, eventObj->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0); break; } - sprite = &gSprites[mapObj->spriteId]; + sprite = &gSprites[eventObj->spriteId]; sprite->coordOffsetEnabled = TRUE; sprite->data[0] = linkPlayerId; - mapObj->mapobj_bit_2 = 0; + eventObj->triggerGroundEffectsOnMove = 0; } } static void SpriteCB_LinkPlayer(struct Sprite *sprite) { - struct LinkPlayerMapObject *linkPlayerMapObj = &gLinkPlayerMapObjects[sprite->data[0]]; - struct MapObject *mapObj = &gMapObjects[linkPlayerMapObj->mapObjId]; - sprite->pos1.x = mapObj->coords1.x; - sprite->pos1.y = mapObj->coords1.y; - SetObjectSubpriorityByZCoord(mapObj->elevation, sprite, 1); - sprite->oam.priority = ZCoordToPriority(mapObj->elevation); + struct LinkPlayerEventObject *linkPlayerEventObj = &gLinkPlayerEventObjects[sprite->data[0]]; + struct EventObject *eventObj = &gEventObjects[linkPlayerEventObj->eventObjId]; + sprite->pos1.x = eventObj->initialCoords.x; + sprite->pos1.y = eventObj->initialCoords.y; + SetObjectSubpriorityByZCoord(eventObj->previousElevation, sprite, 1); + sprite->oam.priority = ZCoordToPriority(eventObj->previousElevation); - if (!linkPlayerMapObj->mode) - StartSpriteAnim(sprite, FieldObjectDirectionToImageAnimId(mapObj->range.as_byte)); + if (!linkPlayerEventObj->mode) + StartSpriteAnim(sprite, GetFaceDirectionAnimNum(eventObj->range.as_byte)); else - StartSpriteAnimIfDifferent(sprite, get_go_image_anim_num(mapObj->range.as_byte)); + StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(eventObj->range.as_byte)); - sub_80979D4(sprite, 0); - if (mapObj->mapobj_bit_2) + UpdateEventObjectSpriteVisibility(sprite, 0); + if (eventObj->triggerGroundEffectsOnMove) { sprite->invisible = ((sprite->data[7] & 4) >> 2); sprite->data[7]++; diff --git a/src/player_pc.c b/src/player_pc.c new file mode 100644 index 000000000..ba18b45ab --- /dev/null +++ b/src/player_pc.c @@ -0,0 +1,1360 @@ +#include "global.h" +#include "constants/songs.h" +#include "bg.h" +#include "decoration.h" +#include "event_scripts.h" +#include "field_fadetransition.h" +#include "event_object_movement.h" +#include "field_screen.h" +#include "field_weather.h" +#include "international_string_util.h" +#include "item.h" +#include "item_icon.h" +#include "item_menu.h" +#include "constants/items.h" +#include "list_menu.h" +#include "mail.h" +#include "main.h" +#include "malloc.h" +#include "menu.h" +#include "menu_helpers.h" +#include "overworld.h" +#include "palette.h" +#include "party_menu.h" +#include "pokenav.h" +#include "player_pc.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "window.h" + +// structures +struct Struct203BCC4 +{ + struct ListMenuItem unk0[51]; + u8 unk198[51][0x18]; + u8 windowIds[6]; + u8 unk666; + u8 spriteId; + u8 spriteIds[7]; +}; + +// static functions +static void InitPlayerPCMenu(u8 taskId); +static void PlayerPCProcessMenuInput(u8 taskId); +static void InitItemStorageMenu(u8 taskId, u8 var); + +static u8 GetMailboxMailCount(void); +static void Mailbox_UpdateMailList(void); +static void Mailbox_DrawMailboxMenu(u8 taskId); +static void Mailbox_ProcessInput(u8 taskId); +static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId); +static void Mailbox_ReturnToPlayerPC(u8); +static void Mailbox_PrintMailOptions(u8 taskId); +static void Mailbox_MailOptionsProcessInput(u8 taskId); + +static void PlayerPC_ItemStorage(u8 taskId); +static void PlayerPC_Mailbox(u8 taskId); +static void PlayerPC_Decoration(u8 var); +static void PlayerPC_TurnOff(u8 taskId); + +static void Mailbox_DoMailMoveToBag(u8 taskId); +static void Mailbox_DoMailRead(u8 taskId); +static void Mailbox_MoveToBag(u8 taskId); +static void Mailbox_Give(u8 taskId); +static void Mailbox_Cancel(u8 taskId); + +static void Mailbox_CancelMoveToBag(u8 taskId); +static void Mailbox_MoveToBagYesNoPrompt(u8 taskId); +static void Mailbox_DrawYesNoBeforeMove(u8 taskId); +static void Mailbox_DoGiveMailPokeMenu(u8 taskId); +static void Mailbox_NoPokemonForMail(u8 taskId); + +static void Mailbox_FadeAndReadMail(u8 taskId); +static void Mailbox_ReturnToFieldFromReadMail(void); +static void Mailbox_DoRedrawMailboxMenuAfterReturn(void); +static void pal_fill_for_maplights_or_black(void); +static void Mailbox_HandleReturnToProcessInput(u8 taskId); +static void Mailbox_UpdateMailListAfterDeposit(void); + +static void ItemStorage_Withdraw(u8 taskId); +static void ItemStorage_Deposit(u8 taskId); +static void ItemStorage_Toss(u8 taskId); +static void ItemStorage_Exit(u8 taskId); +static void ItemStorage_ResumeInputFromYesToss(u8 taskId); +static void ItemStorage_ResumeInputFromNoToss(u8 taskId); + +static void ItemStorageMenuPrint(const u8 *); +static void ItemStorageMenuProcessInput(u8 taskId); +static void ItemStorage_ProcessWithdrawTossInput(u8 taskId); +static void ItemStorage_SetItemAndMailCount(u8); +static void ItemStorage_HandleReturnToProcessInput(u8 taskId); + +static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss); +static void Task_ItemStorage_Deposit(u8 taskId); +static void ItemStorage_DoItemWithdraw(u8 taskId); +static void ItemStorage_DoItemToss(u8 taskid); +static void ItemStorage_HandleQuantityRolling(u8 taskid); +static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId); +static void ItemStorage_ItemSwapChoosePrompt(u8 taskId); +static void ItemStorage_DoItemAction(u8 taskId); +static void ItemStorage_ProcessInput(u8 taskId); +static void ItemStorage_DoItemSwap(u8 taskId, bool8 a); +static void ItemStorage_HandleRemoveItem(u8 taskId); +static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId); +static void ItemStorage_StartScrollIndicatorAndProcessInput(u8 taskId); + +static const u8* ItemStorage_GetItemPcResponse(u16); +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 sub_816C4FC(u8 taskId); +static void sub_816C0C8(void); +static void sub_816C060(u16 itemId); +static void sub_816BEF0(s32 id); +static void sub_816B4DC(u8 taskId); +static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu * thisMenu); +static void fish4_goto_x5_or_x6(u8 windowId, s32 id, u8 yOffset); + +// EWRAM +static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; +static EWRAM_DATA u8 gPcItemMenuOptionsNum = 0; +EWRAM_DATA struct PlayerPCItemPageStruct playerPCItemPageInfo = {0, 0, 0, 0, {0, 0, 0}, 0}; +static EWRAM_DATA struct Struct203BCC4 *gUnknown_0203BCC4 = NULL; + +// .rodata +static const u8 *const gPCText_OptionDescList[] = +{ + gText_TakeOutItemsFromPC, + gText_StoreItemsInPC, + gText_ThrowAwayItemsInPC, + gText_GoBackPrevMenu, +}; + +static const struct MenuAction sPlayerPCMenuActions[] = +{ + { gText_ItemStorage, PlayerPC_ItemStorage }, + { gText_Mailbox, PlayerPC_Mailbox }, + { gText_Decoration, PlayerPC_Decoration }, + { gText_TurnOff, PlayerPC_TurnOff } +}; + +static const u8 gBedroomPC_OptionOrder[] = +{ + PLAYERPC_MENU_ITEMSTORAGE, + PLAYERPC_MENU_MAILBOX, + PLAYERPC_MENU_DECORATION, + PLAYERPC_MENU_TURNOFF +}; + +static const u8 gPlayerPC_OptionOrder[] = +{ + PLAYERPC_MENU_ITEMSTORAGE, + PLAYERPC_MENU_MAILBOX, + PLAYERPC_MENU_TURNOFF +}; + +static const struct MenuAction gPCText_ItemPCOptionsText[] = +{ + { gText_WithdrawItem, ItemStorage_Withdraw }, + { gText_DepositItem, ItemStorage_Deposit }, + { gText_TossItem, ItemStorage_Toss }, + { gText_Cancel, ItemStorage_Exit } +}; + +static const struct ItemSlot gNewGamePCItems[] = +{ + { ITEM_POTION, 1 }, + { ITEM_NONE, 0 } +}; + +const struct MenuAction gMailboxMailOptions[] = +{ + { gText_Read, Mailbox_DoMailRead }, + { gText_MoveToBag, Mailbox_MoveToBag }, + { gText_Give2, Mailbox_Give }, + { gText_Cancel2, Mailbox_Cancel } +}; + +static const struct WindowTemplate gUnknown_085DFF24[3] = +{ + {0x00, 0x01, 0x01, 0x09, 0x06, 0x0F, 0x0001}, + {0x00, 0x01, 0x01, 0x09, 0x08, 0x0F, 0x0001}, + {0x00, 0x01, 0x01, 0x0A, 0x08, 0x0F, 0x0001} +}; + +static const struct YesNoFuncTable ResumeFromWithdrawYesNoFuncList = // ResumeFromWithdrawYesNoFuncList +{ + ItemStorage_ResumeInputFromYesToss, + ItemStorage_ResumeInputFromNoToss +}; + +static const struct ListMenuTemplate gUnknown_085DFF44 = { + NULL, + ItemStorage_MoveCursor, + fish4_goto_x5_or_x6, + 0, 0, + 0, 0, 8, 0, + 9, 2, 1, 3, FALSE, 0, FALSE, 7 +}; + +static const struct WindowTemplate gUnknown_085DFF5C[5] = +{ + {0x00, 0x10, 0x01, 0x0D, 0x12, 0x0F, 0x0001}, + {0x00, 0x01, 0x0D, 0x0D, 0x06, 0x0F, 0x00EB}, + {0x00, 0x01, 0x08, 0x03, 0x03, 0x0F, 0x0153}, + {0x00, 0x01, 0x01, 0x0D, 0x02, 0x0F, 0x0139}, + {0x00, 0x08, 0x09, 0x06, 0x02, 0x0F, 0x015C} +}; + +static const struct WindowTemplate gUnknown_085DFF84 = +{ + 0x00, 0x09, 0x07, 0x05, 0x04, 0x0F, 0x0168 +}; + +static const u8 gUnknown_085DFF8C[] = {0x01, 0x03, 0x02, 0x00}; + +// text +void NewGameInitPCItems(void) +{ + u8 i; + + // because Game Freak don't know how to use a struct or a 2d array + for(i = 0, ClearItemSlots(gSaveBlock1Ptr->pcItems, ARRAY_COUNT(gSaveBlock1Ptr->pcItems)); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) && + AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++); +} + +void BedroomPC(void) +{ + gPcItemMenuOptionOrder = gBedroomPC_OptionOrder; + gPcItemMenuOptionsNum = 4; + DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gText_WhatWouldYouLike, InitPlayerPCMenu); +} + +void PlayerPC(void) +{ + gPcItemMenuOptionOrder = gPlayerPC_OptionOrder; + gPcItemMenuOptionsNum = 3; + DisplayItemMessageOnField(CreateTask(TaskDummy, 0), gText_WhatWouldYouLike, InitPlayerPCMenu); +} + +static void InitPlayerPCMenu(u8 taskId) +{ + u16 *data; + struct WindowTemplate windowTemplate; + + data = gTasks[taskId].data; + if(gPcItemMenuOptionsNum == 3) + windowTemplate = gUnknown_085DFF24[0]; + else + windowTemplate = gUnknown_085DFF24[1]; + windowTemplate.width = sub_81DB3D8(sPlayerPCMenuActions, gPcItemMenuOptionOrder, gPcItemMenuOptionsNum); + data[4] = AddWindow(&windowTemplate); + SetStandardWindowBorderStyle(data[4], 0); + sub_81995E4(data[4], gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], gPcItemMenuOptionsNum, 0); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = PlayerPCProcessMenuInput; +} + +static void PlayerPCProcessMenuInput(u8 taskId) +{ + u16 *data; + s8 inputOptionId; + + data = gTasks[taskId].data; + if(gPcItemMenuOptionsNum > 3) + inputOptionId = ProcessMenuInput(); + else + inputOptionId = ProcessMenuInputNoWrapAround(); + + switch(inputOptionId) + { + case -2: + break; + case -1: + PlaySE(SE_SELECT); + sub_8198070(data[4], FALSE); + ClearWindowTilemap(data[4]); + RemoveWindow(data[4]); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = PlayerPC_TurnOff; + break; + default: + sub_8198070(data[4], FALSE); + ClearWindowTilemap(data[4]); + RemoveWindow(data[4]); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = sPlayerPCMenuActions[gPcItemMenuOptionOrder[inputOptionId]].func.void_u8; + break; + } +} + +void ReshowPlayerPC(u8 var) +{ + DisplayItemMessageOnField(var, gText_WhatWouldYouLike, InitPlayerPCMenu); +} + +static void PlayerPC_ItemStorage(u8 taskId) +{ + InitItemStorageMenu(taskId, ITEMPC_MENU_WITHDRAW); + gTasks[taskId].func = ItemStorageMenuProcessInput; +} + +static void PlayerPC_Mailbox(u8 taskId) +{ + playerPCItemPageInfo.count = GetMailboxMailCount(); + + if (playerPCItemPageInfo.count == 0) + DisplayItemMessageOnField(taskId, gText_NoMailHere, ReshowPlayerPC); + else + { + playerPCItemPageInfo.cursorPos = 0; + playerPCItemPageInfo.itemsAbove = 0; + playerPCItemPageInfo.scrollIndicatorId = 0xFF; + Mailbox_UpdateMailList(); + ItemStorage_SetItemAndMailCount(taskId); + if(sub_81D1C44(playerPCItemPageInfo.count) == TRUE) + { + sub_8197434(0, 0); + Mailbox_DrawMailboxMenu(taskId); + gTasks[taskId].func = Mailbox_ProcessInput; + } + else + DisplayItemMessageOnField(taskId, gText_NoMailHere, ReshowPlayerPC); + } +} + +static void PlayerPC_Decoration(u8 var) +{ + sub_8126B2C(var); //DoPlayerPCDecoration(var); +} + +static void PlayerPC_TurnOff(u8 taskId) +{ + if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling. + { + if (gSaveBlock2Ptr->playerGender == MALE) + ScriptContext1_SetupScript(LittlerootTown_BrendansHouse_2F_EventScript_1F863F); + else + ScriptContext1_SetupScript(LittlerootTown_MaysHouse_2F_EventScript_1F958F); + } + else + { + EnableBothScriptContexts(); + } + DestroyTask(taskId); +} + +static void InitItemStorageMenu(u8 taskId, u8 var) +{ + u16 *data; + struct WindowTemplate windowTemplate; + + data = gTasks[taskId].data; + windowTemplate = gUnknown_085DFF24[2]; + windowTemplate.width = GetMaxWidthInMenuTable(gPCText_ItemPCOptionsText, 4); + data[4] = AddWindow(&windowTemplate); + SetStandardWindowBorderStyle(data[4], 0); + PrintMenuTable(data[4], 4, gPCText_ItemPCOptionsText); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[4], 4, var); + schedule_bg_copy_tilemap_to_vram(0); + ItemStorageMenuPrint(gPCText_OptionDescList[var]); +} + +static void ItemStorageMenuPrint(const u8 *textPtr) +{ + NewMenuHelpers_DrawDialogueFrame(0, 0); + PrintTextOnWindow(0, 1, textPtr, 0, 1, 0, 0); +} + +static void ItemStorageMenuProcessInput(u8 taskId) +{ + s8 r5; + s8 r2; + s8 inputOptionId; + + r5 = GetMenuCursorPos(); + inputOptionId = ProcessMenuInput(); + r2 = GetMenuCursorPos(); + switch(inputOptionId) + { + case -2: + if (r5 != r2) + ItemStorageMenuPrint(gPCText_OptionDescList[r2]); + break; + case -1: + PlaySE(SE_SELECT); + ItemStorage_Exit(taskId); + break; + default: + PlaySE(SE_SELECT); + gPCText_ItemPCOptionsText[inputOptionId].func.void_u8(taskId); + break; + } +} + +static void ItemStorage_Deposit(u8 taskId) +{ + gTasks[taskId].func = Task_ItemStorage_Deposit; + FadeScreen(1, 0); +} + +static void Task_ItemStorage_Deposit(u8 taskId) +{ + if (!gPaletteFade.active) + { + overworld_free_bg_tilemaps(); + sub_81AAC14(); + DestroyTask(taskId); + } +} + +void sub_816B31C(void) +{ + gFieldCallback = Mailbox_DoRedrawMailboxMenuAfterReturn; + SetMainCallback2(CB2_ReturnToField); +} + +void Mailbox_DoRedrawMailboxMenuAfterReturn(void) +{ + sub_81973A4(); + NewMenuHelpers_DrawDialogueFrame(0, 1); + InitItemStorageMenu(CreateTask(ItemStorage_HandleReturnToProcessInput, 0), 1); + pal_fill_black(); +} + +static void ItemStorage_HandleReturnToProcessInput(u8 taskId) +{ + if (IsWeatherNotFadingIn() == TRUE) + gTasks[taskId].func = ItemStorageMenuProcessInput; +} + +static void ItemStorage_Withdraw(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + NUM_ITEMS = CountUsedPCItemSlots(); + if (NUM_ITEMS != 0) + ItemStorage_WithdrawToss_Helper(taskId, FALSE); + else + { + sub_816B4DC(taskId); + DisplayItemMessageOnField(taskId, gText_NoItems, PlayerPC_ItemStorage); + } + +} + +static void ItemStorage_Toss(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + NUM_ITEMS = CountUsedPCItemSlots(); + if (NUM_ITEMS != 0) + ItemStorage_WithdrawToss_Helper(taskId, TRUE); + else + { + sub_816B4DC(taskId); + DisplayItemMessageOnField(taskId, gText_NoItems, PlayerPC_ItemStorage); + } +} + +static void ItemStorage_WithdrawToss_Helper(u8 taskId, bool8 toss) +{ + u16 *data = gTasks[taskId].data; + + data[3] = toss; + sub_816B4DC(taskId); + playerPCItemPageInfo.cursorPos = 0; + playerPCItemPageInfo.itemsAbove = 0; + playerPCItemPageInfo.scrollIndicatorId = 0xFF; + ItemStorage_SetItemAndMailCount(taskId); + sub_816BC14(); + gpu_pal_allocator_reset__manage_upper_four(); + LoadListMenuArrowsGfx(); + sub_8122344(gUnknown_0203BCC4->spriteIds, 7); + sub_8197434(0,0); + gTasks[taskId].func = ItemStorage_ProcessWithdrawTossInput; +} + +static void ItemStorage_Exit(u8 taskId) +{ + sub_816B4DC(taskId); + ReshowPlayerPC(taskId); +} + + +static void ItemStorage_SetItemAndMailCount(u8 taskId) +{ + if (playerPCItemPageInfo.count > 7) + playerPCItemPageInfo.pageItems = 8; + else + playerPCItemPageInfo.pageItems = playerPCItemPageInfo.count + 1; +} + +static void sub_816B4DC(u8 taskId) +{ + u16 *data = gTasks[taskId].data; + + sub_8198070(data[4], FALSE); + ClearWindowTilemap(data[4]); + RemoveWindow(data[4]); + schedule_bg_copy_tilemap_to_vram(0); +} + +static u8 GetMailboxMailCount(void) +{ + u8 i, j; + + for(i = 0, j = 6; j < 16; j++) + if(gSaveBlock1Ptr->mail[j].itemId != 0) + i++; + + return i; +} + +static void Mailbox_UpdateMailList(void) +{ + struct MailStruct mailBuffer; + u8 i, j; + + for (i=6; i<15; i++) + { + for (j=i+1; j<16; j++) + { + if (gSaveBlock1Ptr->mail[i].itemId == 0) + { + mailBuffer = gSaveBlock1Ptr->mail[i]; + gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j]; + gSaveBlock1Ptr->mail[j] = mailBuffer; + } + } + } +} + +static void Mailbox_DrawMailboxMenu(u8 taskId) +{ + u8 windowId; + + windowId = sub_81D1C84(0); + sub_81D1C84(1); + PrintTextOnWindow(windowId, 1, gText_Mailbox, GetStringCenterAlignXOffset(1, gText_Mailbox, 0x40), 1, 0, NULL); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].data[5] = sub_81D1DC0(&playerPCItemPageInfo); + sub_81D1E90(&playerPCItemPageInfo); +} + +static void Mailbox_ProcessInput(u8 taskId) +{ + u16 *data = gTasks[taskId].data; + s32 inputOptionId; + + if(!gPaletteFade.active) + { + inputOptionId = ListMenuHandleInputGetItemId(data[5]); + ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + + switch(inputOptionId) + { + case -1: + break; + case -2: + PlaySE(SE_SELECT); + RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); + Mailbox_ReturnToPlayerPC(taskId); + break; + default: + PlaySE(SE_SELECT); + sub_81D1D04(0); + sub_81D1D04(1); + DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + schedule_bg_copy_tilemap_to_vram(0); + RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); + gTasks[taskId].func = Mailbox_PrintWhatToDoWithPlayerMailText; + break; + } + } +} + +static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) +{ + StringCopy(gStringVar1, gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos].playerName); + sub_81DB554(gStringVar1, 0); + StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithVar1sMail); + DisplayItemMessageOnField(taskId, gStringVar4, Mailbox_PrintMailOptions); +} + +static void Mailbox_ReturnToPlayerPC(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + sub_81D1D04(0); + sub_81D1D04(1); + DestroyListMenuTask(data[5], NULL, NULL); + schedule_bg_copy_tilemap_to_vram(0); + sub_81D1EC0(); + ReshowPlayerPC(taskId); +} + +static void Mailbox_PrintMailOptions(u8 taskId) +{ + u8 r4 = sub_81D1C84(2); + PrintMenuTable(r4, 4, gMailboxMailOptions); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(r4, 4, 0); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = Mailbox_MailOptionsProcessInput; +} + +static void Mailbox_MailOptionsProcessInput(u8 taskId) +{ + s8 inputOptionId = ProcessMenuInput_other(); + + switch(inputOptionId) + { + case -2: + break; + case -1: + PlaySE(SE_SELECT); + Mailbox_Cancel(taskId); + break; + + default: + PlaySE(SE_SELECT); + gMailboxMailOptions[inputOptionId].func.void_u8(taskId); + break; + } +} + +static void Mailbox_DoMailRead(u8 taskId) +{ + FadeScreen(1, 0); + gTasks[taskId].func = Mailbox_FadeAndReadMail; +} + +static void Mailbox_FadeAndReadMail(u8 taskId) +{ + if(!gPaletteFade.active) + { + sub_81D1EC0(); + overworld_free_bg_tilemaps(); + ReadMail(&(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]), Mailbox_ReturnToFieldFromReadMail, TRUE); + DestroyTask(taskId); + } +} + +static void Mailbox_ReturnToFieldFromReadMail(void) +{ + gFieldCallback = pal_fill_for_maplights_or_black; + SetMainCallback2(CB2_ReturnToField); +} + +static void pal_fill_for_maplights_or_black(void) +{ + u8 taskId; + + sub_81973A4(); + taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); + if(sub_81D1C44(playerPCItemPageInfo.count) == TRUE) + Mailbox_DrawMailboxMenu(taskId); + else + DestroyTask(taskId); + pal_fill_black(); +} + +static void Mailbox_HandleReturnToProcessInput(u8 taskId) +{ + if(IsWeatherNotFadingIn() == TRUE) + gTasks[taskId].func = Mailbox_ProcessInput; +} + +static void Mailbox_MoveToBag(u8 taskId) +{ + DisplayItemMessageOnField(taskId, gText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove); +} + +static void Mailbox_DrawYesNoBeforeMove(u8 taskId) +{ + sub_8197930(); + gTasks[taskId].func = Mailbox_MoveToBagYesNoPrompt; +} + +static void Mailbox_MoveToBagYesNoPrompt(u8 taskId) +{ + switch(ProcessMenuInputNoWrap_()) + { + case 0: + Mailbox_DoMailMoveToBag(taskId); + break; + case -1: + PlaySE(SE_SELECT); + case 1: + Mailbox_CancelMoveToBag(taskId); + break; + case -2: + default: + break; + } +} + +static void Mailbox_DoMailMoveToBag(u8 taskId) +{ + struct MailStruct *mailStruct = &(gSaveBlock1Ptr->mail[playerPCItemPageInfo.itemsAbove + 6 + playerPCItemPageInfo.cursorPos]); + if(!AddBagItem(mailStruct->itemId, 1)) + { + DisplayItemMessageOnField(taskId, gText_BagIsFull, Mailbox_Cancel); + } + else + { + DisplayItemMessageOnField(taskId, gText_MailToBagMessageErased, Mailbox_Cancel); + ClearMailStruct(mailStruct); + Mailbox_UpdateMailList(); + playerPCItemPageInfo.count--; + if(playerPCItemPageInfo.count < (playerPCItemPageInfo.pageItems + playerPCItemPageInfo.itemsAbove) && playerPCItemPageInfo.itemsAbove != 0) + playerPCItemPageInfo.itemsAbove--; + ItemStorage_SetItemAndMailCount(taskId); + } +} + +static void Mailbox_CancelMoveToBag(u8 taskId) +{ + Mailbox_Cancel(taskId); +} + +static void Mailbox_Give(u8 taskId) +{ + if(CalculatePlayerPartyCount() == 0) + Mailbox_NoPokemonForMail(taskId); + else + { + FadeScreen(1, 0); + gTasks[taskId].func = Mailbox_DoGiveMailPokeMenu; + } +} + +static void Mailbox_DoGiveMailPokeMenu(u8 taskId) +{ + if(!gPaletteFade.active) + { + sub_81D1EC0(); + overworld_free_bg_tilemaps(); + sub_81B8448(); + DestroyTask(taskId); + } +} + +void Mailbox_ReturnToMailListAfterDeposit(void) +{ + gFieldCallback = Mailbox_UpdateMailListAfterDeposit; + SetMainCallback2(CB2_ReturnToField); +} + +static void Mailbox_UpdateMailListAfterDeposit(void) +{ + u8 taskId; + u8 prevCount; + taskId = CreateTask(Mailbox_HandleReturnToProcessInput, 0); + prevCount = playerPCItemPageInfo.count; + playerPCItemPageInfo.count = GetMailboxMailCount(); + Mailbox_UpdateMailList(); + if(prevCount != playerPCItemPageInfo.count && (playerPCItemPageInfo.count < (playerPCItemPageInfo.pageItems + playerPCItemPageInfo.itemsAbove)) + && playerPCItemPageInfo.itemsAbove != 0) + playerPCItemPageInfo.itemsAbove--; + ItemStorage_SetItemAndMailCount(taskId); + sub_81973A4(); + if(sub_81D1C44(playerPCItemPageInfo.count) == TRUE) + Mailbox_DrawMailboxMenu(taskId); + else + DestroyTask(taskId); + pal_fill_black(); +} + +static void Mailbox_NoPokemonForMail(u8 taskId) +{ + DisplayItemMessageOnField(taskId, gText_NoPokemon, Mailbox_Cancel); +} + +static void Mailbox_Cancel(u8 taskId) +{ + sub_81D1D04(2); + sub_8197434(0, 0); + Mailbox_DrawMailboxMenu(taskId); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = Mailbox_ProcessInput; +} + +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; +} + +static void sub_816BC58(void) +{ + u32 i; + + for(i = 0; i < 6; i++) + sub_816BCC4(i); + Free(gUnknown_0203BCC4); +} + +static u8 sub_816BC7C(u8 a) +{ + u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]); + if(*windowIdLoc == 0xFF) + { + *windowIdLoc = AddWindow(&gUnknown_085DFF5C[a]); + SetWindowBorderStyle(*windowIdLoc, FALSE, 0x214, 0xE); + schedule_bg_copy_tilemap_to_vram(0); + } + return *windowIdLoc; +} + +static void sub_816BCC4(u8 a) +{ + u8 *windowIdLoc = &(gUnknown_0203BCC4->windowIds[a]); + if(*windowIdLoc != 0xFF) + { + sub_8198070(*windowIdLoc, FALSE); + ClearWindowTilemap(*windowIdLoc); + schedule_bg_copy_tilemap_to_vram(0); + RemoveWindow(*windowIdLoc); + *windowIdLoc = 0xFF; + } +} + +void ItemStorage_RefreshListMenu(void) +{ + u16 i; + + for(i = 0; i < playerPCItemPageInfo.count - 1; i++) + { + CopyItemName_PlayerPC(&(gUnknown_0203BCC4->unk198[i][0]), gSaveBlock1Ptr->pcItems[i].itemId); + gUnknown_0203BCC4->unk0[i].name = &(gUnknown_0203BCC4->unk198[i][0]); + gUnknown_0203BCC4->unk0[i].id = i; + } + StringCopy(&(gUnknown_0203BCC4->unk198[i][0]) ,gText_Cancel2); + gUnknown_0203BCC4->unk0[i].name = &(gUnknown_0203BCC4->unk198[i][0]); + gUnknown_0203BCC4->unk0[i].id = -2; + gMultiuseListMenuTemplate = gUnknown_085DFF44; + gMultiuseListMenuTemplate.windowId = sub_816BC7C(0); + gMultiuseListMenuTemplate.totalItems = playerPCItemPageInfo.count; + gMultiuseListMenuTemplate.items = gUnknown_0203BCC4->unk0; + gMultiuseListMenuTemplate.maxShowed = playerPCItemPageInfo.pageItems; +} + +void CopyItemName_PlayerPC(u8 *string, u16 itemId) +{ + CopyItemName(itemId, string); +} + +static void ItemStorage_MoveCursor(s32 id, bool8 b, struct ListMenu *thisMenu) +{ + if(b != TRUE) + PlaySE(SE_SELECT); + if(gUnknown_0203BCC4->unk666 == 0xFF) + { + sub_816C0C8(); + if(id != -2) + sub_816C060(gSaveBlock1Ptr->pcItems[id].itemId); + else + sub_816C060(ITEMPC_GO_BACK_TO_PREV); + sub_816BEF0(id); + } +} + +static void fish4_goto_x5_or_x6(u8 windowId, s32 id, u8 yOffset) +{ + if(id != -2) + { + if(gUnknown_0203BCC4->unk666 != 0xFF) + { + if(gUnknown_0203BCC4->unk666 == (u8)id) + sub_816BFE0(yOffset, 0, 0xFF); + else + sub_816BFE0(yOffset, 0xFF, 0xFF); + } + ConvertIntToDecimalStringN(gStringVar1, gSaveBlock1Ptr->pcItems[id].quantity, STR_CONV_MODE_RIGHT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_xVar1); + PrintTextOnWindow(windowId, 7, gStringVar4, GetStringRightAlignXOffset(7, gStringVar4, 104), yOffset, 0xFF, NULL); + } +} + +static void sub_816BEF0(s32 id) +{ + const u8* description; + u8 windowId = gUnknown_0203BCC4->windowIds[1]; + + if(id != -2) + description = (u8 *)ItemId_GetDescription(gSaveBlock1Ptr->pcItems[id].itemId); + else + description = ItemStorage_GetItemPcResponse(ITEMPC_GO_BACK_TO_PREV); + FillWindowPixelBuffer(windowId, 17); + PrintTextOnWindow(windowId, 1, description, 0, 1, 0, NULL); +} + +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)); +} + +static void ItemStorage_RemoveScrollIndicator(void) +{ + if(playerPCItemPageInfo.scrollIndicatorId != 0xFF) + { + RemoveScrollIndicatorArrowPair(playerPCItemPageInfo.scrollIndicatorId); + playerPCItemPageInfo.scrollIndicatorId = 0xFF; + } +} + +static void sub_816BFB8(u8 a, u8 b, u8 speed) +{ + sub_816BFE0(ListMenuGetYCoordForPrintingArrowCursor(a), b, speed); +} + +static void sub_816BFE0(u8 y, u8 b, u8 speed) +{ + u8 windowId = gUnknown_0203BCC4->windowIds[0]; + if(b == 0xFF) + FillWindowPixelRect(windowId, 17, 0, y, GetMenuCursorDimensionByFont(1, 0), GetMenuCursorDimensionByFont(1, 1)); + else + AddTextPrinterParameterized2(windowId, 1, 0, y, 0, 0, gUnknown_085DFF8C, speed, gText_SelectorArrow2); +} + +static void sub_816C060(u16 itemId) +{ + u8 spriteId; + u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId); + + if(*spriteIdLoc == 0xFF) + { + FreeSpriteTilesByTag(0x13F6); + FreeSpritePaletteByTag(0x13F6); + spriteId = AddItemIconSprite(0x13F6, 0x13F6, itemId); + if(spriteId != 64) + { + *spriteIdLoc = spriteId; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.x = 24; + gSprites[spriteId].pos2.y = 80; + } + } +} + +static void sub_816C0C8(void) +{ + u8* spriteIdLoc = &(gUnknown_0203BCC4->spriteId); + if(*spriteIdLoc != 0xFF) + { + FreeSpriteTilesByTag(0x13F6); + FreeSpritePaletteByTag(0x13F6); + DestroySprite(&(gSprites[*spriteIdLoc])); + *spriteIdLoc = 0xFF; + } +} + +static void sub_816C110(void) +{ + CompactPCItems(); + sub_812220C(gSaveBlock1Ptr->pcItems, 50, &(playerPCItemPageInfo.pageItems), &(playerPCItemPageInfo.count), 0x8); +} + +static void sub_816C140(void) +{ + sub_812225C(&(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos), playerPCItemPageInfo.pageItems, playerPCItemPageInfo.count); +} + +static void ItemStorage_ProcessWithdrawTossInput(u8 taskId) +{ + s16 *data; + bool32 toss; + u32 i, x; + u8 windowId; + const u8* text; + + data = gTasks[taskId].data; + for(i = 0; i <=3; i++) + sub_816BC7C(i); + toss = data[3]; + text = gText_TossItem; + if(!toss) + text = gText_WithdrawItem; + x = GetStringCenterAlignXOffset(1, text, 104); + PrintTextOnWindow(gUnknown_0203BCC4->windowIds[3], 1, text, x, 1, 0, NULL); + CopyWindowToVram(gUnknown_0203BCC4->windowIds[2], 2); + sub_816C110(); + sub_816C140(); + ItemStorage_RefreshListMenu(); + data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); + ItemStorage_StartScrollIndicator(); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = ItemStorage_ProcessInput; +} + +static const u8* ItemStorage_GetItemPcResponse(u16 itemId) +{ + const u8 *string; + + switch(itemId) + { + case ITEMPC_GO_BACK_TO_PREV: + string = gText_GoBackPrevMenu; + break; + case ITEMPC_HOW_MANY_TO_WITHDRAW: + string = gText_WithdrawHowManyItems; + break; + case ITEMPC_WITHDREW_THING: + string = gText_WithdrawXItems; + break; + case ITEMPC_HOW_MANY_TO_TOSS: + string = gText_TossHowManyVar1s; + break; + case ITEMPC_THREW_AWAY_ITEM: + string = gText_ThrewAwayVar2Var1s; + break; + case ITEMPC_NO_MORE_ROOM: + string = gText_NoRoomInBag; + break; + case ITEMPC_TOO_IMPORTANT: + string = gText_TooImportantToToss; + break; + case ITEMPC_OKAY_TO_THROW_AWAY: + string = gText_ConfirmTossItems; + break; + case ITEMPC_SWITCH_WHICH_ITEM: + string = gText_MoveVar1Where; + break; + default: + string = ItemId_GetDescription(itemId); + break; + } + return string; +} + +static void ItemStorage_PrintItemPcResponse(const u8 *string) +{ + u8 windowId = gUnknown_0203BCC4->windowIds[1]; + FillWindowPixelBuffer(windowId, 0x11); + StringExpandPlaceholders(gStringVar4, string); + PrintTextOnWindow(windowId, 1, gStringVar4, 0, 1, 0, NULL); +} + +static void ItemStorage_ProcessInput(u8 taskId) +{ + s16 *data; + s32 id; + + data = gTasks[taskId].data; + if(gMain.newKeys & SELECT_BUTTON) + { + ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + if((playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos) != (playerPCItemPageInfo.count - 1)) + { + PlaySE(SE_SELECT); + ItemStorage_ItemSwapChoosePrompt(taskId); + } + } + else + { + id = ListMenuHandleInputGetItemId(data[5]); + ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + switch(id) + { + case -1: + break; + case -2: + PlaySE(SE_SELECT); + ItemStorage_GoBackToPlayerPCMenu(taskId); + break; + default: + PlaySE(SE_SELECT); + ItemStorage_DoItemAction(taskId); + break; + } + } +} + +static void ItemStorage_GoBackToPlayerPCMenu_InitStorage(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + if(!IsDma3ManagerBusyWithBgCopy()) + { + NewMenuHelpers_DrawDialogueFrame(0, 0); + if(!data[3]) + InitItemStorageMenu(taskId, ITEMPC_MENU_WITHDRAW); + else + InitItemStorageMenu(taskId, ITEMPC_MENU_TOSS); + gTasks[taskId].func = ItemStorageMenuProcessInput; + } +} + +static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + sub_816C0C8(); + ItemStorage_RemoveScrollIndicator(); + DestroyListMenuTask(data[5], NULL, NULL); + sub_81223B0(gUnknown_0203BCC4->spriteIds, 7); + sub_816BC58(); + gTasks[taskId].func = ItemStorage_GoBackToPlayerPCMenu_InitStorage; +} + +static void ItemStorage_ItemSwapChoosePrompt(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + ListMenuSetUnkIndicatorsStructField(data[5], 16, 1); + gUnknown_0203BCC4->unk666 = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos); + sub_816BFB8(data[5], 0, 0); + sub_816C690(gUnknown_0203BCC4->unk666); + CopyItemName(gSaveBlock1Ptr->pcItems[gUnknown_0203BCC4->unk666].itemId, gStringVar1); + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_SWITCH_WHICH_ITEM)); + gTasks[taskId].func = sub_816C4FC; +} + +static void sub_816C4FC(u8 taskId) +{ + s16 *data; + s32 id; + + data = gTasks[taskId].data; + if(gMain.newKeys & SELECT_BUTTON) + { + ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + ItemStorage_DoItemSwap(taskId, FALSE); + return; + } + id = ListMenuHandleInputGetItemId(data[5]); + ListMenuGetScrollAndRow(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + sub_81223FC(gUnknown_0203BCC4->spriteIds, 7, 0); + sub_816C690(playerPCItemPageInfo.cursorPos); + switch(id) + { + case -1: + break; + case -2: + if(gMain.newKeys & A_BUTTON) + { + ItemStorage_DoItemSwap(taskId, FALSE); + } + else + ItemStorage_DoItemSwap(taskId, TRUE); + break; + default: + ItemStorage_DoItemSwap(taskId, FALSE); + break; + } +} + +static void ItemStorage_DoItemSwap(u8 taskId, bool8 a) +{ + s16 *data; + u16 b; + u8 c; + + data = gTasks[taskId].data; + b = (playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos); + PlaySE(SE_SELECT); + DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + if(!a) + { + c = gUnknown_0203BCC4->unk666; + if(c != b) + { + if(c != b - 1) + { + MoveItemSlotInList(gSaveBlock1Ptr->pcItems, c, 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); + gUnknown_0203BCC4->unk666 = 0xFF; + data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); + schedule_bg_copy_tilemap_to_vram(0); + gTasks[taskId].func = ItemStorage_ProcessInput; +} + +static void sub_816C690(u8 a) +{ + sub_8122448(gUnknown_0203BCC4->spriteIds, 7, 128, ((a+1) * 16)); +} + +static void sub_816C6BC(u8 windowId, u16 value, u32 mode, u8 x, u8 y, u8 n) +{ + ConvertIntToDecimalStringN(gStringVar1, value, mode, n); + StringExpandPlaceholders(gStringVar4, gText_xVar1); + PrintTextOnWindow(windowId, 1, gStringVar4, GetStringCenterAlignXOffset(1, gStringVar4, 48), y, 0, NULL); +} + +static void ItemStorage_DoItemAction(u8 taskId) +{ + s16 *data; + u16 b; + + data = gTasks[taskId].data; + b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); + ItemStorage_RemoveScrollIndicator(); + data[2] = 1; + if(!data[3]) + { + if(gSaveBlock1Ptr->pcItems[b].quantity == 1) + { + ItemStorage_DoItemWithdraw(taskId); + return; + } + CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_HOW_MANY_TO_WITHDRAW)); + } + else + { + if(gSaveBlock1Ptr->pcItems[b].quantity == 1) + { + ItemStorage_DoItemToss(taskId); + return; + } + CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS)); + } + sub_816C6BC(sub_816BC7C(4), data[2], STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3); + gTasks[taskId].func = ItemStorage_HandleQuantityRolling; +} + +static void ItemStorage_HandleQuantityRolling(u8 taskId) +{ + s16 *data; + u16 b; + + data = gTasks[taskId].data; + b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); + if(AdjustQuantityAccordingToDPadInput(&(data[2]), gSaveBlock1Ptr->pcItems[b].quantity) == TRUE) + sub_816C6BC(sub_816BC7C(4), data[2], STR_CONV_MODE_LEADING_ZEROS, 8, 1, 3); + else + { + if(gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + sub_816BCC4(4); + if(!data[3]) + ItemStorage_DoItemWithdraw(taskId); + else + ItemStorage_DoItemToss(taskId); + } + else if(gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_816BCC4(4); + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[b].itemId)); + ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + } + } +} + +static void ItemStorage_DoItemWithdraw(u8 taskId) +{ + s16 *data; + u16 b; + + data = gTasks[taskId].data; + b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); + if(AddBagItem(gSaveBlock1Ptr->pcItems[b].itemId, data[2]) == TRUE) + { + CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, data[2], STR_CONV_MODE_LEFT_ALIGN, 3); + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_WITHDREW_THING)); + gTasks[taskId].func = ItemStorage_HandleRemoveItem; + } + else + { + data[2] = 0; + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_NO_MORE_ROOM)); + gTasks[taskId].func = ItemStorage_WaitPressHandleResumeProcessInput; + } +} + +static void ItemStorage_DoItemToss(u8 taskId) +{ + s16 *data; + u16 b; + + data = gTasks[taskId].data; + b = (playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove); + if(!ItemId_GetImportance(gSaveBlock1Ptr->pcItems[b].itemId)) + { + CopyItemName(gSaveBlock1Ptr->pcItems[b].itemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, data[2], STR_CONV_MODE_LEFT_ALIGN, 3); + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_OKAY_TO_THROW_AWAY)); + CreateYesNoMenuWithCallbacks(taskId, &gUnknown_085DFF84, 1, 0, 1, 0x214, 0xE, &ResumeFromWithdrawYesNoFuncList); + } + else + { + data[2] = 0; + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_TOO_IMPORTANT)); + gTasks[taskId].func = ItemStorage_WaitPressHandleResumeProcessInput; + } +} + +static void ItemStorage_ResumeInputFromYesToss(u8 taskId) +{ + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(ITEMPC_THREW_AWAY_ITEM)); + gTasks[taskId].func = ItemStorage_HandleRemoveItem; +} + +static void ItemStorage_ResumeInputFromNoToss(u8 taskId) +{ + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[(playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos)].itemId)); + ItemStorage_StartScrollIndicatorAndProcessInput(taskId); +} + +static void ItemStorage_HandleRemoveItem(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + if(gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + RemovePCItem((playerPCItemPageInfo.cursorPos + playerPCItemPageInfo.itemsAbove), data[2]); + DestroyListMenuTask(data[5], &(playerPCItemPageInfo.itemsAbove), &(playerPCItemPageInfo.cursorPos)); + sub_816C110(); + sub_816C140(); + ItemStorage_RefreshListMenu(); + data[5] = ListMenuInit(&gMultiuseListMenuTemplate, playerPCItemPageInfo.itemsAbove, playerPCItemPageInfo.cursorPos); + ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + } +} + +static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + if(gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + ItemStorage_PrintItemPcResponse(ItemStorage_GetItemPcResponse(gSaveBlock1Ptr->pcItems[(playerPCItemPageInfo.itemsAbove + playerPCItemPageInfo.cursorPos)].itemId)); + ItemStorage_StartScrollIndicatorAndProcessInput(taskId); + } +} + +static void ItemStorage_StartScrollIndicatorAndProcessInput(u8 taskId) +{ + ItemStorage_StartScrollIndicator(); + gTasks[taskId].func = ItemStorage_ProcessInput; +} diff --git a/src/pokeball.c b/src/pokeball.c index 8173c4a90..3dbbb2967 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -665,7 +665,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) gTasks[taskId].tCryTaskState = wantedCry + 1; break; case 1: - if (ShouldPlayNormalPokeCry(mon) == TRUE) + if (ShouldPlayNormalMonCry(mon) == TRUE) PlayCry3(species, pan, 0); else PlayCry3(species, pan, 11); @@ -680,7 +680,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) case 20: if (gTasks[taskId].tCryTaskFrames == 0) { - if (ShouldPlayNormalPokeCry(mon) == TRUE) + if (ShouldPlayNormalMonCry(mon) == TRUE) PlayCry4(species, pan, 1); else PlayCry4(species, pan, 12); @@ -719,7 +719,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) gTasks[taskId].tCryTaskFrames--; break; } - if (ShouldPlayNormalPokeCry(mon) == TRUE) + if (ShouldPlayNormalMonCry(mon) == TRUE) PlayCry4(species, pan, 0); else PlayCry4(species, pan, 11); diff --git a/src/pokeblock.c b/src/pokeblock.c index b244409c4..7dd20b237 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -3,6 +3,7 @@ #include "bg.h" #include "strings.h" #include "text.h" +#include "text_window.h" #include "menu.h" #include "task.h" #include "menu_helpers.h" @@ -24,11 +25,11 @@ #include "constants/songs.h" #include "sound.h" #include "berry.h" -#include "menu_indicators.h" #include "event_data.h" #include "battle_message.h" #include "safari_zone.h" #include "lilycove_lady.h" +#include "overworld.h" #define POKEBLOCK_MAX_FEEL 99 #define FIELD_E75_COUNT 7 @@ -70,14 +71,11 @@ enum }; extern u16 gSpecialVar_ItemId; -extern void (*gFieldCallback)(void); extern const u16 gUnknown_0860F074[]; extern void CB2_ReturnToField(void); extern bool8 sub_81221EC(void); -extern void sub_809882C(u8, u16, u8); -extern void copy_textbox_border_tile_patterns_to_vram(u8, u16, u8); extern void sub_80AF168(void); // this file's functions @@ -316,19 +314,19 @@ static const struct ListMenuTemplate sPokeblockListMenuTemplate = { .items = NULL, .moveCursorFunc = MovePokeblockMenuCursor, - .unk_08 = NULL, + .itemPrintFunc = NULL, .totalItems = 0, .maxShowed = 0, .windowId = 1, - .unk_11 = 0, - .unk_12 = 1, + .header_X = 0, + .item_X = 1, .cursor_X = 0, .upText_Y = 1, .cursorPal = 2, .fillValue = 0, .cursorShadowPal = 3, .lettersSpacing = 0, - .unk_16_3 = 0, + .itemVerticalPadding = 0, .scrollMultiple = LIST_MULTIPLE_SCROLL_DPAD, .fontId = 1, .cursorKind = 1 @@ -460,7 +458,7 @@ static bool8 InitPokeblockMenu(void) gMain.state++; break; case 10: - sub_8122344(&sPokeblockMenu->field_E75, FIELD_E75_COUNT); + sub_8122344(sPokeblockMenu->field_E75, FIELD_E75_COUNT); gMain.state++; break; case 11: @@ -493,7 +491,7 @@ static bool8 InitPokeblockMenu(void) gMain.state++; break; case 18: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -567,8 +565,8 @@ static void HandleInitWindows(void) InitWindows(sWindowTemplatesForPokeblockMenu); DeactivateAllTextPrinters(); - sub_809882C(0, 1, 0xE0); - copy_textbox_border_tile_patterns_to_vram(0, 0xA, 0xD0); + LoadUserWindowBorderGfx(0, 1, 0xE0); + LoadMessageBoxGfx(0, 0xA, 0xD0); LoadPalette(gUnknown_0860F074, 0xF0, 0x20); for (i = 0; i < ARRAY_COUNT(sWindowTemplatesForPokeblockMenu) - 1; i++) @@ -589,7 +587,7 @@ static void PutPokeblockInfoText(void) { u8 i; - const u8 *itemName = ItemId_GetItem(ITEM_POKEBLOCK_CASE)->name; + const u8 *itemName = ItemId_GetName(ITEM_POKEBLOCK_CASE); PrintOnPokeblockWindow(0, itemName, GetStringCenterAlignXOffset(1, itemName, 0x48)); PrintOnPokeblockWindow(2, gText_Spicy, 0); @@ -808,7 +806,7 @@ static void sub_81363BC(void) { if (sPokeblockMenu->unkTaskId == 0xFF) { - sPokeblockMenu->unkTaskId = AddScrollIndicatorArrowPairParametrized(2, 0xB0, 8, 0x98, sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed, + sPokeblockMenu->unkTaskId = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xB0, 8, 0x98, sPokeblockMenu->itemsNo - sPokeblockMenu->maxShowed, 0x456, 0x456, &sSavedPokeblockData.lastItemPage); } } @@ -856,7 +854,7 @@ static void sub_8136470(struct Sprite *sprite) static void FadePaletteAndSetTaskToClosePokeblockCase(u8 taskId) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskId].func = Task_FreeDataAndExitPokeblockCase; } diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index db92d56a8..5f06ed7e8 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -21,6 +21,7 @@ #include "sound.h" #include "trig.h" #include "graphics.h" +#include "text_window.h" #include "battle.h" // to get rid of once gMonSpritesGfxPtr is put elsewhere struct PokeblockFeedStruct @@ -58,8 +59,6 @@ extern const struct CompressedSpriteSheet gMonFrontPicTable[]; extern const u16 gUnknown_0860F074[]; extern bool8 sub_81221EC(void); -extern void sub_806A068(u16, u8); -extern void sub_809882C(u8, u16, u8); // this file's functions static void HandleInitBackgrounds(void); @@ -597,7 +596,7 @@ static bool8 TransitionToPokeblockFeedScene(void) gMain.state++; break; case 13: - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -661,7 +660,7 @@ static bool8 LoadMonAndSceneGfx(struct Pokemon *mon) palette = GetMonSpritePalStructFromOtIdPersonality(species, trainerId, personality); LoadCompressedObjectPalette(palette); - sub_806A068(palette->tag, 1); + SetMultiuseSpriteTemplateToPokemon(palette->tag, 1); sPokeblockFeed->loadGfxState++; break; case 2: @@ -706,7 +705,7 @@ static void HandleInitWindows(void) { InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); - sub_809882C(0, 1, 0xE0); + LoadUserWindowBorderGfx(0, 1, 0xE0); LoadPalette(gUnknown_0860F074, 0xF0, 0x20); FillWindowPixelBuffer(0, 0); PutWindowTilemap(0); @@ -811,7 +810,7 @@ static void Task_ReturnAfterPaletteFade(u8 taskId) static void Task_PaletteFadeToReturn(u8 taskId) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskId].func = Task_ReturnAfterPaletteFade; } @@ -827,7 +826,7 @@ static void Task_PaletteFadeToReturn(u8 taskId) static u8 CreateMonSprite(struct Pokemon* mon) { u16 species = GetMonData(mon, MON_DATA_SPECIES2); - u8 spriteId = CreateSprite(&gUnknown_0202499C, 48, 80, 2); + u8 spriteId = CreateSprite(&gMultiuseSpriteTemplate, 48, 80, 2); sPokeblockFeed->species = species; sPokeblockFeed->monSpriteId_ = spriteId; diff --git a/src/pokedex.c b/src/pokedex.c index a74594865..0d73a9fe1 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -6,14 +6,286 @@ #include "decompress.h" #include "bg.h" #include "window.h" +#include "event_data.h" +#include "palette.h" +#include "main.h" +#include "sound.h" +#include "task.h" +#include "battle_dome_cards.h" +#include "scanline_effect.h" +#include "malloc.h" +#include "gpu_regs.h" +#include "constants/songs.h" +#include "constants/species.h" +#include "constants/rgb.h" +#include "overworld.h" +#include "menu.h" +#include "text_window.h" +#include "data2.h" +#include "string_util.h" +#include "trig.h" +#include "pokedex_area_screen.h" +#include "pokedex_cry_screen.h" +#include "strings.h" +#include "m4a.h" +#include "international_string_util.h" + +static EWRAM_DATA struct PokedexView *gUnknown_02039B4C = NULL; +static EWRAM_DATA u16 gUnknown_02039B50 = 0; +static EWRAM_DATA u8 gUnknown_02039B52 = 0; +static EWRAM_DATA struct PokedexListItem *gUnknown_02039B54 = NULL; + +u8 gUnknown_030060B0; +MainCallback gUnknown_030060B4; +u8 gUnknown_030061EC; + +struct PokedexEntry +{ + /*0x00*/ u8 categoryName[12]; + /*0x0C*/ u16 height; //in decimeters + /*0x0E*/ u16 weight; //in hectograms + /*0x10*/ const u8 *description; + /*0x14*/ u16 unused; + /*0x16*/ u16 pokemonScale; + /*0x18*/ u16 pokemonOffset; + /*0x1A*/ u16 trainerScale; + /*0x1C*/ u16 trainerOffset; +}; /*size = 0x20*/ + +struct UnknownStruct2 +{ + const u8 *text1; + const u8 *text2; +}; + +struct UnknownStruct1 +{ + const struct UnknownStruct2 *unk0; + u8 unk4; + u8 unk5; + u16 unk6; +}; + +struct UnknownStruct3 +{ + const u8 *text; + u8 unk4; + u8 unk5; + u8 unk6; +}; + +struct UnknownStruct4 +{ + const u8 *text; + u8 unk4; + u8 unk5; + u8 unk6; + u8 unk7; + u8 unk8; + u8 unk9; +}; + +//TO BE CONVERTED TO C + +extern const u8 gUnknown_0855D30C[]; +extern struct BgTemplate gUnknown_0856E630[]; +extern struct WindowTemplate gUnknown_0856E640[]; +extern const u16 gUnknown_0856E610[16]; +extern const struct PokedexEntry gPokedexEntries[]; +extern struct BgTemplate gUnknown_0856E668[]; +extern struct WindowTemplate gUnknown_0856E670[]; +extern const u8 *gMonFootprintTable[]; +extern u8 gUnknown_0856ED08[][4]; +extern struct BgTemplate gUnknown_0856EFF8[]; +extern struct WindowTemplate gUnknown_0856F008[]; +extern const u8 gUnknown_0856ED9C[][4]; +extern const u8 gUnknown_0856EDB8[][4]; +extern const u8 gUnknown_0856EDD4[][4]; +extern const u8 gUnknown_0856EDF0[][4]; +extern const struct UnknownStruct1 gUnknown_0856EFC8[]; +extern const struct UnknownStruct3 gUnknown_0856ED30[]; +extern const struct UnknownStruct4 gUnknown_0856ED48[]; +extern const struct UnknownStruct2 gUnknown_0856EE0C[]; +extern const struct UnknownStruct2 gUnknown_0856EE5C[]; +extern const struct UnknownStruct2 gUnknown_0856EEB4[]; +extern const struct UnknownStruct2 gUnknown_0856EF14[]; +extern const struct UnknownStruct2 gUnknown_0856EE24[]; +extern const u8 gUnknown_0856EFAC[]; +extern const u8 gUnknown_0856EFAE[]; +extern const u8 gUnknown_0856EFB4[]; + +#define HOENN_DEX_COUNT 202 +#define NATIONAL_DEX_COUNT 386 + +extern struct MusicPlayerInfo gMPlayInfo_BGM; + +struct PokedexListItem +{ + u16 dexNum; + u16 seen:1; + u16 owned:1; +}; + +struct PokedexView +{ + struct PokedexListItem unk0[NATIONAL_DEX_COUNT]; + u16 unk608; + u8 unk60A_1:1; + u8 unk60A_2:1; + u8 unk60B; + u16 pokemonListCount; + u16 selectedPokemon; + u16 unk610; + u16 dexMode; + u16 unk614; + u16 dexOrder; + u16 unk618; + u16 unk61A; + u16 unk61C; + u16 unk61E[4]; + u16 selectedMonSpriteId; + u16 unk628; + u16 unk62A; + u8 unk62C; + u8 unk62D; + u8 unk62E; + u8 unk62F; + s16 unk630; + s16 unk632; + u16 unk634; + u16 unk636; + u16 unk638; + u16 unk63A[4]; + u8 filler642[8]; + u8 unk64A; + u8 unk64B; + u8 unk64C_1:1; + u8 selectedScreen; + u8 unk64E; + u8 menuIsOpen; //menuIsOpen + u16 menuCursorPos; //Menu cursor position + s16 menuY; //Menu Y position (inverted because we use REG_BG0VOFS for this) + u8 unk654[8]; + u8 unk65C[8]; +}; + +enum +{ + DEX_MODE_HOENN, + DEX_MODE_NATIONAL +}; + +enum +{ + AREA_SCREEN, + CRY_SCREEN, + SIZE_SCREEN, + CANCEL_SCREEN, +}; // this file's functions +void sub_80BB774(void); +void sub_80BB78C(u8); +void sub_80BB7D4(u8); +void sub_80BBA28(u8); +void sub_80BBA78(u8); +void sub_80BBBF4(u8); +void sub_80BBC74(u8); +void sub_80BBD1C(u8); +void sub_80BBDE8(u8); +void sub_80BBE70(u8); +void sub_80BBEB8(u8); +void sub_80BC0A8(u8); +void sub_80BC0F8(u8); +void sub_80BC2D4(u8); +void sub_80BC360(u8); +void sub_80BC3DC(u8); +void sub_80BC47C(u8); +bool8 sub_80BC514(u8); +void sub_80BC844(u8); +void sub_80BC890(void); +void sub_80BC8D4(u8, u8); +void sub_80BD154(u16, u8, u8, u16); +void sub_80BD1F4(u16, u8, u8, u16); +u8 sub_80BD23C(u16, u8, u8); +void sub_80BD28C(u8, u8, u16); +void sub_80BD2B4(u16, u16); +bool8 sub_80BD404(u8, u8, u8); +u16 sub_80BD69C(u16, u16); +void sub_80BD8D0(void); +bool8 sub_80BD930(void); +u8 sub_80BDA40(void); +u16 sub_80BDA8C(u16); +u32 sub_80BDACC(u16, s16, s16); +void sub_80BDB7C(u8); +void sub_80BE470(struct Sprite *sprite); void sub_80BE604(struct Sprite *sprite); void sub_80BE658(struct Sprite *sprite); void sub_80BE758(struct Sprite *sprite); void sub_80BE780(struct Sprite *sprite); void sub_80BE44C(struct Sprite *sprite); void sub_80BE834(struct Sprite *sprite); +void sub_80BE4E0(struct Sprite *sprite); +u8 sub_80BE91C(struct PokedexListItem*, u8); +bool8 sub_80BE9C4(u8); +u8 sub_80BE9F8(struct PokedexListItem*, u8); +void sub_80BEA24(u8); +void sub_80BEDF4(u8); +void sub_80BEFD0(u8); +void sub_80BF038(u8); +void sub_80BF070(u8); +void sub_80BF0AC(u8); +void sub_80BF1B4(u8); +void sub_80BF1EC(u8); +void sub_80BF250(u8); +void sub_80BF5CC(u8); +void sub_80BF790(u8); +void sub_80BF7FC(u8); +void sub_80BF82C(u8); +void sub_80BFBB0(u8); +void sub_80BFC78(u8); +void sub_80BFCDC(u16); +void sub_80BFCF4(u16); +void sub_80BFD0C(u8, u16); +void sub_80BFD7C(u8, u16); +void sub_80BFE38(u8); +void sub_80C0088(u8); +void blockset_load_palette_to_gpu(u8); +void sub_80C01CC(struct Sprite *sprite); +void sub_80C020C(u32, u32, u32, u32); +void sub_80C0354(u16, u8, u8); +void sub_80C0460(u16, u8, u8); +void sub_80C09B0(u16); +u8 sub_80C0B44(u8, u16, u8, u8); +void sub_80C0D30(u8, u16); +u16 sub_80C0EF8(u16, s16, s16, s8); +u16 sub_80C0E0C(u8, u16, u16, u16); +u8 sub_80C1258(); +void sub_80C12E0(u8); +void sub_80C1570(u8); +void sub_80C15B0(u8); +void sub_80C16CC(u8); +void sub_80C170C(u8); +void sub_80C19A4(u8); +void sub_80C1A4C(u8); +void sub_80C1AB8(u8); +void sub_80C1B64(u8); +void sub_80C1BCC(u8); +void sub_80C1D38(u8); +void sub_80C1D70(u8); +void sub_80C2040(u8); +void sub_80C2064(u8, u8); +void sub_80C20F8(u8); +void sub_80C21D4(u8); +void sub_80C2294(u8); +u8 sub_80C2318(u8, u8); +void sub_80C23B8(u8); +void sub_80C2594(u8); +void sub_80C2618(const u8*); +void sub_80C2638(u32); +void sub_80C2650(u32); +void sub_80C2668(u32, const u8*); +void sub_80C267C(void); // const rom data #include "data/pokedex_orders.h" @@ -485,7 +757,7 @@ const struct CompressedSpriteSheet gSpriteSheets_0855D26C[] = {0} }; -const struct CompressedSpritePalette gSpritePalettes_0855D26C[] = +const struct SpritePalette gSpritePalettes_0855D26C[] = { {gPokedexText_Pal, 4096}, {0} @@ -540,3 +812,4421 @@ const struct WindowTemplate sWindowTemplates_0855D2A8[] = DUMMY_WIN_TEMPLATE }; +const u8 gUnknown_0855D2B8[] = _("{NO}000"); +const u8 gUnknown_0855D2BE[] = INCBIN_U8("graphics/pokedex/caught_ball.4bpp"); +const u8 sText_TenDashes[] = _("----------"); + +// .text + +void ResetPokedex(void) +{ + u16 i; + + gUnknown_02039B50 = 0; + gUnknown_02039B52 = 64; + gUnknown_030060B0 = 0; + gSaveBlock2Ptr->pokedex.unknown1 = 0; + gSaveBlock2Ptr->pokedex.order = 0; + gSaveBlock2Ptr->pokedex.nationalMagic = 0; + gSaveBlock2Ptr->pokedex.unknown2 = 0; + gSaveBlock2Ptr->pokedex.unownPersonality = 0; + gSaveBlock2Ptr->pokedex.spindaPersonality = 0; + gSaveBlock2Ptr->pokedex.unknown3 = 0; + DisableNationalPokedex(); + for (i = 0; i < DEX_FLAGS_NO; i++) + { + gSaveBlock2Ptr->pokedex.owned[i] = 0; + gSaveBlock2Ptr->pokedex.seen[i] = 0; + gSaveBlock1Ptr->seen1[i] = 0; + gSaveBlock1Ptr->seen2[i] = 0; + } +} + +void sub_80BB358(void) +{ + gUnknown_02039B50 = 0; + gUnknown_02039B52 = 64; +} + +void sub_80BB370(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_80BB384(struct PokedexView *pokedexView) +{ + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + pokedexView->unk0[i].dexNum |= 0xFFFF; + pokedexView->unk0[i].seen = 0; + pokedexView->unk0[i].owned = 0; + } + pokedexView->unk608 = 0; + pokedexView->unk60A_1 = 0; + pokedexView->unk60A_2 = 0; + pokedexView->pokemonListCount = 0; + pokedexView->selectedPokemon = 0; + pokedexView->unk610 = 0; + pokedexView->dexMode = 0; + pokedexView->unk614 = 0; + pokedexView->dexOrder = 0; + pokedexView->unk618 = 0; + pokedexView->unk61A = 0; + pokedexView->unk61C = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk61E[i] |= 0xFFFF; + pokedexView->unk628 = 0; + pokedexView->unk62A = 0; + pokedexView->unk62C = 0; + pokedexView->unk62D = 0; + pokedexView->unk62E = 0; + pokedexView->unk62F = 0; + pokedexView->unk630 = 0; + pokedexView->unk632 = 0; + pokedexView->unk634 = 0; + pokedexView->unk636 = 0; + pokedexView->unk638 = 0; + for (i = 0; i <= 3; i++) + pokedexView->unk63A[i] = 0; + pokedexView->unk64A = 0; + pokedexView->unk64B = 0; + pokedexView->unk64C_1 = 0; + pokedexView->selectedScreen = 0; + pokedexView->unk64E = 0; + pokedexView->menuIsOpen = 0; + pokedexView->menuCursorPos = 0; + pokedexView->menuY = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk654[i] = 0; + for (i = 0; i <= 7; i++) + pokedexView->unk65C[i] = 0; +} + +void sub_80BB534(void) +{ + u8 *addr; + u32 size; + + switch (gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + sub_80C09B0(0); + DmaFillLarge16(3, 0, (u8 *)VRAM, VRAM_SIZE, 0x1000) + DmaClear32(3, OAM, OAM_SIZE); + DmaClear16(3, PLTT, PLTT_SIZE); + gMain.state = 1; + break; + case 1: + ScanlineEffect_Stop(); + ResetTasks(); + ResetSpriteData(); + ResetPaletteFade(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + dp13_810BB8C(); + gMain.state++; + break; + case 2: + gUnknown_02039B4C = AllocZeroed(sizeof(struct PokedexView)); + sub_80BB384(gUnknown_02039B4C); + CreateTask(sub_80BB78C, 0); + gUnknown_02039B4C->dexMode = gSaveBlock2Ptr->pokedex.unknown1; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gSaveBlock2Ptr->pokedex.order; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B50; + gUnknown_02039B4C->unk62C = gUnknown_02039B52; + gUnknown_02039B4C->selectedScreen = 0; + if (!IsNationalPokedexEnabled()) + { + gUnknown_02039B4C->unk61A = GetHoennPokedexCount(0); + gUnknown_02039B4C->unk61C = GetHoennPokedexCount(1); + } + else + { + gUnknown_02039B4C->unk61A = GetNationalPokedexCount(0); + gUnknown_02039B4C->unk61C = GetNationalPokedexCount(1); + } + gUnknown_02039B4C->unk62D = 8; + gMain.state++; + break; + case 3: + EnableInterrupts(1); + SetVBlankCallback(sub_80BB370); + SetMainCallback2(sub_80BB774); + sub_80BC8D4(gUnknown_02039B4C->dexMode, gUnknown_02039B4C->dexOrder); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x80); + break; + } +} + +void sub_80BB774(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_80BB78C(u8 taskId) +{ + gUnknown_02039B4C->unk64C_1 = FALSE; + if (sub_80BC514(0)) + gTasks[taskId].func = sub_80BB7D4; +} + +void sub_80BB7D4(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + if (gUnknown_02039B4C->menuY) + { + gUnknown_02039B4C->menuY -= 8; + } + else + { + if ((gMain.newKeys & A_BUTTON) && gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon].seen) + { + sub_80BD8D0(); + BeginNormalPaletteFade(~(1 << (gSprites[gUnknown_02039B4C->selectedMonSpriteId].oam.paletteNum + 16)), 0, 0, 0x10, RGB_BLACK); + gSprites[gUnknown_02039B4C->selectedMonSpriteId].callback = sub_80BE470; + gTasks[taskId].func = sub_80BBBF4; + PlaySE(SE_PIN); + sub_80BC890(); + } + else if (gMain.newKeys & START_BUTTON) + { + //Open menu + gUnknown_02039B4C->menuY = 0; + gUnknown_02039B4C->menuIsOpen = 1; + gUnknown_02039B4C->menuCursorPos = 0; + gTasks[taskId].func = sub_80BBA78; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + PlaySE(SE_SELECT); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].data[0] = sub_80C1258(); + gUnknown_02039B4C->unk64E = 0; + gUnknown_02039B4C->unk62A = gUnknown_02039B4C->unk62C; + gUnknown_02039B4C->unk610 = gUnknown_02039B4C->selectedPokemon; + gUnknown_02039B4C->unk614 = gUnknown_02039B4C->dexMode; + gUnknown_02039B4C->unk618 = gUnknown_02039B4C->dexOrder; + gTasks[taskId].func = sub_80BBD1C; + PlaySE(SE_PC_LOGIN); + sub_80BC890(); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BBDE8; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gUnknown_02039B4C->selectedPokemon = sub_80BD69C(gUnknown_02039B4C->selectedPokemon, 0xE); + if (gUnknown_02039B4C->unk62E) + gTasks[taskId].func = sub_80BBA28; + } + } +} + +void sub_80BBA28(u8 taskId) +{ + if (sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636)) + gTasks[taskId].func = sub_80BB7D4; +} + +void sub_80BBA78(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + //If menu is not open, slide it up, on screen + if (gUnknown_02039B4C->menuY != 80) + { + gUnknown_02039B4C->menuY += 8; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_02039B4C->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 1: //LIST TOP + gUnknown_02039B4C->selectedPokemon = 0; + gUnknown_02039B4C->unk62C = 0x40; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 2: //LIST BOTTOM + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->pokemonListCount - 1; + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->pokemonListCount * 16 + 0x30; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; //Exit menu + break; + case 3: //CLOSE POKEDEX + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BBDE8; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gUnknown_02039B4C->menuIsOpen = 0; + gTasks[taskId].func = sub_80BB7D4; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_02039B4C->menuCursorPos != 0) + { + gUnknown_02039B4C->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_02039B4C->menuCursorPos <= 2) + { + gUnknown_02039B4C->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +void sub_80BBBF4(u8 taskId) +{ + if (gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.x == 48 && gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.y == 56) + { + gUnknown_02039B4C->unk64B = gUnknown_02039B4C->unk64A; + gTasks[taskId].data[0] = sub_80BE91C(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gUnknown_02039B4C->selectedMonSpriteId); + gTasks[taskId].func = sub_80BBC74; + } +} + +void sub_80BBC74(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gUnknown_02039B4C->unk64A == 1 && !sub_80BE9C4(gTasks[taskId].data[0]) && sub_80BD930()) + sub_80BE9F8(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gUnknown_02039B50 = gUnknown_02039B4C->selectedPokemon; + gUnknown_02039B52 = gUnknown_02039B4C->unk62C; + gTasks[taskId].func = sub_80BB78C; + } +} + +void sub_80BBD1C(u8 taskId) +{ + if (!gTasks[gTasks[taskId].data[0]].isActive) + { + sub_80BDA40(); + if (gUnknown_02039B4C->unk64E != 0) + { + gUnknown_02039B4C->selectedPokemon = 0; + gUnknown_02039B4C->unk62C = 0x40; + gTasks[taskId].func = sub_80BBE70; + } + else + { + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610; + gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618; + gTasks[taskId].func = sub_80BB78C; + } + } +} + +void sub_80BBDE8(u8 taskId) +{ + if (!gPaletteFade.active) + { + gSaveBlock2Ptr->pokedex.unknown1 = gUnknown_02039B4C->dexMode; + if (!IsNationalPokedexEnabled()) + gSaveBlock2Ptr->pokedex.unknown1 = DEX_MODE_HOENN; + gSaveBlock2Ptr->pokedex.order = gUnknown_02039B4C->dexOrder; + sub_80BDA40(); + sub_80BC890(); + DestroyTask(taskId); + SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); + m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100); + Free(gUnknown_02039B4C); + } +} + +void sub_80BBE70(u8 taskId) +{ + gUnknown_02039B4C->unk64C_1 = TRUE; + if (sub_80BC514(3)) + gTasks[taskId].func = sub_80BBEB8; +} + +void sub_80BBEB8(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + if (gUnknown_02039B4C->menuY) + { + gUnknown_02039B4C->menuY -= 8; + } + else + { + if ((gMain.newKeys & A_BUTTON) && gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon].seen) + { + u32 a; + + sub_80BD8D0(); + a = (1 << (gSprites[gUnknown_02039B4C->selectedMonSpriteId].oam.paletteNum + 16)); + gSprites[gUnknown_02039B4C->selectedMonSpriteId].callback = sub_80BE470; + BeginNormalPaletteFade(~a, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC2D4; + PlaySE(SE_PIN); + sub_80BC890(); + } + else if (gMain.newKeys & START_BUTTON) + { + gUnknown_02039B4C->menuY = 0; + gUnknown_02039B4C->menuIsOpen = 1; + gUnknown_02039B4C->menuCursorPos = 0; + gTasks[taskId].func = sub_80BC0F8; + PlaySE(SE_SELECT); + } + else if (gMain.newKeys & SELECT_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].data[0] = sub_80C1258(); + gUnknown_02039B4C->unk64E = 0; + gTasks[taskId].func = sub_80BBD1C; + PlaySE(SE_PC_LOGIN); + sub_80BC890(); + } + else if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC3DC; + PlaySE(SE_PC_OFF); + } + else + { + //Handle D-pad + gUnknown_02039B4C->selectedPokemon = sub_80BD69C(gUnknown_02039B4C->selectedPokemon, 0xE); + if (gUnknown_02039B4C->unk62E) + gTasks[taskId].func = sub_80BC0A8; + } + } +} + +void sub_80BC0A8(u8 taskId) +{ + if (sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636)) + gTasks[taskId].func = sub_80BBEB8; +} + +void sub_80BC0F8(u8 taskId) +{ + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_02039B4C->menuY); + + if (gUnknown_02039B4C->menuY != 96) + { + gUnknown_02039B4C->menuY += 8; + } + else + { + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_02039B4C->menuCursorPos) + { + case 0: //BACK TO LIST + default: + gMain.newKeys |= START_BUTTON; + break; + case 1: //LIST TOP + gUnknown_02039B4C->selectedPokemon = 0; + gUnknown_02039B4C->unk62C = 0x40; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 2: //LIST BOTTOM + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->pokemonListCount - 1; + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->pokemonListCount * 16 + 0x30; + sub_80BDA40(); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gMain.newKeys |= START_BUTTON; + break; + case 3: //BACK TO POKEDEX + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC3DC; + PlaySE(SE_TRACK_DOOR); + break; + case 4: //CLOSE POKEDEX + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BC47C; + PlaySE(SE_PC_OFF); + break; + } + } + + //Exit menu when Start or B is pressed + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + gUnknown_02039B4C->menuIsOpen = 0; + gTasks[taskId].func = sub_80BBEB8; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_UP) && gUnknown_02039B4C->menuCursorPos) + { + gUnknown_02039B4C->menuCursorPos--; + PlaySE(SE_SELECT); + } + else if ((gMain.newAndRepeatedKeys & DPAD_DOWN) && gUnknown_02039B4C->menuCursorPos <= 3) + { + gUnknown_02039B4C->menuCursorPos++; + PlaySE(SE_SELECT); + } + } +} + +void sub_80BC2D4(u8 taskId) +{ + if (gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.x == 48 && gSprites[gUnknown_02039B4C->selectedMonSpriteId].pos1.y == 56) + { + gUnknown_02039B4C->unk64B = gUnknown_02039B4C->unk64A; + gTasks[taskId].data[0] = sub_80BE91C(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gUnknown_02039B4C->selectedMonSpriteId); + gUnknown_02039B4C->selectedMonSpriteId = -1; + gTasks[taskId].func = sub_80BC360; + } +} + +void sub_80BC360(u8 taskId) +{ + if (gTasks[gTasks[taskId].data[0]].isActive) + { + if (gUnknown_02039B4C->unk64A == 1 && !sub_80BE9C4(gTasks[taskId].data[0]) && sub_80BD930()) + sub_80BE9F8(&gUnknown_02039B4C->unk0[gUnknown_02039B4C->selectedPokemon], gTasks[taskId].data[0]); + } + else + { + gTasks[taskId].func = sub_80BBE70; + } +} + +void sub_80BC3DC(u8 taskId) +{ + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610; + gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618; + gTasks[taskId].func = sub_80BB78C; + sub_80BDA40(); + sub_80BC890(); + } +} + +void sub_80BC47C(u8 taskId) +{ + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk62C = gUnknown_02039B4C->unk62A; + gUnknown_02039B4C->selectedPokemon = gUnknown_02039B4C->unk610; + gUnknown_02039B4C->dexMode = gUnknown_02039B4C->unk614; + if (!IsNationalPokedexEnabled()) + gUnknown_02039B4C->dexMode = DEX_MODE_HOENN; + gUnknown_02039B4C->dexOrder = gUnknown_02039B4C->unk618; + gTasks[taskId].func = sub_80BBDE8; + } +} + +bool8 sub_80BC514(u8 a) +{ + switch (gMain.state) + { + case 0: + default: + if (gPaletteFade.active) + return 0; + SetVBlankCallback(NULL); + gUnknown_02039B4C->unk64A = a; + sub_80C09B0(0); + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gBgTemplates_0855D298, 4); + SetBgTilemapBuffer(3, AllocZeroed(0x800)); + SetBgTilemapBuffer(2, AllocZeroed(0x800)); + SetBgTilemapBuffer(1, AllocZeroed(0x800)); + SetBgTilemapBuffer(0, AllocZeroed(0x800)); + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(1, gUnknown_08DC2C5C, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC2DAC, 0, 0); + if (a == 0) + CopyToBgTilemapBuffer(0, gUnknown_08DC2A08, 0, 0x280); + else + CopyToBgTilemapBuffer(0, gUnknown_08DC2B1C, 0, 0x280); + ResetPaletteFade(); + if (a == 0) + gUnknown_02039B4C->unk64C_1 = FALSE; + else + gUnknown_02039B4C->unk64C_1 = TRUE; + sub_80BC844(gUnknown_02039B4C->unk64C_1); + InitWindows(sWindowTemplates_0855D2A8); + DeactivateAllTextPrinters(); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + gMain.state = 1; + break; + case 1: + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + LoadCompressedObjectPic(&gSpriteSheets_0855D26C[0]); + LoadSpritePalettes(gSpritePalettes_0855D26C); + sub_80BDB7C(a); + gMain.state++; + break; + case 2: + gMain.state++; + break; + case 3: + if (a == 0) + sub_80BC8D4(gUnknown_02039B4C->dexMode, gUnknown_02039B4C->dexOrder); + sub_80BD2B4(gUnknown_02039B4C->selectedPokemon, 0xE); + gUnknown_02039B4C->menuIsOpen = 0; + gUnknown_02039B4C->menuY = 0; + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 4: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(sub_80BB370); + gMain.state++; + break; + case 5: + SetGpuReg(REG_OFFSET_WININ, 0x3F3F); + SetGpuReg(REG_OFFSET_WINOUT, 0x1D3F); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WIN1H, 0); + SetGpuReg(REG_OFFSET_WIN1V, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON | DISPCNT_OBJWIN_ON); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 6: + if (!gPaletteFade.active) + { + gMain.state = 0; + return TRUE; + } + break; + } + return FALSE; +} + +void sub_80BC844(u8 a) +{ + if (a == 1) + LoadPalette(gPokedexHoennBg_Pal + 1, 1, 0xBE); + else if (!IsNationalPokedexEnabled()) + LoadPalette(gPokedexText_Pal + 1, 1, 0xBE); + else + LoadPalette(gPokedexNationalBg_Pal + 1, 1, 0xBE); + LoadPalette(GetOverworldTextboxPalettePtr(), 0xF0, 32); +} + +void sub_80BC890(void) +{ + void* tilemapBuffer; + + FreeAllWindowBuffers(); + tilemapBuffer = GetBgTilemapBuffer(0); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(1); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(2); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(3); + if (tilemapBuffer) + Free(tilemapBuffer); +} + +void sub_80BC8D4(u8 dexMode, u8 sortMode) +{ + u16 vars[3]; //I have no idea why three regular variables are stored in an array, but whatever. + s16 i; + + gUnknown_02039B4C->pokemonListCount = 0; + + switch (dexMode) + { + default: + case DEX_MODE_HOENN: + vars[0] = HOENN_DEX_COUNT; + vars[1] = 1; + break; + case DEX_MODE_NATIONAL: + if (IsNationalPokedexEnabled()) + { + vars[0] = NATIONAL_DEX_COUNT; + vars[1] = 0; + } + else + { + vars[0] = HOENN_DEX_COUNT; + vars[1] = 1; + } + break; + } + + switch (sortMode) + { + case 0: + if (vars[1]) + { + for (i = 0; i < vars[0]; i++) + { + vars[2] = HoennToNationalOrder(i + 1); + gUnknown_02039B4C->unk0[i].dexNum = vars[2]; + gUnknown_02039B4C->unk0[i].seen = GetSetPokedexFlag(vars[2], 0); + gUnknown_02039B4C->unk0[i].owned = GetSetPokedexFlag(vars[2], 1); + if (gUnknown_02039B4C->unk0[i].seen) + gUnknown_02039B4C->pokemonListCount = i + 1; + } + } + else + { + bool32 r10; + s16 r5; + + r10 = r5 = i = 0; + for (i = 0; i < vars[0]; i++) + { + vars[2] = i + 1; + if (GetSetPokedexFlag(vars[2], 0)) + r10 = 1; + if (r10) + { + asm(""); //Needed to match for some reason + gUnknown_02039B4C->unk0[r5].dexNum = vars[2]; + gUnknown_02039B4C->unk0[r5].seen = GetSetPokedexFlag(vars[2], 0); + gUnknown_02039B4C->unk0[r5].owned = GetSetPokedexFlag(vars[2], 1); + if (gUnknown_02039B4C->unk0[r5].seen) + gUnknown_02039B4C->pokemonListCount = r5 + 1; + r5++; + } + } + } + break; + case 1: + for (i = 0; i < POKEMON_SLOTS_NUMBER - 1; i++) + { + vars[2] = gPokedexOrder_Alphabetical[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 0)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = GetSetPokedexFlag(vars[2], 1); + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 2: + for (i = NATIONAL_DEX_COUNT - 1; i >= 0; i--) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 3: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Weight[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 4: + for (i = NATIONAL_DEX_COUNT - 1; i >=0; i--) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + case 5: + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + vars[2] = gPokedexOrder_Height[i]; + + if (NationalToHoennOrder(vars[2]) <= vars[0] && GetSetPokedexFlag(vars[2], 1)) + { + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].dexNum = vars[2]; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].seen = 1; + gUnknown_02039B4C->unk0[gUnknown_02039B4C->pokemonListCount].owned = 1; + gUnknown_02039B4C->pokemonListCount++; + } + } + break; + } + + for (i = gUnknown_02039B4C->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gUnknown_02039B4C->unk0[i].dexNum |= 0xFFFF; + gUnknown_02039B4C->unk0[i].seen = 0; + gUnknown_02039B4C->unk0[i].owned = 0; + } +} + +void sub_80BCE2C(u8 windowId, u8 fontId, const u8* str, u8 left, u8 top) +{ + u8 color[3]; + + color[0] = 0; + color[1] = 15; + color[2] = 3; + AddTextPrinterParameterized2(windowId, fontId, left * 8, (top * 8) + 1, 0, 0, color, -1, str); +} + +void sub_80BCE84(u8 a, u16 b, u16 c) +{ + s16 _b; + u16 i; + u16 r2; + + switch (a) + { + case 0: + default: + _b = b - 5; + for (i = 0; i <= 10; i++) + { + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF) + { + sub_80BD28C(0x11, i * 2, c); + } + else + { + sub_80BD28C(0x11, i * 2, c); + if (gUnknown_02039B4C->unk0[_b].seen) + { + sub_80BD154(_b, 0x12, i * 2, c); + sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, i * 2, c); + sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, i * 2); + } + else + { + sub_80BD154(_b, 0x12, i * 2, c); + sub_80BD1F4(0, 0x11, i * 2, c); + sub_80BD23C(0, 0x16, i * 2); + } + } + _b++; + } + break; + case 1: + _b = b - 5; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF) + { + sub_80BD28C(0x11, gUnknown_02039B4C->unk630 * 2, c); + } + else + { + sub_80BD28C(0x11, gUnknown_02039B4C->unk630 * 2, c); + if (gUnknown_02039B4C->unk0[_b].seen) + { + sub_80BD154(_b, 0x12, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, gUnknown_02039B4C->unk630 * 2); + } + else + { + sub_80BD154(_b, 0x12, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD1F4(0, 0x11, gUnknown_02039B4C->unk630 * 2, c); + sub_80BD23C(0, 0x16, gUnknown_02039B4C->unk630 * 2); + } + } + break; + case 2: + _b = b + 5; + r2 = gUnknown_02039B4C->unk630 + 10; + if (r2 > 15) + r2 -= 16; + if (_b < 0 || _b >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[_b].dexNum == 0xFFFF) + sub_80BD28C(0x11, r2 * 2, c); + else + { + sub_80BD28C(0x11, r2 * 2, c); + if (gUnknown_02039B4C->unk0[_b].seen) + { + sub_80BD154(_b, 0x12, r2 * 2, c); + sub_80BD1F4(gUnknown_02039B4C->unk0[_b].owned, 0x11, r2 * 2, c); + sub_80BD23C(gUnknown_02039B4C->unk0[_b].dexNum, 0x16, r2 * 2); + } + else + { + sub_80BD154(_b, 0x12, r2 * 2, c); + sub_80BD1F4(0, 0x11, r2 * 2, c); + sub_80BD23C(0, 0x16, r2 * 2); + } + } + break; + } + CopyWindowToVram(0, 2); +} + +void sub_80BD154(u16 a, u8 left, u8 top, u16 unused) +{ + u8 text[6]; + u16 r6; + + memcpy(text, gUnknown_0855D2B8, 6); + r6 = gUnknown_02039B4C->unk0[a].dexNum; + if (gUnknown_02039B4C->dexMode == DEX_MODE_HOENN) + r6 = NationalToHoennOrder(r6); + text[2] = CHAR_0 + r6 / 100; + text[3] = CHAR_0 + (r6 % 100) / 10; + text[4] = CHAR_0 + (r6 % 100) % 10; + sub_80BCE2C(0, 7, text, left, top); +} + +void sub_80BD1F4(u16 a, u8 x, u8 y, u16 unused) +{ + if (a) + BlitBitmapToWindow(0, gUnknown_0855D2BE, x * 8, y * 8, 8, 16); + else + FillWindowPixelRect(0, 0, x * 8, y * 8, 8, 16); +} + +u8 sub_80BD23C(u16 num, u8 left, u8 top) +{ + const u8* str; + + num = NationalPokedexNumToSpecies(num); + if (num) + str = gSpeciesNames[num]; + else + str = sText_TenDashes; + sub_80BCE2C(0, 7, str, left, top); + return StringLength(str); +} + +void sub_80BD28C(u8 x, u8 y, u16 unused) +{ + FillWindowPixelRect(0, 0, x * 8, y * 8, 0x60, 16); +} + +void sub_80BD2B4(u16 a, u16 b) +{ + u8 i; + u16 unk; + u8 spriteId; + + gPaletteFade.bufferTransferDisabled = TRUE; + + for (i = 0; i < 4; i++) + gUnknown_02039B4C->unk61E[i] = 0xFFFF; + gUnknown_02039B4C->selectedMonSpriteId = 0xFFFF; + + unk = sub_80BDA8C(a - 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = -32; + } + + unk = sub_80BDA8C(a); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = 0; + } + + unk = sub_80BDA8C(a + 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = 32; + } + + sub_80BCE84(0, a, b); + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D); + + gUnknown_02039B4C->unk630 = 0; + gUnknown_02039B4C->unk632 = 0; + + gPaletteFade.bufferTransferDisabled = FALSE; +} + +bool8 sub_80BD404(u8 a, u8 b, u8 c) +{ + u16 i; + u8 foo; + + if (gUnknown_02039B4C->unk62E) + { + gUnknown_02039B4C->unk62E--; + switch (a) + { + case 1: + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] != 0xFFFF) + gSprites[gUnknown_02039B4C->unk61E[i]].data[5] += b; + } + foo = 16 * (c - gUnknown_02039B4C->unk62E) / c; + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk632 * 16 - foo); + gUnknown_02039B4C->unk62C -= gUnknown_02039B4C->unk628; + break; + case 2: + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] != 0xFFFF) + gSprites[gUnknown_02039B4C->unk61E[i]].data[5] -= b; + } + foo = 16 * (c - gUnknown_02039B4C->unk62E) / c; + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk632 * 16 + foo); + gUnknown_02039B4C->unk62C += gUnknown_02039B4C->unk628; + break; + } + return FALSE; + } + else + { + SetGpuReg(REG_OFFSET_BG2VOFS, gUnknown_02039B4C->unk62D + gUnknown_02039B4C->unk630 * 16); + return TRUE; + } +} + +void sub_80BD5A8(u8 a, u16 b) +{ + u16 unk; + u8 spriteId; + + gUnknown_02039B4C->unk632 = gUnknown_02039B4C->unk630; + switch (a) + { + case 1: + unk = sub_80BDA8C(b - 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = -64; + } + if (gUnknown_02039B4C->unk630 > 0) + gUnknown_02039B4C->unk630--; + else + gUnknown_02039B4C->unk630 = 15; + break; + case 2: + unk = sub_80BDA8C(b + 1); + if (unk != 0xFFFF) + { + spriteId = sub_80BDACC(unk, 0x60, 0x50); + gSprites[spriteId].callback = sub_80BE4E0; + gSprites[spriteId].data[5] = 0x40; + } + if (gUnknown_02039B4C->unk630 <= 0xE) + gUnknown_02039B4C->unk630++; + else + gUnknown_02039B4C->unk630 = 0; + break; + } +} + +u16 sub_80BD69C(u16 a, u16 b) +{ + u8 r3; + u8 r5; + u8 i; + u16 r6; + u8 r10 = 0; + + if ((gMain.heldKeys & DPAD_UP) && (a > 0)) + { + r10 = 1; + a = sub_80C0E0C(1, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + sub_80BD5A8(1, a); + sub_80BCE84(1, a, b); + PlaySE(SE_Z_SCROLL); + } + else if ((gMain.heldKeys & DPAD_DOWN) && (a < gUnknown_02039B4C->pokemonListCount - 1)) + { + r10 = 2; + a = sub_80C0E0C(0, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + sub_80BD5A8(2, a); + sub_80BCE84(2, a, b); + PlaySE(SE_Z_SCROLL); + } + else if ((gMain.newKeys & DPAD_LEFT) && (a > 0)) + { + r6 = a; + + for (i = 0; i < 7; i++) + a = sub_80C0E0C(1, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + gUnknown_02039B4C->unk62C += 16 * (a - r6); + sub_80BDA40(); + sub_80BD2B4(a, 0xE); + PlaySE(SE_Z_PAGE); + } + else if ((gMain.newKeys & DPAD_RIGHT) && (a < gUnknown_02039B4C->pokemonListCount - 1)) + { + r6 = a; + for (i = 0; i < 7; i++) + a = sub_80C0E0C(0, a, 0, gUnknown_02039B4C->pokemonListCount - 1); + gUnknown_02039B4C->unk62C += (a - r6) * 16; + sub_80BDA40(); + sub_80BD2B4(a, 0xE); + PlaySE(SE_Z_PAGE); + } + + if (r10 == 0) + { + gUnknown_02039B4C->unk638 = 0; + return a; + } + + r5 = gUnknown_0855D28C[gUnknown_02039B4C->unk638 / 4]; + r3 = gUnknown_0855D291[gUnknown_02039B4C->unk638 / 4]; + gUnknown_02039B4C->unk62E = r3; + gUnknown_02039B4C->unk636 = r3; + gUnknown_02039B4C->unk634 = r5; + gUnknown_02039B4C->unk62F = r10; + gUnknown_02039B4C->unk628 = r5 / 2; + sub_80BD404(gUnknown_02039B4C->unk62F, gUnknown_02039B4C->unk634, gUnknown_02039B4C->unk636); + if (gUnknown_02039B4C->unk638 <= 0xB) + gUnknown_02039B4C->unk638++; + return a; +} + +void sub_80BD8D0(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + u16 spriteId = gUnknown_02039B4C->unk61E[i]; + + if (gSprites[spriteId].pos2.x == 0 && gSprites[spriteId].pos2.y == 0 && spriteId != 0xFFFF) + gUnknown_02039B4C->selectedMonSpriteId = spriteId; + } +} + +u8 sub_80BD930(void) +{ + u16 r2; + u16 r4 = gUnknown_02039B4C->selectedPokemon; + + if ((gMain.newKeys & DPAD_UP) && r4) + { + r2 = r4; + while (r2 != 0) + { + r2 = sub_80C0E0C(1, r2, 0, gUnknown_02039B4C->pokemonListCount - 1); + + if (gUnknown_02039B4C->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gUnknown_02039B4C->selectedPokemon == r4) + return FALSE; + else + { + gUnknown_02039B4C->selectedPokemon = r4; + gUnknown_02039B4C->unk62C -= 16; + return TRUE; + } + } + else if ((gMain.newKeys & DPAD_DOWN) && r4 < gUnknown_02039B4C->pokemonListCount - 1) + { + r2 = r4; + while (r2 < gUnknown_02039B4C->pokemonListCount - 1) + { + r2 = sub_80C0E0C(0, r2, 0, gUnknown_02039B4C->pokemonListCount - 1); + + if (gUnknown_02039B4C->unk0[r2].seen) + { + r4 = r2; + break; + } + } + + if (gUnknown_02039B4C->selectedPokemon == r4) + return FALSE; + else + { + gUnknown_02039B4C->selectedPokemon = r4; + gUnknown_02039B4C->unk62C += 16; + return TRUE; + } + } + return FALSE; +} + +u8 sub_80BDA40(void) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] != 0xFFFF) + { + sub_818D820(gUnknown_02039B4C->unk61E[i]); + gUnknown_02039B4C->unk61E[i] |= 0xFFFF; + } + } + return FALSE; +} + +u16 sub_80BDA8C(u16 a1) +{ + if (a1 >= NATIONAL_DEX_COUNT || gUnknown_02039B4C->unk0[a1].dexNum == 0xFFFF) + return 0xFFFF; + else if (gUnknown_02039B4C->unk0[a1].seen) + return gUnknown_02039B4C->unk0[a1].dexNum; + else + return 0; +} + +u32 sub_80BDACC(u16 num, s16 x, s16 y) +{ + u8 i; + + for (i = 0; i < 4; i++) + { + if (gUnknown_02039B4C->unk61E[i] == 0xFFFF) + { + u8 spriteId = sub_80C0E9C(num, x, y, i); + + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.priority = 3; + gSprites[spriteId].data[0] = 0; + gSprites[spriteId].data[1] = i; + gSprites[spriteId].data[2] = NationalPokedexNumToSpecies(num); + gUnknown_02039B4C->unk61E[i] = spriteId; + return spriteId; + } + } + return 0xFFFF; +} + +void sub_80BDB7C(u8 a) +{ + u8 spriteId; + u16 r5; + + spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 4, 0); + gSprites[spriteId].data[1] = 0; + + spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 156, 0); + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].vFlip = TRUE; + + CreateSprite(&gUnknown_0855D194, 230, 20, 0); + CreateSprite(&gUnknown_0855D1C4, 16, 120, 0); + + spriteId = CreateSprite(&gUnknown_0855D1C4, 48, 120, 0); + StartSpriteAnim(&gSprites[spriteId], 3); + + spriteId = CreateSprite(&gUnknown_0855D1C4, 16, 144, 0); + StartSpriteAnim(&gSprites[spriteId], 2); + gSprites[spriteId].data[2] = 0x80; + + spriteId = CreateSprite(&gUnknown_0855D1C4, 48, 144, 0); + StartSpriteAnim(&gSprites[spriteId], 1); + + spriteId = CreateSprite(&gUnknown_0855D1DC, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 30; + gSprites[spriteId].data[0] = 0x1E; + gSprites[spriteId].data[1] = 0; + + spriteId = CreateSprite(&gUnknown_0855D1DC, 0, 80, 2); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 31; + gSprites[spriteId].data[0] = 0x1F; + gSprites[spriteId].data[1] = 0x80; + + if (a == 0) + { + u32 _a; + + if (!IsNationalPokedexEnabled()) + { + CreateSprite(&gUnknown_0855D1F4, 32, 40, 1); + + spriteId = CreateSprite(&gUnknown_0855D1F4, 32, 72, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D224, 24, 48, 1); + r5 = gUnknown_02039B4C->unk61A / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 32, 48, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 40, 48, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D224, 24, 80, 1); + r5 = gUnknown_02039B4C->unk61C / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 32, 80, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D224, 40, 80, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + } + else + { + u16 r6; + + CreateSprite(&gUnknown_0855D1F4, 32, 40, 1); + + spriteId = CreateSprite(&gUnknown_0855D1F4, 32, 76, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + + CreateSprite(&gUnknown_0855D20C, 17, 45, 1); + + spriteId = CreateSprite(&gUnknown_0855D20C, 17, 55, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + + CreateSprite(&gUnknown_0855D20C, 17, 81, 1); + + spriteId = CreateSprite(&gUnknown_0855D20C, 17, 91, 1); + StartSpriteAnim(&gSprites[spriteId], 1); + + r6 = GetHoennPokedexCount(0); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 45, 1); + r5 = r6 / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 45, 1); + r5 = (r6 % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 45, 1); + r5 = (r6 % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 55, 1); + r5 = gUnknown_02039B4C->unk61A / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 55, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 55, 1); + r5 = (gUnknown_02039B4C->unk61A % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + r6 = GetHoennPokedexCount(1); + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 81, 1); + r5 = r6 / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 81, 1); + r5 = (r6 % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 81, 1); + r5 = (r6 % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + + _a = 0; + + spriteId = CreateSprite(&gUnknown_0855D23C, 40, 91, 1); + r5 = gUnknown_02039B4C->unk61C / 100; + StartSpriteAnim(&gSprites[spriteId], r5); + if (r5 != 0) + _a = 1; + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 48, 91, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) / 10; + if (r5 != 0 || _a != 0) + StartSpriteAnim(&gSprites[spriteId], r5); + else + gSprites[spriteId].invisible = TRUE; + + spriteId = CreateSprite(&gUnknown_0855D23C, 56, 91, 1); + r5 = (gUnknown_02039B4C->unk61C % 100) % 10; + StartSpriteAnim(&gSprites[spriteId], r5); + } + spriteId = CreateSprite(&gUnknown_0855D254, 136, 96, 1); + gSprites[spriteId].invisible = TRUE; + } + else + { + spriteId = CreateSprite(&gUnknown_0855D254, 136, 80, 1); + gSprites[spriteId].invisible = TRUE; + } +} + +void nullsub_38(struct Sprite *sprite) +{ +} + +void sub_80BE44C(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0) + DestroySprite(sprite); +} + +//Move Pokemon into position for description page +void sub_80BE470(struct Sprite *sprite) +{ + sprite->oam.priority = 0; + sprite->oam.affineMode = 0; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->pos1.x != 48 || sprite->pos1.y != 56) + { + if (sprite->pos1.x > 48) + sprite->pos1.x--; + if (sprite->pos1.x < 48) + sprite->pos1.x++; + + if (sprite->pos1.y > 56) + sprite->pos1.y--; + if (sprite->pos1.y < 56) + sprite->pos1.y++; + } + else + { + sprite->callback = nullsub_38; + } +} + +void sub_80BE4E0(struct Sprite *sprite) +{ + u8 data1 = sprite->data[1]; + + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + sub_818D820(gUnknown_02039B4C->unk61E[data1]); + gUnknown_02039B4C->unk61E[data1] = 0xFFFF; + } + else + { + u32 var; + + sprite->pos2.y = gSineTable[(u8)sprite->data[5]] * 76 / 256; + var = 0x10000 / gSineTable[sprite->data[5] + 0x40]; + if (var > 0xFFFF) + var = 0xFFFF; + SetOamMatrix(sprite->data[1] + 1, 0x100, 0, 0, var); + sprite->oam.matrixNum = data1 + 1; + + if (sprite->data[5] > -64 && sprite->data[5] < 64) + { + sprite->invisible = FALSE; + sprite->data[0] = 1; + } + else + { + sprite->invisible = TRUE; + } + + if ((sprite->data[5] <= -64 || sprite->data[5] >= 64) && sprite->data[0] != 0) + { + sub_818D820(gUnknown_02039B4C->unk61E[data1]); + gUnknown_02039B4C->unk61E[data1] = 0xFFFF; + } + } +} + +void sub_80BE604(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + DestroySprite(sprite); + else + sprite->pos2.y = gUnknown_02039B4C->selectedPokemon * 120 / (gUnknown_02039B4C->pokemonListCount - 1); +} + +void sub_80BE658(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 r0; + + if (sprite->data[1] != 0) + { + if (gUnknown_02039B4C->selectedPokemon == gUnknown_02039B4C->pokemonListCount - 1) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data[2]; + } + else + { + if (gUnknown_02039B4C->selectedPokemon == 0) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + r0 = sprite->data[2] - 128; + } + sprite->pos2.y = gSineTable[r0] / 64; + sprite->data[2] = sprite->data[2] + 8; + if (gUnknown_02039B4C->menuIsOpen == 0 && gUnknown_02039B4C->menuY == 0 && sprite->invisible == 0) + sprite->invisible = FALSE; + else + sprite->invisible = TRUE; + } +} + +void sub_80BE758(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + DestroySprite(sprite); +} + +void sub_80BE780(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u8 val; + s16 r3; + s16 r0; + + val = gUnknown_02039B4C->unk62C + sprite->data[1]; + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + SetOamMatrix(sprite->data[0], r0, r3, -r3, r0); + + val = gUnknown_02039B4C->unk62C + (sprite->data[1] + 0x40); + r3 = gSineTable[val]; + r0 = gSineTable[val + 0x40]; + sprite->pos2.x = r0 * 40 / 256; + sprite->pos2.y = r3 * 40 / 256; + } +} + +void sub_80BE834(struct Sprite *sprite) +{ + if (gUnknown_02039B4C->unk64A != 0 && gUnknown_02039B4C->unk64A != 3) + { + DestroySprite(sprite); + } + else + { + u16 r1 = gUnknown_02039B4C->unk64A == 0 ? 80 : 96; + + if (gUnknown_02039B4C->menuIsOpen != 0 && gUnknown_02039B4C->menuY == r1) + { + sprite->invisible = FALSE; + sprite->pos2.y = gUnknown_02039B4C->menuCursorPos * 16; + sprite->pos2.x = gSineTable[(u8)sprite->data[2]] / 64; + sprite->data[2] += 8; + } + else + { + sprite->invisible = TRUE; + } + } +} + +void sub_80BE8DC(const u8* str, u8 left, u8 top) +{ + u8 color[3]; + color[0] = 0; + color[1] = 15; + color[2] = 3; + + AddTextPrinterParameterized2(0, 1, left, top, 0, 0, color, -1, str); +} + +u8 sub_80BE91C(struct PokedexListItem* item, u8 b) +{ + u8 taskId; + + gUnknown_02039B54 = item; + taskId = CreateTask(sub_80BEA24, 0); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 1; + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = b; + gTasks[taskId].data[5] = 255; + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0856E630, 4); + SetBgTilemapBuffer(3, AllocZeroed(0x800)); + SetBgTilemapBuffer(2, AllocZeroed(0x800)); + SetBgTilemapBuffer(1, AllocZeroed(0x800)); + SetBgTilemapBuffer(0, AllocZeroed(0x800)); + InitWindows(gUnknown_0856E640); + DeactivateAllTextPrinters(); + + return taskId; +} + +bool8 sub_80BE9C4(u8 taskId) +{ + if (gTasks[taskId].data[0] == 0 && gTasks[taskId].func == sub_80BEDF4) + return FALSE; + else + return TRUE; +} + +u8 sub_80BE9F8(struct PokedexListItem *item, u8 b) +{ + gUnknown_02039B54 = item; + gTasks[b].data[0] = 1; + gTasks[b].data[1] = 0; + gTasks[b].data[2] = 0; + gTasks[b].data[3] = 0; + return b; +} + +void sub_80BEA24(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + u16 r2; + + gUnknown_02039B4C->unk64A = 1; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + r2 = 0; + if (gTasks[taskId].data[1] != 0) + r2 += 0x1000; + if (gTasks[taskId].data[2] != 0) + r2 |= 0x200; + sub_80C09B0(r2); + gMain.state = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC3080, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + PutWindowTilemap(1); + sub_80C0D30(1, gUnknown_02039B54->dexNum); + CopyWindowToVram(1, 2); + gMain.state++; + break; + case 2: + sub_80BFCDC(0xD); + sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + gMain.state++; + break; + case 3: + gMain.state++; + break; + case 4: + sub_80C020C(gUnknown_02039B54->dexNum, gUnknown_02039B4C->dexMode == 0 ? 0 : 1, gUnknown_02039B54->owned, 0); + if (!gUnknown_02039B54->owned) + LoadPalette(gPlttBufferUnfaded + 1, 0x31, 0x1E); + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 5: + if (gTasks[taskId].data[1] == 0) + { + gTasks[taskId].data[4] = (u16)sub_80C0E9C(gUnknown_02039B54->dexNum, 0x30, 0x38, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + } + gMain.state++; + break; + case 6: + { + u32 r3 = 0; + + if (gTasks[taskId].data[2] != 0) + r3 = 0x14; + if (gTasks[taskId].data[1] != 0) + r3 |= (1 << (gSprites[gTasks[taskId].data[4]].oam.paletteNum + 16)); + BeginNormalPaletteFade(~r3, 0, 16, 0, 0); + SetVBlankCallback(gUnknown_030060B4); + gMain.state++; + } + break; + case 7: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 8: + if (!gPaletteFade.active) + { + gMain.state++; + if (gTasks[taskId].data[3] == 0) + { + StopCryAndClearCrySongs(); + PlayCry2(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), 0, 0x7D, 0xA); + } + else + { + gMain.state++; + } + } + break; + case 9: + if (!IsCryPlayingOrClearCrySongs()) + gMain.state++; + break; + case 10: + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[2] = 1; + gTasks[taskId].data[3] = 1; + gTasks[taskId].func = sub_80BEDF4; + gMain.state = 0; + break; + } +} + +void sub_80BEDB0(void) +{ + void *r0; + FreeAllWindowBuffers(); + r0 = GetBgTilemapBuffer(0); + if (r0) + Free(r0); + r0 = GetBgTilemapBuffer(1); + if (r0) + Free(r0); + r0 = GetBgTilemapBuffer(2); + if (r0) + Free(r0); + r0 = GetBgTilemapBuffer(3); + if (r0) + Free(r0); +} + +void sub_80BEDF4(u8 taskId) +{ + if (gTasks[taskId].data[0] != 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = sub_80BF038; + PlaySE(SE_Z_SCROLL); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = sub_80BF070; + PlaySE(SE_PC_OFF); + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gUnknown_02039B4C->selectedScreen) + { + case AREA_SCREEN: + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 16, RGB_BLACK); + gUnknown_02039B4C->unk64E = 1; + gTasks[taskId].func = sub_80BEFD0; + PlaySE(SE_PIN); + break; + case CRY_SCREEN: + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + gUnknown_02039B4C->unk64E = 2; + gTasks[taskId].func = sub_80BEFD0; + PlaySE(SE_PIN); + break; + case SIZE_SCREEN: + if (!gUnknown_02039B54->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + gUnknown_02039B4C->unk64E = 3; + gTasks[taskId].func = sub_80BEFD0; + PlaySE(SE_PIN); + } + break; + case CANCEL_SCREEN: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + gTasks[taskId].func = sub_80BF070; + PlaySE(SE_PC_OFF); + break; + } + return; + } + if (((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gUnknown_02039B4C->selectedScreen > 0) + { + gUnknown_02039B4C->selectedScreen--; + sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } + if (((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + && gUnknown_02039B4C->selectedScreen < 3) + { + gUnknown_02039B4C->selectedScreen++; + sub_80BFD0C(gUnknown_02039B4C->selectedScreen, 0xD); + PlaySE(SE_Z_PAGE); + return; + } +} + +void sub_80BEFD0(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + switch (gUnknown_02039B4C->unk64E) + { + case 1: + default: + gTasks[taskId].func = sub_80BF0AC; + break; + case 2: + gTasks[taskId].func = sub_80BF250; + break; + case 3: + gTasks[taskId].func = sub_80BF82C; + break; + } + } +} + +void sub_80BF038(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + gTasks[taskId].func = sub_80BEA24; + } +} + +void sub_80BF070(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + sub_80BEDB0(); + DestroyTask(taskId); + } +} + +void sub_80BF0AC(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64A = 5; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x200); + gUnknown_02039B4C->selectedScreen = AREA_SCREEN; + gMain.state = 1; + } + break; + case 1: + sub_80BFCF4(0xD); + sub_80BFD7C(0, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(13) | BGCNT_16COLOR | BGCNT_TXT256x256); + gMain.state++; + break; + case 2: + sub_813D3D8(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum), &gUnknown_02039B4C->unk64E); + SetVBlankCallback(gUnknown_030060B4); + gUnknown_02039B4C->unk64E = 0; + gMain.state = 0; + gTasks[taskId].func = sub_80BF1B4; + break; + } +} + +void sub_80BF1B4(u8 taskId) +{ + if (gUnknown_02039B4C->unk64E != 0) + gTasks[taskId].func = sub_80BF1EC; +} + +void sub_80BF1EC(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (gUnknown_02039B4C->unk64E) + { + case 1: + default: + gTasks[taskId].func = sub_80BEA24; + break; + case 2: + gTasks[taskId].func = sub_80BF250; + break; + } + } +} + +void sub_80BF250(u8 taskId) +{ + switch (gMain.state) + { + case 0: + default: + if (!gPaletteFade.active) + { + m4aMPlayStop(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64A = 6; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x200); + gUnknown_02039B4C->selectedScreen = CRY_SCREEN; + gMain.state = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, &gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, &gUnknown_08DC3198, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + PutWindowTilemap(3); + PutWindowTilemap(2); + gMain.state++; + break; + case 2: + sub_80BFCF4(0xD); + sub_80BFD7C(1, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + gMain.state++; + break; + case 3: + ResetPaletteFade(); + gMain.state++; + break; + case 4: + sub_80BE8DC(gText_CryOf, 0x52, 33); + sub_80C0B44(0, gUnknown_02039B54->dexNum, 0x52, 49); + gMain.state++; + break; + case 5: + gTasks[taskId].data[4] = sub_80C0E9C(gUnknown_02039B54->dexNum, 48, 56, 0); + gSprites[gTasks[taskId].data[4]].oam.priority = 0; + gUnknown_030061EC = 0; + gMain.state++; + break; + case 6: + { + struct CryRelatedStruct sp4; + + sp4.unk0 = 0x4020; + sp4.unk2 = 0x1F; + sp4.paletteNo = 8; + sp4.yPos = 0x1E; + sp4.xPos = 0xC; + if (sub_8145354(&sp4, 2) != 0) + { + gMain.state++; + gUnknown_030061EC = 0; + } + } + break; + case 7: + { + struct CryRelatedStruct spC; + + spC.paletteNo = 9; + spC.xPos = 0x12; + spC.yPos = 3; + if (sub_8145850(&spC, 3) != 0) + gMain.state++; + CopyWindowToVram(3, 2); + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + } + break; + case 8: + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(gUnknown_030060B4); + gMain.state++; + break; + case 9: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 10: + gUnknown_02039B4C->unk64E = 0; + gMain.state = 0; + gTasks[taskId].func = sub_80BF5CC; + break; + } +} + +void sub_80BF5CC(u8 taskId) +{ + sub_814545C(2); + + if (IsCryPlaying()) + sub_80BF7FC(1); + else + sub_80BF7FC(0); + + if (gMain.newKeys & A_BUTTON) + { + sub_80BF7FC(1); + sub_8145534(NationalPokedexNumToSpecies(gUnknown_02039B54->dexNum)); + return; + } + else if (!gPaletteFade.active) + { + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + m4aMPlayContinue(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64E = 1; + gTasks[taskId].func = sub_80BF790; + PlaySE(SE_PC_OFF); + return; + } + if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + m4aMPlayContinue(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64E = 2; + gTasks[taskId].func = sub_80BF790; + PlaySE(SE_Z_PAGE); + return; + } + if ((gMain.newKeys & DPAD_RIGHT) + || ((gMain.newKeys & R_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + if (!gUnknown_02039B54->owned) + { + PlaySE(SE_HAZURE); + } + else + { + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + m4aMPlayContinue(&gMPlayInfo_BGM); + gUnknown_02039B4C->unk64E = 3; + gTasks[taskId].func = sub_80BF790; + PlaySE(SE_Z_PAGE); + } + return; + } + } +} + +void sub_80BF790(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_8145914(); + sub_818D820(gTasks[taskId].data[4]); + switch (gUnknown_02039B4C->unk64E) + { + default: + case 1: + gTasks[taskId].func = sub_80BEA24; + break; + case 2: + gTasks[taskId].func = sub_80BF0AC; + break; + case 3: + gTasks[taskId].func = sub_80BF82C; + break; + } + } +} + +void sub_80BF7FC(u8 a) +{ + u16 unk; + + if (a != 0) + unk = RGB(18, 28, 0); + else + unk = RGB(15, 21, 0); + LoadPalette(&unk, 0x5D, 2); +} + +void sub_80BF82C(u8 taskId) +{ + u8 spriteId; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64A = 7; + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x200); + gUnknown_02039B4C->selectedScreen = SIZE_SCREEN; + gMain.state = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC2E6C, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + gMain.state++; + break; + case 2: + sub_80BFCF4(0xD); + sub_80BFD7C(2, 0xD); + sub_80BC844(gUnknown_02039B4C->unk64C_1); + gMain.state++; + break; + case 3: + { + u8 string[0x40]; //I hope this is the correct size + + StringCopy(string, gText_SizeComparedTo); + StringAppend(string, gSaveBlock2Ptr->playerName); + sub_80BE8DC(string, GetStringCenterAlignXOffset(1, string, 0xF0), 0x79); + gMain.state++; + } + break; + case 4: + ResetPaletteFade(); + gMain.state++; + break; + case 5: + spriteId = sub_80C0EF8(PlayerGenderToFrontTrainerPicId(gSaveBlock2Ptr->playerGender), 152, 56, 0); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 1; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_02039B54->dexNum].trainerOffset; + SetOamMatrix(1, gPokedexEntries[gUnknown_02039B54->dexNum].trainerScale, 0, 0, gPokedexEntries[gUnknown_02039B54->dexNum].trainerScale); + LoadPalette(gUnknown_0856E610, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20); + gTasks[taskId].data[5] = spriteId; + gMain.state++; + break; + case 6: + spriteId = sub_80C0E9C(gUnknown_02039B54->dexNum, 88, 56, 1); + gSprites[spriteId].oam.affineMode = 1; + gSprites[spriteId].oam.matrixNum = 2; + gSprites[spriteId].oam.priority = 0; + gSprites[spriteId].pos2.y = gPokedexEntries[gUnknown_02039B54->dexNum].pokemonOffset; + SetOamMatrix(2, gPokedexEntries[gUnknown_02039B54->dexNum].pokemonScale, 0, 0, gPokedexEntries[gUnknown_02039B54->dexNum].pokemonScale); + LoadPalette(gUnknown_0856E610, (gSprites[spriteId].oam.paletteNum + 16) * 16, 0x20); + gTasks[taskId].data[4] = spriteId; + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 7: + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(gUnknown_030060B4); + gMain.state++; + break; + case 8: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 9: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64E = 0; + gMain.state = 0; + gTasks[taskId].func = sub_80BFBB0; + } + break; + } +} + +void sub_80BFBB0(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + gUnknown_02039B4C->unk64E = 1; + gTasks[taskId].func = sub_80BFC78; + PlaySE(SE_PC_OFF); + } + else if ((gMain.newKeys & DPAD_LEFT) + || ((gMain.newKeys & L_BUTTON) && gSaveBlock2Ptr->optionsButtonMode == OPTIONS_BUTTON_MODE_LR)) + { + BeginNormalPaletteFade(0xFFFFFFEB, 0, 0, 0x10, RGB_BLACK); + gUnknown_02039B4C->unk64E = 2; + gTasks[taskId].func = sub_80BFC78; + PlaySE(SE_Z_PAGE); + } +} + +void sub_80BFC78(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_818D820(gTasks[taskId].data[4]); + sub_818D8F0(gTasks[taskId].data[5]); + switch (gUnknown_02039B4C->unk64E) + { + default: + case 1: + gTasks[taskId].func = sub_80BEA24; + break; + case 2: + gTasks[taskId].func = sub_80BF250; + break; + } + } +} + +void sub_80BFCDC(u16 a) +{ + CopyToBgTilemapBuffer(1, gUnknown_08DC2F5C, 0, 0); +} + +void sub_80BFCF4(u16 a) +{ + CopyToBgTilemapBuffer(1, gUnknown_08DC2FEC, 0, 0); +} + +#ifdef NONMATCHING +void sub_80BFD0C(u8 a, u16 unused) +{ + u8 i; + u8 j; + u16* ptr = GetBgTilemapBuffer(1); + + for (i = 0; i < 4; i++) + { + u8 row = (i * 7) + 1; + u16 newPalette = 0x4000; + + if (i == a) + newPalette = 0x2000; + + for (j = 0; j < 7; j++) + { + ptr[row + j] = (ptr[row + j] % 0x1000) | newPalette; + ptr[row + j + 0x20] = (ptr[row + j + 0x20] % 0x1000) | newPalette; + } + } + CopyBgTilemapBufferToVram(1); +} +#else +__attribute__((naked)) +void sub_80BFD0C(u8 a, u16 unused) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + movs r0, 0x1\n\ + bl GetBgTilemapBuffer\n\ + adds r7, r0, 0\n\ + movs r1, 0\n\ +_080BFD22:\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + movs r3, 0x80\n\ + lsls r3, 7\n\ + cmp r1, r8\n\ + bne _080BFD38\n\ + movs r3, 0x80\n\ + lsls r3, 6\n\ +_080BFD38:\n\ + movs r2, 0\n\ + adds r6, r1, 0x1\n\ + ldr r4, =0x00000fff\n\ +_080BFD3E:\n\ + adds r1, r5, r2\n\ + lsls r1, 1\n\ + adds r1, r7\n\ + ldrh r0, [r1]\n\ + ands r0, r4\n\ + orrs r0, r3\n\ + strh r0, [r1]\n\ + adds r1, 0x40\n\ + ldrh r0, [r1]\n\ + ands r0, r4\n\ + orrs r0, r3\n\ + strh r0, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x6\n\ + bls _080BFD3E\n\ + lsls r0, r6, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x3\n\ + bls _080BFD22\n\ + movs r0, 0x1\n\ + bl CopyBgTilemapBufferToVram\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void sub_80BFD7C(u8 a, u16 b) +{ + u8 i; + u8 j; + u16* ptr = GetBgTilemapBuffer(1); + + for (i = 0; i < 4; i++) + { + u8 row = i * 7 + 1; + u32 newPalette; + + if (i == a || i == 3) + newPalette = 0x2000; + else + newPalette = 0x4000; + + for (j = 0; j < 7; j++) + { + ptr[row + j] = (ptr[row + j] % 0x1000) | newPalette; + ptr[row + j + 0x20] = (ptr[row + j + 0x20] % 0x1000) | newPalette; + } + } + CopyBgTilemapBufferToVram(1); +} +#else +__attribute__((naked)) +void sub_80BFD7C(u8 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + movs r0, 0x1\n\ + bl GetBgTilemapBuffer\n\ + adds r7, r0, 0\n\ + movs r1, 0\n\ +_080BFD92:\n\ + lsls r0, r1, 3\n\ + subs r0, r1\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + cmp r1, r8\n\ + beq _080BFDA4\n\ + cmp r1, 0x3\n\ + bne _080BFDAA\n\ +_080BFDA4:\n\ + movs r3, 0x80\n\ + lsls r3, 6\n\ + b _080BFDAE\n\ +_080BFDAA:\n\ + movs r3, 0x80\n\ + lsls r3, 7\n\ +_080BFDAE:\n\ + movs r2, 0\n\ + adds r5, r1, 0x1\n\ + ldr r4, =0x00000fff\n\ +_080BFDB4:\n\ + adds r1, r6, r2\n\ + lsls r1, 1\n\ + adds r1, r7\n\ + ldrh r0, [r1]\n\ + ands r0, r4\n\ + orrs r0, r3\n\ + strh r0, [r1]\n\ + adds r1, 0x40\n\ + ldrh r0, [r1]\n\ + ands r0, r4\n\ + orrs r0, r3\n\ + strh r0, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x6\n\ + bls _080BFDB4\n\ + lsls r0, r5, 24\n\ + lsrs r1, r0, 24\n\ + cmp r1, 0x3\n\ + bls _080BFD92\n\ + movs r0, 0x1\n\ + bl CopyBgTilemapBufferToVram\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +u8 CreateDexDisplayMonDataTask(u16 dexNum, u32 b, u32 c) +{ + u8 taskId = CreateTask(sub_80BFE38, 0); + + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = dexNum; + gTasks[taskId].data[12] = b; + gTasks[taskId].data[13] = b >> 16; + gTasks[taskId].data[14] = c; + gTasks[taskId].data[15] = c >> 16; + return taskId; +} + +void sub_80BFE38(u8 taskId) +{ + u8 spriteId; + u16 dexNum = gTasks[taskId].data[1]; + + switch (gTasks[taskId].data[0]) + { + case 0: + default: + if (!gPaletteFade.active) + { + gUnknown_030060B4 = gMain.vblankCallback; + SetVBlankCallback(NULL); + sub_80C09B0(0x100); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0856E668, 2); + SetBgTilemapBuffer(3, AllocZeroed(0x800)); + SetBgTilemapBuffer(2, AllocZeroed(0x800)); + InitWindows(gUnknown_0856E670); + DeactivateAllTextPrinters(); + gTasks[taskId].data[0] = 1; + } + break; + case 1: + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexMenu_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, gUnknown_08DC3080, 0, 0); + FillWindowPixelBuffer(0, 0); + PutWindowTilemap(0); + PutWindowTilemap(1); + sub_80C0D30(1, gTasks[taskId].data[1]); + CopyWindowToVram(1, 2); + ResetPaletteFade(); + sub_80BC844(0); + gTasks[taskId].data[0]++; + break; + case 2: + gTasks[taskId].data[0]++; + break; + case 3: + sub_80C020C(dexNum, IsNationalPokedexEnabled(), 1, 1); + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gTasks[taskId].data[0]++; + break; + case 4: + spriteId = sub_80C0E9C(dexNum, 0x30, 0x38, 0); + gSprites[spriteId].oam.priority = 0; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + SetVBlankCallback(gUnknown_030060B4); + gTasks[taskId].data[3] = spriteId; + gTasks[taskId].data[0]++; + break; + case 5: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(2); + ShowBg(3); + gTasks[taskId].data[0]++; + break; + case 6: + if (!gPaletteFade.active) + { + PlayCry1(NationalPokedexNumToSpecies(dexNum), 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80C0088; + } + break; + } +} + +void sub_80C0088(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(0x0000FFFF, 0, 0, 16, RGB_BLACK); + gSprites[gTasks[taskId].data[3]].callback = sub_80C01CC; + gTasks[taskId].func = blockset_load_palette_to_gpu; + } + else if (++gTasks[taskId].data[2] & 0x10) + { + LoadPalette(gPokedexText_Pal + 1, 0x31, 14); + } + else + { + LoadPalette(gPokedexCaughtScreenFade_Pal + 1, 0x31, 14); + } +} + +void blockset_load_palette_to_gpu(u8 taskId) +{ + if (!gPaletteFade.active) + { + u16 species; + u32 otId; + u32 personality; + u8 paletteNum; + const u8 *lzPaletteData; + void *buffer; + + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + FreeAllWindowBuffers(); + buffer = GetBgTilemapBuffer(2); + if (buffer) + Free(buffer); + buffer = GetBgTilemapBuffer(3); + if (buffer) + Free(buffer); + + species = NationalPokedexNumToSpecies(gTasks[taskId].data[1]); + otId = ((u16)gTasks[taskId].data[13] << 16) | (u16)gTasks[taskId].data[12]; + personality = ((u16)gTasks[taskId].data[15] << 16) | (u16)gTasks[taskId].data[14]; + paletteNum = gSprites[gTasks[taskId].data[3]].oam.paletteNum; + lzPaletteData = GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality); + LoadCompressedPalette(lzPaletteData, 0x100 | paletteNum * 16, 32); + DestroyTask(taskId); + } +} + +void sub_80C01CC(struct Sprite *sprite) +{ + if (sprite->pos1.x < 0x78) + sprite->pos1.x += 2; + if (sprite->pos1.x > 0x78) + sprite->pos1.x -= 2; + + if (sprite->pos1.y < 0x50) + sprite->pos1.y += 1; + if (sprite->pos1.y > 0x50) + sprite->pos1.y -= 1; +} + +void sub_80C020C(u32 num, u32 value, u32 c, u32 d) +{ + u8 str[0x10]; + u8 str2[0x20]; + u16 natNum; + const u8 *text; + const u8 *text2; + const u8 *text3; + + if (d) + sub_80BE8DC(gText_PokedexRegistration, GetStringCenterAlignXOffset(1, gText_PokedexRegistration, 0xF0), 0); + if (value == 0) + value = NationalToHoennOrder(num); + else + value = num; + ConvertIntToDecimalStringN(StringCopy(str, gText_UnkCtrlF908Clear01), value, 2, 3); + sub_80BE8DC(str, 0x60, 0x19); + natNum = NationalPokedexNumToSpecies(num); + if (natNum) + text = gSpeciesNames[natNum]; + else + text = sText_TenDashes2; + sub_80BE8DC(text, 0x84, 0x19); + if (c) + { + CopyMonCategoryText(num, str2); + text2 = str2; + } + else + { + text2 = gText_5MarksPokemon; + } + sub_80BE8DC(text2, 0x64, 0x29); + sub_80BE8DC(gText_HTHeight, 0x60, 0x39); + sub_80BE8DC(gText_WTWeight, 0x60, 0x49); + if (c) + { + sub_80C0354(gPokedexEntries[num].height, 0x81, 0x39); + sub_80C0460(gPokedexEntries[num].weight, 0x81, 0x49); + } + else + { + sub_80BE8DC(gText_UnkHeight, 0x81, 0x39); + sub_80BE8DC(gText_UnkWeight, 0x81, 0x49); + } + if (c) + text3 = gPokedexEntries[num].description; + else + text3 = gUnknown_0855D30C; + sub_80BE8DC(text3, GetStringCenterAlignXOffset(1, text3, 0xF0), 0x5F); +} + +#define CHAR_PRIME (0xB4) +#define CHAR_DOUBLE_PRIME (0xB2) + +void sub_80C0354(u16 height, u8 left, u8 top) +{ + u8 buffer[16]; + u32 inches, feet; + u8 i = 0; + + inches = (height * 10000) / 254; + if (inches % 10 >= 5) + inches += 10; + feet = inches / 120; + inches = (inches - (feet * 120)) / 10; + + buffer[i++] = EXT_CTRL_CODE_BEGIN; + buffer[i++] = 0x13; + if (feet / 10 == 0) + { + buffer[i++] = 18; + buffer[i++] = feet + CHAR_0; + } + else + { + buffer[i++] = 12; + buffer[i++] = feet / 10 + CHAR_0; + buffer[i++] = (feet % 10) + CHAR_0; + } + buffer[i++] = CHAR_PRIME; + buffer[i++] = (inches / 10) + CHAR_0; + buffer[i++] = (inches % 10) + CHAR_0; + buffer[i++] = CHAR_DOUBLE_PRIME; + buffer[i++] = EOS; + sub_80BE8DC(buffer, left, top); +} + +#ifdef NONMATCHING +void sub_80C0460(u16 weight, u8 left, u8 top) +{ + u8 buffer[16]; + u32 lbs; + u8 i = 0; + bool8 output; + + lbs = (weight * 100000) / 4536; + if (lbs % 10 >= 5) + lbs += 10; + output = FALSE; + + buffer[i] = (lbs / 100000) + CHAR_0; + if (buffer[i] == CHAR_0) + { + buffer[i++] = 0x77; + } + else + { + output = TRUE; + i++; + } + + lbs = (lbs % 100000); + buffer[i] = (lbs / 10000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = 0x77; + } + else + { + output = TRUE; + i++; + } + + lbs = (lbs % 10000); + buffer[i] = (lbs / 1000) + CHAR_0; + if (buffer[i] == CHAR_0 && output == FALSE) + { + buffer[i++] = 0x77; + } + else + { + i++; + } + lbs = (lbs % 1000); + buffer[i++] = (lbs / 100) + CHAR_0; + lbs = (lbs % 100); + buffer[i++] = CHAR_PERIOD; + buffer[i++] = (lbs / 10) + CHAR_0; + buffer[i++] = CHAR_SPACE; + buffer[i++] = CHAR_l; + buffer[i++] = CHAR_b; + buffer[i++] = CHAR_s; + buffer[i++] = CHAR_PERIOD; + buffer[i++] = EOS; + sub_80BE8DC(buffer, left, top); +} +#else +__attribute__((naked)) +void sub_80C0460(u16 weight, u8 left, u8 top) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r10, r1\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + str r2, [sp, 0x10]\n\ + ldr r5, =0x000186a0\n\ + muls r0, r5\n\ + ldr r1, =0x000011b8\n\ + bl __divsi3\n\ + adds r7, r0, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + cmp r0, 0x4\n\ + bls _080C0494\n\ + adds r7, 0xA\n\ +_080C0494:\n\ + movs r0, 0\n\ + mov r8, r0\n\ + mov r4, sp\n\ + adds r0, r7, 0\n\ + adds r1, r5, 0\n\ + bl __udivsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0xA1\n\ + bne _080C04C0\n\ + movs r6, 0x1\n\ + mov r1, sp\n\ + movs r0, 0x77\n\ + strb r0, [r1]\n\ + b _080C04C6\n\ + .pool\n\ +_080C04C0:\n\ + movs r1, 0x1\n\ + mov r8, r1\n\ + movs r6, 0x1\n\ +_080C04C6:\n\ + ldr r1, =0x000186a0\n\ + adds r0, r7, 0\n\ + bl __umodsi3\n\ + adds r7, r0, 0\n\ + mov r4, sp\n\ + adds r4, 0x1\n\ + ldr r1, =0x00002710\n\ + bl __udivsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0xA1\n\ + bne _080C0504\n\ + mov r2, r8\n\ + cmp r2, 0\n\ + bne _080C0504\n\ + adds r1, r6, 0\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + add r1, sp\n\ + movs r0, 0x77\n\ + strb r0, [r1]\n\ + b _080C050E\n\ + .pool\n\ +_080C0504:\n\ + movs r3, 0x1\n\ + mov r8, r3\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ +_080C050E:\n\ + ldr r1, =0x00002710\n\ + adds r0, r7, 0\n\ + bl __umodsi3\n\ + adds r7, r0, 0\n\ + mov r0, sp\n\ + adds r4, r0, r6\n\ + movs r1, 0xFA\n\ + lsls r1, 2\n\ + adds r0, r7, 0\n\ + bl __udivsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0xA1\n\ + bne _080C054C\n\ + mov r1, r8\n\ + cmp r1, 0\n\ + bne _080C054C\n\ + adds r1, r6, 0\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + add r1, sp\n\ + movs r0, 0x77\n\ + strb r0, [r1]\n\ + b _080C0552\n\ + .pool\n\ +_080C054C:\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ +_080C0552:\n\ + movs r1, 0xFA\n\ + lsls r1, 2\n\ + adds r0, r7, 0\n\ + bl __umodsi3\n\ + adds r7, r0, 0\n\ + adds r1, r6, 0\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r5, r6, 0\n\ + mov r2, sp\n\ + adds r4, r2, r1\n\ + adds r0, r7, 0\n\ + movs r1, 0x64\n\ + bl __udivsi3\n\ + adds r0, 0xA1\n\ + movs r3, 0\n\ + mov r9, r3\n\ + strb r0, [r4]\n\ + adds r0, r7, 0\n\ + movs r1, 0x64\n\ + bl __umodsi3\n\ + adds r7, r0, 0\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r1, r6, 0\n\ + mov r2, sp\n\ + adds r0, r2, r5\n\ + movs r3, 0xAD\n\ + mov r8, r3\n\ + mov r2, r8\n\ + strb r2, [r0]\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r5, r6, 0\n\ + mov r3, sp\n\ + adds r4, r3, r1\n\ + adds r0, r7, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r1, r6, 0\n\ + mov r2, sp\n\ + adds r0, r2, r5\n\ + mov r3, r9\n\ + strb r3, [r0]\n\ + adds r0, r1, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r2, r6, 0\n\ + add r1, sp\n\ + movs r0, 0xE0\n\ + strb r0, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r3, r6, 0\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + movs r0, 0xD6\n\ + strb r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r2, r6, 0\n\ + mov r0, sp\n\ + adds r1, r0, r3\n\ + movs r0, 0xE7\n\ + strb r0, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r3, sp\n\ + adds r1, r3, r2\n\ + mov r2, r8\n\ + strb r2, [r1]\n\ + adds r1, r3, r0\n\ + movs r0, 0xFF\n\ + strb r0, [r1]\n\ + mov r0, sp\n\ + mov r1, r10\n\ + ldr r2, [sp, 0x10]\n\ + bl sub_80BE8DC\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +const u8 *sub_80C0620(u16 dexNum) +{ + return gPokedexEntries[dexNum].categoryName; +} + +u16 GetPokedexHeightWeight(u16 dexNum, u8 data) +{ + switch (data) + { + case 0: // height + return gPokedexEntries[dexNum].height; + case 1: // weight + return gPokedexEntries[dexNum].weight; + default: + return 1; + } +} + +s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID) +{ + u8 index; + u8 bit; + u8 mask; + s8 retVal; + + nationalDexNo--; + index = nationalDexNo / 8; + bit = nationalDexNo % 8; + mask = 1 << bit; + retVal = 0; + switch (caseID) + { + case FLAG_GET_SEEN: + if (gSaveBlock2Ptr->pokedex.seen[index] & mask) + { + if ((gSaveBlock2Ptr->pokedex.seen[index] & mask) == (gSaveBlock1Ptr->seen1[index] & mask) + && (gSaveBlock2Ptr->pokedex.seen[index] & mask) == (gSaveBlock1Ptr->seen2[index] & mask)) + retVal = 1; + else + { + gSaveBlock2Ptr->pokedex.seen[index] &= ~mask; + gSaveBlock1Ptr->seen1[index] &= ~mask; + gSaveBlock1Ptr->seen2[index] &= ~mask; + retVal = 0; + } + } + break; + case FLAG_GET_CAUGHT: + if (gSaveBlock2Ptr->pokedex.owned[index] & mask) + { + if ((gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock2Ptr->pokedex.seen[index] & mask) + && (gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock1Ptr->seen1[index] & mask) + && (gSaveBlock2Ptr->pokedex.owned[index] & mask) == (gSaveBlock1Ptr->seen2[index] & mask)) + retVal = 1; + else + { + gSaveBlock2Ptr->pokedex.owned[index] &= ~mask; + gSaveBlock2Ptr->pokedex.seen[index] &= ~mask; + gSaveBlock1Ptr->seen1[index] &= ~mask; + gSaveBlock1Ptr->seen2[index] &= ~mask; + retVal = 0; + } + } + break; + case FLAG_SET_SEEN: + gSaveBlock2Ptr->pokedex.seen[index] |= mask; + gSaveBlock1Ptr->seen1[index] |= mask; + gSaveBlock1Ptr->seen2[index] |= mask; + break; + case FLAG_SET_CAUGHT: + gSaveBlock2Ptr->pokedex.owned[index] |= mask; + break; + } + return retVal; +} + +u16 GetNationalPokedexCount(u8 caseID) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < NATIONAL_DEX_COUNT; i++) + { + switch (caseID) + { + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) + count++; + break; + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) + count++; + break; + } + } + return count; +} + +u16 GetHoennPokedexCount(u8 caseID) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < 202; i++) + { + switch (caseID) + { + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_SEEN)) + count++; + break; + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) + count++; + break; + } + } + return count; +} + +u16 sub_80C089C(u8 caseID) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < 151; i++) + { + switch (caseID) + { + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) + count++; + break; + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) + count++; + break; + } + } + return count; +} + +bool8 sub_80C08E4(void) +{ + u16 i; + + for (i = 0; i < 200; i++) + { + if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) + return FALSE; + } + return TRUE; +} + +bool8 sub_80C0918(void) +{ + u16 i; + + for (i = 0; i < 150; i++) + { + if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) + return FALSE; + } + return TRUE; +} + +u16 sub_80C0944(void) +{ + u16 i; + + for (i = 0; i < 150; i++) + { + if (GetSetPokedexFlag(i + 1, 1) == 0) + return 0; + } + for (i = 151; i < 248; i++) + { + if (GetSetPokedexFlag(i + 1, 1) == 0) + return 0; + } + for (i = 251; i < 384; i++) + { + if (GetSetPokedexFlag(i + 1, 1) == 0) + return 0; + } + return 1; +} + +void sub_80C09B0(u16 a) +{ + if (!(a & DISPCNT_BG0_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG0_ON); + SetGpuReg(REG_OFFSET_BG0CNT, 0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + } + if (!(a & DISPCNT_BG1_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG1_ON); + SetGpuReg(REG_OFFSET_BG1CNT, 0); + SetGpuReg(REG_OFFSET_BG1HOFS, 0); + SetGpuReg(REG_OFFSET_BG1VOFS, 0); + } + if (!(a & DISPCNT_BG2_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG2_ON); + SetGpuReg(REG_OFFSET_BG2CNT, 0); + SetGpuReg(REG_OFFSET_BG2HOFS, 0); + SetGpuReg(REG_OFFSET_BG2VOFS, 0); + } + if (!(a & DISPCNT_BG3_ON)) + { + ClearGpuRegBits(0, DISPCNT_BG3_ON); + SetGpuReg(REG_OFFSET_BG3CNT, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + } + if (!(a & DISPCNT_OBJ_ON)) + { + ClearGpuRegBits(0, DISPCNT_OBJ_ON); + ResetSpriteData(); + FreeAllSpritePalettes(); + gReservedSpritePaletteCount = 8; + } +} + +void sub_80C0A88(u8 windowId, const u8 *str, u8 left, u8 top) +{ + u8 color[3]; + color[0] = 0; + color[1] = 15; + color[2] = 3; + + AddTextPrinterParameterized2(windowId, 1, left, top, 0, 0, color, -1, str); +} + +void sub_80C0AC4(u8 windowId, u16 order, u8 left, u8 top) +{ + u8 str[4]; + + str[0] = CHAR_0 + order / 100; + str[1] = CHAR_0 + (order % 100) / 10; + str[2] = CHAR_0 + (order % 100) % 10; + str[3] = EOS; + sub_80C0A88(windowId, str, left, top); +} + +u8 sub_80C0B44(u8 windowId, u16 num, u8 left, u8 top) +{ + u8 str[11]; + u8 i; + + for (i = 0; i < 11; i++) + str[i] = EOS; + num = NationalPokedexNumToSpecies(num); + switch (num) + { + default: + for (i = 0; gSpeciesNames[num][i] != EOS && i < 10; i++) + str[i] = gSpeciesNames[num][i]; + break; + case 0: + for (i = 0; i < 5; i++) + str[i] = CHAR_HYPHEN; + break; + } + sub_80C0A88(windowId, str, left, top); + return i; +} + +void sub_80C0BF0(u8 windowId, const u8* str, u8 left, u8 top) +{ + u8 str2[11]; + u8 i; + u8 count; + + for (i = 0; i < 11; i++) + str2[i] = CHAR_SPACE; + for (count = 0; str[count] != CHAR_SPACE && count < 11; count++) + ; + for (i = 0; i < count; i++) + str2[11 - count + i] = str[i]; + str2[11] = EOS; + sub_80C0A88(windowId, str2, left, top); +} + +void sub_80C0C6C(u8 windowId, u16 b, u8 left, u8 top) +{ + u8 str[6]; + bool8 outputted = FALSE; + u8 result; + + result = b / 1000; + if (result == 0) + { + str[0] = 0x77; + outputted = FALSE; + } + else + { + str[0] = CHAR_0 + result; + outputted = TRUE; + } + + result = (b % 1000) / 100; + if (result == 0 && !outputted) + { + str[1] = 0x77; + outputted = FALSE; + } + else + { + str[1] = CHAR_0 + result; + outputted = TRUE; + } + + str[2] = CHAR_0 + ((b % 1000) % 100) / 10; + str[3] = CHAR_PERIOD; + str[4] = CHAR_0 + ((b % 1000) % 100) % 10; + str[5] = EOS; + sub_80C0A88(windowId, str, left, top); +} + +void sub_80C0D30(u8 windowId, u16 a1) +{ + u8 image[32 * 4]; + const u8 * r12 = gMonFootprintTable[NationalPokedexNumToSpecies(a1)]; + u16 r5 = 0; + u16 i; + u16 j; + + for (i = 0; i < 32; i++) + { + u8 r3 = r12[i]; + for (j = 0; j < 4; j++) + { + u8 value = ((r3 >> (2 * j)) & 1 ? 2 : 0); + if ((2 << (2 * j)) & r3) + value |= 0x20; + image[r5] = value; + r5++; + } + } + CopyToWindowPixelBuffer(windowId, image, sizeof(image), 0); +} + +void sub_80C0DC0(u16 a, u16 b) +{ + *(u16 *)(VRAM + a * 0x800 + 0x232) = 0xF000 + b + 0; + *(u16 *)(VRAM + a * 0x800 + 0x234) = 0xF000 + b + 1; + *(u16 *)(VRAM + a * 0x800 + 0x272) = 0xF000 + b + 2; + *(u16 *)(VRAM + a * 0x800 + 0x274) = 0xF000 + b + 3; +} + +u16 sub_80C0E0C(u8 a, u16 b, u16 c, u16 d) +{ + switch (a) + { + case 1: + if (b > c) + b--; + break; + case 0: + if (b < d) + b++; + break; + case 3: + if (b > c) + b--; + else + b = d; + break; + case 2: + if (b < d) + b++; + else + b = c; + break; + } + return b; +} + +u32 sub_80C0E68(u16 a) +{ + if (a == SPECIES_UNOWN || a == SPECIES_SPINDA) + { + if (a == SPECIES_UNOWN) + return gSaveBlock2Ptr->pokedex.unownPersonality; + else + return gSaveBlock2Ptr->pokedex.spindaPersonality; + } + else + { + return 0; + } +} + +u16 sub_80C0E9C(u16 num, s16 x, s16 y, u16 paletteSlot) +{ + num = NationalPokedexNumToSpecies(num); + return sub_818D7D8(num, 8, sub_80C0E68(num), TRUE, x, y, paletteSlot, 0xFFFF); +} + +u16 sub_80C0EF8(u16 species, s16 x, s16 y, s8 paletteSlot) +{ + return sub_818D8AC(species, TRUE, x, y, paletteSlot, 0xFFFF); +} + +int sub_80C0F30(u8 dexMode, u8 sortMode, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) +{ + u16 species; + u16 i; + u16 resultsCount; + u8 types[2]; + + sub_80BC8D4(dexMode, sortMode); + + for (i = 0, resultsCount = 0; i < NATIONAL_DEX_COUNT; i++) + { + if (gUnknown_02039B4C->unk0[i].seen) + { + gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i]; + resultsCount++; + } + } + gUnknown_02039B4C->pokemonListCount = resultsCount; + + // Search by name + if (abcGroup != 0xFF) + { + for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++) + { + u8 r3; + + species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum); + r3 = gSpeciesNames[species][0]; + if ((r3 >= gUnknown_0856ED08[abcGroup][0] && r3 < gUnknown_0856ED08[abcGroup][0] + gUnknown_0856ED08[abcGroup][1]) + || (r3 >= gUnknown_0856ED08[abcGroup][2] && r3 < gUnknown_0856ED08[abcGroup][2] + gUnknown_0856ED08[abcGroup][3])) + { + gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i]; + resultsCount++; + } + } + gUnknown_02039B4C->pokemonListCount = resultsCount; + } + + // Search by body color + if (bodyColor != 0xFF) + { + for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++) + { + species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum); + + if (bodyColor == gBaseStats[species].bodyColor) + { + gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i]; + resultsCount++; + } + } + gUnknown_02039B4C->pokemonListCount = resultsCount; + } + + // Search by type + if (type1 != 0xFF || type2 != 0xFF) + { + if (type1 == 0xFF) + { + type1 = type2; + type2 = 0xFF; + } + + if (type2 == 0xFF) + { + for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++) + { + if (gUnknown_02039B4C->unk0[i].owned) + { + species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum); + + types[0] = gBaseStats[species].type1; + types[1] = gBaseStats[species].type2; + if (types[0] == type1 || types[1] == type1) + { + gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i]; + resultsCount++; + } + } + } + } + else + { + for (i = 0, resultsCount = 0; i < gUnknown_02039B4C->pokemonListCount; i++) + { + if (gUnknown_02039B4C->unk0[i].owned) + { + species = NationalPokedexNumToSpecies(gUnknown_02039B4C->unk0[i].dexNum); + + types[0] = gBaseStats[species].type1; + types[1] = gBaseStats[species].type2; + if ((types[0] == type1 && types[1] == type2) || (types[0] == type2 && types[1] == type1)) + { + gUnknown_02039B4C->unk0[resultsCount] = gUnknown_02039B4C->unk0[i]; + resultsCount++; + } + } + } + } + gUnknown_02039B4C->pokemonListCount = resultsCount; + } + + if (gUnknown_02039B4C->pokemonListCount != 0) + { + for (i = gUnknown_02039B4C->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) + { + gUnknown_02039B4C->unk0[i].dexNum = 0xFFFF; + gUnknown_02039B4C->unk0[i].seen = FALSE; + gUnknown_02039B4C->unk0[i].owned = FALSE; + + } + } + + return resultsCount; +} + +u8 sub_80C1258(void) +{ + return CreateTask(sub_80C12E0, 0); +} + +void sub_80C1270(const u8 *str, u32 left, u32 top) +{ + u8 color[3]; + + color[0] = 0; + color[1] = 15; + color[2] = 2; + AddTextPrinterParameterized2(0, 1, left, top, 0, 0, color, -1, str); +} + +void sub_80C12B0(u32 x, u32 y, u32 width, u32 height) +{ + FillWindowPixelRect(0, 0, x, y, width, height); +} + +void sub_80C12E0(u8 taskId) +{ + u16 i; + + switch (gMain.state) + { + default: + case 0: + if (!gPaletteFade.active) + { + gUnknown_02039B4C->unk64A = 2; + sub_80C09B0(0); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0856EFF8, 4); + SetBgTilemapBuffer(3, AllocZeroed(0x800)); + SetBgTilemapBuffer(2, AllocZeroed(0x800)); + SetBgTilemapBuffer(1, AllocZeroed(0x800)); + SetBgTilemapBuffer(0, AllocZeroed(0x800)); + InitWindows(gUnknown_0856F008); + DeactivateAllTextPrinters(); + PutWindowTilemap(0); + copy_decompressed_tile_data_to_vram_autofree(3, gPokedexSearchMenu_Gfx, 0x2000, 0, 0); + + if (!IsNationalPokedexEnabled()) + CopyToBgTilemapBuffer(3, gPokedexSearch2_Tilemap, 0, 0); + else + CopyToBgTilemapBuffer(3, gPokedexSearch1_Tilemap, 0, 0); + LoadPalette(gPokedexSearchMenu_Pal + 1, 1, 0x7E); + gMain.state = 1; + } + break; + case 1: + LoadCompressedObjectPic(gSpriteSheets_0855D26C); + LoadSpritePalettes(gSpritePalettes_0855D26C); + sub_80C2594(taskId); + for (i = 0; i < 16; i++) + gTasks[taskId].data[i] = 0; + sub_80C23B8(taskId); + sub_80C2040(0); + sub_80C20F8(taskId); + CopyWindowToVram(0, 3); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(3); + gMain.state++; + break; + case 2: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); + gMain.state++; + break; + case 3: + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + HideBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); + gMain.state++; + break; + case 4: + if (!gPaletteFade.active) + { + gTasks[taskId].func = sub_80C1570; + gMain.state = 0; + } + break; + } +} + +void sub_80C152C(void) +{ + void* tilemapBuffer; + + FreeAllWindowBuffers(); + tilemapBuffer = GetBgTilemapBuffer(0); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(1); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(2); + if (tilemapBuffer) + Free(tilemapBuffer); + tilemapBuffer = GetBgTilemapBuffer(3); + if (tilemapBuffer) + Free(tilemapBuffer); +} + +void sub_80C1570(u8 taskId) +{ + sub_80C2040(gTasks[taskId].data[0]); + sub_80C20F8(taskId); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + gTasks[taskId].func = sub_80C15B0; +} + +void sub_80C15B0(u8 taskId) +{ + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80C1D38; + return; + } + if (gMain.newKeys & A_BUTTON) + { + switch (gTasks[taskId].data[0]) + { + case 0: + PlaySE(SE_PIN); + gTasks[taskId].data[1] = 0; + gTasks[taskId].func = sub_80C16CC; + break; + case 1: + PlaySE(SE_PIN); + gTasks[taskId].data[1] = 4; + gTasks[taskId].func = sub_80C16CC; + break; + case 2: + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80C1D38; + break; + } + return; + } + if ((gMain.newKeys & DPAD_LEFT) && gTasks[taskId].data[0] > 0) + { + PlaySE(SE_Z_PAGE); + gTasks[taskId].data[0]--; + sub_80C2040(gTasks[taskId].data[0]); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + } + if ((gMain.newKeys & DPAD_RIGHT) && gTasks[taskId].data[0] < 2) + { + PlaySE(SE_Z_PAGE); + gTasks[taskId].data[0]++; + sub_80C2040(gTasks[taskId].data[0]); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + } +} + +void sub_80C16CC(u8 taskId) +{ + sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]); + sub_80C20F8(taskId); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + gTasks[taskId].func = sub_80C170C; +} + +void sub_80C170C(u8 taskId) +{ + const u8 (*r6)[4]; + + if (gTasks[taskId].data[0] != 0) + { + if (!IsNationalPokedexEnabled()) + r6 = gUnknown_0856EDF0; + else + r6 = gUnknown_0856EDB8; + } + else + { + if (!IsNationalPokedexEnabled()) + r6 = gUnknown_0856EDD4; + else + r6 = gUnknown_0856ED9C; + } + + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_BOWA); + sub_80C23B8(taskId); + gTasks[taskId].func = sub_80C1570; + return; + } + if (gMain.newKeys & A_BUTTON) + { + if (gTasks[taskId].data[1] == 6) + { + if (gTasks[taskId].data[0] != 0) + { + gUnknown_02039B52 = 0x40; + gUnknown_02039B4C->unk62A = 0x40; + gUnknown_02039B50 = 0; + gUnknown_02039B4C->unk610 = 0; + gSaveBlock2Ptr->pokedex.unknown1 = sub_80C2318(taskId, 5); + if (!IsNationalPokedexEnabled()) + gSaveBlock2Ptr->pokedex.unknown1 = 0; + gUnknown_02039B4C->unk614 = gSaveBlock2Ptr->pokedex.unknown1; + gSaveBlock2Ptr->pokedex.order = sub_80C2318(taskId, 4); + gUnknown_02039B4C->unk618 = gSaveBlock2Ptr->pokedex.order; + PlaySE(SE_PC_OFF); + gTasks[taskId].func = sub_80C1D38; + } + else + { + sub_80C2618(gText_SearchingPleaseWait); + gTasks[taskId].func = sub_80C19A4; + PlaySE(SE_Z_SEARCH); + CopyWindowToVram(0, 2); + } + } + else + { + PlaySE(SE_PIN); + gTasks[taskId].func = sub_80C1B64; + } + return; + } + + if ((gMain.newKeys & DPAD_LEFT) && r6[gTasks[taskId].data[1]][0] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][0]; + sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + } + if ((gMain.newKeys & DPAD_RIGHT) && r6[gTasks[taskId].data[1]][1] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][1]; + sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + } + if ((gMain.newKeys & DPAD_UP) && r6[gTasks[taskId].data[1]][2] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][2]; + sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + } + if ((gMain.newKeys & DPAD_DOWN) && r6[gTasks[taskId].data[1]][3] != 0xFF) + { + PlaySE(SE_SELECT); + gTasks[taskId].data[1] = r6[gTasks[taskId].data[1]][3]; + sub_80C2064(gTasks[taskId].data[0], gTasks[taskId].data[1]); + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + } +} + +void sub_80C19A4(u8 taskId) +{ + u8 r10 = sub_80C2318(taskId, 5); + u8 r9 = sub_80C2318(taskId, 4); + u8 r8 = sub_80C2318(taskId, 0); + u8 r6 = sub_80C2318(taskId, 1); + u8 r4 = sub_80C2318(taskId, 2); + u8 r0 = sub_80C2318(taskId, 3); + + sub_80C0F30(r10, r9, r8, r6, r4, r0); + gTasks[taskId].func = sub_80C1A4C; +} + +void sub_80C1A4C(u8 taskId) +{ + if (!IsSEPlaying()) + { + if (gUnknown_02039B4C->pokemonListCount != 0) + { + PlaySE(SE_SEIKAI); + sub_80C2618(gText_SearchCompleted); + } + else + { + PlaySE(SE_HAZURE); + sub_80C2618(gUnknown_085E8785); + } + gTasks[taskId].func = sub_80C1AB8; + CopyWindowToVram(0, 2); + } +} + +void sub_80C1AB8(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_02039B4C->pokemonListCount != 0) + { + gUnknown_02039B4C->unk64E = 1; + gUnknown_02039B4C->dexMode = sub_80C2318(taskId, 5); + gUnknown_02039B4C->dexOrder = sub_80C2318(taskId, 4); + gTasks[taskId].func = sub_80C1D38; + PlaySE(SE_PC_OFF); + } + else + { + gTasks[taskId].func = sub_80C16CC; + PlaySE(SE_BOWA); + } + } +} + +void sub_80C1B64(u8 taskId) +{ + u8 r0; + u16 *p1; + u16 *p2; + + sub_80C21D4(0); + r0 = gTasks[taskId].data[1]; + p1 = &gTasks[taskId].data[gUnknown_0856EFC8[r0].unk4]; + p2 = &gTasks[taskId].data[gUnknown_0856EFC8[r0].unk5]; + gTasks[taskId].data[14] = *p1; + gTasks[taskId].data[15] = *p2; + sub_80C2294(taskId); + sub_80C2650(*p1); + gTasks[taskId].func = sub_80C1BCC; + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); +} + +void sub_80C1BCC(u8 taskId) +{ + u8 r1; + const struct UnknownStruct2 *r8; + u16 *p1; + u16 *p2; + u16 r2; + bool8 r3; + + r1 = gTasks[taskId].data[1]; + r8 = gUnknown_0856EFC8[r1].unk0; + p1 = &gTasks[taskId].data[gUnknown_0856EFC8[r1].unk4]; + p2 = &gTasks[taskId].data[gUnknown_0856EFC8[r1].unk5]; + r2 = gUnknown_0856EFC8[r1].unk6 - 1; + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_PIN); + sub_80C267C(); + sub_80C21D4(1); + gTasks[taskId].func = sub_80C16CC; + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + return; + } + if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_BOWA); + sub_80C267C(); + sub_80C21D4(1); + *p1 = gTasks[taskId].data[14]; + *p2 = gTasks[taskId].data[15]; + gTasks[taskId].func = sub_80C16CC; + CopyWindowToVram(0, 2); + CopyBgTilemapBufferToVram(3); + return; + } + r3 = FALSE; + if (gMain.newAndRepeatedKeys & DPAD_UP) + { + if (*p1 != 0) + { + sub_80C2638(*p1); + (*p1)--; + sub_80C2650(*p1); + r3 = TRUE; + } + else if (*p2 != 0) + { + (*p2)--; + sub_80C2294(taskId); + sub_80C2650(*p1); + r3 = TRUE; + } + if (r3) + { + PlaySE(SE_SELECT); + sub_80C2618(r8[*p1 + *p2].text1); + CopyWindowToVram(0, 2); + } + return; + } + if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + if (*p1 < 5 && *p1 < r2) + { + sub_80C2638(*p1); + (*p1)++; + sub_80C2650(*p1); + r3 = TRUE; + } + else if (r2 > 5 && *p2 < r2 - 5) + { + (*p2)++; + sub_80C2294(taskId); + sub_80C2650(5); + r3 = TRUE; + } + if (r3) + { + PlaySE(SE_SELECT); + sub_80C2618(r8[*p1 + *p2].text1); + CopyWindowToVram(0, 2); + } + return; + } +} + +void sub_80C1D38(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = sub_80C1D70; +} + +void sub_80C1D70(u8 taskId) +{ + if (!gPaletteFade.active) + { + sub_80C152C(); + DestroyTask(taskId); + } +} + +#ifdef NONMATCHING +void sub_80C1D98(u8 a, u8 b, u8 c, u8 d) +{ + u16 i; + u16* ptr = GetBgTilemapBuffer(3); + + for (i = 0; i < d; i++) + { + ptr[b + i + (c << 6)] %= 0x1000; + ptr[b + i + (c << 6)] |= a * 4096; + + ptr[b + i + (c << 6) + 32] %= 0x1000; + ptr[b + i + (c << 6) + 32] |= a * 4096; + } +} +#else +__attribute__((naked)) +void sub_80C1D98(u8 a, u8 b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + adds r4, r3, 0\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r8, r1\n\ + lsls r2, 24\n\ + lsrs r5, r2, 24\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x3\n\ + bl GetBgTilemapBuffer\n\ + adds r2, r0, 0\n\ + movs r3, 0\n\ + cmp r3, r4\n\ + bcs _080C1DEC\n\ + lsls r0, r5, 6\n\ + adds r7, r0, r2\n\ + ldr r5, =0x00000fff\n\ + lsls r2, r6, 12\n\ +_080C1DC8:\n\ + mov r0, r8\n\ + adds r1, r0, r3\n\ + lsls r1, 1\n\ + adds r1, r7\n\ + ldrh r0, [r1]\n\ + ands r0, r5\n\ + orrs r0, r2\n\ + strh r0, [r1]\n\ + adds r1, 0x40\n\ + ldrh r0, [r1]\n\ + ands r0, r5\n\ + orrs r0, r2\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, r4\n\ + bcc _080C1DC8\n\ +_080C1DEC:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_80C1DFC(u8 a, u8 b, u8 c) +{ + u8 r5 = (b & 1) | ((c & 1) << 1); + + switch (a) + { + case 0: + case 1: + case 2: + sub_80C1D98(r5, gUnknown_0856ED30[a].unk4, gUnknown_0856ED30[a].unk5, gUnknown_0856ED30[a].unk6); + break; + case 3: + case 4: + case 7: + case 8: + sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk4, gUnknown_0856ED48[a - 3].unk5, gUnknown_0856ED48[a - 3].unk6); + // fall through + case 5: + case 6: + sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk7, gUnknown_0856ED48[a - 3].unk8, gUnknown_0856ED48[a - 3].unk9); + break; + case 10: + sub_80C1D98(r5, gUnknown_0856ED48[2].unk4, gUnknown_0856ED48[2].unk5, gUnknown_0856ED48[2].unk6); + break; + case 9: + if (!IsNationalPokedexEnabled()) + sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk4, gUnknown_0856ED48[a - 3].unk5 - 2, gUnknown_0856ED48[a - 3].unk6); + else + sub_80C1D98(r5, gUnknown_0856ED48[a - 3].unk4, gUnknown_0856ED48[a - 3].unk5, gUnknown_0856ED48[a - 3].unk6); + break; + } +} + +void sub_80C1EF4(u8 a) +{ + switch (a) + { + case 0: + sub_80C1DFC(0, 0, 0); + sub_80C1DFC(1, 1, 0); + sub_80C1DFC(2, 1, 0); + sub_80C1DFC(3, 1, 0); + sub_80C1DFC(4, 1, 0); + sub_80C1DFC(10, 1, 0); + sub_80C1DFC(5, 1, 0); + sub_80C1DFC(6, 1, 0); + sub_80C1DFC(7, 1, 0); + sub_80C1DFC(8, 1, 0); + sub_80C1DFC(9, 1, 0); + break; + case 1: + sub_80C1DFC(0, 1, 0); + sub_80C1DFC(1, 0, 0); + sub_80C1DFC(2, 1, 0); + sub_80C1DFC(3, 1, 1); + sub_80C1DFC(4, 1, 1); + sub_80C1DFC(10, 1, 1); + sub_80C1DFC(5, 1, 1); + sub_80C1DFC(6, 1, 1); + sub_80C1DFC(7, 1, 0); + sub_80C1DFC(8, 1, 0); + sub_80C1DFC(9, 1, 0); + break; + case 2: + sub_80C1DFC(0, 1, 0); + sub_80C1DFC(1, 1, 0); + sub_80C1DFC(2, 0, 0); + sub_80C1DFC(3, 1, 1); + sub_80C1DFC(4, 1, 1); + sub_80C1DFC(10, 1, 1); + sub_80C1DFC(5, 1, 1); + sub_80C1DFC(6, 1, 1); + sub_80C1DFC(7, 1, 1); + sub_80C1DFC(8, 1, 1); + sub_80C1DFC(9, 1, 1); + break; + } +} + +void sub_80C2040(u8 a) +{ + sub_80C1EF4(a); + sub_80C2618(gUnknown_0856ED30[a].text); +} + +void sub_80C2064(u8 a, u8 b) +{ + sub_80C1EF4(a); + switch (b) + { + case 0: + sub_80C1DFC(3, 0, 0); + break; + case 1: + sub_80C1DFC(4, 0, 0); + break; + case 2: + sub_80C1DFC(10, 0, 0); + sub_80C1DFC(5, 0, 0); + break; + case 3: + sub_80C1DFC(10, 0, 0); + sub_80C1DFC(6, 0, 0); + break; + case 4: + sub_80C1DFC(7, 0, 0); + break; + case 5: + sub_80C1DFC(8, 0, 0); + break; + case 6: + sub_80C1DFC(9, 0, 0); + break; + } + sub_80C2618(gUnknown_0856ED48[b].text); +} + +void sub_80C20F8(u8 taskId) +{ + u16 var; + + sub_80C12B0(0x28, 0x10, 0x60, 0x50); + + var = gTasks[taskId].data[6] + gTasks[taskId].data[7]; + sub_80C1270(gUnknown_0856EE5C[var].text2, 0x2D, 0x11); + + var = gTasks[taskId].data[8] + gTasks[taskId].data[9]; + sub_80C1270(gUnknown_0856EEB4[var].text2, 0x2D, 0x21); + + var = gTasks[taskId].data[10] + gTasks[taskId].data[11]; + sub_80C1270(gUnknown_0856EF14[var].text2, 0x2D, 0x31); + + var = gTasks[taskId].data[12] + gTasks[taskId].data[13]; + sub_80C1270(gUnknown_0856EF14[var].text2, 0x5D, 0x31); + + var = gTasks[taskId].data[4] + gTasks[taskId].data[5]; + sub_80C1270(gUnknown_0856EE24[var].text2, 0x2D, 0x41); + + if (IsNationalPokedexEnabled()) + { + var = gTasks[taskId].data[2] + gTasks[taskId].data[3]; + sub_80C1270(gUnknown_0856EE0C[var].text2, 0x2D, 0x51); + } +} + +void sub_80C21D4(u8 a) +{ + u16 i; + u16 j; + u16* ptr = GetBgTilemapBuffer(3); + + if (a == 0) + { + *(ptr + 0x11) = 0xC0B; + for (i = 0x12; i < 0x1F; i++) + *(ptr + i) = 0x80D; + for (j = 1; j < 13; j++) + { + *(ptr + 0x11 + j * 32) = 0x40A; + for (i = 0x12; i < 0x1F; i++) + *(ptr + j * 32 + i) = 2; + } + *(ptr + 0x1B1) = 0x40B; + for (i = 0x12; i < 0x1F; i++) + *(ptr + 0x1A0 + i) = 0xD; + } + else + { + for (j = 0; j < 14; j++) + { + for (i = 0x11; i < 0x1E; i++) + { + *(ptr + j * 32 + i) = 0x4F; + } + } + } +} + +void sub_80C2294(u8 taskId) +{ + const struct UnknownStruct2 *r6 = gUnknown_0856EFC8[gTasks[taskId].data[1]].unk0; + const u16 *r8 = &gTasks[taskId].data[gUnknown_0856EFC8[gTasks[taskId].data[1]].unk4]; + const u16 *r7 = &gTasks[taskId].data[gUnknown_0856EFC8[gTasks[taskId].data[1]].unk5]; + u16 i; + u16 j; + + sub_80C267C(); + for (i = 0, j = *r7; i < 6 && r6[j].text2 != NULL; i++, j++) + sub_80C2668(i, r6[j].text2); + sub_80C2618(r6[*r8 + *r7].text1); +} + +u8 sub_80C2318(u8 taskId, u8 b) +{ + const u16 *ptr1 = &gTasks[taskId].data[gUnknown_0856EFC8[b].unk4]; + const u16 *ptr2 = &gTasks[taskId].data[gUnknown_0856EFC8[b].unk5]; + u16 r2 = *ptr1 + *ptr2; + + switch (b) + { + default: + return 0; + case 5: + return gUnknown_0856EFAC[r2]; + case 4: + return gUnknown_0856EFAE[r2]; + case 0: + if (r2 == 0) + return 0xFF; + else + return r2; + case 1: + if (r2 == 0) + return 0xFF; + else + return r2 - 1; + case 2: + case 3: + return gUnknown_0856EFB4[r2]; + } +} + +void sub_80C23B8(u8 taskId) +{ + u16 r3; + + switch (gUnknown_02039B4C->unk614) + { + default: + case 0: + r3 = 0; + break; + case 1: + r3 = 1; + break; + } + gTasks[taskId].data[2] = r3; + + switch (gUnknown_02039B4C->unk618) + { + default: + case 0: + r3 = 0; + break; + case 1: + r3 = 1; + break; + case 2: + r3 = 2; + break; + case 3: + r3 = 3; + break; + case 4: + r3 = 4; + break; + case 5: + r3 = 5; + break; + } + gTasks[taskId].data[4] = r3; +} + +bool8 sub_80C244C(u8 taskId) +{ + u8 val1 = gTasks[taskId].data[1]; + const u16 *ptr = &gTasks[taskId].data[gUnknown_0856EFC8[val1].unk5]; + u16 val2 = gUnknown_0856EFC8[val1].unk6 - 1; + + if (val2 > 5 && *ptr != 0) + return FALSE; + else + return TRUE; +} + +bool8 sub_80C2494(u8 taskId) +{ + u8 val1 = gTasks[taskId].data[1]; + const u16 *ptr = &gTasks[taskId].data[gUnknown_0856EFC8[val1].unk5]; + u16 val2 = gUnknown_0856EFC8[val1].unk6 - 1; + + if (val2 > 5 && *ptr < val2 - 5) + return FALSE; + else + return TRUE; +} + +void sub_80C24E0(struct Sprite *sprite) +{ + if (gTasks[sprite->data[0]].func == sub_80C1BCC) + { + u8 val; + + if (sprite->data[1] != 0) + { + if (sub_80C2494(sprite->data[0])) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + else + { + if (sub_80C244C(sprite->data[0])) + sprite->invisible = TRUE; + else + sprite->invisible = FALSE; + } + val = sprite->data[2] + sprite->data[1] * 128; + sprite->pos2.y = gSineTable[val] / 128; + sprite->data[2] += 8; + } + else + { + sprite->invisible = TRUE; + } +} + +void sub_80C2594(u8 taskId) +{ + u8 spriteId; + + spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 4, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 0; + gSprites[spriteId].callback = sub_80C24E0; + + spriteId = CreateSprite(&gUnknown_0855D1AC, 184, 108, 0); + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = 1; + gSprites[spriteId].vFlip = TRUE; + gSprites[spriteId].callback = sub_80C24E0; +} + +void sub_80C2618(const u8* str) +{ + sub_80C12B0(8, 0x78, 0xE0, 0x20); + sub_80C1270(str, 8, 0x79); +} + +void sub_80C2638(u32 y) +{ + sub_80C12B0(0x90, y * 16 + 8, 8, 16); +} + +void sub_80C2650(u32 left) +{ + sub_80C1270(gText_SelectorArrow, 0x90, left * 16 + 9); +} + +void sub_80C2668(u32 left, const u8* str) +{ + sub_80C1270(str, 0x98, left * 16 + 9); +} + +void sub_80C267C(void) +{ + sub_80C12B0(0x90, 8, 0x60, 0x60); +} diff --git a/src/pokemon.c b/src/pokemon.c index 800b7c0cd..7c010cd39 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -63,7 +63,7 @@ extern const struct SpriteFrameImage gUnknown_082FF4F8[]; extern const struct SpriteFrameImage gUnknown_082FF518[]; extern const union AffineAnimCmd *const gUnknown_082FF618[]; extern const union AffineAnimCmd *const gUnknown_082FF694[]; -extern const union AnimCmd *gUnknown_082FF70C[]; +extern const union AnimCmd *gPlayerMonSpriteAnimsTable[]; extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[]; extern const union AnimCmd *const *const gUnknown_08305D0C[]; extern const union AnimCmd *const *const gUnknown_0830536C[]; @@ -105,7 +105,7 @@ EWRAM_DATA u8 gPlayerPartyCount = 0; EWRAM_DATA u8 gEnemyPartyCount = 0; EWRAM_DATA struct Pokemon gPlayerParty[PARTY_SIZE] = {0}; EWRAM_DATA struct Pokemon gEnemyParty[PARTY_SIZE] = {0}; -EWRAM_DATA struct SpriteTemplate gUnknown_0202499C = {0}; +EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0}; EWRAM_DATA struct Unknown_806F160_Struct *gUnknown_020249B4[2] = {NULL}; // const rom data @@ -1575,8 +1575,8 @@ void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lv u8 language; u8 value; - if (gSaveBlock2Ptr->frontierChosenLvl != 0) - level = BattleFrontierGetOpponentLvl(gSaveBlock2Ptr->frontierChosenLvl); + if (gSaveBlock2Ptr->frontier.chosenLvl != 0) + level = BattleFrontierGetOpponentLvl(gSaveBlock2Ptr->frontier.chosenLvl); else if (lvl50) level = 50; else @@ -1752,7 +1752,7 @@ bool8 sub_80688F8(u8 caseId, u8 battlerId) return FALSE; if (!gMain.inBattle) return FALSE; - if (gLinkPlayers[GetMultiplayerId()].lp_field_18 == battlerId) + if (gLinkPlayers[GetMultiplayerId()].id == battlerId) return FALSE; break; case 2: @@ -1774,7 +1774,7 @@ bool8 sub_80688F8(u8 caseId, u8 battlerId) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gLinkPlayers[GetMultiplayerId()].lp_field_18 == battlerId) + if (gLinkPlayers[GetMultiplayerId()].id == battlerId) return FALSE; } else @@ -1964,11 +1964,11 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_MAX_HP, &newMaxHP); - CALC_STAT(baseAttack, attackIV, attackEV, 1, MON_DATA_ATK) - CALC_STAT(baseDefense, defenseIV, defenseEV, 2, MON_DATA_DEF) - CALC_STAT(baseSpeed, speedIV, speedEV, 3, MON_DATA_SPEED) - CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, 4, MON_DATA_SPATK) - CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, 5, MON_DATA_SPDEF) + CALC_STAT(baseAttack, attackIV, attackEV, STAT_ATK, MON_DATA_ATK) + CALC_STAT(baseDefense, defenseIV, defenseEV, STAT_DEF, MON_DATA_DEF) + CALC_STAT(baseSpeed, speedIV, speedEV, STAT_SPEED, MON_DATA_SPEED) + CALC_STAT(baseSpAttack, spAttackIV, spAttackEV, STAT_SPATK, MON_DATA_SPATK) + CALC_STAT(baseSpDefense, spDefenseIV, spDefenseEV, STAT_SPDEF, MON_DATA_SPDEF) if (species == SPECIES_SHEDINJA) { @@ -2089,7 +2089,7 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) s32 level = GetLevelFromBoxMonExp(boxMon); s32 i; - for (i = 0; gLevelUpLearnsets[species][i] != (u16)-1; i++) + for (i = 0; gLevelUpLearnsets[species][i] != LEVEL_UP_END; i++) { u16 moveLevel; u16 move; @@ -2101,7 +2101,7 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon) move = (gLevelUpLearnsets[species][i] & 0x1FF); - if (GiveMoveToBoxMon(boxMon, move) == (u16)-1) + if (GiveMoveToBoxMon(boxMon, move) == 0xFFFF) DeleteFirstMoveAndGiveMoveToBoxMon(boxMon, move); } } @@ -2123,7 +2123,7 @@ u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove) while ((gLevelUpLearnsets[species][sLearningMoveTableID] & 0xFE00) != (level << 9)) { sLearningMoveTableID++; - if (gLevelUpLearnsets[species][sLearningMoveTableID] == 0xFFFF) + if (gLevelUpLearnsets[species][sLearningMoveTableID] == LEVEL_UP_END) return 0; } } @@ -2265,7 +2265,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de if (attackerHoldEffect == sHoldEffectToType[i][0] && type == sHoldEffectToType[i][1]) { - if (type <= 8) + if (IS_TYPE_PHYSICAL(type)) attack = (attack * (attackerHoldEffectParam + 100)) / 100; else spAttack = (spAttack * (attackerHoldEffectParam + 100)) / 100; @@ -2293,9 +2293,9 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de spAttack /= 2; if (attacker->ability == ABILITY_HUSTLE) attack = (150 * attack) / 100; - if (attacker->ability == ABILITY_PLUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MINUS, 0, 0)) + if (attacker->ability == ABILITY_PLUS && ABILITY_ON_FIELD2(ABILITY_MINUS)) spAttack = (150 * spAttack) / 100; - if (attacker->ability == ABILITY_MINUS && AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_PLUS, 0, 0)) + if (attacker->ability == ABILITY_MINUS && ABILITY_ON_FIELD2(ABILITY_PLUS)) spAttack = (150 * spAttack) / 100; if (attacker->ability == ABILITY_GUTS && attacker->status1) attack = (150 * attack) / 100; @@ -2316,7 +2316,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION) defense /= 2; - if (type < TYPE_MYSTERY) // is physical + if (IS_TYPE_PHYSICAL(type)) { if (gCritMultiplier == 2) { @@ -2366,7 +2366,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de if (type == TYPE_MYSTERY) damage = 0; // is ??? type. does 0 damage. - if (type > TYPE_MYSTERY) // is special? + if (IS_TYPE_SPECIAL(type)) { if (gCritMultiplier == 2) { @@ -2406,8 +2406,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de damage /= 2; // are effects of weather negated with cloud nine or air lock - if (!AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_CLOUD_NINE, 0, 0) - && !AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_AIR_LOCK, 0, 0)) + if (WEATHER_HAS_EFFECT2) { if (gBattleWeather & WEATHER_RAIN_TEMPORARY) { @@ -2486,13 +2485,14 @@ static bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER)) return FALSE; - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) return FALSE; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT) + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) return FALSE; - if (FlagGet(badgeFlag)) + else if (FlagGet(badgeFlag)) return TRUE; - return FALSE; + else + return FALSE; } u8 GetDefaultMoveTarget(u8 battlerId) @@ -2561,53 +2561,53 @@ u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality) return MON_MALE; } -void sub_806A068(u16 species, u8 battlerPosition) +void SetMultiuseSpriteTemplateToPokemon(u16 species, u8 battlerPosition) { if (gMonSpritesGfxPtr != NULL) - gUnknown_0202499C = gMonSpritesGfxPtr->templates[battlerPosition]; + gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else if (gUnknown_020249B4[0]) - gUnknown_0202499C = gUnknown_020249B4[0]->templates[battlerPosition]; + gMultiuseSpriteTemplate = gUnknown_020249B4[0]->templates[battlerPosition]; else if (gUnknown_020249B4[1]) - gUnknown_0202499C = gUnknown_020249B4[1]->templates[battlerPosition]; + gMultiuseSpriteTemplate = gUnknown_020249B4[1]->templates[battlerPosition]; else - gUnknown_0202499C = gUnknown_08329D98[battlerPosition]; + gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition]; - gUnknown_0202499C.paletteTag = species; - if (battlerPosition == 0 || battlerPosition == 2) - gUnknown_0202499C.anims = gUnknown_082FF70C; + gMultiuseSpriteTemplate.paletteTag = species; + if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) + gMultiuseSpriteTemplate.anims = gPlayerMonSpriteAnimsTable; else if (species > 500) - gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species - 500]; + gMultiuseSpriteTemplate.anims = gMonAnimationsSpriteAnimsPtrTable[species - 500]; else - gUnknown_0202499C.anims = gMonAnimationsSpriteAnimsPtrTable[species]; + gMultiuseSpriteTemplate.anims = gMonAnimationsSpriteAnimsPtrTable[species]; } -void sub_806A12C(u16 trainerSpriteId, u8 battlerPosition) +void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerSpriteId, u8 battlerPosition) { - gUnknown_0202499C.paletteTag = trainerSpriteId; + gMultiuseSpriteTemplate.paletteTag = trainerSpriteId; if (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_PLAYER_RIGHT) { - gUnknown_0202499C = gUnknown_08329DF8[trainerSpriteId]; - gUnknown_0202499C.anims = gUnknown_08305D0C[trainerSpriteId]; + gMultiuseSpriteTemplate = gUnknown_08329DF8[trainerSpriteId]; + gMultiuseSpriteTemplate.anims = gUnknown_08305D0C[trainerSpriteId]; } else { if (gMonSpritesGfxPtr != NULL) - gUnknown_0202499C = gMonSpritesGfxPtr->templates[battlerPosition]; + gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else - gUnknown_0202499C = gUnknown_08329D98[battlerPosition]; - gUnknown_0202499C.anims = gUnknown_0830536C[trainerSpriteId]; + gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition]; + gMultiuseSpriteTemplate.anims = gUnknown_0830536C[trainerSpriteId]; } } -void sub_806A1C0(u16 arg0, u8 battlerPosition) +void SetMultiuseSpriteTemplateToTrainerFront(u16 arg0, u8 battlerPosition) { if (gMonSpritesGfxPtr != NULL) - gUnknown_0202499C = gMonSpritesGfxPtr->templates[battlerPosition]; + gMultiuseSpriteTemplate = gMonSpritesGfxPtr->templates[battlerPosition]; else - gUnknown_0202499C = gUnknown_08329D98[battlerPosition]; + gMultiuseSpriteTemplate = gUnknown_08329D98[battlerPosition]; - gUnknown_0202499C.paletteTag = arg0; - gUnknown_0202499C.anims = gUnknown_0830536C[arg0]; + gMultiuseSpriteTemplate.paletteTag = arg0; + gMultiuseSpriteTemplate.anims = gUnknown_0830536C[arg0]; } static void EncryptBoxMon(struct BoxPokemon *boxMon) @@ -3136,7 +3136,8 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) { - const u8* data = dataArg; + const u8 *data = dataArg; + switch (field) { case MON_DATA_STATUS: @@ -3179,7 +3180,7 @@ void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) { - const u8* data = dataArg; + const u8 *data = dataArg; struct PokemonSubstruct0 *substruct0 = NULL; struct PokemonSubstruct1 *substruct1 = NULL; @@ -4511,8 +4512,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) else holdEffect = ItemId_GetHoldEffect(heldItem); - if (holdEffect == 38 && type != 3) - return 0; + if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && type != 3) + return SPECIES_NONE; switch (type) { @@ -4520,7 +4521,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) level = GetMonData(mon, MON_DATA_LEVEL, 0); friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - for (i = 0; i < 5; i++) + for (i = 0; i < EVOS_PER_MON; i++) { switch (gEvolutionTable[species][i].method) { @@ -4577,7 +4578,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) } break; case 1: - for (i = 0; i < 5; i++) + for (i = 0; i < EVOS_PER_MON; i++) { switch (gEvolutionTable[species][i].method) { @@ -4597,7 +4598,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem) break; case 2: case 3: - for (i = 0; i < 5; i++) + for (i = 0; i < EVOS_PER_MON; i++) { if (gEvolutionTable[species][i].method == EVO_ITEM && gEvolutionTable[species][i].param == evolutionItem) @@ -4805,7 +4806,7 @@ void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies) bool8 sub_806D7EC(void) { bool8 retVal = FALSE; - switch (gLinkPlayers[GetMultiplayerId()].lp_field_18) + switch (gLinkPlayers[GetMultiplayerId()].id) { case 0: case 3: @@ -4819,28 +4820,28 @@ bool8 sub_806D7EC(void) return retVal; } -bool16 sub_806D82C(u8 id) +u16 GetLinkTrainerFlankId(u8 linkPlayerId) { - bool16 retVal = FALSE; - switch (gLinkPlayers[id].lp_field_18) + u16 flankId = 0; + switch (gLinkPlayers[linkPlayerId].id) { case 0: case 3: - retVal = FALSE; + flankId = 0; break; case 1: case 2: - retVal = TRUE; + flankId = 1; break; } - return retVal; + return flankId; } s32 GetBattlerMultiplayerId(u16 a1) { s32 id; for (id = 0; id < MAX_LINK_PLAYERS; id++) - if (gLinkPlayers[id].lp_field_18 == a1) + if (gLinkPlayers[id].id == a1) break; return id; } @@ -4849,16 +4850,17 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) { if (InBattlePyramid()) return GetTrainerEncounterMusicIdInBattlePyramind(trainerOpponentId); - if (sub_81D5C18()) + else if (sub_81D5C18()) return sub_81D63C8(trainerOpponentId); - return TRAINER_ENCOUNTER_MUSIC(trainerOpponentId); + else + return TRAINER_ENCOUNTER_MUSIC(trainerOpponentId); } u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) { if (statIndex < 1 || statIndex > 5) { - // should just be "return n", but it wouldn't match without this + // Should just be "return n", but it wouldn't match without this. u16 retVal = n; retVal++; retVal--; @@ -5165,7 +5167,7 @@ void PartySpreadPokerus(struct Pokemon *party) { if (pokerus & 0xF) { - // spread to adjacent party members + // Spread to adjacent party members. if (i != 0 && !(GetMonData(&party[i - 1], MON_DATA_POKERUS, 0) & 0xF0)) SetMonData(&party[i - 1], MON_DATA_POKERUS, &curPokerus); if (i != (PARTY_SIZE - 1) && !(GetMonData(&party[i + 1], MON_DATA_POKERUS, 0) & 0xF0)) @@ -5365,11 +5367,11 @@ u16 GetBattleBGM(void) { if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) return MUS_BATTLE34; - if (gBattleTypeFlags & BATTLE_TYPE_REGI) + else if (gBattleTypeFlags & BATTLE_TYPE_REGI) return MUS_BATTLE36; - if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) + else if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000)) return MUS_BATTLE20; - if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { u8 trainerClass; @@ -5414,7 +5416,8 @@ u16 GetBattleBGM(void) return MUS_BATTLE20; } } - return MUS_BATTLE27; + else + return MUS_BATTLE27; } void PlayBattleBGM(void) @@ -5578,19 +5581,19 @@ void BoxMonRestorePP(struct BoxPokemon *boxMon) } } -void sub_806E994(void) +void SetMonPreventsSwitchingString(void) { - gLastUsedAbility = gBattleStruct->field_B0; + gLastUsedAbility = gBattleStruct->abilityPreventingSwitchout; gBattleTextBuff1[0] = B_BUFF_PLACEHOLDER_BEGIN; gBattleTextBuff1[1] = B_BUFF_MON_NICK_WITH_PREFIX; - gBattleTextBuff1[2] = gBattleStruct->field_49; + gBattleTextBuff1[2] = gBattleStruct->battlerPreventingSwitchout; gBattleTextBuff1[4] = B_BUFF_EOS; - if (!GetBattlerSide(gBattleStruct->field_49)) - gBattleTextBuff1[3] = pokemon_order_func(gBattlerPartyIndexes[gBattleStruct->field_49]); + if (GetBattlerSide(gBattleStruct->battlerPreventingSwitchout) == B_SIDE_PLAYER) + gBattleTextBuff1[3] = pokemon_order_func(gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout]); else - gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->field_49]; + gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->battlerPreventingSwitchout]; PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBattlerInMenuId, pokemon_order_func(gBattlerPartyIndexes[gBattlerInMenuId])) @@ -5620,7 +5623,7 @@ void SetWildMonHeldItem(void) var1 = 20; var2 = 80; } - if (gMapHeader.mapDataId == 0x1A4) + if (gMapHeader.mapLayoutId == 0x1A4) { s32 alteringCaveId = GetWildMonTableIdInAlteringCave(species); if (alteringCaveId != 0) @@ -5678,7 +5681,7 @@ const u8 *GetTrainerPartnerName(void) { if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - if (gPartnerTrainerId == STEVEN_PARTNER_ID) + if (gPartnerTrainerId == TRAINER_STEVEN_PARTNER) { return gTrainers[TRAINER_STEVEN].trainerName; } @@ -5691,7 +5694,7 @@ const u8 *GetTrainerPartnerName(void) else { u8 id = GetMultiplayerId(); - return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].lp_field_18 ^ 2)].name; + return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].id ^ 2)].name; } } @@ -5821,7 +5824,7 @@ u8 sub_806EF08(u8 arg0) s32 i; s32 var = 0; u8 multiplayerId = GetMultiplayerId(); - switch (gLinkPlayers[multiplayerId].lp_field_18) + switch (gLinkPlayers[multiplayerId].id) { case 0: case 2: @@ -5834,7 +5837,7 @@ u8 sub_806EF08(u8 arg0) } for (i = 0; i < 4; i++) { - if (gLinkPlayers[i].lp_field_18 == (s16)(var)) + if (gLinkPlayers[i].id == (s16)(var)) break; } return i; @@ -5844,7 +5847,7 @@ u8 sub_806EF84(u8 arg0, u8 arg1) { s32 i; s32 var = 0; - switch (gLinkPlayers[arg1].lp_field_18) + switch (gLinkPlayers[arg1].id) { case 0: case 2: @@ -5857,7 +5860,7 @@ u8 sub_806EF84(u8 arg0, u8 arg1) } for (i = 0; i < 4; i++) { - if (gLinkPlayers[i].lp_field_18 == (s16)(var)) + if (gLinkPlayers[i].id == (s16)(var)) break; } return i; @@ -5891,15 +5894,15 @@ void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality) const u8 *GetTrainerClassNameFromId(u16 trainerId) { - if (trainerId > NO_OF_TRAINERS) - trainerId = 0; + if (trainerId >= TRAINERS_COUNT) + trainerId = TRAINER_NONE; return gTrainerClassNames[gTrainers[trainerId].trainerClass]; } const u8 *GetTrainerNameFromId(u16 trainerId) { - if (trainerId > NO_OF_TRAINERS) - trainerId = 0; + if (trainerId >= TRAINERS_COUNT) + trainerId = TRAINER_NONE; return gTrainers[trainerId].trainerName; } @@ -5948,7 +5951,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 = gPlayerMonSpriteAnimsTable; structPtr->templates[i].paletteTag = i; } } diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 02755fe40..c50aa4a75 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -1184,7 +1184,7 @@ static void sub_817F9F4(struct Sprite *sprite) } #else -__attribute__((naked)) +NAKED static void sub_817F9F4(struct Sprite *sprite) { asm(".syntax unified\n\ diff --git a/src/pokemon_icon.c b/src/pokemon_icon.c index 4d1cc51c5..253ab2cb4 100644 --- a/src/pokemon_icon.c +++ b/src/pokemon_icon.c @@ -1,9 +1,28 @@ #include "global.h" #include "sprite.h" +#include "mail.h" #include "graphics.h" +#include "constants/species.h" +#include "palette.h" +#include "pokemon_icon.h" #define POKE_ICON_BASE_PAL_TAG 56000 +struct MonIconSpriteTemplate +{ + const struct OamData *oam; + const u8 *image; + const union AnimCmd *const *anims; + const union AffineAnimCmd *const *affineAnims; + void (*callback)(struct Sprite *); + u16 paletteTag; +}; + +// static functions +static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8); + +// .rodata + const u8 * const gMonIconTable[] = { gMonIcon_Bulbasaur, @@ -1012,3 +1031,288 @@ const u16 sSpriteImageSizes[3][4] = 0x400, // 4×8 }, }; + +u8 CreateMonIcon(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, u32 personality, bool32 extra) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = GetMonIconPtr(species, personality, extra), + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + if (species > SPECIES_EGG) + iconTemplate.paletteTag = POKE_ICON_BASE_PAL_TAG; + + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u8 sub_80D2D78(u16 species, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority, bool32 extra) +{ + u8 spriteId; + struct MonIconSpriteTemplate iconTemplate = + { + .oam = &sMonIconOamData, + .image = NULL, + .anims = sMonIconAnims, + .affineAnims = sMonIconAffineAnims, + .callback = callback, + .paletteTag = POKE_ICON_BASE_PAL_TAG + gMonIconPaletteIndices[species], + }; + + iconTemplate.image = GetMonIconTiles(species, extra); + spriteId = CreateMonIconSprite(&iconTemplate, x, y, subpriority); + + UpdateMonIconFrame(&gSprites[spriteId]); + + return spriteId; +} + +u16 mon_icon_convert_unown_species_id(u16 species, u32 personality) +{ + u16 result; + + if (species == SPECIES_UNOWN) + { + u16 letter = GetUnownLetterByPersonality(personality); + if (letter == 0) + letter = SPECIES_UNOWN; + else + letter += (SPECIES_UNOWN_B - 1); + result = letter; + } + else + { + if (species > SPECIES_EGG) + result = 260; + else + result = species; + } + + return result; +} + +u16 GetUnownLetterByPersonality(u32 personality) +{ + if (!personality) + return 0; + return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; +} + +u16 sub_80D2E84(u16 species) +{ + u16 value; + + if (MailSpeciesToSpecies(species, &value) == SPECIES_UNOWN) + { + if (value == 0) + value += SPECIES_UNOWN; + else + value += (SPECIES_UNOWN_B - 1); + return value; + } + else + { + if(species > (SPECIES_UNOWN_B - 1)) + species = 260; + return mon_icon_convert_unown_species_id(species, 0); + } +} + +const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 extra) +{ + return GetMonIconTiles(mon_icon_convert_unown_species_id(species, personality), extra); +} + + + +void sub_80D2EF8(struct Sprite *sprite) +{ + sub_80D328C(sprite); +} + +void LoadMonIconPalettes(void) +{ + u8 i; + for (i = 0; i < 6; i++) + LoadSpritePalette(&gMonIconPaletteTable[i]); +} + +// unused +void SafeLoadMonIconPalette(u16 species) +{ + u8 palIndex; + if (species > SPECIES_EGG) + species = 260; + palIndex = gMonIconPaletteIndices[species]; + if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) + LoadSpritePalette(&gMonIconPaletteTable[palIndex]); +} + +void LoadMonIconPalette(u16 species) +{ + u8 palIndex = gMonIconPaletteIndices[species]; + if (IndexOfSpritePaletteTag(gMonIconPaletteTable[palIndex].tag) == 0xFF) + LoadSpritePalette(&gMonIconPaletteTable[palIndex]); +} + +void FreeMonIconPalettes(void) +{ + u8 i; + for (i = 0; i < 6; i++) + FreeSpritePaletteByTag(gMonIconPaletteTable[i].tag); +} + +// unused +void SafeFreeMonIconPalette(u16 species) +{ + u8 palIndex; + if (species > SPECIES_EGG) + species = 260; + palIndex = gMonIconPaletteIndices[species]; + FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); +} + +void FreeMonIconPalette(u16 species) +{ + u8 palIndex; + palIndex = gMonIconPaletteIndices[species]; + FreeSpritePaletteByTag(gMonIconPaletteTable[palIndex].tag); +} + +void sub_80D3014(struct Sprite *sprite) +{ + UpdateMonIconFrame(sprite); +} + +const u8* GetMonIconTiles(u16 species, bool32 extra) +{ + const u8* iconSprite = gMonIconTable[species]; + if(species == SPECIES_DEOXYS && extra == TRUE) + { + iconSprite = (const u8*)(0x400 + (u32)iconSprite); //WTF? + } + return iconSprite; +} + +void sub_80D304C(u16 offset) +{ + s32 i; + const struct SpritePalette* monIconPalettePtr; + + if(offset <= 0xA0) + { + monIconPalettePtr = gMonIconPaletteTable; + for(i = 5; i >= 0 ; i--) + { + LoadPalette(monIconPalettePtr->data, offset, 0x20); + offset += 0x10; + monIconPalettePtr++; + } + } +} + +u8 sub_80D3080(u16 species) +{ + if (species > SPECIES_EGG) + species = 260; + return gMonIconPaletteIndices[species]; +} + +u8 sub_80D30A0(u16 species) +{ + return gMonIconPaletteIndices[species]; +} + +const u16* GetValidMonIconPalettePtr(u16 species) +{ + if (species > SPECIES_EGG) + species = 260; + return gMonIconPaletteTable[gMonIconPaletteIndices[species]].data; +} + +// TODO: try to find a way to avoid using asm statement +u8 UpdateMonIconFrame(struct Sprite *sprite) +{ + u8 result = 0; + + if (sprite->animDelayCounter == 0) + { + s16 frame = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.imageValue; + + switch (frame) + { + case -1: + break; + case -2: + sprite->animCmdIndex = 0; + break; + default: + RequestSpriteCopy( + // pointer arithmetic is needed to get the correct pointer to perform the sprite copy on. + // because sprite->images is a struct def, it has to be casted to (u8 *) before any + // arithmetic can be performed. + (u8 *)sprite->images + (sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] * frame), + (u8 *)(OBJ_VRAM0 + sprite->oam.tileNum * TILE_SIZE_4BPP), + sSpriteImageSizes[sprite->oam.shape][sprite->oam.size]); + { + register u8 duration asm("r0") = sprite->anims[sprite->animNum][sprite->animCmdIndex].frame.duration; + sprite->animDelayCounter = duration; + } + sprite->animCmdIndex++; + result = sprite->animCmdIndex; + break; + } + } + else + { + sprite->animDelayCounter--; + } + return result; +} + +static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *iconTemplate, s16 x, s16 y, u8 subpriority) +{ + u8 spriteId; + + struct SpriteFrameImage image = { NULL, sSpriteImageSizes[iconTemplate->oam->shape][iconTemplate->oam->size] }; + + struct SpriteTemplate spriteTemplate = + { + .tileTag = 0xFFFF, + .paletteTag = iconTemplate->paletteTag, + .oam = iconTemplate->oam, + .anims = iconTemplate->anims, + .images = &image, + .affineAnims = iconTemplate->affineAnims, + .callback = iconTemplate->callback, + }; + + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); + gSprites[spriteId].animPaused = TRUE; + gSprites[spriteId].animBeginning = FALSE; + gSprites[spriteId].images = (const struct SpriteFrameImage *)iconTemplate->image; + return spriteId; +} + +void sub_80D328C(struct Sprite *sprite) +{ + struct SpriteFrameImage image = { NULL, sSpriteImageSizes[sprite->oam.shape][sprite->oam.size] }; + sprite->images = ℑ + DestroySprite(sprite); +} + +void sub_80D32C8(struct Sprite *sprite, u8 animNum) +{ + sprite->animNum = animNum; + sprite->animDelayCounter = 0; + sprite->animCmdIndex = 0; +} diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 834ca6f7d..728b887f8 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -15,7 +15,7 @@ #include "sound.h" #include "constants/species.h" #include "sprite.h" -#include "unk_text_util.h" +#include "dynamic_placeholder_text_util.h" #include "string_util.h" #include "task.h" #include "text.h" @@ -27,21 +27,8 @@ #include "scanline_effect.h" #include "menu_helpers.h" #include "daycare.h" - -struct ContestMove -{ - u8 effect; - u8 type; - u8 comboID; - u8 combo[4]; -}; - -struct ContestEffect -{ - u8 type; - u8 appeal; - u8 jam; -}; +#include "data2.h" +#include "contest.h" extern struct UnkSummaryStruct* gUnknown_0203CF1C; extern struct BgTemplate gUnknown_0861CBB4; @@ -69,6 +56,7 @@ extern u8 gUnknown_0861CE74[]; extern u8 gUnknown_0861CE7B[]; extern struct WindowTemplate gUnknown_0861CCEC; extern struct WindowTemplate gUnknown_0861CD14; +extern const u8 *const gContestEffectDescriptionPointers[]; void sub_81C488C(u8 a); extern u8 sub_81221EC(); @@ -96,6 +84,7 @@ extern u8 gText_PkmnInfo[]; extern u8 gText_PkmnSkills[]; extern u8 gText_BattleMoves[]; extern u8 gText_ContestMoves[]; +extern u8 gText_HMMovesCantBeForgotten2[]; extern u8 gText_Cancel2[]; extern u8 gText_Info[]; extern u8 gText_Switch[]; @@ -144,12 +133,14 @@ extern u8 gUnknown_0861CE8E[]; extern u8 gText_OneDash[]; extern u8 gText_TwoDashes[]; extern u8 gText_ThreeDashes[]; +extern u8 gText_Cancel[]; extern u8 gUnknown_0861CE97[]; +extern const struct SpriteTemplate gUnknown_0861CFC4; extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f); extern bool8 sub_81A6BF4(); extern bool8 sub_81B9E94(); -extern void UnkTextUtil_Reset(); +extern void DynamicPlaceholderTextUtil_Reset(); extern void sub_8124610(u8 *a, u8 b); extern int GetPlayerIDAsU32(); extern u8 GetCurrentPpToMaxPpState(u8 a, u8 b); @@ -173,6 +164,9 @@ void sub_81C4984(); void sub_81C4A08(); void sub_81C4A88(); void sub_81C4280(); +void sub_81C43A0(); +void sub_81C4484(); +void sub_81C4420(); void sub_81C0510(u8 taskId); void sub_81C171C(u8 taskId); void ResetAllBgsCoordinates(); @@ -341,15 +335,16 @@ struct UnkSummaryStruct u8 unk40C9; u8 unk40CA; u8 unk40CB[8]; - u8 unk40D3; - u8 unk40D4; - u8 unk40D5; - u8 unk_filler5[0x19]; + u8 unk40D3[0x1C]; u8 unk40EF; s16 unk40F0; u8 unk_filler4[6]; }; +// const rom data +#include "data/text/move_descriptions.h" + +// code void sub_81BF8EC(u8 a, void *b, u8 c, u8 d, void *e) { u8 byte; @@ -506,8 +501,8 @@ bool8 sub_81BFB10(void) gMain.state++; break; case 17: - gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0); - if (gUnknown_0203CF1C->unk40D3 != 0xFF) + gUnknown_0203CF1C->unk40D3[0] = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0); + if (gUnknown_0203CF1C->unk40D3[0] != 0xFF) { gUnknown_0203CF1C->unk40F0 = 0; gMain.state++; @@ -541,7 +536,7 @@ bool8 sub_81BFB10(void) gMain.state++; break; case 24: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); gPaletteFade.bufferTransferDisabled = 0; gMain.state++; break; @@ -761,7 +756,7 @@ void sub_81C0434() void sub_81C044C(u8 taskId) { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); gTasks[taskId].func = sub_81C0484; } @@ -890,10 +885,10 @@ void sub_81C0704(u8 taskId) break; case 1: sub_81C4898(); - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3]); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3[0]]); break; case 2: - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3[1]]); break; case 3: sub_81C0098(&gUnknown_0203CF1C->currentMon); @@ -916,10 +911,10 @@ void sub_81C0704(u8 taskId) data[1] = 0; break; case 8: - gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]); - if (gUnknown_0203CF1C->unk40D3 == 0xFF) + gUnknown_0203CF1C->unk40D3[0] = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]); + if (gUnknown_0203CF1C->unk40D3[0] == 0xFF) return; - gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 1; + gSprites[gUnknown_0203CF1C->unk40D3[0]].data[2] = 1; sub_81C0E24(); data[1] = 0; break; @@ -934,7 +929,7 @@ void sub_81C0704(u8 taskId) sub_81C2524(); break; case 12: - gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 0; + gSprites[gUnknown_0203CF1C->unk40D3[0]].data[2] = 0; break; default: if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0) @@ -1139,7 +1134,7 @@ void sub_81C0E48(u8 taskId) gUnknown_0203CF1C->unk40C6 = 0; move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; ClearWindowTilemap(0x13); - if (gSprites[gUnknown_0203CF1C->unk40D5].invisible == 0) + if (gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible == 0) ClearWindowTilemap(0xD); sub_81C1DA4(9, -3); sub_81C1EFC(9, -3, move); @@ -1245,7 +1240,7 @@ void sub_81C1070(s16 *a, s8 b, u8 *c) if ((*c == 4 && gUnknown_0203CF1C->unk40C4 == 0) || a[1] == 1) { ClearWindowTilemap(19); - if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible) ClearWindowTilemap(13); schedule_bg_copy_tilemap_to_vram(0); sub_81C1DA4(9, -3); @@ -1417,7 +1412,7 @@ void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId) *ppBonusesPtr = localPpBonuses; } #else -ASM_DIRECT +NAKED void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId) { asm(".syntax unified\n\ @@ -1628,7 +1623,7 @@ void sub_81C15EC(struct BoxPokemon *mon, u8 swappingFromId, u8 swappingToId) *ppBonusesPtr = localPpBonuses; } #else -ASM_DIRECT +NAKED void sub_81C15EC(struct BoxPokemon *mon, u8 swappingFromId, u8 swappingToId) { asm(".syntax unified\n\ @@ -1825,7 +1820,7 @@ void sub_81C174C(u8 taskId) } else { - PlaySE(0x20); + PlaySE(SE_HAZURE); sub_81C18F4(taskId); } } @@ -1889,7 +1884,7 @@ void sub_81C1940(u8 taskId) { ClearWindowTilemap(19); - if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible) ClearWindowTilemap(13); move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; gTasks[taskId].func = sub_81C174C; @@ -1903,7 +1898,7 @@ void sub_81C1940(u8 taskId) if (gUnknown_0203CF1C->unk40C0 != 3) { ClearWindowTilemap(19); - if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible) ClearWindowTilemap(13); move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; gTasks[taskId].func = sub_81C174C; @@ -1915,7 +1910,7 @@ void sub_81C1940(u8 taskId) else if (gMain.newKeys & (A_BUTTON | B_BUTTON)) { ClearWindowTilemap(19); - if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible) ClearWindowTilemap(13); move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; sub_81C3E9C(move); @@ -2039,7 +2034,7 @@ void sub_81C1CB0(struct UnkStruct_61CC04 *a, u16 *b, u8 c, u8 d) Free(alloced); } #else -ASM_DIRECT +NAKED void sub_81C1CB0(struct UnkStruct_61CC04 *a, u16 *b, u8 c, u8 d) { asm(".syntax unified\n\ @@ -2208,7 +2203,7 @@ void sub_81C1E20(u8 taskId) } else { - if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible) PutWindowTilemap(13); PutWindowTilemap(19); } @@ -2259,7 +2254,7 @@ void sub_81C1F80(u8 taskId) } else { - if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + if (!gSprites[gUnknown_0203CF1C->unk40D3[2]].invisible) { PutWindowTilemap(13); } @@ -2341,7 +2336,7 @@ void sub_81C2194(u16 *a, u16 b, u8 c) } } #else -ASM_DIRECT +NAKED void sub_81C2194(u16 *a, u16 b, u8 c) { asm(".syntax unified\n\ @@ -2776,93 +2771,27 @@ void sub_81C2C38(u8 a) schedule_bg_copy_tilemap_to_vram(0); } - - -#ifdef NONMATCHING u8 sub_81C2D2C(struct WindowTemplate *template, u8 a) { - u8 *r4 = gUnknown_0203CF1C->unk40CB; - if (r4[a] == 0xFF) + u8 *windowIdPtr = &(gUnknown_0203CF1C->unk40CB[a]); + if (*windowIdPtr == 0xFF) { - r4[a] = AddWindow(&template[a]); - FillWindowPixelBuffer(r4[a], 0); + *windowIdPtr = AddWindow(&template[a]); + FillWindowPixelBuffer(*windowIdPtr, 0); } - return r4[a]; -} -#else -ASM_DIRECT -u8 sub_81C2D2C(struct WindowTemplate *template, u8 a) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r3, r0, 0\n\ - lsls r1, 24\n\ - lsrs r2, r1, 24\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r4, =0x000040cb\n\ - adds r1, r2, r4\n\ - ldr r0, [r0]\n\ - adds r4, r0, r1\n\ - ldrb r0, [r4]\n\ - cmp r0, 0xFF\n\ - bne _081C2D56\n\ - lsls r0, r2, 3\n\ - adds r0, r3, r0\n\ - bl AddWindow\n\ - strb r0, [r4]\n\ - ldrb r0, [r4]\n\ - movs r1, 0\n\ - bl FillWindowPixelBuffer\n\ -_081C2D56:\n\ - ldrb r0, [r4]\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .pool\n\ - .syntax divided\n"); + return *windowIdPtr; } -#endif -#ifdef NONMATCHING void sub_81C2D68(u8 a) { - u8 *r4 = gUnknown_0203CF1C->unk40CB; - if (r4[a] != 0xFF) + u8 *windowIdPtr = &(gUnknown_0203CF1C->unk40CB[a]); + if (*windowIdPtr != 0xFF) { - ClearWindowTilemap(r4[a]); - RemoveWindow(r4[a]); - r4[a] = 0xFF; + ClearWindowTilemap(*windowIdPtr); + RemoveWindow(*windowIdPtr); + *windowIdPtr = 0xFF; } } -#else -ASM_DIRECT -void sub_81C2D68(u8 a) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - ldr r1, =gUnknown_0203CF1C\n\ - ldr r2, =0x000040cb\n\ - adds r0, r2\n\ - ldr r1, [r1]\n\ - adds r4, r1, r0\n\ - ldrb r0, [r4]\n\ - cmp r0, 0xFF\n\ - beq _081C2D8C\n\ - bl ClearWindowTilemap\n\ - ldrb r0, [r4]\n\ - bl RemoveWindow\n\ - movs r0, 0xFF\n\ - strb r0, [r4]\n\ -_081C2D8C:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided\n"); -} -#endif void sub_81C2D9C(u8 a) { @@ -2974,12 +2903,12 @@ void sub_81C307C() { struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 *text; - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, gUnknown_0861CE74); - UnkTextUtil_SetPtrI(1, gUnknown_0861CE7B); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gUnknown_0861CE74); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gUnknown_0861CE7B); sub_81C31C0(); if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE || sub_81C3304() == TRUE) - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gText_XNature); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gText_XNature); else { u8 *alloced1 = Alloc(32); @@ -2988,7 +2917,7 @@ void sub_81C307C() if (sum->metLocation <= 0xD4) { sub_8124610(alloced2, sum->metLocation); - UnkTextUtil_SetPtrI(4, alloced2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(4, alloced2); } if (sub_81C3220() == 1) { @@ -3003,7 +2932,7 @@ void sub_81C307C() text = (sum->metLocation > 0xD4) ? gText_XNatureObtainedInTrade : gText_XNatureProbablyMetAt; else text = gText_XNatureObtainedInTrade; - UnkTextUtil_StringExpandPlaceholders(gStringVar4, text); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, text); Free(alloced1); Free(alloced2); } @@ -3017,8 +2946,8 @@ void sub_81C3194() void sub_81C31C0() { struct UnkSummaryStruct *sumStruct = gUnknown_0203CF1C; - UnkTextUtil_SetPtrI(2, gNatureNamePointers[sumStruct->summary.nature]); - UnkTextUtil_SetPtrI(5, gText_EmptyString5); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gNatureNamePointers[sumStruct->summary.nature]); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(5, gText_EmptyString5); } void sub_81C31F0(u8 *a) @@ -3027,7 +2956,7 @@ void sub_81C31F0(u8 *a) if (level == 0) level = EGG_HATCH_LEVEL; ConvertIntToDecimalStringN(a, level, 0, 3); - UnkTextUtil_SetPtrI(3, a); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, a); } u8 sub_81C3220() @@ -3092,7 +3021,7 @@ void sub_81C335C() sub_81C25A4(r4, gText_FiveMarks, r5, 1, 0, 1); } #else -ASM_DIRECT +NAKED void sub_81C335C() { asm(".syntax unified\n\ @@ -3239,11 +3168,11 @@ void sub_81C3554(u8 taskId) void sub_81C35E4() { - u8 *text; + const u8 *text; int offset; if (gUnknown_0203CF1C->summary.item == ITEM_ENIGMA_BERRY && sub_81B1250() == 1 && (gUnknown_0203CF1C->unk40BE == 1 || gUnknown_0203CF1C->unk40BE == 4 || gUnknown_0203CF1C->unk40BE == 5)) { - text = (u8*)ItemId_GetItem(ITEM_ENIGMA_BERRY); + text = ItemId_GetName(ITEM_ENIGMA_BERRY); } else if (gUnknown_0203CF1C->summary.item == ITEM_NONE) text = gText_None; @@ -3282,12 +3211,12 @@ void sub_81C3710() ConvertIntToDecimalStringN(alloced2, gUnknown_0203CF1C->summary.maxHP, 1, 3); ConvertIntToDecimalStringN(alloced3, gUnknown_0203CF1C->summary.atk, 1, 7); ConvertIntToDecimalStringN(alloced4, gUnknown_0203CF1C->summary.def, 1, 7); - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, alloced1); - UnkTextUtil_SetPtrI(1, alloced2); - UnkTextUtil_SetPtrI(2, alloced3); - UnkTextUtil_SetPtrI(3, alloced4); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE82); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, alloced1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, alloced2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, alloced3); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(3, alloced4); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE82); Free(alloced1); Free(alloced2); Free(alloced3); @@ -3304,11 +3233,11 @@ void sub_81C3808() ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203CF1C->summary.spatk, 1, 3); ConvertIntToDecimalStringN(gStringVar2, gUnknown_0203CF1C->summary.spdef, 1, 3); ConvertIntToDecimalStringN(gStringVar3, gUnknown_0203CF1C->summary.speed, 1, 3); - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, gStringVar2); - UnkTextUtil_SetPtrI(2, gStringVar3); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE8E); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar2); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(2, gStringVar3); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE8E); } void sub_81C3890() @@ -3417,10 +3346,10 @@ void sub_81C3B08(u8 a) sub_81C25A4(r8, gMoveNames[move], 0, (a<<4) + 1, 0, 1); ConvertIntToDecimalStringN(gStringVar1, r10->summary.pp[a], 1, 2); ConvertIntToDecimalStringN(gStringVar2, r6, 1, 2); - UnkTextUtil_Reset(); - UnkTextUtil_SetPtrI(0, gStringVar1); - UnkTextUtil_SetPtrI(1, gStringVar2); - UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE97); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar2); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE97); text = gStringVar4; r5 = GetCurrentPpToMaxPpState(r10->summary.pp[a], r6) + 9; offset = GetStringRightAlignXOffset(1, text, 0x2C); @@ -3435,7 +3364,7 @@ void sub_81C3B08(u8 a) sub_81C25A4(sp, text, offset, (a<<4), 0, r5); } #else -ASM_DIRECT +NAKED void sub_81C3B08(u8 a) { asm(".syntax unified\n\ @@ -3512,17 +3441,17 @@ void sub_81C3B08(u8 a) movs r2, 0x1\n\ movs r3, 0x2\n\ bl ConvertIntToDecimalStringN\n\ - bl UnkTextUtil_Reset\n\ + bl DynamicPlaceholderTextUtil_Reset\n\ movs r0, 0\n\ mov r1, r8\n\ - bl UnkTextUtil_SetPtrI\n\ + bl DynamicPlaceholderTextUtil_SetPlaceholderPtr\n\ movs r0, 0x1\n\ adds r1, r4, 0\n\ - bl UnkTextUtil_SetPtrI\n\ + bl DynamicPlaceholderTextUtil_SetPlaceholderPtr\n\ ldr r4, =gStringVar4\n\ ldr r1, =gUnknown_0861CE97\n\ adds r0, r4, 0\n\ - bl UnkTextUtil_StringExpandPlaceholders\n\ + bl DynamicPlaceholderTextUtil_ExpandPlaceholders\n\ adds r7, r4, 0\n\ ldrb r0, [r5]\n\ adds r1, r6, 0\n\ @@ -3657,3 +3586,238 @@ void sub_81C3D54(u8 taskId) } data[0]++; } + +void sub_81C3E2C(u8 moveSlot) +{ + u16 move; + + if (moveSlot == 4) + move = gUnknown_0203CF1C->unk40C4; + else + move = gUnknown_0203CF1C->summary.moves[moveSlot]; + + if (move != MOVE_NONE) + { + u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2); + sub_81C25A4(windowId, gContestEffectDescriptionPointers[gContestMoves[move].effect], 6, 1, 0, 0); + } +} + +void sub_81C3E9C(u16 move) +{ + u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2); + FillWindowPixelBuffer(windowId, 0); + if (move != MOVE_NONE) + { + if (gUnknown_0203CF1C->unk40C0 == 2) + { + sub_81C3C5C(move); + sub_81C25A4(windowId, gMoveDescriptionPointers[move - 1], 6, 1, 0, 0); + } + else + { + sub_81C25A4(windowId, gContestEffectDescriptionPointers[gContestMoves[move].effect], 6, 1, 0, 0); + } + PutWindowTilemap(windowId); + } + else + { + ClearWindowTilemap(windowId); + } + + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_81C3F44(void) +{ + u8 windowId1 = sub_81C2D2C(&gUnknown_0861CD14, 0); + u8 windowId2 = sub_81C2D2C(&gUnknown_0861CD14, 1); + if (gUnknown_0203CF1C->unk40C4 == MOVE_NONE) + { + sub_81C25A4(windowId1, gText_Cancel, 0, 0x41, 0, 1); + } + else + { + u16 move = gUnknown_0203CF1C->unk40C4; + if (gUnknown_0203CF1C->unk40C0 == 2) + sub_81C25A4(windowId1, gMoveNames[move], 0, 0x41, 0, 6); + else + sub_81C25A4(windowId1, gMoveNames[move], 0, 0x41, 0, 5); + + ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].pp, 1, 2); + DynamicPlaceholderTextUtil_Reset(); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(0, gStringVar1); + DynamicPlaceholderTextUtil_SetPlaceholderPtr(1, gStringVar1); + DynamicPlaceholderTextUtil_ExpandPlaceholders(gStringVar4, gUnknown_0861CE97); + sub_81C25A4(windowId2, gStringVar4, GetStringRightAlignXOffset(1, gStringVar4, 0x2C), 0x41, 0, 12); + } +} + +void sub_81C4064(void) +{ + u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 0); + FillWindowPixelRect(windowId, 0, 0, 0x42, 0x48, 0x10); + CopyWindowToVram(windowId, 2); +} + +void sub_81C40A0(u8 a, u8 b) +{ + u8 windowId1 = sub_81C2D2C(&gUnknown_0861CD14, 0); + u8 windowId2 = sub_81C2D2C(&gUnknown_0861CD14, 1); + + FillWindowPixelRect(windowId1, 0, 0, a * 16, 0x48, 0x10); + FillWindowPixelRect(windowId1, 0, 0, b * 16, 0x48, 0x10); + + FillWindowPixelRect(windowId2, 0, 0, a * 16, 0x30, 0x10); + FillWindowPixelRect(windowId2, 0, 0, b * 16, 0x30, 0x10); + + sub_81C3B08(a); + sub_81C3B08(b); +} + +void sub_81C4154(void) +{ + u8 windowId = sub_81C2D2C(&gUnknown_0861CD14, 2); + FillWindowPixelBuffer(windowId, 0); + sub_81C25A4(windowId, gText_HMMovesCantBeForgotten2, 6, 1, 0, 0); +} + +void sub_81C4190(void) +{ + u8 i; + + for (i = 0; i < 28; i++) + gUnknown_0203CF1C->unk40D3[i] |= 0xFF; +} + +void sub_81C41C0(u8 spriteArrayId) +{ + if (gUnknown_0203CF1C->unk40D3[spriteArrayId] != 0xFF) + { + DestroySprite(&gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]]); + gUnknown_0203CF1C->unk40D3[spriteArrayId] = 0xFF; + } +} + +void sub_81C4204(u8 spriteArrayId, bool8 invisible) +{ + gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]].invisible = invisible; +} + +void sub_81C424C(void) +{ + u8 i; + + for (i = 3; i < 28; i++) + { + if (gUnknown_0203CF1C->unk40D3[i] != 0xFF) + sub_81C4204(i, TRUE); + } +} + +void sub_81C4280(void) +{ + switch (gUnknown_0203CF1C->unk40C0) + { + case 0: + sub_81C43A0(); + break; + case 2: + sub_81C4420(); + sub_81C44F0(); + break; + case 3: + sub_81C4484(); + sub_81C44F0(); + break; + } +} + +void sub_81C42C8(void) +{ + u8 i; + + for (i = 3; i < 8; i++) + { + if (gUnknown_0203CF1C->unk40D3[i] == 0xFF) + gUnknown_0203CF1C->unk40D3[i] = CreateSprite(&gUnknown_0861CFC4, 0, 0, 2); + + sub_81C4204(i, TRUE); + } +} + +extern const u8 gUnknown_0861CFDC[]; + +void sub_81C4318(u8 typeId, u8 x, u8 y, u8 spriteArrayId) +{ + struct Sprite *sprite = &gSprites[gUnknown_0203CF1C->unk40D3[spriteArrayId]]; + StartSpriteAnim(sprite, typeId); + sprite->oam.paletteNum = gUnknown_0861CFDC[typeId]; + sprite->pos1.x = x + 16; + sprite->pos1.y = y + 8; + sub_81C4204(spriteArrayId, FALSE); +} + +void sub_81C43A0(void) +{ + struct PokeSummary *summary = &gUnknown_0203CF1C->summary; + if (summary->isEgg) + { + sub_81C4318(TYPE_MYSTERY, 0x78, 0x30, 3); + sub_81C4204(4, TRUE); + } + else + { + sub_81C4318(gBaseStats[summary->species].type1, 0x78, 0x30, 3); + if (gBaseStats[summary->species].type1 != gBaseStats[summary->species].type2) + { + sub_81C4318(gBaseStats[summary->species].type2, 0xA0, 0x30, 4); + sub_81C4204(4, FALSE); + } + else + { + sub_81C4204(4, TRUE); + } + } +} + +void sub_81C4420(void) +{ + u8 i; + struct PokeSummary *summary = &gUnknown_0203CF1C->summary; + for (i = 0; i < 4; i++) + { + if (summary->moves[i] != MOVE_NONE) + sub_81C4318(gBattleMoves[summary->moves[i]].type, 0x55, 0x20 + (i * 0x10), i + 3); + else + sub_81C4204(i + 3, TRUE); + } +} + +void sub_81C4484(void) +{ + u8 i; + struct PokeSummary *summary = &gUnknown_0203CF1C->summary; + for (i = 0; i < 4; i++) + { + if (summary->moves[i] != MOVE_NONE) + sub_81C4318(NUMBER_OF_MON_TYPES + gContestMoves[summary->moves[i]].contestCategory, 0x55, 0x20 + (i * 0x10), i + 3); + else + sub_81C4204(i + 3, TRUE); + } +} + +void sub_81C44F0(void) +{ + if (gUnknown_0203CF1C->unk40C4 == MOVE_NONE) + { + sub_81C4204(7, TRUE); + } + else + { + if (gUnknown_0203CF1C->unk40C0 == 2) + sub_81C4318(gBattleMoves[gUnknown_0203CF1C->unk40C4].type, 0x55, 0x60, 7); + else + sub_81C4318(NUMBER_OF_MON_TYPES + gContestMoves[gUnknown_0203CF1C->unk40C4].contestCategory, 0x55, 0x60, 7); + } +} diff --git a/src/random.c b/src/random.c index f2f0ede58..f0b2d9e5f 100644 --- a/src/random.c +++ b/src/random.c @@ -7,6 +7,10 @@ EWRAM_DATA static u8 sUnknown = 0; EWRAM_DATA static u32 sRandCount = 0; +// IWRAM common +IWRAM_DATA u32 gRngValue; +IWRAM_DATA u32 gRng2Value; + u16 Random(void) { gRngValue = 1103515245 * gRngValue + 24691; diff --git a/src/rayquaza_scene.c b/src/rayquaza_scene.c index 25b9ccd53..4783f73c0 100644 --- a/src/rayquaza_scene.c +++ b/src/rayquaza_scene.c @@ -1563,7 +1563,7 @@ static void Task_DuoFightAnim(u8 taskId) } BlendPalettes(-1, 0x10, 0); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); SetVBlankCallback(VBlankCB_DuoFight); PlaySE(SE_T_OOAME); } @@ -1715,7 +1715,7 @@ static void sub_81D752C(u8 taskId) static void DuoFightEnd(u8 taskId, s8 palDelay) { PlaySE(SE_T_OOAME_E); - BeginNormalPaletteFade(-1, palDelay, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, palDelay, 0, 0x10, 0); gTasks[taskId].func = Task_DuoFightEnd; } @@ -1971,7 +1971,7 @@ static void Task_HandleRayTakesFlight(u8 taskId) case 0: if (data[1] == 8) { - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); data[2] = 0; data[3] = 30; data[4] = 0; @@ -2012,7 +2012,7 @@ static void Task_HandleRayTakesFlight(u8 taskId) if (data[1] > 295) { data[0]++; - BeginNormalPaletteFade(-1, 6, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 0x10, 0); } } break; @@ -2174,7 +2174,7 @@ static void Task_HandleRayDescends(u8 taskId) case 0: if (data[1] == 8) { - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); data[1] = 0; data[0]++; } @@ -2219,7 +2219,7 @@ static void Task_HandleRayDescends(u8 taskId) } break; case 4: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskId].func = Task_RayDescendsEnd; break; } @@ -2366,7 +2366,7 @@ static void Task_HandleRayCharges(u8 taskId) case 0: if (data[1] == 8) { - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); data[1] = 0; data[0]++; } @@ -2399,7 +2399,7 @@ static void Task_HandleRayCharges(u8 taskId) } break; case 3: - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); gTasks[taskId].func = Task_RayChargesEnd; break; } @@ -2532,7 +2532,7 @@ static void Task_HandleRayChasesAway(u8 taskId) if (data[1] == 8) { sub_81D90A8(taskId); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); data[1] = 0; data[0]++; } @@ -2574,7 +2574,7 @@ static void Task_HandleRayChasesAway(u8 taskId) } break; case 3: - BeginNormalPaletteFade(-1, 4, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 4, 0, 0x10, 0); gTasks[taskId].func = Task_RayChasesAwayEnd; break; } diff --git a/src/record_mixing.c b/src/record_mixing.c index 151835e5e..8b21e214f 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -1,28 +1,2282 @@ - -// Includes #include "global.h" +#include "malloc.h" +#include "random.h" +#include "constants/items.h" +#include "text.h" +#include "item.h" +#include "task.h" +#include "constants/species.h" +#include "save.h" +#include "load_save.h" +#include "pokemon.h" +#include "cable_club.h" +#include "link.h" +#include "link_rfu.h" +#include "tv.h" +#include "battle_tower.h" +#include "window.h" +#include "mystery_event_script.h" +#include "secret_base.h" +#include "mauville_old_man.h" +#include "sound.h" +#include "constants/songs.h" +#include "menu.h" +#include "overworld.h" +#include "field_screen.h" +#include "fldeff_80F9BCC.h" +#include "script.h" +#include "event_data.h" +#include "lilycove_lady.h" +#include "strings.h" +#include "string_util.h" +#include "record_mixing.h" +#include "new_game.h" +#include "daycare.h" +#include "international_string_util.h" + +extern void ReceiveSecretBasesData(struct SecretBaseRecord *, size_t, u8); +extern void ReceiveEasyChatPairsData(struct EasyChatPair *, size_t, u8); // Static type declarations +struct UnknownRecMixingStruct +{ + u32 field_0; + u16 field_4; + u8 field_6[9]; +}; + +struct UnknownRecMixingStruct2 +{ + u32 field_0; + u16 field_4; + u16 field_6; + u16 field_8; + u8 field_A[16]; +}; + +struct UnknownRecMixingStruct3 +{ + u8 field_0[0x810]; +}; + +struct PlayerRecordsRS +{ + struct SecretBaseRecord secretBases[SECRET_BASES_COUNT]; + TVShow tvShows[TV_SHOWS_COUNT]; + PokeNews pokeNews[POKE_NEWS_COUNT]; + OldMan oldMan; + struct EasyChatPair easyChatPairs[5]; + struct RecordMixingDayCareMail dayCareMail; + struct RSBattleTowerRecord battleTowerRecord; + u16 filler11C8[0x32]; +}; + +struct PlayerRecordsEmerald +{ + /* 0x0000 */ struct SecretBaseRecord secretBases[SECRET_BASES_COUNT]; + /* 0x0c80 */ TVShow tvShows[TV_SHOWS_COUNT]; + /* 0x1004 */ PokeNews pokeNews[POKE_NEWS_COUNT]; + /* 0x1044 */ OldMan oldMan; + /* 0x1084 */ struct EasyChatPair easyChatPairs[5]; + /* 0x10ac */ struct RecordMixingDayCareMail dayCareMail; + /* 0x1124 */ struct EmeraldBattleTowerRecord battleTowerRecord; + /* 0x1210 */ u16 unk_1210; + /* 0x1214 */ LilycoveLady lilycoveLady; + /* 0x1254 */ struct UnkRecordMixingStruct unk_1254[2]; + /* 0x12dc */ struct UnkRecordMixingStruct2 unk_12dc; + /* 0x1434 */ u8 field_1434[0x10]; +}; // 0x1444 + +union PlayerRecords +{ + struct PlayerRecordsRS ruby; + struct PlayerRecordsEmerald emerald; +}; + // Static RAM declarations -IWRAM_DATA bool8 gUnknown_03001130; -IWRAM_DATA struct SecretBaseRecord *gUnknown_03001134; -IWRAM_DATA TVShow *gUnknown_03001138; -IWRAM_DATA struct UnknownSaveStruct2ABC *gUnknown_0300113C; -IWRAM_DATA OldMan *gUnknown_03001140; -IWRAM_DATA struct EasyChatPair *gUnknown_03001144; -IWRAM_DATA struct DaycareData *gUnknown_03001148; -IWRAM_DATA void *gUnknown_0300114C; // gSaveBlock2Ptr->field_64C -IWRAM_DATA LilycoveLady *gUnknown_03001150; -IWRAM_DATA void *gUnknown_03001154; // gSaveBlock2Ptr->field_0DC; -IWRAM_DATA void *gUnknown_03001158; // gSaveBlock2Ptr->field_64C -IWRAM_DATA u32 gUnknown_0300115C; -IWRAM_DATA u8 gUnknown_03001160[8]; -IWRAM_DATA u32 gUnknown_03001168[3]; +static IWRAM_DATA bool8 gUnknown_03001130; +static IWRAM_DATA struct SecretBaseRecord *sSecretBasesSave; +static IWRAM_DATA TVShow *sTvShowsSave; +static IWRAM_DATA PokeNews *sPokeNewsSave; +static IWRAM_DATA OldMan *sOldManSave; +static IWRAM_DATA struct EasyChatPair *sEasyChatPairsSave; +static IWRAM_DATA struct RecordMixingDayCareMail *gUnknown_03001148; +static IWRAM_DATA void *sBattleTowerSave; +static IWRAM_DATA LilycoveLady *sLilycoveLadySave; +static IWRAM_DATA void *gUnknown_03001154; // gSaveBlock2Ptr->field_0DC; +static IWRAM_DATA void *sBattleTowerSave_Duplicate; +static IWRAM_DATA u32 sRecordStructSize; +static IWRAM_DATA u8 gUnknown_03001160; +static IWRAM_DATA u32 filler_03001164; +static IWRAM_DATA u32 gUnknown_03001168[3]; + +static EWRAM_DATA struct RecordMixingDayCareMail gUnknown_02039F9C = {0}; +static EWRAM_DATA union PlayerRecords *sReceivedRecords = NULL; +static EWRAM_DATA union PlayerRecords *sSentRecord = NULL; // Static ROM declarations +static void Task_RecordMixing_Main(u8 taskId); +static void sub_80E7324(u8 taskId); +static void Task_SendPacket(u8 taskId); +static void Task_CopyReceiveBuffer(u8 taskId); +static void Task_SendPacket_SwitchToReceive(u8 taskId); +static void *LoadPtrFromTaskData(const u16 *asShort); +static void StorePtrInTaskData(void *records, u16 *a1); +static u8 GetMultiplayerId_(void); +static void *GetPlayerRecvBuffer(u8); +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 sub_80E7F68(u16 *item, u8 which); +static void sub_80E7FF8(u8 taskId); +static void sub_80E8110(struct UnkRecordMixingStruct *arg0, struct UnkRecordMixingStruct *arg1); +static void sub_80E8468(struct UnkRecordMixingStruct *arg0, size_t arg1, u32 arg2); +static void sub_80E89AC(struct UnkRecordMixingStruct2 *arg0, size_t arg1, u32 arg2); +static void sub_80E89F8(struct RecordMixingDayCareMail *dst); +static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src); +static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *arg0); +static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src); + // .rodata +static const u8 gUnknown_0858CF8C[] = {1, 0}; + +static const u8 gUnknown_0858CF8E[][3] = +{ + {1, 2, 0}, + {2, 0, 1}, +}; + +static const u8 gUnknown_0858CF94[][4] = +{ + {1, 0, 3, 2}, + {3, 0, 1, 2}, + {2, 0, 3, 1}, + {1, 3, 0, 2}, + {2, 3, 0, 1}, + {3, 2, 0, 1}, + {1, 2, 3, 0}, + {2, 3, 1, 0}, + {3, 2, 1, 0}, +}; + +static const u8 gUnknown_0858CFB8[3][2] = +{ + {0, 1}, + {1, 2}, + {2, 0}, +}; + +static const u8 gUnknown_0858CFBE[3][4] = +{ + {0, 1, 2, 3}, + {0, 2, 1, 3}, + {0, 3, 2, 1}, +}; + // .text + +#define BUFFER_CHUNK_SIZE 200 + +void sub_80E6BE8(void) +{ + sub_80B37D4(Task_RecordMixing_Main); +} + +// these variables were const in R/S, but had to become changeable because of saveblocks changing RAM position +static void SetSrcLookupPointers(void) +{ + sSecretBasesSave = gSaveBlock1Ptr->secretBases; + sTvShowsSave = gSaveBlock1Ptr->tvShows; + sPokeNewsSave = gSaveBlock1Ptr->pokeNews; + sOldManSave = &gSaveBlock1Ptr->oldMan; + sEasyChatPairsSave = gSaveBlock1Ptr->easyChatPairs; + gUnknown_03001148 = &gUnknown_02039F9C; + sBattleTowerSave = &gSaveBlock2Ptr->frontier.battleTower; + sLilycoveLadySave = &gSaveBlock1Ptr->lilycoveLady; + gUnknown_03001154 = gSaveBlock2Ptr->field_DC; + sBattleTowerSave_Duplicate = &gSaveBlock2Ptr->frontier.battleTower; +} + +static void PrepareUnknownExchangePacket(struct PlayerRecordsRS *dest) +{ + memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases)); + memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows)); + sub_80F14F8(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); + sub_81659DC(sBattleTowerSave, &dest->battleTowerRecord); + + if (GetMultiplayerId() == 0) + dest->battleTowerRecord.unk_11c8 = GetRecordMixingGift(); +} + +static void PrepareExchangePacketForRubySapphire(struct PlayerRecordsRS *dest) +{ + memcpy(dest->secretBases, sSecretBasesSave, sizeof(dest->secretBases)); + sub_80EB18C(dest->secretBases); + memcpy(dest->tvShows, sTvShowsSave, sizeof(dest->tvShows)); + sub_80F1208(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); + sub_81659DC(sBattleTowerSave, &dest->battleTowerRecord); + SanitizeRubyBattleTowerRecord(&dest->battleTowerRecord); + + if (GetMultiplayerId() == 0) + dest->battleTowerRecord.unk_11c8 = GetRecordMixingGift(); +} + +static void PrepareExchangePacket(void) +{ + sub_80E9914(); + sub_80F0BB8(); + SetSrcLookupPointers(); + + if (Link_AnyPartnersPlayingRubyOrSapphire()) + { + if (sub_800A03C() == 0) + PrepareUnknownExchangePacket(&sSentRecord->ruby); + else + PrepareExchangePacketForRubySapphire(&sSentRecord->ruby); + } + else + { + memcpy(sSentRecord->emerald.secretBases, sSecretBasesSave, sizeof(sSentRecord->emerald.secretBases)); + memcpy(sSentRecord->emerald.tvShows, sTvShowsSave, sizeof(sSentRecord->emerald.tvShows)); + 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.battleTowerRecord, sBattleTowerSave, sizeof(sSentRecord->emerald.battleTowerRecord)); + SanitizeEmeraldBattleTowerRecord(&sSentRecord->emerald.battleTowerRecord); + + if (GetMultiplayerId() == 0) + sSentRecord->emerald.unk_1210 = GetRecordMixingGift(); + + sub_80E8110(sSentRecord->emerald.unk_1254, gUnknown_03001154); + sub_80E8260(&sSentRecord->emerald.unk_12dc); + } +} + +static void ReceiveExchangePacket(u32 which) +{ + if (Link_AnyPartnersPlayingRubyOrSapphire()) + { + // 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); + 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); + sub_80E7F68(&sReceivedRecords->ruby.battleTowerRecord.unk_11c8, which); + } + else + { + // Emerald + sub_80E7B2C((void *)sReceivedRecords->emerald.tvShows); + ReceiveSecretBasesData(sReceivedRecords->emerald.secretBases, sizeof(struct PlayerRecordsEmerald), 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); + ReceiveBattleTowerData(&sReceivedRecords->emerald.battleTowerRecord, sizeof(struct PlayerRecordsEmerald), which); + sub_80E7F68(&sReceivedRecords->emerald.unk_1210, which); + ReceiveLilycoveLadyData(&sReceivedRecords->emerald.lilycoveLady, sizeof(struct PlayerRecordsEmerald), which); + sub_80E8468(sReceivedRecords->emerald.unk_1254, sizeof(struct PlayerRecordsEmerald), (u8) which); + sub_80E89AC(&sReceivedRecords->emerald.unk_12dc, sizeof(struct PlayerRecordsEmerald), (u8) which); + } +} + +static void PrintTextOnRecordMixing(const u8 *src) +{ + NewMenuHelpers_DrawDialogueFrame(0, 0); + PrintTextOnWindow(0, 1, src, 0, 1, 0, NULL); + CopyWindowToVram(0, 3); +} + +#define tCounter data[0] + +static void Task_RecordMixing_SoundEffect(u8 taskId) +{ + if (++gTasks[taskId].tCounter == 50) + { + PlaySE(SE_W213); + gTasks[taskId].tCounter = 0; + } +} + +#undef tCounter + +#define tState data[0] +#define tSndEffTaskId data[15] + +static void Task_RecordMixing_Main(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (tState) + { + case 0: // init + sSentRecord = malloc(sizeof(union PlayerRecords)); + sReceivedRecords = malloc(sizeof(union PlayerRecords) * 4); + sub_8009628(gSpecialVar_0x8005); + VarSet(VAR_TEMP_0, 1); + gUnknown_03001130 = FALSE; + PrepareExchangePacket(); + CreateRecordMixingSprite(); + tState = 1; + data[10] = CreateTask(sub_80E7324, 80); + tSndEffTaskId = CreateTask(Task_RecordMixing_SoundEffect, 81); + break; + case 1: // wait for sub_80E7324 + if (!gTasks[data[10]].isActive) + { + tState = 2; + FlagSet(FLAG_SYS_MIX_RECORD); + DestroyRecordMixingSprite(); + DestroyTask(tSndEffTaskId); + } + break; + case 2: + data[10] = CreateTask(sub_80E7FF8, 10); + tState = 3; + PlaySE(SE_W226); + break; + case 3: // wait for sub_80E7FF8 + if (!gTasks[data[10]].isActive) + { + tState = 4; + if (gWirelessCommType == 0) + data[10] = sub_80B3050(); + + PrintTextOnRecordMixing(gText_RecordMixingComplete); + data[8] = 0; + } + break; + case 4: // wait 60 frames + if (++data[8] > 60) + tState = 5; + break; + case 5: + if (!gTasks[data[10]].isActive) + { + free(sReceivedRecords); + free(sSentRecord); + sub_808729C(); + if (gWirelessCommType != 0) + { + CreateTask(sub_80AF2B4, 10); + } + sub_8197434(0, 1); + DestroyTask(taskId); + EnableBothScriptContexts(); + } + break; + } +} + +#undef tState +#undef tSndEffTaskId + +static void sub_80E7324(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + PrintTextOnRecordMixing(gText_MixingRecords); + task->data[8] = 0x708; + task->data[0] = 400; + ClearLinkCallback_2(); + break; + case 100: // wait 20 frames + if (++task->data[12] > 20) + { + task->data[12] = 0; + task->data[0] = 101; + } + break; + case 101: + { + u8 players = GetLinkPlayerCount_2(); + if (IsLinkMaster() == TRUE) + { + if (players == sub_800AA48()) + { + PlaySE(SE_PIN); + task->data[0] = 201; + task->data[12] = 0; + } + } + else + { + PlaySE(SE_BOO); + task->data[0] = 301; + } + } + break; + case 201: + if (sub_800AA48() == GetLinkPlayerCount_2() && ++task->data[12] > (GetLinkPlayerCount_2() * 30)) + { + sub_800A620(); + task->data[0] = 1; + } + break; + case 301: + if (sub_800AA48() == GetLinkPlayerCount_2()) + task->data[0] = 1; + break; + case 400: // wait 20 frames + if (++task->data[12] > 20) + { + task->data[0] = 1; + task->data[12] = 0; + } + break; + case 1: // wait for handshake + if (gReceivedRemoteLinkPlayers != 0) + { + ConvertIntToDecimalStringN(gStringVar1, GetMultiplayerId_(), STR_CONV_MODE_LEADING_ZEROS, 2); + task->data[0] = 5; + } + break; + case 2: + { + u8 subTaskId; + + task->data[6] = GetLinkPlayerCount_2(); + task->data[0] = 0; + task->data[5] = GetMultiplayerId_(); + task->func = Task_SendPacket; + if (Link_AnyPartnersPlayingRubyOrSapphire()) + { + StorePtrInTaskData(sSentRecord, (u16 *)&task->data[2]); + subTaskId = CreateTask(Task_CopyReceiveBuffer, 80); + task->data[10] = subTaskId; + gTasks[subTaskId].data[0] = taskId; + StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]); + sRecordStructSize = sizeof(struct PlayerRecordsRS); + } + else + { + StorePtrInTaskData(sSentRecord, (u16 *)&task->data[2]); + subTaskId = CreateTask(Task_CopyReceiveBuffer, 80); + task->data[10] = subTaskId; + gTasks[subTaskId].data[0] = taskId; + StorePtrInTaskData(sReceivedRecords, (u16 *)&gTasks[subTaskId].data[5]); + sRecordStructSize = sizeof(struct PlayerRecordsEmerald); + } + } + break; + case 5: // wait 60 frames + if (++task->data[10] > 60) + { + task->data[10] = 0; + task->data[0] = 2; + } + break; + } +} + +static void Task_SendPacket(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + // does this send the data 24 times? + + switch (task->data[0]) + { + case 0: // Copy record data to send buffer + { + void *recordData = LoadPtrFromTaskData(&task->data[2]) + task->data[4] * BUFFER_CHUNK_SIZE; + + memcpy(gBlockSendBuffer, recordData, BUFFER_CHUNK_SIZE); + task->data[0]++; + } + break; + case 1: + if (GetMultiplayerId() == 0) + sub_800A4D8(1); + task->data[0]++; + break; + case 2: + break; + case 3: + task->data[4]++; + if (task->data[4] == sRecordStructSize / 200 + 1) + task->data[0]++; + else + task->data[0] = 0; + break; + case 4: + if (!gTasks[task->data[10]].isActive) + task->func = Task_SendPacket_SwitchToReceive; + break; + } +} + +static void Task_CopyReceiveBuffer(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 status = GetBlockReceivedStatus(); + u8 handledPlayers = 0; + + if (status == sub_800A9D8()) + { + u8 i; + + for (i = 0; i < GetLinkPlayerCount(); i++) + { + void *dest; + void *src; + + if ((status >> i) & 1) + { + dest = LoadPtrFromTaskData((u16 *)&task->data[5]) + task->data[i + 1] * BUFFER_CHUNK_SIZE + sRecordStructSize * i; + src = GetPlayerRecvBuffer(i); + if ((task->data[i + 1] + 1) * BUFFER_CHUNK_SIZE > sRecordStructSize) + memcpy(dest, src, sRecordStructSize - task->data[i + 1] * BUFFER_CHUNK_SIZE); + else + memcpy(dest, src, BUFFER_CHUNK_SIZE); + ResetBlockReceivedFlag(i); + task->data[i + 1]++; + if (task->data[i + 1] == sRecordStructSize / BUFFER_CHUNK_SIZE + 1) + handledPlayers++; + } + } + gTasks[task->data[0]].data[0]++; + } + + if (handledPlayers == GetLinkPlayerCount()) + DestroyTask(taskId); +} + +static void sub_80E776C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!gTasks[task->data[10]].isActive) + DestroyTask(taskId); +} + +static void Task_ReceivePacket(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->func = sub_80E776C; + if (gUnknown_03001130 == TRUE) + ReceiveExchangePacket(task->data[5]); +} + +static void Task_SendPacket_SwitchToReceive(u8 taskId) +{ + gTasks[taskId].func = Task_ReceivePacket; + gUnknown_03001130 = TRUE; +} + +static void *LoadPtrFromTaskData(const u16 *asShort) +{ + return (void *)(asShort[0] | (asShort[1] << 16)); +} + +static void StorePtrInTaskData(void *records, u16 *asShort) +{ + asShort[0] = (u32)records; + asShort[1] = ((u32)records >> 16); +} + +static u8 GetMultiplayerId_(void) +{ + return GetMultiplayerId(); +} + +static void *GetPlayerRecvBuffer(u8 id) +{ + return gBlockRecvBuffer[id]; +} + +static void ShufflePlayerIndices(u32 *data) +{ + u32 i; + u32 linkTrainerId; + u32 players = GetLinkPlayerCount(); + + switch (players) + { + case 2: + for (i = 0; i < 2; i++) + data[i] = gUnknown_0858CF8C[i]; + break; + case 3: + linkTrainerId = GetLinkPlayerTrainerId(0) % 2; + for (i = 0; i < 3; i++) + data[i] = gUnknown_0858CF8E[linkTrainerId][i]; + break; + case 4: + linkTrainerId = GetLinkPlayerTrainerId(0) % 9; + for (i = 0; i < 4; i++) + data[i] = gUnknown_0858CF94[linkTrainerId][i]; + break; + } +} + +static void ReceiveOldManData(OldMan *oldMan, size_t recordSize, u8 which) +{ + u8 version; + u16 language; + OldMan *dest; + u32 mixIndices[4]; + + ShufflePlayerIndices(mixIndices); + dest = (void *)oldMan + recordSize * mixIndices[which]; + version = gLinkPlayers[mixIndices[which]].version; + language = gLinkPlayers[mixIndices[which]].language; + + if (Link_AnyPartnersPlayingRubyOrSapphire()) + SanitizeReceivedRubyOldMan(dest, version, language); + else + SanitizeReceivedEmeraldOldMan(dest, version, language); + + memcpy(sOldManSave, (void *)oldMan + recordSize * mixIndices[which], sizeof(OldMan)); + ResetMauvilleOldManFlag(); +} + +static void ReceiveBattleTowerData(void *battleTowerRecord, size_t recordSize, u8 which) +{ + struct EmeraldBattleTowerRecord *dest; + struct UnknownPokemonStruct *btPokemon; + u32 mixIndices[4]; + s32 i; + + ShufflePlayerIndices(mixIndices); + if (Link_AnyPartnersPlayingRubyOrSapphire()) + { + if (sub_816587C((void *)battleTowerRecord + recordSize * mixIndices[which], (void *)battleTowerRecord + recordSize * which) == TRUE) + { + dest = (void *)battleTowerRecord + recordSize * which; + dest->language = gLinkPlayers[mixIndices[which]].language; + CalcEmeraldBattleTowerChecksum(dest); + } + } + else + { + memcpy((void *)battleTowerRecord + recordSize * which, (void *)battleTowerRecord + recordSize * mixIndices[which], sizeof(union BattleTowerRecord)); + dest = (void *)battleTowerRecord + recordSize * which; + for (i = 0; i < 4; i ++) + { + btPokemon = &dest->party[i]; + if (btPokemon->species != SPECIES_NONE && IsStringJapanese(btPokemon->nickname)) + ConvertInternationalString(btPokemon->nickname, LANGUAGE_JAPANESE); + } + CalcEmeraldBattleTowerChecksum(dest); + } + sub_81628A0((void *)battleTowerRecord + recordSize * which); +} + +static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSize, u8 which) +{ + LilycoveLady *dest; + u32 mixIndices[4]; + + ShufflePlayerIndices(mixIndices); + memcpy((void *)lilycoveLady + recordSize * which, sLilycoveLadySave, sizeof(LilycoveLady)); + + if (GetLilycoveLadyId() == 0) + { + dest = malloc(sizeof(LilycoveLady)); + if (dest == NULL) + return; + + memcpy(dest, sLilycoveLadySave, sizeof(LilycoveLady)); + } + else + { + dest = NULL; + } + + memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady)); + sub_818DA78(); + if (dest != NULL) + { + sub_818E570(dest); + free(dest); + } +} + +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) +{ + 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)); + 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)); +} + +static void sub_80E7B2C(const u8 *src) +{ + u8 sum; + s32 i; + + sum = 0; + for (i = 0; i < 256; i ++) + sum += src[i]; + + gUnknown_03001160 = sum; +} + +static u8 sub_80E7B54(void) +{ + return gUnknown_03001160; +} + +#ifdef NONMATCHING +static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows) +{ + // r9 = which + u16 i; + u16 j; + u8 linkPlayerCount; + u16 language; + u16 otNameLanguage; + u16 nicknameLanguage; + u32 version; + u8 dcMail1; + u8 dcMail2; + u8 r1_80e7b54; + struct DayCareMail *recordMixingMail; + struct RecordMixingDayCareMail *_src; + u8 sp04[4]; + u8 sp08[4]; + struct RecordMixingDayCareMail *sp0c[4]; // -> sp+48 + u8 sp1c[4][2]; // [][0] -> sp+4c, [][1] -> sp+50 + u8 sp24[4][2]; + // sp+2c = src + // sp+30 = recordSize + u8 sp34; + u16 oldSeed; + bool32 anyRS; // sp+3c + + oldSeed = Random2(); + SeedRng2(gLinkPlayers[0].trainerId); + linkPlayerCount = GetLinkPlayerCount(); + for (i = 0; i < 4; i ++) + { + sp04[i] = 0xFF; + sp08[i] = 0; + sp1c[i][0] = 0; + sp1c[i][1] = 0; + } + anyRS = Link_AnyPartnersPlayingRubyOrSapphire(); + for (i = 0; i < GetLinkPlayerCount(); i ++) // r8 = i + { + // sp+54 = linkPlayerCount << 16 + // sp+44 = which * recordSize + _src = (void *)src + i * recordSize; // r7 + language = gLinkPlayers[i].language; // r9 + version = (u8)gLinkPlayers[i].version; // sp+40 + for (j = 0; j < _src->unk_70; j ++) + { + // r10 = ~0x10 + recordMixingMail = &_src->unk_00[j]; + if (recordMixingMail->mail.itemId != ITEM_NONE) + { + if (anyRS) + { + if (StringLength(recordMixingMail->OT_name) <= 5) + { + otNameLanguage = LANGUAGE_JAPANESE; + } + else + { + StripExtCtrlCodes(recordMixingMail->OT_name); + otNameLanguage = language; + } + if (recordMixingMail->monName[0] == EXT_CTRL_CODE_BEGIN && recordMixingMail->monName[1] == EXT_CTRL_CODE_JPN) + { + StripExtCtrlCodes(recordMixingMail->monName); + nicknameLanguage = LANGUAGE_JAPANESE; + } + else + { + nicknameLanguage = language; + } + if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) + { + recordMixingMail->language_maybe = otNameLanguage; + recordMixingMail->unknown = nicknameLanguage; + } + } + else if (language == LANGUAGE_JAPANESE) + { + if (IsStringJapanese(recordMixingMail->OT_name)) + { + recordMixingMail->language_maybe = LANGUAGE_JAPANESE; + } + else + { + recordMixingMail->language_maybe = GAME_LANGUAGE; + } + if (IsStringJapanese(recordMixingMail->monName)) + { + recordMixingMail->unknown = LANGUAGE_JAPANESE; + } + else + { + recordMixingMail->unknown = GAME_LANGUAGE; + } + } + } + } + } + sp34 = 0; + for (i = 0; i < linkPlayerCount; i ++) + { + _src = (void *)src + i * recordSize; // r7 + if (_src->unk_70 != 0) + { + for (j = 0; j < _src->unk_70; j ++) + { + if (_src->unk_74[j] == 0) + { + sp1c[i][j] = 1; + } + } + } + } + i = 0; + for (j = 0; j < linkPlayerCount; j ++) + { + _src = (void *)src + j * recordSize; + if (sp1c[j][0] == TRUE || sp1c[j][1] == TRUE) + { + sp34 ++; + } + if (sp1c[j][0] == TRUE && sp1c[j][1] == FALSE) + { + sp24[i][0] = j; + sp24[i][1] = 0; + i ++; + } + else if (sp1c[j][0] == FALSE && sp1c[j][1] == TRUE) + { + sp24[i][0] = j; + sp24[i][1] = 0; + i ++; + } + else if (sp1c[j][0] == TRUE && sp1c[j][1] == TRUE) + { + sp24[i][0] = j; + dcMail1 = sub_80E7A9C(&_src->unk_00[0]); + dcMail2 = sub_80E7A9C(&_src->unk_00[1]); + if (!dcMail1 && dcMail2) + { + sp24[i][1] = 1; + } + else if ((dcMail1 && dcMail2) || (!dcMail1 && !dcMail2)) + { + sp24[i][1] = Random2() % 2; + } + else + { + sp24[i][1] = 0; + } + i ++; + } + } + for (i = 0; i < 4; i ++) + { + _src = &src[which * recordSize]; + sp0c[i] = _src; + } + r1_80e7b54 = sub_80E7B54() % 3; + switch (sp34) + { + case 2: + sub_80E7AA4(src, recordSize, sp24, 0, 1); + break; + case 3: + sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFB8[r1_80e7b54][0], gUnknown_0858CFB8[r1_80e7b54][1]); + break; + case 4: + sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][0], gUnknown_0858CFBE[r1_80e7b54][1]); + sub_80E7AA4(src, recordSize, sp24, gUnknown_0858CFBE[r1_80e7b54][2], gUnknown_0858CFBE[r1_80e7b54][3]); + break; + } + _src = (void *)src + which * recordSize; + memcpy(&gSaveBlock1Ptr->daycare.mons[0].misc.mail, &_src->unk_00[0], sizeof(struct DayCareMail)); + memcpy(&gSaveBlock1Ptr->daycare.mons[1].misc.mail, &_src->unk_00[1], sizeof(struct DayCareMail)); + SeedRng(oldSeed); +} +#else +NAKED +static void ReceiveDaycareMailData(struct RecordMixingDayCareMail *src, size_t recordSize, u8 which, TVShow *shows) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x58\n" + "\tstr r0, [sp, 0x2C]\n" + "\tstr r1, [sp, 0x30]\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tmov r9, r2\n" + "\tbl Random2\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp, 0x38]\n" + "\tldr r0, =gLinkPlayers\n" + "\tldrh r0, [r0, 0x4]\n" + "\tbl SeedRng2\n" + "\tbl GetLinkPlayerCount\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmovs r0, 0\n" + "\tmov r8, r0\n" + "\tmov r1, sp\n" + "\tadds r1, 0x1C\n" + "\tstr r1, [sp, 0x4C]\n" + "\tmov r2, sp\n" + "\tadds r2, 0x1D\n" + "\tstr r2, [sp, 0x50]\n" + "\tmov r3, sp\n" + "\tadds r3, 0xC\n" + "\tstr r3, [sp, 0x48]\n" + "\tmovs r7, 0xFF\n" + "\tadd r3, sp, 0x8\n" + "\tmovs r2, 0\n" + "\tadds r6, r1, 0\n" + "\tldr r5, [sp, 0x50]\n" + "_080E7BB0:\n" + "\tmov r1, sp\n" + "\tadd r1, r8\n" + "\tadds r1, 0x4\n" + "\tldrb r0, [r1]\n" + "\torrs r0, r7\n" + "\tstrb r0, [r1]\n" + "\tmov r1, r8\n" + "\tadds r0, r3, r1\n" + "\tstrb r2, [r0]\n" + "\tlsls r1, 1\n" + "\tadds r0, r6, r1\n" + "\tstrb r2, [r0]\n" + "\tadds r1, r5, r1\n" + "\tstrb r2, [r1]\n" + "\tmov r0, r8\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r8, r0\n" + "\tcmp r0, 0x3\n" + "\tbls _080E7BB0\n" + "\tbl Link_AnyPartnersPlayingRubyOrSapphire\n" + "\tstr r0, [sp, 0x3C]\n" + "\tmovs r2, 0\n" + "\tmov r8, r2\n" + "\tlsls r4, 16\n" + "\tstr r4, [sp, 0x54]\n" + "\tldr r0, [sp, 0x30]\n" + "\tmov r3, r9\n" + "\tmuls r3, r0\n" + "\tstr r3, [sp, 0x44]\n" + "\tb _080E7D04\n" + "\t.pool\n" + "_080E7BF8:\n" + "\tldr r1, [sp, 0x30]\n" + "\tmov r0, r8\n" + "\tmuls r0, r1\n" + "\tldr r2, [sp, 0x2C]\n" + "\tadds r7, r2, r0\n" + "\tldr r1, =gLinkPlayers\n" + "\tmov r3, r8\n" + "\tlsls r0, r3, 3\n" + "\tsubs r0, r3\n" + "\tlsls r0, 2\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0, 0x1A]\n" + "\tmov r9, r1\n" + "\tldrb r0, [r0]\n" + "\tstr r0, [sp, 0x40]\n" + "\tmovs r6, 0\n" + "\tldr r0, [r7, 0x70]\n" + "\tcmp r6, r0\n" + "\tbcs _080E7CFA\n" + "\tmovs r2, 0x10\n" + "\tnegs r2, r2\n" + "\tmov r10, r2\n" + "_080E7C24:\n" + "\tlsls r0, r6, 3\n" + "\tsubs r0, r6\n" + "\tlsls r0, 3\n" + "\tadds r5, r7, r0\n" + "\tldrh r0, [r5, 0x20]\n" + "\tcmp r0, 0\n" + "\tbeq _080E7CEE\n" + "\tldr r3, [sp, 0x3C]\n" + "\tcmp r3, 0\n" + "\tbeq _080E7C9A\n" + "\tadds r4, r5, 0\n" + "\tadds r4, 0x24\n" + "\tadds r0, r4, 0\n" + "\tbl StringLength\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x5\n" + "\tbhi _080E7C54\n" + "\tmovs r4, 0x1\n" + "\tb _080E7C5C\n" + "\t.pool\n" + "_080E7C54:\n" + "\tadds r0, r4, 0\n" + "\tbl StripExtCtrlCodes\n" + "\tmov r4, r9\n" + "_080E7C5C:\n" + "\tldrh r1, [r5, 0x2C]\n" + "\tldr r0, =0x000015fc\n" + "\tcmp r1, r0\n" + "\tbne _080E7C74\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x2C\n" + "\tbl StripExtCtrlCodes\n" + "\tmovs r1, 0x1\n" + "\tb _080E7C76\n" + "\t.pool\n" + "_080E7C74:\n" + "\tmov r1, r9\n" + "_080E7C76:\n" + "\tldr r0, [sp, 0x40]\n" + "\tsubs r0, 0x1\n" + "\tcmp r0, 0x1\n" + "\tbhi _080E7CEE\n" + "\tadds r2, r5, 0\n" + "\tadds r2, 0x37\n" + "\tmovs r0, 0xF\n" + "\tands r4, r0\n" + "\tldrb r0, [r2]\n" + "\tmov r3, r10\n" + "\tands r0, r3\n" + "\torrs r0, r4\n" + "\tlsls r1, 4\n" + "\tmovs r3, 0xF\n" + "\tands r0, r3\n" + "\torrs r0, r1\n" + "\tstrb r0, [r2]\n" + "\tb _080E7CEE\n" + "_080E7C9A:\n" + "\tmov r0, r9\n" + "\tcmp r0, 0x1\n" + "\tbne _080E7CEE\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x24\n" + "\tbl IsStringJapanese\n" + "\tcmp r0, 0\n" + "\tbeq _080E7CBA\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x37\n" + "\tldrb r1, [r0]\n" + "\tmov r2, r10\n" + "\tands r1, r2\n" + "\tmovs r2, 0x1\n" + "\tb _080E7CC6\n" + "_080E7CBA:\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x37\n" + "\tldrb r1, [r0]\n" + "\tmov r3, r10\n" + "\tands r1, r3\n" + "\tmovs r2, 0x2\n" + "_080E7CC6:\n" + "\torrs r1, r2\n" + "\tstrb r1, [r0]\n" + "\tadds r4, r0, 0\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x2C\n" + "\tbl IsStringJapanese\n" + "\tcmp r0, 0\n" + "\tbeq _080E7CE2\n" + "\tldrb r0, [r4]\n" + "\tmovs r1, 0xF\n" + "\tands r1, r0\n" + "\tmovs r0, 0x10\n" + "\tb _080E7CEA\n" + "_080E7CE2:\n" + "\tldrb r0, [r4]\n" + "\tmovs r1, 0xF\n" + "\tands r1, r0\n" + "\tmovs r0, 0x20\n" + "_080E7CEA:\n" + "\torrs r1, r0\n" + "\tstrb r1, [r4]\n" + "_080E7CEE:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tldr r0, [r7, 0x70]\n" + "\tcmp r6, r0\n" + "\tbcc _080E7C24\n" + "_080E7CFA:\n" + "\tmov r0, r8\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r8, r0\n" + "_080E7D04:\n" + "\tbl GetLinkPlayerCount\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r8, r0\n" + "\tbcs _080E7D12\n" + "\tb _080E7BF8\n" + "_080E7D12:\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp, 0x34]\n" + "\tmov r8, r0\n" + "\tldr r1, [sp, 0x54]\n" + "\tlsrs r0, r1, 16\n" + "\tldr r2, [sp, 0x34]\n" + "\tcmp r2, r0\n" + "\tbcs _080E7D70\n" + "\tadds r5, r0, 0\n" + "_080E7D24:\n" + "\tldr r3, [sp, 0x30]\n" + "\tmov r0, r8\n" + "\tmuls r0, r3\n" + "\tldr r1, [sp, 0x2C]\n" + "\tadds r7, r1, r0\n" + "\tldr r0, [r7, 0x70]\n" + "\tcmp r0, 0\n" + "\tbeq _080E7D62\n" + "\tmovs r6, 0\n" + "\tcmp r6, r0\n" + "\tbcs _080E7D62\n" + "\tadds r3, r7, 0\n" + "\tadds r3, 0x74\n" + "\tldr r2, [sp, 0x4C]\n" + "\tmov r0, r8\n" + "\tlsls r1, r0, 1\n" + "\tmovs r4, 0x1\n" + "_080E7D46:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r3, r0\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080E7D56\n" + "\tadds r0, r6, r1\n" + "\tadds r0, r2, r0\n" + "\tstrb r4, [r0]\n" + "_080E7D56:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tldr r0, [r7, 0x70]\n" + "\tcmp r6, r0\n" + "\tbcc _080E7D46\n" + "_080E7D62:\n" + "\tmov r0, r8\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r8, r0\n" + "\tcmp r8, r5\n" + "\tbcc _080E7D24\n" + "_080E7D70:\n" + "\tmovs r6, 0\n" + "\tmov r8, r6\n" + "\tldr r1, [sp, 0x54]\n" + "\tcmp r1, 0\n" + "\tbeq _080E7E64\n" + "\tadd r2, sp, 0x24\n" + "\tmov r10, r2\n" + "\tmovs r3, 0x25\n" + "\tadd r3, sp\n" + "\tmov r9, r3\n" + "_080E7D84:\n" + "\tldr r1, [sp, 0x30]\n" + "\tmov r0, r8\n" + "\tmuls r0, r1\n" + "\tldr r2, [sp, 0x2C]\n" + "\tadds r7, r2, r0\n" + "\tmov r3, r8\n" + "\tlsls r1, r3, 1\n" + "\tldr r2, [sp, 0x4C]\n" + "\tadds r0, r2, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbeq _080E7DA6\n" + "\tldr r3, [sp, 0x50]\n" + "\tadds r0, r3, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbne _080E7DB0\n" + "_080E7DA6:\n" + "\tldr r0, [sp, 0x34]\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0x34]\n" + "_080E7DB0:\n" + "\tldr r2, [sp, 0x4C]\n" + "\tadds r0, r2, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbne _080E7DD4\n" + "\tldr r3, [sp, 0x50]\n" + "\tadds r0, r3, r1\n" + "\tldrb r2, [r0]\n" + "\tcmp r2, 0\n" + "\tbne _080E7DD4\n" + "_080E7DC4:\n" + "\tlsls r1, r6, 1\n" + "\tmov r3, r10\n" + "\tadds r0, r3, r1\n" + "\tmov r3, r8\n" + "\tstrb r3, [r0]\n" + "\tadd r1, r9\n" + "\tstrb r2, [r1]\n" + "\tb _080E7E4E\n" + "_080E7DD4:\n" + "\tldr r2, [sp, 0x4C]\n" + "\tadds r0, r2, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080E7DE8\n" + "\tldr r3, [sp, 0x50]\n" + "\tadds r0, r3, r1\n" + "\tldrb r2, [r0]\n" + "\tcmp r2, 0x1\n" + "\tbeq _080E7DC4\n" + "_080E7DE8:\n" + "\tldr r2, [sp, 0x4C]\n" + "\tadds r0, r2, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbne _080E7E54\n" + "\tldr r3, [sp, 0x50]\n" + "\tadds r0, r3, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x1\n" + "\tbne _080E7E54\n" + "\tlsls r5, r6, 1\n" + "\tmov r1, r10\n" + "\tadds r0, r1, r5\n" + "\tmov r2, r8\n" + "\tstrb r2, [r0]\n" + "\tadds r0, r7, 0\n" + "\tbl sub_80E7A9C\n" + "\tadds r4, r0, 0\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tadds r0, r7, 0\n" + "\tadds r0, 0x38\n" + "\tbl sub_80E7A9C\n" + "\tlsls r0, 24\n" + "\tlsrs r1, r0, 24\n" + "\tcmp r4, 0\n" + "\tbne _080E7E30\n" + "\tcmp r1, 0\n" + "\tbeq _080E7E34\n" + "\tmov r3, r9\n" + "\tadds r1, r3, r5\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tb _080E7E4E\n" + "_080E7E30:\n" + "\tcmp r1, 0\n" + "\tbeq _080E7E48\n" + "_080E7E34:\n" + "\tbl Random2\n" + "\tmov r1, r9\n" + "\tadds r2, r1, r5\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmovs r1, 0x1\n" + "\tands r0, r1\n" + "\tstrb r0, [r2]\n" + "\tb _080E7E4E\n" + "_080E7E48:\n" + "\tmov r2, r9\n" + "\tadds r0, r2, r5\n" + "\tstrb r1, [r0]\n" + "_080E7E4E:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "_080E7E54:\n" + "\tmov r0, r8\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r3, r0, 16\n" + "\tmov r8, r3\n" + "\tldr r1, [sp, 0x54]\n" + "\tcmp r0, r1\n" + "\tbcc _080E7D84\n" + "_080E7E64:\n" + "\tmovs r2, 0\n" + "\tmov r8, r2\n" + "\tldr r3, [sp, 0x44]\n" + "\tlsls r0, r3, 4\n" + "\tsubs r0, r3\n" + "\tlsls r0, 3\n" + "\tldr r1, [sp, 0x2C]\n" + "\tadds r7, r1, r0\n" + "\tldr r1, [sp, 0x48]\n" + "_080E7E76:\n" + "\tmov r2, r8\n" + "\tlsls r0, r2, 2\n" + "\tadds r0, r1, r0\n" + "\tstr r7, [r0]\n" + "\tmov r0, r8\n" + "\tadds r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmov r8, r0\n" + "\tcmp r0, 0x3\n" + "\tbls _080E7E76\n" + "\tbl sub_80E7B54\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmovs r1, 0x3\n" + "\tbl __umodsi3\n" + "\tlsls r0, 24\n" + "\tlsrs r1, r0, 24\n" + "\tldr r3, [sp, 0x34]\n" + "\tcmp r3, 0x3\n" + "\tbeq _080E7EC8\n" + "\tcmp r3, 0x3\n" + "\tbgt _080E7EAE\n" + "\tcmp r3, 0x2\n" + "\tbeq _080E7EB6\n" + "\tb _080E7F1C\n" + "_080E7EAE:\n" + "\tldr r0, [sp, 0x34]\n" + "\tcmp r0, 0x4\n" + "\tbeq _080E7EE8\n" + "\tb _080E7F1C\n" + "_080E7EB6:\n" + "\tadd r2, sp, 0x24\n" + "\tmovs r0, 0x1\n" + "\tstr r0, [sp]\n" + "\tldr r0, [sp, 0x2C]\n" + "\tldr r1, [sp, 0x30]\n" + "\tmovs r3, 0\n" + "\tbl sub_80E7AA4\n" + "\tb _080E7F1C\n" + "_080E7EC8:\n" + "\tldr r0, =gUnknown_0858CFB8\n" + "\tlsls r1, 1\n" + "\tadds r2, r1, r0\n" + "\tldrb r3, [r2]\n" + "\tadds r0, 0x1\n" + "\tadds r1, r0\n" + "\tldrb r0, [r1]\n" + "\tadd r2, sp, 0x24\n" + "\tstr r0, [sp]\n" + "\tldr r0, [sp, 0x2C]\n" + "\tldr r1, [sp, 0x30]\n" + "\tbl sub_80E7AA4\n" + "\tb _080E7F1C\n" + "\t.pool\n" + "_080E7EE8:\n" + "\tadd r6, sp, 0x24\n" + "\tldr r4, =gUnknown_0858CFBE\n" + "\tlsls r5, r1, 2\n" + "\tadds r0, r5, r4\n" + "\tldrb r3, [r0]\n" + "\tadds r0, r4, 0x1\n" + "\tadds r0, r5, r0\n" + "\tldrb r0, [r0]\n" + "\tstr r0, [sp]\n" + "\tldr r0, [sp, 0x2C]\n" + "\tldr r1, [sp, 0x30]\n" + "\tadds r2, r6, 0\n" + "\tbl sub_80E7AA4\n" + "\tadds r0, r4, 0x2\n" + "\tadds r0, r5, r0\n" + "\tldrb r3, [r0]\n" + "\tadds r4, 0x3\n" + "\tadds r5, r4\n" + "\tldrb r0, [r5]\n" + "\tstr r0, [sp]\n" + "\tldr r0, [sp, 0x2C]\n" + "\tldr r1, [sp, 0x30]\n" + "\tadds r2, r6, 0\n" + "\tbl sub_80E7AA4\n" + "_080E7F1C:\n" + "\tldr r1, [sp, 0x2C]\n" + "\tldr r2, [sp, 0x44]\n" + "\tadds r7, r1, r2\n" + "\tldr r4, =gSaveBlock1Ptr\n" + "\tldr r0, [r4]\n" + "\tmovs r3, 0xC2\n" + "\tlsls r3, 6\n" + "\tadds r0, r3\n" + "\tadds r1, r7, 0\n" + "\tmovs r2, 0x38\n" + "\tbl memcpy\n" + "\tldr r0, [r4]\n" + "\tldr r1, =0x0000310c\n" + "\tadds r0, r1\n" + "\tadds r1, r7, 0\n" + "\tadds r1, 0x38\n" + "\tmovs r2, 0x38\n" + "\tbl memcpy\n" + "\tldr r0, [sp, 0x38]\n" + "\tbl SeedRng\n" + "\tadd sp, 0x58\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.pool"); +} +#endif // NONMATCHING + +static void sub_80E7F68(u16 *item, u8 which) +{ + if (which != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == POCKET_KEY_ITEMS) + { + if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1)) + { + VarSet(VAR_TEMP_1, *item); + StringCopy(gStringVar1, gLinkPlayers[0].name); + if (*item == ITEM_EON_TICKET) + FlagSet(FLAG_SYS_HAS_EON_TICKET); + } + else + { + VarSet(VAR_TEMP_1, ITEM_NONE); + } + } +} + +static void sub_80E7FF8(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[0]++; + break; + case 1: + if (Link_AnyPartnersPlayingRubyOrSapphire()) + task->data[0]++; + else + task->data[0] = 6; + break; + case 2: + sub_8076D5C(); + sub_8153430(); + task->data[0] ++; + break; + case 3: + if (sub_8153474()) + { + sav2_gender2_inplace_and_xFE(); + task->data[0] = 4; + task->data[1] = 0; + } + break; + case 4: + if (++task->data[1] > 10) + { + sub_800AC34(); + task->data[0] ++; + } + break; + case 5: + if (gReceivedRemoteLinkPlayers == 0) + DestroyTask(taskId); + break; + case 6: + if (!sub_801048C(0)) + { + CreateTask(sub_8153688, 5); + task->data[0] ++; + } + break; + case 7: + if (!FuncIsActiveTask(sub_8153688)) + { + if (gWirelessCommType) + { + sub_801048C(1); + task->data[0] = 8; + } + else + { + task->data[0] = 4; + } + } + break; + case 8: + sub_800ADF8(); + task->data[0] ++; + break; + case 9: + if (sub_800A520()) + DestroyTask(taskId); + break; + } +} + +// New Emerald functions + +static void sub_80E8110(struct UnkRecordMixingStruct *dst, struct UnkRecordMixingStruct *src) +{ + s32 i, id; + s32 var_2C, var_28, var_24, r8; + + dst[0].field_38[0] = 0xFF; + dst[1].field_38[0] = 0xFF; + + dst[0] = src[0]; + + var_28 = 0; + var_24 = 0; + var_2C = 0; + r8 = 0; + for (i = 0; i < 2; i++) + { + id = ((i + gSaveBlock2Ptr->field_B2_1) % 3) + 1; + if (src[id].field_38[0] != 0xFF) + { + if (ReadUnalignedWord(src[id].playerId) != ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId)) + { + r8++; + var_2C = id; + } + if (ReadUnalignedWord(src[id].playerId) == ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId)) + { + var_24++; + var_28 = id; + } + } + } + + if (r8 == 0 && var_24 != 0) + { + r8 = var_24; + var_2C = var_28; + } + + switch (r8) + { + case 1: + dst[1] = src[var_2C]; + break; + case 2: + if (Random2() > 0x3333) + { + dst[1] = src[gSaveBlock2Ptr->field_B2_1 + 1]; + } + else + { + dst[1] = src[((gSaveBlock2Ptr->field_B2_1 + 1) % 3 + 1)]; + } + break; + } +} + +void sub_80E8260(struct UnkRecordMixingStruct2 *dst) +{ + s32 i, j; + + for (i = 0; i < 9; i++) + { + for (j = 0; j < 2; j++) + { + CopyUnalignedWord(dst->field_0[i][j].playerId, gSaveBlock2Ptr->playerTrainerId); + dst->field_0[i][j].language = GAME_LANGUAGE; + StringCopy(dst->field_0[i][j].playerName, gSaveBlock2Ptr->playerName); + } + } + + for (j = 0; j < 2; j++) + { + dst->field_120[j].language = GAME_LANGUAGE; + CopyUnalignedWord(dst->field_120[j].playerId1, gSaveBlock2Ptr->playerTrainerId); + CopyUnalignedWord(dst->field_120[j].playerId2, gSaveBlock2Ptr->frontier.field_EF1[j]); + StringCopy(dst->field_120[j].playerName1, gSaveBlock2Ptr->playerName); + StringCopy(dst->field_120[j].playerName2, gSaveBlock2Ptr->frontier.field_EE1[j]); + } + + for (i = 0; i < 2; i++) + { + dst->field_0[0][i].field_4 = gSaveBlock2Ptr->frontier.field_CF0[i]; + dst->field_0[1][i].field_4 = gSaveBlock2Ptr->frontier.field_CF4[i]; + dst->field_0[2][i].field_4 = gSaveBlock2Ptr->frontier.field_CF8[i]; + dst->field_0[3][i].field_4 = gSaveBlock2Ptr->frontier.field_D14[i]; + dst->field_0[4][i].field_4 = gSaveBlock2Ptr->frontier.field_DD0[i]; + dst->field_0[5][i].field_4 = gSaveBlock2Ptr->frontier.field_DDE[i]; + dst->field_0[6][i].field_4 = gSaveBlock2Ptr->frontier.field_DEA[i]; + dst->field_0[7][i].field_4 = gSaveBlock2Ptr->frontier.field_E08[i]; + dst->field_0[8][i].field_4 = gSaveBlock2Ptr->frontier.field_E1E[i]; + + dst->field_120[i].field_8 = gSaveBlock2Ptr->frontier.field_CFC[i]; + } +} + +static bool32 sub_80E841C(struct UnkRecordMixingStruct *arg0, struct UnkRecordMixingStruct *arg1) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (ReadUnalignedWord(arg0->playerId) == ReadUnalignedWord(arg1[i].playerId) + && arg0->field_0[2] == arg1[i].field_0[2]) + { + return TRUE; + } + } + + return FALSE; +} + +static void sub_80E8468(struct UnkRecordMixingStruct *arg0, size_t arg1, u32 arg2) +{ + s32 i, r7, r8; + struct UnkRecordMixingStruct *structPtr; + u32 mixIndices[4]; + u32 structId; + + ShufflePlayerIndices(mixIndices); + structPtr = (void*)(arg0) + (arg1 * mixIndices[arg2]); + r7 = 0; + r8 = 0; + for (i = 0; i < 2; i++) + { + if (structPtr[i].field_38[0] != 0xFF && !sub_80E841C(&structPtr[i], gSaveBlock2Ptr->field_DC)) + { + r7++; + r8 = i; + } + } + + switch (r7) + { + case 1: + structId = gSaveBlock2Ptr->field_B2_1 + 1; + gSaveBlock2Ptr->field_DC[structId] = structPtr[r8]; + gSaveBlock2Ptr->field_B2_1 = (gSaveBlock2Ptr->field_B2_1 + 1) % 3; + break; + case 2: + for (i = 0; i < 2; i++) + { + structId = ((i ^ 1) + gSaveBlock2Ptr->field_B2_1) % 3 + 1; + gSaveBlock2Ptr->field_DC[structId] = structPtr[i]; + } + gSaveBlock2Ptr->field_B2_1 = (gSaveBlock2Ptr->field_B2_1 + 2) % 3; + break; + } +} + +NAKED +static void sub_80E8578(struct UnknownRecMixingStruct3 *arg0, struct UnkRecordMixingStruct2 *arg1, size_t arg2, u32 arg3, u32 arg4) +{ + asm_unified(" push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x54\n\ + str r0, [sp]\n\ + ldr r0, [sp, 0x74]\n\ + movs r4, 0\n\ + mov r8, r4\n\ + movs r5, 0\n\ + str r5, [sp, 0x4]\n\ + ldr r4, =gUnknown_03001168\n\ + b _080E85A0\n\ + .pool\n\ +_080E8598:\n\ + adds r1, r2\n\ + ldr r6, [sp, 0x4]\n\ + adds r6, 0x1\n\ + str r6, [sp, 0x4]\n\ +_080E85A0:\n\ + ldr r5, [sp, 0x4]\n\ + cmp r5, r0\n\ + bge _080E85B6\n\ + cmp r5, r3\n\ + beq _080E85B0\n\ + stm r4!, {r1}\n\ + movs r6, 0x1\n\ + add r8, r6\n\ +_080E85B0:\n\ + mov r5, r8\n\ + cmp r5, 0x3\n\ + bne _080E8598\n\ +_080E85B6:\n\ + movs r6, 0\n\ + str r6, [sp, 0x4]\n\ + subs r0, 0x1\n\ + str r0, [sp, 0x24]\n\ +_080E85BE:\n\ + movs r0, 0\n\ + str r0, [sp, 0x8]\n\ + ldr r1, [sp, 0x4]\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x28]\n\ + ldr r2, [sp, 0x4]\n\ + lsls r2, 1\n\ + str r2, [sp, 0x34]\n\ + ldr r3, [sp, 0x4]\n\ + adds r3, r2, r3\n\ + str r3, [sp, 0x10]\n\ + movs r4, 0\n\ + str r4, [sp, 0x44]\n\ + movs r5, 0\n\ + str r5, [sp, 0x48]\n\ +_080E85DC:\n\ + movs r6, 0\n\ + mov r8, r6\n\ + ldr r0, =gSaveBlock2Ptr\n\ + ldr r1, [r0]\n\ + ldr r2, [sp, 0x10]\n\ + lsls r0, r2, 5\n\ + ldr r3, [sp, 0x48]\n\ + adds r0, r3, r0\n\ + adds r3, r0, r1\n\ + lsls r0, r2, 6\n\ + ldr r4, [sp, 0x44]\n\ + adds r0, r4, r0\n\ + ldr r5, [sp]\n\ + adds r2, r0, r5\n\ +_080E85F8:\n\ + adds r0, r2, 0\n\ + movs r6, 0x87\n\ + lsls r6, 2\n\ + adds r1, r3, r6\n\ + ldm r1!, {r4-r6}\n\ + stm r0!, {r4-r6}\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + adds r3, 0x10\n\ + adds r2, 0x10\n\ + movs r0, 0x1\n\ + add r8, r0\n\ + mov r1, r8\n\ + cmp r1, 0x2\n\ + ble _080E85F8\n\ + movs r2, 0\n\ + mov r8, r2\n\ + ldr r3, [sp, 0x24]\n\ + cmp r8, r3\n\ + bge _080E86DC\n\ + ldr r4, [sp, 0x4]\n\ + lsls r4, 5\n\ + mov r9, r4\n\ + ldr r5, [sp, 0x8]\n\ + lsls r7, r5, 4\n\ + ldr r6, [sp, 0x34]\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r6, r1\n\ + lsls r0, 6\n\ + str r0, [sp, 0x14]\n\ + ldr r2, [sp]\n\ + adds r0, r2, r0\n\ + ldr r3, [sp, 0x44]\n\ + str r3, [sp, 0x18]\n\ + adds r0, r3\n\ + str r0, [sp, 0x1C]\n\ + ldr r4, [sp, 0x14]\n\ + adds r0, r3, r4\n\ + adds r0, r2\n\ + adds r0, 0x30\n\ + mov r10, r0\n\ +_080E864A:\n\ + movs r5, 0\n\ + str r5, [sp, 0xC]\n\ + movs r3, 0\n\ + mov r6, r8\n\ + lsls r6, 2\n\ + str r6, [sp, 0x38]\n\ + ldr r1, [sp, 0x18]\n\ + ldr r2, [sp, 0x14]\n\ + adds r0, r1, r2\n\ + ldr r4, [sp]\n\ + adds r5, r0, r4\n\ + ldr r0, =gUnknown_03001168\n\ + adds r0, r6, r0\n\ + str r0, [sp, 0x50]\n\ +_080E8666:\n\ + lsls r0, r3, 4\n\ + ldr r6, [sp, 0x1C]\n\ + adds r0, r6, r0\n\ + str r3, [sp, 0x4C]\n\ + bl ReadUnalignedWord\n\ + adds r4, r0, 0\n\ + ldr r1, [sp, 0x50]\n\ + ldr r0, [r1]\n\ + add r0, r9\n\ + adds r0, r7\n\ + bl ReadUnalignedWord\n\ + ldr r3, [sp, 0x4C]\n\ + cmp r4, r0\n\ + bne _080E86A8\n\ + ldr r2, [sp, 0xC]\n\ + adds r2, 0x1\n\ + str r2, [sp, 0xC]\n\ + ldr r4, [sp, 0x50]\n\ + ldr r0, [r4]\n\ + mov r6, r9\n\ + adds r1, r7, r6\n\ + adds r1, r0, r1\n\ + ldrh r0, [r5, 0x4]\n\ + ldrh r2, [r1, 0x4]\n\ + cmp r0, r2\n\ + bcs _080E86A8\n\ + adds r0, r5, 0\n\ + ldm r1!, {r2,r4,r6}\n\ + stm r0!, {r2,r4,r6}\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ +_080E86A8:\n\ + adds r5, 0x10\n\ + adds r3, 0x1\n\ + cmp r3, 0x2\n\ + ble _080E8666\n\ + ldr r3, [sp, 0xC]\n\ + cmp r3, 0\n\ + bne _080E86CE\n\ + ldr r0, =gUnknown_03001168\n\ + ldr r4, [sp, 0x38]\n\ + adds r0, r4, r0\n\ + ldr r0, [r0]\n\ + mov r5, r9\n\ + adds r2, r7, r5\n\ + mov r1, r10\n\ + adds r0, r2\n\ + ldm r0!, {r2,r3,r6}\n\ + stm r1!, {r2,r3,r6}\n\ + ldr r0, [r0]\n\ + str r0, [r1]\n\ +_080E86CE:\n\ + movs r4, 0x10\n\ + add r10, r4\n\ + movs r5, 0x1\n\ + add r8, r5\n\ + ldr r6, [sp, 0x24]\n\ + cmp r8, r6\n\ + blt _080E864A\n\ +_080E86DC:\n\ + ldr r0, [sp, 0x44]\n\ + adds r0, 0x60\n\ + str r0, [sp, 0x44]\n\ + ldr r1, [sp, 0x48]\n\ + adds r1, 0x30\n\ + str r1, [sp, 0x48]\n\ + ldr r2, [sp, 0x8]\n\ + adds r2, 0x1\n\ + str r2, [sp, 0x8]\n\ + cmp r2, 0x1\n\ + bgt _080E86F4\n\ + b _080E85DC\n\ +_080E86F4:\n\ + ldr r3, [sp, 0x28]\n\ + str r3, [sp, 0x4]\n\ + cmp r3, 0x8\n\ + bgt _080E86FE\n\ + b _080E85BE\n\ +_080E86FE:\n\ + movs r4, 0\n\ + str r4, [sp, 0x8]\n\ +_080E8702:\n\ + ldr r5, [sp, 0x8]\n\ + adds r5, 0x1\n\ + str r5, [sp, 0x2C]\n\ + ldr r0, =gSaveBlock2Ptr\n\ + ldr r1, [r0]\n\ + movs r0, 0x54\n\ + ldr r6, [sp, 0x8]\n\ + muls r0, r6\n\ + adds r3, r0, r1\n\ + movs r0, 0xA8\n\ + muls r0, r6\n\ + ldr r1, [sp]\n\ + adds r2, r0, r1\n\ + movs r4, 0x2\n\ + mov r8, r4\n\ +_080E8720:\n\ + movs r5, 0xD8\n\ + lsls r5, 3\n\ + adds r0, r2, r5\n\ + ldr r6, =0x0000057c\n\ + adds r1, r3, r6\n\ + ldm r1!, {r4-r6}\n\ + stm r0!, {r4-r6}\n\ + ldm r1!, {r4-r6}\n\ + stm r0!, {r4-r6}\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ + adds r3, 0x1C\n\ + adds r2, 0x1C\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + add r8, r0\n\ + mov r1, r8\n\ + cmp r1, 0\n\ + bge _080E8720\n\ + movs r2, 0\n\ + mov r8, r2\n\ + ldr r3, [sp, 0x24]\n\ + cmp r8, r3\n\ + blt _080E8752\n\ + b _080E885A\n\ +_080E8752:\n\ + ldr r4, [sp, 0x8]\n\ + lsls r1, r4, 3\n\ + movs r0, 0xA8\n\ + adds r5, r4, 0\n\ + muls r5, r0\n\ + str r5, [sp, 0x20]\n\ + str r5, [sp, 0x3C]\n\ + subs r1, r4\n\ + lsls r1, 2\n\ + mov r10, r1\n\ +_080E8766:\n\ + movs r6, 0\n\ + str r6, [sp, 0xC]\n\ + mov r0, r8\n\ + lsls r0, 2\n\ + str r0, [sp, 0x38]\n\ + mov r1, r8\n\ + adds r1, 0x1\n\ + str r1, [sp, 0x30]\n\ + ldr r0, =gUnknown_03001168\n\ + ldr r2, [sp, 0x38]\n\ + adds r2, r0\n\ + mov r9, r2\n\ + ldr r3, [sp]\n\ + movs r4, 0xD8\n\ + lsls r4, 3\n\ + adds r0, r3, r4\n\ + ldr r5, [sp, 0x3C]\n\ + adds r7, r5, r0\n\ + str r6, [sp, 0x40]\n\ + movs r3, 0x2\n\ +_080E878E:\n\ + ldr r1, [sp, 0x20]\n\ + movs r2, 0xD8\n\ + lsls r2, 3\n\ + adds r0, r1, r2\n\ + ldr r4, [sp]\n\ + adds r0, r4, r0\n\ + ldr r6, [sp, 0x40]\n\ + adds r5, r0, r6\n\ + adds r0, r5, 0\n\ + str r3, [sp, 0x4C]\n\ + bl ReadUnalignedWord\n\ + adds r4, r0, 0\n\ + movs r6, 0x90\n\ + lsls r6, 1\n\ + add r6, r10\n\ + mov r1, r9\n\ + ldr r0, [r1]\n\ + adds r0, r6\n\ + bl ReadUnalignedWord\n\ + ldr r3, [sp, 0x4C]\n\ + cmp r4, r0\n\ + bne _080E8808\n\ + adds r0, r5, 0x4\n\ + bl ReadUnalignedWord\n\ + adds r4, r0, 0\n\ + mov r2, r9\n\ + ldr r0, [r2]\n\ + adds r0, r6\n\ + adds r0, 0x4\n\ + bl ReadUnalignedWord\n\ + ldr r3, [sp, 0x4C]\n\ + cmp r4, r0\n\ + bne _080E8808\n\ + ldr r4, [sp, 0xC]\n\ + adds r4, 0x1\n\ + str r4, [sp, 0xC]\n\ + mov r5, r9\n\ + ldr r0, [r5]\n\ + mov r6, r10\n\ + adds r2, r0, r6\n\ + movs r0, 0x94\n\ + lsls r0, 1\n\ + adds r1, r2, r0\n\ + ldrh r0, [r7, 0x8]\n\ + ldrh r1, [r1]\n\ + cmp r0, r1\n\ + bcs _080E8808\n\ + adds r0, r7, 0\n\ + movs r4, 0x90\n\ + lsls r4, 1\n\ + adds r1, r2, r4\n\ + ldm r1!, {r2,r5,r6}\n\ + stm r0!, {r2,r5,r6}\n\ + ldm r1!, {r4-r6}\n\ + stm r0!, {r4-r6}\n\ + ldr r1, [r1]\n\ + str r1, [r0]\n\ +_080E8808:\n\ + adds r7, 0x1C\n\ + ldr r0, [sp, 0x40]\n\ + adds r0, 0x1C\n\ + str r0, [sp, 0x40]\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _080E878E\n\ + ldr r1, [sp, 0xC]\n\ + cmp r1, 0\n\ + bne _080E8850\n\ + mov r0, r8\n\ + adds r0, 0x3\n\ + lsls r1, r0, 3\n\ + subs r1, r0\n\ + lsls r1, 2\n\ + ldr r2, [sp, 0x20]\n\ + adds r1, r2\n\ + ldr r3, [sp]\n\ + adds r1, r3, r1\n\ + ldr r0, =gUnknown_03001168\n\ + ldr r4, [sp, 0x38]\n\ + adds r0, r4, r0\n\ + ldr r0, [r0]\n\ + add r0, r10\n\ + movs r5, 0xD8\n\ + lsls r5, 3\n\ + adds r1, r5\n\ + movs r6, 0x90\n\ + lsls r6, 1\n\ + adds r0, r6\n\ + ldm r0!, {r2-r4}\n\ + stm r1!, {r2-r4}\n\ + ldm r0!, {r2,r5,r6}\n\ + stm r1!, {r2,r5,r6}\n\ + ldr r0, [r0]\n\ + str r0, [r1]\n\ +_080E8850:\n\ + ldr r3, [sp, 0x30]\n\ + mov r8, r3\n\ + ldr r4, [sp, 0x24]\n\ + cmp r8, r4\n\ + blt _080E8766\n\ +_080E885A:\n\ + ldr r5, [sp, 0x2C]\n\ + str r5, [sp, 0x8]\n\ + cmp r5, 0x1\n\ + bgt _080E8864\n\ + b _080E8702\n\ +_080E8864:\n\ + add sp, 0x54\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + "); +} + +static void sub_80E8880(struct UnknownRecMixingStruct *arg0, struct UnknownRecMixingStruct *arg1) +{ + s32 i, j; + + for (i = 0; i < 3; i++) + { + s32 r2 = 0; + s32 r4 = -1; + for (j = 0; j < 6; j++) + { + if (arg1[j].field_4 > r2) + { + r4 = j; + r2 = arg1[j].field_4; + } + } + + if (r4 >= 0) + { + arg0[i] = arg1[r4]; + arg1[r4].field_4 = 0; + } + } +} + +static void sub_80E88CC(struct UnknownRecMixingStruct2 *arg0, struct UnknownRecMixingStruct2 *arg1) +{ + s32 i, j; + + for (i = 0; i < 3; i++) + { + s32 r2 = 0; + s32 r4 = -1; + for (j = 0; j < 6; j++) + { + if (arg1[j].field_8 > r2) + { + r4 = j; + r2 = arg1[j].field_8; + } + } + + if (r4 >= 0) + { + arg0[i] = arg1[r4]; + arg1[r4].field_8 = 0; + } + } +} + +NAKED +static void sub_80E8924(struct UnknownRecMixingStruct3 *arg0) +{ + asm_unified("push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + mov r9, r0\n\ + movs r0, 0\n\ + ldr r1, =gSaveBlock2Ptr\n\ + mov r10, r1\n\ +_080E8936:\n\ + lsls r1, r0, 1\n\ + adds r2, r0, 0x1\n\ + mov r8, r2\n\ + adds r1, r0\n\ + lsls r0, r1, 5\n\ + movs r2, 0x87\n\ + lsls r2, 2\n\ + adds r7, r0, r2\n\ + lsls r1, 6\n\ + mov r0, r9\n\ + adds r4, r0, r1\n\ + movs r6, 0\n\ + movs r5, 0x1\n\ +_080E8950:\n\ + mov r1, r10\n\ + ldr r0, [r1]\n\ + adds r0, r7\n\ + adds r0, r6\n\ + adds r1, r4, 0\n\ + bl sub_80E8880\n\ + adds r4, 0x60\n\ + adds r6, 0x30\n\ + subs r5, 0x1\n\ + cmp r5, 0\n\ + bge _080E8950\n\ + mov r0, r8\n\ + cmp r0, 0x8\n\ + ble _080E8936\n\ + movs r5, 0\n\ + ldr r4, =gSaveBlock2Ptr\n\ +_080E8972:\n\ + movs r0, 0x54\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r2, =0x0000057c\n\ + adds r1, r2\n\ + ldr r0, [r4]\n\ + adds r0, r1\n\ + movs r1, 0xA8\n\ + muls r1, r5\n\ + movs r2, 0xD8\n\ + lsls r2, 3\n\ + adds r1, r2\n\ + add r1, r9\n\ + bl sub_80E88CC\n\ + adds r5, 0x1\n\ + cmp r5, 0x1\n\ + ble _080E8972\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} + +static void sub_80E89AC(struct UnkRecordMixingStruct2 *arg0, size_t arg1, u32 arg2) +{ + u8 linkPlayerCount = GetLinkPlayerCount(); + struct UnknownRecMixingStruct3 *largeStructPtr = AllocZeroed(sizeof(struct UnknownRecMixingStruct3)); + + sub_80E8578(largeStructPtr, arg0, arg1, arg2, linkPlayerCount); + sub_80E8924(largeStructPtr); + + Free(largeStructPtr); +} + +static void sub_80E89F8(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; +} + +static void SanitizeDayCareMailForRuby(struct RecordMixingDayCareMail *src) +{ + s32 i; + + for (i = 0; i < src->numDaycareMons; i++) + { + struct DayCareMail *mail = &src->mail[i]; + if (mail->message.itemId != 0) + { + if (mail->gameLanguage != LANGUAGE_JAPANESE) + PadNameString(mail->OT_name, 0xFC); + + ConvertInternationalString(mail->monName, mail->monLanguage); + } + } +} + +static void SanitizeRubyBattleTowerRecord(struct RSBattleTowerRecord *src) +{ + +} + +static void SanitizeEmeraldBattleTowerRecord(struct EmeraldBattleTowerRecord *dst) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + struct UnknownPokemonStruct *towerMon = &dst->party[i]; + if (towerMon->species != 0) + StripExtCtrlCodes(towerMon->nickname); + } + + CalcEmeraldBattleTowerChecksum(dst); +} diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 4cb2eab49..45b07ca7a 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -58,8 +58,8 @@ struct RecordedBattleSave u8 field_4FC; u8 field_4FD; u8 field_4FE; - u8 battleStyle : 1; - u8 textSpeed : 3; + u8 battleStyle:1; + u8 textSpeed:3; u32 AI_scripts; u8 field_504[8]; u8 field_50C; @@ -79,19 +79,19 @@ 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 u8 sUnknown_0203C7AD = 0; -EWRAM_DATA static u8 sUnknown_0203C7AE = 0; +EWRAM_DATA static u8 sFrontierFacility = 0; EWRAM_DATA static u8 sUnknown_0203C7AF = 0; EWRAM_DATA static MainCallback sCallback2_AfterRecordedBattle = NULL; EWRAM_DATA u8 gUnknown_0203C7B4 = 0; EWRAM_DATA static u8 sUnknown_0203C7B5 = 0; -EWRAM_DATA static u8 sRecordedBattle_BattleStyle = 0; -EWRAM_DATA static u8 sRecordedBattle_TextSpeed = 0; -EWRAM_DATA static u32 sRecordedBattle_BattleFlags = 0; -EWRAM_DATA static u32 sRecordedBattle_AI_Scripts = 0; +EWRAM_DATA static u8 sBattleStyle = 0; +EWRAM_DATA static u8 sTextSpeed = 0; +EWRAM_DATA static u32 sBattleFlags = 0; +EWRAM_DATA static u32 sAI_Scripts = 0; EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0}; EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0}; -EWRAM_DATA static u16 sRecordedBattle_PlayerMonMoves[2][4] = {0}; -EWRAM_DATA static struct PlayerInfo sRecordedBattle_Players[MAX_BATTLERS_COUNT] = {0}; +EWRAM_DATA static u16 sPlayerMonMoves[2][4] = {0}; +EWRAM_DATA static struct PlayerInfo sPlayers[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA static u8 sUnknown_0203CCD0 = 0; EWRAM_DATA static u8 sUnknown_0203CCD1[8] = {0}; EWRAM_DATA static u8 sUnknown_0203CCD9 = 0; @@ -126,8 +126,8 @@ void sub_8184DA4(u8 arg0) { sBattleRecords[i][j] |= 0xFF; } - sRecordedBattle_BattleFlags = gBattleTypeFlags; - sRecordedBattle_AI_Scripts = gBattleResources->ai->aiFlags; + sBattleFlags = gBattleTypeFlags; + sAI_Scripts = gBattleResources->ai->aiFlags; } } } @@ -139,7 +139,7 @@ void sub_8184E58(void) if (sUnknown_0203C7AC == 1) { gRecordedBattleRngSeed = gRngValue; - sUnknown_0203C7AE = VarGet(VAR_FRONTIER_FACILITY); + sFrontierFacility = VarGet(VAR_FRONTIER_FACILITY); sUnknown_0203C7AF = sub_81A513C(); } else if (sUnknown_0203C7AC == 2) @@ -157,37 +157,37 @@ void sub_8184E58(void) for (i = 0; i < MAX_BATTLERS_COUNT; i++) { - sRecordedBattle_Players[i].trainerId = gLinkPlayers[i].trainerId; - sRecordedBattle_Players[i].gender = gLinkPlayers[i].gender; - sRecordedBattle_Players[i].battlerId = gLinkPlayers[i].lp_field_18; - sRecordedBattle_Players[i].language = gLinkPlayers[i].language; + sPlayers[i].trainerId = gLinkPlayers[i].trainerId; + sPlayers[i].gender = gLinkPlayers[i].gender; + sPlayers[i].battlerId = gLinkPlayers[i].id; + sPlayers[i].language = gLinkPlayers[i].language; if (i < linkPlayersCount) { StringCopy(text, gLinkPlayers[i].name); StripExtCtrlCodes(text); - StringCopy(sRecordedBattle_Players[i].name, text); + StringCopy(sPlayers[i].name, text); } else { for (j = 0; j < PLAYER_NAME_LENGTH; j++) - sRecordedBattle_Players[i].name[j] = gLinkPlayers[i].name[j]; + sPlayers[i].name[j] = gLinkPlayers[i].name[j]; } } } else { - sRecordedBattle_Players[0].trainerId = (gSaveBlock2Ptr->playerTrainerId[0]) + sPlayers[0].trainerId = (gSaveBlock2Ptr->playerTrainerId[0]) | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); - sRecordedBattle_Players[0].gender = gSaveBlock2Ptr->playerGender; - sRecordedBattle_Players[0].battlerId = 0; - sRecordedBattle_Players[0].language = gGameLanguage; + sPlayers[0].gender = gSaveBlock2Ptr->playerGender; + sPlayers[0].battlerId = 0; + sPlayers[0].language = gGameLanguage; for (i = 0; i < PLAYER_NAME_LENGTH; i++) - sRecordedBattle_Players[0].name[i] = gSaveBlock2Ptr->playerName[i]; + sPlayers[0].name[i] = gSaveBlock2Ptr->playerName[i]; } } @@ -214,12 +214,12 @@ void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear) u8 RecordedBattle_GetBattlerAction(u8 battlerId) { - // trying to read past array or invalid action byte, battle is over + // Trying to read past array or invalid action byte, battle is over. if (sRecordedBytesNo[battlerId] >= BATTLER_RECORD_SIZE || sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == 0xFF) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; // hah ResetPaletteFadeControl(); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); SetMainCallback2(CB2_QuitRecordedBattle); return -1; } @@ -345,37 +345,37 @@ u32 MoveRecordedBattleToSaveData(void) { for (j = 0; j < PLAYER_NAME_LENGTH; j++) { - battleSave->playersName[i][j] = sRecordedBattle_Players[i].name[j]; + battleSave->playersName[i][j] = sPlayers[i].name[j]; } - battleSave->playersGender[i] = sRecordedBattle_Players[i].gender; - battleSave->playersLanguage[i] = sRecordedBattle_Players[i].language; - battleSave->playersBattlers[i] = sRecordedBattle_Players[i].battlerId; - battleSave->playersTrainerId[i] = sRecordedBattle_Players[i].trainerId; + battleSave->playersGender[i] = sPlayers[i].gender; + battleSave->playersLanguage[i] = sPlayers[i].language; + battleSave->playersBattlers[i] = sPlayers[i].battlerId; + battleSave->playersTrainerId[i] = sPlayers[i].trainerId; } battleSave->rngSeed = gRecordedBattleRngSeed; - if (sRecordedBattle_BattleFlags & BATTLE_TYPE_LINK) + if (sBattleFlags & BATTLE_TYPE_LINK) { - battleSave->battleFlags = (sRecordedBattle_BattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20)); + battleSave->battleFlags = (sBattleFlags & ~(BATTLE_TYPE_LINK | BATTLE_TYPE_20)); battleSave->battleFlags |= BATTLE_TYPE_x2000000; - if (sRecordedBattle_BattleFlags & BATTLE_TYPE_WILD) + if (sBattleFlags & BATTLE_TYPE_WILD) { battleSave->battleFlags |= BATTLE_TYPE_x80000000; } - else if (sRecordedBattle_BattleFlags & BATTLE_TYPE_MULTI) + else if (sBattleFlags & BATTLE_TYPE_MULTI) { - switch (sRecordedBattle_Players[0].battlerId) + switch (sPlayers[0].battlerId) { case 0: case 2: - if (!(sRecordedBattle_Players[gUnknown_0203C7B4].battlerId & 1)) + if (!(sPlayers[gUnknown_0203C7B4].battlerId & 1)) battleSave->battleFlags |= BATTLE_TYPE_x80000000; break; case 1: case 3: - if ((sRecordedBattle_Players[gUnknown_0203C7B4].battlerId & 1)) + if ((sPlayers[gUnknown_0203C7B4].battlerId & 1)) battleSave->battleFlags |= BATTLE_TYPE_x80000000; break; } @@ -383,7 +383,7 @@ u32 MoveRecordedBattleToSaveData(void) } else { - battleSave->battleFlags = sRecordedBattle_BattleFlags; + battleSave->battleFlags = sBattleFlags; } battleSave->opponentA = gTrainerBattleOpponent_A; @@ -391,11 +391,11 @@ u32 MoveRecordedBattleToSaveData(void) battleSave->partnerId = gPartnerTrainerId; battleSave->field_4FA = gUnknown_0203C7B4; battleSave->field_4FC = gSaveBlock2Ptr->field_CA9_b; - battleSave->field_4FD = sUnknown_0203C7AE; + battleSave->field_4FD = sFrontierFacility; battleSave->field_4FE = sUnknown_0203C7AF; battleSave->battleStyle = gSaveBlock2Ptr->optionsBattleStyle; battleSave->textSpeed = gSaveBlock2Ptr->optionsTextSpeed; - battleSave->AI_scripts = sRecordedBattle_AI_Scripts; + battleSave->AI_scripts = sAI_Scripts; /* Can't match it without proper knowledge of the Saveblock 2. if (gTrainerBattleOpponent_A >= 300 && gTrainerBattleOpponent_A <= 399) @@ -475,7 +475,7 @@ u32 MoveRecordedBattleToSaveData(void) } #else -ASM_DIRECT +NAKED u32 MoveRecordedBattleToSaveData(void) { asm(".syntax unified\n\ @@ -525,7 +525,7 @@ _0818535E:\n\ lsls r3, 3\n\ adds r3, r7, r3\n\ str r3, [sp, 0x8]\n\ - ldr r5, =sRecordedBattle_Players\n\ + ldr r5, =sPlayers\n\ mov r8, r6\n\ mov r12, r6\n\ movs r4, 0x96\n\ @@ -536,7 +536,7 @@ _0818535E:\n\ adds r4, r7, r0\n\ _081853AC:\n\ lsls r1, r6, 3\n\ - ldr r0, =sRecordedBattle_Players\n\ + ldr r0, =sPlayers\n\ adds r0, 0x4\n\ mov r3, r8\n\ adds r2, r3, r0\n\ @@ -578,7 +578,7 @@ _081853BA:\n\ ldr r5, =gRecordedBattleRngSeed\n\ ldr r0, [r5]\n\ str r0, [r1]\n\ - ldr r0, =sRecordedBattle_BattleFlags\n\ + ldr r0, =sBattleFlags\n\ ldr r2, [r0]\n\ movs r0, 0x2\n\ ands r0, r2\n\ @@ -608,7 +608,7 @@ _08185454:\n\ ands r2, r0\n\ cmp r2, 0\n\ beq _081854E2\n\ - ldr r2, =sRecordedBattle_Players\n\ + ldr r2, =sPlayers\n\ ldrh r0, [r2, 0xE]\n\ cmp r0, 0x1\n\ beq _081854A8\n\ @@ -630,7 +630,7 @@ _0818547E:\n\ lsls r0, r1, 2\n\ adds r0, r1\n\ lsls r0, 2\n\ - ldr r4, =sRecordedBattle_Players\n\ + ldr r4, =sPlayers\n\ adds r0, r4\n\ ldrh r1, [r0, 0xE]\n\ movs r0, 0x1\n\ @@ -647,7 +647,7 @@ _081854A8:\n\ lsls r0, r1, 2\n\ adds r0, r1\n\ lsls r0, 2\n\ - ldr r1, =sRecordedBattle_Players\n\ + ldr r1, =sPlayers\n\ adds r0, r1\n\ ldrh r1, [r0, 0xE]\n\ movs r0, 0x1\n\ @@ -700,7 +700,7 @@ _081854E2:\n\ ldr r5, =0x000004fc\n\ adds r1, r7, r5\n\ strb r0, [r1]\n\ - ldr r0, =sUnknown_0203C7AE\n\ + ldr r0, =sFrontierFacility\n\ ldrb r1, [r0]\n\ adds r2, 0x3\n\ adds r0, r7, r2\n\ @@ -735,7 +735,7 @@ _081854E2:\n\ movs r2, 0xA0\n\ lsls r2, 3\n\ adds r1, r7, r2\n\ - ldr r3, =sRecordedBattle_AI_Scripts\n\ + ldr r3, =sAI_Scripts\n\ ldr r0, [r3]\n\ str r0, [r1]\n\ ldr r4, =0xfffffed4\n\ @@ -1293,7 +1293,7 @@ static bool32 AllocTryCopyRecordedBattleSaveData(struct RecordedBattleSave *dst) static void CB2_RecordedBattleEnd(void) { - gSaveBlock2Ptr->frontierChosenLvl = sUnknown_0203C7AD; + gSaveBlock2Ptr->frontier.chosenLvl = sUnknown_0203C7AD; gBattleOutcome = 0; gBattleTypeFlags = 0; gTrainerBattleOpponent_A = 0; @@ -1340,7 +1340,7 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src) } gLinkPlayers[i].gender = src->playersGender[i]; gLinkPlayers[i].language = src->playersLanguage[i]; - gLinkPlayers[i].lp_field_18 = src->playersBattlers[i]; + gLinkPlayers[i].id = src->playersBattlers[i]; gLinkPlayers[i].trainerId = src->playersTrainerId[i]; if (var) @@ -1353,12 +1353,12 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src) gTrainerBattleOpponent_B = src->opponentB; gPartnerTrainerId = src->partnerId; gUnknown_0203C7B4 = src->field_4FA; - sUnknown_0203C7AD = gSaveBlock2Ptr->frontierChosenLvl; - sUnknown_0203C7AE = src->field_4FD; + sUnknown_0203C7AD = gSaveBlock2Ptr->frontier.chosenLvl; + sFrontierFacility = src->field_4FD; sUnknown_0203C7AF = src->field_4FE; - sRecordedBattle_BattleStyle = src->battleStyle; - sRecordedBattle_TextSpeed = src->textSpeed; - sRecordedBattle_AI_Scripts = src->AI_scripts; + sBattleStyle = src->battleStyle; + sTextSpeed = src->textSpeed; + sAI_Scripts = src->AI_scripts; for (i = 0; i < 8; i++) { @@ -1375,7 +1375,7 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src) sUnknown_0203CCDC[i] = src->field_50E[i]; } - gSaveBlock2Ptr->frontierChosenLvl = src->field_4FC; + gSaveBlock2Ptr->frontier.chosenLvl = src->field_4FC; for (i = 0; i < MAX_BATTLERS_COUNT; i++) { @@ -1415,9 +1415,9 @@ static void CB2_RecordedBattle(void) RunTasks(); } -u8 sub_8185EA0(void) +u8 GetRecordedBattleFrontierFacility(void) { - return sUnknown_0203C7AE; + return sFrontierFacility; } u8 sub_8185EAC(void) @@ -1453,7 +1453,7 @@ u8 GetActiveBattlerLinkPlayerGender(void) for (i = 0; i < MAX_LINK_PLAYERS; i++) { - if (gLinkPlayers[i].lp_field_18 == gActiveBattler) + if (gLinkPlayers[i].id == gActiveBattler) break; } @@ -1480,12 +1480,12 @@ u8 sub_8185FAC(void) u8 GetBattleStyleInRecordedBattle(void) { - return sRecordedBattle_BattleStyle; + return sBattleStyle; } u8 GetTextSpeedInRecordedBattle(void) { - return sRecordedBattle_TextSpeed; + return sTextSpeed; } void RecordedBattle_CopyBattlerMoves(void) @@ -1501,7 +1501,7 @@ void RecordedBattle_CopyBattlerMoves(void) for (i = 0; i < 4; i++) { - sRecordedBattle_PlayerMonMoves[gActiveBattler / 2][i] = gBattleMons[gActiveBattler].moves[i]; + sPlayerMonMoves[gActiveBattler / 2][i] = gBattleMons[gActiveBattler].moves[i]; } } @@ -1522,7 +1522,7 @@ void sub_818603C(u8 arg0) { for (j = 0; j < 4; j++) { - if (gBattleMons[battlerId].moves[j] != sRecordedBattle_PlayerMonMoves[battlerId / 2][j]) + if (gBattleMons[battlerId].moves[j] != sPlayerMonMoves[battlerId / 2][j]) break; } if (j != 4) // player's mon's move has been changed @@ -1532,7 +1532,7 @@ void sub_818603C(u8 arg0) { for (k = 0; k < 4; k++) { - if (gBattleMons[battlerId].moves[j] == sRecordedBattle_PlayerMonMoves[battlerId / 2][k]) + if (gBattleMons[battlerId].moves[j] == sPlayerMonMoves[battlerId / 2][k]) { RecordedBattle_SetBattlerAction(battlerId, k); break; @@ -1612,7 +1612,7 @@ void sub_818603C(u8 arg0) u32 GetAiScriptsInRecordedBattle(void) { - return sRecordedBattle_AI_Scripts; + return sAI_Scripts; } void sub_8186444(void) diff --git a/src/region_map.c b/src/region_map.c index f16787fc9..3214ae185 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -22,6 +22,8 @@ #include "field_effect.h" #include "region_map.h" #include "constants/region_map_sections.h" +#include "heal_location.h" +#include "constants/heal_locations.h" #define MAP_WIDTH 28 #define MAP_HEIGHT 15 @@ -52,7 +54,7 @@ static EWRAM_DATA struct { /*0x88c*/ u8 unk_88c[0x1c0]; /*0xa4c*/ u8 unk_a4c[0x26]; /*0xa72*/ bool8 unk_a72; -} *gUnknown_0203A148 = NULL; // a74 +} *sFlyMap = NULL; // a74 static bool32 gUnknown_03001180; static bool32 gUnknown_03001184; @@ -242,23 +244,23 @@ static const u16 Unknown_085A1D48[] = INCBIN_U16("graphics/pokenav/fly_target_ic static const u8 sUnknown_085A1D68[] = INCBIN_U8("graphics/pokenav/fly_target_icons.4bpp.lz"); -static const u8 sUnknown_085A1E3C[][3] = { - {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 1}, - {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 14}, - {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 15}, - {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 16}, - {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 17}, - {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 18}, - {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 19}, - {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 3}, - {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 4}, - {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 5}, - {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 6}, - {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 7}, - {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 8}, - {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 9}, - {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 10}, - {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 11}, +static const u8 sMapHealLocations[][3] = { + {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F}, + {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), HEAL_LOCATION_OLDALE_TOWN}, + {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), HEAL_LOCATION_DEWFORD_TOWN}, + {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), HEAL_LOCATION_LAVARIDGE_TOWN}, + {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), HEAL_LOCATION_FALLARBOR_TOWN}, + {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), HEAL_LOCATION_VERDANTURF_TOWN}, + {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), HEAL_LOCATION_PACIFIDLOG_TOWN}, + {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), HEAL_LOCATION_PETALBURG_CITY}, + {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), HEAL_LOCATION_SLATEPORT_CITY}, + {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), HEAL_LOCATION_MAUVILLE_CITY}, + {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), HEAL_LOCATION_RUSTBORO_CITY}, + {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), HEAL_LOCATION_FORTREE_CITY}, + {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), HEAL_LOCATION_LILYCOVE_CITY}, + {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), HEAL_LOCATION_MOSSDEEP_CITY}, + {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), HEAL_LOCATION_SOOTOPOLIS_CITY}, + {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), HEAL_LOCATION_EVER_GRANDE_CITY_1}, {MAP_GROUP(ROUTE101), MAP_NUM(ROUTE101), 0}, {MAP_GROUP(ROUTE102), MAP_NUM(ROUTE102), 0}, {MAP_GROUP(ROUTE103), MAP_NUM(ROUTE103), 0}, @@ -891,8 +893,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) case 6: gRegionMap->mapSecId = gMapHeader.regionMapSectionId; gRegionMap->playerIsInCave = FALSE; - mapWidth = gMapHeader.mapData->width; - mapHeight = gMapHeader.mapData->height; + mapWidth = gMapHeader.mapLayout->width; + mapHeight = gMapHeader.mapLayout->height; x = gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; if (gRegionMap->mapSecId == MAPSEC_UNDERWATER_128 || gRegionMap->mapSecId == MAPSEC_UNDERWATER_MARINE_CAVE) @@ -907,8 +909,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) mapHeader = Overworld_GetMapHeaderByGroupAndId(gSaveBlock1Ptr->warp4.mapGroup, gSaveBlock1Ptr->warp4.mapNum); gRegionMap->mapSecId = mapHeader->regionMapSectionId; gRegionMap->playerIsInCave = TRUE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; + mapWidth = mapHeader->mapLayout->width; + mapHeight = mapHeader->mapLayout->height; x = gSaveBlock1Ptr->warp4.x; y = gSaveBlock1Ptr->warp4.y; } @@ -926,8 +928,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) mapHeader = Overworld_GetMapHeaderByGroupAndId((u16)gSaveBlock1Ptr->warp2.mapGroup, (u16)gSaveBlock1Ptr->warp2.mapNum); gRegionMap->mapSecId = mapHeader->regionMapSectionId; gRegionMap->playerIsInCave = TRUE; - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; + mapWidth = mapHeader->mapLayout->width; + mapHeight = mapHeader->mapLayout->height; x = gSaveBlock1Ptr->warp2.x; y = gSaveBlock1Ptr->warp2.y; break; @@ -953,8 +955,8 @@ static void RegionMap_InitializeStateBasedOnPlayerLocation(void) { gRegionMap->playerIsInCave = FALSE; } - mapWidth = mapHeader->mapData->width; - mapHeight = mapHeader->mapData->height; + mapWidth = mapHeader->mapLayout->width; + mapHeight = mapHeader->mapLayout->height; x = storedWarp->x; y = storedWarp->y; break; @@ -1068,14 +1070,14 @@ static void RegionMap_InitializeStateBasedOnSSTidalLocation(void) mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); gRegionMap->mapSecId = mapHeader->regionMapSectionId; - dimensionScale = mapHeader->mapData->width / gRegionMapEntries[gRegionMap->mapSecId].width; + dimensionScale = mapHeader->mapLayout->width / gRegionMapEntries[gRegionMap->mapSecId].width; if (dimensionScale == 0) dimensionScale = 1; x = xOnMap / dimensionScale; if (x >= gRegionMapEntries[gRegionMap->mapSecId].width) x = gRegionMapEntries[gRegionMap->mapSecId].width - 1; - dimensionScale = mapHeader->mapData->height / gRegionMapEntries[gRegionMap->mapSecId].height; + dimensionScale = mapHeader->mapLayout->height / gRegionMapEntries[gRegionMap->mapSecId].height; if (dimensionScale == 0) dimensionScale = 1; y = yOnMap / dimensionScale; @@ -1578,8 +1580,8 @@ void MCB2_FlyMap(void) SetGpuReg(REG_OFFSET_BG2HOFS, 0); SetGpuReg(REG_OFFSET_BG3HOFS, 0); SetGpuReg(REG_OFFSET_BG3VOFS, 0); - gUnknown_0203A148 = malloc(sizeof(*gUnknown_0203A148)); - if (gUnknown_0203A148 == NULL) + sFlyMap = malloc(sizeof(*sFlyMap)); + if (sFlyMap == NULL) { SetMainCallback2(CB2_ReturnToFieldWithOpenMenu); } @@ -1603,16 +1605,16 @@ void MCB2_FlyMap(void) gMain.state++; break; case 3: - sub_809882C(0, 0x65, 0xd0); + LoadUserWindowBorderGfx(0, 0x65, 0xd0); clear_scheduled_bg_copies_to_vram(); gMain.state++; break; case 4: - InitRegionMap(&gUnknown_0203A148->regionMap, FALSE); + InitRegionMap(&sFlyMap->regionMap, FALSE); CreateRegionMapCursor(0, 0); CreateRegionMapPlayerIcon(1, 1); - gUnknown_0203A148->mapSecId = gUnknown_0203A148->regionMap.mapSecId; - StringFill(gUnknown_0203A148->unk_a4c, CHAR_SPACE, 16); + sFlyMap->mapSecId = sFlyMap->regionMap.mapSecId; + StringFill(sFlyMap->unk_a4c, CHAR_SPACE, 16); gUnknown_03001180 = TRUE; sub_8124904(); gMain.state++; @@ -1664,7 +1666,7 @@ static void sub_81248C0(void) static void sub_81248D4(void) { - gUnknown_0203A148->unk_000(); + sFlyMap->unk_000(); AnimateSprites(); BuildOamBuffer(); do_scheduled_bg_tilemap_copies_to_vram(); @@ -1672,8 +1674,8 @@ static void sub_81248D4(void) static void sub_81248F4(void callback(void)) { - gUnknown_0203A148->unk_000 = callback; - gUnknown_0203A148->unk_004 = 0; + sFlyMap->unk_000 = callback; + sFlyMap->unk_004 = 0; } static void sub_8124904(void) @@ -1682,21 +1684,21 @@ static void sub_8124904(void) bool32 flag; const u8 *name; - if (gUnknown_0203A148->regionMap.iconDrawType > MAPSECTYPE_NONE && gUnknown_0203A148->regionMap.iconDrawType <= MAPSECTYPE_BATTLE_FRONTIER) + if (sFlyMap->regionMap.iconDrawType > MAPSECTYPE_NONE && sFlyMap->regionMap.iconDrawType <= MAPSECTYPE_BATTLE_FRONTIER) { flag = FALSE; for (i = 0; i < 1; i++) { - if (gUnknown_0203A148->regionMap.mapSecId == gUnknown_085A1EDC[i].mapSecId) + if (sFlyMap->regionMap.mapSecId == gUnknown_085A1EDC[i].mapSecId) { if (FlagGet(gUnknown_085A1EDC[i].flag)) { - StringLength(gUnknown_085A1EDC[i].name[gUnknown_0203A148->regionMap.posWithinMapSec]); + StringLength(gUnknown_085A1EDC[i].name[sFlyMap->regionMap.posWithinMapSec]); flag = TRUE; sub_8198070(0, FALSE); SetWindowBorderStyle(1, FALSE, 0x65, 0x0d); - PrintTextOnWindow(1, 1, gUnknown_0203A148->regionMap.mapSecName, 0, 1, 0, NULL); - name = gUnknown_085A1EDC[i].name[gUnknown_0203A148->regionMap.posWithinMapSec]; + PrintTextOnWindow(1, 1, sFlyMap->regionMap.mapSecName, 0, 1, 0, NULL); + name = gUnknown_085A1EDC[i].name[sFlyMap->regionMap.posWithinMapSec]; PrintTextOnWindow(1, 1, name, GetStringRightAlignXOffset(1, name, 0x60), 0x11, 0, NULL); schedule_bg_copy_tilemap_to_vram(0); gUnknown_03001180 = TRUE; @@ -1715,7 +1717,7 @@ static void sub_8124904(void) { FillWindowPixelBuffer(0, 0x11); } - PrintTextOnWindow(0, 1, gUnknown_0203A148->regionMap.mapSecName, 0, 1, 0, NULL); + PrintTextOnWindow(0, 1, sFlyMap->regionMap.mapSecName, 0, 1, 0, NULL); schedule_bg_copy_tilemap_to_vram(0); gUnknown_03001180 = FALSE; } @@ -1739,8 +1741,8 @@ static void sub_8124A70(void) { struct SpriteSheet sheet; - LZ77UnCompWram(sUnknown_085A1D68, gUnknown_0203A148->unk_88c); - sheet.data = gUnknown_0203A148->unk_88c; + LZ77UnCompWram(sUnknown_085A1D68, sFlyMap->unk_88c); + sheet.data = sFlyMap->unk_88c; sheet.size = 0x1c0; sheet.tag = 2; LoadSpriteSheet(&sheet); @@ -1829,7 +1831,7 @@ static void sub_8124BE4(void) static void sub_8124CBC(struct Sprite *sprite) { - if (gUnknown_0203A148->regionMap.mapSecId == sprite->data[0]) + if (sFlyMap->regionMap.mapSecId == sprite->data[0]) { if (++sprite->data[1] > 16) { @@ -1846,11 +1848,11 @@ static void sub_8124CBC(struct Sprite *sprite) static void sub_8124D14(void) { - switch (gUnknown_0203A148->unk_004) + switch (sFlyMap->unk_004) { case 0: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gUnknown_0203A148->unk_004++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + sFlyMap->unk_004++; break; case 1: if (!UpdatePaletteFade()) @@ -1863,7 +1865,7 @@ static void sub_8124D14(void) static void sub_8124D64(void) { - if (gUnknown_0203A148->unk_004 == 0) + if (sFlyMap->unk_004 == 0) { switch (sub_81230AC()) { @@ -1875,16 +1877,16 @@ static void sub_8124D64(void) sub_8124904(); break; case INPUT_EVENT_A_BUTTON: - if (gUnknown_0203A148->regionMap.iconDrawType == MAPSECTYPE_CITY_CANFLY || gUnknown_0203A148->regionMap.iconDrawType == MAPSECTYPE_BATTLE_FRONTIER) + if (sFlyMap->regionMap.iconDrawType == MAPSECTYPE_CITY_CANFLY || sFlyMap->regionMap.iconDrawType == MAPSECTYPE_BATTLE_FRONTIER) { m4aSongNumStart(SE_SELECT); - gUnknown_0203A148->unk_a72 = TRUE; + sFlyMap->unk_a72 = TRUE; sub_81248F4(sub_8124E0C); } break; case INPUT_EVENT_B_BUTTON: m4aSongNumStart(SE_SELECT); - gUnknown_0203A148->unk_a72 = FALSE; + sFlyMap->unk_a72 = FALSE; sub_81248F4(sub_8124E0C); break; } @@ -1893,40 +1895,40 @@ static void sub_8124D64(void) static void sub_8124E0C(void) { - switch (gUnknown_0203A148->unk_004) + switch (sFlyMap->unk_004) { case 0: - BeginNormalPaletteFade(-1, 0, 0, 16, 0); - gUnknown_0203A148->unk_004++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + sFlyMap->unk_004++; break; case 1: if (!UpdatePaletteFade()) { FreeRegionMapIconResources(); - if (gUnknown_0203A148->unk_a72) + if (sFlyMap->unk_a72) { - switch (gUnknown_0203A148->regionMap.mapSecId) + switch (sFlyMap->regionMap.mapSecId) { case MAPSEC_SOUTHERN_ISLAND: - sub_8084CCC(0x15); + sub_8084CCC(HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR); break; case MAPSEC_BATTLE_FRONTIER: - sub_8084CCC(0x16); + sub_8084CCC(HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST); break; case MAPSEC_LITTLEROOT_TOWN: - sub_8084CCC(gSaveBlock2Ptr->playerGender == MALE ? 0x0C : 0x0D); + sub_8084CCC(gSaveBlock2Ptr->playerGender == MALE ? HEAL_LOCATION_LITTLEROOT_TOWN_1 : HEAL_LOCATION_LITTLEROOT_TOWN_2); break; case MAPSEC_EVER_GRANDE_CITY: - sub_8084CCC(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && gUnknown_0203A148->regionMap.posWithinMapSec == 0 ? 0x14 : 0x0B); + sub_8084CCC(FlagGet(FLAG_LANDMARK_POKEMON_LEAGUE) && sFlyMap->regionMap.posWithinMapSec == 0 ? HEAL_LOCATION_EVER_GRANDE_CITY_2 : HEAL_LOCATION_EVER_GRANDE_CITY_1); break; default: - if (sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][2] != 0) + if (sMapHealLocations[sFlyMap->regionMap.mapSecId][2] != 0) { - sub_8084CCC(sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][2]); + sub_8084CCC(sMapHealLocations[sFlyMap->regionMap.mapSecId][2]); } else { - warp1_set_2(sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][0], sUnknown_085A1E3C[gUnknown_0203A148->regionMap.mapSecId][1], -1); + warp1_set_2(sMapHealLocations[sFlyMap->regionMap.mapSecId][0], sMapHealLocations[sFlyMap->regionMap.mapSecId][1], -1); } break; } @@ -1936,10 +1938,10 @@ static void sub_8124E0C(void) { SetMainCallback2(sub_81B58A8); } - if (gUnknown_0203A148 != NULL) + if (sFlyMap != NULL) { - free(gUnknown_0203A148); - gUnknown_0203A148 = NULL; + free(sFlyMap); + sFlyMap = NULL; } FreeAllWindowBuffers(); } diff --git a/src/reset_rtc_screen.c b/src/reset_rtc_screen.c index 9bd462b60..416a8da9d 100644 --- a/src/reset_rtc_screen.c +++ b/src/reset_rtc_screen.c @@ -552,7 +552,7 @@ static void Task_ResetRtcScreen(u8 taskId) switch (data[0]) { case 0: - BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF); data[0] = 1; break; case 1: @@ -621,7 +621,7 @@ static void Task_ResetRtcScreen(u8 taskId) case 5: if (gMain.newKeys & A_BUTTON) { - BeginNormalPaletteFade(-1, 1, 0, 0x10, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0, 0x10, 0xFFFF); data[0] = 6; } else diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 45f0f5a9e..60580ef2d 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -11,6 +11,7 @@ #include "link.h" #include "sprite.h" #include "constants/species.h" +#include "constants/trainers.h" #include "battle_interface.h" #include "battle_anim.h" #include "data2.h" @@ -26,8 +27,7 @@ extern u16 gBattle_BG3_Y; extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[]; -extern void sub_806A068(u16 species, u8 battlerPosition); -extern void sub_806A12C(u16 backPicId, u8 battlerPosition); +extern void SetMultiuseSpriteTemplateToTrainerBack(u16 backPicId, u8 battlerPosition); // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); @@ -58,7 +58,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void) { case 0: ScanlineEffect_Clear(); - sub_8035658(); + BattleInitBgsAndWindows(); SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0); SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0); ShowBg(0); @@ -144,20 +144,20 @@ static void CB2_ReshowBattleScreenAfterMenu(void) break; case 19: { - u8 opponentBank; + u8 opponentBattler; u16 species; LoadAndCreateEnemyShadowSprites(); - opponentBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBank]], MON_DATA_SPECIES); - SetBattlerShadowSpriteCallback(opponentBank, species); + opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES); + SetBattlerShadowSpriteCallback(opponentBattler, species); if (IsDoubleBattle()) { - opponentBank = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBank]], MON_DATA_SPECIES); - SetBattlerShadowSpriteCallback(opponentBank, species); + opponentBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBattler]], MON_DATA_SPECIES); + SetBattlerShadowSpriteCallback(opponentBattler, species); } ActionSelectionCreateCursorAt(gActionSelectionCursor[gBattlerInMenuId], 0); @@ -204,10 +204,10 @@ static bool8 LoadBattlerSpriteGfx(u8 battler) else BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE); } - else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == 0) + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, battler); - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == 0) - DecompressTrainerBackPic(BACK_PIC_WALLY, battler); + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) // Should be checking position, not battler. + DecompressTrainerBackPic(TRAINER_BACK_PIC_WALLY, battler); else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); else @@ -234,8 +234,8 @@ static void CreateBattlerSprite(u8 battler) if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) return; - sub_806A068(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); - gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler)); + SetMultiuseSpriteTemplateToPokemon(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; @@ -245,21 +245,21 @@ static void CreateBattlerSprite(u8 battler) if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_CASTFORM) gSprites[gBattlerSpriteIds[battler]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM]; } - else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == 0) + else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) { - sub_806A12C(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT)); - gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, 0x50, + SetMultiuseSpriteTemplateToTrainerBack(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50, (8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80, sub_80A82E4(0)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; } - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == 0) + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) { - sub_806A12C(BACK_PIC_WALLY, GetBattlerPosition(0)); - gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, 0x50, - (8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords) * 4 + 80, + SetMultiuseSpriteTemplateToTrainerBack(TRAINER_BACK_PIC_WALLY, GetBattlerPosition(0)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, 0x50, + (8 - gTrainerBackPicCoords[TRAINER_BACK_PIC_WALLY].coords) * 4 + 80, sub_80A82E4(0)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; @@ -270,8 +270,8 @@ static void CreateBattlerSprite(u8 battler) if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0) return; - sub_806A068(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); - gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler)); + SetMultiuseSpriteTemplateToPokemon(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler)); gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; gSprites[gBattlerSpriteIds[battler]].data[0] = battler; @@ -292,9 +292,9 @@ static void CreateHealthboxSprite(u8 battler) { u8 healthboxSpriteId; - if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == 0) + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == B_POSITION_PLAYER_LEFT) healthboxSpriteId = CreateSafariPlayerHealthboxSprites(); - else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == 0) + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == B_POSITION_PLAYER_LEFT) return; else healthboxSpriteId = CreateBattlerHealthboxSprites(battler); diff --git a/src/rom6.c b/src/rom6.c new file mode 100644 index 000000000..cc146fc94 --- /dev/null +++ b/src/rom6.c @@ -0,0 +1,210 @@ +#include "global.h" +#include "constants/event_objects.h" +#include "constants/songs.h" +#include "rom6.h" +#include "braille_puzzles.h" +#include "event_data.h" +#include "event_scripts.h" +#include "field_effect.h" +#include "event_object_movement.h" +#include "field_player_avatar.h" +#include "item_use.h" +#include "party_menu.h" +#include "overworld.h" +#include "script.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "constants/map_types.h" + +// static functions +static void task08_080C9820(u8 taskId); +static void sub_8135578(u8 taskId); +static void sub_813552C(u8 taskId); +static void sub_813561C(u8 taskId); +static void sub_81356C4(void); +static void sub_8135714(void); +static void hm2_dig(void); +static void sub_8135780(void); + +// extern RAM loc +extern struct MapPosition gPlayerFacingPosition; + +// text +bool8 CheckObjectGraphicsInFrontOfPlayer(u8 a) +{ + u8 eventObjId; + + GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + gPlayerFacingPosition.height = PlayerGetZCoord(); + eventObjId = GetEventObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height); + if (gEventObjects[eventObjId].graphicsId != a) + { + return FALSE; + } + else + { + gSpecialVar_LastTalked = gEventObjects[eventObjId].localId; + return TRUE; + } +} + +u8 oei_task_add(void) +{ + GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + return CreateTask(task08_080C9820, 8); +} + +static void task08_080C9820(u8 taskId) +{ + u8 eventObjId; + + ScriptContext2_Enable(); + gPlayerAvatar.preventStep = TRUE; + eventObjId = gPlayerAvatar.eventObjectId; + if (!EventObjectIsMovementOverridden(&gEventObjects[eventObjId]) + || EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId])) + { + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) + { + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + gTasks[taskId].func = sub_8135578; + } + else + { + sub_808C114(); + EventObjectSetHeldMovement(&gEventObjects[eventObjId], 0x39); + gTasks[taskId].func = sub_813552C; + } + } +} + +static void sub_813552C(u8 taskId) +{ + if (EventObjectCheckHeldMovementStatus(&gEventObjects[gPlayerAvatar.eventObjectId]) == TRUE) + { + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + gTasks[taskId].func = sub_8135578; + } +} + +static void sub_8135578(u8 taskId) +{ + if (!FieldEffectActiveListContains(6)) + { + gFieldEffectArguments[1] = GetPlayerFacingDirection(); + if (gFieldEffectArguments[1] == 1) + gFieldEffectArguments[2] = 0; + if (gFieldEffectArguments[1] == 2) + gFieldEffectArguments[2] = 1; + if (gFieldEffectArguments[1] == 3) + gFieldEffectArguments[2] = 2; + if (gFieldEffectArguments[1] == 4) + gFieldEffectArguments[2] = 3; + EventObjectSetGraphicsId(&gEventObjects[gPlayerAvatar.eventObjectId], GetPlayerAvatarGraphicsIdByCurrentState()); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); + FieldEffectActiveListRemove(6); + gTasks[taskId].func = sub_813561C; + } +} + +static void sub_813561C(u8 taskId) +{ + void (*func)(void) = (void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]); + + func(); + gPlayerAvatar.preventStep = FALSE; + DestroyTask(taskId); +} + +bool8 SetUpFieldMove_RockSmash(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gSpecialVar_Result = GetCursorSelectionMonId(); + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = sub_8179834; + return TRUE; + } + else if (CheckObjectGraphicsInFrontOfPlayer(EVENT_OBJ_GFX_BREAKABLE_ROCK) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = sub_81356C4; + return TRUE; + } + else + { + return FALSE; + } +} + +static void sub_81356C4(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext1_SetupScript(Route111_EventScript_2907F0); +} + +bool8 FldEff_UseRockSmash(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_8135714 >> 16; + gTasks[taskId].data[9] = (u32)sub_8135714; + IncrementGameStat(GAME_STAT_USED_ROCK_SMASH); + return FALSE; +} + +static void sub_8135714(void) +{ + PlaySE(SE_W088); + FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH); + EnableBothScriptContexts(); +} + +bool8 SetUpFieldMove_Dig(void) +{ + if (CanUseEscapeRopeOnCurrMap() == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = hm2_dig; + return TRUE; + } + else + { + return FALSE; + } +} + +static void hm2_dig(void) +{ + Overworld_ResetStateAfterDigEscRope(); + FieldEffectStart(FLDEFF_USE_DIG); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 FldEff_UseDig(void) +{ + u8 taskId = oei_task_add(); + + gTasks[taskId].data[8] = (u32)sub_8135780 >> 16; + gTasks[taskId].data[9] = (u32)sub_8135780; + if (!ShouldDoBrailleDigEffect()) + SetPlayerAvatarTransitionFlags(1); + return FALSE; +} + +static void sub_8135780(void) +{ + u8 taskId; + + FieldEffectActiveListRemove(FLDEFF_USE_DIG); + if (ShouldDoBrailleDigEffect()) + { + DoBrailleDigEffect(); + } + else + { + taskId = CreateTask(task08_080A1C44, 8); + gTasks[taskId].data[0] = 0; + } +} diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c index 9076b611a..55e3fe32b 100644 --- a/src/rom_8011DC0.c +++ b/src/rom_8011DC0.c @@ -1,18 +1,3264 @@ - -// Includes #include "global.h" +#include "window.h" +#include "bg.h" +#include "string_util.h" +#include "task.h" +#include "event_data.h" +#include "link.h" +#include "link_rfu.h" +#include "librfu.h" +#include "malloc.h" +#include "menu.h" +#include "list_menu.h" +#include "menu_helpers.h" +#include "script.h" +#include "sound.h" +#include "constants/songs.h" +#include "constants/game_stat.h" +#include "constants/maps.h" +#include "constants/species.h" +#include "constants/rgb.h" +#include "trade.h" +#include "trainer_card.h" +#include "overworld.h" +#include "battle.h" +#include "load_save.h" +#include "cable_club.h" +#include "field_control_avatar.h" +#include "party_menu.h" +#include "field_weather.h" +#include "palette.h" +#include "decompress.h" +#include "start_menu.h" +#include "data2.h" +#include "field_screen.h" + +extern void HealPlayerParty(void); + +struct UnkStruct_Shared +{ + struct UnkLinkRfuStruct_02022B14 field_0; + u8 needingPadding[3]; + u8 playerName[PLAYER_NAME_LENGTH]; +}; + +struct UnkStruct_x1C +{ + struct UnkStruct_Shared unk0; + u8 unk18; +}; + +struct UnkStruct_x20 +{ + struct UnkStruct_Shared unk; + u16 field_18; + u8 field_1A_0:2; + u8 field_1A_1:1; + u8 field_1B; + u8 field_1D; + u8 field_1E; + u8 field_1F; +}; + +struct UnkStruct_Main0 +{ + struct UnkStruct_x20 arr[5]; +}; + +struct UnkStruct_Main4 +{ + struct UnkStruct_x1C arr[5]; +}; + +struct UnkStruct_Main8 +{ + struct UnkStruct_x20 arr[5]; +}; + +struct UnkStruct_Leader +{ + struct UnkStruct_Main0 *field_0; + struct UnkStruct_Main4 *field_4; + struct UnkStruct_Main8 *field_8; + u8 state; + u8 textState; + u8 field_E; + u8 listWindowId; + u8 field_10; + u8 field_11; + u8 listTaskId; + u8 field_13; + u8 field_14; + u8 field_15; + u8 field_16; + u8 field_17; + u8 field_18; + u8 field_19; + u16 field_1A; +}; + +struct UnkStruct_Group +{ + struct UnkStruct_Main0 *field_0; + struct UnkStruct_Main4 *field_4; + u8 state; + u8 textState; + u8 field_A; + u8 listWindowId; + u8 field_C; + u8 field_D; + u8 listTaskId; + u8 field_F; + u8 field_10; + u8 field_11; + u8 field_12; + u8 field_13; + u8 field_14; + u8 field_15; +}; + +struct UnkStruct_8019BA8 +{ + u8 field_0; + u8 field_1; + u8 field_2; + u8 field_3; +}; + +struct UnkStruct_URoom +{ + struct UnkStruct_Main0 *field_0; + struct UnkStruct_Main4 *field_4; + struct UnkStruct_Main0 *field_8; + struct UnkStruct_Main4 *field_C; + u16 field_10; + u16 field_12; + u8 state; + u8 stateAfterPrint; + u8 textState; + u8 field_17; + u8 field_18; + u8 field_19; + u8 field_1A; + u8 field_1B; + u8 field_1C; + u8 field_1D; + u8 field_1E; + u8 field_1F; + u8 field_20; + u8 spriteIds[40]; + u8 field_49; + u8 field_4A; + u16 field_4C[6]; + u8 field_58[0x98 - 0x58]; + u16 field_98; + u16 field_9A; + u16 field_9C; + u16 field_9E; + struct UnkStruct_8019BA8 field_A0[8]; +}; -// Static type declarations +union UnkUnion_Main +{ + struct UnkStruct_Leader *leader; + struct UnkStruct_Group *group; + struct UnkStruct_URoom *uRoom; +}; -// Static RAM declarations -IWRAM_DATA u32 gUnknown_03000DA0; -IWRAM_DATA u32 gUnknown_03000DA4; -IWRAM_DATA void *gUnknown_03000DA8; +struct TradeUnkStruct +{ + u16 field_0; + u16 field_2; + u32 field_4; + u8 field_8; + u8 field_9; + u16 field_A; + u16 field_C; + u16 species; + u16 level; + u16 field_12; + u32 personality; +}; + +extern struct TradeUnkStruct gUnknown_02022C40; + +extern union UnkUnion_Main gUnknown_02022C30; + +extern u8 gUnknown_02022C2C; +extern u8 gUnknown_02022C2D; +extern u8 gUnknown_02022C3E; +extern u16 gUnknown_02022C3C; +extern struct UnkLinkRfuStruct_02022B14Substruct gUnknown_02022C38; + +extern u8 gFieldLinkPlayerCount; +extern u8 gUnknown_03005DB4; + +// IWRAM vars +IWRAM_DATA struct UnkStruct_Leader *gUnknown_03000DA0; +IWRAM_DATA struct UnkStruct_Group *gUnknown_03000DA4; +IWRAM_DATA struct UnkStruct_URoom *gUnknown_03000DA8; IWRAM_DATA void *gUnknown_03000DAC; IWRAM_DATA bool32 gUnknown_03000DB0; -// Static ROM declarations +// this file's functions +void sub_80173E0(u8 windowId, u8 arg1, const u8 *str, u8 arg3, u8 arg4, u8 arg5); +u16 ReadAsU16(const u8 *ptr); +void sub_8012780(u8 taskId); +void sub_80134E8(u8 taskId); +void sub_8013C7C(u8 taskId); +void sub_8014A40(u8 taskId); +void sub_8014F48(u8 taskId); +void sub_80152F4(u8 taskId); +void sub_80156E0(u8 taskId); +void sub_80175EC(struct UnkStruct_Main4 *arg0, u8 count); +void sub_8017580(struct UnkStruct_Main0 *arg0, u8 count); +u8 sub_8016FC0(struct UnkStruct_Main4 *arg0, u32 arg1); +u8 sub_8016FF0(struct UnkStruct_Main4 *arg0, u32 arg1); +bool8 PrintOnTextbox(u8 *textState, const u8 *str); +bool8 sub_801320C(struct UnkStruct_Leader *data, u32 arg1, u32 arg2); +u8 sub_8013398(struct UnkStruct_Main0 *arg0); +s8 sub_80170B8(u8 *arg0, bool32 arg1); +void sub_8018404(u8 *dest, struct UnkStruct_x20 *arg1); +void sub_8012F64(struct UnkStruct_Leader *data); +void sub_80149C4(void); +u8 sub_80132D4(struct UnkStruct_Main0 *arg0); +void sub_80178A0(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); +u32 sub_80176E4(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1); +u8 sub_8017734(struct UnkStruct_x20 *arg0, struct UnkStruct_Shared *arg1, u8 arg2); +u8 sub_8013E44(void); +u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id); +void sub_8013BD8(struct UnkStruct_Group *arg0, s32 id); +void sub_80173D4(void); +void sub_80177B8(u8 arg0, u8 arg1, u8 arg2, struct UnkStruct_x20 *arg3, u8 arg4, u8 id); +bool32 sub_8017678(struct UnkStruct_x20 *arg0, struct UnkStruct_x1C *arg1); +u32 sub_8018120(struct TradeUnkStruct *arg0, u8 multiplayerId); +void sub_801807C(struct TradeUnkStruct *arg0); +void sub_801B940(void); +void sub_801B94C(u16); +u16 sub_801B39C(void); +void sub_801AC54(void); +void sub_801DD98(void); +void sub_802A9A8(u8 monId, MainCallback callback); +void sub_802493C(u8 monId, MainCallback callback); +void sub_8020C70(MainCallback callback); +void sub_80149D8(void); +u16 sub_8019930(void); +void sub_8018784(u8 windowId); +void sub_8018884(const u8 *src); +bool32 mevent_0814257C(u8 *textState, const u8 *str); +s8 sub_8018B08(u8 *textState, u8 *arg1, u8 arg2, const u8 *str); +bool32 sub_8016F1C(struct UnkStruct_x20 *arg0, s16 arg1); +u8 sub_8016DF0(struct UnkStruct_Main4 *arg0, struct UnkStruct_Main4 *arg1, u32 arg2); +void sub_8019F2C(void); +void sub_8019E70(u8 *arg0, s32 arg1); +bool32 sub_80180A0(u8 monId, struct TradeUnkStruct *arg1); +void sub_80180E8(u8 monId, struct TradeUnkStruct *arg1); +bool32 sub_801A2A8(struct UnkStruct_Main0 *arg0, s16 *arg1, s16 *arg2, u8 *arg3); +void sub_80181CC(void); +bool32 sub_8017940(void); +u8 sub_8016B00(void); +void sub_801A274(struct UnkStruct_URoom *arg0); +void sub_801A284(struct UnkStruct_URoom *arg0); +bool32 sub_8017FD8(struct UnkStruct_URoom *arg0); +void sub_801689C(struct UnkStruct_URoom *arg0); +u8 sub_80181DC(struct UnkStruct_URoom *arg0); +bool32 sub_80168DC(struct UnkStruct_URoom *arg0); +bool32 sub_801704C(void); +u32 sub_8017CF8(u32 arg1, struct UnkStruct_Main0 *arg0); +s32 sub_80179D4(struct UnkStruct_Main0 *arg0, u8 arg1, u8 arg2, u32 playerGender); +void sub_801818C(bool32 arg0); +void sub_801A3D0(u32 arg0, u32 arg1, struct UnkStruct_Main0 *arg2); +s32 sub_8017178(u8 *arg0, u8 *arg1, u8 *arg2, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate); +s32 sub_80172A0(u8 *arg0, u8 *arg1, u8 *arg2, u8 *arg3, const struct WindowTemplate *winTemplate, const struct ListMenuTemplate *menuTemplate, struct UnkStruct_Main0 *arg6); +bool32 sub_8018024(void); +u32 sub_8017984(u32 arg0); +void sub_8018220(u8 *unused, struct UnkStruct_URoom *arg1, bool8 arg2); +void sub_8017D9C(u8 *dst, u32 arg1, u32 playerGender); +u32 sub_80179AC(struct UnkStruct_x20 *arg0); +void sub_8017E00(u8 *dst, u8 arg1); +void sub_8019F04(u8 *spriteIds); +void sub_8019E3C(void); +void sub_80173B0(void); +s32 sub_8017D04(u32 type, u32 species); +void sub_8017020(const u8 *src); +void sub_8019BA8(); + +// const rom data +extern const u8 *const gUnknown_082EDB60[][5]; + +extern const u8 gText_UnkCtrlCodeF907[]; +extern const u8 gUnknown_082EDBC4[]; +extern const u8 gText_AwaitingCommunication[]; +extern const u8 gText_AwaitingLink[]; +extern const u8 gUnknown_082EDC5C[]; +extern const u8 gUnknown_082EDC9C[]; +extern const u8 gUnknown_082EDC78[]; +extern const u8 gUnknown_082EDD58[]; +extern const u8 gUnknown_082EDBE8[]; +extern const u8 gUnknown_082EDC0C[]; +extern const u8 gUnknown_082EDC34[]; +extern const u8 gUnknown_082EE560[]; +extern const u8 gUnknown_082EE57C[]; +extern const u8 gUnknown_082EFC54[]; +extern const u8 gUnknown_082EFC3C[]; +extern const u8 gUnknown_082EDE0C[]; +extern const u8 gUnknown_082EDDF4[]; +extern const u8 gUnknown_082EF7DC[]; +extern const u8 gUnknown_082EDE48[]; +extern const u8 gUnknown_082EDE64[]; +extern const u8 gUnknown_082EDF40[]; +extern const u8 gText_PleaseStartOver[]; +extern const u8 gUnknown_082EF7F8[]; +extern const u8 gUnknown_082EFBC8[]; +extern const u8 gUnknown_082EFC90[]; +extern const u8 gUnknown_082EDEC4[]; +extern const u8 gUnknown_082EDF04[]; +extern const u8 gText_WirelessSearchCanceled[]; +extern const u8 gUnknown_082EF4FC[]; +extern const u8 gUnknown_082EF520[]; +extern const u8 gUnknown_082EF5B8[]; +extern const u8 gUnknown_082EF1EC[]; +extern const u8 gUnknown_082EF544[]; +extern const u8 gUnknown_082EF47C[]; +extern const u8 gUnknown_082EE6C8[]; +extern const u8 gUnknown_082EE004[]; +extern const u8 gUnknown_082EEBD0[]; +extern const u8 gUnknown_082EEB88[]; +extern const u8 gUnknown_082EE598[]; +extern const u8 gUnknown_082EEC14[]; +extern const u8 gUnknown_082EF590[]; +extern const u8 gUnknown_082EF20C[]; +extern const u8 gUnknown_082EF564[]; +extern const u8 gUnknown_082EF4C4[]; +extern const u8 gUnknown_082EF298[]; +extern const u8 gUnknown_082EF65C[]; +extern const u8 gUnknown_082EF6E4[]; +extern const u8 gUnknown_082EF718[]; + +extern const u32 gUnknown_082F00C4[]; + +extern const u8 gUnknown_082F0530[]; + +extern const struct WindowTemplate gUnknown_082F00BC; +extern const struct WindowTemplate gUnknown_082F0124; +extern const struct WindowTemplate gUnknown_082F012C; +extern const struct WindowTemplate gUnknown_082F011C; +extern const struct WindowTemplate gUnknown_082F0174; +extern const struct WindowTemplate gUnknown_082F017C; +extern const struct WindowTemplate gUnknown_082F021C; +extern const struct WindowTemplate gUnknown_082F025C; +extern const struct WindowTemplate gUnknown_082F0294; +extern const struct WindowTemplate gUnknown_082F034C; + +extern const struct ListMenuTemplate gUnknown_082F015C; +extern const struct ListMenuTemplate gUnknown_082F0204; +extern const struct ListMenuTemplate gUnknown_082F0244; +extern const struct ListMenuTemplate gUnknown_082F027C; +extern const struct ListMenuTemplate gUnknown_082F032C; +extern const struct ListMenuTemplate gUnknown_082F03A4; + +extern const u8 *const gUnknown_082F0048[]; +extern const u8 *const gUnknown_082EDDC4[]; +extern const u8 *const gUnknown_082EFB70[]; +extern const u8 *const gUnknown_082EDD50[]; +extern const u8 *const gUnknown_082EDE9C[]; +extern const u8 *const gUnknown_082EDF80[]; +extern const u8 *const gUnknown_082EFD58[]; +extern const u8 *const gUnknown_082EEB80[]; +extern const u8 *const gUnknown_082EE378[]; +extern const u8 *const gUnknown_082EEC9C[]; +extern const u8 *const gUnknown_082EED3C[]; +extern const u8 *const gUnknown_082EE324[]; +extern const u8 *const gUnknown_082EE17C[]; + +extern const u8 *const gUnknown_082EE82C[][4]; + +extern const u8 *const gUnknown_082EE24C[][2]; + +extern const struct UnkStruct_Shared gUnknown_082F045C[]; + +// code +void nullsub_89(void) +{ + +} + +void sub_80124EC(u8 windowId, u8 arg1, u8 stringId) +{ + FillWindowPixelBuffer(windowId, 0x11); + switch (arg1 << 8) + { + case 0x200: + sub_80173E0(windowId, 1, gUnknown_082EDB60[0][stringId - 1], 0, 1, 0); + break; + case 0x400: + sub_80173E0(windowId, 1, gUnknown_082EDB60[1][stringId - 1], 0, 1, 0); + break; + case 0x2500: + sub_80173E0(windowId, 1, gUnknown_082EDB60[2][stringId - 1], 0, 1, 0); + break; + case 0x3500: + sub_80173E0(windowId, 1, gUnknown_082EDB60[3][stringId - 1], 0, 1, 0); + break; + case 0x2400: + sub_80173E0(windowId, 1, gUnknown_082EDB60[4][stringId - 1], 0, 1, 0); + break; + } + + CopyWindowToVram(windowId, 2); +} + +void sub_80125BC(u8 windowId) +{ + u8 text[30]; + u8 *txtPtr; + + sub_80173E0(windowId, 1, gSaveBlock2Ptr->playerName, 0, 1, 0); + txtPtr = StringCopy(text, gText_UnkCtrlCodeF907); + ConvertIntToDecimalStringN(txtPtr, ReadAsU16(gSaveBlock2Ptr->playerTrainerId), STR_CONV_MODE_LEADING_ZEROS, 5); + sub_80173E0(windowId, 1, text, 0, 0x11, 0); +} + +void sub_801262C(u8 *dst, u8 caseId) +{ + switch (caseId) + { + case 1 ... 4: + case 9 ... 11: + case 14 ... 16: + case 21 ... 28: + // UB: argument *dst isn't used, instead it always prints to gStringVar4 + StringExpandPlaceholders(gStringVar4, gText_AwaitingCommunication); + break; + } +} + +bool32 sub_80126CC(u32 caseId) +{ + switch (caseId) + { + case 9 ... 11: + case 15 ... 16: + case 23 ... 27: + return TRUE; + default: + return FALSE; + } +} + +void BerryBlenderLinkBecomeLeader(void) +{ + u8 taskId; + struct UnkStruct_Leader *dataPtr; + + taskId = CreateTask(sub_8012780, 0); + gUnknown_02022C30.leader = dataPtr = (void*)(gTasks[taskId].data); + gUnknown_03000DA0 = dataPtr; + + dataPtr->state = 0; + dataPtr->textState = 0; + gSpecialVar_Result = 0; +} + +void sub_8012780(u8 taskId) +{ + u32 id, val; + struct UnkStruct_Leader *data = gUnknown_02022C30.leader; + + switch (data->state) + { + case 0: + if (gSpecialVar_0x8004 == 20 && gSaveBlock2Ptr->frontier.chosenLvl == 1) + gSpecialVar_0x8004++; + gUnknown_02022C2C = gUnknown_082F00C4[gSpecialVar_0x8004]; + gUnknown_02022C2D = gUnknown_082F00C4[gSpecialVar_0x8004] >> 8; + sub_8010F84(gUnknown_02022C2C, 0, 0); + sub_800B488(); + OpenLink(); + sub_8011C10(gUnknown_02022C2D & 0xF); + data->state = 3; + break; + case 3: + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0xA0); + data->field_8 = AllocZeroed(0xA0); + sub_80175EC(data->field_4, 4); + sub_8017580(data->field_0, 5); + sub_800DF90(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName); + data->field_0->arr[0].field_18 = 0; + data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].field_1A_1 = 0; + data->field_0->arr[0].field_1B = 0; + data->field_17 = sub_8016FC0(data->field_4, 0xFF); + data->field_10 = AddWindow(&gUnknown_082F00BC); + switch (gUnknown_02022C2D & 0xF) + { + case 2: + case 3: + case 4: + data->listWindowId = AddWindow(&gUnknown_082F011C); + break; + case 5: + data->listWindowId = AddWindow(&gUnknown_082F0124); + break; + } + data->field_11 = AddWindow(&gUnknown_082F012C); + + FillWindowPixelBuffer(data->field_10, 0x22); + sub_80173E0(data->field_10, 0, gUnknown_082EDBC4, 8, 1, 4); + PutWindowTilemap(data->field_10); + CopyWindowToVram(data->field_10, 2); + + NewMenuHelpers_DrawStdWindowFrame(data->listWindowId, FALSE); + gMultiuseListMenuTemplate = gUnknown_082F015C; + gMultiuseListMenuTemplate.windowId = data->listWindowId; + data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + NewMenuHelpers_DrawStdWindowFrame(data->field_11, FALSE); + PutWindowTilemap(data->field_11); + CopyWindowToVram(data->field_11, 2); + + CopyBgTilemapBufferToVram(0); + data->field_13 = 1; + data->state = 4; + break; + case 4: + StringCopy(gStringVar1, gUnknown_082F0048[gUnknown_02022C2C]); + if ((gUnknown_02022C2D >> 4) != 0) + { + if (data->field_13 > (gUnknown_02022C2D >> 4) - 1 && (gUnknown_02022C2D & 0xF) != 0) + StringExpandPlaceholders(gStringVar4, gText_AwaitingLink); + else + StringExpandPlaceholders(gStringVar4, gText_AwaitingCommunication); + } + else + { + sub_801262C(gStringVar4, gUnknown_02022C2C); + } + + sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13); + data->state = 5; + break; + case 5: + if (PrintOnTextbox(&data->textState, gStringVar4)) + data->state = 6; + break; + case 6: + sub_801320C(data, 7, 10); + if (gMain.newKeys & B_BUTTON) + { + if (data->field_13 == 1) + data->state = 23; + else if ((gUnknown_02022C2D & 0xF0) != 0) + data->state = 30; + else + data->state = 19; + } + if ((gUnknown_02022C2D >> 4) != 0 + && data->field_13 > (gUnknown_02022C2D >> 4) - 1 + && (gUnknown_02022C2D & 0xF) != 0 + && sub_8012240() + && gMain.newKeys & START_BUTTON) + { + data->state = 15; + sub_800EF38(); + } + if (data->state == 6 && sub_80105EC()) + { + data->state = 9; + } + break; + case 9: + if (!sub_80105EC()) + { + data->state = 6; + data->field_13 = sub_8013398(data->field_0); + } + break; + case 10: + id = ((gUnknown_02022C2C & 0xF) == 2) ? 1 : 0; + if (PrintOnTextbox(&data->textState, gUnknown_082EDDC4[id])) + { + data->field_13 = sub_8013398(data->field_0); + RedrawListMenu(data->listTaskId); + data->state = 4; + } + break; + case 29: + id = ((gUnknown_02022C2D & 0xF) == 2) ? 0 : 1; + if (PrintOnTextbox(&data->textState, gUnknown_082EDDC4[id])) + { + data->state = 21; + } + break; + case 7: + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + data->state = 11; + } + break; + case 11: + switch (sub_80170B8(&data->textState, sub_801064C(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName))) + { + case 0: + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + data->field_19 = 5; + sub_8010688(5, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + data->state = 12; + break; + case 1: + case -1: + data->field_19 = 6; + sub_8010688(6, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + data->state = 12; + break; + case -3: + data->state = 9; + break; + } + break; + case 12: + val = sub_8010714(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + if (val == 1) + { + if (data->field_19 == 5) + { + data->field_0->arr[data->field_13].field_1B = 0; + RedrawListMenu(data->listTaskId); + data->field_13++; + if (data->field_13 == (gUnknown_02022C2D & 0xF)) + { + if ((gUnknown_02022C2D & 0xF0) != 0 || data->field_13 == 4) + { + data->state = 15; + } + else + { + sub_8018404(gStringVar1, &data->field_0->arr[data->field_13 - 1]); + StringExpandPlaceholders(gStringVar4, gUnknown_082EDC9C); + data->state = 13; + } + + sub_800EF38(); + sub_80124EC(data->field_11, gUnknown_02022C2D, data->field_13); + } + else + { + data->state = 4; + } + } + else + { + sub_8011DC0(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId)); + data->field_0->arr[data->field_13].field_1A_0 = 0; + sub_8013398(data->field_0); + RedrawListMenu(data->listTaskId); + data->state = 4; + } + + data->field_19 = 0; + } + else if (val == 2) + { + sub_8011A64(0, 0); + data->state = 4; + } + break; + case 13: + if (PrintOnTextbox(&data->textState, gStringVar4)) + data->state = 14; + break; + case 14: + if (++data->field_E > 120) + data->state = 17; + break; + case 15: + if (PrintOnTextbox(&data->textState, gUnknown_082EDC5C)) + data->state = 16; + break; + case 16: + switch (sub_80170B8(&data->textState, FALSE)) + { + case 0: + data->state = 17; + break; + case 1: + case -1: + if ((gUnknown_02022C2D & 0xF0) != 0) + data->state = 30; + else + data->state = 19; + break; + } + break; + case 19: + if (PrintOnTextbox(&data->textState, gUnknown_082EDC78)) + data->state = 20; + break; + case 20: + switch (sub_80170B8(&data->textState, FALSE)) + { + case 0: + data->state = 23; + break; + case 1: + case -1: + if ((gUnknown_02022C2D & 0xF0) != 0) + data->state = 15; + else if (data->field_13 == (gUnknown_02022C2D & 0xF)) + data->state = 15; + else + data->state = 4; + break; + } + break; + case 17: + if (!sub_801320C(data, 7, 29)) + data->state = 18; + break; + case 18: + if (sub_800EF1C()) + { + if (sub_800EF58(FALSE)) + { + data->state = 26; + } + else + { + if (++data->field_1A > 300) + { + data->state = 29; + data->textState = 0; + } + } + } + else + { + data->state = 29; + data->textState = 0; + } + break; + case 30: + if (PrintOnTextbox(&data->textState, gUnknown_082EDD58)) + data->state = 23; + break; + case 21: + case 23: + sub_800E084(); + sub_800EDD4(); + sub_8012F64(data); + data->state++; + break; + case 24: + EnableBothScriptContexts(); + DestroyTask(taskId); + gSpecialVar_Result = 5; + break; + case 22: + EnableBothScriptContexts(); + DestroyTask(taskId); + gSpecialVar_Result = 8; + break; + case 26: + if (sub_8011A80()) + { + data->state = 29; + } + else + { + if (gReceivedRemoteLinkPlayers != 0) + { + if (sub_80126CC(gUnknown_02022C2C)) + sub_801103C(); + sub_8011068(1); + sub_80149C4(); + sub_8012F64(data); + DestroyTask(taskId); + } + } + break; + } +} + +void sub_8012F64(struct UnkStruct_Leader *data) +{ + ClearWindowTilemap(data->field_11); + sub_819746C(data->field_11, FALSE); + DestroyListMenuTask(data->listTaskId, 0, 0); + ClearWindowTilemap(data->field_10); + sub_819746C(data->listWindowId, FALSE); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->field_11); + RemoveWindow(data->listWindowId); + RemoveWindow(data->field_10); + DestroyTask(data->field_17); + + Free(data->field_8); + Free(data->field_0); + Free(data->field_4); +} + +void sub_8012FC4(u8 *dst, u8 caseId) +{ + switch (caseId) + { + case 1: + case 2: + case 4: + case 14: + case 28: + StringExpandPlaceholders(dst, gUnknown_082EDBE8); + break; + case 21: + case 22: + StringExpandPlaceholders(dst, gUnknown_082EDC0C); + break; + case 3: + case 9: + case 10: + case 11: + case 15: + case 16: + case 23: + case 24: + case 25: + case 26: + case 27: + StringExpandPlaceholders(dst, gUnknown_082EDC34); + break; + } +} + +void sub_8013078(u8 *dst, u8 caseId) +{ + switch (caseId) + { + case 65: + case 68: + StringExpandPlaceholders(dst, gUnknown_082EE560); + break; + case 69: + case 72: + StringExpandPlaceholders(dst, gUnknown_082EE57C); + break; + } +} + +void sub_80130B4(u8 *dst, u8 caseId) +{ + switch (caseId) + { + case 1: + case 2: + case 4: + case 14: + case 21: + case 22: + case 28: + StringExpandPlaceholders(dst, gUnknown_082EFC3C); + break; + case 3: + case 9: + case 10: + case 11: + case 15: + case 16: + case 23: + case 24: + case 25: + case 26: + case 27: + StringExpandPlaceholders(dst, gUnknown_082EFC54); + break; + } +} + +void sub_8013160(u8 *dst, u8 caseId) +{ + switch (caseId) + { + case 1: + case 2: + case 4: + case 14: + case 21: + case 22: + case 28: + StringExpandPlaceholders(dst, gUnknown_082EDDF4); + break; + case 3: + case 9: + case 10: + case 11: + case 15: + case 16: + case 23: + case 24: + case 25: + case 26: + case 27: + StringExpandPlaceholders(dst, gUnknown_082EDE0C); + break; + } +} + +bool8 sub_801320C(struct UnkStruct_Leader *data, u32 arg1, u32 arg2) +{ + switch (sub_80132D4(data->field_0)) + { + case 1: + PlaySE(SE_PC_LOGIN); + RedrawListMenu(data->listTaskId); + sub_8018404(gStringVar2, &data->field_0->arr[data->field_13]); + sub_8012FC4(gStringVar4, gUnknown_02022C2C); + data->state = arg1; + break; + case 2: + sub_8011A64(0, 0); + RedrawListMenu(data->listTaskId); + data->state = arg2; + return TRUE; + } + + return FALSE; +} + +void sub_8013278(u8 arg0, u32 id, u8 arg2) +{ + struct UnkStruct_Leader *data = gUnknown_02022C30.leader; + u8 var = 0; + + switch (data->field_0->arr[id].field_1A_0) + { + case 1: + if (data->field_0->arr[id].field_1B != 0) + var = 2; + break; + case 2: + var = 1; + break; + } + + sub_80178A0(arg0, 0, arg2, &data->field_0->arr[id], var, id); +} + +u8 sub_80132D4(struct UnkStruct_Main0 *arg0) +{ + struct UnkStruct_Leader *data = gUnknown_02022C30.leader; + u8 ret = 0; + u8 i; + s32 id; + + for (i = 1; i < 5; i++) + { + u16 var = data->field_0->arr[i].field_1A_0; + if (var == 1) + { + id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr); + if (id != 0xFF) + { + data->field_0->arr[i].unk = data->field_4->arr[id].unk0; + data->field_0->arr[i].field_18 = var; + } + else + { + data->field_0->arr[i].field_1A_0 = 2; + ret = 2; + } + } + } + + for (id = 0; id < 4; id++) + sub_8017734(data->field_0->arr, &data->field_4->arr[id].unk0, 5); + + if (ret != 2) + { + for (id = 0; id < 5; id++) + { + if (data->field_0->arr[id].field_1B != 0) + ret = 1; + } + } + + return ret; +} + +u8 sub_8013398(struct UnkStruct_Main0 *arg0) +{ + struct UnkStruct_Leader *data = gUnknown_02022C30.leader; + u8 copiedCount; + s32 i; + u8 ret; + + for (i = 0; i < 5; i++) + data->field_8->arr[i] = data->field_0->arr[i]; + + copiedCount = 0; + for (i = 0; i < 5; i++) + { + if (data->field_8->arr[i].field_1A_0 == 1) + { + data->field_0->arr[copiedCount] = data->field_8->arr[i]; + copiedCount++; + } + } + + ret = copiedCount; + for (; copiedCount < 5; copiedCount++) + { + data->field_0->arr[copiedCount].unk = gUnknown_082F045C[0]; + data->field_0->arr[copiedCount].field_18 = 0; + data->field_0->arr[copiedCount].field_1A_0 = 0; + data->field_0->arr[copiedCount].field_1A_1 = 0; + data->field_0->arr[copiedCount].field_1B = 0; + } + + for (i = 0; i < 5; i++) + { + if (data->field_0->arr[i].field_1A_0 != 1) + continue; + if (data->field_0->arr[i].field_1B != 0x40) + continue; + + ret = i; + break; + } + + return ret; +} + +void BerryBlenderLinkJoinGroup(void) +{ + u8 taskId; + struct UnkStruct_Group *dataPtr; + + taskId = CreateTask(sub_80134E8, 0); + gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data); + gUnknown_03000DA4 = dataPtr; + + dataPtr->state = 0; + dataPtr->textState = 0; + gSpecialVar_Result = 0; +} + +void sub_80134E8(u8 taskId) +{ + s32 id; + struct UnkStruct_Group *data = gUnknown_02022C30.group; + + switch (data->state) + { + case 0: + if (gSpecialVar_0x8004 == 20 && gSaveBlock2Ptr->frontier.chosenLvl == 1) + gSpecialVar_0x8004++; + gUnknown_02022C2C = gUnknown_082F0530[gSpecialVar_0x8004]; + sub_8010F84(gUnknown_02022C2C, 0, 0); + sub_800B488(); + OpenLink(); + sub_8011C5C(); + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0x200); + data->state = 1; + break; + case 1: + if (PrintOnTextbox(&data->textState, gUnknown_082EFB70[gSpecialVar_0x8004])) + data->state = 2; + break; + case 2: + sub_80175EC(data->field_4, 4); + sub_8017580(data->field_0, 16); + data->field_11 = sub_8016FC0(data->field_4, gSpecialVar_0x8004); + data->field_C = AddWindow(&gUnknown_082F00BC); + data->listWindowId = AddWindow(&gUnknown_082F0174); + data->field_D = AddWindow(&gUnknown_082F017C); + + FillWindowPixelBuffer(data->field_C, 0x22); + sub_80173E0(data->field_C, 0, gUnknown_082EF7DC, 8, 1, 4); + PutWindowTilemap(data->field_C); + CopyWindowToVram(data->field_C, 2); + + NewMenuHelpers_DrawStdWindowFrame(data->listWindowId, FALSE); + gMultiuseListMenuTemplate = gUnknown_082F0204; + gMultiuseListMenuTemplate.windowId = data->listWindowId; + data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + NewMenuHelpers_DrawStdWindowFrame(data->field_D, FALSE); + PutWindowTilemap(data->field_D); + sub_80125BC(data->field_D); + CopyWindowToVram(data->field_D, 2); + + CopyBgTilemapBufferToVram(0); + data->field_F = 0; + data->state = 3; + break; + case 3: + id = sub_8013E44(); + switch (id) + { + case 1: + PlaySE(SE_PC_LOGIN); + RedrawListMenu(data->listTaskId); + break; + case 0: + id = ListMenuHandleInputGetItemId(data->listTaskId); + if (gMain.newKeys & A_BUTTON && id != -1) + { + // this unused variable along with the assignment is needed to match + u32 unusedVar; + unusedVar = data->field_0->arr[id].unk.field_0.unk_0a_0; + + if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.field_0.unk_0a_7) + { + u32 var = sub_8013B8C(data, id); + if (var == 0) + { + sub_8013BD8(data, id); + data->state = 5; + PlaySE(SE_PN_ON); + } + else + { + StringCopy(gStringVar4, gUnknown_082EDD50[var - 1]); + data->state = 18; + PlaySE(SE_PN_ON); + } + } + else + { + PlaySE(SE_WALL_HIT); + } + } + else if (gMain.newKeys & B_BUTTON) + { + data->state = 10; + } + break; + default: + RedrawListMenu(data->listTaskId); + break; + } + break; + case 5: + sub_80130B4(gStringVar4, gUnknown_02022C2C); + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]); + data->state = 6; + } + break; + case 6: + if (gReceivedRemoteLinkPlayers != 0) + { + gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.unk_0a_0; + sub_8011A64(0, 0); + switch (gUnknown_02022C2C) + { + case 1 ... 5: + case 9 ... 11: + case 13 ... 16: + case 21 ... 28: + data->state = 20; + return; + } + } + + switch (sub_8011A74()) + { + case 1: + data->state = 12; + break; + case 2: + case 6: + case 9: + data->state = 14; + break; + case 5: + sub_8013160(gStringVar4, gUnknown_02022C2C); + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + if (gUnknown_02022C2C == 28 || gUnknown_02022C2C == 14) + { + sub_8011A64(12, 0); + } + else + { + sub_8011A64(7, 0); + StringCopy(gStringVar1, gUnknown_082F0048[gUnknown_02022C2C]); + StringExpandPlaceholders(gStringVar4, gUnknown_082EDE48); + } + } + break; + case 7: + if (data->field_15 > 0xF0) + { + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + sub_8011A64(12, 0); + data->field_15 = 0; + } + } + else + { + switch (gUnknown_02022C2C) + { + case 1: + case 2: + case 4: + case 14: + case 28: + break; + default: + data->field_15++; + break; + } + } + break; + } + + if (!sub_8011A74() && gMain.newKeys & B_BUTTON) + data->state = 7; + break; + case 7: + if (PrintOnTextbox(&data->textState, gUnknown_082EDE64)) + data->state = 8; + break; + case 8: + switch (sub_80170B8(&data->textState, sub_8011A74())) + { + case 0: + sub_80106D4(); + data->state = 9; + RedrawListMenu(data->listTaskId); + break; + case 1: + case -1: + data->state = 5; + RedrawListMenu(data->listTaskId); + break; + case -3: + data->state = 6; + RedrawListMenu(data->listTaskId); + break; + } + break; + case 9: + if (sub_8011A74()) + data->state = 6; + break; + case 10: + case 12: + case 14: + case 18: + case 20: + ClearWindowTilemap(data->field_D); + sub_819746C(data->field_D, FALSE); + DestroyListMenuTask(data->listTaskId, 0, 0); + ClearWindowTilemap(data->field_C); + sub_819746C(data->listWindowId, FALSE); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->field_D); + RemoveWindow(data->listWindowId); + RemoveWindow(data->field_C); + DestroyTask(data->field_11); + Free(data->field_0); + Free(data->field_4); + data->state++; + break; + case 13: + sub_800E084(); + if (PrintOnTextbox(&data->textState, gUnknown_082EDE9C[sub_8011A74()])) + { + gSpecialVar_Result = 6; + data->state = 23; + } + break; + case 11: + sub_800E084(); + gSpecialVar_Result = 5; + data->state = 23; + break; + case 15: + sub_800E084(); + if (PrintOnTextbox(&data->textState, gUnknown_082EDE9C[sub_8011A74()])) + { + gSpecialVar_Result = 8; + data->state = 23; + } + break; + case 19: + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + gSpecialVar_Result = 8; + data->state = 23; + } + break; + case 23: + DestroyTask(taskId); + sub_80173D4(); + sub_800EDD4(); + break; + case 21: + sub_80149C4(); + DestroyTask(taskId); + break; + } +} + +u32 sub_8013B8C(struct UnkStruct_Group *arg0, s32 id) +{ + struct UnkStruct_x20 *structPtr = &arg0->field_0->arr[id]; + + if (gUnknown_02022C2C == 4 && structPtr->unk.field_0.unk_00.unk_01_2 != 3) + { + if (!(gSaveBlock2Ptr->specialSaveWarp & 0x80)) + return 1; + else if (structPtr->unk.field_0.unk_00.unk_00_7) + return 0; + } + else + { + return 0; + } + + return 2; +} + +void sub_8013BD8(struct UnkStruct_Group *data, s32 id) +{ + data->field_F = id; + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + RedrawListMenu(data->listTaskId); + sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]); + sub_8011090(gUnknown_082F0530[gSpecialVar_0x8004], 0, 1); + sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId)); +} + +u8 sub_8013C40(void) +{ + u8 taskId; + struct UnkStruct_Group *dataPtr; + + taskId = CreateTask(sub_8013C7C, 0); + gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data); + + dataPtr->state = 0; + dataPtr->textState = 0; + + gUnknown_03000DA4 = dataPtr; + + return taskId; +} + +void sub_8013C7C(u8 taskId) +{ + struct UnkStruct_Group *data = gUnknown_02022C30.group; + + switch (data->state) + { + case 0: + sub_8010F84(0, 0, 0); + sub_800B488(); + OpenLink(); + sub_8011C5C(); + sub_80111B0(TRUE); + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0x200); + data->state = 2; + break; + case 2: + sub_80175EC(data->field_4, 4); + sub_8017580(data->field_0, 16); + data->field_11 = sub_8016FC0(data->field_4, 0xFF); + data->field_F = 0; + data->state = 3; + break; + case 3: + if (sub_8013E44() == 1) + PlaySE(SE_PC_LOGIN); + if (gTasks[taskId].data[15] == 0xFF) + data->state = 10; + break; + case 10: + DestroyTask(data->field_11); + Free(data->field_0); + Free(data->field_4); + sub_800EDD4(); + data->state++; + break; + case 11: + sub_800EDD4(); + DestroyTask(taskId); + break; + } +} + +extern const u8 *const gUnknown_082F04D8[22]; + +bool32 sub_8013D88(u32 arg0, u32 id) +{ + if (id == 0xFF) + return TRUE; + + if (id <= ARRAY_COUNT(gUnknown_082F04D8)) // UB: <= may access data outside the array + { + const u8 *bytes = gUnknown_082F04D8[id]; + + while ((*(bytes) != 0xFF)) + { + if ((*bytes) == arg0) + return TRUE; + bytes++; + } + } + + return FALSE; +} + +u8 sub_8013DBC(struct UnkStruct_Group *data, u32 id) +{ + if (data->field_0->arr[id].field_1A_0 == 1) + { + if (data->field_0->arr[id].unk.field_0.unk_0a_7) + return 3; + else if (data->field_0->arr[id].field_1A_1 != 0) + return 1; + else if (data->field_0->arr[id].field_1B != 0) + return 2; + } + + return 0; +} + +void sub_8013DF4(u8 arg0, u32 id, u8 arg2) +{ + struct UnkStruct_Group *data = gUnknown_02022C30.group; + u8 var = sub_8013DBC(data, id); + + sub_80177B8(arg0, 8, arg2, &data->field_0->arr[id], var, id); +} + +u8 sub_8013E44(void) +{ + struct UnkStruct_Group *data = gUnknown_02022C30.group; + u8 ret = 0; + u8 i; + s32 id; + + for (i = 0; i < 16; i++) + { + if (data->field_0->arr[i].field_1A_0 != 0) + { + id = sub_80176E4(&data->field_0->arr[i], data->field_4->arr); + if (id != 0xFF) + { + if (data->field_0->arr[i].field_1A_0 == 1) + { + if (sub_8017678(&data->field_0->arr[i], &data->field_4->arr[id])) + { + data->field_0->arr[i].unk = data->field_4->arr[id].unk0; + data->field_0->arr[i].field_1B = 0x40; + ret = 1; + } + else + { + if (data->field_0->arr[i].field_1B != 0) + { + data->field_0->arr[i].field_1B--; + if (data->field_0->arr[i].field_1B == 0) + ret = 2; + } + } + } + else + { + data->field_0->arr[i].field_1A_0 = 1; + data->field_0->arr[i].field_1B = 0x40; + ret = 1; + } + + data->field_0->arr[i].field_18 = 0; + } + else + { + if (data->field_0->arr[i].field_1A_0 != 2) + { + data->field_0->arr[i].field_18++; + if (data->field_0->arr[i].field_18 >= 300) + { + data->field_0->arr[i].field_1A_0 = 2; + ret = 2; + } + } + } + } + } + + for (id = 0; id < 4; id++) + { + if (sub_8017734(data->field_0->arr, &data->field_4->arr[id].unk0, 16) != 0xFF) + ret = 1; + } + + return ret; +} + +void sub_8013F60(u8 taskId) +{ + sub_80773AC(); + DestroyTask(taskId); +} + +u8 sub_8013F78(void) +{ + u8 taskId = CreateTask(sub_8013F60, 0); + + return taskId; +} + +extern struct MailStruct gUnknown_020321C0[PARTY_SIZE]; +extern u8 gUnknown_02032298[2]; + +void sub_8013F90(u8 taskId) +{ + u32 monId = sub_8018120(&gUnknown_02022C40, GetMultiplayerId()); + + switch (gTasks[taskId].data[0]) + { + case 0: + gTasks[taskId].data[0]++; + SendBlock(0, &gPlayerParty[monId], sizeof(struct Pokemon)); + break; + case 1: + if (GetBlockReceivedStatus() == 3) + { + gEnemyParty[0] = *(struct Pokemon*)(gBlockRecvBuffer[GetMultiplayerId() ^ 1]); + IncrementGameStat(GAME_STAT_50); + ResetBlockReceivedFlags(); + gTasks[taskId].data[0]++; + } + break; + case 2: + memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, sizeof(struct MailStruct) * PARTY_SIZE + 4); + if (SendBlock(0, gBlockSendBuffer, sizeof(struct MailStruct) * PARTY_SIZE + 4)) + gTasks[taskId].data[0]++; + break; + case 3: + if (GetBlockReceivedStatus() == 3) + { + memcpy(gUnknown_020321C0, gBlockRecvBuffer[GetMultiplayerId() ^ 1], sizeof(struct MailStruct) * PARTY_SIZE); + ResetBlockReceivedFlags(); + gUnknown_02032298[0] = monId; + gUnknown_02032298[1] = 6; + gMain.savedCallback = CB2_ReturnToField; + SetMainCallback2(sub_807AE50); + sub_801807C(&gUnknown_02022C40); + DestroyTask(taskId); + } + break; + } +} + +void sub_80140E0(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 0: + if (GetMultiplayerId() == 0) + sub_800A4D8(2); + gTasks[taskId].data[0]++; + break; + case 1: + if (GetBlockReceivedStatus() == sub_800A9D8()) + { + s32 i; + u16 *recvBuff; + + for (i = 0; i < GetLinkPlayerCount(); i++) + { + recvBuff = gBlockRecvBuffer[i]; + sub_80C3120(&gTrainerCards[i], recvBuff, gLinkPlayers[i].version); + } + + if (GetLinkPlayerCount() == 2) + { + recvBuff = gBlockRecvBuffer[GetMultiplayerId() ^ 1]; + sub_801B94C(recvBuff[48]); + } + else + { + sub_801B940(); + } + + ResetBlockReceivedFlags(); + DestroyTask(taskId); + } + break; + } +} + +void sub_80141A4(void) +{ + switch (gMain.state) + { + case 0: + CreateTask(sub_80140E0, 5); + gMain.state++; + break; + case 1: + if (!FuncIsActiveTask(sub_80140E0)) + sub_80C4E74(GetMultiplayerId() ^ 1, CB2_ReturnToField); + break; + } + + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_8014210(u16 battleFlags) +{ + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + gLinkPlayers[0].linkType = 0x2211; + gLinkPlayers[GetMultiplayerId()].id = GetMultiplayerId(); + gLinkPlayers[GetMultiplayerId() ^ 1].id = GetMultiplayerId() ^ 1; + gMain.savedCallback = sub_80B360C; + gBattleTypeFlags = battleFlags; + PlayBattleBGM(); +} + +void sub_8014290(u16 arg0, u16 x, u16 y) +{ + VarSet(VAR_0x4087, arg0); + Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); + saved_warp2_set_2(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, x, y); + warp_in(); +} + +void sub_8014304(s8 mapGroup, s8 mapNum, s32 x, s32 y, u16 arg4) +{ + gSpecialVar_0x8004 = arg4; + VarSet(VAR_0x4087, arg4); + gFieldLinkPlayerCount = GetLinkPlayerCount(); + gUnknown_03005DB4 = GetMultiplayerId(); + sub_809D2BC(); + Overworld_SetWarpDestination(mapGroup, mapNum, -1, x, y); + warp_in(); +} + +void sub_8014384(void) +{ + switch (gMain.state) + { + case 0: + CreateTask(sub_80140E0, 5); + gMain.state++; + break; + case 1: + if (!FuncIsActiveTask(sub_80140E0)) + SetMainCallback2(sub_8086074); + break; + } + + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); +} + +void sub_80143E4(void *arg0, bool32 arg1) +{ + u16 *argAsU16Ptr = arg0; + + sub_80C30A4(argAsU16Ptr); + if (arg1) + argAsU16Ptr[48] = sub_801B39C(); + else + argAsU16Ptr[48] = 0; +} + +void sub_801440C(u8 taskId) +{ + sub_801B940(); + switch (gUnknown_02022C2C) + { + case 1 ... 4: + case 9 ... 11: + case 13: + case 15: + sub_800E3A8(); + break; + } + + switch (gUnknown_02022C2C) + { + case 65: + case 81: + overworld_free_bg_tilemaps(); + gMain.savedCallback = sub_801AC54; + sub_81B8518(3); + break; + case 1: + overworld_free_bg_tilemaps(); + sub_80143E4(gBlockSendBuffer, TRUE); + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + sub_8014304(MAP_GROUP(SINGLE_BATTLE_COLOSSEUM), MAP_NUM(SINGLE_BATTLE_COLOSSEUM), 6, 8, 1); + SetMainCallback2(sub_8014384); + break; + case 2: + overworld_free_bg_tilemaps(); + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + sub_80143E4(gBlockSendBuffer, TRUE); + sub_8014304(MAP_GROUP(SINGLE_BATTLE_COLOSSEUM), MAP_NUM(SINGLE_BATTLE_COLOSSEUM), 6, 8, 2); + SetMainCallback2(sub_8014384); + break; + case 3: + overworld_free_bg_tilemaps(); + HealPlayerParty(); + SavePlayerParty(); + LoadPlayerBag(); + sub_80143E4(gBlockSendBuffer, TRUE); + sub_8014304(MAP_GROUP(DOUBLE_BATTLE_COLOSSEUM), MAP_NUM(DOUBLE_BATTLE_COLOSSEUM), 5, 8, 5); + SetMainCallback2(sub_8014384); + break; + case 4: + sub_80143E4(gBlockSendBuffer, TRUE); + overworld_free_bg_tilemaps(); + sub_8014304(MAP_GROUP(TRADE_CENTER), MAP_NUM(TRADE_CENTER), 5, 8, 3); + SetMainCallback2(sub_8014384); + break; + case 15: + sub_80143E4(gBlockSendBuffer, TRUE); + overworld_free_bg_tilemaps(); + sub_8014304(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, 4); + SetMainCallback2(sub_8014384); + break; + case 68: + overworld_free_bg_tilemaps(); + CreateTask(sub_8013F90, 0); + break; + case 5: + case 69: + if (GetMultiplayerId() == 0) + { + sub_800ED10(); + } + else + { + sub_800ED28(); + sub_8010F84(69, 0, 1); + } + sub_801DD98(); + break; + case 8: + case 72: + sub_80143E4(gBlockSendBuffer, FALSE); + SetMainCallback2(sub_80141A4); + break; + case 9: + sub_8014290(8, 5, 1); + sub_802A9A8(GetCursorSelectionMonId(), CB2_LoadMap); + break; + case 10: + sub_8014290(7, 9, 1); + sub_8020C70(CB2_LoadMap); + break; + case 11: + sub_8014290(8, 5, 1); + sub_802493C(GetCursorSelectionMonId(), CB2_LoadMap); + break; + } + + DestroyTask(taskId); + gSpecialVar_Result = 1; + if (gUnknown_02022C2C != 68) + ScriptContext2_Disable(); +} + +extern u8 gUnknown_0203CEF8[]; + +void sub_8014790(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *sendBuff = (u16*)(gBlockSendBuffer); + + switch (data[0]) + { + case 0: + gSpecialVar_Result = 1; + switch (gUnknown_02022C2C) + { + case 14: + case 28: + gLinkPlayers[0].linkType = 0x2211; + gLinkPlayers[0].id = 0; + gLinkPlayers[1].id = 2; + sendBuff[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES); + sendBuff[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL); + gMain.savedCallback = NULL; + data[0] = 4; + sub_800E3A8(); + ResetBlockReceivedFlags(); + break; + case 16: + case 23 ... 27: + sub_800E3A8(); + DestroyTask(taskId); + default: + EnableBothScriptContexts(); + data[0] = 1; + break; + } + break; + case 1: + if (!ScriptContext1_IsScriptSetUp()) + { + FadeScreen(1, 0); + data[0] = 2; + } + break; + case 2: + if (!gPaletteFade.active) + { + if (gUnknown_02022C2C == 29) + { + DestroyTask(taskId); + SetMainCallback2(sub_80773AC); + } + else + { + sub_800ADF8(); + data[0] = 3; + } + } + break; + case 3: + if (sub_800A520()) + { + DestroyTask(taskId); + sub_80149D8(); + } + break; + case 4: + if (SendBlock(0, gBlockSendBuffer, 0xE)) + data[0] = 5; + break; + case 5: + if (GetBlockReceivedStatus() == 3) + { + ResetBlockReceivedFlags(); + if (sub_80B2AF4(gBlockRecvBuffer[0], gBlockRecvBuffer[1])) + { + gSpecialVar_Result = 11; + data[0] = 7; + } + else + { + data[0] = 6; + } + } + break; + case 6: + EnableBothScriptContexts(); + DestroyTask(taskId); + break; + case 7: + sub_800AC34(); + data[0] = 8; + break; + case 8: + if (gReceivedRemoteLinkPlayers == 0) + { + sub_800E084(); + EnableBothScriptContexts(); + DestroyTask(taskId); + } + break; + } +} + +void sub_80149C4(void) +{ + CreateTask(sub_8014790, 0); +} + +void sub_80149D8(void) +{ + u8 taskId = CreateTask(sub_801440C, 0); + gTasks[taskId].data[0] = 0; +} + +void sub_8014A00(u32 arg0) +{ + u8 taskId; + struct UnkStruct_Leader *dataPtr; + + taskId = CreateTask(sub_8014A40, 0); + gUnknown_02022C30.leader = dataPtr = (void*)(gTasks[taskId].data); + + dataPtr->state = 0; + dataPtr->textState = 0; + dataPtr->field_18 = arg0; + gSpecialVar_Result = 0; +} + +void sub_8014A40(u8 taskId) +{ + struct UnkStruct_Leader *data = gUnknown_02022C30.leader; + struct WindowTemplate winTemplate; + s32 val; + + switch (data->state) + { + case 0: + gUnknown_02022C2C = data->field_18; + gUnknown_02022C2D = 2; + sub_8010F84(data->field_18, 0, 0); + sub_8010FA0(FALSE, FALSE); + sub_800B488(); + OpenLink(); + sub_8011C10(2); + data->state = 1; + break; + case 1: + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0xA0); + data->field_8 = AllocZeroed(0xA0); + sub_80175EC(data->field_4, 4); + sub_8017580(data->field_0, 5); + sub_800DF90(&data->field_0->arr[0].unk.field_0, data->field_0->arr[0].unk.playerName); + data->field_0->arr[0].field_18 = 0; + data->field_0->arr[0].field_1A_0 = 1; + data->field_0->arr[0].field_1A_1 = 0; + data->field_0->arr[0].field_1B = 0; + data->field_17 = sub_8016FC0(data->field_4, 0xFF); + + winTemplate = gUnknown_082F011C; + winTemplate.baseBlock = sub_8019930(); + winTemplate.paletteNum = 0xC; + data->listWindowId = AddWindow(&winTemplate); + sub_8018784(data->listWindowId); + gMultiuseListMenuTemplate = gUnknown_082F015C; + gMultiuseListMenuTemplate.windowId = data->listWindowId; + data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + CopyBgTilemapBufferToVram(0); + data->field_13 = 1; + data->state = 2; + break; + case 2: + StringCopy(gStringVar1, gUnknown_082F0048[gUnknown_02022C2C]); + sub_801262C(gStringVar4, gUnknown_02022C2C); + data->state = 3; + break; + case 3: + sub_8018884(gStringVar4); + data->state = 4; + break; + case 4: + sub_801320C(data, 5, 6); + if (gMain.newKeys & B_BUTTON) + { + data->state = 13; + sub_800E084(); + } + break; + case 6: + if (mevent_0814257C(&data->textState, gUnknown_082EDF40)) + { + data->field_13 = sub_8013398(data->field_0); + RedrawListMenu(data->listTaskId); + data->state = 2; + } + break; + case 5: + data->state = 7; + break; + case 7: + switch (sub_8018B08(&data->textState, &data->field_14, 0, gStringVar4)) + { + case 0: + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + data->field_0->arr[data->field_13].field_1B = 0; + RedrawListMenu(data->listTaskId); + data->field_19 = 5; + sub_8010688(5, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + data->state = 8; + break; + case 1: + case -1: + data->field_19 = 6; + sub_8010688(6, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + data->state = 8; + break; + } + break; + case 8: + val = sub_8010714(ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId), data->field_0->arr[data->field_13].unk.playerName); + if (val == 1) + { + if (data->field_19 == 5) + { + data->field_0->arr[data->field_13].field_1B = 0; + RedrawListMenu(data->listTaskId); + data->field_13++; + sub_8018404(gStringVar1, &data->field_0->arr[data->field_13 - 1]); + StringExpandPlaceholders(gStringVar4, gUnknown_082EDC9C); + data->state = 9; + sub_800EF38(); + } + else + { + sub_8011DC0(data->field_0->arr[data->field_13].unk.playerName, ReadAsU16(data->field_0->arr[data->field_13].unk.field_0.unk_00.playerTrainerId)); + data->field_0->arr[data->field_13].field_1A_0 = 0; + sub_8013398(data->field_0); + RedrawListMenu(data->listTaskId); + data->state = 2; + } + + data->field_19 = 0; + } + else if (val == 2) + { + sub_8011A64(0, 0); + data->state = 2; + } + break; + case 9: + sub_8018884(gStringVar4); + data->state = 10; + break; + case 10: + if (++data->field_E > 120) + data->state = 11; + break; + case 11: + if (!sub_801320C(data, 5, 6)) + data->state = 12; + break; + case 12: + if (sub_800EF1C()) + { + sub_800EF58(FALSE); + data->state = 15; + } + else + { + data->state = 6; + } + break; + case 13: + sub_800E084(); + sub_800EDD4(); + DestroyListMenuTask(data->listTaskId, 0, 0); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->listWindowId); + DestroyTask(data->field_17); + Free(data->field_8); + Free(data->field_0); + Free(data->field_4); + data->state++; + break; + case 14: + if (mevent_0814257C(&data->textState, gText_PleaseStartOver)) + { + DestroyTask(taskId); + gSpecialVar_Result = 5; + } + break; + case 15: + if (sub_8011A74() == 1 || sub_8011A74() == 2) + { + data->state = 13; + } + else if (gReceivedRemoteLinkPlayers != 0) + { + sub_8011068(1); + data->state++; + } + break; + case 16: + DestroyListMenuTask(data->listTaskId, 0, 0); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->listWindowId); + DestroyTask(data->field_17); + Free(data->field_8); + Free(data->field_0); + Free(data->field_4); + sub_800ADF8(); + data->state++; + break; + case 17: + if (sub_800A520()) + DestroyTask(taskId); + break; + } +} + +void sub_8014EFC(u32 arg0) +{ + u8 taskId; + struct UnkStruct_Group *dataPtr; + + taskId = CreateTask(sub_8014F48, 0); + gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data); + gUnknown_03000DA4 = dataPtr; + + dataPtr->state = 0; + dataPtr->textState = 0; + dataPtr->field_12 = arg0 - 21; + gSpecialVar_Result = 0; +} + +void sub_8014F48(u8 taskId) +{ + s32 id; + struct WindowTemplate winTemplate1, winTemplate2; + struct UnkStruct_Group *data = gUnknown_02022C30.group; + + switch (data->state) + { + case 0: + sub_8010F84(data->field_12 + 21, 0, 0); + sub_800B488(); + OpenLink(); + sub_8011C5C(); + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0x200); + data->state = 1; + break; + case 1: + sub_8018884(gUnknown_082EF7F8); + data->state = 2; + break; + case 2: + sub_80175EC(data->field_4, 4); + sub_8017580(data->field_0, 16); + data->field_11 = sub_8016FC0(data->field_4, data->field_12 + 7); + + winTemplate1 = gUnknown_082F0174; + winTemplate1.baseBlock = sub_8019930(); + winTemplate1.paletteNum = 0xC; + data->listWindowId = AddWindow(&winTemplate1); + + winTemplate2 = gUnknown_082F017C; + winTemplate2.paletteNum = 0xC; + data->field_D = AddWindow(&winTemplate2); + + sub_8018784(data->listWindowId); + gMultiuseListMenuTemplate = gUnknown_082F0204; + gMultiuseListMenuTemplate.windowId = data->listWindowId; + data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + sub_8018784(data->field_D); + FillWindowPixelBuffer(data->field_D, 0x11); + PutWindowTilemap(data->field_D); + sub_80125BC(data->field_D); + CopyWindowToVram(data->field_D, 2); + + CopyBgTilemapBufferToVram(0); + data->field_F = 0; + data->state = 3; + break; + case 3: + id = sub_8013E44(); + switch (id) + { + case 1: + PlaySE(SE_PC_LOGIN); + default: + RedrawListMenu(data->listTaskId); + break; + case 0: + id = ListMenuHandleInputGetItemId(data->listTaskId); + if (gMain.newKeys & A_BUTTON && id != -1) + { + // this unused variable along with the assignment is needed to match + u32 unusedVar; + unusedVar = data->field_0->arr[id].unk.field_0.unk_0a_0; + + if (data->field_0->arr[id].field_1A_0 == 1 && !data->field_0->arr[id].unk.field_0.unk_0a_7) + { + data->field_F = id; + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + RedrawListMenu(data->listTaskId); + sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]); + sub_8011FC8(data->field_0->arr[data->field_F].unk.playerName, ReadAsU16(data->field_0->arr[data->field_F].unk.field_0.unk_00.playerTrainerId)); + PlaySE(SE_PN_ON); + data->state = 4; + } + else + { + PlaySE(SE_WALL_HIT); + } + } + else if (gMain.newKeys & B_BUTTON) + { + data->state = 6; + } + break; + } + break; + case 4: + sub_8018884(gUnknown_082EFC3C); + sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]); + data->state = 5; + break; + case 5: + if (gReceivedRemoteLinkPlayers != 0) + { + gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.unk_0a_0; + data->state = 10; + } + + switch (sub_8011A74()) + { + case 1: + case 2: + case 6: + data->state = 8; + break; + case 5: + sub_8018884(gUnknown_082EDDF4); + sub_8011A64(0, 0); + break; + } + break; + case 6: + case 8: + case 10: + DestroyListMenuTask(data->listTaskId, 0, 0); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->field_D); + RemoveWindow(data->listWindowId); + DestroyTask(data->field_11); + Free(data->field_0); + Free(data->field_4); + data->state++; + break; + case 9: + if (mevent_0814257C(&data->textState, gUnknown_082EDF80[sub_8011A74()])) + { + sub_800E084(); + DestroyTask(taskId); + sub_800EDD4(); + gSpecialVar_Result = 5; + } + break; + case 7: + sub_800E084(); + sub_8018884(gText_PleaseStartOver); + DestroyTask(taskId); + sub_800EDD4(); + gSpecialVar_Result = 5; + break; + case 11: + data->state++; + sub_800ADF8(); + break; + case 12: + if (sub_800A520()) + DestroyTask(taskId); + break; + } +} + +void sub_80152A8(u32 arg0) +{ + u8 taskId; + struct UnkStruct_Group *dataPtr; + + taskId = CreateTask(sub_80152F4, 0); + gUnknown_02022C30.group = dataPtr = (void*)(gTasks[taskId].data); + gUnknown_03000DA4 = dataPtr; + + dataPtr->state = 0; + dataPtr->textState = 0; + dataPtr->field_12 = arg0 - 21; + gSpecialVar_Result = 0; +} + +void sub_80152F4(u8 taskId) +{ + s32 id; + struct WindowTemplate winTemplate; + struct UnkStruct_Group *data = gUnknown_02022C30.group; + + switch (data->state) + { + case 0: + sub_8010F84(0, 0, 0); + sub_800B488(); + OpenLink(); + sub_8011C5C(); + data->field_4 = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0x200); + data->state = 1; + break; + case 1: + sub_8018884(gUnknown_082EFBC8); + data->state = 2; + break; + case 2: + sub_80175EC(data->field_4, 4); + sub_8017580(data->field_0, 16); + data->field_11 = sub_8016FF0(data->field_4, data->field_12 + 7); + + if (data->field_13 != 0) + { + winTemplate = gUnknown_082F0174; + winTemplate.baseBlock = sub_8019930(); + data->listWindowId = AddWindow(&winTemplate); + + sub_8018784(data->listWindowId); + gMultiuseListMenuTemplate = gUnknown_082F0204; + gMultiuseListMenuTemplate.windowId = data->listWindowId; + data->listTaskId = ListMenuInit(&gMultiuseListMenuTemplate, 0, 0); + + CopyBgTilemapBufferToVram(0); + } + + data->field_F = 0; + data->state = 3; + break; + case 3: + id = sub_8013E44(); + switch (id) + { + case 1: + PlaySE(SE_PC_LOGIN); + default: + if (data->field_13 != 0) + RedrawListMenu(data->listTaskId); + break; + case 0: + if (data->field_13 != 0) + id = ListMenuHandleInputGetItemId(data->listTaskId); + if (data->field_14 > 120) + { + if (data->field_0->arr[0].field_1A_0 == 1 && !data->field_0->arr[0].unk.field_0.unk_0a_7) + { + if (sub_8016F1C(&data->field_0->arr[0], data->field_12 + 7)) + { + data->field_F = 0; + data->field_14 = 0; + sub_800E0E8(); + CreateWirelessStatusIndicatorSprite(0, 0); + sub_8011FC8(data->field_0->arr[0].unk.playerName, ReadAsU16(data->field_0->arr[0].unk.field_0.unk_00.playerTrainerId)); + PlaySE(SE_PN_ON); + data->state = 4; + } + else + { + PlaySE(SE_BOO); + data->state = 10; + } + } + } + else if (gMain.newKeys & B_BUTTON) + { + data->state = 6; + data->field_14 = 0; + } + data->field_14++; + break; + } + break; + case 4: + sub_8018884(gUnknown_082EFC90); + sub_8018404(gStringVar1, &data->field_0->arr[data->field_F]); + data->state = 5; + break; + case 5: + if (gReceivedRemoteLinkPlayers != 0) + { + gUnknown_02022C2C = data->field_0->arr[data->field_F].unk.field_0.unk_0a_0; + data->state = 12; + } + + switch (sub_8011A74()) + { + case 1: + case 2: + case 6: + data->state = 8; + break; + case 5: + sub_8018884(gUnknown_082EDEC4); + sub_8011A64(0, 0); + break; + } + break; + case 6: + case 8: + case 10: + case 12: + if (data->field_13 != 0) + { + DestroyListMenuTask(data->listTaskId, 0, 0); + CopyBgTilemapBufferToVram(0); + RemoveWindow(data->listWindowId); + } + DestroyTask(data->field_11); + Free(data->field_0); + Free(data->field_4); + data->state++; + break; + case 9: + if (mevent_0814257C(&data->textState, gUnknown_082EDF04)) + { + sub_800E084(); + DestroyTask(taskId); + sub_800EDD4(); + gSpecialVar_Result = 5; + } + break; + case 7: + if (mevent_0814257C(&data->textState, gText_WirelessSearchCanceled)) + { + sub_800E084(); + DestroyTask(taskId); + sub_800EDD4(); + gSpecialVar_Result = 5; + } + break; + case 11: + if (mevent_0814257C(&data->textState, gUnknown_082EFD58[data->field_12])) + { + sub_800E084(); + DestroyTask(taskId); + sub_800EDD4(); + gSpecialVar_Result = 5; + } + break; + case 13: + data->state++; + sub_800ADF8(); + break; + case 14: + if (sub_800A520()) + DestroyTask(taskId); + break; + } +} + +void UnionRoomSpecial(void) +{ + struct UnkStruct_URoom *dataPtr; + + sub_8010F60(); + CreateTask(sub_80156E0, 10); + + // dumb line needed to match + gUnknown_02022C30.uRoom = gUnknown_02022C30.uRoom; + + dataPtr = AllocZeroed(0x26C); + gUnknown_02022C30.uRoom = dataPtr; + gUnknown_03000DA8 = dataPtr; + + dataPtr->state = 0; + dataPtr->textState = 0; + dataPtr->field_10 = 0; + dataPtr->field_12 = 0; + + gSpecialVar_Result = 0; + sub_819A2BC(0xD0, 1); +} + +u16 ReadAsU16(const u8 *ptr) +{ + return (ptr[1] << 8) | (ptr[0]); +} + +void sub_8015664(u32 arg0, const u8 *src) +{ + struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom; + + data->state = 8; + data->stateAfterPrint = arg0; + if (src != gStringVar4) + StringExpandPlaceholders(gStringVar4, src); +} + +void sub_801568C(const u8 *src) +{ + struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom; + + data->state = 26; + if (src != gStringVar4) + StringExpandPlaceholders(gStringVar4, src); +} + +void sub_80156B0(struct UnkStruct_URoom *data) +{ + memcpy(&gDecompressionBuffer[0x3F00], data->field_0, 0x100); +} + +void sub_80156C8(struct UnkStruct_URoom *data) +{ + memcpy(data->field_0, &gDecompressionBuffer[0x3F00], 0x100); +} + +// Cannot match, please fix later. +/* +void sub_80156E0(u8 taskId) +{ + u32 id = 0; + s32 var5 = 0; + u32 playerGender = 0; + struct UnkStruct_URoom *data = gUnknown_02022C30.uRoom; + s16 *taskData = gTasks[taskId].data; + + switch (data->state) + { + case 0: + data->field_4 = AllocZeroed(0x70); + data->field_C = AllocZeroed(0x70); + data->field_0 = AllocZeroed(0x100); + data->field_8 = AllocZeroed(0x20); + sub_8017580(data->field_0, 8); + gUnknown_02022C2C = 0x40; + data->field_20 = sub_8016DF0(data->field_C, data->field_4, 9); + sub_8019BA8(data->field_A0); + sub_8019F2C(); + data->state = 1; + break; + case 1: + sub_8019E70(data->spriteIds, taskData[0]); + if (++taskData[0] == 8) + data->state = 2; + break; + case 2: + sub_8010F84(0x40, 0, 0); + sub_8010FCC(gUnknown_02022C40.field_2, gUnknown_02022C40.field_A, gUnknown_02022C40.field_C); + sub_800B488(); + OpenLink(); + sub_8011C84(); + sub_8017580(data->field_8, 1); + sub_80175EC(data->field_4, 4); + sub_80175EC(data->field_C, 4); + gSpecialVar_Result = 0; + data->state = 3; + break; + case 3: + if ((sub_81B1360() == 8 || sub_81B1360() == 9) && gUnknown_02022C40.field_0 != 0) + { + id = GetCursorSelectionMonId(); + switch (gUnknown_02022C40.field_0) + { + case 1: + sub_8011090(0x54, 0, 1); + if (id >= PARTY_SIZE) + { + sub_801807C(&gUnknown_02022C40); + sub_8010FCC(0, 0, 0); + sub_801568C(gUnknown_082EF4FC); + } + else if (!sub_80180A0(GetCursorSelectionMonId(), &gUnknown_02022C40)) + { + sub_8015664(0x34, gUnknown_082EF47C); + } + else + { + data->state = 55; + } + break; + case 2: + sub_80156C8(data); + taskData[1] = gUnknown_02022C40.field_8; + if (id >= PARTY_SIZE) + { + sub_801568C(gUnknown_082EF544); + } + else + { + sub_8011090(0x54, 0, 1); + gUnknown_02022C2C = 0x44; + sub_80180E8(GetCursorSelectionMonId(), &gUnknown_02022C40); + data->state = 51; + } + break; + } + gUnknown_02022C40.field_0 = 0; + } + else + { + data->state = 4; + } + break; + case 4: + if (gSpecialVar_Result != 0) + { + if (gSpecialVar_Result == 9) + { + sub_8011090(0x54, 0, 1); + PlaySE(SE_PC_LOGIN); + StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); + data->state = 42; + gSpecialVar_Result = 0; + } + else if (gSpecialVar_Result == 11) + { + sub_8011090(0x54, 0, 1); + data->state = 23; + gSpecialVar_Result = 0; + } + else + { + taskData[0] = 0; + taskData[1] = gSpecialVar_Result - 1; + data->state = 24; + gSpecialVar_Result = 0; + } + } + else if (ScriptContext2_IsEnabled() != TRUE) + { + if (gMain.newKeys & A_BUTTON) + { + if (sub_801A2A8(data->field_0, &taskData[0], &taskData[1], data->spriteIds)) + { + PlaySE(SE_SELECT); + sub_80181CC(); + data->state = 24; + break; + } + else if (sub_8017940()) + { + sub_8011090(0x54, 0, 1); + PlaySE(SE_PC_LOGIN); + sub_80181CC(); + StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); + data->state = 45; + break; + } + } + + switch (sub_8016B00()) + { + case 1: + PlaySE(SE_PC_LOGIN); + case 2: + sub_801A274(data); + break; + case 4: + data->state = 11; + sub_80181CC(); + sub_8010FCC(0, 0, 0); + sub_8011090(0x53, sub_80181DC(data), 0); + break; + } + sub_801A284(data); + } + break; + case 23: + if (!FuncIsActiveTask(sub_809FA34)) + { + sub_8011090(0x40, 0, 0); + data->state = 4; + } + break; + case 24: + sub_801704C(); + playerGender = sub_8017CF8(taskData[1], data->field_0); + sub_8011090(0x54, 0, 1); + switch (sub_80179D4(data->field_0, taskData[0], taskData[1], playerGender)) + { + case 0: + data->state = 26; + break; + case 1: + sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C); + data->field_12 = id; + data->state = 25; + break; + case 2: + sub_8015664(0x13, gStringVar4); + break; + } + break; + case 25: + sub_801704C(); + switch (sub_8011A74()) + { + case 4: + sub_801818C(TRUE); + data->state = 4; + break; + case 1: + case 2: + if (sub_8011B90() == TRUE) + sub_801568C(gUnknown_082EE6C8); + else + sub_8015664(30, gUnknown_082EE6C8); + + gUnknown_02022C2C = 0x40; + break; + } + + if (gReceivedRemoteLinkPlayers != 0) + { + sub_80143E4(gBlockSendBuffer, TRUE); + CreateTask(sub_80140E0, 5); + data->state = 38; + } + break; + case 38: + if (!FuncIsActiveTask(sub_80140E0)) + { + if (gUnknown_02022C2C == 0x44) + sub_8015664(31, gUnknown_082EE004); + else + data->state = 5; + } + break; + case 30: + if (gReceivedRemoteLinkPlayers == 0) + { + sub_801818C(FALSE); + sub_801A3D0(taskData[0], taskData[1], data->field_0); + data->state = 2; + } + break; + case 6: + var5 = sub_8017178(&data->textState, &data->field_1B, &data->field_1C, &gUnknown_082F021C, &gUnknown_082F0244); + if (var5 != -1) + { + if (gReceivedRemoteLinkPlayers == 0) + { + data->state = 28; + } + else + { + data->field_98 = 0; + playerGender = sub_8017CF8(taskData[1], data->field_0); + switch (var5) + { + case -2: + case 0x40: + data->field_4C[0] = 0x40; + sub_800FE50(data->field_4C); + StringCopy(gStringVar4, gUnknown_082EEB80[gLinkPlayers[0].gender]); + data->state = 32; + break; + default: + gUnknown_02022C2C = var5; + gUnknown_02022C2D = (u32)(var5) >> 8; + if (gUnknown_02022C2C == 0x41 && !sub_8018024()) + { + sub_8015664(5, gUnknown_082EEBD0); + } + else + { + data->field_4C[0] = gUnknown_02022C2C | 0x40; + sub_800FE50(data->field_4C); + data->state = 27; + } + break; + } + } + } + break; + case 28: + StringCopy(gStringVar4, gUnknown_082EEB88); + data->state = 36; + break; + case 27: + sub_8017FD8(data); + playerGender = sub_8017CF8(taskData[1], data->field_0); + id = sub_8017984(data->field_4C[0] & 0x3F); + if (PrintOnTextbox(&data->textState, gUnknown_082EE82C[playerGender][id])) + { + taskData[3] = 0; + data->state = 29; + } + break; + case 32: + sub_800AC34(); + data->state = 36; + break; + case 31: + data->field_4C[0] = 0x44; + data->field_4C[1] = gUnknown_02022C40.species; + data->field_4C[2] = gUnknown_02022C40.level; + sub_800FE50(data->field_4C); + data->state = 29; + break; + case 29: + if (gReceivedRemoteLinkPlayers == 0) + { + StringCopy(gStringVar4, gUnknown_082EEB88); + data->state = 28; + } + else + { + sub_8017FD8(data); + if (data->field_98 == 0x51) + { + if (gUnknown_02022C2C == 8) + { + sub_8018220(gStringVar4, data, FALSE); + data->state = 40; + } + else + { + data->state = 13; + } + } + else if (data->field_98 == 0x52) + { + data->state = 32; + sub_8017D9C(gStringVar4, gUnknown_02022C2C | 0x40, gLinkPlayers[0].gender); + gUnknown_02022C2C = 0; + } + } + break; + case 5: + case 7: + id = sub_80179AC(&data->field_0->arr[taskData[1]]); + playerGender = sub_8017CF8(taskData[1], data->field_0); + sub_8015664(6, gUnknown_082EE24C[id][playerGender]); + break; + case 40: + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + data->state = 41; + sub_800ADF8(); + data->field_98 = 0; + data->field_9A = 0; + } + break; + case 41: + if (sub_800A520()) + { + if (GetMultiplayerId() == 0) + { + StringCopy(gStringVar1, gLinkPlayers[GetMultiplayerId() ^ 1].name); + id = sub_800E540(gLinkPlayers[1].trainerId, gLinkPlayers[1].name); + StringExpandPlaceholders(gStringVar4, gUnknown_082EE378[id]); + data->state = 33; + } + else + { + data->state = 7; + } + } + break; + case 19: + switch (sub_80170B8(&data->textState, FALSE)) + { + case 0: + CopyBgTilemapBufferToVram(0); + gUnknown_02022C2C = 0x45; + sub_8011090(0x45, 0, 1); + sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, gUnknown_02022C2C); + data->field_12 = taskData[1]; + data->state = 20; + taskData[3] = 0; + break; + case 1: + case -1: + playerGender = sub_8017CF8(taskData[1], data->field_0); + sub_801568C(gUnknown_082EEC9C[playerGender]); + break; + } + break; + case 20: + if (++taskData[2] > 60) + { + data->state = 21; + taskData[2] = 0; + } + break; + case 21: + switch (sub_8011A74()) + { + case 4: + sub_801818C(TRUE); + data->state = 4; + break; + case 1: + case 2: + playerGender = sub_8017CF8(taskData[1], data->field_0); + sub_8011090(0x54, 0, 1); + if (sub_8011B90() == TRUE) + sub_801568C(gUnknown_082EED3C[playerGender]); + else + sub_8015664(30, gUnknown_082EED3C[playerGender]); + break; + case 3: + data->state = 22; + break; + } + taskData[3]++; + break; + case 22: + if (sub_8011A80()) + { + playerGender = sub_8017CF8(taskData[1], data->field_0); + sub_8011090(0x54, 0, 1); + if (sub_8011B90() == TRUE) + sub_801568C(gUnknown_082EED3C[playerGender]); + else + sub_8015664(30, gUnknown_082EED3C[playerGender]); + } + if (gReceivedRemoteLinkPlayers != 0) + data->state = 16; + break; + case 11: + PlaySE(SE_PINPON); + sub_800EF7C(); + data->state = 12; + data->field_9A = 0; + break; + case 12: + if (sub_8011A80()) + { + sub_801818C(FALSE); + data->state = 2; + } + else if (gReceivedRemoteLinkPlayers != 0) + { + sub_80143E4(gBlockSendBuffer, TRUE); + CreateTask(sub_80140E0, 5); + data->state = 39; + } + break; + case 39: + sub_801689C(data); + if (!FuncIsActiveTask(sub_80140E0)) + { + data->state = 33; + StringCopy(gStringVar1, gLinkPlayers[1].name); + id = sub_800E540(gLinkPlayers[1].trainerId, gLinkPlayers[1].name); + StringExpandPlaceholders(gStringVar4, gUnknown_082EE324[id]); + } + break; + case 33: + sub_801689C(data); + if (PrintOnTextbox(&data->textState, gStringVar4)) + data->state = 34; + break; + case 34: + sub_801689C(data); + if (sub_80168DC(data) && gMain.newKeys & B_BUTTON) + { + sub_8011DE0(1); + StringCopy(gStringVar4, gUnknown_082EE598); + data->state = 36; + } + break; + case 35: + sub_8015664(9, gStringVar4); + break; + case 9: + switch (sub_80170B8(&data->textState, FALSE)) + { + case 0: + data->field_4C[0] = 0x51; + if (gUnknown_02022C2C == 0x45) + sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 0); + else + sub_8011090(gUnknown_02022C2C | 0x40, sub_801100C(1), 1); + + data->field_8->arr[0].field_1B = 0; + taskData[3] = 0; + if (gUnknown_02022C2C == 0x41) + { + if (!sub_8018024()) + { + data->field_4C[0] = 0x52; + sub_800FE50(data->field_4C); + data->state = 10; + StringCopy(gStringVar4, gUnknown_082EEC14); + } + else + { + sub_800FE50(data->field_4C); + data->state = 13; + } + } + else if (gUnknown_02022C2C == 0x48) + { + sub_800FE50(data->field_4C); + sub_8018220(gStringVar4, data, 1); + data->state = 40; + } + else + { + sub_800FE50(data->field_4C); + data->state = 13; + } + break; + case 1: + case -1: + data->field_4C[0] = 0x52; + sub_800FE50(data->field_4C); + data->state = 10; + sub_8013078(gStringVar4, gUnknown_02022C2C); + break; + } + break; + case 10: + sub_800AC34(); + data->state = 36; + break; + case 36: + if (gReceivedRemoteLinkPlayers == 0) + { + gUnknown_02022C2C = 0x40; + sub_8015664(0x25, gStringVar4); + memset(data->field_4C, 0, sizeof(data->field_4C)); + data->field_9A = 0; + data->field_98 = 0; + } + break; + case 37: + data->state = 2; + sub_801818C(FALSE); + break; + case 13: + sub_8017E00(gStringVar4, gUnknown_02022C2C | 0x40); + sub_8015664(0xE, gStringVar4); + break; + case 14: + sub_800ADF8(); + data->state = 15; + break; + case 15: + if (sub_800A520()) + data->state = 16; + break; + case 16: + Free(data->field_8); + Free(data->field_0); + Free(data->field_C); + Free(data->field_4); + DestroyTask(data->field_20); + sub_8019F04(data->spriteIds); + data->state = 17; + break; + case 17: + BeginNormalPaletteFade(-1, 0, 0, 0x10, RGB_BLACK); + data->state = 18; + break; + case 18: + if (!UpdatePaletteFade()) + { + sub_8019E3C(); + DestroyTask(taskId); + Free(gUnknown_02022C30.uRoom); + sub_80149D8(); + } + break; + case 42: + if (sub_800F7DC()->species == SPECIES_NONE) + { + data->state = 43; + } + else + { + if (sub_800F7DC()->species == SPECIES_EGG) + { + StringCopy(gStringVar4, gUnknown_082EF590); + } + else + { + StringCopy(gStringVar1, gSpeciesNames[sub_800F7DC()->species]); + ConvertIntToDecimalStringN(gStringVar2, sub_800F7DC()->unk_0b_1, STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gUnknown_082EF564); + } + sub_8015664(44, gStringVar4); + } + break; + case 43: + if (PrintOnTextbox(&data->textState, gUnknown_082EF20C)) + data->state = 47; + break; + case 47: + var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F025C, &gUnknown_082F027C); + if (var5 != -1) + { + if (var5 == -2 || var5 == 3) + { + data->state = 4; + sub_801818C(TRUE); + } + else + { + switch (var5) + { + case 1: + sub_8015664(53, gUnknown_082EF4C4); + break; + case 2: + sub_8015664(47, gUnknown_082EF298); + break; + } + } + } + break; + case 53: + BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + data->state = 54; + break; + case 54: + if (!gPaletteFade.active) + { + gUnknown_02022C40.field_0 = 1; + gFieldCallback = sub_80AF128; + sub_81B8904(8, CB2_ReturnToField); + } + break; + case 52: + var5 = sub_8017178(&data->textState, &data->field_1D, &data->field_1E, &gUnknown_082F0294, &gUnknown_082F032C); + if (var5 != -1) + { + switch (var5) + { + case -2: + case 18: + sub_801807C(&gUnknown_02022C40); + sub_8010FCC(0, 0, 0); + sub_801568C(gUnknown_082EF4FC); + break; + default: + gUnknown_02022C40.field_2 = var5; + data->state = 55; + break; + } + } + break; + case 55: + sub_8010FCC(gUnknown_02022C40.field_2, gUnknown_02022C40.field_A, gUnknown_02022C40.field_C); + sub_801568C(gUnknown_082EF520); + break; + case 44: + switch (sub_80170B8(&data->textState, FALSE)) + { + case 0: + data->state = 56; + break; + case 1: + case -1: + sub_801818C(TRUE); + data->state = 4; + break; + } + break; + case 56: + if (PrintOnTextbox(&data->textState, gUnknown_082EF5B8)) + { + sub_8010FCC(0, 0, 0); + sub_801807C(&gUnknown_02022C40); + sub_801818C(TRUE); + data->state = 4; + } + break; + case 45: + if (PrintOnTextbox(&data->textState, gUnknown_082EF1EC)) + data->state = 46; + break; + case 46: + sub_80173B0(); + data->state = 48; + break; + case 48: + var5 = sub_80172A0(&data->textState, &data->field_1D, &data->field_4A, &data->field_1E, &gUnknown_082F034C, &gUnknown_082F03A4, data->field_0); + if (var5 != -1) + { + switch (var5) + { + case -2: + case 8: + sub_801818C(TRUE); + data->state = 4; + break; + default: + sub_80173B0(); + switch (sub_8017D04(data->field_0->arr[var5].unk.field_0.type, data->field_0->arr[var5].unk.field_0.species)) + { + case 0: + sub_8018404(gStringVar1, &data->field_0->arr[var5]); + sub_8015664(49, gUnknown_082EF65C); + taskData[1] = var5; + break; + case 1: + sub_8018404(gStringVar1, &data->field_0->arr[var5]); + StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.field_0.type]); + sub_8015664(46, gUnknown_082EF6E4); + break; + case 2: + sub_8018404(gStringVar1, &data->field_0->arr[var5]); + StringCopy(gStringVar2, gTypeNames[data->field_0->arr[var5].unk.field_0.type]); + sub_8015664(46, gUnknown_082EF718); + break; + } + break; + } + } + break; + case 49: + switch (sub_80170B8(&data->textState, FALSE)) + { + case 0: + data->state = 50; + break; + case -1: + case 1: + sub_801818C(TRUE); + data->state = 4; + break; + } + break; + case 50: + if (PrintOnTextbox(&data->textState, gUnknown_082EF4C4)) + { + gUnknown_02022C40.field_0 = 2; + memcpy(&gUnknown_02022C38, &data->field_0->arr[taskData[1]].unk.field_0.unk_00, sizeof(gUnknown_02022C38)); + gUnknown_02022C3E = data->field_0->arr[taskData[1]].unk.field_0.type; + gUnknown_02022C3C = data->field_0->arr[taskData[1]].unk.field_0.species; + gFieldCallback = sub_80AF128; + sub_81B8904(9, CB2_ReturnToField); + sub_80156B0(data); + gUnknown_02022C40.field_8 = taskData[1]; + } + break; + case 51: + gUnknown_02022C2C = 0x44; + sub_8012188(data->field_0->arr[taskData[1]].unk.playerName, &data->field_0->arr[taskData[1]].unk.field_0, 0x44); + sub_8018404(gStringVar1, &data->field_0->arr[taskData[1]]); + sub_8017020(gUnknown_082EE17C[2]); + data->state = 25; + break; + case 26: + if (PrintOnTextbox(&data->textState, gStringVar4)) + { + sub_801818C(TRUE); + sub_801A3D0(taskData[0], taskData[1], data->field_0); + data->state = 4; + } + break; + case 8: + if (PrintOnTextbox(&data->textState, gStringVar4)) + data->state = data->stateAfterPrint; + break; + } +} -// .rodata +void var_800D_set_xB(void) +{ + if (InUnionRoom() == TRUE) + gSpecialVar_Result = 11; +} -// .text +*/ diff --git a/src/rom_8034C54.c b/src/rom_8034C54.c index 4d4492524..42df51295 100644 --- a/src/rom_8034C54.c +++ b/src/rom_8034C54.c @@ -1,5 +1,453 @@ #include "global.h" +#include "rom_8034C54.h" +#include "malloc.h" +#include "decompress.h" +#include "main.h" -IWRAM_DATA u32 gUnknown_03000DD4; -IWRAM_DATA u32 gUnknown_03000DD8; -IWRAM_DATA u32 gUnknown_03000DDC; +struct UnkStruct2 +{ + bool8 isActive; + u8 firstOamId; + u8 field_2; + u8 oamCount; + u8 palTagIndex; + u8 size; + u8 shape; + u8 priority; + u8 xDelta; + u8 field_9; + u16 tileStart; + s16 x; + s16 y; + u16 tileTag; + u16 palTag; + u32 field_14; + s32 field_18; +}; + +struct UnkStruct1 +{ + u32 count; + struct UnkStruct2 *array; +}; + +extern struct UnkStruct1 *gUnknown_02022E10; + +extern const struct SpriteTemplate gUnknown_0831AC88; + +// this file's functions +static u8 sub_8035518(u8 arg0);; +static void sub_8034EFC(struct UnkStruct2 *arg0); +static void sub_80350B0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2); +static void sub_8035164(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2); +static void sub_80352C0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2); +static bool32 SharesTileWithAnyActive(u32 id); +static bool32 SharesPalWithAnyActive(u32 id); +static void sub_8035648(void); + +// iwram +static IWRAM_DATA s32 gUnknown_03000DD4; +static IWRAM_DATA s32 gUnknown_03000DD8; +static IWRAM_DATA s32 gUnknown_03000DDC; + +// const rom data +static const u8 gUnknown_082FF1C8[][4] = +{ + {0x01, 0x04, 0x10, 0x40}, + {0x02, 0x04, 0x08, 0x20}, + {0x02, 0x04, 0x08, 0x20}, + {0x00, 0x00, 0x00, 0x00} +}; + +// code +bool32 sub_8034C54(u32 count) +{ + u32 i; + + if (gUnknown_02022E10 != NULL) + sub_8034CC8(); + + gUnknown_02022E10 = Alloc(sizeof(*gUnknown_02022E10)); + if (gUnknown_02022E10 == NULL) + return FALSE; + + gUnknown_02022E10->array = Alloc(sizeof(struct UnkStruct2) * count); + if (gUnknown_02022E10->array == NULL) + { + Free(gUnknown_02022E10); + return FALSE; + } + + gUnknown_02022E10->count = count; + for (i = 0; i < count; i++) + { + gUnknown_02022E10->array[i].isActive = FALSE; + gUnknown_02022E10->array[i].firstOamId |= 0xFF; + } + + return TRUE; +} + +void sub_8034CC8(void) +{ + if (gUnknown_02022E10 != NULL) + { + if (gUnknown_02022E10->array != NULL) + { + u32 i; + + for (i = 0; i < gUnknown_02022E10->count; i++) + sub_80353DC(i); + + Free(gUnknown_02022E10->array); + } + + FREE_AND_SET_NULL(gUnknown_02022E10); + } +} + +bool32 sub_8034D14(u32 id, s32 arg1, const struct UnkStruct3 *arg2) +{ + u32 i; + + if (gUnknown_02022E10 == NULL) + return FALSE; + if (gUnknown_02022E10->array[id].isActive) + return FALSE; + + gUnknown_02022E10->array[id].firstOamId = sub_8035518(arg2->field_1); + if (gUnknown_02022E10->array[id].firstOamId == 0xFF) + return FALSE; + + gUnknown_02022E10->array[id].tileStart = GetSpriteTileStartByTag(arg2->spriteSheet->tag); + if (gUnknown_02022E10->array[id].tileStart == 0xFFFF) + { + if (arg2->spriteSheet->size != 0) + { + gUnknown_02022E10->array[id].tileStart = LoadSpriteSheet(arg2->spriteSheet); + } + else + { + struct CompressedSpriteSheet compSpriteSheet; + + compSpriteSheet = *(struct CompressedSpriteSheet*)(arg2->spriteSheet); + compSpriteSheet.size = GetDecompressedDataSize(arg2->spriteSheet->data); + gUnknown_02022E10->array[id].tileStart = LoadCompressedObjectPic(&compSpriteSheet); + } + + if (gUnknown_02022E10->array[id].tileStart == 0xFFFF) + return FALSE; + } + + gUnknown_02022E10->array[id].palTagIndex = IndexOfSpritePaletteTag(arg2->spritePal->tag); + if (gUnknown_02022E10->array[id].palTagIndex == 0xFF) + gUnknown_02022E10->array[id].palTagIndex = LoadSpritePalette(arg2->spritePal); + + gUnknown_02022E10->array[id].field_2 = arg2->field_0_0; + gUnknown_02022E10->array[id].oamCount = arg2->field_1; + gUnknown_02022E10->array[id].x = arg2->x; + gUnknown_02022E10->array[id].y = arg2->y; + gUnknown_02022E10->array[id].shape = arg2->shape; + gUnknown_02022E10->array[id].size = arg2->size; + gUnknown_02022E10->array[id].priority = arg2->priority; + gUnknown_02022E10->array[id].xDelta = arg2->xDelta; + gUnknown_02022E10->array[id].field_9 = sub_80355F8(arg2->shape, arg2->size); + gUnknown_02022E10->array[id].tileTag = arg2->spriteSheet->tag; + gUnknown_02022E10->array[id].palTag = arg2->spritePal->tag; + gUnknown_02022E10->array[id].isActive = TRUE; + gUnknown_02022E10->array[id].field_14 = 1; + + for (i = 1; i < arg2->field_1; i++) + gUnknown_02022E10->array[id].field_14 *= 10; + + sub_8034EFC(&gUnknown_02022E10->array[id]); + sub_8035044(id, arg1); + + return TRUE; +} + +static void sub_8034EFC(struct UnkStruct2 *arg0) +{ + u32 i; + u32 oamId = arg0->firstOamId; + u32 x = arg0->x; + u32 oamCount = arg0->oamCount + 1; + + CpuFill16(0, &gMain.oamBuffer[oamId], sizeof(struct OamData) * oamCount); + for (i = 0, oamId = arg0->firstOamId; i < oamCount; i++, oamId++) + { + gMain.oamBuffer[oamId].y = arg0->y; + gMain.oamBuffer[oamId].x = x; + gMain.oamBuffer[oamId].shape = arg0->shape; + gMain.oamBuffer[oamId].size = arg0->size; + gMain.oamBuffer[oamId].tileNum = arg0->tileStart; + gMain.oamBuffer[oamId].priority = arg0->priority; + gMain.oamBuffer[oamId].paletteNum = arg0->palTagIndex; + + x += arg0->xDelta; + } + + oamId--; + gMain.oamBuffer[oamId].x = arg0->x - arg0->xDelta; + gMain.oamBuffer[oamId].affineMode = 2; + gMain.oamBuffer[oamId].tileNum = arg0->tileStart + (arg0->field_9 * 10); +} + +void sub_8035044(u32 id, s32 arg1) +{ + bool32 r2; + + if (gUnknown_02022E10 == NULL) + return; + if (!gUnknown_02022E10->array[id].isActive) + return; + + gUnknown_02022E10->array[id].field_18 = arg1; + if (arg1 < 0) + { + r2 = TRUE; + arg1 *= -1; + } + else + { + r2 = FALSE; + } + + switch (gUnknown_02022E10->array[id].field_2) + { + case 0: + default: + sub_80350B0(&gUnknown_02022E10->array[id], arg1, r2); + break; + case 1: + sub_8035164(&gUnknown_02022E10->array[id], arg1, r2); + break; + case 2: + sub_80352C0(&gUnknown_02022E10->array[id], arg1, r2); + break; + } +} + +static void sub_80350B0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2) +{ + u32 r5 = arg0->field_14; + u32 oamId = arg0->firstOamId; + + while (r5 != 0) + { + u32 r4 = arg1 / r5; + arg1 -= (r4 * r5); + r5 /= 10; + + gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart; + oamId++; + } + + if (arg2) + gMain.oamBuffer[oamId].affineMode = 0; + else + gMain.oamBuffer[oamId].affineMode = 2; +} + +static void sub_8035164(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2) +{ + u32 r5 = arg0->field_14; + gUnknown_03000DD4 = arg0->firstOamId; + gUnknown_03000DD8 = 0; + gUnknown_03000DDC = -1; + + while (r5 != 0) + { + u32 r4 = arg1 / r5; + arg1 -= (r4 * r5); + r5 /= 10; + + if (r4 != 0 || gUnknown_03000DDC != -1 || r5 == 0) + { + gMain.oamBuffer[gUnknown_03000DD4].tileNum = (r4 * arg0->field_9) + arg0->tileStart; + gMain.oamBuffer[gUnknown_03000DD4].affineMode = 0; + + if (gUnknown_03000DDC == -1) + gUnknown_03000DDC = gUnknown_03000DD8; + } + else + { + gMain.oamBuffer[gUnknown_03000DD4].affineMode = 2; + } + + gUnknown_03000DD4++; + gUnknown_03000DD8++; + } + + if (arg2) + { + gMain.oamBuffer[gUnknown_03000DD4].affineMode = 0; + gMain.oamBuffer[gUnknown_03000DD4].x = arg0->x + ((gUnknown_03000DDC - 1) * arg0->xDelta); + } + else + { + gMain.oamBuffer[gUnknown_03000DD4].affineMode = 2; + } +} + +static void sub_80352C0(struct UnkStruct2 *arg0, s32 arg1, bool32 arg2) +{ + u32 r5 = arg0->field_14; + u32 oamId = arg0->firstOamId; + u32 var_28 = 0; + s32 r9 = 0; + + while (r5 != 0) + { + u32 r4 = arg1 / r5; + arg1 -= (r4 * r5); + r5 /= 10; + + if (r4 != 0 || var_28 != 0 || r5 == 0) + { + var_28 = 1; + gMain.oamBuffer[oamId].tileNum = (r4 * arg0->field_9) + arg0->tileStart; + gMain.oamBuffer[oamId].affineMode = 0; + + oamId++; + r9++; + } + } + + while (r9 < arg0->oamCount) + { + gMain.oamBuffer[oamId].affineMode = 2; + oamId++; + r9++; + } + + if (arg2) + gMain.oamBuffer[oamId].affineMode = 0; + else + gMain.oamBuffer[oamId].affineMode = 2; +} + +void sub_80353DC(u32 id) +{ + s32 oamId, oamCount, i; + + if (gUnknown_02022E10 == NULL) + return; + if (!gUnknown_02022E10->array[id].isActive) + return; + + oamCount = gUnknown_02022E10->array[id].oamCount + 1; + oamId = gUnknown_02022E10->array[id].firstOamId; + + for (i = 0; i < oamCount; i++, oamId++) + gMain.oamBuffer[oamId].affineMode = 2; + + if (!SharesTileWithAnyActive(id)) + FreeSpriteTilesByTag(gUnknown_02022E10->array[id].tileTag); + if (!SharesPalWithAnyActive(id)) + FreeSpritePaletteByTag(gUnknown_02022E10->array[id].palTag); + + gUnknown_02022E10->array[id].isActive = FALSE; +} + +void sub_803547C(u32 id, bool32 arg1) +{ + s32 oamId, oamCount, i; + + if (gUnknown_02022E10 == NULL) + return; + if (!gUnknown_02022E10->array[id].isActive) + return; + + oamCount = gUnknown_02022E10->array[id].oamCount + 1; + oamId = gUnknown_02022E10->array[id].firstOamId; + if (arg1) + { + for (i = 0; i < oamCount; i++, oamId++) + gMain.oamBuffer[oamId].affineMode = 2; + } + else + { + for (i = 0; i < oamCount; i++, oamId++) + gMain.oamBuffer[oamId].affineMode = 0; + + sub_8035044(id, gUnknown_02022E10->array[id].field_18); + } +} + +static u8 sub_8035518(u8 arg0) +{ + u32 i; + u16 oamCount = 64; + + for (i = 0; i < gUnknown_02022E10->count; i++) + { + if (!gUnknown_02022E10->array[i].isActive) + { + if (gUnknown_02022E10->array[i].firstOamId != 0xFF && gUnknown_02022E10->array[i].oamCount <= arg0) + return gUnknown_02022E10->array[i].firstOamId; + } + else + { + oamCount += 1 + gUnknown_02022E10->array[i].oamCount; + } + } + + if (oamCount + arg0 + 1 > 128) + return 0xFF; + else + return oamCount; +} + +static bool32 SharesTileWithAnyActive(u32 id) +{ + u32 i; + + for (i = 0; i < gUnknown_02022E10->count; i++) + { + if (gUnknown_02022E10->array[i].isActive && i != id + && gUnknown_02022E10->array[i].tileTag == gUnknown_02022E10->array[id].tileTag) + { + return TRUE; + } + } + + return FALSE; +} + +static bool32 SharesPalWithAnyActive(u32 id) +{ + u32 i; + + for (i = 0; i < gUnknown_02022E10->count; i++) + { + if (gUnknown_02022E10->array[i].isActive && i != id + && gUnknown_02022E10->array[i].palTag == gUnknown_02022E10->array[id].palTag) + { + return TRUE; + } + } + + return FALSE; +} + +u8 sub_80355F8(u32 arg0, u32 arg1) +{ + return gUnknown_082FF1C8[arg0][arg1]; +} + +static void sub_8035608(void) +{ + u8 spriteId; + + ResetSpriteData(); + spriteId = CreateSprite(&gUnknown_0831AC88, 0, 0, 0); + gSprites[spriteId].invisible = 1; + SetMainCallback2(sub_8035648); +} + +static void sub_8035648(void) +{ + AnimateSprites(); + BuildOamBuffer(); +} diff --git a/src/rotating_gate.c b/src/rotating_gate.c new file mode 100644 index 000000000..fcced6c8c --- /dev/null +++ b/src/rotating_gate.c @@ -0,0 +1,1182 @@ +#include "global.h" +#include "bike.h" +#include "event_data.h" +#include "event_object_movement.h" +#include "constants/maps.h" +#include "constants/songs.h" +#include "sound.h" +#include "sprite.h" + +#define ROTATING_GATE_TILE_TAG 0x1300 +#define ROTATING_GATE_PUZZLE_MAX 12 +#define GATE_ARM_MAX_LENGTH 2 + +#define GATE_ROT(rotationDirection, arm, longArm) \ + ((rotationDirection & 15) << 4) | ((arm & 7) << 1) | (longArm & 1) +#define GATE_ROT_CW(arm, longArm) GATE_ROT(ROTATE_CLOCKWISE, arm, longArm) +#define GATE_ROT_ACW(arm, longArm) GATE_ROT(ROTATE_ANTICLOCKWISE, arm, longArm) +#define GATE_ROT_NONE 255 + +// static functions +static void SpriteCallback_RotatingGate(struct Sprite *sprite); +static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY); +static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite); + +// enums +enum +{ + /* + * | + * +-- + */ + GATE_SHAPE_L1, + + /* + * | + * | + * +-- + */ + GATE_SHAPE_L2, + + /* + * | + * +---- + */ + GATE_SHAPE_L3, + + /* + * | + * | + * +---- + */ + GATE_SHAPE_L4, + + /* + * | + * +-- + * | + */ + GATE_SHAPE_T1, + + /* + * | + * | + * +-- + * | + */ + GATE_SHAPE_T2, + + /* + * | + * +---- + * | + */ + GATE_SHAPE_T3, + + /* + * An unused T-shape gate + * | + * +-- + * | + * | + */ + GATE_SHAPE_T4, + + /* + * An unused T-shape gate + * | + * | + * +---- + * | + */ + GATE_SHAPE_UNUSED_T1, + + /* + * An unused T-shape gate + * | + * | + * +-- + * | + * | + */ + GATE_SHAPE_UNUSED_T2, + + /* + * An unused T-shape gate + * | + * +---- + * | + * | + */ + GATE_SHAPE_UNUSED_T3, + + /* + * An unused T-shape gate + * | + * | + * +---- + * | + * | + */ + GATE_SHAPE_UNUSED_T4, +}; + +enum +{ + /* + * 0 degrees (clockwise) + * | + * +-- + * | + */ + GATE_ORIENTATION_0, + + /* + * 90 degress (clockwise) + * --+-- + * | + */ + GATE_ORIENTATION_90, + + /* + * 180 degrees (clockwise) + * | + * --+ + * | + */ + GATE_ORIENTATION_180, + + /* + * 270 degrees (clockwise) + * | + * --+-- + */ + GATE_ORIENTATION_270, + + GATE_ORIENTATION_MAX, +}; + +// Describes the location of the gates "arms" when the gate has not +// been rotated (i.e. rotated 0 degrees) +enum +{ + GATE_ARM_NORTH, + GATE_ARM_EAST, + GATE_ARM_SOUTH, + GATE_ARM_WEST, +}; + +enum +{ + ROTATE_NONE, + ROTATE_ANTICLOCKWISE, + ROTATE_CLOCKWISE, +}; + +enum +{ + PUZZLE_NONE, + PUZZLE_FORTREE_CITY_GYM, + PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6, +}; + +// structure +struct RotatingGatePuzzle +{ + s16 x; + s16 y; + u8 shape; + u8 orientation; +}; + +// .rodata +// Fortree +static const struct RotatingGatePuzzle sRotatingGate_FortreePuzzleConfig[] = +{ + { 6, 7, GATE_SHAPE_T2, GATE_ORIENTATION_90}, + { 9, 15, GATE_SHAPE_T2, GATE_ORIENTATION_180}, + { 3, 19, GATE_SHAPE_T2, GATE_ORIENTATION_90}, + { 2, 6, GATE_SHAPE_T1, GATE_ORIENTATION_90}, + { 9, 12, GATE_SHAPE_T1, GATE_ORIENTATION_0}, + { 6, 23, GATE_SHAPE_T1, GATE_ORIENTATION_0}, + {12, 22, GATE_SHAPE_T1, GATE_ORIENTATION_0}, + { 6, 3, GATE_SHAPE_L4, GATE_ORIENTATION_180}, +}; + +// Trickhouse +static const struct RotatingGatePuzzle sRotatingGate_TrickHousePuzzleConfig[] = +{ + {14, 5, GATE_SHAPE_T1, GATE_ORIENTATION_90}, + {10, 6, GATE_SHAPE_L2, GATE_ORIENTATION_180}, + { 6, 6, GATE_SHAPE_L4, GATE_ORIENTATION_90}, + {14, 8, GATE_SHAPE_T1, GATE_ORIENTATION_90}, + { 3, 10, GATE_SHAPE_L3, GATE_ORIENTATION_270}, + { 9, 14, GATE_SHAPE_L1, GATE_ORIENTATION_90}, + { 3, 15, GATE_SHAPE_T3, GATE_ORIENTATION_0}, + { 2, 17, GATE_SHAPE_L2, GATE_ORIENTATION_180}, + {12, 18, GATE_SHAPE_T3, GATE_ORIENTATION_270}, + { 5, 18, GATE_SHAPE_L4, GATE_ORIENTATION_90}, + {10, 19, GATE_SHAPE_L3, GATE_ORIENTATION_180}, +}; + +static const u8 sRotatingGateTiles_1[] = INCBIN_U8("graphics/misc/rotating_gate_1.4bpp"); +static const u8 sRotatingGateTiles_2[] = INCBIN_U8("graphics/misc/rotating_gate_2.4bpp"); +static const u8 sRotatingGateTiles_3[] = INCBIN_U8("graphics/misc/rotating_gate_3.4bpp"); +static const u8 sRotatingGateTiles_4[] = INCBIN_U8("graphics/misc/rotating_gate_4.4bpp"); +static const u8 sRotatingGateTiles_5[] = INCBIN_U8("graphics/misc/rotating_gate_5.4bpp"); +static const u8 sRotatingGateTiles_6[] = INCBIN_U8("graphics/misc/rotating_gate_6.4bpp"); +static const u8 sRotatingGateTiles_7[] = INCBIN_U8("graphics/misc/rotating_gate_7.4bpp"); +static const u8 sRotatingGateTiles_8[] = INCBIN_U8("graphics/misc/rotating_gate_8.4bpp"); + +static const struct OamData sOamData_RotatingGateLarge = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = 0, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 2, + .paletteNum = 2, + .affineParam = 0, +}; + +static const struct OamData sOamData_RotatingGateRegular = +{ + .y = 0, + .affineMode = ST_OAM_AFFINE_NORMAL, + .objMode = 0, + .mosaic = 0, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 2, + .paletteNum = 2, + .affineParam = 0, +}; + +static const struct SpriteSheet sRotatingGatesGraphicsTable[] = +{ + {sRotatingGateTiles_1, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L1}, + {sRotatingGateTiles_2, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L2}, + {sRotatingGateTiles_3, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L3}, + {sRotatingGateTiles_4, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_L4}, + {sRotatingGateTiles_5, 0x200, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T1}, + {sRotatingGateTiles_6, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T2}, + {sRotatingGateTiles_7, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T3}, + {sRotatingGateTiles_8, 0x800, ROTATING_GATE_TILE_TAG + GATE_SHAPE_T4}, + {NULL}, +}; + +static const union AnimCmd sSpriteAnim_RotatingGateLarge[] = +{ + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_RotatingGateRegular[] = +{ + ANIMCMD_FRAME(0, 0), ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_RotatingGateLarge[] = +{ + sSpriteAnim_RotatingGateLarge, +}; + +static const union AnimCmd *const sSpriteAnimTable_RotatingGateRegular[] = +{ + sSpriteAnim_RotatingGateRegular, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated0[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated90[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated180[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Rotated270[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_JUMP(0), +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise0to90Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise90to180Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise180to270Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingClockwise270to360Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, -8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise360to270Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise270to180Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, 64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise180to90Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -128, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_RotatingAnticlockwise90to0Faster[] = +{ + AFFINEANIMCMD_FRAME(0x100, 0x100, -64, 0), + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 8), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable_RotatingGate[] = +{ + sSpriteAffineAnim_Rotated0, + sSpriteAffineAnim_Rotated90, + sSpriteAffineAnim_Rotated180, + sSpriteAffineAnim_Rotated270, + sSpriteAffineAnim_RotatingAnticlockwise360to270, + sSpriteAffineAnim_RotatingAnticlockwise90to0, + sSpriteAffineAnim_RotatingAnticlockwise180to90, + sSpriteAffineAnim_RotatingAnticlockwise270to180, + sSpriteAffineAnim_RotatingClockwise0to90, + sSpriteAffineAnim_RotatingClockwise90to180, + sSpriteAffineAnim_RotatingClockwise180to270, + sSpriteAffineAnim_RotatingClockwise270to360, + sSpriteAffineAnim_RotatingAnticlockwise360to270Faster, + sSpriteAffineAnim_RotatingAnticlockwise90to0Faster, + sSpriteAffineAnim_RotatingAnticlockwise180to90Faster, + sSpriteAffineAnim_RotatingAnticlockwise270to180Faster, + sSpriteAffineAnim_RotatingClockwise0to90Faster, + sSpriteAffineAnim_RotatingClockwise90to180Faster, + sSpriteAffineAnim_RotatingClockwise180to270Faster, + sSpriteAffineAnim_RotatingClockwise270to360Faster, +}; + + +static const struct SpriteTemplate sSpriteTemplate_RotatingGateLarge = +{ + .tileTag = ROTATING_GATE_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sOamData_RotatingGateLarge, + .anims = sSpriteAnimTable_RotatingGateLarge, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_RotatingGate, + .callback = SpriteCallback_RotatingGate, +}; + +static const struct SpriteTemplate sSpriteTemplate_RotatingGateRegular = +{ + .tileTag = ROTATING_GATE_TILE_TAG, + .paletteTag = 0xFFFF, + .oam = &sOamData_RotatingGateRegular, + .anims = sSpriteAnimTable_RotatingGateRegular, + .images = NULL, + .affineAnims = sSpriteAffineAnimTable_RotatingGate, + .callback = SpriteCallback_RotatingGate, +}; + +// These structures describe what happens to the gate if you hit it at +// a given coordinate in a 4x4 grid when walking in the specified +// direction. Either the gate does not rotate, or it rotates in the +// given direction. This information is compared against the gate +// "arm" layout to see if there is an arm at the position in order to +// produce the final rotation. +static const u8 sRotatingGate_RotationInfoNorth[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_CW(GATE_ARM_WEST, 1), GATE_ROT_CW(GATE_ARM_WEST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 0), GATE_ROT_ACW(GATE_ARM_EAST, 1), + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, +}; + +static const u8 sRotatingGate_RotationInfoSouth[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_ACW(GATE_ARM_WEST, 1), GATE_ROT_ACW(GATE_ARM_WEST, 0), GATE_ROT_CW(GATE_ARM_EAST, 0), GATE_ROT_CW(GATE_ARM_EAST, 1), + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_NONE, +}; + +static const u8 sRotatingGate_RotationInfoWest[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, GATE_ROT_NONE, +}; + +static const u8 sRotatingGate_RotationInfoEast[4 * 4] = +{ + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 1), GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_CW(GATE_ARM_NORTH, 0), GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 0), GATE_ROT_NONE, + GATE_ROT_NONE, GATE_ROT_NONE, GATE_ROT_ACW(GATE_ARM_SOUTH, 1), GATE_ROT_NONE, +}; + +// These tables describe the relative coordinate positions the arms +// must move through in order to be rotated. +static const struct Coords8 sRotatingGate_ArmPositionsClockwiseRotation[] = { + { 0, -1 }, { 1, -2 }, { 0, 0 }, { 1, 0 }, { -1, 0 }, { -1, 1 }, { -1, -1 }, { -2, -1 }, +}; + +static const struct Coords8 sRotatingGate_ArmPositionsAntiClockwiseRotation[] = { + { -1, -1 }, { -1, -2 }, { 0, -1 }, { 1, -1 }, { 0, 0 }, { 0, 1 }, { -1, 0 }, { -2, 0 }, +}; + +// Describes where the gates "arms" are in the order north, east, south, west. +// These are adjusted using the current orientation to perform collision checking +static const u8 sRotatingGate_ArmLayout[][4 * 2] = +{ + // L-shape gates + { + 1, 0, + 1, 0, + 0, 0, + 0, 0, + }, + { + 1, 1, + 1, 0, + 0, 0, + 0, 0, + }, + { + 1, 0, + 1, 1, + 0, 0, + 0, 0, + }, + { + 1, 1, + 1, 1, + 0, 0, + 0, 0, + }, + + // T-shape gates + { + 1, 0, + 1, 0, + 1, 0, + 0, 0, + }, + { + 1, 1, + 1, 0, + 1, 0, + 0, 0, + }, + { + 1, 0, + 1, 1, + 1, 0, + 0, 0, + }, + { + 1, 0, + 1, 0, + 1, 1, + 0, 0, + }, + + // Unused T-shape gates + // These have 2-3 long arms and cannot actually be used anywhere + // since configuration for them is missing from the other tables. + { + 1, 1, + 1, 1, + 1, 0, + 0, 0, + }, + { + 1, 1, + 1, 0, + 1, 1, + 0, 0, + }, + { + 1, 0, + 1, 1, + 1, 1, + 0, 0, + }, + { + 1, 1, + 1, 1, + 1, 1, + 0, 0, + }, +}; + +// ewram +static EWRAM_DATA u8 gRotatingGate_GateSpriteIds[ROTATING_GATE_PUZZLE_MAX] = {0}; +static EWRAM_DATA const struct RotatingGatePuzzle *gRotatingGate_PuzzleConfig = NULL; +static EWRAM_DATA u8 gRotatingGate_PuzzleCount = 0; + +// text +static s32 GetCurrentMapRotatingGatePuzzleType(void) +{ + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FORTREE_CITY_GYM) && + gSaveBlock1Ptr->location.mapNum == MAP_NUM(FORTREE_CITY_GYM)) + { + return PUZZLE_FORTREE_CITY_GYM; + } + + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE110_TRICK_HOUSE_PUZZLE6) && + gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE110_TRICK_HOUSE_PUZZLE6)) + { + return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6; + } + + return PUZZLE_NONE; +} + +static void RotatingGate_ResetAllGateOrientations(void) +{ + s32 i; + u8 *ptr; + + ptr = (u8 *)GetVarPointer(VAR_TEMP_0); + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + ptr[i] = gRotatingGate_PuzzleConfig[i].orientation; + } +} + +static s32 RotatingGate_GetGateOrientation(u8 gateId) +{ + return ((u8 *)GetVarPointer(VAR_TEMP_0))[gateId]; +} + +static void RotatingGate_SetGateOrientation(u8 gateId, u8 orientation) +{ + ((u8 *)GetVarPointer(VAR_TEMP_0))[gateId] = orientation; +} + +static void RotatingGate_RotateInDirection(u8 gateId, u32 rotationDirection) +{ + u8 orientation = RotatingGate_GetGateOrientation(gateId); + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + { + if (orientation) + orientation--; + else + orientation = GATE_ORIENTATION_270; + } + else + { + orientation = ++orientation % GATE_ORIENTATION_MAX; + } + RotatingGate_SetGateOrientation(gateId, orientation); +} + +static void RotatingGate_LoadPuzzleConfig(void) +{ + s32 puzzleType = GetCurrentMapRotatingGatePuzzleType(); + u32 i; + + switch (puzzleType) + { + case PUZZLE_FORTREE_CITY_GYM: + gRotatingGate_PuzzleConfig = sRotatingGate_FortreePuzzleConfig; + gRotatingGate_PuzzleCount = + sizeof(sRotatingGate_FortreePuzzleConfig) / sizeof(struct RotatingGatePuzzle); + break; + case PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6: + gRotatingGate_PuzzleConfig = sRotatingGate_TrickHousePuzzleConfig; + gRotatingGate_PuzzleCount = + sizeof(sRotatingGate_TrickHousePuzzleConfig) / sizeof(struct RotatingGatePuzzle); + break; + case PUZZLE_NONE: + default: + return; + } + + for (i = 0; i < ROTATING_GATE_PUZZLE_MAX - 1; i++) + { + gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; + } +} + +static void RotatingGate_CreateGatesWithinViewport(s16 deltaX, s16 deltaY) +{ + u8 i; + + // Calculate the bounding box of the camera + // Same as RotatingGate_DestroyGatesOutsideViewport + s16 x = gSaveBlock1Ptr->pos.x - 2; + s16 x2 = gSaveBlock1Ptr->pos.x + 0x11; + s16 y = gSaveBlock1Ptr->pos.y - 2; + s16 y2 = gSaveBlock1Ptr->pos.y + 0xe; + + s16 x3, y3; + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + x3 = gRotatingGate_PuzzleConfig[i].x + 7; + y3 = gRotatingGate_PuzzleConfig[i].y + 7; + + if (y <= y3 && y2 >= y3 && x <= x3 && x2 >= x3 && + gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) + { + gRotatingGate_GateSpriteIds[i] = RotatingGate_CreateGate(i, deltaX, deltaY); + } + } +} + +static u8 RotatingGate_CreateGate(u8 gateId, s16 deltaX, s16 deltaY) +{ + struct Sprite *sprite; + struct SpriteTemplate template; + const struct RotatingGatePuzzle *gate; + u8 spriteId; + s16 x, y; + + gate = &gRotatingGate_PuzzleConfig[gateId]; + + if (gate->shape == GATE_SHAPE_L1 || gate->shape == GATE_SHAPE_T1) + template = sSpriteTemplate_RotatingGateRegular; + else + template = sSpriteTemplate_RotatingGateLarge; + + template.tileTag = gate->shape + ROTATING_GATE_TILE_TAG; + + spriteId = CreateSprite(&template, 0, 0, 0x94); + if (spriteId == MAX_SPRITES) + return MAX_SPRITES; + + x = gate->x + 7; + y = gate->y + 7; + + sprite = &gSprites[spriteId]; + sprite->data[0] = gateId; + sprite->coordOffsetEnabled = 1; + + sub_8092FF0(x + deltaX, y + deltaY, &sprite->pos1.x, &sprite->pos1.y); + RotatingGate_HideGatesOutsideViewport(sprite); + StartSpriteAffineAnim(sprite, RotatingGate_GetGateOrientation(gateId)); + + return spriteId; +} + +static void SpriteCallback_RotatingGate(struct Sprite *sprite) +{ + u8 rotationDirection; + u8 orientation; + u8 affineAnimation; + + rotationDirection = sprite->data[1]; + orientation = sprite->data[2]; + + RotatingGate_HideGatesOutsideViewport(sprite); + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + { + affineAnimation = orientation + 4; + + if (GetPlayerSpeed() != 1) + affineAnimation += 8; + + PlaySE(SE_HI_TURUN); + StartSpriteAffineAnim(sprite, affineAnimation); + } + else if (rotationDirection == ROTATE_CLOCKWISE) + { + affineAnimation = orientation + 8; + + if (GetPlayerSpeed() != 1) + affineAnimation += 8; + + PlaySE(SE_HI_TURUN); + StartSpriteAffineAnim(sprite, affineAnimation); + } + + sprite->data[1] = ROTATE_NONE; +} + +static void RotatingGate_HideGatesOutsideViewport(struct Sprite *sprite) +{ + u16 x; + s16 x2; + u16 y; + s16 y2; + + sprite->invisible = FALSE; + x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX; + y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY; + + x2 = x + 0x40; // Dimensions of the rotating gate + y2 = y + 0x40; + + if ((s16)x > DISPLAY_WIDTH + 0x10 - 1 || x2 < -0x10) + { + sprite->invisible = TRUE; + } + + if ((s16)y > DISPLAY_HEIGHT + 0x10 - 1 || y2 < -0x10) + { + sprite->invisible = TRUE; + } +} + +static void LoadRotatingGatePics(void) +{ + LoadSpriteSheets(sRotatingGatesGraphicsTable); +} + +/* +static*/ void RotatingGate_DestroyGatesOutsideViewport(void) +{ + s16 x; + s16 x2; + s16 y; + s16 y2; + s16 xGate; + s16 yGate; + s32 i; + struct Sprite *sprite; + + // Same as RotatingGate_CreateGatesWithinViewport + x = gSaveBlock1Ptr->pos.x - 2; + x2 = gSaveBlock1Ptr->pos.x + 0x11; + y = gSaveBlock1Ptr->pos.y - 2; + y2 = gSaveBlock1Ptr->pos.y + 0xe; + + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + xGate = gRotatingGate_PuzzleConfig[i].x + 7; + yGate = gRotatingGate_PuzzleConfig[i].y + 7; + + if (gRotatingGate_GateSpriteIds[i] == MAX_SPRITES) + continue; + + if (xGate < x || xGate > x2 || yGate < y || yGate > y2) + { + sprite = &gSprites[gRotatingGate_GateSpriteIds[i]]; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + gRotatingGate_GateSpriteIds[i] = MAX_SPRITES; + } + } +} + + +#ifdef NONMATCHING +bool8 MapGridIsImpassableAt(s32, s32); //fool the compiler + +static s32 RotatingGate_CanRotate(u8 gateId, s16 rotationDirection) +{ + const struct Coords8 *armPos; + u8 orientation; + s16 x; + s16 y; + u8 shape; + u32 shape8; + s32 i; + s32 j; + s32 armOrientation; + const u8 *gateArmCollisionData; + u8 armIndex; + + if (rotationDirection == ROTATE_ANTICLOCKWISE) + armPos = sRotatingGate_ArmPositionsAntiClockwiseRotation; + else if (rotationDirection == ROTATE_CLOCKWISE) + armPos = sRotatingGate_ArmPositionsClockwiseRotation; + else + return FALSE; + + orientation = RotatingGate_GetGateOrientation(gateId); + + shape = gRotatingGate_PuzzleConfig[gateId].shape; + x = gRotatingGate_PuzzleConfig[gateId].x + 7; + y = gRotatingGate_PuzzleConfig[gateId].y + 7; + + + // Loop through the gate's "arms" clockwise (north, south, east, west) + for (i = GATE_ARM_NORTH, shape8 = shape* 4*2 ; i <= GATE_ARM_WEST; i++) + { + // Ensure that no part of the arm collides with the map + for (j = 0, armOrientation = orientation + i, gateArmCollisionData = (u8 *)((u32)sRotatingGate_ArmLayout + shape8 + 2*i); j < GATE_ARM_MAX_LENGTH; j++) + { + armIndex = 2 * (armOrientation % 4) + j; + + if (*gateArmCollisionData) + { + if (MapGridIsImpassableAt(x + armPos[armIndex].deltaX, y + armPos[armIndex].deltaY) == TRUE) + return FALSE; + } + gateArmCollisionData++; + } + } + + return TRUE; +} + +#else +NAKED +static s32 RotatingGate_CanRotate(u8 a, s16 rotationDirection) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0xC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r1, 0x1\n\ + bne _080FBCFC\n\ + ldr r0, =sRotatingGate_ArmPositionsAntiClockwiseRotation\n\ + mov r10, r0\n\ + b _080FBD08\n\ + .pool\n\ +_080FBCFC:\n\ + cmp r1, 0x2\n\ + beq _080FBD04\n\ +_080FBD00:\n\ + movs r0, 0\n\ + b _080FBD98\n\ +_080FBD04:\n\ + ldr r1, =sRotatingGate_ArmPositionsClockwiseRotation\n\ + mov r10, r1\n\ +_080FBD08:\n\ + adds r0, r4, 0\n\ + bl RotatingGate_GetGateOrientation\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, =gRotatingGate_PuzzleConfig\n\ + ldr r1, [r0]\n\ + lsls r0, r4, 3\n\ + adds r0, r1\n\ + ldrb r2, [r0, 0x4]\n\ + ldrh r1, [r0]\n\ + adds r1, 0x7\n\ + ldrh r0, [r0, 0x2]\n\ + adds r0, 0x7\n\ + movs r3, 0\n\ + lsls r2, 3\n\ + str r2, [sp, 0x4]\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + mov r9, r1\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + mov r8, r0\n\ +_080FBD38:\n\ + movs r6, 0\n\ + ldr r2, [sp]\n\ + adds r7, r2, r3\n\ + lsls r0, r3, 1\n\ + adds r5, r7, 0\n\ + ldr r1, [sp, 0x4]\n\ + adds r0, r1\n\ + ldr r2, =sRotatingGate_ArmLayout\n\ + adds r4, r0, r2\n\ +_080FBD4A:\n\ + adds r0, r5, 0\n\ + cmp r5, 0\n\ + bge _080FBD52\n\ + adds r0, r7, 0x3\n\ +_080FBD52:\n\ + asrs r0, 2\n\ + lsls r0, 2\n\ + subs r0, r5, r0\n\ + lsls r0, 1\n\ + adds r0, r6\n\ + lsls r0, 24\n\ + lsrs r1, r0, 24\n\ + ldrb r0, [r4]\n\ + cmp r0, 0\n\ + beq _080FBD88\n\ + lsls r1, 2\n\ + add r1, r10\n\ + movs r0, 0\n\ + ldrsb r0, [r1, r0]\n\ + add r0, r9\n\ + ldrb r1, [r1, 0x1]\n\ + lsls r1, 24\n\ + asrs r1, 24\n\ + add r1, r8\n\ + str r3, [sp, 0x8]\n\ + bl MapGridIsImpassableAt\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r3, [sp, 0x8]\n\ + cmp r0, 0x1\n\ + beq _080FBD00\n\ +_080FBD88:\n\ + adds r4, 0x1\n\ + adds r6, 0x1\n\ + cmp r6, 0x1\n\ + ble _080FBD4A\n\ + adds r3, 0x1\n\ + cmp r3, 0x3\n\ + ble _080FBD38\n\ + movs r0, 0x1\n\ +_080FBD98:\n\ + add sp, 0xC\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .pool\n\ +.syntax divided\n"); +} +#endif + +static s32 RotatingGate_HasArm(u8 gateId, u8 armInfo) +{ + s32 isLongArm; + s8 armOrientation; + s32 arm; + s32 shape; + + arm = armInfo >> 1; + isLongArm = armInfo & 1; + + armOrientation = (arm - RotatingGate_GetGateOrientation(gateId) + 4) % 4; + shape = gRotatingGate_PuzzleConfig[gateId].shape; + return sRotatingGate_ArmLayout[shape][armOrientation * 2 + isLongArm]; +} + +static void RotatingGate_TriggerRotationAnimation(u8 gateId, s32 rotationDirection) +{ + struct Sprite *sprite; + + if (gRotatingGate_GateSpriteIds[gateId] != MAX_SPRITES) + { + sprite = &gSprites[gRotatingGate_GateSpriteIds[gateId]]; + sprite->data[1] = rotationDirection; + sprite->data[2] = RotatingGate_GetGateOrientation(gateId); + } +} + +static u8 RotatingGate_GetRotationInfo(u8 direction, s16 x, s16 y) +{ + register const u8 *ptr; + + if (direction == DIR_NORTH) + ptr = sRotatingGate_RotationInfoNorth; + else if (direction == DIR_SOUTH) + ptr = sRotatingGate_RotationInfoSouth; + else if (direction == DIR_WEST) + ptr = sRotatingGate_RotationInfoWest; + else if (direction == DIR_EAST) + ptr = sRotatingGate_RotationInfoEast; + else + return GATE_ROT_NONE; + + return ptr[y * 4 + x]; +} + +void RotatingGate_InitPuzzle(void) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + RotatingGate_LoadPuzzleConfig(); + RotatingGate_ResetAllGateOrientations(); + } +} + +void RotatingGatePuzzleCameraUpdate(u16 deltaX, u16 deltaY) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + RotatingGate_CreateGatesWithinViewport(deltaX, deltaY); + RotatingGate_DestroyGatesOutsideViewport(); + } +} + +void RotatingGate_InitPuzzleAndGraphics(void) +{ + if (GetCurrentMapRotatingGatePuzzleType()) + { + LoadRotatingGatePics(); + RotatingGate_LoadPuzzleConfig(); + RotatingGate_CreateGatesWithinViewport(0, 0); + } +} + +bool8 CheckForRotatingGatePuzzleCollision(u8 direction, s16 x, s16 y) +{ + s32 i; + + if (!GetCurrentMapRotatingGatePuzzleType()) + return FALSE; + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + s16 gateX = gRotatingGate_PuzzleConfig[i].x + 7; + s16 gateY = gRotatingGate_PuzzleConfig[i].y + 7; + + if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1) + { + s16 centerX = x - gateX + 2; + s16 centerY = y - gateY + 2; + u8 rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY); + + if (rotationInfo != GATE_ROT_NONE) + { + u8 rotationDirection = ((rotationInfo & 0xF0) >> 4); + u8 armInfo = rotationInfo & 0xF; + + if (RotatingGate_HasArm(i, armInfo)) + { + if (RotatingGate_CanRotate(i, rotationDirection)) + { + RotatingGate_TriggerRotationAnimation(i, rotationDirection); + RotatingGate_RotateInDirection(i, rotationDirection); + return FALSE; + } + return TRUE; + } + } + } + } + return FALSE; +} + +bool8 CheckForRotatingGatePuzzleCollisionWithoutAnimation(u8 direction, s16 x, s16 y) +{ + s32 i; + + if (!GetCurrentMapRotatingGatePuzzleType()) + return FALSE; + for (i = 0; i < gRotatingGate_PuzzleCount; i++) + { + s16 gateX = gRotatingGate_PuzzleConfig[i].x + 7; + s16 gateY = gRotatingGate_PuzzleConfig[i].y + 7; + + if (gateX - 2 <= x && x <= gateX + 1 && gateY - 2 <= y && y <= gateY + 1) + { + s16 centerX = x - gateX + 2; + s16 centerY = y - gateY + 2; + u8 rotationInfo = RotatingGate_GetRotationInfo(direction, centerX, centerY); + + if (rotationInfo != GATE_ROT_NONE) + { + u8 rotationDirection = ((rotationInfo & 0xF0) >> 4); + u8 armInfo = rotationInfo & 0xF; + + if (RotatingGate_HasArm(i, armInfo)) + { + if (!RotatingGate_CanRotate(i, rotationDirection)) + { + return TRUE; + } + } + } + } + } + return FALSE; +} diff --git a/src/safari_zone.c b/src/safari_zone.c index ab5c38f3a..01d72fa13 100644 --- a/src/safari_zone.c +++ b/src/safari_zone.c @@ -31,7 +31,7 @@ extern void IncrementGameStat(u8 index); extern void ScriptContext1_SetupScript(u8*); extern void ScriptContext2_RunNewScript(u8*); extern void CB2_ReturnToField(void); -extern void CB2_ReturnToFieldContinueScript(void); +extern void CB2_ReturnToFieldContinueScriptPlayMapMusic(void); extern void CB2_LoadMap(void); extern void sub_80AF6F0(void); extern void ScriptContext1_Stop(void); @@ -42,7 +42,7 @@ extern void PlayerGetDestCoords(s16* x, s16* y); EWRAM_DATA u8 gNumSafariBalls = 0; EWRAM_DATA static u16 sSafariZoneStepCounter = 0; EWRAM_DATA static u8 sSafariZoneCaughtMons = 0; -EWRAM_DATA static u8 sSafariZoneFleedMons = 0; +EWRAM_DATA static u8 sSafariZonePkblkUses = 0; EWRAM_DATA static struct PokeblockFeeder sPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; static void ClearAllPokeblockFeeders(void); @@ -71,12 +71,12 @@ void EnterSafariMode(void) gNumSafariBalls = 30; sSafariZoneStepCounter = 500; sSafariZoneCaughtMons = 0; - sSafariZoneFleedMons = 0; + sSafariZonePkblkUses = 0; } void ExitSafariMode(void) { - sub_80EE44C(sSafariZoneCaughtMons, sSafariZoneFleedMons); + sub_80EE44C(sSafariZoneCaughtMons, sSafariZonePkblkUses); ResetSafariZoneFlag(); ClearAllPokeblockFeeders(); gNumSafariBalls = 0; @@ -107,7 +107,7 @@ void SafariZoneRetirePrompt(void) void CB2_EndSafariBattle(void) { - sSafariZoneFleedMons += gBattleResults.field_1F; + sSafariZonePkblkUses += gBattleResults.pokeblockThrows; if (gBattleOutcome == B_OUTCOME_CAUGHT) sSafariZoneCaughtMons++; if (gNumSafariBalls != 0) @@ -125,7 +125,7 @@ void CB2_EndSafariBattle(void) { ScriptContext1_SetupScript(EventScript_2A4B9B); ScriptContext1_Stop(); - SetMainCallback2(CB2_ReturnToFieldContinueScript); + SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); } } @@ -172,7 +172,7 @@ void GetPokeblockFeederWithinRange(void) { if (gSaveBlock1Ptr->location.mapNum == sPokeblockFeeders[i].mapNum) { - //Get absolute value of x and y distance from Pokeblock feeder on current map + // Get absolute value of x and y distance from Pokeblock feeder on current map. x -= sPokeblockFeeders[i].x; y -= sPokeblockFeeders[i].y; if (x < 0) diff --git a/src/save.c b/src/save.c index 8025d6586..81731692e 100644 --- a/src/save.c +++ b/src/save.c @@ -4,17 +4,15 @@ #include "constants/game_stat.h" #include "task.h" #include "decompress.h" +#include "load_save.h" +#include "overworld.h" // for the chunk declarations -extern struct SaveBlock2 gSaveblock2; -extern struct SaveBlock1 gSaveblock1; -extern struct PokemonStorage gPokemonStorage; extern struct SaveSectionLocation gRamSaveSectionLocations[0xE]; -extern u8 gDecompressionBuffer[]; -extern u32 gFlashMemoryPresent; extern u16 gUnknown_03006294; extern bool8 gSoftResetDisabled; +extern u32 gUnknown_0203CF5C; // Divide save blocks into individual chunks to be written to flash sectors @@ -24,13 +22,13 @@ extern bool8 gSoftResetDisabled; /* * Sector Layout: - * + * * Sectors 0 - 13: Save Slot 1 * Sectors 14 - 27: Save Slot 2 * Sectors 28 - 29: Hall of Fame * Sector 30: e-Reader/Mystery Gift Stuff (note: e-Reader is deprecated in Emerald US) * Sector 31: Recorded Battle - * + * * There are two save slots for saving the player's game data. We alternate between * them each time the game is saved, so that if the current save slot is corrupt, * we can load the previous one. We also rotate the sectors in each save slot @@ -41,7 +39,7 @@ extern bool8 gSoftResetDisabled; // (u8 *)structure was removed from the first statement of the macro in Emerald. // This is because malloc is used to allocate addresses so storing the raw -// addresses should not be done in the offsets information. +// addresses should not be done in the offsets information. #define SAVEBLOCK_CHUNK(structure, chunkNum) \ { \ chunkNum * SECTOR_DATA_SIZE, \ @@ -69,8 +67,10 @@ const struct SaveSectionOffsets gSaveSectionOffsets[] = }; extern void DoSaveFailedScreen(u8); // save_failed_screen -extern void LoadSerializedGame(void); // load_save extern bool32 ProgramFlashSectorAndVerify(u8 sector, u8 *data); +extern void save_serialize_map(void); +extern void sub_800ADF8(void); +extern bool8 sub_800A520(void); // iwram common u16 gLastWrittenSector; @@ -656,11 +656,6 @@ void UpdateSaveAddresses(void) } } -extern u32 GetGameStat(u8 index); // rom4 -extern void IncrementGameStat(u8 index); // rom4 -extern void SaveSerializedGame(void); // load_save -extern u32 gUnknown_0203CF5C; - u8 HandleSavingData(u8 saveType) { u8 i; @@ -836,7 +831,7 @@ u16 sub_815355C(void) struct SaveSection* savSection; savSection = gFastSaveSection = &gSaveDataBuffer; - if (gFlashMemoryPresent != 1) + if (gFlashMemoryPresent != TRUE) return 0; UpdateSaveAddresses(); GetSaveValidStatus(gRamSaveSectionLocations); @@ -897,12 +892,6 @@ u32 sub_8153634(u8 sector, u8* src) return 1; } -extern void save_serialize_map(void); -extern void sub_8076D5C(void); -extern void sav2_gender2_inplace_and_xFE(void); -extern void sub_800ADF8(void); -extern bool8 sub_800A520(void); - void sub_8153688(u8 taskId) { s16* taskData = gTasks[taskId].data; diff --git a/src/scrcmd.c b/src/scrcmd.c index a29e64979..01d04704a 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -13,8 +13,7 @@ #include "field_door.h" #include "field_effect.h" #include "field_fadetransition.h" -#include "field_map_obj.h" -#include "field_map_obj_helpers.h" +#include "event_object_movement.h" #include "field_message_box.h" #include "field_player_avatar.h" #include "field_screen_effect.h" @@ -25,7 +24,7 @@ #include "item.h" #include "lilycove_lady.h" #include "main.h" -#include "map_obj_lock.h" +#include "event_obj_lock.h" #include "menu.h" #include "money.h" #include "mystery_event_script.h" @@ -1052,7 +1051,7 @@ bool8 ScrCmd_removeobject(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); - RemoveFieldObjectByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + RemoveEventObjectByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); return FALSE; } @@ -1062,7 +1061,7 @@ bool8 ScrCmd_removeobject_at(struct ScriptContext *ctx) u8 mapGroup = ScriptReadByte(ctx); u8 mapNum = ScriptReadByte(ctx); - RemoveFieldObjectByLocalIdAndMap(objectId, mapNum, mapGroup); + RemoveEventObjectByLocalIdAndMap(objectId, mapNum, mapGroup); return FALSE; } @@ -1100,7 +1099,7 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) u16 x = VarGet(ScriptReadHalfword(ctx)); u16 y = VarGet(ScriptReadHalfword(ctx)); - Overworld_SetMapObjTemplateCoords(localId, x, y); + Overworld_SetEventObjTemplateCoords(localId, x, y); return FALSE; } @@ -1155,10 +1154,10 @@ bool8 ScrCmd_resetobjectpriority(struct ScriptContext *ctx) bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) { - if (gMapObjects[gSelectedMapObject].active) + if (gEventObjects[gSelectedEventObject].active) { - FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedMapObject], - player_get_direction_lower_nybble()); + EventObjectFaceOppositeDirection(&gEventObjects[gSelectedEventObject], + GetPlayerFacingDirection()); } return FALSE; } @@ -1168,7 +1167,7 @@ bool8 ScrCmd_turnobject(struct ScriptContext *ctx) u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 direction = ScriptReadByte(ctx); - FieldObjectTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction); + EventObjectTurnByLocalIdAndMap(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, direction); return FALSE; } @@ -1177,7 +1176,7 @@ bool8 ScrCmd_setobjectmovementtype(struct ScriptContext *ctx) u16 localId = VarGet(ScriptReadHalfword(ctx)); u8 movementType = ScriptReadByte(ctx); - Overworld_SetMapObjTemplateMovementType(localId, movementType); + Overworld_SetEventObjTemplateMovementType(localId, movementType); return FALSE; } @@ -1211,7 +1210,7 @@ bool8 ScrCmd_lockall(struct ScriptContext *ctx) } else { - ScriptFreezeMapObjects(); + ScriptFreezeEventObjects(); SetupNativeScript(ctx, sub_80983C4); return TRUE; } @@ -1225,14 +1224,14 @@ bool8 ScrCmd_lock(struct ScriptContext *ctx) } else { - if (gMapObjects[gSelectedMapObject].active) + if (gEventObjects[gSelectedEventObject].active) { - LockSelectedMapObject(); + LockSelectedEventObject(); SetupNativeScript(ctx, sub_809847C); } else { - ScriptFreezeMapObjects(); + ScriptFreezeEventObjects(); SetupNativeScript(ctx, sub_80983C4); } return TRUE; @@ -1244,10 +1243,10 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) u8 objectId; HideFieldMessageBox(); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); sub_80D338C(); - UnfreezeMapObjects(); + UnfreezeEventObjects(); return FALSE; } @@ -1256,12 +1255,12 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) u8 objectId; HideFieldMessageBox(); - if (gMapObjects[gSelectedMapObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedMapObject]); - objectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[objectId]); + if (gEventObjects[gSelectedEventObject].active) + EventObjectClearHeldMovementIfFinished(&gEventObjects[gSelectedEventObject]); + objectId = GetEventObjectIdByLocalIdAndMap(0xFF, 0, 0); + EventObjectClearHeldMovementIfFinished(&gEventObjects[objectId]); sub_80D338C(); - UnfreezeMapObjects(); + UnfreezeEventObjects(); return FALSE; } @@ -1516,9 +1515,9 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) xText = (xWindow - xText - 1) * 8 + 3; yText = (yText - yWindow - 1) * 8; - winTemplate = sub_8198A50(0, xWindow, yWindow + 1, width, height, 0xF, 0x1); + winTemplate = CreateWindowTemplate(0, xWindow, yWindow + 1, width, height, 0xF, 0x1); gUnknown_03000F30 = AddWindow(&winTemplate); - sub_809882C(gUnknown_03000F30, 0x214, 0xE0); + LoadUserWindowBorderGfx(gUnknown_03000F30, 0x214, 0xE0); NewMenuHelpers_DrawStdWindowFrame(gUnknown_03000F30, 0); PutWindowTilemap(gUnknown_03000F30); FillWindowPixelBuffer(gUnknown_03000F30, 0x11); @@ -1910,7 +1909,7 @@ bool8 ScrCmd_playslotmachine(struct ScriptContext *ctx) { u8 slotMachineIndex = VarGet(ScriptReadHalfword(ctx)); - PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScript); + PlaySlotMachine(slotMachineIndex, CB2_ReturnToFieldContinueScriptPlayMapMusic); ScriptContext1_Stop(); return TRUE; } @@ -2179,7 +2178,7 @@ bool8 ScrCmd_mossdeepgym4(struct ScriptContext *ctx) bool8 ScrCmd_cmdD8(struct ScriptContext *ctx) { - gSelectedMapObject = GetCurrentApproachingTrainerMapObjectId(); + gSelectedEventObject = GetCurrentApproachingTrainerEventObjectId(); return FALSE; } @@ -2191,7 +2190,7 @@ bool8 ScrCmd_cmdD9(struct ScriptContext *ctx) } else { - if (gMapObjects[gSelectedMapObject].active) + if (gEventObjects[gSelectedEventObject].active) { sub_8098630(); SetupNativeScript(ctx, sub_8098734); @@ -2239,7 +2238,7 @@ bool8 ScrCmd_warpD1(struct ScriptContext *ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_808D074(player_get_direction_lower_nybble()); + sub_808D074(GetPlayerFacingDirection()); sub_80B0244(); player_avatar_init_params_reset(); return TRUE; diff --git a/src/script_movement.c b/src/script_movement.c new file mode 100644 index 000000000..9fee9e060 --- /dev/null +++ b/src/script_movement.c @@ -0,0 +1,232 @@ +#include "global.h" +#include "script_movement.h" +#include "event_object_movement.h" +#include "task.h" +#include "util.h" + +// static functions +static void sub_80D33AC(u8); +static u8 sub_80D33F4(void); +static bool8 sub_80D3408(u8, u8, const u8 *); +static u8 sub_80D3474(u8, u8); +static bool8 sub_80D3584(u8, u8); +static void sub_80D35DC(u8, u8, u8, const u8 *); +static void UnfreezeObjects(u8); +static void sub_80D3660(u8); +static void sub_80A2490(u8, u8, u8, const u8 *); + +// EWRAM_DATA +static EWRAM_DATA const u8 *gUnknown_02039D90[16] = {0}; + +// text +bool8 ScriptMovement_StartObjectMovementScript(u8 localId, u8 mapNum, u8 mapGroup, const u8 *movementScript) +{ + u8 eventObjId; + + if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &eventObjId)) + return TRUE; + if (!FuncIsActiveTask(sub_80D3660)) + sub_80D33AC(50); + return sub_80D3408(sub_80D33F4(), eventObjId, movementScript); +} + +bool8 ScriptMovement_IsObjectMovementFinished(u8 localId, u8 mapNum, u8 mapBank) +{ + u8 eventObjId; + u8 r4; + u8 r1; + + if (TryGetEventObjectIdByLocalIdAndMap(localId, mapNum, mapBank, &eventObjId)) + return TRUE; + r4 = sub_80D33F4(); + r1 = sub_80D3474(r4, eventObjId); + if (r1 == 16) + return TRUE; + return sub_80D3584(r4, r1); +} + +void sub_80D338C(void) +{ + u8 taskId; + + taskId = sub_80D33F4(); + if (taskId != 0xFF) + { + UnfreezeObjects(taskId); + DestroyTask(taskId); + } +} + + +static void sub_80D33AC(u8 priority) +{ + u8 taskId; + u8 i; + + taskId = CreateTask(sub_80D3660, priority); + for (i = 1; i < 16; i++) + gTasks[taskId].data[i] = 0xFFFF; +} + +static u8 sub_80D33F4(void) +{ + return FindTaskIdByFunc(sub_80D3660); +} + +static bool8 sub_80D3408(u8 taskId, u8 eventObjId, const u8 *movementScript) +{ + u8 r4; + + r4 = sub_80D3474(taskId, eventObjId); + if (r4 != 16) + { + if (sub_80D3584(taskId, r4) == 0) + { + return TRUE; + } + else + { + sub_80D35DC(taskId, r4, eventObjId, movementScript); + return FALSE; + } + } + r4 = sub_80D3474(taskId, 0xFF); + if (r4 == 16) + { + return TRUE; + } + else + { + sub_80D35DC(taskId, r4, eventObjId, movementScript); + return FALSE; + } +} + +static u8 sub_80D3474(u8 taskId, u8 b) +{ + u8 *ptr; + u8 i; + + ptr = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, ptr++) + { + if (*ptr == b) + return i; + } + return 16; +} + +static void sub_80D34B0(u8 taskId, u8 b, u8 **c) +{ + u8 i; + + *c = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < b; i++, (*c)++) + ; +} + +static void sub_80D34E4(u8 taskId, u8 b, u8 c) +{ + u8 *ptr; + + sub_80D34B0(taskId, b, &ptr); + *ptr = c; //what is this supposed to do? +} + +static void sub_80D3508(u8 taskId, u8 b, u8 *c) +{ + u8 *ptr; + + sub_80D34B0(taskId, b, &ptr); + *c = *ptr; +} + +static void sub_80D352C(u8 a, u8 b) +{ + u16 var = ~gBitTable[b]; + + gTasks[a].data[0] &= var; +} + +static void sub_80D355C(u8 taskId, u8 b) +{ + gTasks[taskId].data[0] |= gBitTable[b]; +} + +static bool8 sub_80D3584(u8 taskId, u8 b) +{ + u16 var = (u16)gTasks[taskId].data[0] & gBitTable[b]; + + if (var != 0) + return TRUE; + else + return FALSE; +} + +static void npc_obj_offscreen_culling_and_flag_update(u8 a, const u8 *movementScript) +{ + gUnknown_02039D90[a] = movementScript; +} + +static const u8 *sub_80D35CC(u8 a) +{ + return gUnknown_02039D90[a]; +} + +static void sub_80D35DC(u8 taskId, u8 b, u8 eventObjId, const u8 *movementScript) +{ + sub_80D352C(taskId, b); + npc_obj_offscreen_culling_and_flag_update(b, movementScript); + sub_80D34E4(taskId, b, eventObjId); +} + +static void UnfreezeObjects(u8 taskId) +{ + u8 *pEventObjId; + u8 i; + + pEventObjId = (u8 *)&gTasks[taskId].data[1]; + for (i = 0; i < 16; i++, pEventObjId++) + { + if (*pEventObjId != 0xFF) + UnfreezeEventObject(&gEventObjects[*pEventObjId]); + } +} + +static void sub_80D3660(u8 taskId) +{ + u8 i; + u8 var; + + for (i = 0; i < 16; i++) + { + sub_80D3508(taskId, i, &var); + if (var != 0xFF) + sub_80A2490(taskId, i, var, sub_80D35CC(i)); + } +} + +static void sub_80A2490(u8 taskId, u8 b, u8 eventObjId, const u8 *d) +{ + u8 var; + + if (EventObjectIsHeldMovementActive(&gEventObjects[eventObjId]) + && !EventObjectClearHeldMovementIfFinished(&gEventObjects[eventObjId])) + return; + + var = *d; + if (var == 0xFE) + { + sub_80D355C(taskId, b); + FreezeEventObject(&gEventObjects[eventObjId]); + } + else + { + if (!EventObjectSetHeldMovement(&gEventObjects[eventObjId], var)) + { + d++; + npc_obj_offscreen_culling_and_flag_update(b, d); + } + } +} + diff --git a/src/secret_base.c b/src/secret_base.c index c886912f4..c71f7ed23 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -1,6 +1,7 @@ // Includes #include "global.h" +#include "constants/bg_event_constants.h" #include "constants/decorations.h" #include "malloc.h" #include "main.h" @@ -10,7 +11,6 @@ #include "list_menu.h" #include "menu.h" #include "menu_helpers.h" -#include "menu_indicators.h" #include "constants/maps.h" #include "constants/songs.h" #include "constants/species.h" @@ -21,7 +21,7 @@ #include "field_player_avatar.h" #include "field_screen.h" #include "field_weather.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "field_effect.h" #include "fldeff_80F9BCC.h" #include "metatile_behavior.h" @@ -39,8 +39,7 @@ #include "link.h" #include "tv.h" #include "secret_base.h" - -extern void (*gFieldCallback)(void); +#include "constants/map_types.h" extern void mapldr_default(void); @@ -249,16 +248,16 @@ void sub_80E8C98(void) void sub_80E8CB0(s16 *xPtr, s16 *yPtr, u16 tile) { - const struct MapData *mapData; + const struct MapLayout *mapLayout; s16 x; s16 y; - mapData = gMapHeader.mapData; - for (y = 0; y < mapData->height; y ++) + mapLayout = gMapHeader.mapLayout; + for (y = 0; y < mapLayout->height; y ++) { - for (x = 0; x < mapData->width; x ++) + for (x = 0; x < mapLayout->width; x ++) { - if ((mapData->map[y * mapData->width + x] & 0x3ff) == tile) + if ((mapLayout->map[y * mapLayout->width + x] & 0x3ff) == tile) { *xPtr = x; *yPtr = y; @@ -327,7 +326,7 @@ void sub_80E8E18(void) VarSet(VAR_SECRET_BASE_MAP, gMapHeader.regionMapSectionId); } -void sub_80E8EE0(struct MapEvents *events) +void sub_80E8EE0(struct MapEvents const *events) { u16 bgEventIndex; u16 i; @@ -338,7 +337,7 @@ void sub_80E8EE0(struct MapEvents *events) for (bgEventIndex = 0; bgEventIndex < events->bgEventCount; bgEventIndex ++) { - if (events->bgEvents[bgEventIndex].kind == 8) + if (events->bgEvents[bgEventIndex].kind == BG_EVENT_SECRET_BASE) { for (j = 0; j < 20; j ++) { @@ -415,8 +414,8 @@ bool8 sub_80E909C(void) void sub_80E90C8(u8 taskId) { - FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_NORTH); - if (sub_80ABDFC() == TRUE) + EventObjectTurn(&gEventObjects[gPlayerAvatar.eventObjectId], DIR_NORTH); + if (IsWeatherNotFadingIn() == TRUE) { EnableBothScriptContexts(); DestroyTask(taskId); @@ -535,14 +534,14 @@ void sub_80E933C(void) category = gDecorations[roomDecor[decorIdx]].category; if (permission == DECORPERM_SOLID_MAT) { - for (objIdx = 0; objIdx < gMapHeader.events->mapObjectCount; objIdx ++) + for (objIdx = 0; objIdx < gMapHeader.events->eventObjectCount; objIdx ++) { - if (gMapHeader.events->mapObjects[objIdx].flagId == gSpecialVar_0x8004 + 0xAE) + if (gMapHeader.events->eventObjects[objIdx].flagId == gSpecialVar_0x8004 + 0xAE) { break; } } - if (objIdx == gMapHeader.events->mapObjectCount) + if (objIdx == gMapHeader.events->eventObjectCount) { continue; } @@ -551,9 +550,9 @@ void sub_80E933C(void) metatile = MapGridGetMetatileBehaviorAt(gSpecialVar_0x8006 + 7, gSpecialVar_0x8007 + 7); if (MetatileBehavior_IsMB_B5(metatile) == TRUE || MetatileBehavior_IsMB_C3(metatile) == TRUE) { - gSpecialVar_Result = gMapHeader.events->mapObjects[objIdx].graphicsId + VAR_0x3F20; + gSpecialVar_Result = gMapHeader.events->eventObjects[objIdx].graphicsId + VAR_0x3F20; VarSet(gSpecialVar_Result, gDecorations[roomDecor[decorIdx]].tiles[0]); - gSpecialVar_Result = gMapHeader.events->mapObjects[objIdx].localId; + gSpecialVar_Result = gMapHeader.events->eventObjects[objIdx].localId; FlagClear(gSpecialVar_0x8004 + 0xAE); show_sprite(gSpecialVar_Result, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); sub_808EBA8(gSpecialVar_Result, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); @@ -581,12 +580,12 @@ void sub_80E9578(void) u8 objectEventIdx; u16 flagId; - for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->mapObjectCount; objectEventIdx ++) + for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->eventObjectCount; objectEventIdx ++) { - flagId = gMapHeader.events->mapObjects[objectEventIdx].flagId; + flagId = gMapHeader.events->eventObjects[objectEventIdx].flagId; if (flagId >= 0xAE && flagId <= 0xBB) { - RemoveFieldObjectByLocalIdAndMap(gMapHeader.events->mapObjects[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + RemoveEventObjectByLocalIdAndMap(gMapHeader.events->eventObjects[objectEventIdx].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); FlagSet(flagId); } } @@ -594,7 +593,7 @@ void sub_80E9578(void) void sub_80E95D4(void) { - VarSet(VAR_0x401F, gUnknown_0858D060[sub_80EA20C(VarGet(VAR_0x4054))]); + VarSet(VAR_OBJ_GFX_ID_F, gUnknown_0858D060[sub_80EA20C(VarGet(VAR_0x4054))]); } void sub_80E9608(struct Coords16 *coords, struct MapEvents *events) @@ -603,7 +602,7 @@ void sub_80E9608(struct Coords16 *coords, struct MapEvents *events) for (bgEventIdx = 0; bgEventIdx < events->bgEventCount; bgEventIdx ++) { - if (events->bgEvents[bgEventIdx].kind == 8 && coords->x == events->bgEvents[bgEventIdx].x + 7 && coords->y == events->bgEvents[bgEventIdx].y + 7) + if (events->bgEvents[bgEventIdx].kind == BG_EVENT_SECRET_BASE && coords->x == events->bgEvents[bgEventIdx].x + 7 && coords->y == events->bgEvents[bgEventIdx].y + 7) { sCurSecretBaseId = events->bgEvents[bgEventIdx].bgUnion.secretBaseId; break; @@ -783,7 +782,7 @@ void sub_80E9AD0(void) events = gMapHeader.events; for (i = 0; i < events->bgEventCount; i ++) { - if (events->bgEvents[i].kind == 8 && gSaveBlock1Ptr->secretBases[0].secretBaseId == events->bgEvents[i].bgUnion.secretBaseId) + if (events->bgEvents[i].kind == BG_EVENT_SECRET_BASE && gSaveBlock1Ptr->secretBases[0].secretBaseId == events->bgEvents[i].bgUnion.secretBaseId) { tile = MapGridGetMetatileIdAt(events->bgEvents[i].x + 7, events->bgEvents[i].y + 7); for (j = 0; j < 7; j ++) @@ -943,7 +942,7 @@ void sub_80E9E44(u8 taskId) s16 *data; data = gTasks[taskId].data; - data[8] = AddScrollIndicatorArrowPairParametrized(0x02, 0xbc, 0x0c, 0x94, data[0] - data[3], 0x13f8, 0x13f8, &data[2]); + data[8] = AddScrollIndicatorArrowPairParameterized(SCROLL_ARROW_UP, 0xbc, 0x0c, 0x94, data[0] - data[3], 0x13f8, 0x13f8, &data[2]); } void sub_80E9E90(u8 taskId) @@ -1676,7 +1675,7 @@ void sub_80EAEF4(struct SecretBaseRecordMixer *mixers) sub_80EABA4(&mixers[2], 0); } -void sub_80EAF80(void *records, size_t recordSize, u8 linkIdx) +void ReceiveSecretBasesData(void *records, size_t recordSize, u8 linkIdx) { struct SecretBaseRecordMixer mixers[3]; u16 i; diff --git a/src/start_menu.c b/src/start_menu.c index d076d307d..7591d3b57 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -8,6 +8,31 @@ #include "text.h" #include "strings.h" #include "bg.h" +#include "field_effect.h" +#include "task.h" +#include "overworld.h" +#include "link.h" +#include "battle_frontier_2.h" +#include "rom_818CFC8.h" +#include "field_specials.h" +#include "event_object_movement.h" +#include "script.h" +#include "main.h" +#include "sound.h" +#include "pokedex.h" +#include "field_weather.h" +#include "palette.h" +#include "item_menu.h" +#include "option_menu.h" +#include "event_scripts.h" +#include "save.h" +#include "gpu_regs.h" +#include "scanline_effect.h" +#include "text_window.h" +#include "load_save.h" +#include "international_string_util.h" +#include "constants/songs.h" +#include "field_player_avatar.h" // Menu actions enum @@ -27,49 +52,99 @@ enum MENU_ACTION_PYRAMID_BAG }; -extern bool32 is_c1_link_related_active(void); -extern bool32 InUnionRoom(void); -extern bool8 InBattlePike(void); -extern bool8 InBattlePyramid(void); -extern bool8 InMultiBattleRoom(void); -extern void NewMenuHelpers_DrawStdWindowFrame(u8 windowId, u8 a1); -extern void sub_8198070(u8 windowId, u8 a1); - -// this file's functions -static void BuildStartMenuActions_LinkMode(void); -static void BuildStartMenuActions_UnionRoom(void); -static void BuildStartMenuActions_SafariZone(void); -static void BuildStartMenuActions_BattlePike(void); -static void BuildStartMenuActions_BattlePyramid(void); -static void BuildStartMenuActions_MultiBattleRoom(void); -static void BuildStartMenuActions_Normal(void); -bool8 StartMenu_Pokedex(void); -bool8 StartMenu_Pokemon(void); -bool8 StartMenu_Bag(void); -bool8 StartMenu_PokeNav(void); -bool8 StartMenu_PlayerName(void); -bool8 StartMenu_Save(void); -bool8 StartMenu_Option(void); -bool8 StartMenu_Exit(void); -bool8 StartMenu_SafariZoneRetire(void); -bool8 StartMenu_LinkModePlayerName(void); -bool8 StartMenu_BattlePyramidRetire(void); -bool8 StartMenu_BattlePyramidBag(void); - -// EWRAM vars -EWRAM_DATA u8 sSafariBallsWindowId = 0; -EWRAM_DATA u8 sBattlePyramidFloorWindowId = 0; -EWRAM_DATA u8 sStartMenuCursorPos = 0; -EWRAM_DATA u8 sNumStartMenuActions = 0; -EWRAM_DATA u8 sCurrentStartMenuActions[9] = {0}; -EWRAM_DATA u8 gUnknown_02037619[2] = {0}; -EWRAM_DATA bool8 (*gUnknown_0203761C)(void) = NULL; -EWRAM_DATA u8 gUnknown_02037620 = 0; -EWRAM_DATA u8 gUnknown_02037621 = 0; -EWRAM_DATA u8 gUnknown_02037622 = 0; - -// const rom data -static const struct WindowTemplate gSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8}; +// Save status +enum +{ + SAVE_IN_PROGRESS, + SAVE_SUCCESS, + SAVE_CANCELED, + SAVE_ERROR +}; + +EWRAM_DATA static u8 sSafariBallsWindowId = 0; +EWRAM_DATA static u8 sBattlePyramidFloorWindowId = 0; +EWRAM_DATA static u8 sStartMenuCursorPos = 0; +EWRAM_DATA static u8 sNumStartMenuActions = 0; +EWRAM_DATA static u8 sCurrentStartMenuActions[9] = {0}; +EWRAM_DATA static u8 sUnknown_02037619[2] = {0}; + +EWRAM_DATA static u8 (*sSaveDialogCallback)(void) = NULL; +EWRAM_DATA static u8 sSaveDialogTimer = 0; +EWRAM_DATA static bool8 sSavingComplete = FALSE; +EWRAM_DATA static u8 sSaveInfoWindowId = 0; + +// Extern variables +extern u8 gDifferentSaveFile; +extern u16 gSaveFileStatus; +extern u8 gUnknown_03005DB4; + +// Extern functions in uncompiled files +extern void sub_80AF688(void); +extern void var_800D_set_xB(void); +extern void sub_808B864(void); +extern void sub_80BB534(void); +extern void play_some_sound(void); +extern void CB2_PartyMenuFromStartMenu(void); +extern void CB2_PokeNav(void); +extern void sub_80C4DDC(void (*)(void)); +extern void sub_80C51C4(void (*)(void)); +extern void sub_80C4E74(u8, void (*)(void)); +extern void sub_81C4EFC(void); +extern void ScriptUnfreezeEventObjects(void); +extern void sub_81A9EC8(void); +extern void save_serialize_map(void); +extern void sub_81A9E90(void); + +// Menu action callbacks +static bool8 StartMenuPokedexCallback(void); +static bool8 StartMenuPokemonCallback(void); +static bool8 StartMenuBagCallback(void); +static bool8 StartMenuPokeNavCallback(void); +static bool8 StartMenuPlayerNameCallback(void); +static bool8 StartMenuSaveCallback(void); +static bool8 StartMenuOptionCallback(void); +static bool8 StartMenuExitCallback(void); +static bool8 StartMenuSafariZoneRetireCallback(void); +static bool8 StartMenuLinkModePlayerNameCallback(void); +static bool8 StartMenuBattlePyramidRetireCallback(void); +static bool8 StartMenuBattlePyramidBagCallback(void); + +// Menu callbacks +static bool8 SaveStartCallback(void); +static bool8 SaveCallback(void); +static bool8 BattlePyramidRetireStartCallback(void); +static bool8 BattlePyramidRetireReturnCallback(void); +static bool8 BattlePyramidRetireCallback(void); +static bool8 HandleStartMenuInput(void); + +// Save dialog callbacks +static u8 SaveConfirmSaveCallback(void); +static u8 SaveYesNoCallback(void); +static u8 SaveConfirmInputCallback(void); +static u8 SaveFileExistsCallback(void); +static u8 SaveConfirmOverwriteNoCallback(void); +static u8 SaveConfirmOverwriteCallback(void); +static u8 SaveOverwriteInputCallback(void); +static u8 SaveSavingMessageCallback(void); +static u8 SaveDoSaveCallback(void); +static u8 SaveSuccessCallback(void); +static u8 SaveReturnSuccessCallback(void); +static u8 SaveErrorCallback(void); +static u8 SaveReturnErrorCallback(void); +static u8 BattlePyramidConfirmRetireCallback(void); +static u8 BattlePyramidRetireYesNoCallback(void); +static u8 BattlePyramidRetireInputCallback(void); + +// Task callbacks +static void StartMenuTask(u8 taskId); +static void SaveGameTask(u8 taskId); +static void sub_80A0550(u8 taskId); +static void sub_80A08A4(u8 taskId); + +// Some other callback +static bool8 sub_809FA00(void); + +static const struct WindowTemplate sSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8}; static const u8* const sPyramindFloorNames[] = { @@ -83,27 +158,27 @@ static const u8* const sPyramindFloorNames[] = gText_Peak }; -static const struct WindowTemplate gPyramidFloorWindowTemplate_2 = {0, 1, 1, 0xA, 4, 0xF, 8}; -static const struct WindowTemplate gPyramidFloorWindowTemplate_1 = {0, 1, 1, 0xC, 4, 0xF, 8}; - -const struct MenuAction sStartMenuItems[] = -{ - {gText_MenuPokedex, {.u8_void = StartMenu_Pokedex}}, - {gText_MenuPokemon, {.u8_void = StartMenu_Pokemon}}, - {gText_MenuBag, {.u8_void = StartMenu_Bag}}, - {gText_MenuPokenav, {.u8_void = StartMenu_PokeNav}}, - {gText_MenuPlayer, {.u8_void = StartMenu_PlayerName}}, - {gText_MenuSave, {.u8_void = StartMenu_Save}}, - {gText_MenuOption, {.u8_void = StartMenu_Option}}, - {gText_MenuExit, {.u8_void = StartMenu_Exit}}, - {gText_MenuRetire, {.u8_void = StartMenu_SafariZoneRetire}}, - {gText_MenuPlayer, {.u8_void = StartMenu_LinkModePlayerName}}, - {gText_MenuRest, {.u8_void = StartMenu_Save}}, - {gText_MenuRetire, {.u8_void = StartMenu_BattlePyramidRetire}}, - {gText_MenuBag, {.u8_void = StartMenu_BattlePyramidBag}} +static const struct WindowTemplate sPyramidFloorWindowTemplate_2 = {0, 1, 1, 0xA, 4, 0xF, 8}; +static const struct WindowTemplate sPyramidFloorWindowTemplate_1 = {0, 1, 1, 0xC, 4, 0xF, 8}; + +static const struct MenuAction sStartMenuItems[] = +{ + {gText_MenuPokedex, {.u8_void = StartMenuPokedexCallback}}, + {gText_MenuPokemon, {.u8_void = StartMenuPokemonCallback}}, + {gText_MenuBag, {.u8_void = StartMenuBagCallback}}, + {gText_MenuPokenav, {.u8_void = StartMenuPokeNavCallback}}, + {gText_MenuPlayer, {.u8_void = StartMenuPlayerNameCallback}}, + {gText_MenuSave, {.u8_void = StartMenuSaveCallback}}, + {gText_MenuOption, {.u8_void = StartMenuOptionCallback}}, + {gText_MenuExit, {.u8_void = StartMenuExitCallback}}, + {gText_MenuRetire, {.u8_void = StartMenuSafariZoneRetireCallback}}, + {gText_MenuPlayer, {.u8_void = StartMenuLinkModePlayerNameCallback}}, + {gText_MenuRest, {.u8_void = StartMenuSaveCallback}}, + {gText_MenuRetire, {.u8_void = StartMenuBattlePyramidRetireCallback}}, + {gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}} }; -const struct BgTemplate gUnknown_085105A8[] = +static const struct BgTemplate sUnknown_085105A8[] = { { .bg = 0, @@ -116,15 +191,47 @@ const struct BgTemplate gUnknown_085105A8[] = } }; -const struct WindowTemplate gUnknown_085105AC[] = +static const struct WindowTemplate sUnknown_085105AC[] = { {0, 2, 0xF, 0x1A, 4, 0xF, 0x194}, DUMMY_WIN_TEMPLATE }; -const struct WindowTemplate gUnknown_085105BC = {0, 1, 1, 0xE, 0xA, 0xF, 8}; +static const struct WindowTemplate sSaveInfoWindowTemplate = {0, 1, 1, 0xE, 0xA, 0xF, 8}; + +// Local functions +static void BuildStartMenuActions(void); +static void AddStartMenuAction(u8 action); +static void BuildNormalStartMenu(void); +static void BuildSafariZoneStartMenu(void); +static void BuildLinkModeStartMenu(void); +static void BuildUnionRoomStartMenu(void); +static void BuildBattlePikeStartMenu(void); +static void BuildBattlePyramidStartMenu(void); +static void BuildMultiBattleRoomStartMenu(void); +static void ShowSafariBallsWindow(void); +static void ShowPyramidFloorWindow(void); +static void RemoveExtraStartMenuWindows(void); +static bool32 PrintStartMenuActions(s8 *pIndex, u32 count); +static bool32 InitStartMenuStep(void); +static void InitStartMenu(void); +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 HideSaveInfoWindow(void); +static void SaveStartTimer(void); +static bool8 SaveSuccesTimer(void); +static bool8 SaveErrorTimer(void); +static void InitBattlePyramidRetire(void); +static void sub_80A03D8(void); +static bool32 sub_80A03E4(u8 *par1); +static void sub_80A0540(void); +static void ShowSaveInfoWindow(void); +static void RemoveSaveInfoWindow(void); +static void HideStartMenuWindow(void); -// code void SetDexPokemonPokenavFlags(void) // unused { FlagSet(FLAG_SYS_POKEDEX_GET); @@ -132,46 +239,70 @@ void SetDexPokemonPokenavFlags(void) // unused FlagSet(FLAG_SYS_POKENAV_GET); } -void BuildStartMenuActions(void) +static void BuildStartMenuActions(void) { sNumStartMenuActions = 0; + if (is_c1_link_related_active() == TRUE) - BuildStartMenuActions_LinkMode(); + { + BuildLinkModeStartMenu(); + } else if (InUnionRoom() == TRUE) - BuildStartMenuActions_UnionRoom(); + { + BuildUnionRoomStartMenu(); + } else if (GetSafariZoneFlag() == TRUE) - BuildStartMenuActions_SafariZone(); + { + BuildSafariZoneStartMenu(); + } else if (InBattlePike()) - BuildStartMenuActions_BattlePike(); + { + BuildBattlePikeStartMenu(); + } else if (InBattlePyramid()) - BuildStartMenuActions_BattlePyramid(); + { + BuildBattlePyramidStartMenu(); + } else if (InMultiBattleRoom()) - BuildStartMenuActions_MultiBattleRoom(); + { + BuildMultiBattleRoomStartMenu(); + } else - BuildStartMenuActions_Normal(); + { + BuildNormalStartMenu(); + } } -void AddStartMenuAction(u8 action) +static void AddStartMenuAction(u8 action) { AppendToList(sCurrentStartMenuActions, &sNumStartMenuActions, action); } -static void BuildStartMenuActions_Normal(void) +static void BuildNormalStartMenu(void) { if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) + { AddStartMenuAction(MENU_ACTION_POKEDEX); + } if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE) + { AddStartMenuAction(MENU_ACTION_POKEMON); + } + AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) + { AddStartMenuAction(MENU_ACTION_POKENAV); + } + AddStartMenuAction(MENU_ACTION_PLAYER); AddStartMenuAction(MENU_ACTION_SAVE); AddStartMenuAction(MENU_ACTION_OPTION); AddStartMenuAction(MENU_ACTION_EXIT); } -static void BuildStartMenuActions_SafariZone(void) +static void BuildSafariZoneStartMenu(void) { AddStartMenuAction(MENU_ACTION_RETIRE_SAFARI); AddStartMenuAction(MENU_ACTION_POKEDEX); @@ -182,29 +313,37 @@ static void BuildStartMenuActions_SafariZone(void) AddStartMenuAction(MENU_ACTION_EXIT); } -static void BuildStartMenuActions_LinkMode(void) +static void BuildLinkModeStartMenu(void) { AddStartMenuAction(MENU_ACTION_POKEMON); AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) + { AddStartMenuAction(MENU_ACTION_POKENAV); + } + AddStartMenuAction(MENU_ACTION_PLAYER_LINK); AddStartMenuAction(MENU_ACTION_OPTION); AddStartMenuAction(MENU_ACTION_EXIT); } -static void BuildStartMenuActions_UnionRoom(void) +static void BuildUnionRoomStartMenu(void) { AddStartMenuAction(MENU_ACTION_POKEMON); AddStartMenuAction(MENU_ACTION_BAG); + if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE) + { AddStartMenuAction(MENU_ACTION_POKENAV); + } + AddStartMenuAction(MENU_ACTION_PLAYER); AddStartMenuAction(MENU_ACTION_OPTION); AddStartMenuAction(MENU_ACTION_EXIT); } -static void BuildStartMenuActions_BattlePike(void) +static void BuildBattlePikeStartMenu(void) { AddStartMenuAction(MENU_ACTION_POKEDEX); AddStartMenuAction(MENU_ACTION_POKEMON); @@ -213,7 +352,7 @@ static void BuildStartMenuActions_BattlePike(void) AddStartMenuAction(MENU_ACTION_EXIT); } -static void BuildStartMenuActions_BattlePyramid(void) +static void BuildBattlePyramidStartMenu(void) { AddStartMenuAction(MENU_ACTION_POKEMON); AddStartMenuAction(MENU_ACTION_PYRAMID_BAG); @@ -224,7 +363,7 @@ static void BuildStartMenuActions_BattlePyramid(void) AddStartMenuAction(MENU_ACTION_EXIT); } -static void BuildStartMenuActions_MultiBattleRoom(void) +static void BuildMultiBattleRoomStartMenu(void) { AddStartMenuAction(MENU_ACTION_POKEMON); AddStartMenuAction(MENU_ACTION_PLAYER); @@ -232,74 +371,1052 @@ static void BuildStartMenuActions_MultiBattleRoom(void) AddStartMenuAction(MENU_ACTION_EXIT); } -void DisplaySafariBallsWindow(void) +static void ShowSafariBallsWindow(void) { - sSafariBallsWindowId = AddWindow(&gSafariBallsWindowTemplate); + sSafariBallsWindowId = AddWindow(&sSafariBallsWindowTemplate); PutWindowTilemap(sSafariBallsWindowId); - NewMenuHelpers_DrawStdWindowFrame(sSafariBallsWindowId, 0); + NewMenuHelpers_DrawStdWindowFrame(sSafariBallsWindowId, FALSE); ConvertIntToDecimalStringN(gStringVar1, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2); StringExpandPlaceholders(gStringVar4, gText_SafariBallStock); PrintTextOnWindow(sSafariBallsWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL); CopyWindowToVram(sSafariBallsWindowId, 2); } -void DisplayPyramidFloorWindow(void) +static void ShowPyramidFloorWindow(void) { - // TODO: fix location - if (gSaveBlock2Ptr->field_CAA[4] == 7) - sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_1); + if (gSaveBlock2Ptr->frontier.field_CB2 == 7) + sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_1); else - sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_2); + sBattlePyramidFloorWindowId = AddWindow(&sPyramidFloorWindowTemplate_2); + PutWindowTilemap(sBattlePyramidFloorWindowId); - NewMenuHelpers_DrawStdWindowFrame(sBattlePyramidFloorWindowId, 0); - StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->field_CAA[4]]); + NewMenuHelpers_DrawStdWindowFrame(sBattlePyramidFloorWindowId, FALSE); + StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->frontier.field_CB2]); StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor); PrintTextOnWindow(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL); CopyWindowToVram(sBattlePyramidFloorWindowId, 2); } -void RemoveExtraStartMenuWindows(void) +static void RemoveExtraStartMenuWindows(void) { if (GetSafariZoneFlag()) { - sub_8198070(sSafariBallsWindowId, 0); + sub_8198070(sSafariBallsWindowId, FALSE); CopyWindowToVram(sSafariBallsWindowId, 2); RemoveWindow(sSafariBallsWindowId); } if (InBattlePyramid()) { - sub_8198070(sBattlePyramidFloorWindowId, 0); + sub_8198070(sBattlePyramidFloorWindowId, FALSE); RemoveWindow(sBattlePyramidFloorWindowId); } } -/* -// Prints n menu items starting at *index -static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) +static bool32 PrintStartMenuActions(s8 *pIndex, u32 count) { - s8 _index = *index; + s8 index = *pIndex; do { - if (sStartMenuItems[sCurrentStartMenuActions[_index]].func.u8_void == StartMenu_PlayerName) + if (sStartMenuItems[sCurrentStartMenuActions[index]].func.u8_void == StartMenuPlayerNameCallback) { + PrintPlayerNameOnWindow(GetStartMenuWindowId(), sStartMenuItems[sCurrentStartMenuActions[index]].text, 8, (index << 4) + 9); + } + else { + StringExpandPlaceholders(gStringVar4, sStartMenuItems[sCurrentStartMenuActions[index]].text); + PrintTextOnWindow(GetStartMenuWindowId(), 1, gStringVar4, 8, (index << 4) + 9, 0xFF, NULL); + } + + index++; + if (index >= sNumStartMenuActions) { + *pIndex = index; + return TRUE; + } + + count--; + } + while (count != 0); + + *pIndex = index; + return FALSE; +} + +static bool32 InitStartMenuStep(void) +{ + s8 value = sUnknown_02037619[0]; + + switch (value) + { + case 0: + sUnknown_02037619[0]++; + break; + case 1: + BuildStartMenuActions(); + sUnknown_02037619[0]++; + break; + case 2: + sub_81973A4(); + NewMenuHelpers_DrawStdWindowFrame(sub_81979C4(sNumStartMenuActions), FALSE); + sUnknown_02037619[1] = 0; + sUnknown_02037619[0]++; + break; + case 3: + if (GetSafariZoneFlag() != FALSE) + { + ShowSafariBallsWindow(); + } + if (InBattlePyramid() != FALSE) { + ShowPyramidFloorWindow(); + } + sUnknown_02037619[0]++; + break; + case 4: + if (PrintStartMenuActions(&sUnknown_02037619[1], 2) == FALSE) + { + break; + } + sUnknown_02037619[0]++; + break; + case 5: + sStartMenuCursorPos = sub_81983AC(GetStartMenuWindowId(), 1, 0, 9, 16, sNumStartMenuActions, sStartMenuCursorPos); + CopyWindowToVram(GetStartMenuWindowId(), TRUE); + return TRUE; + } + + return FALSE; +} + +static void InitStartMenu(void) +{ + sUnknown_02037619[0] = 0; + sUnknown_02037619[1] = 0; + while (!InitStartMenuStep()); +} + +static void StartMenuTask(u8 taskId) +{ + if (InitStartMenuStep() == TRUE) + { + SwitchTaskToFollowupFunc(taskId); + } +} + +static void CreateStartMenuTask(TaskFunc followupFunc) +{ + u8 taskId; + + sUnknown_02037619[0] = 0; + sUnknown_02037619[1] = 0; + taskId = CreateTask(StartMenuTask, 0x50); + SetTaskFuncWithFollowupFunc(taskId, StartMenuTask, followupFunc); +} + +static bool8 sub_809FA00(void) +{ + if (InitStartMenuStep() == FALSE) + { + return FALSE; + } + + sub_80AF688(); + return TRUE; +} +void sub_809FA18(void) // Called from field_screen.s +{ + sUnknown_02037619[0] = 0; + sUnknown_02037619[1] = 0; + gFieldCallback2 = sub_809FA00; +} + +void sub_809FA34(u8 taskId) // Referenced in field_screen.s and rom_8011DC0.s +{ + struct Task* task = &gTasks[taskId]; + + switch(task->data[0]) + { + case 0: + if (InUnionRoom() == TRUE) + { + var_800D_set_xB(); } - else + + gMenuCallback = HandleStartMenuInput; + task->data[0]++; + break; + case 1: + if (gMenuCallback() == TRUE) { + DestroyTask(taskId); + } + break; + } +} +void ShowStartMenu(void) // Called from overworld.c and field_control_avatar.s +{ + if (!is_c1_link_related_active()) + { + FreezeEventObjects(); + sub_808B864(); + sub_808BCF4(); + } + CreateStartMenuTask(sub_809FA34); + ScriptContext2_Enable(); +} + +static bool8 HandleStartMenuInput(void) +{ + if (gMain.newKeys & DPAD_UP) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = MoveMenuCursor(-1); + } + + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + sStartMenuCursorPos = MoveMenuCursor(1); + } + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + if (sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void == StartMenuPokedexCallback) + { + if (GetNationalPokedexCount(0) == 0) { + return FALSE; + } } - } while (++_index > sNumStartMenuActions); + gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void; + + if (gMenuCallback != StartMenuSaveCallback + && gMenuCallback != StartMenuExitCallback + && gMenuCallback != StartMenuSafariZoneRetireCallback + && gMenuCallback != StartMenuBattlePyramidRetireCallback) + { + FadeScreen(1, 0); + } + + return FALSE; + } + + if (gMain.newKeys & (START_BUTTON | B_BUTTON)) + { + RemoveExtraStartMenuWindows(); + HideStartMenu(); + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuPokedexCallback(void) +{ + if (!gPaletteFade.active) + { + IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + SetMainCallback2(sub_80BB534); // Display pokedex + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuPokemonCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + SetMainCallback2(CB2_PartyMenuFromStartMenu); // Display party menu + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuBagCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + SetMainCallback2(CB2_BagMenuFromStartMenu); // Display bag menu + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuPokeNavCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + SetMainCallback2(CB2_PokeNav); // Display PokeNav + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuPlayerNameCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + + if (is_c1_link_related_active() || InUnionRoom()) + { + sub_80C4DDC(CB2_ReturnToFieldWithOpenMenu); // Display trainer card + } + else if (FlagGet(FLAG_SYS_FRONTIER_PASS)) + { + sub_80C51C4(CB2_ReturnToFieldWithOpenMenu); // Display frontier pass + } + else + { + sub_80C4DDC(CB2_ReturnToFieldWithOpenMenu); // Display trainer card + } + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuSaveCallback(void) +{ + if (InBattlePyramid()) + { + RemoveExtraStartMenuWindows(); + } + + gMenuCallback = SaveStartCallback; // Display save menu + + return FALSE; +} + +static bool8 StartMenuOptionCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + SetMainCallback2(CB2_InitOptionMenu); // Display option menu + gMain.savedCallback = CB2_ReturnToFieldWithOpenMenu; + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuExitCallback(void) +{ + RemoveExtraStartMenuWindows(); + HideStartMenu(); // Hide start menu + + return TRUE; +} + +static bool8 StartMenuSafariZoneRetireCallback(void) +{ + RemoveExtraStartMenuWindows(); + HideStartMenu(); + SafariZoneRetirePrompt(); + + return TRUE; +} + +static bool8 StartMenuLinkModePlayerNameCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + overworld_free_bg_tilemaps(); + sub_80C4E74(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu); + + return TRUE; + } + + return FALSE; +} + +static bool8 StartMenuBattlePyramidRetireCallback(void) +{ + gMenuCallback = BattlePyramidRetireStartCallback; // Confirm retire + + return FALSE; +} + +void sub_809FDD4(void) // Called from battle_frontier_2.s +{ + sub_8197DF8(0, FALSE); + ScriptUnfreezeEventObjects(); + CreateStartMenuTask(sub_809FA34); + ScriptContext2_Enable(); +} + +static bool8 StartMenuBattlePyramidBagCallback(void) +{ + if (!gPaletteFade.active) + { + play_some_sound(); + RemoveExtraStartMenuWindows(); + overworld_free_bg_tilemaps(); + SetMainCallback2(sub_81C4EFC); // Display battle pyramid bag + + return TRUE; + } + + return FALSE; +} + +static bool8 SaveStartCallback(void) +{ + InitSave(); + gMenuCallback = SaveCallback; + + return FALSE; +} + +static bool8 SaveCallback(void) +{ + switch (RunSaveCallback()) + { + case SAVE_IN_PROGRESS: + return FALSE; + case SAVE_CANCELED: // Back to start menu + sub_8197DF8(0, FALSE); + InitStartMenu(); + gMenuCallback = HandleStartMenuInput; + return FALSE; + case SAVE_SUCCESS: + case SAVE_ERROR: // Close start menu + sub_8197DF8(0, TRUE); + ScriptUnfreezeEventObjects(); + ScriptContext2_Disable(); + sub_81A9EC8(); + return TRUE; + } + + return FALSE; +} + +static bool8 BattlePyramidRetireStartCallback(void) +{ + InitBattlePyramidRetire(); + gMenuCallback = BattlePyramidRetireCallback; + + return FALSE; +} + +static bool8 BattlePyramidRetireReturnCallback(void) +{ + InitStartMenu(); + gMenuCallback = HandleStartMenuInput; + + return FALSE; +} - if (--n == 0) +static bool8 BattlePyramidRetireCallback(void) +{ + switch (RunSaveCallback()) { - *index = _index; + case SAVE_SUCCESS: // No (Stay in battle pyramid) + RemoveExtraStartMenuWindows(); + gMenuCallback = BattlePyramidRetireReturnCallback; + return FALSE; + case SAVE_IN_PROGRESS: return FALSE; + case SAVE_CANCELED: // Yes (Retire from battle pyramid) + sub_8197DF8(0, TRUE); + ScriptUnfreezeEventObjects(); + ScriptContext2_Disable(); + ScriptContext1_SetupScript(BattleFrontier_BattlePyramidEmptySquare_EventScript_252C88); + return TRUE; + } + + return FALSE; +} + +static void InitSave(void) +{ + save_serialize_map(); + sSaveDialogCallback = SaveConfirmSaveCallback; + sSavingComplete = FALSE; +} + +static u8 RunSaveCallback(void) +{ + // True if text is still printing + if (sub_8197224() == TRUE) + { + return SAVE_IN_PROGRESS; + } + + sSavingComplete = FALSE; + return sSaveDialogCallback(); +} + +void SaveGame(void) // Called from cable_club.s +{ + InitSave(); + CreateTask(SaveGameTask, 0x50); +} + +static void ShowSaveMessage(const u8 *message, u8 (*saveCallback)(void)) +{ + StringExpandPlaceholders(gStringVar4, message); + sub_819786C(0, TRUE); + AddTextPrinterForMessage_2(TRUE); + sSavingComplete = TRUE; + sSaveDialogCallback = saveCallback; +} + +static void SaveGameTask(u8 taskId) +{ + u8 status = RunSaveCallback(); + + switch (status) + { + case SAVE_CANCELED: + case SAVE_ERROR: + gSpecialVar_Result = 0; + break; + case SAVE_SUCCESS: + gSpecialVar_Result = status; + break; + case SAVE_IN_PROGRESS: + return; + } + + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +static void sub_80A0014(void) +{ + sub_8197434(0, TRUE); +} + +static void HideSaveInfoWindow(void) +{ + RemoveSaveInfoWindow(); +} + +static void SaveStartTimer(void) +{ + sSaveDialogTimer = 60; +} + +static bool8 SaveSuccesTimer(void) +{ + sSaveDialogTimer--; + + if (gMain.heldKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + return TRUE; + } + else if (sSaveDialogTimer == 0) + { + return TRUE; + } + + return FALSE; +} + +static bool8 SaveErrorTimer(void) +{ + if (sSaveDialogTimer != 0) + { + sSaveDialogTimer--; + } + else if (gMain.heldKeys & A_BUTTON) + { + return TRUE; + } + + return FALSE; +} + +static u8 SaveConfirmSaveCallback(void) +{ + sub_819746C(GetStartMenuWindowId(), FALSE); + RemoveStartMenuWindow(); + ShowSaveInfoWindow(); + + if (InBattlePyramid()) + { + ShowSaveMessage(gText_BattlePyramidConfirmRest, SaveYesNoCallback); } else { - *index = _index; + ShowSaveMessage(gText_ConfirmSave, SaveYesNoCallback); + } + + return SAVE_IN_PROGRESS; +} + +static u8 SaveYesNoCallback(void) +{ + sub_8197930(); // Show Yes/No menu + sSaveDialogCallback = SaveConfirmInputCallback; + return SAVE_IN_PROGRESS; +} + +static u8 SaveConfirmInputCallback(void) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: // Yes + switch (gSaveFileStatus) + { + case 0: + case 2: + if (gDifferentSaveFile == FALSE) + { + sSaveDialogCallback = SaveFileExistsCallback; + return SAVE_IN_PROGRESS; + } + + sSaveDialogCallback = SaveSavingMessageCallback; + return SAVE_IN_PROGRESS; + default: + sSaveDialogCallback = SaveFileExistsCallback; + return SAVE_IN_PROGRESS; + } + case -1: // B Button + case 1: // No + HideSaveInfoWindow(); + sub_80A0014(); + return SAVE_CANCELED; + } + + return SAVE_IN_PROGRESS; +} + +// A different save file exists +static u8 SaveFileExistsCallback(void) +{ + if (gDifferentSaveFile == TRUE) + { + ShowSaveMessage(gText_DifferentSaveFile, SaveConfirmOverwriteNoCallback); + } + else + { + ShowSaveMessage(gText_AlreadySavedFile, SaveConfirmOverwriteCallback); + } + + return SAVE_IN_PROGRESS; +} + +static u8 SaveConfirmOverwriteNoCallback(void) +{ + sub_8197948(1); // Show Yes/No menu (No selected as default) + sSaveDialogCallback = SaveOverwriteInputCallback; + return SAVE_IN_PROGRESS; +} + +static u8 SaveConfirmOverwriteCallback(void) +{ + sub_8197930(); // Show Yes/No menu + sSaveDialogCallback = SaveOverwriteInputCallback; + return SAVE_IN_PROGRESS; +} + +static u8 SaveOverwriteInputCallback(void) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: // Yes + sSaveDialogCallback = SaveSavingMessageCallback; + return SAVE_IN_PROGRESS; + case -1: // B Button + case 1: // No + HideSaveInfoWindow(); + sub_80A0014(); + return SAVE_CANCELED; + } + + return SAVE_IN_PROGRESS; +} + +static u8 SaveSavingMessageCallback(void) +{ + ShowSaveMessage(gText_SavingDontTurnOff, SaveDoSaveCallback); + return SAVE_IN_PROGRESS; +} + +static u8 SaveDoSaveCallback(void) +{ + u8 saveStatus; + + IncrementGameStat(GAME_STAT_SAVED_GAME); + sub_81A9E90(); + + if (gDifferentSaveFile == TRUE) + { + saveStatus = TrySavingData(SAVE_OVERWRITE_DIFFERENT_FILE); + gDifferentSaveFile = FALSE; + } + else + { + saveStatus = TrySavingData(SAVE_NORMAL); + } + + if (saveStatus == 1) // Save succeded + { + ShowSaveMessage(gText_PlayerSavedGame, SaveSuccessCallback); + } + else // Save error + { + ShowSaveMessage(gText_SaveError, SaveErrorCallback); + } + + SaveStartTimer(); + return SAVE_IN_PROGRESS; +} + +static u8 SaveSuccessCallback(void) +{ + if (!IsTextPrinterActive(0)) + { + PlaySE(SE_SAVE); + sSaveDialogCallback = SaveReturnSuccessCallback; + } + + return SAVE_IN_PROGRESS; +} + +static u8 SaveReturnSuccessCallback(void) +{ + if (!IsSEPlaying() && SaveSuccesTimer()) + { + HideSaveInfoWindow(); + return SAVE_SUCCESS; + } + else + { + return SAVE_IN_PROGRESS; + } +} + +static u8 SaveErrorCallback(void) +{ + if (!IsTextPrinterActive(0)) + { + PlaySE(SE_BOO); + sSaveDialogCallback = SaveReturnErrorCallback; + } + + return SAVE_IN_PROGRESS; +} + +static u8 SaveReturnErrorCallback(void) +{ + if (!SaveErrorTimer()) + { + return SAVE_IN_PROGRESS; + } + else + { + HideSaveInfoWindow(); + return SAVE_ERROR; + } +} + +static void InitBattlePyramidRetire(void) +{ + sSaveDialogCallback = BattlePyramidConfirmRetireCallback; + sSavingComplete = FALSE; +} + +static u8 BattlePyramidConfirmRetireCallback(void) +{ + sub_819746C(GetStartMenuWindowId(), FALSE); + RemoveStartMenuWindow(); + ShowSaveMessage(gText_BattlePyramidConfirmRetire, BattlePyramidRetireYesNoCallback); + + return SAVE_IN_PROGRESS; +} + +static u8 BattlePyramidRetireYesNoCallback(void) +{ + sub_8197948(1); // Show Yes/No menu (No selected as default) + sSaveDialogCallback = BattlePyramidRetireInputCallback; + + return SAVE_IN_PROGRESS; +} + +static u8 BattlePyramidRetireInputCallback(void) +{ + switch (ProcessMenuInputNoWrap_()) + { + case 0: // Yes + return SAVE_CANCELED; + case -1: // B Button + case 1: // No + sub_80A0014(); + return SAVE_SUCCESS; + } + + return SAVE_IN_PROGRESS; +} + +static void sub_80A03D8(void) +{ + TransferPlttBuffer(); +} + +static bool32 sub_80A03E4(u8 *par1) +{ + switch (*par1) + { + case 0: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); + SetVBlankCallback(NULL); + ScanlineEffect_Stop(); + DmaClear16(3, PLTT, PLTT_SIZE); + DmaFillLarge16(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); + break; + case 1: + ResetSpriteData(); + ResetTasks(); + ResetPaletteFade(); + ScanlineEffect_Clear(); + break; + case 2: + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sUnknown_085105A8, ARRAY_COUNT(sUnknown_085105A8)); + InitWindows(sUnknown_085105AC); + LoadUserWindowBorderGfx_(0, 8, 224); + sub_81978B0(240); + break; + case 3: + ShowBg(0); + BlendPalettes(-1, 16, 0); + SetVBlankCallback(sub_80A03D8); + EnableInterrupts(1); + break; + case 4: return TRUE; } -}*/ + + (*par1)++; + return FALSE; +} + +void sub_80A0514(void) // Called from cable_club.s +{ + if (sub_80A03E4(&gMain.state)) + { + CreateTask(sub_80A0550, 0x50); + SetMainCallback2(sub_80A0540); + } +} + +static void sub_80A0540(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void sub_80A0550(u8 taskId) +{ + s16 *step = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + switch (*step) + { + case 0: + FillWindowPixelBuffer(0, 17); + AddTextPrinterParameterized(0, + 1, + gText_SavingDontTurnOffPower, + 255, + NULL, + 2, + 1, + 3); + sub_8098858(0, 8, 14); + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); + + if (gWirelessCommType != 0 && InUnionRoom()) + { + if (sub_800A07C()) + { + *step = 1; + } + else + { + *step = 5; + } + } + else + { + gSoftResetDisabled = 1; + *step = 1; + } + break; + case 1: + sub_8076D5C(); + sub_8153430(); + *step = 2; + break; + case 2: + if (sub_8153474()) + { + sav2_gender2_inplace_and_xFE(); + *step = 3; + gSoftResetDisabled = 0; + } + break; + case 3: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + *step = 4; + break; + case 4: + FreeAllWindowBuffers(); + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + break; + case 5: + CreateTask(sub_8153688, 0x5); + *step = 6; + break; + case 6: + if (!FuncIsActiveTask(sub_8153688)) + { + *step = 3; + } + break; + } + } +} + +static void ShowSaveInfoWindow(void) +{ + struct WindowTemplate saveInfoWindow = sSaveInfoWindowTemplate; + u8 gender; + u8 color; + u32 xOffset; + u32 yOffset; + + if (!FlagGet(FLAG_SYS_POKEDEX_GET)) + { + saveInfoWindow.height -= 2; + } + + sSaveInfoWindowId = AddWindow(&saveInfoWindow); + NewMenuHelpers_DrawStdWindowFrame(sSaveInfoWindowId, FALSE); + + gender = gSaveBlock2Ptr->playerGender; + color = TEXT_COLOR_RED; // Red when female, blue when male. + + if (gender == MALE) + { + color = TEXT_COLOR_BLUE; + } + + // Print region name + yOffset = 1; + sub_819A344(3, gStringVar4, TEXT_COLOR_GREEN); + PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, 0, yOffset, 0xFF, NULL); + + // Print player name + yOffset = 0x11; + PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingPlayer, 0, yOffset, 0xFF, NULL); + sub_819A344(0, gStringVar4, color); + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); + PrintPlayerNameOnWindow(sSaveInfoWindowId, gStringVar4, xOffset, yOffset); + + // Print badge count + yOffset = 0x21; + PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingBadges, 0, yOffset, 0xFF, NULL); + sub_819A344(4, gStringVar4, color); + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); + PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL); + + if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE) + { + // Print pokedex count + yOffset = 0x31; + PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingPokedex, 0, yOffset, 0xFF, NULL); + sub_819A344(1, gStringVar4, color); + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); + PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL); + } + + // Print play time + yOffset += 0x10; + PrintTextOnWindow(sSaveInfoWindowId, 1, gText_SavingTime, 0, yOffset, 0xFF, NULL); + sub_819A344(2, gStringVar4, color); + xOffset = GetStringRightAlignXOffset(1, gStringVar4, 0x70); + PrintTextOnWindow(sSaveInfoWindowId, 1, gStringVar4, xOffset, yOffset, 0xFF, NULL); + + CopyWindowToVram(sSaveInfoWindowId, 2); +} + +static void RemoveSaveInfoWindow(void) +{ + sub_819746C(sSaveInfoWindowId, FALSE); + RemoveWindow(sSaveInfoWindowId); +} + +static void sub_80A08A4(u8 taskId) +{ + if (!FuncIsActiveTask(sub_8153688)) + { + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} + +void sub_80A08CC(void) // Referenced in data/specials.inc and data/scripts/maps/BattleFrontier_BattleTowerLobby.inc +{ + u8 taskId = CreateTask(sub_8153688, 0x5); + gTasks[taskId].data[2] = 1; + gTasks[CreateTask(sub_80A08A4, 0x6)].data[1] = taskId; +} + +static void HideStartMenuWindow(void) +{ + sub_819746C(GetStartMenuWindowId(), TRUE); + RemoveStartMenuWindow(); + ScriptUnfreezeEventObjects(); + ScriptContext2_Disable(); +} + +void HideStartMenu(void) // Called from map_name_popup.s +{ + PlaySE(SE_SELECT); + HideStartMenuWindow(); +} + +void AppendToList(u8 *list, u8 *pos, u8 newEntry) +{ + list[*pos] = newEntry; + (*pos)++; +} diff --git a/src/starter_choose.c b/src/starter_choose.c index 480edbcb7..b55b0fbc5 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -9,6 +9,7 @@ #include "main.h" #include "window.h" #include "text.h" +#include "text_window.h" #include "decompress.h" #include "menu.h" #include "sound.h" @@ -18,6 +19,7 @@ #include "data2.h" #include "international_string_util.h" #include "trig.h" +#include "scanline_effect.h" #define STARTER_MON_COUNT 3 @@ -46,13 +48,10 @@ extern const u8 gStarterChoose_LabelCoords[][2]; extern const u8 gUnknown_085B1E0C[]; extern const u8 gUnknown_085B1E28[][2]; -extern void sub_809882C(u8, u16, u8); -extern void ScanlineEffect_Stop(void); extern void clear_scheduled_bg_copies_to_vram(void); extern void dp13_810BB8C(void); extern void do_scheduled_bg_tilemap_copies_to_vram(void); extern u16 sub_818D820(u16); -extern const u16 *GetOverworldTextboxPalettePtr(void); extern u8 sub_818D3E4(u16 species, u32 trainerId, u32 personality, u8 flags, s16 x, s16 y, u8, u16); // this file's functions @@ -126,7 +125,7 @@ void CB2_ChooseStarter(void) InitWindows(gUnknown_085B1DCC); DeactivateAllTextPrinters(); - sub_809882C(0, 0x2A8, 0xD0); + LoadUserWindowBorderGfx(0, 0x2A8, 0xD0); clear_scheduled_bg_copies_to_vram(); ScanlineEffect_Stop(); ResetTasks(); @@ -140,7 +139,7 @@ void CB2_ChooseStarter(void) LoadCompressedObjectPic(&gUnknown_085B1ED8[0]); LoadCompressedObjectPic(&gUnknown_085B1EE8[0]); LoadSpritePalettes(gUnknown_085B1EF8); - BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); EnableInterrupts(DISPSTAT_VBLANK); SetVBlankCallback(VblankCB_StarterChoose); diff --git a/src/strings.c b/src/strings.c new file mode 100644 index 000000000..cdbbb4468 --- /dev/null +++ b/src/strings.c @@ -0,0 +1,2051 @@ +#include "global.h" +#include "strings.h" + +// Yes, all the aligns are absolutely necessary. +// Until someone can come up with a better way to align byte arrays in C, this is what we're doing. +asm(".align 2"); +const u8 gExpandedPlaceholder_Empty[] = _(""); +const u8 gExpandedPlaceholder_Kun[] = _(""); +const u8 gExpandedPlaceholder_Chan[] = _(""); +const u8 gExpandedPlaceholder_Sapphire[] = _("SAPPHIRE"); +const u8 gExpandedPlaceholder_Ruby[] = _("RUBY"); +const u8 gExpandedPlaceholder_Emerald[] = _("EMERALD"); +const u8 gExpandedPlaceholder_Aqua[] = _("AQUA"); +const u8 gExpandedPlaceholder_Magma[] = _("MAGMA"); +const u8 gExpandedPlaceholder_Archie[] = _("ARCHIE"); +const u8 gExpandedPlaceholder_Maxie[] = _("MAXIE"); +const u8 gExpandedPlaceholder_Kyogre[] = _("KYOGRE"); +const u8 gExpandedPlaceholder_Groudon[] = _("GROUDON"); +const u8 gExpandedPlaceholder_Brendan[] = _("BRENDAN"); +const u8 gExpandedPlaceholder_May[] = _("MAY"); +const u8 gText_EggNickname[] = _("EGG"); +const u8 gText_Pokemon[] = _("POKéMON"); +const u8 gProfBirchMatchCallName[] = _("PROF. BIRCH"); +const u8 gText_MainMenuNewGame[] = _("NEW GAME"); +const u8 gText_MainMenuContinue[] = _("CONTINUE"); +const u8 gText_MainMenuOption[] = _("OPTION"); +const u8 gText_MainMenuMysteryGift[] = _("MYSTERY GIFT"); +const u8 gText_MainMenuMysteryGift2[] = _("MYSTERY GIFT"); +const u8 gText_MainMenuMysteryEvents[] = _("MYSTERY EVENTS"); +const u8 gText_WirelessNotConnected[] = _("The Wireless Adapter is not\nconnected."); +const u8 gText_MysteryGiftCantUse[] = _("MYSTERY GIFT can’t be used while\nthe Wireless Adapter is attached."); +const u8 gText_MysteryEventsCantUse[] = _("MYSTERY EVENTS can’t be used while\nthe Wireless Adapter is attached."); +const u8 gUnknown_085E836D[] = _("Updating save file using external\ndata. Please wait."); +const u8 gUnknown_085E83A2[] = _("The save file has been updated."); +const u8 gText_SaveFileCorrupted[] = _("The save file is corrupted. The\nprevious save file will be loaded."); +const u8 gText_SaveFileErased[] = _("The save file has been erased\ndue to corruption or damage."); +const u8 gJPText_No1MSubCircuit[] = _("1Mサブきばんが ささっていません!"); +const u8 gText_BatteryRunDry[] = _("The internal battery has run dry.\nThe game can be played.\pHowever, clock-based events will\nno longer occur."); +const u8 gUnknown_085E84BF[] = _("PLAYER"); +const u8 gUnknown_085E84C6[] = _("POKéDEX"); +const u8 gText_MainMenuTime[] = _("TIME"); +const u8 gUnknown_085E84D3[] = _("BADGES"); +const u8 gUnknown_085E84DA[] = _("A Button"); +const u8 gUnknown_085E84E3[] = _("B Button"); +const u8 gUnknown_085E84EC[] = _("R Button"); +const u8 gUnknown_085E84F5[] = _("L Button"); +const u8 gUnknown_085E84FE[] = _("START"); +const u8 gUnknown_085E8504[] = _("SELECT"); +const u8 gUnknown_085E850B[] = _("+ Control Pad"); +const u8 gUnknown_085E8519[] = _("L Button R Button"); +const u8 gUnknown_085E852C[] = _("CONTROLS"); + +asm(".align 2"); +const u8 gUnknown_085E8538[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK"); + +asm(".align 2"); +const u8 gUnknown_085E8544[] = _("{A_BUTTON}NEXT"); + +asm(".align 2"); +const u8 gUnknown_085E854C[] = _("{A_BUTTON}NEXT {B_BUTTON}BACK"); + +asm(".align 2"); +const u8 gText_PickNextCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}NEXT {B_BUTTON}CANCEL"); + +asm(".align 2"); +const u8 gText_PickCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}{B_BUTTON}CANCEL"); + +asm(".align 2"); +const u8 gText_UnkCtrlF800Exit[] = _("{A_BUTTON}EXIT"); +const u8 gText_BirchBoy[] = _("BOY"); +const u8 gText_BirchGirl[] = _("GIRL"); +const u8 gText_DefaultNameStu[] = _("STU"); +const u8 gText_DefaultNameMilton[] = _("MILTON"); +const u8 gText_DefaultNameTom[] = _("TOM"); +const u8 gText_DefaultNameKenny[] = _("KENNY"); +const u8 gText_DefaultNameReid[] = _("REID"); +const u8 gText_DefaultNameJude[] = _("JUDE"); +const u8 gText_DefaultNameJaxson[] = _("JAXSON"); +const u8 gText_DefaultNameEaston[] = _("EASTON"); +const u8 gText_DefaultNameWalker[] = _("WALKER"); +const u8 gText_DefaultNameTeru[] = _("TERU"); +const u8 gText_DefaultNameJohnny[] = _("JOHNNY"); +const u8 gText_DefaultNameBrett[] = _("BRETT"); +const u8 gText_DefaultNameSeth[] = _("SETH"); +const u8 gText_DefaultNameTerry[] = _("TERRY"); +const u8 gText_DefaultNameCasey[] = _("CASEY"); +const u8 gText_DefaultNameDarren[] = _("DARREN"); +const u8 gText_DefaultNameLandon[] = _("LANDON"); +const u8 gText_DefaultNameCollin[] = _("COLLIN"); +const u8 gText_DefaultNameStanley[] = _("STANLEY"); +const u8 gText_DefaultNameQuincy[] = _("QUINCY"); +const u8 gText_DefaultNameKimmy[] = _("KIMMY"); +const u8 gText_DefaultNameTiara[] = _("TIARA"); +const u8 gText_DefaultNameBella[] = _("BELLA"); +const u8 gText_DefaultNameJayla[] = _("JAYLA"); +const u8 gText_DefaultNameAllie[] = _("ALLIE"); +const u8 gText_DefaultNameLianna[] = _("LIANNA"); +const u8 gText_DefaultNameSara[] = _("SARA"); +const u8 gText_DefaultNameMonica[] = _("MONICA"); +const u8 gText_DefaultNameCamila[] = _("CAMILA"); +const u8 gText_DefaultNameAubree[] = _("AUBREE"); +const u8 gText_DefaultNameRuthie[] = _("RUTHIE"); +const u8 gText_DefaultNameHazel[] = _("HAZEL"); +const u8 gText_DefaultNameNadine[] = _("NADINE"); +const u8 gText_DefaultNameTanja[] = _("TANJA"); +const u8 gText_DefaultNameYasmin[] = _("YASMIN"); +const u8 gText_DefaultNameNicola[] = _("NICOLA"); +const u8 gText_DefaultNameLillie[] = _("LILLIE"); +const u8 gText_DefaultNameTerra[] = _("TERRA"); +const u8 gText_DefaultNameLucy[] = _("LUCY"); +const u8 gText_DefaultNameHalie[] = _("HALIE"); +const u8 gText_ThisIsAPokemon[] = _("This is what we call a “POKéMON.”{PAUSE 96}\p"); +const u8 gText_5MarksPokemon[] = _("????? POKéMON"); +const u8 gText_UnkHeight[] = _("{CLEAR_TO 0x0C}??’??”"); +const u8 gText_UnkWeight[] = _("????.? lbs."); +const u8 gUnknown_085E86DC[] = _(" POKéMON"); +const u8 gUnknown_085E86FB[] = _("{CLEAR_TO 0x0C} ’ ”"); +const u8 gUnknown_085E8709[] = _(" . lbs."); +const u8 gUnknown_085E871A[] = _(""); +const u8 gText_CryOf[] = _("CRY OF"); +const u8 gUnknown_085E8722[] = _(""); +const u8 gText_SizeComparedTo[] = _("SIZE COMPARED TO "); +const u8 gText_PokedexRegistration[] = _("POKéDEX registration completed."); +const u8 gText_HTHeight[] = _("HT"); +const u8 gText_WTWeight[] = _("WT"); +const u8 gText_SearchingPleaseWait[] = _("Searching…\nPlease wait."); +const u8 gText_SearchCompleted[] = _("Search completed."); +const u8 gUnknown_085E8785[] = _("No matching POKéMON were found."); +const u8 gUnknown_085E87A5[] = _("Search for POKéMON based on\nselected parameters."); +const u8 gUnknown_085E87D6[] = _("Switch POKéDEX listings."); +const u8 gUnknown_085E87EF[] = _("Return to the POKéDEX."); +const u8 gUnknown_085E8806[] = _("Select the POKéDEX mode."); +const u8 gUnknown_085E881F[] = _("Select the POKéDEX listing mode."); +const u8 gUnknown_085E8840[] = _("List by the first letter in the name.\nSpotted POKéMON only."); +const u8 gUnknown_085E887C[] = _("List by body color.\nSpotted POKéMON only."); +const u8 gUnknown_085E88A6[] = _("List by type.\nOwned POKéMON only."); +const u8 gUnknown_085E88C8[] = _("Execute search/switch."); +const u8 gUnknown_085E88DF[] = _("HOENN DEX"); +const u8 gUnknown_085E88E9[] = _("NATIONAL DEX"); +const u8 gUnknown_085E88F6[] = _("NUMERICAL MODE"); +const u8 gUnknown_085E8905[] = _("A TO Z MODE"); +const u8 gUnknown_085E8911[] = _("HEAVIEST MODE"); +const u8 gUnknown_085E891F[] = _("LIGHTEST MODE"); +const u8 gUnknown_085E892D[] = _("TALLEST MODE"); +const u8 gUnknown_085E893A[] = _("SMALLEST MODE"); +const u8 gUnknown_085E8948[] = _("ABC"); +const u8 gUnknown_085E894C[] = _("DEF"); +const u8 gUnknown_085E8950[] = _("GHI"); +const u8 gUnknown_085E8954[] = _("JKL"); +const u8 gUnknown_085E8958[] = _("MNO"); +const u8 gUnknown_085E895C[] = _("PQR"); +const u8 gUnknown_085E8960[] = _("STU"); +const u8 gUnknown_085E8964[] = _("VWX"); +const u8 gUnknown_085E8968[] = _("YZ"); +const u8 gUnknown_085E896B[] = _("RED"); +const u8 gUnknown_085E896F[] = _("BLUE"); +const u8 gUnknown_085E8974[] = _("YELLOW"); +const u8 gUnknown_085E897B[] = _("GREEN"); +const u8 gUnknown_085E8981[] = _("BLACK"); +const u8 gUnknown_085E8987[] = _("BROWN"); +const u8 gUnknown_085E898D[] = _("PURPLE"); +const u8 gUnknown_085E8994[] = _("GRAY"); +const u8 gUnknown_085E8999[] = _("WHITE"); +const u8 gUnknown_085E899F[] = _("PINK"); +const u8 gUnknown_085E89A4[] = _("HOENN region’s POKéDEX"); +const u8 gUnknown_085E89BB[] = _("National edition POKéDEX"); +const u8 gUnknown_085E89D4[] = _("POKéMON are listed according to their\nnumber."); +const u8 gUnknown_085E8A02[] = _("Spotted and owned POKéMON are listed\nalphabetically."); +const u8 gUnknown_085E8A37[] = _("Owned POKéMON are listed from the\nheaviest to the lightest."); +const u8 gUnknown_085E8A73[] = _("Owned POKéMON are listed from the\nlightest to the heaviest."); +const u8 gUnknown_085E8AAF[] = _("Owned POKéMON are listed from the\ntallest to the smallest."); +const u8 gUnknown_085E8AEA[] = _("Owned POKéMON are listed from the\nsmallest to the tallest."); +const u8 gUnknown_085E8B25[] = _(""); +const u8 gUnknown_085E8B26[] = _("DON’T SPECIFY."); +const u8 gUnknown_085E8B35[] = _("NONE"); +const u8 gText_SelectorArrow[] = _("▶"); +const u8 gUnknown_085E8B3C[] = _(" "); +const u8 gText_WelcomeToHOF[] = _("Welcome to the HALL OF FAME!"); +const u8 gUnknown_085E8B5B[] = _("Spotted POKéMON: {STR_VAR_1}!\nOwned POKéMON: {STR_VAR_2}!\pPROF. BIRCH’s POKéDEX rating!\pPROF. BIRCH: Let’s see…\p"); +const u8 gUnknown_085E8BBA[] = _("SAVING…\nDON’T TURN OFF THE POWER."); +const u8 gText_HOFCorrupted[] = _("The HALL OF FAME data is corrupted."); +const u8 gText_HOFNumber[] = _("HALL OF FAME No. {STR_VAR_1}"); +const u8 gText_LeagueChamp[] = _("LEAGUE CHAMPION!\nCONGRATULATIONS!"); +const u8 gText_Number[] = _("No. "); +const u8 gText_Level[] = _("Lv. "); +const u8 gUnknown_085E8C40[] = _("IDNo. /"); +const u8 gText_Name[] = _("NAME"); +const u8 gText_IDNumber[] = _("IDNo."); +const u8 gText_BirchInTrouble[] = _("PROF. BIRCH is in trouble!\nRelease a POKéMON and rescue him!"); +const u8 gText_ConfirmStarterChoice[] = _("Do you choose this POKéMON?"); +const u8 gUnknown_085E8CAC[] = _("POKéMON"); +const u8 gText_FlyToWhere[] = _("FLY to where?"); +const u8 gMenuText_Use[] = _("USE"); +const u8 gMenuText_Toss[] = _("TOSS"); +const u8 gMenuText_Register[] = _("REGISTER"); +const u8 gMenuText_Give[] = _("GIVE"); +const u8 gMenuText_CheckTag[] = _("CHECK TAG"); +const u8 gMenuText_Confirm[] = _("CONFIRM"); +const u8 gMenuText_Walk[] = _("WALK"); +const u8 gText_Cancel[] = _("CANCEL"); +const u8 gText_Cancel2[] = _("CANCEL"); +const u8 gMenuText_Show[] = _("SHOW"); +const u8 gText_EmptyString2[] = _(""); +const u8 gUnknown_085E8D04[] = _("CANCEL"); +const u8 gText_Item[] = _("ITEM"); +const u8 gText_Mail[] = _("MAIL"); +const u8 gText_Take[] = _("TAKE"); +const u8 gText_Store[] = _("STORE"); +const u8 gMenuText_Check[] = _("CHECK"); +const u8 gText_None[] = _("NONE"); +const u8 gMenuText_Deselect[] = _("DESELECT"); +const u8 gText_ThreeMarks[] = _("???"); +const u8 gText_FiveMarks[] = _("?????"); +const u8 gText_Slash[] = _("/"); +const u8 gText_OneDash[] = _("-"); +const u8 gText_TwoDashes[] = _("--"); +const u8 gText_ThreeDashes[] = _("---"); +const u8 gText_MaleSymbol[] = _("♂"); +const u8 gText_FemaleSymbol[] = _("♀"); +const u8 gText_LevelSymbol[] = _("{LV}"); +const u8 gText_UnkCtrlF908Clear01[] = _("{NO}{CLEAR 0x01}"); +const u8 gUnknown_085E8D55[] = _("+"); +const u8 gUnknown_085E8D57[] = _("{RIGHT_ARROW}"); +const u8 gText_UnkCtrlF907F908[] = _("{ID}{NO}"); +const u8 gText_Space[] = _(" "); +const u8 gText_SelectorArrow2[] = _("▶"); +const u8 gText_GoBackPrevMenu[] = _("Go back to the\nprevious menu."); +const u8 gText_WhatWouldYouLike[] = _("What would you like to do?"); +const u8 gMenuText_Give2[] = _("GIVE"); +const u8 gText_xVar1[] = _("×{STR_VAR_1}"); +const u8 gUnknown_085E8DA4[] = _(" BERRY"); +const u8 gText_Coins[] = _("{STR_VAR_1} COINS"); +const u8 gText_CloseBag[] = _("CLOSE BAG"); +const u8 gText_Var1IsSelected[] = _("{STR_VAR_1} is\nselected."); +const u8 gText_CantWriteMail[] = _("You can’t write\nMAIL here."); +const u8 gText_NoPokemon[] = _("There is no\nPOKéMON."); +const u8 gText_MoveVar1Where[] = _("Move the\n{STR_VAR_1}\nwhere?"); +const u8 gText_Var1CantBeHeld[] = _("The {STR_VAR_1} can’t be held."); +const u8 gText_Var1CantBeHeldHere[] = _("The {STR_VAR_1} can’t be held\nhere."); +const u8 gText_DepositHowManyVar1[] = _("Deposit how many\n{STR_VAR_1}(s)?"); +const u8 gText_DepositedVar2Var1s[] = _("Deposited {STR_VAR_2}\n{STR_VAR_1}(s)."); +const u8 gText_NoRoomForItems[] = _("There’s no room to\nstore items."); +const u8 gText_CantStoreImportantItems[] = _("Important items\ncan’t be stored in\nthe PC!"); +const u8 gText_TooImportantToToss[] = _("That’s much too\nimportant to toss\nout!"); +const u8 gText_TossHowManyVar1s[] = _("Toss out how many\n{STR_VAR_1}(s)?"); +const u8 gText_ThrewAwayVar2Var1s[] = _("Threw away {STR_VAR_2}\n{STR_VAR_1}(s)."); +const u8 gText_ConfirmTossItems[] = _("Is it okay to\nthrow away {STR_VAR_2}\n{STR_VAR_1}(s)?"); +const u8 gText_DadsAdvice[] = _("DAD’s advice…\n{PLAYER}, there’s a time and place for\leverything!{PAUSE_UNTIL_PRESS}"); +const u8 gText_CantDismountBike[] = _("You can’t dismount your BIKE here.{PAUSE_UNTIL_PRESS}"); +const u8 gText_ItemFinderNearby[] = _("Huh?\nThe ITEMFINDER’s responding!\pThere’s an item buried around here!{PAUSE_UNTIL_PRESS}"); +const u8 gText_ItemFinderOnTop[] = _("Oh!\nThe ITEMFINDER’s shaking wildly!{PAUSE_UNTIL_PRESS}"); +const u8 gText_ItemFinderNothing[] = _("… … … …Nope!\nThere’s no response.{PAUSE_UNTIL_PRESS}"); +const u8 gText_CoinCase[] = _("Your COINS:\n{STR_VAR_1}{PAUSE_UNTIL_PRESS}"); +const u8 gText_BootedUpTM[] = _("Booted up a TM."); +const u8 gText_BootedUpHM[] = _("Booted up an HM."); +const u8 gText_TMHMContainedVar1[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?"); +const u8 gText_PlayerUsedVar2[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_RepelEffectsLingered[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}"); +const u8 gText_UsedVar2WildLured[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be lured.{PAUSE_UNTIL_PRESS}"); +const u8 gText_UsedVar2WildRepelled[] = _("{PLAYER} used the\n{STR_VAR_2}.\pWild POKéMON will be repelled.{PAUSE_UNTIL_PRESS}"); +const u8 gText_BoxFull[] = _("The BOX is full.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PowderQty[] = _("POWDER QTY: {STR_VAR_1}{PAUSE_UNTIL_PRESS}"); +const u8 gText_TheField[] = _("the field"); +const u8 gText_TheBattle[] = _("the battle"); +const u8 gText_ThePokemonList[] = _("the POKéMON LIST"); +const u8 gText_TheShop[] = _("the shop"); +const u8 gText_ThePC[] = _("the PC"); + +const u8 *const gReturnToXStringsTable[] = +{ + gText_TheField, + gText_TheBattle, + gText_ThePokemonList, + gText_TheShop, + gText_TheField, + gText_TheField, + gText_ThePC, + gText_TheField, + gText_TheField, + gText_TheField, + gText_TheBattle, + gText_ThePC +}; + +const u8 *const gReturnToXStringsTable2[] = +{ + gText_TheField, + gText_TheBattle, + gText_ThePokemonList, + gText_TheField +}; + +const u8 gText_ReturnToVar1[] = _("Return to\n{STR_VAR_1}."); +const u8 gText_ItemsPocket[] = _("ITEMS"); +const u8 gText_PokeBallsPocket[] = _("POKé BALLS"); +const u8 gText_TMHMPocket[] = _("TMs & HMs"); +const u8 gText_BerriesPocket[] = _("BERRIES"); +const u8 gText_KeyItemsPocket[] = _("KEY ITEMS"); + +const u8 *const gPocketNamesStringsTable[] = +{ + gText_ItemsPocket, + gText_PokeBallsPocket, + gText_TMHMPocket, + gText_BerriesPocket, + gText_KeyItemsPocket +}; + +const u8 gText_UnkF908Var1Clear7Var2[] = _("{NO}{STR_VAR_1}{CLEAR 0x07}{STR_VAR_2}"); +const u8 gText_ClearTo11Var1Clear5Var2[] = _("{CLEAR_TO 0x11}{STR_VAR_1}{CLEAR 0x05}{STR_VAR_2}"); +const u8 gText_SizeSlash[] = _("SIZE /"); +const u8 gText_FirmSlash[] = _("FIRM /"); +const u8 gText_Var1DotVar2[] = _("{STR_VAR_1}.{STR_VAR_2}”"); + +// Berry firmness strings +const u8 gBerryFirmnessString_VerySoft[] = _("Very soft"); +const u8 gBerryFirmnessString_Soft[] = _("Soft"); +const u8 gBerryFirmnessString_Hard[] = _("Hard"); +const u8 gBerryFirmnessString_VeryHard[] = _("Very hard"); +const u8 gBerryFirmnessString_SuperHard[] = _("Super hard"); + +const u8 gText_UnkF908Var1Var2[] = _("{NO}{STR_VAR_1} {STR_VAR_2}"); +const u8 gText_BerryTag[] = _("BERRY TAG"); +const u8 gText_RedPokeblock[] = _("RED {POKEBLOCK}"); +const u8 gText_BluePokeblock[] = _("BLUE {POKEBLOCK}"); +const u8 gText_PinkPokeblock[] = _("PINK {POKEBLOCK}"); +const u8 gText_GreenPokeblock[] = _("GREEN {POKEBLOCK}"); +const u8 gText_YellowPokeblock[] = _("YELLOW {POKEBLOCK}"); +const u8 gText_PurplePokeblock[] = _("PURPLE {POKEBLOCK}"); +const u8 gText_IndigoPokeblock[] = _("INDIGO {POKEBLOCK}"); +const u8 gText_BrownPokeblock[] = _("BROWN {POKEBLOCK}"); +const u8 gText_LiteBluePokeblock[] = _("LITEBLUE {POKEBLOCK}"); +const u8 gText_OlivePokeblock[] = _("OLIVE {POKEBLOCK}"); +const u8 gText_GrayPokeblock[] = _("GRAY {POKEBLOCK}"); +const u8 gText_BlackPokeblock[] = _("BLACK {POKEBLOCK}"); +const u8 gText_WhitePokeblock[] = _("WHITE {POKEBLOCK}"); +const u8 gText_GoldPokeblock[] = _("GOLD {POKEBLOCK}"); +const u8 gText_Spicy[] = _("SPICY"); +const u8 gText_Dry[] = _("DRY"); +const u8 gText_Sweet[] = _("SWEET"); +const u8 gText_Bitter[] = _("BITTER"); +const u8 gText_Sour[] = _("SOUR"); +const u8 gUnknown_085E9339[] = _("TASTY"); +const u8 gUnknown_085E933F[] = _("FEEL"); +const u8 gText_StowCase[] = _("Stow CASE."); +const u8 gText_LvVar1[] = _("{LV}{STR_VAR_1}"); +const u8 gText_ThrowAwayVar1[] = _("Throw away this\n{STR_VAR_1}?"); +const u8 gText_Var1ThrownAway[] = _("The {STR_VAR_1}\nwas thrown away."); +const u8 gText_Var1AteTheVar2[] = _("{STR_VAR_1} ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_Var1HappilyAteVar2[] = _("{STR_VAR_1} happily ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_Var1DisdainfullyAteVar2[] = _("{STR_VAR_1} disdainfully ate the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gUnknown_085E93C7[] = _("BUY"); +const u8 gUnknown_085E93CB[] = _("SELL"); +const u8 gUnknown_085E93D0[] = _("QUIT"); +const u8 gText_InBagVar1[] = _("IN BAG: {STR_VAR_1}"); +const u8 gText_QuitShopping[] = _("Quit shopping."); +const u8 gText_Var1CertainlyHowMany[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?"); +const u8 gText_Var1CertainlyHowMany2[] = _("{STR_VAR_1}? Certainly.\nHow many would you like?"); +const u8 gText_Var1AndYouWantedVar2[] = _("{STR_VAR_1}? And you wanted {STR_VAR_2}?\nThat will be ¥{STR_VAR_3}."); +const u8 gText_Var1IsItThatllBeVar2[] = _("{STR_VAR_1}, is it?\nThat’ll be ¥{STR_VAR_2}. Do you want it?"); +const u8 gText_YouWantedVar1ThatllBeVar2[] = _("You wanted {STR_VAR_1}?\nThat’ll be ¥{STR_VAR_2}. Will that be okay?"); +const u8 gText_HereYouGoThankYou[] = _("Here you go!\nThank you very much."); +const u8 gText_ThankYouIllSendItHome[] = _("Thank you!\nI’ll send it to your home PC."); +const u8 gText_ThanksIllSendItHome[] = _("Thanks!\nI’ll send it to your PC at home."); +const u8 gText_YouDontHaveMoney[] = _("You don’t have enough money.{PAUSE_UNTIL_PRESS}"); +const u8 gText_NoMoreRoomForThis[] = _("You have no more room for this\nitem.{PAUSE_UNTIL_PRESS}"); +const u8 gText_SpaceForVar1Full[] = _("The space for {STR_VAR_1} is full.{PAUSE_UNTIL_PRESS}"); +const u8 gText_AnythingElseICanHelp[] = _("Is there anything else I can help\nyou with?"); +const u8 gText_CanIHelpWithAnythingElse[] = _("Can I help you with anything else?"); +const u8 gText_ThrowInPremierBall[] = _("I’ll throw in a PREMIER BALL, too.{PAUSE_UNTIL_PRESS}"); +const u8 gText_CantBuyKeyItem[] = _("{STR_VAR_2}? Oh, no.\nI can’t buy that.{PAUSE_UNTIL_PRESS}"); +const u8 gText_HowManyToSell[] = _("{STR_VAR_2}?\nHow many would you like to sell?"); +const u8 gText_ICanPayVar1[] = _("I can pay ¥{STR_VAR_1}.\nWould that be okay?"); +const u8 gText_TurnedOverVar1ForVar2[] = _("Turned over the {STR_VAR_2}\nand received ¥{STR_VAR_1}."); +const u8 gText_PokedollarVar1[] = _("¥{STR_VAR_1}"); +const u8 gText_Shift[] = _("SHIFT"); +const u8 gText_SendOut[] = _("SEND OUT"); +const u8 gText_Switch2[] = _("SWITCH"); +const u8 gText_Summary5[] = _("SUMMARY"); +const u8 gUnknown_085E96BE[] = _("MOVES"); +const u8 gText_Enter[] = _("ENTER"); +const u8 gText_NoEntry[] = _("NO ENTRY"); +const u8 gText_Take2[] = _("TAKE"); +const u8 gText_Read2[] = _("READ"); +const u8 gText_Trade4[] = _("TRADE"); +const u8 gText_HP3[] = _("HP"); +const u8 gText_SpAtk3[] = _("SP. ATK"); +const u8 gText_SpDef3[] = _("SP. DEF"); +const u8 gText_WontHaveEffect[] = _("It won’t have any effect.{PAUSE_UNTIL_PRESS}"); +const u8 gText_CantBeUsedOnPkmn[] = _("This can’t be used on\nthat POKéMON.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnCantSwitchOut[] = _("{STR_VAR_1} can’t be switched\nout!{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnAlreadyInBattle[] = _("{STR_VAR_1} is already\nin battle!{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnAlreadySelected[] = _("{STR_VAR_1} has already been\nselected.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnHasNoEnergy[] = _("{STR_VAR_1} has no energy\nleft to battle!{PAUSE_UNTIL_PRESS}"); +const u8 gText_CantSwitchWithAlly[] = _("You can’t switch {STR_VAR_1}’s\nPOKéMON with one of yours!{PAUSE_UNTIL_PRESS}"); +const u8 gText_EggCantBattle[] = _("An EGG can’t battle!{PAUSE_UNTIL_PRESS}"); +const u8 gText_CantUseUntilNewBadge[] = _("This can’t be used until a new\nBADGE is obtained.{PAUSE_UNTIL_PRESS}"); +const u8 gText_NoMoreThanVar1Pkmn[] = _("No more than {STR_VAR_1} POKéMON\nmay enter.{PAUSE_UNTIL_PRESS}"); +const u8 gText_SendMailToPC[] = _("Send the removed MAIL to\nyour PC?"); +const u8 gText_MailSentToPC[] = _("The MAIL was sent to your PC.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PCMailboxFull[] = _("Your PC’s MAILBOX is full.{PAUSE_UNTIL_PRESS}"); +const u8 gText_MailMessageWillBeLost[] = _("If the MAIL is removed, the\nmessage will be lost. Okay?"); +const u8 gText_RemoveMailBeforeItem[] = _("MAIL must be removed before\nholding an item.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnWasGivenItem[] = _("{STR_VAR_1} was given the\n{STR_VAR_2} to hold.{PAUSE_UNTIL_PRESS}"); +const u8 gText_SwitchPkmnItem[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}.\pWould you like to switch the\ntwo items?"); +const u8 gText_PkmnNotHolding[] = _("{STR_VAR_1} isn’t holding\nanything.{PAUSE_UNTIL_PRESS}"); +const u8 gText_RecievedItemFromPkmn[] = _("Received the {STR_VAR_2}\nfrom {STR_VAR_1}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_MailTakenFromPkmn[] = _("MAIL was taken from the\nPOKéMON.{PAUSE_UNTIL_PRESS}"); +const u8 gText_SwitchedPkmnItem[] = _("The {STR_VAR_2} was taken and\nreplaced with the {STR_VAR_1}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnHoldingItemCantHoldMail[] = _("This POKéMON is holding an\nitem. It cannot hold MAIL.{PAUSE_UNTIL_PRESS}"); +const u8 gText_MailTransferredFromMailbox[] = _("MAIL was transferred from\nthe MAILBOX.{PAUSE_UNTIL_PRESS}"); +const u8 gText_BagFullCouldNotRemoveItem[] = _("The BAG is full. The POKéMON’s\nitem could not be removed.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnLearnedMove3[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!"); +const u8 gText_PkmnCantLearnMove[] = _("{STR_VAR_1} and {STR_VAR_2}\nare not compatible.\p{STR_VAR_2} can’t be\nlearned.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnNeedsToReplaceMove[] = _("{STR_VAR_1} wants to learn the\nmove {STR_VAR_2}.\pHowever, {STR_VAR_1} already\nknows four moves.\pShould a move be deleted and\nreplaced with {STR_VAR_2}?"); +const u8 gText_StopLearningMove2[] = _("Stop trying to teach\n{STR_VAR_2}?"); +const u8 gText_MoveNotLearned[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_WhichMoveToForget[] = _("Which move should be forgotten?{PAUSE_UNTIL_PRESS}"); +const u8 gText_12PoofForgotMove[] = _("1, {PAUSE 15}2, and{PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p{STR_VAR_1} forgot how to\nuse {STR_VAR_2}.\pAnd…{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnAlreadyKnows[] = _("{STR_VAR_1} already knows\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnHPRestoredByVar2[] = _("{STR_VAR_1}’s HP was restored\nby {STR_VAR_2} point(s).{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnCuredOfPoison[] = _("{STR_VAR_1} was cured of its\npoisoning.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnCuredOfParalysis[] = _("{STR_VAR_1} was cured of\nparalysis.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnWokeUp2[] = _("{STR_VAR_1} woke up.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnBurnHealed[] = _("{STR_VAR_1}’s burn was healed.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnThawedOut[] = _("{STR_VAR_1} was thawed out.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PPWasRestored[] = _("PP was restored.{PAUSE_UNTIL_PRESS}"); +const u8 gUnknown_085E9CCA[] = _("{STR_VAR_1} regained health.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnBecameHealthy[] = _("{STR_VAR_1} became healthy.{PAUSE_UNTIL_PRESS}"); +const u8 gText_MovesPPIncreased[] = _("{STR_VAR_1}’s PP increased.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnElevatedToLvVar2[] = _("{STR_VAR_1} was elevated to\nLv. {STR_VAR_2}."); +const u8 gText_PkmnBaseVar2StatIncreased[] = _("{STR_VAR_1}’s base {STR_VAR_2}\nstat was raised.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnFriendlyBaseVar2Fell[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnAdoresBaseVar2Fell[] = _("{STR_VAR_1} adores you!\nThe base {STR_VAR_2} fell!{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnFriendlyBaseVar2CantFall[] = _("{STR_VAR_1} turned friendly.\nThe base {STR_VAR_2} can’t fall!{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnSnappedOutOfConfusion[] = _("{STR_VAR_1} snapped out of its\nconfusion.{PAUSE_UNTIL_PRESS}"); +const u8 gText_PkmnGotOverInfatuation[] = _("{STR_VAR_1} got over its\ninfatuation.{PAUSE_UNTIL_PRESS}"); +const u8 gText_ThrowAwayItem[] = _("Throw away this\n{STR_VAR_1}?"); +const u8 gText_ItemThrownAway[] = _("The {STR_VAR_1}\nwas thrown away.{PAUSE_UNTIL_PRESS}"); +const u8 gUnknown_085E9E2E[] = _("Teach which POKéMON?"); +const u8 gUnknown_085E9E43[] = _("Choose a POKéMON."); +const u8 gUnknown_085E9E55[] = _("Move to where?"); +const u8 gUnknown_085E9E64[] = _("Teach which POKéMON?"); +const u8 gUnknown_085E9E79[] = _("Use on which POKéMON?"); +const u8 gUnknown_085E9E8F[] = _("Give to which POKéMON?"); +const u8 gUnknown_085E9EA6[] = _("Do what with this {PKMN}?"); +const u8 gUnknown_085E9EBC[] = _("There’s nothing to CUT."); +const u8 gUnknown_085E9ED4[] = _("You can’t SURF here."); +const u8 gUnknown_085E9EE9[] = _("You’re already SURFING."); +const u8 gUnknown_085E9F01[] = _("Can’t use that here."); +const u8 gUnknown_085E9F16[] = _("Restore which move?"); +const u8 gUnknown_085E9F2A[] = _("Boost PP of which move?"); +const u8 gUnknown_085E9F42[] = _("Do what with an item?"); +const u8 gUnknown_085E9F58[] = _("No POKéMON for battle!"); +const u8 gUnknown_085E9F6F[] = _("Choose a POKéMON."); +const u8 gUnknown_085E9F81[] = _("Not enough HP…"); +const u8 gUnknown_085E9F90[] = _("{STR_VAR_1} POKéMON are needed."); +const u8 gUnknown_085E9FA7[] = _("POKéMON can’t be the same."); +const u8 gUnknown_085E9FC2[] = _("No identical hold items."); +const u8 gUnknown_085E9FDB[] = _("The current is much too fast!"); +const u8 gUnknown_085E9FF9[] = _("Do what with the MAIL?"); +const u8 gUnknown_085EA010[] = _("Choose POKéMON or CANCEL."); +const u8 gUnknown_085EA02A[] = _("Choose POKéMON and confirm."); +const u8 gUnknown_085EA046[] = _("Let’s enjoy cycling!"); +const u8 gUnknown_085EA05B[] = _("This is in use already."); +const u8 gUnknown_085EA073[] = _("{STR_VAR_1} is already holding\none {STR_VAR_2}."); +const u8 gUnknown_085EA091[] = _("No use."); +const u8 gUnknown_085EA099[] = _("ABLE"); +const u8 gUnknown_085EA09E[] = _("FIRST"); +const u8 gUnknown_085EA0A4[] = _("SECOND"); +const u8 gUnknown_085EA0AB[] = _("THIRD"); +const u8 gUnknown_085EA0B1[] = _("ABLE"); +const u8 gUnknown_085EA0B6[] = _("NOT ABLE"); +const u8 gUnknown_085EA0BF[] = _("ABLE!"); +const u8 gUnknown_085EA0C5[] = _("NOT ABLE!"); +const u8 gUnknown_085EA0CF[] = _("LEARNED"); +const u8 gUnknown_085EA0D7[] = _("HAVE"); +const u8 gUnknown_085EA0DC[] = _("DON’T HAVE"); +const u8 gUnknown_085EA0E7[] = _("FOURTH"); +const u8 gText_PkmnCantParticipate[] = _("That POKéMON can’t participate.{PAUSE_UNTIL_PRESS}"); +const u8 gText_CancelParticipation[] = _("Cancel participation?"); +const u8 gText_CancelBattle[] = _("Cancel the battle?"); +const u8 gText_ReturnToWaitingRoom[] = _("Return to the WAITING ROOM?"); +const u8 gText_CancelChallenge[] = _("Cancel the challenge?"); +const u8 gText_EscapeFromHere[] = _("Want to escape from here and return\nto {STR_VAR_1}?"); +const u8 gText_ReturnToHealingSpot[] = _("Want to return to the healing spot\nused last in {STR_VAR_1}?"); +const u8 gText_PauseUntilPress[] = _("{PAUSE_UNTIL_PRESS}"); +const u8 gJPText_PutVar1IntoSpinner[] = _("{STR_VAR_1}を ぐるぐるこうかんに\nだして よろしいですか?"); + +asm(".align 2"); +const u8 gText_OnlyPkmnForBattle[] = _("That’s your only\nPOKéMON for battle."); + +asm(".align 2"); +const u8 gText_PkmnCantBeTradedNow[] = _("That POKéMON can’t be traded\nnow."); + +asm(".align 2"); +const u8 gText_EggCantBeTradedNow[] = _("An EGG can’t be traded now."); + +asm(".align 2"); +const u8 gText_OtherTrainersPkmnCantBeTraded[] = _("The other TRAINER’s POKéMON\ncan’t be traded now."); + +asm(".align 2"); +const u8 gText_OtherTrainerCantAcceptPkmn[] = _("The other TRAINER can’t accept\nthat POKéMON now."); + +asm(".align 2"); +const u8 gText_CantTradeWithTrainer[] = _("You can’t trade with that\nTRAINER now."); + +asm(".align 2"); +const u8 gText_NotPkmnOtherTrainerWants[] = _("That isn’t the type of POKéMON\nthat the other TRAINER wants."); + +asm(".align 2"); +const u8 gText_ThatIsntAnEgg[] = _("That isn’t an EGG."); +const u8 gText_Register[] = _("REGISTER"); +const u8 gText_Attack3[] = _("ATTACK"); +const u8 gText_Defense3[] = _("DEFENSE"); +const u8 gText_SpAtk4[] = _("SP. ATK"); +const u8 gText_SpDef4[] = _("SP. DEF"); +const u8 gText_Speed2[] = _("SPEED"); +const u8 gText_HP4[] = _("HP"); +const u8 gUnknown_085EA364[] = _(""); +const u8 gText_OTSlash[] = _("OT/"); +const u8 gText_RentalPkmn[] = _("RENTAL POKéMON"); +const u8 gText_TypeSlash[] = _("TYPE/"); +const u8 gText_Power[] = _("POWER"); +const u8 gText_Accuracy2[] = _("ACCURACY"); +const u8 gText_Appeal[] = _("APPEAL"); +const u8 gText_Jam[] = _("JAM"); +const u8 gText_Status[] = _("STATUS"); +const u8 gText_ExpPoints[] = _("EXP. POINTS"); +const u8 gText_NextLv[] = _("NEXT LV."); +const u8 gText_RibbonsVar1[] = _("RIBBONS: {STR_VAR_1}"); +const u8 gText_EmptyString5[] = _(""); +const u8 gUnknown_085EA3C1[] = _("EVENTS"); +const u8 gText_Switch[] = _("SWITCH"); +const u8 gText_PkmnInfo[] = _("POKéMON INFO"); +const u8 gText_PkmnSkills[] = _("POKéMON SKILLS"); +const u8 gText_BattleMoves[] = _("BATTLE MOVES"); +const u8 gText_ContestMoves[] = _("C0NTEST MOVES"); +const u8 gText_Info[] = _("INFO"); +const u8 gText_EggWillTakeALongTime[] = _("It looks like this EGG will\ntake a long time to hatch."); +const u8 gText_EggWillTakeSomeTime[] = _("What will hatch from this?\nIt will take some time."); +const u8 gText_EggWillHatchSoon[] = _("It moves occasionally.\nIt should hatch soon."); +const u8 gText_EggAboutToHatch[] = _("It’s making sounds.\nIt’s about to hatch!"); +const u8 gText_HMMovesCantBeForgotten2[] = _("HM moves can’t be\nforgotten now."); +const u8 gText_XNatureMetAtYZ[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nmet at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01},\n{SPECIAL_F7 0x00}{SPECIAL_F7 0x04}{SPECIAL_F7 0x01}."); +const u8 gText_XNatureHatchedAtYZ[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nhatched at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01},\n{SPECIAL_F7 0x00}{SPECIAL_F7 0x04}{SPECIAL_F7 0x01}."); +const u8 gText_XNatureObtainedInTrade[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nobtained in a trade."); +const u8 gText_XNatureFatefulEncounter[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nobtained in a fateful\nencounter at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01}."); +const u8 gText_XNatureProbablyMetAt[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nprobably met at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01},\n{SPECIAL_F7 0x00}{SPECIAL_F7 0x04}{SPECIAL_F7 0x01}."); +const u8 gText_XNature[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature"); +const u8 gText_XNatureMetSomewhereAt[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nmet somewhere at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01}."); +const u8 gText_XNatureHatchedSomewhereAt[] = _("{SPECIAL_F7 0x00}{SPECIAL_F7 0x02}{SPECIAL_F7 0x01}{SPECIAL_F7 0x05} nature,\nhatched somewhere at {LV_2}{SPECIAL_F7 0x00}{SPECIAL_F7 0x03}{SPECIAL_F7 0x01}."); +const u8 gText_OddEggFoundByCouple[] = _("An odd POKéMON EGG found\nby the DAY CARE couple."); +const u8 gText_PeculiarEggNicePlace[] = _("A peculiar POKéMON EGG\nobtained at the nice place."); +const u8 gText_PeculiarEggTrade[] = _("A peculiar POKéMON EGG\nobtained in a trade."); +const u8 gText_EggFromHotSprings[] = _("A POKéMON EGG obtained\nat the hot springs."); +const u8 gText_EggFromTraveler[] = _("An odd POKéMON EGG\nobtained from a traveler."); +const u8 gText_ApostropheSBase[] = _("’s BASE"); +const u8 gText_OkayToDeleteFromRegistry[] = _("Is it okay to delete {STR_VAR_1}\nfrom the REGISTRY?"); +const u8 gText_RegisteredDataDeleted[] = _("The registered data was deleted.{PAUSE_UNTIL_PRESS}"); +const u8 gText_NoRegistry[] = _("There is no REGISTRY.{PAUSE_UNTIL_PRESS}"); +const u8 gUnknown_085EA79D[] = _("DEL REGIST."); +const u8 gUnknown_085EA7A9[] = _("{STR_VAR_3}{STR_VAR_1}/{STR_VAR_2}"); +const u8 gText_Decorate[] = _("DECORATE"); +const u8 gText_PutAway[] = _("PUT AWAY"); +const u8 gText_Toss2[] = _("TOSS"); +const u8 gText_Color161Shadow161[] = _("{COLOR 161}{SHADOW 161}"); +const u8 gText_PutOutSelectedDecorItem[] = _("Put out the selected decoration item."); +const u8 gText_StoreChosenDecorInPC[] = _("Store the chosen decoration in the PC."); +const u8 gText_ThrowAwayUnwantedDecors[] = _("Throw away unwanted decorations."); +const u8 gText_NoDecorations[] = _("There are no decorations.{PAUSE_UNTIL_PRESS}"); +const u8 gText_Desk[] = _("DESK"); +const u8 gText_Chair[] = _("CHAIR"); +const u8 gText_Plant[] = _("PLANT"); +const u8 gText_Ornament[] = _("ORNAMENT"); +const u8 gText_Mat[] = _("MAT"); +const u8 gText_Poster[] = _("POSTER"); +const u8 gText_Doll[] = _("DOLL"); +const u8 gText_Cushion[] = _("CUSHION"); +const u8 gText_Gold[] = _("GOLD"); +const u8 gText_Silver[] = _("SILVER"); +const u8 gText_PlaceItHere[] = _("Place it here?"); +const u8 gText_CantBePlacedHere[] = _("It can’t be placed here."); +const u8 gText_CancelDecorating[] = _("Cancel decorating?"); +const u8 gText_InUseAlready[] = _("This is in use already."); +const u8 gText_NoMoreDecorations[] = _("No more decorations can be placed.\nThe most that can be placed are {STR_VAR_1}."); +const u8 gText_NoMoreDecorations2[] = _("No more decorations can be placed.\nThe most that can be placed are {STR_VAR_1}."); +const u8 gUnknown_085EA978[] = _("This can’t be placed here.\nIt must be on a DESK, etc."); +const u8 gText_CantPlaceInRoom[] = _("This decoration can’t be placed in\nyour own room."); +const u8 gText_CantThrowAwayInUse[] = _("This decoration is in use.\nIt can’t be thrown away."); +const u8 gText_DecorationWillBeDiscarded[] = _("This {STR_VAR_1} will be discarded.\nIs that okay?"); +const u8 gText_DecorationThrownAway[] = _("The decoration item was thrown away."); +const u8 gText_StopPuttingAwayDecorations[] = _("Stop putting away decorations?"); +const u8 gText_NoDecorationHere[] = _("There is no decoration item here."); +const u8 gText_ReturnDecorationToPC[] = _("Return this decoration to the PC?"); +const u8 gText_DecorationReturnedToPC[] = _("The decoration was returned to the PC."); +const u8 gText_NoDecorationsInUse[] = _("There are no decorations in use.{PAUSE_UNTIL_PRESS}"); +const u8 gText_Tristan[] = _("TRISTAN"); +const u8 gText_Philip[] = _("PHILIP"); +const u8 gText_Dennis[] = _("DENNIS"); +const u8 gText_Roberto[] = _("ROBERTO"); +const u8 gText_TurnOff[] = _("TURN OFF"); +const u8 gText_Decoration[] = _("DECORATION"); +const u8 gText_ItemStorage[] = _("ITEM STORAGE"); +const u8 gText_Mailbox[] = _("MAILBOX"); +const u8 gText_DepositItem[] = _("DEPOSIT ITEM"); +const u8 gText_WithdrawItem[] = _("WITHDRAW ITEM"); +const u8 gText_TossItem[] = _("TOSS ITEM"); +const u8 gText_StoreItemsInPC[] = _("Store items in the PC."); +const u8 gText_TakeOutItemsFromPC[] = _("Take out items from the PC."); +const u8 gText_ThrowAwayItemsInPC[] = _("Throw away items stored in the PC."); +const u8 gText_NoItems[] = _("There are no items.{PAUSE_UNTIL_PRESS}"); +const u8 gText_NoRoomInBag[] = _("There is no more\nroom in the BAG."); +const u8 gText_WithdrawHowManyItems[] = _("Withdraw how many\n{STR_VAR_1}(s)?"); +const u8 gText_WithdrawXItems[] = _("Withdrew {STR_VAR_2}\n{STR_VAR_1}(s)."); +const u8 gText_Read[] = _("READ"); +const u8 gText_MoveToBag[] = _("MOVE TO BAG"); +const u8 gText_Give2[] = _("GIVE"); +const u8 gText_NoMailHere[] = _("There’s no MAIL here.{PAUSE_UNTIL_PRESS}"); +const u8 gText_WhatToDoWithVar1sMail[] = _("What would you like to do with\n{STR_VAR_1}’s MAIL?"); +const u8 gText_MessageWillBeLost[] = _("The message will be lost.\nIs that okay?"); +const u8 gText_BagIsFull[] = _("The BAG is full.{PAUSE_UNTIL_PRESS}"); +const u8 gText_MailToBagMessageErased[] = _("The MAIL was returned to the BAG\nwith its message erased.{PAUSE_UNTIL_PRESS}"); +const u8 gText_Dad[] = _("DAD"); +const u8 gText_Mom[] = _("MOM"); +const u8 gText_Wallace[] = _("WALLACE"); +const u8 gText_Steven[] = _("STEVEN"); +const u8 gText_Brawly[] = _("BRAWLY"); +const u8 gText_Winona[] = _("WINONA"); +const u8 gText_Phoebe[] = _("PHOEBE"); +const u8 gText_Glacia[] = _("GLACIA"); +const u8 gUnknown_085EAD37[] = _("PETALBURG"); +const u8 gUnknown_085EAD41[] = _("SLATEPORT"); +const u8 gUnknown_085EAD4B[] = _("LITTLEROOT"); +const u8 gUnknown_085EAD56[] = _("LILYCOVE"); +const u8 gUnknown_085EAD5F[] = _("DEWFORD"); +const u8 gUnknown_085EAD67[] = _("ENTER"); +const u8 gUnknown_085EAD6D[] = _("INFO"); +const u8 gUnknown_085EAD72[] = _("What’s a CONTEST?"); +const u8 gUnknown_085EAD84[] = _("Types of CONTESTS"); +const u8 gUnknown_085EAD96[] = _("Ranks"); +const u8 gUnknown_085EAD9C[] = _("Judging"); +const u8 gUnknown_085EADA4[] = _("COOLNESS CONTEST"); +const u8 gUnknown_085EADB5[] = _("BEAUTY CONTEST"); +const u8 gUnknown_085EADC4[] = _("CUTENESS CONTEST"); +const u8 gUnknown_085EADD5[] = _("SMARTNESS CONTEST"); +const u8 gUnknown_085EADE7[] = _("TOUGHNESS CONTEST"); +const u8 gUnknown_085EADF9[] = _("DECORATION"); +const u8 gUnknown_085EAE04[] = _("PACK UP"); +const u8 gUnknown_085EAE0C[] = _("COUNT"); +const u8 gUnknown_085EAE12[] = _("REGISTRY"); +const u8 gUnknown_085EAE1B[] = _("INFORMATION"); +const u8 gUnknown_085EAE27[] = _("MACH"); +const u8 gUnknown_085EAE2C[] = _("ACRO"); +const u8 gUnknown_085EAE31[] = _("PSN"); +const u8 gUnknown_085EAE35[] = _("PAR"); +const u8 gUnknown_085EAE39[] = _("SLP"); +const u8 gUnknown_085EAE3D[] = _("BRN"); +const u8 gUnknown_085EAE41[] = _("FRZ"); +const u8 gUnknown_085EAE45[] = _("TOXIC"); +const u8 gUnknown_085EAE4B[] = _("OK"); +const u8 gUnknown_085EAE4E[] = _("QUIT"); +const u8 gUnknown_085EAE53[] = _("Saw it"); +const u8 gUnknown_085EAE5A[] = _("Not yet"); +const u8 gText_Yes[] = _("YES"); +const u8 gText_No[] = _("NO"); +const u8 gUnknown_085EAE69[] = _("INFO"); +const u8 gUnknown_085EAE6E[] = _("SINGLE BATTLE"); +const u8 gUnknown_085EAE7C[] = _("DOUBLE BATTLE"); +const u8 gUnknown_085EAE8A[] = _("MULTI BATTLE"); +const u8 gUnknown_085EAE97[] = _("MR. BRINEY"); +const u8 gUnknown_085EAEA2[] = _("CHALLENGE"); +const u8 gUnknown_085EAEAC[] = _("INFO"); +const u8 gText_Lv50[] = _("LV. 50"); +const u8 gText_OpenLevel[] = _("OPEN LEVEL"); +const u8 gUnknown_085EAEC3[] = _("FRESH WATER{CLEAR_TO 0x48}¥200"); +const u8 gUnknown_085EAED6[] = _("SODA POP{CLEAR_TO 0x48}¥300"); +const u8 gUnknown_085EAEE6[] = _("LEMONADE{CLEAR_TO 0x48}¥350"); +const u8 gUnknown_085EAEF6[] = _("HOW TO RIDE"); +const u8 gUnknown_085EAF02[] = _("HOW TO TURN"); +const u8 gUnknown_085EAF0E[] = _("SANDY SLOPES"); +const u8 gUnknown_085EAF1B[] = _("WHEELIES"); +const u8 gUnknown_085EAF24[] = _("BUNNY-HOPS"); +const u8 gUnknown_085EAF2F[] = _("JUMP"); +const u8 gUnknown_085EAF34[] = _("Satisfied"); +const u8 gUnknown_085EAF3E[] = _("Dissatisfied"); +const u8 gUnknown_085EAF4B[] = _("DEEPSEATOOTH"); +const u8 gUnknown_085EAF58[] = _("DEEPSEASCALE"); +const u8 gUnknown_085EAF65[] = _("BLUE FLUTE"); +const u8 gUnknown_085EAF70[] = _("YELLOW FLUTE"); +const u8 gUnknown_085EAF7D[] = _("RED FLUTE"); +const u8 gUnknown_085EAF87[] = _("WHITE FLUTE"); +const u8 gUnknown_085EAF93[] = _("BLACK FLUTE"); +const u8 gUnknown_085EAF9F[] = _("GLASS CHAIR"); +const u8 gUnknown_085EAFAB[] = _("GLASS DESK"); +const u8 gUnknown_085EAFB6[] = _("TREECKO DOLL 1,000 COINS"); +const u8 gUnknown_085EAFCF[] = _("TORCHIC DOLL 1,000 COINS"); +const u8 gUnknown_085EAFE8[] = _("MUDKIP DOLL 1,000 COINS"); +const u8 gUnknown_085EB002[] = _(" 50 COINS ¥1,000"); +const u8 gUnknown_085EB017[] = _("500 COINS ¥10,000"); +const u8 gUnknown_085EB02A[] = _("Excellent"); +const u8 gUnknown_085EB034[] = _("Not so good"); +const u8 gUnknown_085EB040[] = _("RED SHARD"); +const u8 gUnknown_085EB04A[] = _("YELLOW SHARD"); +const u8 gUnknown_085EB057[] = _("BLUE SHARD"); +const u8 gUnknown_085EB062[] = _("GREEN SHARD"); +const u8 gText_BattleFrontier[] = _("BATTLE FRONTIER"); +const u8 gUnknown_085EB07E[] = _("Right"); +const u8 gUnknown_085EB084[] = _("Left"); +const u8 gUnknown_085EB089[] = _("TM32{CLEAR_TO 0x48}1,500 COINS"); +const u8 gUnknown_085EB09C[] = _("TM29{CLEAR_TO 0x48}3,500 COINS"); +const u8 gUnknown_085EB0AF[] = _("TM35{CLEAR_TO 0x48}4,000 COINS"); +const u8 gUnknown_085EB0C2[] = _("TM24{CLEAR_TO 0x48}4,000 COINS"); +const u8 gUnknown_085EB0D5[] = _("TM13{CLEAR_TO 0x48}4,000 COINS"); +const u8 gText_Cool[] = _("COOL"); +const u8 gText_Beauty[] = _("BEAUTY"); +const u8 gText_Cute[] = _("CUTE"); +const u8 gText_Smart[] = _("SMART"); +const u8 gText_Tough[] = _("TOUGH"); +const u8 gText_Normal[] = _("NORMAL"); +const u8 gText_Super[] = _("SUPER"); +const u8 gText_Hyper[] = _("HYPER"); +const u8 gText_Master[] = _("MASTER"); +const u8 gText_Cool2[] = _("COOL"); +const u8 gText_Beauty2[] = _("BEAUTY"); +const u8 gText_Cute2[] = _("CUTE"); +const u8 gText_Smart2[] = _("SMART"); +const u8 gText_Tough2[] = _("TOUGH"); +const u8 gText_Items[] = _("ITEMS"); +const u8 gText_Key_Items[] = _("KEY ITEMS"); +const u8 gText_Poke_Balls[] = _("POKé BALLS"); +const u8 gText_TMs_Hms[] = _("TMs & HMs"); +const u8 gText_Berries2[] = _("BERRIES"); +const u8 gText_SomeonesPC[] = _("SOMEONE’S PC"); +const u8 gText_LanettesPC[] = _("LANETTE’S PC"); +const u8 gText_PlayersPC[] = _("{PLAYER}’s PC"); +const u8 gText_HallOfFame[] = _("HALL OF FAME"); +const u8 gText_LogOff[] = _("LOG OFF"); +const u8 gText_Opponent[] = _("OPPONENT"); +const u8 gText_Tourney_Tree[] = _("TOURNEY TREE"); +const u8 gText_ReadyToStart[] = _("READY TO START"); +const u8 gText_NormalRank[] = _("NORMAL RANK"); +const u8 gText_SuperRank[] = _("SUPER RANK"); +const u8 gText_HyperRank[] = _("HYPER RANK"); +const u8 gText_MasterRank[] = _("MASTER RANK"); +const u8 gText_Single2[] = _("SINGLE"); +const u8 gText_Double2[] = _("DOUBLE"); +const u8 gText_Multi[] = _("MULTI"); +const u8 gText_MultiLink[] = _("MULTI-LINK"); +const u8 gText_BattleBag[] = _("BATTLE BAG"); +const u8 gText_HeldItem[] = _("HELD ITEM"); +const u8 gText_LinkContest[] = _("LINK CONTEST"); +const u8 gText_AboutE_Mode[] = _("ABOUT E-MODE"); +const u8 gText_AboutG_Mode[] = _("ABOUT G-MODE"); +const u8 gText_E_Mode[] = _("E-MODE"); +const u8 gText_G_Mode[] = _("G-MODE"); +const u8 gText_MenuOptionPokedex[] = _("POKéDEX"); +const u8 gText_MenuOptionPokemon[] = _("POKéMON"); +const u8 gText_MenuOptionBag[] = _("BAG"); +const u8 gText_MenuOptionPokenav[] = _("POKéNAV"); +const u8 gUnknown_085EB278[] = _(""); +const u8 gText_MenuOptionSave[] = _("SAVE"); +const u8 gText_MenuOptionOption[] = _("OPTION"); +const u8 gText_MenuOptionExit[] = _("EXIT"); +const u8 gUnknown_085EB28A[] = __(" "); +const u8 gUnknown_085EB28C[] = _("5BP"); +const u8 gUnknown_085EB290[] = _("10BP"); +const u8 gUnknown_085EB295[] = _("15BP"); +const u8 gUnknown_085EB29A[] = _("RED TENT"); +const u8 gUnknown_085EB2A3[] = _("BLUE TENT"); +const u8 gText_SouthernIsland[] = _("SOUTHERN ISLAND"); +const u8 gText_BirthIsland[] = _("BIRTH ISLAND"); +const u8 gText_FarawayIsland[] = _("FARAWAY ISLAND"); +const u8 gText_NavelRock[] = _("NAVEL ROCK"); +const u8 gUnknown_085EB2E4[] = _("CLAW FOSSIL"); +const u8 gUnknown_085EB2F0[] = _("ROOT FOSSIL"); +const u8 gUnknown_085EB2FC[] = _("NO"); +const u8 gUnknown_085EB2FF[] = _("I’ll battle now!"); +const u8 gUnknown_085EB310[] = _("I won!"); +const u8 gUnknown_085EB317[] = _("I lost!"); +const u8 gUnknown_085EB31F[] = _("I won’t tell."); +const u8 gUnknown_085EB32D[] = _("NORMAL TAG MATCH"); +const u8 gUnknown_085EB33E[] = _("VARIETY TAG MATCH"); +const u8 gUnknown_085EB350[] = _("UNIQUE TAG MATCH"); +const u8 gUnknown_085EB361[] = _("EXPERT TAG MATCH"); +const u8 gUnknown_085EB372[] = _("TRADE CENTER"); +const u8 gUnknown_085EB37F[] = _("COLOSSEUM"); +const u8 gUnknown_085EB389[] = _("RECORD CORNER"); +const u8 gUnknown_085EB397[] = _("BERRY CRUSH"); +const u8 gUnknown_085EB3A3[] = _(""); +const u8 gUnknown_085EB3A4[] = _("POKéMON JUMP"); +const u8 gUnknown_085EB3B1[] = _("DODRIO BERRY-PICKING"); +const u8 gUnknown_085EB3C6[] = _("BECOME LEADER"); +const u8 gUnknown_085EB3D4[] = _("JOIN GROUP"); +const u8 gUnknown_085EB3DF[] = _("TWO STYLES"); +const u8 gUnknown_085EB3EA[] = _("LV. 50"); +const u8 gUnknown_085EB3F1[] = _("OPEN LEVEL"); +const u8 gUnknown_085EB3FC[] = _("{PKMN} TYPE & NO."); +const u8 gUnknown_085EB40A[] = _("HOLD ITEMS"); +const u8 gUnknown_085EB415[] = _("SYMBOLS"); +const u8 gUnknown_085EB41D[] = _("RECORD"); +const u8 gUnknown_085EB424[] = _("BATTLE PTS"); +const u8 gUnknown_085EB42F[] = _("TOWER INFO"); +const u8 gUnknown_085EB43A[] = _("BATTLE {PKMN}"); +const u8 gUnknown_085EB444[] = _("BATTLE SALON"); +const u8 gUnknown_085EB451[] = _("MULTI-LINK"); +const u8 gUnknown_085EB45C[] = _("BATTLE RULES"); +const u8 gUnknown_085EB469[] = _("JUDGE: MIND"); +const u8 gUnknown_085EB475[] = _("JUDGE: SKILL"); +const u8 gUnknown_085EB482[] = _("JUDGE: BODY"); +const u8 gUnknown_085EB48E[] = _("MATCHUP"); +const u8 gUnknown_085EB496[] = _("TOURNEY TREE"); +const u8 gUnknown_085EB4A3[] = _("DOUBLE KO"); +const u8 gUnknown_085EB4AD[] = _("BASIC RULES"); +const u8 gUnknown_085EB4B9[] = _("SWAP: PARTNER"); +const u8 gUnknown_085EB4C7[] = _("SWAP: NUMBER"); +const u8 gUnknown_085EB4D4[] = _("SWAP: NOTES"); +const u8 gUnknown_085EB4E0[] = _("OPEN LEVEL"); +const u8 gText_BattleBasics[] = _("BATTLE BASICS"); +const u8 gText_PokemonNature[] = _("POKéMON NATURE"); +const u8 gText_PokemonMoves[] = _("POKéMON MOVES"); +const u8 gText_Underpowered[] = _("UNDERPOWERED"); +const u8 gText_WhenInDanger[] = _("WHEN IN DANGER"); +const u8 gUnknown_085EB532[] = _("PYRAMID: POKéMON"); +const u8 gUnknown_085EB543[] = _("PYRAMID: TRAINERS"); +const u8 gUnknown_085EB555[] = _("PYRAMID: MAZE"); +const u8 gUnknown_085EB563[] = _("BATTLE BAG"); +const u8 gUnknown_085EB56E[] = _("POKéNAV AND BAG"); +const u8 gUnknown_085EB57E[] = _("HELD ITEMS"); +const u8 gUnknown_085EB589[] = _("POKéMON ORDER"); +const u8 gUnknown_085EB597[] = _("BATTLE POKéMON"); +const u8 gText_BattleTrainers[] = _("BATTLE TRAINERS"); +const u8 gUnknown_085EB5B6[] = _("GO ON"); +const u8 gUnknown_085EB5BC[] = _("RECORD"); +const u8 gUnknown_085EB5C3[] = _("REST"); +const u8 gUnknown_085EB5C8[] = _("RETIRE"); +const u8 gText_99TimesPlus[] = _("99 times +"); +const u8 gText_1MinutePlus[] = _("1 minute +"); +const u8 gText_SpaceSeconds[] = _(" seconds"); +const u8 gText_SpaceTimes[] = _(" time(s)"); +const u8 gUnknown_085EB5F7[] = _("."); +const u8 gText_BigGuy[] = _("Big guy"); +const u8 gText_BigGirl[] = _("Big girl"); +const u8 gText_Son[] = _("son"); +const u8 gText_Daughter[] = _("daughter"); +const u8 gText_BlueFlute[] = _("BLUE FLUTE"); +const u8 gText_YellowFlute[] = _("YELLOW FLUTE"); +const u8 gText_RedFlute[] = _("RED FLUTE"); +const u8 gText_WhiteFlute[] = _("WHITE FLUTE"); +const u8 gText_BlackFlute[] = _("BLACK FLUTE"); +const u8 gText_PrettyChair[] = _("PRETTY CHAIR"); +const u8 gText_PrettyDesk[] = _("PRETTY DESK"); +const u8 gText_1F[] = _("1F"); +const u8 gText_2F[] = _("2F"); +const u8 gText_3F[] = _("3F"); +const u8 gText_4F[] = _("4F"); +const u8 gText_5F[] = _("5F"); +const u8 gText_6F[] = _("6F"); +const u8 gText_7F[] = _("7F"); +const u8 gText_8F[] = _("8F"); +const u8 gText_9F[] = _("9F"); +const u8 gText_10F[] = _("10F"); +const u8 gText_11F[] = _("11F"); +const u8 gText_B1F[] = _("B1F"); +const u8 gText_B2F[] = _("B2F"); +const u8 gText_B3F[] = _("B3F"); +const u8 gText_B4F[] = _("B4F"); +const u8 gText_Rooftop[] = _("ROOFTOP"); +const u8 gText_ElevatorNowOn[] = _("Now on:"); +const u8 gText_BP[] = _("BP"); +const u8 gText_EnergyPowder50[] = _("ENERGYPOWDER{CLEAR_TO 0x72}{SIZE 0}50"); +const u8 gText_EnergyRoot80[] = _("ENERGY ROOT{CLEAR_TO 0x72}{SIZE 0}80"); +const u8 gText_HealPowder50[] = _("HEAL POWDER{CLEAR_TO 0x72}{SIZE 0}50"); +const u8 gText_RevivalHerb300[] = _("REVIVAL HERB{CLEAR_TO 0x6C}{SIZE 0}300"); +const u8 gText_Protein1000[] = _("PROTEIN{CLEAR_TO 0x63}{SIZE 0}1,000"); +const u8 gText_Iron1000[] = _("IRON{CLEAR_TO 0x63}{SIZE 0}1,000"); +const u8 gText_Carbos1000[] = _("CARBOS{CLEAR_TO 0x63}{SIZE 0}1,000"); +const u8 gText_Calcium1000[] = _("CALCIUM{CLEAR_TO 0x63}{SIZE 0}1,000"); +const u8 gText_Zinc1000[] = _("ZINC{CLEAR_TO 0x63}{SIZE 0}1,000"); +const u8 gText_HPUp1000[] = _("HP UP{CLEAR_TO 0x63}{SIZE 0}1,000"); +const u8 gText_PPUp3000[] = _("PP UP{CLEAR_TO 0x63}{SIZE 0}3,000"); +const u8 gText_RankingHall[] = _("RANKING HALL"); +const u8 gText_ExchangeService[] = _("EXCHANGE SERVICE"); +const u8 gText_LilycoveCity[] = _("LILYCOVE CITY"); +const u8 gText_SlateportCity[] = _("SLATEPORT CITY"); +const u8 gText_CaveOfOrigin[] = _("CAVE OF ORIGIN"); +const u8 gText_MtPyre[] = _("MT. PYRE"); +const u8 gText_SkyPillar[] = _("SKY PILLAR"); +const u8 gText_DontRemember[] = _("Don’t remember"); +const u8 gText_Exit[] = _("EXIT"); +const u8 gText_ExitFromBox[] = _("Exit from the BOX?"); +const u8 gText_WhatDoYouWantToDo[] = _("What do you want to do?"); +const u8 gText_PleasePickATheme[] = _("Please pick a theme."); +const u8 gText_PickTheWallpaper[] = _("Pick the wallpaper."); +const u8 gText_PkmnIsSelected[] = _("{SPECIAL_F7 0x00} is selected."); +const u8 gText_JumpToWhichBox[] = _("Jump to which BOX?"); +const u8 gText_DepositInWhichBox[] = _("Deposit in which BOX?"); +const u8 gText_PkmnWasDeposited[] = _("{SPECIAL_F7 0x00} was deposited."); +const u8 gText_BoxIsFull2[] = _("The BOX is full."); +const u8 gText_ReleaseThisPokemon[] = _("Release this POKéMON?"); +const u8 gText_PkmnWasReleased[] = _("{SPECIAL_F7 0x00} was released."); +const u8 gText_ByeByePkmn[] = _("Bye-bye, {SPECIAL_F7 0x00}!"); +const u8 gText_MarkYourPkmn[] = _("Mark your POKéMON."); +const u8 gText_ThatsYourLastPkmn[] = _("That’s your last POKéMON!"); +const u8 gText_YourPartysFull[] = _("Your party’s full!"); +const u8 gText_YoureHoldingAPkmn[] = _("You’re holding a POKéMON!"); +const u8 gText_WhichOneWillYouTake[] = _("Which one will you take?"); +const u8 gText_YouCantReleaseAnEgg[] = _("You can’t release an EGG."); +const u8 gText_ContinueBoxOperations[] = _("Continue BOX operations?"); +const u8 gText_PkmnCameBack[] = _("{SPECIAL_F7 0x00} came back!"); +const u8 gText_WasItWorriedAboutYou[] = _("Was it worried about you?"); +const u8 gText_FourEllipsesExclamation[] = _("… … … … !"); +const u8 gText_PleaseRemoveTheMail[] = _("Please remove the MAIL."); +const u8 gText_GiveToAPkmn[] = _("GIVE to a POKéMON?"); +const u8 gText_PlacedItemInBag[] = _("Placed item in the BAG."); +const u8 gText_BagIsFull2[] = _("The BAG is full."); +const u8 gText_PutItemInBag[] = _("Put this item in the BAG?"); +const u8 gText_ItemIsNowHeld[] = _("{SPECIAL_F7 0x00} is now held."); +const u8 gText_ChangedToNewItem[] = _("Changed to {SPECIAL_F7 0x00}."); +const u8 gText_MailCantBeStored[] = _("MAIL can’t be stored!"); +const u8 gPCText_Cancel[] = _("CANCEL"); +const u8 gPCText_Store[] = _("STORE"); +const u8 gPCText_Withdraw[] = _("WITHDRAW"); +const u8 gPCText_Shift[] = _("SHIFT"); +const u8 gPCText_Move[] = _("MOVE"); +const u8 gPCText_Place[] = _("PLACE"); +const u8 gPCText_Summary[] = _("SUMMARY"); +const u8 gPCText_Release[] = _("RELEASE"); +const u8 gPCText_Mark[] = _("MARK"); +const u8 gPCText_Name[] = _("NAME"); +const u8 gPCText_Jump[] = _("JUMP"); +const u8 gPCText_Wallpaper[] = _("WALLPAPER"); +const u8 gPCText_Take[] = _("TAKE"); +const u8 gPCText_Give[] = _("GIVE"); +const u8 gPCText_Switch[] = _("SWITCH"); +const u8 gPCText_Bag[] = _("BAG"); +const u8 gPCText_Info[] = _("INFO"); +const u8 gPCText_Scenery1[] = _("SCENERY 1"); +const u8 gPCText_Scenery2[] = _("SCENERY 2"); +const u8 gPCText_Scenery3[] = _("SCENERY 3"); +const u8 gPCText_Etcetera[] = _("ETCETERA"); +const u8 gPCText_Friends[] = _("FRIENDS"); +const u8 gPCText_Forest[] = _("FOREST"); +const u8 gPCText_City[] = _("CITY"); +const u8 gPCText_Desert[] = _("DESERT"); +const u8 gPCText_Savanna[] = _("SAVANNA"); +const u8 gPCText_Crag[] = _("CRAG"); +const u8 gPCText_Volcano[] = _("VOLCANO"); +const u8 gPCText_Snow[] = _("SNOW"); +const u8 gPCText_Cave[] = _("CAVE"); +const u8 gPCText_Beach[] = _("BEACH"); +const u8 gPCText_Seafloor[] = _("SEAFLOOR"); +const u8 gPCText_River[] = _("RIVER"); +const u8 gPCText_Sky[] = _("SKY"); +const u8 gPCText_PolkaDot[] = _("POLKA-DOT"); +const u8 gPCText_Pokecenter[] = _("POKéCENTER"); +const u8 gPCText_Machine[] = _("MACHINE"); +const u8 gPCText_Simple[] = _("SIMPLE"); +const u8 gUnknown_085EBB56[] = _("What would you like to do?"); +const u8 gText_WithdrawPokemon[] = _("WITHDRAW POKéMON"); +const u8 gText_DepositPokemon[] = _("DEPOSIT POKéMON"); +const u8 gText_MovePokemon[] = _("MOVE POKéMON"); +const u8 gText_MoveItems[] = _("MOVE ITEMS"); +const u8 gText_SeeYa[] = _("SEE YA!"); +const u8 gText_WithdrawMonDescription[] = _("Move POKéMON stored in BOXES to\nyour party."); +const u8 gText_DepositMonDescription[] = _("Store POKéMON in your party in BOXES."); +const u8 gText_MoveMonDescription[] = _("Organize the POKéMON in BOXES and\nin your party."); +const u8 gText_MoveItemsDescription[] = _("Move items held by any POKéMON\nin a BOX or your party."); +const u8 gText_SeeYaDescription[] = _("Return to the previous menu."); +const u8 gText_JustOnePkmn[] = _("There is just one POKéMON with you."); +const u8 gText_PartyFull[] = _("Your party is full!"); +const u8 gText_Box[] = _("BOX"); +const u8 gUnknown_085EBCC5[] = _("Check the map of the HOENN region."); +const u8 gUnknown_085EBCE8[] = _("Check POKéMON in detail."); +const u8 gUnknown_085EBD01[] = _("Call a registered TRAINER."); +const u8 gUnknown_085EBD1C[] = _("Check obtained RIBBONS."); +const u8 gUnknown_085EBD34[] = _("Put away the POKéNAV."); +const u8 gText_NoRibbonWinners[] = _("There are no RIBBON winners."); +const u8 gUnknown_085EBD67[] = _("No TRAINERS are registered."); +const u8 gUnknown_085EBD83[] = _("Check party POKéMON in detail."); +const u8 gUnknown_085EBDA2[] = _("Check all POKéMON in detail."); +const u8 gUnknown_085EBDBF[] = _("Return to the POKéNAV menu."); +const u8 gUnknown_085EBDDB[] = _("Find cool POKéMON."); +const u8 gUnknown_085EBDEE[] = _("Find beautiful POKéMON."); +const u8 gUnknown_085EBE06[] = _("Find cute POKéMON."); +const u8 gUnknown_085EBE19[] = _("Find smart POKéMON."); +const u8 gUnknown_085EBE2D[] = _("Find tough POKéMON."); +const u8 gUnknown_085EBE41[] = _("Return to the CONDITION menu."); +const u8 gText_NumberRegistered[] = _("No. registered"); +const u8 gText_NumberOfBattles[] = _("No. of battles"); +const u8 gUnknown_085EBE7D[] = _("DETAIL"); +const u8 gUnknown_085EBE84[] = _("CALL"); +const u8 gUnknown_085EBE89[] = _("EXIT"); +const u8 gUnknown_085EBE8E[] = _("Can’t call opponent here."); +const u8 gUnknown_085EBEA8[] = _("STRATEGY"); +const u8 gUnknown_085EBEB1[] = _("TRAINER’S POKéMON"); +const u8 gUnknown_085EBEC3[] = _("SELF-INTRODUCTION"); +const u8 gUnknown_085EBED5[] = _("{CLEAR 0x80}"); +const u8 gUnknown_085EBED9[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBEE9[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBEF9[] = _("{A_BUTTON}CONDITION {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF0E[] = _("{A_BUTTON}MARKINGS {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF22[] = _("{A_BUTTON}SELECT MARK {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF39[] = _("{A_BUTTON}MENU {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF49[] = _("{A_BUTTON}OK {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF57[] = _("{B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF60[] = _("{A_BUTTON}RIBBONS {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF73[] = _("{A_BUTTON}CHECK {B_BUTTON}CANCEL"); +const u8 gUnknown_085EBF84[] = _("{B_BUTTON}CANCEL"); +const u8 gText_NatureSlash[] = _("NATURE/"); +const u8 gText_TrainerCloseBy[] = _("That TRAINER is close by.\nTalk to the TRAINER in person!"); +const u8 gText_InParty[] = _("IN PARTY"); +const u8 gText_Number2[] = _("No. "); +const u8 gUnknown_085EBFDC[] = _("RIBBONS"); +const u8 gUnknown_085EBFE4[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}"); +const u8 gUnknown_085EBFF6[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}"); +const u8 gUnknown_085EC008[] = _("{SPECIAL_F7 0x00}/{LV}{SPECIAL_F7 0x01}"); +const u8 gText_Unknown[] = _("UNKNOWN"); +const u8 gUnknown_085EC017[] = _("CALL"); +const u8 gUnknown_085EC01C[] = _("CHECK"); +const u8 gUnknown_085EC022[] = _("CANCEL"); +const u8 gText_NumberF700[] = _("No. {SPECIAL_F7 0x00}"); +const u8 gText_RibbonsF700[] = _("RIBBONS {SPECIAL_F7 0x00}"); +const u8 gUnknown_085EC03B[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_RED WHITE GREEN}♂{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}{SPECIAL_F7 0x02}"); +const u8 gUnknown_085EC04F[] = _("{SPECIAL_F7 0x00}{COLOR_HIGHLIGHT_SHADOW LIGHT_GREEN WHITE BLUE}♀{COLOR_HIGHLIGHT_SHADOW DARK_GREY WHITE LIGHT_GREY}/{LV}{SPECIAL_F7 0x01}{SPECIAL_F7 0x02}"); +const u8 gUnknown_085EC063[] = _("{SPECIAL_F7 0x00}/{LV}{SPECIAL_F7 0x01}{SPECIAL_F7 0x02}"); +const u8 gText_CombineFourWordsOrPhrases[] = _("Combine four words or phrases"); +const u8 gText_AndMakeYourProfile[] = _("and make your profile."); +const u8 gText_CombineSixWordsOrPhrases[] = _("Combine six words or phrases"); +const u8 gText_AndMakeAMessage[] = _("and make a message."); +const u8 gText_FindWordsThatDescribeYour[] = _("Find words that describe your"); +const u8 gText_FeelingsRightNow[] = _("feelings right now."); +const u8 gUnknown_085EC104[] = _("With four phrases,"); +const u8 gText_CombineNineWordsOrPhrases[] = _("Combine nine words or phrases"); +const u8 gText_AndMakeAMessage2[] = _("and make a message."); +const u8 gText_ChangeJustOneWordOrPhrase[] = _("Change just one word or phrase"); +const u8 gText_AndImproveTheBardsSong[] = _("and improve the BARD’s song."); +const u8 gText_YourProfile[] = _("Your profile"); +const u8 gText_YourFeelingAtTheBattlesStart[] = _("Your feeling at the battle’s start"); +const u8 gText_WhatYouSayIfYouWin[] = _("What you say if you win a battle"); +const u8 gText_WhatYouSayIfYouLose[] = _("What you say if you lose a battle"); +const u8 gText_TheAnswer[] = _("The answer"); +const u8 gText_TheMailMessage[] = _("The MAIL message"); +const u8 gUnknown_085EC214[] = _("The MAIL salutation"); +const u8 gText_TheBardsSong2[] = _("The new song"); +const u8 gText_CombineTwoWordsOrPhrases[] = _("Combine two words or phrases"); +const u8 gText_AndMakeATrendySaying[] = _("and make a trendy saying."); +const u8 gText_TheTrendySaying[] = _("The trendy saying"); +const u8 gText_IsAsShownOkay[] = _("is as shown. Okay?"); +const u8 gText_CombineTwoWordsOrPhrases2[] = _("Combine two words or phrases"); +const u8 gText_ToTeachHerAGoodSaying[] = _("to teach her a good saying."); +const u8 gText_FindWordsWhichFit[] = _("Find words which fit"); +const u8 gText_TheTrainersImage[] = _("the TRAINER’s image."); +const u8 gText_TheImage[] = _("The image:"); +const u8 gText_OutOfTheListedChoices[] = _("Out of the listed choices,"); +const u8 gText_SelectTheAnswerToTheQuiz[] = _("select the answer to the quiz!"); +const u8 gText_AndCreateAQuiz[] = _("and create a quiz!"); +const u8 gText_PickAWordOrPhraseAnd[] = _("Pick a word or phrase and"); +const u8 gText_SetTheQuizAnswer[] = _("set the quiz answer."); +const u8 gText_TheAnswerColon[] = _("The answer:"); +const u8 gUnknown_085EC387[] = _("The quiz:"); +const u8 gText_ApprenticePhrase[] = _("Apprentice’s phrase:"); +const u8 gText_QuitEditing[] = _("Quit editing?"); +const u8 gText_StopGivingPkmnMail[] = _("Stop giving the POKéMON MAIL?"); +const u8 gText_AndFillOutTheQuestionnaire[] = _("and fill out the questionnaire."); +const u8 gText_LetsReplyToTheInterview[] = _("Let’s reply to the interview!"); +const u8 gText_AllTextBeingEditedWill[] = _("All the text being edited will"); +const u8 gText_BeDeletedThatOkay[] = _("be deleted. Is that okay?"); +const u8 gUnknown_085EC449[] = _("Quit editing?"); +const u8 gUnknown_085EC457[] = _("The edited text will not be saved."); +const u8 gUnknown_085EC47A[] = _("Is that okay?"); +const u8 gUnknown_085EC488[] = _("Please enter a phrase or word."); +const u8 gUnknown_085EC4A7[] = _("The entire text can’t be deleted."); +const u8 gText_OnlyOnePhrase[] = _("Only one phrase may be changed."); +const u8 gText_OriginalSongWillBeUsed[] = _("The original song will be used."); +const u8 gUnknown_085EC509[] = _("That’s trendy already!"); +const u8 gText_CombineTwoWordsOrPhrases3[] = _("Combine two words or phrases."); +const u8 gUnknown_085EC53E[] = _("Quit giving information?"); +const u8 gUnknown_085EC557[] = _("Stop giving the POKéMON MAIL?"); +const u8 gUnknown_085EC575[] = _("Create a quiz!"); +const u8 gUnknown_085EC584[] = _("Set the answer!"); +const u8 gUnknown_085EC594[] = _("Cancel the selection?"); +const u8 gText_Profile[] = _("PROFILE"); +const u8 gText_AtTheBattlesStart[] = _("At the battle’s start:"); +const u8 gText_UponWinningABattle[] = _("Upon winning a battle:"); +const u8 gText_UponLosingABattle[] = _("Upon losing a battle:"); +const u8 gText_TheBardsSong[] = _("The BARD’s Song"); +const u8 gText_WhatsHipAndHappening[] = _("What’s hip and happening?"); +const u8 gText_Interview[] = _("Interview"); +const u8 gText_GoodSaying[] = _("Good saying"); +const u8 gText_FansQuestion[] = _("Fan’s question"); +const u8 gUnknown_085EC645[] = _("クイズの こたえは?"); +const u8 gText_ApprenticesPhrase[] = _("Apprentice’s phrase"); +const u8 gText_Questionnaire[] = _("QUESTIONNAIRE"); +const u8 gText_YouCannotQuitHere[] = _("You cannot quit here."); +const u8 gText_SectionMustBeCompleted[] = _("This section must be completed."); +const u8 gText_F700sQuiz[] = _("{SPECIAL_F7 0x00}’s quiz"); +const u8 gText_Lady[] = _("Lady"); +const u8 gText_AfterYouHaveReadTheQuiz[] = _("After you have read the quiz"); +const u8 gText_QuestionPressTheAButton[] = _("question, press the A Button."); +const u8 gText_TheQuizAnswerIs[] = _("The quiz answer is?"); +const u8 gText_LikeToQuitQuiz[] = _("Would you like to quit this quiz"); +const u8 gText_ChallengeQuestionMark[] = _("challenge?"); +const u8 gText_IsThisQuizOK[] = _("Is this quiz OK?"); +const u8 gText_CreateAQuiz[] = _("Create a quiz!"); +const u8 gText_SelectTheAnswer[] = _("Select the answer!"); +const u8 gText_LyricsCantBeDeleted[] = _("The lyrics can’t be deleted."); +const u8 gText_PokemonLeague[] = _("POKéMON LEAGUE"); +const u8 gText_PokemonCenter[] = _("POKéMON CENTER"); +const u8 gText_GetsAPokeBlockQuestion[] = _(" gets a {POKEBLOCK}?"); +const u8 gText_Coolness[] = _("Coolness "); +const u8 gText_Beauty3[] = _("Beauty "); +const u8 gText_Cuteness[] = _("Cuteness "); +const u8 gText_Smartness[] = _("Smartness "); +const u8 gText_Toughness[] = _("Toughness "); +const u8 gText_WasEnhanced[] = _("was enhanced!"); +const u8 gText_NothingChanged[] = _("Nothing changed!"); +const u8 gText_WontEatAnymore[] = _("It won’t eat anymore…"); +const u8 gText_SaveFailedCheckingBackup[] = _("Save failed. Checking the backup\nmemory… Please wait.\n{COLOR RED}“Time required: about 1 minute”"); +const u8 gText_BackupMemoryDamaged[] = _("The backup memory is damaged, or\nthe internal battery has run dry.\nYou can still play, but not save."); +const u8 gText_GamePlayCannotBeContinued[] = _("{COLOR RED}“Game play cannot be continued.\nReturning to the title screen…”"); +const u8 gText_CheckCompleted[] = _("Check completed.\nAttempting to save again.\nPlease wait."); +const u8 gText_SaveCompleteGameCannotContinue[] = _("Save completed.\n{COLOR RED}“Game play cannot be continued.\nReturning to the title screen.”"); +const u8 gText_SaveCompletePressA[] = _("Save completed.\n{COLOR RED}“Please press the A Button.”"); +const u8 gText_Ferry[] = _("FERRY"); +const u8 gText_SecretBase[] = _("SECRET BASE"); +const u8 gText_Hideout[] = _("HIDEOUT"); +const u8 gText_ResetRTCConfirmCancel[] = _("Reset RTC?\nA: Confirm, B: Cancel"); +const u8 gText_PresentTime[] = _("Present time in game"); +const u8 gText_PreviousTime[] = _("Previous time in game"); +const u8 gText_PleaseResetTime[] = _("Please reset the time."); +const u8 gText_ClockHasBeenReset[] = _("The clock has been reset.\nData will be saved. Please wait."); +const u8 gText_SaveCompleted[] = _("Save completed."); +const u8 gText_SaveFailed[] = _("Save failed…"); +const u8 gText_NoSaveFileCantSetTime[] = _("There is no save file, so the time\ncan’t be set."); +const u8 gText_InGameClockUsable[] = _("The in-game clock adjustment system\nis now useable."); +const u8 gText_Slots[] = _("SLOTS"); +const u8 gText_Roulette[] = _("ROULETTE"); +const u8 gText_Good[] = _("Good"); +const u8 gText_VeryGood[] = _("Very good"); +const u8 gText_Excellent[] = _("Excellent"); +const u8 gText_SoSo[] = _("So-so"); +const u8 gText_Bad[] = _("Bad"); +const u8 gText_TheWorst[] = _("The worst"); +const u8 gText_Spicy2[] = _("spicy"); +const u8 gText_Dry2[] = _("dry"); +const u8 gText_Sweet2[] = _("sweet"); +const u8 gText_Bitter2[] = _("bitter"); +const u8 gText_Sour2[] = _("sour"); +const u8 gText_Single[] = _("SINGLE"); +const u8 gText_Double[] = _("DOUBLE"); +const u8 gText_Jackpot[] = _("jackpot"); +const u8 gText_First[] = _("first"); +const u8 gText_Second[] = _("second"); +const u8 gText_Third[] = _("third"); +const u8 gText_0Pts[] = _("0 pts"); +const u8 gText_10Pts[] = _("10 pts"); +const u8 gText_20Pts[] = _("20 pts"); +const u8 gText_30Pts[] = _("30 pts"); +const u8 gText_40Pts[] = _("40 pts"); +const u8 gText_50Pts[] = _("50 pts"); +const u8 gText_60Pts[] = _("60 pts"); +const u8 gText_70Pts[] = _("70 pts"); +const u8 gText_80Pts[] = _("80 pts"); +const u8 gText_90Pts[] = _("90 pts"); +const u8 gText_100Pts[] = _("100 pts"); +const u8 gText_QuestionMark[] = _("?"); +const u8 gText_KissPoster16BP[] = _("KISS POSTER{CLEAR_TO 0x5E}16BP"); +const u8 gText_KissCushion32BP[] = _("KISS CUSHION{CLEAR_TO 0x5E}32BP"); +const u8 gText_SmoochumDoll32BP[] = _("SMOOCHUM DOLL{CLEAR_TO 0x5E}32BP"); +const u8 gText_TogepiDoll48BP[] = _("TOGEPI DOLL{CLEAR_TO 0x5E}48BP"); +const u8 gText_MeowthDoll48BP[] = _("MEOWTH DOLL{CLEAR_TO 0x5E}48BP"); +const u8 gText_ClefairyDoll48BP[] = _("CLEFAIRY DOLL{CLEAR_TO 0x5E}48BP"); +const u8 gText_DittoDoll48BP[] = _("DITTO DOLL{CLEAR_TO 0x5E}48BP"); +const u8 gText_CyndaquilDoll80BP[] = _("CYNDAQUIL DOLL{CLEAR_TO 0x5E}80BP"); +const u8 gText_ChikoritaDoll80BP[] = _("CHIKORITA DOLL{CLEAR_TO 0x5E}80BP"); +const u8 gText_TotodileDoll80BP[] = _("TOTODILE DOLL{CLEAR_TO 0x5E}80BP"); +const u8 gText_LaprasDoll128BP[] = _("LAPRAS DOLL{CLEAR_TO 0x58}128BP"); +const u8 gText_SnorlaxDoll128BP[] = _("SNORLAX DOLL{CLEAR_TO 0x58}128BP"); +const u8 gText_VenusaurDoll256BP[] = _("VENUSAUR DOLL{CLEAR_TO 0x58}256BP"); +const u8 gText_CharizardDoll256BP[] = _("CHARIZARD DOLL{CLEAR_TO 0x58}256BP"); +const u8 gText_BlastoiseDoll256BP[] = _("BLASTOISE DOLL{CLEAR_TO 0x58}256BP"); +const u8 gText_Protein1BP[] = _("PROTEIN{CLEAR_TO 0x64}1BP"); +const u8 gText_Calcium1BP[] = _("CALCIUM{CLEAR_TO 0x64}1BP"); +const u8 gText_Iron1BP[] = _("IRON{CLEAR_TO 0x64}1BP"); +const u8 gText_Zinc1BP[] = _("ZINC{CLEAR_TO 0x64}1BP"); +const u8 gText_Carbos1BP[] = _("CARBOS{CLEAR_TO 0x64}1BP"); +const u8 gText_HpUp1BP[] = _("HP UP{CLEAR_TO 0x64}1BP"); +const u8 gText_Leftovers48BP[] = _("LEFTOVERS{CLEAR_TO 0x5E}48BP"); +const u8 gText_WhiteHerb48BP[] = _("WHITE HERB{CLEAR_TO 0x5E}48BP"); +const u8 gText_QuickClaw48BP[] = _("QUICK CLAW{CLEAR_TO 0x5E}48BP"); +const u8 gText_MentalHerb48BP[] = _("MENTAL HERB{CLEAR_TO 0x5E}48BP"); +const u8 gText_BrightPowder64BP[] = _("BRIGHTPOWDER{CLEAR_TO 0x5E}64BP"); +const u8 gText_ChoiceBand64BP[] = _("CHOICE BAND{CLEAR_TO 0x5E}64BP"); +const u8 gText_KingsRock64BP[] = _("KING’S ROCK{CLEAR_TO 0x5E}64BP"); +const u8 gText_FocusBand64BP[] = _("FOCUS BAND{CLEAR_TO 0x5E}64BP"); +const u8 gText_ScopeLens64BP[] = _("SCOPE LENS{CLEAR_TO 0x5E}64BP"); +const u8 gText_Softboiled16BP[] = _("SOFTBOILED{CLEAR_TO 0x4E}16BP"); +const u8 gText_SeismicToss24BP[] = _("SEISMIC TOSS{CLEAR_TO 0x4E}24BP"); +const u8 gText_DreamEater24BP[] = _("DREAM EATER{CLEAR_TO 0x4E}24BP"); +const u8 gText_MegaPunch24BP[] = _("MEGA PUNCH{CLEAR_TO 0x4E}24BP"); +const u8 gText_MegaKick48BP[] = _("MEGA KICK{CLEAR_TO 0x4E}48BP"); +const u8 gText_BodySlam48BP[] = _("BODY SLAM{CLEAR_TO 0x4E}48BP"); +const u8 gText_RockSlide48BP[] = _("ROCK SLIDE{CLEAR_TO 0x4E}48BP"); +const u8 gText_Counter48BP[] = _("COUNTER{CLEAR_TO 0x4E}48BP"); +const u8 gText_ThunderWave48BP[] = _("THUNDER WAVE{CLEAR_TO 0x4E}48BP"); +const u8 gText_SwordsDance48BP[] = _("SWORDS DANCE{CLEAR_TO 0x4E}48BP"); +const u8 gText_DefenseCurl16BP[] = _("DEFENSE CURL{CLEAR_TO 0x4E}16BP"); +const u8 gText_Snore24BP[] = _("SNORE{CLEAR_TO 0x4E}24BP"); +const u8 gText_MudSlap24BP[] = _("MUD-SLAP{CLEAR_TO 0x4E}24BP"); +const u8 gText_Swift24BP[] = _("SWIFT{CLEAR_TO 0x4E}24BP"); +const u8 gText_IcyWind24BP[] = _("ICY WIND{CLEAR_TO 0x4E}24BP"); +const u8 gText_Endure48BP[] = _("ENDURE{CLEAR_TO 0x4E}48BP"); +const u8 gText_PsychUp48BP[] = _("PSYCH UP{CLEAR_TO 0x4E}48BP"); +const u8 gText_IcePunch48BP[] = _("ICE PUNCH{CLEAR_TO 0x4E}48BP"); +const u8 gText_ThunderPunch48BP[] = _("THUNDERPUNCH{CLEAR_TO 0x4E}48BP"); +const u8 gText_FirePunch48BP[] = _("FIRE PUNCH{CLEAR_TO 0x4E}48BP"); +const u8 gText_PkmnFainted3[] = _("{STR_VAR_1} fainted…\p\n"); +const u8 gText_Marco[] = _("MARCO"); +const u8 gText_TrainerCardName[] = _("NAME: "); +const u8 gText_TrainerCardIDNo[] = _("IDNo."); +const u8 gText_TrainerCardMoney[] = _("MONEY"); +const u8 gUnknown_085ECF84[] = _("¥"); +const u8 gText_TrainerCardPokedex[] = _("POKéDEX"); +const u8 gText_EmptyString6[] = _(""); +const u8 gText_Colon2[] = _(":"); +const u8 gUnknown_085ECF91[] = _(" points"); +const u8 gText_TrainerCardTime[] = _("TIME"); +const u8 gUnknown_085ECF9E[] = _("ゲ-ムポイント"); +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_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_Var1DarkGreyShadowLightGrey[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}"); +const u8 gText_WonContestsWFriends[] = _("WON CONTESTS W/FRIENDS"); +const u8 gText_BattlePtsWon[] = _("BATTLE POINTS WON"); +const u8 gText_Var1DarkLightGreyBP[] = _("{STR_VAR_1}{COLOR DARK_GREY}{SHADOW LIGHT_GREY}BP"); +const u8 gText_BattleTower[] = _("BATTLE TOWER"); +const u8 gText_WSlashStraightSlash[] = _("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_BattleTower2[] = _("BATTLE TOWER"); +const u8 gText_BattleDome[] = _("BATTLE DOME"); +const u8 gText_BattlePalace[] = _("BATTLE PALACE"); +const u8 gText_BattleFactory[] = _("BATTLE FACTORY"); +const u8 gText_BattleArena[] = _("BATTLE ARENA"); +const u8 gText_BattlePike[] = _("BATTLE PIKE"); +const u8 gText_BattlePyramid[] = _("BATTLE PYRAMID"); + +asm(".align 2"); +const u8 gUnknown_085ED164[] = _("{STR_VAR_1} SINGLE"); + +asm(".align 2"); +const u8 gUnknown_085ED170[] = _("{STR_VAR_1} DOUBLE"); + +asm(".align 2"); +const u8 gUnknown_085ED17C[] = _("{STR_VAR_1} MULTI"); + +asm(".align 2"); +const u8 gUnknown_085ED188[] = _("{STR_VAR_1} LINK"); + +asm(".align 2"); +const u8 gUnknown_085ED190[] = _("{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_ColorBlue[] = _("{COLOR BLUE}"); +const u8 gText_ColorTransparent[] = _("{HIGHLIGHT TRANSPARENT}{COLOR TRANSPARENT}"); +const u8 gText_CDot[] = _("C."); +const u8 gText_BDot[] = _("B."); +const u8 gText_AnnouncingResults[] = _("Announcing the results!"); +const u8 gText_PreliminaryResults[] = _("The preliminary results!"); +const u8 gText_Round2Results[] = _("Round 2 results!"); +const u8 gText_Var1sVar2Won[] = _("{STR_VAR_1}’s {STR_VAR_2} won!"); +const u8 gText_CommunicationStandby[] = _("Communication standby…"); +const u8 gText_ColorDarkGrey[] = _("{COLOR DARK_GREY}"); +const u8 gUnknown_085ED222[] = _("{COLOR_HIGHLIGHT_SHADOW DYNAMIC_COLOR6 WHITE DYNAMIC_COLOR5}"); +const u8 gText_HighlightDarkGrey[] = _("{HIGHLIGHT DARK_GREY}"); +const u8 gUnknown_085ED22C[] = _(" "); +const u8 gText_DynColor2Male[] = _("{COLOR DYNAMIC_COLOR2}♂"); +const u8 gText_DynColor1Female[] = _("{COLOR DYNAMIC_COLOR1}♀"); +const u8 gText_DynColor2[] = _("{COLOR DYNAMIC_COLOR2}"); +const u8 gText_Upper[] = _("UPPER"); +const u8 gText_Lower[] = _("lower"); +const u8 gText_Others[] = _("OTHERS"); +const u8 gText_Symbols[] = _("SYMBOLS"); +const u8 gText_Register2[] = _("REGISTER"); +const u8 gText_Exit2[] = _("EXIT"); +const u8 gText_QuitChatting[] = _("Quit chatting?"); +const u8 gText_RegisterTextWhere[] = _("Register text where?"); +const u8 gText_RegisterTextHere[] = _("Register text here?"); +const u8 gText_InputText[] = _("Input text."); +const u8 gText_F700JoinedChat[] = _("{SPECIAL_F7 0x00} joined the chat!"); +const u8 gText_F700LeftChat[] = _("{SPECIAL_F7 0x00} left the chat."); +const u8 gUnknown_085ED2CF[] = _("{SPECIAL_F7 0x00}の{SPECIAL_F7 0x01}ひきめ:"); +const u8 gUnknown_085ED2D9[] = _("{SPECIAL_F7 0x00}の{SPECIAL_F7 0x01}ひきめは いません"); +const u8 gText_ExitingChat[] = _("Exiting the chat…"); +const u8 gText_LeaderLeftEndingChat[] = _("The LEADER, {SPECIAL_F7 0x00}, has\nleft, ending the chat."); +const u8 gText_RegisteredTextChanged[] = _("The registered text has been changed.\nIs it okay to save the game?"); +const u8 gText_AlreadySavedFile_Unused[] = _("There is already a saved file.\nIs it okay to overwrite it?"); +const u8 gText_SavingDontTurnOff_Unused[] = _("SAVING…\nDON’T TURN OFF THE POWER."); +const u8 gText_PlayerSavedGame_Unused[] = _("{SPECIAL_F7 0x00} saved the game."); +const u8 gText_IfLeaderLeavesChatEnds[] = _("If the LEADER leaves, the chat\nwill end. Is that okay?"); +const u8 gText_Hello[] = _("HELLO"); +const u8 gText_Pokemon2[] = _("POKéMON"); +const u8 gText_Trade[] = _("TRADE"); +const u8 gText_Battle[] = _("BATTLE"); +const u8 gText_Lets[] = _("LET’S"); +const u8 gText_Ok[] = _("OK!"); +const u8 gText_Sorry[] = _("SORRY"); +const u8 gText_YayUnkF9F9[] = _("YAY{EMOJI_BIGSMILE}"); +const u8 gText_ThankYou[] = _("THANK YOU"); +const u8 gText_ByeBye[] = _("BYE-BYE!"); +const u8 gMatchCallStevenStrategyText[] = _("Attack the weak points!"); +const u8 gMatchCall_StevenTrainersPokemonText[] = _("Ultimate STEEL POKéMON."); +const u8 gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle[] = _("I’d climb even waterfalls"); +const u8 gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle[] = _("to find a rare stone!"); +const u8 gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle[] = _("I’m the strongest and most"); +const u8 gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle[] = _("energetic after all!"); +const u8 gMatchCall_BrendanStrategyText[] = _("Battle with knowledge!"); +const u8 gMatchCall_BrendanTrainersPokemonText[] = _("I will use various POKéMON."); +const u8 gMatchCall_BrendanSelfIntroductionText_Line1[] = _("I’ll be a better POKéMON"); +const u8 gMatchCall_BrendanSelfIntroductionText_Line2[] = _("prof than my father is!"); +const u8 gMatchCall_MayStrategyText[] = _("I’m not so good at battles."); +const u8 gMatchCall_MayTrainersPokemonText[] = _("I’ll use any POKéMON!"); +const u8 gMatchCall_MaySelfIntroductionText_Line1[] = _("My POKéMON and I help"); +const u8 gMatchCall_MaySelfIntroductionText_Line2[] = _("my father’s research."); +const u8 gText_HatchedFromEgg[] = _("{STR_VAR_1} hatched from the EGG!"); +const u8 gText_NickHatchPrompt[] = _("Would you like to nickname the newly\nhatched {STR_VAR_1}?"); + +asm(".align 2"); +const u8 gText_ReadyToBerryCrush[] = _("Are you ready to BERRY-CRUSH?\nPlease pick a BERRY for use.\p"); + +asm(".align 2"); +const u8 gText_WaitForAllChooseBerry[] = _("Please wait while each member\nchooses a BERRY."); + +asm(".align 2"); +const u8 gText_EndedWithXUnitsPowder[] = _("{PAUSE_MUSIC}{PLAY_BGM MUS_FANFA1}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"); + +asm(".align 2"); +const u8 gText_RecordingGameResults[] = _("Recording your game results in the\nsave file.\lPlease wait."); + +asm(".align 2"); +const u8 gText_PlayBerryCrushAgain[] = _("Want to play BERRY CRUSH again?"); + +asm(".align 2"); +const u8 gText_YouHaveNoBerries[] = _("You have no BERRIES.\nThe game will be canceled."); + +asm(".align 2"); +const u8 gText_MemberDroppedOut[] = _("A member dropped out.\nThe game will be canceled."); + +asm(".align 2"); +const u8 gText_TimesUpNoGoodPowder[] = _("Time’s up.\pGood BERRY POWDER could not be\nmade…\p"); + +asm(".align 2"); +const u8 gText_CommunicationStandby2[] = _("Communication standby…"); + +asm(".align 2"); +const u8 gText_1DotBlueF700[] = _("1. {COLOR BLUE}{SHADOW LIGHT_BLUE}{SPECIAL_F7 0x00}"); + +asm(".align 2"); +const u8 gText_1DotF700[] = _("1. {SPECIAL_F7 0x00}"); + +asm(".align 2"); +const u8 gText_SpaceTimes2[] = _(" time(s)"); + +asm(".align 2"); +const u8 gText_XDotY[] = _("{STR_VAR_1}.{STR_VAR_2}"); + +asm(".align 2"); +const u8 gText_Var1Berry[] = _("{STR_VAR_1} BERRY"); + +asm(".align 2"); +const u8 gText_TimeColon[] = _("Time:"); + +asm(".align 2"); +const u8 gText_PressingSpeed[] = _("Pressing Speed:"); + +asm(".align 2"); +const u8 gText_Silkiness[] = _("Silkiness:"); + +asm(".align 2"); +const u8 gText_StrVar1[] = _("{STR_VAR_1}"); + +asm(".align 2"); +const u8 gText_SpaceMin[] = _(" min. "); + +asm(".align 2"); +const u8 gText_XDotY2[] = _("{STR_VAR_1}.{STR_VAR_2}"); + +asm(".align 2"); +const u8 gText_SpaceSec[] = _(" sec."); + +asm(".align 2"); +const u8 gText_XDotY3[] = _("{STR_VAR_1}.{STR_VAR_2}"); + +asm(".align 2"); +const u8 gText_TimesPerSec[] = _(" Times/sec."); + +asm(".align 2"); +const u8 gText_Var1Percent[] = _("{STR_VAR_1}%"); + +asm(".align 2"); +const u8 gText_PressesRankings[] = _("No. of Presses Rankings"); + +asm(".align 2"); +const u8 gText_CrushingResults[] = _("Crushing Results"); + +asm(".align 2"); +const u8 gText_NeatnessRankings[] = _("Neatness Rankings"); + +asm(".align 2"); +const u8 gText_CoopRankings[] = _("Cooperative Rankings"); + +asm(".align 2"); +const u8 gText_PressingPowerRankings[] = _("Pressing-Power Rankings"); +const u8 gText_BerryCrush2[] = _("BERRY CRUSH"); +const u8 gText_PressingSpeedRankings[] = _("Pressing-Speed Rankings"); +const u8 gText_Var1Players[] = _("{STR_VAR_1} PLAYERS"); +const u8 gText_SymbolsEarned[] = _("Symbols Earned"); +const u8 gText_BattleRecord[] = _("Battle Record"); +const u8 gText_BattlePoints[] = _("Battle Points"); +const u8 gUnknown_085ED92A[] = _("CANCEL"); +const u8 gUnknown_085ED931[] = _(""); +const u8 gUnknown_085ED932[] = _("Check BATTLE FRONTIER MAP."); +const u8 gUnknown_085ED94D[] = _("Check TRAINER CARD."); +const u8 gUnknown_085ED961[] = _("View recorded battle."); +const u8 gUnknown_085ED977[] = _("Put away the FRONTIER PASS."); +const u8 gUnknown_085ED993[] = _("Your current Battle Points."); +const u8 gUnknown_085ED9AF[] = _("Your collected Symbols."); +const u8 gUnknown_085ED9C7[] = _("Battle Tower - Ability Symbol"); +const u8 gUnknown_085ED9E5[] = _("Battle Dome - Tactics Symbol"); +const u8 gUnknown_085EDA02[] = _("Battle Palace - Spirits Symbol"); +const u8 gUnknown_085EDA21[] = _("Battle Arena - Guts Symbol"); +const u8 gUnknown_085EDA3C[] = _("Battle Factory - Knowledge Symbol"); +const u8 gUnknown_085EDA5E[] = _("Battle Pike - Luck Symbol"); +const u8 gUnknown_085EDA78[] = _("Battle Pyramid - Brave Symbol"); +const u8 gUnknown_085EDA96[] = _("There is no Battle Record."); +const u8 gUnknown_085EDAB1[] = _("BATTLE TOWER"); +const u8 gUnknown_085EDABE[] = _("BATTLE DOME"); +const u8 gUnknown_085EDACA[] = _("BATTLE PALACE"); +const u8 gUnknown_085EDAD8[] = _("BATTLE ARENA"); +const u8 gUnknown_085EDAE5[] = _("BATTLE FACTORY"); +const u8 gUnknown_085EDAF4[] = _("BATTLE PIKE"); +const u8 gUnknown_085EDB00[] = _("BATTLE PYRAMID"); +const u8 gUnknown_085EDB0F[] = _("KO opponents and aim for the top!\nYour ability will be tested."); +const u8 gUnknown_085EDB4E[] = _("Keep winning at the tournament!\nYour tactics will be tested."); +const u8 gUnknown_085EDB8B[] = _("Watch your POKéMON battle!\nYour spirit will be tested."); +const u8 gUnknown_085EDBC2[] = _("Win battles with teamed-up POKéMON!\nYour guts will be tested."); +const u8 gUnknown_085EDC00[] = _("Aim for victory using rental POKéMON!\nYour knowledge will be tested."); +const u8 gUnknown_085EDC45[] = _("Select one of three paths to battle!\nYour luck will be tested."); +const u8 gUnknown_085EDC84[] = _("Aim for the top with exploration!\nYour bravery will be tested."); +const u8 gText_ContinueMenuPlayer[] = _("PLAYER"); +const u8 gText_ContinueMenuTime[] = _("TIME"); +const u8 gText_ContinueMenuPokedex[] = _("POKéDEX"); +const u8 gText_ContinueMenuBadges[] = _("BADGES"); +const u8 gText_Powder[] = _("POWDER"); +const u8 gText_BerryPickingRecords[] = _("DODRIO BERRY-PICKING RECORDS"); +const u8 gText_BerriesPicked[] = _("BERRIES picked:"); +const u8 gText_BestScore[] = _("Best score:"); +const u8 gText_BerriesInRowFivePlayers[] = _("BERRIES picked in a row with\nfive players:"); +const u8 gText_BerryPickingResults[] = _("Announcing BERRY-PICKING results!"); +const u8 gText_10P30P50P50P[] = _("{CLEAR_TO 0x03}10P{CLEAR_TO 0x2B}30P{CLEAR_TO 0x53}50P{CLEAR_TO 0x77}{EMOJI_MINUS}50P"); +const u8 gText_AnnouncingRankings[] = _("Announcing rankings!"); +const u8 gText_AnnouncingPrizes[] = _("Announcing prizes!"); +const u8 gText_1Colon[] = _("1:"); +const u8 gText_2Colon[] = _("2:"); +const u8 gText_3Colon[] = _("3:"); +const u8 gText_4Colon[] = _("4:"); +const u8 gText_5Colon[] = _("5:"); +const u8 gText_FirstPlacePrize[] = _("The first-place winner gets\nthis {SPECIAL_F7 0x00}!"); +const u8 gText_CantHoldAnyMore[] = _("You can’t hold any more!"); +const u8 gText_FilledStorageSpace[] = _("It filled its storage space."); +const u8 gText_WantToPlayAgain[] = _("Want to play again?"); +const u8 gText_SomeoneDroppedOut[] = _("Somebody dropped out.\nThe link will be canceled."); +const u8 gText_SpacePoints[] = _(" points"); +const u8 gText_CommunicationStandby3[] = _("Communication standby…"); +const u8 gText_SpacePoints2[] = _(" points"); +const u8 gText_SpaceTimes3[] = _(" time(s)"); +const u8 gText_PkmnJumpRecords[] = _("POKéMON JUMP RECORDS"); +const u8 gText_JumpsInARow[] = _("Jumps in a row:"); +const u8 gText_BestScore2[] = _("Best score:"); +const u8 gText_ExcellentsInARow[] = _("EXCELLENTS in a row:"); +const u8 gText_AwesomeWonF701F700[] = _("Awesome score! You’ve\nwon {SPECIAL_F7 0x01} {SPECIAL_F7 0x00}!"); +const u8 gText_FilledStorageSpace2[] = _("It filled its storage space."); +const u8 gText_CantHoldMore[] = _("You can’t hold any more!"); +const u8 gText_WantToPlayAgain2[] = _("Want to play again?"); +const u8 gText_SomeoneDroppedOut2[] = _("Somebody dropped out.\nThe link will be canceled."); +const u8 gText_CommunicationStandby4[] = _("Communication standby…"); +const u8 gText_LinkContestResults[] = _("{PLAYER}’s Link Contest Results"); +const u8 gText_1st[] = _("1st"); +const u8 gText_2nd[] = _("2nd"); +const u8 gText_3rd[] = _("3rd"); +const u8 gText_4th[] = _("4th"); +const u8 gText_Friend[] = _("Friend"); +const u8 gUnknown_085EDFB7[] = _("POKeMON"); +const u8 gJPText_MysteryGift[] = _("ふしぎなもらいもの"); +const u8 gJPText_DecideStop[] = _("{A_BUTTON}けってい {B_BUTTON}やめる"); +const u8 gUnknown_085EDFD6[] = _("カードeリーダー{PLUS} で\nふしぎなもらいものを よみこみます"); +const u8 gUnknown_085EDFF5[] = _("カードeリーダー{PLUS}の メニューから\n‘つうしん’を えらび"); +const u8 gUnknown_085EE014[] = _("‘ゲームボーイアドバンスとつうしん’\nを せんたく してください"); +const u8 gUnknown_085EE035[] = _("カードeリーダー{PLUS}の ‘つうしん’を\nえらんで Aボタンを おしてください"); +const u8 gUnknown_085EE05C[] = _("せつぞくが まちがっています"); +const u8 gUnknown_085EE06B[] = _("カードの よみこみを\nちゅうし しました"); +const u8 gUnknown_085EE080[] = _("カードeリーダー{PLUS}と\nつうしん できません"); +const u8 gUnknown_085EE097[] = _("つうしん ちゅう です"); +const u8 gUnknown_085EE0A3[] = _("つうしん エラーです\nせつぞくを たしかめて ください"); +const u8 gUnknown_085EE0BF[] = _("つうしん エラーです\nはじめから やりなおして ください"); +const u8 gUnknown_085EE0DC[] = _("カードeリーダー{PLUS} に\nカードを よみこませて ください"); +const u8 gUnknown_085EE0FA[] = _("つうしん しゅうりょう!"); +const u8 gUnknown_085EE107[] = _("あらたな トレーナーが\nホウエンに やってきた!"); +const u8 gUnknown_085EE120[] = _("しばらく おまちください"); +const u8 gUnknown_085EE12D[] = _("かきこみ エラー です\nデータが ほぞん できませんでした"); +const u8 gUnknown_085EE14B[] = _("RED"); +const u8 gUnknown_085EE14F[] = _("BLUE"); +const u8 gUnknown_085EE154[] = _("---"); +const u8 gText_SingleBattleRoomResults[] = _("{PLAYER}’s Single Battle Room Results"); +const u8 gText_DoubleBattleRoomResults[] = _("{PLAYER}’s Double Battle Room Results"); +const u8 gText_MultiBattleRoomResults[] = _("{PLAYER}’s Multi Battle Room Results"); +const u8 gText_LinkMultiBattleRoomResults[] = _("{PLAYER}’s Link Multi Battle Room Results"); +const u8 gText_SingleBattleTourneyResults[] = _("{PLAYER}’s Single Battle Tourney Results"); +const u8 gText_DoubleBattleTourneyResults[] = _("{PLAYER}’s Double Battle Tourney Results"); +const u8 gText_SingleBattleHallResults[] = _("{PLAYER}’s Single Battle Hall Results"); +const u8 gText_DoubleBattleHallResults[] = _("{PLAYER}’s Double Battle Hall Results"); +const u8 gText_BattleChoiceResults[] = _("{PLAYER}’s Battle Choice Results"); +const u8 gText_SetKOTourneyResults[] = _("{PLAYER}’s Set KO Tourney Results"); +const u8 gText_BattleSwapSingleResults[] = _("{PLAYER}’s Battle Swap Single Results"); +const u8 gText_BattleSwapDoubleResults[] = _("{PLAYER}’s Battle Swap Double Results"); +const u8 gText_BattleQuestResults[] = _("{PLAYER}’s Battle Quest Results"); +const u8 gText_Lv502[] = _("LV. 50"); +const u8 gText_OpenLv[] = _("OPEN LV."); +const u8 gText_WinStreak[] = _("Win streak: {STR_VAR_1}"); +const u8 gText_Current[] = _("CURRENT"); +const u8 gText_Record[] = _("RECORD"); +const u8 gText_Prev[] = _("PREV."); +const u8 gText_RentalSwap[] = _("Rental/Swap"); +const u8 gText_Total[] = _("Total"); +const u8 gText_ClearStreak[] = _("Clear streak: {STR_VAR_1}"); +const u8 gText_Championships[] = _("Championships: {STR_VAR_1}"); +const u8 gText_RoomsCleared[] = _("Rooms cleared: {STR_VAR_1}"); +const u8 gText_TimesCleared[] = _("Times cleared:{CLEAR 0x05}{STR_VAR_1}"); +const u8 gText_KOsInARow[] = _("KOs in a row: {STR_VAR_1}"); +const u8 gText_TimesVar1[] = _("Times: {STR_VAR_1}"); +const u8 gText_FloorsCleared[] = _("Floors cleared: {STR_VAR_1}"); + +asm(".align 2"); +const u8 gUnknown_085EE3B0[] = _("LV. 50"); + +asm(".align 2"); +const u8 gUnknown_085EE3B8[] = _("OPEN LEVEL"); + +asm(".align 2"); +const u8 gUnknown_085EE3C4[] = _("Win streak: {STR_VAR_2}"); + +asm(".align 2"); +const u8 gUnknown_085EE3D4[] = _("Clear streak: {STR_VAR_2}"); + +asm(".align 2"); +const u8 gUnknown_085EE3E8[] = _("Rooms cleared: {STR_VAR_2}"); + +asm(".align 2"); +const u8 gUnknown_085EE3FC[] = _("KOs in a row: {STR_VAR_2}"); + +asm(".align 2"); +const u8 gUnknown_085EE410[] = _("Floors cleared: {STR_VAR_2}"); + +asm(".align 2"); +const u8 gText_1Dot[] = _("1."); +const u8 gUnknown_085EE427[] = _("2."); +const u8 gUnknown_085EE42A[] = _("3."); +const u8 gText_SavingDontTurnOff2[] = _("SAVING…\nDON’T TURN OFF THE POWER."); +const u8 gText_BlenderMaxSpeedRecord[] = _("BERRY BLENDER\nMAXIMUM SPEED RECORD!"); +const u8 gText_234Players[] = _("2 PLAYERS\n3 PLAYERS\n4 PLAYERS"); +const u8 gText_YesNo[] = _("YES\nNO"); +const u8 gText_SelectorArrow3[] = _("▶"); +const u8 gText_Peekaboo[] = _("PEEKABOO!"); +const u8 gText_CommErrorCheckConnections[] = _("Communication error…\nPlease check all connections,\nthen turn the power OFF and ON."); +const u8 gText_CommErrorEllipsis[] = _("Communication error…"); +const u8 gText_MoveCloserToLinkPartner[] = _("Move closer to your link partner(s).\nAvoid obstacles between partners."); +const u8 gText_ABtnRegistrationCounter[] = _("A Button: Registration Counter"); +const u8 gText_ABtnTitleScreen[] = _("A Button: Title Screen"); +const u8 gText_Option[] = _("OPTION"); +const u8 gText_TextSpeed[] = _("TEXT SPEED"); +const u8 gText_BattleScene[] = _("BATTLE SCENE"); +const u8 gText_BattleStyle[] = _("BATTLE STYLE"); +const u8 gText_Sound[] = _("SOUND"); +const u8 gText_Frame[] = _("FRAME"); +const u8 gText_OptionMenuCancel[] = _("CANCEL"); +const u8 gText_ButtonMode[] = _("BUTTON MODE"); +const u8 gText_TextSpeedSlow[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SLOW"); +const u8 gText_TextSpeedMid[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MID"); +const u8 gText_TextSpeedFast[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}FAST"); +const u8 gText_BattleSceneOn[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}ON"); +const u8 gText_BattleSceneOff[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}OFF"); +const u8 gText_BattleStyleShift[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SHIFT"); +const u8 gText_BattleStyleSet[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}SET"); +const u8 gText_SoundMono[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}MONO"); +const u8 gText_SoundStereo[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}STEREO"); +const u8 gText_FrameType[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}TYPE"); +const u8 gText_FrameTypeNumber[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}"); +const u8 gText_ButtonTypeNormal[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}NORMAL"); +const u8 gText_ButtonTypeLR[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}LR"); +const u8 gText_ButtonTypeLEqualsA[] = _("{COLOR GREEN}{SHADOW LIGHT_GREEN}L=A"); +const u8 gText_XPLink[] = _("{STR_VAR_1}P LINK"); +const u8 gText_BronzeCard[] = _("BRONZE"); +const u8 gText_CopperCard[] = _("COPPER"); +const u8 gText_SilverCard[] = _("SILVER"); +const u8 gText_GoldCard[] = _("GOLD"); +const u8 gText_Day[] = _("DAY"); +const u8 gText_Colon3[] = _(":"); +const u8 gText_Confirm2[] = _("CONFIRM"); +const u8 gUnknown_085EE698[] = _("Days"); +const u8 gUnknown_085EE69D[] = _("Time:"); +const u8 gUnknown_085EE6A3[] = _("Game time"); +const u8 gUnknown_085EE6AD[] = _("RTC time"); +const u8 gUnknown_085EE6B6[] = _("Updated time"); +const u8 gText_MenuPokedex[] = _("POKéDEX"); +const u8 gText_MenuPokemon[] = _("POKéMON"); +const u8 gText_MenuBag[] = _("BAG"); +const u8 gText_MenuPokenav[] = _("POKéNAV"); +const u8 gText_MenuPlayer[] = _("{PLAYER}"); +const u8 gText_MenuSave[] = _("SAVE"); +const u8 gText_MenuOption[] = _("OPTION"); +const u8 gText_MenuExit[] = _("EXIT"); +const u8 gText_MenuRetire[] = _("RETIRE"); +const u8 gText_MenuRest[] = _("REST"); +const u8 gText_SafariBallStock[] = _("SAFARI BALLS\nStock: {STR_VAR_1}"); +const u8 gText_BattlePyramidFloor[] = _("Battle Pyramid\n{STR_VAR_1}"); +const u8 gText_Floor1[] = _("Floor 1"); +const u8 gText_Floor2[] = _("Floor 2"); +const u8 gText_Floor3[] = _("Floor 3"); +const u8 gText_Floor4[] = _("Floor 4"); +const u8 gText_Floor5[] = _("Floor 5"); +const u8 gText_Floor6[] = _("Floor 6"); +const u8 gText_Floor7[] = _("Floor 7"); +const u8 gText_Peak[] = _("Peak"); +const u8 gText_LinkStandby2[] = _("Link standby…\n… … B Button: Cancel"); +const u8 gText_PressAToLoadEvent[] = _("Press the A Button to load event.\n… … B Button: Cancel"); +const u8 gText_LoadingEvent[] = _("Loading event…"); +const u8 gText_DontRemoveCableTurnOff[] = _("Don’t remove the Game Link cable.\nDon’t turn off the power."); +const u8 gText_EventSafelyLoaded[] = _("The event was safely loaded."); +const u8 gText_LoadErrorEndingSession[] = _("Loading error.\nEnding session."); +const u8 gUnknown_085EE846[] = _("プレイヤー"); +const u8 gUnknown_085EE84C[] = _("さま"); +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 gUnknown_085EE8DC[] = _("{COLOR RED}{SHADOW LIGHT_RED}ゲ-ムフリ-ク"); +const u8 gUnknown_085EE8EA[] = _("{COLOR RED}{SHADOW LIGHT_RED}"); +const u8 gText_Hoenn[] = _("HOENN"); +const u8 gText_OhABite[] = _("Oh! A bite!"); +const u8 gText_PokemonOnHook[] = _("A POKéMON’s on the hook!{PAUSE_UNTIL_PRESS}"); +const u8 gText_NotEvenANibble[] = _("Not even a nibble…{PAUSE_UNTIL_PRESS}"); +const u8 gText_ItGotAway[] = _("It got away…{PAUSE_UNTIL_PRESS}"); +const u8 gText_XWillBeSentToY[] = _("{STR_VAR_2} will be\nsent to {STR_VAR_1}."); +const u8 gText_ByeByeVar1[] = _("Bye-bye, {STR_VAR_2}!"); +const u8 gText_XSentOverY[] = _("{STR_VAR_1} sent over {STR_VAR_3}."); +const u8 gText_TakeGoodCareOfX[] = _("Take good care of {STR_VAR_3}!"); + +// Easy chat group names +const u8 gEasyChatGroupName_Pokemon[] = _("POKéMON"); +const u8 gEasyChatGroupName_Trainer[] = _("TRAINER"); +const u8 gEasyChatGroupName_Status[] = _("STATUS"); +const u8 gEasyChatGroupName_Battle[] = _("BATTLE"); +const u8 gEasyChatGroupName_Greetings[] = _("GREETINGS"); +const u8 gEasyChatGroupName_People[] = _("PEOPLE"); +const u8 gEasyChatGroupName_Voices[] = _("VOICES"); +const u8 gEasyChatGroupName_Speech[] = _("SPEECH"); +const u8 gEasyChatGroupName_Endings[] = _("ENDINGS"); +const u8 gEasyChatGroupName_Feelings[] = _("FEELINGS"); +const u8 gEasyChatGroupName_Conditions[] = _("CONDITIONS"); +const u8 gEasyChatGroupName_Actions[] = _("ACTIONS"); +const u8 gEasyChatGroupName_Lifestyle[] = _("LIFESTYLE"); +const u8 gEasyChatGroupName_Hobbies[] = _("HOBBIES"); +const u8 gEasyChatGroupName_Time[] = _("TIME"); +const u8 gEasyChatGroupName_Misc[] = _("MISC."); +const u8 gEasyChatGroupName_Adjectives[] = _("ADJECTIVES"); +const u8 gEasyChatGroupName_Events[] = _("EVENTS"); +const u8 gEasyChatGroupName_Move1[] = _("MOVE 1"); +const u8 gEasyChatGroupName_Move2[] = _("MOVE 2"); +const u8 gEasyChatGroupName_TrendySaying[] = _("TRENDY SAYING"); +const u8 gEasyChatGroupName_Pokemon2[] = _("POKéMON2"); + +const u8 gText_ThreeQuestionMarks[] = _("???"); +const u8 gUnknown_085EEA46[] = _("MAX. HP"); +const u8 gUnknown_085EEA4E[] = _("ATTACK"); +const u8 gUnknown_085EEA55[] = _("DEFENSE"); +const u8 gUnknown_085EEA5D[] = _("SPEED"); +const u8 gUnknown_085EEA63[] = _("SP. ATK"); +const u8 gUnknown_085EEA6B[] = _("SP. DEF"); +const u8 gText_UnkCtrlF904[] = _("{PLUS}"); +const u8 gText_Dash[] = _("-"); +const u8 gText_FromSpace[] = _("From "); +const u8 gText_MixingRecords[] = _("Mixing records…"); +const u8 gText_RecordMixingComplete[] = _("Record mixing completed.\nThank you for waiting."); +const u8 gText_YourName[] = _("YOUR NAME?"); +const u8 gText_BoxName[] = _("BOX NAME?"); +const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}’s nickname?"); +const u8 gText_TellHimTheWords[] = _("Tell him the words."); +const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK"); +const u8 gText_CallCantBeMadeHere[] = _("A call can’t be made from here."); +const u8 gUnknown_085EEB2B[] = _("HANDSOME"); +const u8 gUnknown_085EEB34[] = _("VINNY"); +const u8 gUnknown_085EEB3A[] = _("MOREME"); +const u8 gUnknown_085EEB41[] = _("IRONHARD"); +const u8 gUnknown_085EEB4A[] = _("MUSCLE"); +const u8 gUnknown_085EEB51[] = _("coolness"); +const u8 gUnknown_085EEB5A[] = _("beauty"); +const u8 gUnknown_085EEB61[] = _("cuteness"); +const u8 gUnknown_085EEB6A[] = _("smartness"); +const u8 gUnknown_085EEB74[] = _("toughness"); +const u8 gText_Lady2[] = _("Lady"); +const u8 gUnknown_085EEB83[] = _("slippery"); +const u8 gUnknown_085EEB8C[] = _("roundish"); +const u8 gUnknown_085EEB95[] = _("wham-ish"); +const u8 gUnknown_085EEB9E[] = _("shiny"); +const u8 gUnknown_085EEBA4[] = _("sticky"); +const u8 gUnknown_085EEBAB[] = _("pointy"); +const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON"); +const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON."); +const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON."); +const u8 gText_SelectThirdPkmn[] = _("Select the third POKéMON."); +const u8 gText_Rent[] = _("RENT"); +const u8 gText_Summary[] = _("SUMMARY"); +const u8 gText_Others2[] = _("OTHERS"); +const u8 gText_Deselect[] = _("DESELECT"); +const u8 gText_TheseThreePkmnOkay[] = _("Are these three POKéMON OK?"); +const u8 gText_Yes2[] = _("YES"); +const u8 gText_No2[] = _("NO"); +const u8 gText_CantSelectSamePkmn[] = _("Can’t select same {PKMN}."); +const u8 gText_PkmnSwap[] = _("POKéMON SWAP"); +const u8 gText_SelectPkmnToSwap[] = _("Select POKéMON to swap."); +const u8 gText_SelectPkmnToAccept[] = _("Select POKéMON to accept."); +const u8 gText_Swap[] = _("SWAP"); +const u8 gText_Summary2[] = _("SUMMARY"); +const u8 gText_Rechoose[] = _("RECHOOSE"); +const u8 gText_QuitSwapping[] = _("Quit swapping?"); +const u8 gText_Yes3[] = _("YES"); +const u8 gText_No3[] = _("NO"); +const u8 gText_PkmnForSwap[] = _("{PKMN} FOR SWAP"); +const u8 gText_Cancel3[] = _("CANCEL"); +const u8 gUnknown_085EECE4[] = _("SWAP"); +const u8 gUnknown_085EECE9[] = _("ACCEPT"); +const u8 gText_AcceptThisPkmn[] = _("Accept this POKéMON?"); +const u8 gUnknown_085EED05[] = _(" "); +const u8 gText_SamePkmnInPartyAlready[] = _("Same {PKMN} in party already."); +const u8 gText_DecimalPoint[] = _("."); +const u8 gText_SavingPlayer[] = _("PLAYER"); +const u8 gText_SavingBadges[] = _("BADGES"); +const u8 gText_SavingPokedex[] = _("POKéDEX"); +const u8 gText_SavingTime[] = _("TIME"); +const u8 gText_WirelessCommStatus[] = _("Wireless Communication Status"); +const u8 gText_PeopleTrading[] = _("People trading:"); +const u8 gText_PeopleBattling[] = _("People battling:"); +const u8 gText_PeopleInUnionRoom[] = _("People in the UNION ROOM:"); +const u8 gText_PeopleCommunicating[] = _("People communicating:"); +const u8 gText_F700Players[] = _("{SPECIAL_F7 0} players"); +const u8 gText_F701Players[] = _("{SPECIAL_F7 1} players"); +const u8 gText_F702Players[] = _("{SPECIAL_F7 2} players"); +const u8 gText_F703Players[] = _("{SPECIAL_F7 3} players"); + +const u8 *const gTextTable_Players[] = { + gText_F700Players, + gText_F701Players, + gText_F702Players, + gText_F703Players +}; + +asm(".align 2"); +const u8 gText_WonderCards[] = _("WONDER CARDS"); + +asm(".align 2"); +const u8 gText_WonderNews[] = _("WONDER NEWS"); + +asm(".align 2"); +const u8 gText_WirelessCommunication[] = _("WIRELESS COMMUNICATION"); + +asm(".align 2"); +const u8 gText_Friend2[] = _("FRIEND"); + +asm(".align 2"); +const u8 gText_Exit3[] = _("EXIT"); + +asm(".align 2"); +const u8 gText_Receive[] = _("RECEIVE"); + +asm(".align 2"); +const u8 gText_Send[] = _("SEND"); + +asm(".align 2"); +const u8 gText_Toss[] = _("TOSS"); + +asm(".align 2"); +const u8 gText_VarietyOfEventsImportedWireless[] = _("A variety of events will be imported\nover Wireless Communication."); + +asm(".align 2"); +const u8 gText_WonderCardsInPossession[] = _("Read the WONDER CARDS in your\npossession."); + +asm(".align 2"); +const u8 gText_ReadNewsThatArrived[] = _("Read the NEWS that arrived."); + +asm(".align 2"); +const u8 gText_ReturnToTitle[] = _("Return to the title screen."); + +asm(".align 2"); +const u8 gText_DontHaveCardNewOneInput[] = _("You don’t have a WONDER CARD,\nso a new CARD will be input."); + +asm(".align 2"); +const u8 gText_DontHaveNewsNewOneInput[] = _("You don’t have any WONDER NEWS,\nso new NEWS will be input."); + +asm(".align 2"); +const u8 gText_WhereShouldCardBeAccessed[] = _("Where should the WONDER CARD\nbe accessed?"); + +asm(".align 2"); +const u8 gText_WhereShouldNewsBeAccessed[] = _("Where should the WONDER NEWS\nbe accessed?"); + +asm(".align 2"); +const u8 gUnknown_085EEFC0[] = _("Communication standby…\nB Button: Cancel"); + +asm(".align 2"); +const u8 gText_Communicating[] = _("Communicating…"); + +asm(".align 2"); +const u8 gText_CommunicationCompleted[] = _("Communication completed."); + +asm(".align 2"); +const u8 gText_CommunicationError[] = _("Communication error."); + +asm(".align 2"); +const u8 gText_CommunicationCanceled[] = _("Communication has been canceled."); + +asm(".align 2"); +const u8 gText_ThrowAwayWonderCard[] = _("Throw away the WONDER CARD\nand input a new CARD?"); + +asm(".align 2"); +const u8 gText_HaventReceivedCardsGift[] = _("You haven’t received the CARD’s gift\nyet. Input a new CARD anyway?"); + +asm(".align 2"); +const u8 gText_WonderCardReceivedFrom[] = _("A WONDER CARD has been received\nfrom {STR_VAR_1}."); + +asm(".align 2"); +const u8 gText_WonderNewsReceivedFrom[] = _("A WONDER NEWS item has been\nreceived from {STR_VAR_1}."); + +asm(".align 2"); +const u8 gText_WonderCardReceived[] = _("A new WONDER CARD has been\nreceived."); + +asm(".align 2"); +const u8 gText_WonderNewsReceived[] = _("A new WONDER NEWS item has been\nreceived."); + +asm(".align 2"); +const u8 gText_NewStampReceived[] = _("A new STAMP has been received."); + +asm(".align 2"); +const u8 gText_NewTrainerReceived[] = _("A new TRAINER has arrived."); + +asm(".align 2"); +const u8 gText_AlreadyHadCard[] = _("You already had that\nWONDER CARD."); + +asm(".align 2"); +const u8 gText_AlreadyHadNews[] = _("You already had that\nWONDER NEWS item."); + +asm(".align 2"); +const u8 gText_AlreadyHadStamp[] = _("You already had that\nSTAMP."); + +asm(".align 2"); +const u8 gText_NoMoreRoomForStamps[] = _("There’s no more room for adding\nSTAMPS."); + +asm(".align 2"); +const u8 gText_RecordUploadedViaWireless[] = _("Your record has been uploaded via\nWIRELESS COMMUNICATION."); + +asm(".align 2"); +const u8 gText_CantAcceptCardFromTrainer[] = _("You can’t accept a WONDER CARD\nfrom this TRAINER."); + +asm(".align 2"); +const u8 gText_CantAcceptNewsFromTrainer[] = _("You can’t accept WONDER NEWS\nfrom this TRAINER."); + +asm(".align 2"); +const u8 gText_NothingSentOver[] = _("Nothing was sent over…"); + +asm(".align 2"); +const u8 gText_WhatToDoWithCards[] = _("What would you like to do\nwith the WONDER CARDS?"); + +asm(".align 2"); +const u8 gText_WhatToDoWithNews[] = _("What would you like to do\nwith the WONDER NEWS?"); + +asm(".align 2"); +const u8 gText_SendingWonderCard[] = _("Sending your WONDER CARD…"); + +asm(".align 2"); +const u8 gText_SendingWonderNews[] = _("Sending your WONDER NEWS item…"); + +asm(".align 2"); +const u8 gText_WonderCardSentTo[] = _("Your WONDER CARD has been sent\nto {STR_VAR_1}."); + +asm(".align 2"); +const u8 gText_WonderNewsSentTo[] = _("Your WONDER NEWS item has been\nsent to {STR_VAR_1}."); + +asm(".align 2"); +const u8 gText_StampSentTo[] = _("A STAMP has been sent to {STR_VAR_1}."); + +asm(".align 2"); +const u8 gText_GiftSentTo[] = _("A GIFT has been sent to {STR_VAR_1}."); + +asm(".align 2"); +const u8 gText_OtherTrainerHasCard[] = _("The other TRAINER has the same\nWONDER CARD already."); + +asm(".align 2"); +const u8 gText_OtherTrainerHasNews[] = _("The other TRAINER has the same\nWONDER NEWS already."); + +asm(".align 2"); +const u8 gText_OtherTrainerHasStamp[] = _("The other TRAINER has the same\nSTAMP already."); + +asm(".align 2"); +const u8 gText_OtherTrainerCanceled[] = _("The other TRAINER canceled\ncommunication."); + +asm(".align 2"); +const u8 gText_CantSendGiftToTrainer[] = _("You can’t send a MYSTERY GIFT to\nthis TRAINER."); + +asm(".align 2"); +const u8 gText_IfThrowAwayCardEventWontHappen[] = _("If you throw away the CARD,\nits event won’t happen. Okay?"); + +asm(".align 2"); +const u8 gText_OkayToDiscardNews[] = _("Is it okay to discard this\nNEWS item?"); + +asm(".align 2"); +const u8 gText_HaventReceivedGiftOkayToDiscard[] = _("You haven’t received the\nGIFT. Is it okay to discard?"); + +asm(".align 2"); +const u8 gText_DataWillBeSaved[] = _("Data will be saved.\nPlease wait."); + +asm(".align 2"); +const u8 gText_SaveCompletedPressA[] = _("Save completed.\nPlease press the A Button."); + +asm(".align 2"); +const u8 gText_WonderCardThrownAway[] = _("The WONDER CARD was thrown away."); + +asm(".align 2"); +const u8 gText_WonderNewsThrownAway[] = _("The WONDER NEWS was thrown away."); + +asm(".align 2"); +const u8 gText_MysteryGift[] = _("MYSTERY GIFT"); + +asm(".align 2"); +const u8 gText_PickOKExit[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}EXIT"); + +asm(".align 2"); +const u8 gText_PickOKCancel[] = _("{DPAD_UPDOWN}PICK {A_BUTTON}OK {B_BUTTON}CANCEL"); +const u8 gText_PlayersBattleResults[] = _("{PLAYER}’s BATTLE RESULTS"); +const u8 gText_TotalRecordWLD[] = _("TOTAL RECORD W:{STR_VAR_1} L:{STR_VAR_2} D:{STR_VAR_3}"); +const u8 gText_WinLoseDraw[] = _("{CLEAR_TO 0x53}WIN{CLEAR_TO 0x80}LOSE{CLEAR_TO 0xB0}DRAW"); +const u8 gText_CommunicationStandby5[] = _("Communication standby…"); +const u8 gText_QuitTheGame[] = _("Quit the game?"); +const u8 gText_YouveGot9999Coins[] = _("You’ve got 9,999 COINS."); +const u8 gText_YouveRunOutOfCoins[] = _("You’ve run out of COINS.\nGame over!"); +const u8 gText_YouDontHaveThreeCoins[] = _("You don’t have three COINS."); +const u8 gText_ReelTimeHelp[] = _("REEL TIME\nHere’s your chance to take\naim and nail marks!\nReel Time continues for the\nawarded number of spins.\nIt all ends on a Big Bonus."); +const u8 gDaycareText_GetAlongVeryWell[] = _("The two seem to get along\nvery well."); +const u8 gDaycareText_GetAlong[] = _("The two seem to get along."); +const u8 gDaycareText_DontLikeOther[] = _("The two don’t seem to like\neach other much."); +const u8 gDaycareText_PlayOther[] = _("The two prefer to play with other\nPOKéMON than each other."); +const u8 gText_NewLine2[] = _("\n"); +const u8 gText_Exit4[] = _("EXIT"); +const u8 gText_Lv[] = _("{LV}"); +const u8 gText_TimeBoard[] = _("TIME BOARD"); +const u8 gText_TimeCleared[] = _("TIME CLEARED "); +const u8 gText_XMinYDotZSec[] = _("{STR_VAR_1} min. {STR_VAR_2}.{STR_VAR_3} sec."); +const u8 gUnknown_085EF8B6[] = _("1F"); +const u8 gUnknown_085EF8B9[] = _("2F"); +const u8 gUnknown_085EF8BC[] = _("3F"); +const u8 gUnknown_085EF8BF[] = _("4F"); +const u8 gText_TeachWhichMoveToPkmn[] = _("Teach which move to {STR_VAR_1}?"); +const u8 gText_TeachX[] = _("Teach {STR_VAR_2}?"); +const u8 gText_PkmnLearnedMove4[] = _("{STR_VAR_1} learned\n{STR_VAR_2}!"); +const u8 gText_PkmnTryingToLearnMove[] = _("{STR_VAR_1} is trying to learn\n{STR_VAR_2}.\pBut {STR_VAR_1} can’t learn more\nthan four moves.\pDelete an older move to make\nroom for {STR_VAR_2}?"); +const u8 gText_StopTryingToTeachMove[] = _("Stop trying to teach\n{STR_VAR_2}?"); +const u8 gText_12AndPoof[] = _("{PAUSE 32}1, {PAUSE 15}2, and {PAUSE 15}… {PAUSE 15}… {PAUSE 15}… {PAUSE 15}{PLAY_SE 0x0038}Poof!\p"); +const u8 gText_PkmnForgotMoveAndLearnedNew[] = _("{STR_VAR_1} forgot {STR_VAR_3}.\pAnd…\p{STR_VAR_1} learned {STR_VAR_2}."); +const u8 gUnknown_085EF9C8[] = _("{STR_VAR_1} did not learn the\nmove {STR_VAR_2}."); +const u8 gText_GiveUpTeachingNewMove[] = _("Give up trying to teach a new\nmove to {STR_VAR_1}?"); +const u8 gText_WhichMoveToForget2[] = _("Which move should be\nforgotten?\p"); +const u8 gText_BattleMoves2[] = _("BATTLE MOVES"); +const u8 gText_ContestMoves2[] = _("CONTEST MOVES"); +const u8 gUnknown_085EFA4C[] = _("TYPE/"); +const u8 gText_PPSlash[] = _("PP/"); +const u8 gText_PowerSlash[] = _("POWER/"); +const u8 gText_AccuracySlash[] = _("ACCURACY/"); +const u8 gText_Appeal2[] = _("APPEAL"); +const u8 gText_Jam2[] = _("JAM"); +const u8 gText_Kira[] = _("KIRA"); +const u8 gText_Amy[] = _("AMY"); +const u8 gText_John[] = _("JOHN"); +const u8 gText_Roy[] = _("ROY"); +const u8 gText_Gabby[] = _("GABBY"); +const u8 gText_Anna[] = _("ANNA"); +const u8 gText_ClearAllSaveData[] = _("Clear all save data areas?"); +const u8 gText_ClearingData[] = _("Clearing data…\nPlease wait."); +const u8 gText_IsThisTheCorrectTime[] = _("Is this the correct time?"); +const u8 gText_Confirm3[] = _("CONFIRM"); +const u8 gText_Cancel4[] = _("CANCEL"); +const u8 gMrStoneMatchCallDesc[] = _("DEVON PRES"); +const u8 gMrStoneMatchCallName[] = _("MR. STONE"); +const u8 gStevenMatchCallDesc[] = _("HARD AS ROCK"); +const u8 gStevenMatchCallName[] = _("STEVEN"); +const u8 gMayBrendanMatchCallDesc[] = _("RAD NEIGHBOR"); +const u8 gNormanMatchCallDesc[] = _("RELIABLE ONE"); +const u8 gMomMatchCallDesc[] = _("CALM & KIND"); +const u8 gWallyMatchCallDesc[] = _("{PKMN} LOVER"); +const u8 gNormanMatchCallName[] = _("DAD"); +const u8 gMomMatchCallName[] = _("MOM"); +const u8 gScottMatchCallDesc[] = _("ELUSIVE EYES"); +const u8 gScottMatchCallName[] = _("SCOTT"); +const u8 gRoxanneMatchCallDesc[] = _("ROCKIN’ WHIZ"); +const u8 gBrawlyMatchCallDesc[] = _("THE BIG HIT"); +const u8 gWattsonMatchCallDesc[] = _("SWELL SHOCK"); +const u8 gFlanneryMatchCallDesc[] = _("PASSION BURN"); +const u8 gWinonaMatchCallDesc[] = _("SKY TAMER"); +const u8 gTateLizaMatchCallDesc[] = _("MYSTIC DUO"); +const u8 gJuanMatchCallDesc[] = _("DANDY CHARM"); +const u8 gEliteFourMatchCallDesc[] = _("ELITE FOUR"); +const u8 gChampionMatchCallDesc[] = _("CHAMPION"); +const u8 gProfBirchMatchCallDesc[] = _("{PKMN} PROF."); +const u8 gText_CommStandbyAwaitingOtherPlayer[] = _("Communication standby…\nAwaiting another player to choose."); +const u8 gText_BattleWasRefused[] = _("The battle was refused.{PAUSE 60}"); +const u8 gText_RefusedBattle[] = _("Refused the battle.{PAUSE 60}"); +const u8 gUnknown_085EFC3E[] = _("NO WEATHER"); +const u8 gUnknown_085EFC49[] = _("SUNNY"); +const u8 gUnknown_085EFC4F[] = _("SUNNY2"); +const u8 gUnknown_085EFC56[] = _("RAIN"); +const u8 gUnknown_085EFC5B[] = _("SNOW"); +const u8 gUnknown_085EFC60[] = _("LIGHTNING"); +const u8 gUnknown_085EFC6A[] = _("FOG"); +const u8 gUnknown_085EFC6E[] = _("VOLCANO ASH"); +const u8 gUnknown_085EFC7A[] = _("SANDSTORM"); +const u8 gUnknown_085EFC84[] = _("FOG2"); +const u8 gUnknown_085EFC89[] = _("SEAFLOOR"); +const u8 gUnknown_085EFC92[] = _("CLOUDY"); +const u8 gUnknown_085EFC99[] = _("SUNNY3"); +const u8 gUnknown_085EFCA0[] = _("HEAVY RAIN"); +const u8 gUnknown_085EFCAB[] = _("SEAFLOOR2"); +const u8 gText_DelAll[] = _("DEL. ALL"); +const u8 gText_Cancel5[] = _("CANCEL"); +const u8 gText_Ok2[] = _("OK"); +const u8 gText_Quiz[] = _("QUIZ"); +const u8 gText_Answer[] = _("ANSWER"); +const u8 gText_PokeBalls[] = _("POKé BALLS"); +const u8 gText_Berry[] = _("BERRY"); +const u8 gText_Berries[] = _("BERRIES"); diff --git a/src/text.c b/src/text.c index eacfd2a1f..ed70f767b 100644 --- a/src/text.c +++ b/src/text.c @@ -13,7 +13,7 @@ extern u8 GetKeypadIconWidth(u8 keypadIconId); extern u16 Font6Func(struct TextPrinter *textPrinter); extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese); -extern u8* UnkTextUtil_GetPtrI(u8 a1); +extern u8* DynamicPlaceholderTextUtil_GetPlaceholderPtr(u8 a1); extern int sub_8197964(); EWRAM_DATA struct TextPrinter gTempTextPrinter = {0}; @@ -375,7 +375,7 @@ void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor) *(current++) = (shadowColor << 12) | (shadowColor << 8) | (shadowColor << 4) | shadowColor; } #else -ASM_DIRECT +NAKED void GenerateFontHalfRowLookupTable(u8 fgColor, u8 bgColor, u8 shadowColor) { asm("push {r4-r7,lr}\n\ @@ -871,7 +871,7 @@ void DecompressGlyphTile(const u16 *src, u16 *dest) *(dest) = (gFontHalfRowLookupTable[gFontHalfRowOffsets[src[1] & 0xFF]] << 16) | gFontHalfRowLookupTable[gFontHalfRowOffsets[src[1] >> 8]]; } #else -ASM_DIRECT +NAKED void DecompressGlyphTile(const u16 *src, u16 *dest) { asm("push {r4-r7,lr}\n\ @@ -1052,7 +1052,7 @@ u8 GetLastTextColor(u8 colorType) } } -ASM_DIRECT +NAKED void CopyGlyphToWindow(struct TextPrinter *x) { asm("push {r4-r7,lr}\n\ @@ -2341,7 +2341,7 @@ u16 RenderText(struct TextPrinter *textPrinter) return 1; } #else -__attribute__((naked)) +NAKED u16 RenderText(struct TextPrinter *textPrinter) { asm("push {r4-r6,lr}\n\ @@ -3157,7 +3157,7 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing) width = lineWidths[strPos]; } - return (u8)(GetFontAttribute(fontId, 0) + letterSpacing) * width; + return (u8)(GetFontAttribute(fontId, FONTATTR_MAX_LETTER_WIDTH) + letterSpacing) * width; } u32 (*GetFontWidthFunc(u8 glyphId))(u16, bool32) @@ -3193,7 +3193,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) return 0; if (letterSpacing == -1) - localLetterSpacing = GetFontAttribute(fontId, 2); + localLetterSpacing = GetFontAttribute(fontId, FONTATTR_LETTER_SPACING); else localLetterSpacing = letterSpacing; @@ -3227,7 +3227,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) } case 0xF7: if (bufferPointer == NULL) - bufferPointer = UnkTextUtil_GetPtrI(*++str); + bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str); while (*bufferPointer != 0xFF) { glyphWidth = func(*bufferPointer++, isJapanese); @@ -3269,7 +3269,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing) if (func == NULL) return 0; if (letterSpacing == -1) - localLetterSpacing = GetFontAttribute(*str, 2); + localLetterSpacing = GetFontAttribute(*str, FONTATTR_LETTER_SPACING); break; case 0x11: glyphWidth = *++str; @@ -3497,28 +3497,28 @@ u8 GetFontAttribute(u8 fontId, u8 attributeId) int result = 0; switch (attributeId) { - case 0: + case FONTATTR_MAX_LETTER_WIDTH: result = gFontInfos[fontId].maxLetterWidth; break; - case 1: + case FONTATTR_MAX_LETTER_HEIGHT: result = gFontInfos[fontId].maxLetterHeight; break; - case 2: + case FONTATTR_LETTER_SPACING: result = gFontInfos[fontId].letterSpacing; break; - case 3: + case FONTATTR_LINE_SPACING: result = gFontInfos[fontId].lineSpacing; break; - case 4: + case FONTATTR_COLOR_LOWNIBBLE: result = gFontInfos[fontId].fontColor_l; break; - case 5: + case FONTATTR_COLOR_FOREGROUND: result = gFontInfos[fontId].fgColor; break; - case 6: + case FONTATTR_COLOR_BACKGROUND: result = gFontInfos[fontId].bgColor; break; - case 7: + case FONTATTR_COLOR_SHADOW: result = gFontInfos[fontId].shadowColor; break; } diff --git a/src/text_window.c b/src/text_window.c index 33cd7cffe..e7e8f0ca6 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -7,26 +7,26 @@ #include "graphics.h" // const rom data -const u32 gTextWindowFrame1_Gfx[] = INCBIN_U32("graphics/text_window/1.4bpp"); -static const u32 sTextWindowFrame2_Gfx[] = INCBIN_U32("graphics/text_window/2.4bpp"); -static const u32 sTextWindowFrame3_Gfx[] = INCBIN_U32("graphics/text_window/3.4bpp"); -static const u32 sTextWindowFrame4_Gfx[] = INCBIN_U32("graphics/text_window/4.4bpp"); -static const u32 sTextWindowFrame5_Gfx[] = INCBIN_U32("graphics/text_window/5.4bpp"); -static const u32 sTextWindowFrame6_Gfx[] = INCBIN_U32("graphics/text_window/6.4bpp"); -static const u32 sTextWindowFrame7_Gfx[] = INCBIN_U32("graphics/text_window/7.4bpp"); -static const u32 sTextWindowFrame8_Gfx[] = INCBIN_U32("graphics/text_window/8.4bpp"); -static const u32 sTextWindowFrame9_Gfx[] = INCBIN_U32("graphics/text_window/9.4bpp"); -static const u32 sTextWindowFrame10_Gfx[] = INCBIN_U32("graphics/text_window/10.4bpp"); -static const u32 sTextWindowFrame11_Gfx[] = INCBIN_U32("graphics/text_window/11.4bpp"); -static const u32 sTextWindowFrame12_Gfx[] = INCBIN_U32("graphics/text_window/12.4bpp"); -static const u32 sTextWindowFrame13_Gfx[] = INCBIN_U32("graphics/text_window/13.4bpp"); -static const u32 sTextWindowFrame14_Gfx[] = INCBIN_U32("graphics/text_window/14.4bpp"); -static const u32 sTextWindowFrame15_Gfx[] = INCBIN_U32("graphics/text_window/15.4bpp"); -static const u32 sTextWindowFrame16_Gfx[] = INCBIN_U32("graphics/text_window/16.4bpp"); -static const u32 sTextWindowFrame17_Gfx[] = INCBIN_U32("graphics/text_window/17.4bpp"); -static const u32 sTextWindowFrame18_Gfx[] = INCBIN_U32("graphics/text_window/18.4bpp"); -static const u32 sTextWindowFrame19_Gfx[] = INCBIN_U32("graphics/text_window/19.4bpp"); -static const u32 sTextWindowFrame20_Gfx[] = INCBIN_U32("graphics/text_window/20.4bpp"); +const u8 gTextWindowFrame1_Gfx[] = INCBIN_U8("graphics/text_window/1.4bpp"); +static const u8 sTextWindowFrame2_Gfx[] = INCBIN_U8("graphics/text_window/2.4bpp"); +static const u8 sTextWindowFrame3_Gfx[] = INCBIN_U8("graphics/text_window/3.4bpp"); +static const u8 sTextWindowFrame4_Gfx[] = INCBIN_U8("graphics/text_window/4.4bpp"); +static const u8 sTextWindowFrame5_Gfx[] = INCBIN_U8("graphics/text_window/5.4bpp"); +static const u8 sTextWindowFrame6_Gfx[] = INCBIN_U8("graphics/text_window/6.4bpp"); +static const u8 sTextWindowFrame7_Gfx[] = INCBIN_U8("graphics/text_window/7.4bpp"); +static const u8 sTextWindowFrame8_Gfx[] = INCBIN_U8("graphics/text_window/8.4bpp"); +static const u8 sTextWindowFrame9_Gfx[] = INCBIN_U8("graphics/text_window/9.4bpp"); +static const u8 sTextWindowFrame10_Gfx[] = INCBIN_U8("graphics/text_window/10.4bpp"); +static const u8 sTextWindowFrame11_Gfx[] = INCBIN_U8("graphics/text_window/11.4bpp"); +static const u8 sTextWindowFrame12_Gfx[] = INCBIN_U8("graphics/text_window/12.4bpp"); +static const u8 sTextWindowFrame13_Gfx[] = INCBIN_U8("graphics/text_window/13.4bpp"); +static const u8 sTextWindowFrame14_Gfx[] = INCBIN_U8("graphics/text_window/14.4bpp"); +static const u8 sTextWindowFrame15_Gfx[] = INCBIN_U8("graphics/text_window/15.4bpp"); +static const u8 sTextWindowFrame16_Gfx[] = INCBIN_U8("graphics/text_window/16.4bpp"); +static const u8 sTextWindowFrame17_Gfx[] = INCBIN_U8("graphics/text_window/17.4bpp"); +static const u8 sTextWindowFrame18_Gfx[] = INCBIN_U8("graphics/text_window/18.4bpp"); +static const u8 sTextWindowFrame19_Gfx[] = INCBIN_U8("graphics/text_window/19.4bpp"); +static const u8 sTextWindowFrame20_Gfx[] = INCBIN_U8("graphics/text_window/20.4bpp"); const u16 gTextWindowFrame1_Pal[] = INCBIN_U16("graphics/text_window/1.gbapal"); static const u16 sTextWindowFrame2_Pal[] = INCBIN_U16("graphics/text_window/2.gbapal"); @@ -91,26 +91,26 @@ const struct TilesPal *GetWindowFrameTilesPal(u8 id) return &sWindowFrames[id]; } -void copy_textbox_border_tile_patterns_to_vram(u8 windowId, u16 destOffset, u8 palOffset) +void LoadMessageBoxGfx(u8 windowId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_PRIORITY), gMessageBox_Gfx, 0x1C0, destOffset); LoadPalette(GetOverworldTextboxPalettePtr(), palOffset, 0x20); } -void box_border_load_tiles_and_pal(u8 windowId, u16 destOffset, u8 palOffset) +void LoadUserWindowBorderGfx_(u8 windowId, u16 destOffset, u8 palOffset) { - sub_809882C(windowId, destOffset, palOffset); + LoadUserWindowBorderGfx(windowId, destOffset, palOffset); } -void sub_80987D4(u8 windowId, u8 frameId, u16 destOffset, u8 palOffset) +void LoadWindowGfx(u8 windowId, u8 frameId, u16 destOffset, u8 palOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_PRIORITY), sWindowFrames[frameId].tiles, 0x120, destOffset); LoadPalette(sWindowFrames[frameId].pal, palOffset, 0x20); } -void sub_809882C(u8 windowId, u16 destOffset, u8 palOffset) +void LoadUserWindowBorderGfx(u8 windowId, u16 destOffset, u8 palOffset) { - sub_80987D4(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset); + LoadWindowGfx(windowId, gSaveBlock2Ptr->optionsWindowFrameType, destOffset, palOffset); } void sub_8098858(u8 windowId, u16 tileNum, u8 palNum) diff --git a/src/tileset_anims.c b/src/tileset_anims.c index f89cfdd2b..d05931dba 100644 --- a/src/tileset_anims.c +++ b/src/tileset_anims.c @@ -33,192 +33,192 @@ static void cur_mapheader_run_tileset2_func(void); // .rodata -const u16 gUnknown_085105C4[] = INCBIN_U16("data/tilesets/primary/general/anim/0/1.4bpp"); +const u16 gTilesetAnims_General0_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/0/1.4bpp"); -const u16 gUnknown_08510644[] = INCBIN_U16("data/tilesets/primary/general/anim/0/0.4bpp"); +const u16 gTilesetAnims_General0_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/0/0.4bpp"); -const u16 gUnknown_085106C4[] = INCBIN_U16("data/tilesets/primary/general/anim/0/2.4bpp"); +const u16 gTilesetAnims_General0_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/0/2.4bpp"); const u16 tileset_anims_space_0[16] = {}; const u16 *const gTilesetAnims_General0[] = { - gUnknown_08510644, - gUnknown_085105C4, - gUnknown_08510644, - gUnknown_085106C4 + gTilesetAnims_General0_Frame0, + gTilesetAnims_General0_Frame1, + gTilesetAnims_General0_Frame0, + gTilesetAnims_General0_Frame2 }; -const u16 gUnknown_08510774[] = INCBIN_U16("data/tilesets/primary/general/anim/1/0.4bpp"); +const u16 gTilesetAnims_General1_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/1/0.4bpp"); -const u16 gUnknown_08510B34[] = INCBIN_U16("data/tilesets/primary/general/anim/1/1.4bpp"); +const u16 gTilesetAnims_General1_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/1/1.4bpp"); -const u16 gUnknown_08510EF4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/2.4bpp"); +const u16 gTilesetAnims_General1_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/1/2.4bpp"); -const u16 gUnknown_085112B4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/3.4bpp"); +const u16 gTilesetAnims_General1_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/1/3.4bpp"); -const u16 gUnknown_08511674[] = INCBIN_U16("data/tilesets/primary/general/anim/1/4.4bpp"); +const u16 gTilesetAnims_General1_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/4.4bpp"); -const u16 gUnknown_08511A34[] = INCBIN_U16("data/tilesets/primary/general/anim/1/5.4bpp"); +const u16 gTilesetAnims_General1_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/1/5.4bpp"); -const u16 gUnknown_08511DF4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/6.4bpp"); +const u16 gTilesetAnims_General1_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/1/6.4bpp"); -const u16 gUnknown_085121B4[] = INCBIN_U16("data/tilesets/primary/general/anim/1/7.4bpp"); +const u16 gTilesetAnims_General1_Frame7[] = INCBIN_U16("data/tilesets/primary/general/anim/1/7.4bpp"); const u16 *const gTilesetAnims_General1[] = { - gUnknown_08510774, - gUnknown_08510B34, - gUnknown_08510EF4, - gUnknown_085112B4, - gUnknown_08511674, - gUnknown_08511A34, - gUnknown_08511DF4, - gUnknown_085121B4 + gTilesetAnims_General1_Frame0, + gTilesetAnims_General1_Frame1, + gTilesetAnims_General1_Frame2, + gTilesetAnims_General1_Frame3, + gTilesetAnims_General1_Frame4, + gTilesetAnims_General1_Frame5, + gTilesetAnims_General1_Frame6, + gTilesetAnims_General1_Frame7 }; -const u16 gUnknown_08512594[] = INCBIN_U16("data/tilesets/primary/general/anim/2/0.4bpp"); +const u16 gTilesetAnims_General2_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/2/0.4bpp"); -const u16 gUnknown_085126D4[] = INCBIN_U16("data/tilesets/primary/general/anim/2/1.4bpp"); +const u16 gTilesetAnims_General2_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/2/1.4bpp"); -const u16 gUnknown_08512814[] = INCBIN_U16("data/tilesets/primary/general/anim/2/2.4bpp"); +const u16 gTilesetAnims_General2_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/2/2.4bpp"); -const u16 gUnknown_08512954[] = INCBIN_U16("data/tilesets/primary/general/anim/2/3.4bpp"); +const u16 gTilesetAnims_General2_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/2/3.4bpp"); -const u16 gUnknown_08512A94[] = INCBIN_U16("data/tilesets/primary/general/anim/2/4.4bpp"); +const u16 gTilesetAnims_General2_Frame4[] = INCBIN_U16("data/tilesets/primary/general/anim/2/4.4bpp"); -const u16 gUnknown_08512BD4[] = INCBIN_U16("data/tilesets/primary/general/anim/2/5.4bpp"); +const u16 gTilesetAnims_General2_Frame5[] = INCBIN_U16("data/tilesets/primary/general/anim/2/5.4bpp"); -const u16 gUnknown_08512D14[] = INCBIN_U16("data/tilesets/primary/general/anim/2/6.4bpp"); +const u16 gTilesetAnims_General2_Frame6[] = INCBIN_U16("data/tilesets/primary/general/anim/2/6.4bpp"); const u16 *const gTilesetAnims_General2[] = { - gUnknown_08512594, - gUnknown_085126D4, - gUnknown_08512814, - gUnknown_08512954, - gUnknown_08512A94, - gUnknown_08512BD4, - gUnknown_08512D14, - gUnknown_08512594 + gTilesetAnims_General2_Frame0, + gTilesetAnims_General2_Frame1, + gTilesetAnims_General2_Frame2, + gTilesetAnims_General2_Frame3, + gTilesetAnims_General2_Frame4, + gTilesetAnims_General2_Frame5, + gTilesetAnims_General2_Frame6, + gTilesetAnims_General2_Frame0 }; -const u16 gUnknown_08512E74[] = INCBIN_U16("data/tilesets/primary/general/anim/3/0.4bpp"); +const u16 gTilesetAnims_General3_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/3/0.4bpp"); -const u16 gUnknown_08512F34[] = INCBIN_U16("data/tilesets/primary/general/anim/3/1.4bpp"); +const u16 gTilesetAnims_General3_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/3/1.4bpp"); -const u16 gUnknown_08512FF4[] = INCBIN_U16("data/tilesets/primary/general/anim/3/2.4bpp"); +const u16 gTilesetAnims_General3_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/3/2.4bpp"); -const u16 gUnknown_085130B4[] = INCBIN_U16("data/tilesets/primary/general/anim/3/3.4bpp"); +const u16 gTilesetAnims_General3_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/3/3.4bpp"); const u16 *const gTilesetAnims_General3[] = { - gUnknown_08512E74, - gUnknown_08512F34, - gUnknown_08512FF4, - gUnknown_085130B4 + gTilesetAnims_General3_Frame0, + gTilesetAnims_General3_Frame1, + gTilesetAnims_General3_Frame2, + gTilesetAnims_General3_Frame3 }; -const u16 gUnknown_08513184[] = INCBIN_U16("data/tilesets/primary/general/anim/4/0.4bpp"); +const u16 gTilesetAnims_General4_Frame0[] = INCBIN_U16("data/tilesets/primary/general/anim/4/0.4bpp"); -const u16 gUnknown_085132C4[] = INCBIN_U16("data/tilesets/primary/general/anim/4/1.4bpp"); +const u16 gTilesetAnims_General4_Frame1[] = INCBIN_U16("data/tilesets/primary/general/anim/4/1.4bpp"); -const u16 gUnknown_08513404[] = INCBIN_U16("data/tilesets/primary/general/anim/4/2.4bpp"); +const u16 gTilesetAnims_General4_Frame2[] = INCBIN_U16("data/tilesets/primary/general/anim/4/2.4bpp"); -const u16 gUnknown_08513544[] = INCBIN_U16("data/tilesets/primary/general/anim/4/3.4bpp"); +const u16 gTilesetAnims_General4_Frame3[] = INCBIN_U16("data/tilesets/primary/general/anim/4/3.4bpp"); const u16 *const gTilesetAnims_General4[] = { - gUnknown_08513184, - gUnknown_085132C4, - gUnknown_08513404, - gUnknown_08513544 + gTilesetAnims_General4_Frame0, + gTilesetAnims_General4_Frame1, + gTilesetAnims_General4_Frame2, + gTilesetAnims_General4_Frame3 }; -const u16 gUnknown_08513694[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/0.4bpp"); +const u16 gTilesetAnims_Lavaridge0_Frame0[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/0.4bpp"); -const u16 gUnknown_08513714[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/1.4bpp"); +const u16 gTilesetAnims_Lavaridge0_Frame1[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/1.4bpp"); -const u16 gUnknown_08513794[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/2.4bpp"); +const u16 gTilesetAnims_Lavaridge0_Frame2[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/2.4bpp"); -const u16 gUnknown_08513814[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/3.4bpp"); +const u16 gTilesetAnims_Lavaridge0_Frame3[] = INCBIN_U16("data/tilesets/secondary/lavaridge/anim/3.4bpp"); const u16 *const gTilesetAnims_Lavaridge0[] = { - gUnknown_08513694, - gUnknown_08513714, - gUnknown_08513794, - gUnknown_08513814 + gTilesetAnims_Lavaridge0_Frame0, + gTilesetAnims_Lavaridge0_Frame1, + gTilesetAnims_Lavaridge0_Frame2, + gTilesetAnims_Lavaridge0_Frame3 }; -const u16 gUnknown_085138A4[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp"); +const u16 gTilesetAnims_Pacifidlog0_Frame0[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/0.4bpp"); -const u16 gUnknown_08513C64[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp"); +const u16 gTilesetAnims_Pacifidlog0_Frame1[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/1.4bpp"); -const u16 gUnknown_08514024[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp"); +const u16 gTilesetAnims_Pacifidlog0_Frame2[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/0/2.4bpp"); const u16 *const gTilesetAnims_Pacifidlog0[] = { - gUnknown_085138A4, - gUnknown_08513C64, - gUnknown_08514024, - gUnknown_08513C64 + gTilesetAnims_Pacifidlog0_Frame0, + gTilesetAnims_Pacifidlog0_Frame1, + gTilesetAnims_Pacifidlog0_Frame2, + gTilesetAnims_Pacifidlog0_Frame1 }; -const u16 gUnknown_085143F4[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/0.4bpp"); +const u16 gTilesetAnims_Underwater0_Frame0[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/0.4bpp"); -const u16 gUnknown_08514474[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/1.4bpp"); +const u16 gTilesetAnims_Underwater0_Frame1[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/1.4bpp"); -const u16 gUnknown_085144F4[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/2.4bpp"); +const u16 gTilesetAnims_Underwater0_Frame2[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/2.4bpp"); -const u16 gUnknown_08514574[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/3.4bpp"); +const u16 gTilesetAnims_Underwater0_Frame3[] = INCBIN_U16("data/tilesets/secondary/underwater/anim/3.4bpp"); const u16 *const gTilesetAnims_Underwater0[] = { - gUnknown_085143F4, - gUnknown_08514474, - gUnknown_085144F4, - gUnknown_08514574 + gTilesetAnims_Underwater0_Frame0, + gTilesetAnims_Underwater0_Frame1, + gTilesetAnims_Underwater0_Frame2, + gTilesetAnims_Underwater0_Frame3 }; -const u16 gUnknown_08514604[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame0[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/0.4bpp"); -const u16 gUnknown_08514704[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame1[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/1.4bpp"); -const u16 gUnknown_08514804[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame2[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/2.4bpp"); -const u16 gUnknown_08514904[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame3[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/3.4bpp"); -const u16 gUnknown_08514A04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame4[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/4.4bpp"); -const u16 gUnknown_08514B04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame5[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/5.4bpp"); -const u16 gUnknown_08514C04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame6[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/6.4bpp"); -const u16 gUnknown_08514D04[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp"); +const u16 gTilesetAnims_Pacifidlog1_Frame7[] = INCBIN_U16("data/tilesets/secondary/pacifidlog/anim/1/7.4bpp"); const u16 *const gTilesetAnims_Pacifidlog1[] = { - gUnknown_08514604, - gUnknown_08514704, - gUnknown_08514804, - gUnknown_08514904, - gUnknown_08514A04, - gUnknown_08514B04, - gUnknown_08514C04, - gUnknown_08514D04 + gTilesetAnims_Pacifidlog1_Frame0, + gTilesetAnims_Pacifidlog1_Frame1, + gTilesetAnims_Pacifidlog1_Frame2, + gTilesetAnims_Pacifidlog1_Frame3, + gTilesetAnims_Pacifidlog1_Frame4, + gTilesetAnims_Pacifidlog1_Frame5, + gTilesetAnims_Pacifidlog1_Frame6, + gTilesetAnims_Pacifidlog1_Frame7 }; -const u16 gUnknown_08514E24[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/0.4bpp"); +const u16 gTilesetAnims_Mauville0a_Frame0[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/0.4bpp"); -const u16 gUnknown_08514EA4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/1.4bpp"); +const u16 gTilesetAnims_Mauville0a_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/1.4bpp"); -const u16 gUnknown_08514F24[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/2.4bpp"); +const u16 gTilesetAnims_Mauville0a_Frame2[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/2.4bpp"); -const u16 gUnknown_08514FA4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/3.4bpp"); +const u16 gTilesetAnims_Mauville0a_Frame3[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/a/3.4bpp"); -const u16 gUnknown_08515024[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/a/1.4bpp"); +const u16 gTilesetAnims_Mauville1a_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/a/1.4bpp"); -const u16 gUnknown_085150A4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/0.4bpp"); +const u16 gTilesetAnims_Mauville0b_Frame0[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/0.4bpp"); -const u16 gUnknown_08515124[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/1.4bpp"); +const u16 gTilesetAnims_Mauville0b_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/1.4bpp"); -const u16 gUnknown_085151A4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/2.4bpp"); +const u16 gTilesetAnims_Mauville0b_Frame2[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/2.4bpp"); -const u16 gUnknown_08515224[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/3.4bpp"); +const u16 gTilesetAnims_Mauville0b_Frame3[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/0/b/3.4bpp"); -const u16 gUnknown_085152A4[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/b/1.4bpp"); +const u16 gTilesetAnims_Mauville1b_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville/anim/1/b/1.4bpp"); const u16 tileset_anims_space_1[16] = {}; @@ -245,64 +245,64 @@ u16 *const gTilesetAnims_MauvilleVDests1[] = { }; const u16 *const gTilesetAnims_Mauville0a[] = { - gUnknown_08514E24, - gUnknown_08514E24, - gUnknown_08514EA4, - gUnknown_08514F24, - gUnknown_08514FA4, - gUnknown_08514FA4, - gUnknown_08514FA4, - gUnknown_08514FA4, - gUnknown_08514FA4, - gUnknown_08514FA4, - gUnknown_08514F24, - gUnknown_08514EA4 + gTilesetAnims_Mauville0a_Frame0, + gTilesetAnims_Mauville0a_Frame0, + gTilesetAnims_Mauville0a_Frame1, + gTilesetAnims_Mauville0a_Frame2, + gTilesetAnims_Mauville0a_Frame3, + gTilesetAnims_Mauville0a_Frame3, + gTilesetAnims_Mauville0a_Frame3, + gTilesetAnims_Mauville0a_Frame3, + gTilesetAnims_Mauville0a_Frame3, + gTilesetAnims_Mauville0a_Frame3, + gTilesetAnims_Mauville0a_Frame2, + gTilesetAnims_Mauville0a_Frame1 }; const u16 *const gTilesetAnims_Mauville0b[] = { - gUnknown_085150A4, - gUnknown_085150A4, - gUnknown_08515124, - gUnknown_085151A4, - gUnknown_08515224, - gUnknown_08515224, - gUnknown_08515224, - gUnknown_08515224, - gUnknown_08515224, - gUnknown_08515224, - gUnknown_085151A4, - gUnknown_08515124 + gTilesetAnims_Mauville0b_Frame0, + gTilesetAnims_Mauville0b_Frame0, + gTilesetAnims_Mauville0b_Frame1, + gTilesetAnims_Mauville0b_Frame2, + gTilesetAnims_Mauville0b_Frame3, + gTilesetAnims_Mauville0b_Frame3, + gTilesetAnims_Mauville0b_Frame3, + gTilesetAnims_Mauville0b_Frame3, + gTilesetAnims_Mauville0b_Frame3, + gTilesetAnims_Mauville0b_Frame3, + gTilesetAnims_Mauville0b_Frame2, + gTilesetAnims_Mauville0b_Frame1 }; const u16 *const gTilesetAnims_Mauville1a[] = { - gUnknown_08514E24, - gUnknown_08514E24, - gUnknown_08515024, - gUnknown_08515024 + gTilesetAnims_Mauville0a_Frame0, + gTilesetAnims_Mauville0a_Frame0, + gTilesetAnims_Mauville1a_Frame1, + gTilesetAnims_Mauville1a_Frame1 }; const u16 *const gTilesetAnims_Mauville1b[] = { - gUnknown_085150A4, - gUnknown_085150A4, - gUnknown_085152A4, - gUnknown_085152A4 + gTilesetAnims_Mauville0b_Frame0, + gTilesetAnims_Mauville0b_Frame0, + gTilesetAnims_Mauville1b_Frame1, + gTilesetAnims_Mauville1b_Frame1 }; -const u16 gUnknown_08515404[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/0.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame0[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/0.4bpp"); -const u16 gUnknown_08515484[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/1.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame1[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/1.4bpp"); -const u16 gUnknown_08515504[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/2.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame2[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/2.4bpp"); -const u16 gUnknown_08515584[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/3.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame3[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/3.4bpp"); -const u16 gUnknown_08515604[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/4.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame4[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/4.4bpp"); -const u16 gUnknown_08515684[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/5.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame5[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/5.4bpp"); -const u16 gUnknown_08515704[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/6.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame6[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/6.4bpp"); -const u16 gUnknown_08515784[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/7.4bpp"); +const u16 gTilesetAnims_Rustboro0_Frame7[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/0/7.4bpp"); u16 *const gTilesetAnims_RustboroVDests0[] = { (u16 *)(BG_VRAM + 0x5000), @@ -316,67 +316,67 @@ u16 *const gTilesetAnims_RustboroVDests0[] = { }; const u16 *const gTilesetAnims_Rustboro0[] = { - gUnknown_08515404, - gUnknown_08515484, - gUnknown_08515504, - gUnknown_08515584, - gUnknown_08515604, - gUnknown_08515684, - gUnknown_08515704, - gUnknown_08515784 + gTilesetAnims_Rustboro0_Frame0, + gTilesetAnims_Rustboro0_Frame1, + gTilesetAnims_Rustboro0_Frame2, + gTilesetAnims_Rustboro0_Frame3, + gTilesetAnims_Rustboro0_Frame4, + gTilesetAnims_Rustboro0_Frame5, + gTilesetAnims_Rustboro0_Frame6, + gTilesetAnims_Rustboro0_Frame7 }; -const u16 gUnknown_08515844[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/0.4bpp"); +const u16 gTilesetAnims_Rustboro1_Frame0[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/0.4bpp"); -const u16 gUnknown_085158C4[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/1.4bpp"); +const u16 gTilesetAnims_Rustboro1_Frame1[] = INCBIN_U16("data/tilesets/secondary/rustboro/anim/1/1.4bpp"); const u16 tileset_anims_space_2[16] = {}; const u16 *const gTilesetAnims_Rustboro1[] = { - gUnknown_08515844, - gUnknown_085158C4 + gTilesetAnims_Rustboro1_Frame0, + gTilesetAnims_Rustboro1_Frame1 }; -const u16 gUnknown_0851596C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/0.4bpp"); +const u16 gTilesetAnims_Lavaridge1_Cave0_Frame0[] = INCBIN_U16("data/tilesets/secondary/cave/anim/0.4bpp"); -const u16 gUnknown_085159EC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/1.4bpp"); +const u16 gTilesetAnims_Lavaridge1_Cave0_Frame1[] = INCBIN_U16("data/tilesets/secondary/cave/anim/1.4bpp"); -const u16 gUnknown_08515A6C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/2.4bpp"); +const u16 gTilesetAnims_Lavaridge1_Cave0_Frame2[] = INCBIN_U16("data/tilesets/secondary/cave/anim/2.4bpp"); -const u16 gUnknown_08515AEC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/3.4bpp"); +const u16 gTilesetAnims_Lavaridge1_Cave0_Frame3[] = INCBIN_U16("data/tilesets/secondary/cave/anim/3.4bpp"); -const u16 gUnknown_08515B6C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/0.4bpp"); +const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame0[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/0.4bpp"); -const u16 gUnknown_08515BEC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/1.4bpp"); +const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame1[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/1.4bpp"); -const u16 gUnknown_08515C6C[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/2.4bpp"); +const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame2[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/2.4bpp"); -const u16 gUnknown_08515CEC[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/3.4bpp"); +const u16 gTilesetAnims_Lavaridge1_CaveUnused_Frame3[] = INCBIN_U16("data/tilesets/secondary/cave/anim/unused/3.4bpp"); const u16 tileset_anims_space_3[16] = {}; const u16 *const gTilesetAnims_Lavaridge1_Cave0[] = { - gUnknown_0851596C, - gUnknown_085159EC, - gUnknown_08515A6C, - gUnknown_08515AEC + gTilesetAnims_Lavaridge1_Cave0_Frame0, + gTilesetAnims_Lavaridge1_Cave0_Frame1, + gTilesetAnims_Lavaridge1_Cave0_Frame2, + gTilesetAnims_Lavaridge1_Cave0_Frame3 }; -const u16 gUnknown_08515D9C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/0.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame0[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/0.4bpp"); -const u16 gUnknown_08515E1C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/1.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame1[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/1.4bpp"); -const u16 gUnknown_08515E9C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/2.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame2[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/2.4bpp"); -const u16 gUnknown_08515F1C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/3.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame3[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/3.4bpp"); -const u16 gUnknown_08515F9C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/4.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame4[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/4.4bpp"); -const u16 gUnknown_0851601C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/5.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame5[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/5.4bpp"); -const u16 gUnknown_0851609C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/6.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame6[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/6.4bpp"); -const u16 gUnknown_0851611C[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/7.4bpp"); +const u16 gTilesetAnims_EverGrande0_Frame7[] = INCBIN_U16("data/tilesets/secondary/ever_grande/anim/7.4bpp"); const u16 tileset_anims_space_4[16] = {}; @@ -392,238 +392,238 @@ u16 *const gTilesetAnims_EverGrandeVDests0[] = { }; const u16 *const gTilesetAnims_EverGrande0[] = { - gUnknown_08515D9C, - gUnknown_08515E1C, - gUnknown_08515E9C, - gUnknown_08515F1C, - gUnknown_08515F9C, - gUnknown_0851601C, - gUnknown_0851609C, - gUnknown_0851611C + gTilesetAnims_EverGrande0_Frame0, + gTilesetAnims_EverGrande0_Frame1, + gTilesetAnims_EverGrande0_Frame2, + gTilesetAnims_EverGrande0_Frame3, + gTilesetAnims_EverGrande0_Frame4, + gTilesetAnims_EverGrande0_Frame5, + gTilesetAnims_EverGrande0_Frame6, + gTilesetAnims_EverGrande0_Frame7 }; -const u16 gUnknown_085161FC[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/0.4bpp"); +const u16 gTilesetAnims_Dewford0_Frame0[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/0.4bpp"); -const u16 gUnknown_085162BC[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/1.4bpp"); +const u16 gTilesetAnims_Dewford0_Frame1[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/1.4bpp"); -const u16 gUnknown_0851637C[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/2.4bpp"); +const u16 gTilesetAnims_Dewford0_Frame2[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/2.4bpp"); -const u16 gUnknown_0851643C[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/3.4bpp"); +const u16 gTilesetAnims_Dewford0_Frame3[] = INCBIN_U16("data/tilesets/secondary/dewford/anim/3.4bpp"); const u16 *const gTilesetAnims_Dewford0[] = { - gUnknown_085161FC, - gUnknown_085162BC, - gUnknown_0851637C, - gUnknown_0851643C + gTilesetAnims_Dewford0_Frame0, + gTilesetAnims_Dewford0_Frame1, + gTilesetAnims_Dewford0_Frame2, + gTilesetAnims_Dewford0_Frame3 }; -const u16 gUnknown_0851650C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/0.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/0.4bpp"); -const u16 gUnknown_085165CC[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/1.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/1.4bpp"); -const u16 gUnknown_0851668C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/2.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/2.4bpp"); -const u16 gUnknown_0851674C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/3.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideWest0_Frame3[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_west/anim/3.4bpp"); const u16 *const gTilesetAnims_BattleFrontierOutsideWest0[] = { - gUnknown_0851650C, - gUnknown_085165CC, - gUnknown_0851668C, - gUnknown_0851674C + gTilesetAnims_BattleFrontierOutsideWest0_Frame0, + gTilesetAnims_BattleFrontierOutsideWest0_Frame1, + gTilesetAnims_BattleFrontierOutsideWest0_Frame2, + gTilesetAnims_BattleFrontierOutsideWest0_Frame3 }; -const u16 gUnknown_0851681C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/0.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/0.4bpp"); -const u16 gUnknown_085168DC[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/1.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/1.4bpp"); -const u16 gUnknown_0851699C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/2.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/2.4bpp"); -const u16 gUnknown_08516A5C[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/3.4bpp"); +const u16 gTilesetAnims_BattleFrontierOutsideEast0_Frame3[] = INCBIN_U16("data/tilesets/secondary/battle_frontier_outside_east/anim/3.4bpp"); const u16 *const gTilesetAnims_BattleFrontierOutsideEast0[] = { - gUnknown_0851681C, - gUnknown_085168DC, - gUnknown_0851699C, - gUnknown_08516A5C + gTilesetAnims_BattleFrontierOutsideEast0_Frame0, + gTilesetAnims_BattleFrontierOutsideEast0_Frame1, + gTilesetAnims_BattleFrontierOutsideEast0_Frame2, + gTilesetAnims_BattleFrontierOutsideEast0_Frame3 }; -const u16 gUnknown_08516B2C[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/0.4bpp"); +const u16 gTilesetAnims_Slateport0_Frame0[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/0.4bpp"); -const u16 gUnknown_08516BAC[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/1.4bpp"); +const u16 gTilesetAnims_Slateport0_Frame1[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/1.4bpp"); -const u16 gUnknown_08516C2C[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/2.4bpp"); +const u16 gTilesetAnims_Slateport0_Frame2[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/2.4bpp"); -const u16 gUnknown_08516CAC[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/3.4bpp"); +const u16 gTilesetAnims_Slateport0_Frame3[] = INCBIN_U16("data/tilesets/secondary/slateport/anim/3.4bpp"); const u16 *const gTilesetAnims_Slateport0[] = { - gUnknown_08516B2C, - gUnknown_08516BAC, - gUnknown_08516C2C, - gUnknown_08516CAC + gTilesetAnims_Slateport0_Frame0, + gTilesetAnims_Slateport0_Frame1, + gTilesetAnims_Slateport0_Frame2, + gTilesetAnims_Slateport0_Frame3 }; -const u16 gUnknown_08516D3C[] = INCBIN_U16("data/tilesets/primary/building/anim/0.4bpp"); +const u16 gTilesetAnims_InsideBuilding0_Frame0[] = INCBIN_U16("data/tilesets/primary/building/anim/0.4bpp"); -const u16 gUnknown_08516DBC[] = INCBIN_U16("data/tilesets/primary/building/anim/1.4bpp"); +const u16 gTilesetAnims_InsideBuilding0_Frame1[] = INCBIN_U16("data/tilesets/primary/building/anim/1.4bpp"); const u16 *const gTilesetAnims_InsideBuilding0[] = { - gUnknown_08516D3C, - gUnknown_08516DBC + gTilesetAnims_InsideBuilding0_Frame0, + gTilesetAnims_InsideBuilding0_Frame1 }; -const u16 gUnknown_08516E44[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp"); +const u16 gTilesetAnims_SootopolisGym0_Frame0[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/0.4bpp"); -const u16 gUnknown_08516FC4[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp"); +const u16 gTilesetAnims_SootopolisGym0_Frame1[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/1.4bpp"); -const u16 gUnknown_08517144[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp"); +const u16 gTilesetAnims_SootopolisGym0_Frame2[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/0/2.4bpp"); -const u16 gUnknown_085172C4[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp"); +const u16 gTilesetAnims_SootopolisGym1_Frame0[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/0.4bpp"); -const u16 gUnknown_08517544[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp"); +const u16 gTilesetAnims_SootopolisGym1_Frame1[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/1.4bpp"); -const u16 gUnknown_085177C4[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp"); +const u16 gTilesetAnims_SootopolisGym1_Frame2[] = INCBIN_U16("data/tilesets/secondary/sootopolis_gym/anim/1/2.4bpp"); const u16 *const gTilesetAnims_SootopolisGym0[] = { - gUnknown_08516E44, - gUnknown_08516FC4, - gUnknown_08517144 + gTilesetAnims_SootopolisGym0_Frame0, + gTilesetAnims_SootopolisGym0_Frame1, + gTilesetAnims_SootopolisGym0_Frame2 }; const u16 *const gTilesetAnims_SootopolisGym1[] = { - gUnknown_085172C4, - gUnknown_08517544, - gUnknown_085177C4 + gTilesetAnims_SootopolisGym1_Frame0, + gTilesetAnims_SootopolisGym1_Frame1, + gTilesetAnims_SootopolisGym1_Frame2 }; -const u16 gUnknown_08517A5C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/0.4bpp"); +const u16 gTilesetAnims_EliteFour0_Frame0[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/0.4bpp"); -const u16 gUnknown_08517ADC[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/1.4bpp"); +const u16 gTilesetAnims_EliteFour0_Frame1[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/1/1.4bpp"); -const u16 gUnknown_08517B5C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/0.4bpp"); +const u16 gTilesetAnims_EliteFour1_Frame0[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/0.4bpp"); -const u16 gUnknown_08517B7C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/1.4bpp"); +const u16 gTilesetAnims_EliteFour1_Frame1[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/1.4bpp"); -const u16 gUnknown_08517B9C[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/2.4bpp"); +const u16 gTilesetAnims_EliteFour1_Frame2[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/2.4bpp"); -const u16 gUnknown_08517BBC[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/3.4bpp"); +const u16 gTilesetAnims_EliteFour1_Frame3[] = INCBIN_U16("data/tilesets/secondary/elite_four/anim/0/3.4bpp"); const u16 tileset_anims_space_5[16] = {}; const u16 *const gTilesetAnims_EliteFour1[] = { - gUnknown_08517B5C, - gUnknown_08517B7C, - gUnknown_08517B9C, - gUnknown_08517BBC + gTilesetAnims_EliteFour1_Frame0, + gTilesetAnims_EliteFour1_Frame1, + gTilesetAnims_EliteFour1_Frame2, + gTilesetAnims_EliteFour1_Frame3 }; const u16 *const gTilesetAnims_EliteFour0[] = { - gUnknown_08517A5C, - gUnknown_08517ADC + gTilesetAnims_EliteFour0_Frame0, + gTilesetAnims_EliteFour0_Frame1 }; -const u16 gUnknown_08517C14[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/0.4bpp"); +const u16 gTilesetAnims_MauvilleGym0_Frame0[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/0.4bpp"); -const u16 gUnknown_08517E14[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/1.4bpp"); +const u16 gTilesetAnims_MauvilleGym0_Frame1[] = INCBIN_U16("data/tilesets/secondary/mauville_gym/anim/1.4bpp"); const u16 tileset_anims_space_6[16] = {}; const u16 *const gTilesetAnims_MauvilleGym0[] = { - gUnknown_08517C14, - gUnknown_08517E14 + gTilesetAnims_MauvilleGym0_Frame0, + gTilesetAnims_MauvilleGym0_Frame1 }; -const u16 gUnknown_0851803C[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/0.4bpp"); +const u16 gTilesetAnims_BikeShop0_Frame0[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/0.4bpp"); -const u16 gUnknown_0851815C[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/1.4bpp"); +const u16 gTilesetAnims_BikeShop0_Frame1[] = INCBIN_U16("data/tilesets/secondary/bike_shop/anim/1.4bpp"); const u16 tileset_anims_space_7[16] = {}; const u16 *const gTilesetAnims_BikeShop0[] = { - gUnknown_0851803C, - gUnknown_0851815C + gTilesetAnims_BikeShop0_Frame0, + gTilesetAnims_BikeShop0_Frame1 }; -const u16 gUnknown_085182A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/0.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame0[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/0.4bpp"); -const u16 gUnknown_08518EA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/1.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame1[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/1.4bpp"); -const u16 gUnknown_08519AA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/2.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame2[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/2.4bpp"); -const u16 gUnknown_0851A6A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/3.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame3[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/3.4bpp"); -const u16 gUnknown_0851B2A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/4.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/4.4bpp"); -const u16 gUnknown_0851BEA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/5.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame5[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/5.4bpp"); -const u16 gUnknown_0851CAA4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/6.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame6[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/6.4bpp"); -const u16 gUnknown_0851D6A4[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/7.4bpp"); +const u16 gTilesetAnims_Sootopolis0_Frame7[] = INCBIN_U16("data/tilesets/secondary/sootopolis/anim/7.4bpp"); const u16 tileset_anims_space_8[16] = {}; -const u16 gUnknown_0851E2C4[] = INCBIN_U16("data/tilesets/secondary/unused_1/0.4bpp"); +const u16 gTilesetAnims_Unused1_Frame0[] = INCBIN_U16("data/tilesets/secondary/unused_1/0.4bpp"); -const u16 gUnknown_0851EAC4[] = INCBIN_U16("data/tilesets/secondary/unused_1/1.4bpp"); +const u16 gTilesetAnims_Unused1_Frame1[] = INCBIN_U16("data/tilesets/secondary/unused_1/1.4bpp"); -const u16 gUnknown_0851F2C4[] = INCBIN_U16("data/tilesets/secondary/unused_1/2.4bpp"); +const u16 gTilesetAnims_Unused1_Frame2[] = INCBIN_U16("data/tilesets/secondary/unused_1/2.4bpp"); -const u16 gUnknown_0851FAC4[] = INCBIN_U16("data/tilesets/secondary/unused_1/3.4bpp"); +const u16 gTilesetAnims_Unused1_Frame3[] = INCBIN_U16("data/tilesets/secondary/unused_1/3.4bpp"); const u16 *const gTilesetAnims_Sootopolis0[] = { - gUnknown_085182A4, - gUnknown_08518EA4, - gUnknown_08519AA4, - gUnknown_0851A6A4, - gUnknown_0851B2A4, - gUnknown_0851BEA4, - gUnknown_0851CAA4, - gUnknown_0851D6A4 + gTilesetAnims_Sootopolis0_Frame0, + gTilesetAnims_Sootopolis0_Frame1, + gTilesetAnims_Sootopolis0_Frame2, + gTilesetAnims_Sootopolis0_Frame3, + gTilesetAnims_Sootopolis0_Frame4, + gTilesetAnims_Sootopolis0_Frame5, + gTilesetAnims_Sootopolis0_Frame6, + gTilesetAnims_Sootopolis0_Frame7 }; -const u16 gUnknown_085202E4[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/0.4bpp"); +const u16 gTilesetAnims_BattlePyramid0_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/0.4bpp"); -const u16 gUnknown_085203E4[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/1.4bpp"); +const u16 gTilesetAnims_BattlePyramid0_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/1.4bpp"); -const u16 gUnknown_085204E4[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/2.4bpp"); +const u16 gTilesetAnims_BattlePyramid0_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/0/2.4bpp"); const u16 tileset_anims_space_9[16] = {}; -const u16 gUnknown_08520604[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/0.4bpp"); +const u16 gTilesetAnims_BattlePyramid1_Frame0[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/0.4bpp"); -const u16 gUnknown_08520704[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/1.4bpp"); +const u16 gTilesetAnims_BattlePyramid1_Frame1[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/1.4bpp"); -const u16 gUnknown_08520804[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/2.4bpp"); +const u16 gTilesetAnims_BattlePyramid1_Frame2[] = INCBIN_U16("data/tilesets/secondary/battle_pyramid/anim/1/2.4bpp"); const u16 tileset_anims_space_10[7808] = {}; -const u16 gUnknown_08524604[] = INCBIN_U16("data/tilesets/secondary/unused_2/0.4bpp"); +const u16 gTilesetAnims_Unused2_Frame0[] = INCBIN_U16("data/tilesets/secondary/unused_2/0.4bpp"); const u16 tileset_anims_space_11[224] = {}; -const u16 gUnknown_08524804[] = INCBIN_U16("data/tilesets/secondary/unused_2/1.4bpp"); +const u16 gTilesetAnims_Unused2_Frame1[] = INCBIN_U16("data/tilesets/secondary/unused_2/1.4bpp"); const u16 *const gTilesetAnims_BattlePyramid0[] = { - gUnknown_085202E4, - gUnknown_085203E4, - gUnknown_085204E4 + gTilesetAnims_BattlePyramid0_Frame0, + gTilesetAnims_BattlePyramid0_Frame1, + gTilesetAnims_BattlePyramid0_Frame2 }; const u16 *const gTilesetAnims_BattlePyramid1[] = { - gUnknown_08520604, - gUnknown_08520704, - gUnknown_08520804 + gTilesetAnims_BattlePyramid1_Frame0, + gTilesetAnims_BattlePyramid1_Frame1, + gTilesetAnims_BattlePyramid1_Frame2 }; -extern const u16 gUnknown_08D85640[]; -extern const u16 gUnknown_08D85660[]; -extern const u16 gUnknown_08D85680[]; -extern const u16 gUnknown_08D856A0[]; +extern const u16 gTilesetAnims_BattleDomePals0_0[]; +extern const u16 gTilesetAnims_BattleDomePals0_1[]; +extern const u16 gTilesetAnims_BattleDomePals0_2[]; +extern const u16 gTilesetAnims_BattleDomePals0_3[]; static const u16 *const gTilesetAnims_BattleDomePals0[] = { - gUnknown_08D85640, - gUnknown_08D85660, - gUnknown_08D85680, - gUnknown_08D856A0, + gTilesetAnims_BattleDomePals0_0, + gTilesetAnims_BattleDomePals0_1, + gTilesetAnims_BattleDomePals0_2, + gTilesetAnims_BattleDomePals0_3, }; // .text @@ -686,8 +686,8 @@ static void cur_mapheader_run_tileset1_func(void) sPrimaryTilesetCBCounter = 0; sPrimaryTilesetCBBufferSize = 0; sPrimaryTilesetCB = NULL; - if (gMapHeader.mapData->primaryTileset && gMapHeader.mapData->primaryTileset->callback) - gMapHeader.mapData->primaryTileset->callback(); + if (gMapHeader.mapLayout->primaryTileset && gMapHeader.mapLayout->primaryTileset->callback) + gMapHeader.mapLayout->primaryTileset->callback(); } static void cur_mapheader_run_tileset2_func(void) @@ -695,8 +695,8 @@ static void cur_mapheader_run_tileset2_func(void) sSecondaryTilesetCBCounter = 0; sSecondaryTilesetCBBufferSize = 0; sSecondaryTilesetCB = NULL; - if (gMapHeader.mapData->secondaryTileset && gMapHeader.mapData->secondaryTileset->callback) - gMapHeader.mapData->secondaryTileset->callback(); + if (gMapHeader.mapLayout->secondaryTileset && gMapHeader.mapLayout->secondaryTileset->callback) + gMapHeader.mapLayout->secondaryTileset->callback(); } void TilesetCb_General(void) diff --git a/src/time_events.c b/src/time_events.c index 1f169a5c6..1f46e7705 100644 --- a/src/time_events.c +++ b/src/time_events.c @@ -81,7 +81,7 @@ void UpdateShoalTideFlag(void) 1, // 23 }; - if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0())) + if (is_map_type_1_2_3_5_or_6(get_map_light_from_warp0())) { RtcCalcLocalTime(); if (tide[gLocalTime.hours]) diff --git a/src/title_screen.c b/src/title_screen.c index 4e25c8152..8a2c01192 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -19,6 +19,7 @@ #include "gpu_regs.h" #include "trig.h" #include "constants/rgb.h" +#include "constants/songs.h" #define VERSION_BANNER_SHAPE 1 #define VERSION_BANNER_RIGHT_TILEOFFSET 64 @@ -545,7 +546,7 @@ void CB2_InitTitleScreen(void) break; } case 3: - BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, 1, 0x10, 0, 0xFFFF); SetVBlankCallback(VBlankCB); gMain.state = 4; break; @@ -574,7 +575,7 @@ void CB2_InitTitleScreen(void) | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_OBJWIN_ON); - m4aSongNumStart(0x19D); + m4aSongNumStart(MUS_TITLE3); gMain.state = 5; break; case 5: @@ -695,7 +696,7 @@ static void Task_TitleScreenPhase3(u8 taskId) if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & START_BUTTON)) { FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); SetMainCallback2(CB2_GoToMainMenu); } else if ((gMain.heldKeys & CLEAR_SAVE_BUTTON_COMBO) == CLEAR_SAVE_BUTTON_COMBO) @@ -706,13 +707,13 @@ static void Task_TitleScreenPhase3(u8 taskId) && CanResetRTC() == TRUE) { FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); SetMainCallback2(CB2_GoToResetRtcScreen); } else if ((gMain.heldKeys & BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO) { FadeOutBGM(4); - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); SetMainCallback2(CB2_GoToBerryFixScreen); } else @@ -729,7 +730,7 @@ static void Task_TitleScreenPhase3(u8 taskId) UpdateLegendaryMarkingColor(gTasks[taskId].tCounter); if ((gMPlayInfo_BGM.status & 0xFFFF) == 0) { - BeginNormalPaletteFade(-1, 0, 0, 0x10, 0xFFFF); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0xFFFF); SetMainCallback2(CB2_GoToCopyrightScreen); } } diff --git a/src/trader.c b/src/trader.c new file mode 100644 index 000000000..c4d70ac9a --- /dev/null +++ b/src/trader.c @@ -0,0 +1,209 @@ +#include "global.h" +#include "constants/decorations.h" +#include "constants/mauville_man.h" +#include "decoration.h" +#include "decoration_inventory.h" +#include "event_data.h" +#include "main.h" +#include "menu.h" +#include "menu_helpers.h" +#include "script.h" +#include "constants/songs.h" +#include "sound.h" +#include "string_util.h" +#include "strings.h" +#include "task.h" +#include "script_menu.h" + +static const u8 * const sDefaultTraderNames[] = +{ + gText_Tristan, + gText_Philip, + gText_Dennis, + gText_Roberto, +}; + +static const u8 sDefaultTraderDecorations[] = +{ + DECOR_DUSKULL_DOLL, + DECOR_BALL_CUSHION, + DECOR_TIRE, + DECOR_PRETTY_FLOWERS, +}; + +void TraderSetup(void) +{ + u8 i; + struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; + + trader->id = MAUVILLE_MAN_TRADER; + trader->alreadyTraded = FALSE; + + for (i = 0; i < 4; i++) + { + StringCopy(trader->playerNames[i], sDefaultTraderNames[i]); + trader->decorIds[i] = sDefaultTraderDecorations[i]; + trader->language[i] = GAME_LANGUAGE; + } +} + +void Trader_ResetFlag(void) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; + trader->alreadyTraded = FALSE; +} + +void CreateAvailableDecorationsMenu(u8 taskId) +{ + u8 i; + s16 * data = gTasks[taskId].data; + struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; + struct WindowTemplate windowTemplate = {0, 1, 1, 10, 10, 15, 1}; + s32 windowWidth = GetStringWidth(1, gText_Exit, 0); + s32 fiveMarksWidth = GetStringWidth(1, gText_FiveMarks, 0); + for (i = 0; i < 4; i++) + { + s32 curWidth; + if (trader->decorIds[i] > NUM_DECORATIONS) + curWidth = fiveMarksWidth; + else + curWidth = GetStringWidth(1, gDecorations[trader->decorIds[i]].name, 0); + if (curWidth > windowWidth) + windowWidth = curWidth; + } + windowTemplate.width = convert_pixel_width_to_tile_width(windowWidth); + data[3] = AddWindow(&windowTemplate); + SetWindowBorderStyle(data[3], FALSE, 0x214, 14); + for (i = 0; i < 4; i++) + { + if (trader->decorIds[i] > NUM_DECORATIONS) + PrintTextOnWindow(data[3], 1, gText_FiveMarks, 8, 16 * i + 1, 255, NULL); + else + PrintTextOnWindow(data[3], 1, gDecorations[trader->decorIds[i]].name, 8, 16 * i + 1, 255, NULL); + } + PrintTextOnWindow(data[3], 1, gText_Exit, 8, 16 * i + 1, 255, NULL); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(data[3], 5, 0); + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_8133BE4(u8 taskId, u8 decorationId) +{ + s16 * data = gTasks[taskId].data; + if (decorationId > NUM_DECORATIONS) + { + gSpecialVar_0x8004 = 0xFFFF; + } + else + { + gSpecialVar_0x8004 = decorationId; + } + + sub_8198070(data[3], FALSE); + ClearWindowTilemap(data[3]); + RemoveWindow(data[3]); + schedule_bg_copy_tilemap_to_vram(0); + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void Task_HandleGetDecorationMenuInput(u8 taskId) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; + s8 input = ProcessMenuInput(); + + switch (input) + { + case -2: + break; + case -1: + case 4: + PlaySE(SE_SELECT); + sub_8133BE4(taskId, 0); + break; + default: + PlaySE(SE_SELECT); + gSpecialVar_0x8005 = input; + StringCopy(gStringVar1, trader->playerNames[input]); + ConvertInternationalString(gStringVar1, trader->language[input]); + sub_8133BE4(taskId, trader->decorIds[input]); + break; + } +} + +void ScrSpecial_GetTraderTradedFlag(void) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; + gSpecialVar_Result = trader->alreadyTraded; +} + +void ScrSpecial_DoesPlayerHaveNoDecorations(void) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (CountDecorationCategoryN(i)) + { + gSpecialVar_Result = FALSE; + return; + } + } + gSpecialVar_Result = TRUE; +} + +void ScrSpecial_IsDecorationFull(void) +{ + gSpecialVar_Result = FALSE; + if (gDecorations[gSpecialVar_0x8004].category != gDecorations[gSpecialVar_0x8006].category + && GetFirstEmptyDecorSlot(gDecorations[gSpecialVar_0x8004].category) == -1) + { + sub_8127250(gStringVar2, gDecorations[gSpecialVar_0x8004].category); + gSpecialVar_Result = TRUE; + } +} + +void ScrSpecial_TraderMenuGiveDecoration(void) +{ + CreateTask(sub_8127208, 0); +} + +void sub_8133DA0(u8 taskId) +{ + if (IsSelectedDecorInThePC() == TRUE) + { + gSpecialVar_0x8006 = gCurDecorInventoryItems[gCurDecorationIndex]; + StringCopy(gStringVar3, gDecorations[gSpecialVar_0x8004].name); + StringCopy(gStringVar2, gDecorations[gSpecialVar_0x8006].name); + } + else + { + gSpecialVar_0x8006 = 0xFFFF; + } + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void sub_8133E1C(u8 taskId) +{ + gSpecialVar_0x8006 = 0; + DestroyTask(taskId); + EnableBothScriptContexts(); +} + +void ScrSpecial_TraderDoDecorationTrade(void) +{ + struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; + + DecorationRemove(gSpecialVar_0x8006); + DecorationAdd(gSpecialVar_0x8004); + StringCopy(trader->playerNames[gSpecialVar_0x8005], gSaveBlock2Ptr->playerName); + trader->decorIds[gSpecialVar_0x8005] = gSpecialVar_0x8006; + trader->language[gSpecialVar_0x8005] = GAME_LANGUAGE; + trader->alreadyTraded = TRUE; +} + +void ScrSpecial_TraderMenuGetDecoration(void) +{ + u8 taskId = CreateTask(Task_HandleGetDecorationMenuInput, 0); + CreateAvailableDecorationsMenu(taskId); +} diff --git a/src/trainer_see.c b/src/trainer_see.c index 7706da703..f5e9c300e 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -4,9 +4,8 @@ #include "pokemon.h" #include "sprite.h" #include "field_effect.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "field_player_avatar.h" -#include "field_map_obj_helpers.h" #include "pokenav.h" #include "task.h" #include "util.h" @@ -16,36 +15,36 @@ extern bool8 InBattlePyramid(void); extern bool32 InTrainerHill(void); -extern bool8 GetBattlePyramidTrainerFlag(u8 mapObjectId); -extern bool8 GetTrainerHillTrainerFlag(u8 mapObjectId); +extern bool8 GetBattlePyramidTrainerFlag(u8 eventObjectId); +extern bool8 GetTrainerHillTrainerFlag(u8 eventObjectId); extern void sub_809BE48(u16 npcId); // this file's functions -static u8 CheckTrainer(u8 mapObjectId); -static u8 GetTrainerApproachDistance(struct MapObject *trainerObj); -static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction); -static void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range); +static u8 CheckTrainer(u8 eventObjectId); +static u8 GetTrainerApproachDistance(struct EventObject *trainerObj); +static u8 CheckPathBetweenTrainerAndPlayer(struct EventObject *trainerObj, u8 approachDistance, u8 direction); +static void TrainerApproachPlayer(struct EventObject *trainerObj, u8 range); static void Task_RunTrainerSeeFuncList(u8 taskId); static void Task_DestroyTrainerApproachTask(u8 taskId); static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnimNum); -static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y); -static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y); - -static bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj); -static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj); +static u8 GetTrainerApproachDistanceSouth(struct EventObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceNorth(struct EventObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceWest(struct EventObject *trainerObj, s16 range, s16 x, s16 y); +static u8 GetTrainerApproachDistanceEast(struct EventObject *trainerObj, s16 range, s16 x, s16 y); + +static bool8 sub_80B4178(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B435C(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *trainerObj); +static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct EventObject *trainerObj); static void SpriteCB_TrainerIcons(struct Sprite *sprite); @@ -64,7 +63,7 @@ static const u8 sEmotion_ExclamationMarkGfx[] = INCBIN_U8("graphics/misc/emotion static const u8 sEmotion_QuestionMarkGfx[] = INCBIN_U8("graphics/misc/emotion_question.4bpp"); static const u8 sEmotion_HeartGfx[] = INCBIN_U8("graphics/misc/emotion_heart.4bpp"); -static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainerObj, s16 range, s16 x, s16 y) = +static u8 (*const sDirectionalApproachDistanceFuncs[])(struct EventObject *trainerObj, s16 range, s16 x, s16 y) = { GetTrainerApproachDistanceSouth, GetTrainerApproachDistanceNorth, @@ -72,7 +71,7 @@ static u8 (*const sDirectionalApproachDistanceFuncs[])(struct MapObject *trainer GetTrainerApproachDistanceEast, }; -static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct EventObject *trainerObj) = { sub_80B4178, sub_80B417C, @@ -88,7 +87,7 @@ static bool8 (*const sTrainerSeeFuncList[])(u8 taskId, struct Task *task, struct sub_80B44AC }; -static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct MapObject *trainerObj) = +static bool8 (*const sTrainerSeeFuncList2[])(u8 taskId, struct Task *task, struct EventObject *trainerObj) = { sub_80B43AC, sub_80B43E0, @@ -172,13 +171,13 @@ bool8 CheckForTrainersWantingBattle(void) gNoOfApproachingTrainers = 0; gApproachingTrainerId = 0; - for (i = 0; i < MAP_OBJECTS_COUNT; i++) + for (i = 0; i < EVENT_OBJECTS_COUNT; i++) { u8 retVal; - if (!gMapObjects[i].active) + if (!gEventObjects[i].active) continue; - if (gMapObjects[i].trainerType != 1 && gMapObjects[i].trainerType != 3) + if (gEventObjects[i].trainerType != 1 && gEventObjects[i].trainerType != 3) continue; retVal = CheckTrainer(i); @@ -197,7 +196,7 @@ bool8 CheckForTrainersWantingBattle(void) if (gNoOfApproachingTrainers == 1) { ResetTrainerOpponentIds(); - ConfigureAndSetUpOneTrainerBattle(gApproachingTrainers[gNoOfApproachingTrainers - 1].mapObjectId, + ConfigureAndSetUpOneTrainerBattle(gApproachingTrainers[gNoOfApproachingTrainers - 1].eventObjectId, gApproachingTrainers[gNoOfApproachingTrainers - 1].trainerScriptPtr); gUnknown_030060AC = 1; return TRUE; @@ -207,7 +206,7 @@ bool8 CheckForTrainersWantingBattle(void) ResetTrainerOpponentIds(); for (i = 0; i < gNoOfApproachingTrainers; i++, gApproachingTrainerId++) { - ConfigureTwoTrainersBattle(gApproachingTrainers[i].mapObjectId, + ConfigureTwoTrainersBattle(gApproachingTrainers[i].eventObjectId, gApproachingTrainers[i].trainerScriptPtr); } SetUpTwoTrainersBattle(); @@ -222,7 +221,7 @@ bool8 CheckForTrainersWantingBattle(void) } } -static u8 CheckTrainer(u8 mapObjectId) +static u8 CheckTrainer(u8 eventObjectId) { const u8 *scriptPtr; u8 ret = 1; @@ -231,16 +230,16 @@ static u8 CheckTrainer(u8 mapObjectId) if (InTrainerHill() == TRUE) scriptPtr = sub_81D62AC(); else - scriptPtr = GetFieldObjectScriptPointerByFieldObjectId(mapObjectId); + scriptPtr = GetEventObjectScriptPointerByEventObjectId(eventObjectId); if (InBattlePyramid()) { - if (GetBattlePyramidTrainerFlag(mapObjectId)) + if (GetBattlePyramidTrainerFlag(eventObjectId)) return 0; } else if (InTrainerHill() == TRUE) { - if (GetTrainerHillTrainerFlag(mapObjectId)) + if (GetTrainerHillTrainerFlag(eventObjectId)) return 0; } else @@ -249,7 +248,7 @@ static u8 CheckTrainer(u8 mapObjectId) return 0; } - approachDistance = GetTrainerApproachDistance(&gMapObjects[mapObjectId]); + approachDistance = GetTrainerApproachDistance(&gEventObjects[eventObjectId]); if (approachDistance != 0) { @@ -263,10 +262,10 @@ static u8 CheckTrainer(u8 mapObjectId) ret = 2; } - gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId = mapObjectId; + gApproachingTrainers[gNoOfApproachingTrainers].eventObjectId = eventObjectId; gApproachingTrainers[gNoOfApproachingTrainers].trainerScriptPtr = scriptPtr; gApproachingTrainers[gNoOfApproachingTrainers].radius = approachDistance; - TrainerApproachPlayer(&gMapObjects[mapObjectId], approachDistance - 1); + TrainerApproachPlayer(&gEventObjects[eventObjectId], approachDistance - 1); gNoOfApproachingTrainers++; return ret; @@ -275,7 +274,7 @@ static u8 CheckTrainer(u8 mapObjectId) return 0; } -static u8 GetTrainerApproachDistance(struct MapObject *trainerObj) +static u8 GetTrainerApproachDistance(struct EventObject *trainerObj) { s16 x, y; u8 i; @@ -284,8 +283,8 @@ static u8 GetTrainerApproachDistance(struct MapObject *trainerObj) PlayerGetDestCoords(&x, &y); if (trainerObj->trainerType == 1) // can only see in one direction { - approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->mapobj_unk_18 - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); - return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->mapobj_unk_18); + approachDistance = sDirectionalApproachDistanceFuncs[trainerObj->facingDirection - 1](trainerObj, trainerObj->trainerRange_berryTreeId, x, y); + return CheckPathBetweenTrainerAndPlayer(trainerObj, approachDistance, trainerObj->facingDirection); } else // can see in all directions { @@ -301,52 +300,52 @@ static u8 GetTrainerApproachDistance(struct MapObject *trainerObj) } // Returns how far south the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceSouth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceSouth(struct EventObject *trainerObj, s16 range, s16 x, s16 y) { - if (trainerObj->coords2.x == x - && y > trainerObj->coords2.y - && y <= trainerObj->coords2.y + range) - return (y - trainerObj->coords2.y); + if (trainerObj->currentCoords.x == x + && y > trainerObj->currentCoords.y + && y <= trainerObj->currentCoords.y + range) + return (y - trainerObj->currentCoords.y); else return 0; } // Returns how far north the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceNorth(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceNorth(struct EventObject *trainerObj, s16 range, s16 x, s16 y) { - if (trainerObj->coords2.x == x - && y < trainerObj->coords2.y - && y >= trainerObj->coords2.y - range) - return (trainerObj->coords2.y - y); + if (trainerObj->currentCoords.x == x + && y < trainerObj->currentCoords.y + && y >= trainerObj->currentCoords.y - range) + return (trainerObj->currentCoords.y - y); else return 0; } // Returns how far west the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceWest(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceWest(struct EventObject *trainerObj, s16 range, s16 x, s16 y) { - if (trainerObj->coords2.y == y - && x < trainerObj->coords2.x - && x >= trainerObj->coords2.x - range) - return (trainerObj->coords2.x - x); + if (trainerObj->currentCoords.y == y + && x < trainerObj->currentCoords.x + && x >= trainerObj->currentCoords.x - range) + return (trainerObj->currentCoords.x - x); else return 0; } // Returns how far east the player is from trainer. 0 if out of trainer's sight. -static u8 GetTrainerApproachDistanceEast(struct MapObject *trainerObj, s16 range, s16 x, s16 y) +static u8 GetTrainerApproachDistanceEast(struct EventObject *trainerObj, s16 range, s16 x, s16 y) { - if (trainerObj->coords2.y == y - && x > trainerObj->coords2.x - && x <= trainerObj->coords2.x + range) - return (x - trainerObj->coords2.x); + if (trainerObj->currentCoords.y == y + && x > trainerObj->currentCoords.x + && x <= trainerObj->currentCoords.x + range) + return (x - trainerObj->currentCoords.x); else return 0; } #define COLLISION_MASK (~1) -static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 approachDistance, u8 direction) +static u8 CheckPathBetweenTrainerAndPlayer(struct EventObject *trainerObj, u8 approachDistance, u8 direction) { s16 x, y; u8 unk19_temp; @@ -357,13 +356,13 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 appr if (approachDistance == 0) return 0; - x = trainerObj->coords2.x; - y = trainerObj->coords2.y; + x = trainerObj->currentCoords.x; + y = trainerObj->currentCoords.y; MoveCoords(direction, &x, &y); for (i = 0; i < approachDistance - 1; i++, MoveCoords(direction, &x, &y)) { - collision = sub_8092C8C(trainerObj, x, y, direction); + collision = GetCollisionFlagsAtCoords(trainerObj, x, y, direction); if (collision != 0 && (collision & COLLISION_MASK)) return 0; } @@ -374,7 +373,7 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 appr trainerObj->range.as_nybbles.x = 0; trainerObj->range.as_nybbles.y = 0; - collision = npc_block_way(trainerObj, x, y, direction); + collision = GetCollisionAtCoords(trainerObj, x, y, direction); trainerObj->range.as_nybbles.x = unk19_temp; trainerObj->range.as_nybbles.y = unk19b_temp; @@ -387,16 +386,16 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct MapObject *trainerObj, u8 appr #define tFuncId data[0] #define tTrainerRange data[3] #define tOutOfAshSpriteId data[4] -#define tTrainerMapObjectId data[7] +#define tTrainerEventObjectId data[7] -static void TrainerApproachPlayer(struct MapObject *trainerObj, u8 range) +static void TrainerApproachPlayer(struct EventObject *trainerObj, u8 range) { struct Task *task; gApproachingTrainers[gNoOfApproachingTrainers].taskId = CreateTask(Task_RunTrainerSeeFuncList, 0x50); task = &gTasks[gApproachingTrainers[gNoOfApproachingTrainers].taskId]; task->tTrainerRange = range; - task->tTrainerMapObjectId = gApproachingTrainers[gNoOfApproachingTrainers].mapObjectId; + task->tTrainerEventObjectId = gApproachingTrainers[gNoOfApproachingTrainers].eventObjectId; } static void sub_80B40C8(TaskFunc followupFunc) @@ -418,7 +417,7 @@ static void sub_80B40C8(TaskFunc followupFunc) static void Task_RunTrainerSeeFuncList(u8 taskId) { struct Task *task = &gTasks[taskId]; - struct MapObject *trainerObj = &gMapObjects[task->tTrainerMapObjectId]; + struct EventObject *trainerObj = &gEventObjects[task->tTrainerEventObjectId]; if (!trainerObj->active) { @@ -430,125 +429,125 @@ static void Task_RunTrainerSeeFuncList(u8 taskId) } } -static bool8 sub_80B4178(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4178(u8 taskId, struct Task *task, struct EventObject *trainerObj) { return FALSE; } -static bool8 sub_80B417C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B417C(u8 taskId, struct Task *task, struct EventObject *trainerObj) { u8 direction; - FieldObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); - FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON_1); - direction = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); - FieldObjectSetSpecialAnim(trainerObj, direction); + EventObjectGetLocalIdAndMap(trainerObj, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]); + FieldEffectStart(FLDEFF_EXCLAMATION_MARK_ICON); + direction = GetFaceDirectionMovementAction(trainerObj->facingDirection); + EventObjectSetHeldMovement(trainerObj, direction); task->tFuncId++; return TRUE; } -static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B41C0(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON_1)) + if (FieldEffectActiveListContains(FLDEFF_EXCLAMATION_MARK_ICON)) { return FALSE; } else { task->tFuncId++; - if (trainerObj->animPattern == 57 || trainerObj->animPattern == 58) + if (trainerObj->movementType == 57 || trainerObj->movementType == 58) task->tFuncId = 6; - if (trainerObj->animPattern == 63) + if (trainerObj->movementType == 63) task->tFuncId = 8; return TRUE; } } -static bool8 sub_80B4200(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4200(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (!(FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj)) || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + if (!(EventObjectIsMovementOverridden(trainerObj)) || EventObjectClearHeldMovementIfFinished(trainerObj)) { if (task->tTrainerRange) { - FieldObjectSetSpecialAnim(trainerObj, GetGoSpeed0AnimId(trainerObj->mapobj_unk_18)); + EventObjectSetHeldMovement(trainerObj, GetWalkNormalMovementAction(trainerObj->facingDirection)); task->tTrainerRange--; } else { - FieldObjectSetSpecialAnim(trainerObj, 0x3E); + EventObjectSetHeldMovement(trainerObj, 0x3E); task->tFuncId++; } } return FALSE; } -static bool8 sub_80B425C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B425C(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - struct MapObject *playerObj; + struct EventObject *playerObj; - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + if (EventObjectIsMovementOverridden(trainerObj) && !EventObjectClearHeldMovementIfFinished(trainerObj)) return FALSE; - npc_set_running_behaviour_etc(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); - sub_808F23C(trainerObj, npc_running_behaviour_by_direction(trainerObj->mapobj_unk_18)); - sub_808F208(trainerObj); + SetTrainerMovementType(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); + TryOverrideTemplateCoordsForEventObject(trainerObj, GetTrainerFacingDirectionMovementType(trainerObj->facingDirection)); + OverrideTemplateCoordsForEventObject(trainerObj); - playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) && !FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + playerObj = &gEventObjects[gPlayerAvatar.eventObjectId]; + if (EventObjectIsMovementOverridden(playerObj) && !EventObjectClearHeldMovementIfFinished(playerObj)) return FALSE; sub_808BCE8(); - FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18))); + EventObjectSetHeldMovement(&gEventObjects[gPlayerAvatar.eventObjectId], GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection))); task->tFuncId++; return FALSE; } -static bool8 sub_80B4318(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4318(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - struct MapObject *playerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; + struct EventObject *playerObj = &gEventObjects[gPlayerAvatar.eventObjectId]; - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(playerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(playerObj)) + if (!EventObjectIsMovementOverridden(playerObj) + || EventObjectClearHeldMovementIfFinished(playerObj)) SwitchTaskToFollowupFunc(taskId); return FALSE; } -static bool8 sub_80B435C(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B435C(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + if (!EventObjectIsMovementOverridden(trainerObj) + || EventObjectClearHeldMovementIfFinished(trainerObj)) { - FieldObjectSetSpecialAnim(trainerObj, 0x59); + EventObjectSetHeldMovement(trainerObj, 0x59); task->tFuncId++; } return FALSE; } -static bool8 sub_80B4390(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4390(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + if (EventObjectClearHeldMovementIfFinished(trainerObj)) task->tFuncId = 3; return FALSE; } -static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B43AC(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(trainerObj) - || FieldObjectClearAnimIfSpecialAnimFinished(trainerObj)) + if (!EventObjectIsMovementOverridden(trainerObj) + || EventObjectClearHeldMovementIfFinished(trainerObj)) { - FieldObjectSetSpecialAnim(trainerObj, 0x3E); + EventObjectSetHeldMovement(trainerObj, 0x3E); task->tFuncId++; } return FALSE; } -static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct EventObject *trainerObj) { - if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(trainerObj)) + if (EventObjectCheckHeldMovementStatus(trainerObj)) { - gFieldEffectArguments[0] = trainerObj->coords2.x; - gFieldEffectArguments[1] = trainerObj->coords2.y; + gFieldEffectArguments[0] = trainerObj->currentCoords.x; + gFieldEffectArguments[1] = trainerObj->currentCoords.y; gFieldEffectArguments[2] = gSprites[trainerObj->spriteId].subpriority - 1; gFieldEffectArguments[3] = 2; task->tOutOfAshSpriteId = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); @@ -557,26 +556,26 @@ static bool8 sub_80B43E0(u8 taskId, struct Task *task, struct MapObject *trainer return FALSE; } -static bool8 sub_80B4438(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B4438(u8 taskId, struct Task *task, struct EventObject *trainerObj) { struct Sprite *sprite; if (gSprites[task->tOutOfAshSpriteId].animCmdIndex == 2) { - trainerObj->mapobj_bit_26 = 0; - trainerObj->mapobj_bit_2 = 1; + trainerObj->fixedPriority = 0; + trainerObj->triggerGroundEffectsOnMove = 1; sprite = &gSprites[trainerObj->spriteId]; sprite->oam.priority = 2; - FieldObjectClearAnimIfSpecialAnimFinished(trainerObj); - FieldObjectSetSpecialAnim(trainerObj, sub_80934BC(trainerObj->mapobj_unk_18)); + EventObjectClearHeldMovementIfFinished(trainerObj); + EventObjectSetHeldMovement(trainerObj, GetJumpInPlaceMovementAction(trainerObj->facingDirection)); task->tFuncId++; } return FALSE; } -static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainerObj) +static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct EventObject *trainerObj) { if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) task->tFuncId = 3; @@ -587,34 +586,34 @@ static bool8 sub_80B44AC(u8 taskId, struct Task *task, struct MapObject *trainer #undef tFuncId #undef tTrainerRange #undef tOutOfAshSpriteId -#undef tTrainerMapObjectId +#undef tTrainerEventObjectId static void sub_80B44C8(u8 taskId) { struct Task *task = &gTasks[taskId]; - struct MapObject *mapObj; + struct EventObject *eventObj; - // another mapObj loaded into by loadword? - LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&mapObj); + // another eventObj loaded into by loadword? + LoadWordFromTwoHalfwords(&task->data[1], (u32 *)&eventObj); if (!task->data[7]) { - FieldObjectClearAnim(mapObj); + EventObjectClearHeldMovement(eventObj); task->data[7]++; } - sTrainerSeeFuncList2[task->data[0]](taskId, task, mapObj); + sTrainerSeeFuncList2[task->data[0]](taskId, task, eventObj); if (task->data[0] == 3 && !FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) { - npc_set_running_behaviour_etc(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); - sub_808F23C(mapObj, npc_running_behaviour_by_direction(mapObj->mapobj_unk_18)); + SetTrainerMovementType(eventObj, GetTrainerFacingDirectionMovementType(eventObj->facingDirection)); + TryOverrideTemplateCoordsForEventObject(eventObj, GetTrainerFacingDirectionMovementType(eventObj->facingDirection)); DestroyTask(taskId); } else { - mapObj->mapobj_bit_7 = 0; + eventObj->heldMovementFinished = 0; } } -void sub_80B4578(struct MapObject *var) +void sub_80B4578(struct EventObject *var) { StoreWordInTwoHalfwords(&gTasks[CreateTask(sub_80B44C8, 0)].data[1], (u32)var); } @@ -638,8 +637,8 @@ void sub_80B45D0(void) { gApproachingTrainerId++; gSpecialVar_Result = 1; - UnfreezeMapObjects(); - FreezeMapObjectsExceptOne(gApproachingTrainers[1].mapObjectId); + UnfreezeEventObjects(); + FreezeEventObjectsExceptOne(gApproachingTrainers[1].eventObjectId); } else { @@ -660,22 +659,22 @@ void sub_80B45D0(void) #define sData4 data[4] #define sFldEffId data[7] -u8 FldEff_ExclamationMarkIcon1(void) +u8 FldEff_ExclamationMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x53); if (spriteId != MAX_SPRITES) - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_1, 0); + SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON, 0); return 0; } -u8 FldEff_ExclamationMarkIcon2(void) +u8 FldEff_QuestionMarkIcon(void) { u8 spriteId = CreateSpriteAtEnd(&sSpriteTemplate_ExclamationQuestionMark, 0, 0, 0x52); if (spriteId != MAX_SPRITES) - SetIconSpriteData(&gSprites[spriteId], FLDEFF_EXCLAMATION_MARK_ICON_2, 1); + SetIconSpriteData(&gSprites[spriteId], FLDEFF_QUESTION_MARK_ICON, 1); return 0; } @@ -711,21 +710,21 @@ static void SetIconSpriteData(struct Sprite *sprite, u16 fldEffId, u8 spriteAnim static void SpriteCB_TrainerIcons(struct Sprite *sprite) { - u8 mapObjId; + u8 eventObjId; - if (TryGetFieldObjectIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &mapObjId) + if (TryGetEventObjectIdByLocalIdAndMap(sprite->sLocalId, sprite->sMapNum, sprite->sMapGroup, &eventObjId) || sprite->animEnded) { FieldEffectStop(sprite, sprite->sFldEffId); } else { - struct Sprite *mapObjSprite = &gSprites[gMapObjects[mapObjId].spriteId]; + struct Sprite *eventObjSprite = &gSprites[gEventObjects[eventObjId].spriteId]; sprite->sData4 += sprite->sData3; - sprite->pos1.x = mapObjSprite->pos1.x; - sprite->pos1.y = mapObjSprite->pos1.y - 16; - sprite->pos2.x = mapObjSprite->pos2.x; - sprite->pos2.y = mapObjSprite->pos2.y + sprite->sData4; + sprite->pos1.x = eventObjSprite->pos1.x; + sprite->pos1.y = eventObjSprite->pos1.y - 16; + sprite->pos2.x = eventObjSprite->pos2.x; + sprite->pos2.y = eventObjSprite->pos2.y + sprite->sData4; if (sprite->sData4) sprite->sData3++; else @@ -740,39 +739,39 @@ static void SpriteCB_TrainerIcons(struct Sprite *sprite) #undef sData4 #undef sFldEffId -u8 GetCurrentApproachingTrainerMapObjectId(void) +u8 GetCurrentApproachingTrainerEventObjectId(void) { if (gApproachingTrainerId == 0) - return gApproachingTrainers[0].mapObjectId; + return gApproachingTrainers[0].eventObjectId; else - return gApproachingTrainers[1].mapObjectId; + return gApproachingTrainers[1].eventObjectId; } -u8 GetChosenApproachingTrainerMapObjectId(u8 arrayId) +u8 GetChosenApproachingTrainerEventObjectId(u8 arrayId) { if (arrayId >= ARRAY_COUNT(gApproachingTrainers)) return 0; else if (arrayId == 0) - return gApproachingTrainers[0].mapObjectId; + return gApproachingTrainers[0].eventObjectId; else - return gApproachingTrainers[1].mapObjectId; + return gApproachingTrainers[1].eventObjectId; } void sub_80B4808(void) { - struct MapObject *trainerObj; + struct EventObject *trainerObj; if (gUnknown_030060AC == 1) { - trainerObj = &gMapObjects[gApproachingTrainers[gUnknown_03006080].mapObjectId]; - gUnknown_03006084[0] = GetFaceDirectionAnimId(GetOppositeDirection(trainerObj->mapobj_unk_18)); + trainerObj = &gEventObjects[gApproachingTrainers[gUnknown_03006080].eventObjectId]; + gUnknown_03006084[0] = GetFaceDirectionMovementAction(GetOppositeDirection(trainerObj->facingDirection)); gUnknown_03006084[1] = 0xFE; ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084); } else { - trainerObj = &gMapObjects[gPlayerAvatar.mapObjectId]; - gUnknown_03006084[0] = GetFaceDirectionAnimId(trainerObj->mapobj_unk_18); + trainerObj = &gEventObjects[gPlayerAvatar.eventObjectId]; + gUnknown_03006084[0] = GetFaceDirectionMovementAction(trainerObj->facingDirection); gUnknown_03006084[1] = 0xFE; ScriptMovement_StartObjectMovementScript(0xFF, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gUnknown_03006084); } @@ -26,7 +26,7 @@ #include "lilycove_lady.h" #include "rom6.h" #include "pokedex.h" -#include "field_map_obj.h" +#include "event_object_movement.h" #include "text.h" #include "script_menu.h" #include "naming_screen.h" @@ -1037,7 +1037,7 @@ u8 GabbyAndTyGetLastBattleTrivia(void) return 0; } -void GabbyAndTySetScriptVarsToFieldObjectLocalIds(void) +void GabbyAndTySetScriptVarsToEventObjectLocalIds(void) { switch (GabbyAndTyGetBattleNum()) { @@ -1380,13 +1380,13 @@ void PutFanClubSpecialOnTheAir(void) StringCopy(show->fanClubSpecial.idolName, name); tv_store_id_2x(show); show->fanClubSpecial.language = gGameLanguage; - if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->unk_31A0 == LANGUAGE_JAPANESE) + if (show->fanClubSpecial.language == LANGUAGE_JAPANESE || gSaveBlock1Ptr->linkBattleRecords.languages[0] == LANGUAGE_JAPANESE) { show->fanClubSpecial.idolNameLanguage = LANGUAGE_JAPANESE; } else { - show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->unk_31A0; + show->fanClubSpecial.idolNameLanguage = gSaveBlock1Ptr->linkBattleRecords.languages[0]; } } @@ -1541,12 +1541,12 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void) show->bravoTrainerTower.kind = TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE; show->bravoTrainerTower.active = TRUE; StringCopy(show->bravoTrainerTower.trainerName, gSaveBlock2Ptr->playerName); - StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->field_BD8); - show->bravoTrainerTower.species = gSaveBlock2Ptr->field_BD4; - show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->field_BD6; - show->bravoTrainerTower.numFights = sub_8164FCC(gSaveBlock2Ptr->field_D07, 0); - show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->field_D06; - if (gSaveBlock2Ptr->field_D07 == 0) + StringCopy(show->bravoTrainerTower.pokemonName, gSaveBlock2Ptr->frontier.field_BD8); + show->bravoTrainerTower.species = gSaveBlock2Ptr->frontier.field_BD4; + show->bravoTrainerTower.defeatedSpecies = gSaveBlock2Ptr->frontier.field_BD6; + show->bravoTrainerTower.numFights = sub_8164FCC(gSaveBlock2Ptr->frontier.field_D07, 0); + show->bravoTrainerTower.wonTheChallenge = gSaveBlock2Ptr->frontier.field_D06; + if (gSaveBlock2Ptr->frontier.field_D07 == 0) { show->bravoTrainerTower.btLevel = 50; } @@ -1557,13 +1557,13 @@ static void InterviewAfter_BravoTrainerBattleTowerProfile(void) show->bravoTrainerTower.interviewResponse = gSpecialVar_0x8004; tv_store_id_2x(show); show->bravoTrainerTower.language = gGameLanguage; - if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->field_BEB == LANGUAGE_JAPANESE) + if (show->bravoTrainerTower.language == LANGUAGE_JAPANESE || gSaveBlock2Ptr->frontier.field_BEB == LANGUAGE_JAPANESE) { show->bravoTrainerTower.pokemonNameLanguage = LANGUAGE_JAPANESE; } else { - show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->field_BEB; + show->bravoTrainerTower.pokemonNameLanguage = gSaveBlock2Ptr->frontier.field_BEB; } } @@ -1958,7 +1958,7 @@ void sub_80EDB44(void) show->rivalTrainer.dexCount = GetHoennPokedexCount(0x01); } show->rivalTrainer.location = gMapHeader.regionMapSectionId; - show->rivalTrainer.mapDataId = gMapHeader.mapDataId; + show->rivalTrainer.mapLayoutId = gMapHeader.mapLayoutId; show->rivalTrainer.nSilverSymbols = 0; show->rivalTrainer.nGoldSymbols = 0; for (i = 0; i < 7; i ++) @@ -1972,7 +1972,7 @@ void sub_80EDB44(void) show->rivalTrainer.nGoldSymbols ++; } } - show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontierBattlePoints; + show->rivalTrainer.battlePoints = gSaveBlock2Ptr->frontier.frontierBattlePoints; StringCopy(show->rivalTrainer.playerName, gSaveBlock2Ptr->playerName); tv_store_id_3x(show); show->rivalTrainer.language = gGameLanguage; @@ -2010,7 +2010,7 @@ void sub_80EDCE8(void) show->treasureInvestigators.active = FALSE; show->treasureInvestigators.item = gSpecialVar_0x8005; show->treasureInvestigators.location = gMapHeader.regionMapSectionId; - show->treasureInvestigators.mapDataId = gMapHeader.mapDataId; + show->treasureInvestigators.mapLayoutId = gMapHeader.mapLayoutId; StringCopy(show->treasureInvestigators.playerName, gSaveBlock2Ptr->playerName); tv_store_id_3x(show); show->treasureInvestigators.language = gGameLanguage; @@ -2465,7 +2465,7 @@ bool8 sub_80EE7C0(void) { return TRUE; } - if (gSaveBlock1Ptr->linkBattleRecords[0].name[0] == EOS) + if (gSaveBlock1Ptr->linkBattleRecords.entries[0].name[0] == EOS) { return TRUE; } @@ -2540,8 +2540,8 @@ void sub_80EE8C8(u16 winStreak, u8 facility) show->frontier.species2 = GetMonData(&gPlayerParty[1], MON_DATA_SPECIES, NULL); break; case 4: - show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->field_CAA[0] - 1], MON_DATA_SPECIES, NULL); - show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->field_CAA[1] - 1], MON_DATA_SPECIES, NULL); + show->frontier.species1 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.field_CAA[0] - 1], MON_DATA_SPECIES, NULL); + show->frontier.species2 = GetMonData(&gSaveBlock1Ptr->playerParty[gSaveBlock2Ptr->frontier.field_CAA[1] - 1], MON_DATA_SPECIES, NULL); break; } tv_store_id_3x(show); @@ -2945,7 +2945,7 @@ static void sub_80EF40C(u8 varIdx, TVShow *show) { if (show->smartshopperShow.itemIds[i] != ITEM_NONE) { - price += itemid_get_market_price(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i]; + price += ItemId_GetPrice(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i]; } } if (show->smartshopperShow.priceReduced == TRUE) @@ -3454,7 +3454,7 @@ void ChangePokemonNickname(void) void ChangePokemonNickname_CB(void) { SetMonData(&gPlayerParty[gSpecialVar_0x8004], MON_DATA_NICKNAME, gStringVar2); - CB2_ReturnToFieldContinueScript(); + CB2_ReturnToFieldContinueScriptPlayMapMusic(); } void ChangeBoxPokemonNickname(void) @@ -3470,7 +3470,7 @@ void ChangeBoxPokemonNickname(void) void ChangeBoxPokemonNickname_CB(void) { SetBoxMonNickFromAnyBox(gSpecialVar_MonBoxId, gSpecialVar_MonBoxPos, gStringVar2); - CB2_ReturnToFieldContinueScript(); + CB2_ReturnToFieldContinueScriptPlayMapMusic(); } void TV_CopyNicknameToStringVar1AndEnsureTerminated(void) @@ -3557,7 +3557,7 @@ void GetMomOrDadStringForTVMessage(void) if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { StringCopy(gStringVar1, gText_Mom); - VarSet(VAR_0x4003, 1); + VarSet(VAR_TEMP_3, 1); } } else @@ -3565,21 +3565,21 @@ void GetMomOrDadStringForTVMessage(void) if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) { StringCopy(gStringVar1, gText_Mom); - VarSet(VAR_0x4003, 1); + VarSet(VAR_TEMP_3, 1); } } } - if (VarGet(VAR_0x4003) == 1) + if (VarGet(VAR_TEMP_3) == 1) { StringCopy(gStringVar1, gText_Mom); } - else if (VarGet(VAR_0x4003) == 2) + else if (VarGet(VAR_TEMP_3) == 2) { StringCopy(gStringVar1, gText_Dad); } - else if (VarGet(VAR_0x4003) > 2) + else if (VarGet(VAR_TEMP_3) > 2) { - if (VarGet(VAR_0x4003) % 2 == 0) + if (VarGet(VAR_TEMP_3) % 2 == 0) StringCopy(gStringVar1, gText_Mom); else StringCopy(gStringVar1, gText_Dad); @@ -3589,12 +3589,12 @@ void GetMomOrDadStringForTVMessage(void) if (Random() % 2 != 0) { StringCopy(gStringVar1, gText_Mom); - VarSet(VAR_0x4003, 1); + VarSet(VAR_TEMP_3, 1); } else { StringCopy(gStringVar1, gText_Dad); - VarSet(VAR_0x4003, 2); + VarSet(VAR_TEMP_3, 2); } } } @@ -3602,11 +3602,11 @@ void GetMomOrDadStringForTVMessage(void) void sub_80F01B8(void) { VarSet(VAR_0x40BC, 0); - RemoveFieldObjectByLocalIdAndMap(5, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + RemoveEventObjectByLocalIdAndMap(5, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); FlagSet(0x396); } -void sub_80F01E8(void *src, u32 size, u8 masterIdx) +void ReceiveTvShowsData(void *src, u32 size, u8 masterIdx) { u8 i; u16 version; @@ -3931,7 +3931,7 @@ static void sub_80F0708(void) // FIXME: register allocation shenanigans } } #else -ASM_DIRECT static void sub_80F0708(void) +NAKED static void sub_80F0708(void) { asm_unified("\tpush {r4-r7,lr}\n" "\tmov r7, r9\n" @@ -4434,7 +4434,7 @@ static void sub_80F0C04(void) } } -void sub_80F0C7C(void *src, u32 size, u8 masterIdx) +void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx) { u8 i; PokeNews (*rmBuffer2)[4][16]; @@ -5120,7 +5120,7 @@ static void DoTVShowTodaysSmartShopper(void) break; case 1: TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[0])->name); + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[0]); sTVShowState += 1 + (Random() % 4); break; @@ -5148,7 +5148,7 @@ static void DoTVShowTodaysSmartShopper(void) } break; case 6: - StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[1])->name); + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1])); TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[1]); if (show->smartshopperShow.itemIds[2] != ITEM_NONE) { @@ -5164,7 +5164,7 @@ static void DoTVShowTodaysSmartShopper(void) } break; case 7: - StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[2])->name); + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2])); TV_PrintIntToStringVar(2, show->smartshopperShow.itemAmounts[2]); if (show->smartshopperShow.priceReduced == TRUE) { @@ -5201,7 +5201,7 @@ static void DoTVShowTodaysSmartShopper(void) break; case 11: TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - StringCopy(gStringVar2, ItemId_GetItem(show->smartshopperShow.itemIds[0])->name); + StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); if (show->smartshopperShow.priceReduced == TRUE) { sTVShowState = 8; @@ -5344,7 +5344,7 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void) sTVShowState = 2; break; case 2: - StringCopy(gStringVar2, ItemId_GetItem(show->pokemonToday.ball)->name); + StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball)); TV_PrintIntToStringVar(2, show->pokemonToday.nBallsUsed); if (show->pokemonToday.nBallsUsed < 4) { @@ -6261,7 +6261,7 @@ static void DoTVShowTodaysRivalTrainer(void) sTVShowState = 8; break; case MAPSEC_DYNAMIC: - switch (show->rivalTrainer.mapDataId) + switch (show->rivalTrainer.mapLayoutId) { case 0x115 ... 0x117: sTVShowState = 10; @@ -6457,10 +6457,10 @@ static void DoTVShowHoennTreasureInvestigators(void) switch (state) { case 0: - StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name); + StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); if (show->treasureInvestigators.location == MAPSEC_DYNAMIC) { - switch (show->treasureInvestigators.mapDataId) + switch (show->treasureInvestigators.mapLayoutId) { case 0x115 ... 0x117: sTVShowState = 2; @@ -6476,13 +6476,13 @@ static void DoTVShowHoennTreasureInvestigators(void) } break; case 1: - StringCopy(gStringVar1, ItemId_GetItem(show->treasureInvestigators.item)->name); + 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_GetItem(show->treasureInvestigators.item)->name); + StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); TVShowDone(); break; @@ -6598,7 +6598,7 @@ static void DoTVShowBreakingNewsTV(void) break; case 3: TV_PrintIntToStringVar(0, show->breakingNews.balls); - StringCopy(gStringVar2, ItemId_GetItem(show->breakingNews.caughtMonBall)->name); + StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall)); sTVShowState = 4; break; case 4: @@ -6788,7 +6788,7 @@ static void DoTVShowPokemonLotteryWinnerFlashReport(void) { StringCopy(gStringVar2, gText_Third); } - StringCopy(gStringVar3, ItemId_GetItem(show->lottoWinner.item)->name); + StringCopy(gStringVar3, ItemId_GetName(show->lottoWinner.item)); TVShowDone(); ShowFieldMessage(sTVPokemonLotteryWinnerFlashReportTextGroup[state]); } @@ -7530,7 +7530,7 @@ static void DoTVShowSecretBaseSecrets(void) sTVShowState = show->secretBaseSecrets.savedState; break; case 19: - StringCopy(gStringVar2, ItemId_GetItem(show->secretBaseSecrets.item)->name); + StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item)); sTVShowState = show->secretBaseSecrets.savedState; break; case 20: diff --git a/src/unk_transition.c b/src/unk_transition.c index feaddc8ce..20692bb7c 100644 --- a/src/unk_transition.c +++ b/src/unk_transition.c @@ -356,7 +356,7 @@ static bool8 sub_81DAB4C(struct Task *task) { if (task->data[3] == 31) { - BeginNormalPaletteFade(-1, -1, 0, 0x10, 0); + BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 0x10, 0); task->tState++; } else diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c index c8898d08f..72c33100f 100644 --- a/src/use_pokeblock.c +++ b/src/use_pokeblock.c @@ -164,7 +164,7 @@ void sub_8166380(void) InitBgsFromTemplates(0, gUnknown_085DFCCC, ARRAY_COUNT(gUnknown_085DFCCC)); InitWindows(gUnknown_085DFCDC); DeactivateAllTextPrinters(); - sub_809882C(0, 0x97, 0xE0); + LoadUserWindowBorderGfx(0, 0x97, 0xE0); gUnknown_0203BC90->field_50++; break; case 4: diff --git a/src/util.c b/src/util.c index 4f9241b21..88be4e4a1 100644 --- a/src/util.c +++ b/src/util.c @@ -230,7 +230,7 @@ void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) } #else -ASM_DIRECT void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) +NAKED void CopySpriteTiles(u8 shape, u8 size, u8 *tiles, u16 *tilemap, u8 *output) { asm("\n\ .syntax unified\n\ diff --git a/src/walda_phrase.c b/src/walda_phrase.c index 04789bfb5..4a82be14f 100644 --- a/src/walda_phrase.c +++ b/src/walda_phrase.c @@ -6,15 +6,13 @@ #include "main.h" #include "text.h" #include "new_game.h" - -extern void (*gFieldCallback)(void); +#include "overworld.h" extern const u8 gText_Peekaboo[]; extern u8 *GetWaldaPhrasePtr(void); extern bool32 IsWaldaPhraseEmpty(void); extern void sub_80AF168(void); -extern void CB2_ReturnToField(void); extern void SetWaldaPhrase(const u8 *src); extern void SetWaldaWallpaperPatternId(u8 patternId); extern void SetWaldaWallpaperIconId(u8 iconId); diff --git a/src/wallclock.c b/src/wallclock.c index f15bbbc27..3d95d75ac 100644 --- a/src/wallclock.c +++ b/src/wallclock.c @@ -576,7 +576,7 @@ static void LoadWallClockGraphics(void) InitBgsFromTemplates(0, gUnknown_085B21FC, 3); InitWindows(gUnknown_085B21DC); DeactivateAllTextPrinters(); - sub_809882C(0, 0x250, 0xd0); + LoadUserWindowBorderGfx(0, 0x250, 0xd0); clear_scheduled_bg_copies_to_vram(); ScanlineEffect_Stop(); ResetTasks(); @@ -589,7 +589,7 @@ static void LoadWallClockGraphics(void) static void WallClockInit(void) { - BeginNormalPaletteFade(-1, 0, 16, 0, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); EnableInterrupts(INTR_FLAG_VBLANK); SetVBlankCallback(WallClockVblankCallback); SetMainCallback2(WallClockMainCallback); @@ -602,7 +602,7 @@ static void WallClockInit(void) ShowBg(3); } -void Cb2_StartWallClock(void) +void CB2_StartWallClock(void) { u8 taskId; u8 spriteId; @@ -644,7 +644,7 @@ void Cb2_StartWallClock(void) schedule_bg_copy_tilemap_to_vram(2); } -void Cb2_ViewWallClock(void) +void CB2_ViewWallClock(void) { u8 taskId; u8 spriteId; @@ -782,7 +782,7 @@ static void Task_SetClock4(u8 taskId) static void Task_SetClock5(u8 taskId) { RtcInitLocalTimeOffset(gTasks[taskId].tHours, gTasks[taskId].tMinutes); - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); gTasks[taskId].func = Task_SetClock6; } @@ -814,7 +814,7 @@ static void Task_ViewClock2(u8 taskId) static void Task_ViewClock3(u8 taskId) { - BeginNormalPaletteFade(-1, 0, 0, 16, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); gTasks[taskId].func = Task_ViewClock4; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 279b6e672..9a22323ff 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -3437,8 +3437,8 @@ const struct WildPokemonHeader gWildMonHeaders[] = .fishingMonsInfo = NULL, }, { - .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHEAST), - .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHEAST), + .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTH), + .mapNum = MAP_NUM(SAFARI_ZONE_SOUTH), .landMonsInfo = &gSafariZone_South_LandMonsInfo, .waterMonsInfo = NULL, .rockSmashMonsInfo = NULL, @@ -3821,24 +3821,24 @@ const struct WildPokemonHeader gWildMonHeaders[] = .fishingMonsInfo = NULL, }, { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RS_B1F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RS_B1F), + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP1), .landMonsInfo = &gCaveOfOrigin_UnusedRubySapphireMap1_LandMonsInfo, .waterMonsInfo = NULL, .rockSmashMonsInfo = NULL, .fishingMonsInfo = NULL, }, { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RS_B2F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RS_B2F), + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2), .landMonsInfo = &gCaveOfOrigin_UnusedRubySapphireMap2_LandMonsInfo, .waterMonsInfo = NULL, .rockSmashMonsInfo = NULL, .fishingMonsInfo = NULL, }, { - .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RS_B3F), - .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RS_B3F), + .mapGroup = MAP_GROUP(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3), + .mapNum = MAP_NUM(CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3), .landMonsInfo = &gCaveOfOrigin_UnusedRubySapphireMap3_LandMonsInfo, .waterMonsInfo = NULL, .rockSmashMonsInfo = NULL, @@ -3861,8 +3861,8 @@ const struct WildPokemonHeader gWildMonHeaders[] = .fishingMonsInfo = &gSafariZone_Southwest_FishingMonsInfo, }, { - .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHEAST), - .mapNum = MAP_NUM(SAFARI_ZONE_NORTHEAST), + .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTH), + .mapNum = MAP_NUM(SAFARI_ZONE_NORTH), .landMonsInfo = &gSafariZone_North_LandMonsInfo, .waterMonsInfo = NULL, .rockSmashMonsInfo = &gSafariZone_North_RockSmashMonsInfo, @@ -4053,16 +4053,16 @@ const struct WildPokemonHeader gWildMonHeaders[] = .fishingMonsInfo = NULL, }, { - .mapGroup = MAP_GROUP(SAFARI_ZONE_EM_2), - .mapNum = MAP_NUM(SAFARI_ZONE_EM_2), + .mapGroup = MAP_GROUP(SAFARI_ZONE_SOUTHEAST), + .mapNum = MAP_NUM(SAFARI_ZONE_SOUTHEAST), .landMonsInfo = &gSafariZone_Southeast_LandMonsInfo, .waterMonsInfo = &gSafariZone_Southeast_WaterMonsInfo, .rockSmashMonsInfo = NULL, .fishingMonsInfo = &gSafariZone_Southeast_FishingMonsInfo, }, { - .mapGroup = MAP_GROUP(SAFARI_ZONE_EM_1), - .mapNum = MAP_NUM(SAFARI_ZONE_EM_1), + .mapGroup = MAP_GROUP(SAFARI_ZONE_NORTHEAST), + .mapNum = MAP_NUM(SAFARI_ZONE_NORTHEAST), .landMonsInfo = &gSafariZone_Northeast_LandMonsInfo, .waterMonsInfo = NULL, .rockSmashMonsInfo = &gSafariZone_Northeast_RockSmashMonsInfo, @@ -4613,7 +4613,7 @@ static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section) for (yCur = yMin; yCur <= yMax; yCur++) { - for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++) + for (xCur = 0; xCur < gMapHeader.mapLayout->width; xCur++) { u8 tileBehaviorId = MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7); if (MetatileBehavior_IsSurfableAndNotWaterfall(tileBehaviorId) == TRUE) @@ -4976,7 +4976,7 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]); if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level)) return FALSE; - if (gMapHeader.mapDataId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level)) + if (gMapHeader.mapLayoutId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level)) return FALSE; CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level); @@ -5037,7 +5037,7 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) { u32 ability = GetMonAbility(&gPlayerParty[0]); - if (ability == ABILITY_STENCH && gMapHeader.mapDataId == 0x169) + if (ability == ABILITY_STENCH && gMapHeader.mapLayoutId == 0x169) encounterRate = encounterRate * 3 / 4; else if (ability == ABILITY_STENCH) encounterRate /= 2; @@ -5085,7 +5085,7 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi headerId = GetCurrentMapWildMonHeaderId(); if (headerId == 0xFFFF) // invalid { - if (gMapHeader.mapDataId == 0x166) + if (gMapHeader.mapLayoutId == 0x166) { headerId = GetBattlePikeWildMonHeaderId(); if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) @@ -5100,9 +5100,9 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi BattleSetup_StartBattlePikeWildBattle(); return TRUE; } - if (gMapHeader.mapDataId == 0x169) + if (gMapHeader.mapLayoutId == 0x169) { - headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId; + headerId = gSaveBlock2Ptr->frontier.field_CB2; if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) return FALSE; else if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) @@ -5228,7 +5228,7 @@ bool8 SweetScentWildEncounter(void) headerId = GetCurrentMapWildMonHeaderId(); if (headerId == 0xFFFF) // invalid { - if (gMapHeader.mapDataId == 0x166) + if (gMapHeader.mapLayoutId == 0x166) { headerId = GetBattlePikeWildMonHeaderId(); if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE) @@ -5238,9 +5238,9 @@ bool8 SweetScentWildEncounter(void) BattleSetup_StartBattlePikeWildBattle(); return TRUE; } - if (gMapHeader.mapDataId == 0x169) + if (gMapHeader.mapLayoutId == 0x169) { - headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId; + headerId = gSaveBlock2Ptr->frontier.field_CB2; if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE) return FALSE; |