From 4154f191e09404748de4faa3a63bcb51faf42c98 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Fri, 15 Feb 2019 02:56:24 +0100 Subject: Anotate more of the battle anim subsystem The X and Y flip flags can be applied through the stack consisting of: - Object attributes - Animation frame attributes - OAM Data Each of these negate eachother. Confused yet? The same stack is traversed to obtain the final tile ID, with an added layer on top for the base GFX offset and the offset for the dynamically loaded GFX requested by the object! wBattleAnimDelay is populated with the values passed to `anim_wait`. --- engine/battle_anims/core.asm | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'engine/battle_anims/core.asm') diff --git a/engine/battle_anims/core.asm b/engine/battle_anims/core.asm index 65e16c792..86863389c 100644 --- a/engine/battle_anims/core.asm +++ b/engine/battle_anims/core.asm @@ -80,32 +80,36 @@ endr BattleAnimOAMUpdate: call InitBattleAnimBuffer call GetBattleAnimFrame - cp -3 + cp dowait_command jp z, .done - cp -4 + cp delanim_command jp z, .delete + push af ld hl, wBattleAnimTempOAMFlags - ld a, [wBattleAnimTempAddSubFlags] + ld a, [wBattleAnimTempFrameOAMFlags] xor [hl] - and $e0 + and $e0 ; Keep priority, x flip and y flip flags. ld [hl], a pop af + push bc call GetBattleAnimOAMPointer ld a, [wBattleAnimTempTileID] - add [hl] + add [hl] ; tile offset ld [wBattleAnimTempTileID], a inc hl - ld a, [hli] + ld a, [hli] ; oam data length ld c, a - ld a, [hli] + ld a, [hli] ; oam data pointer ld h, [hl] ld l, a ld a, [wBattleAnimOAMPointerLo] ld e, a ld d, HIGH(wVirtualOAM) + .loop + ; Y Coord ld a, [wBattleAnimTempYCoord] ld b, a ld a, [wBattleAnimTempYOffset] @@ -114,16 +118,17 @@ BattleAnimOAMUpdate: push hl ld a, [hl] ld hl, wBattleAnimTempOAMFlags - bit 6, [hl] + bit OAM_Y_FLIP, [hl] jr z, .no_yflip add $8 xor $ff inc a - .no_yflip pop hl add b ld [de], a + + ; X Coord inc hl inc de ld a, [wBattleAnimTempXCoord] @@ -134,43 +139,47 @@ BattleAnimOAMUpdate: push hl ld a, [hl] ld hl, wBattleAnimTempOAMFlags - bit 5, [hl] + bit OAM_X_FLIP, [hl] jr z, .no_xflip add $8 xor $ff inc a - .no_xflip pop hl add b ld [de], a + + ; Tile ID inc hl inc de ld a, [wBattleAnimTempTileID] add BATTLEANIM_BASE_TILE add [hl] ld [de], a + + ; Attributes inc hl inc de ld a, [wBattleAnimTempOAMFlags] ld b, a ld a, [hl] xor b - and $e0 + and PRIORITY | Y_FLIP | X_FLIP ld b, a ld a, [hl] - and $10 + and OBP_NUM or b ld b, a ld a, [wBattleAnimTempPalette] and $f or b ld [de], a + inc hl inc de ld a, e ld [wBattleAnimOAMPointerLo], a - cp $a0 + cp LOW(wVirtualOAMEnd) jr nc, .exit_set_carry dec c jr nz, .loop @@ -193,10 +202,11 @@ InitBattleAnimBuffer: ld hl, BATTLEANIMSTRUCT_01 add hl, bc ld a, [hl] + and %10000000 ld [wBattleAnimTempOAMFlags], a xor a - ld [wBattleAnimTempAddSubFlags], a + ld [wBattleAnimTempFrameOAMFlags], a ld hl, BATTLEANIMSTRUCT_PALETTE add hl, bc ld a, [hl] @@ -217,15 +227,18 @@ InitBattleAnimBuffer: ld [wBattleAnimTempXOffset], a ld a, [hli] ld [wBattleAnimTempYOffset], a + ldh a, [hBattleTurn] and a ret z + ld hl, BATTLEANIMSTRUCT_01 add hl, bc ld a, [hl] ld [wBattleAnimTempOAMFlags], a bit 0, [hl] ret z + ld hl, BATTLEANIMSTRUCT_XCOORD add hl, bc ld a, [hli] -- cgit v1.2.3