Sync battle anim - smokescreen

This commit is contained in:
GriffinR
2022-08-17 14:27:42 -04:00
parent f476806547
commit 8601b4fff3
5 changed files with 159 additions and 86 deletions
-55
View File
@@ -1,55 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gSmokescreenImpactSpriteSheet::
obj_tiles gSmokescreenImpactTiles, 0x0180, 55019
gSmokescreenImpactSpritePalette::
obj_pal gSmokescreenImpactPalette, 55019
gOamData_835099C::
.4byte 0x40000000, 0x00000400
gAnimCmd_82509A4::
obj_image_anim_frame 0, 4
obj_image_anim_frame 4, 4
obj_image_anim_frame 8, 4
obj_image_anim_end
gAnimCmd_82509B4::
obj_image_anim_frame 0, 4, OBJ_IMAGE_ANIM_H_FLIP
obj_image_anim_frame 4, 4, OBJ_IMAGE_ANIM_H_FLIP
obj_image_anim_frame 8, 4, OBJ_IMAGE_ANIM_H_FLIP
obj_image_anim_end
gAnimCmd_82509C4::
obj_image_anim_frame 0, 4, OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 4, 4, OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 8, 4, OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_end
gAnimCmd_82509D4::
obj_image_anim_frame 0, 4, OBJ_IMAGE_ANIM_H_FLIP | OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 4, 4, OBJ_IMAGE_ANIM_H_FLIP | OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_frame 8, 4, OBJ_IMAGE_ANIM_H_FLIP | OBJ_IMAGE_ANIM_V_FLIP
obj_image_anim_end
gSpriteAnimTable_82509E4::
.4byte gAnimCmd_82509A4
.4byte gAnimCmd_82509B4
.4byte gAnimCmd_82509C4
.4byte gAnimCmd_82509D4
gSmokescreenImpactSpriteTemplate::
spr_template 55019, 55019, gOamData_835099C, gSpriteAnimTable_82509E4, NULL, gDummySpriteAffineAnimTable, SpriteCB_DestroySprite
gSpriteSheet_EnemyShadow::
obj_tiles gFile_graphics_battle_interface_enemy_mon_shadow_sheet, 0x0080, 55129
gOamData_8250A14::
.4byte 0x40004000, 0x00000c00
gSpriteTemplate_EnemyShadow::
spr_template 55129, 55039, gOamData_8250A14, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCB_SetInvisible
+4
View File
@@ -3687,6 +3687,10 @@ extern const u32 gBattleStatMask8_Pal[];
extern const u32 gBattleStatMask1_Tilemap[]; extern const u32 gBattleStatMask1_Tilemap[];
extern const u32 gBattleStatMask2_Tilemap[]; extern const u32 gBattleStatMask2_Tilemap[];
extern const u32 gSmokescreenImpactTiles[];
extern const u32 gSmokescreenImpactPalette[];
extern const u32 gEnemyMonShadow_Gfx[];
// battle anim particle gfx // battle anim particle gfx
extern const u32 gBattleAnimSpriteGfx_Bone[]; extern const u32 gBattleAnimSpriteGfx_Bone[];
extern const u32 gBattleAnimSpriteGfx_Spark[]; extern const u32 gBattleAnimSpriteGfx_Spark[];
+1 -1
View File
@@ -409,7 +409,7 @@ SECTIONS {
src/battle_util.o(.rodata); src/battle_util.o(.rodata);
src/battle_script_commands.o(.rodata); src/battle_script_commands.o(.rodata);
src/battle_controller_player.o(.rodata); src/battle_controller_player.o(.rodata);
data/battle_anim_smokescreen.o(.rodata); src/battle_anim_smokescreen.o(.rodata);
src/battle_controller_opponent.o(.rodata); src/battle_controller_opponent.o(.rodata);
src/battle_controller_link_opponent.o(.rodata); src/battle_controller_link_opponent.o(.rodata);
src/pokemon.o(.rodata); src/pokemon.o(.rodata);
+153 -29
View File
@@ -1,73 +1,197 @@
#include "global.h" #include "global.h"
#include "battle_gfx_sfx_util.h"
#include "decompress.h" #include "decompress.h"
#include "graphics.h"
#include "util.h" #include "util.h"
static void SmokescreenImpact_Callback(struct Sprite *sprite); #define TAG_SMOKESCREEN 55019
extern const struct CompressedSpriteSheet gSmokescreenImpactSpriteSheet; #define PALTAG_SHADOW 55039
extern const struct CompressedSpritePalette gSmokescreenImpactSpritePalette; #define GFXTAG_SHADOW 55129
extern const struct SpriteTemplate gSmokescreenImpactSpriteTemplate;
u8 SmokescreenImpact(s16 x, s16 y, u8 a3) static void SpriteCB_SmokescreenImpactMain(struct Sprite *);
static void SpriteCB_SmokescreenImpact(struct Sprite *);
static const struct CompressedSpriteSheet sSmokescreenImpactSpriteSheet =
{
.data = gSmokescreenImpactTiles, .size = 0x180, .tag = TAG_SMOKESCREEN
};
static const struct CompressedSpritePalette sSmokescreenImpactSpritePalette =
{
.data = gSmokescreenImpactPalette, .tag = TAG_SMOKESCREEN
};
static const struct OamData sOamData_SmokescreenImpact =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(16x16),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(16x16),
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
.affineParam = 0
};
static const union AnimCmd sAnim_SmokescreenImpact_0[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(4, 4),
ANIMCMD_FRAME(8, 4),
ANIMCMD_END
};
static const union AnimCmd sAnim_SmokescreenImpact_1[] =
{
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
ANIMCMD_FRAME(4, 4, .hFlip = TRUE),
ANIMCMD_FRAME(8, 4, .hFlip = TRUE),
ANIMCMD_END
};
static const union AnimCmd sAnim_SmokescreenImpact_2[] =
{
ANIMCMD_FRAME(0, 4, .vFlip = TRUE),
ANIMCMD_FRAME(4, 4, .vFlip = TRUE),
ANIMCMD_FRAME(8, 4, .vFlip = TRUE),
ANIMCMD_END
};
static const union AnimCmd sAnim_SmokescreenImpact_3[] =
{
ANIMCMD_FRAME(0, 4, .hFlip = TRUE, .vFlip = TRUE),
ANIMCMD_FRAME(4, 4, .hFlip = TRUE, .vFlip = TRUE),
ANIMCMD_FRAME(8, 4, .hFlip = TRUE, .vFlip = TRUE),
ANIMCMD_END
};
static const union AnimCmd *const sAnims_SmokescreenImpact[] =
{
sAnim_SmokescreenImpact_0,
sAnim_SmokescreenImpact_1,
sAnim_SmokescreenImpact_2,
sAnim_SmokescreenImpact_3,
};
static const struct SpriteTemplate sSmokescreenImpactSpriteTemplate =
{
.tileTag = TAG_SMOKESCREEN,
.paletteTag = TAG_SMOKESCREEN,
.oam = &sOamData_SmokescreenImpact,
.anims = sAnims_SmokescreenImpact,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_SmokescreenImpact
};
const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow =
{
.data = gEnemyMonShadow_Gfx, .size = 0x80, .tag = GFXTAG_SHADOW
};
static const struct OamData sOamData_EnemyShadow =
{
.y = 0,
.affineMode = ST_OAM_AFFINE_OFF,
.objMode = ST_OAM_OBJ_NORMAL,
.mosaic = FALSE,
.bpp = ST_OAM_4BPP,
.shape = SPRITE_SHAPE(32x8),
.x = 0,
.matrixNum = 0,
.size = SPRITE_SIZE(32x8),
.tileNum = 0,
.priority = 3,
.paletteNum = 0,
.affineParam = 0
};
const struct SpriteTemplate gSpriteTemplate_EnemyShadow =
{
.tileTag = GFXTAG_SHADOW,
.paletteTag = PALTAG_SHADOW,
.oam = &sOamData_EnemyShadow,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_SetInvisible
};
#define sActiveSprites data[0]
#define sPersist data[1]
#define sMainSpriteId data[0]
u8 SmokescreenImpact(s16 x, s16 y, bool8 persist)
{ {
u8 mainSpriteId; u8 mainSpriteId;
u8 spriteId1, spriteId2, spriteId3, spriteId4; u8 spriteId1, spriteId2, spriteId3, spriteId4;
struct Sprite *mainSprite; struct Sprite *mainSprite;
if (GetSpriteTileStartByTag(gSmokescreenImpactSpriteSheet.tag) == 0xFFFF) if (GetSpriteTileStartByTag(sSmokescreenImpactSpriteSheet.tag) == 0xFFFF)
{ {
LoadCompressedSpriteSheetUsingHeap(&gSmokescreenImpactSpriteSheet); LoadCompressedSpriteSheetUsingHeap(&sSmokescreenImpactSpriteSheet);
LoadCompressedSpritePaletteUsingHeap(&gSmokescreenImpactSpritePalette); LoadCompressedSpritePaletteUsingHeap(&sSmokescreenImpactSpritePalette);
} }
mainSpriteId = CreateInvisibleSpriteWithCallback(SmokescreenImpact_Callback); mainSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_SmokescreenImpactMain);
mainSprite = &gSprites[mainSpriteId]; mainSprite = &gSprites[mainSpriteId];
mainSprite->data[1] = a3; mainSprite->sPersist = persist;
spriteId1 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2); // Top left sprite
gSprites[spriteId1].data[0] = mainSpriteId; spriteId1 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2);
mainSprite->data[0]++; gSprites[spriteId1].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
AnimateSprite(&gSprites[spriteId1]); AnimateSprite(&gSprites[spriteId1]);
spriteId2 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y - 16, 2); // Top right sprite
gSprites[spriteId2].data[0] = mainSpriteId; spriteId2 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y - 16, 2);
mainSprite->data[0]++; gSprites[spriteId2].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
StartSpriteAnim(&gSprites[spriteId2], 1); StartSpriteAnim(&gSprites[spriteId2], 1);
AnimateSprite(&gSprites[spriteId2]); AnimateSprite(&gSprites[spriteId2]);
spriteId3 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y, 2); // Bottom left sprite
gSprites[spriteId3].data[0] = mainSpriteId; spriteId3 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y, 2);
mainSprite->data[0]++; gSprites[spriteId3].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
StartSpriteAnim(&gSprites[spriteId3], 2); StartSpriteAnim(&gSprites[spriteId3], 2);
AnimateSprite(&gSprites[spriteId3]); AnimateSprite(&gSprites[spriteId3]);
spriteId4 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y, 2); // Bottom right sprite
gSprites[spriteId4].data[0] = mainSpriteId; spriteId4 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y, 2);
mainSprite->data[0]++; gSprites[spriteId4].sMainSpriteId = mainSpriteId;
mainSprite->sActiveSprites++;
StartSpriteAnim(&gSprites[spriteId4], 3); StartSpriteAnim(&gSprites[spriteId4], 3);
AnimateSprite(&gSprites[spriteId4]); AnimateSprite(&gSprites[spriteId4]);
return mainSpriteId; return mainSpriteId;
} }
static void SmokescreenImpact_Callback(struct Sprite *sprite) static void SpriteCB_SmokescreenImpactMain(struct Sprite *sprite)
{ {
if (!sprite->data[0]) if (sprite->sActiveSprites == 0)
{ {
FreeSpriteTilesByTag(gSmokescreenImpactSpriteSheet.tag); FreeSpriteTilesByTag(sSmokescreenImpactSpriteSheet.tag);
FreeSpritePaletteByTag(gSmokescreenImpactSpritePalette.tag); FreeSpritePaletteByTag(sSmokescreenImpactSpritePalette.tag);
if (!sprite->data[1]) if (!sprite->sPersist)
DestroySprite(sprite); DestroySprite(sprite);
else else
sprite->callback = SpriteCallbackDummy; sprite->callback = SpriteCallbackDummy;
} }
} }
void SpriteCB_DestroySprite(struct Sprite *sprite) static void SpriteCB_SmokescreenImpact(struct Sprite *sprite)
{ {
if (sprite->animEnded) if (sprite->animEnded)
{ {
gSprites[sprite->data[0]].data[0]--; gSprites[sprite->sMainSpriteId].sActiveSprites--;
DestroySprite(sprite); DestroySprite(sprite);
} }
} }
+1 -1
View File
@@ -1021,7 +1021,7 @@ const u32 gBattleAnimSpritePal_Protect[] = INCBIN_U32("graphics/battle_anims/spr
const u32 gBattleAnimBgPalette_MuddyWater[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_muddy.gbapal.lz"); const u32 gBattleAnimBgPalette_MuddyWater[] = INCBIN_U32("graphics/battle_anims/backgrounds/water_muddy.gbapal.lz");
const u32 gFile_graphics_battle_interface_enemy_mon_shadow_sheet[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz"); const u32 gEnemyMonShadow_Gfx[] = INCBIN_U32("graphics/battle_interface/enemy_mon_shadow.4bpp.lz");
const u32 gFile_graphics_battle_interface_ball_status_bar_sheet[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz"); const u32 gFile_graphics_battle_interface_ball_status_bar_sheet[] = INCBIN_U32("graphics/battle_interface/ball_status_bar.4bpp.lz");