diff options
author | libjet <libj3t@gmail.com> | 2020-06-05 17:14:55 +0100 |
---|---|---|
committer | libjet <libj3t@gmail.com> | 2020-06-05 17:14:55 +0100 |
commit | 8ccc59b89445976e9e9bdc77ba797b51290a1e8f (patch) | |
tree | 766e95b767ba7525debe381c9c0bfba84c130f8c | |
parent | df30cbf05bb10dd3d770746a570e58e445683374 (diff) |
Add engine/battle_anims/anim_commands.asm
-rw-r--r-- | constants/battle_anim_constants.asm | 2 | ||||
-rwxr-xr-x | engine/battle_anims/anim_commands.asm | 1358 | ||||
-rwxr-xr-x | gfx/battle/minimize.2bpp | bin | 0 -> 16 bytes | |||
-rwxr-xr-x | gfx/battle/minimize.png | bin | 0 -> 85 bytes | |||
-rw-r--r-- | main.asm | 26 |
5 files changed, 1374 insertions, 12 deletions
diff --git a/constants/battle_anim_constants.asm b/constants/battle_anim_constants.asm index 1b57b240..57bbfcc8 100644 --- a/constants/battle_anim_constants.asm +++ b/constants/battle_anim_constants.asm @@ -807,6 +807,8 @@ BATTLEANIM_BASE_TILE EQU 7 * 7 ; Maximum size of a pokemon picture const ANIM_GFX_ANGELS const ANIM_GFX_WAVE const ANIM_GFX_AEROBLAST + const ANIM_GFX_PLAYERHEAD + const ANIM_GFX_ENEMYFEET ; battle_bg_effect struct members (see macros/wram.asm) const_def diff --git a/engine/battle_anims/anim_commands.asm b/engine/battle_anims/anim_commands.asm new file mode 100755 index 00000000..6ec670d0 --- /dev/null +++ b/engine/battle_anims/anim_commands.asm @@ -0,0 +1,1358 @@ +; Battle animation command interpreter. + +PlayBattleAnim: + ld c, 6 +.wait + call BattleAnimDelayFrame + dec c + jr nz, .wait + + call BattleAnimAssignPals + call BattleAnimRequestPals + call BattleAnimDelayFrame + + ld hl, hVBlank + ld a, [hl] + push af + + ld [hl], 1 + call BattleAnimRunScript + + pop af + ldh [hVBlank], a + + ld a, 1 + ldh [hBGMapMode], a + + call BattleAnimDelayFrame + call BattleAnimDelayFrame + call BattleAnimDelayFrame + call WaitSFX + ret + +BattleAnimRunScript: + ld a, [wFXAnimID + 1] + and a + jr nz, .hi_byte + + ld a, [wOptions] + bit 7, a + jr nz, .disabled + + call BattleAnimClearHud + call RunBattleAnimScript + + call BattleAnimAssignPals + call BattleAnimRequestPals + + xor a + ldh [hSCX], a + ldh [hSCY], a + call BattleAnimDelayFrame + call BattleAnimRestoreHuds + +.disabled + ld a, [wNumHits] + and a + jr z, .done + + ld l, a + ld h, 0 + ld de, ANIM_MISS + add hl, de + ld a, l + ld [wFXAnimID], a + ld a, h + ld [wFXAnimID + 1], a + +.hi_byte + call WaitSFX + call PlayHitSound + call RunBattleAnimScript + +.done + call BattleAnim_RevertPals + ret + +RunBattleAnimScript: + call ClearBattleAnims + +.playframe + call RunBattleAnimCommand + call _ExecuteBGEffects + call BattleAnim_UpdateOAM_All + call PushLYOverrides + call BattleAnimRequestPals + +; Speed up Rollout's animation. + ld a, [wFXAnimID + 1] + or a + jr nz, .not_rollout + + ld a, [wFXAnimID] + cp ROLLOUT + jr nz, .not_rollout + + ld a, ANIM_BG_2D + ld b, NUM_BG_EFFECTS + ld de, BG_EFFECT_STRUCT_LENGTH + ld hl, wBGEffect1Function +.find + cp [hl] + jr z, .done + add hl, de + dec b + jr nz, .find + +.not_rollout + call BattleAnimDelayFrame + +.done + ld a, [wBattleAnimFlags] + bit BATTLEANIM_STOP_F, a + jr z, .playframe + + call BattleAnim_ClearOAM + ret + +BattleAnimClearHud: + call BattleAnimDelayFrame + call WaitTop + call ClearActorHud + ld a, $1 + ldh [hBGMapMode], a + call BattleAnimDelayFrame + call BattleAnimDelayFrame + call BattleAnimDelayFrame + call WaitTop + ret + +BattleAnimRestoreHuds: + call BattleAnimDelayFrame + call WaitTop + + ld hl, UpdateBattleHuds + ld a, BANK(UpdatePlayerHUD) + rst FarCall + + ld a, $1 + ldh [hBGMapMode], a + call BattleAnimDelayFrame + call BattleAnimDelayFrame + call BattleAnimDelayFrame + call WaitTop + ret + +BattleAnimRequestPals: + ldh a, [hCGB] + and a + ret z + + ldh a, [rBGP] + ld b, a + ld a, [wBGP] + cp b + call nz, BattleAnim_SetBGPals + + ldh a, [rOBP0] + ld b, a + ld a, [wOBP0] + cp b + call nz, BattleAnim_SetOBPals + ret + +BattleAnimDelayFrame: +; Like DelayFrame but wastes battery life. + + ld a, 1 + ld [wVBlankOccurred], a +.wait + ld a, [wVBlankOccurred] + and a + jr nz, .wait + ret + +ClearActorHud: + ldh a, [hBattleTurn] + and a + jr z, .player + + hlcoord 1, 0 + lb bc, 4, 10 + call ClearBox + ret + +.player + hlcoord 9, 7 + lb bc, 5, 11 + call ClearBox + ret + +Unreferenced_Functioncc1ff: + xor a + ldh [hBGMapMode], a + ld a, LOW(vBGMap0 tile $28) + ldh [hBGMapAddress], a + ld a, HIGH(vBGMap0 tile $28) + ldh [hBGMapAddress + 1], a + call WaitBGMap2 + ld a, $60 + ldh [hWY], a + xor a ; LOW(vBGMap0) + ldh [hBGMapAddress], a + ld a, HIGH(vBGMap0) + ldh [hBGMapAddress + 1], a + call BattleAnimDelayFrame + ret + +BattleAnim_ClearOAM: + ld a, [wBattleAnimFlags] + bit BATTLEANIM_KEEPSPRITES_F, a + jr z, .delete + + ; Instead of deleting the sprites, make them all use PAL_BATTLE_OB_ENEMY + ld hl, wVirtualOAMSprite00Attributes + ld c, NUM_SPRITE_OAM_STRUCTS +.loop + ld a, [hl] + and $ff ^ (PALETTE_MASK | VRAM_BANK_1) ; PAL_BATTLE_OB_ENEMY (0) + ld [hli], a +rept SPRITEOAMSTRUCT_LENGTH - 1 + inc hl +endr + dec c + jr nz, .loop + ret + +.delete + ld hl, wVirtualOAM + ld c, wVirtualOAMEnd - wVirtualOAM + xor a +.loop2 + ld [hli], a + dec c + jr nz, .loop2 + ret + +RunBattleAnimCommand: + call .CheckTimer + ret nc + call .RunScript + ret + +.CheckTimer: + ld a, [wBattleAnimDelay] + and a + jr z, .done + + dec a + ld [wBattleAnimDelay], a + and a + ret + +.done + scf + ret + +.RunScript: +.loop + call GetBattleAnimByte + + cp anim_ret_command + jr nz, .not_done_with_anim + +; Return from a subroutine. + ld hl, wBattleAnimFlags + bit BATTLEANIM_IN_SUBROUTINE_F, [hl] + jr nz, .do_anim + + set BATTLEANIM_STOP_F, [hl] + ret + +.not_done_with_anim + cp anim_obj_command + jr nc, .do_anim + + ld [wBattleAnimDelay], a + ret + +.do_anim + call .DoCommand + + jr .loop + +.DoCommand: +; Execute battle animation command in [wBattleAnimByte]. + ld a, [wBattleAnimByte] + sub anim_obj_command + + ld e, a + ld d, 0 + ld hl, BattleAnimCommands + add hl, de + add hl, de + + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +BattleAnimCommands:: +; entries correspond to macros/scripts/battle_anims.asm enumeration + dw BattleAnimCmd_Obj + dw BattleAnimCmd_1GFX + dw BattleAnimCmd_2GFX + dw BattleAnimCmd_3GFX + dw BattleAnimCmd_4GFX + dw BattleAnimCmd_5GFX + dw BattleAnimCmd_IncObj + dw BattleAnimCmd_SetObj + dw BattleAnimCmd_IncBGEffect + dw BattleAnimCmd_BattlerGFX_1Row + dw BattleAnimCmd_BattlerGFX_2Row + dw BattleAnimCmd_CheckPokeball + dw BattleAnimCmd_Transform + dw BattleAnimCmd_RaiseSub + dw BattleAnimCmd_DropSub + dw BattleAnimCmd_ResetObp0 + dw BattleAnimCmd_Sound + dw BattleAnimCmd_Cry + dw BattleAnimCmd_MinimizeOpp + dw BattleAnimCmd_OAMOn + dw BattleAnimCmd_OAMOff + dw BattleAnimCmd_ClearObjs + dw BattleAnimCmd_BeatUp + dw BattleAnimCmd_E7 + dw BattleAnimCmd_E8 + dw BattleAnimCmd_E9 + dw BattleAnimCmd_EA ; dummy + dw BattleAnimCmd_EB ; dummy + dw BattleAnimCmd_EC ; dummy + dw BattleAnimCmd_ED ; dummy + dw BattleAnimCmd_IfParamAnd + dw BattleAnimCmd_JumpUntil + dw BattleAnimCmd_BGEffect + dw BattleAnimCmd_BGP + dw BattleAnimCmd_OBP0 + dw BattleAnimCmd_OBP1 + dw BattleAnimCmd_KeepSprites + dw BattleAnimCmd_F5 + dw BattleAnimCmd_F6 + dw BattleAnimCmd_F7 + dw BattleAnimCmd_IfParamEqual + dw BattleAnimCmd_SetVar + dw BattleAnimCmd_IncVar + dw BattleAnimCmd_IfVarEqual + dw BattleAnimCmd_Jump + dw BattleAnimCmd_Loop + dw BattleAnimCmd_Call + dw BattleAnimCmd_Ret + +BattleAnimCmd_E8: +BattleAnimCmd_E9: +BattleAnimCmd_EA: +BattleAnimCmd_EB: +BattleAnimCmd_EC: +BattleAnimCmd_ED: + ret + +BattleAnimCmd_Ret: + ld hl, wBattleAnimFlags + res BATTLEANIM_IN_SUBROUTINE_F, [hl] + ld hl, wBattleAnimParent + ld e, [hl] + inc hl + ld d, [hl] + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_Call: + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + push de + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + ld hl, wBattleAnimParent + ld [hl], e + inc hl + ld [hl], d + pop de + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ld hl, wBattleAnimFlags + set BATTLEANIM_IN_SUBROUTINE_F, [hl] + ret + +BattleAnimCmd_Jump: + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_Loop: + call GetBattleAnimByte + ld hl, wBattleAnimFlags + bit BATTLEANIM_IN_LOOP_F, [hl] + jr nz, .continue_loop + and a + jr z, .perpetual + dec a + set BATTLEANIM_IN_LOOP_F, [hl] + ld [wBattleAnimLoops], a +.continue_loop + ld hl, wBattleAnimLoops + ld a, [hl] + and a + jr z, .return_from_loop + dec [hl] +.perpetual + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +.return_from_loop + ld hl, wBattleAnimFlags + res BATTLEANIM_IN_LOOP_F, [hl] + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +BattleAnimCmd_JumpUntil: + ld hl, wBattleAnimParam + ld a, [hl] + and a + jr z, .dont_jump + + dec [hl] + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +.dont_jump + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +BattleAnimCmd_SetVar: + call GetBattleAnimByte + ld [wBattleAnimVar], a + ret + +BattleAnimCmd_IncVar: + ld hl, wBattleAnimVar + inc [hl] + ret + +BattleAnimCmd_IfVarEqual: + call GetBattleAnimByte + ld hl, wBattleAnimVar + cp [hl] + jr z, .jump + + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +.jump + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_IfParamEqual: + call GetBattleAnimByte + ld hl, wBattleAnimParam + cp [hl] + jr z, .jump + + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +.jump + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + + +BattleAnimCmd_IfParamAnd: + call GetBattleAnimByte + ld e, a + ld a, [wBattleAnimParam] + and e + jr nz, .jump + + ld hl, wBattleAnimAddress + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + +.jump + call GetBattleAnimByte + ld e, a + call GetBattleAnimByte + ld d, a + ld hl, wBattleAnimAddress + ld [hl], e + inc hl + ld [hl], d + ret + +BattleAnimCmd_Obj: +; index, x, y, param + call GetBattleAnimByte + ld [wBattleObjectTempID], a + call GetBattleAnimByte + ld [wBattleObjectTempXCoord], a + call GetBattleAnimByte + ld [wBattleObjectTempYCoord], a + call GetBattleAnimByte + ld [wBattleObjectTempParam], a + call QueueBattleAnimation + ret + +BattleAnimCmd_BGEffect: + call GetBattleAnimByte + ld [wBattleAnimTemp0], a + call GetBattleAnimByte + ld [wBattleAnimTemp1], a + call GetBattleAnimByte + ld [wBattleAnimTemp2], a + call GetBattleAnimByte + ld [wBattleAnimTemp3], a + call _QueueBGEffect + ret + +BattleAnimCmd_BGP: + call GetBattleAnimByte + ld [wBGP], a + ret + +BattleAnimCmd_OBP0: + call GetBattleAnimByte + ld [wOBP0], a + ret + +BattleAnimCmd_OBP1: + call GetBattleAnimByte + ld [wOBP1], a + ret + +BattleAnimCmd_ResetObp0: + ldh a, [hSGB] + and a + ld a, $e0 + jr z, .not_sgb + ld a, $f0 +.not_sgb + ld [wOBP0], a + ret + +BattleAnimCmd_ClearObjs: +; BUG: This function only clears the first 6⅔ objects + ld hl, wActiveAnimObjects + ld a, $a0 ; should be NUM_ANIM_OBJECTS * BATTLEANIMSTRUCT_LENGTH +.loop + ld [hl], 0 + inc hl + dec a + jr nz, .loop + ret + +BattleAnimCmd_1GFX: +BattleAnimCmd_2GFX: +BattleAnimCmd_3GFX: +BattleAnimCmd_4GFX: +BattleAnimCmd_5GFX: + ld a, [wBattleAnimByte] + and $f + ld c, a + ld hl, wBattleAnimTileDict + xor a + ld [wBattleAnimTemp0], a +.loop + ld a, [wBattleAnimTemp0] + cp (vTiles1 - vTiles0) / LEN_2BPP_TILE - BATTLEANIM_BASE_TILE + ret nc + call GetBattleAnimByte + ld [hli], a + ld a, [wBattleAnimTemp0] + ld [hli], a + push bc + push hl + ld l, a + ld h, $0 +rept 4 + add hl, hl +endr + ld de, vTiles0 tile BATTLEANIM_BASE_TILE + add hl, de + ld a, [wBattleAnimByte] + call LoadBattleAnimGFX + ld a, [wBattleAnimTemp0] + add c + ld [wBattleAnimTemp0], a + pop hl + pop bc + dec c + jr nz, .loop + ret + +BattleAnimCmd_IncObj: + call GetBattleAnimByte + ld e, NUM_ANIM_OBJECTS + ld bc, wActiveAnimObjects +.loop + ld hl, BATTLEANIMSTRUCT_INDEX + add hl, bc + ld d, [hl] + ld a, [wBattleAnimByte] + cp d + jr z, .found + ld hl, BATTLEANIMSTRUCT_LENGTH + add hl, bc + ld c, l + ld b, h + dec e + jr nz, .loop + ret + +.found + ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX + add hl, bc + inc [hl] + ret + +BattleAnimCmd_IncBGEffect: + call GetBattleAnimByte + ld e, NUM_BG_EFFECTS + ld bc, wBGEffect1Function +.loop + ld hl, $0 + add hl, bc + ld d, [hl] + ld a, [wBattleAnimByte] + cp d + jr z, .found + ld hl, 4 + add hl, bc + ld c, l + ld b, h + dec e + jr nz, .loop + ret + +.found + ld hl, BG_EFFECT_STRUCT_JT_INDEX + add hl, bc + inc [hl] + ret + +BattleAnimCmd_SetObj: + call GetBattleAnimByte + ld e, NUM_ANIM_OBJECTS + ld bc, wActiveAnimObjects +.loop + ld hl, BATTLEANIMSTRUCT_INDEX + add hl, bc + ld d, [hl] + ld a, [wBattleAnimByte] + cp d + jr z, .found + ld hl, BATTLEANIMSTRUCT_LENGTH + add hl, bc + ld c, l + ld b, h + dec e + jr nz, .loop + ret + +.found + call GetBattleAnimByte + ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX + add hl, bc + ld [hl], a + ret + +BattleAnimCmd_BattlerGFX_1Row: + ld hl, wBattleAnimTileDict +.loop + ld a, [hl] + and a + jr z, .okay + inc hl + inc hl + jr .loop + +.okay + ld a, ANIM_GFX_PLAYERHEAD + ld [hli], a + ld a, ($80 - 6 - 7) - BATTLEANIM_BASE_TILE + ld [hli], a + ld a, ANIM_GFX_ENEMYFEET + ld [hli], a + ld a, ($80 - 6) - BATTLEANIM_BASE_TILE + ld [hl], a + + ld hl, vTiles0 tile ($80 - 6 - 7) + ld de, vTiles2 tile $06 ; Enemy feet start tile + ld a, 7 tiles ; Enemy pic height + ld [wBattleAnimTemp0], a + ld a, 7 ; Copy 7x1 tiles + call .LoadFeet + ld de, vTiles2 tile $31 ; Player head start tile + ld a, 6 tiles ; Player pic height + ld [wBattleAnimTemp0], a + ld a, 6 ; Copy 6x1 tiles + call .LoadFeet + ret + +.LoadFeet: + push af + push hl + push de + lb bc, BANK(@), 1 + call Request2bpp + pop de + ld a, [wBattleAnimTemp0] + ld l, a + ld h, 0 + add hl, de + ld e, l + ld d, h + pop hl + ld bc, 1 tiles + add hl, bc + pop af + dec a + jr nz, .LoadFeet + ret + +BattleAnimCmd_BattlerGFX_2Row: + ld hl, wBattleAnimTileDict +.loop + ld a, [hl] + and a + jr z, .okay + inc hl + inc hl + jr .loop + +.okay + ld a, ANIM_GFX_PLAYERHEAD + ld [hli], a + ld a, ($80 - 6 * 2 - 7 * 2) - BATTLEANIM_BASE_TILE + ld [hli], a + ld a, ANIM_GFX_ENEMYFEET + ld [hli], a + ld a, ($80 - 6 * 2) - BATTLEANIM_BASE_TILE + ld [hl], a + + ld hl, vTiles0 tile ($80 - 6 * 2 - 7 * 2) + ld de, vTiles2 tile $05 ; Enemy feet start tile + ld a, 7 tiles ; Enemy pic height + ld [wBattleAnimTemp0], a + ld a, 7 ; Copy 7x2 tiles + call .LoadHead + ld de, vTiles2 tile $31 ; Player head start tile + ld a, 6 tiles ; Player pic height + ld [wBattleAnimTemp0], a + ld a, 6 ; Copy 6x2 tiles + call .LoadHead + ret + +.LoadHead: + push af + push hl + push de + lb bc, BANK(@), 2 + call Request2bpp + pop de + ld a, [wBattleAnimTemp0] + ld l, a + ld h, 0 + add hl, de + ld e, l + ld d, h + pop hl + ld bc, 2 tiles + add hl, bc + pop af + dec a + jr nz, .LoadHead + ret + +BattleAnimCmd_CheckPokeball: + callfar GetPokeBallWobble + ld a, c + ld [wBattleAnimVar], a + ret + +BattleAnimCmd_E7: + ret + +BattleAnimCmd_Transform: + ld a, [wCurPartySpecies] + push af + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld a, [wTempBattleMonSpecies] ; TempBattleMonSpecies + ld [wCurPartySpecies], a ; CurPartySpecies + ld hl, wBattleMonDVs ; BattleMonDVs + predef GetUnownLetter + ld de, vTiles2 tile $00 + predef GetMonFrontpic + jr .done + +.player + ld a, [wTempEnemyMonSpecies] ; TempEnemyMonSpecies + ld [wCurPartySpecies], a ; CurPartySpecies + ld hl, wEnemyMonDVs ; EnemyMonDVs + predef GetUnownLetter + ld de, vTiles2 tile $31 + predef GetMonBackpic + +.done + pop af + ld [wCurPartySpecies], a + ret + +BattleAnimCmd_RaiseSub: + xor a + call OpenSRAM + +GetSubstitutePic: ; used only for BANK(GetSubstitutePic) + ld hl, sScratch + ld bc, (7 * 7) tiles +.loop + xor a + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld hl, MonsterSpriteGFX + 0 tiles + ld de, sScratch + (2 * 7 + 5) tiles + call .CopyTile + ld hl, MonsterSpriteGFX + 1 tiles + ld de, sScratch + (3 * 7 + 5) tiles + call .CopyTile + ld hl, MonsterSpriteGFX + 2 tiles + ld de, sScratch + (2 * 7 + 6) tiles + call .CopyTile + ld hl, MonsterSpriteGFX + 3 tiles + ld de, sScratch + (3 * 7 + 6) tiles + call .CopyTile + + ld hl, vTiles2 tile $00 + ld de, sScratch + lb bc, BANK(GetSubstitutePic), 7 * 7 + call Request2bpp + jr .done + +.player + ld hl, MonsterSpriteGFX + 4 tiles + ld de, sScratch + (2 * 6 + 4) tiles + call .CopyTile + ld hl, MonsterSpriteGFX + 5 tiles + ld de, sScratch + (3 * 6 + 4) tiles + call .CopyTile + ld hl, MonsterSpriteGFX + 6 tiles + ld de, sScratch + (2 * 6 + 5) tiles + call .CopyTile + ld hl, MonsterSpriteGFX + 7 tiles + ld de, sScratch + (3 * 6 + 5) tiles + call .CopyTile + + ld hl, vTiles2 tile $31 + ld de, sScratch + lb bc, BANK(GetSubstitutePic), 6 * 6 + call Request2bpp + +.done + call CloseSRAM + ret + +.CopyTile: + ld bc, 1 tiles + ld a, BANK(MonsterSpriteGFX) + call FarCopyBytes + ret + +BattleAnimCmd_MinimizeOpp: + xor a + call OpenSRAM + +GetMinimizePic: + ld hl, sScratch + ld bc, (7 * 7) tiles +.loop + xor a + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld de, sScratch + $1a tiles + call CopyMinimizePic + ld hl, vTiles2 tile $00 + ld de, sScratch + lb bc, BANK(GetMinimizePic), 7 * 7 + call Request2bpp + jr .done + +.player + ld de, sScratch + $160 + call CopyMinimizePic + ld hl, vTiles2 tile $31 + ld de, sScratch + lb bc, BANK(GetMinimizePic), 6 * 6 + call Request2bpp + +.done + call CloseSRAM + ret + +CopyMinimizePic: + ld hl, MinimizePic + ld bc, $10 + ld a, BANK(MinimizePic) + call FarCopyBytes + ret + +MinimizePic: +INCBIN "gfx/battle/minimize.2bpp" + +BattleAnimCmd_DropSub: + ld a, [wCurPartySpecies] + push af + ldh a, [hBattleTurn] + and a + jr z, .player + + callfar DropEnemySub + jr .done + +.player + callfar DropPlayerSub + +.done + pop af + ld [wCurPartySpecies], a + ret + +BattleAnimCmd_BeatUp: + ld a, [wCurPartySpecies] + push af + + ld a, [wBattleAnimParam] + ld [wCurPartySpecies], a + + ldh a, [hBattleTurn] + and a + jr z, .player + + ld hl, wBattleMonDVs + predef GetUnownLetter + ld de, vTiles2 tile $00 + predef GetMonFrontpic + jr .done + +.player + ld hl, wEnemyMonDVs + predef GetUnownLetter + ld de, vTiles2 tile $31 + predef GetMonBackpic + +.done + pop af + ld [wCurPartySpecies], a ; CurPartySpecies + ld b, SCGB_BATTLE_COLORS + call GetSGBLayout + ret + +BattleAnimCmd_OAMOn: + ret + +BattleAnimCmd_OAMOff: + ret + +BattleAnimCmd_KeepSprites: + ld hl, wBattleAnimFlags + set BATTLEANIM_KEEPSPRITES_F, [hl] + ret + +BattleAnimCmd_F5: + ret + +BattleAnimCmd_F6: + ret + +BattleAnimCmd_F7: + ret + +BattleAnimCmd_Sound: + call GetBattleAnimByte + ld e, a + srl a + srl a + ld [wSFXDuration], a + call .GetCryTrack + maskbits NUM_NOISE_CHANS + ld [wCryTracks], a + + ld e, a + ld d, 0 + ld hl, .GetPanning + add hl, de + ld a, [hl] + ld [wStereoPanningMask], a + + call GetBattleAnimByte + ld e, a + ld d, 0 + callfar PlayStereoSFX + + ret + +.GetPanning: + db $f0, $0f, $f0, $0f + +.GetCryTrack: + ldh a, [hBattleTurn] + and a + jr nz, .enemy + + ld a, e + ret + +.enemy + ld a, e + xor 1 + ret + +BattleAnimCmd_Cry: + call GetBattleAnimByte + maskbits NUM_NOISE_CHANS + ld e, a + ld d, 0 + ld hl, .CryData +rept 4 + add hl, de +endr + + ldh a, [hBattleTurn] + and a + jr nz, .enemy + + ld a, $f0 + ld [wCryTracks], a + ld a, [wBattleMonSpecies] + jr .done_cry_tracks + +.enemy + ld a, $0f + ld [wCryTracks], a + ld a, [wEnemyMonSpecies] + +.done_cry_tracks + push hl + call LoadCry + pop hl + jr c, .done + + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + + push hl + ld hl, wCryPitch + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + ld a, l + ld [wCryPitch], a + ld a, h + ld [wCryPitch + 1], a + pop hl + + ld a, [hli] + ld c, a + ld b, [hl] + ld hl, wCryLength + ld a, [hli] + ld h, [hl] + ld l, a + add hl, bc + + ld a, l + ld [wCryLength], a + ld a, h + ld [wCryLength + 1], a + ld a, 1 + ld [wStereoPanningMask], a + + callfar _PlayCry + +.done + ret + +.CryData: +; +pitch, +length + dw $0000, $00c0 + dw $0000, $0040 + dw $0000, $0000 + dw $0000, $0000 + +PlayHitSound: + ld a, [wNumHits] + cp $1 + jr z, .okay + cp $4 + ret nz + +.okay + ld a, [wTypeModifier] + and $7f + ret z + + cp EFFECTIVE + ld de, SFX_DAMAGE + jr z, .play + + ld de, SFX_SUPER_EFFECTIVE + jr nc, .play + + ld de, SFX_NOT_VERY_EFFECTIVE + +.play + call PlaySFX + ret + +BattleAnimAssignPals: + ldh a, [hCGB] + and a + jr nz, .cgb + ldh a, [hSGB] + and a + ld a, %11100000 + jr z, .sgb + ld a, %11110000 + +.sgb + ld [wOBP0], a + ld a, %11100100 + ld [wBGP], a + ld [wOBP1], a + ret + +.cgb + ld a, %11100100 + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + call DmgToCgbBGPals + lb de, %11100100, %11100100 + call DmgToCgbObjPals + ret + +ClearBattleAnims:: +; Clear animation block + ld hl, wLYOverrides + ld bc, wBattleAnimEnd - wLYOverrides +.loop + ld [hl], 0 + inc hl + dec bc + ld a, c + or b + jr nz, .loop + + ld hl, wFXAnimID + ld e, [hl] + inc hl + ld d, [hl] + ld hl, BattleAnimations + add hl, de + add hl, de + call GetBattleAnimPointer + call BattleAnimAssignPals + call BattleAnimDelayFrame + ret + +BattleAnim_RevertPals: + call WaitTop + ld a, %11100100 + ld [wBGP], a + ld [wOBP0], a + ld [wOBP1], a + call DmgToCgbBGPals + lb de, %11100100, %11100100 + call DmgToCgbObjPals + xor a + ldh [hSCX], a + ldh [hSCY], a + call BattleAnimDelayFrame + ld a, $1 + ldh [hBGMapMode], a + ret + +BattleAnim_SetBGPals: + ldh [rBGP], a + ldh a, [hCGB] + and a + ret z + ld hl, wBGPals2 + ld de, wBGPals1 + ldh a, [rBGP] + ld b, a + ld c, 7 + call CopyPals + ld hl, wOBPals2 + ld de, wOBPals1 + ldh a, [rBGP] + ld b, a + ld c, 2 + call CopyPals + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +BattleAnim_SetOBPals: + ldh [rOBP0], a + ldh a, [hCGB] + and a + ret z + ld hl, wOBPals2 palette PAL_BATTLE_OB_GRAY + ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY + ldh a, [rOBP0] + ld b, a + ld c, 2 + call CopyPals + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +BattleAnim_UpdateOAM_All: + ld a, 0 + ld [wBattleAnimOAMPointerLo], a + ld hl, wActiveAnimObjects + ld e, NUM_ANIM_OBJECTS +.loop + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call DoBattleAnimFrame + call BattleAnimOAMUpdate + pop de + pop hl + jr c, .done + +.next + ld bc, BATTLEANIMSTRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + ld a, [wBattleAnimOAMPointerLo] + ld l, a + ld h, HIGH(wVirtualOAM) +.loop2 + ld a, l + cp LOW(wVirtualOAMEnd) + jr nc, .done + xor a + ld [hli], a + jr .loop2 + +.done + ret diff --git a/gfx/battle/minimize.2bpp b/gfx/battle/minimize.2bpp Binary files differnew file mode 100755 index 00000000..66b554de --- /dev/null +++ b/gfx/battle/minimize.2bpp diff --git a/gfx/battle/minimize.png b/gfx/battle/minimize.png Binary files differnew file mode 100755 index 00000000..95502f19 --- /dev/null +++ b/gfx/battle/minimize.png @@ -298,24 +298,26 @@ INCBIN "gfx/credits/theend.2bpp" SECTION "Move Animations", ROMX INCLUDE "engine/events/bug_contest/display_stats.asm" +INCLUDE "engine/battle_anims/anim_commands.asm" -PlayBattleAnim:: - dr $cc0d7, $cc283 -BattleAnimCommands:: - dr $cc283, $cc5f7 -BattleAnimCmd_RaiseSub:: - dr $cc5f7, $cc67c -BattleAnimCmd_MinimizeOpp:: - dr $cc67c, $cc836 -ClearBattleAnims:: - dr $cc836, $cc8f0 QueueBattleAnimation:: - dr $cc8f0, $ce6aa + dr $cc8f0, $cc958 +BattleAnimOAMUpdate:: + dr $cc958, $cca97 +_ExecuteBGEffects:: + dr $cca97, $cca9e +_QueueBGEffect:: + dr $cca9e, $ccf0d +DoBattleAnimFrame:: + dr $ccf0d, $ce6aa BattleAnim_Sine_e:: dr $ce6aa, $ce6b0 BattleAnim_Cosine_e:: - dr $ce6b0, $cfce3 + dr $ce6b0, $ce78b + +LoadBattleAnimGFX:: + dr $ce78b, $cfce3 SECTION "Font Inversed", ROMX |