summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDiegoisawesome <Diegoisawesome@users.noreply.github.com>2019-01-14 14:18:29 -0600
committerGitHub <noreply@github.com>2019-01-14 14:18:29 -0600
commitb4b4fb951a588dd50b4589efea11d1a17fd88342 (patch)
tree8bce21f083717e8b39df833136fdab956673001b /src
parente13895e58ab38c8adbde1e572068692e8ee5ee35 (diff)
parent87763d133fadac8270dab0cba3d964a47b5b0dd2 (diff)
Merge pull request #519 from DizzyEggg/trainer_hill
Trainer Hill
Diffstat (limited to 'src')
-rw-r--r--src/apprentice.c4
-rw-r--r--src/battle_anim.c8
-rw-r--r--src/battle_dome.c2
-rw-r--r--src/battle_factory.c4
-rw-r--r--src/battle_main.c4
-rw-r--r--src/battle_message.c5
-rw-r--r--src/battle_pike.c2
-rw-r--r--src/battle_pyramid.c2
-rw-r--r--src/battle_script_commands.c2
-rw-r--r--src/battle_setup.c26
-rw-r--r--src/battle_tower.c12
-rw-r--r--src/battle_util2.c8
-rw-r--r--src/event_object_movement.c1
-rw-r--r--src/field_control_avatar.c1
-rw-r--r--src/field_poison.c1
-rw-r--r--src/fieldmap.c1
-rw-r--r--src/frontier_util.c2
-rw-r--r--src/link_rfu.c2
-rw-r--r--src/load_save.c3
-rw-r--r--src/main.c2
-rw-r--r--src/new_game.c4
-rw-r--r--src/overworld.c6
-rwxr-xr-xsrc/party_menu.c10
-rw-r--r--src/pokedex.c8
-rw-r--r--src/pokemon.c9
-rw-r--r--src/recorded_battle.c4
-rw-r--r--src/rom_8034C54.c2
-rw-r--r--src/save.c9
-rw-r--r--src/script_menu.c10
-rw-r--r--src/strings.c22
-rw-r--r--src/trainer_hill.c1121
-rw-r--r--src/trainer_pokemon_sprites.c4
-rw-r--r--src/trainer_see.c6
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