diff --git a/data/battle_anim_smokescreen.s b/data/battle_anim_smokescreen.s deleted file mode 100644 index 3a4a46558..000000000 --- a/data/battle_anim_smokescreen.s +++ /dev/null @@ -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 diff --git a/include/graphics.h b/include/graphics.h index f26373307..d520741dc 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -3687,6 +3687,10 @@ extern const u32 gBattleStatMask8_Pal[]; extern const u32 gBattleStatMask1_Tilemap[]; extern const u32 gBattleStatMask2_Tilemap[]; +extern const u32 gSmokescreenImpactTiles[]; +extern const u32 gSmokescreenImpactPalette[]; +extern const u32 gEnemyMonShadow_Gfx[]; + // battle anim particle gfx extern const u32 gBattleAnimSpriteGfx_Bone[]; extern const u32 gBattleAnimSpriteGfx_Spark[]; diff --git a/ld_script.txt b/ld_script.txt index 7006d3094..e3048c656 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -409,7 +409,7 @@ SECTIONS { src/battle_util.o(.rodata); src/battle_script_commands.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_link_opponent.o(.rodata); src/pokemon.o(.rodata); diff --git a/src/battle_anim_smokescreen.c b/src/battle_anim_smokescreen.c index c1d30a347..821884baa 100644 --- a/src/battle_anim_smokescreen.c +++ b/src/battle_anim_smokescreen.c @@ -1,73 +1,197 @@ #include "global.h" +#include "battle_gfx_sfx_util.h" #include "decompress.h" +#include "graphics.h" #include "util.h" -static void SmokescreenImpact_Callback(struct Sprite *sprite); +#define TAG_SMOKESCREEN 55019 -extern const struct CompressedSpriteSheet gSmokescreenImpactSpriteSheet; -extern const struct CompressedSpritePalette gSmokescreenImpactSpritePalette; -extern const struct SpriteTemplate gSmokescreenImpactSpriteTemplate; +#define PALTAG_SHADOW 55039 +#define GFXTAG_SHADOW 55129 -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 spriteId1, spriteId2, spriteId3, spriteId4; struct Sprite *mainSprite; - if (GetSpriteTileStartByTag(gSmokescreenImpactSpriteSheet.tag) == 0xFFFF) + if (GetSpriteTileStartByTag(sSmokescreenImpactSpriteSheet.tag) == 0xFFFF) { - LoadCompressedSpriteSheetUsingHeap(&gSmokescreenImpactSpriteSheet); - LoadCompressedSpritePaletteUsingHeap(&gSmokescreenImpactSpritePalette); + LoadCompressedSpriteSheetUsingHeap(&sSmokescreenImpactSpriteSheet); + LoadCompressedSpritePaletteUsingHeap(&sSmokescreenImpactSpritePalette); } - mainSpriteId = CreateInvisibleSpriteWithCallback(SmokescreenImpact_Callback); + mainSpriteId = CreateInvisibleSpriteWithCallback(SpriteCB_SmokescreenImpactMain); mainSprite = &gSprites[mainSpriteId]; - mainSprite->data[1] = a3; + mainSprite->sPersist = persist; - spriteId1 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2); - gSprites[spriteId1].data[0] = mainSpriteId; - mainSprite->data[0]++; + // Top left sprite + spriteId1 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2); + gSprites[spriteId1].sMainSpriteId = mainSpriteId; + mainSprite->sActiveSprites++; AnimateSprite(&gSprites[spriteId1]); - spriteId2 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y - 16, 2); - gSprites[spriteId2].data[0] = mainSpriteId; - mainSprite->data[0]++; + // Top right sprite + spriteId2 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y - 16, 2); + gSprites[spriteId2].sMainSpriteId = mainSpriteId; + mainSprite->sActiveSprites++; StartSpriteAnim(&gSprites[spriteId2], 1); AnimateSprite(&gSprites[spriteId2]); - spriteId3 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y, 2); - gSprites[spriteId3].data[0] = mainSpriteId; - mainSprite->data[0]++; + // Bottom left sprite + spriteId3 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x - 16, y, 2); + gSprites[spriteId3].sMainSpriteId = mainSpriteId; + mainSprite->sActiveSprites++; StartSpriteAnim(&gSprites[spriteId3], 2); AnimateSprite(&gSprites[spriteId3]); - spriteId4 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y, 2); - gSprites[spriteId4].data[0] = mainSpriteId; - mainSprite->data[0]++; + // Bottom right sprite + spriteId4 = CreateSprite(&sSmokescreenImpactSpriteTemplate, x, y, 2); + gSprites[spriteId4].sMainSpriteId = mainSpriteId; + mainSprite->sActiveSprites++; StartSpriteAnim(&gSprites[spriteId4], 3); AnimateSprite(&gSprites[spriteId4]); 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); - FreeSpritePaletteByTag(gSmokescreenImpactSpritePalette.tag); - if (!sprite->data[1]) + FreeSpriteTilesByTag(sSmokescreenImpactSpriteSheet.tag); + FreeSpritePaletteByTag(sSmokescreenImpactSpritePalette.tag); + if (!sprite->sPersist) DestroySprite(sprite); else sprite->callback = SpriteCallbackDummy; } } -void SpriteCB_DestroySprite(struct Sprite *sprite) +static void SpriteCB_SmokescreenImpact(struct Sprite *sprite) { if (sprite->animEnded) { - gSprites[sprite->data[0]].data[0]--; + gSprites[sprite->sMainSpriteId].sActiveSprites--; DestroySprite(sprite); } } diff --git a/src/graphics.c b/src/graphics.c index b7694f158..85405cc35 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -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 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");