Files

273 lines
5.2 KiB
NASM

InitBattle::
ld a, [wCurOpponent]
and a
jr z, DetermineWildOpponent
InitOpponent:
ld a, [wCurOpponent]
ld [wCurPartySpecies], a
ld [wEnemyMonSpecies2], a
jr InitBattleCommon
DetermineWildOpponent:
ld a, [wStatusFlags6]
bit BIT_DEBUG_MODE, a
jr z, .notDebugMode
ldh a, [hJoyHeld]
bit B_PAD_B, a ; disable wild encounters
ret nz
.notDebugMode
ld a, [wNumberOfNoRandomBattleStepsLeft]
and a
ret nz
callfar TryDoWildEncounter
ret nz
InitBattleCommon:
ld a, [wMapPalOffset]
push af
ld hl, wLetterPrintingDelayFlags
ld a, [hl]
push af
res BIT_TEXT_DELAY, [hl] ; no delay
call InitBattleVariables
ld a, [wEnemyMonSpecies2]
sub OPP_ID_OFFSET
jp c, InitWildBattle
ld [wTrainerClass], a
call GetTrainerInformation
callfar ReadTrainer
callfar DoBattleTransitionAndInitBattleVariables
call _LoadTrainerPic
xor a
ld [wEnemyMonSpecies2], a
ldh [hStartTileID], a
dec a
ld [wAICount], a
hlcoord 12, 0
predef CopyUncompressedPicToTilemap
ld a, $ff
ld [wEnemyMonPartyPos], a
ld a, TRAINER_BATTLE
ld [wIsInBattle], a
; Is this a major story battle?
ld a, [wLoneAttackNo]
and a
jp z, _InitBattleCommon
farcall_ModifyPikachuHappiness PIKAHAPPY_GYMLEADER ; useless since already in bank3d
jp _InitBattleCommon
InitWildBattle:
ld a, WILD_BATTLE
ld [wIsInBattle], a
callfar LoadEnemyMonData
callfar DoBattleTransitionAndInitBattleVariables
ld a, [wCurOpponent]
cp RESTLESS_SOUL
jr z, .isGhost
callfar IsGhostBattle
jr nz, .isNoGhost
.isGhost
ld hl, wMonHSpriteDim
ld a, $66
ld [hli], a ; write sprite dimensions
ld bc, GhostPic
ld a, c
ld [hli], a ; write front sprite pointer
ld [hl], b
ld hl, wEnemyMonNick ; set name to "GHOST"
ld_hli_a_string "GHOST@"
ld a, [wCurPartySpecies]
push af
ld a, MON_GHOST
ld [wCurPartySpecies], a
ld de, vFrontPic
call LoadMonFrontSprite ; load ghost sprite
pop af
ld [wCurPartySpecies], a
jr .spriteLoaded
.isNoGhost
ld de, vFrontPic
call LoadMonFrontSprite ; load mon sprite
.spriteLoaded
xor a
ld [wTrainerClass], a
ldh [hStartTileID], a
hlcoord 12, 0
predef CopyUncompressedPicToTilemap
; common code that executes after init battle code specific to trainer or wild battles
_InitBattleCommon:
ld b, SET_PAL_BATTLE_BLACK
call RunPaletteCommand
callfar SlidePlayerAndEnemySilhouettesOnScreen
xor a
ldh [hAutoBGTransferEnabled], a
ld hl, .emptyString
call PrintText
call SaveScreenTilesToBuffer1
call ClearScreen
ld a, HIGH(vBGMap0)
ldh [hAutoBGTransferDest + 1], a
ld a, $1
ldh [hAutoBGTransferEnabled], a
call Delay3
ld a, HIGH(vBGMap1)
ldh [hAutoBGTransferDest + 1], a
call LoadScreenTilesFromBuffer1
hlcoord 9, 7
lb bc, 5, 10
call ClearScreenArea
hlcoord 1, 0
lb bc, 4, 10
call ClearScreenArea
call ClearSprites
ld a, [wIsInBattle]
dec a ; is it a wild battle?
ld hl, DrawEnemyHUDAndHPBar
ld b, BANK(DrawEnemyHUDAndHPBar)
call z, Bankswitch ; draw enemy HUD and HP bar if it's a wild battle
callfar StartBattle
callfar EndOfBattle
pop af
ld [wLetterPrintingDelayFlags], a
pop af
ld [wMapPalOffset], a
ld a, [wSavedTileAnimations]
ldh [hTileAnimations], a
scf
ret
.emptyString
db "@"
_LoadTrainerPic:
ld a, [wTrainerPicPointer]
ld e, a
ld a, [wTrainerPicPointer + 1]
ld d, a ; de contains pointer to trainer pic
ld a, [wLinkState]
and a
ld a, BANK("Trainer Pics")
jr z, .loadSprite
ld a, BANK(RedPicFront)
.loadSprite
call UncompressSpriteFromDE
ld de, vFrontPic
ld a, $77
ld c, a
jp LoadUncompressedSpriteData
LoadMonBackPic:
; Assumes the monster's attributes have
; been loaded with GetMonHeader.
ld a, [wBattleMonSpecies2]
ld [wCurPartySpecies], a
hlcoord 1, 5
lb bc, 7, 8
call ClearScreenArea
ld hl, wMonHBackSprite - wMonHeader
call UncompressMonSprite
predef ScaleSpriteByTwo
ld de, vBackPic
call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite
ld hl, vSprites
ld de, vBackPic
ld c, (2 * SPRITEBUFFERSIZE) / 16 ; count of 16-byte chunks to be copied
ldh a, [hLoadedROMBank]
ld b, a
jp CopyVideoData
; animates the mon "growing" out of the pokeball
AnimateSendingOutMon:
ld a, [wPredefHL]
ld h, a
ld a, [wPredefHL + 1]
ld l, a
ldh a, [hStartTileID]
ldh [hBaseTileID], a
ld b, $4c
ld a, [wIsInBattle]
and a
jr z, .notInBattle
add b
ld [hl], a
call Delay3
ld bc, -(SCREEN_WIDTH * 2 + 1)
add hl, bc
ld a, 1
ld [wDownscaledMonSize], a
lb bc, 3, 3
predef CopyDownscaledMonTiles
ld c, 4
call DelayFrames
ld bc, -(SCREEN_WIDTH * 2 + 1)
add hl, bc
xor a
ld [wDownscaledMonSize], a
lb bc, 5, 5
predef CopyDownscaledMonTiles
ld c, 5
call DelayFrames
ld bc, -(SCREEN_WIDTH * 2 + 1)
jr .next
.notInBattle
ld bc, -(SCREEN_WIDTH * 6 + 3)
.next
add hl, bc
ldh a, [hBaseTileID]
add $31
jr CopyUncompressedPicToHL
CopyUncompressedPicToTilemap:
ld a, [wPredefHL]
ld h, a
ld a, [wPredefHL + 1]
ld l, a
ldh a, [hStartTileID]
CopyUncompressedPicToHL::
lb bc, 7, 7
ld de, SCREEN_WIDTH
push af
ld a, [wSpriteFlipped]
and a
jr nz, .flipped
pop af
.loop
push bc
push hl
.innerLoop
ld [hl], a
add hl, de
inc a
dec c
jr nz, .innerLoop
pop hl
inc hl
pop bc
dec b
jr nz, .loop
ret
.flipped
push bc
ld b, 0
dec c
add hl, bc
pop bc
pop af
.flippedLoop
push bc
push hl
.flippedInnerLoop
ld [hl], a
add hl, de
inc a
dec c
jr nz, .flippedInnerLoop
pop hl
dec hl
pop bc
dec b
jr nz, .flippedLoop
ret