summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_message.c21
-rw-r--r--src/cereader_tool.c14
-rw-r--r--src/field_specials.c46
-rw-r--r--src/heal_location.c8
-rw-r--r--src/load_save.c4
-rw-r--r--src/quest_log.c26
-rw-r--r--src/region_map.c2
-rw-r--r--src/renewable_hidden_items.c4
-rw-r--r--src/trainer_tower.c640
9 files changed, 394 insertions, 371 deletions
diff --git a/src/battle_message.c b/src/battle_message.c
index 5bc0f113f..196c1c3a6 100644
--- a/src/battle_message.c
+++ b/src/battle_message.c
@@ -22,6 +22,7 @@
#include "constants/moves.h"
#include "constants/items.h"
#include "constants/trainer_classes.h"
+#include "constants/trainer_tower.h"
struct BattleWindowText
{
@@ -1294,9 +1295,9 @@ const u8 gUnknown_83FE94D[] = _("a PSYCHIC move");
const u8 gUnknown_83FE95C[] = _("an ICE move");
const u8 gUnknown_83FE968[] = _("a DRAGON move");
const u8 gUnknown_83FE976[] = _("a DARK move");
-const u8 gUnknown_83FE982[] = _("TIME BOARD");
-const u8 gUnknown_83FE98D[] = _("CLEAR TIME");
-const u8 gUnknown_83FE998[] = _("{STR_VAR_1}MIN. {STR_VAR_2}.{STR_VAR_3}SEC.");
+const u8 gText_TimeBoard[] = _("TIME BOARD");
+const u8 gText_ClearTime[] = _("CLEAR TIME"); // Unused
+const u8 gText_XMinYZSec[] = _("{STR_VAR_1}MIN. {STR_VAR_2}.{STR_VAR_3}SEC.");
const u8 gUnknown_83FE9A9[] = _("1F");
const u8 gUnknown_83FE9AC[] = _("2F");
const u8 gUnknown_83FE9AF[] = _("3F");
@@ -1306,7 +1307,7 @@ const u8 gUnknown_83FE9B8[] = _("6F");
const u8 gUnknown_83FE9BB[] = _("7F");
const u8 gUnknown_83FE9BE[] = _("8F");
-const u8 *const gUnknown_83FE9C4[] = {
+const u8 *const gTrainerTowerChallengeTypeTexts[NUM_TOWER_CHALLENGE_TYPES] = {
gOtherText_Single,
gOtherText_Double,
gOtherText_Knockout,
@@ -1990,7 +1991,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER)
toCpy = gTrainerClassNames[GetBattleTowerTrainerClassNameId()];
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
- toCpy = gTrainerClassNames[sub_815DA10()];
+ toCpy = gTrainerClassNames[GetTrainerTowerOpponentClass()];
else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
toCpy = gTrainerClassNames[GetEreaderTrainerClassId()];
else
@@ -2014,7 +2015,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
}
else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
{
- sub_815DA28(text);
+ GetTrainerTowerOpponentName(text);
toCpy = text;
}
else if (gBattleTypeFlags & BATTLE_TYPE_EREADER_TRAINER)
@@ -2054,7 +2055,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
case B_TXT_TRAINER1_LOSE_TEXT: // trainerA lose text
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
{
- sub_815DC40(gStringVar4, 0);
+ GetTrainerTowerOpponentLoseText(gStringVar4, 0);
toCpy = gStringVar4;
}
else
@@ -2065,7 +2066,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER_TOWER)
{
- sub_815DBF4(gStringVar4, 0);
+ GetTrainerTowerOpponentWinText(gStringVar4, 0);
toCpy = gStringVar4;
}
else
@@ -2074,11 +2075,11 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst)
}
break;
case B_TXT_TRAINER2_LOSE_TEXT:
- sub_815DC40(gStringVar4, 1);
+ GetTrainerTowerOpponentLoseText(gStringVar4, 1);
toCpy = gStringVar4;
break;
case B_TXT_TRAINER2_WIN_TEXT:
- sub_815DBF4(gStringVar4, 1);
+ GetTrainerTowerOpponentWinText(gStringVar4, 1);
toCpy = gStringVar4;
break;
case B_TXT_26: // ?
diff --git a/src/cereader_tool.c b/src/cereader_tool.c
index 2c5d05018..5258b1910 100644
--- a/src/cereader_tool.c
+++ b/src/cereader_tool.c
@@ -6,14 +6,14 @@
u8 sub_815D654(void)
{
- return (gSaveBlock1Ptr->unkArray[0].unk9 + 1) % 256;
+ return (gSaveBlock1Ptr->trainerTower[0].unk9 + 1) % 256;
}
static bool32 ValidateTrainerTowerTrainer(struct TrainerTowerFloor * floor)
{
- if (floor->floorIdx < 1 || floor->floorIdx > 8)
+ if (floor->floorIdx < 1 || floor->floorIdx > MAX_TRAINER_TOWER_FLOORS)
return FALSE;
- if (floor->challengeType > 2)
+ if (floor->challengeType > CHALLENGE_TYPE_KNOCKOUT)
return FALSE;
if (CalcByteArraySum((const u8 *)floor, offsetof(typeof(*floor), checksum)) != floor->checksum)
return FALSE;
@@ -22,16 +22,16 @@ static bool32 ValidateTrainerTowerTrainer(struct TrainerTowerFloor * floor)
bool32 ValidateTrainerTowerData(struct EReaderTrainerHillSet * ttdata)
{
- u32 count = ttdata->count;
+ u32 numFloors = ttdata->numFloors;
s32 i;
- if (count < 1 || count > 8)
+ if (numFloors < 1 || numFloors > MAX_TRAINER_TOWER_FLOORS)
return FALSE;
- for (i = 0; i < count; i++)
+ for (i = 0; i < numFloors; i++)
{
if (!ValidateTrainerTowerTrainer(&ttdata->floors[i]))
return FALSE;
}
- if (CalcByteArraySum((const u8 *)ttdata->floors, count * sizeof(ttdata->floors[0])) != ttdata->checksum)
+ if (CalcByteArraySum((const u8 *)ttdata->floors, numFloors * sizeof(ttdata->floors[0])) != ttdata->checksum)
return FALSE;
return TRUE;
}
diff --git a/src/field_specials.c b/src/field_specials.c
index 57bf53830..95760f42d 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -876,22 +876,22 @@ void Special_GetElevatorFloor(void)
break;
}
}
- if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F))
+ if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(TRAINER_TOWER_1F))
{
switch (gSaveBlock1Ptr->warp2.mapNum)
{
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF):
+ case MAP_NUM(TRAINER_TOWER_1F):
+ case MAP_NUM(TRAINER_TOWER_2F):
+ case MAP_NUM(TRAINER_TOWER_3F):
+ case MAP_NUM(TRAINER_TOWER_4F):
+ case MAP_NUM(TRAINER_TOWER_5F):
+ case MAP_NUM(TRAINER_TOWER_6F):
+ case MAP_NUM(TRAINER_TOWER_7F):
+ case MAP_NUM(TRAINER_TOWER_8F):
+ case MAP_NUM(TRAINER_TOWER_ROOF):
floor = 15;
break;
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY):
+ case MAP_NUM(TRAINER_TOWER_LOBBY):
floor = 3;
break;
}
@@ -992,23 +992,23 @@ u16 Special_InitElevatorFloorSelectMenuPos(void)
break;
}
}
- if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F))
+ if (gSaveBlock1Ptr->warp2.mapGroup == MAP_GROUP(TRAINER_TOWER_1F))
{
switch (gSaveBlock1Ptr->warp2.mapNum)
{
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F):
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF):
+ case MAP_NUM(TRAINER_TOWER_1F):
+ case MAP_NUM(TRAINER_TOWER_2F):
+ case MAP_NUM(TRAINER_TOWER_3F):
+ case MAP_NUM(TRAINER_TOWER_4F):
+ case MAP_NUM(TRAINER_TOWER_5F):
+ case MAP_NUM(TRAINER_TOWER_6F):
+ case MAP_NUM(TRAINER_TOWER_7F):
+ case MAP_NUM(TRAINER_TOWER_8F):
+ case MAP_NUM(TRAINER_TOWER_ROOF):
sElevatorScroll = 0;
sElevatorCursorPos = 0;
break;
- case MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY):
+ case MAP_NUM(TRAINER_TOWER_LOBBY):
sElevatorScroll = 0;
sElevatorCursorPos = 1;
break;
@@ -2436,7 +2436,7 @@ bool8 Special_BadEggInParty(void)
bool8 Special_PlayerIsNotInTrainerTowerLobby(void)
{
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY))
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY))
return FALSE;
else
return TRUE;
diff --git a/src/heal_location.c b/src/heal_location.c
index 89d9478c0..5c31e2df3 100644
--- a/src/heal_location.c
+++ b/src/heal_location.c
@@ -124,13 +124,13 @@ void SetBlackoutRespawnWarpAndHealerNpc(struct WarpData * warp)
if (VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 1)
{
- if (!gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2)
+ if (!gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId].spokeToOwner)
VarSet(VAR_MAP_SCENE_TRAINER_TOWER, 0);
gSpecialVar_LastTalked = 1;
warp->x = 4;
warp->y = 11;
- warp->mapGroup = MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY);
- warp->mapNum = MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY);
+ warp->mapGroup = MAP_GROUP(TRAINER_TOWER_LOBBY);
+ warp->mapNum = MAP_NUM(TRAINER_TOWER_LOBBY);
warp->warpId = 0xFF;
}
else
@@ -155,7 +155,7 @@ void SetBlackoutRespawnWarpAndHealerNpc(struct WarpData * warp)
warp->x = 5;
warp->y = 4;
}
- else if (sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY) && sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY))
+ else if (sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][0] == MAP_GROUP(TRAINER_TOWER_LOBBY) && sBlackoutRespawnHealCenterMapIdxs[healLocationIdx - 1][1] == MAP_NUM(TRAINER_TOWER_LOBBY))
{
warp->x = 4;
warp->y = 11;
diff --git a/src/load_save.c b/src/load_save.c
index 9c30494f8..7f16f74a5 100644
--- a/src/load_save.c
+++ b/src/load_save.c
@@ -284,8 +284,8 @@ void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey)
{
int i;
- for(i = 0; i < 4; i++)
- ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->unkArray[i].unk4, encryptionKey);
+ for(i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
+ ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->trainerTower[i].bestTime, encryptionKey);
sub_8054F38(encryptionKey);
ApplyNewEncryptionKeyToBagItems_(encryptionKey);
diff --git a/src/quest_log.c b/src/quest_log.c
index 38b3733ea..fd0e0a754 100644
--- a/src/quest_log.c
+++ b/src/quest_log.c
@@ -2602,18 +2602,18 @@ void SetQuestLogEvent(u16 eventId, const u16 *eventData)
static bool8 InQuestLogDisabledLocation(void)
{
// In Trainer Tower
- if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_1F)
- && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_1F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_2F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_3F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_4F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_5F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_6F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_7F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_8F)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ROOF)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY)
- || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ELEVATOR)))
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_1F)
+ && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_1F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_2F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_3F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_4F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_5F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_6F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_7F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_8F)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ROOF)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_LOBBY)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR)))
return TRUE;
// In pokemon trainer fan club
@@ -2629,7 +2629,7 @@ static bool8 InQuestLogDisabledLocation(void)
// In elevator
if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROCKET_HIDEOUT_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROCKET_HIDEOUT_ELEVATOR))
|| (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SILPH_CO_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SILPH_CO_ELEVATOR))
- || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_ELEVATOR))
+ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_TOWER_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_TOWER_ELEVATOR))
|| (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(CELADON_CITY_DEPARTMENT_STORE_ELEVATOR)))
return TRUE;
diff --git a/src/region_map.c b/src/region_map.c
index d526f9aaa..b2f08e39a 100644
--- a/src/region_map.c
+++ b/src/region_map.c
@@ -3420,7 +3420,7 @@ static u8 sub_80C3878(u8 mapsec)
case MAPSEC_ROCKET_WAREHOUSE:
return FlagGet(FLAG_WORLD_MAP_FIVE_ISLAND_ROCKET_WAREHOUSE) ? 2 : 3;
case MAPSEC_TRAINER_TOWER_2:
- return FlagGet(FLAG_WORLD_MAP_SEVEN_ISLAND_TRAINER_TOWER_LOBBY) ? 2 : 3;
+ return FlagGet(FLAG_WORLD_MAP_TRAINER_TOWER_LOBBY) ? 2 : 3;
case MAPSEC_DOTTED_HOLE:
return FlagGet(FLAG_WORLD_MAP_SIX_ISLAND_DOTTED_HOLE_1F) ? 2 : 3;
case MAPSEC_LOST_CAVE:
diff --git a/src/renewable_hidden_items.c b/src/renewable_hidden_items.c
index cbaa780e6..127f353e8 100644
--- a/src/renewable_hidden_items.c
+++ b/src/renewable_hidden_items.c
@@ -529,9 +529,9 @@ static const struct RenewableHiddenItemData sRenewableHiddenItems[] = {
},
};
-bool32 sub_815D834(void)
+bool32 ReadTrainerHillAndValidate(void)
{
- // Stubbed out?
+ // Stubbed out. Populated in Emerald
return FALSE;
}
diff --git a/src/trainer_tower.c b/src/trainer_tower.c
index 60c6fd93d..85bcb4e3e 100644
--- a/src/trainer_tower.c
+++ b/src/trainer_tower.c
@@ -31,6 +31,10 @@
#include "constants/trainers.h"
#include "constants/facility_trainer_classes.h"
#include "constants/object_events.h"
+#include "constants/trainer_tower.h"
+
+#define CURR_FLOOR sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx]
+#define TRAINER_TOWER gSaveBlock1Ptr->trainerTower[gSaveBlock1Ptr->towerChallengeId]
struct UnkStruct_203F458
{
@@ -38,7 +42,7 @@ struct UnkStruct_203F458
/* 0x0004 */ struct EReaderTrainerHillSet unk_0004;
};
-struct UnkStruct_203F45C
+struct TrainerTowerOpponent
{
/* 0x00 */ u8 name[11];
/* 0x0C */ u16 speechWin[6];
@@ -52,15 +56,15 @@ struct UnkStruct_203F45C
struct SinglesTrainerInfo
{
- u8 mapObjGfx;
+ u8 objGfx;
u8 facilityClass;
bool8 gender;
};
struct DoublesTrainerInfo
{
- u8 mapObjGfx1;
- u8 mapObjGfx2;
+ u8 objGfx1;
+ u8 objGfx2;
u8 facilityClass;
bool8 gender1;
bool8 gender2;
@@ -68,49 +72,49 @@ struct DoublesTrainerInfo
struct TrainerEncounterMusicPairs
{
- u8 unk0;
- u8 unk1;
+ u8 facilityClass;
+ u8 musicId;
};
static EWRAM_DATA struct UnkStruct_203F458 * sTrainerTowerState = NULL;
-static EWRAM_DATA struct UnkStruct_203F45C * sTrainerTowerOpponent = NULL;
+static EWRAM_DATA struct TrainerTowerOpponent * sTrainerTowerOpponent = NULL;
static EWRAM_DATA u8 sUnused_203F460 = 0;
-static void sub_815DC8C(void); // setup
-static void sub_815DD2C(void); // teardown
-static void sub_815DD44(void);
+static void SetUpTrainerTowerDataStruct(void);
+static void FreeTrainerTowerDataStruct(void);
+static void InitTrainerTowerFloor(void);
static void SetTrainerTowerNPCGraphics(void);
static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest);
-static void sub_815DF54(void);
+static void BufferTowerOpponentSpeech(void);
static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass);
-static void sub_815E160(void);
-static void sub_815E1C0(void);
-static void sub_815E1F0(void);
-static void TTSpecial_HasReachedTheRoof(void);
-static void sub_815E28C(void);
-static void sub_815E394(void);
-static void sub_815E408(void);
-static void sub_815E4B0(void);
-static void TTSpecial_StartTimer(void);
-static void sub_815E5C4(void);
-static void sub_815E5F0(void);
-static void sub_815E658(void);
-static void sub_815E720(void);
-static void sub_815E88C(void);
-static void sub_815E8B4(void);
-static void sub_815E8CC(void);
-static void sub_815E908(void);
-static void sub_815E948(void);
-static void sub_815E9C8(void);
+static void DoTrainerTowerBattle(void);
+static void TrainerTowerGetChallengeType(void);
+static void TrainerTowerAddFloorCleared(void);
+static void GetFloorAlreadyBeaten(void);
+static void StartTrainerTowerChallenge(void);
+static void GetOwnerState(void);
+static void GiveChallengePrize(void);
+static void CheckFinalTime(void);
+static void TrainerTowerResumeTimer(void);
+static void TrainerTowerSetPlayerLost(void);
+static void GetTrainerTowerChallengeStatus(void);
+static void GetCurrentTime(void);
+static void ShowResultsBoard(void);
+static void CloseResultsBoard(void);
+static void TrainerTowerGetDoublesEligiblity(void);
+static void TrainerTowerGetNumFloors(void);
+static void ShouldWarpToCounter(void);
+static void PlayTrainerTowerEncounterMusic(void);
+static void HasSpokenToOwner(void);
static void BuildEnemyParty(void);
static s32 GetPartyMaxLevel(void);
static void ValidateOrResetCurTrainerTowerRecord(void);
static u32 GetTrainerTowerRecordTime(u32 *);
static void SetTrainerTowerRecordTime(u32 *, u32);
-extern const u8 gUnknown_83FE982[];
-extern const u8 gUnknown_83FE998[];
-extern const u8 *const gUnknown_83FE9C4[];
+extern const u8 gText_TimeBoard[];
+extern const u8 gText_XMinYZSec[];
+extern const u8 *const gTrainerTowerChallengeTypeTexts[];
static const struct SinglesTrainerInfo sSingleBattleTrainerInfo[] = {
{OBJECT_EVENT_GFX_WOMAN_2, FACILITY_CLASS_AROMA_LADY, FEMALE},
@@ -319,51 +323,52 @@ static const struct TrainerEncounterMusicPairs sTrainerEncounterMusicLUT[105] =
{FACILITY_CLASS_ELITE_FOUR_2, TRAINER_ENCOUNTER_MUSIC_MALE}
};
-static const struct WindowTemplate gUnknown_847A218[] = {
+static const struct WindowTemplate sTimeBoardWindowTemplate[] = {
{0, 3, 1, 27, 18, 15, 0x001},
DUMMY_WIN_TEMPLATE
};
-static const u32 gUnknown_847A228 = 0x70; // unused
-
-static const u8 gUnknown_847A22C[3] = {0, 2, 3};
-
-static void (*const gUnknown_847A230[])(void) = {
- sub_815DD44,
- sub_815DF54,
- sub_815E160,
- sub_815E1C0,
- sub_815E1F0,
- TTSpecial_HasReachedTheRoof,
- sub_815E28C,
- sub_815E394,
- sub_815E408,
- sub_815E4B0,
- TTSpecial_StartTimer,
- sub_815E5C4,
- sub_815E5F0,
- sub_815E658,
- sub_815E720,
- sub_815E88C,
- sub_815E8B4,
- sub_815E8CC,
- sub_815E908,
- sub_815E948,
- sub_815E9C8
+static const u32 sUnused_847A228 = 0x70;
+
+static const u8 sTextColors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GREY, TEXT_COLOR_LIGHT_GREY};
+
+static void (*const sTrainerTowerFunctions[])(void) = {
+ [TRAINER_TOWER_FUNC_INIT_FLOOR] = InitTrainerTowerFloor,
+ [TRAINER_TOWER_FUNC_GET_SPEECH] = BufferTowerOpponentSpeech,
+ [TRAINER_TOWER_FUNC_DO_BATTLE] = DoTrainerTowerBattle,
+ [TRAINER_TOWER_FUNC_GET_CHALLENGE_TYPE] = TrainerTowerGetChallengeType,
+ [TRAINER_TOWER_FUNC_CLEARED_FLOOR] = TrainerTowerAddFloorCleared,
+ [TRAINER_TOWER_FUNC_GET_FLOOR_BEATEN] = GetFloorAlreadyBeaten,
+ [TRAINER_TOWER_FUNC_START_CHALLENGE] = StartTrainerTowerChallenge,
+ [TRAINER_TOWER_FUNC_GET_OWNER_STATE] = GetOwnerState,
+ [TRAINER_TOWER_FUNC_GIVE_PRIZE] = GiveChallengePrize,
+ [TRAINER_TOWER_FUNC_CHECK_FINAL_TIME] = CheckFinalTime,
+ [TRAINER_TOWER_FUNC_RESUME_TIMER] = TrainerTowerResumeTimer,
+ [TRAINER_TOWER_FUNC_SET_LOST] = TrainerTowerSetPlayerLost,
+ [TRAINER_TOWER_FUNC_GET_CHALLENGE_STATUS] = GetTrainerTowerChallengeStatus,
+ [TRAINER_TOWER_FUNC_GET_TIME] = GetCurrentTime,
+ [TRAINER_TOWER_FUNC_SHOW_RESULTS] = ShowResultsBoard,
+ [TRAINER_TOWER_FUNC_CLOSE_RESULTS] = CloseResultsBoard,
+ [TRAINER_TOWER_FUNC_CHECK_DOUBLES] = TrainerTowerGetDoublesEligiblity,
+ [TRAINER_TOWER_FUNC_GET_NUM_FLOORS] = TrainerTowerGetNumFloors,
+ [TRAINER_TOWER_FUNC_SHOULD_WARP_TO_COUNTER] = ShouldWarpToCounter,
+ [TRAINER_TOWER_FUNC_ENCOUNTER_MUSIC] = PlayTrainerTowerEncounterMusic,
+ [TRAINER_TOWER_FUNC_GET_BEAT_CHALLENGE] = HasSpokenToOwner
};
-static const u16 sFloorLayouts[8][3] = {
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_1F, LAYOUT_UNUSED_LAYOUT_834BC2C, LAYOUT_UNUSED_LAYOUT_834D06C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_2F, LAYOUT_UNUSED_LAYOUT_834BEB4, LAYOUT_UNUSED_LAYOUT_834D2F4},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_3F, LAYOUT_UNUSED_LAYOUT_834C13C, LAYOUT_UNUSED_LAYOUT_834D57C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_4F, LAYOUT_UNUSED_LAYOUT_834C3C4, LAYOUT_UNUSED_LAYOUT_834D804},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_5F, LAYOUT_UNUSED_LAYOUT_834C64C, LAYOUT_UNUSED_LAYOUT_834DA8C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_6F, LAYOUT_UNUSED_LAYOUT_834C8D4, LAYOUT_UNUSED_LAYOUT_834DD14},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_7F, LAYOUT_UNUSED_LAYOUT_834CB5C, LAYOUT_UNUSED_LAYOUT_834DF9C},
- {LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_8F, LAYOUT_UNUSED_LAYOUT_834CDE4, LAYOUT_UNUSED_LAYOUT_834E224}
+// - 1 excludes Mixed challenge, which just uses one of the 3 other types
+static const u16 sFloorLayouts[MAX_TRAINER_TOWER_FLOORS][NUM_TOWER_CHALLENGE_TYPES - 1] = {
+ {LAYOUT_TRAINER_TOWER_1F, LAYOUT_TRAINER_TOWER_1F_DOUBLES, LAYOUT_TRAINER_TOWER_1F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_2F, LAYOUT_TRAINER_TOWER_2F_DOUBLES, LAYOUT_TRAINER_TOWER_2F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_3F, LAYOUT_TRAINER_TOWER_3F_DOUBLES, LAYOUT_TRAINER_TOWER_3F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_4F, LAYOUT_TRAINER_TOWER_4F_DOUBLES, LAYOUT_TRAINER_TOWER_4F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_5F, LAYOUT_TRAINER_TOWER_5F_DOUBLES, LAYOUT_TRAINER_TOWER_5F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_6F, LAYOUT_TRAINER_TOWER_6F_DOUBLES, LAYOUT_TRAINER_TOWER_6F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_7F, LAYOUT_TRAINER_TOWER_7F_DOUBLES, LAYOUT_TRAINER_TOWER_7F_KNOCKOUT},
+ {LAYOUT_TRAINER_TOWER_8F, LAYOUT_TRAINER_TOWER_8F_DOUBLES, LAYOUT_TRAINER_TOWER_8F_KNOCKOUT}
};
-static const u16 gUnknown_847A2B4[] = {
+static const u16 sPrizeList[] = {
ITEM_HP_UP,
ITEM_PROTEIN,
ITEM_IRON,
@@ -381,21 +386,21 @@ static const u16 gUnknown_847A2B4[] = {
ITEM_UP_GRADE
};
-static const u16 gUnknown_847A2D2[] = {
- MUS_SHOUNEN,
- MUS_SHOUJO,
- MUS_SHOUJO,
- MUS_ROCKET,
- MUS_SHOUNEN,
- MUS_SHOUNEN,
- MUS_ROCKET,
- MUS_ROCKET,
- MUS_SHOUNEN,
- MUS_SHOUJO,
- MUS_SHOUNEN,
- MUS_SHOUNEN,
- MUS_SHOUNEN,
- MUS_SHOUNEN
+static const u16 sTrainerTowerEncounterMusic[] = {
+ [TRAINER_ENCOUNTER_MUSIC_MALE] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_FEMALE] = MUS_SHOUJO,
+ [TRAINER_ENCOUNTER_MUSIC_GIRL] = MUS_SHOUJO,
+ [TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS] = MUS_ROCKET,
+ [TRAINER_ENCOUNTER_MUSIC_INTENSE] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_COOL] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_AQUA] = MUS_ROCKET,
+ [TRAINER_ENCOUNTER_MUSIC_MAGMA] = MUS_ROCKET,
+ [TRAINER_ENCOUNTER_MUSIC_SWIMMER] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_TWINS] = MUS_SHOUJO,
+ [TRAINER_ENCOUNTER_MUSIC_ELITE_FOUR] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_HIKER] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_INTERVIEWER] = MUS_SHOUNEN,
+ [TRAINER_ENCOUNTER_MUSIC_RICH] = MUS_SHOUNEN
};
static const u8 sSingleBattleChallengeMonIdxs[][2] = {
@@ -432,21 +437,21 @@ static const u8 sKnockoutChallengeMonIdxs[][3] = {
};
extern const struct EReaderTrainerHillSetSubstruct gUnknown_84827AC;
-extern const struct TrainerTowerFloor *const gUnknown_84827B4[][8];
+extern const struct TrainerTowerFloor *const gUnknown_84827B4[][MAX_TRAINER_TOWER_FLOORS];
-void sub_815D9E8(void)
+void CallTrainerTowerFunc(void)
{
- sub_815DC8C();
- gUnknown_847A230[gSpecialVar_0x8004]();
- sub_815DD2C();
+ SetUpTrainerTowerDataStruct();
+ sTrainerTowerFunctions[gSpecialVar_0x8004]();
+ FreeTrainerTowerDataStruct();
}
-u8 sub_815DA10(void)
+u8 GetTrainerTowerOpponentClass(void)
{
return gFacilityClassToTrainerClass[sTrainerTowerOpponent->facilityClass];
}
-void sub_815DA28(u8 *dest)
+void GetTrainerTowerOpponentName(u8 *dest)
{
StringCopyN(dest, sTrainerTowerOpponent->name, 11);
}
@@ -458,41 +463,39 @@ u8 GetTrainerTowerTrainerFrontSpriteId(void)
void InitTrainerTowerBattleStruct(void)
{
- u16 r10;
- s32 r9;
+ u16 trainerId;
+ int i;
- sub_815DC8C();
+ SetUpTrainerTowerDataStruct();
sTrainerTowerOpponent = AllocZeroed(sizeof(*sTrainerTowerOpponent));
- r10 = VarGet(VAR_TEMP_1);
- StringCopyN(sTrainerTowerOpponent->name, sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].name, 11);
+ trainerId = VarGet(VAR_TEMP_1);
+ StringCopyN(sTrainerTowerOpponent->name, CURR_FLOOR.trainers[trainerId].name, 11);
- for (r9 = 0; r9 < 6; r9++)
+ for (i = 0; i < 6; i++)
{
- sTrainerTowerOpponent->speechWin[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].speechWin[r9];
- sTrainerTowerOpponent->speechLose[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].speechLose[r9];
+ sTrainerTowerOpponent->speechWin[i] = CURR_FLOOR.trainers[trainerId].speechWin[i];
+ sTrainerTowerOpponent->speechLose[i] = CURR_FLOOR.trainers[trainerId].speechLose[i];
- if (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType == 1)
+ if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE)
{
- sTrainerTowerOpponent->speechWin2[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10 + 1].speechWin[r9];
- sTrainerTowerOpponent->speechLose2[r9] = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10 + 1].speechLose[r9];
+ sTrainerTowerOpponent->speechWin2[i] = CURR_FLOOR.trainers[trainerId + 1].speechWin[i];
+ sTrainerTowerOpponent->speechLose2[i] = CURR_FLOOR.trainers[trainerId + 1].speechLose[i];
}
}
- sTrainerTowerOpponent->battleType = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
- sTrainerTowerOpponent->facilityClass = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].facilityClass;
- sTrainerTowerOpponent->gender = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r10].gender;
- SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
- sub_815DD2C();
+ sTrainerTowerOpponent->battleType = CURR_FLOOR.challengeType;
+ sTrainerTowerOpponent->facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass;
+ sTrainerTowerOpponent->gender = CURR_FLOOR.trainers[trainerId].gender;
+ SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);
+ FreeTrainerTowerDataStruct();
}
void FreeTrainerTowerBattleStruct(void)
{
- Free(sTrainerTowerOpponent);
- sTrainerTowerOpponent = NULL;
+ FREE_AND_SET_NULL(sTrainerTowerOpponent)
}
-void sub_815DBF4(u8 *dest, u8 opponentIdx)
-// TTower_GetBeforeBattleMessage?
+void GetTrainerTowerOpponentWinText(u8 *dest, u8 opponentIdx)
{
VarSet(VAR_TEMP_3, opponentIdx);
TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass);
@@ -502,8 +505,7 @@ void sub_815DBF4(u8 *dest, u8 opponentIdx)
TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechWin2, dest);
}
-void sub_815DC40(u8 *dest, u8 opponentIdx)
-// TTower_GetAfterBattleMessage?
+void GetTrainerTowerOpponentLoseText(u8 *dest, u8 opponentIdx)
{
VarSet(VAR_TEMP_3, opponentIdx);
TrainerTowerGetOpponentTextColor(sTrainerTowerOpponent->battleType, sTrainerTowerOpponent->facilityClass);
@@ -513,23 +515,23 @@ void sub_815DC40(u8 *dest, u8 opponentIdx)
TT_ConvertEasyChatMessageToString(sTrainerTowerOpponent->speechLose2, dest);
}
-static void sub_815DC8C(void) // fakematching
+static void SetUpTrainerTowerDataStruct(void) // fakematching
{
- u32 whichTimer = gSaveBlock1Ptr->unkArrayIdx;
+ u32 challengeType = gSaveBlock1Ptr->towerChallengeId;
s32 r4;
const struct TrainerTowerFloor *const * r7;
sTrainerTowerState = AllocZeroed(sizeof(*sTrainerTowerState));
sTrainerTowerState->floorIdx = gMapHeader.mapLayoutId - 42;
- if (sub_815D834() == TRUE)
+ if (ReadTrainerHillAndValidate() == TRUE)
CEReaderTool_LoadTrainerTower(&sTrainerTowerState->unk_0004);
else
{
struct UnkStruct_203F458 * r0_ = sTrainerTowerState;
const struct EReaderTrainerHillSetSubstruct * r1 = &gUnknown_84827AC;
memcpy(&r0_->unk_0004, r1, sizeof(struct EReaderTrainerHillSetSubstruct));
- r7 = gUnknown_84827B4[whichTimer];
- for (r4 = 0; r4 < 8; r4++)
+ r7 = gUnknown_84827B4[challengeType];
+ for (r4 = 0; r4 < MAX_TRAINER_TOWER_FLOORS; r4++)
{
#ifndef NONMATCHING
void * r5;
@@ -547,22 +549,21 @@ static void sub_815DC8C(void) // fakematching
}
}
-static void sub_815DD2C(void)
+static void FreeTrainerTowerDataStruct(void)
{
- Free(sTrainerTowerState);
- sTrainerTowerState = NULL;
+ FREE_AND_SET_NULL(sTrainerTowerState)
}
-static void sub_815DD44(void)
+static void InitTrainerTowerFloor(void)
{
- if (gMapHeader.mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY > sTrainerTowerState->unk_0004.count)
+ if (gMapHeader.mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY > sTrainerTowerState->unk_0004.numFloors)
{
- gSpecialVar_Result = 3;
- SetCurrentMapLayout(LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_ROOF);
+ gSpecialVar_Result = 3; // Skip past usable challenge types
+ SetCurrentMapLayout(LAYOUT_TRAINER_TOWER_ROOF);
}
else
{
- gSpecialVar_Result = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
+ gSpecialVar_Result = CURR_FLOOR.challengeType;
SetCurrentMapLayout(sFloorLayouts[sTrainerTowerState->floorIdx][gSpecialVar_Result]);
SetTrainerTowerNPCGraphics();
}
@@ -570,66 +571,70 @@ static void sub_815DD44(void)
static void SetTrainerTowerNPCGraphics(void)
{
- s32 r3, r4;
- u8 r1, r2, r4_;
- switch (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType)
+ s32 i, j;
+ u8 trainerGfx1, trainerGfx2, facilityClass;
+ switch (CURR_FLOOR.challengeType)
{
- case 0:
- r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass;
- for (r3 = 0; r3 < NELEMS(sSingleBattleTrainerInfo); r3++)
+ case CHALLENGE_TYPE_SINGLE:
+ facilityClass = CURR_FLOOR.trainers[0].facilityClass;
+ for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)
{
- if (sSingleBattleTrainerInfo[r3].facilityClass == r2)
+ if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r3 != NELEMS(sSingleBattleTrainerInfo))
- r1 = sSingleBattleTrainerInfo[r3].mapObjGfx;
+
+ if (i != NELEMS(sSingleBattleTrainerInfo))
+ trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;
else
- r1 = 18;
- VarSet(VAR_OBJ_GFX_ID_1, r1);
+ trainerGfx1 = OBJECT_EVENT_GFX_YOUNGSTER;
+
+ VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1);
break;
- case 1:
- r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass;
- for (r3 = 0; r3 < NELEMS(sDoubleBattleTrainerInfo); r3++)
+ case CHALLENGE_TYPE_DOUBLE:
+ facilityClass = CURR_FLOOR.trainers[0].facilityClass;
+ for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++)
{
- if (sDoubleBattleTrainerInfo[r3].facilityClass == r2)
+ if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r3 != NELEMS(sDoubleBattleTrainerInfo))
+ if (i != NELEMS(sDoubleBattleTrainerInfo))
{
- r1 = sDoubleBattleTrainerInfo[r3].mapObjGfx1;
- r4_ = sDoubleBattleTrainerInfo[r3].mapObjGfx2;
+ trainerGfx1 = sDoubleBattleTrainerInfo[i].objGfx1;
+ trainerGfx2 = sDoubleBattleTrainerInfo[i].objGfx2;
}
else
{
- r1 = OBJECT_EVENT_GFX_YOUNGSTER;
- r4_ = OBJECT_EVENT_GFX_YOUNGSTER;
+ trainerGfx1 = OBJECT_EVENT_GFX_YOUNGSTER;
+ trainerGfx2 = OBJECT_EVENT_GFX_YOUNGSTER;
}
- VarSet(VAR_OBJ_GFX_ID_0, r1);
- VarSet(VAR_OBJ_GFX_ID_3, r4_);
+ VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);
+ VarSet(VAR_OBJ_GFX_ID_3, trainerGfx2);
break;
- case 2:
- for (r4 = 0; r4 < 3; r4++)
+ case CHALLENGE_TYPE_KNOCKOUT:
+ for (j = 0; j < MAX_TRAINERS_PER_FLOOR; j++)
{
- r2 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].facilityClass;
- for (r3 = 0; r3 < NELEMS(sSingleBattleTrainerInfo); r3++)
+ facilityClass = CURR_FLOOR.trainers[j].facilityClass;
+ for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)
{
- if (sSingleBattleTrainerInfo[r3].facilityClass == r2)
+ if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r3 != NELEMS(sSingleBattleTrainerInfo))
- r1 = sSingleBattleTrainerInfo[r3].mapObjGfx;
+
+ if (i != NELEMS(sSingleBattleTrainerInfo))
+ trainerGfx1 = sSingleBattleTrainerInfo[i].objGfx;
else
- r1 = OBJECT_EVENT_GFX_YOUNGSTER;
- switch (r4)
+ trainerGfx1 = OBJECT_EVENT_GFX_YOUNGSTER;
+
+ switch (j)
{
case 0:
- VarSet(VAR_OBJ_GFX_ID_2, r1);
+ VarSet(VAR_OBJ_GFX_ID_2, trainerGfx1);
break;
case 1:
- VarSet(VAR_OBJ_GFX_ID_0, r1);
+ VarSet(VAR_OBJ_GFX_ID_0, trainerGfx1);
break;
case 2:
- VarSet(VAR_OBJ_GFX_ID_1, r1);
+ VarSet(VAR_OBJ_GFX_ID_1, trainerGfx1);
break;
}
}
@@ -652,207 +657,224 @@ static void TT_ConvertEasyChatMessageToString(u16 *ecWords, u8 *dest)
}
}
-static void sub_815DF54(void)
+static void BufferTowerOpponentSpeech(void)
{
- u16 r4 = gSpecialVar_0x8006;
- u8 r1;
- u8 r5 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
+ u16 trainerId = gSpecialVar_0x8006;
+ u8 facilityClass;
+ u8 challengeType = CURR_FLOOR.challengeType;
- if (r5 != 1)
- r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].facilityClass;
+ if (challengeType != CHALLENGE_TYPE_DOUBLE)
+ facilityClass = CURR_FLOOR.trainers[trainerId].facilityClass;
else
- r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].facilityClass;
+ facilityClass = CURR_FLOOR.trainers[0].facilityClass;
+
switch (gSpecialVar_0x8005)
{
- case 2:
- TrainerTowerGetOpponentTextColor(r5, r1);
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechBefore, gStringVar4);
+ case TRAINER_TOWER_TEXT_INTRO:
+ TrainerTowerGetOpponentTextColor(challengeType, facilityClass);
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechBefore, gStringVar4);
break;
- case 3:
- TrainerTowerGetOpponentTextColor(r5, r1);
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechWin, gStringVar4);
+ case TRAINER_TOWER_TEXT_PLAYER_LOST:
+ TrainerTowerGetOpponentTextColor(challengeType, facilityClass);
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechWin, gStringVar4);
break;
- case 4:
- TrainerTowerGetOpponentTextColor(r5, r1);
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechLose, gStringVar4);
+ case TRAINER_TOWER_TEXT_PLAYER_WON:
+ TrainerTowerGetOpponentTextColor(challengeType, facilityClass);
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechLose, gStringVar4);
break;
- case 5:
- TT_ConvertEasyChatMessageToString(sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[r4].speechAfter, gStringVar4);
+ case TRAINER_TOWER_TEXT_AFTER:
+ TT_ConvertEasyChatMessageToString(CURR_FLOOR.trainers[trainerId].speechAfter, gStringVar4);
break;
}
}
-static void TrainerTowerGetOpponentTextColor(u8 battleType, u8 facilityClass)
+static void TrainerTowerGetOpponentTextColor(u8 challengeType, u8 facilityClass)
{
- u16 r5 = FALSE;
- s32 r4;
- switch (battleType)
+ u16 gender = MALE;
+ int i;
+ switch (challengeType)
{
- case 0:
- case 2:
- for (r4 = 0; r4 < NELEMS(sSingleBattleTrainerInfo); r4++)
+ case CHALLENGE_TYPE_SINGLE:
+ case CHALLENGE_TYPE_KNOCKOUT:
+ for (i = 0; i < NELEMS(sSingleBattleTrainerInfo); i++)
{
- if (sSingleBattleTrainerInfo[r4].facilityClass == facilityClass)
+ if (sSingleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r4 != NELEMS(sSingleBattleTrainerInfo))
- r5 = sSingleBattleTrainerInfo[r4].gender;
+ if (i != NELEMS(sSingleBattleTrainerInfo))
+ gender = sSingleBattleTrainerInfo[i].gender;
break;
- case 1:
- for (r4 = 0; r4 < NELEMS(sDoubleBattleTrainerInfo); r4++)
+ case CHALLENGE_TYPE_DOUBLE:
+ for (i = 0; i < NELEMS(sDoubleBattleTrainerInfo); i++)
{
- if (sDoubleBattleTrainerInfo[r4].facilityClass == facilityClass)
+ if (sDoubleBattleTrainerInfo[i].facilityClass == facilityClass)
break;
}
- if (r4 != NELEMS(sDoubleBattleTrainerInfo))
+ if (i != NELEMS(sDoubleBattleTrainerInfo))
{
if (VarGet(VAR_TEMP_3))
- r5 = sDoubleBattleTrainerInfo[r4].gender2;
+ gender = sDoubleBattleTrainerInfo[i].gender2;
else
- r5 = sDoubleBattleTrainerInfo[r4].gender1;
+ gender = sDoubleBattleTrainerInfo[i].gender1;
}
break;
}
gSpecialVar_PrevTextColor = gSpecialVar_TextColor;
- gSpecialVar_TextColor = r5;
+ gSpecialVar_TextColor = gender;
}
-static void sub_815E114(void)
+static void CB2_EndTrainerTowerBattle(void)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
-static void sub_815E124(u8 taskId)
+static void Task_DoTrainerTowerBattle(u8 taskId)
{
if (BT_IsDone() == TRUE)
{
- gMain.savedCallback = sub_815E114;
+ gMain.savedCallback = CB2_EndTrainerTowerBattle;
CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitBattle);
DestroyTask(taskId);
}
}
-static void sub_815E160(void)
+static void DoTrainerTowerBattle(void)
{
gBattleTypeFlags = BATTLE_TYPE_TRAINER | BATTLE_TYPE_TRAINER_TOWER;
- if (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType == 1)
+
+ if (CURR_FLOOR.challengeType == CHALLENGE_TYPE_DOUBLE)
gBattleTypeFlags |= BATTLE_TYPE_DOUBLE;
+
gTrainerBattleOpponent_A = 0;
BuildEnemyParty();
- CreateTask(sub_815E124, 1);
+ CreateTask(Task_DoTrainerTowerBattle, 1);
PlayMapChosenOrBattleBGM(0);
BT_StartOnField(BattleSetup_GetBattleTowerBattleTransition());
}
-static void sub_815E1C0(void)
+static void TrainerTowerGetChallengeType(void)
{
if (!gSpecialVar_0x8005)
- gSpecialVar_Result = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType;
+ gSpecialVar_Result = CURR_FLOOR.challengeType;
}
-static void sub_815E1F0(void)
+static void TrainerTowerAddFloorCleared(void)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8++;
+ TRAINER_TOWER.floorsCleared++;
}
-static void TTSpecial_HasReachedTheRoof(void)
+// So the player can safely go back through defeated floors to use the Poke Center (or exit challenge)
+static void GetFloorAlreadyBeaten(void)
{
u16 mapLayoutId = gMapHeader.mapLayoutId;
- if (mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_1F == gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 && mapLayoutId - LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY <= sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].floorIdx)
+ if (mapLayoutId - LAYOUT_TRAINER_TOWER_1F == TRAINER_TOWER.floorsCleared
+ && mapLayoutId - LAYOUT_TRAINER_TOWER_LOBBY <= CURR_FLOOR.floorIdx)
gSpecialVar_Result = FALSE;
else
gSpecialVar_Result = TRUE;
}
-static void sub_815E28C(void)
+static void StartTrainerTowerChallenge(void)
{
- gSaveBlock1Ptr->unkArrayIdx = gSpecialVar_0x8005;
- if (gSaveBlock1Ptr->unkArrayIdx >= NELEMS(gSaveBlock1Ptr->unkArray))
- gSaveBlock1Ptr->unkArrayIdx = 0;
+ gSaveBlock1Ptr->towerChallengeId = gSpecialVar_0x8005;
+ if (gSaveBlock1Ptr->towerChallengeId >= NUM_TOWER_CHALLENGE_TYPES)
+ gSaveBlock1Ptr->towerChallengeId = 0;
ValidateOrResetCurTrainerTowerRecord();
- if (!sub_815D834())
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_5 = TRUE;
+ if (!ReadTrainerHillAndValidate())
+ TRAINER_TOWER.validated = TRUE;
else
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_5 = FALSE;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8 = 0;
- SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 0;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2 = FALSE;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1 = FALSE;
+ TRAINER_TOWER.validated = FALSE;
+ TRAINER_TOWER.floorsCleared = 0;
+ SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);
+ TRAINER_TOWER.timer = 0;
+ TRAINER_TOWER.spokeToOwner = FALSE;
+ TRAINER_TOWER.checkedFinalTime = FALSE;
}
-static void sub_815E394(void)
+static void GetOwnerState(void)
{
DisableVBlankCounter1();
gSpecialVar_Result = 0;
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2)
+
+ if (TRAINER_TOWER.spokeToOwner)
gSpecialVar_Result++;
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 && gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1)
+ if (TRAINER_TOWER.receivedPrize && TRAINER_TOWER.checkedFinalTime)
gSpecialVar_Result++;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2 = TRUE;
+
+ TRAINER_TOWER.spokeToOwner = TRUE;
}
-static void sub_815E408(void)
+static void GiveChallengePrize(void)
{
- u16 itemId = gUnknown_847A2B4[sTrainerTowerState->unk_0004.floors->prize];
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0)
+ u16 itemId = sPrizeList[sTrainerTowerState->unk_0004.floors->prize];
+
+ if (TRAINER_TOWER.receivedPrize)
+ {
gSpecialVar_Result = 2;
- else if (AddBagItem(itemId, 1) == 1)
+ }
+ else if (AddBagItem(itemId, 1) == TRUE)
{
CopyItemName(itemId, gStringVar2);
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = TRUE;
+ TRAINER_TOWER.receivedPrize = TRUE;
gSpecialVar_Result = 0;
}
else
+ {
gSpecialVar_Result = 1;
+ }
}
-static void sub_815E4B0(void)
+static void CheckFinalTime(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1)
+ if (TRAINER_TOWER.checkedFinalTime)
+ {
gSpecialVar_Result = 2;
- else if (GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4) > gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0)
+ }
+ else if (GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime) > TRAINER_TOWER.timer)
{
- SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
+ SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER.timer);
gSpecialVar_Result = 0;
}
else
+ {
gSpecialVar_Result = 1;
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_1 = TRUE;
+ }
+
+ TRAINER_TOWER.checkedFinalTime = TRUE;
}
-static void TTSpecial_StartTimer(void)
+static void TrainerTowerResumeTimer(void)
{
- if (!gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2)
+ if (!TRAINER_TOWER.spokeToOwner)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 >= 215999)
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 215999;
+ if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME)
+ TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME;
else
- SetVBlankCounter1Ptr(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
+ SetVBlankCounter1Ptr(&TRAINER_TOWER.timer);
}
}
-static void sub_815E5C4(void)
+static void TrainerTowerSetPlayerLost(void)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3 = 1;
+ TRAINER_TOWER.hasLost = TRUE;
}
-static void sub_815E5F0(void)
+static void GetTrainerTowerChallengeStatus(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3)
+ if (TRAINER_TOWER.hasLost)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_3 = FALSE;
- gSpecialVar_Result = 0;
+ TRAINER_TOWER.hasLost = FALSE;
+ gSpecialVar_Result = CHALLENGE_STATUS_LOST;
}
- else if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_4)
+ else if (TRAINER_TOWER.unkA_4)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_4 = FALSE;
- gSpecialVar_Result = 1;
+ TRAINER_TOWER.unkA_4 = FALSE;
+ gSpecialVar_Result = CHALLENGE_STATUS_UNK;
}
else
{
- gSpecialVar_Result = 2;
+ gSpecialVar_Result = CHALLENGE_STATUS_NORMAL;
}
}
@@ -861,8 +883,8 @@ static void sub_815E5F0(void)
\
frames = (src); \
\
- minutes = frames / 3600; \
- frames %= 3600; \
+ minutes = frames / (60 * 60); \
+ frames %= (60 * 60); \
seconds = frames / 60; \
frames %= 60; \
centiseconds = frames * 168 / 100; \
@@ -872,34 +894,34 @@ static void sub_815E5F0(void)
ConvertIntToDecimalStringN(gStringVar3, centiseconds, STR_CONV_MODE_LEADING_ZEROS, 2); \
})
-static void sub_815E658(void)
+static void GetCurrentTime(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 >= 215999)
+ if (TRAINER_TOWER.timer >= TRAINER_TOWER_MAX_TIME)
{
DisableVBlankCounter1();
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0 = 215999;
+ TRAINER_TOWER.timer = TRAINER_TOWER_MAX_TIME;
}
- PRINT_TOWER_TIME(gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk0);
+ PRINT_TOWER_TIME(TRAINER_TOWER.timer);
}
-static void sub_815E720(void)
+static void ShowResultsBoard(void)
{
u8 windowId;
s32 i;
ValidateOrResetCurTrainerTowerRecord();
- windowId = AddWindow(gUnknown_847A218);
+ windowId = AddWindow(sTimeBoardWindowTemplate);
LoadStdWindowFrameGfx();
DrawStdWindowFrame(windowId, FALSE);
- AddTextPrinterParameterized(windowId, 2, gUnknown_83FE982, 0x4A, 0, 0xFF, NULL);
+ AddTextPrinterParameterized(windowId, 2, gText_TimeBoard, 0x4A, 0, 0xFF, NULL);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
{
- PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4));
+ PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime));
- StringExpandPlaceholders(gStringVar4, gUnknown_83FE998);
- AddTextPrinterParameterized(windowId, 2, gUnknown_83FE9C4[i - 1], 0x18, 0x24 + 0x14 * i, 0xFF, NULL);
+ StringExpandPlaceholders(gStringVar4, gText_XMinYZSec);
+ AddTextPrinterParameterized(windowId, 2, gTrainerTowerChallengeTypeTexts[i - 1], 0x18, 0x24 + 0x14 * i, 0xFF, NULL);
AddTextPrinterParameterized(windowId, 2, gStringVar4, 0x60, 0x2E + 0x14 * i, 0xFF, NULL);
}
@@ -908,23 +930,24 @@ static void sub_815E720(void)
VarSet(VAR_TEMP_1, windowId);
}
-static void sub_815E88C(void)
+static void CloseResultsBoard(void)
{
u8 windowId = VarGet(VAR_TEMP_1);
ClearStdWindowAndFrameToTransparent(windowId, TRUE);
RemoveWindow(windowId);
}
-static void sub_815E8B4(void)
+static void TrainerTowerGetDoublesEligiblity(void)
{
gSpecialVar_Result = GetMonsStateToDoubles();
}
-static void sub_815E8CC(void)
+
+static void TrainerTowerGetNumFloors(void)
{
- if (sTrainerTowerState->unk_0004.count != sTrainerTowerState->unk_0004.floors[0].floorIdx)
+ if (sTrainerTowerState->unk_0004.numFloors != sTrainerTowerState->unk_0004.floors[0].floorIdx)
{
- ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->unk_0004.count, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ConvertIntToDecimalStringN(gStringVar1, sTrainerTowerState->unk_0004.numFloors, STR_CONV_MODE_LEFT_ALIGN, 1);
gSpecialVar_Result = TRUE;
}
else
@@ -933,79 +956,78 @@ static void sub_815E8CC(void)
}
}
-static void sub_815E908(void)
+// Dummied? equivalent to gSpecialVar_Result = FALSE
+// If it were to return TRUE the player would be warped back to the lobby
+static void ShouldWarpToCounter(void)
{
- if (gMapHeader.mapLayoutId == LAYOUT_SEVEN_ISLAND_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0)
- {
+ if (gMapHeader.mapLayoutId == LAYOUT_TRAINER_TOWER_LOBBY && VarGet(VAR_MAP_SCENE_TRAINER_TOWER) == 0)
gSpecialVar_Result = FALSE;
- }
else
- {
gSpecialVar_Result = FALSE;
- }
}
-static void sub_815E948(void)
+static void PlayTrainerTowerEncounterMusic(void)
{
s32 i;
- u16 var_4001 = VarGet(VAR_TEMP_1);
- u8 r1 = sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[var_4001].facilityClass;
+ u16 idx = VarGet(VAR_TEMP_1);
+ u8 facilityClass = CURR_FLOOR.trainers[idx].facilityClass;
for (i = 0; i < NELEMS(sTrainerEncounterMusicLUT); i++)
{
- if (sTrainerEncounterMusicLUT[i].unk0 == gFacilityClassToTrainerClass[r1])
+ if (sTrainerEncounterMusicLUT[i].facilityClass == gFacilityClassToTrainerClass[facilityClass])
break;
}
+
if (i != NELEMS(sTrainerEncounterMusicLUT))
{
- var_4001 = sTrainerEncounterMusicLUT[i].unk1;
+ idx = sTrainerEncounterMusicLUT[i].musicId;
}
else
{
- var_4001 = 0;
+ idx = 0;
}
- PlayNewMapMusic(gUnknown_847A2D2[var_4001]);
+ PlayNewMapMusic(sTrainerTowerEncounterMusic[idx]);
}
-static void sub_815E9C8(void)
+static void HasSpokenToOwner(void)
{
- gSpecialVar_Result = gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_2;
+ gSpecialVar_Result = TRAINER_TOWER.spokeToOwner;
}
static void BuildEnemyParty(void)
{
u16 trainerIdx = VarGet(VAR_TEMP_1);
s32 level = GetPartyMaxLevel();
- u8 floorIdx = gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk8;
+ u8 floorIdx = TRAINER_TOWER.floorsCleared;
s32 i;
u8 monIdx;
ZeroEnemyPartyMons();
- switch (sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].challengeType)
+ switch (CURR_FLOOR.challengeType)
{
- case 0:
+ case CHALLENGE_TYPE_SINGLE:
default:
for (i = 0; i < 2; i++)
{
monIdx = sSingleBattleChallengeMonIdxs[floorIdx][i];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[i], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx]);
+ CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[i], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]);
}
break;
- case 1:
+ case CHALLENGE_TYPE_DOUBLE:
monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][0];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[0], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[0].mons[monIdx]);
+ CURR_FLOOR.trainers[0].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[0].mons[monIdx]);
monIdx = sDoubleBattleChallengeMonIdxs[floorIdx][1];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[1].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[1], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[1].mons[monIdx]);
+ CURR_FLOOR.trainers[1].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[1], &CURR_FLOOR.trainers[1].mons[monIdx]);
break;
- case 2:
+ case CHALLENGE_TYPE_KNOCKOUT:
monIdx = sKnockoutChallengeMonIdxs[floorIdx][trainerIdx];
- sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx].level = level;
- CreateBattleTowerMon(&gEnemyParty[0], &sTrainerTowerState->unk_0004.floors[sTrainerTowerState->floorIdx].trainers[trainerIdx].mons[monIdx]);
+ CURR_FLOOR.trainers[trainerIdx].mons[monIdx].level = level;
+ CreateBattleTowerMon(&gEnemyParty[0], &CURR_FLOOR.trainers[trainerIdx].mons[monIdx]);
break;
}
}
@@ -1030,11 +1052,11 @@ static s32 GetPartyMaxLevel(void)
static void ValidateOrResetCurTrainerTowerRecord(void)
{
- if (gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 != sTrainerTowerState->unk_0004.id)
+ if (TRAINER_TOWER.unk9 != sTrainerTowerState->unk_0004.id)
{
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk9 = sTrainerTowerState->unk_0004.id;
- SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unk4, 215999);
- gSaveBlock1Ptr->unkArray[gSaveBlock1Ptr->unkArrayIdx].unkA_0 = FALSE;
+ TRAINER_TOWER.unk9 = sTrainerTowerState->unk_0004.id;
+ SetTrainerTowerRecordTime(&TRAINER_TOWER.bestTime, TRAINER_TOWER_MAX_TIME);
+ TRAINER_TOWER.receivedPrize = FALSE;
}
}
@@ -1043,22 +1065,22 @@ void PrintTrainerTowerRecords(void)
s32 i;
u8 windowId = 0;
- sub_815DC8C();
+ SetUpTrainerTowerDataStruct();
FillWindowPixelRect(0, 0, 0, 0, 0xd8, 0x90);
ValidateOrResetCurTrainerTowerRecord();
- AddTextPrinterParameterized3(0, 2, 0x4a, 0, gUnknown_847A22C, 0, gUnknown_83FE982);
+ AddTextPrinterParameterized3(0, 2, 0x4a, 0, sTextColors, 0, gText_TimeBoard);
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
{
- PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[i].unk4));
- StringExpandPlaceholders(gStringVar4, gUnknown_83FE998);
- AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, gUnknown_847A22C, 0, gUnknown_83FE9C4[i]);
- AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, gUnknown_847A22C, 0, gStringVar4);
+ PRINT_TOWER_TIME(GetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime));
+ StringExpandPlaceholders(gStringVar4, gText_XMinYZSec);
+ AddTextPrinterParameterized3(windowId, 2, 0x18, 0x24 + 0x14 * i, sTextColors, 0, gTrainerTowerChallengeTypeTexts[i]);
+ AddTextPrinterParameterized3(windowId, 2, 0x60, 0x24 + 0x14 * i, sTextColors, 0, gStringVar4);
}
PutWindowTilemap(windowId);
CopyWindowToVram(windowId, 3);
- sub_815DD2C();
+ FreeTrainerTowerDataStruct();
}
static u32 GetTrainerTowerRecordTime(u32 *counter)
@@ -1075,8 +1097,8 @@ void ResetTrainerTowerResults(void)
{
s32 i;
- for (i = 0; i < 4; i++)
+ for (i = 0; i < NUM_TOWER_CHALLENGE_TYPES; i++)
{
- SetTrainerTowerRecordTime(&gSaveBlock1Ptr->unkArray[i].unk4, 215999);
+ SetTrainerTowerRecordTime(&gSaveBlock1Ptr->trainerTower[i].bestTime, TRAINER_TOWER_MAX_TIME);
}
}