INCLUDE "constants.asm" SECTION "engine/battle_anims/bg_effects.asm", ROMX const_def const BGSQUARE_SIX const BGSQUARE_FOUR const BGSQUARE_TWO const BGSQUARE_SEVEN const BGSQUARE_FIVE const BGSQUARE_THREE ; BG effects for use in battle animations. ExecuteBGEffects: ld hl, wActiveBGEffects ld e, 5 .loop ld a, [hl] and a jr z, .next ld c, l ld b, h push hl push de call DoBattleBGEffectFunction pop de pop hl .next ld bc, 4 add hl, bc dec e jr nz, .loop ret QueueBGEffect: ld hl, wActiveBGEffects ld e, 5 .loop ld a, [hl] and a jr z, .load ld bc, 4 add hl, bc dec e jr nz, .loop scf ret .load ld c, l ld b, h ld hl, BG_EFFECT_STRUCT_FUNCTION add hl, bc ld a, [wBattleAnimTemp0] ld [hli], a ld a, [wBattleAnimTemp1] ld [hli], a ld a, [wBattleAnimTemp2] ld [hli], a ld a, [wBattleAnimTemp3] ld [hl], a ret EndBattleBGEffect: ld hl, BG_EFFECT_STRUCT_FUNCTION add hl, bc ld [hl], 0 ret DoBattleBGEffectFunction: ld hl, BG_EFFECT_STRUCT_FUNCTION add hl, bc ld e, [hl] ld d, 0 ld hl, BattleBGEffects add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a jp hl BattleBGEffects: ; entries correspond to ANIM_BG_* constants dw BattleBGEffect_End dw BattleBGEffect_FlashInverted dw BattleBGEffect_FlashWhite dw BattleBGEffect_WhiteHues dw BattleBGEffect_BlackHues dw BattleBGEffect_AlternateHues dw BattleBGEffect_06 dw BattleBGEffect_07 dw BattleBGEffect_08 dw BattleBGEffect_HideMon dw BattleBGEffect_ShowMon dw BattleBGEffect_EnterMon dw BattleBGEffect_ReturnMon dw BattleBGEffect_Surf ;dw BattleBGEffect_Whirlpool dw BattleBGEffect_Teleport dw BattleBGEffect_NightShade dw BattleBGEffect_FeetFollow dw BattleBGEffect_HeadFollow dw BattleBGEffect_DoubleTeam dw BattleBGEffect_AcidArmor dw BattleBGEffect_RapidFlash dw BattleBGEffect_16 dw BattleBGEffect_17 dw BattleBGEffect_18 dw BattleBGEffect_19 dw BattleBGEffect_1a dw BattleBGEffect_1b dw BattleBGEffect_1c dw BattleBGEffect_1d dw BattleBGEffect_1e dw BattleBGEffect_1f dw BattleBGEffect_20 dw BattleBGEffect_Withdraw dw BattleBGEffect_BounceDown dw BattleBGEffect_Dig dw BattleBGEffect_Tackle ;dw BattleBGEffect_25 dw BattleBGEffect_26 dw BattleBGEffect_27 dw BattleBGEffect_28 dw BattleBGEffect_Psychic dw BattleBGEffect_2a dw BattleBGEffect_2b dw BattleBGEffect_2c dw BattleBGEffect_2d dw BattleBGEffect_2e dw BattleBGEffect_2f ;dw BattleBGEffect_30 ;dw BattleBGEffect_31 ;dw BattleBGEffect_32 ;dw BattleBGEffect_VibrateMon ;dw BattleBGEffect_WobbleMon BattleBGEffect_End: call EndBattleBGEffect ret BattleBGEffects_AnonJumptable: ld hl, sp+$0 ld e, [hl] inc hl ld d, [hl] inc de BatttleBGEffects_GetNamedJumptablePointer: ld hl, BG_EFFECT_STRUCT_JT_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 ret BattleBGEffects_IncrementJumptable: ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc inc [hl] ret BattleBGEffect_FlashInverted: ld de, .inverted call BattleBGEffect_FlashContinue ret .inverted db %11100100 db %00011011 BattleBGEffect_FlashWhite: ld de, .white call BattleBGEffect_FlashContinue ret .white db %11100100 db %00000000 BattleBGEffect_FlashContinue: ; current timer, flash duration, number of flashes ld a, $1 ld [wBattleAnimTemp0], a ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld a, [hl] and a jr z, .init dec [hl] ret .init ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld [hl], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and a jr nz, .apply_pal call EndBattleBGEffect ret .apply_pal dec a ld [hl], a and 1 ld l, a ld h, 0 add hl, de ld a, [hl] ld [wBGP], a ret BattleBGEffect_WhiteHues: ld de, .Pals call BattleBGEffect_GetNthDMGPal jr c, .quit ld [wBGP], a ret .quit call EndBattleBGEffect ret .Pals: db %11100100 db %11100000 db %11010000 db -1 BattleBGEffect_BlackHues: ld de, .Pals call BattleBGEffect_GetNthDMGPal jr c, .quit ld [wBGP], a ret .quit call EndBattleBGEffect ret .Pals: db %11100100 db %11110100 db %11111000 db -1 BattleBGEffect_AlternateHues: ld de, .Pals call BattleBGEffect_GetNthDMGPal jr c, .quit ld [wBGP], a ld [wOBP1], a ret .quit call EndBattleBGEffect ret .Pals: db %11100100 db %11111000 db %11111100 db %11111000 db %11100100 db %10010000 db %01000000 db %10010000 db -2 BattleBGEffect_06: call BattleBGEffects_CheckSGB jr nz, .sgb ld de, .PalsCGB jr .okay .sgb ld de, .PalsSGB .okay call BattleBGEffect_GetNthDMGPal ld [wOBP0], a ret .PalsCGB: db %11100100 db %10010000 db -2 .PalsSGB: db %11110000 db %11000000 db -2 BattleBGEffect_07: call BattleBGEffects_CheckSGB jr nz, .sgb ld de, .PalsCGB jr .okay .sgb ld de, .PalsSGB .okay call BattleBGEffect_GetNthDMGPal ld [wOBP0], a ret .PalsCGB: db %11100100 db %11011000 db -2 .PalsSGB: db %11110000 db %11001100 db -2 BattleBGEffect_08: ld de, .Pals call BattleBGEffect_GetNthDMGPal ld [wBGP], a ret .Pals: db %00011011 db %01100011 db %10000111 db -2 BattleBGEffect_HideMon: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw .four .zero call BattleBGEffects_IncrementJumptable push bc call BGEffect_CheckBattleTurn jr nz, .player_side hlcoord 12, 0 lb bc, 7, 7 jr .got_pointer .player_side hlcoord 2, 6 lb bc, 6, 6 .got_pointer call ClearBox pop bc ld a, $1 ldh [hBGMapMode], a ret .four xor a ldh [hBGMapMode], a call EndBattleBGEffect ret BattleBGEffect_ShowMon: call BGEffect_CheckFlyDigStatus jr z, .not_flying call EndBattleBGEffect ret .not_flying call BGEffect_CheckBattleTurn jr nz, .player_side ld de, .EnemyData jr .got_pointer .player_side ld de, .PlayerData .got_pointer ld a, e ld [wBattleAnimTemp1], a ld a, d ld [wBattleAnimTemp2], a call BattleBGEffect_RunPicResizeScript ret .PlayerData: db 0, $31, 0 db -1 .EnemyData: db 3, $00, 3 db -1 BattleBGEffect_FeetFollow: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw .five .zero call BGEffect_CheckFlyDigStatus jr z, .not_flying_digging call EndBattleBGEffect ret .not_flying_digging call BattleBGEffects_IncrementJumptable push bc call BGEffect_CheckBattleTurn jr nz, .player_turn ld a, ANIM_OBJ_PLAYERFEETFOLLOW ld [wBattleAnimTemp0], a ld a, 16 * 8 + 4 jr .okay .player_turn ld a, ANIM_OBJ_ENEMYFEETFOLLOW ld [wBattleAnimTemp0], a ld a, 6 * 8 .okay ld [wBattleAnimTemp1], a ld a, 8 * 8 ld [wBattleAnimTemp2], a xor a ld [wBattleAnimTemp3], a call _QueueBattleAnimation pop bc ret .one call BattleBGEffects_IncrementJumptable push bc call BGEffect_CheckBattleTurn jr nz, .player_turn_2 hlcoord 12, 6 lb bc, 1, 7 jr .okay2 .player_turn_2 hlcoord 2, 6 lb bc, 1, 6 .okay2 call ClearBox ld a, $1 ldh [hBGMapMode], a pop bc ret .five xor a ldh [hBGMapMode], a call EndBattleBGEffect ret BattleBGEffect_HeadFollow: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw .five .zero call BGEffect_CheckFlyDigStatus jr z, .not_flying_digging call EndBattleBGEffect ret .not_flying_digging call BattleBGEffects_IncrementJumptable push bc call BGEffect_CheckBattleTurn jr nz, .player_turn ld a, ANIM_OBJ_PLAYERHEADFOLLOW ld [wBattleAnimTemp0], a ld a, 16 * 8 + 4 jr .okay .player_turn ld a, ANIM_OBJ_ENEMYHEADFOLLOW ld [wBattleAnimTemp0], a ld a, 6 * 8 .okay ld [wBattleAnimTemp1], a ld a, 8 * 8 ld [wBattleAnimTemp2], a xor a ld [wBattleAnimTemp3], a call _QueueBattleAnimation pop bc ret .one call BattleBGEffects_IncrementJumptable push bc call BGEffect_CheckBattleTurn jr nz, .player_turn_2 hlcoord 12, 5 lb bc, 2, 7 jr .okay2 .player_turn_2 hlcoord 2, 6 lb bc, 2, 6 .okay2 call ClearBox ld a, $1 ldh [hBGMapMode], a pop bc ret .five xor a ldh [hBGMapMode], a call EndBattleBGEffect ret _QueueBattleAnimation: callab QueueBattleAnimation ret BattleBGEffect_27: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw .four .zero call BattleBGEffects_IncrementJumptable call BGEffect_CheckBattleTurn ld [hl], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $8 ret .one ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] and a jr z, .user_2 hlcoord 0, 6 lb de, 8, 6 .row1 push de push hl .col1 inc hl ld a, [hld] ld [hli], a dec d jr nz, .col1 pop hl ld de, SCREEN_WIDTH add hl, de pop de dec e jr nz, .row1 jr .okay2 .user_2 hlcoord 19, 0 lb de, 8, 7 .row2 push de push hl .col2 dec hl ld a, [hli] ld [hld], a dec d jr nz, .col2 pop hl ld de, SCREEN_WIDTH add hl, de pop de dec e jr nz, .row2 .okay2 ld a, $1 ldh [hBGMapMode], a call BattleBGEffects_IncrementJumptable ld hl, BG_EFFECT_STRUCT_03 add hl, bc dec [hl] ret .four xor a ldh [hBGMapMode], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and a jr z, .done ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld [hl], $1 ret .done call EndBattleBGEffect ret BattleBGEffect_EnterMon: call BGEffect_CheckBattleTurn jr nz, .player_turn ld de, .EnemyData jr .okay .player_turn ld de, .PlayerData .okay ld a, e ld [wBattleAnimTemp1], a ld a, d ld [wBattleAnimTemp2], a call BattleBGEffect_RunPicResizeScript ret .PlayerData: db 2, $31, 2 db 1, $31, 1 db 0, $31, 0 db -1 .EnemyData: db 5, $00, 5 db 4, $00, 4 db 3, $00, 3 db -1 BattleBGEffect_ReturnMon: call BGEffect_CheckBattleTurn jr nz, .player_turn ld de, .EnemyData jr .okay .player_turn ld de, .PlayerData .okay ld a, e ld [wBattleAnimTemp1], a ld a, d ld [wBattleAnimTemp2], a call BattleBGEffect_RunPicResizeScript ret .PlayerData: db 0, $31, 0 db -2, $66, 0 db 1, $31, 1 db -2, $44, 1 db 2, $31, 2 db -2, $22, 2 db -3, $00, 0 db -1 .EnemyData: db 3, $00, 3 db -2, $77, 3 db 4, $00, 4 db -2, $55, 4 db 5, $00, 5 db -2, $33, 5 db -3, $00, 0 db -1 BattleBGEffect_RunPicResizeScript: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw BattleBGEffects_IncrementJumptable dw .restart dw .end .zero ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld e, [hl] ld d, $0 inc [hl] ld a, [wBattleAnimTemp1] ld l, a ld a, [wBattleAnimTemp2] ld h, a add hl, de add hl, de add hl, de ld a, [hl] cp -1 jr z, .end cp -2 jr z, .clear cp -3 jr z, .skip call .PlaceGraphic .skip call BattleBGEffects_IncrementJumptable ld a, $1 ldh [hBGMapMode], a ret .clear call .ClearBox jr .zero .restart xor a ldh [hBGMapMode], a ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld [hl], $0 ret .end xor a ldh [hBGMapMode], a call EndBattleBGEffect ret .ClearBox: ; get dims push bc inc hl ld a, [hli] ld b, a and $f ld c, a ld a, b swap a and $f ld b, a ; get coords ld e, [hl] ld d, 0 ld hl, .Coords add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a call ClearBox pop bc ret .PlaceGraphic: ; get dims push bc push hl ld e, [hl] ld d, 0 ld hl, .BGSquares add hl, de add hl, de add hl, de ld a, [hli] ld b, a and $f ld c, a ld a, b swap a and $f ld b, a ; store pointer ld e, [hl] inc hl ld d, [hl] ; get byte pop hl inc hl ld a, [hli] ld [wBattleAnimTemp0], a ; get coord push de ld e, [hl] ld d, 0 ld hl, .Coords add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a pop de ; fill box .row push bc push hl ld a, [wBattleAnimTemp0] ld b, a .col ld a, [de] add b ld [hli], a inc de dec c jr nz, .col pop hl ld bc, SCREEN_WIDTH add hl, bc pop bc dec b jr nz, .row pop bc ret .Coords: dwcoord 2, 6 dwcoord 3, 8 dwcoord 4, 10 dwcoord 12, 0 dwcoord 13, 2 dwcoord 14, 4 .BGSquares: bgsquare: MACRO dn \1, \2 dw \3 ENDM bgsquare 6, 6, .SixBySix bgsquare 4, 4, .FourByFour bgsquare 2, 2, .TwoByTwo bgsquare 7, 7, .SevenBySeven bgsquare 5, 5, .FiveByFive bgsquare 3, 3, .ThreeByThree .SixBySix: db $00, $06, $0c, $12, $18, $1e db $01, $07, $0d, $13, $19, $1f db $02, $08, $0e, $14, $1a, $20 db $03, $09, $0f, $15, $1b, $21 db $04, $0a, $10, $16, $1c, $22 db $05, $0b, $11, $17, $1d, $23 .FourByFour: db $00, $0c, $12, $1e db $02, $0e, $14, $20 db $03, $0f, $15, $21 db $05, $11, $17, $23 .TwoByTwo: db $00, $1e db $05, $23 .SevenBySeven: db $00, $07, $0e, $15, $1c, $23, $2a db $01, $08, $0f, $16, $1d, $24, $2b db $02, $09, $10, $17, $1e, $25, $2c db $03, $0a, $11, $18, $1f, $26, $2d db $04, $0b, $12, $19, $20, $27, $2e db $05, $0c, $13, $1a, $21, $28, $2f db $06, $0d, $14, $1b, $22, $29, $30 .FiveByFive: db $00, $07, $15, $23, $2a db $01, $08, $16, $24, $2b db $03, $0a, $18, $26, $2d db $05, $0c, $1a, $28, $2f db $06, $0d, $1b, $29, $30 .ThreeByThree: db $00, $15, $2a db $03, $18, $2d db $06, $1b, $30 BattleBGEffect_Surf: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one .zero call BattleBGEffects_IncrementJumptable lb de, 4, 1 call InitSurfWaves .one ldh a, [hLCDCPointer] and a ret z push bc call .RotatewSurfWaveBGEffect pop bc ret .RotatewSurfWaveBGEffect: ld hl, wLYOverrides ld de, wLYOverrides2 + 1 .asm_c853e: ld bc, wLYOverrides2 ld a, [bc] push af ld a, $7f .asm_c8545: push af ld a, [de] .asm_c8547: ld [bc], a ldh a, [hLYOverrideStart] cp l jr nc, .asm_c8555 ldh a, [hLYOverrideEnd] cp l jr c, .asm_c8555 ld a, [de] jr .asm_c8556 .asm_c8555: xor a .asm_c8556: ld [hli], a inc de inc bc pop af dec a jr nz, .asm_c8545 pop af ld [bc], a ret BattleBGEffect_Psychic: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) ldh [hLCDCPointer], a xor a ldh [hLYOverrideStart], a ld a, $5f ldh [hLYOverrideEnd], a lb de, 6, 5 call Functionc8f2e ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] inc [hl] and $3 ret nz call BattleBGEffect_WavyScreenFX ret .two call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_Teleport: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms lb de, 6, 5 call Functionc8f2e ret .one call BattleBGEffect_WavyScreenFX ret .two call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_NightShade: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld e, [hl] ld d, 3 call Functionc8f2e ret .one call BattleBGEffect_WavyScreenFX ret .two call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_DoubleTeam: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two dw .three dw .four dw .five .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $0 ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] cp $10 jr nc, .next inc [hl] call .UpdateLYOverrides ret .three ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] cp $ff jr z, .next dec [hl] call .UpdateLYOverrides ret .next call BattleBGEffects_IncrementJumptable ret .two ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] ld d, $2 call BattleBGEffects_Sine ld hl, BG_EFFECT_STRUCT_03 add hl, bc add [hl] call .UpdateLYOverrides ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] add $4 ld [hl], a .four ret .UpdateLYOverrides: ld e, a xor $ff inc a ld d, a ld h, HIGH(wLYOverrides) ldh a, [hLYOverrideStart] ld l, a ldh a, [hLYOverrideEnd] sub l srl a .loop ld [hl], e inc hl ld [hl], d inc hl dec a jr nz, .loop ld [hl], e ret .five call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_AcidArmor: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld e, [hl] ld d, 3 call Functionc8f2e ret .one ldh a, [hLYOverrideEnd] ld l, a ld h, HIGH(wLYOverrides) ld e, l ld d, h dec de .loop ld a, [de] dec de ld [hld], a ldh a, [hLYOverrideStart] cp l jr nz, .loop ld [hl], $90 ret .two call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_Withdraw: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $1 ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and $3f ld d, a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] cp d ret nc call BGEffect_DisplaceLYOverridesBackup ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] rlca rlca and $3 ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc add [hl] ld [hl], a ret .two call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_Dig: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two dw .three .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $2 ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and a jr z, .next dec [hl] ret .next ld [hl], $10 call BattleBGEffects_IncrementJumptable .two ldh a, [hLYOverrideStart] ld l, a ldh a, [hLYOverrideEnd] sub l dec a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc cp [hl] ret c ld a, [hl] push af and $7 jr nz, .skip ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc dec [hl] .skip pop af call BGEffect_DisplaceLYOverridesBackup ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc inc [hl] inc [hl] ret .three call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_Tackle: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw Tackle_BGEffect25_2d_one dw Tackle_BGEffect25_2d_two dw .three .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 call BGEffect_CheckBattleTurn jr nz, .player_side ld a, 2 jr .okay .player_side ld a, -2 .okay ld [hl], a ret .three call BattleAnim_ResetLCDStatCustom ret Tackle_BGEffect25_2d_one: ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] cp -8 jr z, .reached_limit cp 8 jr nz, .finish .reached_limit call BattleBGEffects_IncrementJumptable .finish call Functionc88a5 ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] ld hl, BG_EFFECT_STRUCT_03 add hl, bc add [hl] ld [hl], a ret Tackle_BGEffect25_2d_two: ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and a jr nz, .asm_c8893 call BattleBGEffects_IncrementJumptable .asm_c8893 call Functionc88a5 ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] xor $ff inc a ld hl, BG_EFFECT_STRUCT_03 add hl, bc add [hl] ld [hl], a ret Functionc88a5: push af .asm_c87ab: ld a, [rLY] cp $60 jr c, .asm_c87ab pop af call BGEffect_FillLYOverridesBackup ret BattleBGEffect_2d: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw BGEffect2d_2f_zero dw Tackle_BGEffect25_2d_one dw Tackle_BGEffect25_2d_two dw .three .three call BattleAnim_ResetLCDStatCustom ret BGEffect2d_2f_zero: call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 call BGEffect_CheckBattleTurn jr nz, .player_turn ld a, -2 jr .okay .player_turn ld a, 2 .okay ld [hl], a ret BattleBGEffect_2f: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw BGEffect2d_2f_zero dw Tackle_BGEffect25_2d_one dw .two dw Tackle_BGEffect25_2d_two dw .four .four call BattleAnim_ResetLCDStatCustom .two ret BattleBGEffect_26: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] ld d, $8 call BattleBGEffects_Sine call .Functionc8836 ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] add $4 ld [hl], a ret .two call BattleAnim_ResetLCDStatCustom ret .Functionc8836: push af .loop ld a, [rLY] cp $60 jr c, .loop pop af call BGEffect_FillLYOverridesBackup ret BattleBGEffect_2c: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a xor a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hli], a ld [hl], a ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] ld d, $6 call BattleBGEffects_Sine push af ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] ld d, $2 call BattleBGEffects_Sine ld e, a pop af add e call .Functionc8894 ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] add $8 ld [hl], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] add $2 ld [hl], a ret .two call BattleAnim_ResetLCDStatCustom ret .Functionc8894: push af .asm_c8895: ld a, [rLY] cp $60 jr c, .asm_c8895 pop af call BGEffect_FillLYOverridesBackup ret BattleBGEffect_28: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] cp $20 ret nc inc [hl] ld d, a ld e, 4 call Functionc8f2e ret .two ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and a jr z, .reset dec [hl] ld d, a ld e, 4 call Functionc8f2e ret .reset call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_BounceDown: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCY) call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $1 ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $20 ret .one ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] cp $38 ret nc push af ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] ld d, $10 call BattleBGEffects_Cosine add $10 ld d, a pop af add d call BGEffect_DisplaceLYOverridesBackup ld hl, BG_EFFECT_STRUCT_03 add hl, bc inc [hl] inc [hl] ret .two call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_2a: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two dw .three dw .four dw .five .zero call BattleBGEffects_IncrementJumptable ld a, $e4 call BattleBGEffects_SetLYOverrides ld a, $47 call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ldh a, [hLYOverrideStart] ld l, a ld h, HIGH(wLYOverrides) .loop ldh a, [hLYOverrideEnd] cp l jr z, .done xor a ld [hli], a jr .loop .done ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 .one .four ret .two call .GetLYOverride jr nc, .next call .SetLYOverridesBackup ret .next ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 ldh a, [hLYOverrideStart] inc a ldh [hLYOverrideStart], a call BattleBGEffects_IncrementJumptable ret .three call .GetLYOverride jr nc, .finish call .SetLYOverridesBackup ldh a, [hLYOverrideEnd] dec a ld l, a ld [hl], e ret .finish call BattleBGEffects_IncrementJumptable ret .SetLYOverridesBackup: ld e, a ldh a, [hLYOverrideStart] ld l, a ldh a, [hLYOverrideEnd] sub l srl a ld h, HIGH(wLYOverrides) .loop2 ld [hl], e inc hl inc hl dec a jr nz, .loop2 ret .five call BattleBGEffects_ResetVideoHRAM ret .GetLYOverride: ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] inc [hl] srl a srl a srl a ld e, a ld d, 0 ld hl, .data add hl, de ld a, [hl] cp $ff ret .data db $00, $40, $90, $e4 db -1 BattleBGEffect_2b: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one .zero call BattleBGEffects_IncrementJumptable call BattleBGEffects_ClearLYOverrides ld a, LOW(rSCX) call BattleBGEffect_SetLCDStatCustoms ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], $40 ret .one ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] and a jr z, .done dec [hl] srl a srl a srl a and $f ld d, a ld e, a call Functionc8f2e ret .done call BattleAnim_ResetLCDStatCustom ret BattleBGEffect_1c: call BattleBGEffects_AnonJumptable jp hl .anon_dw dw .zero dw .one dw .two .zero call BattleBGEffects_IncrementJumptable ld a, $e4 call BattleBGEffects_SetLYOverrides ld a, LOW(rBGP) ldh [hLCDCPointer], a xor a ldh [hLYOverrideStart], a ld a, $60 ldh [hLYOverrideEnd], a ret .one ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] inc [hl] and $18 srl a srl a ld e, a ld d, $0 push bc call BGEffect_CheckBattleTurn jr nz, .player ld hl, .CGB_DMGEnemyData add hl, de ld a, [hli] ld [wOBP1], a ld d, a ld e, [hl] lb bc, $2f, $30 jr .okay .player ld hl, .DMG_PlayerData add hl, de ld d, [hl] inc hl ld a, [hl] ld [wOBP1], a ld e, a lb bc, $37, $28 .okay call .DMG_LYOverrideLoads pop bc ret .two call BattleBGEffects_ResetVideoHRAM ld a, $e4 ld [wBGP], a ld [wOBP1], a ret .DMG_LYOverrideLoads: ld hl, wLYOverrides .loop1 ld [hl], d inc hl dec b jr nz, .loop1 .loop2 ld [hl], e inc hl dec c jr nz, .loop2 ret .CGB_DMGEnemyData: db $e4, $e4 db $f8, $90 db $fc, $40 db $f8, $90 .DMG_PlayerData: db $e4, $e4 db $90, $f8 db $40, $fc db $90, $f8 BattleBGEffect_RapidFlash: ld de, .FlashPals call BGEffect_RapidCyclePals ret .FlashPals: db $e4, $6c, $fe BattleBGEffect_16: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $90, $40, $ff BattleBGEffect_17: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $f8, $fc, $ff BattleBGEffect_18: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $90, $40, $90, $fe BattleBGEffect_19: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $f8, $fc, $f8, $fe BattleBGEffect_1a: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $f8, $fc, $f8, $e4, $90, $40, $90, $fe BattleBGEffect_1b: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $fc, $e4, $00, $fe BattleBGEffect_1d: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $e4, $90, $40, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $40, $90, $e4, $ff BattleBGEffect_1e: ld de, .Pals call BGEffect_RapidCyclePals ret .Pals: db $00, $40, $90, $e4, $ff BattleBGEffect_2e: call Functionc8d0b jr c, .xor_a bit 7, a jr z, .okay .xor_a xor a .okay ldh [hSCY], a xor $ff inc a ld [$c753], a ; wAnimObject01YOffset ret BattleBGEffect_1f: call Functionc8d0b jr nc, .skip xor a .skip ldh [hSCX], a ret BattleBGEffect_20: call Functionc8d0b jr nc, .skip xor a .skip ldh [hSCY], a ret Functionc8d0b: ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld a, [hl] and a jr nz, .okay call EndBattleBGEffect scf ret .okay dec [hl] ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] and $f jr z, .every_16_frames dec [hl] ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] and a ret .every_16_frames ld a, [hl] swap a or [hl] ld [hl], a ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] xor $ff inc a ld [hl], a and a ret BattleBGEffect_GetNthDMGPal: ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld a, [hl] and a jr z, .zero dec [hl] ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] call BattleBGEffect_GetNextDMGPal ret .zero ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] ld hl, BG_EFFECT_STRUCT_JT_INDEX add hl, bc ld [hl], a call BattleBGEffect_GetFirstDMGPal ret BGEffect_RapidCyclePals: push de ld de, .Jumptable_DMG call BatttleBGEffects_GetNamedJumptablePointer pop de jp hl .Jumptable_DMG: dw .zero_dmg dw .one_dmg dw .two_dmg .zero_dmg call BattleBGEffects_IncrementJumptable ld a, $e4 call BattleBGEffects_SetLYOverrides ld a, $47 call BattleBGEffect_SetLCDStatCustoms ldh a, [hLYOverrideEnd] inc a ldh [hLYOverrideEnd], a ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] ld [hl], $0 ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld [hl], a ret .one_dmg ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ld a, [hl] and $f jr z, .okay_1_dmg dec [hl] ret .okay_1_dmg ld a, [hl] swap a or [hl] ld [hl], a call BattleBGEffect_GetFirstDMGPal jr c, .okay_2_dmg call BGEffect_FillLYOverridesBackup ret .okay_2_dmg ld hl, BG_EFFECT_STRUCT_03 add hl, bc dec [hl] ret .two_dmg call BattleBGEffects_ResetVideoHRAM ld a, %11100100 ld [rBGP], a call EndBattleBGEffect ret BattleBGEffect_GetFirstDMGPal: ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld a, [hl] inc [hl] BattleBGEffect_GetNextDMGPal: ld l, a ld h, $0 add hl, de ld a, [hl] cp -1 jr z, .quit cp -2 jr nz, .repeat ld a, [de] ld hl, BG_EFFECT_STRUCT_03 add hl, bc ld [hl], $0 .repeat and a ret .quit scf ret BattleBGEffects_ClearLYOverrides: xor a BattleBGEffects_SetLYOverrides: ld hl, wLYOverrides ld e, $91 .loop ld [hli], a dec e jr nz, .loop ret BattleBGEffect_SetLCDStatCustoms: ldh [hLCDCPointer], a call BGEffect_CheckBattleTurn jr nz, .player_turn lb de, $00, $36 jr .okay .player_turn lb de, $2f, $5e .okay ld a, d ldh [hLYOverrideStart], a ld a, e ldh [hLYOverrideEnd], a ret BattleAnim_ResetLCDStatCustom: xor a ldh [hLYOverrideStart], a ldh [hLYOverrideEnd], a call BattleBGEffects_ClearLYOverrides xor a ldh [hLCDCPointer], a call EndBattleBGEffect ret BattleBGEffects_ResetVideoHRAM: xor a ldh [hLCDCPointer], a ldh [hLYOverrideStart], a ldh [hLYOverrideEnd], a call BattleBGEffects_ClearLYOverrides ret Functionc8f2e: push bc xor a ld [wBattleAnimTemp0], a ld a, e ld [wBattleAnimTemp1], a ld a, d ld [wBattleAnimTemp2], a ld a, $80 ld [wBattleAnimTemp3], a ld bc, wLYOverrides .loop ldh a, [hLYOverrideStart] cp c jr nc, .next ldh a, [hLYOverrideEnd] cp c jr c, .next ld a, [wBattleAnimTemp2] ld d, a ld a, [wBattleAnimTemp0] call BattleBGEffects_Sine ld [bc], a .next inc bc ld a, [wBattleAnimTemp1] ld hl, wBattleAnimTemp0 add [hl] ld [hl], a ld hl, wBattleAnimTemp3 dec [hl] jr nz, .loop pop bc ret InitSurfWaves: push bc xor a ld [wBattleAnimTemp0], a ld a, e ld [wBattleAnimTemp1], a ld a, d ld [wBattleAnimTemp2], a ld a, $80 ld [wBattleAnimTemp3], a ld bc, wLYOverrides2 .loop ld a, [wBattleAnimTemp2] ld d, a ld a, [wBattleAnimTemp0] call BattleBGEffects_Sine ld [bc], a inc bc ld a, [wBattleAnimTemp1] ld hl, wBattleAnimTemp0 add [hl] ld [hl], a ld hl, wBattleAnimTemp3 dec [hl] jr nz, .loop pop bc ret BattleBGEffect_WavyScreenFX: push bc ldh a, [hLYOverrideStart] ld l, a inc a ld e, a ld h, HIGH(wLYOverrides) ld d, h ldh a, [hLYOverrideEnd] sub l and a jr z, .done ld c, a ld a, [hl] push af .loop ld a, [de] inc de ld [hli], a dec c jr nz, .loop pop af ld [hl], a .done pop bc ret BGEffect_FillLYOverridesBackup: push af ld h, HIGH(wLYOverrides) ldh a, [hLYOverrideStart] ld l, a ldh a, [hLYOverrideEnd] sub l ld d, a pop af .loop ld [hli], a dec d jr nz, .loop ret BGEffect_DisplaceLYOverridesBackup: ; e = a; d = [hLYOverrideEnd] - [hLYOverrideStart] - a push af ld e, a ldh a, [hLYOverrideStart] ld l, a ldh a, [hLYOverrideEnd] sub l sub e ld d, a ld h, HIGH(wLYOverrides) ldh a, [hLYOverrideStart] ld l, a ld a, $90 .loop ld [hli], a dec e jr nz, .loop pop af xor $ff inc a .loop2 ld [hli], a dec d jr nz, .loop2 ret BGEffect_CheckBattleTurn: ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ldh a, [hBattleTurn] and $1 xor [hl] ret BGEffect_CheckFlyDigStatus: ld hl, BG_EFFECT_STRUCT_BATTLE_TURN add hl, bc ldh a, [hBattleTurn] and $1 xor [hl] jr nz, .player ld a, [wEnemySubStatus3] ; EnemySubStatus3 bit 6, a ret .player ld a, [wPlayerSubStatus3] ; PlayerSubStatus3 bit 6, a ret BattleBGEffects_CheckSGB: ld a, [wSGB] and a ret BattleBGEffects_Sine: ld e, a callab BattleAnim_Sine_e ld a, e ret BattleBGEffects_Cosine: ld e, a callab BattleAnim_Cosine_e ld a, e ret