pokecrystal-board/engine/battle_anims/functions.asm
2023-09-24 15:06:19 +02:00

4310 lines
73 KiB
NASM

DoBattleAnimFrame:
ld hl, BATTLEANIMSTRUCT_FUNCTION
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable:
; entries correspond to BATTLE_ANIM_FUNC_* constants
table_width 2, DoBattleAnimFrame.Jumptable
dw BattleAnimFunc_Null
dw BattleAnimFunc_MoveFromUserToTarget
dw BattleAnimFunc_MoveFromUserToTargetAndDisappear
dw BattleAnimFunc_MoveInCircle
dw BattleAnimFunc_MoveWaveToTarget
dw BattleAnimFunc_ThrowFromUserToTarget
dw BattleAnimFunc_ThrowFromUserToTargetAndDisappear
dw BattleAnimFunc_Drop
dw BattleAnimFunc_MoveFromUserToTargetSpinAround
dw BattleAnimFunc_Shake
dw BattleAnimFunc_FireBlast
dw BattleAnimFunc_RazorLeaf
dw BattleAnimFunc_Bubble
dw BattleAnimFunc_Surf
dw BattleAnimFunc_Sing
dw BattleAnimFunc_WaterGun
dw BattleAnimFunc_Ember
dw BattleAnimFunc_Powder
dw BattleAnimFunc_PokeBall
dw BattleAnimFunc_PokeBallBlocked
dw BattleAnimFunc_Recover
dw BattleAnimFunc_ThunderWave
dw BattleAnimFunc_Clamp_Encore
dw BattleAnimFunc_Bite
dw BattleAnimFunc_SolarBeam
dw BattleAnimFunc_Gust
dw BattleAnimFunc_RazorWind
dw BattleAnimFunc_Kick
dw BattleAnimFunc_Absorb
dw BattleAnimFunc_Egg
dw BattleAnimFunc_MoveUp
dw BattleAnimFunc_Wrap
dw BattleAnimFunc_LeechSeed
dw BattleAnimFunc_Sound
dw BattleAnimFunc_ConfuseRay
dw BattleAnimFunc_Dizzy
dw BattleAnimFunc_Amnesia
dw BattleAnimFunc_FloatUp
dw BattleAnimFunc_Dig
dw BattleAnimFunc_String
dw BattleAnimFunc_Paralyzed
dw BattleAnimFunc_SpiralDescent
dw BattleAnimFunc_PoisonGas
dw BattleAnimFunc_Horn
dw BattleAnimFunc_Needle
dw BattleAnimFunc_PetalDance
dw BattleAnimFunc_ThiefPayday
dw BattleAnimFunc_AbsorbCircle
dw BattleAnimFunc_Bonemerang
dw BattleAnimFunc_Shiny
dw BattleAnimFunc_SkyAttack
dw BattleAnimFunc_GrowthSwordsDance
dw BattleAnimFunc_SmokeFlameWheel
dw BattleAnimFunc_PresentSmokescreen
dw BattleAnimFunc_StrengthSeismicToss
dw BattleAnimFunc_SpeedLine
dw BattleAnimFunc_Sludge
dw BattleAnimFunc_MetronomeHand
dw BattleAnimFunc_MetronomeSparkleSketch
dw BattleAnimFunc_Agility
dw BattleAnimFunc_SacredFire
dw BattleAnimFunc_SafeguardProtect
dw BattleAnimFunc_LockOnMindReader
dw BattleAnimFunc_Spikes
dw BattleAnimFunc_HealBellNotes
dw BattleAnimFunc_BatonPass
dw BattleAnimFunc_Conversion
dw BattleAnimFunc_EncoreBellyDrum
dw BattleAnimFunc_SwaggerMorningSun
dw BattleAnimFunc_HiddenPower
dw BattleAnimFunc_Curse
dw BattleAnimFunc_PerishSong
dw BattleAnimFunc_RapidSpin
dw BattleAnimFunc_BetaPursuit
dw BattleAnimFunc_RainSandstorm
dw BattleAnimFunc_AnimObjB0
dw BattleAnimFunc_PsychUp
dw BattleAnimFunc_AncientPower
dw BattleAnimFunc_RockSmash
dw BattleAnimFunc_Cotton
assert_table_length NUM_BATTLE_ANIM_FUNCS
BattleAnimFunc_Null:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.one
call DeinitBattleAnimation
.zero
ret
BattleAnimFunc_ThrowFromUserToTargetAndDisappear:
call BattleAnimFunc_ThrowFromUserToTarget
ret c
call DeinitBattleAnimation
ret
BattleAnimFunc_ThrowFromUserToTarget:
; If x coord at $88 or beyond, abort.
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $88
ret nc
; Move right 2 pixels
add $2
ld [hl], a
; Move down 1 pixel
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
; Decrease var1 and hold onto its previous value (argument of the sine function)
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
; Get param (amplitude of the sine function)
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld d, [hl]
call BattleAnim_Sine
; Store the sine result in the Y offset
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
; Carry flag denotes success
scf
ret
BattleAnimFunc_MoveWaveToTarget:
; Wave motion from one mon to another. Obj is cleared when it reaches x coord $88. Examples: Shadow Ball, Dragon Rage
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $88
jr c, .move
call DeinitBattleAnimation
ret
.move
add $2
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
inc [hl]
inc [hl]
ld d, $10
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
sra a
sra a
sra a
sra a
ld [hl], a
ret
BattleAnimFunc_MoveInCircle:
; Slow circular motion. Examples: Thundershock, Flamethrower
; Obj Param: Distance from center (masked with $7F). Bit 7 causes object to start on other side of the circle
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
bit 7, [hl]
ld a, $0
jr z, .got_starting_position
ld a, $20
.got_starting_position
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $7f
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld d, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ret
BattleAnimFunc_MoveFromUserToTarget:
; Moves object diagonally at a ~30° angle towards opponent and stops when it reaches x coord $84. Obj Param changes the speed
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.one
call DeinitBattleAnimation
ret
.zero
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $84
ret nc
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
call BattleAnim_StepToTarget
ret
BattleAnimFunc_MoveFromUserToTargetAndDisappear:
; Same as BattleAnimFunc_01 but objs are cleared when they reach x coord $84
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $84
jr nc, .done
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
call BattleAnim_StepToTarget
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_PokeBall:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
dw .five
dw .six
dw .seven
dw .eight
dw .nine
dw .ten
dw .eleven
.zero ; init
call GetBallAnimPal
call BattleAnim_IncAnonJumptableIndex
ret
.one
call BattleAnimFunc_ThrowFromUserToTarget
ret c
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
add [hl]
ld [hl], a
ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_3
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
.three
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_1
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $0
inc hl
ld [hl], $10
.four
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
ld d, [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec a
ld [hl], a
and $1f
ret nz
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
sub $4
ld [hl], a
ret nz
ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_4
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
.six
ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_5
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
dec [hl]
.two
.five
.nine
ret
.seven
call GetBallAnimPal
ld a, BATTLE_ANIM_FRAMESET_POKE_BALL_2
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], $20
.eight
.ten
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
ld d, [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec a
ld [hl], a
and $1f
jr z, .eleven
and $f
ret nz
call BattleAnim_IncAnonJumptableIndex
ret
.eleven
call DeinitBattleAnimation
ret
BattleAnimFunc_PokeBallBlocked:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call GetBallAnimPal
call BattleAnim_IncAnonJumptableIndex
ret
.one
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $70
jr nc, .next
call BattleAnimFunc_ThrowFromUserToTarget
ret
.next
call BattleAnim_IncAnonJumptableIndex
.two
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp $80
jr nc, .done
add $4
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
dec [hl]
dec [hl]
ret
.done
call DeinitBattleAnimation
ret
GetBallAnimPal:
ld hl, BallColors
ldh a, [rSVBK]
push af
ld a, BANK(wCurItem)
ldh [rSVBK], a
ld a, [wCurItem]
ld e, a
pop af
ldh [rSVBK], a
.IsInArray:
ld a, [hli]
cp -1
jr z, .load
cp e
jr z, .load
inc hl
jr .IsInArray
.load
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_PALETTE
add hl, bc
ld [hl], a
ret
INCLUDE "data/battle_anims/ball_colors.asm"
BattleAnimFunc_Ember:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
swap a
and $f
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], a
ret
.one
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $88
ret nc
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
call BattleAnim_StepToTarget
ret
.two
call DeinitBattleAnimation
ret
.three
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_FLAMETHROWER
call ReinitBattleAnimFrameset
.four
ret
BattleAnimFunc_Drop:
; Drops obj. The Obj Param dictates how fast it is (lower value is faster) and how long it stays bouncing (lower value is longer). Example: Rock Slide
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $30
inc hl
ld [hl], $48
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
ld d, [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $3f
ret nz
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $20
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
sub [hl]
jr z, .done
jr c, .done
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_MoveFromUserToTargetSpinAround:
; Object moves from user to target target and spins around it once. Example: Fire Spin, Swift
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $80
jr nc, .next
call .SetCoords
ret
.next
call BattleAnim_IncAnonJumptableIndex
.one
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $0
.two
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $40
jr nc, .loop_back
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $18
call BattleAnim_Cosine
sub $18
sra a
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $18
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
add [hl]
ld [hl], a
ret
.loop_back
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f0
jr z, .finish
sub $10
ld d, a
ld a, [hl]
and $f
or d
ld [hl], a
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
dec [hl]
ret
.finish
call BattleAnim_IncAnonJumptableIndex
.three
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $b0
jr c, .retain
call DeinitBattleAnimation
ret
.retain
call .SetCoords
ret
.SetCoords:
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
add [hl]
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
ld e, a
srl e
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
.loop
dec [hl]
dec e
jr nz, .loop
ret
BattleAnimFunc_Shake:
; Object switches position side to side. Obj Param defines how far to move it. Example: Dynamic Punch
; Some objects use this function with a Param of 0
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $0
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .done_one
dec [hl]
ret
.done_one
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
swap a
and $f
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
xor $ff
inc a
ld [hl], a
ret
.two
call DeinitBattleAnimation
ret
BattleAnimFunc_FireBlast:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
dw .five
dw .six
dw .seven
dw .eight
dw .nine
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], a
cp $7
jr z, .seven
ld a, BATTLE_ANIM_FRAMESET_BURNED
call ReinitBattleAnimFrameset
ret
.seven
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $88
jr nc, .set_up_eight
add $2
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ret
.set_up_eight
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_EMBER
call ReinitBattleAnimFrameset
.eight
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $10
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ret
.nine
call DeinitBattleAnimation
ret
.one
; Flame that moves upward
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
dec [hl]
ret
.four
; Flame that moves down and left
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
inc [hl]
.two
; Flame that moves left
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
dec [hl]
ret
.five
; Flame that moves down and right
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
inc [hl]
.three
; Flame that moves right
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
inc [hl]
.six
ret
BattleAnimFunc_RazorLeaf:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
dw .five
dw .six
dw .seven
dw .eight
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $40
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $30
jr nc, .sine_cosine
call BattleAnim_IncAnonJumptableIndex
xor a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hli], a
ld [hl], a
ld a, BATTLE_ANIM_FRAMESET_RAZOR_LEAF_2
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
bit 6, [hl]
ret z
ld hl, BATTLEANIMSTRUCT_FRAME
add hl, bc
ld [hl], $5
ret
.sine_cosine
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $3f
ld d, a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
call BattleAnim_ScatterHorizontal
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld h, [hl]
ld l, a
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
ret
.two
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $20
jr nz, .sine_cosine_2
call DeinitBattleAnimation
ret
.sine_cosine_2
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $10
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
bit 6, [hl]
jr nz, .decrease
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
jr .finish
.decrease
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
dec [hl]
.finish
ld de, $80
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld h, [hl]
ld l, a
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
ret
.three
ld a, BATTLE_ANIM_FRAMESET_RAZOR_LEAF_1
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
res 5, [hl]
.four
.five
.six
.seven
call BattleAnim_IncAnonJumptableIndex
ret
.eight
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $c0
ret nc
ld a, $8
call BattleAnim_StepToTarget
ret
BattleAnim_ScatterHorizontal:
; Affects horizontal sine movement based on bit 7 of Obj Param
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
bit 7, a
jr nz, .negative
cp $20
jr nc, .plus_256
cp $18
jr nc, .plus_384
ld de, $200
ret
.plus_384
ld de, $180
ret
.plus_256
ld de, $100
ret
.negative
and %00111111
cp $20
jr nc, .minus_256
cp $18
jr nc, .minus_384
ld de, -$200
ret
.minus_384
ld de, -$180
ret
.minus_256
ld de, -$100
ret
BattleAnimFunc_RockSmash:
; Object moves at an arc
; Obj Param: Bit 7 makes arc flip horizontally
; Bit 6 defines offset from base frameset FRAMESET_19
; Rest defines arc radius
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $40
rlca
rlca
add BATTLE_ANIM_FRAMESET_BIG_ROCK
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $40
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $30
jr nc, .sine_cosine
call DeinitBattleAnimation
ret
.sine_cosine
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $3f
ld d, a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
call BattleAnim_ScatterHorizontal
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld h, [hl]
ld l, a
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
ret
BattleAnimFunc_Bubble:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $c
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .next
dec [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
call BattleAnim_StepToTarget
ret
.next
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $0
ld a, BATTLE_ANIM_FRAMESET_PULSING_BUBBLE
call ReinitBattleAnimFrameset
.two
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $98
jr nc, .okay
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld h, [hl]
ld l, a
ld de, $60
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], d
.okay
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp $20
ret c
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f0
ld e, a
ld d, $ff
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld h, [hl]
ld l, a
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld [hl], d
ret
BattleAnimFunc_Surf:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
.zero
call BattleAnim_IncAnonJumptableIndex
ld a, LOW(rSCY)
ldh [hLCDCPointer], a
ld a, $58
ldh [hLYOverrideStart], a
ld a, $5e
ldh [hLYOverrideEnd], a
ret
.one
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld e, [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp e
jr nc, .move
call BattleAnim_IncAnonJumptableIndex
xor a
ldh [hLYOverrideStart], a
ret
.move
dec a
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $10
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
add [hl]
sub $10
ret c
ldh [hLYOverrideStart], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
inc a
and $7
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
inc [hl]
.two
ret
.three
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp $70
jr c, .move_down
xor a
ldh [hLCDCPointer], a
ldh [hLYOverrideStart], a
ldh [hLYOverrideEnd], a
.four
call DeinitBattleAnimation
ret
.move_down
inc a
inc a
ld [hl], a
sub $10
ret c
ldh [hLYOverrideStart], a
ret
BattleAnimFunc_Sing:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1
add [hl] ; BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3
call ReinitBattleAnimFrameset
.one
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $b8
jr c, .move
call DeinitBattleAnimation
ret
.move
ld a, $2
call BattleAnim_StepToTarget
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
ld d, $8
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
BattleAnimFunc_WaterGun:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
call BattleAnim_IncAnonJumptableIndex
.one
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp $30
jr c, .run_down
ld a, $2
call BattleAnim_StepToTarget
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
ld d, $8
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
.run_down
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_WATER_GUN_2
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], $0
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld [hl], $30
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
ld a, [hl]
and $1
ld [hl], a
.two
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $18
jr nc, .splash
inc [hl]
ret
.splash
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_WATER_GUN_3
call ReinitBattleAnimFrameset
.three
ret
BattleAnimFunc_Powder:
; Obj moves down and disappears at x coord $38
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $38
jr c, .move
call DeinitBattleAnimation
ret
.move
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld l, [hl]
ld h, a
ld de, $80
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], d
; Shakes object back and forth 16 pixels
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
xor $10
ld [hl], a
ret
BattleAnimFunc_Recover:
; Obj moves in an ever shrinking circle. Obj Param defines initial position in the circle
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f0
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
sla a
sla a
sla a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld [hl], $1
.one
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and a
jr nz, .move
call DeinitBattleAnimation
ret
.move
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld d, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
xor $1
ld [hl], a
ret z
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
dec [hl]
ret
BattleAnimFunc_ThunderWave:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.one
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_THUNDER_WAVE_EXTRA
call ReinitBattleAnimFrameset
.zero
.two
ret
.three
call DeinitBattleAnimation
ret
BattleAnimFunc_Clamp_Encore:
; Claps two objects together, twice. Also used by Encore
; Second object's frameset and position relative to first are both defined via this function
; Obj Param: Distance from center (masked with $7F). Bit 7 flips object horizontally by switching to a different frameset
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
dw .five
dw .six
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
bit 7, [hl]
jr nz, .flipped
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $10
jr .got_sine_start
.flipped
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $30
.got_sine_start
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $7f
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld d, [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
bit 7, a
jr nz, .load_no_inc
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
inc a ; BATTLE_ANIM_FRAMESET_3B (Clamp Flipped)
; BATTLE_ANIM_FRAMESET_A1 (Hands Flipped)
jr .reinit
.load_no_inc
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl] ; BATTLE_ANIM_FRAMESET_3A (Clamp)
; BATTLE_ANIM_FRAMESET_A0 (Hands)
.reinit
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $1f
ret nz
.two
.three
.four
.five
call BattleAnim_IncAnonJumptableIndex
ret
.six
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], $1
ret
BattleAnimFunc_Bite:
; Claps two objects together (vertically), twice
; Second object's frameset and position relative to first are both defined via this function
; Obj Param: Distance from center (masked with $7F). Bit 7 flips object vertically by switching to a different frameset
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
dw .five
dw .six
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
bit 7, [hl]
jr nz, .flipped
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $10
jr .got_sine_start
.flipped
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $30
.got_sine_start
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $7f
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld d, [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
bit 7, a
jr nz, .flipped2
ld a, BATTLE_ANIM_FRAMESET_BITE_2
jr .got_frameset
.flipped2
ld a, BATTLE_ANIM_FRAMESET_BITE_1
.got_frameset
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
inc [hl]
ld a, [hl]
and $1f
ret nz
.two
.three
.four
.five
call BattleAnim_IncAnonJumptableIndex
ret
.six
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], $1
ret
BattleAnimFunc_SolarBeam:
; Solar Beam charge up animation
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $28
inc hl
ld [hl], $0
.one
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld d, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .zero_radius
ld d, a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld e, [hl]
ld hl, -$80
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], d
ret
.zero_radius
call DeinitBattleAnimation
ret
BattleAnimFunc_Gust:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
dw .four
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld [hl], 0
.one
.three
call .GustWobble
ret
.two
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $88
jr c, .move
call BattleAnim_IncAnonJumptableIndex
ret
.four
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $b8
jr c, .move
call DeinitBattleAnimation
ret
.move
call .GustWobble
; Move horizontally every frame
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
inc [hl]
ld a, [hl]
; Move in the vertically every other frame
and $1
ret nz
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ret
.GustWobble:
; Circular movement where width is retrieved from a list, and height is 1/16 of that
call .GetGustRadius
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
push af
push de
call BattleAnim_Sine
sra a
sra a
sra a
sra a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
sub $8
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and a
jr z, .start_wobble
cp $c2
jr c, .finish_wobble
.start_wobble
dec a
ld [hl], a
and $7
ret nz
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
inc [hl]
ret
.finish_wobble
xor a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hli], a
ld [hl], a
ret
.GetGustRadius:
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .GustOffsets
add hl, de
ld d, [hl]
ret
.GustOffsets:
db 8, 6, 5, 4, 5, 6, 8, 12, 16
BattleAnimFunc_Absorb:
; Moves object from target to user and disappears when reaches x coord $30. Example: Absorb, Mega Drain, Leech Seed status
; Obj Param: Speed in the X axis
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $30
jr nc, .move
call DeinitBattleAnimation
ret
.move
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
ld e, a
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
sub e
ld [hl], a
srl e
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
.loop
inc [hl]
dec e
jr nz, .loop
ret
BattleAnimFunc_Wrap:
; Plays out object frameset. Use anim_incobj to move to next frameset
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.one
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld a, [hl]
inc a ; BATTLE_ANIM_FRAMESET_BIND_2
; BATTLE_ANIM_FRAMESET_BIND_4
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1 ; Unused?
add hl, bc
ld [hl], $8
.zero
.two
ret
BattleAnimFunc_LeechSeed:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], $40
ret
.one
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $20
jr c, .sprout
call BattleAnim_StepThrownToTarget
ret
.sprout
ld [hl], $40
ld a, BATTLE_ANIM_FRAMESET_LEECH_SEED_2
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
.two
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and a
jr z, .flutter
dec [hl]
ret
.flutter
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_LEECH_SEED_3
call ReinitBattleAnimFrameset
.three
ret
BattleAnim_StepThrownToTarget:
; Inches object towards the opponent's side in a parabola arc defined by the lower and upper nybble of Obj Param
dec [hl]
ld d, $20
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_FIX_Y
add hl, bc
ld a, [hl]
add $2
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld e, [hl]
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld d, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld h, [hl]
ld a, h
and $f
swap a
ld l, a
ld a, h
and $f0
swap a
ld h, a
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and $1
ret nz
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ret
BattleAnimFunc_Spikes:
; Object is thrown at target. After $20 frames it stops and waits another $20 frames then disappear
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], $40
ret
.one
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $20
jr c, .wait
call BattleAnim_StepThrownToTarget
ret
.wait
call BattleAnim_IncAnonJumptableIndex
.two
ret
BattleAnimFunc_RazorWind:
call BattleAnimFunc_MoveInCircle
; Causes object to skip ahead the circular motion every frame
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
add $f
ld [hl], a
ret
BattleAnimFunc_Kick:
; Uses anim_setobj for different kick types
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two ; Jump Kick, Hi Jump Kick
dw .three ; Rolling Kick
dw .four ; Rolling Kick (continued)
.zero
ret
.one ; Unused?
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
cp $30
jr c, .move_down
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], $0
ret
.move_down
add $4
ld [hl], a
ret
.two
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $98
ret nc
inc [hl]
inc [hl]
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
set 0, [hl]
ld hl, BATTLEANIMSTRUCT_FIX_Y
add hl, bc
ld [hl], $90
ld hl, BATTLEANIMSTRUCT_FRAME
add hl, bc
ld [hl], $0
ld hl, BATTLEANIMSTRUCT_DURATION
add hl, bc
ld [hl], $2
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ret
.three
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $2c
ld hl, BATTLEANIMSTRUCT_FRAME
add hl, bc
ld [hl], $0
ld hl, BATTLEANIMSTRUCT_DURATION
add hl, bc
ld [hl], $80
.four
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $98
ret nc
inc [hl]
inc [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
ld d, $8
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
BattleAnimFunc_Egg:
; Used by Egg Bomb and Softboiled
; Obj Param: Defines jumptable starting index
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one ; Egg Bomb start
dw .two
dw .three
dw .four ; ret
dw .five
dw .six ; Softboiled obj 1 start
dw .seven
dw .eight
dw .nine
dw .ten ; ret
dw .eleven ; Softboiled obj 2 start
dw .twelve
dw .thirteen ; ret
.zero
; Object starts here then jumps to the jumptable index defined by the Obj Param
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $28
inc hl ; BATTLEANIMSTRUCT_VAR2
ld [hl], $10
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], a
ret
.one
; Initial Egg Bomb arc movement to x coord $40
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $40
jr nc, .egg_bomb_vertical_wave
inc [hl]
.egg_bomb_vertical_wave
call .EggVerticalWaveMotion
ret
.six
; Initial Softboiled arc movement to x coord $4b
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $4b
jr nc, .softboiled_vertical_wave
inc [hl]
.softboiled_vertical_wave
call .EggVerticalWaveMotion
ret
.two
; Compares the egg's x coord to determine whether to move, wait or end animation
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $88
jr nc, .egg_bomb_done
and $f
jr nz, .egg_bomb_step
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], $10
call BattleAnim_IncAnonJumptableIndex ; jumps to three
ret
.egg_bomb_done
; Increases jumptable index twice to four
call BattleAnim_IncAnonJumptableIndex
inc [hl]
ret
.three
; Waits in place
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and a
jr z, .done_waiting
dec [hl]
ret
.done_waiting
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
dec [hl]
.egg_bomb_step
; Moves towards the target
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
inc [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld d, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld e, [hl]
ld hl, -$80
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
ret
.five
; Clears Egg Bomb object via anim_incobj
call DeinitBattleAnimation
ret
.seven
; Switches Softboiled frameset to egg wobbling
ld a, BATTLE_ANIM_FRAMESET_EGG_WOBBLE ; Egg wobbling
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ret
.eight
; Softboiled object waves slightly side to side
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
ld d, $2
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
.nine
; First Softboiled BATTLE_ANIM_OBJ_EGG turns into the bottom half frameset
ld a, BATTLE_ANIM_FRAMESET_EGG_CRACKED_BOTTOM ; Cracked egg bottom
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], $4
call BattleAnim_IncAnonJumptableIndex
ret
.eleven
; Second Softboiled BATTLE_ANIM_OBJ_EGG
ld a, BATTLE_ANIM_FRAMESET_EGG_CRACKED_TOP ; Cracked egg top
call ReinitBattleAnimFrameset
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $40
ret
.twelve
; Top half of egg moves upward for $30 frames
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $20
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $30
jr c, .done_top_shell
dec [hl]
ret
.done_top_shell
call BattleAnim_IncAnonJumptableIndex
.four
.ten
.thirteen
ret
.EggVerticalWaveMotion:
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
ld d, [hl] ; BATTLEANIMSTRUCT_VAR2
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $3f ; cp 64
ret nz
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $20
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
sub $8
ld [hl], a
ret nz
xor a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hli], a
ld [hl], a
call BattleAnim_IncAnonJumptableIndex
ret
BattleAnimFunc_MoveUp:
; Moves object up for 41 frames
; Obj Param: Movement speed
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
and a
jr z, .move
cp $d8
jr nc, .move
call DeinitBattleAnimation
ret
.move
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld d, [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
sub d
ld [hl], a
ret
BattleAnimFunc_Sound:
; Moves object back and forth in one of three angles using a sine behavior and disappear after 8 frames. Used in Growl, Snore and Kinesis
; Obj Param: Used to define object angle. How much to increase from base frameset, which is hardcoded as BATTLE_ANIM_FRAMESET_SOUND_1
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
ldh a, [hBattleTurn]
and a
jr z, .got_turn
; enemy
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
xor $ff
add $3
ld [hl], a
.got_turn
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $8 ; duration
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, BATTLE_ANIM_FRAMESET_SOUND_1
add [hl] ; BATTLE_ANIM_FRAMESET_SOUND_2 BATTLE_ANIM_FRAMESET_SOUND_3
call ReinitBattleAnimFrameset
ret
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .done_anim
dec [hl]
call .SoundWaveMotion
ret
.done_anim
call DeinitBattleAnimation
ret
.SoundWaveMotion:
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
ld d, $10
call BattleAnim_Sine
ld d, a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and a
jr z, .negative
dec a
ret z
; Obj Param 2
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], d
ret
.negative
; Obj Param 0
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, d
xor $ff
inc a
ld [hl], a
ret
BattleAnimFunc_ConfuseRay:
; Creates the Confuse Ray object and moves it across the screen until x coord $80
; Moves horizontally every frame and vertically every 3 frames
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $3f
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $80
rlca
ld [hl], a
add BATTLE_ANIM_FRAMESET_CONFUSE_RAY_1 ; BATTLE_ANIM_FRAMESET_CONFUSE_RAY_2
call ReinitBattleAnimFrameset
ret
.one
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
swap a
ld d, a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
inc [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $80
ret nc
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and $3
jr nz, .skip_vertical_movement
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
.skip_vertical_movement
and $1
ret nz
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
inc [hl]
ret
BattleAnimFunc_Dizzy:
; Moves object in a circle where the height is 1/4 the width, with the next frameset from base whether moving left or right. Also used for Nightmare
; Obj Param: Defines starting position in the circle (masked with $80). Bit 7 flips it at the start
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $80
rlca
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
add [hl] ; BATTLE_ANIM_FRAMESET_61 BATTLE_ANIM_FRAMESET_62
; BATTLE_ANIM_FRAMESET_9C BATTLE_ANIM_FRAMESET_9D
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $7f
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $10
push af
push de
call BattleAnim_Sine
sra a
sra a
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
and $3f
jr z, .not_flipped
and $1f
ret nz
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc a ; BATTLE_ANIM_FRAMESET_62
; BATTLE_ANIM_FRAMESET_9D
jr .got_frameset
.not_flipped
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl] ; BATTLE_ANIM_FRAMESET_61
; BATTLE_ANIM_FRAMESET_9C
.got_frameset
call ReinitBattleAnimFrameset
ret
BattleAnimFunc_Amnesia:
; Creates 3 objects based on Obj Param
; Obj Param: How much to increase from base frameset, which is hardcoded as BATTLE_ANIM_FRAMESET_AMNESIA_1
; anim_incobj is used to DeInit object (used by Present)
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
add BATTLE_ANIM_FRAMESET_AMNESIA_1 ; BATTLE_ANIM_FRAMESET_AMNESIA_2 BATTLE_ANIM_FRAMESET_AMNESIA_3
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld e, [hl]
ld d, 0
ld hl, .AmnesiaOffsets
add hl, de
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
.one
ret
.two
; anim_incobj forces obj to deinit
call DeinitBattleAnimation
ret
.AmnesiaOffsets: ; Hardcoded Y Offsets for each Obj Param
db $ec, $f8, $00
BattleAnimFunc_FloatUp:
; Object moves horizontally in a sine wave, while also moving up. Also used by Charm and the Nightmare status
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
ld d, $4
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld d, [hl]
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld e, [hl]
lb hl, -1, $a0
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], e
ret
BattleAnimFunc_Dig:
; Object moves up then down with a wave motion, while also moving away from the user 1 pixel per frame
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
dec [hl]
ld d, $10
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
inc [hl]
ret
BattleAnimFunc_String:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and a
jr nz, .not_param_zero
; Obj Param 0 flips when used by enemy
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
set OAM_Y_FLIP, [hl]
.not_param_zero
add BATTLE_ANIM_FRAMESET_STRING_SHOT_1 ; BATTLE_ANIM_FRAMESET_STRING_SHOT_2 BATTLE_ANIM_FRAMESET_STRING_SHOT_3
call ReinitBattleAnimFrameset
.one
ret
BattleAnimFunc_Paralyzed:
; Also used by Disable
; Obj Param: When bit 7 is set, frameset is replaced with flipped version. This bit is discarded and object then moves back and forth between position in lower nybble and upper nybble of Param every other frame
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $0
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld e, [hl]
ld a, e
and $70
swap a
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, e
and $80
jr nz, .right
ld a, e
and $f
ld [hl], a
ret
.right
ld a, e
and $f
xor $ff
inc a
ld [hl], a
ld a, BATTLE_ANIM_FRAMESET_PARALYZED_FLIPPED
call ReinitBattleAnimFrameset
ret
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .var1_zero
dec [hl]
ret
.var1_zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
xor $ff
inc a
ld [hl], a
ret
BattleAnimFunc_SpiralDescent:
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $18
push af
push de
call BattleAnim_Sine
sra a
sra a
sra a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $7
ret nz
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $28
jr nc, .delete
inc [hl]
ret
.delete
call DeinitBattleAnimation
ret
BattleAnimFunc_PetalDance:
; Object moves downwards in a spiral around the user. Object disappears at y coord $28
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $18
push af
push de
call BattleAnim_Sine
sra a
sra a
sra a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $3
ret nz
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $28
jr nc, .end
inc [hl]
ret
.end
call DeinitBattleAnimation
ret
BattleAnimFunc_PoisonGas:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw BattleAnimFunc_SpiralDescent
.zero:
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $84
jr nc, .next
inc [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
ld d, $18
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
and $1
ret nz
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
dec [hl]
ret
.next
call BattleAnim_IncAnonJumptableIndex
ret
BattleAnimFunc_SmokeFlameWheel:
; Object spins around target while also moving upward until it disappears at x coord $e8
; Obj Param: Defines where the object starts in the circle
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $18
push af
push de
call BattleAnim_Sine
sra a
sra a
sra a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
inc [hl]
inc [hl]
ld a, [hl]
and $7
ret nz
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $e8
jr z, .done
dec [hl]
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_SacredFire:
; Moves object in a circle where the height is 1/8 the width, while also moving upward 2 pixels per frame for 24 frames after which it disappears
; Obj Param: Is used internally only
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $18
push af
push de
call BattleAnim_Sine
sra a
sra a
sra a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
inc [hl]
inc [hl]
ld a, [hl]
and $3
ret nz
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $d0
jr z, .done
dec [hl]
dec [hl]
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_PresentSmokescreen:
; Object bounces from user to target and stops at x coord $6c. Uses anim_incobj to clear object
; Obj Param: Defined but not used
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $34
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], $10
.one
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $6c
jr c, .do_move
ret
.do_move
ld a, $2
call BattleAnim_StepToTarget
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld d, [hl]
call BattleAnim_Sine
bit 7, a
jr nz, .negative
xor $ff
inc a
.negative
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
sub $4
ld [hl], a
and $1f
cp $20
ret nz
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
srl [hl]
ret
.two
call DeinitBattleAnimation
ret
BattleAnimFunc_Horn:
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ret
.one
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $58
ret nc
ld a, $2
call BattleAnim_StepToTarget
ret
.two
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
cp $20
jr c, .three
call DeinitBattleAnimation
ret
.three
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
ld d, $8
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
sra a
xor $ff
inc a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
add $8
ld [hl], a
ret
BattleAnimFunc_Needle:
; Moves object towards target, either in a straight line or arc. Stops at x coord $84
; Obj Param: Upper nybble defines the index of the jumptable. Lower nybble defines the speed.
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f0
swap a
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], a
ret
.two
; Pin Missile needle (arc)
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld d, $10
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
bit 7, a
jr z, .negative
ld [hl], a
.negative
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
sub $4
ld [hl], a
.one
; Normal needle (line)
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $84
jr c, .move_to_target
call DeinitBattleAnimation
ret
.move_to_target
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
call BattleAnim_StepToTarget
ret
BattleAnimFunc_ThiefPayday:
; Object drops off target and bounces once on the floor
; Obj Param: Defines every how many frames the object moves horizontally
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $28
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
sub $28
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hli]
ld d, [hl]
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
and [hl]
jr nz, .var_doesnt_equal_param
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
dec [hl]
.var_doesnt_equal_param
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
inc [hl]
ld a, [hl]
and $3f
ret nz
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $20
inc hl
srl [hl]
ret
BattleAnimFunc_AbsorbCircle:
; A circle of objects that starts at the target and moves to the user. It expands until x coord $5a and then shrinks. Once radius reaches 0, the object disappears. Also used by Mimic and Conversion2
; Obj Param: Defines the position in the circle the object starts at
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld d, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
inc [hl]
ld a, [hl]
and $1
jr nz, .dont_move_x
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
dec [hl]
.dont_move_x
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $3
jr nz, .dont_move_y
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
inc [hl]
.dont_move_y
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
cp $5a
jr nc, .increase_radius
ld a, [hl]
and a
jr z, .end
dec [hl] ; decreases radius
ret
.increase_radius
inc [hl]
ret
.end
call DeinitBattleAnimation
ret
BattleAnimFunc_Conversion:
; A rotating circle of objects centered at a position. It expands for $40 frames and then shrinks. Once radius reaches 0, the object disappears.
; Obj Param: Defines starting point in the circle
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld d, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
inc [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
cp $40
jr nc, .shrink
inc [hl]
ret
.shrink
ld a, [hl]
dec [hl]
and a
ret nz
call DeinitBattleAnimation
ret
BattleAnimFunc_Bonemerang:
; Boomerang-like movement from user to target
; Obj Param: Defines position to start at in the circle
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero:
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld [hl], a
.one:
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $30
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
add $8
ld d, $30
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
inc [hl]
ret
BattleAnimFunc_Shiny:
; Puts object in a circle formation of radius $10. Also used by Flash and Light Screen
; Obj Param: Defines where the object starts in the circle
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero:
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $10
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $10
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR2 ; unused?
add hl, bc
ld [hl], $f
.one:
ret
BattleAnimFunc_SkyAttack:
; Uses anim_incobj to move to next step
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
call BattleAnim_IncAnonJumptableIndex
ldh a, [hBattleTurn]
and a
jr nz, .enemy_turn
ld a, $f0
jr .got_var1
.enemy_turn
ld a, $cc
.got_var1
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], a
ret
.one
call .SkyAttack_CyclePalette
ret
.two
; Moves towards target and stops at x coord $84
call .SkyAttack_CyclePalette
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $84
ret nc
ld a, $4
call BattleAnim_StepToTarget
ret
.three
; Moves towards target and disappears at x coord $d0
call .SkyAttack_CyclePalette
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $d0
jr nc, .done
ld a, $4
call BattleAnim_StepToTarget
ret
.done
call DeinitBattleAnimation
ret
.SkyAttack_CyclePalette:
; Cycles wOBP0 pallete
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and $7
inc [hl]
srl a
ld e, a
ld d, 0
ld hl, .GBCPals
add hl, de
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
and [hl]
ld [wOBP0], a
ret
.GBCPals:
db $ff, $aa, $55, $aa
BattleAnimFunc_GrowthSwordsDance:
; Moves object in a circle where the height is 1/8 the width, while also moving upward 2 pixels per frame
; Obj Param: Defines where the object starts in the circle
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $18
call BattleAnim_Sine
sra a
sra a
sra a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
add [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
ld d, $18
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
dec [hl]
dec [hl]
ret
BattleAnimFunc_StrengthSeismicToss:
; Moves object up for $e0 frames, then shakes it vertically and throws it at the target. Uses anim_incobj to move to final phase
; Obj Param: Defined but not used
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $e0
jr nz, .move_up
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $2
ret
.move_up
ld d, a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld e, [hl]
ld hl, -$80
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
ret
.one
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
and a
jr z, .switch_position
dec [hl]
ret
.switch_position
ld [hl], $4
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
xor $ff
inc a
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
add [hl]
ld [hl], a
ret
.two
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $84
jr nc, .done
ld a, $4
call BattleAnim_StepToTarget
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_SpeedLine:
; Used in moves where the user disappears for a speed-based attack such as Quick Attack, Mach Punch and Extremespeed
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $7f
add BATTLE_ANIM_FRAMESET_SPEED_LINE_1 ; BATTLE_ANIM_FRAMESET_SPEED_LINE_2 BATTLE_ANIM_FRAMESET_SPEED_LINE_3
call ReinitBattleAnimFrameset
.one
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
bit 7, [hl]
jr nz, .inverted
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
inc [hl]
ret
.inverted
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
dec [hl]
ret
BattleAnimFunc_Sludge:
; Object moves upward for $c frames and switches to BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $c
ret
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .done
dec [hl]
ret
.done
call BattleAnim_IncAnonJumptableIndex
ld a, BATTLE_ANIM_FRAMESET_SLUDGE_BUBBLE_BURST
call ReinitBattleAnimFrameset
.two
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
dec [hl]
ret
BattleAnimFunc_MetronomeHand:
; Fast circular motion with an x radius of $8 and y radius of $2
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
push af
ld d, $2
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop af
ld d, $8
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
BattleAnimFunc_MetronomeSparkleSketch:
; Sideways wave motion while also moving downward until it disappears at y coord $20
; Obj Param: Only used internally
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $20
jr c, .do_move
call DeinitBattleAnimation
ret
.do_move
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $8
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
add $2
ld [hl], a
and $7
ret nz
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
inc [hl]
ret
BattleAnimFunc_Agility:
; Object moves sideways at a speed determined by Obj Param. Can use anim_incobj to make it disappear
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
add [hl]
ld [hl], a
ret
.one
call DeinitBattleAnimation
ret
BattleAnimFunc_SafeguardProtect:
; Moves object in a circle where the width is 1/2 the height
; Obj Param: Defines starting point in circle
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld d, $18
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
sra a
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
ret
BattleAnimFunc_LockOnMindReader:
; Moves objects towards a center position
; Obj Param: Used to define object angle from 0 to 3. Lower nybble defines how much to increase from base frameset while upper nybble defines angle of movement. The object moves for $28 frames, then waits for $10 frames and disappears
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $28
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f
ld hl, BATTLEANIMSTRUCT_FRAMESET_ID
add hl, bc
add [hl] ; BATTLE_ANIM_FRAMESET_8F BATTLE_ANIM_FRAMESET_90 BATTLE_ANIM_FRAMESET_91
; BATTLE_ANIM_FRAMESET_93 BATTLE_ANIM_FRAMESET_94 BATTLE_ANIM_FRAMESET_95
call ReinitBattleAnimFrameset
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and $f0
or $8
ld [hl], a
.one
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and a
jr z, .done
dec [hl]
add $8
ld d, a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
.done
ld [hl], $10
call BattleAnim_IncAnonJumptableIndex
.two
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
dec [hl]
and a
ret nz
call DeinitBattleAnimation
ret
BattleAnimFunc_HealBellNotes:
; Object moves horizontally in a sine wave, while also moving left every other frame and downwards for $38 frames after which it disappears
; Obj Param: Defines a frameset offset from FRAMESET_24
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.zero
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, BATTLE_ANIM_FRAMESET_MUSIC_NOTE_1
add [hl] ; BATTLE_ANIM_FRAMESET_MUSIC_NOTE_2 BATTLE_ANIM_FRAMESET_MUSIC_NOTE_3
call ReinitBattleAnimFrameset
.one
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $38
jr nc, .done
inc [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
ld d, $18
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
ld a, [hl]
and $1
ret nz
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
dec [hl]
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_BatonPass:
; Object falls vertically and bounces on the ground
; Obj Param: Defines speed and duration
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and a
ret z
ld d, a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
inc [hl]
call BattleAnim_Sine
bit 7, a
jr nz, .negative
xor $ff
inc a
.negative
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
and $1f
ret nz
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
srl [hl]
ret
BattleAnimFunc_EncoreBellyDrum:
; Object moves at an arc for 8 frames and disappears
; Obj Param: Defines starting position in the arc
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $10
jr nc, .done
inc [hl]
inc [hl]
ld d, a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_SwaggerMorningSun:
; Moves object at an angle
; Obj Param: Lower 6 bits define angle of movement and upper 2 bits define speed
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld e, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld d, [hl]
ld a, e
and $c0
rlca
rlca
add [hl]
ld [hl], a
ld a, e
and $3f
push af
push de
call BattleAnim_Sine
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
BattleAnimFunc_HiddenPower:
; Moves object in a ring around position. Uses anim_incobj to move to second phase, where it expands the radius 8 pixels at a time for 13 frames and then disappears
; Obj Param: Defines starting position in circle
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
.zero
ld d, $18
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
jr .step_circle
.one
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], $18
.two
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $80
jr nc, .done
ld d, a
add $8
ld [hl], a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
jr .step_circle
.done
call DeinitBattleAnimation
ret
.step_circle
call BattleAnim_StepCircle
ret
BattleAnimFunc_Curse:
; Object moves down and to the left 2 pixels at a time until it reaches x coord $30 and disappears
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
.one
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hl]
cp $30
jr c, .done
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
dec [hl]
dec [hl]
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
inc [hl]
inc [hl]
ret
.done
call DeinitBattleAnimation
.zero:
ret
BattleAnimFunc_PerishSong:
; Moves object in a large circle with a x radius of $50 and a y radius 1/4 or that, while also moving downwards
; Obj Param: Defines starting position in the circle
ld d, $50
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
inc [hl]
push af
push de
call BattleAnim_Sine
sra a
sra a
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
add [hl]
inc [hl]
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
BattleAnimFunc_RapidSpin:
; Object moves upwards 4 pixels per frame until it disappears at y coord $d0
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $d0
jr z, .done
dec [hl]
dec [hl]
dec [hl]
dec [hl]
ret
.done
call DeinitBattleAnimation
ret
BattleAnimFunc_BetaPursuit:
; Working but unused animation
; Object moves either down or up 4 pixels per frame, depending on Obj Param. Object disappears after 23 frames when going down, or at y coord $d8 when going up
; Obj Param: 0 moves downwards, 1 moves upwards
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
and a
jr nz, .move_up
call BattleAnim_IncAnonJumptableIndex
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], $ec
.one
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $4
jr z, .three
inc [hl]
inc [hl]
inc [hl]
inc [hl]
ret
.three
call DeinitBattleAnimation
ret
.move_up
call BattleAnim_IncAnonJumptableIndex
call BattleAnim_IncAnonJumptableIndex
.two
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
cp $d8
ret z
dec [hl]
dec [hl]
dec [hl]
dec [hl]
ret
BattleAnimFunc_RainSandstorm:
; Object moves down 4 pixels at a time and right a variable distance
; Obj Param: Defines variation in the movement
; $0: 2 pixels horizontal movement
; $1: 8 pixels horizontal movement
; $2: 4 pixels horizontal movement
call BattleAnim_AnonJumptable
.anon_dw
dw .zero
dw .one
dw .two
dw .three
.zero
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld [hl], a
call BattleAnim_IncAnonJumptableIndex
ret
.one ; Obj Param 0
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
add $4
cp $70
jr c, .dont_reset_y_offset_one
xor a
.dont_reset_y_offset_one
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
inc [hl]
inc [hl]
ret
.two ; Obj Param 1
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
add $4
cp $70
jr c, .dont_reset_y_offset_two
xor a
.dont_reset_y_offset_two
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
add $8
ld [hl], a
ret
.three ; Obj Param 2
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
add $4
cp $70
jr c, .dont_reset_y_offset_three
xor a
.dont_reset_y_offset_three
ld [hl], a
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
add $4
ld [hl], a
ret
BattleAnimFunc_AnimObjB0: ; unused
; Used by object BATTLE_ANIM_OBJ_B0, with itself is not used in any animation
; Obj Param: Lower nybble is added to VAR1 while upper nybble is added to XCOORD
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld d, [hl]
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld e, [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
ld l, a
and $f0
ld h, a
swap a
or h
ld h, a
ld a, l
and $f
swap a
ld l, a
add hl, de
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld [hl], d
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld [hl], e
ret
BattleAnimFunc_PsychUp:
; Object moves in a circle
; Obj Param: Defines starting position in the circle
ld d, $18
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld a, [hl]
inc [hl]
call BattleAnim_StepCircle
ret
BattleAnimFunc_Cotton:
; Object moves in a circle slowly
; Obj Param: Defines starting position in the circle
ld d, $18
ld hl, BATTLEANIMSTRUCT_VAR2
add hl, bc
ld a, [hl]
inc [hl]
srl a
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
add [hl]
call BattleAnim_StepCircle
ret
BattleAnimFunc_AncientPower:
; Object moves up and down in an arc for $20 frames and then disappears
; Obj Param: Defines range of arc motion
ld hl, BATTLEANIMSTRUCT_VAR1
add hl, bc
ld a, [hl]
cp $20
jr nc, .done
inc [hl]
ld hl, BATTLEANIMSTRUCT_PARAM
add hl, bc
ld d, [hl]
call BattleAnim_Sine
xor $ff
inc a
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
ret
.done
call DeinitBattleAnimation
ret
BattleAnim_StepCircle:
; Inches object in a circular movement where its height is 1/4 the width
push af
push de
call BattleAnim_Sine
sra a
sra a
ld hl, BATTLEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], a
pop de
pop af
call BattleAnim_Cosine
ld hl, BATTLEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
BattleAnim_StepToTarget:
; Inches object towards the opponent's side, moving half as much in the Y axis as it did in the X axis. Uses lower nybble of A
and $f
ld e, a
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
add [hl]
ld [hl], a
srl e
ld hl, BATTLEANIMSTRUCT_YCOORD
add hl, bc
.loop
dec [hl]
dec e
jr nz, .loop
ret
BattleAnim_AnonJumptable:
pop de
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
ld l, [hl]
ld h, $0
add hl, hl
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
BattleAnim_IncAnonJumptableIndex:
ld hl, BATTLEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc
inc [hl]
ret
BattleAnim_Cosine:
; a = d * cos(a * pi/32)
add %010000 ; cos(x) = sin(x + pi/2)
; fallthrough
BattleAnim_Sine:
; a = d * sin(a * pi/32)
calc_sine_wave BattleAnimSineWave
BattleAnim_Sine_e:
ld a, e
call BattleAnim_Sine
ld e, a
ret
BattleAnim_Cosine_e:
ld a, e
call BattleAnim_Cosine
ld e, a
ret
BattleAnim_AbsSinePrecise: ; unreferenced
ld a, e
call BattleAnim_Sine
ld e, l
ld d, h
ret
BattleAnim_AbsCosinePrecise: ; unreferenced
ld a, e
call BattleAnim_Cosine
ld e, l
ld d, h
ret
BattleAnimSineWave:
sine_table 32