summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-01-04 14:54:12 -0800
committerGitHub <noreply@github.com>2018-01-04 14:54:12 -0800
commitb1a7733c1cead8ed3d4a58c42d638afd0ead8ab0 (patch)
tree72a7336f28db1d64f74da1232b0c24b34e022516 /src
parent397f32f29dbcd8fb6ad47afe5ba1ee354ca2b5c7 (diff)
parentff1a79f2fcc111360fe0ce478fdd24cfcdf93932 (diff)
Merge pull request #505 from progreon/master
Decompiled fire.s and fire_2.s
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/fire.c146
-rw-r--r--src/battle/anim/fire_2.c326
-rw-r--r--src/rom_8077ABC.c2
3 files changed, 473 insertions, 1 deletions
diff --git a/src/battle/anim/fire.c b/src/battle/anim/fire.c
new file mode 100644
index 000000000..253236805
--- /dev/null
+++ b/src/battle/anim/fire.c
@@ -0,0 +1,146 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "rom_8077ABC.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+
+void sub_80D5038(struct Sprite *);
+void sub_80D50E8(struct Sprite *);
+
+void sub_80D4ED8(struct Sprite *sprite)
+{
+ sprite->data[0] = gBattleAnimArgs[0];
+ sprite->data[1] = 0x3C;
+ sprite->data[2] = 0x9;
+ sprite->data[3] = 0x1E;
+ sprite->data[4] = 0xFE00;
+
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+
+ sprite->callback = sub_8078174;
+ sub_8078174(sprite);
+}
+
+void sub_80D4F18(struct Sprite *sprite)
+{
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+
+ sprite->callback = sub_8078394;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+void sub_80D4F5C(struct Sprite *sprite)
+{
+ sub_8078650(sprite);
+
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = -gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[4];
+ }
+
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[5];
+
+ sprite->callback = sub_80D5038;
+}
+
+void sub_80D4FCC(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = gBattleAnimArgs[4];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[2] = -gBattleAnimArgs[4];
+ }
+
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->data[3] = gBattleAnimArgs[5];
+
+ sprite->callback = sub_80D5038;
+}
+
+void sub_80D5038(struct Sprite *sprite)
+{
+ if (++sprite->data[0] < sprite->data[4])
+ {
+ sprite->pos2.x += sprite->data[2];
+ sprite->pos2.y += sprite->data[3];
+ }
+
+ if (sprite->data[0] == sprite->data[1])
+ move_anim_8074EE0(sprite);
+}
+
+void sub_80D5074(struct Sprite *sprite)
+{
+ sub_8078650(sprite);
+
+ if (GetBankSide(gAnimBankAttacker))
+ {
+ sprite->pos1.x -= gBattleAnimArgs[0];
+ }
+ else
+ {
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->subpriority = 8;
+ }
+
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->data[4] = gBattleAnimArgs[6];
+ sprite->data[5] = 0;
+
+ sprite->callback = sub_80D50E8;
+}
+
+void sub_80D50E8(struct Sprite *sprite)
+{
+ if (sprite->data[3])
+ {
+ if(sprite->data[5] > 10000)
+ sprite->subpriority = 1;
+
+ sprite->pos2.x = Sin(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8));
+ sprite->pos2.y = Cos(sprite->data[0], sprite->data[1] + (sprite->data[5] >> 8));
+
+ sprite->data[0] += sprite->data[2];
+ sprite->data[5] += sprite->data[4];
+
+ if (sprite->data[0] > 255)
+ sprite->data[0] -= 256;
+ else if (sprite->data[0] < 0)
+ sprite->data[0] += 256;
+
+ sprite->data[3]--;
+ }
+ else
+ {
+ move_anim_8074EE0(sprite);
+ }
+} \ No newline at end of file
diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c
new file mode 100644
index 000000000..6dc304232
--- /dev/null
+++ b/src/battle/anim/fire_2.c
@@ -0,0 +1,326 @@
+#include "global.h"
+#include "battle_anim.h"
+#include "heated_rock.h"
+#include "rom_8077ABC.h"
+#include "task.h"
+#include "trig.h"
+
+extern s16 gBattleAnimArgs[];
+extern u8 gAnimBankAttacker;
+extern u8 gAnimBankTarget;
+extern struct SpriteTemplate gSpriteTemplate_83D96C4;
+extern s16 gHeatedRockCoords[7][2];
+
+void sub_80D5254(struct Sprite *);
+void sub_80D5348(struct Sprite *);
+void sub_80D52AC(struct Sprite *);
+void sub_80D5324(struct Sprite *);
+void sub_80D53F4(struct Sprite *);
+void sub_80D541C(struct Sprite *);
+void sub_80D54E0(u8 taskId);
+void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3);
+
+void sub_80D51A8(struct Sprite *sprite)
+{
+ if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)
+ && (gAnimBankAttacker == GetBankByPlayerAI(2)
+ || gAnimBankAttacker == GetBankByPlayerAI(3)))
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->callback = sub_8079534;
+ sub_8079534(sprite);
+}
+
+struct Sprite *sub_80D5210(struct Sprite *sprite)
+{
+ gBattleAnimArgs[0] = -gBattleAnimArgs[0];
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->callback = sub_8079534;
+ return sprite;
+}
+
+void sub_80D522C(struct Sprite *sprite)
+{
+ sub_80787B0(sprite, 1);
+
+ sprite->data[7] = gBattleAnimArgs[2];
+ sprite->data[0] = 0;
+
+ sprite->callback = sub_80D5254;
+}
+
+void sub_80D5254(struct Sprite *sprite)
+{
+ sub_80D5348(sprite);
+
+ if (++sprite->data[0] == 0x12)
+ {
+ sprite->data[0] = 0x19;
+ sprite->data[1] = sprite->pos1.x;
+ sprite->data[2] = GetBankPosition(gAnimBankTarget, 2);
+ sprite->data[3] = sprite->pos1.y;
+ sprite->data[4] = GetBankPosition(gAnimBankTarget, 3);
+
+ obj_translate_based_on_private_1_2_3_4(sprite);
+
+ sprite->callback = sub_80D52AC;
+ }
+}
+
+void sub_80D52AC(struct Sprite *sprite)
+{
+ if (sub_8078B5C(sprite))
+ {
+ sprite->data[0] = 0;
+
+ sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2);
+ sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3);
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+
+ sprite->callback = sub_80D5324;
+ sub_80D5324(sprite);
+ }
+ else
+ {
+ sprite->pos2.x += Sin(sprite->data[7], 28);
+ sprite->pos2.y += Cos(sprite->data[7], 28);
+
+ sprite->data[7] = (sprite->data[7] + 20) & 0xFF;
+ }
+}
+
+void sub_80D5324(struct Sprite *sprite)
+{
+ sub_80D5348(sprite);
+
+ if (++sprite->data[0] == 0x1F)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D5348(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[7], 28);
+ sprite->pos2.y = Cos(sprite->data[7], 28);
+
+ sprite->data[7] = (sprite->data[7] + 20) & 0xFF;
+}
+
+void sub_80D5374(struct Sprite *sprite)
+{
+ sprite->pos1.x += gBattleAnimArgs[0];
+ sprite->pos1.y += gBattleAnimArgs[1];
+
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+
+ sprite->callback = sub_8078364;
+}
+
+void sub_80D53B4(struct Sprite *sprite)
+{
+ sub_80787B0(sprite, 1);
+
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[0] = gBattleAnimArgs[3];
+
+ sprite->invisible = TRUE;
+ sprite->callback = sub_80782D8;
+
+ StoreSpriteCallbackInData(sprite, sub_80D53F4);
+}
+
+void sub_80D53F4(struct Sprite *sprite)
+{
+ sprite->invisible = FALSE;
+
+ sprite->data[0] = sprite->data[1];
+ sprite->data[1] = 0;
+
+ sprite->callback = sub_80D541C;
+ sub_80D541C(sprite);
+}
+
+void sub_80D541C(struct Sprite *sprite)
+{
+ sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8);
+ sprite->pos2.y = Cos(sprite->data[1], sprite->data[2] >> 8);
+
+ sprite->data[1] = (sprite->data[1] + 10) & 0xFF;
+ sprite->data[2] += 0xD0;
+
+ if (--sprite->data[0] == -1)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D5470(u8 taskId) // initialize animation task for Move_ERUPTION?
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[15] = GetAnimBankSpriteId(0);
+
+ task->data[0] = 0;
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[4] = gSprites[task->data[15]].pos1.y;
+ task->data[5] = GetBankSide(gAnimBankAttacker);
+ task->data[6] = 0;
+
+ sub_8078E70(task->data[15], 0);
+
+ task->func = sub_80D54E0;
+}
+
+void sub_80D54E0(u8 taskId) // animate Move_ERUPTION?
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_8079C08(task, task->data[15], 0x100, 0x100, 0xE0, 0x200, 0x20);
+
+ task->data[0]++;
+ case 1:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+
+ if (++task->data[2] & 0x1)
+ gSprites[task->data[15]].pos2.x = 3;
+ else
+ gSprites[task->data[15]].pos2.x = -3;
+ }
+
+ if (task->data[5])
+ {
+ if (++task->data[3] > 4)
+ {
+ task->data[3] = 0;
+ gSprites[task->data[15]].pos1.y++;
+ }
+ }
+
+ if(!sub_8079C74(task))
+ {
+ sub_8079A64(task->data[15]);
+ gSprites[task->data[15]].pos2.x = 0;
+
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[1] > 4)
+ {
+ if (task->data[5])
+ sub_8079C08(task, task->data[15], 0xE0, 0x200, 0x180, 0xF0, 0x6);
+ else
+ sub_8079C08(task, task->data[15], 0xE0, 0x200, 0x180, 0xC0, 0x6);
+
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ if (!sub_8079C74(task))
+ {
+ sub_80D57C4(task->data[15], taskId, 6);
+
+ task->data[0]++;
+ }
+ break;
+ case 4:
+ if (++task->data[1] > 1)
+ {
+ task->data[1] = 0;
+
+ if (++task->data[2] & 1)
+ gSprites[task->data[15]].pos2.y += 3;
+ else
+ gSprites[task->data[15]].pos2.y -= 3;
+ }
+
+ if (++task->data[3] > 0x18)
+ {
+ if (task->data[5])
+ sub_8079C08(task, task->data[15], 0x180, 0xF0, 0x100, 0x100, 0x8);
+ else
+ sub_8079C08(task, task->data[15], 0x180, 0xC0, 0x100, 0x100, 0x8);
+
+ if (task->data[2] & 1)
+ gSprites[task->data[15]].pos2.y -= 3;
+
+ task->data[1] = 0;
+ task->data[2] = 0;
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 5:
+ if (task->data[5])
+ gSprites[task->data[15]].pos1.y--;
+
+ if (!sub_8079C74(task))
+ {
+ gSprites[task->data[15]].pos1.y = task->data[4];
+ sub_8078F40(task->data[15]);
+
+ task->data[2] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 6:
+ if (!task->data[6])
+ DestroyAnimVisualTask(taskId);
+
+ break;
+ default:
+ }
+}
+
+void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3)
+{
+ u16 i, j;
+ s8 sign;
+
+ u16 y = sub_80D5940(spriteId);
+ u16 x = gSprites[spriteId].pos1.x;
+
+ if(!GetBankSide(gAnimBankAttacker))
+ {
+ x -= 0xC;
+ sign = 1;
+ }
+ else
+ {
+ x += 0x10;
+ sign = -1;
+ }
+
+ for (i = 0, j = 0; i <= 6; i++)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83D96C4, x, y, 2);
+
+ if (spriteId != 0x40)
+ {
+ gSprites[spriteId].oam.tileNum += j * 4 + 0x40;
+
+ if (++j >= 5)
+ j = 0;
+
+ sub_80D5994(&gSprites[spriteId], gHeatedRockCoords[i][0] * sign, gHeatedRockCoords[i][1]);
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = a3;
+
+ gTasks[taskId].data[a3]++;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c
index cf57f8823..9cf28a111 100644
--- a/src/rom_8077ABC.c
+++ b/src/rom_8077ABC.c
@@ -1565,7 +1565,7 @@ void *sub_8079BFC(s16 bottom, s16 top) {
void sub_8079C08(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7) {
task->data[8] = a7;
- task->data[15] = a2;
+ task->data[15] = a2; // spriteId
task->data[9] = a3;
task->data[10] = a4;
task->data[13] = a5;