port documentation of battle_anim_mon_movement from pokeem
This commit is contained in:
+246
-118
@@ -6,43 +6,91 @@
|
||||
|
||||
#define abs(x) ((x) < 0 ? -(x) : (x))
|
||||
|
||||
void sub_8098A6C(u8 taskId);
|
||||
void sub_8098C08(u8 taskId);
|
||||
void sub_8098D54(u8 taskId);
|
||||
void sub_8098EF0(u8 taskId);
|
||||
void sub_8099004(u8 taskId);
|
||||
void sub_80990AC(struct Sprite * sprite);
|
||||
void sub_8099120(struct Sprite * sprite);
|
||||
void sub_8099144(struct Sprite * sprite);
|
||||
void sub_8099190(struct Sprite * sprite);
|
||||
void sub_80991B4(struct Sprite * sprite);
|
||||
void sub_8099270(struct Sprite * sprite);
|
||||
void sub_80992E0(struct Sprite * sprite);
|
||||
void sub_8099394(struct Sprite * sprite);
|
||||
void sub_809946C(struct Sprite * sprite);
|
||||
void sub_8099530(u8 taskId);
|
||||
void sub_8099594(u8 taskId);
|
||||
void sub_80996B8(u8 taskId);
|
||||
void sub_8099788(u8 taskId);
|
||||
void sub_8099908(u8 taskId);
|
||||
void sub_8099B54(u8 taskId);
|
||||
void sub_8099CB8(u8 taskId);
|
||||
static void AnimTask_ShakeMonStep(u8 taskId);
|
||||
static void AnimTask_ShakeMon2Step(u8 taskId);
|
||||
static void AnimTask_ShakeMonInPlaceStep(u8 taskId);
|
||||
static void AnimTask_ShakeAndSinkMonStep(u8 taskId);
|
||||
static void AnimTask_TranslateMonEllipticalStep(u8 taskId);
|
||||
static void DoHorizontalLunge(struct Sprite * sprite);
|
||||
static void ReverseHorizontalLungeDirection(struct Sprite * sprite);
|
||||
static void DoVerticalDip(struct Sprite * sprite);
|
||||
static void ReverseVerticalDipDirection(struct Sprite * sprite);
|
||||
static void SlideMonToOriginalPos(struct Sprite * sprite);
|
||||
static void SlideMonToOriginalPosStep(struct Sprite * sprite);
|
||||
static void SlideMonToOffset(struct Sprite * sprite);
|
||||
static void sub_8099394(struct Sprite * sprite);
|
||||
static void sub_809946C(struct Sprite * sprite);
|
||||
static void AnimTask_WindUpLungePart1(u8 taskId);
|
||||
static void AnimTask_WindUpLungePart2(u8 taskId);
|
||||
static void sub_80996B8(u8 taskId);
|
||||
static void AnimTask_SwayMonStep(u8 taskId);
|
||||
static void AnimTask_ScaleMonAndRestoreStep(u8 taskId);
|
||||
static void sub_8099B54(u8 taskId);
|
||||
static void sub_8099CB8(u8 taskId);
|
||||
|
||||
const struct SpriteTemplate gUnknown_83D4E4C[] = {
|
||||
{
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80990AC
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099144
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80991B4
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_80992E0
|
||||
}, {
|
||||
0, 0, &gDummyOamData, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_8099394
|
||||
}
|
||||
const struct SpriteTemplate gHorizontalLungeSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = DoHorizontalLunge,
|
||||
};
|
||||
|
||||
void sub_80989F8(u8 taskId)
|
||||
const struct SpriteTemplate gVerticalDipSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = DoVerticalDip,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gSlideMonToOriginalPosSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SlideMonToOriginalPos,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gSlideMonToOffsetSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = SlideMonToOffset,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83D4EB4 =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_8099394,
|
||||
};
|
||||
|
||||
// Task to facilitate simple shaking of a pokemon's picture in battle.
|
||||
// The shaking alternates between the original position and the target position.
|
||||
// arg 0: anim battler
|
||||
// arg 1: x pixel offset
|
||||
// arg 2: y pixel offset
|
||||
// arg 3: num times to shake
|
||||
// arg 4: frame delay
|
||||
void AnimTask_ShakeMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
@@ -58,12 +106,12 @@ void sub_80989F8(u8 taskId)
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = sub_8098A6C;
|
||||
gTasks[taskId].func = AnimTask_ShakeMonStep;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098A6C(u8 taskId)
|
||||
static void AnimTask_ShakeMonStep(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
@@ -87,7 +135,14 @@ void sub_8098A6C(u8 taskId)
|
||||
gTasks[taskId].data[3]--;
|
||||
}
|
||||
|
||||
void sub_8098B1C(u8 taskId)
|
||||
// Task to facilitate simple shaking of a pokemon's picture in battle.
|
||||
// The shaking alternates between the positive and negative versions of the specified pixel offsets.
|
||||
// arg 0: anim battler
|
||||
// arg 1: x pixel offset
|
||||
// arg 2: y pixel offset
|
||||
// arg 3: num times to shake
|
||||
// arg 4: frame delay
|
||||
void AnimTask_ShakeMon2(u8 taskId)
|
||||
{
|
||||
bool8 abort = FALSE;
|
||||
u8 spriteId;
|
||||
@@ -116,7 +171,7 @@ void sub_8098B1C(u8 taskId)
|
||||
battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
|
||||
break;
|
||||
}
|
||||
if (!sub_8072DF0(battlerId))
|
||||
if (!IsBattlerSpriteVisible(battlerId))
|
||||
abort = TRUE;
|
||||
spriteId = gBattlerSpriteIds[battlerId];
|
||||
}
|
||||
@@ -134,12 +189,12 @@ void sub_8098B1C(u8 taskId)
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = sub_8098C08;
|
||||
gTasks[taskId].func = AnimTask_ShakeMon2Step;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098C08(u8 taskId)
|
||||
static void AnimTask_ShakeMon2Step(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
@@ -163,7 +218,15 @@ void sub_8098C08(u8 taskId)
|
||||
gTasks[taskId].data[3]--;
|
||||
}
|
||||
|
||||
void sub_8098CD0(u8 taskId)
|
||||
// Task to facilitate simple shaking of a pokemon's picture in battle.
|
||||
// The shaking alternates between the positive and negative versions of the specified pixel offsets
|
||||
// with respect to the current location of the mon's picture.
|
||||
// arg 0: battler
|
||||
// arg 1: x offset
|
||||
// arg 2: y offset
|
||||
// arg 3: num shakes
|
||||
// arg 4: delay
|
||||
void AnimTask_ShakeMonInPlace(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
@@ -180,12 +243,12 @@ void sub_8098CD0(u8 taskId)
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[1] * 2;
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[2] * 2;
|
||||
gTasks[taskId].func = sub_8098D54;
|
||||
gTasks[taskId].func = AnimTask_ShakeMonInPlaceStep;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_8098D54(u8 taskId)
|
||||
static void AnimTask_ShakeMonInPlaceStep(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
@@ -219,7 +282,13 @@ void sub_8098D54(u8 taskId)
|
||||
gTasks[taskId].data[3]--;
|
||||
}
|
||||
|
||||
void sub_8098E90(u8 taskId)
|
||||
// Shakes a mon bg horizontally and moves it downward linearly.
|
||||
// arg 0: battler
|
||||
// arg 1: x offset
|
||||
// arg 2: frame delay between each movement
|
||||
// arg 3: downward speed (subpixel)
|
||||
// arg 4: duration
|
||||
void AnimTask_ShakeAndSinkMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
@@ -229,11 +298,11 @@ void sub_8098E90(u8 taskId)
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].func = sub_8098EF0;
|
||||
gTasks[taskId].func = AnimTask_ShakeAndSinkMonStep;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
void sub_8098EF0(u8 taskId)
|
||||
static void AnimTask_ShakeAndSinkMonStep(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
s16 data1 = gTasks[taskId].data[1];
|
||||
@@ -251,25 +320,32 @@ void sub_8098EF0(u8 taskId)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_8098F84(u8 taskId)
|
||||
// Moves a mon bg picture along an elliptical path that begins
|
||||
// and ends at the mon's origin location.
|
||||
// arg 0: battler
|
||||
// arg 1: ellipse width
|
||||
// arg 2: ellipse height
|
||||
// arg 3: num loops
|
||||
// arg 4: speed (valid values are 0-5)
|
||||
void AnimTask_TranslateMonElliptical(u8 taskId)
|
||||
{
|
||||
u8 r6 = 1;
|
||||
u8 wavePeriod = 1;
|
||||
u8 i;
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
if (gBattleAnimArgs[4] > 5)
|
||||
gBattleAnimArgs[4] = 5;
|
||||
for (i = 0; i < gBattleAnimArgs[4]; i++)
|
||||
r6 *= 2;
|
||||
wavePeriod *= 2;
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = r6;
|
||||
gTasks[taskId].func = sub_8099004;
|
||||
gTasks[taskId].data[4] = wavePeriod;
|
||||
gTasks[taskId].func = AnimTask_TranslateMonEllipticalStep;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
void sub_8099004(u8 taskId)
|
||||
static void AnimTask_TranslateMonEllipticalStep(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
gSprites[spriteId].pos2.x = Sin(gTasks[taskId].data[5], gTasks[taskId].data[1]);
|
||||
@@ -287,14 +363,26 @@ void sub_8099004(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_809907C(u8 taskId)
|
||||
// Moves a mon bg picture along an elliptical path that begins
|
||||
// and ends at the mon's origin location. Reverses the direction
|
||||
// of the path if it's not on the player's side of the battle.
|
||||
// arg 0: battler
|
||||
// arg 1: ellipse width
|
||||
// arg 2: ellipse height
|
||||
// arg 3: num loops
|
||||
// arg 4: speed (valid values are 0-5)
|
||||
void AnimTask_TranslateMonEllipticalRespectSide(u8 taskId)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sub_8098F84(taskId);
|
||||
AnimTask_TranslateMonElliptical(taskId);
|
||||
}
|
||||
|
||||
void sub_80990AC(struct Sprite * sprite)
|
||||
// Performs a simple horizontal lunge, where the mon moves
|
||||
// horizontally, and then moves back in the opposite direction.
|
||||
// arg 0: duration of single lunge direction
|
||||
// arg 1: x pixel delta that is applied each frame
|
||||
static void DoHorizontalLunge(struct Sprite * sprite)
|
||||
{
|
||||
sprite->invisible = TRUE;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
@@ -305,19 +393,24 @@ void sub_80990AC(struct Sprite * sprite)
|
||||
sprite->data[2] = 0;
|
||||
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
|
||||
sprite->data[4] = gBattleAnimArgs[0];
|
||||
StoreSpriteCallbackInData6(sprite, sub_8099120);
|
||||
sprite->callback = sub_8074DC4;
|
||||
StoreSpriteCallbackInData6(sprite, ReverseHorizontalLungeDirection);
|
||||
sprite->callback = TranslateMonSpriteLinear;
|
||||
}
|
||||
|
||||
void sub_8099120(struct Sprite * sprite)
|
||||
static void ReverseHorizontalLungeDirection(struct Sprite * sprite)
|
||||
{
|
||||
sprite->data[0] = sprite->data[4];
|
||||
sprite->data[1] = -sprite->data[1];
|
||||
sprite->callback = sub_8074DC4;
|
||||
sprite->callback = TranslateMonSpriteLinear;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
void sub_8099144(struct Sprite * sprite)
|
||||
// Performs a simple vertical dipping motion, where moves vertically, and then
|
||||
// moves back in the opposite direction.
|
||||
// arg 0: duration of single dip direction
|
||||
// arg 1: y pixel delta that is applied each frame
|
||||
// arg 2: battler
|
||||
static void DoVerticalDip(struct Sprite * sprite)
|
||||
{
|
||||
u8 spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
@@ -327,19 +420,24 @@ void sub_8099144(struct Sprite * sprite)
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[3] = spriteId;
|
||||
sprite->data[4] = gBattleAnimArgs[0];
|
||||
StoreSpriteCallbackInData6(sprite, sub_8099190);
|
||||
sprite->callback = sub_8074DC4;
|
||||
StoreSpriteCallbackInData6(sprite, ReverseVerticalDipDirection);
|
||||
sprite->callback = TranslateMonSpriteLinear;
|
||||
}
|
||||
|
||||
void sub_8099190(struct Sprite * sprite)
|
||||
static void ReverseVerticalDipDirection(struct Sprite * sprite)
|
||||
{
|
||||
sprite->data[0] = sprite->data[4];
|
||||
sprite->data[2] = -sprite->data[2];
|
||||
sprite->callback = sub_8074DC4;
|
||||
sprite->callback = TranslateMonSpriteLinear;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
void sub_80991B4(struct Sprite * sprite)
|
||||
// Linearly slides a mon's bg picture back to its original sprite position.
|
||||
// The sprite parameter is a dummy sprite used for facilitating the movement with its callback.
|
||||
// arg 0: 1 = target or 0 = attacker
|
||||
// arg 1: direction (0 = horizontal and vertical, 1 = horizontal only, 2 = vertical only)
|
||||
// arg 2: duration
|
||||
static void SlideMonToOriginalPos(struct Sprite * sprite)
|
||||
{
|
||||
u8 spriteId;
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
@@ -351,7 +449,7 @@ void sub_80991B4(struct Sprite * sprite)
|
||||
sprite->data[2] = gSprites[spriteId].pos1.x;
|
||||
sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
|
||||
sprite->data[4] = gSprites[spriteId].pos1.y;
|
||||
sub_80754B8(sprite);
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = 0;
|
||||
sprite->data[4] = 0;
|
||||
sprite->data[5] = gSprites[spriteId].pos2.x;
|
||||
@@ -363,10 +461,10 @@ void sub_80991B4(struct Sprite * sprite)
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[7] = gBattleAnimArgs[1];
|
||||
sprite->data[7] |= spriteId << 8;
|
||||
sprite->callback = sub_8099270;
|
||||
sprite->callback = SlideMonToOriginalPosStep;
|
||||
}
|
||||
|
||||
void sub_8099270(struct Sprite * sprite)
|
||||
static void SlideMonToOriginalPosStep(struct Sprite * sprite)
|
||||
{
|
||||
u8 data7 = sprite->data[7];
|
||||
struct Sprite *otherSprite = &gSprites[sprite->data[7] >> 8];
|
||||
@@ -388,7 +486,15 @@ void sub_8099270(struct Sprite * sprite)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80992E0(struct Sprite * sprite)
|
||||
// Linearly translates a mon to a target offset. The horizontal offset
|
||||
// is mirrored for the opponent's pokemon, and the vertical offset
|
||||
// is only mirrored if arg 3 is set to 1.
|
||||
// arg 0: 0 = attacker, 1 = target
|
||||
// arg 1: target x pixel offset
|
||||
// arg 2: target y pixel offset
|
||||
// arg 3: mirror vertical translation for opposite battle side
|
||||
// arg 4: duration
|
||||
static void SlideMonToOffset(struct Sprite * sprite)
|
||||
{
|
||||
u8 battlerId;
|
||||
u8 spriteId;
|
||||
@@ -408,16 +514,16 @@ void sub_80992E0(struct Sprite * sprite)
|
||||
sprite->data[2] = gSprites[spriteId].pos1.x + gBattleAnimArgs[1];
|
||||
sprite->data[3] = gSprites[spriteId].pos1.y;
|
||||
sprite->data[4] = gSprites[spriteId].pos1.y + gBattleAnimArgs[2];
|
||||
sub_80754B8(sprite);
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = 0;
|
||||
sprite->data[4] = 0;
|
||||
sprite->data[5] = spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
sprite->callback = sub_8074E14;
|
||||
sprite->callback = TranslateMonSpriteLinearFixedPoint;
|
||||
}
|
||||
|
||||
void sub_8099394(struct Sprite * sprite)
|
||||
static void sub_8099394(struct Sprite * sprite)
|
||||
{
|
||||
u8 battlerId;
|
||||
u8 spriteId;
|
||||
@@ -438,7 +544,7 @@ void sub_8099394(struct Sprite * sprite)
|
||||
sprite->data[2] = sprite->data[1] + gBattleAnimArgs[1];
|
||||
sprite->data[3] = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y;
|
||||
sprite->data[4] = sprite->data[3] + gBattleAnimArgs[2];
|
||||
sub_80754B8(sprite);
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = gSprites[spriteId].pos2.x << 8;
|
||||
sprite->data[4] = gSprites[spriteId].pos2.y << 8;
|
||||
sprite->data[5] = spriteId;
|
||||
@@ -447,19 +553,29 @@ void sub_8099394(struct Sprite * sprite)
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
else
|
||||
StoreSpriteCallbackInData6(sprite, sub_809946C);
|
||||
sprite->callback = sub_8074E14;
|
||||
sprite->callback = TranslateMonSpriteLinearFixedPoint;
|
||||
}
|
||||
|
||||
void sub_809946C(struct Sprite * sprite)
|
||||
static void sub_809946C(struct Sprite * sprite)
|
||||
{
|
||||
gSprites[sprite->data[5]].pos2.x = 0;
|
||||
gSprites[sprite->data[5]].pos2.y = 0;
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
void sub_809949C(u8 taskId)
|
||||
// Task to facilitate a two-part translation animation, in which the sprite
|
||||
// is first translated in an arc to one position. Then, it "lunges" to a target
|
||||
// x offset. Used in TAKE_DOWN, for example.
|
||||
// arg 0: anim bank
|
||||
// arg 1: horizontal speed (subpixel)
|
||||
// arg 2: wave amplitude
|
||||
// arg 3: first duration
|
||||
// arg 4: delay before starting lunge
|
||||
// arg 5: target x offset for lunge
|
||||
// arg 6: lunge duration
|
||||
void AnimTask_WindUpLunge(u8 taskId)
|
||||
{
|
||||
u16 r7 = 0x8000 / gBattleAnimArgs[3];
|
||||
u16 wavePeriod = 0x8000 / gBattleAnimArgs[3];
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
@@ -472,11 +588,11 @@ void sub_809949C(u8 taskId)
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[6];
|
||||
gTasks[taskId].data[7] = r7;
|
||||
gTasks[taskId].func = sub_8099530;
|
||||
gTasks[taskId].data[7] = wavePeriod;
|
||||
gTasks[taskId].func = AnimTask_WindUpLungePart1;
|
||||
}
|
||||
|
||||
void sub_8099530(u8 taskId)
|
||||
static void AnimTask_WindUpLungePart1(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[11] += gTasks[taskId].data[1];
|
||||
@@ -484,10 +600,10 @@ void sub_8099530(u8 taskId)
|
||||
gSprites[spriteId].pos2.y = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);
|
||||
gTasks[taskId].data[10] += gTasks[taskId].data[7];
|
||||
if (--gTasks[taskId].data[3] == 0)
|
||||
gTasks[taskId].func = sub_8099594;
|
||||
gTasks[taskId].func = AnimTask_WindUpLungePart2;
|
||||
}
|
||||
|
||||
void sub_8099594(u8 taskId)
|
||||
static void AnimTask_WindUpLungePart2(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
|
||||
@@ -514,7 +630,7 @@ void sub_80995FC(u8 taskId)
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
break;
|
||||
case 2:
|
||||
if (!sub_8072DF0(gBattleAnimAttacker ^ BIT_FLANK))
|
||||
if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
@@ -522,7 +638,7 @@ void sub_80995FC(u8 taskId)
|
||||
spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
|
||||
break;
|
||||
case 3:
|
||||
if (!sub_8072DF0(gBattleAnimTarget ^ BIT_FLANK))
|
||||
if (!IsBattlerSpriteVisible(gBattleAnimTarget ^ BIT_FLANK))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
@@ -541,7 +657,7 @@ void sub_80995FC(u8 taskId)
|
||||
gTasks[taskId].func = sub_80996B8;
|
||||
}
|
||||
|
||||
void sub_80996B8(u8 taskId)
|
||||
static void sub_80996B8(u8 taskId)
|
||||
{
|
||||
u8 spriteId = gTasks[taskId].data[0];
|
||||
gSprites[spriteId].pos2.x += gTasks[taskId].data[1];
|
||||
@@ -549,7 +665,15 @@ void sub_80996B8(u8 taskId)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_8099704(u8 taskId)
|
||||
// Task that facilitates translating the mon bg picture back and forth
|
||||
// in a swaying motion (uses Sine wave). It can sway either horizontally
|
||||
// or vertically, but not both.
|
||||
// arg 0: direction (0 = horizontal, 1 = vertical)
|
||||
// arg 1: wave amplitude
|
||||
// arg 2: wave period
|
||||
// arg 3: num sways
|
||||
// arg 4: which mon (0 = attacker, 1 = target)
|
||||
void AnimTask_SwayMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
@@ -565,32 +689,32 @@ void sub_8099704(u8 taskId)
|
||||
else
|
||||
gTasks[taskId].data[5] = gBattleAnimTarget;
|
||||
gTasks[taskId].data[12] = 1;
|
||||
gTasks[taskId].func = sub_8099788;
|
||||
gTasks[taskId].func = AnimTask_SwayMonStep;
|
||||
}
|
||||
|
||||
void sub_8099788(u8 taskId)
|
||||
static void AnimTask_SwayMonStep(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
u32 r8;
|
||||
s16 r5;
|
||||
u16 tmp;
|
||||
u32 waveIndex;
|
||||
s16 sineValue;
|
||||
u16 sineIndex;
|
||||
|
||||
spriteId = gTasks[taskId].data[4];
|
||||
tmp = gTasks[taskId].data[10] + gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[10] = tmp;
|
||||
r8 = tmp >> 8;
|
||||
r5 = Sin(r8, gTasks[taskId].data[1]);
|
||||
sineIndex = gTasks[taskId].data[10] + gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[10] = sineIndex;
|
||||
waveIndex = sineIndex >> 8;
|
||||
sineValue = Sin(waveIndex, gTasks[taskId].data[1]);
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
gSprites[spriteId].pos2.x = r5;
|
||||
gSprites[spriteId].pos2.x = sineValue;
|
||||
}
|
||||
else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER)
|
||||
{
|
||||
gSprites[spriteId].pos2.y = abs(r5);
|
||||
gSprites[spriteId].pos2.y = abs(sineValue);
|
||||
}
|
||||
else
|
||||
gSprites[spriteId].pos2.y = -abs(r5);
|
||||
if ((r8 > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (r8 < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))
|
||||
gSprites[spriteId].pos2.y = -abs(sineValue);
|
||||
if ((waveIndex > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (waveIndex < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))
|
||||
{
|
||||
gTasks[taskId].data[11] ^= 1;
|
||||
gTasks[taskId].data[12] ^= 1;
|
||||
@@ -603,10 +727,16 @@ void sub_8099788(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80998B0(u8 taskId)
|
||||
// Scales a mon's sprite, and then scales back to its original dimensions.
|
||||
// arg 0: x scale delta
|
||||
// arg 1: y scale delta
|
||||
// arg 2: duration
|
||||
// arg 3: anim bank
|
||||
// arg 4: sprite object mode
|
||||
void AnimTask_ScaleMonAndRestore(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
|
||||
sub_80758E0(spriteId, gBattleAnimArgs[4]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
@@ -614,16 +744,16 @@ void sub_80998B0(u8 taskId)
|
||||
gTasks[taskId].data[4] = spriteId;
|
||||
gTasks[taskId].data[10] = 0x100;
|
||||
gTasks[taskId].data[11] = 0x100;
|
||||
gTasks[taskId].func = sub_8099908;
|
||||
gTasks[taskId].func = AnimTask_ScaleMonAndRestoreStep;
|
||||
}
|
||||
|
||||
void sub_8099908(u8 taskId)
|
||||
static void AnimTask_ScaleMonAndRestoreStep(u8 taskId)
|
||||
{
|
||||
u8 spriteId;
|
||||
gTasks[taskId].data[10] += gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[11] += gTasks[taskId].data[1];
|
||||
spriteId = gTasks[taskId].data[4];
|
||||
obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
|
||||
SetSpriteRotScale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
if (gTasks[taskId].data[3] > 0)
|
||||
@@ -635,7 +765,7 @@ void sub_8099908(u8 taskId)
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_8075980(spriteId);
|
||||
ResetSpriteRotScale(spriteId);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
@@ -644,7 +774,7 @@ void sub_8099908(u8 taskId)
|
||||
void sub_8099980(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
sub_80758E0(spriteId, 0);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
if (gBattleAnimArgs[3] != 1)
|
||||
@@ -654,7 +784,7 @@ void sub_8099980(u8 taskId)
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[5] = spriteId;
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[3];
|
||||
if (sub_8073788())
|
||||
if (IsContest())
|
||||
gTasks[taskId].data[7] = 1;
|
||||
else
|
||||
{
|
||||
@@ -663,7 +793,7 @@ void sub_8099980(u8 taskId)
|
||||
else
|
||||
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;
|
||||
}
|
||||
if (gTasks[taskId].data[7] && !sub_8073788())
|
||||
if (gTasks[taskId].data[7] && !IsContest())
|
||||
{
|
||||
s16 tmp;
|
||||
tmp = gTasks[taskId].data[3];
|
||||
@@ -677,7 +807,7 @@ void sub_8099980(u8 taskId)
|
||||
void sub_8099A78(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
sub_80758E0(spriteId, 0);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
@@ -709,11 +839,10 @@ void sub_8099A78(u8 taskId)
|
||||
gTasks[taskId].func = sub_8099B54;
|
||||
}
|
||||
|
||||
void sub_8099B54(u8 taskId)
|
||||
static void sub_8099B54(u8 taskId)
|
||||
{
|
||||
s16 tmp;
|
||||
gTasks[taskId].data[3] += gTasks[taskId].data[4];
|
||||
obj_id_set_rotscale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
|
||||
SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
|
||||
if (gTasks[taskId].data[7])
|
||||
sub_80759DC(gTasks[taskId].data[5]);
|
||||
if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
|
||||
@@ -721,7 +850,7 @@ void sub_8099B54(u8 taskId)
|
||||
switch (gTasks[taskId].data[6])
|
||||
{
|
||||
case 1:
|
||||
sub_8075980(gTasks[taskId].data[5]);
|
||||
ResetSpriteRotScale(gTasks[taskId].data[5]);
|
||||
// fallthrough
|
||||
case 0:
|
||||
default:
|
||||
@@ -729,8 +858,7 @@ void sub_8099B54(u8 taskId)
|
||||
break;
|
||||
case 2:
|
||||
gTasks[taskId].data[1] = 0;
|
||||
tmp = gTasks[taskId].data[4];
|
||||
gTasks[taskId].data[4] = -tmp;
|
||||
gTasks[taskId].data[4] *= -1;
|
||||
gTasks[taskId].data[6] = 1;
|
||||
break;
|
||||
}
|
||||
@@ -741,7 +869,7 @@ void sub_8099BD4(u8 taskId)
|
||||
{
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
gTasks[taskId].data[15] = gUnknown_2037EEC / 12;
|
||||
gTasks[taskId].data[15] = gAnimMovePower / 12;
|
||||
if (gTasks[taskId].data[15] < 1)
|
||||
gTasks[taskId].data[15] = 1;
|
||||
if (gTasks[taskId].data[15] > 16)
|
||||
@@ -749,7 +877,7 @@ void sub_8099BD4(u8 taskId)
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[15] = gUnknown_2037EE8 / 12;
|
||||
gTasks[taskId].data[15] = gAnimMoveDmg / 12;
|
||||
if (gTasks[taskId].data[15] < 1)
|
||||
gTasks[taskId].data[15] = 1;
|
||||
if (gTasks[taskId].data[15] > 16)
|
||||
@@ -769,7 +897,7 @@ void sub_8099BD4(u8 taskId)
|
||||
gTasks[taskId].func = sub_8099CB8;
|
||||
}
|
||||
|
||||
void sub_8099CB8(u8 taskId)
|
||||
static void sub_8099CB8(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
if (++task->data[0] > task->data[1])
|
||||
|
||||
Reference in New Issue
Block a user