Document battle_tower.c

This commit is contained in:
PikalaxALT
2019-11-09 14:53:30 -05:00
parent 55bede6ca2
commit 807fe60b22
5 changed files with 81 additions and 74 deletions
+2 -2
View File
@@ -1686,7 +1686,7 @@ _080D8038:
ands r0, r1
cmp r0, 0
beq _080D8058
bl sub_80E60E4
bl GetBattleTowerTrainerClassNameId
lsls r0, 24
lsrs r0, 24
movs r1, 0xD
@@ -1781,7 +1781,7 @@ _080D80F0:
cmp r0, 0
beq _080D810C
mov r0, sp
bl get_trainer_name
bl GetBattleTowerTrainerName
b _080D8382
.align 2, 0
_080D8108: .4byte gBattleTypeFlags
+1 -1
View File
@@ -239,7 +239,7 @@ gSpecials:: @ 815FD60
def_special nullsub_75
def_special nullsub_75
def_special Special_GetLeadMonFriendship
def_special sub_80E5970
def_special ScrSpecial_BattleTowerMapScript2
def_special ChooseNextBattleTowerTrainer
def_special CheckPartyBattleTowerBanlist
def_special PrintBattleTowerTrainerGreeting
+1 -1
View File
@@ -432,7 +432,7 @@ struct BattleStruct
u16 changedItems[MAX_BATTLERS_COUNT];
u8 intimidateBattler;
u8 switchInItemsCounter;
u8 arenaTurnCounter; // not used in FR?
u8 field_DA; // not used in FR?
u8 turnSideTracker;
u8 fillerDC[0xDF-0xDC];
u8 givenExpMons;
+7
View File
@@ -72,4 +72,11 @@
#define BATTLE_TOWER_ITEM_LUCKY_PUNCH 61
#define BATTLE_TOWER_ITEM_GANLON_BERRY 62
#define BTSPECIAL_TEST 0
#define BTSPECIAL_RESULT_SAVE_SCUM 1
#define BTSPECIAL_RESULT_WON7 2
#define BTSPECIAL_RESULT_LOST 3
#define BTSPECIAL_RESULT_QUICKSAVE 4
#define BTSPECIAL_RESULT_INACTIVE 5
#endif //GUARD_CONSTANTS_BATTLE_TOWER_H
+70 -70
View File
@@ -26,25 +26,26 @@
#include "constants/vars.h"
#include "constants/map_objects.h"
EWRAM_DATA u16 gUnknown_203AAB8 = 0;
static EWRAM_DATA u16 sSpecialVar_0x8004_Copy = 0;
#define TakeBravoTrainerBattleTowerOffTheAir()
#define ewram160FB (*((u8 *)&gBattleStruct->field_DA))
void ResetBattleTowerStreak(u8 levelType);
void sub_80E5E5C(u8 trainerClass);
void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid);
void SaveCurrentWinStreak(void);
void ValidateBattleTowerRecordChecksums(void);
void SetBattleTowerRecordChecksum(struct BattleTowerRecord * record);
void ClearBattleTowerRecord(struct BattleTowerRecord * record);
void sub_80E712C(void);
u16 GetCurrentBattleTowerWinStreak(u8 levelType);
void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer * eReaderTrainer);
void PrintEReaderTrainerFarewellMessage(void);
static void ResetBattleTowerStreak(u8 levelType);
static void SetBattleTowerTrainerGfxId(u8 trainerClass);
static void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid);
static void SaveCurrentWinStreak(void);
static void ValidateBattleTowerRecordChecksums(void);
static void SetBattleTowerRecordChecksum(struct BattleTowerRecord * record);
static void ClearBattleTowerRecord(struct BattleTowerRecord * record);
static void PopulateBravoTrainerBattleTowerLostData(void);
static u16 GetCurrentBattleTowerWinStreak(u8 levelType);
static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer * eReaderTrainer);
static void PrintEReaderTrainerFarewellMessage(void);
#include "data/battle_tower/trainers.h"
const u16 sBattleTowerHeldItems[] = {
static const u16 sBattleTowerHeldItems[] = {
ITEM_NONE,
ITEM_KINGS_ROCK,
ITEM_SITRUS_BERRY,
@@ -113,22 +114,22 @@ const u16 sBattleTowerHeldItems[] = {
#include "data/battle_tower/level_50_mons.h"
#include "data/battle_tower/level_100_mons.h"
const u8 sMaleTrainerClasses[] =
static const u8 sMaleTrainerClasses[] =
{
};
const u8 sFemaleTrainerClasses[] =
static const u8 sFemaleTrainerClasses[] =
{
};
const u8 sMaleTrainerGfx[] =
static const u8 sMaleTrainerGfx[] =
{
};
const u8 sFemaleTrainerGfx[] =
static const u8 sFemaleTrainerGfx[] =
{
};
@@ -147,7 +148,7 @@ const u16 gBattleTowerBannedSpecies[] = {
0xFFFF
};
const u16 sShortStreakPrizes[] = {
static const u16 sShortStreakPrizes[] = {
ITEM_HP_UP,
ITEM_PROTEIN,
ITEM_IRON,
@@ -156,7 +157,7 @@ const u16 sShortStreakPrizes[] = {
ITEM_ZINC
};
const u16 sLongStreakPrizes[] = {
static const u16 sLongStreakPrizes[] = {
ITEM_BRIGHT_POWDER,
ITEM_WHITE_HERB,
ITEM_QUICK_CLAW,
@@ -168,7 +169,7 @@ const u16 sLongStreakPrizes[] = {
ITEM_CHOICE_BAND
};
void sub_80E5970(void)
void ScrSpecial_BattleTowerMapScript2(void)
{
u8 count = 0;
s32 levelType;
@@ -185,40 +186,40 @@ void sub_80E5970(void)
break;
case 1:
ResetBattleTowerStreak(levelType);
VarSet(VAR_0x4000, 1);
VarSet(VAR_0x4000, BTSPECIAL_RESULT_SAVE_SCUM);
count++;
break;
case 3:
break;
case 4:
VarSet(VAR_0x4000, 2);
VarSet(VAR_0x4000, BTSPECIAL_RESULT_WON7);
count++;
break;
case 5:
VarSet(VAR_0x4000, 3);
VarSet(VAR_0x4000, BTSPECIAL_RESULT_LOST);
count++;
break;
case 6:
break;
case 2:
VarSet(VAR_0x4000, 4);
VarSet(VAR_0x4000, BTSPECIAL_RESULT_QUICKSAVE);
count++;
break;
}
}
if (gSaveBlock2Ptr->battleTower.var_4AE[0] == 3 && gSaveBlock2Ptr->battleTower.var_4AE[1] == 3)
VarSet(VAR_0x4000, 5);
VarSet(VAR_0x4000, BTSPECIAL_RESULT_INACTIVE);
ValidateBattleTowerRecordChecksums();
}
void ResetBattleTowerStreak(u8 levelType)
static void ResetBattleTowerStreak(u8 levelType)
{
gSaveBlock2Ptr->battleTower.var_4AE[levelType] = 0;
gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] = 1;
gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] = 1;
}
bool8 sub_80E5A70(u8 levelType, u16 winStreak)
static bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak)
{
u8 trainerTeamLevel;
u8 monLevel;
@@ -259,7 +260,7 @@ bool8 sub_80E5A70(u8 levelType, u16 winStreak)
return (numValid == 3);
}
bool8 sub_80E5B14(void)
static bool8 ChooseSpecialBattleTowerTrainer(void)
{
s32 recordIndex, i;
u8 battleTowerLevelType;
@@ -272,7 +273,7 @@ bool8 sub_80E5B14(void)
battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
if (sub_80E5A70(battleTowerLevelType, winStreak))
if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak))
{
gSaveBlock2Ptr->battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID;
retVal = TRUE;
@@ -323,9 +324,9 @@ void ChooseNextBattleTowerTrainer(void)
bool8 levelType;
levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
if (sub_80E5B14())
if (ChooseSpecialBattleTowerTrainer())
{
sub_80E5E5C(gSaveBlock2Ptr->battleTower.battleTowerTrainerId);
SetBattleTowerTrainerGfxId(gSaveBlock2Ptr->battleTower.battleTowerTrainerId);
gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId;
return;
}
@@ -372,23 +373,24 @@ void ChooseNextBattleTowerTrainer(void)
gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId;
}
sub_80E5E5C(gSaveBlock2Ptr->battleTower.battleTowerTrainerId);
SetBattleTowerTrainerGfxId(gSaveBlock2Ptr->battleTower.battleTowerTrainerId);
// Don't bother saving this trainer, since it's the last one in the challenge.
if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] < 7)
gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId;
}
void sub_80E5E5C(u8 trainerClass)
static void SetBattleTowerTrainerGfxId(u8 trainerClass)
{
VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_YOUNGSTER);
}
void SetEReaderTrainerGfxId(void)
{
sub_80E5E5C(BATTLE_TOWER_EREADER_TRAINER_ID);
SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID);
}
void sub_80E5E7C(struct BattleTowerRecord * record0)
// Unreferenced; formerly used by Record Mixing in R/S
static void UpdateOrInsertReceivedBattleTowerRecord(struct BattleTowerRecord * record0)
{
s32 i;
s32 j;
@@ -488,7 +490,7 @@ u8 GetBattleTowerTrainerFrontSpriteId(void)
}
}
u8 sub_80E60E4(void)
u8 GetBattleTowerTrainerClassNameId(void)
{
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
{
@@ -504,7 +506,7 @@ u8 sub_80E60E4(void)
}
}
void get_trainer_name(u8 *dest)
void GetBattleTowerTrainerName(u8 *dest)
{
s32 i;
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
@@ -526,7 +528,7 @@ void get_trainer_name(u8 *dest)
}
#ifdef NONMATCHING // r6/r7 swap
void FillBattleTowerTrainerParty(void)
static void FillBattleTowerTrainerParty(void)
{
s32 partyIndex;
s32 i;
@@ -700,7 +702,7 @@ void FillBattleTowerTrainerParty(void)
}
#else
NAKED
void FillBattleTowerTrainerParty(void)
static void FillBattleTowerTrainerParty(void)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmov r7, r10\n"
@@ -1077,7 +1079,7 @@ void FillBattleTowerTrainerParty(void)
}
#endif //NONMATCHING
u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count)
static u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count)
{
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))
{
@@ -1103,7 +1105,7 @@ u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count)
return count;
}
void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid)
static void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid)
{
s32 i;
u32 counter = 0;
@@ -1191,7 +1193,7 @@ void CheckPartyBattleTowerBanlist(void)
}
}
void PrintBattleTowerTrainerMessage(const u16 *greeting)
static void PrintBattleTowerTrainerMessage(const u16 *greeting)
{
s32 i;
if (EC_DoesEasyChatStringFitOnLine(greeting, 3, 2, 18))
@@ -1220,12 +1222,12 @@ void PrintBattleTowerTrainerGreeting(void)
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);
}
void sub_80E6854(void)
static void CB2_FinishEReaderBattle(void)
{
s32 i;
u16 heldItem;
switch (gUnknown_203AAB8)
switch (sSpecialVar_0x8004_Copy)
{
case 0:
break;
@@ -1244,11 +1246,11 @@ void sub_80E6854(void)
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
void sub_80E68C4(u8 taskId)
static void Task_WaitBT(u8 taskId)
{
if (BT_IsDone() == TRUE)
{
gMain.savedCallback = sub_80E6854;
gMain.savedCallback = CB2_FinishEReaderBattle;
CleanupOverworldWindowsAndTilemaps();
SetMainCallback2(CB2_InitBattle);
DestroyTask(taskId);
@@ -1262,8 +1264,8 @@ void StartSpecialBattle(void)
u16 heldItem;
u8 transition;
gUnknown_203AAB8 = gSpecialVar_0x8004;
switch (gUnknown_203AAB8)
sSpecialVar_0x8004_Copy = gSpecialVar_0x8004;
switch (sSpecialVar_0x8004_Copy)
{
case 0: // battle tower battle
gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER);
@@ -1271,7 +1273,7 @@ void StartSpecialBattle(void)
FillBattleTowerTrainerParty();
CreateTask(sub_80E68C4, 1);
CreateTask(Task_WaitBT, 1);
PlayMapChosenOrBattleBGM(0);
transition = BattleSetup_GetBattleTowerBattleTransition();
BT_StartOnField(transition);
@@ -1283,7 +1285,7 @@ void StartSpecialBattle(void)
SetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM, &heldItem);
}
CreateTask(sub_80E68C4, 1);
CreateTask(Task_WaitBT, 1);
PlayMapChosenOrBattleBGM(0);
transition = BattleSetup_GetBattleTowerBattleTransition();
BT_StartOnField(transition);
@@ -1297,7 +1299,7 @@ void StartSpecialBattle(void)
gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER);
gTrainerBattleOpponent_A = 0;
CreateTask(sub_80E68C4, 1);
CreateTask(Task_WaitBT, 1);
PlayMapChosenOrBattleBGM(0);
transition = BattleSetup_GetBattleTowerBattleTransition();
BT_StartOnField(transition);
@@ -1313,9 +1315,7 @@ void SetBattleTowerProperty(void)
switch (gSpecialVar_0x8004)
{
case 0:
// Weird cast required to match
// Leftover from RS macro?
*((u8 *)&gBattleStruct->arenaTurnCounter) = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType];
ewram160FB = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType];
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005;
break;
case 1:
@@ -1364,7 +1364,7 @@ void SetBattleTowerProperty(void)
ResetBattleTowerStreak(battleTowerLevelType);
break;
case 12:
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = *((u8 *)&gBattleStruct->arenaTurnCounter);
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = ewram160FB;
break;
case 13:
gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
@@ -1413,7 +1413,7 @@ void BattleTowerUtil(void)
ResetBattleTowerStreak(battleTowerLevelType);
break;
case 12:
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = *((u8 *)&gBattleStruct->arenaTurnCounter);
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = ewram160FB;
break;
case 13:
gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
@@ -1434,7 +1434,7 @@ void SetBattleTowerParty(void)
ReducePlayerPartyToThree();
}
void SaveCurrentWinStreak(void)
static void SaveCurrentWinStreak(void)
{
u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
u16 streak = GetCurrentBattleTowerWinStreak(levelType);
@@ -1464,7 +1464,7 @@ void SaveCurrentWinStreak(void)
}
}
void sub_80E6EE0(void)
static void SetPlayerBattleTowerRecord(void)
{
s32 i;
u8 trainerClass;
@@ -1508,17 +1508,17 @@ void SaveBattleTowerProgress(void)
{
if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] > 1
|| gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] > 1)
sub_80E6EE0();
SetPlayerBattleTowerRecord();
}
sub_80E712C();
PopulateBravoTrainerBattleTowerLostData();
gSaveBlock2Ptr->battleTower.battleOutcome = gBattleOutcome;
if (gSpecialVar_0x8004 != 3)
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004;
VarSet(VAR_0x4000, 0);
VarSet(VAR_0x4000, BTSPECIAL_TEST);
gSaveBlock2Ptr->battleTower.unk_554 = 1;
TrySavingData(SAVE_EREADER);
}
@@ -1528,7 +1528,7 @@ void BattleTower_SoftReset(void)
DoSoftReset();
}
void ValidateBattleTowerRecordChecksums(void)
static void ValidateBattleTowerRecordChecksums(void)
{
u32 i;
s32 recordIndex;
@@ -1555,7 +1555,7 @@ void ValidateBattleTowerRecordChecksums(void)
}
}
void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record)
static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record)
{
u32 i;
@@ -1564,7 +1564,7 @@ void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record)
record->checksum += ((u32 *)record)[i];
}
void ClearBattleTowerRecord(struct BattleTowerRecord *record)
static void ClearBattleTowerRecord(struct BattleTowerRecord *record)
{
u32 i;
@@ -1572,11 +1572,11 @@ void ClearBattleTowerRecord(struct BattleTowerRecord *record)
((u32 *)record)[i] = 0;
}
void sub_80E712C(void)
static void PopulateBravoTrainerBattleTowerLostData(void)
{
s32 i;
get_trainer_name(gSaveBlock2Ptr->battleTower.defeatedByTrainerName);
GetBattleTowerTrainerName(gSaveBlock2Ptr->battleTower.defeatedByTrainerName);
gSaveBlock2Ptr->battleTower.defeatedBySpecies = gBattleMons[1].species;
gSaveBlock2Ptr->battleTower.firstMonSpecies = gBattleMons[0].species;
@@ -1584,7 +1584,7 @@ void sub_80E712C(void)
gSaveBlock2Ptr->battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i];
}
u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType)
static u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType)
{
u16 winStreak = ((gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1)
+ gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];
@@ -1656,7 +1656,7 @@ void AwardBattleTowerRibbons(void)
// This is a leftover debugging function that is used to populate the E-Reader
// trainer with the player's current data.
void Debug_FillEReaderTrainerWithPlayerData(void)
static void Debug_FillEReaderTrainerWithPlayerData(void)
{
struct BattleTowerEReaderTrainer *ereaderTrainer;
s32 i;
@@ -1746,7 +1746,7 @@ void ValidateEReaderTrainer(void)
}
}
void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer)
static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer)
{
s32 i;
@@ -1768,7 +1768,7 @@ void PrintEReaderTrainerGreeting(void)
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
}
void PrintEReaderTrainerFarewellMessage(void)
static void PrintEReaderTrainerFarewellMessage(void)
{
if (gBattleOutcome == B_OUTCOME_DREW)
gStringVar4[0] = EOS;