summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/rock.c8
-rw-r--r--src/battle/battle_anim.c2
-rwxr-xr-xsrc/battle/battle_anim_812C144.c304
-rw-r--r--src/battle/battle_controller_linkopponent.c2
-rw-r--r--src/battle/battle_controller_linkpartner.c2
-rw-r--r--src/battle/battle_controller_opponent.c2
-rw-r--r--src/battle/battle_controller_player.c2
-rw-r--r--src/battle/battle_controller_wally.c2
8 files changed, 313 insertions, 11 deletions
diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c
index 595df3168..4e839d3e8 100644
--- a/src/battle/anim/rock.c
+++ b/src/battle/anim/rock.c
@@ -12,7 +12,7 @@
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
-extern u32 gAnimMoveDmg;
+extern s32 gAnimMoveDmg;
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG3_Y;
@@ -833,11 +833,11 @@ static void sub_80DD9FC(struct Sprite *sprite)
void sub_80DDA4C(u8 taskId)
{
- if ((s32)gAnimMoveDmg < 33)
+ if (gAnimMoveDmg < 33)
gBattleAnimArgs[7] = 0;
- if (gAnimMoveDmg - 33 < 33)
+ if ((u32)gAnimMoveDmg - 33 < 33)
gBattleAnimArgs[7] = 1;
- if ((s32)gAnimMoveDmg > 65)
+ if (gAnimMoveDmg > 65)
gBattleAnimArgs[7] = 2;
DestroyAnimVisualTask(taskId);
diff --git a/src/battle/battle_anim.c b/src/battle/battle_anim.c
index 2f57bcd97..f3b0056ac 100644
--- a/src/battle/battle_anim.c
+++ b/src/battle/battle_anim.c
@@ -1299,7 +1299,7 @@ EWRAM_DATA u8 gAnimScriptActive = FALSE;
EWRAM_DATA u8 gAnimVisualTaskCount = 0;
EWRAM_DATA u8 gAnimSoundTaskCount = 0;
EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL;
-EWRAM_DATA u32 gAnimMoveDmg = 0;
+EWRAM_DATA s32 gAnimMoveDmg = 0;
EWRAM_DATA u16 gAnimMovePower = 0;
EWRAM_DATA u8 gAnimFriendship = 0;
EWRAM_DATA u16 gWeatherMoveAnim = 0;
diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c
index 4714f5b09..9fccb8918 100755
--- a/src/battle/battle_anim_812C144.c
+++ b/src/battle/battle_anim_812C144.c
@@ -1,17 +1,32 @@
#include "global.h"
+#include "battle.h"
#include "battle_anim.h"
+#include "palette.h"
#include "rom_8077ABC.h"
+#include "trig.h"
extern s16 gBattleAnimArgs[];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
+extern u8 gAnimVisualTaskCount;
+extern s32 gAnimMoveDmg;
+extern u16 gBattle_WIN0H;
+extern u16 gBattle_WIN0V;
extern u8 sub_8046234(s16 x, s16 y, u8 a3);
static void sub_812C184(struct Sprite *sprite);
static void sub_812C268(struct Sprite *sprite);
static void sub_812C2A4(struct Sprite *sprite);
-extern void sub_812C380(struct Sprite *sprite);
+static void sub_812C380(struct Sprite *sprite);
+static void sub_812C40C(struct Sprite *sprite);
+static void sub_812C450(struct Sprite *sprite);
+static void sub_812C4FC(struct Sprite *sprite);
+static void sub_812C588(u8 taskId);
+static void sub_812C64C(u8 taskId);
+static void sub_812C798(struct Sprite *sprite);
+static void sub_812C7C8(struct Sprite *sprite);
+extern void sub_812CA04(struct Sprite *sprite);
void sub_812C144(struct Sprite *sprite)
{
@@ -108,3 +123,290 @@ void sub_812C358(struct Sprite *sprite)
sprite->data[0] = 4;
sprite->callback = sub_812C380;
}
+
+static void sub_812C380(struct Sprite *sprite)
+{
+ REG_BLDALPHA = ((16 - sprite->data[0]) << 8) | sprite->data[0];
+
+ if (sprite->data[1])
+ sprite->data[0]--;
+ else
+ sprite->data[0]++;
+
+ if (sprite->data[0] == 15 || sprite->data[0] == 4)
+ sprite->data[1] ^= 1;
+
+ if (sprite->data[2]++ > 70)
+ {
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ StartSpriteAffineAnim(sprite, 1);
+ sprite->data[2] = 0;
+ sprite->invisible = 1;
+ sprite->affineAnimPaused = 1;
+ sprite->callback = sub_812C40C;
+ }
+}
+
+static void sub_812C40C(struct Sprite *sprite)
+{
+ if (sprite->data[2]++ > 9)
+ {
+ sprite->invisible = 0;
+ sprite->affineAnimPaused = 0;
+ if (sprite->affineAnimEnded)
+ sprite->callback = sub_812C450;
+ }
+}
+
+static void sub_812C450(struct Sprite *sprite)
+{
+ switch (sprite->data[3])
+ {
+ case 0:
+ case 1:
+ sprite->pos2.x = 1;
+ sprite->pos2.y = 0;
+ break;
+ case 2:
+ case 3:
+ sprite->pos2.x = -1;
+ sprite->pos2.y = 0;
+ break;
+ case 4:
+ case 5:
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 1;
+ break;
+ case 6:
+ default:
+ sprite->pos2.x = 0;
+ sprite->pos2.y = -1;
+ break;
+ }
+
+ if (++sprite->data[3] > 7)
+ sprite->data[3] = 0;
+
+ if (sprite->data[4]++ > 15)
+ {
+ sprite->data[0] = 16;
+ sprite->data[1] = 0;
+ REG_BLDCNT = 0x3F40;
+ REG_BLDALPHA = sprite->data[0];
+ sprite->callback = sub_812C4FC;
+ }
+}
+
+static void sub_812C4FC(struct Sprite *sprite)
+{
+ REG_BLDALPHA = ((16 - sprite->data[0]) << 8) | sprite->data[0];
+
+ if (sprite->data[1]++ > 1)
+ {
+ sprite->data[0]--;
+ sprite->data[1] = 0;
+ }
+
+ if (sprite->data[0] == 0)
+ sprite->invisible = 1;
+
+ if (sprite->data[0] < 0)
+ {
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ DestroyAnimSprite(sprite);
+ }
+}
+
+void sub_812C560(u8 taskId)
+{
+ gTasks[taskId].func = sub_812C588;
+ gAnimVisualTaskCount--;
+}
+
+static void sub_812C588(u8 taskId)
+{
+ int i;
+ u16 lastColor;
+ u8 paletteIndex = sub_80789BC();
+
+ if (++gTasks[taskId].data[5] == 4)
+ {
+ lastColor = gPlttBufferFaded[paletteIndex * 16 + 11];
+ for (i = 10; i > 0; i--)
+ gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i];
+
+ gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor;
+ gTasks[taskId].data[5] = 0;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyTask(taskId);
+}
+
+void sub_812C624(u8 taskId)
+{
+ gTasks[taskId].func = sub_812C64C;
+ gAnimVisualTaskCount--;
+}
+
+static void sub_812C64C(u8 taskId)
+{
+ int i;
+ u16 lastColor;
+ u8 paletteIndex = sub_80789BC();
+
+ if (++gTasks[taskId].data[5] == 4)
+ {
+ lastColor = gPlttBufferFaded[paletteIndex * 16 + 11];
+ for (i = 10; i > 0; i--)
+ gPlttBufferFaded[paletteIndex * 16 + i + 1] = gPlttBufferFaded[paletteIndex * 16 + i];
+ gPlttBufferFaded[paletteIndex * 16 + 1] = lastColor;
+
+ lastColor = gPlttBufferUnfaded[paletteIndex * 16 + 11];
+ for (i = 10; i > 0; i--)
+ gPlttBufferUnfaded[paletteIndex * 16 + i + 1] = gPlttBufferUnfaded[paletteIndex * 16 + i];
+ gPlttBufferUnfaded[paletteIndex * 16 + 1] = lastColor;
+
+ gTasks[taskId].data[5] = 0;
+ }
+
+ if ((u16)gBattleAnimArgs[7] == 0xFFFF)
+ DestroyTask(taskId);
+}
+
+void sub_812C720(struct Sprite *sprite)
+{
+ u16 x;
+ u16 y;
+
+ InitAnimSpritePos(sprite, 1);
+ SetAverageBattlerPositions(gAnimBankTarget, 0, &x, &y);
+
+ if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
+ gBattleAnimArgs[2] = -gBattleAnimArgs[2];
+
+ sprite->data[0] = gBattleAnimArgs[4];
+ sprite->data[2] = x + gBattleAnimArgs[2];
+ sprite->data[4] = y + gBattleAnimArgs[3];
+ sprite->data[5] = -50;
+
+ InitAnimSpriteTranslationOverDuration(sprite);
+ sprite->callback = sub_812C798;
+}
+
+static void sub_812C798(struct Sprite *sprite)
+{
+ if (TranslateAnimSpriteLinearAndSine(sprite))
+ {
+ sprite->data[0] = 30;
+ sprite->data[1] = 0;
+ sprite->callback = WaitAnimForDuration;
+ StoreSpriteCallbackInData(sprite, sub_812C7C8);
+ }
+}
+
+static void sub_812C7C8(struct Sprite *sprite)
+{
+ if (sprite->data[1] & 1)
+ sprite->invisible ^= 1;
+
+ if (++sprite->data[1] == 16)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_812C80C(struct Sprite *sprite)
+{
+ sub_8078650(sprite);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+ sprite->pos1.y += gBattleAnimArgs[1];
+ sprite->callback = sub_8078600;
+ StoreSpriteCallbackInData(sprite, DestroyAnimSprite);
+}
+
+// This is likely fakematching due to some strange type casting behavior.
+void sub_812C848(struct Sprite *sprite)
+{
+ int var0;
+ int var1;
+ if (sprite->data[0] == 0)
+ {
+ sub_8078650(sprite);
+ sub_807867C(sprite, gBattleAnimArgs[0]);
+
+ if (!IsContest())
+ {
+ if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER)
+ {
+ sprite->data[1] = gBattleAnimArgs[2];
+ sprite->data[2] = gBattleAnimArgs[3];
+ }
+ else
+ {
+ var1 = -gBattleAnimArgs[2];
+ sprite->data[1] = var1;
+ var1 = -gBattleAnimArgs[3];
+ sprite->data[2] = var1;
+ }
+ }
+ else
+ {
+ var1 = -gBattleAnimArgs[2];
+ sprite->data[1] = var1;
+ sprite->data[2] = gBattleAnimArgs[3];
+ }
+ }
+
+ sprite->data[0]++;
+ var0 = (sprite->data[0] * 20) & 0xFF;
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = (sprite->data[3] + (s32)((u32)sprite->data[3] >> 31)) >> 1;
+ sprite->pos2.y = Sin(var0 & 0xFF, 5) + ((s32)(sprite->data[4] + ((u32)sprite->data[4] >> 31)) >> 1);
+
+ if ((u16)(sprite->pos1.x + sprite->pos2.x) > 240)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_812C908(struct Sprite *sprite)
+{
+ if (sprite->animEnded)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_812C924(u8 taskId)
+{
+ if (GetBattlerSide(gAnimBankTarget) == B_SIDE_OPPONENT)
+ gBattleAnimArgs[7] = 0;
+ else
+ gBattleAnimArgs[7] = 1;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_812C960(u8 taskId)
+{
+ if (gAnimMoveDmg > 0)
+ gBattleAnimArgs[7] = 0;
+ else
+ gBattleAnimArgs[7] = 1;
+
+ DestroyAnimVisualTask(taskId);
+}
+
+void sub_812C990(struct Sprite *sprite)
+{
+ REG_WINOUT = 0x1F3F;
+ REG_DISPCNT |= DISPCNT_OBJWIN_ON;
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+
+ sub_8078764(sprite, 0);
+
+ sprite->oam.objMode = ST_OAM_OBJ_WINDOW;
+ sprite->invisible = 1;
+ sprite->callback = sub_812CA04;
+}
diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c
index f720d6a78..62df190a5 100644
--- a/src/battle/battle_controller_linkopponent.c
+++ b/src/battle/battle_controller_linkopponent.c
@@ -33,7 +33,7 @@ extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
extern u8 gBattleMonForms[];
extern void (*gBattleBankFunc[])(void);
-extern u32 gAnimMoveDmg;
+extern s32 gAnimMoveDmg;
extern u16 gAnimMovePower;
extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c
index 0baeca43e..e3810d856 100644
--- a/src/battle/battle_controller_linkpartner.c
+++ b/src/battle/battle_controller_linkpartner.c
@@ -42,7 +42,7 @@ extern u8 gUnknown_02024E68[];
extern u8 gDoingBattleAnim;
extern u32 gTransformedPersonalities[];
extern struct SpriteTemplate gUnknown_02024E8C;
-extern u32 gAnimMoveDmg;
+extern s32 gAnimMoveDmg;
extern u16 gAnimMovePower;
extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c
index d6e7ed4a7..f6e7f92a7 100644
--- a/src/battle/battle_controller_opponent.c
+++ b/src/battle/battle_controller_opponent.c
@@ -43,7 +43,7 @@ extern u8 gUnknown_0300434C[];
extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
extern u16 gTrainerBattleOpponent;
-extern u32 gAnimMoveDmg;
+extern s32 gAnimMoveDmg;
extern u16 gAnimMovePower;
extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c
index 881ec72fc..004963b70 100644
--- a/src/battle/battle_controller_player.c
+++ b/src/battle/battle_controller_player.c
@@ -61,7 +61,7 @@ extern u8 gBattleOutcome;
extern void (*gAnimScriptCallback)(void);
extern bool8 gAnimScriptActive;
extern u16 gAnimMovePower;
-extern u32 gAnimMoveDmg;
+extern s32 gAnimMoveDmg;
extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
extern u32 gTransformedPersonalities[];
diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c
index 26348b434..451e02b40 100644
--- a/src/battle/battle_controller_wally.c
+++ b/src/battle/battle_controller_wally.c
@@ -38,7 +38,7 @@ extern u16 gBattlerPartyIndexes[];
extern u8 gHealthboxIDs[];
extern u16 gBattleTypeFlags;
extern u16 gAnimMovePower;
-extern u32 gAnimMoveDmg;
+extern s32 gAnimMoveDmg;
extern u8 gAnimFriendship;
extern u16 gWeatherMoveAnim;
extern u32 gTransformedPersonalities[];