diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-01-27 12:38:34 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-01-27 12:38:34 -0500 |
commit | 367b86463e21968049e0908a242079fde8fce154 (patch) | |
tree | be84ac6569600e31ad63a48497de2f854b40e28b | |
parent | 2e934469b82a41cb7871c04898547e1a5d58c621 (diff) |
Port smokescreen.c from emerald
-rw-r--r-- | asm/smokescreen.s | 217 | ||||
-rw-r--r-- | data/smokescreen.s | 8 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/smokescreen.c | 73 |
4 files changed, 78 insertions, 222 deletions
diff --git a/asm/smokescreen.s b/asm/smokescreen.s index e0d137767..2428f2984 100644 --- a/asm/smokescreen.s +++ b/asm/smokescreen.s @@ -5,221 +5,4 @@ .text - thumb_func_start SmokescreenImpact -SmokescreenImpact: @ 804A76C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - lsls r0, 16 - lsrs r6, r0, 16 - lsls r1, 16 - lsrs r7, r1, 16 - lsls r2, 24 - lsrs r4, r2, 24 - ldr r5, _0804A8A4 @ =gUnknown_825098C - ldrh r0, [r5, 0x6] - bl GetSpriteTileStartByTag - lsls r0, 16 - ldr r1, _0804A8A8 @ =0xffff0000 - cmp r0, r1 - bne _0804A79E - adds r0, r5, 0 - bl LoadCompressedSpriteSheetUsingHeap - ldr r0, _0804A8AC @ =gUnknown_8250994 - bl LoadCompressedSpritePaletteUsingHeap -_0804A79E: - ldr r0, _0804A8B0 @ =sub_804A8C0 - bl CreateInvisibleSpriteWithCallback - mov r8, r0 - mov r0, r8 - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - lsls r5, r0, 4 - add r5, r8 - lsls r5, 2 - ldr r0, _0804A8B4 @ =gSprites - adds r5, r0 - strh r4, [r5, 0x30] - ldr r0, _0804A8B8 @ =gUnknown_82509F4 - mov r9, r0 - lsls r6, 16 - asrs r0, r6, 16 - mov r10, r0 - ldr r0, _0804A8BC @ =0xfff00000 - adds r6, r0 - asrs r6, 16 - lsls r4, r7, 16 - asrs r7, r4, 16 - adds r4, r0 - asrs r4, 16 - mov r0, r9 - adds r1, r6, 0 - adds r2, r4, 0 - movs r3, 0x2 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - lsls r1, r0, 4 - adds r1, r0 - lsls r1, 2 - ldr r0, _0804A8B4 @ =gSprites - adds r1, r0 - mov r0, r8 - strh r0, [r1, 0x2E] - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - adds r0, r1, 0 - bl AnimateSprite - mov r0, r9 - mov r1, r10 - adds r2, r4, 0 - movs r3, 0x2 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 4 - adds r4, r0 - lsls r4, 2 - ldr r0, _0804A8B4 @ =gSprites - adds r4, r0 - mov r0, r8 - strh r0, [r4, 0x2E] - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - adds r0, r4, 0 - movs r1, 0x1 - bl StartSpriteAnim - adds r0, r4, 0 - bl AnimateSprite - mov r0, r9 - adds r1, r6, 0 - adds r2, r7, 0 - movs r3, 0x2 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 4 - adds r4, r0 - lsls r4, 2 - ldr r0, _0804A8B4 @ =gSprites - adds r4, r0 - mov r0, r8 - strh r0, [r4, 0x2E] - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - adds r0, r4, 0 - movs r1, 0x2 - bl StartSpriteAnim - adds r0, r4, 0 - bl AnimateSprite - mov r0, r9 - mov r1, r10 - adds r2, r7, 0 - movs r3, 0x2 - bl CreateSprite - lsls r0, 24 - lsrs r0, 24 - lsls r4, r0, 4 - adds r4, r0 - lsls r4, 2 - ldr r0, _0804A8B4 @ =gSprites - adds r4, r0 - mov r0, r8 - strh r0, [r4, 0x2E] - ldrh r0, [r5, 0x2E] - adds r0, 0x1 - strh r0, [r5, 0x2E] - adds r0, r4, 0 - movs r1, 0x3 - bl StartSpriteAnim - adds r0, r4, 0 - bl AnimateSprite - mov r0, r8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0804A8A4: .4byte gUnknown_825098C -_0804A8A8: .4byte 0xffff0000 -_0804A8AC: .4byte gUnknown_8250994 -_0804A8B0: .4byte sub_804A8C0 -_0804A8B4: .4byte gSprites -_0804A8B8: .4byte gUnknown_82509F4 -_0804A8BC: .4byte 0xfff00000 - thumb_func_end SmokescreenImpact - - thumb_func_start sub_804A8C0 -sub_804A8C0: @ 804A8C0 - push {r4,lr} - adds r4, r0, 0 - movs r1, 0x2E - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0804A8F8 - ldr r0, _0804A8EC @ =gUnknown_825098C - ldrh r0, [r0, 0x6] - bl FreeSpriteTilesByTag - ldr r0, _0804A8F0 @ =gUnknown_8250994 - ldrh r0, [r0, 0x4] - bl FreeSpritePaletteByTag - movs r1, 0x30 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _0804A8F4 - adds r0, r4, 0 - bl DestroySprite - b _0804A8F8 - .align 2, 0 -_0804A8EC: .4byte gUnknown_825098C -_0804A8F0: .4byte gUnknown_8250994 -_0804A8F4: - ldr r0, _0804A900 @ =SpriteCallbackDummy - str r0, [r4, 0x1C] -_0804A8F8: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0804A900: .4byte SpriteCallbackDummy - thumb_func_end sub_804A8C0 - - thumb_func_start sub_804A904 -sub_804A904: @ 804A904 - push {lr} - adds r3, r0, 0 - adds r0, 0x3F - ldrb r1, [r0] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0804A92E - ldr r2, _0804A934 @ =gSprites - movs r0, 0x2E - ldrsh r1, [r3, r0] - lsls r0, r1, 4 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrh r1, [r0, 0x2E] - subs r1, 0x1 - strh r1, [r0, 0x2E] - adds r0, r3, 0 - bl DestroySprite -_0804A92E: - pop {r0} - bx r0 - .align 2, 0 -_0804A934: .4byte gSprites - thumb_func_end sub_804A904 - .align 2, 0 @ Don't pad with nop. diff --git a/data/smokescreen.s b/data/smokescreen.s index 19dceec00..49b13847b 100644 --- a/data/smokescreen.s +++ b/data/smokescreen.s @@ -3,10 +3,10 @@ .section .rodata .align 2 -gUnknown_825098C:: @ 825098C +gSmokescreenImpactSpriteSheet:: @ 825098C obj_tiles gFile_graphics_battle_anims_sprites_smokescreen_impact_sheet, 0x0180, 55019 -gUnknown_8250994:: @ 8250994 +gSmokescreenImpactSpritePalette:: @ 8250994 obj_pal gFile_graphics_battle_anims_sprites_smokescreen_impact_palette, 55019 gOamData_835099C:: @@ -42,8 +42,8 @@ gSpriteAnimTable_82509E4:: .4byte gAnimCmd_82509C4 .4byte gAnimCmd_82509D4 -gUnknown_82509F4:: @ 82509F4 - spr_template 55019, 55019, gOamData_835099C, gSpriteAnimTable_82509E4, NULL, gDummySpriteAffineAnimTable, sub_804A904 +gSmokescreenImpactSpriteTemplate:: @ 82509F4 + spr_template 55019, 55019, gOamData_835099C, gSpriteAnimTable_82509E4, NULL, gDummySpriteAffineAnimTable, SpriteCB_DestroySprite gSpriteSheet_EnemyShadow:: @ 8250A0C obj_tiles gFile_graphics_battle_interface_enemy_mon_shadow_sheet, 0x0080, 55129 diff --git a/ld_script.txt b/ld_script.txt index 5fbf5616e..021686fcb 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -80,7 +80,7 @@ SECTIONS { src/blend_palette.o(.text); src/daycare.o(.text); src/battle_interface.o(.text); - asm/smokescreen.o(.text); + src/smokescreen.o(.text); src/pokeball.o(.text); src/load_save.o(.text); src/trade.o(.text); 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); + } +} |