ref: 771d2efd6569036531d69cf79d9b5aa163341cfc
parent: f9a60cff7a9451e2e8c3bb5db95d89fdba3bf000
parent: 7d6befa1816110c5518292d4c7cb8841a355dc79
author: Rangi <35663410+Rangi42@users.noreply.github.com>
date: Sat Feb 16 08:23:17 EST 2019
Merge pull request #601 from mid-kid/master Exciting adventures down battle animation street!
--- a/constants/battle_anim_constants.asm
+++ b/constants/battle_anim_constants.asm
@@ -25,6 +25,7 @@
const BATTLEANIMSTRUCT_16
const BATTLEANIMSTRUCT_17
BATTLEANIMSTRUCT_LENGTH EQU const_value
+NUM_ANIM_OBJECTS EQU 10 ; see wActiveAnimObjects
; Start tile for battle animation graphics
BATTLEANIM_BASE_TILE EQU 7 * 7 ; Maximum size of a pokemon picture
@@ -816,6 +817,8 @@
const BG_EFFECT_STRUCT_JT_INDEX
const BG_EFFECT_STRUCT_BATTLE_TURN
const BG_EFFECT_STRUCT_03
+BG_EFFECT_STRUCT_LENGTH EQU const_value
+NUM_BG_EFFECTS EQU 5 ; see wActiveBGEffects
; battle palettes
const_def
--- a/constants/wram_constants.asm
+++ b/constants/wram_constants.asm
@@ -123,6 +123,13 @@
ANYTIME EQU MORN | DAY | NITE
+; wBattleAnimFlags:: ; d40f
+ const_def
+ const BATTLEANIM_STOP_F ; 0
+ const BATTLEANIM_IN_SUBROUTINE_F ; 1
+ const BATTLEANIM_IN_LOOP_F ; 2
+ const BATTLEANIM_KEEPSPRITES_F ; 3
+
; wPlayerSpriteSetupFlags:: ; d45b
PLAYERSPRITESETUP_FACING_MASK EQU %11
PLAYERSPRITESETUP_FEMALE_TO_MALE_F EQU 2
--- a/data/battle_anims/framesets.asm
+++ b/data/battle_anims/framesets.asm
@@ -230,11 +230,11 @@
frame BATTLEANIMOAMSET_4C, 2
frame BATTLEANIMOAMSET_4D, 4
frame BATTLEANIMOAMSET_4E, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2
delanim
@@ -243,11 +243,11 @@
frame BATTLEANIMOAMSET_4C, 2, OAM_X_FLIP
frame BATTLEANIMOAMSET_4D, 4, OAM_X_FLIP
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP
delanim
@@ -256,11 +256,11 @@
frame BATTLEANIMOAMSET_4C, 2, OAM_X_FLIP, OAM_Y_FLIP
frame BATTLEANIMOAMSET_4D, 4, OAM_X_FLIP, OAM_Y_FLIP
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_4E, 2, OAM_X_FLIP, OAM_Y_FLIP
delanim
@@ -272,11 +272,11 @@
frame BATTLEANIMOAMSET_50, 1
frame BATTLEANIMOAMSET_51, 1
frame BATTLEANIMOAMSET_52, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2
delanim
@@ -288,11 +288,11 @@
frame BATTLEANIMOAMSET_50, 1, OAM_X_FLIP
frame BATTLEANIMOAMSET_51, 1, OAM_X_FLIP
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP
delanim
@@ -368,13 +368,13 @@
frame BATTLEANIMOAMSET_10, 3
frame BATTLEANIMOAMSET_0F, 3
frame BATTLEANIMOAMSET_12, 1
- dorepeat 1
+ dowait 1
frame BATTLEANIMOAMSET_12, 1
- dorepeat 1
+ dowait 1
frame BATTLEANIMOAMSET_12, 1
- dorepeat 1
+ dowait 1
frame BATTLEANIMOAMSET_12, 1
- dorepeat 1
+ dowait 1
frame BATTLEANIMOAMSET_12, 3
delanim
@@ -535,13 +535,13 @@
frame BATTLEANIMOAMSET_34, 32
frame BATTLEANIMOAMSET_35, 32 ; fallthrough
.Frameset_2f:
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_35, 4
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_35, 4
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_35, 4
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_35, 4
delanim
@@ -579,13 +579,13 @@
.Frameset_35:
frame BATTLEANIMOAMSET_40, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_40, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_41, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_41, 2
- dorepeat 2
+ dowait 2
dorestart
.Frameset_36:
@@ -597,7 +597,7 @@
.Frameset_37:
frame BATTLEANIMOAMSET_19, 2
- dorepeat 2
+ dowait 2
dorestart
.Frameset_38:
@@ -607,7 +607,7 @@
.Frameset_39:
frame BATTLEANIMOAMSET_18, 2
- dorepeat 2
+ dowait 2
dorestart
.Frameset_3a:
@@ -639,15 +639,15 @@
endanim
.Frameset_44:
- dorepeat 20
+ dowait 20
frame BATTLEANIMOAMSET_55, 40
frame BATTLEANIMOAMSET_54, 40
frame BATTLEANIMOAMSET_53, 20
- dorepeat 4
+ dowait 4
frame BATTLEANIMOAMSET_53, 4
- dorepeat 4
+ dowait 4
frame BATTLEANIMOAMSET_53, 4
- dorepeat 4
+ dowait 4
frame BATTLEANIMOAMSET_53, 4
delanim
@@ -658,11 +658,11 @@
delanim
.Frameset_45:
- dorepeat 0
+ dowait 0
frame BATTLEANIMOAMSET_14, 0
frame BATTLEANIMOAMSET_15, 0
frame BATTLEANIMOAMSET_14, 0, OAM_X_FLIP
- dorepeat 0
+ dowait 0
frame BATTLEANIMOAMSET_16, 0, OAM_X_FLIP
frame BATTLEANIMOAMSET_15, 0
frame BATTLEANIMOAMSET_16, 0
@@ -867,7 +867,7 @@
delanim
.Frameset_68:
- dorepeat 15
+ dowait 15
frame BATTLEANIMOAMSET_84, 15
frame BATTLEANIMOAMSET_85, 15
frame BATTLEANIMOAMSET_29, 15
@@ -970,11 +970,11 @@
frame BATTLEANIMOAMSET_9C, 2
frame BATTLEANIMOAMSET_9D, 2
frame BATTLEANIMOAMSET_9E, 8
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_9E, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_9E, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_9E, 2
delanim
@@ -1160,11 +1160,11 @@
frame BATTLEANIMOAMSET_50, 1
frame BATTLEANIMOAMSET_51, 1
frame BATTLEANIMOAMSET_52, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2
delanim
@@ -1178,11 +1178,11 @@
frame BATTLEANIMOAMSET_50, 1, OAM_X_FLIP, OAM_Y_FLIP
frame BATTLEANIMOAMSET_51, 1, OAM_X_FLIP, OAM_Y_FLIP
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP
- dorepeat 2
+ dowait 2
frame BATTLEANIMOAMSET_52, 2, OAM_X_FLIP, OAM_Y_FLIP
delanim
--- a/data/battle_anims/oam.asm
+++ b/data/battle_anims/oam.asm
@@ -1,6 +1,6 @@
BattleAnimOAMData:
; entries correspond to BATTLEANIMOAMSET_* constants
- ; vtile offset, length, pointer
+ ; vtile offset, data length, data pointer
dbbw $00, 16, .OAMData_00 ; BATTLEANIMOAMSET_00
dbbw $04, 9, .OAMData_01 ; BATTLEANIMOAMSET_01
dbbw $08, 4, .OAMData_02 ; BATTLEANIMOAMSET_02
--- a/data/moves/animations.asm
+++ b/data/moves/animations.asm
@@ -398,7 +398,7 @@
anim_jump .Loop
.Click:
- anim_clearsprites
+ anim_keepsprites
anim_ret
.BreakFree:
--- a/data/sprite_anims/framesets.asm
+++ b/data/sprite_anims/framesets.asm
@@ -129,12 +129,12 @@
.Frameset_TextEntryCursor:
frame SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR, 1
- dorepeat 1
+ dowait 1
dorestart
.Frameset_TextEntryCursorBig:
frame SPRITE_ANIM_OAMSET_TEXT_ENTRY_CURSOR_BIG, 1
- dorepeat 1
+ dowait 1
dorestart
.Frameset_GameFreakLogo:
@@ -285,11 +285,11 @@
; unused
frame SPRITE_ANIM_OAMSET_UNUSED_4E, 3
- dorepeat 3
+ dowait 3
dorestart
.Frameset_Unused1C:
- dorepeat 32
+ dowait 32
endanim
.Frameset_Leaf:
@@ -299,9 +299,9 @@
.Frameset_CutTree:
frame SPRITE_ANIM_OAMSET_TREE_1, 2
frame SPRITE_ANIM_OAMSET_CUT_TREE_2, 16
- dorepeat 1
+ dowait 1
frame SPRITE_ANIM_OAMSET_CUT_TREE_3, 1
- dorepeat 1
+ dowait 1
frame SPRITE_ANIM_OAMSET_CUT_TREE_4, 1
delanim
@@ -483,7 +483,7 @@
endanim
.Frameset_IntroUnownF:
- dorepeat 0
+ dowait 0
endanim
.Frameset_CelebiLeft:
--- a/data/sprite_anims/oam.asm
+++ b/data/sprite_anims/oam.asm
@@ -1,6 +1,6 @@
SpriteAnimOAMData:
; entries correspond to SPRITE_ANIM_OAMSET_* constants
- ; vtile offset, pointer
+ ; vtile offset, data pointer
dbw $00, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_RED_WALK_1
dbw $04, .OAMData_RedWalk ; SPRITE_ANIM_OAMSET_RED_WALK_2
dbw $4c, .OAMData_1x1_Palette0 ; SPRITE_ANIM_OAMSET_GS_INTRO_BUBBLE_1
--- a/docs/battle_anim_commands.md
+++ b/docs/battle_anim_commands.md
@@ -91,6 +91,7 @@
- Doesn't work with `anim_4gfx` and `anim_5gfx`.
- This overwrites previously loaded animation graphics if you've loaded more than 53 tiles (2row) or 66 tiles (1row).
+
## `$DB`: `anim_checkpokeball`
Sets `BattleAnimVar` to the result of [GetPokeBallWobble](/engine/battle_anims/pokeball_wobble.asm).
@@ -196,7 +197,11 @@
Sets `rOBP1` to *colors*.
-## `$F4`: `anim_clearsprites`
+## `$F4`: `anim_keepsprites`
+
+Causes only the palettes to be cleared from the OAM memory when the animation ends, instead of clearing all of the OAM memory. This causes all objects to start using palette 0 (monochrome) when the animation script ends, and whatever objects were on the screen before the last `anim_ret` will stay on the screen.
+
+This is only used for the Poke Ball animation.
## `$F5`: `anim_0xf5`
--- a/engine/battle_anims/anim_commands.asm
+++ b/engine/battle_anims/anim_commands.asm
@@ -112,10 +112,10 @@
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
@@ -128,10 +128,10 @@
.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 @@
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
@@ -267,12 +268,12 @@
ret
.CheckTimer:
- ld a, [wBattleAnimDuration]
+ ld a, [wBattleAnimDelay]
and a
jr z, .done
dec a
- ld [wBattleAnimDuration], a
+ ld [wBattleAnimDelay], a
and a
ret
@@ -289,17 +290,17 @@
; 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
- cp $d0
+ cp anim_obj_command
jr nc, .do_anim
- ld [wBattleAnimDuration], a
+ ld [wBattleAnimDelay], a
ret
.do_anim
@@ -310,7 +311,7 @@
.DoCommand:
; Execute battle animation command in [wBattleAnimByte].
ld a, [wBattleAnimByte]
- sub $d0
+ sub anim_obj_command
ld e, a
ld d, 0
@@ -361,7 +362,7 @@
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_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 @@
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_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 @@
.return_from_loop
ld hl, wBattleAnimFlags
- res 2, [hl]
+ res BATTLEANIM_IN_LOOP_F, [hl]
ld hl, wBattleAnimAddress
ld e, [hl]
inc hl
@@ -643,10 +644,13 @@
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 +697,7 @@
BattleAnimCmd_IncObj:
call GetBattleAnimByte
- ld e, 10
+ ld e, NUM_ANIM_OBJECTS
ld bc, wActiveAnimObjects
.loop
ld hl, BATTLEANIMSTRUCT_INDEX
@@ -718,8 +722,8 @@
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 +747,7 @@
BattleAnimCmd_SetObj:
call GetBattleAnimByte
- ld e, 10
+ ld e, NUM_ANIM_OBJECTS
ld bc, wActiveAnimObjects
.loop
ld hl, BATTLEANIMSTRUCT_INDEX
@@ -1152,9 +1156,9 @@
ldh [hOAMUpdate], a
ret
-BattleAnimCmd_ClearSprites:
+BattleAnimCmd_KeepSprites:
ld hl, wBattleAnimFlags
- set 3, [hl]
+ set BATTLEANIM_KEEPSPRITES_F, [hl]
ret
BattleAnimCmd_F5:
@@ -1430,10 +1434,10 @@
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
--- 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 @@
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 @@
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
@@ -416,7 +416,7 @@
.zero
call BGEffect_CheckFlyDigStatus
jr z, .not_flying_digging
- ld hl, wNumActiveBattleAnims
+ ld hl, wLastAnimObjectIndex
inc [hl]
call EndBattleBGEffect
ret
@@ -483,7 +483,7 @@
.zero
call BGEffect_CheckFlyDigStatus
jr z, .not_flying_digging
- ld hl, wNumActiveBattleAnims
+ ld hl, wLastAnimObjectIndex
inc [hl]
call EndBattleBGEffect
ret
--- 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
@@ -15,7 +15,7 @@
.done
ld c, l
ld b, h
- ld hl, wNumActiveBattleAnims
+ ld hl, wLastAnimObjectIndex
inc [hl]
call InitBattleAnimation
ret
@@ -38,7 +38,7 @@
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
@@ -80,32 +80,36 @@
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 PRIORITY | Y_FLIP | X_FLIP
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 @@
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,16 +139,17 @@
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]
@@ -150,6 +156,8 @@
add BATTLEANIM_BASE_TILE
add [hl]
ld [de], a
+
+ ; Attributes
inc hl
inc de
ld a, [wBattleAnimTempOAMFlags]
@@ -156,21 +164,22 @@
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
+ and (PRIORITY | Y_FLIP | X_FLIP | OBP_NUM) ^ $ff
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 @@
ld hl, BATTLEANIMSTRUCT_01
add hl, bc
ld a, [hl]
- and %10000000
+
+ and PRIORITY
ld [wBattleAnimTempOAMFlags], a
xor a
- ld [wBattleAnimTempAddSubFlags], a
+ ld [wBattleAnimTempFrameOAMFlags], a
ld hl, BATTLEANIMSTRUCT_PALETTE
add hl, bc
ld a, [hl]
@@ -217,9 +227,11 @@
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]
@@ -226,6 +238,7 @@
ld [wBattleAnimTempOAMFlags], a
bit 0, [hl]
ret z
+
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hli]
--- a/engine/battle_anims/helpers.asm
+++ b/engine/battle_anims/helpers.asm
@@ -37,7 +37,7 @@
push af
ld a, [hl]
push hl
- and $3f
+ and (Y_FLIP << 1 | X_FLIP << 1) ^ $ff
ld hl, BATTLEANIMSTRUCT_DURATION
add hl, bc
ld [hl], a
@@ -44,9 +44,9 @@
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
@@ -55,6 +55,7 @@
ld hl, BATTLEANIMSTRUCT_DURATION
add hl, bc
ld [hl], a
+
ld hl, BATTLEANIMSTRUCT_FRAME
add hl, bc
dec [hl]
--- a/engine/gfx/sprites.asm
+++ b/engine/gfx/sprites.asm
@@ -315,8 +315,8 @@
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 @@
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 @@
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 @@
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 @@
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
--- a/macros/legacy.asm
+++ b/macros/legacy.asm
@@ -174,3 +174,6 @@
link_wait_button EQUS "text_linkwaitbutton"
current_day EQUS "text_today"
text_jump EQUS "text_far"
+
+; macros/scripts/battle_anims.asm
+anim_clearsprites EQUS "anim_keepsprites"
--- a/macros/scripts/battle_anims.asm
+++ b/macros/scripts/battle_anims.asm
@@ -233,7 +233,7 @@
ENDM
enum anim_clearsprites_command ; $f4
-anim_clearsprites: MACRO
+anim_keepsprites: MACRO
db anim_clearsprites_command
ENDM
--- a/macros/scripts/gfx_anims.asm
+++ b/macros/scripts/gfx_anims.asm
@@ -15,20 +15,20 @@
enum_start $fc
enum delanim_command ; $fc
-delanim: MACRO ; used for oam
+delanim: MACRO
+; Removes the object from the screen, as opposed to `endanim` which just stops all motion
db delanim_command
ENDM
- enum dorepeat_command ; $fd
-dorepeat: MACRO
- db dorepeat_command
- db \1 ; #
+ enum dowait_command ; $fd
+dowait: MACRO
+ db dowait_command
+ db \1 ; frames
ENDM
- enum setrepeat_command ; $fe
-setrepeat: MACRO
- db setrepeat_command
- db \1 ; #
+ enum dorestart_command ; $fe
+dorestart: MACRO
+ db dorestart_command
ENDM
enum endanim_command ; $ff
@@ -36,9 +36,18 @@
db endanim_command
ENDM
-__enum__ = $fe
- enum dorestart_command ; $fe
-dorestart: MACRO ; used for oam
- db dorestart_command
+; Used for pic animations
+__enum__ = $fd
+
+ enum dorepeat_command ; $fd
+dorepeat: MACRO
+ db dorepeat_command
+ db \1 ; command offset to jump to
+ENDM
+
+ enum setrepeat_command ; $fe
+setrepeat: MACRO
+ db setrepeat_command
+ db \1 ; amount of times to repeat
ENDM
--- a/wram.asm
+++ b/wram.asm
@@ -263,7 +263,7 @@
wCurIconTile:: db
wSpriteAnimAddrBackup::
wSpriteAnimIDBuffer::
-wCurSpriteAddSubFlags::
+wCurSpriteOAMFlags::
dw
wCurAnimVTile:: db
wCurAnimXCoord:: db
@@ -3045,11 +3045,11 @@
wBGEffect5:: battle_bg_effect wBGEffect5
wActiveBGEffectsEnd::
-wNumActiveBattleAnims:: db ; d40e
+wLastAnimObjectIndex:: db ; d40e
wBattleAnimFlags:: db ; d40f
wBattleAnimAddress:: dw ; d410
-wBattleAnimDuration:: db ; d412
+wBattleAnimDelay:: db ; d412
wBattleAnimParent:: dw ; d413
wBattleAnimLoops:: db ; d415
wBattleAnimVar:: db ; d416
@@ -3077,7 +3077,7 @@
wBattleAnimTempYCoord:: db
wBattleAnimTempXOffset:: db
wBattleAnimTempYOffset:: db
-wBattleAnimTempAddSubFlags:: db
+wBattleAnimTempFrameOAMFlags:: db
wBattleAnimTempPalette:: db
ENDU ; d422