diff options
Diffstat (limited to 'engine/battle/init_battle.asm')
-rw-r--r-- | engine/battle/init_battle.asm | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/engine/battle/init_battle.asm b/engine/battle/init_battle.asm new file mode 100644 index 00000000..680befda --- /dev/null +++ b/engine/battle/init_battle.asm @@ -0,0 +1,283 @@ +InitBattle:: + ld a, [wCurOpponent] + and a + jr z, DetermineWildOpponent + +InitOpponent: + ld a, [wCurOpponent] + ld [wcf91], a + ld [wEnemyMonSpecies2], a + jr InitBattleCommon + +DetermineWildOpponent: + ld a, [wd732] + bit 1, a + jr z, .asm_3ef2f + ldh a, [hJoyHeld] + bit 1, a ; B button pressed? + ret nz +.asm_3ef2f + 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 1, [hl] + 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, $2 + ld [wIsInBattle], a + +; Is this a major story battle? + ld a, [wLoneAttackNo] + and a + jp z, _InitBattleCommon + callabd_ModifyPikachuHappiness PIKAHAPPY_GYMLEADER ; useless since already in bank3d + jp _InitBattleCommon + +InitWildBattle: + ld a, $1 + 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 a, "G" + ld [hli], a + ld a, "H" + ld [hli], a + ld a, "O" + ld [hli], a + ld a, "S" + ld [hli], a + ld a, "T" + ld [hli], a + ld [hl], "@" + ld a, [wcf91] + push af + ld a, MON_GHOST + ld [wcf91], a + ld de, vFrontPic + call LoadMonFrontSprite ; load ghost sprite + pop af + ld [wcf91], 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, $98 + ldh [hAutoBGTransferDest + 1], a + ld a, $1 + ldh [hAutoBGTransferEnabled], a + call Delay3 + ld a, $9c + 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: +; wd033-wd034 contain pointer to pic + 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("Pics 6") ; this is where all the trainer pics are (not counting Red's) + 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 [wcf91], 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 |