summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYamaArashi <shadow962@live.com>2017-04-17 18:45:52 -0700
committerYamaArashi <shadow962@live.com>2017-04-17 18:45:52 -0700
commita5f5ee58244d776a853753f907dfeb6f3ea59923 (patch)
tree077b616c9ae31bfb83a8d631a519b9bd692fdccf
parent33b681e34ef589c82e8cddd17f940ffc98e183c5 (diff)
decompile smokescreen.s
-rw-r--r--asm/smokescreen.s226
-rw-r--r--ld_script.txt2
-rw-r--r--src/smokescreen.c75
3 files changed, 76 insertions, 227 deletions
diff --git a/asm/smokescreen.s b/asm/smokescreen.s
deleted file mode 100644
index 7f4aee269..000000000
--- a/asm/smokescreen.s
+++ /dev/null
@@ -1,226 +0,0 @@
- .include "constants/gba_constants.inc"
- .include "constants/species_constants.inc"
- .include "asm/macros.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_8046234
-sub_8046234: @ 8046234
- 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, _0804636C @ =gUnknown_081FAEA4
- ldrh r0, [r5, 0x6]
- bl GetSpriteTileStartByTag
- lsls r0, 16
- ldr r1, _08046370 @ =0xffff0000
- cmp r0, r1
- bne _08046266
- adds r0, r5, 0
- bl LoadCompressedObjectPic
- ldr r0, _08046374 @ =gUnknown_081FAEAC
- bl LoadCompressedObjectPalette
-_08046266:
- ldr r0, _08046378 @ =sub_8046388
- 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, _0804637C @ =gSprites
- adds r5, r0
- strh r4, [r5, 0x30]
- ldr r0, _08046380 @ =gSpriteTemplate_81FAF0C
- mov r9, r0
- lsls r6, 16
- asrs r0, r6, 16
- mov r10, r0
- ldr r0, _08046384 @ =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, _0804637C @ =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, _0804637C @ =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, _0804637C @ =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, _0804637C @ =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
-_0804636C: .4byte gUnknown_081FAEA4
-_08046370: .4byte 0xffff0000
-_08046374: .4byte gUnknown_081FAEAC
-_08046378: .4byte sub_8046388
-_0804637C: .4byte gSprites
-_08046380: .4byte gSpriteTemplate_81FAF0C
-_08046384: .4byte 0xfff00000
- thumb_func_end sub_8046234
-
- thumb_func_start sub_8046388
-sub_8046388: @ 8046388
- push {r4,lr}
- adds r4, r0, 0
- movs r1, 0x2E
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _080463C0
- ldr r0, _080463B4 @ =gUnknown_081FAEA4
- ldrh r0, [r0, 0x6]
- bl FreeSpriteTilesByTag
- ldr r0, _080463B8 @ =gUnknown_081FAEAC
- ldrh r0, [r0, 0x4]
- bl FreeSpritePaletteByTag
- movs r1, 0x30
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _080463BC
- adds r0, r4, 0
- bl DestroySprite
- b _080463C0
- .align 2, 0
-_080463B4: .4byte gUnknown_081FAEA4
-_080463B8: .4byte gUnknown_081FAEAC
-_080463BC:
- ldr r0, _080463C8 @ =SpriteCallbackDummy
- str r0, [r4, 0x1C]
-_080463C0:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080463C8: .4byte SpriteCallbackDummy
- thumb_func_end sub_8046388
-
- thumb_func_start sub_80463CC
-sub_80463CC: @ 80463CC
- push {lr}
- adds r3, r0, 0
- adds r0, 0x3F
- ldrb r1, [r0]
- movs r0, 0x10
- ands r0, r1
- cmp r0, 0
- beq _080463F6
- ldr r2, _080463FC @ =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
-_080463F6:
- pop {r0}
- bx r0
- .align 2, 0
-_080463FC: .4byte gSprites
- thumb_func_end sub_80463CC
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/ld_script.txt b/ld_script.txt
index 331ea53a4..28f30b110 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -74,7 +74,7 @@ SECTIONS {
asm/daycare.o(.text);
asm/egg_hatch.o(.text);
asm/battle_interface.o(.text);
- asm/smokescreen.o(.text);
+ src/smokescreen.o(.text);
asm/pokeball.o(.text);
src/load_save.o(.text);
asm/trade.o(.text);
diff --git a/src/smokescreen.c b/src/smokescreen.c
new file mode 100644
index 000000000..20808331f
--- /dev/null
+++ b/src/smokescreen.c
@@ -0,0 +1,75 @@
+#include "global.h"
+#include "sprite.h"
+#include "decompress.h"
+
+extern u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *));
+
+static void sub_8046388(struct Sprite *);
+
+extern struct SpriteSheet gUnknown_081FAEA4;
+extern struct SpritePalette gUnknown_081FAEAC;
+extern const struct SpriteTemplate gSpriteTemplate_81FAF0C;
+
+u8 sub_8046234(s16 x, s16 y, u8 a3)
+{
+ u8 mainSpriteId;
+ u8 spriteId1, spriteId2, spriteId3, spriteId4;
+ struct Sprite *mainSprite;
+
+ if (GetSpriteTileStartByTag(gUnknown_081FAEA4.tag) == 0xFFFF)
+ {
+ LoadCompressedObjectPic(&gUnknown_081FAEA4);
+ LoadCompressedObjectPalette(&gUnknown_081FAEAC);
+ }
+
+ mainSpriteId = CreateInvisibleSpriteWithCallback(sub_8046388);
+ mainSprite = &gSprites[mainSpriteId];
+ mainSprite->data1 = a3;
+
+ spriteId1 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y - 16, 2);
+ gSprites[spriteId1].data0 = mainSpriteId;
+ mainSprite->data0++;
+ AnimateSprite(&gSprites[spriteId1]);
+
+ spriteId2 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y - 16, 2);
+ gSprites[spriteId2].data0 = mainSpriteId;
+ mainSprite->data0++;
+ StartSpriteAnim(&gSprites[spriteId2], 1);
+ AnimateSprite(&gSprites[spriteId2]);
+
+ spriteId3 = CreateSprite(&gSpriteTemplate_81FAF0C, x - 16, y, 2);
+ gSprites[spriteId3].data0 = mainSpriteId;
+ mainSprite->data0++;
+ StartSpriteAnim(&gSprites[spriteId3], 2);
+ AnimateSprite(&gSprites[spriteId3]);
+
+ spriteId4 = CreateSprite(&gSpriteTemplate_81FAF0C, x, y, 2);
+ gSprites[spriteId4].data0 = mainSpriteId;
+ mainSprite->data0++;
+ StartSpriteAnim(&gSprites[spriteId4], 3);
+ AnimateSprite(&gSprites[spriteId4]);
+
+ return mainSpriteId;
+}
+
+static void sub_8046388(struct Sprite *sprite)
+{
+ if (!sprite->data0)
+ {
+ FreeSpriteTilesByTag(gUnknown_081FAEA4.tag);
+ FreeSpritePaletteByTag(gUnknown_081FAEAC.tag);
+ if (!sprite->data1)
+ DestroySprite(sprite);
+ else
+ sprite->callback = SpriteCallbackDummy;
+ }
+}
+
+void sub_80463CC(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ {
+ gSprites[sprite->data0].data0--;
+ DestroySprite(sprite);
+ }
+}