jep-hack/engine/events/battle_tower/load_trainer.asm
Zeta_Null 2f8a41f833 First Commit
Upload literally everything from the pokecrystal16 expand-move-ID branch
2023-09-10 12:35:35 -04:00

252 lines
4.8 KiB
NASM

LoadOpponentTrainerAndPokemon:
ldh a, [rSVBK]
push af
ld a, BANK(wBT_OTTrainer)
ldh [rSVBK], a
; Fill wBT_OTTrainer with zeros
xor a
ld hl, wBT_OTTrainer
ld bc, BATTLE_TOWER_STRUCT_LENGTH
call ByteFill
; Write $ff into the Item-Slots
ld a, $ff
ld [wBT_OTMon1Item], a
ld [wBT_OTMon2Item], a
ld [wBT_OTMon3Item], a
; Set wBT_OTTrainer as start address to write the following data to
ld de, wBT_OTTrainer
ldh a, [hRandomAdd]
ld b, a
.resample ; loop to find a random trainer
call Random
ldh a, [hRandomAdd]
add b
ld b, a ; b contains the nr of the trainer
maskbits BATTLETOWER_NUM_UNIQUE_TRAINERS
cp BATTLETOWER_NUM_UNIQUE_TRAINERS
jr nc, .resample
ld b, a
ld a, BANK(sBTTrainers)
call OpenSRAM
ld c, BATTLETOWER_STREAK_LENGTH
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 LoadRandomBattleTowerMon
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
ldh [rSVBK], a
ret
LoadRandomBattleTowerMon:
ld c, BATTLETOWER_PARTY_LENGTH
.loop
push bc
ld a, BANK(sBTMonOfTrainers)
call OpenSRAM
.FindARandomBattleTowerMon:
; a = 1, 2, ..., 10 indicating level 10, 20, ..., 100 opponents
ld a, [wBTChoiceOfLvlGroup]
dec a
ld hl, BattleTowerMons
ld bc, BATTLETOWER_NUM_UNIQUE_MON * (NICKNAMED_MON_STRUCT_LENGTH + 5)
call AddNTimes
ldh a, [hRandomAdd]
ld b, a
.resample
call Random
ldh a, [hRandomAdd]
add b
ld b, a
maskbits BATTLETOWER_NUM_UNIQUE_MON
cp BATTLETOWER_NUM_UNIQUE_MON
jr nc, .resample
ld bc, NICKNAMED_MON_STRUCT_LENGTH + 5
call AddNTimes
; hl = pointer to the mon that will be loaded (1 byte species, 1 byte item, 2 -> 1 byte each move, NICKNAMED_MON_STRUCT_LENGTH - 6 bytes data)
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
push hl
push de
; check if it matches any of the previous two trainers' chosen Pokémon (six Pokémon in total)
ld e, 6
ld hl, sBTMonPrevTrainer1
.check_previous_mons_loop
ld a, [hli]
cp c
ld a, [hli]
jr nz, .check_previous_mons_next
cp b
jr z, .pop_and_retry
.check_previous_mons_next
dec e
jr nz, .check_previous_mons_loop
ld h, b
ld l, c
call GetPokemonIDFromIndex
ld hl, wTempSpecies
ld [hl], a
; check if it matches any of the current trainer's first two Pokémon (no need to check for the last one)
ld a, [wBT_OTMon1]
cp [hl]
jr z, .pop_and_retry
ld a, [wBT_OTMon2]
.pop_and_retry
pop de
pop hl
jr z, .FindARandomBattleTowerMon
; check if the held item matches any of the current trainer's first two Pokémon's held items
ld a, [wBT_OTMon1Item]
cp [hl]
jr z, .FindARandomBattleTowerMon
ld a, [wBT_OTMon2Item]
cp [hl]
jr z, .FindARandomBattleTowerMon
; reserve and load the converted species from wTempSpecies, manually load item and moves, and copy everything else
push hl
ld l, LOCKED_MON_ID_BATTLE_TOWER_1
; LOCKED_MOVE_ID_BATTLE_TOWER_MON1_MOVE1 rotated right 2
ld c, (LOCKED_MOVE_ID_BATTLE_TOWER_MON1_MOVE1 >> 2) | ((LOCKED_MOVE_ID_BATTLE_TOWER_MON1_MOVE1 & 3) << 6)
ld a, e
; assume that NICKNAMED_MON_STRUCT_LENGTH is not a multiple of $80 (it's actually far less than $80)
cp LOW(wBT_OTMon1)
jr z, .got_index
inc l
inc c
cp LOW(wBT_OTMon2)
jr z, .got_index
inc l
inc c
.got_index
ld a, [wTempSpecies]
ld [de], a
inc de
call LockPokemonID
pop hl
; item
ld a, [hli]
ld [de], a
inc de
; moves
ld b, NUM_MOVES
rlc c
rlc c
.move_loop
ld a, [hli]
push hl
ld h, [hl]
ld l, a
call GetMoveIDFromIndex
ld [de], a
inc de
ld l, c
call LockMoveID
inc c
pop hl
inc hl
dec b
jr nz, .move_loop
ld c, NICKNAMED_MON_STRUCT_LENGTH - 6
call CopyBytes
; rename the Pokémon to its default name (overriding the transliterated Japanese nicknames)
push de
ld hl, -MON_NAME_LENGTH
add hl, de
push hl
; wNamedObjectIndexBuffer = wTempSpecies
call GetPokemonName
ld h, d
ld l, e
pop de
ld bc, MON_NAME_LENGTH
call CopyBytes
pop de
pop bc
dec c
jp nz, .loop
push de
ld hl, sBTMonPrevTrainer1
ld de, sBTMonPrevPrevTrainer1
ld bc, 6
push hl
call CopyBytes
pop de
ld a, [wBT_OTMon1]
call .store_index
ld a, [wBT_OTMon2]
call .store_index
ld a, [wBT_OTMon3]
call .store_index
pop de
jp CloseSRAM
.store_index
call GetPokemonIndexFromID
ld a, l
ld [de], a
inc de
ld a, h
ld [de], a
inc de
ret
INCLUDE "data/battle_tower/classes.asm"
INCLUDE "data/battle_tower/parties.asm"