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/anim_commands.asm | 10 ++++---- engine/battle_anims/core.asm | 43 +++++++++++++++++++++++------------ engine/battle_anims/helpers.asm | 6 ++--- 3 files changed, 36 insertions(+), 23 deletions(-) (limited to 'engine') diff --git a/engine/battle_anims/anim_commands.asm b/engine/battle_anims/anim_commands.asm index f6c6b06a6..6c30ab51d 100644 --- a/engine/battle_anims/anim_commands.asm +++ b/engine/battle_anims/anim_commands.asm @@ -267,12 +267,12 @@ RunBattleAnimCommand: ret .CheckTimer: - ld a, [wBattleAnimDuration] + ld a, [wBattleAnimDelay] and a jr z, .done dec a - ld [wBattleAnimDuration], a + ld [wBattleAnimDelay], a and a ret @@ -296,10 +296,10 @@ RunBattleAnimCommand: ret .not_done_with_anim - cp $d0 + cp anim_obj_command jr nc, .do_anim - ld [wBattleAnimDuration], a + ld [wBattleAnimDelay], a ret .do_anim @@ -310,7 +310,7 @@ RunBattleAnimCommand: .DoCommand: ; Execute battle animation command in [wBattleAnimByte]. ld a, [wBattleAnimByte] - sub $d0 + sub anim_obj_command ld e, a ld d, 0 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] diff --git a/engine/battle_anims/helpers.asm b/engine/battle_anims/helpers.asm index 4a7f2950c..127fe5412 100644 --- a/engine/battle_anims/helpers.asm +++ b/engine/battle_anims/helpers.asm @@ -37,16 +37,16 @@ GetBattleAnimFrame: push af ld a, [hl] push hl - and $3f + and %00111111 ld hl, BATTLEANIMSTRUCT_DURATION add hl, bc ld [hl], a pop hl .okay ld a, [hl] - and $c0 + and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "frame" macro srl a - ld [wBattleAnimTempAddSubFlags], a + ld [wBattleAnimTempFrameOAMFlags], a pop af ret -- cgit v1.2.3 From ee86b367662ab8f7a81a644c66f5bf14ead59ba8 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Fri, 15 Feb 2019 17:21:51 +0100 Subject: =?UTF-8?q?wNumActiveBattleAnims=20=E2=86=92=20wLastAnimObjectInde?= =?UTF-8?q?x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This variable never decrements, it only increments to give each battle animation a different, and incremental "index". --- engine/battle_anims/bg_effects.asm | 4 ++-- engine/battle_anims/core.asm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'engine') diff --git a/engine/battle_anims/bg_effects.asm b/engine/battle_anims/bg_effects.asm index 0f2e716ca..a510038a5 100644 --- a/engine/battle_anims/bg_effects.asm +++ b/engine/battle_anims/bg_effects.asm @@ -416,7 +416,7 @@ BattleBGEffect_BattlerObj_1Row: .zero call BGEffect_CheckFlyDigStatus jr z, .not_flying_digging - ld hl, wNumActiveBattleAnims + ld hl, wLastAnimObjectIndex inc [hl] call EndBattleBGEffect ret @@ -483,7 +483,7 @@ BattleBGEffect_BattlerObj_2Row: .zero call BGEffect_CheckFlyDigStatus jr z, .not_flying_digging - ld hl, wNumActiveBattleAnims + ld hl, wLastAnimObjectIndex inc [hl] call EndBattleBGEffect ret diff --git a/engine/battle_anims/core.asm b/engine/battle_anims/core.asm index 86863389c..c5afb53ba 100644 --- a/engine/battle_anims/core.asm +++ b/engine/battle_anims/core.asm @@ -15,7 +15,7 @@ QueueBattleAnimation: .done ld c, l ld b, h - ld hl, wNumActiveBattleAnims + ld hl, wLastAnimObjectIndex inc [hl] call InitBattleAnimation ret @@ -38,7 +38,7 @@ endr ld d, h ld hl, BATTLEANIMSTRUCT_INDEX add hl, bc - ld a, [wNumActiveBattleAnims] + ld a, [wLastAnimObjectIndex] ld [hli], a ; Index ld a, [de] inc de -- cgit v1.2.3 From 7e93916c8a825d4dfc29cf73e73b41d8c1fc06de Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sat, 16 Feb 2019 01:33:40 +0100 Subject: Add more constants for battle anim structs Any access of the wram arrays for battle anim objects and background effects use appropriate macros and constants, now. --- engine/battle_anims/anim_commands.asm | 25 ++++++++++++++----------- engine/battle_anims/bg_effects.asm | 8 ++++---- engine/battle_anims/core.asm | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) (limited to 'engine') diff --git a/engine/battle_anims/anim_commands.asm b/engine/battle_anims/anim_commands.asm index 6c30ab51d..cdb8555bd 100644 --- a/engine/battle_anims/anim_commands.asm +++ b/engine/battle_anims/anim_commands.asm @@ -112,10 +112,10 @@ RunBattleAnimScript: cp ROLLOUT jr nz, .not_rollout - ld a, $2e - ld b, 5 - ld de, 4 - ld hl, wActiveBGEffects + ld a, ANIM_BG_2E + ld b, NUM_BG_EFFECTS + ld de, BG_EFFECT_STRUCT_LENGTH + ld hl, wBGEffect1Function .find cp [hl] jr z, .done @@ -643,10 +643,13 @@ BattleAnimCmd_ResetObp0: ret BattleAnimCmd_ClearObjs: +; BUG: This function only clears the first 6+(2/3) objects + ld hl, wActiveAnimObjects ld a, $a0 + ; ld a, wActiveAnimObjectsEnd - wActiveAnimObjects .loop - ld [hl], $0 + ld [hl], 0 inc hl dec a jr nz, .loop @@ -693,7 +696,7 @@ endr BattleAnimCmd_IncObj: call GetBattleAnimByte - ld e, 10 + ld e, NUM_ANIM_OBJECTS ld bc, wActiveAnimObjects .loop ld hl, BATTLEANIMSTRUCT_INDEX @@ -718,8 +721,8 @@ BattleAnimCmd_IncObj: BattleAnimCmd_IncBGEffect: call GetBattleAnimByte - ld e, 5 - ld bc, wActiveBGEffects + ld e, NUM_BG_EFFECTS + ld bc, wBGEffect1Function .loop ld hl, $0 add hl, bc @@ -743,7 +746,7 @@ BattleAnimCmd_IncBGEffect: BattleAnimCmd_SetObj: call GetBattleAnimByte - ld e, 10 + ld e, NUM_ANIM_OBJECTS ld bc, wActiveAnimObjects .loop ld hl, BATTLEANIMSTRUCT_INDEX @@ -1430,10 +1433,10 @@ BattleAnim_SetOBPals: ret BattleAnim_UpdateOAM_All: - ld a, $0 + ld a, 0 ld [wBattleAnimOAMPointerLo], a ld hl, wActiveAnimObjects - ld e, 10 + ld e, NUM_ANIM_OBJECTS .loop ld a, [hl] and a diff --git a/engine/battle_anims/bg_effects.asm b/engine/battle_anims/bg_effects.asm index a510038a5..00eb9a4ce 100644 --- a/engine/battle_anims/bg_effects.asm +++ b/engine/battle_anims/bg_effects.asm @@ -10,7 +10,7 @@ ExecuteBGEffects: ld hl, wActiveBGEffects - ld e, 5 + ld e, NUM_BG_EFFECTS .loop ld a, [hl] and a @@ -23,7 +23,7 @@ ExecuteBGEffects: pop de pop hl .next - ld bc, 4 + ld bc, BG_EFFECT_STRUCT_LENGTH add hl, bc dec e jr nz, .loop @@ -31,12 +31,12 @@ ExecuteBGEffects: QueueBGEffect: ld hl, wActiveBGEffects - ld e, 5 + ld e, NUM_BG_EFFECTS .loop ld a, [hl] and a jr z, .load - ld bc, 4 + ld bc, BG_EFFECT_STRUCT_LENGTH add hl, bc dec e jr nz, .loop diff --git a/engine/battle_anims/core.asm b/engine/battle_anims/core.asm index c5afb53ba..1a63b98e1 100644 --- a/engine/battle_anims/core.asm +++ b/engine/battle_anims/core.asm @@ -1,6 +1,6 @@ QueueBattleAnimation: ld hl, wActiveAnimObjects - ld e, 10 + ld e, NUM_ANIM_OBJECTS .loop ld a, [hl] and a -- cgit v1.2.3 From 80ece33e3e847563188782b76107256fba53088d Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sat, 16 Feb 2019 12:55:15 +0100 Subject: Document wBattleAnimFlags `anim_clearsprites` was misnamed, so I renamed it to `anim_keepsprites`, and documented it in docs/battle_anim_commands.md --- engine/battle_anims/anim_commands.asm | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'engine') diff --git a/engine/battle_anims/anim_commands.asm b/engine/battle_anims/anim_commands.asm index cdb8555bd..135ec31ea 100644 --- a/engine/battle_anims/anim_commands.asm +++ b/engine/battle_anims/anim_commands.asm @@ -128,10 +128,10 @@ RunBattleAnimScript: .done ld a, [wBattleAnimFlags] - bit 0, a + bit BATTLEANIM_STOP_F, a jr z, .playframe - call BattleAnim_ClearCGB_OAMFlags + call BattleAnim_ClearOAM ret BattleAnimClearHud: @@ -232,16 +232,17 @@ Unreferenced_Functioncc220: call BattleAnimDelayFrame ret -BattleAnim_ClearCGB_OAMFlags: +BattleAnim_ClearOAM: ld a, [wBattleAnimFlags] - bit 3, a + bit BATTLEANIM_KEEPSPRITES_F, a jr z, .delete + ; Instead of deleting the sprites, make them all use palette 0 (monochrome) ld hl, wVirtualOAMSprite00Attributes ld c, NUM_SPRITE_OAM_STRUCTS .loop ld a, [hl] - and $f0 + and ~PALETTE_MASK & ~VRAM_BANK_1 ld [hli], a rept SPRITEOAMSTRUCT_LENGTH + -1 inc hl @@ -289,10 +290,10 @@ RunBattleAnimCommand: ; Return from a subroutine. ld hl, wBattleAnimFlags - bit 1, [hl] + bit BATTLEANIM_IN_SUBROUTINE_F, [hl] jr nz, .do_anim - set 0, [hl] + set BATTLEANIM_STOP_F, [hl] ret .not_done_with_anim @@ -361,7 +362,7 @@ BattleAnimCommands:: dw BattleAnimCmd_BGP dw BattleAnimCmd_OBP0 dw BattleAnimCmd_OBP1 - dw BattleAnimCmd_ClearSprites + dw BattleAnimCmd_KeepSprites dw BattleAnimCmd_F5 dw BattleAnimCmd_F6 dw BattleAnimCmd_F7 @@ -382,7 +383,7 @@ BattleAnimCmd_ED: BattleAnimCmd_Ret: ld hl, wBattleAnimFlags - res 1, [hl] + res BATTLEANIM_IN_SUBROUTINE_F, [hl] ld hl, wBattleAnimParent ld e, [hl] inc hl @@ -413,7 +414,7 @@ BattleAnimCmd_Call: inc hl ld [hl], d ld hl, wBattleAnimFlags - set 1, [hl] + set BATTLEANIM_IN_SUBROUTINE_F, [hl] ret BattleAnimCmd_Jump: @@ -430,12 +431,12 @@ BattleAnimCmd_Jump: BattleAnimCmd_Loop: call GetBattleAnimByte ld hl, wBattleAnimFlags - bit 2, [hl] + bit BATTLEANIM_IN_LOOP_F, [hl] jr nz, .continue_loop and a jr z, .perpetual dec a - set 2, [hl] + set BATTLEANIM_IN_LOOP_F, [hl] ld [wBattleAnimLoops], a .continue_loop ld hl, wBattleAnimLoops @@ -456,7 +457,7 @@ BattleAnimCmd_Loop: .return_from_loop ld hl, wBattleAnimFlags - res 2, [hl] + res BATTLEANIM_IN_LOOP_F, [hl] ld hl, wBattleAnimAddress ld e, [hl] inc hl @@ -1155,9 +1156,9 @@ BattleAnimCmd_OAMOff: ldh [hOAMUpdate], a ret -BattleAnimCmd_ClearSprites: +BattleAnimCmd_KeepSprites: ld hl, wBattleAnimFlags - set 3, [hl] + set BATTLEANIM_KEEPSPRITES_F, [hl] ret BattleAnimCmd_F5: -- cgit v1.2.3 From 7d6befa1816110c5518292d4c7cb8841a355dc79 Mon Sep 17 00:00:00 2001 From: mid-kid Date: Sat, 16 Feb 2019 19:08:34 +0100 Subject: Fix issues in review --- engine/battle_anims/core.asm | 6 +++--- engine/battle_anims/helpers.asm | 3 ++- engine/gfx/sprites.asm | 22 +++++++++++----------- 3 files changed, 16 insertions(+), 15 deletions(-) (limited to 'engine') diff --git a/engine/battle_anims/core.asm b/engine/battle_anims/core.asm index 1a63b98e1..171816f38 100644 --- a/engine/battle_anims/core.asm +++ b/engine/battle_anims/core.asm @@ -89,7 +89,7 @@ BattleAnimOAMUpdate: ld hl, wBattleAnimTempOAMFlags ld a, [wBattleAnimTempFrameOAMFlags] xor [hl] - and $e0 ; Keep priority, x flip and y flip flags. + and PRIORITY | Y_FLIP | X_FLIP ld [hl], a pop af @@ -171,7 +171,7 @@ BattleAnimOAMUpdate: or b ld b, a ld a, [wBattleAnimTempPalette] - and $f + and (PRIORITY | Y_FLIP | X_FLIP | OBP_NUM) ^ $ff or b ld [de], a @@ -203,7 +203,7 @@ InitBattleAnimBuffer: add hl, bc ld a, [hl] - and %10000000 + and PRIORITY ld [wBattleAnimTempOAMFlags], a xor a ld [wBattleAnimTempFrameOAMFlags], a diff --git a/engine/battle_anims/helpers.asm b/engine/battle_anims/helpers.asm index 127fe5412..64d43f032 100644 --- a/engine/battle_anims/helpers.asm +++ b/engine/battle_anims/helpers.asm @@ -37,7 +37,7 @@ GetBattleAnimFrame: push af ld a, [hl] push hl - and %00111111 + and (Y_FLIP << 1 | X_FLIP << 1) ^ $ff ld hl, BATTLEANIMSTRUCT_DURATION add hl, bc ld [hl], a @@ -55,6 +55,7 @@ GetBattleAnimFrame: ld hl, BATTLEANIMSTRUCT_DURATION add hl, bc ld [hl], a + ld hl, BATTLEANIMSTRUCT_FRAME add hl, bc dec [hl] diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm index 76519eb62..79cd71671 100644 --- a/engine/gfx/sprites.asm +++ b/engine/gfx/sprites.asm @@ -315,8 +315,8 @@ UpdateAnimFrame: AddOrSubtractY: push hl ld a, [hl] - ld hl, wCurSpriteAddSubFlags - bit 6, [hl] + ld hl, wCurSpriteOAMFlags + bit OAM_Y_FLIP, [hl] jr z, .ok ; 8 - a add $8 @@ -330,8 +330,8 @@ AddOrSubtractY: AddOrSubtractX: push hl ld a, [hl] - ld hl, wCurSpriteAddSubFlags - bit 5, [hl] ; x flip + ld hl, wCurSpriteOAMFlags + bit OAM_X_FLIP, [hl] jr z, .ok ; 8 - a add $8 @@ -343,20 +343,20 @@ AddOrSubtractX: ret GetSpriteOAMAttr: - ld a, [wCurSpriteAddSubFlags] + ld a, [wCurSpriteOAMFlags] ld b, a ld a, [hl] xor b - and $e0 + and PRIORITY | Y_FLIP | X_FLIP ld b, a ld a, [hl] - and $1f + and (PRIORITY | Y_FLIP | X_FLIP) ^ $ff or b ret InitSpriteAnimBuffer: xor a - ld [wCurSpriteAddSubFlags], a + ld [wCurSpriteOAMFlags], a ld hl, SPRITEANIMSTRUCT_TILE_ID add hl, bc ld a, [hli] @@ -436,7 +436,7 @@ GetSpriteAnimFrame: push af ld a, [hl] push hl - and $3f + and (Y_FLIP << 1 | X_FLIP << 1) ^ $ff ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET add hl, bc add [hl] @@ -446,9 +446,9 @@ GetSpriteAnimFrame: pop hl .okay ld a, [hl] - and $c0 + and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "frame" macro srl a - ld [wCurSpriteAddSubFlags], a + ld [wCurSpriteOAMFlags], a pop af ret -- cgit v1.2.3