diff options
author | Diegoisawesome <Diegoisawesome@users.noreply.github.com> | 2019-01-14 14:18:29 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-14 14:18:29 -0600 |
commit | b4b4fb951a588dd50b4589efea11d1a17fd88342 (patch) | |
tree | 8bce21f083717e8b39df833136fdab956673001b /src | |
parent | e13895e58ab38c8adbde1e572068692e8ee5ee35 (diff) | |
parent | 87763d133fadac8270dab0cba3d964a47b5b0dd2 (diff) |
Merge pull request #519 from DizzyEggg/trainer_hill
Trainer Hill
Diffstat (limited to 'src')
-rw-r--r-- | src/apprentice.c | 4 | ||||
-rw-r--r-- | src/battle_anim.c | 8 | ||||
-rw-r--r-- | src/battle_dome.c | 2 | ||||
-rw-r--r-- | src/battle_factory.c | 4 | ||||
-rw-r--r-- | src/battle_main.c | 4 | ||||
-rw-r--r-- | src/battle_message.c | 5 | ||||
-rw-r--r-- | src/battle_pike.c | 2 | ||||
-rw-r--r-- | src/battle_pyramid.c | 2 | ||||
-rw-r--r-- | src/battle_script_commands.c | 2 | ||||
-rw-r--r-- | src/battle_setup.c | 26 | ||||
-rw-r--r-- | src/battle_tower.c | 12 | ||||
-rw-r--r-- | src/battle_util2.c | 8 | ||||
-rw-r--r-- | src/event_object_movement.c | 1 | ||||
-rw-r--r-- | src/field_control_avatar.c | 1 | ||||
-rw-r--r-- | src/field_poison.c | 1 | ||||
-rw-r--r-- | src/fieldmap.c | 1 | ||||
-rw-r--r-- | src/frontier_util.c | 2 | ||||
-rw-r--r-- | src/link_rfu.c | 2 | ||||
-rw-r--r-- | src/load_save.c | 3 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/new_game.c | 4 | ||||
-rw-r--r-- | src/overworld.c | 6 | ||||
-rwxr-xr-x | src/party_menu.c | 10 | ||||
-rw-r--r-- | src/pokedex.c | 8 | ||||
-rw-r--r-- | src/pokemon.c | 9 | ||||
-rw-r--r-- | src/recorded_battle.c | 4 | ||||
-rw-r--r-- | src/rom_8034C54.c | 2 | ||||
-rw-r--r-- | src/save.c | 9 | ||||
-rw-r--r-- | src/script_menu.c | 10 | ||||
-rw-r--r-- | src/strings.c | 22 | ||||
-rw-r--r-- | src/trainer_hill.c | 1121 | ||||
-rw-r--r-- | src/trainer_pokemon_sprites.c | 4 | ||||
-rw-r--r-- | src/trainer_see.c | 6 |
33 files changed, 1204 insertions, 103 deletions
diff --git a/src/apprentice.c b/src/apprentice.c index 5d636d05d..9cf8cd4b4 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -1080,7 +1080,7 @@ void ResetApprenticeStruct(struct Apprentice *apprentice) u8 i; for (i = 0; i < 6; i++) - apprentice->easyChatWords[i] |= 0xFFFF; + apprentice->easyChatWords[i] = 0xFFFF; apprentice->playerName[0] = EOS; apprentice->id = 16; @@ -1094,7 +1094,7 @@ void ResetAllApprenticeData(void) for (i = 0; i < 4; i++) { for (j = 0; j < 6; j++) - gSaveBlock2Ptr->apprentices[i].easyChatWords[j] |= 0xFFFF; + gSaveBlock2Ptr->apprentices[i].easyChatWords[j] = 0xFFFF; gSaveBlock2Ptr->apprentices[i].id = 16; gSaveBlock2Ptr->apprentices[i].playerName[0] = EOS; gSaveBlock2Ptr->apprentices[i].lvlMode = 0; diff --git a/src/battle_anim.c b/src/battle_anim.c index 7dd1526dd..1f4831c54 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1450,7 +1450,7 @@ void ClearBattleAnimationVars(void) // Clear index array. for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - sAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] = 0xFFFF; // Clear anim args. for (i = 0; i < ANIM_ARGS_COUNT; i++) @@ -1511,7 +1511,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo gAnimScriptCallback = RunAnimScriptCommand; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - sAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] = 0xFFFF; if (isMoveAnim) { @@ -1572,7 +1572,7 @@ static void ClearSpriteIndex(u16 index) { if (sAnimSpriteIndexArray[i] == index) { - sAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] = 0xFFFF; return; } } @@ -1779,7 +1779,7 @@ static void ScriptCmd_end(void) { FreeSpriteTilesByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); FreeSpritePaletteByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); - sAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. + sAnimSpriteIndexArray[i] = 0xFFFF; // set terminator. } } diff --git a/src/battle_dome.c b/src/battle_dome.c index efc69313e..b9e27675b 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -3548,7 +3548,7 @@ static void sub_8190400(u8 taskId) SetVBlankCallback(VblankCb0_BattleDome); sBattleDomeStruct = AllocZeroed(sizeof(*sBattleDomeStruct)); for (i = 0; i < DOME_TOURNAMENT_TRAINERS_COUNT; i++) - sBattleDomeStruct->arr[i] |= 0xFF; + sBattleDomeStruct->arr[i] = 0xFF; LoadMonIconPalettes(); i = CreateTask(sub_8190CD4, 0); gTasks[i].data[0] = 0; diff --git a/src/battle_factory.c b/src/battle_factory.c index 0445d5dea..5793c78e9 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -198,9 +198,9 @@ static void sub_81A5E94(void) gUnknown_03001288 = FALSE; for (i = 0; i < 6; i++) - gSaveBlock2Ptr->frontier.field_E70[i].monId |= 0xFFFF; + gSaveBlock2Ptr->frontier.field_E70[i].monId = 0xFFFF; for (i = 0; i < 3; i++) - gUnknown_03006298[i] |= 0xFFFF; + gUnknown_03006298[i] = 0xFFFF; SetDynamicWarp(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1); gTrainerBattleOpponent_A = 0; diff --git a/src/battle_main.c b/src/battle_main.c index 4e2a87beb..1aeaa25ca 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5862,7 +5862,7 @@ static void HandleAction_NothingIsFainted(void) | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT - | HITMARKER_x8000000 | HITMARKER_x4000000); + | HITMARKER_CHARGING | HITMARKER_x4000000); } static void HandleAction_ActionFinished(void) @@ -5875,7 +5875,7 @@ static void HandleAction_ActionFinished(void) | HITMARKER_NO_PPDEDUCT | HITMARKER_IGNORE_SAFEGUARD | HITMARKER_IGNORE_ON_AIR | HITMARKER_IGNORE_UNDERGROUND | HITMARKER_IGNORE_UNDERWATER | HITMARKER_x100000 | HITMARKER_OBEYS | HITMARKER_x10 | HITMARKER_SYNCHRONISE_EFFECT - | HITMARKER_x8000000 | HITMARKER_x4000000); + | HITMARKER_CHARGING | HITMARKER_x4000000); gCurrentMove = 0; gBattleMoveDamage = 0; diff --git a/src/battle_message.c b/src/battle_message.c index 112ab9630..7b8085219 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -16,6 +16,7 @@ #include "string_util.h" #include "strings.h" #include "text.h" +#include "trainer_hill.h" #include "window.h" #include "constants/battle_string_ids.h" #include "constants/items.h" @@ -41,10 +42,6 @@ extern u8 gUnknown_0203C7B4; extern const u8 gTrainerClassNames[][13]; extern const u16 gUnknown_08D85620[]; -extern u8 GetTrainerHillOpponentClass(u16 trainerId); // pokenav -extern void GetTrainerHillTrainerName(u8 *txtPtr, u16 trainerId); // pokenav -extern void CopyTrainerHillTrainerText(u8 arg0, u16 trainerId); // pokenav - // this file's functions static void ChooseMoveUsedParticle(u8 *textPtr); static void ChooseTypeOfMoveUsedString(u8 *dst); diff --git a/src/battle_pike.c b/src/battle_pike.c index a4b429bd5..c12038efb 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -1446,7 +1446,7 @@ static void sub_81A84B4(void) u8 i; for (i = 0; i < 14; i++) - gSaveBlock2Ptr->frontier.field_CB4[i] |= 0xFFFF; + gSaveBlock2Ptr->frontier.field_CB4[i] = 0xFFFF; } static void sub_81A84EC(void) diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 2f0d35feb..c0ff1ecf5 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1537,7 +1537,7 @@ void sub_81AA1D8(void) u8 var0, var1; for (i = 0; i < 8; i++) - gSaveBlock2Ptr->frontier.field_CB4[i] |= 0xFFFF; + gSaveBlock2Ptr->frontier.field_CB4[i] = 0xFFFF; id = sub_81AA9E4(); sub_81AA33C(&var0, &var1); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 2490d6e13..0995eec45 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8459,7 +8459,7 @@ static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a c || gBattleMoves[move].effect == EFFECT_SEMI_INVULNERABLE || gBattleMoves[move].effect == EFFECT_BIDE) { - if ((gHitMarker & HITMARKER_x8000000)) + if ((gHitMarker & HITMARKER_CHARGING)) return 1; } return 2; diff --git a/src/battle_setup.c b/src/battle_setup.c index 195af0c28..f5e9e3e9e 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -29,6 +29,7 @@ #include "field_message_box.h" #include "sound.h" #include "strings.h" +#include "trainer_hill.h" #include "secret_base.h" #include "string_util.h" #include "overworld.h" @@ -61,18 +62,9 @@ struct TrainerBattleParameter u8 ptrType; }; -extern bool32 InTrainerHill(void); extern void ClearPoisonStepCounter(void); extern void sub_808BCF4(void); extern void sub_80AF6F0(void); -extern u16 sub_81D6180(u8 localId); -extern bool8 GetTrainerHillTrainerFlag(u8 eventObjId); -extern bool8 sub_81D5C18(void); -extern void sub_81D639C(void); -extern void sub_81D6384(void); -extern void sub_81D61E8(void); -extern void sub_80982B8(void); -extern void CopyTrainerHillTrainerText(u8 a0, u16 arg1); // this file's functions static void DoBattlePikeWildBattle(void); @@ -1148,12 +1140,12 @@ const u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data) { TrainerBattleLoadArgs(sOrdinaryBattleParams, data); SetMapVarsToTrainer(); - gTrainerBattleOpponent_A = sub_81D6180(gSpecialVar_LastTalked); + gTrainerBattleOpponent_A = LocalIdToHillTrainerId(gSpecialVar_LastTalked); } else { TrainerBattleLoadArgs(sTrainerBOrdinaryBattleParams, data); - gTrainerBattleOpponent_B = sub_81D6180(gSpecialVar_LastTalked); + gTrainerBattleOpponent_B = LocalIdToHillTrainerId(gSpecialVar_LastTalked); } return EventScript_TryDoNormalTrainerBattle; default: @@ -1215,7 +1207,7 @@ bool8 GetTrainerFlag(void) if (InBattlePyramid()) return GetBattlePyramidTrainerFlag(gSelectedEventObject); else if (InTrainerHill()) - return GetTrainerHillTrainerFlag(gSelectedEventObject); + return GetHillTrainerFlag(gSelectedEventObject); else return FlagGet(GetTrainerAFlag()); } @@ -1281,11 +1273,11 @@ void BattleSetup_StartTrainerBattle(void) gBattleTypeFlags |= BATTLE_TYPE_TRAINER_HILL; if (gNoOfApproachingTrainers == 2) - sub_81D639C(); + FillHillTrainersParties(); else - sub_81D6384(); + FillHillTrainerParty(); - sub_81D61E8(); + SetHillTrainerFlag(); } sNoOfPossibleTrainerRetScripts = gNoOfApproachingTrainers; @@ -1367,9 +1359,9 @@ void ShowTrainerIntroSpeech(void) else if (sub_81D5C18()) { if (gNoOfApproachingTrainers == 0 || gNoOfApproachingTrainers == 1) - CopyTrainerHillTrainerText(2, sub_81D6180(gSpecialVar_LastTalked)); + CopyTrainerHillTrainerText(2, LocalIdToHillTrainerId(gSpecialVar_LastTalked)); else - CopyTrainerHillTrainerText(2, sub_81D6180(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId)); + CopyTrainerHillTrainerText(2, LocalIdToHillTrainerId(gEventObjects[gApproachingTrainers[gApproachingTrainerId].eventObjectId].localId)); sub_80982B8(); } diff --git a/src/battle_tower.c b/src/battle_tower.c index deb5acb2e..088ef7972 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1888,7 +1888,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) else if (trainerId == TRAINER_EREADER) { for (i = firstMonId; i < firstMonId + 3; i++) - sub_806819C(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i - firstMonId]); + CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i - firstMonId]); return; } else if (trainerId == TRAINER_FRONTIER_BRAIN) @@ -1904,7 +1904,7 @@ static void FillTrainerParty(u16 trainerId, u8 firstMonId, u8 monCount) if (gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j].species != 0 && gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j].level <= level) { - sub_8068338(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j], FALSE); + CreateBattleTowerMon2(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.towerRecords[trainerId - TRAINER_RECORD_MIXING_FRIEND].party[j], FALSE); } } return; @@ -2075,7 +2075,7 @@ static void FillFactoryFrontierTrainerParty(u16 trainerId, u8 firstMonId) else if (trainerId == TRAINER_EREADER) { for (i = firstMonId; i < firstMonId + 3; i++) - sub_806819C(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i - firstMonId]); + CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i - firstMonId]); return; } else if (trainerId == TRAINER_FRONTIER_BRAIN) @@ -2276,7 +2276,7 @@ void DoSpecialTrainerBattle(void) case SPECIAL_BATTLE_EREADER: ZeroEnemyPartyMons(); for (i = 0; i < 3; i++) - sub_806819C(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i]); + CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->frontier.ereaderTrainer.party[i]); gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_EREADER_TRAINER; gTrainerBattleOpponent_A = 0; CreateTask(Task_StartBattleAfterTransition, 1); @@ -3258,7 +3258,7 @@ static void FillPartnerParty(u16 trainerId) if (monData.nickname[0] == EXT_CTRL_CODE_BEGIN && monData.nickname[1] == EXT_CTRL_CODE_JPN) trainerName[5] = EOS; } - sub_8068338(&gPlayerParty[3 + i], &monData, TRUE); + CreateBattleTowerMon2(&gPlayerParty[3 + i], &monData, TRUE); SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_NAME, trainerName); j = IsFrontierTrainerFemale(trainerId + TRAINER_RECORD_MIXING_FRIEND); SetMonData(&gPlayerParty[3 + i], MON_DATA_OT_GENDER, &j); @@ -3663,7 +3663,7 @@ static void FillTentTrainerParty_(u16 trainerId, u8 firstMonId, u8 monCount) } } -u8 sub_81660B8(u8 facilityClass) +u8 FacilityClassToGraphicsId(u8 facilityClass) { u8 trainerObjectGfxId; u8 i; diff --git a/src/battle_util2.c b/src/battle_util2.c index 0a0f65b95..9c0d55a57 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -3,21 +3,19 @@ #include "battle_controllers.h" #include "alloc.h" #include "pokemon.h" +#include "trainer_hill.h" #include "party_menu.h" #include "event_data.h" #include "constants/abilities.h" #include "random.h" #include "battle_scripts.h" -extern void sub_81D55D0(void); -extern void sub_81D5694(void); - void AllocateBattleResources(void) { gBattleResources = gBattleResources; // something dumb needed to match if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - sub_81D55D0(); + InitTrainerHillBattleStruct(); gBattleStruct = AllocZeroed(sizeof(*gBattleStruct)); @@ -47,7 +45,7 @@ void AllocateBattleResources(void) void FreeBattleResources(void) { if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_HILL) - sub_81D5694(); + FreeTrainerHillBattleStruct(); if (gBattleResources != NULL) { diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 7cee717bf..6e1bae31e 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -20,6 +20,7 @@ #include "sprite.h" #include "task.h" #include "trainer_see.h" +#include "trainer_hill.h" #include "util.h" #include "constants/event_object_movement_constants.h" #include "constants/event_objects.h" diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 4f6f5acdf..00dce4c7d 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -25,6 +25,7 @@ #include "sound.h" #include "start_menu.h" #include "trainer_see.h" +#include "trainer_hill.h" #include "wild_encounter.h" #include "constants/bg_event_constants.h" #include "constants/event_objects.h" diff --git a/src/field_poison.c b/src/field_poison.c index fac17dea9..89cd02728 100644 --- a/src/field_poison.c +++ b/src/field_poison.c @@ -13,6 +13,7 @@ #include "string_util.h" #include "strings.h" #include "task.h" +#include "trainer_hill.h" #include "constants/species.h" static bool32 IsMonValidSpecies(struct Pokemon *pokemon) diff --git a/src/fieldmap.c b/src/fieldmap.c index d2ff34b1c..f67f61ede 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -11,6 +11,7 @@ #include "pokenav.h" #include "script.h" #include "secret_base.h" +#include "trainer_hill.h" #include "tv.h" #include "constants/rgb.h" diff --git a/src/frontier_util.c b/src/frontier_util.c index 40b1edbe3..742b73858 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -1827,7 +1827,7 @@ void sub_81A3ACC(void) s32 i; for (i = 0; i < 20; i++) - gSaveBlock2Ptr->frontier.field_CB4[i] |= 0xFFFF; + gSaveBlock2Ptr->frontier.field_CB4[i] = 0xFFFF; } static void sub_81A3B00(void) diff --git a/src/link_rfu.c b/src/link_rfu.c index 0f997591f..ebfc802e0 100644 --- a/src/link_rfu.c +++ b/src/link_rfu.c @@ -4524,7 +4524,7 @@ void sub_80115EC(s32 a0) if ((a0 >> i) & 1) { gUnknown_03005000.unk_cea[i] = 0; - gUnknown_03005000.unk_cee[i] |= 0xFF; + gUnknown_03005000.unk_cee[i] = 0xFF; } } } diff --git a/src/load_save.c b/src/load_save.c index a7593d007..0d19c6dae 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -8,13 +8,12 @@ #include "pokemon_storage_system.h" #include "random.h" #include "save_location.h" +#include "trainer_hill.h" #include "gba/flash_internal.h" #include "decoration_inventory.h" static void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey); -extern void* gUnknown_0203CF5C; - extern bool16 IdentifyFlash(void); extern void ApplyNewEncryptionKeyToBerryPowder(u32 key); diff --git a/src/main.c b/src/main.c index c4962286c..61c5e3386 100644 --- a/src/main.c +++ b/src/main.c @@ -22,10 +22,10 @@ #include "text.h" #include "intro.h" #include "main.h" +#include "trainer_hill.h" extern void sub_800B9B8(void); extern u8 gUnknown_03002748; -extern u32 *gUnknown_0203CF5C; static void VBlankIntr(void); static void HBlankIntr(void); diff --git a/src/new_game.c b/src/new_game.c index 1b3fa2b00..158120245 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -17,6 +17,7 @@ #include "easy_chat.h" #include "event_data.h" #include "money.h" +#include "trainer_hill.h" #include "tv.h" #include "coins.h" #include "text.h" @@ -49,7 +50,6 @@ extern void copy_strings_to_sav1(void); extern void InitMatchCallCounters(void); extern void sub_801AFD8(void); extern void sub_800E5AC(void); -extern void sub_81D54BC(void); extern void ResetContestLinkResults(void); extern void ResetPokeJumpResults(void); extern void SetBerryPowder(u32* powder, u32 newValue); @@ -212,7 +212,7 @@ void NewGameInitData(void) InitMatchCallCounters(); sub_801AFD8(); sub_800E5AC(); - sub_81D54BC(); + ResetTrainerHillResults(); ResetContestLinkResults(); } diff --git a/src/overworld.c b/src/overworld.c index 9df69e360..a67b4b68f 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -19,7 +19,6 @@ #include "field_tasks.h" #include "field_weather.h" #include "fieldmap.h" -// #include "fldeff_flash.h" #include "gpu_regs.h" #include "heal_location.h" #include "link.h" @@ -50,6 +49,7 @@ #include "task.h" // #include "tileset_anim.h" #include "time_events.h" +#include "trainer_hill.h" #include "tv.h" #include "scanline_effect.h" #include "wild_encounter.h" @@ -106,7 +106,6 @@ extern void apply_map_tileset2_palette(const struct MapLayout *); extern void copy_map_tileset2_to_vram_2(const struct MapLayout *); extern void RestartWildEncounterImmunitySteps(void); extern void ShowMapNamePopup(void); -extern bool32 InTrainerHill(void); extern bool32 sub_808651C(void); extern bool8 sub_80AF6A4(void); extern bool8 sub_80E909C(void); @@ -129,14 +128,11 @@ extern void WriteFlashScanlineEffectBuffer(u8); extern void sub_81AA2F8(void); extern void InitMatchCallCounters(void); extern void sub_80EDB44(void); -extern void sub_81D64C0(void); extern void InitFieldMessageBox(void); 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); -extern u8 GetCurrentTrainerHillMapId(void); extern bool8 warp0_in_pokecenter(void); extern void ResetAllPicSprites(void); extern void FieldEffectActiveListClear(void); diff --git a/src/party_menu.c b/src/party_menu.c index 241df1c91..a8c98faec 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -1563,7 +1563,7 @@ static void InitPartyMenu(u8 a, u8 b, u8 c, u8 d, u8 e, TaskFunc task, MainCallb for (i = 0; i <= 15; i++) gUnknown_0203CEC4->data[i] = 0; for (i = 0; i < 3; i++) - gUnknown_0203CEC4->unkC[i] |= 0xFF; + gUnknown_0203CEC4->unkC[i] = 0xFF; if (d == 0) gUnknown_0203CEC8.unk9 = 0; @@ -1851,10 +1851,10 @@ static void PartyMenuInitHelperStructs(u8 a) gUnknown_0203CEDC[i].unk0 = &gUnknown_086156C4[1]; gUnknown_0203CEDC[i].unk4 = gUnknown_08615704[a][i]; gUnknown_0203CEDC[i].windowId = i; - gUnknown_0203CEDC[i].unk9 |= 0xFF; - gUnknown_0203CEDC[i].unkA |= 0xFF; - gUnknown_0203CEDC[i].unkB |= 0xFF; - gUnknown_0203CEDC[i].unkC |= 0xFF; + gUnknown_0203CEDC[i].unk9 = 0xFF; + gUnknown_0203CEDC[i].unkA = 0xFF; + gUnknown_0203CEDC[i].unkB = 0xFF; + gUnknown_0203CEDC[i].unkC = 0xFF; } gUnknown_0203CEDC[0].unk0 = &gUnknown_086156C4[0]; if (a == 3) diff --git a/src/pokedex.c b/src/pokedex.c index 755a46821..8c6ed3159 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -1264,7 +1264,7 @@ static void ResetPokedexView(struct PokedexView *pokedexView) for (i = 0; i < NATIONAL_DEX_COUNT; i++) { - pokedexView->pokedexList[i].dexNum |= 0xFFFF; + pokedexView->pokedexList[i].dexNum = 0xFFFF; pokedexView->pokedexList[i].seen = 0; pokedexView->pokedexList[i].owned = 0; } @@ -1281,7 +1281,7 @@ static void ResetPokedexView(struct PokedexView *pokedexView) pokedexView->seenCount = 0; pokedexView->ownCount = 0; for (i = 0; i < 4; i++) - pokedexView->unk61E[i] |= 0xFFFF; + pokedexView->unk61E[i] = 0xFFFF; pokedexView->unk628 = 0; pokedexView->unk62A = 0; pokedexView->unk62C = 0; @@ -2030,7 +2030,7 @@ void sub_80BC8D4(u8 dexMode, u8 sortMode) for (i = sPokedexView->pokemonListCount; i < NATIONAL_DEX_COUNT; i++) { - sPokedexView->pokedexList[i].dexNum |= 0xFFFF; + sPokedexView->pokedexList[i].dexNum = 0xFFFF; sPokedexView->pokedexList[i].seen = FALSE; sPokedexView->pokedexList[i].owned = FALSE; } @@ -2437,7 +2437,7 @@ u8 sub_80BDA40(void) if (sPokedexView->unk61E[i] != 0xFFFF) { FreeAndDestroyMonPicSprite(sPokedexView->unk61E[i]); - sPokedexView->unk61E[i] |= 0xFFFF; + sPokedexView->unk61E[i] = 0xFFFF; } } return FALSE; diff --git a/src/pokemon.c b/src/pokemon.c index 580216b2c..174f7ae66 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -22,7 +22,6 @@ #include "pokemon_animation.h" #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" -#include "pokenav.h" #include "random.h" #include "recorded_battle.h" #include "rtc.h" @@ -31,6 +30,7 @@ #include "strings.h" #include "task.h" #include "text.h" +#include "trainer_hill.h" #include "util.h" #include "constants/abilities.h" #include "constants/battle_frontier.h" @@ -74,7 +74,6 @@ extern const u8 gTrainerClassNames[][13]; extern u16 get_unknown_box_id(void); extern void set_unknown_box_id(u8); extern bool8 sub_806F104(void); -extern u8 sub_81D63C8(u16 trainerOpponentId); // this file's functions static u16 CalculateBoxMonChecksum(struct BoxPokemon *boxMon); @@ -2745,7 +2744,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI CalculateMonStats(mon); } -void sub_806819C(struct Pokemon *mon, struct BattleTowerPokemon *src) +void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) { s32 i; u8 nickname[30]; @@ -2799,7 +2798,7 @@ void sub_806819C(struct Pokemon *mon, struct BattleTowerPokemon *src) CalculateMonStats(mon); } -void sub_8068338(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50) +void CreateBattleTowerMon2(struct Pokemon *mon, struct BattleTowerPokemon *src, bool8 lvl50) { s32 i; u8 nickname[30]; @@ -6083,7 +6082,7 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) if (InBattlePyramid()) return GetTrainerEncounterMusicIdInBattlePyramind(trainerOpponentId); else if (sub_81D5C18()) - return sub_81D63C8(trainerOpponentId); + return GetTrainerEncounterMusicIdInTrainerHill(trainerOpponentId); else return TRAINER_ENCOUNTER_MUSIC(trainerOpponentId); } diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 03823dd45..0dae76f02 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -124,7 +124,7 @@ void sub_8184DA4(u8 arg0) { for (j = 0; j < BATTLER_RECORD_SIZE; j++) { - sBattleRecords[i][j] |= 0xFF; + sBattleRecords[i][j] = 0xFF; } sBattleFlags = gBattleTypeFlags; sAI_Scripts = gBattleResources->ai->aiFlags; @@ -206,7 +206,7 @@ void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear) for (i = 0; i < bytesToClear; i++) { sRecordedBytesNo[battlerId]--; - sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] |= 0xFF; + sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] = 0xFF; if (sRecordedBytesNo[battlerId] == 0) break; } diff --git a/src/rom_8034C54.c b/src/rom_8034C54.c index cc875bd3f..a3707017e 100644 --- a/src/rom_8034C54.c +++ b/src/rom_8034C54.c @@ -82,7 +82,7 @@ bool32 sub_8034C54(u32 count) for (i = 0; i < count; i++) { gUnknown_02022E10->array[i].isActive = FALSE; - gUnknown_02022E10->array[i].firstOamId |= 0xFF; + gUnknown_02022E10->array[i].firstOamId = 0xFF; } return TRUE; diff --git a/src/save.c b/src/save.c index cfbe5b848..a22e20f0b 100644 --- a/src/save.c +++ b/src/save.c @@ -7,6 +7,7 @@ #include "overworld.h" #include "pokemon_storage_system.h" #include "main.h" +#include "trainer_hill.h" #include "constants/game_stat.h" static u16 CalculateChecksum(void *data, u16 size); @@ -17,10 +18,6 @@ static u8 ClearSaveData_2(u16 a1, const struct SaveSectionLocation *location); static u8 TryWriteSector(u8 sector, u8 *data); static u8 HandleWriteSector(u16 a1, const struct SaveSectionLocation *location); -// for the chunk declarations - -extern u32 gUnknown_0203CF5C; - // Divide save blocks into individual chunks to be written to flash sectors // Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer @@ -662,10 +659,10 @@ static void UpdateSaveAddresses(void) u8 HandleSavingData(u8 saveType) { u8 i; - u32 backupVar = gUnknown_0203CF5C; + u32 *backupVar = gUnknown_0203CF5C; u8 *tempAddr; - gUnknown_0203CF5C = 0; + gUnknown_0203CF5C = NULL; UpdateSaveAddresses(); switch (saveType) { diff --git a/src/script_menu.c b/src/script_menu.c index d415d65a9..a4f4c6086 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -782,10 +782,10 @@ const struct MenuAction MultichoiceList_112[] = const struct MenuAction MultichoiceList_113[] = { - {gUnknown_085EB32D, NULL}, - {gUnknown_085EB33E, NULL}, - {gUnknown_085EB350, NULL}, - {gUnknown_085EB361, NULL}, + {gText_NormalTagMatch, NULL}, + {gText_VarietyTagMatch, NULL}, + {gText_UniqueTagMatch, NULL}, + {gText_ExpertTagMatch, NULL}, {gText_Exit, NULL}, }; @@ -1407,7 +1407,7 @@ static void sub_80E2578(void) for (i = 0; i < ARRAY_COUNT(gUnknown_03001124); i++) { - gUnknown_03001124[i] |= 0xFF; + gUnknown_03001124[i] = 0xFF; } GetFontAttribute(1, FONTATTR_MAX_LETTER_WIDTH); diff --git a/src/strings.c b/src/strings.c index 7b2b5ca4c..b0eb048ba 100644 --- a/src/strings.c +++ b/src/strings.c @@ -252,7 +252,7 @@ const u8 gText_ThePokemonList[] = _("the POKéMON LIST"); const u8 gText_TheShop[] = _("the shop"); const u8 gText_ThePC[] = _("the PC"); -const u8 *const gReturnToXStringsTable[] = +const u8 *const gReturnToXStringsTable[] = { gText_TheField, gText_TheBattle, @@ -268,7 +268,7 @@ const u8 *const gReturnToXStringsTable[] = gText_ThePC }; -const u8 *const gReturnToXStringsTable2[] = +const u8 *const gReturnToXStringsTable2[] = { gText_TheField, gText_TheBattle, @@ -283,7 +283,7 @@ const u8 gText_TMHMPocket[] = _("TMs & HMs"); const u8 gText_BerriesPocket[] = _("BERRIES"); const u8 gText_KeyItemsPocket[] = _("KEY ITEMS"); -const u8 *const gPocketNamesStringsTable[] = +const u8 *const gPocketNamesStringsTable[] = { gText_ItemsPocket, gText_PokeBallsPocket, @@ -749,10 +749,10 @@ 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 gText_NormalTagMatch[] = _("NORMAL TAG MATCH"); +const u8 gText_VarietyTagMatch[] = _("VARIETY TAG MATCH"); +const u8 gText_UniqueTagMatch[] = _("UNIQUE TAG MATCH"); +const u8 gText_ExpertTagMatch[] = _("EXPERT TAG MATCH"); const u8 gUnknown_085EB372[] = _("TRADE CENTER"); const u8 gUnknown_085EB37F[] = _("COLOSSEUM"); const u8 gUnknown_085EB389[] = _("RECORD CORNER"); @@ -1737,10 +1737,10 @@ 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_TrainerHill1F[] = _("1F"); +const u8 gText_TrainerHill2F[] = _("2F"); +const u8 gText_TrainerHill3F[] = _("3F"); +const u8 gText_TrainerHill4F[] = _("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}!"); diff --git a/src/trainer_hill.c b/src/trainer_hill.c new file mode 100644 index 000000000..7ec6865fd --- /dev/null +++ b/src/trainer_hill.c @@ -0,0 +1,1121 @@ +#include "global.h" +#include "alloc.h" +#include "battle.h" +#include "battle_tower.h" +#include "battle_setup.h" +#include "event_data.h" +#include "event_scripts.h" +#include "fieldmap.h" +#include "field_message_box.h" +#include "international_string_util.h" +#include "item.h" +#include "main.h" +#include "menu.h" +#include "overworld.h" +#include "palette.h" +#include "pokemon.h" +#include "script.h" +#include "string_util.h" +#include "strings.h" +#include "text.h" +#include "trainer_hill.h" +#include "window.h" +#include "util.h" +#include "constants/event_object_movement_constants.h" +#include "constants/event_objects.h" +#include "constants/items.h" +#include "constants/maps.h" +#include "constants/trainers.h" + +extern bool32 sub_81D3B34(void); + +#define HILL_TAG_NORMAL 0 +#define HILL_TAG_VARIETY 1 +#define HILL_TAG_UNIQUE 2 +#define HILL_TAG_EXPERT 3 + +#define HILL_TRAINER_NAME_LENGTH 11 +#define HILL_MAX_TIME 215999 // 60 * 60 * 60 - 1 + +struct TrHillRoomTrainers +{ + u8 name[2][HILL_TRAINER_NAME_LENGTH]; + u8 facilityClass[2]; +}; + +struct TrainerHillTrainer +{ + u8 name[HILL_TRAINER_NAME_LENGTH]; + u8 facilityClass; + u32 unused; + u16 speechBefore[6]; + u16 speechWin[6]; + u16 speechLose[6]; + u16 speechAfter[6]; + struct BattleTowerPokemon mons[PARTY_SIZE]; +}; + +struct TrHillFloor +{ + u8 unk0; + u8 unk1; + struct TrainerHillTrainer trainers[2]; + u8 data[0x100]; + u16 unk3A0[16]; + u8 coords[2]; // x first 4 bits, y last 4 bits + u8 direction; // array of 4 bits for each trainer + u8 range; // array of 4 bits for each trainer +}; + +struct TrHillTag +{ + u8 unkField_0; + u8 unused1; + u8 unkField_2; + u8 unused3; + u8 unused4; + u8 unused5; + u8 unused6; + struct TrHillFloor floors[4]; +}; + +struct TrHillStruct2 +{ + u8 floorId; + struct TrHillTag tag; +}; + +// EWRAM +static EWRAM_DATA struct TrHillStruct2 *sHillData = NULL; +static EWRAM_DATA struct TrHillRoomTrainers *sRoomTrainers = NULL; +EWRAM_DATA u32 *gUnknown_0203CF5C = NULL; + +// This file's functions. +static void sub_81D581C(void); +static void sub_81D58D8(void); +static void sub_81D5924(void); +static void sub_81D59D0(void); +static void sub_81D5A70(void); +static void sub_81D5AB4(void); +static void sub_81D5AD0(void); +static void sub_81D5B2C(void); +static void sub_81D5BBC(void); +static void sub_81D5C00(void); +static void sub_81D5C5C(void); +static void sub_81D62B4(void); +static void sub_81D64AC(void); +static void sub_81D64DC(void); +static void sub_81D64FC(void); +static void sub_81D6518(void); +static void sub_81D6568(void); +static void sub_81D65A0(void); +static void SetUpDataStruct(void); +static void FreeDataStruct(void); +static void nullsub_2(void); +static void SetTimerValue(u32 *dst, u32 val); +static u32 GetTimerValue(u32 *src); +static void sub_81D642C(struct Pokemon *mon, u8 level); +static u16 sub_81D6640(void); + +// const data +// I will decompile these soon, no worries :) +extern const struct TrHillTag gUnknown_08626814; +extern const struct TrHillTag gUnknown_086276FC; +extern const struct TrHillTag gUnknown_086285E4; +extern const struct TrHillTag gUnknown_086294CC; + +struct +{ + u8 trainerClass; + u8 musicId; +} static const gUnknown_0862A3B4[] = +{ + {TRAINER_CLASS_TEAM_AQUA, TRAINER_ENCOUNTER_MUSIC_AQUA}, + {TRAINER_CLASS_AQUA_ADMIN, TRAINER_ENCOUNTER_MUSIC_AQUA}, + {TRAINER_CLASS_AQUA_LEADER, TRAINER_ENCOUNTER_MUSIC_AQUA}, + {TRAINER_CLASS_AROMA_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_BATTLE_GIRL, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_SWIMMER_F, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_POKEFAN, TRAINER_ENCOUNTER_MUSIC_TWINS}, + {TRAINER_CLASS_DRAGON_TAMER, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_COOLTRAINER, TRAINER_ENCOUNTER_MUSIC_COOL}, + {TRAINER_CLASS_GUITARIST, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_SAILOR, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_TWINS, TRAINER_ENCOUNTER_MUSIC_TWINS}, + {TRAINER_CLASS_INTERVIEWER, TRAINER_ENCOUNTER_MUSIC_INTERVIEWER}, + {TRAINER_CLASS_RUIN_MANIAC, TRAINER_ENCOUNTER_MUSIC_HIKER}, + {TRAINER_CLASS_GENTLEMAN, TRAINER_ENCOUNTER_MUSIC_RICH}, + {TRAINER_CLASS_SWIMMER_M, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_POKEMANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, + {TRAINER_CLASS_BLACK_BELT, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_OLD_COUPLE, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_BUG_MANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, + {TRAINER_CLASS_CAMPER, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_KINDLER, TRAINER_ENCOUNTER_MUSIC_HIKER}, + {TRAINER_CLASS_TEAM_MAGMA, TRAINER_ENCOUNTER_MUSIC_MAGMA}, + {TRAINER_CLASS_MAGMA_ADMIN, TRAINER_ENCOUNTER_MUSIC_MAGMA}, + {TRAINER_CLASS_MAGMA_LEADER, TRAINER_ENCOUNTER_MUSIC_MAGMA}, + {TRAINER_CLASS_LASS, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_BUG_CATCHER, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_NINJA_BOY, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, + {TRAINER_CLASS_RICH_BOY, TRAINER_ENCOUNTER_MUSIC_RICH}, + {TRAINER_CLASS_HEX_MANIAC, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, + {TRAINER_CLASS_BEAUTY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_PARASOL_LADY, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_PICNICKER, TRAINER_ENCOUNTER_MUSIC_GIRL}, + {TRAINER_CLASS_PKMN_BREEDER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_COLLECTOR, TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS}, + {TRAINER_CLASS_PKMN_RANGER, TRAINER_ENCOUNTER_MUSIC_COOL}, + {TRAINER_CLASS_PKMN_TRAINER_3, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_YOUNG_COUPLE, TRAINER_ENCOUNTER_MUSIC_GIRL}, + {TRAINER_CLASS_PSYCHIC, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_SR_AND_JR, TRAINER_ENCOUNTER_MUSIC_TWINS}, + {TRAINER_CLASS_ELITE_FOUR, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_YOUNGSTER, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_EXPERT, TRAINER_ENCOUNTER_MUSIC_INTENSE}, + {TRAINER_CLASS_TRIATHLETE, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_BIRD_KEEPER, TRAINER_ENCOUNTER_MUSIC_COOL}, + {TRAINER_CLASS_FISHERMAN, TRAINER_ENCOUNTER_MUSIC_HIKER}, + {TRAINER_CLASS_CHAMPION, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_TUBER_M, TRAINER_ENCOUNTER_MUSIC_MALE}, + {TRAINER_CLASS_TUBER_F, TRAINER_ENCOUNTER_MUSIC_GIRL}, + {TRAINER_CLASS_SIS_AND_BRO, TRAINER_ENCOUNTER_MUSIC_SWIMMER}, + {TRAINER_CLASS_HIKER, TRAINER_ENCOUNTER_MUSIC_HIKER}, + {TRAINER_CLASS_LEADER, TRAINER_ENCOUNTER_MUSIC_FEMALE}, + {TRAINER_CLASS_SCHOOL_KID, TRAINER_ENCOUNTER_MUSIC_MALE}, +}; + +static const u16 gUnknown_0862A48C[] = {ITEM_RARE_CANDY, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A498[] = {ITEM_LUXURY_BALL, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4A4[] = {ITEM_MAX_REVIVE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4B0[] = {ITEM_MAX_ETHER, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4BC[] = {ITEM_ELIXIR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4C8[] = {ITEM_TM05_ROAR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4D4[] = {ITEM_TM36_SLUDGE_BOMB, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4E0[] = {ITEM_TM06_TOXIC, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4EC[] = {ITEM_TM11_SUNNY_DAY, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A4F8[] = {ITEM_TM26_EARTHQUAKE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A504[] = {ITEM_RARE_CANDY, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A510[] = {ITEM_LUXURY_BALL, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A51C[] = {ITEM_MAX_REVIVE, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A528[] = {ITEM_MAX_ETHER, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A534[] = {ITEM_ELIXIR, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A540[] = {ITEM_TM31_BRICK_BREAK, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A54C[] = {ITEM_TM41_TORMENT, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A558[] = {ITEM_TM48_SKILL_SWAP, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A564[] = {ITEM_TM19_GIGA_DRAIN, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; +static const u16 gUnknown_0862A570[] = {ITEM_TM45_ATTRACT, ITEM_ETHER, ITEM_MAX_POTION, ITEM_REVIVE, ITEM_FLUFFY_TAIL, ITEM_GREAT_BALL}; + +static const u16 *const gUnknown_0862A57C[] = +{ + gUnknown_0862A48C, + gUnknown_0862A498, + gUnknown_0862A4A4, + gUnknown_0862A4B0, + gUnknown_0862A4BC, + gUnknown_0862A4C8, + gUnknown_0862A4D4, + gUnknown_0862A4E0, + gUnknown_0862A4EC, + gUnknown_0862A4F8 +}; + +static const u16 *const gUnknown_0862A5A4[] = +{ + gUnknown_0862A504, + gUnknown_0862A510, + gUnknown_0862A51C, + gUnknown_0862A528, + gUnknown_0862A534, + gUnknown_0862A540, + gUnknown_0862A54C, + gUnknown_0862A558, + gUnknown_0862A564, + gUnknown_0862A570 +}; + +static const u16 *const *const gUnknown_0862A5CC[] = +{ + gUnknown_0862A57C, + gUnknown_0862A5A4 +}; + +static const u16 gUnknown_0862A5D4[] = INCBIN_U16("graphics/pokenav/862A5D4.gbapal"); +static const u8 sRecordWinColors[] = {0, 2, 3}; + +static const struct TrHillTag *const sDataPerTag[] = +{ + &gUnknown_08626814, + &gUnknown_086276FC, + &gUnknown_086285E4, + &gUnknown_086294CC, +}; + +// Unused. +static const u8 *const sFloorStrings[] = +{ + gText_TrainerHill1F, + gText_TrainerHill2F, + gText_TrainerHill3F, + gText_TrainerHill4F, +}; + +static void (* const sHillFunctions[])(void) = +{ + sub_81D581C, + sub_81D58D8, + sub_81D5924, + sub_81D59D0, + sub_81D5A70, + sub_81D5AB4, + sub_81D5AD0, + sub_81D5B2C, + sub_81D5BBC, + sub_81D5C00, + sub_81D5C5C, + sub_81D62B4, + sub_81D64AC, + sub_81D64DC, + sub_81D64FC, + sub_81D6518, + sub_81D6568, + sub_81D65A0, +}; + +static const u8 *const sTagMatchStrings[] = +{ + gText_NormalTagMatch, + gText_VarietyTagMatch, + gText_UniqueTagMatch, + gText_ExpertTagMatch, +}; + +static const struct EventObjectTemplate gUnknown_0862A670 = +{ + .graphicsId = EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL, + .elevation = 3, + .movementType = MOVEMENT_TYPE_LOOK_AROUND, + .movementRangeX = 1, + .movementRangeY = 1, + .trainerType = 1, +}; + +static const u32 gUnknown_0862A688[] = {MAP_NUM(TRAINER_HILL_2F), MAP_NUM(TRAINER_HILL_3F), MAP_NUM(TRAINER_HILL_4F), MAP_NUM(TRAINER_HILL_ROOF)}; +static const u8 gUnknown_0862A698[][3] = {{0, 1, 2}, {3, 4, 5}}; + +// code +void CallTrainerHillFunction(void) +{ + SetUpDataStruct(); + sHillFunctions[gSpecialVar_0x8004](); + FreeDataStruct(); +} + +void ResetTrainerHillResults(void) +{ + s32 i; + + gSaveBlock2Ptr->frontier.field_EF9_1 = 0; + gSaveBlock2Ptr->frontier.field_EF9_0 = 0; + gSaveBlock1Ptr->trainerHill.field_3D68 = 0; + for (i = 0; i < 4; i++) + SetTimerValue(&gSaveBlock1Ptr->trainerHillTimes[i], HILL_MAX_TIME); +} + +static u8 GetFloorId(void) +{ + return gMapHeader.mapLayoutId - 159; +} + +u8 GetTrainerHillOpponentClass(u16 trainerId) +{ + u8 id = trainerId - 1; + + return gFacilityClassToTrainerClass[sRoomTrainers->facilityClass[id]]; +} + +void GetTrainerHillTrainerName(u8 *dst, u16 trainerId) +{ + s32 i; + u8 id = trainerId - 1; + + for (i = 0; i < HILL_TRAINER_NAME_LENGTH; i++) + dst[i] = sRoomTrainers->name[id][i]; +} + +u8 GetTrainerHillTrainerFrontSpriteId(u16 trainerId) +{ + u8 id, facilityClass; + + SetUpDataStruct(); + id = trainerId - 1; + facilityClass = sHillData->tag.floors[sHillData->floorId].trainers[id].facilityClass; + FreeDataStruct(); + + return gFacilityClassToPicIndex[facilityClass]; +} + +void InitTrainerHillBattleStruct(void) +{ + s32 i, j; + + SetUpDataStruct(); + sRoomTrainers = AllocZeroed(sizeof(*sRoomTrainers)); + + for (i = 0; i < 2; i++) + { + for (j = 0; j < HILL_TRAINER_NAME_LENGTH; j++) + { + sRoomTrainers->name[i][j] = sHillData->tag.floors[sHillData->floorId].trainers[i].name[j]; + } + sRoomTrainers->facilityClass[i] = sHillData->tag.floors[sHillData->floorId].trainers[i].facilityClass; + } + sub_80008DC(&gSaveBlock1Ptr->trainerHill.field_3D64); + FreeDataStruct(); +} + +void FreeTrainerHillBattleStruct(void) +{ + if (sRoomTrainers != NULL) + FREE_AND_SET_NULL(sRoomTrainers); +} + +static void SetUpDataStruct(void) +{ + if (sHillData == NULL) + { + sHillData = AllocZeroed(sizeof(*sHillData)); + sHillData->floorId = gMapHeader.mapLayoutId - 159; + CpuCopy32(sDataPerTag[gSaveBlock1Ptr->trainerHill.tag], &sHillData->tag, sizeof(sHillData->tag)); + nullsub_2(); + } +} + +static void FreeDataStruct(void) +{ + if (sHillData != NULL) + FREE_AND_SET_NULL(sHillData); +} + +void CopyTrainerHillTrainerText(u8 which, u16 trainerId) +{ + u8 id, floorId; + + SetUpDataStruct(); + floorId = GetFloorId(); + id = trainerId - 1; + + switch (which) + { + case 2: + FrontierSpeechToString(sHillData->tag.floors[floorId].trainers[id].speechBefore); + break; + case 3: + FrontierSpeechToString(sHillData->tag.floors[floorId].trainers[id].speechWin); + break; + case 4: + FrontierSpeechToString(sHillData->tag.floors[floorId].trainers[id].speechLose); + break; + case 5: + FrontierSpeechToString(sHillData->tag.floors[floorId].trainers[id].speechAfter); + break; + } + + FreeDataStruct(); +} + +static void sub_81D581C(void) +{ + nullsub_2(); + if (!sub_81D3B34()) + gSaveBlock1Ptr->trainerHill.field_3D6E_0f = 1; + else + gSaveBlock1Ptr->trainerHill.field_3D6E_0f = 0; + + gSaveBlock1Ptr->trainerHill.field_3D6C = 0; + sub_80008DC(&gSaveBlock1Ptr->trainerHill.field_3D64); + gSaveBlock1Ptr->trainerHill.field_3D64 = 0; + gSaveBlock1Ptr->trainerHill.field_3D6E_0c = 0; + gSaveBlock1Ptr->trainerHill.field_3D6E_0b = 0; + gSaveBlock1Ptr->trainerHill.field_3D6E_0e = 0; + gSaveBlock2Ptr->frontier.field_EE0 = 0; + gBattleOutcome = 0; + gSaveBlock1Ptr->trainerHill.field_3D6E_0a = 0; +} + +static void sub_81D58D8(void) +{ + sub_80008E8(); + gSpecialVar_Result = 0; + if (gSaveBlock1Ptr->trainerHill.field_3D6E_0c) + gSpecialVar_Result++; + if (gSaveBlock1Ptr->trainerHill.field_3D6E_0a && gSaveBlock1Ptr->trainerHill.field_3D6E_0b) + gSpecialVar_Result++; + + gSaveBlock1Ptr->trainerHill.field_3D6E_0c = 1; +} + +static void sub_81D5924(void) +{ + u16 itemId = sub_81D6640(); + + if (sHillData->tag.unkField_2 != 4 || gSaveBlock1Ptr->trainerHill.field_3D6E_0a) + { + gSpecialVar_Result = 2; + } + else if (AddBagItem(itemId, 1) == TRUE) + { + CopyItemName(itemId, gStringVar2); + gSaveBlock1Ptr->trainerHill.field_3D6E_0a = 1; + gSaveBlock2Ptr->frontier.field_EF9_0 = 0; + gSpecialVar_Result = 0; + } + else + { + gSpecialVar_Result = 1; + } +} + +static void sub_81D59D0(void) +{ + if (gSaveBlock1Ptr->trainerHill.field_3D6E_0b) + { + gSpecialVar_Result = 2; + } + else if (GetTimerValue(&gSaveBlock1Ptr->trainerHill.field_3D68) > gSaveBlock1Ptr->trainerHill.field_3D64) + { + SetTimerValue(&gSaveBlock1Ptr->trainerHill.field_3D68, gSaveBlock1Ptr->trainerHill.field_3D64); + gSaveBlock1Ptr->trainerHillTimes[gSaveBlock1Ptr->trainerHill.tag] = gSaveBlock1Ptr->trainerHill.field_3D68; + gSpecialVar_Result = 0; + } + else + { + gSpecialVar_Result = 1; + } + + gSaveBlock1Ptr->trainerHill.field_3D6E_0b = 1; +} + +static void sub_81D5A70(void) +{ + if (!gSaveBlock1Ptr->trainerHill.field_3D6E_0c) + { + if (gSaveBlock1Ptr->trainerHill.field_3D64 >= HILL_MAX_TIME) + gSaveBlock1Ptr->trainerHill.field_3D64 = HILL_MAX_TIME; + else + sub_80008DC(&gSaveBlock1Ptr->trainerHill.field_3D64); + } +} + +static void sub_81D5AB4(void) +{ + gSaveBlock1Ptr->trainerHill.field_3D6E_0d = 1; +} + +static void sub_81D5AD0(void) +{ + if (gSaveBlock1Ptr->trainerHill.field_3D6E_0d) + { + gSaveBlock1Ptr->trainerHill.field_3D6E_0d = 0; + gSpecialVar_Result = 0; + } + else if (gSaveBlock1Ptr->trainerHill.field_3D6E_0e) + { + gSaveBlock1Ptr->trainerHill.field_3D6E_0e = 0; + gSpecialVar_Result = 1; + } + else + { + gSpecialVar_Result = 2; + } +} + +static void sub_81D5B2C(void) +{ + s32 total, minutes, secondsWhole, secondsFraction; + + total = gSaveBlock1Ptr->trainerHill.field_3D64; + if (total >= HILL_MAX_TIME) + total = HILL_MAX_TIME; + + minutes = total / (60 * 60); + total %= (60 * 60); + secondsWhole = total / 60; + total %= 60; + secondsFraction = (total * 168) / 100; + + ConvertIntToDecimalStringN(gStringVar1, minutes, STR_CONV_MODE_RIGHT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar2, secondsWhole, STR_CONV_MODE_RIGHT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar3, secondsFraction, STR_CONV_MODE_LEADING_ZEROS, 2); +} + +static void sub_81D5BBC(void) +{ + SetUpDataStruct(); + if (sHillData->tag.unkField_2 != 4) + { + ConvertIntToDecimalStringN(gStringVar1, sHillData->tag.unkField_2, STR_CONV_MODE_LEFT_ALIGN, 1); + gSpecialVar_Result = 0; + } + else + { + gSpecialVar_Result = 1; + } + + FreeDataStruct(); +} + +static void sub_81D5C00(void) +{ + SetUpDataStruct(); + gSpecialVar_Result = 0; + FreeDataStruct(); +} + +bool8 sub_81D5C18(void) +{ + if (VarGet(VAR_0x40D6) == 0) + return FALSE; + else if (gSaveBlock1Ptr->trainerHill.field_3D6E_0c) + return FALSE; + else if (GetCurrentTrainerHillMapId() != 0) + return TRUE; + else + return FALSE; +} + +static void sub_81D5C5C(void) +{ + if (!sub_81D5C18()) + gSpecialVar_Result = 0; + else + gSpecialVar_Result = 1; +} + +void nullsub_129(void) +{ + +} + +static void nullsub_2(void) +{ + +} + +void PrintOnTrainerHillRecordsWindow(void) +{ + s32 i, x, y; + u32 total, minutes, secondsWhole, secondsFraction; + + SetUpDataStruct(); + FillWindowPixelBuffer(0, 0); + x = GetStringCenterAlignXOffset(1, gText_TimeBoard, 0xD0); + AddTextPrinterParameterized3(0, 1, x, 2, sRecordWinColors, TEXT_SPEED_FF, gText_TimeBoard); + + y = 18; + for (i = 0; i < 4; i++) + { + AddTextPrinterParameterized3(0, 1, 0, y, sRecordWinColors, TEXT_SPEED_FF, sTagMatchStrings[i]); + y += 15; + total = GetTimerValue(&gSaveBlock1Ptr->trainerHillTimes[i]); + minutes = total / (60 * 60); + total %= (60 * 60); + ConvertIntToDecimalStringN(gStringVar1, minutes, STR_CONV_MODE_RIGHT_ALIGN, 2); + secondsWhole = total / 60; + total %= 60; + ConvertIntToDecimalStringN(gStringVar2, secondsWhole, STR_CONV_MODE_RIGHT_ALIGN, 2); + secondsFraction = (total * 168) / 100; + ConvertIntToDecimalStringN(gStringVar3, secondsFraction, STR_CONV_MODE_LEADING_ZEROS, 2); + StringExpandPlaceholders(StringCopy(gStringVar4, gText_TimeCleared), gText_XMinYDotZSec); + x = GetStringRightAlignXOffset(1, gStringVar4, 0xD0); + AddTextPrinterParameterized3(0, 1, x, y, sRecordWinColors, TEXT_SPEED_FF, gStringVar4); + y += 17; + } + + PutWindowTilemap(0); + CopyWindowToVram(0, 3); + FreeDataStruct(); +} + +// Leftover from Fire Red / Leaf Green as in these games, +// the timer had to be xored by the encryption key in Sav2. +static u32 GetTimerValue(u32 *src) +{ + return *src; +} + +static void SetTimerValue(u32 *dst, u32 val) +{ + *dst = val; +} + +void sub_81D5DF8(void) +{ + u8 i, floorId; + struct EventObjectTemplate *eventTemplates = gSaveBlock1Ptr->eventObjectTemplates; + + if (!sub_81D5F48()) + return; + + SetUpDataStruct(); + for (i = 0; i < 2; i++) + gSaveBlock2Ptr->frontier.field_CB4[i] = 0xFFFF; + CpuFill32(0, gSaveBlock1Ptr->eventObjectTemplates, sizeof(gSaveBlock1Ptr->eventObjectTemplates)); + + floorId = GetFloorId(); + for (i = 0; i < 2; i++) + { + u8 bits; + + eventTemplates[i] = gUnknown_0862A670; + eventTemplates[i].localId = i + 1; + eventTemplates[i].graphicsId = FacilityClassToGraphicsId(sHillData->tag.floors[floorId].trainers[i].facilityClass); + eventTemplates[i].x = sHillData->tag.floors[floorId].coords[i] & 0xF; + eventTemplates[i].y = ((sHillData->tag.floors[floorId].coords[i] >> 4) & 0xF) + 5; + bits = i << 2; + eventTemplates[i].movementType = ((sHillData->tag.floors[floorId].direction >> bits) & 0xF) + MOVEMENT_TYPE_FACE_UP; + eventTemplates[i].trainerRange_berryTreeId = (sHillData->tag.floors[floorId].range >> bits) & 0xF; + eventTemplates[i].script = EventScript_2C83F0; + gSaveBlock2Ptr->frontier.field_CB4[i] = i + 1; + } + + FreeDataStruct(); +} + +bool32 sub_81D5F48(void) +{ + SetUpDataStruct(); + FreeDataStruct(); + return TRUE; +} + +// Functionally equivalent. +#ifdef NONMATCHING +static u32 sub_81D5F58(u8 floorId, u32 bit, u32 arg2, u32 arg3) +{ + u32 var0, var1, var2, var3; + + var0 = (sHillData->tag.floors[floorId].unk3A0[arg2] >> (15 - bit)) & 1; + var1 = sHillData->tag.floors[floorId].data[arg2 * arg3 + bit]; + var3 = 0x200; + var2 = 0x3000; + + return ((var0 << 10) | var2) | (var1 | var3); +} +#else +NAKED +static u32 sub_81D5F58(u8 floorId, u32 bit, u32 arg2, u32 arg3) +{ + asm_unified("\n\ + push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r4, =sHillData\n\ + ldr r4, [r4]\n\ + mov r12, r4\n\ + lsls r4, r2, 1\n\ + lsls r5, r0, 4\n\ + subs r5, r0\n\ + lsls r5, 3\n\ + subs r5, r0\n\ + lsls r5, 3\n\ + adds r4, r5\n\ + movs r0, 0xE8\n\ + lsls r0, 2\n\ + add r0, r12\n\ + adds r0, r4\n\ + ldrh r0, [r0]\n\ + movs r4, 0xF\n\ + subs r4, r1\n\ + asrs r0, r4\n\ + movs r4, 0x1\n\ + ands r0, r4\n\ + muls r2, r3\n\ + adds r2, r1\n\ + adds r2, r5\n\ + movs r1, 0xA8\n\ + lsls r1, 2\n\ + add r1, r12\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + movs r2, 0x80\n\ + lsls r2, 2\n\ + adds r3, r2, 0\n\ + movs r2, 0xC0\n\ + lsls r2, 6\n\ + lsls r0, 10\n\ + orrs r0, r2\n\ + orrs r1, r3\n\ + orrs r0, r1\n\ + pop {r4,r5}\n\ + pop {r1}\n\ + bx r1\n\ + .pool"); +} +#endif // NONMATCHING + +void sub_81D5FB4(u16 *mapArg) +{ + s32 i, j; + u16 *src, *dst; + u8 mapId = GetCurrentTrainerHillMapId(); + + if (mapId == 6) + { + InitMapFromSavedGame(); + return; + } + + SetUpDataStruct(); + if (mapId == 5) + { + InitMapFromSavedGame(); + FreeDataStruct(); + return; + } + + mapId = GetFloorId(); + src = gMapHeader.mapLayout->map; + gBackupMapLayout.map = mapArg; + gBackupMapLayout.width = 31; + gBackupMapLayout.height = 35; + dst = mapArg + 224; + for (i = 0; i < 5; i++) + { + for (j = 0; j < 16; j++) + dst[j] = src[j]; + dst += 31; + src += 16; + } + + for (i = 0; i < 16; i++) + { + for (j = 0; j < 16; j++) + dst[j] = sub_81D5F58(mapId, j, i, 0x10); + dst += 31; + } + + mapheader_run_script_with_tag_x1(); + FreeDataStruct(); +} + +bool32 InTrainerHill(void) +{ + bool32 ret; + + if (gMapHeader.mapLayoutId == 0x19F + || gMapHeader.mapLayoutId == 0x1A0 + || gMapHeader.mapLayoutId == 0x1A1 + || gMapHeader.mapLayoutId == 0x1A2) + ret = TRUE; + else + ret = FALSE; + + return ret; +} + +u8 GetCurrentTrainerHillMapId(void) +{ + u8 ret; + + if (gMapHeader.mapLayoutId == 0x19F) + ret = 1; + else if (gMapHeader.mapLayoutId == 0x1A0) + ret = 2; + else if (gMapHeader.mapLayoutId == 0x1A1) + ret = 3; + else if (gMapHeader.mapLayoutId == 0x1A2) + ret = 4; + else if (gMapHeader.mapLayoutId == 0x1A3) + ret = 5; + else if (gMapHeader.mapLayoutId == 0x19E) + ret = 6; + else + ret = 0; + + return ret; +} + +static bool32 sub_81D6100(void) +{ + bool32 ret; + + if (gMapHeader.mapLayoutId == 0x1A3) + ret = TRUE; + else + ret = FALSE; + + return ret; +} + +const struct WarpEvent* sub_81D6120(void) +{ + const struct MapHeader *header = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(TRAINER_HILL_4F), MAP_NUM(TRAINER_HILL_4F)); + + return &header->events->warps[1]; +} + +const struct WarpEvent* sub_81D6134(u8 warpEventId) +{ + u8 id; + const struct MapHeader *header; + + if (warpEventId == 1) + return &gMapHeader.events->warps[1]; + + id = sub_81D6490(); + if (id == 0 || id >= 5) + id = 4; + + header = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(TRAINER_HILL_4F), gUnknown_0862A688[id - 1]); + return &header->events->warps[0]; +} + +u16 LocalIdToHillTrainerId(u8 localId) +{ + return gSaveBlock2Ptr->frontier.field_CB4[localId - 1]; +} + +bool8 GetHillTrainerFlag(u8 eventObjectId) +{ + u32 floorId = GetFloorId() * 2; + u8 bitId = gEventObjects[eventObjectId].localId - 1 + floorId; + + return gSaveBlock2Ptr->frontier.field_EE0 & gBitTable[bitId]; +} + +void SetHillTrainerFlag(void) +{ + u8 i; + u8 floorId = GetFloorId() * 2; + + for (i = 0; i < 2; i++) + { + if (gSaveBlock2Ptr->frontier.field_CB4[i] == gTrainerBattleOpponent_A) + { + gSaveBlock2Ptr->frontier.field_EE0 |= gBitTable[floorId + i]; + break; + } + } + + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + for (i = 0; i < 2; i++) + { + if (gSaveBlock2Ptr->frontier.field_CB4[i] == gTrainerBattleOpponent_B) + { + gSaveBlock2Ptr->frontier.field_EE0 |= gBitTable[floorId + i]; + break; + } + } + } +} + +const u8 *sub_81D62AC(void) +{ + return EventScript_2C83F0; +} + +static void sub_81D62B4(void) +{ + CopyTrainerHillTrainerText(5, gSpecialVar_LastTalked); + sub_80982B8(); +} + +static void sub_81D62CC(u16 trainerId, u8 firstMonId) +{ + u8 trId, level; + s32 i, floorId, arrId; + + if (trainerId == 0 || trainerId > 2) + return; + + trId = trainerId - 1; + SetUpDataStruct(); + level = GetHighestLevelInPlayerParty(); + floorId = GetFloorId(); + for (i = firstMonId, arrId = 0; i < firstMonId + 3; i++, arrId++) + { + u8 id = gUnknown_0862A698[trId][arrId]; + struct Pokemon *mon = &gEnemyParty[i]; + + CreateBattleTowerMon(mon, &sHillData->tag.floors[floorId].trainers[trId].mons[id]); + sub_81D642C(mon, level); + } + + FreeDataStruct(); +} + +void FillHillTrainerParty(void) +{ + ZeroEnemyPartyMons(); + sub_81D62CC(gTrainerBattleOpponent_A, 0); +} + +void FillHillTrainersParties(void) +{ + ZeroEnemyPartyMons(); + sub_81D62CC(gTrainerBattleOpponent_A, 0); + sub_81D62CC(gTrainerBattleOpponent_B, 3); +} + +// This function is unused, but my best guess is +// it was supposed to return AI scripts for trainer +// hill trainers. +u32 sub_81D63C4(void) +{ + return 7; +} + +u8 GetTrainerEncounterMusicIdInTrainerHill(u16 trainerId) +{ + s32 i; + u8 trId, facilityClass; + + SetUpDataStruct(); + trId = trainerId - 1; + facilityClass = sHillData->tag.floors[sHillData->floorId].trainers[trId].facilityClass; + FreeDataStruct(); + + for (i = 0; i < ARRAY_COUNT(gUnknown_0862A3B4); i++) + { + if (gUnknown_0862A3B4[i].trainerClass == gFacilityClassToTrainerClass[facilityClass]) + return gUnknown_0862A3B4[i].musicId; + } + + return 0; +} + +static void sub_81D642C(struct Pokemon *mon, u8 level) +{ + u16 species = GetMonData(mon, MON_DATA_SPECIES, NULL); + u32 exp = gExperienceTables[gBaseStats[species].growthRate][level]; + + SetMonData(mon, MON_DATA_EXP, &exp); + SetMonData(mon, MON_DATA_LEVEL, &level); + CalculateMonStats(mon); +} + +u8 sub_81D6490(void) +{ + u8 ret; + + SetUpDataStruct(); + ret = sHillData->tag.unkField_2; + FreeDataStruct(); + + return ret; +} + +static void sub_81D64AC(void) +{ + gSaveBlock2Ptr->frontier.field_EE0 = 0xFF; +} + +void sub_81D64C0(void) +{ + if (sub_81D6534() == TRUE) + LoadPalette(gUnknown_0862A5D4, 0x70, 0x20); +} + +static void sub_81D64DC(void) +{ + gSpecialVar_Result = gSaveBlock2Ptr->frontier.field_EF9_1; +} + +static void sub_81D64FC(void) +{ + gSaveBlock2Ptr->frontier.field_EF9_1 = 1; +} + +static void sub_81D6518(void) +{ + gSaveBlock2Ptr->frontier.field_EF9_1 = 0; +} + +bool32 sub_81D6534(void) +{ + if (!sub_81D5C18() || GetCurrentTrainerHillMapId() == 6) + return FALSE; + + sub_81D5C00(); + if (gSpecialVar_Result == 0) + return FALSE; + else + return TRUE; +} + +static void sub_81D6568(void) +{ + if (gSaveBlock1Ptr->trainerHill.field_3D6E_0d) + gSpecialVar_Result = 0; + else + gSpecialVar_Result = 1; +} + +static void sub_81D65A0(void) +{ + gSaveBlock1Ptr->trainerHill.tag = gSpecialVar_0x8005; + gSaveBlock1Ptr->trainerHill.field_3D68 = gSaveBlock1Ptr->trainerHillTimes[gSpecialVar_0x8005]; +} + +static u8 sub_81D65E8(u8 arg0) +{ + u8 var, i, modBy; + + var = 0; + for (i = 0; i < 4; i++) + { + var ^= sHillData->tag.floors[i].unk0 & 0x1F; + var ^= sHillData->tag.floors[i].unk1 & 0x1F; + } + + if (arg0) + modBy = 10; + else + modBy = 5; + + var %= modBy; + return var; +} + +static u16 sub_81D6640(void) +{ + u8 i; + const u16 *ptr; + s32 var = 0, var2, minutes, id; + + for (i = 0; i < 4; i++) + { + var += sHillData->tag.floors[i].unk0; + var += sHillData->tag.floors[i].unk1; + } + + var2 = var / 256; + var2 %= 2; + if (FlagGet(FLAG_SYS_GAME_CLEAR) && sHillData->tag.unkField_0 == 8) + i = sub_81D65E8(1); + else + i = sub_81D65E8(0); + + if (gSaveBlock1Ptr->trainerHill.tag == HILL_TAG_EXPERT) + i = (i + 1) % 10; + + ptr = gUnknown_0862A5CC[var2][i]; + minutes = (signed)(gSaveBlock1Ptr->trainerHill.field_3D64) / (60 * 60); + if (minutes < 12) + id = 0; + else if (minutes < 13) + id = 1; + else if (minutes < 14) + id = 2; + else if (minutes < 16) + id = 3; + else if (minutes < 18) + id = 4; + else + id = 5; + + return ptr[id]; +} diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index 5ddae218b..d57685423 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -109,7 +109,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 { if (paletteTag == 0xFFFF) { - sCreatingSpriteTemplate.paletteTag |= 0xFFFF; + sCreatingSpriteTemplate.paletteTag = 0xFFFF; LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20); } else @@ -122,7 +122,7 @@ static void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 { if (paletteTag == 0xFFFF) { - sCreatingSpriteTemplate.paletteTag |= 0xFFFF; + sCreatingSpriteTemplate.paletteTag = 0xFFFF; LoadCompressedPalette(gTrainerFrontPicPaletteTable[species].data, 0x100 + paletteSlot * 0x10, 0x20); } else diff --git a/src/trainer_see.c b/src/trainer_see.c index eeebcb575..3846eca46 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -6,18 +6,16 @@ #include "field_effect.h" #include "field_player_avatar.h" #include "pokemon.h" -#include "pokenav.h" #include "script.h" #include "script_movement.h" #include "sprite.h" #include "task.h" #include "trainer_see.h" +#include "trainer_hill.h" #include "util.h" #include "battle_pyramid.h" #include "constants/field_effects.h" -extern bool32 InTrainerHill(void); -extern bool8 GetTrainerHillTrainerFlag(u8 eventObjectId); extern void sub_809BE48(u16 npcId); // this file's functions @@ -240,7 +238,7 @@ static u8 CheckTrainer(u8 eventObjectId) } else if (InTrainerHill() == TRUE) { - if (GetTrainerHillTrainerFlag(eventObjectId)) + if (GetHillTrainerFlag(eventObjectId)) return 0; } else |