diff options
Diffstat (limited to 'src/field/battle_tower.c')
-rw-r--r-- | src/field/battle_tower.c | 2226 |
1 files changed, 0 insertions, 2226 deletions
diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c deleted file mode 100644 index ab2a818a7..000000000 --- a/src/field/battle_tower.c +++ /dev/null @@ -1,2226 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "battle_setup.h" -#include "battle_tower.h" -#include "battle_transition.h" -#include "data2.h" -#include "easy_chat.h" -#include "constants/easy_chat.h" -#include "event_data.h" -#include "item.h" -#include "constants/items.h" -#include "main.h" -#include "constants/map_objects.h" -#include "constants/moves.h" -#include "new_game.h" -#include "overworld.h" -#include "pokedex.h" -#include "random.h" -#include "save.h" -#include "script_pokemon_80C4.h" -#include "constants/species.h" -#include "string_util.h" -#include "task.h" -#include "text.h" -#include "trainer.h" -#include "tv.h" -#include "constants/vars.h" -#include "ewram.h" - -#if ENGLISH -#include "../data/battle_tower/trainers.h" -#elif GERMAN -#include "../data/battle_tower/trainers_de.h" -#endif - -static const u16 sBattleTowerHeldItems[] = { - ITEM_NONE, - ITEM_KINGS_ROCK, - ITEM_SITRUS_BERRY, - ITEM_ORAN_BERRY, - ITEM_CHESTO_BERRY, - ITEM_HARD_STONE, - ITEM_FOCUS_BAND, - ITEM_PERSIM_BERRY, - ITEM_MIRACLE_SEED, - ITEM_BERRY_JUICE, - ITEM_MACHO_BRACE, - ITEM_SILVER_POWDER, - ITEM_CHERI_BERRY, - ITEM_BLACK_GLASSES, - ITEM_BLACK_BELT, - ITEM_SOUL_DEW, - ITEM_CHOICE_BAND, - ITEM_MAGNET, - ITEM_SILK_SCARF, - ITEM_WHITE_HERB, - ITEM_DEEP_SEA_SCALE, - ITEM_DEEP_SEA_TOOTH, - ITEM_MYSTIC_WATER, - ITEM_SHARP_BEAK, - ITEM_QUICK_CLAW, - ITEM_LEFTOVERS, - ITEM_RAWST_BERRY, - ITEM_LIGHT_BALL, - ITEM_POISON_BARB, - ITEM_NEVER_MELT_ICE, - ITEM_ASPEAR_BERRY, - ITEM_SPELL_TAG, - ITEM_BRIGHT_POWDER, - ITEM_LEPPA_BERRY, - ITEM_SCOPE_LENS, - ITEM_TWISTED_SPOON, - ITEM_METAL_COAT, - ITEM_MENTAL_HERB, - ITEM_CHARCOAL, - ITEM_PECHA_BERRY, - ITEM_SOFT_SAND, - ITEM_LUM_BERRY, - ITEM_DRAGON_SCALE, - ITEM_DRAGON_FANG, - ITEM_IAPAPA_BERRY, - ITEM_WIKI_BERRY, - ITEM_SEA_INCENSE, - ITEM_SHELL_BELL, - ITEM_SALAC_BERRY, - ITEM_LANSAT_BERRY, - ITEM_APICOT_BERRY, - ITEM_STARF_BERRY, - ITEM_LIECHI_BERRY, - ITEM_STICK, - ITEM_LAX_INCENSE, - ITEM_AGUAV_BERRY, - ITEM_FIGY_BERRY, - ITEM_THICK_CLUB, - ITEM_MAGO_BERRY, - ITEM_METAL_POWDER, - ITEM_PETAYA_BERRY, - ITEM_LUCKY_PUNCH, - ITEM_GANLON_BERRY, -}; - -#include "../data/battle_tower/level_50_mons.h" -#include "../data/battle_tower/level_100_mons.h" - -static const u8 sMaleTrainerClasses[] = { - FACILITY_CLASS_RUIN_MANIAC, - FACILITY_CLASS_TUBER_M, - FACILITY_CLASS_COOL_TRAINER_M, - FACILITY_CLASS_RICH_BOY, - FACILITY_CLASS_POKEMANIAC, - FACILITY_CLASS_SWIMMER_M, - FACILITY_CLASS_BLACK_BELT, - FACILITY_CLASS_GUITARIST, - FACILITY_CLASS_KINDLER, - FACILITY_CLASS_CAMPER, - FACILITY_CLASS_BUG_MANIAC, - FACILITY_CLASS_PSYCHIC_M, - FACILITY_CLASS_GENTLEMAN, - FACILITY_CLASS_SCHOOL_KID_M, - FACILITY_CLASS_POKEFAN_M, - FACILITY_CLASS_EXPERT_M, - FACILITY_CLASS_YOUNGSTER, - FACILITY_CLASS_FISHERMAN, - FACILITY_CLASS_CYCLING_TRIATHLETE_M, - FACILITY_CLASS_RUNNING_TRIATHLETE_M, - FACILITY_CLASS_SWIMMING_TRIATHLETE_M, - FACILITY_CLASS_DRAGON_TAMER, - FACILITY_CLASS_BIRD_KEEPER, - FACILITY_CLASS_NINJA_BOY, - FACILITY_CLASS_SAILOR, - FACILITY_CLASS_COLLECTOR, - FACILITY_CLASS_POKEMON_BREEDER_M, - FACILITY_CLASS_POKEMON_RANGER_M, - FACILITY_CLASS_BUG_CATCHER, - FACILITY_CLASS_HIKER, -}; - -static const u8 sFemaleTrainerClasses[] = { - FACILITY_CLASS_AROMA_LADY, - FACILITY_CLASS_TUBER_F, - FACILITY_CLASS_COOL_TRAINER_F, - FACILITY_CLASS_HEX_MANIAC, - FACILITY_CLASS_LADY, - FACILITY_CLASS_BEAUTY, - FACILITY_CLASS_PSYCHIC_F, - FACILITY_CLASS_SCHOOL_KID_F, - FACILITY_CLASS_POKEFAN_F, - FACILITY_CLASS_EXPERT_F, - FACILITY_CLASS_CYCLING_TRIATHLETE_F, - FACILITY_CLASS_RUNNING_TRIATHLETE_F, - FACILITY_CLASS_SWIMMING_TRIATHLETE_F, - FACILITY_CLASS_BATTLE_GIRL, - FACILITY_CLASS_PARASOL_LADY, - FACILITY_CLASS_SWIMMER_F, - FACILITY_CLASS_PICNICKER, - FACILITY_CLASS_POKEMON_BREEDER_F, - FACILITY_CLASS_POKEMON_RANGER_F, - FACILITY_CLASS_LASS, -}; - -static const u8 sMaleTrainerGfxIds[] = { - MAP_OBJ_GFX_HIKER, - MAP_OBJ_GFX_TUBER_M, - MAP_OBJ_GFX_MAN_4, - MAP_OBJ_GFX_BOY_4, - MAP_OBJ_GFX_MANIAC, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, - MAP_OBJ_GFX_BLACK_BELT, - MAP_OBJ_GFX_MAN_6, - MAP_OBJ_GFX_MAN_6, - MAP_OBJ_GFX_CAMPER, - MAP_OBJ_GFX_MANIAC, - MAP_OBJ_GFX_PSYCHIC_M, - MAP_OBJ_GFX_GENTLEMAN, - MAP_OBJ_GFX_SCHOOL_KID_M, - MAP_OBJ_GFX_MAN_3, - MAP_OBJ_GFX_OLD_MAN_1, - MAP_OBJ_GFX_YOUNGSTER, - MAP_OBJ_GFX_FISHERMAN, - MAP_OBJ_GFX_CYCLING_TRIATHLETE_M, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_M, - MAP_OBJ_GFX_MAN_4, - MAP_OBJ_GFX_MAN_6, - MAP_OBJ_GFX_LITTLE_BOY_1, - MAP_OBJ_GFX_SAILOR, - MAP_OBJ_GFX_MANIAC, - MAP_OBJ_GFX_MAN_5, - MAP_OBJ_GFX_CAMPER, - MAP_OBJ_GFX_BUG_CATCHER, - MAP_OBJ_GFX_HIKER, -}; - -static const u8 sFemaleTrainerGfxIds[] = { - MAP_OBJ_GFX_WOMAN_3, - MAP_OBJ_GFX_TUBER_F, - MAP_OBJ_GFX_WOMAN_7, - MAP_OBJ_GFX_WOMAN_1, - MAP_OBJ_GFX_WOMAN_3, - MAP_OBJ_GFX_BEAUTY, - MAP_OBJ_GFX_LASS, - MAP_OBJ_GFX_GIRL_3, - MAP_OBJ_GFX_WOMAN_2, - MAP_OBJ_GFX_OLD_WOMAN_1, - MAP_OBJ_GFX_CYCLING_TRIATHLETE_F, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, - MAP_OBJ_GFX_GIRL_3, - MAP_OBJ_GFX_WOMAN_7, - MAP_OBJ_GFX_RUNNING_TRIATHLETE_F, - MAP_OBJ_GFX_PICNICKER, - MAP_OBJ_GFX_WOMAN_3, - MAP_OBJ_GFX_PICNICKER, - MAP_OBJ_GFX_LASS, -}; - -const u16 gBattleTowerBannedSpecies[] = { - SPECIES_MEW, - SPECIES_MEWTWO, - SPECIES_HO_OH, - SPECIES_LUGIA, - SPECIES_CELEBI, - SPECIES_KYOGRE, - SPECIES_GROUDON, - SPECIES_RAYQUAZA, - SPECIES_JIRACHI, - SPECIES_DEOXYS, - 0xFFFF, -}; - -// Item prizes for battle tower streaks of 5 or fewer sets. -/*static*/ const u16 sShortStreakPrizes[] = { - ITEM_HP_UP, - ITEM_PROTEIN, - ITEM_IRON, - ITEM_CALCIUM, - ITEM_CARBOS, - ITEM_ZINC, -}; - -// Item prizes for battle tower streaks of greater than 5 sets. -/*static*/ const u16 sLongStreakPrizes[] = { - ITEM_BRIGHT_POWDER, - ITEM_WHITE_HERB, - ITEM_QUICK_CLAW, - ITEM_LEFTOVERS, - ITEM_MENTAL_HERB, - ITEM_KINGS_ROCK, - ITEM_FOCUS_BAND, - ITEM_SCOPE_LENS, - ITEM_CHOICE_BAND, -}; - -static void ResetBattleTowerStreak(u8 levelType); -static void ValidateBattleTowerRecordChecksums(void); -static void PrintEReaderTrainerFarewellMessage(void); -extern void SetBattleTowerTrainerGfxId(u8); -static void SaveCurrentWinStreak(void); -static void sub_8135CFC(void); -static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); -static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); -static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); -static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); -static void ClearBattleTowerRecord(struct BattleTowerRecord *); - -extern const u8 BattleText_Format3[]; -extern const u8 BattleText_Format4[]; -extern const u8 BattleText_Format5[]; -extern const u8 BattleText_Format6[]; -extern const u8 BattleText_Format7[]; -extern const u8 BattleText_Format8[]; -extern const u8 BattleText_Format9[]; -extern u16 gSpecialVar_0x8004; -extern u8 gTrainerClassToPicIndex[]; -extern u8 gTrainerClassToNameIndex[]; -extern u16 gTrainerBattleOpponent; -extern u16 gBattleTypeFlags; -extern u8 gSelectedOrderFromParty[]; -extern u8 gBattleOutcome; -extern struct Pokemon gUnknown_030042FC[]; -extern struct BattlePokemon gBattleMons[]; - -void sub_8134548(void) -{ - u8 var1 = 0; - s32 levelType; - - for (levelType = 0; levelType < 2; levelType++) - { - switch (gSaveBlock2.battleTower.var_4AE[levelType]) - { - case 0: - default: - ResetBattleTowerStreak(levelType); - if (!var1) - { - VarSet(VAR_TEMP_0, 5); - } - break; - case 1: - ResetBattleTowerStreak(levelType); - VarSet(VAR_TEMP_0, 1); - var1++; - break; - case 4: - VarSet(VAR_TEMP_0, 2); - var1++; - break; - case 5: - VarSet(VAR_TEMP_0, 3); - var1++; - break; - case 2: - VarSet(VAR_TEMP_0, 4); - var1++; - break; - case 3: - case 6: - break; - } - } - - if ((gSaveBlock2.battleTower.var_4AE[0] == 3 || gSaveBlock2.battleTower.var_4AE[0] == 6) - && (gSaveBlock2.battleTower.var_4AE[1] == 3 || gSaveBlock2.battleTower.var_4AE[1] == 6)) - { - VarSet(VAR_TEMP_0, 5); - } - - ValidateBattleTowerRecordChecksums(); -} - -void ResetBattleTowerStreak(u8 levelType) -{ - gSaveBlock2.battleTower.var_4AE[levelType] = 0; - gSaveBlock2.battleTower.curChallengeBattleNum[levelType] = 1; - gSaveBlock2.battleTower.curStreakChallengesNum[levelType] = 1; -} - -// Checks if the next trainer in Battle Tower should be the E-Reader trainer. -bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak) -{ - u8 trainerTeamLevel; - u8 monLevel; - s32 i; - u16 validPartySpecies[6]; - u16 validPartyHeldItems[6]; - u8 numValid; - - numValid = 0; - - ValidateEReaderTrainer(); - - if (gSpecialVar_Result != 0 || gSaveBlock2.battleTower.ereaderTrainer.winStreak != winStreak) - { - return FALSE; - } - - trainerTeamLevel = 50; - if (levelType != 0) - { - trainerTeamLevel = 100; - } - - for (i = 0; i < 3; i++) - { - monLevel = gSaveBlock2.battleTower.ereaderTrainer.party[i].level; - if (gSaveBlock2.battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) - { - return FALSE; - } - - CheckMonBattleTowerBanlist( - gSaveBlock2.battleTower.ereaderTrainer.party[i].species, - gSaveBlock2.battleTower.ereaderTrainer.party[i].heldItem, - 1, - levelType, - monLevel, - validPartySpecies, - validPartyHeldItems, - &numValid); - } - - return numValid == 3; -} - -bool8 sub_81346F4(void) -{ - s32 recordIndex, i; - u8 battleTowerLevelType; - u16 winStreak; - bool8 retVal; - s32 numCandidates; - u32 trainerIds[5]; - - numCandidates = 0; - battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak)) - { - gSaveBlock2.battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID; - retVal = TRUE; - } - else - { - // Check if one of the battle tower trainers from record mixing should be the next trainer. - for (recordIndex = 0; recordIndex < 5; recordIndex++) - { - struct BattleTowerRecord *record = &gSaveBlock2.battleTower.records[recordIndex]; - u32 recordHasData = 0; - u32 checksum = 0; - for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) - { - recordHasData |= ((u32 *)record)[i]; - checksum += ((u32 *)record)[i]; - } - - if (gSaveBlock2.battleTower.records[recordIndex].winStreak == winStreak - && gSaveBlock2.battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType - && recordHasData - && gSaveBlock2.battleTower.records[recordIndex].checksum == checksum) - { - trainerIds[numCandidates] = recordIndex; - numCandidates++; - } - } - - if (numCandidates == 0) - { - retVal = FALSE; - } - else - { - gSaveBlock2.battleTower.battleTowerTrainerId = trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID; - retVal = TRUE; - } - } - - return retVal; -} - -// void sub_81347F8(void) -// { -// bool8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; -// if (sub_81346F4()) -// { -// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); -// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; -// } -// else -// { -// u16 var1; - -// if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] > 7) -// { -// while (1) -// { -// s32 i; -// u32 temp = ((Random() & 0xFF) * 30) >> 8; -// var1 = temp + 70; -// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && var1 != gSaveBlock2.battleTower.var_4C1[i]; i++) // TODO: [i + 1]??? -// { } - -// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) -// { -// break; -// } -// } -// } -// else -// { -// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] == 7) -// { -// while (1) -// { -// s32 i; -// u32 temp = ((Random() & 0xFF) * 5); -// u32 temp2 = (((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10) + 20); -// var1 = temp / 128 + temp2; -// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) // TODO: [i + 1]???? -// { } - -// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) -// { -// break; -// } -// } -// } -// else -// { -// while (1) -// { -// s32 i; -// u32 temp = ((Random() & 0xFF) * 320); -// u32 temp2 = ((gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1) * 10); -// var1 = temp + temp2; -// for (i = 0; i < gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2.battleTower.var_4C1[i] != var1; i++) -// { } - -// if (i == gSaveBlock2.battleTower.curChallengeBattleNum[levelType] - 1) -// { -// break; -// } -// } -// } -// } - -// gSaveBlock2.battleTower.battleTowerTrainerId = var1; -// SetBattleTowerTrainerGfxId(gSaveBlock2.battleTower.battleTowerTrainerId); - -// if (gSaveBlock2.battleTower.curChallengeBattleNum[levelType] < 7) -// { -// gSaveBlock2.battleTower.var_4C1[gSaveBlock2.battleTower.curChallengeBattleNum[levelType]] = gSaveBlock2.battleTower.battleTowerTrainerId; -// } -// } -// } - -__attribute__((naked)) -void sub_81347F8(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - ldr r5, _08134838 @ =gSaveBlock2\n\ - ldr r1, _0813483C @ =0x00000554\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 31\n\ - lsrs r6, r0, 31\n\ - bl sub_81346F4\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _08134848\n\ - ldr r2, _08134840 @ =0x00000564\n\ - adds r4, r5, r2\n\ - ldrb r0, [r4]\n\ - bl SetBattleTowerTrainerGfxId\n\ - lsls r0, r6, 1\n\ - movs r3, 0xAB\n\ - lsls r3, 3\n\ - adds r1, r5, r3\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - adds r0, r5, r0\n\ - ldr r1, _08134844 @ =0x00000569\n\ - adds r0, r1\n\ - ldrb r1, [r4]\n\ - b _081349DC\n\ - .align 2, 0\n\ -_08134838: .4byte gSaveBlock2\n\ -_0813483C: .4byte 0x00000554\n\ -_08134840: .4byte 0x00000564\n\ -_08134844: .4byte 0x00000569\n\ -_08134848:\n\ - lsls r0, r6, 1\n\ - ldr r2, _081348D8 @ =0x0000055c\n\ - adds r1, r5, r2\n\ - adds r1, r0, r1\n\ - ldrh r1, [r1]\n\ - adds r7, r0, 0\n\ - cmp r1, 0x7\n\ - bls _0813485A\n\ - b _0813495C\n\ -_0813485A:\n\ - movs r3, 0xAB\n\ - lsls r3, 3\n\ - adds r0, r5, r3\n\ - adds r1, r7, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0x7\n\ - bne _081348E4\n\ - adds r6, r5, 0\n\ - mov r9, r7\n\ - adds r5, r1, 0\n\ - ldr r0, _081348DC @ =0x0000056a\n\ - adds r0, r6\n\ - mov r10, r0\n\ - mov r8, r5\n\ -_08134876:\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - lsls r2, r1, 2\n\ - adds r2, r1\n\ - ldr r1, _081348D8 @ =0x0000055c\n\ - adds r4, r6, r1\n\ - mov r3, r9\n\ - adds r0, r3, r4\n\ - ldrh r1, [r0]\n\ - subs r1, 0x1\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 1\n\ - adds r0, 0x14\n\ - lsrs r2, 7\n\ - adds r2, r0\n\ - lsls r2, 16\n\ - lsrs r2, 16\n\ - movs r1, 0\n\ - ldrh r0, [r5]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bge _081348C8\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - cmp r0, r2\n\ - beq _081348C8\n\ - subs r0, r4, 0x4\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - subs r3, r0, 0x1\n\ - adds r4, 0xE\n\ -_081348BA:\n\ - adds r1, 0x1\n\ - cmp r1, r3\n\ - bge _081348C8\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, r2\n\ - bne _081348BA\n\ -_081348C8:\n\ - mov r3, r8\n\ - ldrh r0, [r3]\n\ - subs r0, 0x1\n\ - ldr r4, _081348E0 @ =gSaveBlock2\n\ - cmp r1, r0\n\ - bne _08134876\n\ - b _081349B6\n\ - .align 2, 0\n\ -_081348D8: .4byte 0x0000055c\n\ -_081348DC: .4byte 0x0000056a\n\ -_081348E0: .4byte gSaveBlock2\n\ -_081348E4:\n\ - adds r6, r5, 0\n\ - mov r9, r7\n\ - adds r5, r1, 0\n\ - ldr r2, _08134950 @ =0x0000056a\n\ - adds r2, r6\n\ - mov r10, r2\n\ - mov r8, r5\n\ -_081348F2:\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsrs r2, r0, 6\n\ - ldr r3, _08134954 @ =0x0000055c\n\ - adds r4, r6, r3\n\ - mov r1, r9\n\ - adds r0, r1, r4\n\ - ldrh r1, [r0]\n\ - subs r1, 0x1\n\ - lsls r0, r1, 2\n\ - adds r0, r1\n\ - lsls r0, 1\n\ - adds r0, r2, r0\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - movs r1, 0\n\ - ldrh r0, [r5]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bge _08134942\n\ - mov r3, r10\n\ - ldrb r0, [r3]\n\ - cmp r0, r2\n\ - beq _08134942\n\ - subs r0, r4, 0x4\n\ - adds r0, r7, r0\n\ - ldrh r0, [r0]\n\ - subs r3, r0, 0x1\n\ - adds r4, 0xE\n\ -_08134934:\n\ - adds r1, 0x1\n\ - cmp r1, r3\n\ - bge _08134942\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, r2\n\ - bne _08134934\n\ -_08134942:\n\ - mov r3, r8\n\ - ldrh r0, [r3]\n\ - subs r0, 0x1\n\ - ldr r4, _08134958 @ =gSaveBlock2\n\ - cmp r1, r0\n\ - bne _081348F2\n\ - b _081349B6\n\ - .align 2, 0\n\ -_08134950: .4byte 0x0000056a\n\ -_08134954: .4byte 0x0000055c\n\ -_08134958: .4byte gSaveBlock2\n\ -_0813495C:\n\ - movs r2, 0xAB\n\ - lsls r2, 3\n\ - adds r0, r5, r2\n\ - adds r6, r7, r0\n\ - ldr r3, _081349EC @ =0x0000056a\n\ - adds r3, r5\n\ - mov r8, r3\n\ - adds r5, r6, 0\n\ -_0813496C:\n\ - bl Random\n\ - movs r1, 0xFF\n\ - ands r1, r0\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - lsls r0, 1\n\ - asrs r0, 8\n\ - adds r0, 0x46\n\ - lsls r0, 16\n\ - lsrs r2, r0, 16\n\ - movs r1, 0\n\ - ldrh r0, [r6]\n\ - subs r0, 0x1\n\ - cmp r1, r0\n\ - bge _081349AC\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - ldr r4, _081349F0 @ =gSaveBlock2\n\ - cmp r0, r2\n\ - beq _081349AC\n\ - ldrh r0, [r5]\n\ - subs r3, r0, 0x1\n\ - ldr r0, _081349EC @ =0x0000056a\n\ - adds r4, r0\n\ -_0813499E:\n\ - adds r1, 0x1\n\ - cmp r1, r3\n\ - bge _081349AC\n\ - adds r0, r1, r4\n\ - ldrb r0, [r0]\n\ - cmp r0, r2\n\ - bne _0813499E\n\ -_081349AC:\n\ - ldrh r0, [r6]\n\ - subs r0, 0x1\n\ - ldr r4, _081349F0 @ =gSaveBlock2\n\ - cmp r1, r0\n\ - bne _0813496C\n\ -_081349B6:\n\ - ldr r1, _081349F4 @ =0x00000564\n\ - adds r0, r4, r1\n\ - strb r2, [r0]\n\ - ldr r2, _081349F4 @ =0x00000564\n\ - adds r5, r4, r2\n\ - ldrb r0, [r5]\n\ - bl SetBattleTowerTrainerGfxId\n\ - movs r3, 0xAB\n\ - lsls r3, 3\n\ - adds r0, r4, r3\n\ - adds r1, r7, r0\n\ - ldrh r0, [r1]\n\ - cmp r0, 0x6\n\ - bhi _081349DE\n\ - adds r0, r4, r0\n\ - ldr r1, _081349F8 @ =0x00000569\n\ - adds r0, r1\n\ - ldrb r1, [r5]\n\ -_081349DC:\n\ - strb r1, [r0]\n\ -_081349DE:\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_081349EC: .4byte 0x0000056a\n\ -_081349F0: .4byte gSaveBlock2\n\ -_081349F4: .4byte 0x00000564\n\ -_081349F8: .4byte 0x00000569\n\ -.syntax divided\n"); -} - -void SetBattleTowerTrainerGfxId(u8 trainerIndex) -{ - u32 i; - u8 trainerClass; - - if (trainerIndex < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - trainerClass = gBattleTowerTrainers[trainerIndex].trainerClass; - } - else if (trainerIndex < BATTLE_TOWER_EREADER_TRAINER_ID) - { - trainerClass = gSaveBlock2.battleTower.records[trainerIndex - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; - } - else - { - trainerClass = gSaveBlock2.battleTower.ereaderTrainer.trainerClass; - } - - for (i = 0; i < 30 && sMaleTrainerClasses[i] != trainerClass; i++); - if (i != 30) - { - u8 trainerObjectGfxId = sMaleTrainerGfxIds[i]; - VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId); - return; - } - - for (i = 0; i < 20 && sFemaleTrainerClasses[i] != trainerClass; i++); - if (i != 20) - { - u8 trainerObjectGfxId = sFemaleTrainerGfxIds[i]; - VarSet(VAR_OBJ_GFX_ID_0, trainerObjectGfxId); - return; - } - - VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_BOY_1); -} - -void SetEReaderTrainerGfxId(void) -{ - SetBattleTowerTrainerGfxId(BATTLE_TOWER_EREADER_TRAINER_ID); -} - -// void sub_8134AC0(struct BattleTowerRecord *record) -// { -// u16 var1[6]; -// u16 var2[6]; -// s32 i, j, k; -// s16 l = 0; - -// for (i = 0; i < 5; i++) -// { -// k = 0; -// for (j = 0; j < 4 && gSaveBlock2.battleTower.records[i].trainerId[j] == record->trainerId[j]; j++); -// if (j == 4) -// { -// for (; k < 7 && gSaveBlock2.battleTower.records[i].name[4] == record->name[4]; k++) -// { -// if (record->name[4] == 0xFF) -// { -// k = 7; -// break; -// } -// } -// } - -// if (k == 7) -// { -// break; -// } -// } - -// if (i < 5) -// { -// gSaveBlock2.battleTower.records[i] = *record; -// return; -// } - -// i = 0; -// while (i < 5) -// { -// if (gSaveBlock2.battleTower.records[i].winStreak == 0) -// { -// if (i > 4) -// { -// break; -// } - -// gSaveBlock2.battleTower.records[i] = *record; -// return; -// } - -// i++; -// } - -// var1[0] = gSaveBlock2.battleTower.records[0].winStreak; -// var2[0] = 0; -// l++; - -// for (i = 1; i < 5; i++) -// { -// j = 0; -// if (j < l) -// { -// for (; gSaveBlock2.battleTower.records[i].winStreak <= var1[j]; j++) -// { -// if (gSaveBlock2.battleTower.records[i].winStreak < var1[j]) -// { -// j = 0; -// l = 1; -// var1[0] = gSaveBlock2.battleTower.records[i].winStreak; -// var2[0] = i; -// break; -// } -// } -// } - -// if (j == l) -// { -// var1[l] = gSaveBlock2.battleTower.records[i].winStreak; -// var2[l] = i; -// l++; -// } -// } - -// gSaveBlock2.battleTower.records[var2[(Random() % l)]] = *record; -// } -__attribute__((naked)) -void sub_8134AC0(struct BattleTowerRecord *record) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x1C\n\ - movs r7, 0\n\ - mov r8, r0\n\ - movs r5, 0\n\ - ldr r0, _08134B3C @ =gSaveBlock2\n\ - mov r12, r0\n\ - mov r1, r8\n\ - ldrb r1, [r1, 0xC]\n\ - str r1, [sp, 0x18]\n\ - movs r2, 0xAA\n\ - lsls r2, 1\n\ - add r2, r12\n\ - mov r10, r2\n\ - mov r9, r5\n\ -_08134AE6:\n\ - movs r6, 0\n\ - movs r3, 0\n\ - ldr r0, _08134B40 @ =gSaveBlock2 + 0x158\n\ - add r0, r9\n\ - ldrb r0, [r0]\n\ - ldr r1, [sp, 0x18]\n\ - cmp r0, r1\n\ - bne _08134B14\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - ldr r1, _08134B40 @ =gSaveBlock2 + 0x158\n\ - adds r2, r0, r1\n\ - mov r4, r8\n\ - adds r4, 0xC\n\ -_08134B02:\n\ - adds r2, 0x1\n\ - adds r3, 0x1\n\ - cmp r3, 0x3\n\ - bgt _08134B14\n\ - adds r1, r4, r3\n\ - ldrb r0, [r2]\n\ - ldrb r1, [r1]\n\ - cmp r0, r1\n\ - beq _08134B02\n\ -_08134B14:\n\ - cmp r3, 0x4\n\ - bne _08134B54\n\ - movs r6, 0\n\ - mov r2, r10\n\ - ldrb r0, [r2]\n\ - mov r3, r8\n\ - ldrb r3, [r3, 0x8]\n\ - cmp r0, r3\n\ - bne _08134B54\n\ - adds r1, r0, 0\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - adds r0, 0x4\n\ - ldr r3, _08134B44 @ =gSaveBlock2 + 0x150\n\ - adds r2, r0, r3\n\ -_08134B32:\n\ - cmp r1, 0xFF\n\ - bne _08134B48\n\ - movs r6, 0x7\n\ - b _08134B54\n\ - .align 2, 0\n\ -_08134B3C: .4byte gSaveBlock2\n\ -_08134B40: .4byte gSaveBlock2 + 0x158\n\ -_08134B44: .4byte gSaveBlock2 + 0x150\n\ -_08134B48:\n\ - adds r6, 0x1\n\ - cmp r6, 0x6\n\ - bgt _08134B54\n\ - ldrb r0, [r2]\n\ - cmp r0, r1\n\ - beq _08134B32\n\ -_08134B54:\n\ - cmp r6, 0x7\n\ - beq _08134B64\n\ - movs r0, 0xA4\n\ - add r10, r0\n\ - add r9, r0\n\ - adds r5, 0x1\n\ - cmp r5, 0x4\n\ - ble _08134AE6\n\ -\n\ -_08134B64:\n\ - cmp r5, 0x4\n\ - bgt _08134B76\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - add r0, r12\n\ - movs r1, 0xA6\n\ - lsls r1, 1\n\ - adds r0, r1\n\ - b _08134B9E\n\ -_08134B76:\n\ - movs r5, 0\n\ - movs r1, 0xA7\n\ - lsls r1, 1\n\ - add r1, r12\n\ - b _08134B88\n\ -_08134B80:\n\ - adds r1, 0xA4\n\ - adds r5, 0x1\n\ - cmp r5, 0x4\n\ - bgt _08134BA8\n\ -_08134B88:\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - bne _08134B80\n\ - cmp r5, 0x4\n\ - bgt _08134BA8\n\ - movs r0, 0xA4\n\ - muls r0, r5\n\ - add r0, r12\n\ - movs r2, 0xA6\n\ - lsls r2, 1\n\ - adds r0, r2\n\ -_08134B9E:\n\ - mov r1, r8\n\ - movs r2, 0xA4\n\ - bl memcpy\n\ - b _08134C5E\n\ -\n\ -_08134BA8:\n\ - mov r2, sp\n\ - movs r3, 0xA7\n\ - lsls r3, 1\n\ - mov r1, r12\n\ - adds r0, r1, r3\n\ - ldrh r0, [r0]\n\ - movs r1, 0\n\ - strh r0, [r2]\n\ - add r0, sp, 0xC\n\ - strh r1, [r0]\n\ - adds r7, 0x1\n\ - movs r5, 0x1\n\ - add r2, sp, 0xC @var2 = r2\n\ - mov r9, r2\n\ - mov r10, r3\n\ -_08134BC6:\n\ - movs r3, 0\n\ - adds r0, r5, 0x1\n\ - mov r12, r0\n\ - cmp r3, r7\n\ - bge _08134C0A @ j < l\n\ - movs r1, 0xA4\n\ - adds r0, r5, 0\n\ - muls r0, r1\n\ - ldr r2, _08134BFC @ =gSaveBlock2\n\ - adds r0, r2\n\ - mov r1, r10\n\ - adds r4, r0, r1\n\ - mov r6, sp\n\ -_08134BE0:\n\ - lsls r0, r3, 1\n\ - add r0, sp\n\ - ldrh r2, [r4]\n\ - adds r1, r2, 0\n\ - ldrh r0, [r0]\n\ - cmp r1, r0\n\ - bcs _08134C00\n\ - movs r3, 0\n\ - movs r7, 0x1\n\ - strh r2, [r6]\n\ - mov r2, r9\n\ - strh r5, [r2]\n\ - b _08134C0A\n\ - .align 2, 0\n\ -_08134BFC: .4byte gSaveBlock2\n\ -_08134C00:\n\ - cmp r1, r0\n\ - bhi _08134C0A\n\ - adds r3, 0x1\n\ - cmp r3, r7\n\ - blt _08134BE0\n\ -_08134C0A:\n\ - cmp r3, r7\n\ - bne _08134C2A\n\ - lsls r1, r7, 1\n\ - mov r3, sp\n\ - adds r2, r3, r1\n\ - movs r3, 0xA4\n\ - adds r0, r5, 0\n\ - muls r0, r3\n\ - ldr r3, _08134C70 @ =gSaveBlock2\n\ - adds r0, r3\n\ - add r0, r10\n\ - ldrh r0, [r0]\n\ - strh r0, [r2]\n\ - add r1, r9\n\ - strh r5, [r1]\n\ - adds r7, 0x1\n\ -_08134C2A:\n\ - mov r5, r12\n\ - cmp r5, 0x4\n\ - ble _08134BC6\n\ - bl Random\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - adds r1, r7, 0\n\ - bl __modsi3\n\ - adds r5, r0, 0\n\ - ldr r2, _08134C70 @ =gSaveBlock2\n\ - lsls r0, r5, 1\n\ - add r0, sp\n\ - adds r0, 0xC\n\ - ldrh r1, [r0]\n\ - movs r0, 0xA4\n\ - muls r0, r1\n\ - adds r0, r2\n\ - movs r1, 0xA6\n\ - lsls r1, 1\n\ - adds r0, r1\n\ - mov r1, r8\n\ - movs r2, 0xA4\n\ - bl memcpy\n\ -_08134C5E:\n\ - add sp, 0x1C\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08134C70: .4byte gSaveBlock2\n\ - .syntax divided\n"); -} - -u8 get_trainer_class_pic_index(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - return gTrainerClassToPicIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; - } - else - { - return gTrainerClassToPicIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; - } -} - -u8 get_trainer_class_name_index(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - return gTrainerClassToNameIndex[gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; - } - else - { - return gTrainerClassToNameIndex[gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass]; - } -} - -void get_trainer_name(u8* dest) -{ - s32 i; - - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - for (i = 0; i < 7; i++) - { - dest[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; - } - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - for (i = 0; i < 7; i++) - { - dest[i] = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].name[i]; - } - } - else - { - for (i = 0; i < 7; i++) - { - dest[i] = gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; - } - } - - dest[i] = 0xFF; -} - -void FillBattleTowerTrainerParty(void) -{ - s32 partyIndex, i; - u16 chosenMonIndices[3]; - u8 friendship; - u8 level; - u8 fixedIV; - u8 battleMonsOffset; - u8 monPoolSize; - u8 teamFlags; - const struct BattleTowerPokemon *battleTowerMons; - - battleMonsOffset = 0; - monPoolSize = 60; - friendship = 255; - - ZeroEnemyPartyMons(); - - // Different trainers have access to different sets of pokemon to use in battle. - // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are - // stronger. Additionally, the later trainers' pokemon are granted higher IVs. - if (gSaveBlock2.battleTower.battleTowerTrainerId < 20) - { - fixedIV = 6; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 30) - { - fixedIV = 9; - battleMonsOffset = 30; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 40) - { - fixedIV = 12; - battleMonsOffset = 60; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 50) - { - fixedIV = 15; - battleMonsOffset = 90; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 60) - { - fixedIV = 18; - battleMonsOffset = 120; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 70) - { - fixedIV = 21; - battleMonsOffset = 150; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < 80) - { - fixedIV = 31; - battleMonsOffset = 180; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - fixedIV = 31; - battleMonsOffset = 200; - monPoolSize = 100; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - // Load E-Reader trainer's party. - for (partyIndex = 0; partyIndex < 3; partyIndex++) - { - sub_803ADE8(&gEnemyParty[partyIndex], &gSaveBlock2.battleTower.ereaderTrainer.party[partyIndex]); - } - - return; - } - else - { - // Load a battle tower record's party. (From record mixing) - for (partyIndex = 0; partyIndex < 3; partyIndex++) - { - sub_803ADE8( - &gEnemyParty[partyIndex], - &gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); - } - - return; - } - - // Use the appropriate list of pokemon and level depending on the - // current challenge type. (level 50 or level 100 challenge) - if (gSaveBlock2.battleTower.battleTowerLevelType != 0) - { - battleTowerMons = gBattleTowerLevel100Mons; - level = 100; - } - else - { - battleTowerMons = gBattleTowerLevel50Mons; - level = 50; - } - - teamFlags = gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].teamFlags; - - // Attempt to fill the trainer's party with random Pokemon until 3 have been - // successfully chosen. The trainer's party may not have duplicate pokemon species - // or duplicate held items. Each pokemon must have all of the trainer's team flags - // set, as well. If any of those conditions are not met, then the loop starts over - // and another pokemon is chosen at random. - partyIndex = 0; - while (partyIndex != 3) - { - // Pick a random pokemon index based on the number of pokemon available to choose from - // and the starting offset in the battle tower pokemon array. - s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; - - // Ensure the chosen pokemon has compatible team flags with the trainer. - if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) - { - // Ensure this pokemon species isn't a duplicate. - for (i = 0; i < partyIndex; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) - break; - } - - if (i != partyIndex) - continue; - - // Ensure this pokemon's held item isn't a duplicate. - for (i = 0; i < partyIndex; i++) - { - if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != 0 - && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) - { - break; - } - } - - if (i != partyIndex) - continue; - - // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary - // because the species and held items were already checked directly above. Perhaps this - // is leftover code before the logic for duplicate species and held items was added. - for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); - - if (i != partyIndex) - continue; - - chosenMonIndices[partyIndex] = battleMonIndex; - - // Place the chosen pokemon into the trainer's party. - CreateMonWithEVSpread( - &gEnemyParty[partyIndex], - battleTowerMons[battleMonIndex].species, - level, - fixedIV, - battleTowerMons[battleMonIndex].evSpread); - - // Give the chosen pokemon its specified moves. - for (i = 0; i < 4; i++) - { - SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); - if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) - { - // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. - friendship = 0; - } - } - - SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); - SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); - - // The pokemon was successfully added to the trainer's party, so it's safe to move on to - // the next party slot. - partyIndex++; - } - } -} - -u32 CountBattleTowerBanlistCaught(void) -{ - s32 i; - u32 numCaught = 0; - - for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) - { - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleTowerBannedSpecies[i]), FLAG_GET_CAUGHT)) - { - numCaught++; - } - } - - return numCaught; -} - -u8 AppendBattleTowerBannedSpeciesName(u16 species, u8 curIndexToAppend, s32 numToAppend) -{ - if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(species), FLAG_GET_CAUGHT)) - { - curIndexToAppend++; - - switch (curIndexToAppend - 1) - { - case 0: - case 2: - case 4: - case 6: - case 8: - case 10: - if (numToAppend == curIndexToAppend) - { - StringAppend(gStringVar1, BattleText_Format3); - } - else if (numToAppend > curIndexToAppend) - { - StringAppend(gStringVar1, BattleText_Format4); - } - break; - case 1: - if (curIndexToAppend == numToAppend) - { - StringAppend(gStringVar1, BattleText_Format3); - } - else - { - StringAppend(gStringVar1, BattleText_Format4); - } - - StringAppend(gStringVar1, BattleText_Format7); - break; - case 3: - case 5: - case 7: - case 9: - default: - if (curIndexToAppend == numToAppend) - { - StringAppend(gStringVar1, BattleText_Format3); - } - else - { - StringAppend(gStringVar1, BattleText_Format4); - } - - StringAppend(gStringVar1, BattleText_Format6); - break; - } - - StringAppend(gStringVar1, gSpeciesNames[species]); - } - - return curIndexToAppend; -} - -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) - goto EXIT2; // Couldn't get the code to match without this GOTO - - if (gBattleTowerBannedSpecies[counter] == species) - break; - - counter++; - } - - if (gBattleTowerBannedSpecies[counter] != 0xFFFF) - return; - - EXIT2: - 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] = 0xFF; - gSpecialVar_0x8004 = 1; - counter = 0; - - numBanlistCaught = CountBattleTowerBanlistCaught(); - - for (i = 0; gBattleTowerBannedSpecies[i] != 0xFFFF; i++) - { - counter = AppendBattleTowerBannedSpeciesName(gBattleTowerBannedSpecies[i], counter, numBanlistCaught); - } - - if (counter == 0) - { - StringAppend(gStringVar1, BattleText_Format5); - StringAppend(gStringVar1, BattleText_Format8); - return; - } - - if (1 & counter) - StringAppend(gStringVar1, BattleText_Format6); - else - StringAppend(gStringVar1, BattleText_Format5); - - StringAppend(gStringVar1, BattleText_Format9); - } - else - { - gSpecialVar_0x8004 = 0; - gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_Result; - } -} - -void PrintBattleTowerTrainerMessage(u16 *easyChat) -{ - sub_80EB544(gStringVar4, easyChat, 2, 3); -} - -void PrintBattleTowerTrainerGreeting(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat); - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - PrintBattleTowerTrainerMessage((u16 *)gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].greeting.easyChat); - } - else - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting.easyChat); - } -} - -void sub_81354CC(void) -{ - s32 i; - u16 heldItem; - - switch (gSpecialVar_0x8004) - { - case 0: - break; - case 1: - for (i = 0; i < PARTY_SIZE; i++) - { - heldItem = GetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM); - SetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM, &heldItem); - } - break; - case 2: - PrintEReaderTrainerFarewellMessage(); - break; - } - - SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music); -} - -void sub_8135534(u8 taskId) -{ - if (IsBattleTransitionDone() == TRUE) - { - gMain.savedCallback = sub_81354CC; - SetMainCallback2(sub_800E7C4); - DestroyTask(taskId); - } -} - -void StartSpecialBattle(void) -{ - s32 i; - u16 heldItem; - u8 transition; - - switch (gSpecialVar_0x8004) - { - case 0: // battle tower battle - gBattleTypeFlags = (BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_TRAINER); - gTrainerBattleOpponent = 0; - - FillBattleTowerTrainerParty(); - - CreateTask(sub_8135534, 1); - current_map_music_set__default_for_battle(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); - break; - case 1: // secret base battle - for (i = 0; i < PARTY_SIZE; i++) - { - heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); - SetMonData(&gSaveBlock1.playerParty[i], MON_DATA_HELD_ITEM, &heldItem); - } - - CreateTask(sub_8135534, 1); - current_map_music_set__default_for_battle(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); - break; - case 2: // e-reader trainer battle - ZeroEnemyPartyMons(); - - for (i = 0; i < 3; i++) - { - sub_803ADE8(&gEnemyParty[i], &gSaveBlock2.battleTower.ereaderTrainer.party[i]); - } - - gBattleTypeFlags = (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_TRAINER); - gTrainerBattleOpponent = 0; - - CreateTask(sub_8135534, 1); - current_map_music_set__default_for_battle(0); - transition = BattleSetup_GetBattleTowerBattleTransition(); - BattleTransition_StartOnField(transition); - break; - } -} - -void SetBattleTowerProperty(void) -{ - s32 i; - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - switch (gSpecialVar_0x8004) - { - case 0: - ewram160FB = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8005; - break; - case 1: - gSaveBlock2.battleTower.battleTowerLevelType = gSpecialVar_0x8005; - break; - case 2: - gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] = gSpecialVar_0x8005; - break; - case 3: - gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] = gSpecialVar_0x8005; - break; - case 4: - gSaveBlock2.battleTower.battleTowerTrainerId = gSpecialVar_0x8005; - break; - case 5: - for (i = 0; i < 3; i++) - { - gSaveBlock2.battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i]; - } - break; - case 6: - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - ClearEReaderTrainer(&gSaveBlock2.battleTower.ereaderTrainer); - } - - if (gSaveBlock2.battleTower.totalBattleTowerWins < 9999) - { - gSaveBlock2.battleTower.totalBattleTowerWins++; - } - - gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; - SaveCurrentWinStreak(); - gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - - gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; - gStringVar1[1] = 0xFF; - break; - case 7: - if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] < 1430) - { - gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; - } - - SaveCurrentWinStreak(); - gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; - break; - case 8: - gSaveBlock2.battleTower.unk_554 = gSpecialVar_0x8005; - break; - case 9: - break; - case 10: - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); - break; - case 11: - if (gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] != 3) - { - ResetBattleTowerStreak(battleTowerLevelType); - } - break; - case 12: - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; - break; - case 13: - gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - break; - case 14: - gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - break; - } -} - -void BattleTowerUtil(void) -{ - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - switch (gSpecialVar_0x8004) - { - case 0: - gSpecialVar_Result = gSaveBlock2.battleTower.var_4AE[battleTowerLevelType]; - break; - case 1: - gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerLevelType; - break; - case 2: - gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - break; - case 3: - gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; - break; - case 4: - gSpecialVar_Result = gSaveBlock2.battleTower.battleTowerTrainerId; - break; - case 5: - case 6: - case 7: - break; - case 8: - gSpecialVar_Result = gSaveBlock2.battleTower.unk_554; - break; - case 9: - gSpecialVar_Result = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - break; - case 10: - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, gSaveBlock2.battleTower.bestBattleTowerWinStreak); - break; - case 11: - ResetBattleTowerStreak(battleTowerLevelType); - break; - case 12: - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = ewram160FB; - break; - case 13: - gSaveBlock2.battleTower.currentWinStreaks[battleTowerLevelType] = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - break; - case 14: - gSaveBlock2.battleTower.lastStreakLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - break; - } -} - -void SetBattleTowerParty(void) -{ - s32 i; - - for (i = 0; i < 3; i++) - { - gSelectedOrderFromParty[i] = gSaveBlock2.battleTower.selectedPartyMons[i]; - } - - ReducePlayerPartyToThree(); -} - -static void SaveCurrentWinStreak(void) -{ - u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; - u16 streak = GetCurrentBattleTowerWinStreak(levelType); - - if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak) - gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak; - - if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1]) - { - streak = gSaveBlock2.battleTower.recordWinStreaks[0]; - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); - - if (streak > 9999) - gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - else - gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } - else - { - streak = gSaveBlock2.battleTower.recordWinStreaks[1]; - SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); - - if (streak > 9999) - gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - else - gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } -} - -void sub_8135AC4(void) -{ - s32 i; - u8 trainerClass; - struct BattleTowerRecord *playerRecord = &gSaveBlock2.battleTower.playerRecord; - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (gSaveBlock2.playerGender != MALE) - { - trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; - } - else - { - trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; - } - - playerRecord->battleTowerLevelType = battleTowerLevelType; - playerRecord->trainerClass = trainerClass; - - copy_word_to_mem(playerRecord->trainerId, gSaveBlock2.playerTrainerId); - StringCopy8(playerRecord->name, gSaveBlock2.playerName); - - playerRecord->winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); - - for (i = 0; i < 6; i++) - { - playerRecord->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; - } - - for (i = 0; i < 3; i++) - { - sub_803AF78(&gUnknown_030042FC[gSaveBlock2.battleTower.selectedPartyMons[i]], &playerRecord->party[i]); - } - - SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); - SaveCurrentWinStreak(); -} - -void SaveBattleTowerProgress(void) -{ - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (gSpecialVar_0x8004 == 3 || gSpecialVar_0x8004 == 0) - { - if (gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] > 1 - || gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] > 1) - { - sub_8135AC4(); - } - } - - sub_8135CFC(); - - gSaveBlock2.battleTower.battleOutcome = gBattleOutcome; - - if (gSpecialVar_0x8004 != 3) - { - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = gSpecialVar_0x8004; - } - - VarSet(VAR_TEMP_0, 0); - gSaveBlock2.battleTower.unk_554 = 1; - Save_WriteData(SAVE_EREADER); -} - -void BattleTower_SoftReset(void) -{ - DoSoftReset(); -} - -void ValidateBattleTowerRecordChecksums(void) -{ - u32 i; - s32 recordIndex; - struct BattleTowerRecord *record; - u32 checksum; - - checksum = 0; - for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - { - checksum += ((u32 *)&gSaveBlock2.battleTower.playerRecord)[i]; - } - - if (gSaveBlock2.battleTower.playerRecord.checksum != checksum) - { - ClearBattleTowerRecord(&gSaveBlock2.battleTower.playerRecord); - } - - for (recordIndex = 0; recordIndex < 5; recordIndex++) - { - record = &gSaveBlock2.battleTower.records[recordIndex]; - checksum = 0; - for (i = 0; i < (sizeof(struct BattleTowerRecord) / sizeof(u32)) - 1; i++) - { - checksum += ((u32 *)record)[i]; - } - - if (gSaveBlock2.battleTower.records[recordIndex].checksum != checksum) - { - ClearBattleTowerRecord(&gSaveBlock2.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_8135CFC(void) -{ - s32 i; - - get_trainer_name(gSaveBlock2.battleTower.defeatedByTrainerName); - gSaveBlock2.battleTower.defeatedBySpecies = gBattleMons[1].species; - gSaveBlock2.battleTower.firstMonSpecies = gBattleMons[0].species; - - for (i = 0; i < POKEMON_NAME_LENGTH; i++) - { - gSaveBlock2.battleTower.firstMonNickname[i] = gBattleMons[0].nickname[i]; - } -} - -u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) -{ - u16 winStreak = ((gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType] - 1) * 7 - 1) - + gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; - - if (winStreak > 9999) - { - return 9999; - } - - return winStreak; -} - -void DetermineBattleTowerPrize(void) -{ - u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5) - gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; - else - gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; -} - -void GiveBattleTowerPrize(void) -{ - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - if (AddBagItem(gSaveBlock2.battleTower.prizeItem, 1) == TRUE) - { - CopyItemName(gSaveBlock2.battleTower.prizeItem, gStringVar1); - gSpecialVar_Result = 1; - } - else - { - gSpecialVar_Result = 0; - gSaveBlock2.battleTower.var_4AE[battleTowerLevelType] = 6; - } -} - -void AwardBattleTowerRibbons(void) -{ - s32 i; - u32 partyIndex; - struct Pokemon *pokemon; - u8 ribbonType; - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - - ribbonType = MON_DATA_WINNING_RIBBON; - if (battleTowerLevelType != 0) - { - ribbonType = MON_DATA_VICTORY_RIBBON; - } - - gSpecialVar_Result = 0; - - if (GetCurrentBattleTowerWinStreak(battleTowerLevelType) > 55) - { - for (i = 0; i < 3; i++) - { - partyIndex = gSaveBlock2.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 = &gSaveBlock2.battleTower.ereaderTrainer; - - if (gSaveBlock2.playerGender != MALE) - { - ereaderTrainer->trainerClass = sFemaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 20u]; - } - else - { - ereaderTrainer->trainerClass = sMaleTrainerClasses[(gSaveBlock2.playerTrainerId[0] + gSaveBlock2.playerTrainerId[1] - + gSaveBlock2.playerTrainerId[2] + gSaveBlock2.playerTrainerId[3]) % 30u]; - } - - copy_word_to_mem(ereaderTrainer->trainerId, gSaveBlock2.playerTrainerId); - StringCopy8(ereaderTrainer->name, gSaveBlock2.playerName); - - ereaderTrainer->winStreak = 1; - - j = 7; - for (i = 0; i < 6; i++) - { - ereaderTrainer->greeting.easyChat[i] = gSaveBlock1.easyChats.unk2B28[i]; - ereaderTrainer->farewellPlayerLost.easyChat[i] = j; - ereaderTrainer->farewellPlayerWon.easyChat[i] = j + 6; - j++; - } - - for (i = 0; i < 3; i++) - { - sub_803AF78(&gPlayerParty[i], &ereaderTrainer->party[i]); - } - - SetEReaderTrainerChecksum(ereaderTrainer); -} - -u8 GetEReaderTrainerPicIndex(void) -{ - return gTrainerClassToPicIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; -} - -u8 GetEReaderTrainerClassNameIndex(void) -{ - return gTrainerClassToNameIndex[gSaveBlock2.battleTower.ereaderTrainer.trainerClass]; -} - -void SetEReaderTrainerName(u8 *trainerName) -{ - s32 i; - - for (i = 0; i < 7; i++) - { - trainerName[i] = gSaveBlock2.battleTower.ereaderTrainer.name[i]; - } - - trainerName[i] = 0xFF; -} - -// Checks if the saved E-Reader trainer is valid. -void ValidateEReaderTrainer(void) -{ - u32 i; - u32 checksum; - struct BattleTowerEReaderTrainer *ereaderTrainer; - - gSpecialVar_Result = 0; - ereaderTrainer = &gSaveBlock2.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 (gSaveBlock2.battleTower.ereaderTrainer.checksum != checksum) - { - ClearEReaderTrainer(&gSaveBlock2.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(gSaveBlock2.battleTower.ereaderTrainer.greeting.easyChat); -} - -void PrintEReaderTrainerFarewellMessage(void) -{ - if (gBattleOutcome == BATTLE_DREW) - { - gStringVar4[0] = 0xFF; - } - else if (gBattleOutcome == BATTLE_WON) - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerWon.easyChat); - } - else - { - PrintBattleTowerTrainerMessage(gSaveBlock2.battleTower.ereaderTrainer.farewellPlayerLost.easyChat); - } -} - -void TryEnableBravoTrainerBattleTower(void) -{ - s32 i; - - for (i = 0; i < 2; i++) - { - if (gSaveBlock2.battleTower.var_4AE[i] == 1) - { - sub_80BFD20(); - } - } -} - -#if GERMAN -u8 de_sub_81364AC(void) -{ - if (gSaveBlock2.battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) - { - return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; - } - else if (gSaveBlock2.battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) - { - return gSaveBlock2.battleTower.records[gSaveBlock2.battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass; - } - else - { - return gBattleTowerTrainers[gSaveBlock2.battleTower.battleTowerTrainerId].trainerClass; - } -} - -u8 de_sub_81364F8(void) -{ - return gSaveBlock2.battleTower.ereaderTrainer.trainerClass; -} -#endif |