diff options
-rwxr-xr-x | engine/battle_anims/bg_effects.asm | 2841 | ||||
-rwxr-xr-x | engine/events/poisonstep_pals.asm | 41 | ||||
-rw-r--r-- | main.asm | 16 | ||||
-rw-r--r-- | wram.asm | 36 |
4 files changed, 2925 insertions, 9 deletions
diff --git a/engine/battle_anims/bg_effects.asm b/engine/battle_anims/bg_effects.asm new file mode 100755 index 00000000..42e6c346 --- /dev/null +++ b/engine/battle_anims/bg_effects.asm @@ -0,0 +1,2841 @@ + 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, NUM_BG_EFFECTS +.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, BG_EFFECT_STRUCT_LENGTH + add hl, bc + dec e + jr nz, .loop + ret + +QueueBGEffect: + ld hl, wActiveBGEffects + ld e, NUM_BG_EFFECTS +.loop + ld a, [hl] + and a + jr z, .load + ld bc, BG_EFFECT_STRUCT_LENGTH + 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_BattlerObj_1Row + dw BattleBGEffect_BattlerObj_2Row + 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_Psychic + dw BattleBGEffect_29 + 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_VibrateMon + dw BattleBGEffect_WobbleMon + dw BattleBGEffect_34 + +BattleBGEffect_End: + call EndBattleBGEffect + ret + +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_AnonJumptable: + pop de +DummyPredef2F:: + 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 + jp hl + +BattleBGEffects_IncrementJumptable: + ld hl, BG_EFFECT_STRUCT_JT_INDEX + add hl, bc + inc [hl] + ret + +BattleBGEffect_FlashInverted: + ld de, .inverted + jp BattleBGEffect_FlashContinue + +.inverted + dc 3, 2, 1, 0 + dc 0, 1, 2, 3 + +BattleBGEffect_FlashWhite: + ld de, .white + jp BattleBGEffect_FlashContinue + +.white + dc 3, 2, 1, 0 + dc 0, 0, 0, 0 + +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: + dc 3, 2, 1, 0 + dc 3, 2, 0, 0 + dc 3, 1, 0, 0 + db -1 + +BattleBGEffect_BlackHues: + ld de, .Pals + call BattleBGEffect_GetNthDMGPal + jr c, .quit + ld [wBGP], a + ret + +.quit + call EndBattleBGEffect + ret + +.Pals: + dc 3, 2, 1, 0 + dc 3, 3, 1, 0 + dc 3, 3, 2, 0 + 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: + dc 3, 2, 1, 0 + dc 3, 3, 2, 0 + dc 3, 3, 3, 0 + dc 3, 3, 2, 0 + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 2, 1, 0, 0 + 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: + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + db -2 + +.PalsSGB: + dc 3, 3, 0, 0 + dc 3, 0, 0, 0 + 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: + dc 3, 2, 1, 0 + dc 3, 1, 2, 0 + db -2 + +.PalsSGB: + dc 3, 3, 0, 0 + dc 3, 0, 3, 0 + db -2 + +BattleBGEffect_08: + ld de, .Pals + call BattleBGEffect_GetNthDMGPal + ld [wBGP], a + ret + +.Pals: + dc 0, 1, 2, 3 + dc 1, 2, 0, 3 + dc 2, 0, 1, 3 + db -2 + +BattleBGEffect_HideMon: + call BattleBGEffects_AnonJumptable +.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_BattlerObj_1Row: + call BattleBGEffects_AnonJumptable +.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 + ld hl, wLastAnimObjectIndex + inc [hl] + call EndBattleBGEffect + ret + +.not_flying_digging + call BattleBGEffects_IncrementJumptable + push bc + call BGEffect_CheckBattleTurn + jr nz, .player_side + ld a, ANIM_OBJ_ENEMYFEET_1ROW + ld [wBattleObjectTempID], a + ld a, 16 * TILE_WIDTH + 4 + jr .okay + +.player_side + ld a, ANIM_OBJ_PLAYERHEAD_1ROW + ld [wBattleObjectTempID], a + ld a, 6 * TILE_WIDTH +.okay + ld [wBattleObjectTempXCoord], a + ld a, 8 * TILE_WIDTH + ld [wBattleObjectTempYCoord], a + xor a + ld [wBattleObjectTempParam], a + call _QueueBattleAnimation + pop bc + ret + +.one + call BattleBGEffects_IncrementJumptable + push bc + call BGEffect_CheckBattleTurn + jr nz, .player_side_2 + hlcoord 12, 6 + lb bc, 1, 7 + jr .okay2 + +.player_side_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_BattlerObj_2Row: + call BattleBGEffects_AnonJumptable +.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 + ld hl, wLastAnimObjectIndex + inc [hl] + call EndBattleBGEffect + ret + +.not_flying_digging + call BattleBGEffects_IncrementJumptable + push bc + call BGEffect_CheckBattleTurn + jr nz, .player_side + ld a, ANIM_OBJ_ENEMYFEET_2ROW + ld [wBattleObjectTempID], a + ld a, 16 * TILE_WIDTH + 4 + jr .okay + +.player_side + ld a, ANIM_OBJ_PLAYERHEAD_2ROW + ld [wBattleObjectTempID], a + ld a, 6 * TILE_WIDTH +.okay + ld [wBattleObjectTempXCoord], a + ld a, 8 * TILE_WIDTH + ld [wBattleObjectTempYCoord], a + xor a + ld [wBattleObjectTempParam], a + call _QueueBattleAnimation + pop bc + ret + +.one + call BattleBGEffects_IncrementJumptable + push bc + call BGEffect_CheckBattleTurn + jr nz, .player_side_2 + hlcoord 12, 5 + lb bc, 2, 7 + jr .okay2 + +.player_side_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: + callfar QueueBattleAnimation + ret + + +BattleBGEffect_26: + call BattleBGEffects_AnonJumptable +.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_BATTLE_TURN + add hl, bc + ld a, [hl] + and a + jr z, .user + ld a, $9 + jr .okay + +.user + ld a, $8 +.okay + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld [hl], a + 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 + xor a + ldh [hBGMapThird], a + 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 +.anon_dw + dw .zero + 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 +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + lb de, 2, 2 + call InitSurfWaves + +.one + ldh a, [hLCDCPointer] + and a + ret z + push bc + call .RotatewSurfWaveBGEffect + pop bc + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +.RotatewSurfWaveBGEffect: + ld hl, wSurfWaveBGEffect + ld de, wSurfWaveBGEffect + 1 + ld c, wSurfWaveBGEffectEnd - wSurfWaveBGEffect - 1 + ld a, [hl] + push af +.loop + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .loop + pop af + ld [hl], a + ld de, wLYOverridesBackup + ld hl, wSurfWaveBGEffect + ld bc, $0 +.loop2 + ldh a, [hLYOverrideStart] + cp e + jr nc, .load_zero + push hl + add hl, bc + ld a, [hl] + pop hl + jr .okay + +.load_zero + xor a +.okay + ld [de], a + ld a, c + inc a + and $3f + ld c, a + inc de + ld a, e + cp $5f + jr c, .loop2 + ret + +BattleBGEffect_Whirlpool: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + ldh [hLCDCPointer], a + xor a + ldh [hLYOverrideStart], a + ld a, $5e + ldh [hLYOverrideEnd], a + lb de, 2, 2 + call Function_032_4ec9 + ret + +.one + call BattleBGEffect_WavyScreenFX + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_2f: + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + call BattleBGEffect_SetLCDStatCustoms1 + call EndBattleBGEffect + ret + +BattleBGEffect_30: + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld a, [hl] + ld e, a + add $4 + ld [hl], a + ld hl, BG_EFFECT_STRUCT_BATTLE_TURN + add hl, bc + ld a, [hl] + and $f0 + swap a + xor $ff + add $4 + ld d, a + ld hl, BG_EFFECT_STRUCT_JT_INDEX + add hl, bc + ld a, [hl] + ld [wBattleAnimTemp0], a + ld hl, BG_EFFECT_STRUCT_BATTLE_TURN + add hl, bc + ld a, [hl] + cp $20 + jr nc, .done + inc [hl] + inc [hl] + call Function_032_4f35 + ret + +.done + call BattleBGEffects_ClearLYOverrides + call EndBattleBGEffect + ret + +BattleBGEffect_31: + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_Psychic: + call BattleBGEffects_AnonJumptable +.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 Function_032_4ec9 + 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 +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCX) + call BattleBGEffect_SetLCDStatCustoms1 + lb de, 6, 5 + call Function_032_4ec9 + ret + +.one + call BattleBGEffect_WavyScreenFX + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_NightShade: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + call BattleBGEffect_SetLCDStatCustoms1 + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld e, [hl] + ld d, 2 + call Function_032_4ec9 + ret + +.one + call BattleBGEffect_WavyScreenFX + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_DoubleTeam: + call BattleBGEffects_AnonJumptable +.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_SetLCDStatCustoms1 + ldh a, [hLYOverrideEnd] + inc a + ldh [hLYOverrideEnd], a + 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(wLYOverridesBackup) + ldh a, [hLYOverrideStart] + ld l, a + ldh a, [hLYOverrideEnd] + sub l + srl a + push af +.loop + ld [hl], e + inc hl + ld [hl], d + inc hl + dec a + jr nz, .loop + pop af + ret nc + ld [hl], e + ret + +.five + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_AcidArmor: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + call BattleBGEffect_SetLCDStatCustoms1 + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld e, [hl] + ld d, 2 + call Function_032_4ec9 + ld h, HIGH(wLYOverridesBackup) + ldh a, [hLYOverrideEnd] + ld l, a + ld [hl], $0 + dec l + ld [hl], $0 + ret + +.one + ldh a, [hLYOverrideEnd] + ld l, a + ld h, HIGH(wLYOverridesBackup) + 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 + ldh a, [hLYOverrideEnd] + ld l, a + ld a, [hl] + cp $1 + jr c, .okay + cp $90 + jr z, .okay + ld [hl], $0 +.okay + dec l + ld a, [hl] + cp $2 + ret c + cp $90 + ret z + ld [hl], $0 + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_Withdraw: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + call BattleBGEffect_SetLCDStatCustoms1 + 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 +.anon_dw + dw .zero + dw .one + dw .two + dw .three + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + call BattleBGEffect_SetLCDStatCustoms1 + 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 +.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_SetLCDStatCustoms1 + 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 Function_032_486e + 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_485c + call BattleBGEffects_IncrementJumptable +.asm_485c + call Function_032_486e + 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 + +Function_032_486e: + push af + ld a, [wFXAnimID + 1] ; FXAnimID + 1 + or a + jr nz, .not_rollout + ld a, [wFXAnimID] ; FXAnimID + cp ROLLOUT + jr z, .rollout +.not_rollout + pop af + jp BGEffect_FillLYOverridesBackup + +.rollout + ldh a, [hLYOverrideStart] + ld d, a + ldh a, [hLYOverrideEnd] + sub d + ld d, a + ld h, HIGH(wLYOverridesBackup) + ldh a, [hSCY] + or a + jr nz, .skip1 + ldh a, [hLYOverrideStart] + or a + jr z, .skip2 + dec a + ld l, a + ld [hl], $0 + jr .skip2 + +.skip1 + ldh a, [hLYOverrideEnd] + dec a + ld l, a + ld [hl], $0 +.skip2 + ldh a, [hSCY] + ld l, a + ldh a, [hLYOverrideStart] + sub l + jr nc, .skip3 + xor a + dec d +.skip3 + ld l, a + pop af +.loop + ld [hli], a + dec d + jr nz, .loop + ret + +BattleBGEffect_2c: + call BattleBGEffects_AnonJumptable +.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_SetLCDStatCustoms1 + 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_2e: + call BattleBGEffects_AnonJumptable +.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_25: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCX) + call BattleBGEffect_SetLCDStatCustoms1 + 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 BGEffect_FillLYOverridesBackup + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld a, [hl] + add $4 + ld [hl], a + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_2b: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCX) + call BattleBGEffect_SetLCDStatCustoms1 + 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 BGEffect_FillLYOverridesBackup + 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 + +BattleBGEffect_27: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCX) + call BattleBGEffect_SetLCDStatCustoms1 + 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 Function_032_4ec9 + 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 Function_032_4ec9 + ret + +.reset + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_BounceDown: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + dw .two + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCY) + call BattleBGEffect_SetLCDStatCustoms1 + 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_29: + call BattleBGEffects_AnonJumptable +.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_SetLCDStatCustoms1 + ldh a, [hLYOverrideEnd] + inc a + ldh [hLYOverrideEnd], a + ldh a, [hLYOverrideStart] + ld l, a + ld h, HIGH(wLYOverridesBackup) +.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(wLYOverridesBackup) +.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_2a: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCX) + call BattleBGEffect_SetLCDStatCustoms1 + 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 Function_032_4ec9 + ret + +.done + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_1c: + ldh a, [hCGB] + and a + jr nz, .cgb + call BattleBGEffects_AnonJumptable +.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] + ld e, a + and $7 + ret nz + ld a, e + and $18 + sla a + swap a + sla 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, wLYOverridesBackup +.loop1 + ld [hl], d + inc hl + dec b + jr nz, .loop1 +.loop2 + ld [hl], e + inc hl + dec c + jr nz, .loop2 + ret + +.cgb + ld de, .Jumptable + call BatttleBGEffects_GetNamedJumptablePointer + jp hl + +.Jumptable: + dw .cgb_zero + dw .cgb_one + dw .cgb_two + +.cgb_zero + call BattleBGEffects_IncrementJumptable + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld [hl], $0 + ret + +.cgb_one + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld a, [hl] + inc [hl] + ld e, a + and $7 + ret nz + ld a, e + and $18 + sla a + swap a + sla a + ld e, a + ld d, 0 + call BGEffect_CheckBattleTurn + jr nz, .player_2 + ld hl, .CGB_DMGEnemyData + add hl, de + ld a, [hli] + push hl + call BGEffects_LoadBGPal1_OBPal0 + pop hl + ld a, [hl] + call BGEffects_LoadBGPal0_OBPal1 + ret + +.player_2 + ld hl, .CGB_DMGEnemyData + add hl, de + ld a, [hli] + push hl + call BGEffects_LoadBGPal0_OBPal1 + pop hl + ld a, [hl] + call BGEffects_LoadBGPal1_OBPal0 + ret + +.cgb_two + ld a, $e4 + call BGEffects_LoadBGPal0_OBPal1 + ld a, $e4 + call BGEffects_LoadBGPal1_OBPal0 + call EndBattleBGEffect + 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_VibrateMon: + call BattleBGEffects_AnonJumptable +.anon_dw + dw .zero + dw .one + +.zero + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_ClearLYOverrides + ld a, LOW(rSCX) + call BattleBGEffect_SetLCDStatCustoms1 + 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_03 + add hl, bc + ld a, [hl] + and a + jr z, .finish + dec [hl] + and $1 + ret nz + ld hl, BG_EFFECT_STRUCT_BATTLE_TURN + add hl, bc + ld a, [hl] + xor $ff + inc a + ld [hl], a + call BGEffect_FillLYOverridesBackup + ret + +.finish + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_WobbleMon: + call BattleBGEffects_AnonJumptable +.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, $37 + 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] + cp $40 + jr nc, .two + ld d, $6 + call BattleBGEffects_Sine + call BGEffect_FillLYOverridesBackup + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld a, [hl] + add $2 + ld [hl], a + ret + +.two + call BattleAnim_ResetLCDStatCustom + ret + +BattleBGEffect_2d: + call Function_032_4cd4 + jr c, .xor_a + bit 7, a + jr z, .okay +.xor_a + xor a +.okay + push af + call DelayFrame + pop af + ldh [hSCY], a + xor $ff + inc a + ld [wAnimObject01YOffset], a + ret + +BattleBGEffect_1f: + call Function_032_4cd4 + jr nc, .skip + xor a +.skip + ldh [hSCX], a + ret + +BattleBGEffect_20: + call Function_032_4cd4 + jr nc, .skip + xor a +.skip + ldh [hSCY], a + ret + +Function_032_4cd4: + 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_34: + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld a, [hl] + cp $40 + jr nc, .finish + ld d, $6 + call BattleBGEffects_Sine + ldh [hSCX], a + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + ld a, [hl] + add $2 + ld [hl], a + ret + +.finish + xor a + ldh [hSCX], 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: + ldh a, [hCGB] + and a + jr nz, .cgb + 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_SetLCDStatCustoms1 + 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 + ldh [rBGP], a + call EndBattleBGEffect + ret + +.cgb + push de + ld de, .Jumptable_CGB + call BatttleBGEffects_GetNamedJumptablePointer + pop de + jp hl + +.Jumptable_CGB: + dw .zero_cgb + dw .one_cgb + dw .two_cgb + dw .three_cgb + dw .four_cgb + +.zero_cgb + call BGEffect_CheckBattleTurn + jr nz, .player_turn_cgb + call BattleBGEffects_IncrementJumptable + call BattleBGEffects_IncrementJumptable +.player_turn_cgb + call BattleBGEffects_IncrementJumptable + 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_cgb + ld hl, BG_EFFECT_STRUCT_BATTLE_TURN + add hl, bc + ld a, [hl] + and $f + jr z, .okay_1_cgb + dec [hl] + ret + +.okay_1_cgb + ld a, [hl] + swap a + or [hl] + ld [hl], a + call BattleBGEffect_GetFirstDMGPal + jr c, .okay_2_cgb + call BGEffects_LoadBGPal0_OBPal1 + ret + +.okay_2_cgb + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + dec [hl] + ret + +.two_cgb + ld a, $e4 + call BGEffects_LoadBGPal0_OBPal1 + call EndBattleBGEffect + ret + +.three_cgb + ld hl, BG_EFFECT_STRUCT_BATTLE_TURN + add hl, bc + ld a, [hl] + and $f + jr z, .okay_3_cgb + dec [hl] + ret + +.okay_3_cgb + ld a, [hl] + swap a + or [hl] + ld [hl], a + call BattleBGEffect_GetFirstDMGPal + jr c, .okay_4_cgb + call BGEffects_LoadBGPal1_OBPal0 + ret + +.okay_4_cgb + ld hl, BG_EFFECT_STRUCT_03 + add hl, bc + dec [hl] + ret + +.four_cgb + ld a, $e4 + call BGEffects_LoadBGPal1_OBPal0 + call EndBattleBGEffect + ret + +BGEffects_LoadBGPal0_OBPal1: + push bc + push af + ld hl, wBGPals2 + ld de, wBGPals1 + ld b, a + ld c, $1 + call CopyPals + ld hl, wOBPals2 palette 1 + ld de, wOBPals1 palette 1 + pop af + ld b, a + ld c, $1 + call CopyPals + pop bc + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +BGEffects_LoadBGPal1_OBPal0: + push bc + push af + ld hl, wBGPals2 palette 1 + ld de, wBGPals1 palette 1 + ld b, a + ld c, $1 + call CopyPals + ld hl, wOBPals2 + ld de, wOBPals1 + pop af + ld b, a + ld c, $1 + call CopyPals + pop bc + ld a, $1 + ldh [hCGBPalUpdate], a + 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, $99 +.loop1 + ld [hli], a + dec e + jr nz, .loop1 + ld hl, wLYOverridesBackup + ld e, $91 +.loop2 + ld [hli], a + dec e + jr nz, .loop2 + ret + +BattleBGEffect_SetLCDStatCustoms1: + 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 + ld a, %11100100 + ldh [rBGP], a + ld [wBGP], a + ld [wOBP1], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a + call BattleBGEffects_ClearLYOverrides + ret + +Function_032_4ec9: + 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, wLYOverridesBackup +.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, $40 + ld [wBattleAnimTemp3], a + ld bc, wSurfWaveBGEffect +.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 + +Function_032_4f35: + push bc + ld [wBattleAnimTemp3], a + ld a, e + ld [wBattleAnimTemp1], a + ld a, d + ld [wBattleAnimTemp2], a + call .GetLYOverrideBackupAddrOffset + ld hl, wLYOverridesBackup + add hl, de + ld c, l + ld b, h +.loop + ld a, [wBattleAnimTemp3] + and a + jr z, .done + dec a + ld [wBattleAnimTemp3], a + push af + ld a, [wBattleAnimTemp2] + ld d, a + ld a, [wBattleAnimTemp1] + push hl + call BattleBGEffects_Sine + ld e, a + pop hl + ldh a, [hLYOverrideEnd] + cp c + jr c, .skip1 + ld a, e + ld [bc], a + inc bc +.skip1 + ldh a, [hLYOverrideStart] + cp l + jr nc, .skip2 + ld [hl], e + dec hl +.skip2 + ld a, [wBattleAnimTemp1] + add $4 + ld [wBattleAnimTemp1], a + pop af + jr .loop + +.done + pop bc + and a + ret + +.GetLYOverrideBackupAddrOffset: + ldh a, [hLYOverrideStart] + ld e, a + ld a, [wBattleAnimTemp0] + add e + ld e, a + ld d, $0 + ret + +BattleBGEffect_WavyScreenFX: + push bc + ldh a, [hLYOverrideStart] + ld l, a + inc a + ld e, a + ld h, HIGH(wLYOverridesBackup) + 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(wLYOverridesBackup) + 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(wLYOverridesBackup) + ldh a, [hLYOverrideStart] + ld l, a + ld a, $90 +.loop + ld [hli], a + dec e + jr nz, .loop + pop af + xor $ff +.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 + and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND + ret + +.player + ld a, [wPlayerSubStatus3] ; PlayerSubStatus3 + and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND + ret + +BattleBGEffects_CheckSGB: + ldh a, [hSGB] + and a + ret + +BattleBGEffects_Sine: + ld e, a + callfar BattleAnim_Sine_e + ld a, e + ret + +BattleBGEffects_Cosine: + ld e, a + callfar BattleAnim_Cosine_e + ld a, e + ret diff --git a/engine/events/poisonstep_pals.asm b/engine/events/poisonstep_pals.asm new file mode 100755 index 00000000..2752f5a7 --- /dev/null +++ b/engine/events/poisonstep_pals.asm @@ -0,0 +1,41 @@ +LoadPoisonBGPals: + call .LoadPals + ldh a, [hCGB] + and a + ret nz + ret ; ???? + +.LoadPals: + ldh a, [hCGB] + and a + jr nz, .cgb + ld a, [wTimeOfDayPal] + maskbits NUM_DAYTIMES + cp DARKNESS_F + ld a, %00000000 + jr z, .convert_pals + ld a, %10101010 + +.convert_pals + call DmgToCgbBGPals + ld c, 4 + call DelayFrames + farcall _UpdateTimePals + ret + +.cgb + ld hl, wBGPals2 + ld c, 4 palettes +.loop + ld a, LOW(palred 28 + palgreen 21 + palblue 31) + ld [hli], a + ld a, HIGH(palred 28 + palgreen 21 + palblue 31) + ld [hli], a + dec c + jr nz, .loop + ld a, $1 + ldh [hCGBPalUpdate], a + ld c, 4 + call DelayFrames + farcall _UpdateTimePals + ret @@ -378,14 +378,10 @@ INCLUDE "engine/pokemon/caught_data.asm" SECTION "bank32", ROMX -ExecuteBGEffects:: - dr $c8000, $c80d6 -DummyPredef2F:: - dr $c80d6, $c900a +INCLUDE "engine/battle_anims/bg_effects.asm" INCLUDE "data/moves/animations.asm" +INCLUDE "engine/events/poisonstep_pals.asm" -LoadPoisonBGPals:: - dr $cbc76, $cbcbd TheEndGFX:: INCBIN "gfx/credits/theend.2bpp" @@ -408,10 +404,14 @@ BattleAnimCmd_RaiseSub:: BattleAnimCmd_MinimizeOpp:: dr $cc67c, $cc836 ClearBattleAnims:: - dr $cc836, $ce6aa + dr $cc836, $cc8f0 +QueueBattleAnimation:: + dr $cc8f0, $ce6aa BattleAnim_Sine_e:: - dr $ce6aa, $cfce3 + dr $ce6aa, $ce6b0 +BattleAnim_Cosine_e:: + dr $ce6b0, $cfce3 SECTION "Font Inversed", ROMX @@ -612,7 +612,41 @@ wBattleAnimVar:: db ; ca16 wBattleAnimByte:: db ; ca17 wBattleAnimOAMPointerLo:: db ; ca18 - ds 207 +UNION ; ca19 +; unidentified +wBattleAnimTemp0:: db +wBattleAnimTemp1:: db +wBattleAnimTemp2:: db +wBattleAnimTemp3:: db + +NEXTU ; ca19 +wBattleObjectTempID:: db +wBattleObjectTempXCoord:: db +wBattleObjectTempYCoord:: db +wBattleObjectTempParam:: db + +NEXTU ; ca19 +wBattleAnimTempOAMFlags:: db +wBattleAnimTempField02:: db +wBattleAnimTempTileID:: db +wBattleAnimTempXCoord:: db +wBattleAnimTempYCoord:: db +wBattleAnimTempXOffset:: db +wBattleAnimTempYOffset:: db +wBattleAnimTempFrameOAMFlags:: db +wBattleAnimTempPalette:: db +ENDU ; ca22 + +UNION ; ca22 + ds $32 +wBattleAnimEnd:: + +NEXTU ; ca22 +wSurfWaveBGEffect:: ds $40 +wSurfWaveBGEffectEnd:: +ENDU ; ca62 + +ds 134 wBattle:: ; cae8 wEnemyMoveStruct:: move_struct wEnemyMoveStruct |