2020-07-04 02:57:43 +00:00
|
|
|
; stores hl in [wTrainerHeaderPtr]
|
|
|
|
StoreTrainerHeaderPointer::
|
|
|
|
ld a, h
|
|
|
|
ld [wTrainerHeaderPtr], a
|
|
|
|
ld a, l
|
|
|
|
ld [wTrainerHeaderPtr+1], a
|
|
|
|
ret
|
|
|
|
|
2020-09-19 00:08:01 +00:00
|
|
|
; executes the current map script from the function pointer array provided in de.
|
2024-09-19 01:01:18 +00:00
|
|
|
; a: map script index to execute (unless overridden by [wStatusFlags7] BIT_USE_CUR_MAP_SCRIPT)
|
2020-09-19 00:08:01 +00:00
|
|
|
; hl: trainer header pointer
|
2020-07-04 02:57:43 +00:00
|
|
|
ExecuteCurMapScriptInTable::
|
|
|
|
push af
|
|
|
|
push de
|
|
|
|
call StoreTrainerHeaderPointer
|
|
|
|
pop hl
|
|
|
|
pop af
|
|
|
|
push hl
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags7
|
|
|
|
bit BIT_USE_CUR_MAP_SCRIPT, [hl]
|
|
|
|
res BIT_USE_CUR_MAP_SCRIPT, [hl]
|
2020-07-04 02:57:43 +00:00
|
|
|
jr z, .useProvidedIndex ; test if map script index was overridden manually
|
|
|
|
ld a, [wCurMapScript]
|
|
|
|
.useProvidedIndex
|
|
|
|
pop hl
|
|
|
|
ld [wCurMapScript], a
|
|
|
|
call CallFunctionInTable
|
|
|
|
ld a, [wCurMapScript]
|
|
|
|
ret
|
|
|
|
|
|
|
|
LoadGymLeaderAndCityName::
|
|
|
|
push de
|
|
|
|
ld de, wGymCityName
|
|
|
|
ld bc, $11
|
|
|
|
call CopyData ; load city name
|
|
|
|
pop hl
|
|
|
|
ld de, wGymLeaderName
|
|
|
|
ld bc, NAME_LENGTH
|
|
|
|
jp CopyData ; load gym leader name
|
|
|
|
|
|
|
|
; reads specific information from trainer header (pointed to at wTrainerHeaderPtr)
|
|
|
|
; a: offset in header data
|
|
|
|
; 0 -> flag's bit (into wTrainerHeaderFlagBit)
|
|
|
|
; 2 -> flag's byte ptr (into hl)
|
|
|
|
; 4 -> before battle text (into hl)
|
|
|
|
; 6 -> after battle text (into hl)
|
|
|
|
; 8 -> end battle text (into hl)
|
|
|
|
ReadTrainerHeaderInfo::
|
|
|
|
push de
|
|
|
|
push af
|
|
|
|
ld d, $0
|
|
|
|
ld e, a
|
|
|
|
ld hl, wTrainerHeaderPtr
|
|
|
|
ld a, [hli]
|
|
|
|
ld l, [hl]
|
|
|
|
ld h, a
|
|
|
|
add hl, de
|
|
|
|
pop af
|
|
|
|
and a
|
|
|
|
jr nz, .nonZeroOffset
|
|
|
|
ld a, [hl]
|
|
|
|
ld [wTrainerHeaderFlagBit], a ; store flag's bit
|
|
|
|
jr .done
|
|
|
|
.nonZeroOffset
|
|
|
|
cp $2
|
|
|
|
jr z, .readPointer ; read flag's byte ptr
|
|
|
|
cp $4
|
|
|
|
jr z, .readPointer ; read before battle text
|
|
|
|
cp $6
|
|
|
|
jr z, .readPointer ; read after battle text
|
|
|
|
cp $8
|
|
|
|
jr z, .readPointer ; read end battle text
|
|
|
|
cp $a
|
|
|
|
jr nz, .done
|
|
|
|
ld a, [hli] ; read end battle text (2) but override the result afterwards (XXX why, bug?)
|
|
|
|
ld d, [hl]
|
|
|
|
ld e, a
|
|
|
|
jr .done
|
|
|
|
.readPointer
|
|
|
|
ld a, [hli]
|
|
|
|
ld h, [hl]
|
|
|
|
ld l, a
|
|
|
|
.done
|
|
|
|
pop de
|
|
|
|
ret
|
|
|
|
|
|
|
|
TrainerFlagAction::
|
|
|
|
predef_jump FlagActionPredef
|
|
|
|
|
|
|
|
TalkToTrainer::
|
|
|
|
call StoreTrainerHeaderPointer
|
|
|
|
xor a
|
|
|
|
call ReadTrainerHeaderInfo ; read flag's bit
|
|
|
|
ld a, $2
|
|
|
|
call ReadTrainerHeaderInfo ; read flag's byte ptr
|
|
|
|
ld a, [wTrainerHeaderFlagBit]
|
|
|
|
ld c, a
|
|
|
|
ld b, FLAG_TEST
|
|
|
|
call TrainerFlagAction ; read trainer's flag
|
|
|
|
ld a, c
|
|
|
|
and a
|
|
|
|
jr z, .trainerNotYetFought ; test trainer's flag
|
|
|
|
ld a, $6
|
|
|
|
call ReadTrainerHeaderInfo ; print after battle text
|
|
|
|
jp PrintText
|
|
|
|
.trainerNotYetFought
|
|
|
|
ld a, $4
|
|
|
|
call ReadTrainerHeaderInfo ; print before battle text
|
|
|
|
call PrintText
|
|
|
|
ld a, $a
|
|
|
|
call ReadTrainerHeaderInfo ; (?) does nothing apparently (maybe bug in ReadTrainerHeaderInfo)
|
|
|
|
push de
|
|
|
|
ld a, $8
|
|
|
|
call ReadTrainerHeaderInfo ; read end battle text
|
|
|
|
pop de
|
|
|
|
call SaveEndBattleTextPointers
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags7
|
|
|
|
set BIT_USE_CUR_MAP_SCRIPT, [hl] ; activate map script index override (index is set below)
|
|
|
|
ld hl, wMiscFlags
|
|
|
|
bit BIT_SEEN_BY_TRAINER, [hl] ; test if player is already engaging the trainer (because the trainer saw the player)
|
2020-07-04 02:57:43 +00:00
|
|
|
ret nz
|
|
|
|
; if the player talked to the trainer of his own volition
|
|
|
|
call EngageMapTrainer
|
|
|
|
ld hl, wCurMapScript
|
|
|
|
inc [hl] ; increment map script index before StartTrainerBattle increments it again (next script function is usually EndTrainerBattle)
|
|
|
|
jp StartTrainerBattle
|
|
|
|
|
|
|
|
; checks if any trainers are seeing the player and wanting to fight
|
|
|
|
CheckFightingMapTrainers::
|
2020-07-15 17:35:39 +00:00
|
|
|
IF DEF(_DEBUG)
|
|
|
|
call DebugPressedOrHeldB
|
|
|
|
jr nz, .trainerNotEngaging
|
|
|
|
ENDC
|
2020-07-04 02:57:43 +00:00
|
|
|
call CheckForEngagingTrainers
|
|
|
|
ld a, [wSpriteIndex]
|
|
|
|
cp $ff
|
|
|
|
jr nz, .trainerEngaging
|
2023-07-15 22:36:59 +00:00
|
|
|
IF DEF(_DEBUG)
|
2020-07-15 17:35:39 +00:00
|
|
|
.trainerNotEngaging
|
2023-07-15 22:36:59 +00:00
|
|
|
ENDC
|
2020-07-04 02:57:43 +00:00
|
|
|
xor a
|
|
|
|
ld [wSpriteIndex], a
|
|
|
|
ld [wTrainerHeaderFlagBit], a
|
|
|
|
ret
|
|
|
|
.trainerEngaging
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags7
|
|
|
|
set BIT_TRAINER_BATTLE, [hl]
|
2020-07-04 02:57:43 +00:00
|
|
|
ld [wEmotionBubbleSpriteIndex], a
|
|
|
|
xor a ; EXCLAMATION_BUBBLE
|
|
|
|
ld [wWhichEmotionBubble], a
|
|
|
|
predef EmotionBubble
|
|
|
|
ld a, D_RIGHT | D_LEFT | D_UP | D_DOWN
|
|
|
|
ld [wJoyIgnore], a
|
|
|
|
xor a
|
2020-07-06 23:03:05 +00:00
|
|
|
ldh [hJoyHeld], a
|
2020-07-04 02:57:43 +00:00
|
|
|
call TrainerWalkUpToPlayer_Bank0
|
|
|
|
ld hl, wCurMapScript
|
|
|
|
inc [hl] ; increment map script index (next script function is usually DisplayEnemyTrainerTextAndStartBattle)
|
|
|
|
ret
|
|
|
|
|
|
|
|
; display the before battle text after the enemy trainer has walked up to the player's sprite
|
|
|
|
DisplayEnemyTrainerTextAndStartBattle::
|
2024-07-16 17:02:54 +00:00
|
|
|
ld a, [wStatusFlags5]
|
|
|
|
and 1 << BIT_SCRIPTED_NPC_MOVEMENT
|
2020-07-04 02:57:43 +00:00
|
|
|
ret nz ; return if the enemy trainer hasn't finished walking to the player's sprite
|
|
|
|
ld [wJoyIgnore], a
|
|
|
|
ld a, [wSpriteIndex]
|
2024-09-19 01:01:18 +00:00
|
|
|
ldh [hSpriteIndex], a
|
2020-07-04 02:57:43 +00:00
|
|
|
call DisplayTextID
|
|
|
|
; fall through
|
|
|
|
|
|
|
|
StartTrainerBattle::
|
|
|
|
xor a
|
|
|
|
ld [wJoyIgnore], a
|
|
|
|
call InitBattleEnemyParameters
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags3
|
|
|
|
set BIT_TALKED_TO_TRAINER, [hl]
|
|
|
|
set BIT_PRINT_END_BATTLE_TEXT, [hl]
|
|
|
|
ld hl, wStatusFlags4
|
|
|
|
set BIT_UNKNOWN_4_1, [hl]
|
2020-07-04 02:57:43 +00:00
|
|
|
ld hl, wCurMapScript
|
|
|
|
inc [hl] ; increment map script index (next script function is usually EndTrainerBattle)
|
|
|
|
ret
|
|
|
|
|
|
|
|
EndTrainerBattle::
|
|
|
|
ld hl, wCurrentMapScriptFlags
|
|
|
|
set 5, [hl]
|
|
|
|
set 6, [hl]
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags3
|
|
|
|
res BIT_PRINT_END_BATTLE_TEXT, [hl]
|
|
|
|
ld hl, wMiscFlags
|
|
|
|
res BIT_SEEN_BY_TRAINER, [hl] ; player is no longer engaged by any trainer
|
2020-07-04 02:57:43 +00:00
|
|
|
ld a, [wIsInBattle]
|
|
|
|
cp $ff
|
|
|
|
jp z, ResetButtonPressedAndMapScript
|
|
|
|
ld a, $2
|
|
|
|
call ReadTrainerHeaderInfo
|
|
|
|
ld a, [wTrainerHeaderFlagBit]
|
|
|
|
ld c, a
|
|
|
|
ld b, FLAG_SET
|
|
|
|
call TrainerFlagAction ; flag trainer as fought
|
|
|
|
ld a, [wEnemyMonOrTrainerClass]
|
|
|
|
cp OPP_ID_OFFSET
|
|
|
|
jr nc, .skipRemoveSprite ; test if trainer was fought (in that case skip removing the corresponding sprite)
|
|
|
|
ld hl, wMissableObjectList
|
|
|
|
ld de, $2
|
|
|
|
ld a, [wSpriteIndex]
|
|
|
|
call IsInArray ; search for sprite ID
|
|
|
|
inc hl
|
|
|
|
ld a, [hl]
|
|
|
|
ld [wMissableObjectIndex], a ; load corresponding missable object index and remove it
|
|
|
|
predef HideObject
|
|
|
|
.skipRemoveSprite
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags5
|
|
|
|
bit BIT_UNKNOWN_5_4, [hl]
|
|
|
|
res BIT_UNKNOWN_5_4, [hl]
|
2020-07-04 02:57:43 +00:00
|
|
|
ret nz
|
|
|
|
|
|
|
|
ResetButtonPressedAndMapScript::
|
|
|
|
xor a
|
|
|
|
ld [wJoyIgnore], a
|
2020-07-06 23:03:05 +00:00
|
|
|
ldh [hJoyHeld], a
|
|
|
|
ldh [hJoyPressed], a
|
|
|
|
ldh [hJoyReleased], a
|
2020-07-04 02:57:43 +00:00
|
|
|
ld [wCurMapScript], a ; reset battle status
|
|
|
|
ret
|
|
|
|
|
|
|
|
; calls TrainerWalkUpToPlayer
|
|
|
|
TrainerWalkUpToPlayer_Bank0::
|
2020-07-07 01:18:22 +00:00
|
|
|
farjp TrainerWalkUpToPlayer
|
2020-07-04 02:57:43 +00:00
|
|
|
|
|
|
|
; sets opponent type and mon set/lvl based on the engaging trainer data
|
|
|
|
InitBattleEnemyParameters::
|
|
|
|
ld a, [wEngagedTrainerClass]
|
|
|
|
ld [wCurOpponent], a
|
|
|
|
ld [wEnemyMonOrTrainerClass], a
|
|
|
|
cp OPP_ID_OFFSET
|
|
|
|
ld a, [wEngagedTrainerSet]
|
|
|
|
jr c, .noTrainer
|
|
|
|
ld [wTrainerNo], a
|
|
|
|
ret
|
|
|
|
.noTrainer
|
2024-07-16 17:02:54 +00:00
|
|
|
ld [wCurEnemyLevel], a
|
2020-07-04 02:57:43 +00:00
|
|
|
ret
|
|
|
|
|
|
|
|
GetSpritePosition1::
|
|
|
|
ld hl, _GetSpritePosition1
|
|
|
|
jr SpritePositionBankswitch
|
|
|
|
|
|
|
|
GetSpritePosition2::
|
|
|
|
ld hl, _GetSpritePosition2
|
|
|
|
jr SpritePositionBankswitch
|
|
|
|
|
|
|
|
SetSpritePosition1::
|
|
|
|
ld hl, _SetSpritePosition1
|
|
|
|
jr SpritePositionBankswitch
|
|
|
|
|
|
|
|
SetSpritePosition2::
|
|
|
|
ld hl, _SetSpritePosition2
|
|
|
|
SpritePositionBankswitch::
|
2023-12-24 00:24:29 +00:00
|
|
|
ld b, BANK("Trainer Sight")
|
2020-07-04 02:57:43 +00:00
|
|
|
jp Bankswitch ; indirect jump to one of the four functions
|
|
|
|
|
|
|
|
CheckForEngagingTrainers::
|
|
|
|
xor a
|
|
|
|
call ReadTrainerHeaderInfo ; read trainer flag's bit (unused)
|
|
|
|
ld d, h ; store trainer header address in de
|
|
|
|
ld e, l
|
|
|
|
.trainerLoop
|
|
|
|
call StoreTrainerHeaderPointer ; set trainer header pointer to current trainer
|
|
|
|
ld a, [de]
|
|
|
|
ld [wSpriteIndex], a ; store trainer flag's bit
|
|
|
|
ld [wTrainerHeaderFlagBit], a
|
2020-07-14 19:45:36 +00:00
|
|
|
cp -1
|
2020-07-04 02:57:43 +00:00
|
|
|
ret z
|
|
|
|
ld a, $2
|
|
|
|
call ReadTrainerHeaderInfo ; read trainer flag's byte ptr
|
|
|
|
ld b, FLAG_TEST
|
|
|
|
ld a, [wTrainerHeaderFlagBit]
|
|
|
|
ld c, a
|
|
|
|
call TrainerFlagAction ; read trainer flag
|
|
|
|
ld a, c
|
|
|
|
and a ; has the trainer already been defeated?
|
|
|
|
jr nz, .continue
|
|
|
|
push hl
|
|
|
|
push de
|
|
|
|
push hl
|
|
|
|
xor a
|
|
|
|
call ReadTrainerHeaderInfo ; get trainer header pointer
|
|
|
|
inc hl
|
|
|
|
ld a, [hl] ; read trainer engage distance
|
|
|
|
pop hl
|
|
|
|
ld [wTrainerEngageDistance], a
|
|
|
|
ld a, [wSpriteIndex]
|
|
|
|
swap a
|
|
|
|
ld [wTrainerSpriteOffset], a
|
|
|
|
predef TrainerEngage
|
|
|
|
pop de
|
|
|
|
pop hl
|
|
|
|
ld a, [wTrainerSpriteOffset]
|
|
|
|
and a
|
|
|
|
ret nz ; break if the trainer is engaging
|
|
|
|
.continue
|
|
|
|
ld hl, $c
|
|
|
|
add hl, de
|
|
|
|
ld d, h
|
|
|
|
ld e, l
|
|
|
|
jr .trainerLoop
|
|
|
|
|
|
|
|
; hl = text if the player wins
|
|
|
|
; de = text if the player loses
|
|
|
|
SaveEndBattleTextPointers::
|
2020-07-06 23:03:05 +00:00
|
|
|
ldh a, [hLoadedROMBank]
|
2020-07-04 02:57:43 +00:00
|
|
|
ld [wEndBattleTextRomBank], a
|
|
|
|
ld a, h
|
|
|
|
ld [wEndBattleWinTextPointer], a
|
|
|
|
ld a, l
|
|
|
|
ld [wEndBattleWinTextPointer + 1], a
|
|
|
|
ld a, d
|
|
|
|
ld [wEndBattleLoseTextPointer], a
|
|
|
|
ld a, e
|
|
|
|
ld [wEndBattleLoseTextPointer + 1], a
|
|
|
|
ret
|
|
|
|
|
|
|
|
; loads data of some trainer on the current map and plays pre-battle music
|
|
|
|
; [wSpriteIndex]: sprite ID of trainer who is engaged
|
|
|
|
EngageMapTrainer::
|
|
|
|
ld hl, wMapSpriteExtraData
|
|
|
|
ld d, $0
|
|
|
|
ld a, [wSpriteIndex]
|
|
|
|
dec a
|
|
|
|
add a
|
|
|
|
ld e, a
|
|
|
|
add hl, de ; seek to engaged trainer data
|
|
|
|
ld a, [hli] ; load trainer class
|
|
|
|
ld [wEngagedTrainerClass], a
|
|
|
|
ld a, [hl] ; load trainer mon set
|
|
|
|
ld [wEngagedTrainerSet], a
|
|
|
|
jp PlayTrainerMusic
|
|
|
|
|
|
|
|
PrintEndBattleText::
|
|
|
|
push hl
|
2024-07-16 17:02:54 +00:00
|
|
|
ld hl, wStatusFlags3
|
|
|
|
bit BIT_PRINT_END_BATTLE_TEXT, [hl]
|
|
|
|
res BIT_PRINT_END_BATTLE_TEXT, [hl]
|
2020-07-04 02:57:43 +00:00
|
|
|
pop hl
|
|
|
|
ret z
|
2020-07-06 23:03:05 +00:00
|
|
|
ldh a, [hLoadedROMBank]
|
2020-07-04 02:57:43 +00:00
|
|
|
push af
|
|
|
|
ld a, [wEndBattleTextRomBank]
|
2020-07-06 23:03:05 +00:00
|
|
|
ldh [hLoadedROMBank], a
|
2020-07-04 02:57:43 +00:00
|
|
|
ld [MBC1RomBank], a
|
|
|
|
push hl
|
2020-07-07 01:18:22 +00:00
|
|
|
farcall SaveTrainerName
|
2020-07-04 02:57:43 +00:00
|
|
|
ld hl, TrainerEndBattleText
|
|
|
|
call PrintText
|
|
|
|
pop hl
|
|
|
|
pop af
|
2020-07-06 23:03:05 +00:00
|
|
|
ldh [hLoadedROMBank], a
|
2020-07-04 02:57:43 +00:00
|
|
|
ld [MBC1RomBank], a
|
2020-07-07 01:18:22 +00:00
|
|
|
farcall FreezeEnemyTrainerSprite
|
2020-07-04 02:57:43 +00:00
|
|
|
jp WaitForSoundToFinish
|
|
|
|
|
|
|
|
GetSavedEndBattleTextPointer::
|
|
|
|
ld a, [wBattleResult]
|
|
|
|
and a
|
|
|
|
; won battle
|
|
|
|
jr nz, .lostBattle
|
|
|
|
ld a, [wEndBattleWinTextPointer]
|
|
|
|
ld h, a
|
|
|
|
ld a, [wEndBattleWinTextPointer + 1]
|
|
|
|
ld l, a
|
|
|
|
ret
|
|
|
|
.lostBattle
|
|
|
|
ld a, [wEndBattleLoseTextPointer]
|
|
|
|
ld h, a
|
|
|
|
ld a, [wEndBattleLoseTextPointer + 1]
|
|
|
|
ld l, a
|
|
|
|
ret
|
|
|
|
|
|
|
|
TrainerEndBattleText::
|
2020-07-04 21:09:35 +00:00
|
|
|
text_far _TrainerNameText
|
|
|
|
text_asm
|
2020-07-04 02:57:43 +00:00
|
|
|
call GetSavedEndBattleTextPointer
|
|
|
|
call TextCommandProcessor
|
|
|
|
jp TextScriptEnd
|
|
|
|
|
|
|
|
; only engage with the trainer if the player is not already
|
|
|
|
; engaged with another trainer
|
|
|
|
; XXX unused?
|
|
|
|
CheckIfAlreadyEngaged::
|
2024-07-16 17:02:54 +00:00
|
|
|
ld a, [wMiscFlags]
|
|
|
|
bit BIT_SEEN_BY_TRAINER, a
|
2020-07-04 02:57:43 +00:00
|
|
|
ret nz
|
|
|
|
call EngageMapTrainer
|
|
|
|
xor a
|
|
|
|
ret
|
|
|
|
|
|
|
|
PlayTrainerMusic::
|
|
|
|
ld a, [wEngagedTrainerClass]
|
2020-07-17 17:27:27 +00:00
|
|
|
cp OPP_RIVAL1
|
2020-07-04 02:57:43 +00:00
|
|
|
ret z
|
2020-07-17 17:27:27 +00:00
|
|
|
cp OPP_RIVAL2
|
2020-07-04 02:57:43 +00:00
|
|
|
ret z
|
2020-07-17 17:27:27 +00:00
|
|
|
cp OPP_RIVAL3
|
2020-07-04 02:57:43 +00:00
|
|
|
ret z
|
|
|
|
ld a, [wGymLeaderNo]
|
|
|
|
and a
|
|
|
|
ret nz
|
|
|
|
xor a
|
|
|
|
ld [wAudioFadeOutControl], a
|
|
|
|
ld a, SFX_STOP_ALL_MUSIC
|
|
|
|
call PlaySound
|
|
|
|
ld a, BANK(Music_MeetEvilTrainer)
|
|
|
|
ld [wAudioROMBank], a
|
|
|
|
ld [wAudioSavedROMBank], a
|
|
|
|
ld a, [wEngagedTrainerClass]
|
|
|
|
ld b, a
|
|
|
|
ld hl, EvilTrainerList
|
|
|
|
.evilTrainerListLoop
|
|
|
|
ld a, [hli]
|
|
|
|
cp $ff
|
|
|
|
jr z, .noEvilTrainer
|
|
|
|
cp b
|
|
|
|
jr nz, .evilTrainerListLoop
|
|
|
|
ld a, MUSIC_MEET_EVIL_TRAINER
|
|
|
|
jr .PlaySound
|
|
|
|
.noEvilTrainer
|
|
|
|
ld hl, FemaleTrainerList
|
|
|
|
.femaleTrainerListLoop
|
|
|
|
ld a, [hli]
|
|
|
|
cp $ff
|
|
|
|
jr z, .maleTrainer
|
|
|
|
cp b
|
|
|
|
jr nz, .femaleTrainerListLoop
|
|
|
|
ld a, MUSIC_MEET_FEMALE_TRAINER
|
|
|
|
jr .PlaySound
|
|
|
|
.maleTrainer
|
|
|
|
ld a, MUSIC_MEET_MALE_TRAINER
|
|
|
|
.PlaySound
|
|
|
|
ld [wNewSoundID], a
|
|
|
|
jp PlaySound
|
|
|
|
|
|
|
|
INCLUDE "data/trainers/encounter_types.asm"
|