diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2020-01-27 12:50:52 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-27 12:50:52 -0500 |
commit | 65690ca7dc880f08a4c63d490797f4b16ce5195e (patch) | |
tree | 9d21d33ddadf5d86b75190e75a4d7eca12af8397 /src | |
parent | 2e934469b82a41cb7871c04898547e1a5d58c621 (diff) | |
parent | e38f52e4359cf895453604b79f1e4466167d2f16 (diff) |
Merge pull request #247 from PikalaxALT/smokescreen
Port smokescreen.c from emerald
Diffstat (limited to 'src')
-rw-r--r-- | src/smokescreen.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/smokescreen.c b/src/smokescreen.c new file mode 100644 index 000000000..2f269737e --- /dev/null +++ b/src/smokescreen.c @@ -0,0 +1,73 @@ +#include "global.h" +#include "decompress.h" +#include "util.h" + +static void SmokescreenImpact_Callback(struct Sprite * sprite); + +extern const struct CompressedSpriteSheet gSmokescreenImpactSpriteSheet; +extern const struct CompressedSpritePalette gSmokescreenImpactSpritePalette; +extern const struct SpriteTemplate gSmokescreenImpactSpriteTemplate; + +u8 SmokescreenImpact(s16 x, s16 y, u8 a3) +{ + u8 mainSpriteId; + u8 spriteId1, spriteId2, spriteId3, spriteId4; + struct Sprite *mainSprite; + + if (GetSpriteTileStartByTag(gSmokescreenImpactSpriteSheet.tag) == 0xFFFF) + { + LoadCompressedSpriteSheetUsingHeap(&gSmokescreenImpactSpriteSheet); + LoadCompressedSpritePaletteUsingHeap(&gSmokescreenImpactSpritePalette); + } + + mainSpriteId = CreateInvisibleSpriteWithCallback(SmokescreenImpact_Callback); + mainSprite = &gSprites[mainSpriteId]; + mainSprite->data[1] = a3; + + spriteId1 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y - 16, 2); + gSprites[spriteId1].data[0] = mainSpriteId; + mainSprite->data[0]++; + AnimateSprite(&gSprites[spriteId1]); + + spriteId2 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y - 16, 2); + gSprites[spriteId2].data[0] = mainSpriteId; + mainSprite->data[0]++; + StartSpriteAnim(&gSprites[spriteId2], 1); + AnimateSprite(&gSprites[spriteId2]); + + spriteId3 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x - 16, y, 2); + gSprites[spriteId3].data[0] = mainSpriteId; + mainSprite->data[0]++; + StartSpriteAnim(&gSprites[spriteId3], 2); + AnimateSprite(&gSprites[spriteId3]); + + spriteId4 = CreateSprite(&gSmokescreenImpactSpriteTemplate, x, y, 2); + gSprites[spriteId4].data[0] = mainSpriteId; + mainSprite->data[0]++; + StartSpriteAnim(&gSprites[spriteId4], 3); + AnimateSprite(&gSprites[spriteId4]); + + return mainSpriteId; +} + +static void SmokescreenImpact_Callback(struct Sprite *sprite) +{ + if (!sprite->data[0]) + { + FreeSpriteTilesByTag(gSmokescreenImpactSpriteSheet.tag); + FreeSpritePaletteByTag(gSmokescreenImpactSpritePalette.tag); + if (!sprite->data[1]) + DestroySprite(sprite); + else + sprite->callback = SpriteCallbackDummy; + } +} + +void SpriteCB_DestroySprite(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + gSprites[sprite->data[0]].data[0]--; + DestroySprite(sprite); + } +} |