From 4a01c3233aa8758a9a56fa419642c8bc4590d09a Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Thu, 4 Jan 2018 04:15:17 +0100 Subject: Decompiled poison.s --- src/battle/anim/poison.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++ src/rom_8077ABC.c | 4 +- 2 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 src/battle/anim/poison.c (limited to 'src') diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c new file mode 100644 index 000000000..c53fb2a8b --- /dev/null +++ b/src/battle/anim/poison.c @@ -0,0 +1,115 @@ +#include "global.h" +#include "battle_anim.h" +#include "rom_8077ABC.h" +#include "trig.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; + +void sub_80D9DD4(struct Sprite *sprite); +void sub_80D9E78(struct Sprite *sprite); +void sub_80D9EE8(struct Sprite *sprite); +void sub_80D9FF0(struct Sprite *sprite); + +void sub_80D9D70(struct Sprite *sprite) { + if (!gBattleAnimArgs[3]) { + StartSpriteAnim(sprite, 2); + } + sub_80787B0(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + sprite->data[5] = -30; + sub_80786EC(sprite); + sprite->callback = sub_80D9DD4; +} + +void sub_80D9DD4(struct Sprite *sprite) { + if (sub_8078718(sprite)) { + DestroyAnimSprite(sprite); + } +} + +void sub_80D9DF0(struct Sprite *sprite) { + s16 l1, l2; + if (!gBattleAnimArgs[3]) { + StartSpriteAnim(sprite, 2); + } + sub_80787B0(sprite, 1); + sub_807A3FC(gAnimBankTarget, 1, &l1, &l2); + if (GetBankSide(gAnimBankAttacker)) { + gBattleAnimArgs[4] = -gBattleAnimArgs[4]; + } + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[2] = l1 + gBattleAnimArgs[4]; + sprite->data[4] = l2 + gBattleAnimArgs[5]; + sprite->data[5] = -30; + sub_80786EC(sprite); + sprite->callback = sub_80D9E78; +} + +void sub_80D9E78(struct Sprite *sprite) { + if (sub_8078718(sprite)) { + DestroyAnimSprite(sprite); + } +} + +void sub_80D9E94(struct Sprite *sprite) { + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + sub_8078A5C(sprite); + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; + sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + sprite->callback = sub_80D9EE8; +} + +void sub_80D9EE8(struct Sprite *sprite) { + sub_8078394(sprite); + sprite->data[1] -= sprite->data[5]; + sprite->data[2] -= sprite->data[6]; + if (!sprite->data[0]) { + DestroyAnimSprite(sprite); + } +} + +void sub_80D9F14(struct Sprite *sprite) { + sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + if (GetBankSide(gAnimBankAttacker)) { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; + sprite->data[4] = sprite->pos1.y + sprite->data[0]; + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +void sub_80D9F88(struct Sprite *sprite) { + if (!gBattleAnimArgs[2]) { + sub_8078764(sprite, TRUE); + } else { + sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); + if (GetBankSide(gAnimBankAttacker)) { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + sprite->pos1.x += gBattleAnimArgs[0]; + sprite->pos1.y += gBattleAnimArgs[1]; + } + sprite->callback = sub_80D9FF0; +} + +void sub_80D9FF0(struct Sprite *sprite) { + sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; + sprite->pos2.x = Sin(sprite->data[0], 4); + sprite->data[1] += 0x30; + sprite->pos2.y = -(sprite->data[1] >> 8); + if (sprite->affineAnimEnded) { + DestroyAnimSprite(sprite); + } +} \ No newline at end of file diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 9cf28a111..667f74a25 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -698,7 +698,7 @@ void oamt_add_pos2_onto_pos1(struct Sprite *sprite) { sprite->pos2.y = 0; } -void sub_8078764(struct Sprite *sprite, u8 a2) { +void sub_8078764(struct Sprite *sprite, bool8 a2) { if (!a2) { sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 0); sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 1); @@ -1841,7 +1841,7 @@ int sub_807A100(u8 slot, u8 a2) { } } -void sub_807A3FC(u8 slot, u8 a2, s16 *a3, s16 *a4) { +void sub_807A3FC(u8 slot, bool8 a2, s16 *a3, s16 *a4) { u8 v1, v2; s16 v3, v4; s16 v5, v6; -- cgit v1.2.3 From 5588053754c2f1e293123cb1b793b867848f7c04 Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Thu, 4 Jan 2018 23:05:01 +0100 Subject: Formatted to fit with the rest of the source code --- src/battle/anim/poison.c | 83 +++++++++++++++++++++++++++++++----------------- 1 file changed, 54 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c index c53fb2a8b..f31c441fb 100644 --- a/src/battle/anim/poison.c +++ b/src/battle/anim/poison.c @@ -12,104 +12,129 @@ void sub_80D9E78(struct Sprite *sprite); void sub_80D9EE8(struct Sprite *sprite); void sub_80D9FF0(struct Sprite *sprite); -void sub_80D9D70(struct Sprite *sprite) { - if (!gBattleAnimArgs[3]) { +void sub_80D9D70(struct Sprite *sprite) +{ + if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); - } + sub_80787B0(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); sprite->data[5] = -30; + sub_80786EC(sprite); + sprite->callback = sub_80D9DD4; } -void sub_80D9DD4(struct Sprite *sprite) { - if (sub_8078718(sprite)) { +void sub_80D9DD4(struct Sprite *sprite) // same as sub_80D9E78 +{ + if (sub_8078718(sprite)) DestroyAnimSprite(sprite); - } } -void sub_80D9DF0(struct Sprite *sprite) { +void sub_80D9DF0(struct Sprite *sprite) +{ s16 l1, l2; - if (!gBattleAnimArgs[3]) { + if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); - } + sub_80787B0(sprite, 1); sub_807A3FC(gAnimBankTarget, 1, &l1, &l2); - if (GetBankSide(gAnimBankAttacker)) { + + if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[4] = -gBattleAnimArgs[4]; - } + sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = l1 + gBattleAnimArgs[4]; sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[5] = -30; + sub_80786EC(sprite); + sprite->callback = sub_80D9E78; } -void sub_80D9E78(struct Sprite *sprite) { - if (sub_8078718(sprite)) { +void sub_80D9E78(struct Sprite *sprite) // same as sub_80D9DD4 +{ + if (sub_8078718(sprite)) DestroyAnimSprite(sprite); - } } -void sub_80D9E94(struct Sprite *sprite) { +void sub_80D9E94(struct Sprite *sprite) +{ sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + sub_8078A5C(sprite); + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + sprite->callback = sub_80D9EE8; } -void sub_80D9EE8(struct Sprite *sprite) { +void sub_80D9EE8(struct Sprite *sprite) +{ sub_8078394(sprite); + sprite->data[1] -= sprite->data[5]; sprite->data[2] -= sprite->data[6]; - if (!sprite->data[0]) { + + if (!sprite->data[0]) DestroyAnimSprite(sprite); - } } -void sub_80D9F14(struct Sprite *sprite) { +void sub_80D9F14(struct Sprite *sprite) +{ sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); - if (GetBankSide(gAnimBankAttacker)) { + + if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; - } + sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; sprite->data[4] = sprite->pos1.y + sprite->data[0]; + sprite->callback = sub_8078B34; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } -void sub_80D9F88(struct Sprite *sprite) { - if (!gBattleAnimArgs[2]) { +void sub_80D9F88(struct Sprite *sprite) +{ + if (!gBattleAnimArgs[2]) + { sub_8078764(sprite, TRUE); - } else { + } + else + { sub_807A3FC(gAnimBankTarget, TRUE, &sprite->pos1.x, &sprite->pos1.y); - if (GetBankSide(gAnimBankAttacker)) { + + if (GetBankSide(gAnimBankAttacker)) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; - } + sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; } + sprite->callback = sub_80D9FF0; } -void sub_80D9FF0(struct Sprite *sprite) { +void sub_80D9FF0(struct Sprite *sprite) +{ sprite->data[0] = (sprite->data[0] + 0xB) & 0xFF; sprite->pos2.x = Sin(sprite->data[0], 4); sprite->data[1] += 0x30; sprite->pos2.y = -(sprite->data[1] >> 8); - if (sprite->affineAnimEnded) { + + if (sprite->affineAnimEnded) DestroyAnimSprite(sprite); - } } \ No newline at end of file -- cgit v1.2.3 From 0bbbc1c6dfc6c2b8646276de94cedab9ddc8bc4b Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Sat, 6 Jan 2018 00:06:06 +0100 Subject: Started decompiling wisp_fire.s --- src/battle/anim/wisp_fire.c | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/battle/anim/wisp_fire.c (limited to 'src') diff --git a/src/battle/anim/wisp_fire.c b/src/battle/anim/wisp_fire.c new file mode 100644 index 000000000..e31c15d9c --- /dev/null +++ b/src/battle/anim/wisp_fire.c @@ -0,0 +1,48 @@ +#include "global.h" +#include "battle_anim.h" +#include "main.h" +#include "rom_8077ABC.h" +#include "trig.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankTarget; +// extern u8 gAnimBankAttacker; + +void sub_80D5CC0(struct Sprite *sprite) +{ + if (!sprite->data[0]) + { + sprite->data[1] = gBattleAnimArgs[0]; + sprite->data[0] += 1; + } + + sprite->data[3] += 0xC0 * 2; + sprite->data[4] += 0xA0; + + sprite->pos2.x = Sin(sprite->data[1], sprite->data[3] >> 8); + sprite->pos2.y = Cos(sprite->data[1], sprite->data[4] >> 8); + + sprite->data[1] = (sprite->data[1] + 7) & 0xFF; + + if (gMain.inBattle) + if ((u16) (sprite->data[1] - 0x40) > 0x83) + sprite->oam.priority = sub_8079ED4(gAnimBankTarget); + else + sprite->oam.priority = sub_8079ED4(gAnimBankTarget) + 1; + else + if ((u16) (sprite->data[1] - 0x40) > 0x83) + sprite->subpriority = 0x1D; + else + sprite->subpriority = 0x1F; + + if (++sprite->data[2] > 0x14) + sprite->invisible ^= 1; + + if (sprite->data[2] == 0x1E) + DestroyAnimSprite(sprite); +} + +// void sub_80D5DDC(struct Sprite *sprite) +// { + +// } \ No newline at end of file -- cgit v1.2.3 From 344b8bffbb969cca8b1c23ddf994c0c8ec6fe1f8 Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Sat, 6 Jan 2018 22:41:38 +0100 Subject: Finished decompiling wisp_fire --- src/battle/anim/wisp_fire.c | 160 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 154 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/battle/anim/wisp_fire.c b/src/battle/anim/wisp_fire.c index e31c15d9c..348ce6426 100644 --- a/src/battle/anim/wisp_fire.c +++ b/src/battle/anim/wisp_fire.c @@ -1,12 +1,20 @@ #include "global.h" #include "battle_anim.h" +#include "blend_palette.h" #include "main.h" #include "rom_8077ABC.h" +#include "task.h" #include "trig.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankTarget; -// extern u8 gAnimBankAttacker; +extern u8 gAnimBankAttacker; + +extern u8 gObjectBankIDs[]; +extern s8 gUnknown_083D9794[16]; +extern s8 gUnknown_083D97A4[16]; + +void sub_80D5E4C(u8 taskId); void sub_80D5CC0(struct Sprite *sprite) { @@ -25,15 +33,19 @@ void sub_80D5CC0(struct Sprite *sprite) sprite->data[1] = (sprite->data[1] + 7) & 0xFF; if (gMain.inBattle) - if ((u16) (sprite->data[1] - 0x40) > 0x83) + { + if (sprite->data[1] < 64 || sprite->data[1] > 195) sprite->oam.priority = sub_8079ED4(gAnimBankTarget); else sprite->oam.priority = sub_8079ED4(gAnimBankTarget) + 1; + } else - if ((u16) (sprite->data[1] - 0x40) > 0x83) + { + if (sprite->data[1] < 64 || sprite->data[1] > 195) sprite->subpriority = 0x1D; else sprite->subpriority = 0x1F; + } if (++sprite->data[2] > 0x14) sprite->invisible ^= 1; @@ -42,7 +54,143 @@ void sub_80D5CC0(struct Sprite *sprite) DestroyAnimSprite(sprite); } -// void sub_80D5DDC(struct Sprite *sprite) -// { +void sub_80D5DDC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[12] = !GetBankSide(gAnimBankAttacker) ? 1 : -1; + task->data[13] = IsAnimBankSpriteVisible(gAnimBankTarget ^ 2) + 1; + task->data[14] = GetAnimBankSpriteId(1); + task->data[15] = GetAnimBankSpriteId(3); + + task->func = sub_80D5E4C; +} + +void sub_80D5E4C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + task->data[10] += task->data[12] * 2; + if (++task->data[1] >= 2) + { + task->data[1] = 0; + task->data[2]++; + if (task->data[2] & 1) + task->data[11] = 2; + else + task->data[11] = -2; + } + + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = task->data[10] + task->data[11]; + } + + if (++task->data[9] == 16) + { + task->data[9] = 0; + task->data[0]++; + } + break; + case 1: + if (++task->data[1] >= 5) + { + task->data[1] = 0; + task->data[2]++; + + if (task->data[2] & 1) + task->data[11] = 2; + else + task->data[11] = -2; + } + + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = task->data[10] + task->data[11]; + } + + if (++task->data[9] == 96) + { + task->data[9] = 0; + task->data[0]++; + } + break; + case 2: + task->data[10] -= task->data[12] * 2; + + if (++task->data[1] >= 2) + { + task->data[1] = 0; + task->data[2]++; + + if (task->data[2] & 1) + task->data[11] = 2; + else + task->data[11] = -2; + } -// } \ No newline at end of file + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = task->data[10] + task->data[11]; + } + + if (++task->data[9] == 16) + { + task->data[0]++; + } + break; + case 3: + for (task->data[3] = 0; task->data[3] < task->data[13]; task->data[3]++) + { + gSprites[task->data[task->data[3] + 14]].pos2.x = 0; + } + + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80D6080(u8 taskId) +{ + struct Struct_sub_8078914 unk; + sub_8078914(&unk); + BlendPalette(unk.field_8 << 4, 16, gBattleAnimArgs[0], gBattleAnimArgs[1]); // u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor + DestroyAnimVisualTask(taskId); +} + +void sub_80D60B4(u8 taskId) +{ + s8 unk; + u8 spriteId; + + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].data[4] = gBattleAnimArgs[3]; + } + gTasks[taskId].data[0]++; + + spriteId = gObjectBankIDs[gAnimBankTarget]; + + if (!gTasks[taskId].data[4]) + unk = gUnknown_083D9794[gTasks[taskId].data[0] % 10]; + else + unk = gUnknown_083D97A4[gTasks[taskId].data[0] % 10]; + + if (gTasks[taskId].data[3] == 1) + gSprites[spriteId].pos2.y = gBattleAnimArgs[1] * unk < 0 ? -(gBattleAnimArgs[1] * unk) : gBattleAnimArgs[1] * unk; + else + gSprites[spriteId].pos2.x = gBattleAnimArgs[1] * unk; + + if (gTasks[taskId].data[0] == gTasks[taskId].data[1]) + { + gSprites[spriteId].pos2.x = 0; + gSprites[spriteId].pos2.y = 0; + DestroyAnimVisualTask(taskId); + } +} \ No newline at end of file -- cgit v1.2.3 From 66bf3cc2bbe16dd2b51bb76b2cae9e15272a6a34 Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Tue, 9 Jan 2018 18:43:52 +0100 Subject: Started decompiling bug.s --- src/battle/anim/bug.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 src/battle/anim/bug.c (limited to 'src') diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c new file mode 100644 index 000000000..e9372ed9e --- /dev/null +++ b/src/battle/anim/bug.c @@ -0,0 +1,105 @@ +#include "global.h" +#include "battle_anim.h" +#include "contest.h" +#include "rom_8077ABC.h" +#include "trig.h" +// #include "util.h" + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; + +static void sub_80DCA38(struct Sprite *sprite); + +// used in Move_MEGAHORN +void sub_80DC824(struct Sprite *sprite) +{ + if (IsContest()) + { + StartSpriteAffineAnim(sprite, 2); + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + else if (!GetBankSide(gAnimBankTarget)) + { + StartSpriteAffineAnim(sprite, 1); + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + + sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 3) + gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[4]; + + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +// used in Move_LEECH_LIFE +void sub_80DC8F4(struct Sprite *sprite) +{ + if (IsContest()) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + StartSpriteAffineAnim(sprite, 2); + } + else if (!GetBankSide(gAnimBankTarget)) + { + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + } + + sprite->pos1.x = sub_8077EE4(gAnimBankTarget, 2) + gBattleAnimArgs[0]; + sprite->pos1.y = sub_8077EE4(gAnimBankTarget, 3) + gBattleAnimArgs[1]; + sprite->data[0] = gBattleAnimArgs[2]; + + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +// used in 2 moves: +// Move_STRING_SHOT, Move_SPIDER_WEB +void sub_80DC9A0(struct Sprite *sprite) +{ + if (IsContest()) + gBattleAnimArgs[2] /= 2; + + sub_80787B0(sprite, 1); + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[3] = sprite->pos1.y; + + if (!gBattleAnimArgs[4]) + { + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2); + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3); + } + else + { + sub_807A3FC(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + } + + sub_8078BD4(sprite); + sprite->data[5] = gBattleAnimArgs[3]; + sprite->callback = sub_80DCA38; +} + +static void sub_80DCA38(struct Sprite *sprite) +{ + if (sub_8078B5C(sprite)) + { + DestroyAnimSprite(sprite); + return; + } + + sprite->pos2.x += Sin(sprite->data[6], sprite->data[5]); + sprite->data[6] = (sprite->data[6] + 13) & 0xFF; +} \ No newline at end of file -- cgit v1.2.3 From 8d7f3f65635bba4f9550e9206564c0724b88dd2e Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Wed, 10 Jan 2018 01:15:15 +0100 Subject: finished decompiling bug.s with nonmatching --- src/battle/anim/bug.c | 314 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 313 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index e9372ed9e..3736a86a8 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -10,6 +10,10 @@ extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; static void sub_80DCA38(struct Sprite *sprite); +static void sub_80DCAEC(struct Sprite *sprite); +static void sub_80DCB5C(struct Sprite *sprite); +static void sub_80DCBB4(struct Sprite *sprite); +void sub_80DCD78(struct Sprite *sprite); // used in Move_MEGAHORN void sub_80DC824(struct Sprite *sprite) @@ -102,4 +106,312 @@ static void sub_80DCA38(struct Sprite *sprite) sprite->pos2.x += Sin(sprite->data[6], sprite->data[5]); sprite->data[6] = (sprite->data[6] + 13) & 0xFF; -} \ No newline at end of file +} + +// used in Move_STRING_SHOT +void sub_80DCA70(struct Sprite *sprite) +{ + sub_807A3FC(gAnimBankTarget, 0, &sprite->pos1.x, &sprite->pos1.y); + if (GetBankSide(gAnimBankAttacker)) + sprite->pos1.x -= gBattleAnimArgs[0]; + else + sprite->pos1.x += gBattleAnimArgs[0]; + + sprite->pos1.y += gBattleAnimArgs[1]; + if (!GetBankSide(gAnimBankTarget)) + sprite->pos1.y += 8; + + sprite->callback = sub_80DCAEC; +} + +static void sub_80DCAEC(struct Sprite *sprite) +{ + if (++sprite->data[0] == 3) + { + sprite->data[0] = 0; + sprite->invisible ^= 1; + } + + if (++sprite->data[1] == 51) + { + DestroyAnimSprite(sprite); + } +} + +// used in Move_SPIDER_WEB +void sub_80DCB38(struct Sprite *sprite) +{ + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 16; + + sprite->data[0] = 16; + sprite->callback = sub_80DCB5C; +} + +static void sub_80DCB5C(struct Sprite *sprite) +{ + if (sprite->data[2] < 20) + { + sprite->data[2]++; + } + else if (sprite->data[1]++ & 1) + { + sprite->data[0]--; + REG_BLDALPHA = sprite->data[0] | ((16 - sprite->data[0]) << 8); + + if (sprite->data[0] == 0) + { + sprite->invisible = TRUE; + sprite->callback = sub_80DCBB4; + } + } +} + +static void sub_80DCBB4(struct Sprite *sprite) +{ + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimSprite(sprite); +} + +// used in 3 moves: +// Move_POISON_STING, Move_TWINEEDLE, Move_SPIKE_CANNON +void sub_80DCBCC(struct Sprite *sprite) +{ + s16 lVarX, lVarY; + u16 rot; + + if (IsContest()) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + else + { + if (GetBankSide(gAnimBankAttacker)) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + } + } + + if (!IsContest()) + { + if (GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) + { + if (GetBankIdentity(gAnimBankTarget) == 0 || GetBankIdentity(gAnimBankTarget) == 1) + { + s16 temp1, temp2; + + temp1 = gBattleAnimArgs[2]; + gBattleAnimArgs[2] = -temp1; + + temp2 = gBattleAnimArgs[0]; + gBattleAnimArgs[0] = -temp2; + } + } + } + + sub_80787B0(sprite, 1); + + lVarX = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + lVarY = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + rot = sub_80790F0(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y); + rot += 0xC000; + sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = lVarX; + sprite->data[4] = lVarY; + + sprite->callback = sub_8078B34; + StoreSpriteCallbackInData(sprite, DestroyAnimSprite); +} + +// used in 2 moves: +// Move_PIN_MISSILE, Move_ICICLE_SPEAR +void sub_80DCCFC(struct Sprite *sprite) +{ + sub_80787B0(sprite, 1); + + if (GetBankSide(gAnimBankAttacker)) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBankPosition(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBankPosition(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + sub_80786EC(sprite); + + sprite->callback = sub_80DCD78; + sprite->invisible = TRUE; +} + +#ifdef NONMATCHING +void sub_80DCD78(struct Sprite *sprite) +{ + int i; + s16 x1, x2, y1, y2; + // s16 scale; + // u16 *data; + u16 tempData[8]; + s16 rot; + + sprite->invisible = FALSE; + + if (sub_8078718(sprite)) + { + DestroyAnimSprite(sprite); + return; + } + + // data = &sprite->data[7]; + x1 = sprite->pos1.x; + x2 = sprite->pos2.x; + y1 = sprite->pos1.y; + y2 = sprite->pos2.y; + for (i = 0; i < 8; i++) + { + tempData[i] = sprite->data[i]; + } + x2 += x1; + y2 += y1; + + if (!sub_8078718(sprite)) + { + rot = sub_80790F0(sprite->pos1.x + sprite->pos2.x - x2, + sprite->pos1.y + sprite->pos2.y - y2); + rot += 0xC000; + // scale = 0x100 + sub_8078FDC(sprite, FALSE, 0x100, 0x100, rot); + + for (i = 0; i < 8; i++) + { + sprite->data[i] = tempData[1]; + } + } +} +#else +__attribute__((naked)) +void sub_80DCD78(struct Sprite *sprite) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x14\n\ + adds r4, r0, 0\n\ + adds r2, r4, 0\n\ + adds r2, 0x3E\n\ + ldrb r0, [r2]\n\ + movs r1, 0x5\n\ + negs r1, r1\n\ + ands r1, r0\n\ + strb r1, [r2]\n\ + adds r0, r4, 0\n\ + bl sub_8078718\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080DCDA4\n\ + adds r0, r4, 0\n\ + bl DestroyAnimSprite\n\ + b _080DCE34\n\ +_080DCDA4:\n\ + movs r0, 0x2E\n\ + adds r0, r4\n\ + mov r8, r0\n\ + ldrh r7, [r4, 0x20]\n\ + ldrh r5, [r4, 0x24]\n\ + ldrh r1, [r4, 0x22]\n\ + mov r12, r1\n\ + ldrh r6, [r4, 0x26]\n\ + mov r2, r8\n\ + add r1, sp, 0x4\n\ + movs r3, 0x7\n\ +_080DCDBA:\n\ + ldrh r0, [r2]\n\ + strh r0, [r1]\n\ + adds r2, 0x2\n\ + adds r1, 0x2\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _080DCDBA\n\ + adds r0, r7, r5\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + mov r2, r12\n\ + adds r0, r2, r6\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + adds r0, r4, 0\n\ + bl sub_8078718\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _080DCE34\n\ + ldrh r0, [r4, 0x24]\n\ + ldrh r1, [r4, 0x20]\n\ + adds r0, r1\n\ + lsls r1, r5, 16\n\ + asrs r1, 16\n\ + subs r0, r1\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + ldrh r1, [r4, 0x26]\n\ + ldrh r2, [r4, 0x22]\n\ + adds r1, r2\n\ + lsls r2, r6, 16\n\ + asrs r2, 16\n\ + subs r1, r2\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + bl sub_80790F0\n\ + lsls r0, 16\n\ + movs r1, 0xC0\n\ + lsls r1, 24\n\ + adds r0, r1\n\ + lsrs r0, 16\n\ + movs r3, 0x80\n\ + lsls r3, 1\n\ + str r0, [sp]\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + adds r2, r3, 0\n\ + bl sub_8078FDC\n\ + add r2, sp, 0x4\n\ + mov r1, r8\n\ + movs r3, 0x7\n\ +_080DCE26:\n\ + ldrh r0, [r2]\n\ + strh r0, [r1]\n\ + adds r2, 0x2\n\ + adds r1, 0x2\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _080DCE26\n\ +_080DCE34:\n\ + add sp, 0x14\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +void sub_80DCE40(struct Sprite *sprite) +{ + if (gBattleAnimArgs[0] == 0) + { + sprite->pos1.x = GetBankPosition(gAnimBankAttacker, 2); + sprite->pos1.y = GetBankPosition(gAnimBankAttacker, 3) + 18; + } + else + { + sprite->pos1.x = GetBankPosition(gAnimBankTarget, 2); + sprite->pos1.y = GetBankPosition(gAnimBankTarget, 3) + 18; + } + + StoreSpriteCallbackInData(sprite, move_anim_8074EE0); + sprite->callback = sub_80785E4; +} -- cgit v1.2.3 From f6d7abc83482cd56b7051784ec5420dc34a2ffe2 Mon Sep 17 00:00:00 2001 From: "Marco Willems (M17.1)" Date: Wed, 10 Jan 2018 01:26:38 +0100 Subject: oops --- src/battle/anim/bug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index 3736a86a8..501d544b1 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -287,7 +287,7 @@ void sub_80DCD78(struct Sprite *sprite) for (i = 0; i < 8; i++) { - sprite->data[i] = tempData[1]; + sprite->data[i] = tempData[i]; } } } -- cgit v1.2.3