diff options
Diffstat (limited to 'src/battle_setup.c')
-rw-r--r-- | src/battle_setup.c | 259 |
1 files changed, 108 insertions, 151 deletions
diff --git a/src/battle_setup.c b/src/battle_setup.c index 15b09645f..1c3e8e836 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1,59 +1,32 @@ #include "global.h" +#include "battle_setup.h" +#include "asm.h" +#include "safari_zone.h" +#include "weather.h" +#include "palette.h" +#include "field_player_avatar.h" +#include "rom4.h" #include "battle.h" #include "main.h" #include "species.h" -#include "pokemon.h" #include "songs.h" +#include "sound.h" #include "task.h" -#include "fieldmap.h" #include "string_util.h" #include "rng.h" -#include "flag.h" -#include "var.h" +#include "event_data.h" #include "script.h" #include "field_message_box.h" #include "trainer.h" +#include "starter_choose.h" +#include "metatile_behavior.h" #define NUM_TRAINER_EYE_TRAINERS 56 #define TRAINER_REMATCH_STEPS 255 -extern void prev_quest_postbuffer_cursor_backup_reset(void); -extern void overworld_poison_timer_set(void); -extern void current_map_music_set__default_for_battle(u16); -extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void); -extern void c2_exit_to_overworld_2_switch(void); -extern void npc_set_running_behaviour_etc(struct MapObject *, u8); -extern void c2_whiteout(void); -extern void sub_800E7C4(void); -extern void sub_8081AA4(void); -extern void sub_8081A18(void); -extern void sub_8081C8C(void); -extern void sub_80C824C(void); -extern void sub_8081CEC(void); -extern void sub_8080E44(void); -extern void sub_80821D8(void); -extern void sub_8082228(void); -extern void sub_808260C(void); -extern void sub_8082CB8(void); -extern u8 *sub_80BCCE8(void); -extern void CB2_ChooseStarter(void); -extern void sub_811AABC(u8); -extern u8 sub_811AAE8(void); -extern u8 GetFieldObjectIdByLocalIdAndMap(u8, u8, u8); -extern u8 *sub_8082880(void); -extern u8 sub_803FC58(u16); -extern bool32 FieldPoisonEffectIsRunning(void); -extern bool32 GetSafariZoneFlag(void); -extern void player_bitmagic(void); - -u8 GetWildBattleTransition(void); -u8 GetTrainerBattleTransition(void); -bool32 battle_exit_is_player_defeat(u32 a1); -u8 *sub_808281C(void); -u16 sub_8082C4C(u16 a1); - extern u16 gScriptResult; +// IV + LEVEL + SPECIES struct TrainerPartyMember0 { u16 iv; @@ -61,6 +34,7 @@ struct TrainerPartyMember0 u16 species; }; +// IV + LEVEL + SPECIES + MOVES struct TrainerPartyMember1 { u16 iv; @@ -69,6 +43,7 @@ struct TrainerPartyMember1 u16 moves[4]; }; +// IV + LEVEL + SPECIES + ITEMS struct TrainerPartyMember2 { u16 iv; @@ -77,6 +52,7 @@ struct TrainerPartyMember2 u16 heldItem; }; +// IV + LEVEL + SPECIES + ITEMS + MOVES struct TrainerPartyMember3 { u16 iv; @@ -99,22 +75,6 @@ struct TrainerEyeTrainer u16 mapNum; }; -extern u16 MapGridGetMetatileBehaviorAt(s16, s16); -extern bool8 MetatileBehavior_IsTallGrass(char); -extern bool8 MetatileBehavior_IsLongGrass(char); -extern bool8 MetatileBehavior_IsSandOrDeepSand(char); -extern bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(char); -extern bool8 MetatileBehavior_IsBridge(char); -extern bool8 sub_80574C4(char); -extern bool8 sub_80574D8(char); -extern bool8 sub_8057568(char); -extern u8 TestPlayerAvatarFlags(u8); -extern u8 sub_8057450(u8); -extern u8 GetSav1Weather(void); -extern void PlayNewMapMusic(u16); - -extern u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8); - extern void (*gUnknown_0300485C)(void); extern struct Pokemon gEnemyParty[]; @@ -135,7 +95,7 @@ extern struct TrainerEyeTrainer gTrainerEyeTrainers[]; extern u8 gOtherText_CancelWithTerminator[]; -extern u16 gUnknown_020239F8; +extern u16 gBattleTypeFlags; extern u16 gScriptLastTalked; extern u8 gUnknown_02024D26; extern u16 gBadgeFlags[]; @@ -162,8 +122,6 @@ extern u8 gStringVar4[]; extern u8 gBattleTransitionTable_Wild[][2]; extern u8 gBattleTransitionTable_Trainer[][2]; -void sub_8082188(void); - void task01_battle_start(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -200,123 +158,123 @@ void task_add_01_battle_start(u8 transition, u16 song) void CheckForSafariZoneAndProceed(void) { if (GetSafariZoneFlag()) - sub_8081AA4(); + StartBattle_Safari(); else - sub_8081A18(); + StartBattle_StandardWild(); } -void sub_8081A18(void) +void StartBattle_StandardWild(void) { ScriptContext2_Enable(); - player_bitmagic(); + FreezeMapObjects(); sub_80597F4(); - gMain.field_8 = sub_8081C8C; - gUnknown_020239F8 = 0; + gMain.savedCallback = HandleWildBattleEnd; + gBattleTypeFlags = 0; task_add_01_battle_start(GetWildBattleTransition(), 0); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081A5C(void) +void StartBattle_Roamer(void) { ScriptContext2_Enable(); - player_bitmagic(); + FreezeMapObjects(); sub_80597F4(); - gMain.field_8 = sub_8081C8C; - gUnknown_020239F8 = 1024; + gMain.savedCallback = HandleWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_ROAMER; task_add_01_battle_start(GetWildBattleTransition(), 0); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081AA4(void) +void StartBattle_Safari(void) { ScriptContext2_Enable(); - player_bitmagic(); + FreezeMapObjects(); sub_80597F4(); - gMain.field_8 = sub_80C824C; - gUnknown_020239F8 = 128; + gMain.savedCallback = sub_80C824C; + gBattleTypeFlags = BATTLE_TYPE_SAFARI; task_add_01_battle_start(GetWildBattleTransition(), 0); } void task_add_01_battle_start_with_music_and_stats(void) { task_add_01_battle_start(GetTrainerBattleTransition(), 0); - sav12_xor_increment(7); - sav12_xor_increment(9); + IncrementGameStat(7); + IncrementGameStat(9); } //Initiates battle where Wally catches Ralts -void sub_8081AFC(void) +void StartBattle_WallyTutorial(void) { CreateMaleMon(&gEnemyParty[0], SPECIES_RALTS, 5); ScriptContext2_Enable(); - gMain.field_8 = c2_exit_to_overworld_1_continue_scripts_restart_music; - gUnknown_020239F8 = 512; + gMain.savedCallback = c2_exit_to_overworld_1_continue_scripts_restart_music; + gBattleTypeFlags = BATTLE_TYPE_WALLY_TUTORIAL; task_add_01_battle_start(8, 0); } -void sub_8081B3C(void) +void StartBattle_ScriptedWild(void) { ScriptContext2_Enable(); - gMain.field_8 = sub_8081CEC; - gUnknown_020239F8 = 0; + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = 0; task_add_01_battle_start(GetWildBattleTransition(), 0); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081B78(void) +void StartBattle_SouthernIsland(void) { ScriptContext2_Enable(); - gMain.field_8 = sub_8081CEC; - gUnknown_020239F8 = 0x2000; + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; task_add_01_battle_start(GetWildBattleTransition(), 0); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081BB8(void) +void StartBattle_Rayquaza(void) { ScriptContext2_Enable(); - gMain.field_8 = sub_8081CEC; - gUnknown_020239F8 = 0x2000; + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY; task_add_01_battle_start(0, BGM_BATTLE34); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081BF8(void) +void StartBattle_GroudonKyogre(void) { ScriptContext2_Enable(); - gMain.field_8 = sub_8081CEC; - gUnknown_020239F8 = 12288; + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_KYOGRE_GROUDON; if (gGameVersion == 2) task_add_01_battle_start(0xB, BGM_BATTLE34); // KYOGRE else task_add_01_battle_start(0x6, BGM_BATTLE34); // GROUDON - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081C50(void) +void StartBattle_Regi(void) { ScriptContext2_Enable(); - gMain.field_8 = sub_8081CEC; - gUnknown_020239F8 = 24576; + gMain.savedCallback = HandleScriptedWildBattleEnd; + gBattleTypeFlags = BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI; task_add_01_battle_start(0xA, BGM_BATTLE36); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } -void sub_8081C8C(void) +void HandleWildBattleEnd(void) { CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); ResetOamRange(0, 128); if (battle_exit_is_player_defeat(gUnknown_02024D26) == TRUE) { - SetMainCallback2(c2_whiteout); + SetMainCallback2(CB2_WhiteOut); } else { @@ -325,18 +283,18 @@ void sub_8081C8C(void) } } -void sub_8081CEC(void) +void HandleScriptedWildBattleEnd(void) { CpuFill16(0, (void *)BG_PLTT, BG_PLTT_SIZE); ResetOamRange(0, 128); if (battle_exit_is_player_defeat(gUnknown_02024D26) == TRUE) - SetMainCallback2(c2_whiteout); + SetMainCallback2(CB2_WhiteOut); else SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); } -s8 sub_8081D3C(void) +s8 GetBattleTerrain(void) { u16 tileBehavior; s16 x, y; @@ -350,24 +308,24 @@ s8 sub_8081D3C(void) return 1; if (MetatileBehavior_IsSandOrDeepSand(tileBehavior)) return 2; - switch (gMapHeader.light) + switch (gMapHeader.mapType) { - case 1: - case 2: - case 3: + case MAP_TYPE_TOWN: + case MAP_TYPE_CITY: + case MAP_TYPE_ROUTE: break; - case 4: + case MAP_TYPE_UNDERGROUND: if (sub_80574C4(tileBehavior)) return 8; if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) return 5; return 7; - case 8: - case 9: + case MAP_TYPE_INDOOR: + case MAP_TYPE_SECRET_BASE: return 8; - case 5: + case MAP_TYPE_UNDERWATER: return 3; - case 6: + case MAP_TYPE_6: if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) return 4; return 9; @@ -378,7 +336,7 @@ s8 sub_8081D3C(void) return 5; if (sub_80574D8(tileBehavior)) return 6; - if (TestPlayerAvatarFlags(8)) + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { if (sub_8057450(tileBehavior)) return 5; @@ -392,7 +350,7 @@ s8 sub_8081D3C(void) return 9; } -s8 sub_8081E90(void) +s8 GetBattleTransitionTypeByMap(void) { u8 flashUsed; u16 tileBehavior; @@ -408,11 +366,11 @@ s8 sub_8081E90(void) if (!MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior)) { - switch (gMapHeader.light) + switch (gMapHeader.mapType) { - case 4: + case MAP_TYPE_UNDERGROUND: return 1; - case 5: + case MAP_TYPE_UNDERWATER: return 3; default: return 0; @@ -430,7 +388,7 @@ u16 GetSumOfPartyMonLevel(u8 numMons) { u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2); - if (species != 412 && species != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) + if (species != SPECIES_EGG && species != SPECIES_NONE && GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0) { sum += GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); numMons--; @@ -482,7 +440,7 @@ u8 GetSumOfEnemyPartyLevel(u16 trainerNum, u8 numMons) u8 GetWildBattleTransition(void) { - u8 flashVar = sub_8081E90(); + u8 flashVar = GetBattleTransitionTypeByMap(); u8 level = GetMonData(&gEnemyParty[0], MON_DATA_LEVEL); if (level < (u8)GetSumOfPartyMonLevel(1)) // is wild mon level than the player's mon level? @@ -494,8 +452,7 @@ u8 GetWildBattleTransition(void) u8 GetTrainerBattleTransition(void) { struct Trainer *trainer; - u8 trainerClass; - u8 partyCount; + u8 minPartyCount; u8 flashVar; u8 level; @@ -521,14 +478,14 @@ u8 GetTrainerBattleTransition(void) return 16; if (trainer[gTrainerBattleOpponent].doubleBattle == TRUE) - partyCount = 2; // double battles always at least have 2 pokemon. + minPartyCount = 2; // double battles always at least have 2 pokemon. else - partyCount = 1; + minPartyCount = 1; - flashVar = sub_8081E90(); - level = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, partyCount); + flashVar = GetBattleTransitionTypeByMap(); + level = GetSumOfEnemyPartyLevel(gTrainerBattleOpponent, minPartyCount); - if (level < (u8)GetSumOfPartyMonLevel(partyCount)) // is wild mon level than the player's mon level? + if (level < (u8)GetSumOfPartyMonLevel(minPartyCount)) // is wild mon level than the player's mon level? return gBattleTransitionTable_Trainer[flashVar][0]; else return gBattleTransitionTable_Trainer[flashVar][1]; @@ -544,13 +501,13 @@ u8 GetBattleTowerBattleTransition(void) return 3; } -void sub_8082168(void) +void ChooseStarter(void) { SetMainCallback2(CB2_ChooseStarter); - gMain.field_8 = sub_8082188; + gMain.savedCallback = CB2_GiveStarter; } -void sub_8082188(void) +void CB2_GiveStarter(void) { u16 starterPoke; @@ -559,28 +516,28 @@ void sub_8082188(void) ScriptGiveMon(starterPoke, 5, 0, 0, 0, 0); ResetTasks(); sub_80408BC(); - SetMainCallback2(sub_80821D8); + SetMainCallback2(CB2_StartFirstBattle); sub_811AAD8(0); } -void sub_80821D8(void) +void CB2_StartFirstBattle(void) { UpdatePaletteFade(); RunTasks(); if (sub_811AAE8() == TRUE) { - gUnknown_020239F8 = 16; - gMain.field_8 = sub_8082228; + gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE; + gMain.savedCallback = HandleFirstBattleEnd; SetMainCallback2(sub_800E7C4); prev_quest_postbuffer_cursor_backup_reset(); overworld_poison_timer_set(); - sav12_xor_increment(7); - sav12_xor_increment(8); + IncrementGameStat(7); + IncrementGameStat(8); } } -void sub_8082228(void) +void HandleFirstBattleEnd(void) { sav1_reset_battle_music_maybe(); SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); @@ -730,7 +687,7 @@ void TrainerWantsBattle(u8 trainerMapObjId, u8 *trainerScript) ScriptContext2_Enable(); } -u8 GetTrainerFlagFromScriptPointer(u8 *data) +bool32 GetTrainerFlagFromScriptPointer(u8 *data) { u32 flag = TrainerBattleLoadArg16(data + 2); return FlagGet(TRAINER_FLAG_START + flag); @@ -780,8 +737,8 @@ void trainer_flag_clear(u16 flag) void sub_80825E4(void) { - gUnknown_020239F8 = 8; - gMain.field_8 = sub_808260C; + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gMain.savedCallback = sub_808260C; task_add_01_battle_start_with_music_and_stats(); ScriptContext1_Stop(); } @@ -794,7 +751,7 @@ void sub_808260C(void) } else if (battle_exit_is_player_defeat(gUnknown_02024D26) == TRUE) { - SetMainCallback2(c2_whiteout); + SetMainCallback2(CB2_WhiteOut); } else { @@ -811,7 +768,7 @@ void do_choose_name_or_words_screen(void) } else if (battle_exit_is_player_defeat(gUnknown_02024D26) == TRUE) { - SetMainCallback2(c2_whiteout); + SetMainCallback2(CB2_WhiteOut); } else { @@ -823,8 +780,8 @@ void do_choose_name_or_words_screen(void) void sub_80826B0(void) { - gUnknown_020239F8 = 8; - gMain.field_8 = do_choose_name_or_words_screen; + gBattleTypeFlags = BATTLE_TYPE_TRAINER; + gMain.savedCallback = do_choose_name_or_words_screen; task_add_01_battle_start_with_music_and_stats(); ScriptContext1_Stop(); } |