Finish decomp of battle_tower
This commit is contained in:
@@ -1781,7 +1781,7 @@ _080D80F0:
|
||||
cmp r0, 0
|
||||
beq _080D810C
|
||||
mov r0, sp
|
||||
bl sub_80E6150
|
||||
bl get_trainer_name
|
||||
b _080D8382
|
||||
.align 2, 0
|
||||
_080D8108: .4byte gBattleTypeFlags
|
||||
|
||||
-2175
File diff suppressed because it is too large
Load Diff
+4
-4
@@ -12663,7 +12663,7 @@ sub_811C04C: @ 811C04C
|
||||
ldr r6, _0811C0CC @ =gPlayerParty
|
||||
ldr r5, _0811C0D0 @ =gEnemyParty
|
||||
_0811C05C:
|
||||
ldr r0, _0811C0D4 @ =gUnknown_203B0D4
|
||||
ldr r0, _0811C0D4 @ =gSelectedOrderFromParty
|
||||
adds r0, r4, r0
|
||||
ldrb r0, [r0]
|
||||
subs r0, 0x1
|
||||
@@ -12717,7 +12717,7 @@ _0811C096:
|
||||
.align 2, 0
|
||||
_0811C0CC: .4byte gPlayerParty
|
||||
_0811C0D0: .4byte gEnemyParty
|
||||
_0811C0D4: .4byte gUnknown_203B0D4
|
||||
_0811C0D4: .4byte gSelectedOrderFromParty
|
||||
_0811C0D8: .4byte gTrainerBattleOpponent_A
|
||||
_0811C0DC: .4byte CB2_InitBattle
|
||||
thumb_func_end sub_811C04C
|
||||
@@ -13029,7 +13029,7 @@ _0811C3BC:
|
||||
movs r1, 0
|
||||
movs r2, 0x20
|
||||
bl memset
|
||||
ldr r0, _0811C3DC @ =gUnknown_203B0D4
|
||||
ldr r0, _0811C3DC @ =gSelectedOrderFromParty
|
||||
ldrb r1, [r0]
|
||||
ldrb r0, [r0, 0x1]
|
||||
cmn r1, r0
|
||||
@@ -13038,7 +13038,7 @@ _0811C3BC:
|
||||
b _0811C3E2
|
||||
.align 2, 0
|
||||
_0811C3D8: .4byte gBlockSendBuffer
|
||||
_0811C3DC: .4byte gUnknown_203B0D4
|
||||
_0811C3DC: .4byte gSelectedOrderFromParty
|
||||
_0811C3E0:
|
||||
movs r0, 0x51
|
||||
_0811C3E2:
|
||||
|
||||
+21
-21
@@ -1152,7 +1152,7 @@ sub_811F388: @ 811F388
|
||||
muls r0, r4
|
||||
ldr r1, _0811F3AC @ =gPlayerParty
|
||||
adds r0, r1
|
||||
ldr r5, _0811F3B0 @ =gUnknown_203B0D4
|
||||
ldr r5, _0811F3B0 @ =gSelectedOrderFromParty
|
||||
bl sub_8127550
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
@@ -1163,7 +1163,7 @@ sub_811F388: @ 811F388
|
||||
b _0811F3F8
|
||||
.align 2, 0
|
||||
_0811F3AC: .4byte gPlayerParty
|
||||
_0811F3B0: .4byte gUnknown_203B0D4
|
||||
_0811F3B0: .4byte gSelectedOrderFromParty
|
||||
_0811F3B4:
|
||||
adds r1, 0x2
|
||||
lsls r1, 24
|
||||
@@ -11131,7 +11131,7 @@ _0812418C:
|
||||
adds r0, r1
|
||||
mov r10, r0
|
||||
_081241B6:
|
||||
ldr r0, _0812420C @ =gUnknown_203B0D4
|
||||
ldr r0, _0812420C @ =gSelectedOrderFromParty
|
||||
adds r4, r5, r0
|
||||
ldrb r0, [r4]
|
||||
cmp r0, 0
|
||||
@@ -11168,7 +11168,7 @@ _081241FC: .4byte gUnknown_8416B16
|
||||
_08124200: .4byte gUnknown_203B09C
|
||||
_08124204: .4byte gUnknown_203B0A0
|
||||
_08124208: .4byte gTasks
|
||||
_0812420C: .4byte gUnknown_203B0D4
|
||||
_0812420C: .4byte gSelectedOrderFromParty
|
||||
_08124210: .4byte gUnknown_203B0B4
|
||||
_08124214: .4byte sub_811FB28
|
||||
_08124218:
|
||||
@@ -11237,7 +11237,7 @@ sub_8124278: @ 8124278
|
||||
adds r0, 0xD
|
||||
bl sub_8121CE4
|
||||
movs r4, 0
|
||||
ldr r3, _081242C0 @ =gUnknown_203B0D4
|
||||
ldr r3, _081242C0 @ =gSelectedOrderFromParty
|
||||
ldr r6, _081242C4 @ =gUnknown_203B0A0
|
||||
adds r5, r6, 0
|
||||
_0812429E:
|
||||
@@ -11257,7 +11257,7 @@ _0812429E:
|
||||
b _081242E6
|
||||
.align 2, 0
|
||||
_081242BC: .4byte gUnknown_203B09C
|
||||
_081242C0: .4byte gUnknown_203B0D4
|
||||
_081242C0: .4byte gSelectedOrderFromParty
|
||||
_081242C4: .4byte gUnknown_203B0A0
|
||||
_081242C8:
|
||||
ldrb r0, [r3, 0x1]
|
||||
@@ -11287,7 +11287,7 @@ _081242E6:
|
||||
movs r0, 0x1
|
||||
movs r2, 0x1
|
||||
bl sub_8121C70
|
||||
ldr r4, _08124348 @ =gUnknown_203B0D4
|
||||
ldr r4, _08124348 @ =gSelectedOrderFromParty
|
||||
ldrb r0, [r4]
|
||||
cmp r0, 0
|
||||
beq _08124312
|
||||
@@ -11324,7 +11324,7 @@ _08124328:
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_08124344: .4byte gUnknown_203B0B4
|
||||
_08124348: .4byte gUnknown_203B0D4
|
||||
_08124348: .4byte gSelectedOrderFromParty
|
||||
_0812434C: .4byte gTasks
|
||||
_08124350: .4byte sub_811FB28
|
||||
thumb_func_end sub_8124278
|
||||
@@ -17411,14 +17411,14 @@ _081274F8: .4byte sub_812773C
|
||||
thumb_func_start sub_81274FC
|
||||
sub_81274FC: @ 81274FC
|
||||
push {lr}
|
||||
ldr r0, _0812750C @ =gUnknown_203B0D4
|
||||
ldr r0, _0812750C @ =gSelectedOrderFromParty
|
||||
movs r1, 0
|
||||
movs r2, 0x3
|
||||
bl memset
|
||||
pop {r0}
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_0812750C: .4byte gUnknown_203B0D4
|
||||
_0812750C: .4byte gSelectedOrderFromParty
|
||||
thumb_func_end sub_81274FC
|
||||
|
||||
thumb_func_start sub_8127510
|
||||
@@ -17564,18 +17564,18 @@ sub_81275F8: @ 81275F8
|
||||
_08127618: .4byte gPlayerParty
|
||||
_0812761C: .4byte gUnknown_203B0A0
|
||||
_08127620:
|
||||
ldr r1, _0812762C @ =gUnknown_203B0D4
|
||||
ldr r1, _0812762C @ =gSelectedOrderFromParty
|
||||
ldrb r0, [r1, 0x2]
|
||||
cmp r0, 0
|
||||
bne _08127630
|
||||
movs r0, 0x11
|
||||
b _08127702
|
||||
.align 2, 0
|
||||
_0812762C: .4byte gUnknown_203B0D4
|
||||
_0812762C: .4byte gSelectedOrderFromParty
|
||||
_08127630:
|
||||
movs r5, 0
|
||||
_08127632:
|
||||
ldr r2, _081276DC @ =gUnknown_203B0D4
|
||||
ldr r2, _081276DC @ =gSelectedOrderFromParty
|
||||
adds r4, r2, r5
|
||||
ldrb r0, [r4]
|
||||
movs r1, 0x64
|
||||
@@ -17618,7 +17618,7 @@ _0812767E:
|
||||
adds r0, r2
|
||||
movs r1, 0
|
||||
ldrsh r4, [r0, r1]
|
||||
ldr r2, _081276DC @ =gUnknown_203B0D4
|
||||
ldr r2, _081276DC @ =gSelectedOrderFromParty
|
||||
adds r6, r2, r5
|
||||
ldrb r0, [r6]
|
||||
muls r0, r7
|
||||
@@ -17660,18 +17660,18 @@ _081276D0:
|
||||
bls _08127632
|
||||
b _08127700
|
||||
.align 2, 0
|
||||
_081276DC: .4byte gUnknown_203B0D4
|
||||
_081276DC: .4byte gSelectedOrderFromParty
|
||||
_081276E0: .4byte gUnknown_203B09C
|
||||
_081276E4: .4byte 0x00000236
|
||||
_081276E8:
|
||||
ldr r2, _081276F4 @ =gUnknown_203B0D4
|
||||
ldr r2, _081276F4 @ =gSelectedOrderFromParty
|
||||
ldrb r0, [r2, 0x1]
|
||||
cmp r0, 0
|
||||
bne _08127700
|
||||
movs r0, 0x12
|
||||
b _08127702
|
||||
.align 2, 0
|
||||
_081276F4: .4byte gUnknown_203B0D4
|
||||
_081276F4: .4byte gSelectedOrderFromParty
|
||||
_081276F8:
|
||||
movs r0, 0x13
|
||||
b _08127702
|
||||
@@ -17696,7 +17696,7 @@ sub_8127710: @ 8127710
|
||||
lsls r0, 24
|
||||
lsrs r2, r0, 24
|
||||
movs r1, 0
|
||||
ldr r3, _08127728 @ =gUnknown_203B0D4
|
||||
ldr r3, _08127728 @ =gSelectedOrderFromParty
|
||||
_0812771A:
|
||||
adds r0, r1, r3
|
||||
ldrb r0, [r0]
|
||||
@@ -17705,7 +17705,7 @@ _0812771A:
|
||||
movs r0, 0x1
|
||||
b _08127738
|
||||
.align 2, 0
|
||||
_08127728: .4byte gUnknown_203B0D4
|
||||
_08127728: .4byte gSelectedOrderFromParty
|
||||
_0812772C:
|
||||
adds r0, r1, 0x1
|
||||
lsls r0, 24
|
||||
@@ -17740,7 +17740,7 @@ sub_812773C: @ 812773C
|
||||
.align 2, 0
|
||||
_08127764: .4byte gTasks
|
||||
_08127768:
|
||||
ldr r0, _08127780 @ =gUnknown_203B0D4
|
||||
ldr r0, _08127780 @ =gSelectedOrderFromParty
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0
|
||||
beq _08127784
|
||||
@@ -17750,7 +17750,7 @@ _08127768:
|
||||
bl sub_811FA78
|
||||
b _0812779E
|
||||
.align 2, 0
|
||||
_08127780: .4byte gUnknown_203B0D4
|
||||
_08127780: .4byte gSelectedOrderFromParty
|
||||
_08127784:
|
||||
movs r0, 0x1A
|
||||
bl PlaySE
|
||||
|
||||
@@ -396,7 +396,7 @@ _080A034C: .4byte sub_80A0350
|
||||
thumb_func_start sub_80A0350
|
||||
sub_80A0350: @ 80A0350
|
||||
push {lr}
|
||||
ldr r0, _080A0360 @ =gUnknown_203B0D4
|
||||
ldr r0, _080A0360 @ =gSelectedOrderFromParty
|
||||
ldrb r1, [r0]
|
||||
cmp r1, 0
|
||||
bne _080A0368
|
||||
@@ -404,7 +404,7 @@ sub_80A0350: @ 80A0350
|
||||
strh r1, [r0]
|
||||
b _080A036E
|
||||
.align 2, 0
|
||||
_080A0360: .4byte gUnknown_203B0D4
|
||||
_080A0360: .4byte gSelectedOrderFromParty
|
||||
_080A0364: .4byte gSpecialVar_Result
|
||||
_080A0368:
|
||||
ldr r1, _080A0378 @ =gSpecialVar_Result
|
||||
@@ -438,7 +438,7 @@ _080A0398: .4byte sub_80A039C
|
||||
thumb_func_start sub_80A039C
|
||||
sub_80A039C: @ 80A039C
|
||||
push {r4,lr}
|
||||
ldr r0, _080A03B0 @ =gUnknown_203B0D4
|
||||
ldr r0, _080A03B0 @ =gSelectedOrderFromParty
|
||||
ldrb r4, [r0]
|
||||
cmp r4, 0
|
||||
bne _080A03B8
|
||||
@@ -447,7 +447,7 @@ sub_80A039C: @ 80A039C
|
||||
strh r4, [r0]
|
||||
b _080A03C2
|
||||
.align 2, 0
|
||||
_080A03B0: .4byte gUnknown_203B0D4
|
||||
_080A03B0: .4byte gSelectedOrderFromParty
|
||||
_080A03B4: .4byte gSpecialVar_Result
|
||||
_080A03B8:
|
||||
bl ReducePlayerPartyToThree
|
||||
@@ -481,7 +481,7 @@ ReducePlayerPartyToThree: @ 80A03D8
|
||||
ldr r6, _080A0454 @ =gPlayerParty
|
||||
adds r4, r7, 0
|
||||
_080A03F4:
|
||||
ldr r0, _080A0458 @ =gUnknown_203B0D4
|
||||
ldr r0, _080A0458 @ =gSelectedOrderFromParty
|
||||
adds r1, r5, r0
|
||||
ldrb r0, [r1]
|
||||
cmp r0, 0
|
||||
@@ -528,7 +528,7 @@ _080A042C:
|
||||
bx r0
|
||||
.align 2, 0
|
||||
_080A0454: .4byte gPlayerParty
|
||||
_080A0458: .4byte gUnknown_203B0D4
|
||||
_080A0458: .4byte gSelectedOrderFromParty
|
||||
_080A045C: .4byte 0x05000096
|
||||
thumb_func_end ReducePlayerPartyToThree
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ struct BattleTowerTrainer
|
||||
u8 trainerClass;
|
||||
u8 name[3];
|
||||
u8 teamFlags;
|
||||
u16 speech[6];
|
||||
u16 greeting[6];
|
||||
};
|
||||
|
||||
struct BattleTowerPokemonTemplate
|
||||
@@ -26,7 +26,7 @@ struct BattleTowerPokemonTemplate
|
||||
};
|
||||
|
||||
u16 sub_8164FCC(u8, u8);
|
||||
void sub_80E7524(struct BattleTowerEReaderTrainer *);
|
||||
void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *);
|
||||
void ValidateEReaderTrainer(void);
|
||||
u8 GetBattleTowerTrainerFrontSpriteId(void);
|
||||
u8 GetEreaderTrainerFrontSpriteId(void);
|
||||
|
||||
@@ -45,6 +45,7 @@ extern u8 gUnknown_203B0C0;
|
||||
extern u8 gUnknown_203B0C1;
|
||||
extern u8 gUnknown_203B0DC[3];
|
||||
extern void (*gUnknown_3005E98)(u8 taskId, TaskFunc func);
|
||||
extern u8 gSelectedOrderFromParty[3];
|
||||
|
||||
bool8 FieldCallback_PrepareFadeInFromMenu(void);
|
||||
bool8 MonKnowsMove(struct Pokemon *, u16);
|
||||
|
||||
@@ -5,5 +5,6 @@ bool8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unk1, u32 unk2, u8 unk3
|
||||
bool8 ScriptGiveEgg(u16 species);
|
||||
void ScriptSetMonMoveSlot(u8 partyIdx, u16 move, u8 slot);
|
||||
void sp000_heal_pokemon(void);
|
||||
void ReducePlayerPartyToThree(void);
|
||||
|
||||
#endif //GUARD_SCRIPT_POKEMON_UTIL_80A0058_H
|
||||
|
||||
@@ -209,7 +209,6 @@ SECTIONS {
|
||||
asm/learn_move.o(.text);
|
||||
src/fldeff_softboiled.o(.text);
|
||||
src/battle_tower.o(.text);
|
||||
asm/battle_tower.o(.text);
|
||||
src/battle_controller_oak_old_man.o(.text);
|
||||
src/player_pc.o(.text);
|
||||
src/intro.o(.text);
|
||||
|
||||
+751
-13
@@ -3,6 +3,22 @@
|
||||
#include "random.h"
|
||||
#include "text.h"
|
||||
#include "event_data.h"
|
||||
#include "string_util.h"
|
||||
#include "battle_message.h"
|
||||
#include "data.h"
|
||||
#include "pokedex.h"
|
||||
#include "overworld.h"
|
||||
#include "battle_transition.h"
|
||||
#include "easy_chat.h"
|
||||
#include "battle_setup.h"
|
||||
#include "battle_main.h"
|
||||
#include "task.h"
|
||||
#include "battle.h"
|
||||
#include "party_menu.h"
|
||||
#include "new_game.h"
|
||||
#include "save.h"
|
||||
#include "item.h"
|
||||
#include "script_pokemon_util_80A0058.h"
|
||||
#include "constants/species.h"
|
||||
#include "constants/items.h"
|
||||
#include "constants/moves.h"
|
||||
@@ -10,11 +26,21 @@
|
||||
#include "constants/vars.h"
|
||||
#include "constants/map_objects.h"
|
||||
|
||||
void sub_80E5A38(u8 levelType);
|
||||
EWRAM_DATA u16 gUnknown_203AAB8 = 0;
|
||||
|
||||
#define TakeBravoTrainerBattleTowerOffTheAir()
|
||||
|
||||
void ResetBattleTowerStreak(u8 levelType);
|
||||
void sub_80E5E5C(u8 trainerClass);
|
||||
u16 sub_80E7188(u8 levelType);
|
||||
void sub_80E7064(void);
|
||||
void sub_80E6564(u16 species, u16 heldItem, u8 unused, u8 levelType, u8 monLevel, u16 *validSpecies, u16 *validHeldItems, u8 *numValid);
|
||||
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);
|
||||
|
||||
#include "data/battle_tower/trainers.h"
|
||||
|
||||
@@ -153,12 +179,12 @@ void sub_80E5970(void)
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
sub_80E5A38(levelType);
|
||||
ResetBattleTowerStreak(levelType);
|
||||
if (count == 0)
|
||||
VarSet(VAR_0x4000, 5);
|
||||
break;
|
||||
case 1:
|
||||
sub_80E5A38(levelType);
|
||||
ResetBattleTowerStreak(levelType);
|
||||
VarSet(VAR_0x4000, 1);
|
||||
count++;
|
||||
break;
|
||||
@@ -182,10 +208,10 @@ void sub_80E5970(void)
|
||||
}
|
||||
if (gSaveBlock2Ptr->battleTower.var_4AE[0] == 3 && gSaveBlock2Ptr->battleTower.var_4AE[1] == 3)
|
||||
VarSet(VAR_0x4000, 5);
|
||||
sub_80E7064();
|
||||
ValidateBattleTowerRecordChecksums();
|
||||
}
|
||||
|
||||
void sub_80E5A38(u8 levelType)
|
||||
void ResetBattleTowerStreak(u8 levelType)
|
||||
{
|
||||
gSaveBlock2Ptr->battleTower.var_4AE[levelType] = 0;
|
||||
gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] = 1;
|
||||
@@ -219,7 +245,7 @@ bool8 sub_80E5A70(u8 levelType, u16 winStreak)
|
||||
if (gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level != trainerTeamLevel)
|
||||
return FALSE;
|
||||
|
||||
sub_80E6564(
|
||||
CheckMonBattleTowerBanlist(
|
||||
gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].species,
|
||||
gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].heldItem,
|
||||
1,
|
||||
@@ -245,7 +271,7 @@ bool8 sub_80E5B14(void)
|
||||
numCandidates = 0;
|
||||
battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
winStreak = sub_80E7188(battleTowerLevelType);
|
||||
winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
|
||||
if (sub_80E5A70(battleTowerLevelType, winStreak))
|
||||
{
|
||||
gSaveBlock2Ptr->battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID;
|
||||
@@ -478,7 +504,7 @@ u8 sub_80E60E4(void)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80E6150(u8 *dest)
|
||||
void get_trainer_name(u8 *dest)
|
||||
{
|
||||
s32 i;
|
||||
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
|
||||
@@ -500,7 +526,7 @@ void sub_80E6150(u8 *dest)
|
||||
}
|
||||
|
||||
#ifdef NONMATCHING // r6/r7 swap
|
||||
void sub_80E61DC(void)
|
||||
void FillBattleTowerTrainerParty(void)
|
||||
{
|
||||
s32 partyIndex;
|
||||
s32 i;
|
||||
@@ -674,7 +700,7 @@ void sub_80E61DC(void)
|
||||
}
|
||||
#else
|
||||
NAKED
|
||||
void sub_80E61DC(void)
|
||||
void FillBattleTowerTrainerParty(void)
|
||||
{
|
||||
asm_unified("\tpush {r4-r7,lr}\n"
|
||||
"\tmov r7, r10\n"
|
||||
@@ -1050,3 +1076,715 @@ void sub_80E61DC(void)
|
||||
"_080E64BC: .4byte sBattleTowerHeldItems");
|
||||
}
|
||||
#endif //NONMATCHING
|
||||
|
||||
u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 count)
|
||||
{
|
||||
if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT))
|
||||
{
|
||||
if (count == 0)
|
||||
StringAppend(gStringVar1, gUnknown_83FE859);
|
||||
count++;
|
||||
StringAppend(gStringVar1, gSpeciesNames[species]);
|
||||
switch (count)
|
||||
{
|
||||
case 2:
|
||||
StringAppend(gStringVar1, gUnknown_83FE85E);
|
||||
break;
|
||||
case 5:
|
||||
case 8:
|
||||
case 11:
|
||||
StringAppend(gStringVar1, gUnknown_83FE85C);
|
||||
break;
|
||||
default:
|
||||
StringAppend(gStringVar1, gUnknown_83FE859);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void CheckMonBattleTowerBanlist(u16 species, u16 heldItem, u16 hp, u8 battleTowerLevelType, u8 monLevel, u16 *validPartySpecies, u16 *validPartyHeldItems, u8 *numValid)
|
||||
{
|
||||
s32 i;
|
||||
u32 counter = 0;
|
||||
|
||||
if (species == SPECIES_EGG || species == SPECIES_NONE)
|
||||
return;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (gBattleTowerBannedSpecies[counter] == 0xFFFF)
|
||||
break;
|
||||
|
||||
if (gBattleTowerBannedSpecies[counter] == species)
|
||||
break;
|
||||
|
||||
counter++;
|
||||
}
|
||||
|
||||
if (gBattleTowerBannedSpecies[counter] != 0xFFFF)
|
||||
return;
|
||||
|
||||
if (battleTowerLevelType == 0 && monLevel > 50)
|
||||
return;
|
||||
|
||||
for (i = 0; i < *numValid && validPartySpecies[i] != species ; i++);
|
||||
if (i != *numValid)
|
||||
return;
|
||||
|
||||
if (heldItem != 0)
|
||||
{
|
||||
for (i = 0; i < *numValid && validPartyHeldItems[i] != heldItem ; i++);
|
||||
if (i != *numValid)
|
||||
return;
|
||||
}
|
||||
|
||||
validPartySpecies[*numValid] = species;
|
||||
validPartyHeldItems[*numValid] = heldItem;
|
||||
*numValid = *numValid + 1;
|
||||
}
|
||||
|
||||
void CheckPartyBattleTowerBanlist(void)
|
||||
{
|
||||
s32 i;
|
||||
u16 species2;
|
||||
u16 heldItem;
|
||||
u8 level;
|
||||
u16 hp;
|
||||
u32 numBanlistCaught;
|
||||
u16 validPartySpecies[6];
|
||||
u16 validPartyHeldItems[6];
|
||||
u8 counter;
|
||||
|
||||
counter = 0;
|
||||
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
species2 = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
|
||||
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
|
||||
level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
|
||||
hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
|
||||
|
||||
CheckMonBattleTowerBanlist(species2, heldItem, hp, gSpecialVar_Result, level, validPartySpecies, validPartyHeldItems, &counter);
|
||||
}
|
||||
|
||||
if (counter < 3)
|
||||
{
|
||||
gStringVar1[0] = EOS;
|
||||
gSpecialVar_0x8004 = 1;
|
||||
counter = 0;
|
||||
|
||||
for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++)
|
||||
counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter);
|
||||
|
||||
i = StringLength(gStringVar1);
|
||||
gStringVar1[i - 1] = EOS;
|
||||
if (counter < 3)
|
||||
StringAppend(gStringVar1, gUnknown_83FE860);
|
||||
else
|
||||
StringAppend(gStringVar1, gUnknown_83FE864);
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpecialVar_0x8004 = 0;
|
||||
gSaveBlock2Ptr->battleTower.battleTowerLevelType = gSpecialVar_Result;
|
||||
}
|
||||
}
|
||||
|
||||
void PrintBattleTowerTrainerMessage(const u16 *greeting)
|
||||
{
|
||||
s32 i;
|
||||
if (EC_DoesEasyChatStringFitOnLine(greeting, 3, 2, 18))
|
||||
{
|
||||
ConvertEasyChatWordsToString(gStringVar4, greeting, 2, 3);
|
||||
i = 0;
|
||||
while (gStringVar4[i++] != CHAR_NEWLINE)
|
||||
;
|
||||
while (gStringVar4[i] != CHAR_NEWLINE)
|
||||
i++;
|
||||
gStringVar4[i] = CHAR_PROMPT_SCROLL;
|
||||
}
|
||||
else
|
||||
{
|
||||
ConvertEasyChatWordsToString(gStringVar4, greeting, 3, 2);
|
||||
}
|
||||
}
|
||||
|
||||
void PrintBattleTowerTrainerGreeting(void)
|
||||
{
|
||||
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
|
||||
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
|
||||
else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
|
||||
PrintBattleTowerTrainerMessage(gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].greeting);
|
||||
else
|
||||
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);
|
||||
}
|
||||
|
||||
void sub_80E6854(void)
|
||||
{
|
||||
s32 i;
|
||||
u16 heldItem;
|
||||
|
||||
switch (gUnknown_203AAB8)
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
heldItem = GetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM);
|
||||
SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
PrintEReaderTrainerFarewellMessage();
|
||||
break;
|
||||
}
|
||||
|
||||
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
|
||||
}
|
||||
|
||||
void sub_80E68C4(u8 taskId)
|
||||
{
|
||||
if (BT_IsDone() == TRUE)
|
||||
{
|
||||
gMain.savedCallback = sub_80E6854;
|
||||
CleanupOverworldWindowsAndTilemaps();
|
||||
SetMainCallback2(CB2_InitBattle);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void StartSpecialBattle(void)
|
||||
{
|
||||
s32 i;
|
||||
u16 heldItem;
|
||||
u8 transition;
|
||||
|
||||
gUnknown_203AAB8 = gSpecialVar_0x8004;
|
||||
switch (gUnknown_203AAB8)
|
||||
{
|
||||
case 0: // battle tower battle
|
||||
gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER);
|
||||
gTrainerBattleOpponent_A = 0;
|
||||
|
||||
FillBattleTowerTrainerParty();
|
||||
|
||||
CreateTask(sub_80E68C4, 1);
|
||||
PlayMapChosenOrBattleBGM(0);
|
||||
transition = BattleSetup_GetBattleTowerBattleTransition();
|
||||
BT_StartOnField(transition);
|
||||
break;
|
||||
case 1: // secret base battle
|
||||
for (i = 0; i < PARTY_SIZE; i++)
|
||||
{
|
||||
heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
|
||||
SetMonData(&gSaveBlock1Ptr->playerParty[i], MON_DATA_HELD_ITEM, &heldItem);
|
||||
}
|
||||
|
||||
CreateTask(sub_80E68C4, 1);
|
||||
PlayMapChosenOrBattleBGM(0);
|
||||
transition = BattleSetup_GetBattleTowerBattleTransition();
|
||||
BT_StartOnField(transition);
|
||||
break;
|
||||
case 2: // e-reader trainer battle
|
||||
ZeroEnemyPartyMons();
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
CreateBattleTowerMon(&gEnemyParty[i], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i]);
|
||||
|
||||
gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER);
|
||||
gTrainerBattleOpponent_A = 0;
|
||||
|
||||
CreateTask(sub_80E68C4, 1);
|
||||
PlayMapChosenOrBattleBGM(0);
|
||||
transition = BattleSetup_GetBattleTowerBattleTransition();
|
||||
BT_StartOnField(transition);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetBattleTowerProperty(void)
|
||||
{
|
||||
s32 i;
|
||||
u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
switch (gSpecialVar_0x8004)
|
||||
{
|
||||
case 0:
|
||||
// Weird cast required to match
|
||||
// Leftover from RS macro?
|
||||
*((u8 *)&gBattleStruct->arenaTurnCounter) = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType];
|
||||
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005;
|
||||
break;
|
||||
case 1:
|
||||
gSaveBlock2Ptr->battleTower.battleTowerLevelType = gSpecialVar_0x8005;
|
||||
break;
|
||||
case 2:
|
||||
gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005;
|
||||
break;
|
||||
case 3:
|
||||
gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005;
|
||||
break;
|
||||
case 4:
|
||||
gSaveBlock2Ptr->battleTower.battleTowerTrainerId = gSpecialVar_0x8005;
|
||||
break;
|
||||
case 5:
|
||||
for (i = 0; i < 3; i++)
|
||||
gSaveBlock2Ptr->battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i];
|
||||
break;
|
||||
case 6:
|
||||
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
|
||||
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
|
||||
if (gSaveBlock2Ptr->battleTower.totalBattleTowerWins < 9999)
|
||||
gSaveBlock2Ptr->battleTower.totalBattleTowerWins++;
|
||||
gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]++;
|
||||
SaveCurrentWinStreak();
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];
|
||||
gStringVar1[0] = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1;
|
||||
gStringVar1[1] = 0xFF;
|
||||
break;
|
||||
case 7:
|
||||
if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430)
|
||||
gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType]++;
|
||||
SaveCurrentWinStreak();
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType];
|
||||
break;
|
||||
case 8:
|
||||
gSaveBlock2Ptr->battleTower.unk_554 = gSpecialVar_0x8005;
|
||||
break;
|
||||
case 9:
|
||||
break;
|
||||
case 10:
|
||||
SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak);
|
||||
break;
|
||||
case 11:
|
||||
if (gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] != 3)
|
||||
ResetBattleTowerStreak(battleTowerLevelType);
|
||||
break;
|
||||
case 12:
|
||||
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = *((u8 *)&gBattleStruct->arenaTurnCounter);
|
||||
break;
|
||||
case 13:
|
||||
gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
|
||||
break;
|
||||
case 14:
|
||||
gSaveBlock2Ptr->battleTower.lastStreakLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void BattleTowerUtil(void)
|
||||
{
|
||||
u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
switch (gSpecialVar_0x8004)
|
||||
{
|
||||
case 0:
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType];
|
||||
break;
|
||||
case 1:
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
break;
|
||||
case 2:
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];
|
||||
break;
|
||||
case 3:
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType];
|
||||
break;
|
||||
case 4:
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.battleTowerTrainerId;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
case 7:
|
||||
break;
|
||||
case 8:
|
||||
gSpecialVar_Result = gSaveBlock2Ptr->battleTower.unk_554;
|
||||
break;
|
||||
case 9:
|
||||
gSpecialVar_Result = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
|
||||
break;
|
||||
case 10:
|
||||
SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak);
|
||||
break;
|
||||
case 11:
|
||||
ResetBattleTowerStreak(battleTowerLevelType);
|
||||
break;
|
||||
case 12:
|
||||
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = *((u8 *)&gBattleStruct->arenaTurnCounter);
|
||||
break;
|
||||
case 13:
|
||||
gSaveBlock2Ptr->battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
|
||||
break;
|
||||
case 14:
|
||||
gSaveBlock2Ptr->battleTower.lastStreakLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetBattleTowerParty(void)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
gSelectedOrderFromParty[i] = gSaveBlock2Ptr->battleTower.selectedPartyMons[i];
|
||||
|
||||
ReducePlayerPartyToThree();
|
||||
}
|
||||
|
||||
void SaveCurrentWinStreak(void)
|
||||
{
|
||||
u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
u16 streak = GetCurrentBattleTowerWinStreak(levelType);
|
||||
|
||||
if (gSaveBlock2Ptr->battleTower.recordWinStreaks[levelType] < streak)
|
||||
gSaveBlock2Ptr->battleTower.recordWinStreaks[levelType] = streak;
|
||||
|
||||
if (gSaveBlock2Ptr->battleTower.recordWinStreaks[0] > gSaveBlock2Ptr->battleTower.recordWinStreaks[1])
|
||||
{
|
||||
streak = gSaveBlock2Ptr->battleTower.recordWinStreaks[0];
|
||||
SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak);
|
||||
|
||||
if (streak > 9999)
|
||||
gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = 9999;
|
||||
else
|
||||
gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = streak;
|
||||
}
|
||||
else
|
||||
{
|
||||
streak = gSaveBlock2Ptr->battleTower.recordWinStreaks[1];
|
||||
SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak);
|
||||
|
||||
if (streak > 9999)
|
||||
gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = 9999;
|
||||
else
|
||||
gSaveBlock2Ptr->battleTower.bestBattleTowerWinStreak = streak;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80E6EE0(void)
|
||||
{
|
||||
s32 i;
|
||||
u8 trainerClass;
|
||||
struct BattleTowerRecord *playerRecord = &gSaveBlock2Ptr->battleTower.playerRecord;
|
||||
u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
if (gSaveBlock2Ptr->playerGender != MALE)
|
||||
{
|
||||
trainerClass = sFemaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]
|
||||
+ gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sFemaleTrainerClasses)];
|
||||
}
|
||||
else
|
||||
{
|
||||
trainerClass = sMaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]
|
||||
+ gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sMaleTrainerClasses)];
|
||||
}
|
||||
|
||||
playerRecord->battleTowerLevelType = battleTowerLevelType;
|
||||
playerRecord->trainerClass = trainerClass;
|
||||
|
||||
CopyTrainerId(playerRecord->trainerId, gSaveBlock2Ptr->playerTrainerId);
|
||||
StringCopy7(playerRecord->name, gSaveBlock2Ptr->playerName);
|
||||
|
||||
playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
|
||||
|
||||
for (i = 0; i < 6; i++)
|
||||
playerRecord->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i];
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
sub_803E23C(&gPlayerParty[gSaveBlock2Ptr->battleTower.selectedPartyMons[i] - 1], &playerRecord->party[i]);
|
||||
|
||||
SetBattleTowerRecordChecksum(&gSaveBlock2Ptr->battleTower.playerRecord);
|
||||
SaveCurrentWinStreak();
|
||||
}
|
||||
|
||||
void SaveBattleTowerProgress(void)
|
||||
{
|
||||
u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0)
|
||||
{
|
||||
if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] > 1
|
||||
|| gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType] > 1)
|
||||
sub_80E6EE0();
|
||||
}
|
||||
|
||||
sub_80E712C();
|
||||
|
||||
gSaveBlock2Ptr->battleTower.battleOutcome = gBattleOutcome;
|
||||
|
||||
if (gSpecialVar_0x8004 != 3)
|
||||
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004;
|
||||
|
||||
VarSet(VAR_0x4000, 0);
|
||||
gSaveBlock2Ptr->battleTower.unk_554 = 1;
|
||||
TrySavingData(SAVE_EREADER);
|
||||
}
|
||||
|
||||
void BattleTower_SoftReset(void)
|
||||
{
|
||||
DoSoftReset();
|
||||
}
|
||||
|
||||
void ValidateBattleTowerRecordChecksums(void)
|
||||
{
|
||||
u32 i;
|
||||
s32 recordIndex;
|
||||
struct BattleTowerRecord *record;
|
||||
u32 checksum;
|
||||
|
||||
record = &gSaveBlock2Ptr->battleTower.playerRecord;
|
||||
checksum = 0;
|
||||
for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)
|
||||
checksum += ((u32 *)record)[i];
|
||||
|
||||
if (gSaveBlock2Ptr->battleTower.playerRecord.checksum != checksum)
|
||||
ClearBattleTowerRecord(&gSaveBlock2Ptr->battleTower.playerRecord);
|
||||
|
||||
for (recordIndex = 0; recordIndex < 5; recordIndex++)
|
||||
{
|
||||
record = &gSaveBlock2Ptr->battleTower.records[recordIndex];
|
||||
checksum = 0;
|
||||
for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)
|
||||
checksum += ((u32 *)record)[i];
|
||||
|
||||
if (gSaveBlock2Ptr->battleTower.records[recordIndex].checksum != checksum)
|
||||
ClearBattleTowerRecord(&gSaveBlock2Ptr->battleTower.records[recordIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
void SetBattleTowerRecordChecksum(struct BattleTowerRecord *record)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
record->checksum = 0;
|
||||
for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++)
|
||||
record->checksum += ((u32 *)record)[i];
|
||||
}
|
||||
|
||||
void ClearBattleTowerRecord(struct BattleTowerRecord *record)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32); i++)
|
||||
((u32 *)record)[i] = 0;
|
||||
}
|
||||
|
||||
void sub_80E712C(void)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
get_trainer_name(gSaveBlock2Ptr->battleTower.defeatedByTrainerName);
|
||||
gSaveBlock2Ptr->battleTower.defeatedBySpecies = gBattleMons[1].species;
|
||||
gSaveBlock2Ptr->battleTower.firstMonSpecies = gBattleMons[0].species;
|
||||
|
||||
for (i = 0; i < POKEMON_NAME_LENGTH; i++)
|
||||
gSaveBlock2Ptr->battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i];
|
||||
}
|
||||
|
||||
u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType)
|
||||
{
|
||||
u16 winStreak = ((gSaveBlock2Ptr->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1)
|
||||
+ gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType];
|
||||
|
||||
if (winStreak > 9999)
|
||||
return 9999;
|
||||
else
|
||||
return winStreak;
|
||||
}
|
||||
|
||||
void DetermineBattleTowerPrize(void)
|
||||
{
|
||||
u8 levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1 > 5)
|
||||
gSaveBlock2Ptr->battleTower.prizeItem = sLongStreakPrizes[Random() % NELEMS(sLongStreakPrizes)];
|
||||
else
|
||||
gSaveBlock2Ptr->battleTower.prizeItem = sShortStreakPrizes[Random() % NELEMS(sShortStreakPrizes)];
|
||||
}
|
||||
|
||||
void GiveBattleTowerPrize(void)
|
||||
{
|
||||
u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
if (AddBagItem(gSaveBlock2Ptr->battleTower.prizeItem, 1) == TRUE)
|
||||
{
|
||||
CopyItemName(gSaveBlock2Ptr->battleTower.prizeItem, gStringVar1);
|
||||
gSpecialVar_Result = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gSpecialVar_Result = 0;
|
||||
gSaveBlock2Ptr->battleTower.var_4AE[battleTowerLevelType] = 6;
|
||||
}
|
||||
}
|
||||
|
||||
void AwardBattleTowerRibbons(void)
|
||||
{
|
||||
s32 i;
|
||||
u32 partyIndex;
|
||||
struct Pokemon *pokemon;
|
||||
u8 ribbonType;
|
||||
u8 battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
|
||||
|
||||
if (battleTowerLevelType != 0)
|
||||
ribbonType = MON_DATA_VICTORY_RIBBON;
|
||||
else
|
||||
ribbonType = MON_DATA_WINNING_RIBBON;
|
||||
|
||||
gSpecialVar_Result = 0;
|
||||
|
||||
if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55)
|
||||
{
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
partyIndex = gSaveBlock2Ptr->battleTower.selectedPartyMons[i] - 1;
|
||||
pokemon = &gPlayerParty[partyIndex];
|
||||
if (!GetMonData(pokemon, ribbonType))
|
||||
{
|
||||
gSpecialVar_Result = 1;
|
||||
SetMonData(pokemon, ribbonType, &gSpecialVar_Result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gSpecialVar_Result != 0)
|
||||
IncrementGameStat(GAME_STAT_RECEIVED_RIBBONS);
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
struct BattleTowerEReaderTrainer *ereaderTrainer;
|
||||
s32 i;
|
||||
s32 j;
|
||||
|
||||
ereaderTrainer = &gSaveBlock2Ptr->battleTower.ereaderTrainer;
|
||||
|
||||
if (gSaveBlock2Ptr->playerGender != MALE)
|
||||
{
|
||||
ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]
|
||||
+ gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sFemaleTrainerClasses)];
|
||||
}
|
||||
else
|
||||
{
|
||||
ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2Ptr->playerTrainerId[0] + gSaveBlock2Ptr->playerTrainerId[1]
|
||||
+ gSaveBlock2Ptr->playerTrainerId[2] + gSaveBlock2Ptr->playerTrainerId[3]) % NELEMS(sMaleTrainerClasses)];
|
||||
}
|
||||
|
||||
CopyTrainerId(ereaderTrainer->trainerId, gSaveBlock2Ptr->playerTrainerId);
|
||||
StringCopy7(ereaderTrainer->name, gSaveBlock2Ptr->playerName);
|
||||
|
||||
ereaderTrainer->winStreak = 1;
|
||||
|
||||
j = 7;
|
||||
for (i = 0; i < 6; i++)
|
||||
{
|
||||
ereaderTrainer->greeting[i] = gSaveBlock1Ptr->easyChatBattleStart[i];
|
||||
ereaderTrainer->farewellPlayerLost[i] = j;
|
||||
ereaderTrainer->farewellPlayerWon[i] = j + 6;
|
||||
j++;
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
sub_803E23C(&gPlayerParty[i], &ereaderTrainer->party[i]);
|
||||
|
||||
SetEReaderTrainerChecksum(ereaderTrainer);
|
||||
}
|
||||
|
||||
u8 GetEreaderTrainerFrontSpriteId(void)
|
||||
{
|
||||
return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];
|
||||
}
|
||||
|
||||
u8 GetEreaderTrainerClassId(void)
|
||||
{
|
||||
return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];
|
||||
}
|
||||
|
||||
void CopyEReaderTrainerName5(u8 *trainerName)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
trainerName[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i];
|
||||
|
||||
trainerName[i] = EOS;
|
||||
}
|
||||
|
||||
// Checks if the saved E-Reader trainer is valid.
|
||||
void ValidateEReaderTrainer(void)
|
||||
{
|
||||
u32 i;
|
||||
u32 checksum;
|
||||
struct BattleTowerEReaderTrainer *ereaderTrainer;
|
||||
|
||||
gSpecialVar_Result = 0;
|
||||
ereaderTrainer = &gSaveBlock2Ptr->battleTower.ereaderTrainer;
|
||||
|
||||
checksum = 0;
|
||||
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)
|
||||
checksum |= ((u32 *)ereaderTrainer)[i];
|
||||
|
||||
if (checksum == 0)
|
||||
{
|
||||
gSpecialVar_Result = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
checksum = 0;
|
||||
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)
|
||||
checksum += ((u32 *)ereaderTrainer)[i];
|
||||
|
||||
if (gSaveBlock2Ptr->battleTower.ereaderTrainer.checksum != checksum)
|
||||
{
|
||||
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
|
||||
gSpecialVar_Result = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
ereaderTrainer->checksum = 0;
|
||||
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32) - 1; i++)
|
||||
ereaderTrainer->checksum += ((u32 *)ereaderTrainer)[i];
|
||||
}
|
||||
|
||||
void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < sizeof(struct BattleTowerEReaderTrainer) / sizeof(u32); i++)
|
||||
((u32 *)ereaderTrainer)[i] = 0;
|
||||
}
|
||||
|
||||
void PrintEReaderTrainerGreeting(void)
|
||||
{
|
||||
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
|
||||
}
|
||||
|
||||
void PrintEReaderTrainerFarewellMessage(void)
|
||||
{
|
||||
if (gBattleOutcome == B_OUTCOME_DREW)
|
||||
gStringVar4[0] = EOS;
|
||||
else if (gBattleOutcome == B_OUTCOME_WON)
|
||||
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerWon);
|
||||
else
|
||||
PrintBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerLost);
|
||||
}
|
||||
|
||||
void Dummy_TryEnableBravoTrainerBattleTower(void)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 2; i++)
|
||||
{
|
||||
if (gSaveBlock2Ptr->battleTower.var_4AE[i] == 1)
|
||||
TakeBravoTrainerBattleTowerOffTheAir();
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -588,7 +588,7 @@ void DestroyWonderCard(void)
|
||||
ClearRamScript();
|
||||
sub_806E2D0();
|
||||
sub_806E370();
|
||||
sub_80E7524(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
|
||||
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
|
||||
}
|
||||
|
||||
bool32 sub_8143F68(const struct MEWonderCardData * data)
|
||||
|
||||
+14
-12
@@ -75,6 +75,7 @@ gUnknown_2031DEA: @ 2031DEA
|
||||
gUnknown_2031DEC: @ 2031DEC
|
||||
.space 0x10
|
||||
|
||||
.align 2
|
||||
.include "src/fieldmap.o"
|
||||
|
||||
gUnknown_2036E28: @ 2036E28
|
||||
@@ -189,7 +190,9 @@ gAnimBattlerSpecies: @ 2037F1C
|
||||
gUnknown_2037F24: @ 2037F24
|
||||
.space 0x4
|
||||
|
||||
.align 2
|
||||
.include "src/battle_anim_mons.o"
|
||||
.align 2
|
||||
.include "src/title_screen.o"
|
||||
|
||||
.align 2
|
||||
@@ -219,6 +222,7 @@ gUnknown_20386A8: @ 20386A8
|
||||
gFieldEffectArguments: @ 20386E0
|
||||
.space 0x20
|
||||
|
||||
.align 2
|
||||
.include "src/scanline_effect.o"
|
||||
|
||||
.align 2
|
||||
@@ -352,10 +356,12 @@ gUnknown_2039984: @ 2039984
|
||||
gUnknown_203998C: @ 203998C
|
||||
.space 0x4
|
||||
|
||||
.align 2
|
||||
.include "src/money.o"
|
||||
|
||||
.align 2
|
||||
.include "src/safari_zone.o"
|
||||
.align 2
|
||||
.include "src/item_use.o"
|
||||
|
||||
.align 2
|
||||
@@ -413,7 +419,6 @@ gPlayerFacingPosition: @ 2039A04
|
||||
|
||||
.align 2
|
||||
.include "src/field_specials.o"
|
||||
|
||||
.align 2
|
||||
.include "src/battle_records.o"
|
||||
|
||||
@@ -423,7 +428,9 @@ gUnknown_2039A20: @ 2039A20
|
||||
gUnknown_2039A24: @ 2039A24
|
||||
.space 0x4
|
||||
|
||||
.align 2
|
||||
.include "src/coins.o"
|
||||
.align 2
|
||||
.include "src/battle_transition.o"
|
||||
|
||||
gUnknown_2039A30: @ 2039A30
|
||||
@@ -432,7 +439,9 @@ gUnknown_2039A30: @ 2039A30
|
||||
gUnknown_2039A34: @ 2039A34
|
||||
.space 0x4
|
||||
|
||||
.align 2
|
||||
.include "src/save.o"
|
||||
.align 2
|
||||
.include "src/mystery_event_script.o"
|
||||
|
||||
gUnknown_203AAB0: @ 203AAB0
|
||||
@@ -441,14 +450,12 @@ gUnknown_203AAB0: @ 203AAB0
|
||||
gUnknown_203AAB4: @ 203AAB4
|
||||
.space 0x4
|
||||
|
||||
gUnknown_203AAB8: @ 203AAB8
|
||||
.space 0x4
|
||||
|
||||
.align 2
|
||||
.include "src/battle_tower.o"
|
||||
.align 2
|
||||
.include "src/player_pc.o"
|
||||
.align 2
|
||||
.include "src/intro.o"
|
||||
|
||||
.align 2
|
||||
.include "src/hall_of_fame.o"
|
||||
.align 2
|
||||
@@ -496,6 +503,7 @@ gUnknown_203ACEC: @ 203ACEC
|
||||
gUnknown_203ACF0: @ 203ACF0
|
||||
.space 0x4
|
||||
|
||||
.align 2
|
||||
.include "src/list_menu.o"
|
||||
.align 2
|
||||
gUnknown_203ACFC: @ 203ACFC
|
||||
@@ -539,22 +547,16 @@ gSpecialVar_ItemId: @ 203AD30
|
||||
|
||||
.align 2
|
||||
.include "src/bag.o"
|
||||
|
||||
.align 2
|
||||
.include "src/trainer_pokemon_sprites.o"
|
||||
|
||||
.align 2
|
||||
.include "src/vs_seeker.o"
|
||||
|
||||
.align 2
|
||||
.include "src/item_pc.o"
|
||||
|
||||
.align 2
|
||||
.include "src/mailbox_pc.o"
|
||||
|
||||
.align 2
|
||||
.include "src/menu.o"
|
||||
|
||||
.align 2
|
||||
.include "src/quest_log.o"
|
||||
|
||||
@@ -640,7 +642,7 @@ gUnknown_203B0CC: @ 203B0CC
|
||||
gUnknown_203B0D0: @ 203B0D0
|
||||
.space 0x4
|
||||
|
||||
gUnknown_203B0D4: @ 203B0D4
|
||||
gSelectedOrderFromParty: @ 203B0D4
|
||||
.space 0x4
|
||||
|
||||
gUnknown_203B0D8: @ 203B0D8
|
||||
|
||||
Reference in New Issue
Block a user