diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/rock.c | 8 | ||||
-rw-r--r-- | src/battle/battle_anim.c | 2 | ||||
-rwxr-xr-x | src/battle/battle_anim_812C144.c | 304 | ||||
-rw-r--r-- | src/battle/battle_controller_linkopponent.c | 2 | ||||
-rw-r--r-- | src/battle/battle_controller_linkpartner.c | 2 | ||||
-rw-r--r-- | src/battle/battle_controller_opponent.c | 2 | ||||
-rw-r--r-- | src/battle/battle_controller_player.c | 2 | ||||
-rw-r--r-- | src/battle/battle_controller_wally.c | 2 |
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[]; |