Document a bunch of battle anim stuff

This commit is contained in:
Marcus Huderle
2018-12-17 22:08:08 -06:00
parent c04ce0ee64
commit c74468fd11
39 changed files with 769 additions and 739 deletions
+164 -159
View File
@@ -40,18 +40,17 @@ void sub_80A7144(struct Sprite *sprite);
void sub_80A791C(struct Sprite *sprite);
void sub_80A8DFC(struct Sprite *sprite);
void sub_80A8E88(struct Sprite *sprite);
void sub_80A7E6C(u8 spriteId);
u16 sub_80A7F18(u8 spriteId);
void SetBattlerSpriteYOffsetFromYScale(u8 spriteId);
u16 GetBattlerYDeltaFromSpriteId(u8 spriteId);
void AnimTask_BlendMonInAndOutSetup(struct Task *task);
void sub_80A7AFC(u8 taskId);
void sub_80A8CAC(u8 taskId);
void AnimTask_BlendMonInAndOutStep(u8 taskId);
bool8 sub_80A7238(void);
u8 GetBattlerSubpriority(u8 battlerId);
void sub_80A8D78(struct Task *task, u8 taskId);
// EWRAM vars
EWRAM_DATA static union AffineAnimCmd *gUnknown_02038444 = NULL;
EWRAM_DATA static union AffineAnimCmd *gAnimTaskAffineAnim = NULL;
// Const rom data
static const struct UCoords8 sBattlerCoords[][4] =
@@ -124,8 +123,7 @@ static const struct SpriteSheet sUnknown_08525FC0[] =
{ gMiscBlank_Gfx, 0x800, 55126, },
};
// code
u8 GetBattlerSpriteCoord(u8 battlerId, u8 attributeId)
u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType)
{
u8 retVal;
u16 species;
@@ -133,11 +131,11 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 attributeId)
if (IsContest())
{
if (attributeId == BATTLER_COORD_3 && battlerId == 3)
attributeId = BATTLER_COORD_Y;
if (coordType == BATTLER_COORD_Y_PIC_OFFSET && battlerId == 3)
coordType = BATTLER_COORD_Y;
}
switch (attributeId)
switch (coordType)
{
case BATTLER_COORD_X:
case BATTLER_COORD_X_2:
@@ -146,15 +144,15 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 attributeId)
case BATTLER_COORD_Y:
retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y;
break;
case BATTLER_COORD_3:
case BATTLER_COORD_4:
case BATTLER_COORD_Y_PIC_OFFSET:
case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT:
default:
if (IsContest())
{
if (shared19348.unk4_0)
species = shared19348.unk2;
if (gContestResources->field_18->unk4_0)
species = gContestResources->field_18->unk2;
else
species = shared19348.species;
species = gContestResources->field_18->species;
}
else
{
@@ -175,7 +173,7 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 attributeId)
species = spriteInfo[battlerId].transformSpecies;
}
}
if (attributeId == BATTLER_COORD_3)
if (coordType == BATTLER_COORD_Y_PIC_OFFSET)
retVal = GetBattlerSpriteFinal_Y(battlerId, species, TRUE);
else
retVal = GetBattlerSpriteFinal_Y(battlerId, species, FALSE);
@@ -199,10 +197,10 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species)
{
if (IsContest())
{
if (shared19348.unk4_0)
personality = shared19348.unk10;
if (gContestResources->field_18->unk4_0)
personality = gContestResources->field_18->unk10;
else
personality = shared19348.unk8;
personality = gContestResources->field_18->unk8;
}
else
{
@@ -307,19 +305,19 @@ u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3)
return y;
}
u8 GetBattlerSpriteCoord2(u8 battlerId, u8 attributeId)
u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType)
{
u16 species;
struct BattleSpriteInfo *spriteInfo;
if (attributeId == BATTLER_COORD_3 || attributeId == BATTLER_COORD_4)
if (coordType == BATTLER_COORD_Y_PIC_OFFSET || coordType == BATTLER_COORD_Y_PIC_OFFSET_DEFAULT)
{
if (IsContest())
{
if (shared19348.unk4_0)
species = shared19348.unk2;
if (gContestResources->field_18->unk4_0)
species = gContestResources->field_18->unk2;
else
species = shared19348.species;
species = gContestResources->field_18->species;
}
else
{
@@ -329,20 +327,20 @@ u8 GetBattlerSpriteCoord2(u8 battlerId, u8 attributeId)
else
species = spriteInfo[battlerId].transformSpecies;
}
if (attributeId == BATTLER_COORD_3)
if (coordType == BATTLER_COORD_Y_PIC_OFFSET)
return GetBattlerSpriteFinal_Y(battlerId, species, TRUE);
else
return GetBattlerSpriteFinal_Y(battlerId, species, FALSE);
}
else
{
return GetBattlerSpriteCoord(battlerId, attributeId);
return GetBattlerSpriteCoord(battlerId, coordType);
}
}
u8 GetBattlerSpriteDefault_Y(u8 battlerId)
{
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_4);
return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT);
}
u8 GetSubstituteSpriteDefault_Y(u8 battlerId)
@@ -386,11 +384,11 @@ u8 GetBattlerYCoordWithElevation(u8 battlerId)
return y;
}
u8 GetAnimBattlerSpriteId(u8 which)
u8 GetAnimBattlerSpriteId(u8 animBattler)
{
u8 *sprites;
if (which == ANIM_ATTACKER)
if (animBattler == ANIM_ATTACKER)
{
if (IsBattlerSpritePresent(gBattleAnimAttacker))
{
@@ -402,7 +400,7 @@ u8 GetAnimBattlerSpriteId(u8 which)
return 0xff;
}
}
else if (which == ANIM_TARGET)
else if (animBattler == ANIM_TARGET)
{
if (IsBattlerSpritePresent(gBattleAnimTarget))
{
@@ -414,7 +412,7 @@ u8 GetAnimBattlerSpriteId(u8 which)
return 0xff;
}
}
else if (which == ANIM_ATK_PARTNER)
else if (animBattler == ANIM_ATK_PARTNER)
{
if (!IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
return 0xff;
@@ -442,7 +440,7 @@ void SetCallbackToStoredInData6(struct Sprite *sprite)
sprite->callback = (void (*)(struct Sprite *))callback;
}
void sub_80A62EC(struct Sprite *sprite)
void TranslateSpriteInCircleOverDuration(struct Sprite *sprite)
{
if (sprite->data[3])
{
@@ -461,7 +459,7 @@ void sub_80A62EC(struct Sprite *sprite)
}
}
void sub_80A634C(struct Sprite *sprite)
void TranslateSpriteInGrowingCircleOverDuration(struct Sprite *sprite)
{
if (sprite->data[3])
{
@@ -570,7 +568,7 @@ void TranslateSpriteOverDuration(struct Sprite *sprite)
}
}
void sub_80A656C(struct Sprite *sprite)
void TranslateAnimLinearSimple(struct Sprite *sprite)
{
if (sprite->data[0] > 0)
{
@@ -665,7 +663,7 @@ void sub_80A66DC(struct Sprite *sprite)
}
}
void move_anim_8074EE0(struct Sprite *sprite)
void DestroySpriteAndMatrix(struct Sprite *sprite)
{
FreeSpriteOamMatrix(sprite);
DestroyAnimSprite(sprite);
@@ -683,16 +681,16 @@ void sub_80A6760(struct Sprite *sprite)
void sub_80A67A4(struct Sprite *sprite)
{
ResetPaletteStructByUid(sprite->data[5]);
move_anim_8074EE0(sprite);
DestroySpriteAndMatrix(sprite);
}
void sub_80A67BC(struct Sprite *sprite)
void RunStoredCallbackWhenAffineAnimEnds(struct Sprite *sprite)
{
if (sprite->affineAnimEnded)
SetCallbackToStoredInData6(sprite);
}
void sub_80A67D8(struct Sprite *sprite)
void RunStoredCallbackWhenAnimEnds(struct Sprite *sprite)
{
if (sprite->animEnded)
SetCallbackToStoredInData6(sprite);
@@ -712,31 +710,31 @@ void sub_80A6814(u8 taskId)
DestroyAnimVisualTask(taskId);
}
void sub_80A6838(struct Sprite *sprite)
void SetSpriteCoordsToAnimAttackerCoords(struct Sprite *sprite)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
}
void sub_80A6864(struct Sprite *sprite, s16 a2)
void sub_80A6864(struct Sprite *sprite, s16 xOffset)
{
u16 v1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
u16 v2 = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
u16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
u16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
if (v1 > v2)
if (attackerX > targetX)
{
sprite->pos1.x -= a2;
sprite->pos1.x -= xOffset;
}
else if (v1 < v2)
else if (attackerX < targetX)
{
sprite->pos1.x += a2;
sprite->pos1.x += xOffset;
}
else
{
if (GetBattlerSide(gBattleAnimAttacker) != 0)
sprite->pos1.x -= a2;
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->pos1.x -= xOffset;
else
sprite->pos1.x += a2;
sprite->pos1.x += xOffset;
}
}
@@ -779,24 +777,24 @@ void sub_80A6980(struct Sprite *sprite, bool8 a2)
{
if (!a2)
{
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimTarget, 0);
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimTarget, 1);
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X);
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y);
}
sub_80A6864(sprite, gBattleAnimArgs[0]);
sprite->pos1.y += gBattleAnimArgs[1];
}
void InitAnimSpritePos(struct Sprite *sprite, u8 a2)
void InitAnimSpritePos(struct Sprite *sprite, u8 respectMonPicOffsets)
{
if (!a2)
if (!respectMonPicOffsets)
{
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimAttacker, 0);
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimAttacker, 1);
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X);
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y);
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimAttacker, 2);
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimAttacker, 3);
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
}
sub_80A6864(sprite, gBattleAnimArgs[0]);
sprite->pos1.y += gBattleAnimArgs[1];
@@ -1208,7 +1206,7 @@ void sub_80A718C(struct Sprite *sprite)
sprite->callback(sprite);
}
void obj_id_set_rotscale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation)
void SetSpriteRotScale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation)
{
int i;
struct ObjAffineSrcData src;
@@ -1242,7 +1240,7 @@ bool8 sub_80A7238(void)
}
}
void sub_80A7270(u8 spriteId, u8 objMode)
void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode)
{
u8 battlerId = gSprites[spriteId].data[0];
@@ -1251,32 +1249,34 @@ void sub_80A7270(u8 spriteId, u8 objMode)
gSprites[spriteId].oam.objMode = objMode;
gSprites[spriteId].affineAnimPaused = TRUE;
if (!IsContest() && !gSprites[spriteId].oam.affineMode)
gSprites[spriteId].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[battlerId].field_6;
gSprites[spriteId].oam.affineMode = 3;
gSprites[spriteId].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[battlerId].matrixNum;
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE;
CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
}
void sub_80A7344(u8 spriteId)
void ResetSpriteRotScale(u8 spriteId)
{
obj_id_set_rotscale(spriteId, 0x100, 0x100, 0);
gSprites[spriteId].oam.affineMode = 1;
SetSpriteRotScale(spriteId, 0x100, 0x100, 0);
gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_NORMAL;
gSprites[spriteId].oam.objMode = 0;
gSprites[spriteId].affineAnimPaused = FALSE;
CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode);
}
void sub_80A73A0(u8 spriteId)
// Sets the sprite's y offset equal to the y displacement caused by the
// matrix's rotation.
void SetBattlerSpriteYOffsetFromRotation(u8 spriteId)
{
u16 matrix = gSprites[spriteId].oam.matrixNum;
s16 c = gOamMatrices[matrix].c;
u16 matrixNum = gSprites[spriteId].oam.matrixNum;
// The "c" component of the battler sprite matrix contains the sine of the rotation angle divided by some scale amount.
s16 c = gOamMatrices[matrixNum].c;
if (c < 0)
c = -c;
gSprites[spriteId].pos2.y = c >> 3;
}
// related to obj_id_set_rotscale
void sub_80A73E0(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 rotation)
void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation)
{
int i;
struct ObjAffineSrcData src;
@@ -1285,7 +1285,7 @@ void sub_80A73E0(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 ro
if (sprite->oam.affineMode & 1)
{
sprite->affineAnimPaused = TRUE;
if (a2)
if (recalcCenterVector)
CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
src.xScale = xScale;
src.yScale = yScale;
@@ -1303,7 +1303,7 @@ void sub_80A73E0(struct Sprite *sprite, bool8 a2, s16 xScale, s16 yScale, u16 ro
void sub_80A749C(struct Sprite *sprite)
{
sub_80A73E0(sprite, TRUE, 0x100, 0x100, 0);
TrySetSpriteRotScale(sprite, TRUE, 0x100, 0x100, 0);
sprite->affineAnimPaused = FALSE;
CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, sprite->oam.affineMode);
}
@@ -1319,32 +1319,32 @@ u16 ArcTan2Neg(s16 a, s16 b)
return -var;
}
void sub_80A750C(u16 a1, bool8 a2)
void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor)
{
int i;
struct PlttData *c;
struct PlttData *c2;
struct PlttData *originalColor;
struct PlttData *destColor;
u16 average;
a1 *= 0x10;
paletteNum *= 16;
if (!a2)
if (!restoreOriginalColor)
{
for (i = 0; i < 0x10; i++)
for (i = 0; i < 16; i++)
{
c = (struct PlttData *)&gPlttBufferUnfaded[a1 + i];
average = c->r + c->g + c->b;
originalColor = (struct PlttData *)&gPlttBufferUnfaded[paletteNum + i];
average = originalColor->r + originalColor->g + originalColor->b;
average /= 3;
c2 = (struct PlttData *)&gPlttBufferFaded[a1 + i];
c2->r = average;
c2->g = average;
c2->b = average;
destColor = (struct PlttData *)&gPlttBufferFaded[paletteNum + i];
destColor->r = average;
destColor->g = average;
destColor->b = average;
}
}
else
{
CpuCopy32(&gPlttBufferUnfaded[a1], &gPlttBufferFaded[a1], 0x20);
CpuCopy32(&gPlttBufferUnfaded[paletteNum], &gPlttBufferFaded[paletteNum], 32);
}
}
@@ -1479,7 +1479,7 @@ void sub_80A77C8(struct Sprite *sprite)
}
else if (sprite->animEnded || sprite->affineAnimEnded)
{
move_anim_8074EE0(sprite);
DestroySpriteAndMatrix(sprite);
}
}
@@ -1494,7 +1494,7 @@ void sub_80A77C8(struct Sprite *sprite)
void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite)
{
bool8 v1;
u8 attributeId;
u8 coordType;
if (!(gBattleAnimArgs[5] & 0xff00))
v1 = TRUE;
@@ -1502,9 +1502,9 @@ void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite)
v1 = FALSE;
if (!(gBattleAnimArgs[5] & 0xff))
attributeId = BATTLER_COORD_3;
coordType = BATTLER_COORD_Y_PIC_OFFSET;
else
attributeId = BATTLER_COORD_Y;
coordType = BATTLER_COORD_Y;
InitAnimSpritePos(sprite, v1);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
@@ -1512,7 +1512,7 @@ void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite)
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, attributeId) + gBattleAnimArgs[3];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, coordType) + gBattleAnimArgs[3];
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -1544,7 +1544,7 @@ void sub_80A7938(struct Sprite *sprite)
if (!gBattleAnimArgs[6])
{
r4 = TRUE;
attributeId = BATTLER_COORD_3;
attributeId = BATTLER_COORD_Y_PIC_OFFSET;
}
else
{
@@ -1571,19 +1571,19 @@ void sub_80A7938(struct Sprite *sprite)
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
s16 duplicate_obj_of_side_rel2move_in_transparent_mode(u8 whichBattler)
s16 CloneBattlerSpriteWithBlend(u8 animBattler)
{
u16 i;
u8 spriteId = GetAnimBattlerSpriteId(whichBattler);
u8 spriteId = GetAnimBattlerSpriteId(animBattler);
if (spriteId != 0xff)
if (spriteId != 0xFF)
{
for (i = 0; i < MAX_SPRITES; i++)
{
if (!gSprites[i].inUse)
{
gSprites[i] = gSprites[spriteId];
gSprites[i].oam.objMode = 1;
gSprites[i].oam.objMode = ST_OAM_OBJ_BLEND;
gSprites[i].invisible = FALSE;
return i;
}
@@ -1730,49 +1730,49 @@ void sub_80A7CB4(u8 task)
AnimTask_BlendMonInAndOutSetup(&gTasks[task]);
}
void sub_80A7CFC(struct Task *task, u8 a2, const void *a3)
void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds)
{
task->data[7] = 0;
task->data[8] = 0;
task->data[9] = 0;
task->data[15] = a2;
task->data[15] = spriteId;
task->data[10] = 0x100;
task->data[11] = 0x100;
task->data[12] = 0;
sub_80A8048(&task->data[13], &task->data[14], a3);
sub_80A7270(a2, 0);
StorePointerInVars(&task->data[13], &task->data[14], affineAnimCmds);
PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_NORMAL);
}
bool8 sub_80A7D34(struct Task *task)
bool8 RunAffineAnimFromTaskData(struct Task *task)
{
gUnknown_02038444 = sub_80A8050(task->data[13], task->data[14]) + (task->data[7] << 3);
switch (gUnknown_02038444->type)
gAnimTaskAffineAnim = LoadPointerFromVars(task->data[13], task->data[14]) + (task->data[7] << 3);
switch (gAnimTaskAffineAnim->type)
{
default:
if (!gUnknown_02038444->frame.duration)
if (!gAnimTaskAffineAnim->frame.duration)
{
task->data[10] = gUnknown_02038444->frame.xScale;
task->data[11] = gUnknown_02038444->frame.yScale;
task->data[12] = gUnknown_02038444->frame.rotation;
task->data[10] = gAnimTaskAffineAnim->frame.xScale;
task->data[11] = gAnimTaskAffineAnim->frame.yScale;
task->data[12] = gAnimTaskAffineAnim->frame.rotation;
task->data[7]++;
gUnknown_02038444++;
gAnimTaskAffineAnim++;
}
task->data[10] += gUnknown_02038444->frame.xScale;
task->data[11] += gUnknown_02038444->frame.yScale;
task->data[12] += gUnknown_02038444->frame.rotation;
obj_id_set_rotscale(task->data[15], task->data[10], task->data[11], task->data[12]);
sub_80A7E6C(task->data[15]);
if (++task->data[8] >= gUnknown_02038444->frame.duration)
task->data[10] += gAnimTaskAffineAnim->frame.xScale;
task->data[11] += gAnimTaskAffineAnim->frame.yScale;
task->data[12] += gAnimTaskAffineAnim->frame.rotation;
SetSpriteRotScale(task->data[15], task->data[10], task->data[11], task->data[12]);
SetBattlerSpriteYOffsetFromYScale(task->data[15]);
if (++task->data[8] >= gAnimTaskAffineAnim->frame.duration)
{
task->data[8] = 0;
task->data[7]++;
}
break;
case AFFINEANIMCMDTYPE_JUMP:
task->data[7] = gUnknown_02038444->jump.target;
task->data[7] = gAnimTaskAffineAnim->jump.target;
break;
case AFFINEANIMCMDTYPE_LOOP:
if (gUnknown_02038444->loop.count)
if (gAnimTaskAffineAnim->loop.count)
{
if (task->data[9])
{
@@ -1784,7 +1784,7 @@ bool8 sub_80A7D34(struct Task *task)
}
else
{
task->data[9] = gUnknown_02038444->loop.count;
task->data[9] = gAnimTaskAffineAnim->loop.count;
}
if (!task->data[7])
{
@@ -1793,8 +1793,8 @@ bool8 sub_80A7D34(struct Task *task)
for (;;)
{
task->data[7]--;
gUnknown_02038444--;
if (gUnknown_02038444->type == AFFINEANIMCMDTYPE_LOOP)
gAnimTaskAffineAnim--;
if (gAnimTaskAffineAnim->type == AFFINEANIMCMDTYPE_LOOP)
{
task->data[7]++;
return TRUE;
@@ -1807,36 +1807,40 @@ bool8 sub_80A7D34(struct Task *task)
break;
case AFFINEANIMCMDTYPE_END:
gSprites[task->data[15]].pos2.y = 0;
sub_80A7344(task->data[15]);
ResetSpriteRotScale(task->data[15]);
return FALSE;
}
return TRUE;
}
void sub_80A7E6C(u8 spriteId)
// Sets the sprite's y offset equal to the y displacement caused by the
// matrix's scale in the y dimension.
void SetBattlerSpriteYOffsetFromYScale(u8 spriteId)
{
int var = 0x40 - sub_80A7F18(spriteId) * 2;
int var = 64 - GetBattlerYDeltaFromSpriteId(spriteId) * 2;
u16 matrix = gSprites[spriteId].oam.matrixNum;
int var2 = (var << 8) / gOamMatrices[matrix].d;
if (var2 > 0x80)
var2 = 0x80;
if (var2 > 128)
var2 = 128;
gSprites[spriteId].pos2.y = (var - var2) / 2;
}
void sub_80A7EC0(u8 spriteId, u8 spriteId2)
// Sets the sprite's y offset equal to the y displacement caused by another sprite
// matrix's scale in the y dimension.
void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId)
{
int var = 0x40 - sub_80A7F18(spriteId2) * 2;
int var = 64 - GetBattlerYDeltaFromSpriteId(otherSpriteId) * 2;
u16 matrix = gSprites[spriteId].oam.matrixNum;
int var2 = (var << 8) / gOamMatrices[matrix].d;
if (var2 > 0x80)
var2 = 0x80;
if (var2 > 128)
var2 = 128;
gSprites[spriteId].pos2.y = (var - var2) / 2;
}
u16 sub_80A7F18(u8 spriteId)
u16 GetBattlerYDeltaFromSpriteId(u8 spriteId)
{
struct BattleSpriteInfo *spriteInfo;
u8 battlerId = gSprites[spriteId].data[0];
@@ -1849,7 +1853,7 @@ u16 sub_80A7F18(u8 spriteId)
{
if (IsContest())
{
species = shared19348.species;
species = gContestResources->field_18->species;
return gMonBackPicCoords[species].y_offset;
}
else
@@ -1883,18 +1887,18 @@ u16 sub_80A7F18(u8 spriteId)
}
}
}
return 0x40;
return 64;
}
void sub_80A8048(s16 *bottom, s16 *top, const void *ptr)
void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr)
{
*bottom = ((intptr_t) ptr) & 0xffff;
*top = (((intptr_t) ptr) >> 16) & 0xffff;
*lo = ((intptr_t) ptr) & 0xffff;
*hi = (((intptr_t) ptr) >> 16) & 0xffff;
}
void *sub_80A8050(s16 bottom, s16 top)
void *LoadPointerFromVars(s16 lo, s16 hi)
{
return (void *)((u16)bottom | ((u16)top << 16));
return (void *)((u16)lo | ((u16)hi << 16));
}
void sub_80A805C(struct Task *task, u8 a2, s16 a3, s16 a4, s16 a5, s16 a6, u16 a7)
@@ -1924,9 +1928,9 @@ u8 sub_80A80C8(struct Task *task)
task->data[9] = task->data[13];
task->data[10] = task->data[14];
}
obj_id_set_rotscale(task->data[15], task->data[9], task->data[10], 0);
SetSpriteRotScale(task->data[15], task->data[9], task->data[10], 0);
if (task->data[8])
sub_80A7E6C(task->data[15]);
SetBattlerSpriteYOffsetFromYScale(task->data[15]);
else
gSprites[task->data[15]].pos2.y = 0;
return task->data[8];
@@ -1968,16 +1972,16 @@ void sub_80A8278(void)
{
if (IsBattlerSpriteVisible(i))
{
gSprites[gBattlerSpriteIds[i]].subpriority = GetBattlerSubpriority(i);
gSprites[gBattlerSpriteIds[i]].subpriority = GetBattlerSpriteSubpriority(i);
gSprites[gBattlerSpriteIds[i]].oam.priority = 2;
}
}
}
u8 GetBattlerSubpriority(u8 battlerId)
u8 GetBattlerSpriteSubpriority(u8 battlerId)
{
u8 position;
u8 ret;
u8 subpriority;
if (IsContest())
{
@@ -1990,15 +1994,16 @@ u8 GetBattlerSubpriority(u8 battlerId)
{
position = GetBattlerPosition(battlerId);
if (position == B_POSITION_PLAYER_LEFT)
ret = 30;
subpriority = 30;
else if (position == B_POSITION_PLAYER_RIGHT)
ret = 20;
subpriority = 20;
else if (position == B_POSITION_OPPONENT_LEFT)
ret = 40;
subpriority = 40;
else
ret = 50;
subpriority = 50;
}
return ret;
return subpriority;
}
u8 sub_80A8328(u8 battlerId)
@@ -2100,15 +2105,15 @@ s16 sub_80A861C(u8 battlerId, u8 a2)
if (IsContest())
{
if (shared19348.unk4_0)
if (gContestResources->field_18->unk4_0)
{
species = shared19348.unk2;
personality = shared19348.unk10;
species = gContestResources->field_18->unk2;
personality = gContestResources->field_18->unk10;
}
else
{
species = shared19348.species;
personality = shared19348.unk8;
species = gContestResources->field_18->species;
personality = gContestResources->field_18->unk8;
}
if (species == SPECIES_UNOWN)
{
@@ -2270,7 +2275,7 @@ u8 sub_80A89C8(int battlerId, u8 spriteId, int species)
void sub_80A8A6C(struct Sprite *sprite)
{
sub_80A6838(sprite);
SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker))
{
sprite->pos1.x -= gBattleAnimArgs[0];
@@ -2286,7 +2291,7 @@ void sub_80A8A6C(struct Sprite *sprite)
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[4];
sprite->data[5] = gBattleAnimArgs[5];
StoreSpriteCallbackInData6(sprite, move_anim_8074EE0);
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = sub_80A66DC;
}
@@ -2307,19 +2312,19 @@ void sub_80A8AEC(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[4];
sprite->data[5] = gBattleAnimArgs[5];
StartSpriteAnim(sprite, gBattleAnimArgs[6]);
StoreSpriteCallbackInData6(sprite, move_anim_8074EE0);
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = sub_80A66DC;
}
void sub_80A8B64(struct Sprite *sprite)
{
sub_80A6838(sprite);
SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker))
sprite->pos1.x -= gBattleAnimArgs[0];
else
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->callback = sub_80A67D8;
sprite->callback = RunStoredCallbackWhenAnimEnds;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
@@ -2339,7 +2344,7 @@ void sub_80A8BC4(u8 taskId)
dest = (task->data[4] + 0x10) * 0x10;
src = (gSprites[task->data[0]].oam.paletteNum + 0x10) * 0x10;
task->data[6] = GetBattlerSubpriority(gBattleAnimAttacker);
task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimAttacker);
if (task->data[6] == 20 || task->data[6] == 40)
task->data[6] = 2;
else
@@ -2384,7 +2389,7 @@ void sub_80A8CAC(u8 taskId)
void sub_80A8D78(struct Task *task, u8 taskId)
{
s16 spriteId = duplicate_obj_of_side_rel2move_in_transparent_mode(0);
s16 spriteId = CloneBattlerSpriteWithBlend(0);
if (spriteId >= 0)
{
gSprites[spriteId].oam.priority = task->data[6];
@@ -2410,7 +2415,7 @@ void sub_80A8DFC(struct Sprite *sprite)
void sub_80A8E30(struct Sprite *sprite)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_3);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
if (!GetBattlerSide(gBattleAnimAttacker))
sprite->data[0] = 5;
else