summaryrefslogtreecommitdiff
path: root/engine/battle_tower.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/battle_tower.asm')
-rw-r--r--engine/battle_tower.asm210
1 files changed, 210 insertions, 0 deletions
diff --git a/engine/battle_tower.asm b/engine/battle_tower.asm
new file mode 100644
index 000000000..b880a099b
--- /dev/null
+++ b/engine/battle_tower.asm
@@ -0,0 +1,210 @@
+Function_LoadOpponentTrainerAndPokemons: ; 1f8000
+ ld a, [rSVBK]
+ push af
+ ld a, BANK(BT_OTTrainer)
+ ld [rSVBK], a
+
+ ; Fill BT_OTTrainer with zeros
+ xor a
+ ld hl, BT_OTTrainer
+ ld bc, BT_OTTrainerEnd - BT_OTTrainer
+ call ByteFill
+
+ ; Write $ff into the Item-Slots
+ ld a, $ff
+ ld [BT_OTPkmn1Item], a
+ ld [BT_OTPkmn2Item], a
+ ld [BT_OTPkmn3Item], a
+
+ ; Set BT_OTTrainer as start address to write the following data to
+ ld de, BT_OTTrainer
+
+ ld a, [hRandomAdd]
+ ld b, a
+.resample ; loop to find a random trainer
+ call Random
+ ld a, [hRandomAdd]
+ add b
+ ld b, a ; b contains the nr of the trainer
+IF DEF(CRYSTAL11)
+ and (1 << 7) - 1
+ cp 70
+ELSE
+ and (1 << 5) - 1
+ cp 21
+ENDC
+ jr nc, .resample
+ ld b, a
+
+ ld a, BANK(sBTTrainers)
+ call GetSRAMBank
+
+ ld c, BATTLETOWER_NROFTRAINERS
+ ld hl, sBTTrainers
+.next_trainer
+ ld a, [hli]
+ cp b
+ jr z, .resample
+ dec c
+ jr nz, .next_trainer ; c <= 7 initialise all 7 trainers?
+
+ ld hl, sBTTrainers
+ ld a, [sNrOfBeatenBattleTowerTrainers]
+ ld c, a
+ ld a, b
+ ld b, 0
+ add hl, bc
+ ld [hl], a
+
+ call CloseSRAM
+
+ push af
+; Copy name (10 bytes) and class (1 byte) of trainer
+ ld hl, BattleTowerTrainers
+ ld bc, NAME_LENGTH
+ call AddNTimes
+ ld bc, NAME_LENGTH
+ call CopyBytes
+
+ call Function_LoadRandomBattleTowerPkmn
+ pop af
+
+ ld hl, BattleTowerTrainerData
+ ld bc, BATTLETOWER_TRAINERDATALENGTH
+ call AddNTimes
+ ld bc, BATTLETOWER_TRAINERDATALENGTH
+.copy_bt_trainer_data_loop
+ ld a, BANK(BattleTowerTrainerData)
+ call GetFarByte
+ ld [de], a
+ inc hl
+ inc de
+ dec bc
+ ld a, b
+ or c
+ jr nz, .copy_bt_trainer_data_loop
+
+ pop af
+ ld [rSVBK], a
+
+ ret
+
+
+Function_LoadRandomBattleTowerPkmn: ; 1f8081
+ ld c, BATTLETOWER_NROFPKMNS
+.loop
+ push bc
+ ld a, BANK(sBTPkmnPrevTrainer1)
+ call GetSRAMBank
+
+.FindARandomBattleTowerPkmn:
+ ; From Which LevelGroup are the Pkmn loaded
+ ; a = 1..10
+ ld a, [wBTChoiceOfLvlGroup] ; [$d800]
+ dec a
+ ld hl, BattleTowerMons
+ ld bc, BattleTowerMons2 - BattleTowerMons1
+ call AddNTimes
+
+ ld a, [hRandomAdd]
+ ld b, a
+.resample
+ call Random
+ ld a, [hRandomAdd]
+ add b
+ ld b, a
+ and $1f
+ cp BATTLETOWER_NRMONSPERLEVELBRACKET
+ jr nc, .resample
+ ; in register 'a' is the chosen Pkmn of the LevelGroup
+
+ ; Check if Pkmn was already loaded before
+ ; Check current and the 2 previous teams
+ ; includes check if item is double at the current team
+ ld bc, PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH
+ call AddNTimes
+ ld a, [hli]
+ ld b, a
+ ld a, [hld]
+ ld c, a
+ ld a, [BT_OTPkmn1]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn1Item]
+ cp c
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn2]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn2Item]
+ cp c
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn3]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [BT_OTPkmn3Item]
+ cp c
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevTrainer1]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevTrainer2]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevTrainer3]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevPrevTrainer1]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevPrevTrainer2]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+ ld a, [sBTPkmnPrevPrevTrainer3]
+ cp b
+ jr z, .FindARandomBattleTowerPkmn
+
+ ld bc, PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH
+ call CopyBytes
+
+ ld a, [wNamedObjectIndexBuffer]
+ push af
+ push de
+ ld hl, - (PARTYMON_STRUCT_LENGTH + PKMN_NAME_LENGTH)
+ add hl, de
+ ld a, [hl]
+ ld [wNamedObjectIndexBuffer], a
+ ld bc, PARTYMON_STRUCT_LENGTH
+ add hl, bc
+ push hl
+ call GetPokemonName
+ ld h, d
+ ld l, e
+ pop de
+ ld bc, PKMN_NAME_LENGTH
+ call CopyBytes
+
+ pop de
+ pop af
+ ld [wNamedObjectIndexBuffer], a
+ pop bc
+ dec c
+ jp nz, .loop
+
+ ld a, [sBTPkmnPrevTrainer1]
+ ld [sBTPkmnPrevPrevTrainer1], a
+ ld a, [sBTPkmnPrevTrainer2]
+ ld [sBTPkmnPrevPrevTrainer2], a
+ ld a, [sBTPkmnPrevTrainer3]
+ ld [sBTPkmnPrevPrevTrainer3], a
+ ld a, [BT_OTPkmn1]
+ ld [sBTPkmnPrevTrainer1], a
+ ld a, [BT_OTPkmn2]
+ ld [sBTPkmnPrevTrainer2], a
+ ld a, [BT_OTPkmn3]
+ ld [sBTPkmnPrevTrainer3], a
+ call CloseSRAM
+ ret
+; 1f814e
+
+INCLUDE "data/battle_tower.asm"